diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..7e3649a
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,16 @@
+# http://editorconfig.org
+root = true
+
+[*]
+indent_style = space
+indent_size = 2
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.md]
+trim_trailing_whitespace = false
+
+[Makefile]
+indent_style = tab
diff --git a/.env b/.env
new file mode 100644
index 0000000..3dc5b7a
--- /dev/null
+++ b/.env
@@ -0,0 +1,6 @@
+# 平台本地运行端口号
+REACT_APP_ENV = dev
+API_SERVER = 127.0.0.1:8888
+SERVER_HOST = http://localhost:8888/
+FILE_SERVER_HOST = http://192.168.10.28:8088
+WEBRTC_SERVER_HOST = http://192.168.10.96:9005
diff --git a/.env.development b/.env.development
new file mode 100644
index 0000000..3dc5b7a
--- /dev/null
+++ b/.env.development
@@ -0,0 +1,6 @@
+# 平台本地运行端口号
+REACT_APP_ENV = dev
+API_SERVER = 127.0.0.1:8888
+SERVER_HOST = http://localhost:8888/
+FILE_SERVER_HOST = http://192.168.10.28:8088
+WEBRTC_SERVER_HOST = http://192.168.10.96:9005
diff --git a/.env.production b/.env.production
new file mode 100644
index 0000000..76f4130
--- /dev/null
+++ b/.env.production
@@ -0,0 +1,5 @@
+REACT_APP_ENV = prod
+API_SERVER = 127.0.0.1:8888
+SERVER_HOST = /
+FILE_SERVER_HOST = http://192.168.10.96
+WEBRTC_SERVER_HOST = http://192.168.10.96:9005
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000..8336e93
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,8 @@
+/lambda/
+/scripts
+/config
+.history
+public
+dist
+.umi
+mock
\ No newline at end of file
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000..8ffdff8
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,8 @@
+module.exports = {
+  extends: [require.resolve('@umijs/lint/dist/config/eslint')],
+  globals: {
+    page: true,
+    REACT_APP_ENV: true,
+    SERVER_HOST: true,
+  },
+};
diff --git a/.gitignore b/.gitignore
index a19f004..e0376b7 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,11 +1,47 @@
-# ---> Vue
-# gitignore template for Vue.js projects
-#
-# Recommended template: Node.gitignore
-
 # TODO: where does this rule come from?
 docs/_book
 
 # TODO: where does this rule come from?
 test/
 
+# dependencies
+**/node_modules
+# roadhog-api-doc ignore
+/src/utils/request-temp.js
+_roadhog-api-doc
+
+# production
+/dist
+/taskDoc
+/src/pages/Demo
+
+# misc
+.DS_Store
+npm-debug.log*
+yarn-error.log
+
+/coverage
+.idea
+yarn.lock
+package-lock.json
+*bak
+.vscode
+
+
+# visual studio code
+.history
+*.log
+functions/*
+.temp/**
+
+# umi
+.umi
+.umi-production
+.umi-test
+
+# screenshot
+screenshot
+.firebase
+.eslintcache
+
+build
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..7999ccd
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,22 @@
+**/*.svg
+.umi
+.umi-production
+/dist
+.dockerignore
+.DS_Store
+.eslintignore
+*.png
+*.toml
+docker
+.editorconfig
+Dockerfile*
+.gitignore
+.prettierignore
+LICENSE
+.eslintcache
+*.lock
+yarn-error.log
+.history
+CNAME
+/build
+/public
diff --git a/.prettierrc.js b/.prettierrc.js
new file mode 100644
index 0000000..3447a1a
--- /dev/null
+++ b/.prettierrc.js
@@ -0,0 +1,21 @@
+module.exports = {
+  singleQuote: true,
+  trailingComma: 'all',
+  printWidth: 100,
+  proseWrap: 'never',
+  endOfLine: 'lf',
+  overrides: [
+    {
+      files: '.prettierrc',
+      options: {
+        parser: 'json',
+      },
+    },
+    {
+      files: 'document.ejs',
+      options: {
+        parser: 'html',
+      },
+    },
+  ],
+};
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000..e91e355
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,13 @@
+FROM circleci/node:latest-browsers
+
+WORKDIR /usr/src/app
+
+RUN npm config set registry https://registry.npmmirror.com
+
+USER root
+COPY package.json ./
+RUN yarn
+COPY ./ ./
+RUN npm run test:all
+
+CMD ["npm", "run", "build"]
diff --git a/config/config.ts b/config/config.ts
new file mode 100644
index 0000000..3fb1056
--- /dev/null
+++ b/config/config.ts
@@ -0,0 +1,187 @@
+// https://umijs.org/config/
+import { defineConfig } from '@umijs/max';
+import { join } from 'path';
+import defaultSettings from './defaultSettings';
+import proxy from './proxy';
+import routes from './routes';
+
+const { REACT_APP_ENV,
+  API_SERVER,
+  SERVER_HOST,
+  FILE_SERVER_HOST,
+  WEBRTC_SERVER_HOST
+} = process.env;
+console.log(REACT_APP_ENV)
+export default defineConfig({
+  /**
+   * @name 开启 hash 模式
+   * @description 让 build 之后的产物包含 hash 后缀。通常用于增量发布和避免浏览器加载缓存。
+   * @doc https://umijs.org/docs/api/config#hash
+   */
+  hash: true,
+  define: {
+    API_SERVER: API_SERVER,
+    SERVER_HOST: SERVER_HOST,
+    FILE_SERVER_HOST: FILE_SERVER_HOST,
+    WEBRTC_SERVER_HOST: WEBRTC_SERVER_HOST,
+  },
+  /**
+   * @name 兼容性设置
+   * @description 设置 ie11 不一定完美兼容,需要检查自己使用的所有依赖
+   * @doc https://umijs.org/docs/api/config#targets
+   */
+  // targets: {
+  //   ie: 11,
+  // },
+  /**
+   * @name 路由的配置,不在路由中引入的文件不会编译
+   * @description 只支持 path,components,routes,redirect,wrappers,title 的配置
+   * @doc https://umijs.org/docs/guides/routes
+   */
+  // umi routes: https://umijs.org/docs/routing
+  routes,
+  /**
+   * @name 主题的配置
+   * @description 虽然叫主题,但是其实只是 less 的变量设置
+   * @doc antd的主题设置 https://ant.design/docs/react/customize-theme-cn
+   * @doc umi 的theme 配置 https://umijs.org/docs/api/config#theme
+   */
+  theme: {
+    // 如果不想要 configProvide 动态设置主题需要把这个设置为 default
+    // 只有设置为 variable, 才能使用 configProvide 动态设置主色调
+    'root-entry-name': 'variable',
+
+  },
+  /**
+   * @name moment 的国际化配置
+   * @description 如果对国际化没有要求,打开之后能减少js的包大小
+   * @doc https://umijs.org/docs/api/config#ignoremomentlocale
+   */
+  ignoreMomentLocale: true,
+  /**
+   * @name 代理配置
+   * @description 可以让你的本地服务器代理到你的服务器上,这样你就可以访问服务器的数据了
+   * @see 要注意以下 代理只能在本地开发时使用,build 之后就无法使用了。
+   * @doc 代理介绍 https://umijs.org/docs/guides/proxy
+   * @doc 代理配置 https://umijs.org/docs/api/config#proxy
+   */
+  proxy: proxy[REACT_APP_ENV as keyof typeof proxy],
+  /**
+   * @name 快速热更新配置
+   * @description 一个不错的热更新组件,更新时可以保留 state
+   */
+  fastRefresh: true,
+  //============== 以下都是max的插件配置 ===============
+  /**
+   * @name 数据流插件
+   * @@doc https://umijs.org/docs/max/data-flow
+   */
+  model: {},
+  /**
+   * 一个全局的初始数据流,可以用它在插件之间共享数据
+   * @description 可以用来存放一些全局的数据,比如用户信息,或者一些全局的状态,全局初始状态在整个 Umi 项目的最开始创建。
+   * @doc https://umijs.org/docs/max/data-flow#%E5%85%A8%E5%B1%80%E5%88%9D%E5%A7%8B%E7%8A%B6%E6%80%81
+   */
+  initialState: {},
+  /**
+   * @name layout 插件
+   * @doc https://umijs.org/docs/max/layout-menu
+   */
+  title: 'Ant Design Pro',
+  layout: {
+    locale: true,
+    ...defaultSettings,
+  },
+  /**
+   * @name moment2dayjs 插件
+   * @description 将项目中的 moment 替换为 dayjs
+   * @doc https://umijs.org/docs/max/moment2dayjs
+   */
+  moment2dayjs: {
+    preset: 'antd',
+    plugins: ['duration'],
+  },
+  /**
+   * @name 国际化插件
+   * @doc https://umijs.org/docs/max/i18n
+   */
+  locale: {
+    // default zh-CN
+    default: 'zh-CN',
+    antd: true,
+    // default true, when it is true, will use `navigator.language` overwrite default
+    baseNavigator: true,
+  },
+  /**
+   * @name antd 插件
+   * @description 内置了 babel import 插件
+   * @doc https://umijs.org/docs/max/antd#antd
+   */
+  antd: {},
+  /**
+   * @name 网络请求配置
+   * @description 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。
+   * @doc https://umijs.org/docs/max/request
+   */
+  request: {},
+  /**
+   * @name 权限插件
+   * @description 基于 initialState 的权限插件,必须先打开 initialState
+   * @doc https://umijs.org/docs/max/access
+   */
+  access: {},
+
+  /**
+   * @name <head> 中额外的 script
+   * @description 配置 <head> 中额外的 script
+   */
+  headScripts: [
+    // 解决首次加载时白屏的问题
+    { src: '/scripts/loading.js', async: true },
+  ],
+  //================ pro 插件配置 =================
+  presets: ['umi-presets-pro'],
+  /**
+   * @name openAPI 插件的配置
+   * @description 基于 openapi 的规范生成serve 和mock,能减少很多样板代码
+   * @doc https://pro.ant.design/zh-cn/docs/openapi/
+   */
+  openAPI: [
+    // {
+    //   requestLibPath: "import { request } from '@umijs/max'",
+    //   // 或者使用在线的版本
+    //   // schemaPath: "https://gw.alipayobjects.com/os/antfincdn/M%24jrzTTYJN/oneapi.json"
+    //   schemaPath: join(__dirname, 'oneapi.json'),
+    //   mock: false,
+    // },
+    // {
+    //   requestLibPath: "import { request } from '@umijs/max'",
+    //   schemaPath: 'https://gw.alipayobjects.com/os/antfincdn/CA1dOm%2631B/openapi.json',
+    //   projectName: 'swagger',
+    // },
+    // {
+    //   requestLibPath: "import { request } from '@umijs/max'",
+    //   // 或者使用在线的版本
+    //   // schemaPath: "https://gw.alipayobjects.com/os/antfincdn/M%24jrzTTYJN/oneapi.json"
+    //   // schemaPath: join(__dirname, 'oneapi.json'),
+    //   schemaPath: 'http://localhost:8888/api/v1/swagger/doc.json',
+    //   mock: false,
+    //   apiPrefix: "'/api/v1'",
+    //   projectName: 'device1',
+    // },
+    // {
+    //   requestLibPath: "import { request } from '@umijs/max'",
+    //   // 或者使用在线的版本
+    //   // schemaPath: "https://gw.alipayobjects.com/os/antfincdn/M%24jrzTTYJN/oneapi.json"
+    //   // schemaPath: join(__dirname, 'oneapi.json'),
+    //   schemaPath: 'http://127.0.0.1:9000/swagger.json',
+    //   mock: false,
+    //   apiPrefix: "'/api/v1'",
+    //   projectName: 'staff',
+    // },
+  ],
+  mfsu: {
+    strategy: 'normal',
+  },
+  requestRecord: {},
+});
diff --git a/config/defaultDrawer.ts b/config/defaultDrawer.ts
new file mode 100644
index 0000000..e37bef3
--- /dev/null
+++ b/config/defaultDrawer.ts
@@ -0,0 +1 @@
+// 待启用 抽屉全局配置
\ No newline at end of file
diff --git a/config/defaultForm.ts b/config/defaultForm.ts
new file mode 100644
index 0000000..38a51b8
--- /dev/null
+++ b/config/defaultForm.ts
@@ -0,0 +1,60 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-13 14:19:57
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-22 13:15:04
+ * @FilePath: \general-ai-platform-web\config\defaultForm.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE2
+ */
+
+import { StepsFormProps } from "@ant-design/pro-components";
+import { ReactNode } from "react";
+
+
+// 通用表单配置
+export const proFormCommonOptions: Record<string,any> = {
+}
+
+const formBoxMargin = 2 * 24
+const formItemGap = 16
+// Small 560
+export const proFormSmallModelWidth: number = 560;
+export const proFormSmallItemStyleProps: Record<string, any> = {
+  width: proFormSmallModelWidth - formBoxMargin,  // 一列
+  // column2Width: (proFormSmallModelWidth -  2 * formBoxMargin)/2 , // 两列
+};
+
+// normal 804
+export const proFormModelWidth: number = 804;
+export const proFormItemStyleProps: Record<string, any> = {
+  width: proFormModelWidth - formBoxMargin,  // 一列
+  column2Width: (proFormModelWidth - formBoxMargin - formItemGap)/2 , // 两列
+};
+
+// max 968
+export const proFormMaxModelWidth: number = 968;
+export const proFormMaxItemStyleProps: Record<string, any> = {
+  width: proFormMaxModelWidth - formBoxMargin,
+  column2Width: (proFormMaxModelWidth - formBoxMargin - formItemGap)/2 , // 两列
+};
+
+
+/**表单具体单项配置 */
+
+
+// proFormList 新增一项按钮配置
+export const proFormListCreatorButtonProps : {
+  creatorButtonText?: ReactNode;
+  position?: 'top' | 'bottom';
+} = {
+  position: 'bottom',
+  creatorButtonText: '添加参数字段', // 设置新增一项数据的文案
+}
+
+
+// 分步表单统一配置
+export const proFormStepsFormProps: StepsFormProps = {
+  stepsProps: {
+    labelPlacement: 'vertical',
+  }
+}
\ No newline at end of file
diff --git a/config/defaultIcon.ts b/config/defaultIcon.ts
new file mode 100644
index 0000000..02d8cb3
--- /dev/null
+++ b/config/defaultIcon.ts
@@ -0,0 +1,32 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-28 14:13:05
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-28 17:48:37
+ * @FilePath: \general-ai-platform-web\config\defaultIcon.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%A
+ */
+
+import { proFormItemStyleProps } from './defaultForm';
+
+// 分步表单统一配置
+export const proIconSelectWrapStyle: React.CSSProperties = {
+  position: 'relative',
+  width: 290,
+  background: 'red',
+  left: 0,
+};
+
+export const proIconSelectStyle: React.CSSProperties = {
+  position: 'absolute',
+  left: '0',
+  padding: 16,
+  top: '5%',
+  width: '94%',
+  height: 500,
+  zIndex: 9,
+  boxShadow: '0px 4px 12px 0px rgba(0, 0, 0, 0.30)',
+  background: '#fff',
+  borderRadius: 4,
+  overflowY: 'scroll',
+};
diff --git a/config/defaultSettings.ts b/config/defaultSettings.ts
new file mode 100644
index 0000000..b9f611f
--- /dev/null
+++ b/config/defaultSettings.ts
@@ -0,0 +1,35 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-22 10:02:59
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-12-05 11:09:13
+ * @FilePath: \react-adpro-fabric\config\defaultSettings.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+import { ProLayoutProps } from '@ant-design/pro-components';
+
+/**
+ * @name
+ */
+const Settings: ProLayoutProps & {
+  pwa?: boolean;
+  logo?: string;
+} = {
+  navTheme: 'light',
+  // 拂晓蓝
+  colorPrimary: '#155BD4',
+  layout: 'mix',
+  contentWidth: 'Fluid',
+  fixedHeader: false,
+  fixSiderbar: true,
+  colorWeak: false,
+  title: 'fabric智能AI系统',
+  pwa: true,
+  logo: '/my_logo.svg',
+  iconfontUrl: '',
+  token: {
+    // 参见ts声明,demo 见文档,通过token 修改样式
+    //https://procomponents.ant.design/components/layout#%E9%80%9A%E8%BF%87-token-%E4%BF%AE%E6%94%B9%E6%A0%B7%E5%BC%8F
+  },
+};
+export default Settings;
diff --git a/config/defaultTable.ts b/config/defaultTable.ts
new file mode 100644
index 0000000..596c2e8
--- /dev/null
+++ b/config/defaultTable.ts
@@ -0,0 +1,46 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-13 11:32:26
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-21 13:36:39
+ * @FilePath: \general-ai-platform-web\config\defaultTable.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+import { ProColumns } from "@ant-design/pro-components";
+import { PaginationProps } from "antd";
+// 通用列表配置
+export const proTableCommonOptions: Record<string,any> = {
+    scrollX: 'max-content', // 保证左右侧列的固定,并能保证没列标题不换行
+    scrollY: 500, // 保证列表高度固定
+    commscrollX: 1300,
+    commscrollY: 500, // 保证列表高度固定
+    searchLabelWidth: 'auto', // 整体对齐,label根据实际字数自适应
+}
+
+// 操作栏位配置
+export const proTableActionColumnOptions: Record<string,any> = {
+    dataIndex: 'option',
+    valueType: 'option',
+    align: 'center',
+    fixed: 'right',
+}
+
+// 分页器配置
+export const proTablePaginationOptions: PaginationProps = {
+    showSizeChanger: true,
+    // showQuickJumper: true,
+    showTotal: (total) => `共${total}条`,
+}
+
+
+
+
+// 默认索引列配置
+// export const proTableIndexColumnOptions : ProColumns = {
+//     title: '序号',
+//     dataIndex: 'index',
+//     valueType: 'index', // 增加该属性以添加边框
+//     fixed: 'left', // 将该列固定在左侧
+//     width: 70,
+//     align:'center'
+// }
\ No newline at end of file
diff --git a/config/demoRoutes.ts b/config/demoRoutes.ts
new file mode 100644
index 0000000..ea7187b
--- /dev/null
+++ b/config/demoRoutes.ts
@@ -0,0 +1,22 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-23 16:05:23
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-23 16:11:53
+ * @FilePath: \react-adpro-fabric\config\demoRoutes.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+export const demoRoutes = [
+    {
+        path: '/fabric',
+        name: 'fabric',
+        routes: [
+            {
+                name: 'fabricOfReactCavas1',
+                path: '/fabric/fabricOfReact/cavas1',
+                component: 'Demo/FabricOfReact/Cavas1',
+                access: 'canReadMenu',
+              },
+        ]
+    }
+]
\ No newline at end of file
diff --git a/config/oneapi.json b/config/oneapi.json
new file mode 100644
index 0000000..2a14f69
--- /dev/null
+++ b/config/oneapi.json
@@ -0,0 +1,593 @@
+{
+  "openapi": "3.0.1",
+  "info": {
+    "title": "Ant Design Pro",
+    "version": "1.0.0"
+  },
+  "servers": [
+    {
+      "url": "http://localhost:8080/"
+    },
+    {
+      "url": "https://localhost:8080/"
+    }
+  ],
+  "paths": {
+    "/api/currentUser": {
+      "get": {
+        "tags": ["api"],
+        "description": "获取当前的用户",
+        "operationId": "currentUser",
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/CurrentUser"
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorResponse"
+                }
+              }
+            }
+          }
+        }
+      },
+      "x-swagger-router-controller": "api"
+    },
+    "/api/login/captcha": {
+      "post": {
+        "description": "发送验证码",
+        "operationId": "getFakeCaptcha",
+        "tags": ["login"],
+        "parameters": [
+          {
+            "name": "phone",
+            "in": "query",
+            "description": "手机号",
+            "schema": {
+              "type": "string"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/FakeCaptcha"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/api/login/outLogin": {
+      "post": {
+        "description": "登录接口",
+        "operationId": "outLogin",
+        "tags": ["login"],
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "object"
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorResponse"
+                }
+              }
+            }
+          }
+        }
+      },
+      "x-swagger-router-controller": "api"
+    },
+    "/api/login/account": {
+      "post": {
+        "tags": ["login"],
+        "description": "登录接口",
+        "operationId": "login",
+        "requestBody": {
+          "description": "登录系统",
+          "content": {
+            "application/json": {
+              "schema": {
+                "$ref": "#/components/schemas/LoginParams"
+              }
+            }
+          },
+          "required": true
+        },
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/LoginResult"
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorResponse"
+                }
+              }
+            }
+          }
+        },
+        "x-codegen-request-body-name": "body"
+      },
+      "x-swagger-router-controller": "api"
+    },
+    "/api/notices": {
+      "summary": "getNotices",
+      "description": "NoticeIconItem",
+      "get": {
+        "tags": ["api"],
+        "operationId": "getNotices",
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/NoticeIconList"
+                }
+              }
+            }
+          }
+        }
+      }
+    },
+    "/api/rule": {
+      "get": {
+        "tags": ["rule"],
+        "description": "获取规则列表",
+        "operationId": "rule",
+        "parameters": [
+          {
+            "name": "current",
+            "in": "query",
+            "description": "当前的页码",
+            "schema": {
+              "type": "number"
+            }
+          },
+          {
+            "name": "pageSize",
+            "in": "query",
+            "description": "页面的容量",
+            "schema": {
+              "type": "number"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/RuleList"
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorResponse"
+                }
+              }
+            }
+          }
+        }
+      },
+      "post": {
+        "tags": ["rule"],
+        "description": "新建规则",
+        "operationId": "addRule",
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/RuleListItem"
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorResponse"
+                }
+              }
+            }
+          }
+        }
+      },
+      "put": {
+        "tags": ["rule"],
+        "description": "新建规则",
+        "operationId": "updateRule",
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/RuleListItem"
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorResponse"
+                }
+              }
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": ["rule"],
+        "description": "删除规则",
+        "operationId": "removeRule",
+        "responses": {
+          "200": {
+            "description": "Success",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "type": "object"
+                }
+              }
+            }
+          },
+          "401": {
+            "description": "Error",
+            "content": {
+              "application/json": {
+                "schema": {
+                  "$ref": "#/components/schemas/ErrorResponse"
+                }
+              }
+            }
+          }
+        }
+      },
+      "x-swagger-router-controller": "api"
+    },
+    "/swagger": {
+      "x-swagger-pipe": "swagger_raw"
+    }
+  },
+  "components": {
+    "schemas": {
+      "CurrentUser": {
+        "type": "object",
+        "properties": {
+          "name": {
+            "type": "string"
+          },
+          "avatar": {
+            "type": "string"
+          },
+          "userid": {
+            "type": "string"
+          },
+          "email": {
+            "type": "string"
+          },
+          "signature": {
+            "type": "string"
+          },
+          "title": {
+            "type": "string"
+          },
+          "group": {
+            "type": "string"
+          },
+          "tags": {
+            "type": "array",
+            "items": {
+              "type": "object",
+              "properties": {
+                "key": {
+                  "type": "string"
+                },
+                "label": {
+                  "type": "string"
+                }
+              }
+            }
+          },
+          "notifyCount": {
+            "type": "integer",
+            "format": "int32"
+          },
+          "unreadCount": {
+            "type": "integer",
+            "format": "int32"
+          },
+          "country": {
+            "type": "string"
+          },
+          "access": {
+            "type": "string"
+          },
+          "geographic": {
+            "type": "object",
+            "properties": {
+              "province": {
+                "type": "object",
+                "properties": {
+                  "label": {
+                    "type": "string"
+                  },
+                  "key": {
+                    "type": "string"
+                  }
+                }
+              },
+              "city": {
+                "type": "object",
+                "properties": {
+                  "label": {
+                    "type": "string"
+                  },
+                  "key": {
+                    "type": "string"
+                  }
+                }
+              }
+            }
+          },
+          "address": {
+            "type": "string"
+          },
+          "phone": {
+            "type": "string"
+          }
+        }
+      },
+      "LoginResult": {
+        "type": "object",
+        "properties": {
+          "status": {
+            "type": "string"
+          },
+          "type": {
+            "type": "string"
+          },
+          "currentAuthority": {
+            "type": "string"
+          }
+        }
+      },
+      "PageParams": {
+        "type": "object",
+        "properties": {
+          "current": {
+            "type": "number"
+          },
+          "pageSize": {
+            "type": "number"
+          }
+        }
+      },
+      "RuleListItem": {
+        "type": "object",
+        "properties": {
+          "key": {
+            "type": "integer",
+            "format": "int32"
+          },
+          "disabled": {
+            "type": "boolean"
+          },
+          "href": {
+            "type": "string"
+          },
+          "avatar": {
+            "type": "string"
+          },
+          "name": {
+            "type": "string"
+          },
+          "owner": {
+            "type": "string"
+          },
+          "desc": {
+            "type": "string"
+          },
+          "callNo": {
+            "type": "integer",
+            "format": "int32"
+          },
+          "status": {
+            "type": "integer",
+            "format": "int32"
+          },
+          "updatedAt": {
+            "type": "string",
+            "format": "datetime"
+          },
+          "createdAt": {
+            "type": "string",
+            "format": "datetime"
+          },
+          "progress": {
+            "type": "integer",
+            "format": "int32"
+          }
+        }
+      },
+      "RuleList": {
+        "type": "object",
+        "properties": {
+          "data": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/RuleListItem"
+            }
+          },
+          "total": {
+            "type": "integer",
+            "description": "列表的内容总数",
+            "format": "int32"
+          },
+          "success": {
+            "type": "boolean"
+          }
+        }
+      },
+      "FakeCaptcha": {
+        "type": "object",
+        "properties": {
+          "code": {
+            "type": "integer",
+            "format": "int32"
+          },
+          "status": {
+            "type": "string"
+          }
+        }
+      },
+      "LoginParams": {
+        "type": "object",
+        "properties": {
+          "username": {
+            "type": "string"
+          },
+          "password": {
+            "type": "string"
+          },
+          "autoLogin": {
+            "type": "boolean"
+          },
+          "type": {
+            "type": "string"
+          }
+        }
+      },
+      "ErrorResponse": {
+        "required": ["errorCode"],
+        "type": "object",
+        "properties": {
+          "errorCode": {
+            "type": "string",
+            "description": "业务约定的错误码"
+          },
+          "errorMessage": {
+            "type": "string",
+            "description": "业务上的错误信息"
+          },
+          "success": {
+            "type": "boolean",
+            "description": "业务上的请求是否成功"
+          }
+        }
+      },
+      "NoticeIconList": {
+        "type": "object",
+        "properties": {
+          "data": {
+            "type": "array",
+            "items": {
+              "$ref": "#/components/schemas/NoticeIconItem"
+            }
+          },
+          "total": {
+            "type": "integer",
+            "description": "列表的内容总数",
+            "format": "int32"
+          },
+          "success": {
+            "type": "boolean"
+          }
+        }
+      },
+      "NoticeIconItemType": {
+        "title": "NoticeIconItemType",
+        "description": "已读未读列表的枚举",
+        "type": "string",
+        "properties": {},
+        "enum": ["notification", "message", "event"]
+      },
+      "NoticeIconItem": {
+        "type": "object",
+        "properties": {
+          "id": {
+            "type": "string"
+          },
+          "extra": {
+            "type": "string",
+            "format": "any"
+          },
+          "key": { "type": "string" },
+          "read": {
+            "type": "boolean"
+          },
+          "avatar": {
+            "type": "string"
+          },
+          "title": {
+            "type": "string"
+          },
+          "status": {
+            "type": "string"
+          },
+          "datetime": {
+            "type": "string",
+            "format": "date"
+          },
+          "description": {
+            "type": "string"
+          },
+          "type": {
+            "extensions": {
+              "x-is-enum": true
+            },
+            "$ref": "#/components/schemas/NoticeIconItemType"
+          }
+        }
+      }
+    }
+  }
+}
diff --git a/config/proxy.ts b/config/proxy.ts
new file mode 100644
index 0000000..d8784aa
--- /dev/null
+++ b/config/proxy.ts
@@ -0,0 +1,64 @@
+/**
+ * @name 代理的配置
+ * @see 在生产环境 代理是无法生效的,所以这里没有生产环境的配置
+ * -------------------------------
+ * The agent cannot take effect in the production environment
+ * so there is no configuration of the production environment
+ * For details, please see
+ * https://pro.ant.design/docs/deploy
+ *
+ * @doc https://umijs.org/docs/guides/proxy
+ */
+export default {
+  // 如果需要自定义本地开发服务器  请取消注释按需调整
+  // dev: {
+  //   // localhost:8000/api/** -> https://preview.pro.ant.design/api/**
+  //   '/api/': {
+  //     // 要代理的地址
+  //     target: 'https://preview.pro.ant.design',
+  //     // 配置了这个可以从 http 代理到 https
+  //     // 依赖 origin 的功能可能需要这个,比如 cookie
+  //     changeOrigin: true,
+  //   },
+  // },
+  dev: {
+    // localhost:8000/api/** -> https://preview.pro.ant.design/api/**
+    '/api/v1/': {
+      // 要代理的地址
+      target: 'http://192.168.10.96:8888/',
+      // target: 'https://www.baidu.com',
+      // 配置了这个可以从 http 代理到 https
+      // 依赖 origin 的功能可能需要这个,比如 cookie
+      changeOrigin: true,
+      secure: false,
+    },
+    // '/video_save_path/': {
+    //   // 要代理的地址
+    //   target: 'http://192.168.10.96/',
+    //   // target: 'https://www.baidu.com',
+    //   // 配置了这个可以从 http 代理到 https
+    //   // 依赖 origin 的功能可能需要这个,比如 cookie
+    //   changeOrigin: true,
+    //   secure: false,
+    // },
+  },
+  /**
+   * @name 详细的代理配置
+   * @doc https://github.com/chimurai/http-proxy-middleware
+   */
+  test: {
+    // localhost:8000/api/** -> https://preview.pro.ant.design/api/**
+    '/api/': {
+      target: 'https://proapi.azurewebsites.net',
+      changeOrigin: true,
+      pathRewrite: { '^': '' },
+    },
+  },
+  pre: {
+    '/api/': {
+      target: 'your pre url',
+      changeOrigin: true,
+      pathRewrite: { '^': '' },
+    },
+  },
+};
diff --git a/config/routes.ts b/config/routes.ts
new file mode 100644
index 0000000..1896675
--- /dev/null
+++ b/config/routes.ts
@@ -0,0 +1,37 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-22 10:02:59
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-12-20 14:40:04
+ * @FilePath: \react-adpro-fabric\config\routes.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+
+/**
+ * @name umi 的路由配置
+ * @description 只支持 path,components,routes,redirect,wrappers,name,icon 的配置
+ * @param path  path 只支持两种占位符配置,第一种是动态参数 :id 的形式,第二种是 * 通配符,通配符只能出现路由字符串的最后。
+ * @param components 配置 location 和 path 匹配后用于渲染的 React 组件路径。可以是绝对路径,也可以是相对路径,如果是相对路径,会从 src/pages 开始找起。
+ * @param routes 配置子路由,通常在需要为多个路径增加 layout 组件时使用。
+ * @param redirect 配置路由跳转
+ * @param wrappers 配置路由组件的包装组件,通过包装组件可以为当前的路由组件组合进更多的功能。 比如,可以用于路由级别的权限校验
+ * @param name 配置路由的标题,默认读取国际化文件 menu.ts 中 menu.xxxx 的值,如配置 name 为 login,则读取 menu.ts 中 menu.login 的取值作为标题
+ * @param icon 配置路由的图标,取值参考 https://ant.design/components/icon-cn, 注意去除风格后缀和大小写,如想要配置图标为 <StepBackwardOutlined /> 则取值应为 stepBackward 或 StepBackward,如想要配置图标为 <UserOutlined /> 则取值应为 user 或者 User
+ * @doc https://umijs.org/docs/guides/routes
+ */
+export default [
+  {
+    path: '/showInfo',
+    layout: false,
+    component: './404',
+  },
+  {
+    path: '/',
+    redirect: '/showInfo',
+  },
+  {
+    path: '*',
+    layout: false,
+    component: './404',
+  },
+];
diff --git a/jest.config.ts b/jest.config.ts
new file mode 100644
index 0000000..525d4c6
--- /dev/null
+++ b/jest.config.ts
@@ -0,0 +1,31 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-22 10:02:59
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-28 16:45:16
+ * @FilePath: \react-adpro-fabric\jest.config.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+import { configUmiAlias, createConfig } from '@umijs/max/test';
+
+export default async () => {
+  const config = await configUmiAlias({
+    ...createConfig({
+      target: 'browser',
+    }),
+  });
+  console.log(JSON.stringify(config));
+
+  return {
+    ...config,
+    testEnvironmentOptions: {
+      ...(config?.testEnvironmentOptions || {}),
+      url: 'http://localhost:8080',
+    },
+    setupFiles: [...(config.setupFiles || []), './tests/setupTests.jsx'],
+    globals: {
+      ...config.globals,
+      localStorage: null,
+    },
+  };
+};
diff --git a/jsconfig.json b/jsconfig.json
new file mode 100644
index 0000000..197bee5
--- /dev/null
+++ b/jsconfig.json
@@ -0,0 +1,11 @@
+{
+  "compilerOptions": {
+    "jsx": "react-jsx",
+    "emitDecoratorMetadata": true,
+    "experimentalDecorators": true,
+    "baseUrl": ".",
+    "paths": {
+      "@/*": ["./src/*"]
+    }
+  }
+}
diff --git a/mock/StaffEmployee.mock.ts b/mock/StaffEmployee.mock.ts
new file mode 100644
index 0000000..f4ec50f
--- /dev/null
+++ b/mock/StaffEmployee.mock.ts
@@ -0,0 +1,23 @@
+// @ts-ignore
+import { Request, Response } from 'express';
+
+export default {
+  'POST /employee/createEmployee': (req: Request, res: Response) => {
+    res.status(200).send({});
+  },
+  'DELETE /employee/deleteEmployee': (req: Request, res: Response) => {
+    res.status(200).send({});
+  },
+  'DELETE /employee/deleteEmployeeByIds': (req: Request, res: Response) => {
+    res.status(200).send({});
+  },
+  'POST /employee/getEmployeeById': (req: Request, res: Response) => {
+    res.status(200).send({});
+  },
+  'POST /employee/getEmployeeList': (req: Request, res: Response) => {
+    res.status(200).send({});
+  },
+  'PUT /employee/updateEmployee': (req: Request, res: Response) => {
+    res.status(200).send({});
+  },
+};
diff --git a/mock/dist/fabricModels.js b/mock/dist/fabricModels.js
new file mode 100644
index 0000000..68549bc
--- /dev/null
+++ b/mock/dist/fabricModels.js
@@ -0,0 +1,382 @@
+"use strict";
+var __assign = (this && this.__assign) || function () {
+    __assign = Object.assign || function(t) {
+        for (var s, i = 1, n = arguments.length; i < n; i++) {
+            s = arguments[i];
+            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+                t[p] = s[p];
+        }
+        return t;
+    };
+    return __assign.apply(this, arguments);
+};
+exports.__esModule = true;
+var currJson1 = {
+    version: '5.3.0',
+    objects: [
+        {
+            type: 'image',
+            version: '5.3.0',
+            originX: 'left',
+            originY: 'top',
+            left: 2.7348,
+            top: 0,
+            width: 1200,
+            height: 900,
+            fill: 'rgb(0,0,0)',
+            stroke: null,
+            strokeWidth: 0,
+            strokeDashArray: null,
+            strokeLineCap: 'butt',
+            strokeDashOffset: 0,
+            strokeLineJoin: 'miter',
+            strokeUniform: false,
+            strokeMiterLimit: 4,
+            scaleX: 1,
+            scaleY: 1,
+            angle: 0,
+            flipX: false,
+            flipY: false,
+            opacity: 1,
+            shadow: null,
+            visible: true,
+            backgroundColor: '',
+            fillRule: 'nonzero',
+            paintFirst: 'fill',
+            globalCompositeOperation: 'source-over',
+            skewX: 0,
+            skewY: 0,
+            cropX: 0,
+            cropY: 0,
+            selectable: false,
+            hasControls: true,
+            src: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAAOECAIAAAA+D1+tAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFyGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuMTY0NzUzLCAyMDIxLzAyLzE1LTExOjUyOjEzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMy0xMS0yOVQxNjowNjozNSswODowMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpjMWE2ZTE4MC1iMTc1LTQ2NGMtYjBlZS0zYjgxYTcwNjY4MTMiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo4YjQzZmIyYy1hYmVmLWYzNGItODVlZC1k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oizn60n1OZ3O5cuXnzp16vXXX588efKcOXO459vFixc3btw4YMCAFStWiJuo6jcYDIFAID8//4EHHvjwww937drF/YR5AyI5hwDEL2FGQyIJciYS7EmBUwAQgSAEIFbwer293QTQ59Bm3lOE+EBygCwoKHjsscco08zBgwdTU1PHjRv3y1/+kuYzIBFCsz+rPCr5LsS99HovROW6yTUhdRnpwNesWZOamjphwgQWQmUxjcsor5ObQ81m82233fbpp5+uWbNm2bJlUogEqqSZRddTlSyUZXnw4MFf+9rXPvroo9dee+2uu+5ijH322WelpaXz5s2jCSq41BQFOVVFNV+6dGnv3r3Hjh1TqUEA+ji9/kYCIBaAIASgRwnjNka2mg6NQeJLBjoJH4ZQ2s6Mp7SGApIgYYzl5+e/9NJL//Vf/zV58uTnn39eVIMqX1Mm3Jm9622ldfJkgsuooplej+x47777bmNj47333muxWPh50K1K6zIq2kgVRbFYLHPmzFm/fv2mTZtuuukmHk+oKizWo42cpGLp6ekrV67cvn37n//855aWlmHDht1///1ms5m1ika+U1XWGc6FCxfghgCA1DqVC/2bYHY/AKIDMYQA9DRSW/j6TsYQdmkbQfwR3c0Qam4uMaCOMeb1er/88suZM2du3Ljx8ccfv3btWlVVFWuNjuMSS3tXM01mzp5Ed7/iSuoaKkIKlnfffbe2tnbZsmUOh4Np3EpF6FRrH1uVX6jVal2+fPm1a9fee+891nrGdKvS3QVrmw9j0KBBFRUVhw4d6tevH6lBJgRqai2E4pGaTCaLxSLWDAAAADBYCAHoMXTDqMS+KZ9zrPP1AxAhuiYjlUYqLS194403JkyYsHTpUirwxRdf/Pa3vx06dOjXv/51KkOztGtj5KgqlVmsOw9IH1WTxMkDg8Egzf/OGHvzzTcbGhpuv/12mp6B6+FQIYhhhJwozCRJuv3221evXr1u3brFixdrNaHf7xclHP8rXgWXy/XKK6/4fL7/+3//L2Ns8+bN/9//9//dddddhYWFBoOBTjI57jK9uToURamtreX+on6/n2y8AAAAAAQhAD1Hu9nMeqwlABBcGol2MC5CmpqatmzZUldXt2rVqmHDhjHGAoGAwWCYOHFifn7+tm3bnnrqqRkzZkycONFoNIoKRAylUykT0SW1d+95ahup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hg0bfvnLX65Zs2bJkiUOh2NwcPDRRx8dGRn56Ec/2traWlNTQ8dTVCFtT58+/brrrtu7d++GDRtuv/32j370o01NTYyxoaGhJ554gjF29tlnt7a2kgkxHo97PB6v1zsyMmJy1BgMBumZkdpuOz5pkPrOjBua35HX66UfAj9mfCsFwJgjWQjVUzMAAJA7EITAKoj6AaSFRglchPj9/oULF86YMWPDhg133HGH0+mMx+Nut/uUU05ZsWIFncL1CR83UxBgRUXFeeedd9JJJ/3jH//46U9/Wl5eHo/Hg8Hg+vXrly1bxs+ljfLyctr42c9+VldXd+zYsRkzZkydOnX//v3t7e2BQCAUCtHBXq+XxGF2flMm3YZ9Ph+XBHQ3jh07ZrfbSVY5HA7RfGfgNaoZOMeO14SMsWPHju3bt2/KlClTpkxJJBLPPfecx+NpbW3lmlAsn4QoN5mmUqnS0tIFCxYsWLDghRdeePbZZx955JFAIBCNRltaWq655prS0lLxdClPaUlJyZIlS+bPn79jx44nnngiEokkEomKiooVK1a0traSjGdC8K3P50srCPk3ReugMJVPJtP5SRYkcFQzc09JSQk/YJyrBMA4oGchBACAPAJBCKyC9KozyAkB2PGrn1PGRbvdHggEzj777AcffPC3v/0tY+yRRx7hapAyzTidTjqeTE82m40vdldXV3fNNddceeWV999/f1lZ2d///neuBhOJBPfD7OnpoZ1z5swJBAK1tbW9vb2vvvrqokWLli1bduDAgbKyMrqc2+2WrIVZN5M3QdygYh0OR01NzZNPPqk+/sknn7zgggsM3Aj1ssjwnep/V65cmUgk7rzzzquuumrlypXxePypp54677zz5syZw6UvvyJfFZOgFR1I461du3ZoaOhjH/sYY+zyyy//7ne/y4+hHDNs9LbTfnKFpdykixcv3rx583XXXccY+/73v3/iiSfyc8VGkSeqsRclHexyufhqhJIMVps9C4WeLrVC3QAYOzR9v/HYAwDyCwQhAEVJKBRio0kvuVT717/+1d3d/b3vfe/OO+9kjL388ss/+MEPli9fvnbtWqfTSYfFYrFYLMYFIemTzs7OBx98MBqN3njjjX/961+Hhob+/ve///jHP161atWaNWtIn5BI2LRp07nnnnvttddefvnl3d3dZWVlV1555SOPPPLd73730ksvLdz9OI7t27cvXLhw/fr1Ka0lCtUYjK64IiK9Z7fbTz/99P7+/r/+9a8f//jHV69e7ff7n3zyyYsuumjWrFl2uz2RSHCTIP07ODhIJfD9L7/88ksvvbRkyRKqz/vvv3/zzTfPnTv3rLPOqqqqomNSqVQ8HqdvmTFG5rtIJPLUU08NDAwsW7aMzt2zZ8/f//53xti6desotwpPZWFehLvdbjISSjdENMqlrJFllB3/ZVGgLG0XvGIA5Bd61MVUSXjIQR7BtAIQgSAEoMigTpzUBWm83t7eTZs2dXZ2BgKBM888s7GxkY487bTTGGP79u2744475syZs2rVqrKystLS0mnTppEdjzF26NChDRs27Nu3r7m5+ZRTTpk7dy5jrKys7KKLLnr77bffeeedjRs3nnbaacuWLSPpGAqFpk2bdt5557HRpKbf/OY3H3nkkcsuu+xnP/vZI488Qh6nZtJ7mHwb8cNI54jrCtAlkslkIBBYtGjR0NDQ0aNHA4EAhdVpXijTVyCPPKRFJkgTnn/++U8++eQDDzzwiU984qSTTnK5XI8++ujll18+depUWgqSziVzX2NjI110aGjorbfeamtri0QiH/rQh1atWkWHLV68mDG2a9eue++9t6mp6YwzzqipqbHZbLNmzeKJXo4dO7Z169adO3f6/f4lS5YsXbqU9s+ePTuVSu3atev555+vq6tbvHhxIBCgOpM+NHmHQ6GQtDqFpoleUxOO56hCfWnxeUBSGTDxsFruXADAhASCEFgFxBBmBAlCj8czNDT0yiuvRCKRNWvWUDrKZDJJksztdp955plnnHHG008//c477/j9/tNPP91ms1VXV9MwOhQKPfnkk8PDw2vXrj355JMZY6lUitbHq6qqWrdu3amnnvrwww+/8sorNptt+fLljLGamprDhw8PDw+XlpZGIhGv17tixYra2lrKVipm+BhnuNcoUV9ff/fddzOd2DMzj5k6hpDkByXXueiii5544om77rrrC1/4wqJFi0Kh0D333PPpT3+6ublZPGvatGnV1dW0/e677z7//POnnHLK+eefT9lfYrFYMpn0eDyLFy9evHjxhg0b/vnPfzqdzrVr15aUlPh8Pu5x+sorr3R2di5btuz000+nPaTfXC7XnDlz5syZs3fv3s2bNyeTyZUrV1J6GBKEZjRSZWVlVVUVN05q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BBZCPc67+uqrKa4sLb/61a9OPPFEKaxL7bVo0nqjlgQ0fCehdcYZZ7z00ktPPvnkvHnzYrGYx+PhdjlKDFNSUjJ79uxUKrV3795QKFRSUjJ9+vSmpqYDBw4kEgluYiotLU0mk3v27KHgQ72gtVQqtW/fvm3btp166qls1JWUDlYUhZr8yCOPfOYzn7n++ut/8IMfUD0N2kttMSlCDKDUPuIePZXCFRetGEk7H3jggSlTppx55pldXV1UGSnUk6ckZYwlk0m6z4cPH3766ac7OjpWr17d19eXEpL9kL+oGIoplkbLTrz33nu7d+/mpmap7dI8ggF6iW2NTxefK24hdLvdov+qSdJWMuskqJNHbk2elgIAAAAGQBACqyBZ5PjQubS0NBKJ8CSNokskneLz+cLh8B//+McvfelLjLHf/va3Z5999qxZs9QSy3ygl2bkocfjicfjHo/H7Xafc845GzduPHDggNvtdjgcZKYjQZJMJgcGBsrLy20228DAgKIow8PDZWVlFAZJRrxYLOZyubxebzKZDAaDdCIbHcSTpOHbpD0+9rGPzZkzhzFGXrJUJTrmG9/4xsMPP3z++ec/+OCDBw4cuOeee3hlpGbydCnSuh3qxhrfGYLW29A7TDM1i91upyUZq6qqvv/970cike3bt5MepohEWrSDakgpW5PJJH3vJSUl0Wj00KFDHR0dR44cOXbsWH9/P7/nbDS00m63u1wuOosS/NAGYywajdbW1t52223Dw8NdXV1qX1/z0FUyPUv6OkhRu91uydSckbVWjxxXxZgkZBT2CQAAAExIIAiB1YnH4yQhRESZQWKATEw7duz44he/+PnPf/7nP/85CQwz+UXVyTA1jyftx0YF1bJly4aGhijhDV2FakLbsVjMZrNNmzbN6XSSLOEOk/wSJCPFNTPUkpUsiqRC6ZhEIsHTkNhstkgkctttt917771XX311f3//9OnTb7jhhltuuUVqhe34lQxId2nG0ZmHWwgNPHLV1+X/nn766YlEIhwOizk/1V67dInU6CINU6dOdTqdc+bMmTlzJgUWsuOfB82i2KjF2Ofz2e32d999t6+vL1NBKBZIQi6j0yW4y6iYPpd/lGPJbFQQIpGmMZCCAAAAAAQhsBbqxJhqNShBxp/58+dv3br1yJEjP/3pT4PB4Je//OWbbrqppqbGwNgijZWN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',
+            crossOrigin: null,
+            filters: []
+        },
+        {
+            type: 'group',
+            version: '5.3.0',
+            originX: 'left',
+            originY: 'top',
+            left: 776.561,
+            top: 173.3615,
+            width: 48.205,
+            height: 48.205,
+            fill: 'rgb(0,0,0)',
+            stroke: null,
+            strokeWidth: 0,
+            strokeDashArray: null,
+            strokeLineCap: 'butt',
+            strokeDashOffset: 0,
+            strokeLineJoin: 'miter',
+            strokeUniform: false,
+            strokeMiterLimit: 4,
+            scaleX: 1,
+            scaleY: 1,
+            angle: 0,
+            flipX: false,
+            flipY: false,
+            opacity: 1,
+            shadow: null,
+            visible: true,
+            backgroundColor: '',
+            fillRule: 'nonzero',
+            paintFirst: 'fill',
+            globalCompositeOperation: 'source-over',
+            skewX: 0,
+            skewY: 0,
+            id: 'f772494d-01de-4a9e-b21d-67faed778e60',
+            selectable: false,
+            hasControls: true,
+            objects: [
+                {
+                    type: 'circle',
+                    version: '5.3.0',
+                    originX: 'left',
+                    originY: 'top',
+                    left: -24.1025,
+                    top: -24.1025,
+                    width: 300,
+                    height: 300,
+                    fill: 'rgba(44,246,72,0.99)',
+                    stroke: 'rgba(45,240,230,1)',
+                    strokeWidth: 10,
+                    strokeDashArray: null,
+                    strokeLineCap: 'butt',
+                    strokeDashOffset: 0,
+                    strokeLineJoin: 'miter',
+                    strokeUniform: false,
+                    strokeMiterLimit: 4,
+                    scaleX: 0.1555,
+                    scaleY: 0.1555,
+                    angle: 0,
+                    flipX: false,
+                    flipY: false,
+                    opacity: 1,
+                    shadow: '',
+                    visible: true,
+                    backgroundColor: '',
+                    fillRule: 'nonzero',
+                    paintFirst: 'fill',
+                    globalCompositeOperation: 'source-over',
+                    skewX: 0,
+                    skewY: 0,
+                    radius: 150,
+                    startAngle: 0,
+                    endAngle: 360,
+                    selectable: false,
+                    hasControls: true
+                },
+                {
+                    type: 'i-text',
+                    version: '5.3.0',
+                    originX: 'left',
+                    originY: 'top',
+                    left: -16.7824,
+                    top: -8.9323,
+                    width: 160,
+                    height: 90.4,
+                    fill: 'rgba(255,255,255,1)',
+                    stroke: null,
+                    strokeWidth: 1,
+                    strokeDashArray: null,
+                    strokeLineCap: 'butt',
+                    strokeDashOffset: 0,
+                    strokeLineJoin: 'miter',
+                    strokeUniform: false,
+                    strokeMiterLimit: 4,
+                    scaleX: 0.1954,
+                    scaleY: 0.1954,
+                    angle: 0,
+                    flipX: false,
+                    flipY: false,
+                    opacity: 1,
+                    shadow: '',
+                    visible: true,
+                    backgroundColor: '',
+                    fillRule: 'nonzero',
+                    paintFirst: 'fill',
+                    globalCompositeOperation: 'source-over',
+                    skewX: 0,
+                    skewY: 0,
+                    fontFamily: 'arial',
+                    fontWeight: 'normal',
+                    fontSize: 80,
+                    text: '正常',
+                    underline: false,
+                    overline: false,
+                    linethrough: false,
+                    textAlign: 'left',
+                    fontStyle: 'normal',
+                    lineHeight: 1.16,
+                    textBackgroundColor: '',
+                    charSpacing: 0,
+                    styles: [],
+                    direction: 'ltr',
+                    path: null,
+                    pathStartOffset: 0,
+                    pathSide: 'left',
+                    pathAlign: 'baseline',
+                    selectable: false,
+                    hasControls: true
+                },
+            ]
+        },
+        {
+            type: 'group',
+            version: '5.3.0',
+            originX: 'left',
+            originY: 'top',
+            left: 386.3748,
+            top: 155.1298,
+            width: 48.205,
+            height: 48.205,
+            fill: 'rgb(0,0,0)',
+            stroke: null,
+            strokeWidth: 0,
+            strokeDashArray: null,
+            strokeLineCap: 'butt',
+            strokeDashOffset: 0,
+            strokeLineJoin: 'miter',
+            strokeUniform: false,
+            strokeMiterLimit: 4,
+            scaleX: 1,
+            scaleY: 1,
+            angle: 0,
+            flipX: false,
+            flipY: false,
+            opacity: 1,
+            shadow: null,
+            visible: true,
+            backgroundColor: '',
+            fillRule: 'nonzero',
+            paintFirst: 'fill',
+            globalCompositeOperation: 'source-over',
+            skewX: 0,
+            skewY: 0,
+            id: '3fea9335-b7a3-4b01-bf7b-7d15b4ca6b62',
+            selectable: false,
+            hasControls: true,
+            objects: [
+                {
+                    type: 'circle',
+                    version: '5.3.0',
+                    originX: 'left',
+                    originY: 'top',
+                    left: -24.1025,
+                    top: -24.1025,
+                    width: 300,
+                    height: 300,
+                    fill: 'rgba(248,9,3,0.94)',
+                    stroke: 'rgba(255,243,47,1)',
+                    strokeWidth: 10,
+                    strokeDashArray: null,
+                    strokeLineCap: 'butt',
+                    strokeDashOffset: 0,
+                    strokeLineJoin: 'miter',
+                    strokeUniform: false,
+                    strokeMiterLimit: 4,
+                    scaleX: 0.1555,
+                    scaleY: 0.1555,
+                    angle: 0,
+                    flipX: false,
+                    flipY: false,
+                    opacity: 1,
+                    shadow: '',
+                    visible: true,
+                    backgroundColor: '',
+                    fillRule: 'nonzero',
+                    paintFirst: 'fill',
+                    globalCompositeOperation: 'source-over',
+                    skewX: 0,
+                    skewY: 0,
+                    radius: 150,
+                    startAngle: 0,
+                    endAngle: 360,
+                    selectable: false,
+                    hasControls: true
+                },
+                {
+                    type: 'i-text',
+                    version: '5.3.0',
+                    originX: 'left',
+                    originY: 'top',
+                    left: -15.8708,
+                    top: -8.9298,
+                    width: 160,
+                    height: 90.4,
+                    fill: 'rgba(255,255,255,1)',
+                    stroke: null,
+                    strokeWidth: 1,
+                    strokeDashArray: null,
+                    strokeLineCap: 'butt',
+                    strokeDashOffset: 0,
+                    strokeLineJoin: 'miter',
+                    strokeUniform: false,
+                    strokeMiterLimit: 4,
+                    scaleX: 0.1954,
+                    scaleY: 0.1954,
+                    angle: 0,
+                    flipX: false,
+                    flipY: false,
+                    opacity: 1,
+                    shadow: '',
+                    visible: true,
+                    backgroundColor: '',
+                    fillRule: 'nonzero',
+                    paintFirst: 'fill',
+                    globalCompositeOperation: 'source-over',
+                    skewX: 0,
+                    skewY: 0,
+                    fontFamily: 'arial',
+                    fontWeight: 'normal',
+                    fontSize: 80,
+                    text: '警告',
+                    underline: false,
+                    overline: false,
+                    linethrough: false,
+                    textAlign: 'left',
+                    fontStyle: 'normal',
+                    lineHeight: 1.16,
+                    textBackgroundColor: '',
+                    charSpacing: 0,
+                    styles: [],
+                    direction: 'ltr',
+                    path: null,
+                    pathStartOffset: 0,
+                    pathSide: 'left',
+                    pathAlign: 'baseline',
+                    selectable: false,
+                    hasControls: true
+                },
+            ]
+        },
+    ],
+    /**画布 */
+    clipPath: {
+        type: 'rect',
+        version: '5.3.0',
+        originX: 'left',
+        originY: 'top',
+        left: 0,
+        top: 0,
+        width: 1200,
+        height: 900,
+        fill: 'rgba(255,255,255,1)',
+        stroke: null,
+        strokeWidth: 0,
+        strokeDashArray: null,
+        strokeLineCap: 'butt',
+        strokeDashOffset: 0,
+        strokeLineJoin: 'miter',
+        strokeUniform: false,
+        strokeMiterLimit: 4,
+        scaleX: 1,
+        scaleY: 1,
+        angle: 0,
+        flipX: false,
+        flipY: false,
+        opacity: 1,
+        shadow: null,
+        visible: true,
+        backgroundColor: '',
+        fillRule: 'nonzero',
+        paintFirst: 'fill',
+        globalCompositeOperation: 'source-over',
+        skewX: 0,
+        skewY: 0,
+        rx: 0,
+        ry: 0,
+        selectable: false,
+        hasControls: true
+    }
+};
+// mock tableListDataSource
+var genData = function (params) {
+    var data = __assign({}, currJson1);
+    return data;
+};
+function fetchFabricModelsById(req, res, u, b) {
+    //   let realUrl = u;
+    //   if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') {
+    //     realUrl = req.url;
+    //   }
+    //   const body = (b && b.body) || req.body;
+    //   const { method, name, desc, key } = body;
+    //   const params = parse(realUrl, true).query as unknown as API.PageParams &
+    //     API.RuleListItem & {
+    //       sorter: any;
+    //       filter: any;
+    //     };
+    //   console.log(req, 'getModelDetailApi');
+    var result = {
+        data: genData({ id: 2 }),
+        success: true,
+        msg: '获取成功'
+    };
+    return res.json(result);
+}
+exports["default"] = {
+    'GET /api/v1/mock/fabricModels/1': fetchFabricModelsById
+};
diff --git a/mock/fabricModels.ts b/mock/fabricModels.ts
new file mode 100644
index 0000000..f29edfa
--- /dev/null
+++ b/mock/fabricModels.ts
@@ -0,0 +1,820 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-09 14:29:49
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-12-05 09:58:06
+ * @FilePath: \general-ai-platform-web\mock\modelDetail.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+import { Request, Response } from 'express';
+
+const currJson1 = {
+  version: '5.3.0',
+  objects: [
+    {
+      type: 'rect',
+      version: '5.3.0',
+      originX: 'left',
+      originY: 'top',
+      left: 0,
+      top: 0,
+      width: 1200,
+      height: 900,
+      fill: 'rgba(255,255,255,1)',
+      stroke: null,
+      strokeWidth: 0,
+      strokeDashArray: null,
+      strokeLineCap: 'butt',
+      strokeDashOffset: 0,
+      strokeLineJoin: 'miter',
+      strokeUniform: false,
+      strokeMiterLimit: 4,
+      scaleX: 1,
+      scaleY: 1,
+      angle: 0,
+      flipX: false,
+      flipY: false,
+      opacity: 1,
+      shadow: null,
+      visible: true,
+      backgroundColor: '',
+      fillRule: 'nonzero',
+      paintFirst: 'fill',
+      globalCompositeOperation: 'source-over',
+      skewX: 0,
+      skewY: 0,
+      rx: 0,
+      ry: 0,
+      id: 'workspace',
+      selectable: false,
+      hasControls: false,
+    },
+    {
+      type: 'image',
+      version: '5.3.0',
+      originX: 'left',
+      originY: 'top',
+      left: 0.7463,
+      top: 0,
+      width: 1200,
+      height: 900,
+      fill: 'rgb(0,0,0)',
+      stroke: null,
+      strokeWidth: 0,
+      strokeDashArray: null,
+      strokeLineCap: 'butt',
+      strokeDashOffset: 0,
+      strokeLineJoin: 'miter',
+      strokeUniform: false,
+      strokeMiterLimit: 4,
+      scaleX: 1,
+      scaleY: 1,
+      angle: 0,
+      flipX: false,
+      flipY: false,
+      opacity: 1,
+      shadow: null,
+      visible: true,
+      backgroundColor: '',
+      fillRule: 'nonzero',
+      paintFirst: 'fill',
+      globalCompositeOperation: 'source-over',
+      skewX: 0,
+      skewY: 0,
+      cropX: 0,
+      cropY: 0,
+      selectable: false,
+      hasControls: true,
+      src: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAAOECAIAAAA+D1+tAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFyGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuMTY0NzUzLCAyMDIxLzAyLzE1LTExOjUyOjEzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMy0xMS0yOVQxNjowNjozNSswODowMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpjMWE2ZTE4MC1iMTc1LTQ2NGMtYjBlZS0zYjgxYTcwNjY4MTMiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo4YjQzZmIyYy1hYmVmLWYzNGItODVlZC1k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oizn60n1OZ3O5cuXnzp16vXXX588efKcOXO459vFixc3btw4YMCAFStWiJuo6jcYDIFAID8//4EHHvjwww937drF/YR5AyI5hwDEL2FGQyIJciYS7EmBUwAQgSAEIFbwer293QTQ59Bm3lOE+EBygCwoKHjsscco08zBgwdTU1PHjRv3y1/+kuYzIBFCsz+rPCr5LsS99HovROW6yTUhdRnpwNesWZOamjphwgQWQmUxjcsor5ObQ81m82233fbpp5+uWbNm2bJlUogEqqSZRddTlSyUZXnw4MFf+9rXPvroo9dee+2uu+5ijH322WelpaXz5s2jCSq41BQFOVVFNV+6dGnv3r3Hjh1TqUEA+ji9/kYCIBaAIASgRwnjNka2mg6NQeJLBjoJH4ZQ2s6Mp7SGApIgYYzl5+e/9NJL//Vf/zV58uTnn39eVIMqX1Mm3Jm9622ldfJkgsuooplej+x47777bmNj47333muxWPh50K1K6zIq2kgVRbFYLHPmzFm/fv2mTZtuuukmHk+oKizWo42cpGLp6ekrV67cvn37n//855aWlmHDht1///1ms5m1ika+U1XWGc6FCxfghgCA1DqVC/2bYHY/AKIDMYQA9DRSW/j6TsYQdmkbQfwR3c0Qam4uMaCOMeb1er/88suZM2du3Ljx8ccfv3btWlVVFWuNjuMSS3tXM01mzp5Ed7/iSuoaKkIKlnfffbe2tnbZsmUOh4Np3EpF6FRrH1uVX6jVal2+fPm1a9fee+891nrGdKvS3QVrmw9j0KBBFRUVhw4d6tevH6lBJgRqai2E4pGaTCaLxSLWDAAAADBYCAHoMXTDqMS+KZ9zrPP1AxAhuiYjlUYqLS194403JkyYsHTpUirwxRdf/Pa3vx06dOjXv/51KkOztGtj5KgqlVmsOw9IH1WTxMkDg8Egzf/OGHvzzTcbGhpuv/12mp6B6+FQIYhhhJwozCRJuv3221evXr1u3brFixdrNaHf7xclHP8rXgWXy/XKK6/4fL7/+3//L2Ns8+bN/9//9//dddddhYWFBoOBTjI57jK9uToURamtreX+on6/n2y8AAAAAAQhAD1Hu9nMeqwlABBcGol2MC5CmpqatmzZUldXt2rVqmHDhjHGAoGAwWCYOHFifn7+tm3bnnrqqRkzZkycONFoNIoKRAylUykT0SW1d+95ahup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hg0bfvnLX65Zs2bJkiUOh2NwcPDRRx8dGRn56Ec/2traWlNTQ8dTVCFtT58+/brrrtu7d++GDRtuv/32j370o01NTYyxoaGhJ554gjF29tlnt7a2kgkxHo97PB6v1zsyMmJy1BgMBumZkdpuOz5pkPrOjBua35HX66UfAj9mfCsFwJgjWQjVUzMAAJA7EITAKoj6AaSFRglchPj9/oULF86YMWPDhg133HGH0+mMx+Nut/uUU05ZsWIFncL1CR83UxBgRUXFeeedd9JJJ/3jH//46U9/Wl5eHo/Hg8Hg+vXrly1bxs+ljfLyctr42c9+VldXd+zYsRkzZkydOnX//v3t7e2BQCAUCtHBXq+XxGF2flMm3YZ9Ph+XBHQ3jh07ZrfbSVY5HA7RfGfgNaoZOMeO14SMsWPHju3bt2/KlClTpkxJJBLPPfecx+NpbW3lmlAsn4QoN5mmUqnS0tIFCxYsWLDghRdeePbZZx955JFAIBCNRltaWq655prS0lLxdClPaUlJyZIlS+bPn79jx44nnngiEokkEomKiooVK1a0traSjGdC8K3P50srCPk3ReugMJVPJtP5SRYkcFQzc09JSQk/YJyrBMA4oGchBACAPAJBCKyC9KozyAkB2PGrn1PGRbvdHggEzj777AcffPC3v/0tY+yRRx7hapAyzTidTjqeTE82m40vdldXV3fNNddceeWV999/f1lZ2d///neuBhOJBPfD7OnpoZ1z5swJBAK1tbW9vb2vvvrqokWLli1bduDAgbKyMrqc2+2WrIVZN5M3QdygYh0OR01NzZNPPqk+/sknn7zgggsM3Aj1ssjwnep/V65cmUgk7rzzzquuumrlypXxePypp54677zz5syZw6UvvyJfFZOgFR1I461du3ZoaOhjH/sYY+zyyy//7ne/y4+hHDNs9LbTfnKFpdykixcv3rx583XXXccY+/73v3/iiSfyc8VGkSeqsRclHexyufhqhJIMVps9C4WeLrVC3QAYOzR9v/HYAwDyCwQhAEVJKBRio0kvuVT717/+1d3d/b3vfe/OO+9kjL388ss/+MEPli9fvnbtWqfTSYfFYrFYLMYFIemTzs7OBx98MBqN3njjjX/961+Hhob+/ve///jHP161atWaNWtIn5BI2LRp07nnnnvttddefvnl3d3dZWVlV1555SOPPPLd73730ksvLdz9OI7t27cvXLhw/fr1Ka0lCtUYjK64IiK9Z7fbTz/99P7+/r/+9a8f//jHV69e7ff7n3zyyYsuumjWrFl2uz2RSHCTIP07ODhIJfD9L7/88ksvvbRkyRKqz/vvv3/zzTfPnTv3rLPOqqqqomNSqVQ8HqdvmTFG5rtIJPLUU08NDAwsW7aMzt2zZ8/f//53xti6desotwpPZWFehLvdbjISSjdENMqlrJFllB3/ZVGgLG0XvGIA5Bd61MVUSXjIQR7BtAIQgSAEoMigTpzUBWm83t7eTZs2dXZ2BgKBM888s7GxkY487bTTGGP79u2744475syZs2rVqrKystLS0mnTppEdjzF26NChDRs27Nu3r7m5+ZRTTpk7dy5jrKys7KKLLnr77bffeeedjRs3nnbaacuWLSPpGAqFpk2bdt5557HRpKbf/OY3H3nkkcsuu+xnP/vZI488Qh6nZtJ7mHwb8cNI54jrCtAlkslkIBBYtGjR0NDQ0aNHA4EAhdVpXijTVyCPPKRFJkgTnn/++U8++eQDDzzwiU984qSTTnK5XI8++ujll18+depUWgqSziVzX2NjI110aGjorbfeamtri0QiH/rQh1atWkWHLV68mDG2a9eue++9t6mp6YwzzqipqbHZbLNmzeKJXo4dO7Z169adO3f6/f4lS5YsXbqU9s+ePTuVSu3atev555+vq6tbvHhxIBCgOpM+NHmHQ6GQtDqFpoleUxOO56hCfWnxeUBSGTDxsFruXADAhASCEFgFxBBmBAlCj8czNDT0yiuvRCKRNWvWUDrKZDJJksztdp955plnnHHG008//c477/j9/tNPP91ms1VXV9MwOhQKPfnkk8PDw2vXrj355JMZY6lUitbHq6qqWrdu3amnnvrwww+/8sorNptt+fLljLGamprDhw8PDw+XlpZGIhGv17tixYra2lrKVipm+BhnuNcoUV9ff/fddzOd2DMzj5k6hpDkByXXueiii5544om77rrrC1/4wqJFi0Kh0D333PPpT3+6ublZPGvatGnV1dW0/e677z7//POnnHLK+eefT9lfYrFYMpn0eDyLFy9evHjxhg0b/vnPfzqdzrVr15aUlPh8Pu5x+sorr3R2di5btuz000+nPaTfXC7XnDlz5syZs3fv3s2bNyeTyZUrV1J6GBKEZjRSZWVlVVUVN05q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BBZCPc67+uqrKa4sLb/61a9OPPFEKaxL7bVo0nqjlgQ0fCehdcYZZ7z00ktPPvnkvHnzYrGYx+PhdjlKDFNSUjJ79uxUKrV3795QKFRSUjJ9+vSmpqYDBw4kEgluYiotLU0mk3v27KHgQ72gtVQqtW/fvm3btp166qls1JWUDlYUhZr8yCOPfOYzn7n++ut/8IMfUD0N2kttMSlCDKDUPuIePZXCFRetGEk7H3jggSlTppx55pldXV1UGSnUk6ckZYwlk0m6z4cPH3766ac7OjpWr17d19eXEpL9kL+oGIoplkbLTrz33nu7d+/mpmap7dI8ggF6iW2NTxefK24hdLvdov+qSdJWMuskqJNHbk2elgIAAAAGQBACqyBZ5PjQubS0NBKJ8CSNokskneLz+cLh8B//+McvfelLjLHf/va3Z5999qxZs9QSy3ygl2bkocfjicfjHo/H7Xafc845GzduPHDggNvtdjgcZKYjQZJMJgcGBsrLy20228DAgKIow8PDZWVlFAZJRrxYLOZyubxebzKZDAaDdCIbHcSTpOHbpD0+9rGPzZkzhzFGXrJUJTrmG9/4xsMPP3z++ec/+OCDBw4cuOeee3hlpGbydCnSuh3qxhrfGYLW29A7TDM1i91upyUZq6qqvv/970cike3bt5MepohEWrSDakgpW5PJJH3vJSUl0Wj00KFDHR0dR44cOXbsWH9/P7/nbDS00m63u1wuOosS/NAGYywajdbW1t52223Dw8NdXV1qX1/z0FUyPUv6OkhRu91uydSckbVWjxxXxZgkZBT2CQAAAExIIAiB1YnH4yQhRESZQWKATEw7duz44he/+PnPf/7nP/85CQwz+UXVyTA1jyftx0YF1bJly4aGhijhDV2FakLbsVjMZrNNmzbN6XSSLOEOk/wSJCPFNTPUkpUsiqRC6ZhEIsHTkNhstkgkctttt917771XX311f3//9OnTb7jhhltuuUVqhe34lQxId2nG0ZmHWwgNPHLV1+X/nn766YlEIhwOizk/1V67dInU6CINU6dOdTqdc+bMmTlzJgUWsuOfB82i2KjF2Ofz2e32d999t6+vL1NBKBZIQi6j0yW4y6iYPpd/lGPJbFQQIpGmMZCCAAAAAAQhsBbqxJhqNShBxp/58+dv3br1yJEjP/3pT4PB4Je//OWbbrqppqbGwNgijZWN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',
+      crossOrigin: null,
+      filters: [],
+    },
+    {
+      type: 'group',
+      version: '5.3.0',
+      originX: 'left',
+      originY: 'top',
+      left: 776.561,
+      top: 172.6152,
+      width: 48.205,
+      height: 48.205,
+      fill: 'rgb(0,0,0)',
+      stroke: null,
+      strokeWidth: 0,
+      strokeDashArray: null,
+      strokeLineCap: 'butt',
+      strokeDashOffset: 0,
+      strokeLineJoin: 'miter',
+      strokeUniform: false,
+      strokeMiterLimit: 4,
+      scaleX: 1,
+      scaleY: 1,
+      angle: 0,
+      flipX: false,
+      flipY: false,
+      opacity: 1,
+      shadow: null,
+      visible: true,
+      backgroundColor: '',
+      fillRule: 'nonzero',
+      paintFirst: 'fill',
+      globalCompositeOperation: 'source-over',
+      skewX: 0,
+      skewY: 0,
+      id: 'f772494d-01de-4a9e-b21d-67faed778e60',
+      selectable: true,
+      hasControls: true,
+      userProperty: {
+        modelId: '987',
+        status: '0',
+      },
+      objects: [
+        {
+          type: 'circle',
+          version: '5.3.0',
+          originX: 'left',
+          originY: 'top',
+          left: -24.1025,
+          top: -24.1025,
+          width: 300,
+          height: 300,
+          fill: 'rgba(44,246,72,0.99)',
+          stroke: 'rgba(45,240,230,1)',
+          strokeWidth: 10,
+          strokeDashArray: null,
+          strokeLineCap: 'butt',
+          strokeDashOffset: 0,
+          strokeLineJoin: 'miter',
+          strokeUniform: false,
+          strokeMiterLimit: 4,
+          scaleX: 0.1555,
+          scaleY: 0.1555,
+          angle: 0,
+          flipX: false,
+          flipY: false,
+          opacity: 1,
+          shadow: '',
+          visible: true,
+          backgroundColor: '',
+          fillRule: 'nonzero',
+          paintFirst: 'fill',
+          globalCompositeOperation: 'source-over',
+          skewX: 0,
+          skewY: 0,
+          radius: 150,
+          startAngle: 0,
+          endAngle: 360,
+          selectable: true,
+          hasControls: true,
+        },
+        {
+          type: 'i-text',
+          version: '5.3.0',
+          originX: 'left',
+          originY: 'top',
+          left: -16.7824,
+          top: -8.9323,
+          width: 160,
+          height: 90.4,
+          fill: 'rgba(255,255,255,1)',
+          stroke: null,
+          strokeWidth: 1,
+          strokeDashArray: null,
+          strokeLineCap: 'butt',
+          strokeDashOffset: 0,
+          strokeLineJoin: 'miter',
+          strokeUniform: false,
+          strokeMiterLimit: 4,
+          scaleX: 0.1954,
+          scaleY: 0.1954,
+          angle: 0,
+          flipX: false,
+          flipY: false,
+          opacity: 1,
+          shadow: '',
+          visible: true,
+          backgroundColor: '',
+          fillRule: 'nonzero',
+          paintFirst: 'fill',
+          globalCompositeOperation: 'source-over',
+          skewX: 0,
+          skewY: 0,
+          fontFamily: 'arial',
+          fontWeight: 'normal',
+          fontSize: 80,
+          text: '正常',
+          underline: false,
+          overline: false,
+          linethrough: false,
+          textAlign: 'left',
+          fontStyle: 'normal',
+          lineHeight: 1.16,
+          textBackgroundColor: '',
+          charSpacing: 0,
+          styles: [],
+          direction: 'ltr',
+          path: null,
+          pathStartOffset: 0,
+          pathSide: 'left',
+          pathAlign: 'baseline',
+          selectable: true,
+          hasControls: true,
+        },
+      ],
+    },
+    {
+      type: 'group',
+      version: '5.3.0',
+      originX: 'left',
+      originY: 'top',
+      left: 384.136,
+      top: 152.891,
+      width: 48.205,
+      height: 48.205,
+      fill: 'rgb(0,0,0)',
+      stroke: null,
+      strokeWidth: 0,
+      strokeDashArray: null,
+      strokeLineCap: 'butt',
+      strokeDashOffset: 0,
+      strokeLineJoin: 'miter',
+      strokeUniform: false,
+      strokeMiterLimit: 4,
+      scaleX: 1,
+      scaleY: 1,
+      angle: 0,
+      flipX: false,
+      flipY: false,
+      opacity: 1,
+      shadow: null,
+      visible: true,
+      backgroundColor: '',
+      fillRule: 'nonzero',
+      paintFirst: 'fill',
+      globalCompositeOperation: 'source-over',
+      skewX: 0,
+      skewY: 0,
+      id: '3fea9335-b7a3-4b01-bf7b-7d15b4ca6b62',
+      selectable: true,
+      hasControls: true,
+      userProperty: {
+        modelId: '123',
+        status: '1',
+      },
+      objects: [
+        {
+          type: 'circle',
+          version: '5.3.0',
+          originX: 'left',
+          originY: 'top',
+          left: -24.1025,
+          top: -24.1025,
+          width: 300,
+          height: 300,
+          fill: 'rgba(248,9,3,0.94)',
+          stroke: 'rgba(255,243,47,1)',
+          strokeWidth: 10,
+          strokeDashArray: null,
+          strokeLineCap: 'butt',
+          strokeDashOffset: 0,
+          strokeLineJoin: 'miter',
+          strokeUniform: false,
+          strokeMiterLimit: 4,
+          scaleX: 0.1555,
+          scaleY: 0.1555,
+          angle: 0,
+          flipX: false,
+          flipY: false,
+          opacity: 1,
+          shadow: '',
+          visible: true,
+          backgroundColor: '',
+          fillRule: 'nonzero',
+          paintFirst: 'fill',
+          globalCompositeOperation: 'source-over',
+          skewX: 0,
+          skewY: 0,
+          radius: 150,
+          startAngle: 0,
+          endAngle: 360,
+          selectable: true,
+          hasControls: true,
+        },
+        {
+          type: 'i-text',
+          version: '5.3.0',
+          originX: 'left',
+          originY: 'top',
+          left: -15.8708,
+          top: -8.9298,
+          width: 160,
+          height: 90.4,
+          fill: 'rgba(255,255,255,1)',
+          stroke: null,
+          strokeWidth: 1,
+          strokeDashArray: null,
+          strokeLineCap: 'butt',
+          strokeDashOffset: 0,
+          strokeLineJoin: 'miter',
+          strokeUniform: false,
+          strokeMiterLimit: 4,
+          scaleX: 0.1954,
+          scaleY: 0.1954,
+          angle: 0,
+          flipX: false,
+          flipY: false,
+          opacity: 1,
+          shadow: '',
+          visible: true,
+          backgroundColor: '',
+          fillRule: 'nonzero',
+          paintFirst: 'fill',
+          globalCompositeOperation: 'source-over',
+          skewX: 0,
+          skewY: 0,
+          fontFamily: 'arial',
+          fontWeight: 'normal',
+          fontSize: 80,
+          text: '警告',
+          underline: false,
+          overline: false,
+          linethrough: false,
+          textAlign: 'left',
+          fontStyle: 'normal',
+          lineHeight: 1.16,
+          textBackgroundColor: '',
+          charSpacing: 0,
+          styles: [],
+          direction: 'ltr',
+          path: null,
+          pathStartOffset: 0,
+          pathSide: 'left',
+          pathAlign: 'baseline',
+          selectable: true,
+          hasControls: true,
+        },
+      ],
+    },
+  ],
+  clipPath: {
+    type: 'rect',
+    version: '5.3.0',
+    originX: 'left',
+    originY: 'top',
+    left: 0,
+    top: 0,
+    width: 1200,
+    height: 900,
+    fill: 'rgba(255,255,255,1)',
+    stroke: null,
+    strokeWidth: 0,
+    strokeDashArray: null,
+    strokeLineCap: 'butt',
+    strokeDashOffset: 0,
+    strokeLineJoin: 'miter',
+    strokeUniform: false,
+    strokeMiterLimit: 4,
+    scaleX: 1,
+    scaleY: 1,
+    angle: 0,
+    flipX: false,
+    flipY: false,
+    opacity: 1,
+    shadow: null,
+    visible: true,
+    backgroundColor: '',
+    fillRule: 'nonzero',
+    paintFirst: 'fill',
+    globalCompositeOperation: 'source-over',
+    skewX: 0,
+    skewY: 0,
+    rx: 0,
+    ry: 0,
+    selectable: true,
+    hasControls: true,
+  },
+};
+
+const currJson2 = {
+  version: '5.3.0',
+  objects: [
+    {
+      type: 'rect',
+      version: '5.3.0',
+      originX: 'left',
+      originY: 'top',
+      left: 0,
+      top: 0,
+      width: 1200,
+      height: 900,
+      fill: 'rgba(255,255,255,1)',
+      stroke: null,
+      strokeWidth: 0,
+      strokeDashArray: null,
+      strokeLineCap: 'butt',
+      strokeDashOffset: 0,
+      strokeLineJoin: 'miter',
+      strokeUniform: false,
+      strokeMiterLimit: 4,
+      scaleX: 1,
+      scaleY: 1,
+      angle: 0,
+      flipX: false,
+      flipY: false,
+      opacity: 1,
+      shadow: null,
+      visible: true,
+      backgroundColor: '',
+      fillRule: 'nonzero',
+      paintFirst: 'fill',
+      globalCompositeOperation: 'source-over',
+      skewX: 0,
+      skewY: 0,
+      rx: 0,
+      ry: 0,
+      id: 'workspace',
+      selectable: false,
+      hasControls: false,
+    },
+    {
+      type: 'image',
+      version: '5.3.0',
+      originX: 'left',
+      originY: 'top',
+      left: 0.7463,
+      top: 0,
+      width: 1200,
+      height: 900,
+      fill: 'rgb(0,0,0)',
+      stroke: null,
+      strokeWidth: 0,
+      strokeDashArray: null,
+      strokeLineCap: 'butt',
+      strokeDashOffset: 0,
+      strokeLineJoin: 'miter',
+      strokeUniform: false,
+      strokeMiterLimit: 4,
+      scaleX: 1,
+      scaleY: 1,
+      angle: 0,
+      flipX: false,
+      flipY: false,
+      opacity: 1,
+      shadow: null,
+      visible: true,
+      backgroundColor: '',
+      fillRule: 'nonzero',
+      paintFirst: 'fill',
+      globalCompositeOperation: 'source-over',
+      skewX: 0,
+      skewY: 0,
+      cropX: 0,
+      cropY: 0,
+      selectable: false,
+      hasControls: true,
+      src: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAAOECAIAAAA+D1+tAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFyGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuMTY0NzUzLCAyMDIxLzAyLzE1LTExOjUyOjEzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMy0xMS0yOVQxNjowNjozNSswODowMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpjMWE2ZTE4MC1iMTc1LTQ2NGMtYjBlZS0zYjgxYTcwNjY4MTMiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo4YjQzZmIyYy1hYmVmLWYzNGItODVlZC1k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oizn60n1OZ3O5cuXnzp16vXXX588efKcOXO459vFixc3btw4YMCAFStWiJuo6jcYDIFAID8//4EHHvjwww937drF/YR5AyI5hwDEL2FGQyIJciYS7EmBUwAQgSAEIFbwer293QTQ59Bm3lOE+EBygCwoKHjsscco08zBgwdTU1PHjRv3y1/+kuYzIBFCsz+rPCr5LsS99HovROW6yTUhdRnpwNesWZOamjphwgQWQmUxjcsor5ObQ81m82233fbpp5+uWbNm2bJlUogEqqSZRddTlSyUZXnw4MFf+9rXPvroo9dee+2uu+5ijH322WelpaXz5s2jCSq41BQFOVVFNV+6dGnv3r3Hjh1TqUEA+ji9/kYCIBaAIASgRwnjNka2mg6NQeJLBjoJH4ZQ2s6Mp7SGApIgYYzl5+e/9NJL//Vf/zV58uTnn39eVIMqX1Mm3Jm9622ldfJkgsuooplej+x47777bmNj47333muxWPh50K1K6zIq2kgVRbFYLHPmzFm/fv2mTZtuuukmHk+oKizWo42cpGLp6ekrV67cvn37n//855aWlmHDht1///1ms5m1ika+U1XWGc6FCxfghgCA1DqVC/2bYHY/AKIDMYQA9DRSW/j6TsYQdmkbQfwR3c0Qam4uMaCOMeb1er/88suZM2du3Ljx8ccfv3btWlVVFWuNjuMSS3tXM01mzp5Ed7/iSuoaKkIKlnfffbe2tnbZsmUOh4Np3EpF6FRrH1uVX6jVal2+fPm1a9fee+891nrGdKvS3QVrmw9j0KBBFRUVhw4d6tevH6lBJgRqai2E4pGaTCaLxSLWDAAAADBYCAHoMXTDqMS+KZ9zrPP1AxAhuiYjlUYqLS194403JkyYsHTpUirwxRdf/Pa3vx06dOjXv/51KkOztGtj5KgqlVmsOw9IH1WTxMkDg8Egzf/OGHvzzTcbGhpuv/12mp6B6+FQIYhhhJwozCRJuv3221evXr1u3brFixdrNaHf7xclHP8rXgWXy/XKK6/4fL7/+3//L2Ns8+bN/9//9//dddddhYWFBoOBTjI57jK9uToURamtreX+on6/n2y8AAAAAAQhAD1Hu9nMeqwlABBcGol2MC5CmpqatmzZUldXt2rVqmHDhjHGAoGAwWCYOHFifn7+tm3bnnrqqRkzZkycONFoNIoKRAylUykT0SW1d+95ahup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hg0bfvnLX65Zs2bJkiUOh2NwcPDRRx8dGRn56Ec/2traWlNTQ8dTVCFtT58+/brrrtu7d++GDRtuv/32j370o01NTYyxoaGhJ554gjF29tlnt7a2kgkxHo97PB6v1zsyMmJy1BgMBumZkdpuOz5pkPrOjBua35HX66UfAj9mfCsFwJgjWQjVUzMAAJA7EITAKoj6AaSFRglchPj9/oULF86YMWPDhg133HGH0+mMx+Nut/uUU05ZsWIFncL1CR83UxBgRUXFeeedd9JJJ/3jH//46U9/Wl5eHo/Hg8Hg+vXrly1bxs+ljfLyctr42c9+VldXd+zYsRkzZkydOnX//v3t7e2BQCAUCtHBXq+XxGF2flMm3YZ9Ph+XBHQ3jh07ZrfbSVY5HA7RfGfgNaoZOMeO14SMsWPHju3bt2/KlClTpkxJJBLPPfecx+NpbW3lmlAsn4QoN5mmUqnS0tIFCxYsWLDghRdeePbZZx955JFAIBCNRltaWq655prS0lLxdClPaUlJyZIlS+bPn79jx44nnngiEokkEomKiooVK1a0traSjGdC8K3P50srCPk3ReugMJVPJtP5SRYkcFQzc09JSQk/YJyrBMA4oGchBACAPAJBCKyC9KozyAkB2PGrn1PGRbvdHggEzj777AcffPC3v/0tY+yRRx7hapAyzTidTjqeTE82m40vdldXV3fNNddceeWV999/f1lZ2d///neuBhOJBPfD7OnpoZ1z5swJBAK1tbW9vb2vvvrqokWLli1bduDAgbKyMrqc2+2WrIVZN5M3QdygYh0OR01NzZNPPqk+/sknn7zgggsM3Aj1ssjwnep/V65cmUgk7rzzzquuumrlypXxePypp54677zz5syZw6UvvyJfFZOgFR1I461du3ZoaOhjH/sYY+zyyy//7ne/y4+hHDNs9LbTfnKFpdykixcv3rx583XXXccY+/73v3/iiSfyc8VGkSeqsRclHexyufhqhJIMVps9C4WeLrVC3QAYOzR9v/HYAwDyCwQhAEVJKBRio0kvuVT717/+1d3d/b3vfe/OO+9kjL388ss/+MEPli9fvnbtWqfTSYfFYrFYLMYFIemTzs7OBx98MBqN3njjjX/961+Hhob+/ve///jHP161atWaNWtIn5BI2LRp07nnnnvttddefvnl3d3dZWVlV1555SOPPPLd73730ksvLdz9OI7t27cvXLhw/fr1Ka0lCtUYjK64IiK9Z7fbTz/99P7+/r/+9a8f//jHV69e7ff7n3zyyYsuumjWrFl2uz2RSHCTIP07ODhIJfD9L7/88ksvvbRkyRKqz/vvv3/zzTfPnTv3rLPOqqqqomNSqVQ8HqdvmTFG5rtIJPLUU08NDAwsW7aMzt2zZ8/f//53xti6desotwpPZWFehLvdbjISSjdENMqlrJFllB3/ZVGgLG0XvGIA5Bd61MVUSXjIQR7BtAIQgSAEoMigTpzUBWm83t7eTZs2dXZ2BgKBM888s7GxkY487bTTGGP79u2744475syZs2rVqrKystLS0mnTppEdjzF26NChDRs27Nu3r7m5+ZRTTpk7dy5jrKys7KKLLnr77bffeeedjRs3nnbaacuWLSPpGAqFpk2bdt5557HRpKbf/OY3H3nkkcsuu+xnP/vZI488Qh6nZtJ7mHwb8cNI54jrCtAlkslkIBBYtGjR0NDQ0aNHA4EAhdVpXijTVyCPPKRFJkgTnn/++U8++eQDDzzwiU984qSTTnK5XI8++ujll18+depUWgqSziVzX2NjI110aGjorbfeamtri0QiH/rQh1atWkWHLV68mDG2a9eue++9t6mp6YwzzqipqbHZbLNmzeKJXo4dO7Z169adO3f6/f4lS5YsXbqU9s+ePTuVSu3atev555+vq6tbvHhxIBCgOpM+NHmHQ6GQtDqFpoleUxOO56hCfWnxeUBSGTDxsFruXADAhASCEFgFxBBmBAlCj8czNDT0yiuvRCKRNWvWUDrKZDJJksztdp955plnnHHG008//c477/j9/tNPP91ms1VXV9MwOhQKPfnkk8PDw2vXrj355JMZY6lUitbHq6qqWrdu3amnnvrwww+/8sorNptt+fLljLGamprDhw8PDw+XlpZGIhGv17tixYra2lrKVipm+BhnuNcoUV9ff/fddzOd2DMzj5k6hpDkByXXueiii5544om77rrrC1/4wqJFi0Kh0D333PPpT3+6ublZPGvatGnV1dW0/e677z7//POnnHLK+eefT9lfYrFYMpn0eDyLFy9evHjxhg0b/vnPfzqdzrVr15aUlPh8Pu5x+sorr3R2di5btuz000+nPaTfXC7XnDlz5syZs3fv3s2bNyeTyZUrV1J6GBKEZjRSZWVlVVUVN05q3gHJTmiR36nT6VRXG4CJhCQIkVQGADAWQBACUGSQluvo6BgaGtq1a9eWLVvWrl1LUpCw2+20GgFhs9kuuOCCCy644KWXXvre9743depUWs7+0KFDR48eXbRo0Zo1a8SDxXPLyso+/elPK4ry85///MUXX2xubn722WcXLlxImTwcDgd5SPJV1K0G3SsxkM/kQEqanhDDAml85nA4PvKRjzz66KO/+93v/u3f/m3lypVbtmx55ZVXrrrqKvIUZYxVVVUlEol77713ZGRkeHi4ubn51ltvFa8iemkyxlauXLly5cpt27b95Cc/mTlzZkdHx+uvv07mu7q6ussuu8zg3NbW1tbW1oMHD77yyivNzc1z586NRCLMnI9ZTU3N1KlTKQltSlhjw6S1rYBGOY/HU1dXV6irAzAORKNRvm2c6gkAALIGDjbAilDiE6fTSUkjLPKUjvM7WH052uN2u8kQV1ZW9rGPfaylpWXBggW1tbXJZLK/vz8YDJIVi5aCcLlcfr+/tLR0eHi4vb1948aNDzzwAJVWXV19zTXX1NbWLly4MBaLDQwMDA4OkuGR7rndbq+urg4EAgMDA5s3b3755Zfff/99OvfQoUNTp06lq5hMBzr+2EZhWksLpj1XM3zONrqEPS/5ySef7Ovru/DCCysqKv7xj38cOXLk05/+NEnQtrY2WtqRMXbeeeedcsopU6dOLSsrC4VCg4ODkUiEr4dhs9lKSkoqKyvtdvuBAwdeeeUVbvB0Op3XXHPN1KlTFy5cSElc+/v77Xa7w+Gw2+1Op5O+4srKSsZYd3f3wYMHd+zY8cILL+zduzdtYx0Oh6Iop59++qJFi/7v//5Pnf6HV08U0tKe8fx5ill2XC7Xd77znR/96EewloAJCcUt/+AHP7jhhht49mAAABgLYCEE1sLKY7tx1qV6l+NumdXV1XPnzvX5fNu3b9++ffvIyAitsuDxeBRFGRkZIek4NDTkcDiqqqrmzp17wgknTJkypaOjgzG2fPnyqqqqXbt2Pfnkk+FwmDKL8EvbbLZYLEaFtLS0zJkzZ+3atVwQ0tCEpx615kiFizdxDzP3PfLQQVEKchVEGpiWhTjvvPOefPLJhx9++Nprrz333HOfeOKJRx999Nxzzw0EAjNnzqTSWlpazjjjDMbYq6++OjQ0FIlE/H4/zzHDGCMNH41G6+rqWlpazjrrrIaGhtdee83pdJ544olLliwJh8NPPfXUyMiI1+v1eDxut5umS0gQstEFGFpbW0888cSGhga73W5GEJKSf+2113bv3n3KKaewTDy3C2usoIuSA+3nPvc5Nipu055FQtqaTywATMid6/F4+vv7//nPf95www30kZj+lx9vkQlTUHRYdqwFCoJVbC8ASKFKNNo2YyGkA1pbW/fs2WP+crRqHP9rUHgikfB4PHv37v3Od77zxS9+cfXq1T09PZRiRLNYzXIMBqDcSY/+pcUGEokE3QRFURRFSSQSyijBYNDv90+fPr2+vr6/v//gwYOUIpLMqtx+xVevIsdORVEikYjT6ayvr58yZUokEunp6Wlvb08kEjwKi9eBZ9S02Wy0RsXIyEhDQ0NjY2NXV5fL5ZoyZYrH4ymisM+0iUb10Iyjo4/o6yAP26eeeqqjo+Paa691OBz33Xef3++/5JJLGGOdnZ3l5eU+n6+9vT0YDJKWo4UlpEeF6kZRhalUqra2lnw4+/v7BwYGUqmU2+2mpJq8AmQn5JlmuWWYrIXXX3/9r3/9a6fTKa5jJsGXyrj11lu/+MUvBgIB+kWoDYCSjTSje5hfqCbcYPL666/v3Lnzs5/9rHFLAShSPv/5z//mN7/hy5yOv1keTFSK4t0Nxg0IQmBFMhKENKi96KKLHn300TH1q3nhhRfWrl07RoUXF6K+KrqXilR5zUl36Uj1tmh+pEfu0UcfHRwcvPzyy30+3z333ONwOK6++urxa5UA/QoOHTo0ffp0t9stpQ8VIavaSSed9O6779Ie9T1JKwjHRyKqa8KOt1KanDn66U9/+rWvfa2zszMej1N0Fk24JJPJWCymKAppcppDSWqhV76x47S6X7Kmo7X1Md/Dj9EdTlsB8QDaFmvCsyXTDI747EWj0Xg8TssCxWKxI0eOLF68+Prrr6fZN/EnUMBMvwCACQkEIbAW/LXHBSE3YuhBg1qyEIZCoVAoJA4Z+V/JGMi3ucFBr3xFUUpLS3t6ev7xj39cf/31ZIUruMtZFiMAzRFz1qN5Kb5uAmNgXZRUyuOPPz4yMnLJJZd4vd5Dhw498cQTmzdvnjZt2syZM4PBYDgcjkQiekY2fj/5CDKRSJBJkFxD6QDu8UgLS9JS9Ywxl8vlcrnq6+t7e3vnz5/f0tJy5MiR5uZmY0FIVrW1a9c+//zzoVDI5/NJ7WJaX7RFvnQS5KFQqKSkxKSPqzpIEgDrw5NjGfwqGcyGIEOs0I0D64AYQmAtstM5jLGhoSHGGGVWZKODxdToOnV8LEj+eOK40NhflHwmo9GooigdHR2xWIxc/izSk2Y0AtC0jGU9hpBMNOqhyZjeouzKz+4szYl5/kRx/16Xy/WRj3zkqaee+stf/nLttdc2NTVdf/31jDGn07ly5crXXntt9erVtbW1XV1dbrdbXQ3K18pNjqT36HHlpnKXy0Vq0OVyOZ1Op9PpcDgontDv91N22TfffPO88877yle+0t/fb7KB27dvZ6MLmRhjqREn3ROebdWkhZAx1tfXRxoSg2lgZegRFScfuQ5MqVI6Sc8zAABkBAQhKHroLXjqqacyxioqKsbIdtfQ0LBkyZLxMQzqjU1FLaf2eBQP4+VIXp2SsNEzBKndk9J6h0ofjfXQJLvyc6yVnnMp2ajp/qxfv/6ll1566KGHtm/f/pGPfGTp0qXf//73t27d+rvf/e6Xv/wlY4yWMcylGsY8+uij5AlZWlpq8hQ6Uh2hJDZTdM60iJ2NqsR/kuZt3X6/n+yuY1g5AHJG3Tkzw57WCr9KUESgDwQiEITAKmi+7TT3aB4wMjLCGItEItztzfxF00KTr8FgkBbDkM7Ne68qFSgqMc2PxFZIToyahUjX0tR7vEzJ8zaHZhUrmiMwSS2TxqPts846a/fu3VVVVatXr6aUM83NzYsXL6bT86IGpW+cCd9vY2MjBQTmEkBloPos9QyIlTFfMQyDQLGg2b1DBAIA8g4EIbAKOZqYdu3axRijxJi0x4x/oJmrcL00PDysHoiPA2ZaoSenpZ2SeEgJ6+npXUvTFGl8RTV5GbXk8YanrY/YXs15eqk022gkKsW+zpkzZ/r06fv379+/fz8dz1dE4NkC84Xo/EwOpWlXX5BQzx1In1p20JnRnVTPqmTdLkhKkCnmJx/TTnNIU4SW/XkCAIoICEJgLfirjr/wqqqqwuEwBVPxJKJkvqAEG16vt6enR4yYUg/lM0JztJdKpWhBCM2PsrhK7qj9iNQizTjST73TwOypVuzFa5MxUx+DaXh127m0poSBbrfb4/H09vZ2dHQMDg4ODAz09fXxc42vrnmttBXmxwSDwfw6Nk+84WbuT+PEuyfAIkhRynrb6hhCAADIBQhCYC3UY7Xu7m7jU4LBIGOMlufmC6abvJyxU5xUDmWiNzhxPDE20KlHEnrxYJo7RXdBUcBoGsdya4fV0VPXepqQexRTrGBJSQktJU++o3pINljNwpkgDg2iiSgDDTOXJIYoeMrcjBgjk4immVT69q02rwGKEYMHSfyZmzwXzyQAIC9AEAKLQu+5q6666pxzzjn33HNffvnlm2666Ywzzrjxxhsjkcjvfve77du3X3XVVSeddNLBgwcfeuihdevWMWFoa9InMK2tRjwgHo/n2qr8Yaz02PG6zowPkt4BE17yGaP3kKhvi1rR2UYTkJJx2/j07OrGLyfupP1jukp7oYahBhZs82hOiOgdY7AHgCww/9RxG6BoD8TEBABgLIAgBNYlHA5fddVV5513HmPsiiuuOOuss+rq6uijm266iR/W0tLyoQ99iFLn00pNZNQyjvdTKyVNRO/TeDwuLmNYWKWUtv4GXo4GzpDAAMlHy/gZkBSg8SgwrbYXjzdppx3TUWPBH5tchsW5xxACMNaY9AHBMwyyBjMLQASCEFiXaDS6ffv2devWUe7Qxx9//IwzzmhtbU2lUh988MHRo0eXLl0aCARcLtfmzZuPHTu2YMECzaFe2vG0hN5An7L56xUyDuPvHC+heXp2UZGT5EWiNpzqedtqRvWIp6tzfur5KJoJImKG3xGCi0wySR5jUKRkNE/E8JMHAOQABCGwLk6nk1Iy0koS4grULpcrHo97PB7aKUb38WP0is1uFJhKpWituVwKyZqJfTnLIsk/aXxmJsyMHuC0alCzfL3DND8Sn8xcFpxQl2xB9KY2TA6I1bfO+k0GkxCDR9r87B4AAJgBghBYBbXWSqVSsViMHxCNRnkUn6IolOKf/lULQpazVU1tbBQvYYVBZO7qtFD6tnjRzLXD9G8gz0AzbneY/yhylIWTBzz8wILkxSsEAABMAkEIrIKmA4w4P0oiUNzmn4rikJ8rbaS9nOanYjmihZBZQE3lft20ASpAT/WZf67oydR8PnN0+jKelcBQMi14zoGVMfgJ49EFuYN3BBCBIASWRjTKiWYWSvHCPyK1Jp5opqfT9ACUShATfhTQZXSc0QxCm9hNzpRxi+fUIzW6/oTaAZLyi2LIKIHEoWDCgEcXAJBfIAiBdZFknuQyyo535lS7jKbFIEBLrzI8t+dkeB9PhjaOHRTLl1+XUfWDp2mQpDU5Jyq5//rwYAMAAAAiEITAuthsNnEtNdHpTnLgTCaTkiCUsozmxVrCx/d6Fxp/xkhmADVZ2Ev5Y5lIJPKyKqCZqEW+5uFEtRCacdxNi/jM4/kHAAAwyYEgBNZCGqiJ2fzFoEHGmCgIpWhDEW6iybQa6j1ipOJYCM4syNd1Re/ZiSok8oumryZTaTa73e50Op1OJ2XKZWN5e6lKtBRnRifqxd9anNxVnGZIMAAATAYwEQZEIAiBtRB7qEQiIQpCMamMZCHMzmU0UzQd9iZkLjgD61MB1a/VML4PqVTK4XC4XC632+10Orm3sxQKqxfCmjV+v582HA5HdiVY/GHO/Uapn+EJ+SsGAAAATAJBCKyLw+FIJBKSwZC2yVoo6kMDj74sXMLUbmncXMkPmHiDSLXBRL0+3sRrdaaYvwMulyscDjPGPB6P0/n/d7Z6bp/5uqXxeJyKytpJddIK/knbcADAJGQyv8eBGghCYF246iNbBxkM6SPRcsi0BKE4as99mT5NJmRnamY1jkk+bjaOYeOfut3uRCLxxBNPlJSUDAwMPPXUU2eccUZNTc3+/fu9Xq/49OoZXWm/3W5no3ZFgn4ODofDbrfb7Xb61+v1Op3OWCz2xhtvVFZWsuMz9GbdQAAAAABMeCAIgXUR8zSy41UfbYtrcGsuw51H6UKVUZc8AUbPmstvSPZAfvMnQHvzi8ENURTlzTffTCQSDofjhRdeeOyxx6qrqzs6OjweD91Mg7XjKRSQ1KDdbicdSH8Jl8tFAYoul8tmswUCAbfbHQ6Ht2/ffuaZZ7JJr9vNgAkOAAAAgEEQAisjZfWUFKAZG8s4MElGk3phV4AdPzvAt8lj83/+538++9nP9vX1nX766V/72tcYY8lk0m63mzffcdEiLoxpYPquqanZunUrYyzrxSeK5ZvNb1IZAAAAYNICQQisCxnlaADN9/BPRaugnoUwv0hpTicqkgJhWlFzk+E+pMV4SUBFUWw2W0tLC2OsoqJi6tSptJ8e5qwzvqgvxKGvrKqqKsffwuQxAk+elgIAAAAGQBACSyMaCaVVH6RsjdKJalWTNcYLWkxOJlvb9SSxnnstG02JtH///p6enr6+vi1btlx22WVMZzXLfFXSZrN1d3eLOyfbNwUAAACATIEgBNbF2AJjvHiapBjHum4TCb18PJM5htBkq9WHeb3eQCAQi8VKSkr4MWNxD8WAQ9oYB5s5AAAAACYAEITAukgumhl5bE5O3ZJ3JrMINIOUlUR6PikxTHIUMwXmbtOeSOmOAAAAADAOQBACq6MpAml4LcYQZlqCMZN5MI21B/OCKMzMu4lqBnAanGvw1SDOEwAAAABmgCAERYPaR1TMMiqNiXMcDZuXQBNj2G2QP0YEylDCIIYwo0LEs9LeXuMj+U6nE907AAAAANKDEQOwCjmKDbWRMHfXO4ORveZKA8WIuMYgE5oj3j1pW1Q+xd588+S3pZJ6FEvW26NXiN4BtO5F1nWzPnnMF4U5DgAAAJMZCEJgFdRjMmkt+EwHbXkZ1+rJAM3a5n658UdThxsnVpWWfyzShmeK1FK1bZBlIhrFe5hLldQX1ZT0k4Hc7yQAAEweJts7AhgDQQiKCa4P1XFZ0pBurHs6yWFVXYFiIQtlq277ZEDd0hx1V472VYM1V4z3my95UjE5Ww0AAAAwCEJQpFghpT4f0Be126TeEo4GYOgsoelSm9FZentMllC8j19hMZhRAgCAiQ1e5UAEghCAbJBMZJO2Y53Aw2jj75SbhXM0TeflySnqKQmLMGl/wgAAAAAEIZiY5O7OZ/6AyTyUnJxtN46xHM9qaLor52g/n7RxoQAAAMDkBIIQTExyHOel9SXDOHJSYTBBkN2TkJeHSsruk0U1jIud8EyelgIAAAAGQBACAEB6NFeKl1xG9QSG3W7X8yw1vwa9Ghi4AAAAAJA7EISgaJDSikpgZAzGAmk9QGPxpt6pt5ql5NIsOX+af5jHIqdRsYQj5nEdQgAAmGxg1AREIAjBRMAKSUfBREV6a0o5RQ1OtNvtaY9Rl2ZepcBlNEcmT0sBAAAAAyAIwcREXCs8xxLGqPyJhHnfRcvaZNSWPSmO1GazccFG23pr04tnMa0mqy2NYsmaFdBE72aSEM0ay35HErAQAgBA1mD0AkQgCMFEQD0CznGFMT5G1zt9kvSk5m+dsULOe1KWvKMOBTSos6gJuXLTXFfQbrdTAKGmSDNzW4y/gkyNimawyDcyDkyelgIAAAAGQBCCCYI0Jhb1SR7zQGp+OoGHlZk2TS9kLrvSCoumM6dxMhjpqUgkEgbli+F/op1QXY5BCQZ3W1EUg6sbVyy7E8cZWAgBACBriuuNDMYaCEIwMcm9p4OFkEg7aNYLscslf+b4o2lS1nQKZULMnrg8vej5KZasuXh9WrufVAcAAAAAgDECghAAYEQWwYEG1rNMHUoLgpishTa4NU90ENU0SounOBwOxpjD4XC5XAaXELWf+tImUd9DunoWmPRWLSD5mlywfksBAACAcQCCEACQHjORbGmzcWraytQnFhYxE4woZSVNqNkQCTpMUZR4PK6+BD/AWCTr3Zw8Oi3rfbmW+l7Ggkni+A0AAAAYA0EIgDbGK7xNYJOC3sjYjDIxjrKT9I9eEk4roKdm1TlF1S0iFEVRFMVutzscjrRpP9Wy0Iw+yZe5dTJrocncdgAAAICAIAQTmRzFhoEmnMDOZprBcuJHahdQyZzFZZLkYGmchYWN4+jcwCaml6lF/Ei8LWI8oWhCdLvdDocjEolEIhFJ72ne1UwxuFeZ3sZJu4wn1CAAAADAIAjBRCVfOi2thXACjynVbVTbzdjxBjSmUoNqLST9zV0a5R0pwYwU76f+xsVkobwJdru9vr7+wIEDjDFFUYwlaF6qzetG2U0n/JOZlyyjE/guAQAAACaBIARFA63nZvLgPI7zDC6ax9G81eA5MwlNgxg7fmiuFk7iX368ZF4bvyalQzO3p3HyGOl43sxgMPjMM8/s3Lnz9NNPLy8v7+vr8/l8Usma27m70TqdzkwXnNBsoJUZn183AABMYCz1/gUFB4IQTExylxzqkaLdbpdKy5elwvpo2gaZqu16tkEDmyGzjK6WxK06UFBdSbW4HRkZ2bNnTzgc/sc//vHaa6+dccYZjLFAIOB2u8Wz8lJVzcq73W6v15tj+VZ+pEVbdI5FWbmZAAAAwLgBQQgmJnkcLBrHEE4G1IFzTEcmaeZikWyDaU8cNwxS4DBV0CA/S7QN0l8+U/DOO+/cddddsVjsxz/+8U033XTdddc9+eSTq1ev9vv9fX19dHraBDNm0HRbpY2hoSG/388Yi8ViWZdvBX0+DkySZgIAgJpJNYwBaYEgBACkQTOGkAnGNKZlt5GkoGamGVaIGEJ1ThdNWag+UjyMS0HGWCwWe+CBB956663W1tb/9//+X1NTE2Ps/fff/+c///nYY4/deuutdNYNN9xQX19/9OhRMxZRuhZlKLXZbLSooMvlcjqdTqfT7Xa7XC766/F4vF6vz+cLBAKhUOjFF1/87//+b8aYx+PJy/0BAAAAwMQGghBMTHJ0Kks7IJ4kI2a1mdQ4hlDTnqaZb0YqX/PfMcXg0gZKlStGkoLRaPT111//4IMPysrKrr766pkzZ1ZUVPT19b311luMsQcffPDhhx/u7+9vampKJBKDg4N9fX12u11tJBTzfPJPuYp2Op2kCe12u9PppL8kCB0Oh8fjoX8DgUBVVdUnPvEJ8lPNxUI4SWaOjb0AAAAAgEkCBCGYIORXWqgzoKRSKXEcP0lGzByTMYRMa1lC9fHGZ401kj1Qcm1lKjuhiPgYxOPxhx9++O233161atXll19OO//yl7889dRTM2bM+OxnP9vS0nLOOeeMbWP0iUaj2Z2oZxTNQ51yQHNuIscyC94oAAAAwApAEAKgy2RTfZqIdj9N26BxKKDaNijZCfUk4nii1hiSJkylUslk0uFwkOvm/v37f/e73+3Zs+fiiy/+3//9X8ZYLBa7++6733vvvfPOO+9Pf/oTHZZMJhOJRO4NNBComk2IRqOBQIAWn8gCzWtZ57eQx5pIX3G+igUAAACKCwhCUJSone6kPWM9vCt4QpSxRp0/hmViJzR5bmFvnaYdWBIJiqKQkydpvJdffvnNN9+MRCIXX3zxKaecwhjr6OjYtGnTvn37qqqqvvrVr86ePZuOpKJcLteYhuRp3kBadmJCPpZjB24XAACASQsEIShKyHNPjOySxtxm3P+My5f22EYxc3C+sFR6j1xqYpA5ZvwbaOAOyg9IjeJ0OhljsVjs6NGj77zzzqFDh2bPnn3iiSfOnTuXMdbZ2fnAAw90dnauWbPm3HPPdblcbPRpFJ8WiA0AAAAAWBYIQlCUqJWS3pg7l7G4OrmIZrFjJ2kKqAaziMnU097G5xZQLKkrzL/xZDLJs78kEom77rrrjTfemDVr1pe//OXKykrG2JtvvvnTn/60qanpE5/4xIoVK+j0ZDIpppwxWHIjl0pq7hT35PeWWmdKgkFaAwAAAGMABCEoSrKz+5nHQAqqK5DFKH9CYibOzYJ3SUyRmkwmU6kUjxUcGhq67777Nm7cuG7duj/96U90/LPPPvvuu+/W19ffdtttLS0ttFNRFLUeS2uKVB9jnM/GoBB1apyskSIqrfaVjUVSGau1EQAAABhPIAgB0EWShVKW0XFwfUyrS62AZiX1nF1NHjamaGowcV1BxtjevXvfeeed/fv3z549+8Ybb2xubmaMbd++fdOmTYcPH16yZMmpp55aVVXFjl+AUZ1uR600zNhL9cx9Bjlv8ijeLJ5qZSySyliwmQAAMKZgIgyIQBCCYkKdS0ZCU6eNUa+np9ZyvJwFx6ZmrE960k4ac6vFRqa3ayy+ULEm4XD4vffee/XVVxVFWb58+XnnnccYGxoa+sMf/rBt27b58+d//vOfJ69R0b5kHDGYo1pTr+QhbY+Fj6g1zYNEdk+OXjkAAADAJAeCEBQNBqM3g1wvYz2izXv5NtXq7dJOm87C7sbehmqzmLryGWkt47yjmv/mZfw9FgYivvHCCy/cfffdJSUlX/7yl+fPn88YC4VCd9xxx86dO88999yvfvWrdBgPMuSn8ySlUuFq/WZmBiHtrVOXORa3xbLkq4bWbykAAAAwDkAQgolAIpGIxWJsdERukNMyC/iYOx6PJ5NJzavkHekS4r/ZZew048BpXEIWx6ctoYAmGuk2BoPB2267zeVy/fGPf6RkoR988MHzzz/f29u7aNGiT3/60+Qgqrmig+bzIH136m1pp4E4MdB7mgZYGL4AAAAAYB4IQjARcLvdFOVFjMXEv8fjmTp1KvkKjjNj0Zy8mE+zKCQvaTxyr7wkn2w2W2lpqdPpnDdvHqnBXbt2bdu2rb6+fuXKlTyJaCqVstvtUqBg1nXglxb1ZFpZqA5T1Cswl1oZ16SwjEVSGQAAmGxYtpMHBQGCEEwEvF7vwMAAG5sOTnQspG1KQVnUnWnes49Y/LoGJfDtz3/+8+++++5TTz21adOmQCBw5ZVXNjQ0pD0r92qYNOupQwfJc5WeRiKRSKSNszWJxcVSUf/6AAAAAEsBQQgmAkNDQ7fddpvf7y8pKRkYGHC73bSfrwvH/zUuhw+m+WjY4XCEw+Hm5uaDBw/+/Oc/b25uPumkkzo6OioqKkpKSkpKShhjiqLQcgV0is1mczgcdrs9kUgkk0la2ZyP4GknMxFTR+XQcD8YDA4PD/f393s8ntLSUp/PpyjK0NBQNBrlNisikUgw/ew75Pjq8/kqKioURYlEIiMjI2T40jyeqip9SjUvKytzu93xeDwcDkejUdrpdrv5PefWKrvdTuX4fL5AIJBMJiORSDAYdLlcttFV++LxOG3w1f8YY/F43OVy8YC9VCrlcDjKysq8Xm84HB4eHk4kEg6HI5VKOZ3ORCLBb6mk3MQbToVXVVXF4/HBwcFwOGy3251OZ0lJyeHDh++4445XX331m9/85po1aw4cOHDgwIHh4WGbzRYKhTweD50eCoUqKirKysoYY0NDQ5FIRMwokxabzRYOh+l7tNvtiqI0NTW1tLSIz4Oea65oTiTo8Thy5Eg4HG5tbXU6nclkMu1zPgEYu2RRAAAAwGQDghBMEDo7O3t6elwuV1dXl9frJRVBQ0ZpfKwebZPYkPbw7Wg0Wl1d3dvbOzQ0dPDgwQULFjgcjmg0um3btvb2drvdXl5e7na76Vput3t4eDgWi4XDYbfbTTUhRkZG/H4/SRqKeBRRj25TqVQ4HO7v7w8EAiUlJdOnT6+oqLDZbI899tjmzZvXrl07bdo0xlgkEjEoh8bNdCtIz5SUlOzbt++99947ePDgOeecc8IJJ/T29pofXlMhfr//6NGjv/nNb1atWrV+/fr+/n5+AEXZMWFxdpI9U6ZM2blz5+OPPz579uzFixeXlpYyxsLhMKkpLvwURaHK2O12l8sVj8dJ8qVSKa/XqyjK22+//dxzzy1evPiCCy7o7+8nHSgqJS7F6bp0Ot0Er9fLGGtvb9+wYUNjY+MFF1wQDAYjkYjH46H7/OlPf3r9+vWLFi1yu92Dg4M9PT2xWMzhcIg3R1GUkpKSP/3pT1u3bv23f/s3l8sVDAbpKurbpam0k8lkfX39e++99/TTT0+ZMqW0tPSaa6456aSTUjpZQ1OqVSj4LWKMXXbZZQ899NCKFSumT5/+wAMPqB/mTJk8QmvytBQAAAAwAIIQWBcDy5WE1+u9/PLLL774YpfLNX/+fLIQch2oHvZJEpHG0FLGTv5RLBarrq5uaWlZu3btRz7ykRUrVvT29v7zn/88evRoWVlZY2NjIpEIBoOKotjt9kgk4na76+rqkslkd3d3JBJxuVykx6ZNm+Z2u0OhUDgcFt386NKigYvT0NBQWVkZi8Xa29tra2vPOuusioqKY8eOvf3226effvoJJ5zgcDgikYhYmuZtpPLJkub3+48dO9bf3x+LxdauXbto0aKenh7Nu6RXmt1u93g8iqL87ne/mz179oc//OGjR4+KVjKxIfQNJhKJ+vr6bdu2/fOf/5w/f/6ZZ55ZX18fjUYpYM82uii80+n0+XyMsVgsRneSbKpk+HK73YqiHD58uLu7+6yzzjrrrLNCoZB4OdpwOBzxeNzr9dJZ0WiUxGEikXC5XHa7ff/+/du2bWtpaTnnnHN6e3vpi1MUxe12U4zo8PBwX1/f1KlTXS4Xv7e8Rclksq6u7t13392+ffv69evpEsYPqviAUYsaGhqqq6vffvvtk08++ZVXXtm1axcJQuM7z28v/7tjx46HHnroiiuuuP766//93//9e9/73ve+971AIGD+CwXM8v6xAACQd/COACIQhMAqpE1loXZcFBXIqlWryIGzsbFxLKrX1NS0atUqyi8yMjLy1ltvLVy4cP369dFo9NChQ0eOHInH47FYLJVKlZSUzJ8/v7KyMhKJ9PX1hUIhp9NJToZDQ0P79u3r6Ojw+Xzk26kXluZ0OmOx2Jw5c+bMmRMKhd588819+/bt2rVrxYoV69atGxgYOPXUU+nI8vLyTNsyY8aM9evXL1myZOnSpYyx+vr67O7JJz/5ybPPPtt8CQsXLrz00kuXLVvW0tLCGCPtp4nb7eZ+vyIul6u1tfXaa6+dPn06Y8zv92ue7vF4aMNut6uvMnfu3CuvvJK0X3V1tfr00tJSMmAacP7551dVVZHjaHYsXbr04x//+CmnnOL3+2tra8WP9PSJ9OuIRCIXXHDBPffc88lPfpIxtn379vr6+unTp3/mM58xKCQt4om5p6jJLzadNVeyQ2ppjqUBAAAARQoEIbAKuQzIksnk8PAwGzX95XdsRzaxVCpFl2CMvfjiix/5yEdWr17NGHvrrbfuvPPOqqqqpUuXjoyMJJPJDRs2bNiw4eqrr160aBHpFqKzs/PRRx89cOBAU1NTU1NTLBbT82glc9Y777zz2muvXXvttatWrZo6deru3bvvvffeFStWJBKJ3t7ekZERisfLNMkntWVkZKS3tzccDlM4YkaZSGgYbbfbu7q6gsEgY4xi+QxOodwnsVhscHCQ0v8QO3bsOHr0qMfjsdls5eXlzz///Fe+8hXG2C9/+cuLL76YzHe8BFLRvb29f/nLX04++eTzzz+/t7eXp1Hh5kG73R6NRu+4444//vGPJ5100g033DB//vze3l6KFaytrZ0+fXoymQyHw4yxTNvOGItGo16vl0I6qYSMYgj53YhGo93d3QMDA+QWm/Ysde6ZVCp15MiRP//5zyQII5HIsWPHcp8QkdpiNaWUx/pYrWkAAABAQYAgBFZHc7xOO7mUovwo7HhvukwRU3qoDXexWGxkZIQxFgwG+/v7ly1bxhj74IMP9u3b9/GPf7y1tbW6ujoWi9nt9nPOOeeDDz7417/+NTw8fNppp1Eh27Zte/zxx+fNm3fBBRdUVVW53W7yEdWsCQmMtWvX9vb2Hj58+L777rvqqqtmzpzZ29vLGEskEuFwOBKJBAIBdWiZWEhKZxX7aDQaDAZHRka4lVKzydJtkarHGOvr66PbLiW20WwRYywej0ciEcofwxh7/PHH29vb6+vrnU6n0+kcGhoi51Wfz3f06NFt27YNDQ0pikLhhalUKhAIjIyMbNu27ZlnnrHb7YsXL+7s7CQtGo/Hye3T6XQqihIKhQYHBxljDoejr6/v2LFjfX19FJO5e/fu3bt3t7W1rVy5Ul1z9bIN6naReKPwTjb6KBo0PyWsHS8uHRGLxYaHh4eHh0maqm+XWIJoP+c19Pl827dvnz179nnnnfcf//EfF1xwwe23375u3TpykTX4OgAAAAAAOBCEwNLwoTA73kdUwmaz8aUgNDM0qveLyTk0P2LHqyx+iZKSkrq6ung8/sc//vG99967/vrrTzjhBPH0mpqa1tbWt9566yc/+UlPT89FF120Z8+eW2+99fTTT7/kkkvMt53cCA8ePPiZz3ymsbGxqalp5syZvCZ6lWTHB5tpOuLabDbSYNwwZSws9cr3+/0G6Uw1vyzuC3r06NGnn376+uuvX7hwYTgcpgC/c84553/+53/oyJGRERJ4lD2FAiAVRfnQhz7k9/tXrVq1atWqUCjEr0K5TClCz+fzXXvttbwmwWDQZrNRgp8dO3Z8//vfb25uvuqqq6QKSxviv+q2uFwuA5dXUf6Jt1GELJYU1qhXjniuVBMqvLW19Tvf+c4Pf/jDZ599durUqddffz3durQurwZYykfUgPy6jAIAwKQCLhJABIIQWBdxBQK+R/NfvcyKeqN8pqVY1MY0vfFiIpF4+eWX+/r6/u3f/o3UYDweF09xuVwrVqz43Oc+t2/fPsbYxo0b169ff/nll7PRZSHEYb1UB7GGdrt9+vTpt99++4EDB1588UVaFo+8KDP1FNU0OnGNYdNf88AgAako1zVP5I3iJSSTSUokE4lEWltbFy5cyFTBhHRFyowi4XQ6GxoaPvShDxnHEIpQUfxRWbRoUTQaHRgYoGqoq8p01C87/lZQFhy99koV4Ofqmf7Mu4zybcrI6nQ6b7755ptvvpl/RIlV05YGAAAAAEBAEALrohZLfEzscDicTqeoYfgiB9IpmsUaWBoNjAbc5uPz+TZv3lxWVkYmO1KDtN4glR+NRj0eT21t7ebNmxlj7e3t5GJK/o2SGtT8V6xGS0vLjh073n///QsuuEBsrOaNMnD+VO/U06V6H0mF8yYbo2lv9Pv9U6dO7enpicfj9913X0NDA4VEiksOkj+nzWajJDFTpkzx+Xx9fX179uxpbm5mjLW1tQ0NDSUSib6+PkVRaLUJ/iXS92Kz2RRF8fl8GzZsuPLKKxcsWNDU1GRSTmt6EWsa/fQeG/V3Kj7DZPwkH2DGmElXT1F5Uh4jUoAkUMmmykanHoABajcBTJkDAACYhEAQAktj4JHIhNGbwdprmvJPUzXxMiXDlxqfzxeLxfx+fyQSKS8vt9vtNCIn44wYJEaee06nU4o0U5ukuJlOfWlKPyN6eBrLD81bZNI7TnNYrGcGlKSpntAV93CrL63x8MYbb/T395eUlEybNo1CIlOplNvtDgaDAwMDFBbIGBsaGhoeHh4YGAiHw21tba+88kp/f/8ZZ5yxb9++gYEBp9NJnqher9fj8ZCM9Pl8lKuGwgu9Xu8tt9zi8/lo8Y+SkpJ4PM4tkwaa3KRCMBbeegckEomRkZGampo5c+YwxkgPZ6RJ+CKN/BIUT+vz+UgzZ8FkE0W2HAKPAQAAgAkABCGwOuqIODbqsCeO4/Wko3qcJw3T1eN+yXeUb/PV5CjjJVehDodDUZSdO3emUqkFCxZwQchNNz6fj6c/VYuEgwcP9vX1zZo1q6ysTNNESeFzHo8nNbr2OkkdvTZqKhljJ1i9JmveQP6p5DNpBlIvdKLD4di/f/+ZZ565aNEik6dHIpHt27fv2LGjr6+voaFh6tSpTqfT5MIb99xzT3t7e2dnp6IotI6ium56dU5buNrKJM4v2LRS+1Cu0aqqqq6uLkpgy1fLyBFaUeP1119nWX1H1gfWPAAAACCPQBAC6yIalNjxaor2i1Itl6toakLjU2w2m9vt5nFou3fv/vnPf75w4UKbzTZnzhzypbSN5qHhJkQ18Xj897//fU9Pz6c+9alFixZpBsVR3hEyH1Fp8XhcM4DNwLInYV4/G5Svh/FhZEQlPe9yucRYPr1L8wK9Xu/ChQuvu+665cuXZ5o3ZWhoaGhoaMaMGbTcvKYB06AVaR8JpvMI2VRJXIlYLFZTUzNr1qyvfOUrzz77bEZt0YOa1tTUtHjx4ocffphN0Lwp+ZWCBj7kAAAAwGQAghBYC7Uzp6j6xEE2yUXxX4NyzFzX+AC1POAKjTHmdDrb2treffddt9vd1NRUUVEhFquuHoe8Iv/+979XV1dPmzaNC0K1OZRrJ7Is8bYbezmalIjcimXg7WlwunlIxlM5yWSyrKzM6/UyxkZGRr7zne/88pe/9Pl8FFBXVVXV19f3ox/96Fvf+hZjLBgM0vGkjXfu3HnyySczxqLR6NDQEGVkPXDgwCWXXLJ582ZaqYKC6CorKx977LHVq1enUiny7xWjT/Xuhvhv1mqBP4TSpIM4r+FwOF588UXG2N/+9rdoNJpIJMjxODW62CMbTTnD50eoCdyL2OVy0QblLKVpiMWLFy9ZsuT999/PruaTCqhBAAAAkxwIQmAtJDEjqT5JHIr/SiavjAZ5xgeLzn48dQ25g3K73+zZs2+88cann3560aJFpaWlXAlIhkG1DnE4HJ///OfdbvcJJ5xQV1endyQ1kKcJ0Qw11Iv002uUQeAlM2cS1MxtoxaTHNsoXBZWVFR4PJ6+vr4vfvGLDzzwAGOML8rX19fHGPv2t7/d0tJyxRVX3H333f/6179uuOGGOXPmbN269d5777355pvXrVt31113Pfjgg0888UQqlfroRz9KWXz4UoeMsf7+/jVr1uzbt8/r9VZUVITDYVouUtTbou+xyYiytEsvMkFF680IOByOoaGh0tLSuXPnXnrppcalZcq//vUv0s/5LRYAAAAAEwyMFYB1kUQLT5/IVFpxnJ2+3G43yVGyENLfNWvWfOc73znttNMcDgcpN54ThdsSuWVMURS+c/r06d/61rcuvfRSPcsVaQ9KocmEFDUEFxtcbvH9TFheQtKQkp7RLEEqn6lMnZqhm+rLaVopaaff71cUZePGjQ888MAVV1yRSqXuvvtuOqynp4eOvPLKKxljr7322oMPPnj06FGv11tVVbVx48a3336bMfbqq6/+85//jMfjv/jFLzZt2tTc3JxKpegUirp86qmnGGPf//73h4eHKdqQ+/Hy6mVh+TQjuY1FO9WQllJsb29njB07diwWi8XjcbIT8r+0YR6KSDx48KD65gMAAAAASMBCCKyCWj+QaBEH7uK2GAYmGuuk0ozJaLgsJpVRFEU0S9L+srIysdhUKkXBhGKCUKZlzyS3SbHONtXCgNxlVFK/Us4Scb+ZFhkfr94pXlqyMZq5mVLwp8PhoJvJGOvs7Gxubj5y5Ah9VFtb+/e//52N3pzq6mrGGC1OWFJSwv+Sd25lZaXdbvf7/alUasGCBR988AFjLBqN+nw+SuBZXl5OltvUaB4g6fYa2PEMGqL5EVe8xh68JKfJa5SKKikpcbvdTGW0ZBk+qFSIOmuOHpNWNObuAg0AAEXKpO35gSYQhMAqqKPUSFBpul+qbVlquxZLZznkSsBM9Wj4LkpQ22jOGLE08ercpJlMJvm1+FKEvb29GzdubG1tnTFjhtq10lieqf0VTXq98oMJAzlnRoeIEl19Fc1qSDKJFFFZWVkgEBgYGCA12NDQ0NXVlUqlrrjiCsbY2rVrGWNlZWXz5s3jC0WUl5c3NTUxxurr62fMmMEY27Fjx6JFi9ra2kgN0oUikciWLVsWLVq0b98+m83m8/m4Sjf2pdRri55DrJ4gN1DU/O55vV5xzUDNE9WTBZpfjVpJZkGxyCSMZgAAAIC8AEEIrIWk8UTVR2kz+EeihVAywTHVkuKiCFFvm6yYaLpMJBJp1ZTb7aaBfjQa5flgyN00Fou99tpr3/72ty+55JKbb75ZPcQXq+d0OhVFGRkZIcuPpmNnRm3h1jBNh0/uPpq2HE2/U00lyXeSAuSXoG9tYGBgZGSktLSUEsnMnz9/YGAgEomUlZUNDQ0dPnyYMTY0NJRKpWKxGBU4NDQ0MjLCGAsGg9FolDH21ltvNTU1NTc3Hzt2zGazLVmyZNeuXaFQiOxv7777biKR4Os6iFZK8eabb75097ITJzxtLFlB1YXY9JcD0asVE8S2yWrkEn9b1EyelgIAAAAGQBACCyFpCckEJ6og+kgcH6vXdTAzpmeZ6Cg+bg6Hw6WlpaFQiPSeoiiSZYbKjMfjVCu3201pTqgJiUTisccea2xsvP7668nMRd59kriicmiRQ4fDUVFRwUMTNdVg2vZKTrmaSWUyGiJLulQqXzOGkKsa7n9rs9nI+fMTn/jEE0888cwzz7z00kt0sNfr7enpIQOgx+MJh8MkiZ1Op8/n42bY7u5uxtg555zT39+/fPnyjRs3plKpTZs2USE1NTXxePyaa65xOp0jIyOkzG1aAagZWcbMJJVJWwLVgeeq5XLOQFSbIVNBWCwmwTEFNwEAMKnAjBgQQVIZYF0kQSgGCoqGJqYVQ0iMJjdJif+qt22GiMfwq69Zs6a3t/edd95ho4u/8SUBaCUAxtjmzZvJojV16tQ33niDMeZ2u5PJ5Ouvv97Y2NjY2PjRj350/fr1vP52AVIs1KjnnntOUZQVK1ZQ4k36VLMrF9ubEmAq/0ayr+b4PpBW8+M3ih2vBsVtHkNIC2nY7XaPx9PT08MYe+KJJ55++ulbbrmFDn733Xcp1cojjzzCGDt48ODBgwePHj3KGOvr6wuFQnv37mWMtbW1xePxoaGhZDL5l7/8hXyMzz77bN7Sr3zlK9u3b+/v7+eWQMrKI36zdJcyuiHSw5kF3Ejr9XrVS9LbtFYByf0r06tJ3sssIvhNBgCAyUOhu15gLSAIgXWhBff4v6LFg8b0fI9ehg/b8SPpXLpCElG0rSjK7NmzTz311MOHD+/atYvkDSV4jMfjZDA8ePCg3+//0Ic+xBhbvXr1rFmzNmzYwBh79dVX3W736aeffuzYsba2NkpJGo1G6fTkKFRIMpns7Oz817/+tXjx4hUrVvT39zNBzqlbKjaNb+t9JJlYs0DM+ypewiC4jo4hPeZyuYaGhhRFWbNmzfLly5955pn77rvvsssuq66u9vv94XD42LFjbDSRzA9+8INnnnlmzZo1jLHGxsabb77529/+NmPse9/73mOPPVZWVnbttdcyxp5++mnG2KxZszwez6JFixhjzz33HGPsuuuu8/v9ZNQl7a35DGjqZ02Mn6KUPuIx9NDaVNrSdryK1qxhWrDghEkwMAIAADDJgcsosBDSyIwsSPxfj8fDYwhTqZTT6SQHQsaY0+nkH2mS0knFmVHdREEYiUTOOuusurq6O++80+Px1NfXk1+ozWYjaReJRC699NITTjiBMRYIBNavX3/TTTfdeeedXq/3V7/6FWPs0Ucfffnll2+99daDBw+OjIzwZJu8wn6/v729PZlMrlmzpqWlZXh4OBKJsNHVzDWH+5L3o1qeiUiqUk+BSAdoKkB1Iex410e+QRflLR0eHg6FQjNnznznnXdmzJhx9dVXM8a8Xq/P51u9ejUZTu+55x7G2Lx58+bNm0dnNTY2fvvb36ZLz58/f/78+Yyx5cuXv/vuuxdccAHtnzp16pYtW2j7V7/61fLly9va2jo6OhoaGlKpFK1cL1ZVXW3N+yaKavGRy+LR4nfP4Om1jVo11V+K3hX5wVkLwmJxnsxdyBVLSwEAIO9gLgyIQBAC6xKPx2lZNrJEjYyMkCJijJFVbXh4mNYbCIfDPBBLQk8UGSgZvXJEQdjf39/Q0LBw4cKf/exnXV1dFC6oKAoZvrq7u2+//fZHH330y1/+MhmmHnvssWPHjl1yySWvvPLKD3/4w3Xr1v31r39tb29/9dVXr7rqqsrKypGREalKiqL4fL7a2lraPzQ0xIf4elpOanJKlStFFGYGVjLjW8FxuVx6bxSbatkMdnx2UzLqVlZWvvnmm7fffntzc/OiRYsOHDjg9/tLSkp8Pp/H40kkEpWVlW+//bbf73e73WVlZYODg1u2bHnqqafWrVv34Q9/+ODBg06ns7KyMhgMDg0Nbdu2LZlM2my2yspKj8cTCAQo8Ux7e/tzzz33+9///sILL1y5cqXL5QqFQuTWq26yyebbVAGuTEszpy3Bbre73W61eDP4fk1i/mUPWyIAAAAwmYEgBFZB00K1aNEil8sVjUY9Hs9pp51GToCMsXnz5tXV1VVXV8fjcbvdvmzZsq1bt4ql8UL0BtPq6CzjiokCoL+/X1wnoKGhQTqlvr6+paXl8OHDdIrf7z948ODUqVMvvPDCk08+ecOGDfX19Xfcccf999+/fPnyWbNmMcaqqqr0KpBMJu12e0lJCelh0g+SYOBCi4Sx1HxJFZMek1SlGQuqdJfUhkrj207OrtxIaLPZzjzzTEVRli1bVl9f//Wvf13zojQRQPlCGxsbKysr+/v7Fy5cOHv27MrKSopFVBSltLT0/PPP/+53v6sO7QuFQrFYrKmpae7cuYwxv98fDAalthtUW/MmSGGr5iWl+MjxoFMqSq8aGVWPA5kHAAAAADNAEAKrYFMtvVBeXh4OhxljlHKjt7eXf8RHxmTnIb3EGCOZwb3m1HovrWLRlFIEz/wxe/bs7u7uWCzGfVbVrFixYmhoiGuGNWvWUEqY+vr6devW+Xy+adOmTZs2japtDI3su7q6+OVEZ1ox0pIaTlGImmsVGlgIUybylEoH87Q36k81z6JTSI4mk8ktW7asXLnS4XBwX1BNAoFAIBCghekZY83NzU6nc8GCBU6nk8IL0+L3+/1+Py1hzxjbs2fP1KlTxe9O/K7Vz6Emdrtd9PM0Y9BTfx30JbpcLsll1MDuanAVM7MbE4MJ30AAAABgPIEgBBZCPc67+uqrKa4sLb/61a9OPPFEKaxL7bVo0nqjlgQ0fCehdcYZZ7z00ktPPvnkvHnzYrGYx+PhdjlKDFNSUjJ79uxUKrV3795QKFRSUjJ9+vSmpqYDBw4kEgluYiotLU0mk3v27KHgQ72gtVQqtW/fvm3btp166qls1JWUDlYUhZr8yCOPfOYzn7n++ut/8IMfUD0N2kttMSlCDKDUPuIePZXCFRetGEk7H3jggSlTppx55pldXV1UGSnUk6ckZYwlk0m6z4cPH3766ac7OjpWr17d19eXEpL9kL+oGIoplkbLTrz33nu7d+/mpmap7dI8ggF6iW2NTxefK24hdLvdov+qSdJWMuskqJNHbk2elgIAAAAGQBACqyBZ5PjQubS0NBKJ8CSNokskneLz+cLh8B//+McvfelLjLHf/va3Z5999qxZs9QSy3ygl2bkocfjicfjHo/H7Xafc845GzduPHDggNvtdjgcZKYjQZJMJgcGBsrLy20228DAgKIow8PDZWVlFAZJRrxYLOZyubxebzKZDAaDdCIbHcSTpOHbpD0+9rGPzZkzhzFGXrJUJTrmG9/4xsMPP3z++ec/+OCDBw4cuOeee3hlpGbydCnSuh3qxhrfGYLW29A7TDM1i91upyUZq6qqvv/970cike3bt5MepohEWrSDakgpW5PJJH3vJSUl0Wj00KFDHR0dR44cOXbsWH9/P7/nbDS00m63u1wuOosS/NAGYywajdbW1t52223Dw8NdXV1qX1/z0FUyPUv6OkhRu91uydSckbVWjxxXxZgkZBT2CQAAAExIIAiB1YnH4yQhRESZQWKATEw7duz44he/+PnPf/7nP/85CQwz+UXVyTA1jyftx0YF1bJly4aGhijhDV2FakLbsVjMZrNNmzbN6XSSLOEOk/wSJCPFNTPUkpUsiqRC6ZhEIsHTkNhstkgkctttt917771XX311f3//9OnTb7jhhltuuUVqhe34lQxId2nG0ZmHWwgNPHLV1+X/nn766YlEIhwOizk/1V67dInU6CINU6dOdTqdc+bMmTlzJgUWsuOfB82i2KjF2Ofz2e32d999t6+vL1NBKBZIQi6j0yW4y6iYPpd/lGPJbFQQIpGmMZCCAAAAAAQhsBbqxJhqNShBxp/58+dv3br1yJEjP/3pT4PB4Je//OWbbrqppqbGwNgijZWN3Upto0sm8GPsdjsPSxsHJK9LvnP9+vX/8z//Q461lZWVL7zwwmWXXXbppZcuX75cT9+S5VASIVlYCD0ej9rGaDzC5ksspEbXiC8tLTVzXU5dXd3ChQubmpoYY36/P6NzOaFQSLyugbOuXgnityCVoHkH1DmTyGuXTKM5aktNcpE6RSEjc9dyRdFMAAAYCzAdBkQgCIFFMRn1x6FkpIODgz09PYcOHTpw4EAsFuOfZmQKk4xafJtbCAsFzybqdDrJXzEWi7W1tV1//fX8mBNOOMHv9x86dIgEoWjB420hKaK37IR5uCjSU93q6/LEpDZzuVs0CYVCojE268oz4ZaqHzNjc7HD4ZCSymT6xNrtdkVRAoGAx+OhfEUZlaBpARYtzFmLzKLwosy7lrN4ewEAAICxA4IQWAXNsD3zKIqyfPnyqVOn/vnPfz7ttNN+/vOfV1ZWqg+TJITecN9A3ohFZVfVrOH6io/+PR7Pc889N2/evFtuueXaa6/du3fv+vXrL7jggksuucRMaTm6jHKnR3UJejcwx3tos9ni8fjw8HAsFgsEAll8Bfwx01swg1dM7QcrHW9cgrocNWTc5pmB1JU0bIpGlTI63kw5FrSh8V9BvooiLNhSAAAYOzALBkQgCIG1yE6WMMZo/Yb6+vqf/OQnc+fO1RvNq0WL+SsaLBU4nng8nvLycq5GWltbb7nllvvvv3/v3r2HDh0699xz77jjDk3dJe4MBAIVFRWZOnxKDr1VVVU+n0/9qR42m628vJz8PLMef7tcrrKyMp7QxdixU4+qqipjd1M94cr3+3y+8vJydnxmVHXzDe6w2+2mh7axsZGseZo5kMxXUoKqlwUWl0bq7yL3ovJSGgAAAFCkQBACq5D1OI9OpJXiu7q6WltbY7FYJBKhxfr01srLqHwKIOQCgDLE5FJmdtAi7HzRxVgsFo/HXS7X17/+9a9//es7duzgC/opihKLxZxOp567Iy3NR2XyHKcZ1cRut5eWlpIuTSQSxjeZ5zX1+/3kHknGsYyuywsJBAI8BWtG6oV/lSUlJdmVwEbzvrpcLvoW0rZdsxqUXIdkbVNTEwXKGq9sqVeU+t9oNFpSUqIpMjXhi5QQBvp2AmNxGQwAAPllUvXwIC0QhMAqmEz9ooaGs93d3YwxyhvpdDr5IvJ5hPz61OlYxg0SHj6fjyogLVcgLu/ucDhE250av99PpYk5TjOtic1m83q9LJNwNZJzbPRmZofb7abWZbHwA+HxeLIugdru8XjovmUdqudwOKqrqxljR44cocc1a5ueBDUqHA4zldjTRDom02DIQoHRDAAAAJAXIAhB0UPD1gcffLCtrW369On79u1zOp18eTqy5tFydhzb6BIRIrQmBJluuEainRUVFfv37+/q6qqoqDjhhBOCwaAooqgoXqDBRmp0aT6+YbKNVA2Xy+VyuT744AParqmp8Xg8oVDI6XROmTKlurp6aGios7MzFApx0yiF7YkVcDqdfX19Q0NDVOzMmTMHBwclTWisIqjwSCTS39/PGJs5c2YkEuFmRtrgyWPor6IoVVVVbW1twWCQMVZbW1tTU0MraoiXFr8CKo1/SjUPh8MdHR1DQ0M2m23FihWhUEhtyzK4/7R95MiRkZERxtjs2bOTyWQkEiFTamp0lUum+k4JimCklDydnZ2MsZqamtLS0qGhIXHlDN4WvW1FUSoqKnbv3p1IJDweTzQaZYw99NBDDoeDL6QhfSOUAcg+CiVrpbkJSu1DGY9IZldXV9fW1v7v//4vs7yoAwAAAEDBySb8BoCxhtwyacibXZAYAICli7F0OByKorS2tu7Zsycej9MvbjyrlyNiR0FtMTjY6XQmEgm6G+TzPF7VBAAAACwNLITAKkimnuyyyxiclbWqVA+p9fJJZld+XsgiX2IuazaMKeadh9OmwMlbncaM7EJnzRycGiXtkXouoxYnv0llAABgUmHNAQAoFBCEwCqI6StZVmM1k8PfLIpNu6fgZFclCzaEZVIra9Y/OzLNjpPHi5qJMwQAAADARAWCEFiLXCyEAIAsUIdKFqom48zkaSkAAABgAAQhAABMUsTkRhZ0hNYkjyrOgq0DAIDxATNiQASCEFgdJJUBYEyRcrGIYY0WHDHkcWF6C7YOAAAAGH8gCAEAYFKTSCTEfy0+BQMVBwAAAOQXCEJgFQz81gAAY4FeUhn8DAEAAIDJAxZiAlbBmv5pAExg6BcXi8UKXREAAAAAFAxYCIFFQbpRAMYHEoT8h2Zlf1ER9AwAAABAXoAgBBYFoz0AxodIJCL+K60ICgAAAICJDQQhsApSDCHfqKioiEQiiqIkk8msV9DOaK3zjBa4556uZkbPk3aELd3PSXsfxg3+DIue2OJtp/0OhyMUCmmWgO8IAAAAmCRAEAKLwg0Uvb29BamAyVyLGalHACyLw+HAkwwAAABMQiAIgVWQLBIkCDs6Ot5///1YLFZRUWGz2ZxOp8Ph8Hg8DoeDtu12u91udzqddrudMWa326kc2i9uOJ1OKoH2OBwOvZrE43G32512cEyK8Qtf+MIdd9yhd4yiKIlEIplMplIp2kgkEjabjVs7FUWhfzO4U8UD3edoNFpWVvbkk08+99xzS5cuveiii0pKSqLR6IS3QTkcDpfL5fF4GGM2m42ew1zgz6RUFP+XHqdwOFxZWXnKKaccOnSoq6tLKiSZTEajUcaY0+ncvXv3lVdeyY53EM3jQn9jQR6rJ/7GrdlYAAAAYByw9HpTYBJCA9MCLkERDod9Pp+ZS9vtdlJ6DAFX5hgZGQkEAoWuxWThm9/85q233ppKpY4cOULPJxeliURCURSPxxONRleuXNnV1fXEE0+sX79e/PVZH6qqoig01+NwOBRFMTje6XQmEgm+0obdbi+WlgIAQN7BoAWIFM27H0x4JBHIhZbeIzpGfVl/f391dbWZwml8GYvFXC5XLBYjkyN6WD1IkExaD9s8PhjGN5A0ktvtzq7kSSUIaX+xtBcAAPIIhitABC6jwCpIuQ3NZ2rJL+Tgx0zEEFLdRkZGKioqHA6HgQ8qYIK2z91zcpKT9kdht9sVRVEUJZVKkVu13pHkw0yHuVwusfzJY/SeJM0EAAAA9IAgBNZCHJwVZEiaqa4Lh8MU36hZ20lrfDCQ01Lg1kS9RfyRyFegmpkbxadRTM5QUPxt1lUCAAAAwAQAQwFgOaT8Fhafv4/H49Iesc4Wr/yYohbJkkAqlBF4PJGanOnyG2oRaCyhM1ouxTg7y8T+XgAAAADAgSAE1qUg5qNMx8FSglAe+pjPOhUz0q0Q/50kdykv+i2XU8yUU1yzMAAAAADIIxCEwHJIy2eP9eXEZDZZeDOSIEylUlKkFobUTJUoiO/U87CdYPDmixvZtV1tXM1vsiV1MqcsChkH0ho2M8KyzQQAgLFmwr+CQUZAEAKQE4lEQvyXD1gx1uSob8WkukWSv2jWbTdpXJ3Yd9XiayQCAAAAxQgEIZjsSCPL7FxG1UFiGLACMBZg5U8AAAAgv0AQApATsVhM/HcCp80EwAqMhQ6EtgQAADCZgSAEgDHV+odmUIcdivsBABYHP1UAAACAMYYVogHQxuRgUbIQAgAAAAAAUERAEALAmCD/MjUaKIrCtGII4TgKwFiQGqXQFQEAAAAmCHAZBSAn1FlG+QbGrADknTz6eeIXCgCYtMBnHohAEILJjuZaeeYhC6Em6G0BsDJ6YcAAAADApAKCEEx28rLsBAfZ8AEoFiAFAQAAAAZBCECOSIIQahCAYgG/VgAAAIBBEAKQI2oLIW3wsSasEADkBVG/5cUUj98mAGDSghkxIAJBCABjOYwv1RZCGmVirAlAfsFvCgAAABgLIAjBZCfHpDJqMOsGAAAAAACKBQhCMNnJb1IZAECxgLkbAAAAgGFhegByRD2m5Ktmw8MNAAAAAABYHAhCAHJCL6kM1p8AYIzgcy4AAAAAyB24jAKQT3hSGb4BAMg7mG0BAAAA8gUEIQCM5S/LKCyEAIwDWHYCAAByAUMUIAJBCABj+esZ0cMCMA7k5YeGXysAAADAEEMIAABgcgILIQAAAMAgCAEAAExOYCEEAAAAGFxGAQAATE5gIQQATFowIwZEIAgBAABMRjAeAgAAABhcRgEAAAAAAABg0gJBCAAAAAAAAACTFAhCAAAAAAAAAJikQBACAAAAAAAAwCQFghAAAAAAAAAAJikQhAAAAAAAAAAwSYEgBAAAAAAAAIBJCgQhAAAAAAAAAExSsDA9AIwxlkqlsEo1AJONVCrFt9EDAAAAmJxAEAIAAJikQAQCAAAAcBkFgDGMCwEAAAAAwKQEFkIA8ozohAYAGCNyn8TBTxUAMGnBPDgQgSAEIM+gkwWgKMBPFQAAAGBwGQUglUppGgowWAQAAAAAABMeWAjBZIeEX76yjCJpIQBjCv+JwWUUAACyBkMUIAJBCEA+QQ8LwJiCnxgAAACQXyAIAWAsq1EmnZJMJsegOgCAMQfaEgAAAGAQhADk6IGGMSUAAAAAAChekFQGAMag6wAAAAAAwKQEFkIw2clRCiIvBQAAAAAAKF5gIQQAAAAAAACASQoEIZjs6K1DaBIklQEAAAAAAMULXEbBZCe/0YPwIAVgfEDcLwAAAJAXIAgBOI4cR5n5XeYeAAAAAACAMQUuowDkhKZJEGoQAAAAAAAUBRCEADCWg6snYggBAAAAAEDxAkEIAGM52PQgCAEAAAAAwP/X3r37yFXdcQA/c+furLFZr2OBLBQIQsTCEUooIoGABqiChJAoKGjzD/APUFFQUlFQ0fEo0qVylYIGUkU0kYUVUfAyIBs/l525cyfFwZezd2afc2d3x+fzKVZ3Xtd37Tnj853feSwvcwghhDlm/bVKi+lNA0ehc00Tm799dXgqAFheAiHMZYcKoRVHYSloqkBufBFGypBRmIshowAALC8VQghhjq/Kqqrq/JzAdjqv5mmnAGROIITZ9thNbHVPm30Ipx8CutJJiktPorUCWfFdGCmBkNzFjuCBN5QfDofTZws+amFhJpPJgVeBap0n3G2qGiwA2RIIIYQDRcH4/PF4PH1nc85Org1o9Hq9rsKb1gpky7dgpARCcjfnZ6I5hHAP0FoByJZVRmGL/fYLR6PRgq4EAAAWTYUQDr4rfQhhY2OjdaourgjYRYcb0wPkxrAIUiqEMPtjcdfPynRFitYLfc4CALAUVAhhdoVw1+pBURQhhM3NzfTO5jwyIRxzGikABIGQzG1X5dvuzukn/PTTT4u4MAAAOAQCIVnbIfXdd999k8kklgHruq6qqtfrlWVZFEVd1yGEEydO3Llz58qVK/E8nWyMBgAAh0kghNmuX7/eumcymaTb0F+9ejWE8NprrwVjzwAAWE4CIfwm5rqff/75448/fvHFF8+dO3fjxo0PPvjg2WeffeaZZ0II//jHP/r9fgyBly9f/uyzz55++ulwdz5h2DrzUEqERdhhpPcBzgOQIV0UUgIh/CqO+RyNRteuXXv44YfPnTsXQjh9+vRTTz114cKF+Jw//elPg8EgHv/xj3+sqqrpm053UnU3oVuxfXXVj9FaASAIhNAKckVRDIfD77//vnnCN998c+HChfX19RDCjRs3hsPh+fPnQwjD4fDrr79+6KGHtjuzr99gWWitAGTLPoTkrrVtYLx57dq1ZrrglStXbt26FY9v3rwZpw6GEG7dunXt2rWqqg75ggEAoCsqhDBjtFhRFM20wKIoWokxHvT7/X6/3zwtPZVqAwAAS0GFENpTieq7pp+Z3h/3omg9rVVvBACA40yFkNy1yoNxeZjxeNzc36wcE43H45kvTE8oE8KysJwMkCEdFVICIbRNJpNWqEvDYXNnr9cbj8etCqE0CMtFgwUgcwIhuWu6g03qi4GwSXrbVQjruo7PbJ1QwQEOgX0IAQ7Md2GkBEJo6/V6dV2nQbEJh8PhsOlE1nXd7/dbq4zO3JAQOIbsQwgAQSAkczN3k2/NIUzLgE3ei8fD4bDf70+fEFiQtAF2dapOzgYAS0ogJGsze4GtOYStIaPpKqPTQ0Z1K2GhOmxi8VSxCfsqB8iK7gopgRBm9AXT7SXSR9Pho/HDdLtFZfQvYRE678ToFQGQOYEQQivCpRMIw91KYDxOS4Lx/uneZIdD2oBppukCQIcEQtgi7iyf1v3SqmAaDuN8wumN6Q/tUiFPWhkAdKg46guAo9eaChgrhGmnszluxb+Zp1rEFQIAwCKoEMIM6RzC9LhVPGwNLgWWiK9vgGzpvZBSIYTQqgdOPzrzZkyDhowCALC8VAhhizh8NC39jcfjmUNGW/vXA8tF4wWAIBDCtOkJhK1hovs6m2Fp0CEpDgC6JRBCO7NNrzGzxxeGZB/Chv4rAADHlkAI7X0Id0h0u84YFP9gWajeA9nSXSElEMIM21UF5xw+Chwf+kMAEARC2K9WJ3LmqNGZzwTmp30BQLcEQtifXYeZ6afC4mhfANAt+xDCXHZekAZYhE5amdYKAEGFEGaa3nE+fSgezNyEUPkCDsF0QztAtNNaASCoEAIAAGRLhRC6ZxwaLFSHxT2tFciQIRKkBELokiUQYdHi3L/5m1hsrZoqAJkTCOGAiqKYri3oXMKiddXKtFYACOYQwkyTyaQo9tQ69CkBAFheKoRwQDEKTm87cUSXA3np9rsYLRfIiq+zSQmEsA9p5TDOYtpjIRE4boRAAAiGjMKBTSaTwWBw1FcBAAAHJxDCDGndLy0jtBaS2djY2NzcHI/Hh3pxAADQEUNGYZd5gNsNCq2q6v777//973/f7/fH43G/34/393q9TtbEB6Z1OM5TIwWAoEIIIYRer5d2DVs3w9ZM2BwPBoPV1dUrV66EEJoiYXyhjiYsSO+uo74QALhHqBBCW9z2euZD6ZDR9fX1L7/88vXXX59MJnVdN69tnqzPCt3qtn1ZVAbIli4KKYEQtojFhzT4xSGg08+s6/r06dOPPfZY6+XxYIdUCexXU3tPx2PP2aHRHwKAIBBC2K1QUBRFM0w03Wfi5s2b586de//998OseYb6mrAIHbYsX9kA2dJLISUQwgytDQabjmNRFOln6HA4XF9fD0kg1MWEw6E3AwCdEAjh155lmvrSm2k4bG1MH6YSoE4qLAutFQCCVUZhWpr6wtYho2mFsN/vp6HxkC8SAADmp0IIW6p8MQ22dqGYubZhfGZZbmlE8ZnyISyOVgYAHRIIoT1ktJUJy7JMq4LpBvRFUcSbcVXSNCse5vVDVmZGwQM0Ou0UyJbv1EgZMkrWZm4OEXeeSIeDNp+baVDs9Xr9fj+OJvXBCofGni4A0CGBkKylYS+9J11IpnXcjBGN4XB6wwngEMiEANAJQ0ahLSa9prvZGjLaCoqtQKhUCAvS+dRBrRUAgkAI03WGyWRSlmUa/GbOIQwhlGWZ3gyWu4CF0awAYBEEQmhrrRCThsDWsQohAABLTSAkd9NLjIatewymNcDWkNEdKoRppDwA86OOrV3/WVv/dvt6Gxzyv/t+f5d5XrvHv4fWar07Lyg65/cv6vkAEARCiJpJg3ECYb/fT7edaFJfqyTY2rGwEU8l1N2T9vvPepzfBvNc2+L+Hlr7gm73tPmDnCgIAEEghJa4CWEa/NL5hGVZpquMDgaD1sb0QS9zG/NXdbqqCx2Og13tcU6Px8dSvAEAYFkIhDDDaDQaj8exMDgajaqqivePx+PmeDKZDIfD8XicvlBXdTu51XMOdrXL9TseB3VdN8fp4sB7kT7Z3zwA2RIIYYu6ruu6Pnv27GAwqKqqLMuzZ8+ePHkyPrq+vr66uhqftrKycubMmfvvvz+EEGOhPiVRs3P69EaXu6rrujW3rTnbdkOU93hJM68wLYYv1xs4Xv/m5uZgMAjbTzjcQRog1WaBrCzXBz6Ltr/vU+EeFjuUw+Hw22+/vX379pNPPhnvv3Tp0hNPPBGPr169ur6+3kwpHI1GKysrR3O5LIk5lxdiZ7ENxr/hnSuEZVlWVRWfUNd1XEz48C4U4DjxHxMpFUL4zWQyGQwG586de++998bj8V/+8peNjY0PP/zwhRdeeOmll0IIFy9eXFtbe+WVV0IIV69e/eKLLx555JHHH3/8qC98Cfz4449ffPHFH/7wh/Pnzx/sDLdu3fr888/PnDnz17/+tdtrW4S//e1vFy9ePEAa/Oc///nqq6+++uqrn3zyyZ///Oe33nrrk08+uXjxYgjhzTff/Pvf//7VV19du3atqqomCEXNcRxFGWvdk8kkHlRVNRwOq6paW1s7ffr0pUuX3n777RDCRx999MYbb4QQYj08hHD79u2rV6+urq7GKmI8SfxF6rpOfzZ/bjw+QPciTtltapXxZsx1sW4Zl3eKZ27W+O33+2tra/EMzTcy+x0vCgBE/geF38S6Qdhn1zauStrMLUzv176ioijSuV6tm3sRyzvb3Txu+v1+HEV88uTJyWSysbGxxxeePn36xo0b4e7g5B9++CHeH1cz+uWXXxZ0wY3XXnvt3Xff/c9//jMej2MOjL9IvNmEw3gckjTYSom7ig2tWcOpiYJRzIHNVp8rKytFUTTr/Z45c2Y0Gj3//PPpCXdtbtMVwoP8BQHAPUeHFX7TLCTT6/XOnj0bu+ZNJ/ior44ctfbJPMA0uZn3T7+fT548efv27fjQf//735ivmliY5sAY/Jpklc51PNi1NXXCNBPGfT5DUhiM4bAsy7W1tR9//PHChQunTp2K17wXAiEAzGTIKFlrrd6R9p43NjaOcw2KTEwvBjPPy3cQ3+1xuuyjjz7aLKQU7o5BbZXgmrGj82zv3rw2HTua/lnxoJki2Lzw7NmzIYTBYLD3QAgAzCQQkrW0/NLq0bb2k4B7W3z/v/zyy2EqRm63DGmzulK319A6bv2hsVAZL8lXNgAwP4EQrLUFv4bA//3vf617jrN9XaFmDgAzmUQBS9DxhUWLrSBus5kO0Uwn9TU3W8/pynZnm76GeP9+lyZqaPIA0FAhBKUD+NV0Umqm8E0/dJiZcP4nT79QLASypedDSiAEYE/SJV7C1qx4OH2LbiOc/hAABENGAWiJQzGb9LXdtivbrfuyOK0/SKIDgPmpEMJshpORofi2T7d8CLMGWB5yYXBBtHEgW0v96U3nBEIAfu0cxN1WdkhKaRQ88v7EnPtepNcvHAKQLYEQfqNTSOZiRhoOh+kw0emDcLiNpalVhrvDWcuyDMkGiXsRz1DXdfOqtP5pmRkAsiUQwm/SisHJkydv374dj6frITvXRo68ckLmdgg22z00GAw2Nzfv3LkTQnjggQfCMXsbNxeThsATJ07EZBhb6PQQ1vSeU6dOXb9+/ebNm+vr661zTv8pAJAPgRBmu379+lFfAhye0WgUQrh48WL8ORgM4vDRqqomd8Xjuq57vV5d102FLd0PsDneLlw1ibSJdkVRNKeKx2VZxp/N9oP9fr8oil6vV5bl2tra5cuXQwjffffd3n/B2KKHw+H0lTQEQgAyJBBCCFM1wKeffvrf//737373u1OnTg0Gg9XV1ZWVlVOnThVFsbKyUpblYDAoy3JlZaUoirIsi6KIHdZwt5u7r8Fs5GZBb48Yxpqf0Wg0quu6qqqqqkajUVVVw+FwNBrFn5ubm5ubm+Px+LvvvltdXX3nnXc+/fTTO3fu3Lhxo6qqEMJ4PJ5MJvFnDIHTmTDeTMtxO28Zn/76k8kk3mzSYAx+8WYIIcbC2MRiMrx169Z999334osv/utf/3r44Yd7vd6JEyfSneubCyiKYjwex8rnTz/99Nxzzz344INhMTsoAsCS6pkyAel2ak33FDie5lzdtKqqmC07ORsALDuBELaIxZBYTkl7iiYQskT2PocwvRkL4GlYio78Ld3a8SJ+cTMcDmMNc+/KsizLcvoXBICcCYSwi3QpQsjB8f9/QXsEgK4IhBDC1lGjzWyo5mfztB0egmUkWQFA5syVgl9ND6VrDROVALknTbYRdisVps85cNOYfnm6BWLraTufZOb9M88GADSsMgoh7K1OolvJvWfX2YZHkgnD1LzBPV7tro+mX+uojgJAEAhhpmb46MxjuLcd/2L4ga+wVYrs7ooAlon+DCmBENp2zn5NJ1JvknvG9Lv9uPUVpncO7OQKtWIAOO5fA8OR2GFrMruWAQBwz1AhhNl8VwIAwD1PhRAAACBTtp0AAADIlEAIAACQKYEQAAAgUwIhAABApgRCAACATAmEAAAAmRIIAQAAMiUQAgAAZEogBAAAyJRACAAAkCmBEAAAIFMCIQAAQKYEQgAAgEwJhAAAAJkSCAEAADIlEAIAAGRKIAQAAMiUQAgAAJApgRAAACBTAiEAAECmBEIAAIBMCYQAAACZEggBAAAyJRACAABkSiAEAADIlEAIAACQKYEQAAAgUwIhAABApgRCAACATAmEAAAAmRIIAQAAMiUQAgAAZEogBAAAyJRACAAAkCmBEAAAIFMCIQAAQKYEQgAAgEwJhAAAAJkSCAEAADIlEAIAAGRKIAQAAMiUQAgAAJApgRAAACBTAiEAAECmBEIAAIBMCYQAAACZEggBAAAyJRACAABkSiAEAADIlEAIAACQKYEQAAAgUwIhAABApgRCAACATAmEAAAAmRIIAQAAMiUQAgAAZEogBAAAyJRACAAAkCmBEAAAIFMCIQAAQKYEQgAAgEwJhAAAAJkSCAEAADIlEAIAAGRKIAQAAMiUQAgAAJApgRAAACBTAiEAAECmBEIAAIBMCYQAAACZEggBAAAyJRACAABkSiAEAADIlEAIAACQKYEQAAAgUwIhAABApgRCAACATAmEAAAAmRIIAQAAMiUQAgAAZEogBAAAyJRACAAAkKn/A/1UTu8sejRuAAAAAElFTkSuQmCC',
+      crossOrigin: null,
+      filters: [],
+    },
+    {
+      type: 'group',
+      version: '5.3.0',
+      originX: 'left',
+      originY: 'top',
+      left: 776.561,
+      top: 172.6152,
+      width: 48.205,
+      height: 48.205,
+      fill: 'rgb(0,0,0)',
+      stroke: null,
+      strokeWidth: 0,
+      strokeDashArray: null,
+      strokeLineCap: 'butt',
+      strokeDashOffset: 0,
+      strokeLineJoin: 'miter',
+      strokeUniform: false,
+      strokeMiterLimit: 4,
+      scaleX: 1,
+      scaleY: 1,
+      angle: 0,
+      flipX: false,
+      flipY: false,
+      opacity: 1,
+      shadow: null,
+      visible: true,
+      backgroundColor: '',
+      fillRule: 'nonzero',
+      paintFirst: 'fill',
+      globalCompositeOperation: 'source-over',
+      skewX: 0,
+      skewY: 0,
+      id: 'f772494d-01de-4a9e-b21d-67faed778e60',
+      selectable: true,
+      hasControls: true,
+      userProperty: {
+        modelId: '987',
+        status: '0',
+      },
+      objects: [
+        {
+          type: 'circle',
+          version: '5.3.0',
+          originX: 'left',
+          originY: 'top',
+          left: -24.1025,
+          top: -24.1025,
+          width: 300,
+          height: 300,
+          fill: 'rgba(44,246,72,0.99)',
+          stroke: 'rgba(45,240,230,1)',
+          strokeWidth: 10,
+          strokeDashArray: null,
+          strokeLineCap: 'butt',
+          strokeDashOffset: 0,
+          strokeLineJoin: 'miter',
+          strokeUniform: false,
+          strokeMiterLimit: 4,
+          scaleX: 0.1555,
+          scaleY: 0.1555,
+          angle: 0,
+          flipX: false,
+          flipY: false,
+          opacity: 1,
+          shadow: '',
+          visible: true,
+          backgroundColor: '',
+          fillRule: 'nonzero',
+          paintFirst: 'fill',
+          globalCompositeOperation: 'source-over',
+          skewX: 0,
+          skewY: 0,
+          radius: 150,
+          startAngle: 0,
+          endAngle: 360,
+          selectable: true,
+          hasControls: true,
+        },
+        {
+          type: 'i-text',
+          version: '5.3.0',
+          originX: 'left',
+          originY: 'top',
+          left: -16.7824,
+          top: -8.9323,
+          width: 160,
+          height: 90.4,
+          fill: 'rgba(255,255,255,1)',
+          stroke: null,
+          strokeWidth: 1,
+          strokeDashArray: null,
+          strokeLineCap: 'butt',
+          strokeDashOffset: 0,
+          strokeLineJoin: 'miter',
+          strokeUniform: false,
+          strokeMiterLimit: 4,
+          scaleX: 0.1954,
+          scaleY: 0.1954,
+          angle: 0,
+          flipX: false,
+          flipY: false,
+          opacity: 1,
+          shadow: '',
+          visible: true,
+          backgroundColor: '',
+          fillRule: 'nonzero',
+          paintFirst: 'fill',
+          globalCompositeOperation: 'source-over',
+          skewX: 0,
+          skewY: 0,
+          fontFamily: 'arial',
+          fontWeight: 'normal',
+          fontSize: 80,
+          text: '正常',
+          underline: false,
+          overline: false,
+          linethrough: false,
+          textAlign: 'left',
+          fontStyle: 'normal',
+          lineHeight: 1.16,
+          textBackgroundColor: '',
+          charSpacing: 0,
+          styles: [],
+          direction: 'ltr',
+          path: null,
+          pathStartOffset: 0,
+          pathSide: 'left',
+          pathAlign: 'baseline',
+          selectable: true,
+          hasControls: true,
+        },
+      ],
+    },
+    {
+      type: 'group',
+      version: '5.3.0',
+      originX: 'left',
+      originY: 'top',
+      left: 384.136,
+      top: 152.891,
+      width: 48.205,
+      height: 48.205,
+      fill: 'rgb(0,0,0)',
+      stroke: null,
+      strokeWidth: 0,
+      strokeDashArray: null,
+      strokeLineCap: 'butt',
+      strokeDashOffset: 0,
+      strokeLineJoin: 'miter',
+      strokeUniform: false,
+      strokeMiterLimit: 4,
+      scaleX: 1,
+      scaleY: 1,
+      angle: 0,
+      flipX: false,
+      flipY: false,
+      opacity: 1,
+      shadow: null,
+      visible: true,
+      backgroundColor: '',
+      fillRule: 'nonzero',
+      paintFirst: 'fill',
+      globalCompositeOperation: 'source-over',
+      skewX: 0,
+      skewY: 0,
+      id: '3fea9335-b7a3-4b01-bf7b-7d15b4ca6b62',
+      selectable: true,
+      hasControls: true,
+      userProperty: {
+        modelId: '123',
+        status: '0',
+      },
+      objects: [
+        {
+          type: 'circle',
+          version: '5.3.0',
+          originX: 'left',
+          originY: 'top',
+          left: -24.1025,
+          top: -24.1025,
+          width: 300,
+          height: 300,
+          fill: 'rgba(44,246,72,0.99)',
+          stroke: 'rgba(45,240,230,1)',
+          strokeWidth: 10,
+          strokeDashArray: null,
+          strokeLineCap: 'butt',
+          strokeDashOffset: 0,
+          strokeLineJoin: 'miter',
+          strokeUniform: false,
+          strokeMiterLimit: 4,
+          scaleX: 0.1555,
+          scaleY: 0.1555,
+          angle: 0,
+          flipX: false,
+          flipY: false,
+          opacity: 1,
+          shadow: '',
+          visible: true,
+          backgroundColor: '',
+          fillRule: 'nonzero',
+          paintFirst: 'fill',
+          globalCompositeOperation: 'source-over',
+          skewX: 0,
+          skewY: 0,
+          radius: 150,
+          startAngle: 0,
+          endAngle: 360,
+          selectable: true,
+          hasControls: true,
+        },
+        {
+          type: 'i-text',
+          version: '5.3.0',
+          originX: 'left',
+          originY: 'top',
+          left: -15.8708,
+          top: -8.9298,
+          width: 160,
+          height: 90.4,
+          fill: 'rgba(255,255,255,1)',
+          stroke: null,
+          strokeWidth: 1,
+          strokeDashArray: null,
+          strokeLineCap: 'butt',
+          strokeDashOffset: 0,
+          strokeLineJoin: 'miter',
+          strokeUniform: false,
+          strokeMiterLimit: 4,
+          scaleX: 0.1954,
+          scaleY: 0.1954,
+          angle: 0,
+          flipX: false,
+          flipY: false,
+          opacity: 1,
+          shadow: '',
+          visible: true,
+          backgroundColor: '',
+          fillRule: 'nonzero',
+          paintFirst: 'fill',
+          globalCompositeOperation: 'source-over',
+          skewX: 0,
+          skewY: 0,
+          fontFamily: 'arial',
+          fontWeight: 'normal',
+          fontSize: 80,
+          text: '正常',
+          underline: false,
+          overline: false,
+          linethrough: false,
+          textAlign: 'left',
+          fontStyle: 'normal',
+          lineHeight: 1.16,
+          textBackgroundColor: '',
+          charSpacing: 0,
+          styles: [],
+          direction: 'ltr',
+          path: null,
+          pathStartOffset: 0,
+          pathSide: 'left',
+          pathAlign: 'baseline',
+          selectable: true,
+          hasControls: true,
+        },
+      ],
+    },
+  ],
+  clipPath: {
+    type: 'rect',
+    version: '5.3.0',
+    originX: 'left',
+    originY: 'top',
+    left: 0,
+    top: 0,
+    width: 1200,
+    height: 900,
+    fill: 'rgba(255,255,255,1)',
+    stroke: null,
+    strokeWidth: 0,
+    strokeDashArray: null,
+    strokeLineCap: 'butt',
+    strokeDashOffset: 0,
+    strokeLineJoin: 'miter',
+    strokeUniform: false,
+    strokeMiterLimit: 4,
+    scaleX: 1,
+    scaleY: 1,
+    angle: 0,
+    flipX: false,
+    flipY: false,
+    opacity: 1,
+    shadow: null,
+    visible: true,
+    backgroundColor: '',
+    fillRule: 'nonzero',
+    paintFirst: 'fill',
+    globalCompositeOperation: 'source-over',
+    skewX: 0,
+    skewY: 0,
+    rx: 0,
+    ry: 0,
+    selectable: true,
+    hasControls: true,
+  },
+};
+
+// TODO mock数据替换成真实数据展示
+function fetchFabricModelsById(req: Request, res: Response) {
+  const { id = 1 } = req.query;
+  console.log(req, 'fetchFabricModelsById_req');
+  const data: Record<string, any> =
+    id === 1
+      ? {
+          ...currJson1,
+        }
+      : { ...currJson1 };
+  const result = {
+    data,
+    success: true,
+    msg: '获取成功',
+  };
+
+  return res.json(result);
+}
+
+function fetchFabricModelsById2(req: Request, res: Response) {
+  const { id = 1 } = req.query;
+  console.log(req, 'fetchFabricModelsById_req');
+  const data: Record<string, any> = currJson2
+  const result = {
+    data,
+    success: true,
+    msg: '获取成功',
+  };
+
+  return res.json(result);
+}
+
+export default {
+  'GET /api/v1/mock/fabricModels': fetchFabricModelsById,
+  'GET /api/v1/mock/fabricModels2': fetchFabricModelsById2,
+};
diff --git a/mock/listTableList.ts b/mock/listTableList.ts
new file mode 100644
index 0000000..35ec3ce
--- /dev/null
+++ b/mock/listTableList.ts
@@ -0,0 +1,176 @@
+import { Request, Response } from 'express';
+import moment from 'moment';
+import { parse } from 'url';
+
+// mock tableListDataSource
+const genList = (current: number, pageSize: number) => {
+  const tableListDataSource: API.RuleListItem[] = [];
+
+  for (let i = 0; i < pageSize; i += 1) {
+    const index = (current - 1) * 10 + i;
+    tableListDataSource.push({
+      key: index,
+      disabled: i % 6 === 0,
+      href: 'https://ant.design',
+      avatar: [
+        'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+      ][i % 2],
+      name: `TradeCode ${index}`,
+      owner: '曲丽丽',
+      desc: '这是一段描述',
+      callNo: Math.floor(Math.random() * 1000),
+      status: Math.floor(Math.random() * 10) % 4,
+      updatedAt: moment().format('YYYY-MM-DD'),
+      createdAt: moment().format('YYYY-MM-DD'),
+      progress: Math.ceil(Math.random() * 100),
+    });
+  }
+  tableListDataSource.reverse();
+  return tableListDataSource;
+};
+
+let tableListDataSource = genList(1, 100);
+
+function getRule(req: Request, res: Response, u: string) {
+  let realUrl = u;
+  if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') {
+    realUrl = req.url;
+  }
+  const { current = 1, pageSize = 10 } = req.query;
+  const params = parse(realUrl, true).query as unknown as API.PageParams &
+    API.RuleListItem & {
+      sorter: any;
+      filter: any;
+    };
+
+  let dataSource = [...tableListDataSource].slice(
+    ((current as number) - 1) * (pageSize as number),
+    (current as number) * (pageSize as number),
+  );
+  if (params.sorter) {
+    const sorter = JSON.parse(params.sorter);
+    dataSource = dataSource.sort((prev, next) => {
+      let sortNumber = 0;
+      (Object.keys(sorter) as Array<keyof API.RuleListItem>).forEach((key) => {
+        let nextSort = next?.[key] as number;
+        let preSort = prev?.[key] as number;
+        if (sorter[key] === 'descend') {
+          if (preSort - nextSort > 0) {
+            sortNumber += -1;
+          } else {
+            sortNumber += 1;
+          }
+          return;
+        }
+        if (preSort - nextSort > 0) {
+          sortNumber += 1;
+        } else {
+          sortNumber += -1;
+        }
+      });
+      return sortNumber;
+    });
+  }
+  if (params.filter) {
+    const filter = JSON.parse(params.filter as any) as {
+      [key: string]: string[];
+    };
+    if (Object.keys(filter).length > 0) {
+      dataSource = dataSource.filter((item) => {
+        return (Object.keys(filter) as Array<keyof API.RuleListItem>).some((key) => {
+          if (!filter[key]) {
+            return true;
+          }
+          if (filter[key].includes(`${item[key]}`)) {
+            return true;
+          }
+          return false;
+        });
+      });
+    }
+  }
+
+  if (params.name) {
+    dataSource = dataSource.filter((data) => data?.name?.includes(params.name || ''));
+  }
+  const result = {
+    data: dataSource,
+    total: tableListDataSource.length,
+    success: true,
+    pageSize,
+    current: parseInt(`${params.current}`, 10) || 1,
+  };
+
+  return res.json(result);
+}
+
+function postRule(req: Request, res: Response, u: string, b: Request) {
+  let realUrl = u;
+  if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') {
+    realUrl = req.url;
+  }
+
+  const body = (b && b.body) || req.body;
+  const { method, name, desc, key } = body;
+
+  switch (method) {
+    /* eslint no-case-declarations:0 */
+    case 'delete':
+      tableListDataSource = tableListDataSource.filter((item) => key.indexOf(item.key) === -1);
+      break;
+    case 'post':
+      (() => {
+        const i = Math.ceil(Math.random() * 10000);
+        const newRule: API.RuleListItem = {
+          key: tableListDataSource.length,
+          href: 'https://ant.design',
+          avatar: [
+            'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+            'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+          ][i % 2],
+          name,
+          owner: '曲丽丽',
+          desc,
+          callNo: Math.floor(Math.random() * 1000),
+          status: Math.floor(Math.random() * 10) % 2,
+          updatedAt: moment().format('YYYY-MM-DD'),
+          createdAt: moment().format('YYYY-MM-DD'),
+          progress: Math.ceil(Math.random() * 100),
+        };
+        tableListDataSource.unshift(newRule);
+        return res.json(newRule);
+      })();
+      return;
+
+    case 'update':
+      (() => {
+        let newRule = {};
+        tableListDataSource = tableListDataSource.map((item) => {
+          if (item.key === key) {
+            newRule = { ...item, desc, name };
+            return { ...item, desc, name };
+          }
+          return item;
+        });
+        return res.json(newRule);
+      })();
+      return;
+    default:
+      break;
+  }
+
+  const result = {
+    list: tableListDataSource,
+    pagination: {
+      total: tableListDataSource.length,
+    },
+  };
+
+  res.json(result);
+}
+
+export default {
+  'GET /api/rule': getRule,
+  'POST /api/rule': postRule,
+};
diff --git a/mock/modelDetail.ts b/mock/modelDetail.ts
new file mode 100644
index 0000000..1a3a9e4
--- /dev/null
+++ b/mock/modelDetail.ts
@@ -0,0 +1,68 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-09 14:29:49
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-09 15:34:50
+ * @FilePath: \general-ai-platform-web\mock\modelDetail.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+import { Request, Response } from 'express';
+import { parse } from 'url';
+
+// mock tableListDataSource
+const genData = (params: Record<string, any>): Record<string, any> => {
+  const data: Record<string, any> = {
+    categoryFkId: 2,
+    createTime: '2023-10-20T06:23:56.158622Z',
+    defaultVersionFkId: null,
+    id: params.id,
+    name: '离岗',
+    remark: '',
+    updateTime: '2023-10-20T06:23:56.158622Z',
+  };
+
+  //   key: index,
+  //   disabled: i % 6 === 0,
+  //   href: 'https://ant.design',
+  //   avatar: [
+  //     'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+  //     'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+  //   ][i % 2],
+  //   name: `TradeCode ${index}`,
+  //   owner: '曲丽丽',
+  //   desc: '这是一段描述',
+  //   callNo: Math.floor(Math.random() * 1000),
+  //   status: Math.floor(Math.random() * 10) % 4,
+  //   updatedAt: moment().format('YYYY-MM-DD'),
+  //   createdAt: moment().format('YYYY-MM-DD'),
+  //   progress: Math.ceil(Math.random() * 100),
+
+  return data;
+};
+
+function getModelDetail(req: Request, res: Response, u: string, b: Request) {
+//   let realUrl = u;
+//   if (!realUrl || Object.prototype.toString.call(realUrl) !== '[object String]') {
+//     realUrl = req.url;
+//   }
+
+//   const body = (b && b.body) || req.body;
+//   const { method, name, desc, key } = body;
+//   const params = parse(realUrl, true).query as unknown as API.PageParams &
+//     API.RuleListItem & {
+//       sorter: any;
+//       filter: any;
+//     };
+//   console.log(req, 'getModelDetailApi');
+  const result = {
+    data: genData({id: 2}),
+    success: true,
+    msg: '获取成功',
+  };
+
+  return res.json(result);
+}
+
+export default {
+  'GET /api/v1/mock/model/detail': getModelDetail,
+};
diff --git a/mock/notices.ts b/mock/notices.ts
new file mode 100644
index 0000000..616c921
--- /dev/null
+++ b/mock/notices.ts
@@ -0,0 +1,115 @@
+import { Request, Response } from 'express';
+
+const getNotices = (req: Request, res: Response) => {
+  res.json({
+    data: [
+      {
+        id: '000000001',
+        avatar:
+          'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/MSbDR4FR2MUAAAAAAAAAAAAAFl94AQBr',
+        title: '你收到了 14 份新周报',
+        datetime: '2017-08-09',
+        type: 'notification',
+      },
+      {
+        id: '000000002',
+        avatar:
+          'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/hX-PTavYIq4AAAAAAAAAAAAAFl94AQBr',
+        title: '你推荐的 曲妮妮 已通过第三轮面试',
+        datetime: '2017-08-08',
+        type: 'notification',
+      },
+      {
+        id: '000000003',
+        avatar:
+          'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/jHX5R5l3QjQAAAAAAAAAAAAAFl94AQBr',
+        title: '这种模板可以区分多种通知类型',
+        datetime: '2017-08-07',
+        read: true,
+        type: 'notification',
+      },
+      {
+        id: '000000004',
+        avatar:
+          'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/Wr4mQqx6jfwAAAAAAAAAAAAAFl94AQBr',
+        title: '左侧图标用于区分不同的类型',
+        datetime: '2017-08-07',
+        type: 'notification',
+      },
+      {
+        id: '000000005',
+        avatar:
+          'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/Mzj_TbcWUj4AAAAAAAAAAAAAFl94AQBr',
+        title: '内容不要超过两行字,超出时自动截断',
+        datetime: '2017-08-07',
+        type: 'notification',
+      },
+      {
+        id: '000000006',
+        avatar:
+          'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/eXLzRbPqQE4AAAAAAAAAAAAAFl94AQBr',
+        title: '曲丽丽 评论了你',
+        description: '描述信息描述信息描述信息',
+        datetime: '2017-08-07',
+        type: 'message',
+        clickClose: true,
+      },
+      {
+        id: '000000007',
+        avatar:
+          'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/w5mRQY2AmEEAAAAAAAAAAAAAFl94AQBr',
+        title: '朱偏右 回复了你',
+        description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像',
+        datetime: '2017-08-07',
+        type: 'message',
+        clickClose: true,
+      },
+      {
+        id: '000000008',
+        avatar:
+          'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/wPadR5M9918AAAAAAAAAAAAAFl94AQBr',
+        title: '标题',
+        description: '这种模板用于提醒谁与你发生了互动,左侧放『谁』的头像',
+        datetime: '2017-08-07',
+        type: 'message',
+        clickClose: true,
+      },
+      {
+        id: '000000009',
+        title: '任务名称',
+        description: '任务需要在 2017-01-12 20:00 前启动',
+        extra: '未开始',
+        status: 'todo',
+        type: 'event',
+      },
+      {
+        id: '000000010',
+        title: '第三方紧急代码变更',
+        description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务',
+        extra: '马上到期',
+        status: 'urgent',
+        type: 'event',
+      },
+      {
+        id: '000000011',
+        title: '信息安全考试',
+        description: '指派竹尔于 2017-01-09 前完成更新并发布',
+        extra: '已耗时 8 天',
+        status: 'doing',
+        type: 'event',
+      },
+      {
+        id: '000000012',
+        title: 'ABCD 版本发布',
+        description: '冠霖提交于 2017-01-06,需在 2017-01-07 前完成代码变更任务',
+        extra: '进行中',
+        status: 'processing',
+        type: 'event',
+      },
+    ],
+  });
+};
+
+export default {
+  'GET /api/notices': getNotices,
+};
diff --git a/mock/requestRecord.mock.js b/mock/requestRecord.mock.js
new file mode 100644
index 0000000..6c59e19
--- /dev/null
+++ b/mock/requestRecord.mock.js
@@ -0,0 +1,324 @@
+module.exports = {
+  'GET /api/currentUser': {
+    data: {
+      name: 'Serati Ma',
+      avatar: 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png',
+      userid: '00000001',
+      email: 'antdesign@alipay.com',
+      signature: '海纳百川,有容乃大',
+      title: '交互专家',
+      group: '蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED',
+      tags: [
+        { key: '0', label: '很有想法的' },
+        { key: '1', label: '专注设计' },
+        { key: '2', label: '辣~' },
+        { key: '3', label: '大长腿' },
+        { key: '4', label: '川妹子' },
+        { key: '5', label: '海纳百川' },
+      ],
+      notifyCount: 12,
+      unreadCount: 11,
+      country: 'China',
+      geographic: {
+        province: { label: '浙江省', key: '330000' },
+        city: { label: '杭州市', key: '330100' },
+      },
+      address: '西湖区工专路 77 号',
+      phone: '0752-268888888',
+    },
+  },
+  'GET /api/rule': {
+    data: [
+      {
+        key: 99,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 99',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 503,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 81,
+      },
+      {
+        key: 98,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 98',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 164,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 12,
+      },
+      {
+        key: 97,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 97',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 174,
+        status: '1',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 81,
+      },
+      {
+        key: 96,
+        disabled: true,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 96',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 914,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 7,
+      },
+      {
+        key: 95,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 95',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 698,
+        status: '2',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 82,
+      },
+      {
+        key: 94,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 94',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 488,
+        status: '1',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 14,
+      },
+      {
+        key: 93,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 93',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 580,
+        status: '2',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 77,
+      },
+      {
+        key: 92,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 92',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 244,
+        status: '3',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 58,
+      },
+      {
+        key: 91,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 91',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 959,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 66,
+      },
+      {
+        key: 90,
+        disabled: true,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 90',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 958,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 72,
+      },
+      {
+        key: 89,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 89',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 301,
+        status: '2',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 2,
+      },
+      {
+        key: 88,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 88',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 277,
+        status: '1',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 12,
+      },
+      {
+        key: 87,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 87',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 810,
+        status: '1',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 82,
+      },
+      {
+        key: 86,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 86',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 780,
+        status: '3',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 22,
+      },
+      {
+        key: 85,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 85',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 705,
+        status: '3',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 12,
+      },
+      {
+        key: 84,
+        disabled: true,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 84',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 203,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 79,
+      },
+      {
+        key: 83,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 83',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 491,
+        status: '2',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 59,
+      },
+      {
+        key: 82,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 82',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 73,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 100,
+      },
+      {
+        key: 81,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 81',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 406,
+        status: '3',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 61,
+      },
+      {
+        key: 80,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 80',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 112,
+        status: '2',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 20,
+      },
+    ],
+    total: 100,
+    success: true,
+    pageSize: 20,
+    current: 1,
+  },
+  'POST /api/login/outLogin': { data: {}, success: true },
+  'POST /api/login/account': {
+    status: 'ok',
+    type: 'account',
+    currentAuthority: 'admin',
+  },
+};
diff --git a/mock/route.ts b/mock/route.ts
new file mode 100644
index 0000000..418d10f
--- /dev/null
+++ b/mock/route.ts
@@ -0,0 +1,5 @@
+export default {
+  '/api/auth_routes': {
+    '/form/advanced-form': { authority: ['admin', 'user'] },
+  },
+};
diff --git a/mock/user.ts b/mock/user.ts
new file mode 100644
index 0000000..75edd34
--- /dev/null
+++ b/mock/user.ts
@@ -0,0 +1,203 @@
+import { Request, Response } from 'express';
+
+const waitTime = (time: number = 100) => {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      resolve(true);
+    }, time);
+  });
+};
+
+async function getFakeCaptcha(req: Request, res: Response) {
+  await waitTime(2000);
+  return res.json('captcha-xxx');
+}
+
+const { ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION } = process.env;
+
+/**
+ * 当前用户的权限,如果为空代表没登录
+ * current user access, if is '', user need login
+ * 如果是 pro 的预览,默认是有权限的
+ */
+let access = ANT_DESIGN_PRO_ONLY_DO_NOT_USE_IN_YOUR_PRODUCTION === 'site' ? 'admin' : '';
+
+const getAccess = () => {
+  return access;
+};
+
+// 代码中会兼容本地 service mock 以及部署站点的静态数据
+export default {
+  // 支持值为 Object 和 Array
+  'GET /api/currentUser': (req: Request, res: Response) => {
+    if (!getAccess()) {
+      res.status(401).send({
+        data: {
+          isLogin: false,
+        },
+        errorCode: '401',
+        errorMessage: '请先登录!',
+        success: true,
+      });
+      return;
+    }
+    res.send({
+      success: true,
+      data: {
+        name: 'Serati Ma',
+        avatar: 'https://gw.alipayobjects.com/zos/antfincdn/XAosXuNZyF/BiazfanxmamNRoxxVxka.png',
+        userid: '00000001',
+        email: 'antdesign@alipay.com',
+        signature: '海纳百川,有容乃大',
+        title: '交互专家',
+        group: '蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED',
+        tags: [
+          {
+            key: '0',
+            label: '很有想法的',
+          },
+          {
+            key: '1',
+            label: '专注设计',
+          },
+          {
+            key: '2',
+            label: '辣~',
+          },
+          {
+            key: '3',
+            label: '大长腿',
+          },
+          {
+            key: '4',
+            label: '川妹子',
+          },
+          {
+            key: '5',
+            label: '海纳百川',
+          },
+        ],
+        notifyCount: 12,
+        unreadCount: 11,
+        country: 'China',
+        access: getAccess(),
+        geographic: {
+          province: {
+            label: '浙江省',
+            key: '330000',
+          },
+          city: {
+            label: '杭州市',
+            key: '330100',
+          },
+        },
+        address: '西湖区工专路 77 号',
+        phone: '0752-268888888',
+      },
+    });
+  },
+  // GET POST 可省略
+  'GET /api/users': [
+    {
+      key: '1',
+      name: 'John Brown',
+      age: 32,
+      address: 'New York No. 1 Lake Park',
+    },
+    {
+      key: '2',
+      name: 'Jim Green',
+      age: 42,
+      address: 'London No. 1 Lake Park',
+    },
+    {
+      key: '3',
+      name: 'Joe Black',
+      age: 32,
+      address: 'Sidney No. 1 Lake Park',
+    },
+  ],
+  'POST /api/login/account': async (req: Request, res: Response) => {
+    const { password, username, type } = req.body;
+    await waitTime(2000);
+    if (password === 'ant.design' && username === 'admin') {
+      res.send({
+        status: 'ok',
+        type,
+        currentAuthority: 'admin',
+      });
+      access = 'admin';
+      return;
+    }
+    if (password === 'ant.design' && username === 'user') {
+      res.send({
+        status: 'ok',
+        type,
+        currentAuthority: 'user',
+      });
+      access = 'user';
+      return;
+    }
+    if (type === 'mobile') {
+      res.send({
+        status: 'ok',
+        type,
+        currentAuthority: 'admin',
+      });
+      access = 'admin';
+      return;
+    }
+
+    res.send({
+      status: 'error',
+      type,
+      currentAuthority: 'guest',
+    });
+    access = 'guest';
+  },
+  'POST /api/login/outLogin': (req: Request, res: Response) => {
+    access = '';
+    res.send({ data: {}, success: true });
+  },
+  'POST /api/register': (req: Request, res: Response) => {
+    res.send({ status: 'ok', currentAuthority: 'user', success: true });
+  },
+  'GET /api/500': (req: Request, res: Response) => {
+    res.status(500).send({
+      timestamp: 1513932555104,
+      status: 500,
+      error: 'error',
+      message: 'error',
+      path: '/base/category/list',
+    });
+  },
+  'GET /api/404': (req: Request, res: Response) => {
+    res.status(404).send({
+      timestamp: 1513932643431,
+      status: 404,
+      error: 'Not Found',
+      message: 'No message available',
+      path: '/base/category/list/2121212',
+    });
+  },
+  'GET /api/403': (req: Request, res: Response) => {
+    res.status(403).send({
+      timestamp: 1513932555104,
+      status: 403,
+      error: 'Forbidden',
+      message: 'Forbidden',
+      path: '/base/category/list',
+    });
+  },
+  'GET /api/401': (req: Request, res: Response) => {
+    res.status(401).send({
+      timestamp: 1513932555104,
+      status: 401,
+      error: 'Unauthorized',
+      message: 'Unauthorized',
+      path: '/base/category/list',
+    });
+  },
+
+  'GET  /api/login/captcha': getFakeCaptcha,
+};
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..3ac4c0a
--- /dev/null
+++ b/package.json
@@ -0,0 +1,140 @@
+{
+  "name": "ant-design-pro",
+  "version": "6.0.0",
+  "private": true,
+  "description": "An out-of-box UI solution for enterprise applications",
+  "scripts": {
+    "analyze": "cross-env ANALYZE=1 max build",
+    "build": "cross-env API_ENV=production max build",
+    "deploy": "npm run build && npm run gh-pages",
+    "dev": "npm run start:dev --port 8080",
+    "gh-pages": "gh-pages -d dist",
+    "i18n-remove": "pro i18n-remove --locale=zh-CN --write",
+    "postinstall": "max setup",
+    "jest": "jest",
+    "lint": "npm run lint:js && npm run lint:prettier && npm run tsc",
+    "lint-staged": "lint-staged",
+    "lint-staged:js": "eslint --ext .js,.jsx,.ts,.tsx ",
+    "lint:fix": "eslint --fix --cache --ext .js,.jsx,.ts,.tsx --format=pretty ./src ",
+    "lint:js": "eslint --cache --ext .js,.jsx,.ts,.tsx --format=pretty ./src",
+    "lint:prettier": "prettier -c --write \"**/**.{js,jsx,tsx,ts,less,md,json}\" --end-of-line auto",
+    "openapi": "max openapi",
+    "prepare": "husky install",
+    "prettier": "prettier -c --write \"**/**.{js,jsx,tsx,ts,less,md,json}\"",
+    "preview": "npm run build && max preview --port 8080",
+    "record": "cross-env NODE_ENV=development REACT_APP_ENV=test max record --scene=login",
+    "serve": "umi-serve",
+    "start": "cross-env UMI_ENV=dev max dev",
+    "start:dev": "cross-env REACT_APP_ENV=dev MOCK=none UMI_ENV=dev max dev",
+    "start:no-mock": "cross-env MOCK=none UMI_ENV=dev max dev",
+    "start:pre": "cross-env REACT_APP_ENV=pre UMI_ENV=dev max dev",
+    "start:test": "cross-env REACT_APP_ENV=test MOCK=none UMI_ENV=dev max dev",
+    "test": "jest",
+    "test:coverage": "npm run jest -- --coverage",
+    "test:update": "npm run jest -- -u",
+    "tsc": "tsc --noEmit"
+  },
+  "lint-staged": {
+    "**/*.{js,jsx,ts,tsx}": "npm run lint-staged:js",
+    "**/*.{js,jsx,tsx,ts,less,md,json}": [
+      "prettier --write"
+    ]
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions",
+    "not ie <= 10"
+  ],
+  "dependencies": {
+    "@ant-design/charts": "^1.4.2",
+    "@ant-design/icons": "^4.8.0",
+    "@ant-design/pro-components": "^2.6.29",
+    "@ant-design/use-emotion-css": "1.0.4",
+    "@umijs/route-utils": "^2.2.2",
+    "antd": "^5.5.1",
+    "classnames": "^2.3.2",
+    "echarts": "^5.4.3",
+    "echarts-for-react": "^3.0.2",
+    "fabric": "^5.3.0",
+    "js-yaml": "^4.1.0",
+    "lodash": "^4.17.21",
+    "moment": "^2.29.4",
+    "omit.js": "^2.0.2",
+    "prop-types": "^15.8.1",
+    "querystring": "^0.2.1",
+    "rc-menu": "^9.9.2",
+    "rc-util": "^5.32.2",
+    "react": "^18.2.0",
+    "react-cookies": "^0.1.1",
+    "react-dev-inspector": "^1.8.4",
+    "react-dom": "^18.2.0",
+    "react-fabricjs": "^0.1.6",
+    "react-helmet-async": "^1.3.0",
+    "uuid": "^9.0.1",
+    "video.js": "^8.5.2",
+    "webrtc-streamer": "^0.8.3-4-g2d0afce"
+  },
+  "devDependencies": {
+    "@ant-design/pro-cli": "^2.1.5",
+    "@testing-library/react": "^13.4.0",
+    "@types/classnames": "^2.3.1",
+    "@types/express": "^4.17.17",
+    "@types/fabric": "^5.3.6",
+    "@types/history": "^4.7.11",
+    "@types/jest": "^29.5.1",
+    "@types/js-yaml": "^4.0.8",
+    "@types/lodash": "^4.14.195",
+    "@types/react": "^18.2.7",
+    "@types/react-dom": "^18.2.4",
+    "@types/react-helmet": "^6.1.6",
+    "@umijs/fabric": "^2.14.1",
+    "@umijs/lint": "^4.0.69",
+    "@umijs/max": "^4.0.69",
+    "cross-env": "^7.0.3",
+    "eslint": "^8.41.0",
+    "express": "^4.18.2",
+    "gh-pages": "^3.2.3",
+    "husky": "^7.0.4",
+    "jest": "^29.5.0",
+    "jest-environment-jsdom": "^29.5.0",
+    "lint-staged": "^10.5.4",
+    "mockjs": "^1.1.0",
+    "prettier": "^2.8.8",
+    "swagger-ui-dist": "^4.19.0",
+    "ts-node": "^10.9.1",
+    "typescript": "^5.0.0",
+    "umi-presets-pro": "^2.0.3"
+  },
+  "engines": {
+    "node": ">=12.0.0"
+  },
+  "create-umi": {
+    "ignoreScript": [
+      "docker*",
+      "functions*",
+      "site",
+      "generateMock"
+    ],
+    "ignoreDependencies": [
+      "netlify*",
+      "serverless"
+    ],
+    "ignore": [
+      ".dockerignore",
+      ".git",
+      ".github",
+      ".gitpod.yml",
+      "CODE_OF_CONDUCT.md",
+      "Dockerfile",
+      "Dockerfile.*",
+      "lambda",
+      "LICENSE",
+      "netlify.toml",
+      "README.*.md",
+      "azure-pipelines.yml",
+      "docker",
+      "CNAME",
+      "create-umi"
+    ]
+  }
+}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..955c880
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,17463 @@
+lockfileVersion: '6.0'
+
+dependencies:
+  '@ant-design/icons':
+    specifier: ^4.8.0
+    version: 4.8.0(react-dom@18.2.0)(react@18.2.0)
+  '@ant-design/pro-components':
+    specifier: ^2.4.16
+    version: 2.4.16(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+  '@ant-design/use-emotion-css':
+    specifier: 1.0.4
+    version: 1.0.4(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+  '@umijs/route-utils':
+    specifier: ^2.2.2
+    version: 2.2.2
+  antd:
+    specifier: ^5.5.1
+    version: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0)
+  classnames:
+    specifier: ^2.3.2
+    version: 2.3.2
+  lodash:
+    specifier: ^4.17.21
+    version: 4.17.21
+  moment:
+    specifier: ^2.29.4
+    version: 2.29.4
+  omit.js:
+    specifier: ^2.0.2
+    version: 2.0.2
+  querystring:
+    specifier: ^0.2.1
+    version: 0.2.1
+  rc-menu:
+    specifier: ^9.9.2
+    version: 9.9.2(react-dom@18.2.0)(react@18.2.0)
+  rc-util:
+    specifier: ^5.32.2
+    version: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+  react:
+    specifier: ^18.2.0
+    version: 18.2.0
+  react-dev-inspector:
+    specifier: ^1.8.4
+    version: 1.8.4(eslint@8.41.0)(react@18.2.0)(typescript@5.0.2)(webpack@5.84.1)
+  react-dom:
+    specifier: ^18.2.0
+    version: 18.2.0(react@18.2.0)
+  react-helmet-async:
+    specifier: ^1.3.0
+    version: 1.3.0(react-dom@18.2.0)(react@18.2.0)
+
+devDependencies:
+  '@ant-design/pro-cli':
+    specifier: ^2.1.5
+    version: 2.1.5
+  '@testing-library/react':
+    specifier: ^13.4.0
+    version: 13.4.0(react-dom@18.2.0)(react@18.2.0)
+  '@types/classnames':
+    specifier: ^2.3.1
+    version: 2.3.1
+  '@types/express':
+    specifier: ^4.17.17
+    version: 4.17.17
+  '@types/history':
+    specifier: ^4.7.11
+    version: 4.7.11
+  '@types/jest':
+    specifier: ^29.5.1
+    version: 29.5.1
+  '@types/lodash':
+    specifier: ^4.14.195
+    version: 4.14.195
+  '@types/react':
+    specifier: ^18.2.7
+    version: 18.2.7
+  '@types/react-dom':
+    specifier: ^18.2.4
+    version: 18.2.4
+  '@types/react-helmet':
+    specifier: ^6.1.6
+    version: 6.1.6
+  '@umijs/fabric':
+    specifier: ^2.14.1
+    version: 2.14.1
+  '@umijs/lint':
+    specifier: ^4.0.69
+    version: 4.0.69(eslint@8.41.0)(jest@29.5.0)(styled-components@5.3.11)(stylelint@14.16.1)(typescript@5.0.2)
+  '@umijs/max':
+    specifier: ^4.0.69
+    version: 4.0.69(@babel/core@7.22.1)(@types/node@20.2.5)(@types/react-dom@18.2.4)(@types/react@18.2.7)(dva@2.5.0-beta.2)(jest@29.5.0)(postcss@8.4.24)(prettier@2.8.8)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1)
+  cross-env:
+    specifier: ^7.0.3
+    version: 7.0.3
+  eslint:
+    specifier: ^8.41.0
+    version: 8.41.0
+  express:
+    specifier: ^4.18.2
+    version: 4.18.2
+  gh-pages:
+    specifier: ^3.2.3
+    version: 3.2.3
+  husky:
+    specifier: ^7.0.4
+    version: 7.0.4
+  jest:
+    specifier: ^29.5.0
+    version: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1)
+  jest-environment-jsdom:
+    specifier: ^29.5.0
+    version: 29.5.0
+  lint-staged:
+    specifier: ^10.5.4
+    version: 10.5.4
+  mockjs:
+    specifier: ^1.1.0
+    version: 1.1.0
+  prettier:
+    specifier: ^2.8.8
+    version: 2.8.8
+  swagger-ui-dist:
+    specifier: ^4.19.0
+    version: 4.19.0
+  ts-node:
+    specifier: ^10.9.1
+    version: 10.9.1(@types/node@20.2.5)(typescript@5.0.2)
+  typescript:
+    specifier: ^5.0.0
+    version: 5.0.2
+  umi-presets-pro:
+    specifier: ^2.0.3
+    version: 2.0.3(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@5.5.1)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)(umi@4.0.69)
+
+packages:
+
+  /@ahooksjs/use-request@2.8.15(react@18.2.0):
+    resolution: {integrity: sha512-xhVaM4fyIiAMdVFuuU5i3CFUdFa/IblF+fvITVMFaUEO3w/V5tVCAF6WIA3T03n1/RPuzRkA7Ao1PFtSGtGelw==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0
+    dependencies:
+      lodash.debounce: 4.0.8
+      lodash.throttle: 4.1.1
+      react: 18.2.0
+    dev: true
+
+  /@alita/babel-transform-jsx-class@0.0.2:
+    resolution: {integrity: sha512-TW4KukvBsmMcebUWfquhFQ36Uo+wFrRB4NiimXhtQ+QXrYBmHoVm5GgVojQ3AJKIAjTVicYsz4lEo/MPN+ZgNw==}
+    dev: true
+
+  /@alita/inspx@0.0.2(react@18.2.0):
+    resolution: {integrity: sha512-NylAZjHY1jIyO5a58WaPSzZbR39idg8tGyUl4YLBiSmU0lvkl/K9C77TexPQMUHhzauelmmhBht2FRoA77U0tQ==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      react: '>=16'
+    dependencies:
+      '@radix-ui/popper': 0.0.10
+      react: 18.2.0
+    dev: true
+
+  /@alita/plugins@3.2.22(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@5.5.1)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-6u2G48dsBj5s+BM2KhtyVDUqUhXkrOpSaqccSfA+HSJO9B4QeyjCpFZFNSL1pXBEd/M+f+e9bxQvipsuAmR+yg==}
+    dependencies:
+      '@alita/babel-transform-jsx-class': 0.0.2
+      '@alita/inspx': 0.0.2(react@18.2.0)
+      '@alita/request': 3.1.1
+      '@alita/types': 3.1.1
+      '@umijs/bundler-utils': 4.0.59
+      '@umijs/plugins': 4.0.59(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@5.5.1)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@umijs/utils': 4.0.59
+      ahooks: 3.7.7(react@18.2.0)
+      antd-mobile-alita: 2.3.4(react-dom@18.2.0)(react@18.2.0)
+      antd-mobile-icons: 0.2.2
+      babel-plugin-import: 1.13.6
+      babel-runtime-jsx-plus: 0.1.5
+      classnames: 2.3.2
+      dva-core: 2.0.4(redux@3.7.2)
+      dva-immer: 1.0.1(dva@2.5.0-beta.2)
+      dva-loading: 3.0.24(dva-core@2.0.4)
+      history: 5.3.0
+      react-redux: 7.2.9(react-dom@18.2.0)(react@18.2.0)
+      react-router-dom: 6.11.2(react-dom@18.2.0)(react@18.2.0)
+      redux: 4.2.1
+      semver: 7.3.5
+    transitivePeerDependencies:
+      - '@types/lodash.merge'
+      - '@types/react'
+      - '@types/react-dom'
+      - antd
+      - babel-plugin-styled-components
+      - debug
+      - dva
+      - prop-types
+      - rc-field-form
+      - react
+      - react-dom
+      - react-native
+      - shallowequal
+      - stylis
+      - supports-color
+    dev: true
+
+  /@alita/request@3.1.1:
+    resolution: {integrity: sha512-edz76AKAanJo7u2V4seomF4chlHi4rfl9T1hTNbothmd786lEgdDGOnItqilc/twTiLZjECJS43Un4/pttalyQ==}
+    dependencies:
+      umi-request: 1.4.0
+    dev: true
+
+  /@alita/types@3.1.1:
+    resolution: {integrity: sha512-yxejISI2ZwHI1iQCTTXz2axNji3i4Wgfvg3u0c7HtjGpG3JKql0iTVGVHDXtEhIs2CKLb4+TBWcRhEDxW+mECg==}
+    dev: true
+
+  /@ampproject/remapping@2.2.1:
+    resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==}
+    engines: {node: '>=6.0.0'}
+    dependencies:
+      '@jridgewell/gen-mapping': 0.3.3
+      '@jridgewell/trace-mapping': 0.3.18
+
+  /@ant-design/antd-theme-variable@1.0.0:
+    resolution: {integrity: sha512-0vr5GCwM7xlAl6NxG1lPbABO+SYioNJL3HVy2FA8wTlsIMoZvQwcwsxTw6eLQCiN9V2UQ8kBtfz8DW8utVVE5w==}
+    dev: true
+
+  /@ant-design/colors@6.0.0:
+    resolution: {integrity: sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==}
+    dependencies:
+      '@ctrl/tinycolor': 3.6.0
+
+  /@ant-design/colors@7.0.0:
+    resolution: {integrity: sha512-iVm/9PfGCbC0dSMBrz7oiEXZaaGH7ceU40OJEfKmyuzR9R5CRimJYPlRiFtMQGQcbNMea/ePcoIebi4ASGYXtg==}
+    dependencies:
+      '@ctrl/tinycolor': 3.6.0
+
+  /@ant-design/cssinjs@1.9.1(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-CZt1vCMs/sY7RoacYuIkZwQmb8Bhp99ReNNE9Y8lnUzik8fmCdKAQA7ecvVOFwmNFdcBHga7ye/XIRrsbkiqWw==}
+    peerDependencies:
+      react: '>=16.0.0'
+      react-dom: '>=16.0.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@emotion/hash': 0.8.0
+      '@emotion/unitless': 0.7.5
+      classnames: 2.3.2
+      csstype: 3.1.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      stylis: 4.2.0
+
+  /@ant-design/icons-svg@4.2.1:
+    resolution: {integrity: sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==}
+
+  /@ant-design/icons@4.8.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-T89P2jG2vM7OJ0IfGx2+9FC5sQjtTzRSz+mCHTXkFn/ELZc2YpfStmYHmqzq2Jx55J0F7+O6i5/ZKFSVNWCKNg==}
+    engines: {node: '>=8'}
+    peerDependencies:
+      react: '>=16.0.0'
+      react-dom: '>=16.0.0'
+    dependencies:
+      '@ant-design/colors': 6.0.0
+      '@ant-design/icons-svg': 4.2.1
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /@ant-design/icons@5.1.3(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-vajYXDkzRQevAJwXgbFzVJ3970nKYqGjX+0+L5/FJcPbItSco32U1k06K9wC0OochLfL/z0U13JN1BsniqMYsA==}
+    engines: {node: '>=8'}
+    peerDependencies:
+      react: '>=16.0.0'
+      react-dom: '>=16.0.0'
+    dependencies:
+      '@ant-design/colors': 7.0.0
+      '@ant-design/icons-svg': 4.2.1
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /@ant-design/moment-webpack-plugin@0.0.3:
+    resolution: {integrity: sha512-MLm1FUpg02fP615ShQnCUN9la2E4RylDxKyolkGqAWTIHO4HyGM0A5x71AMALEyP/bC+UEEWBGSQ+D4/8hQ+ww==}
+    dev: true
+
+  /@ant-design/pro-card@2.4.9(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-vWISREOB0eZgFQlTxc3ulmGBfG9Ivymw6eHpVL/BWGVlgviIwtXA0iHi3jlQrlC020MapvXJ/h7ZfK7onVDGhQ==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+    dependencies:
+      '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-provider': 2.9.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-utils': 2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      antd: 4.24.10(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      omit.js: 2.0.2
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+    transitivePeerDependencies:
+      - react-dom
+    dev: true
+
+  /@ant-design/pro-card@2.4.9(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-vWISREOB0eZgFQlTxc3ulmGBfG9Ivymw6eHpVL/BWGVlgviIwtXA0iHi3jlQrlC020MapvXJ/h7ZfK7onVDGhQ==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+    dependencies:
+      '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-provider': 2.9.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-utils': 2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      omit.js: 2.0.2
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+    transitivePeerDependencies:
+      - react-dom
+
+  /@ant-design/pro-cli@2.1.5:
+    resolution: {integrity: sha512-nFdVRlKRFh6UcjKmkEnpImCz3mOCMz1u6lo9IIVo2lwlbNInc5EZxXfJJm4tAXUSrOfsiIl/Iwc2bsQ5xJBLeA==}
+    hasBin: true
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/generator': 7.22.3
+      '@babel/parser': 7.22.3
+      '@babel/traverse': 7.22.1(supports-color@5.5.0)
+      '@babel/types': 7.22.3
+      '@umijs/fabric': 2.14.1
+      babel-types: 6.26.0
+      blink-diff: 1.0.13
+      carlo: 0.9.46
+      chalk: 4.1.2
+      cross-port-killer: 1.4.0
+      eslint: 7.32.0
+      execa: 5.1.1
+      getnpmregistry: 1.0.1
+      glob: 7.2.3
+      import-fresh: 3.3.0
+      intl-messageformat: 9.13.0
+      lodash.groupby: 4.6.0
+      node-fetch: 2.6.11
+      node-import-ts: 1.0.6
+      ora: 5.4.1
+      pngjs-image: 0.11.7
+      prettier: 2.8.8
+      rimraf: 3.0.2
+      semver: 7.5.1
+      typescript: 4.9.5
+      umi-utils: 1.7.3
+      yargs-parser: 20.2.9
+    transitivePeerDependencies:
+      - bufferutil
+      - encoding
+      - postcss-jsx
+      - postcss-markdown
+      - supports-color
+      - utf-8-validate
+    dev: true
+
+  /@ant-design/pro-components@2.4.16(antd@4.24.10)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-BfB4cZV2kRDYLFjWfHuwxjl2YbDYFeX1NC0kHjs4DnY14+nMPak6sTkLC/xJhTb7MlHFMm+QsBeYnr+gcJUtog==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+      react-dom: '>=17.0.0'
+    dependencies:
+      '@ant-design/pro-card': 2.4.9(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-descriptions': 2.2.13(antd@4.24.10)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-field': 2.8.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-form': 2.12.1(antd@4.24.10)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-layout': 7.13.5(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-list': 2.3.14(antd@4.24.10)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-provider': 2.9.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-skeleton': 2.1.3(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-table': 3.6.11(antd@4.24.10)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-utils': 2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      antd: 4.24.10(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    transitivePeerDependencies:
+      - '@types/lodash.merge'
+      - prop-types
+      - rc-field-form
+    dev: true
+
+  /@ant-design/pro-components@2.4.16(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-BfB4cZV2kRDYLFjWfHuwxjl2YbDYFeX1NC0kHjs4DnY14+nMPak6sTkLC/xJhTb7MlHFMm+QsBeYnr+gcJUtog==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+      react-dom: '>=17.0.0'
+    dependencies:
+      '@ant-design/pro-card': 2.4.9(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-descriptions': 2.2.13(antd@5.5.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-field': 2.8.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-form': 2.12.1(antd@5.5.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-layout': 7.13.5(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-list': 2.3.14(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-provider': 2.9.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-skeleton': 2.1.3(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-table': 3.6.11(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-utils': 2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    transitivePeerDependencies:
+      - '@types/lodash.merge'
+      - prop-types
+      - rc-field-form
+
+  /@ant-design/pro-descriptions@2.2.13(antd@4.24.10)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-qBSJ60dNe2MKOgA4CkJYuSIepVsqvhicWgXdlALlz/m+RrI54RJl0r5rzw9KjmKjv03fnWOn31B8p8gEk+/5Bw==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+    dependencies:
+      '@ant-design/pro-field': 2.8.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-form': 2.12.1(antd@4.24.10)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-skeleton': 2.1.3(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-utils': 2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      antd: 4.24.10(react-dom@18.2.0)(react@18.2.0)
+      rc-resize-observer: 0.2.6(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      use-json-comparison: 1.0.6(react@18.2.0)
+    transitivePeerDependencies:
+      - '@types/lodash.merge'
+      - rc-field-form
+      - react-dom
+    dev: true
+
+  /@ant-design/pro-descriptions@2.2.13(antd@5.5.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-qBSJ60dNe2MKOgA4CkJYuSIepVsqvhicWgXdlALlz/m+RrI54RJl0r5rzw9KjmKjv03fnWOn31B8p8gEk+/5Bw==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+    dependencies:
+      '@ant-design/pro-field': 2.8.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-form': 2.12.1(antd@5.5.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-skeleton': 2.1.3(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-utils': 2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0)
+      rc-resize-observer: 0.2.6(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      use-json-comparison: 1.0.6(react@18.2.0)
+    transitivePeerDependencies:
+      - '@types/lodash.merge'
+      - rc-field-form
+      - react-dom
+
+  /@ant-design/pro-field@2.8.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-Itie+CqjiS9AfcDhTFdFOMXFAcwBa+w+On6KAcZiYfs9swE54ydAmkTqoJNADNbRihQ3p3575KVeBo/XgYexUA==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+    dependencies:
+      '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-provider': 2.9.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-utils': 2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      '@chenshuai2144/sketch-color': 1.0.9(react@18.2.0)
+      antd: 4.24.10(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      dayjs: 1.11.7
+      lodash.tonumber: 4.0.3
+      omit.js: 2.0.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      swr: 2.1.5(react@18.2.0)
+    transitivePeerDependencies:
+      - react-dom
+    dev: true
+
+  /@ant-design/pro-field@2.8.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-Itie+CqjiS9AfcDhTFdFOMXFAcwBa+w+On6KAcZiYfs9swE54ydAmkTqoJNADNbRihQ3p3575KVeBo/XgYexUA==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+    dependencies:
+      '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-provider': 2.9.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-utils': 2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      '@chenshuai2144/sketch-color': 1.0.9(react@18.2.0)
+      antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      dayjs: 1.11.7
+      lodash.tonumber: 4.0.3
+      omit.js: 2.0.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      swr: 2.1.5(react@18.2.0)
+    transitivePeerDependencies:
+      - react-dom
+
+  /@ant-design/pro-form@2.12.1(antd@4.24.10)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-MgIsJEf136jHPWZr341ukSrhW5geWp/LSazEafS/tT/AxPoZ4YCAd6c/ca/H99LmDBkO0NDFvRcLmndIrkR79Q==}
+    peerDependencies:
+      '@types/lodash.merge': ^4.6.7
+      antd: '>=4.23.0'
+      rc-field-form: ^1.22.0
+      react: '>=17.0.0'
+      react-dom: '>=17.0.0'
+    peerDependenciesMeta:
+      '@types/lodash.merge':
+        optional: true
+    dependencies:
+      '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-field': 2.8.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-provider': 2.9.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-utils': 2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      '@chenshuai2144/sketch-color': 1.0.9(react@18.2.0)
+      '@umijs/use-params': 1.0.9(react@18.2.0)
+      antd: 4.24.10(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      lodash.merge: 4.6.2
+      omit.js: 2.0.2
+      rc-field-form: 1.32.0(react-dom@18.2.0)(react@18.2.0)
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      use-json-comparison: 1.0.6(react@18.2.0)
+      use-media-antd-query: 1.1.0(react@18.2.0)
+    dev: true
+
+  /@ant-design/pro-form@2.12.1(antd@5.5.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-MgIsJEf136jHPWZr341ukSrhW5geWp/LSazEafS/tT/AxPoZ4YCAd6c/ca/H99LmDBkO0NDFvRcLmndIrkR79Q==}
+    peerDependencies:
+      '@types/lodash.merge': ^4.6.7
+      antd: '>=4.23.0'
+      rc-field-form: ^1.22.0
+      react: '>=17.0.0'
+      react-dom: '>=17.0.0'
+    peerDependenciesMeta:
+      '@types/lodash.merge':
+        optional: true
+    dependencies:
+      '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-field': 2.8.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-provider': 2.9.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-utils': 2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      '@chenshuai2144/sketch-color': 1.0.9(react@18.2.0)
+      '@umijs/use-params': 1.0.9(react@18.2.0)
+      antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      lodash.merge: 4.6.2
+      omit.js: 2.0.2
+      rc-field-form: 1.32.0(react-dom@18.2.0)(react@18.2.0)
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      use-json-comparison: 1.0.6(react@18.2.0)
+      use-media-antd-query: 1.1.0(react@18.2.0)
+
+  /@ant-design/pro-layout@7.13.5(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-bSjCMwRn7eQJkzl7SiStL6+OXWJuAKyA06/iN0nJN9YR4ntryMGnBWYgYTxqaOisl5vhqPnJMmYRsEBv+dnzsQ==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+      react-dom: '>=17.0.0'
+    dependencies:
+      '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-provider': 2.9.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-utils': 2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      '@umijs/route-utils': 4.0.1
+      '@umijs/use-params': 1.0.9(react@18.2.0)
+      antd: 4.24.10(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      lodash.merge: 4.6.2
+      omit.js: 2.0.2
+      path-to-regexp: 2.4.0
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      swr: 2.1.5(react@18.2.0)
+      use-json-comparison: 1.0.6(react@18.2.0)
+      use-media-antd-query: 1.1.0(react@18.2.0)
+      warning: 4.0.3
+    dev: true
+
+  /@ant-design/pro-layout@7.13.5(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-bSjCMwRn7eQJkzl7SiStL6+OXWJuAKyA06/iN0nJN9YR4ntryMGnBWYgYTxqaOisl5vhqPnJMmYRsEBv+dnzsQ==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+      react-dom: '>=17.0.0'
+    dependencies:
+      '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-provider': 2.9.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-utils': 2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      '@umijs/route-utils': 4.0.1
+      '@umijs/use-params': 1.0.9(react@18.2.0)
+      antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      lodash.merge: 4.6.2
+      omit.js: 2.0.2
+      path-to-regexp: 2.4.0
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      swr: 2.1.5(react@18.2.0)
+      use-json-comparison: 1.0.6(react@18.2.0)
+      use-media-antd-query: 1.1.0(react@18.2.0)
+      warning: 4.0.3
+
+  /@ant-design/pro-list@2.3.14(antd@4.24.10)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-V5PeWCUzIiyefPeNMCE96QVY+rY/yY4rXmtQe+3rugM3CO0rdejLq/IBpkntozGWqS4a9/tXzlwtj1UzgWrZ9Q==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+      react-dom: '>=17.0.0'
+    dependencies:
+      '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-card': 2.4.9(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-field': 2.8.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-table': 3.6.11(antd@4.24.10)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-utils': 2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      antd: 4.24.10(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      dayjs: 1.11.7
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 4.21.1
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      use-media-antd-query: 1.1.0(react@18.2.0)
+    transitivePeerDependencies:
+      - '@types/lodash.merge'
+      - prop-types
+      - rc-field-form
+    dev: true
+
+  /@ant-design/pro-list@2.3.14(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-V5PeWCUzIiyefPeNMCE96QVY+rY/yY4rXmtQe+3rugM3CO0rdejLq/IBpkntozGWqS4a9/tXzlwtj1UzgWrZ9Q==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+      react-dom: '>=17.0.0'
+    dependencies:
+      '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-card': 2.4.9(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-field': 2.8.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-table': 3.6.11(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-utils': 2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      dayjs: 1.11.7
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 4.21.1
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      use-media-antd-query: 1.1.0(react@18.2.0)
+    transitivePeerDependencies:
+      - '@types/lodash.merge'
+      - prop-types
+      - rc-field-form
+
+  /@ant-design/pro-provider@2.9.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-ocUVpXLdzkCL23R1b6No5oBzD/6izrE27VRtxEwaGFDIkH83BfaOxyP76QjMpKWXc0UKwuOW4mfWdBFuRstj7Q==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+      react-dom: '>=17.0.0'
+    dependencies:
+      '@ant-design/cssinjs': 1.9.1(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      '@ctrl/tinycolor': 3.6.0
+      antd: 4.24.10(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      swr: 2.1.5(react@18.2.0)
+    dev: true
+
+  /@ant-design/pro-provider@2.9.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-ocUVpXLdzkCL23R1b6No5oBzD/6izrE27VRtxEwaGFDIkH83BfaOxyP76QjMpKWXc0UKwuOW4mfWdBFuRstj7Q==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+      react-dom: '>=17.0.0'
+    dependencies:
+      '@ant-design/cssinjs': 1.9.1(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      '@ctrl/tinycolor': 3.6.0
+      antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      swr: 2.1.5(react@18.2.0)
+
+  /@ant-design/pro-skeleton@2.1.3(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-Vp1PW9E6DVBa9Udf6la/8Kgk+rVTjTybZLk4y0CyNLa7hx+tqGiNSgQtk6Ps8ssyurY78OvTc2Cs8GHMFIVY3Q==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+      react-dom: '>=17.0.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      antd: 4.24.10(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      use-media-antd-query: 1.1.0(react@18.2.0)
+    dev: true
+
+  /@ant-design/pro-skeleton@2.1.3(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-Vp1PW9E6DVBa9Udf6la/8Kgk+rVTjTybZLk4y0CyNLa7hx+tqGiNSgQtk6Ps8ssyurY78OvTc2Cs8GHMFIVY3Q==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+      react-dom: '>=17.0.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      use-media-antd-query: 1.1.0(react@18.2.0)
+
+  /@ant-design/pro-table@3.6.11(antd@4.24.10)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-9FDMkggZ1xgTsK5KawECnD1XxJB7CmLcCu2fNNdK0XH+YIO1LapXVOuspRlGKrdJi4BXB73t2HG+KLGIAayfyg==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      rc-field-form: ^1.22.0
+      react: '>=17.0.0'
+      react-dom: '>=17.0.0'
+    dependencies:
+      '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-card': 2.4.9(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-field': 2.8.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-form': 2.12.1(antd@4.24.10)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-provider': 2.9.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-utils': 2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      antd: 4.24.10(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      dayjs: 1.11.7
+      omit.js: 2.0.2
+      rc-field-form: 1.32.0(react-dom@18.2.0)(react@18.2.0)
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      react-sortable-hoc: 2.0.0(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0)
+      use-json-comparison: 1.0.6(react@18.2.0)
+    transitivePeerDependencies:
+      - '@types/lodash.merge'
+      - prop-types
+    dev: true
+
+  /@ant-design/pro-table@3.6.11(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-9FDMkggZ1xgTsK5KawECnD1XxJB7CmLcCu2fNNdK0XH+YIO1LapXVOuspRlGKrdJi4BXB73t2HG+KLGIAayfyg==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      rc-field-form: ^1.22.0
+      react: '>=17.0.0'
+      react-dom: '>=17.0.0'
+    dependencies:
+      '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-card': 2.4.9(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-field': 2.8.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-form': 2.12.1(antd@5.5.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-provider': 2.9.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-utils': 2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      dayjs: 1.11.7
+      omit.js: 2.0.2
+      rc-field-form: 1.32.0(react-dom@18.2.0)(react@18.2.0)
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      react-sortable-hoc: 2.0.0(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0)
+      use-json-comparison: 1.0.6(react@18.2.0)
+    transitivePeerDependencies:
+      - '@types/lodash.merge'
+      - prop-types
+
+  /@ant-design/pro-utils@2.10.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-gS3dPoSMFA9iKazpSokRjpXP2babnTn4Sr52q/NREzKZMltmHnow82u9/GeRXEzKRwD3fdQJBUOgVuVDpQ4skw==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+      react-dom: '>=17.0.0'
+    dependencies:
+      '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-provider': 2.9.0(antd@4.24.10)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      antd: 4.24.10(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      dayjs: 1.11.7
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      swr: 2.1.5(react@18.2.0)
+    dev: true
+
+  /@ant-design/pro-utils@2.10.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-gS3dPoSMFA9iKazpSokRjpXP2babnTn4Sr52q/NREzKZMltmHnow82u9/GeRXEzKRwD3fdQJBUOgVuVDpQ4skw==}
+    peerDependencies:
+      antd: '>=4.23.0'
+      react: '>=17.0.0'
+      react-dom: '>=17.0.0'
+    dependencies:
+      '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-provider': 2.9.0(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      dayjs: 1.11.7
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      swr: 2.1.5(react@18.2.0)
+
+  /@ant-design/react-slick@0.29.2(react@18.2.0):
+    resolution: {integrity: sha512-kgjtKmkGHa19FW21lHnAfyyH9AAoh35pBdcJ53rHmQ3O+cfFHGHnUbj/HFrRNJ5vIts09FKJVAD8RpaC+RaWfA==}
+    peerDependencies:
+      react: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      json2mq: 0.2.0
+      lodash: 4.17.21
+      react: 18.2.0
+      resize-observer-polyfill: 1.5.1
+    dev: true
+
+  /@ant-design/react-slick@1.0.1(react@18.2.0):
+    resolution: {integrity: sha512-ARM0TmpGdDuUVE10NwUCENQlJSInNKo5NiBjL5szu5BxWNEHNwQMcDrlVCqFbkvFLy+2CvywW8Y59QJtC0YDag==}
+    peerDependencies:
+      react: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      json2mq: 0.2.0
+      react: 18.2.0
+      resize-observer-polyfill: 1.5.1
+      throttle-debounce: 5.0.0
+
+  /@ant-design/use-emotion-css@1.0.4(antd@5.5.1)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-PekXeeHCpSNi6ziV62gy2Yy2MijssiVMaCJbbyOmPbeZJYQmB4FecJwlB+e2WuIbSHQdM3O9pyN4Cx3GJKxJkA==}
+    peerDependencies:
+      antd: '>=5.0.0'
+      react: '>=17.0.0'
+      react-dom: '>=17.0.0'
+    dependencies:
+      '@emotion/css': 11.11.0
+      antd: 5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: false
+
+  /@antfu/install-pkg@0.1.1:
+    resolution: {integrity: sha512-LyB/8+bSfa0DFGC06zpCEfs89/XoWZwws5ygEa5D+Xsm3OfI+aXQ86VgVG7Acyef+rSZ5HE7J8rrxzrQeM3PjQ==}
+    dependencies:
+      execa: 5.1.1
+      find-up: 5.0.0
+    dev: true
+
+  /@antfu/utils@0.7.2:
+    resolution: {integrity: sha512-vy9fM3pIxZmX07dL+VX1aZe7ynZ+YyB0jY+jE6r3hOK6GNY2t6W8rzpFC4tgpbXUYABkFQwgJq2XYXlxbXAI0g==}
+    dev: true
+
+  /@babel/cli@7.21.5(@babel/core@7.22.1):
+    resolution: {integrity: sha512-TOKytQ9uQW9c4np8F+P7ZfPINy5Kv+pizDIUwSVH8X5zHgYHV4AA8HE5LA450xXeu4jEfmUckTYvv1I4S26M/g==}
+    engines: {node: '>=6.9.0'}
+    hasBin: true
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@jridgewell/trace-mapping': 0.3.18
+      commander: 4.1.1
+      convert-source-map: 1.9.0
+      fs-readdir-recursive: 1.1.0
+      glob: 7.2.3
+      make-dir: 2.1.0
+      slash: 2.0.0
+    optionalDependencies:
+      '@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3
+      chokidar: 3.5.3
+    dev: true
+
+  /@babel/code-frame@7.12.11:
+    resolution: {integrity: sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==}
+    dependencies:
+      '@babel/highlight': 7.18.6
+    dev: true
+
+  /@babel/code-frame@7.21.4:
+    resolution: {integrity: sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/highlight': 7.18.6
+
+  /@babel/compat-data@7.22.3:
+    resolution: {integrity: sha512-aNtko9OPOwVESUFp3MZfD8Uzxl7JzSeJpd7npIoxCasU37PFbAQRpKglkaKwlHOyeJdrREpo8TW8ldrkYWwvIQ==}
+    engines: {node: '>=6.9.0'}
+
+  /@babel/core@7.21.0:
+    resolution: {integrity: sha512-PuxUbxcW6ZYe656yL3EAhpy7qXKq0DmYsrJLpbB8XrsCP9Nm+XCg9XFMb5vIDliPD7+U/+M+QJlH17XOcB7eXA==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@ampproject/remapping': 2.2.1
+      '@babel/code-frame': 7.21.4
+      '@babel/generator': 7.22.3
+      '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.21.0)
+      '@babel/helper-module-transforms': 7.22.1
+      '@babel/helpers': 7.22.3
+      '@babel/parser': 7.22.3
+      '@babel/template': 7.21.9
+      '@babel/traverse': 7.22.1(supports-color@5.5.0)
+      '@babel/types': 7.22.3
+      convert-source-map: 1.9.0
+      debug: 4.3.4(supports-color@5.5.0)
+      gensync: 1.0.0-beta.2
+      json5: 2.2.3
+      semver: 6.3.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/core@7.22.1:
+    resolution: {integrity: sha512-Hkqu7J4ynysSXxmAahpN1jjRwVJ+NdpraFLIWflgjpVob3KNyK3/tIUc7Q7szed8WMp0JNa7Qtd1E9Oo22F9gA==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@ampproject/remapping': 2.2.1
+      '@babel/code-frame': 7.21.4
+      '@babel/generator': 7.22.3
+      '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-module-transforms': 7.22.1
+      '@babel/helpers': 7.22.3
+      '@babel/parser': 7.22.3
+      '@babel/template': 7.21.9
+      '@babel/traverse': 7.22.1(supports-color@5.5.0)
+      '@babel/types': 7.22.3
+      convert-source-map: 1.9.0
+      debug: 4.3.4(supports-color@5.5.0)
+      gensync: 1.0.0-beta.2
+      json5: 2.2.3
+      semver: 6.3.0
+    transitivePeerDependencies:
+      - supports-color
+
+  /@babel/eslint-parser@7.19.1(@babel/core@7.21.0)(eslint@8.35.0):
+    resolution: {integrity: sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0}
+    peerDependencies:
+      '@babel/core': '>=7.11.0'
+      eslint: ^7.5.0 || ^8.0.0
+    dependencies:
+      '@babel/core': 7.21.0
+      '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1
+      eslint: 8.35.0
+      eslint-visitor-keys: 2.1.0
+      semver: 6.3.0
+    dev: true
+
+  /@babel/eslint-parser@7.19.1(@babel/core@7.21.0)(eslint@8.41.0):
+    resolution: {integrity: sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0}
+    peerDependencies:
+      '@babel/core': '>=7.11.0'
+      eslint: ^7.5.0 || ^8.0.0
+    dependencies:
+      '@babel/core': 7.21.0
+      '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1
+      eslint: 8.41.0
+      eslint-visitor-keys: 2.1.0
+      semver: 6.3.0
+    dev: true
+
+  /@babel/eslint-parser@7.21.8(@babel/core@7.22.1)(eslint@7.32.0):
+    resolution: {integrity: sha512-HLhI+2q+BP3sf78mFUZNCGc10KEmoUqtUT1OCdMZsN+qr4qFeLUod62/zAnF3jNQstwyasDkZnVXwfK2Bml7MQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0}
+    peerDependencies:
+      '@babel/core': '>=7.11.0'
+      eslint: ^7.5.0 || ^8.0.0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1
+      eslint: 7.32.0
+      eslint-visitor-keys: 2.1.0
+      semver: 6.3.0
+    dev: true
+
+  /@babel/generator@7.22.3:
+    resolution: {integrity: sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.22.3
+      '@jridgewell/gen-mapping': 0.3.3
+      '@jridgewell/trace-mapping': 0.3.18
+      jsesc: 2.5.2
+
+  /@babel/helper-annotate-as-pure@7.18.6:
+    resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.22.3
+    dev: true
+
+  /@babel/helper-builder-binary-assignment-operator-visitor@7.22.3:
+    resolution: {integrity: sha512-ahEoxgqNoYXm0k22TvOke48i1PkavGu0qGCmcq9ugi6gnmvKNaMjKBSrZTnWUi1CFEeNAUiVba0Wtzm03aSkJg==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.22.3
+    dev: true
+
+  /@babel/helper-compilation-targets@7.22.1(@babel/core@7.21.0):
+    resolution: {integrity: sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+    dependencies:
+      '@babel/compat-data': 7.22.3
+      '@babel/core': 7.21.0
+      '@babel/helper-validator-option': 7.21.0
+      browserslist: 4.21.6
+      lru-cache: 5.1.1
+      semver: 6.3.0
+    dev: true
+
+  /@babel/helper-compilation-targets@7.22.1(@babel/core@7.22.1):
+    resolution: {integrity: sha512-Rqx13UM3yVB5q0D/KwQ8+SPfX/+Rnsy1Lw1k/UwOC4KC6qrzIQoY3lYnBu5EHKBlEHHcj0M0W8ltPSkD8rqfsQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+    dependencies:
+      '@babel/compat-data': 7.22.3
+      '@babel/core': 7.22.1
+      '@babel/helper-validator-option': 7.21.0
+      browserslist: 4.21.6
+      lru-cache: 5.1.1
+      semver: 6.3.0
+
+  /@babel/helper-create-class-features-plugin@7.22.1(@babel/core@7.22.1):
+    resolution: {integrity: sha512-SowrZ9BWzYFgzUMwUmowbPSGu6CXL5MSuuCkG3bejahSpSymioPmuLdhPxNOc9MjuNGjy7M/HaXvJ8G82Lywlw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-annotate-as-pure': 7.18.6
+      '@babel/helper-environment-visitor': 7.22.1
+      '@babel/helper-function-name': 7.21.0
+      '@babel/helper-member-expression-to-functions': 7.22.3
+      '@babel/helper-optimise-call-expression': 7.18.6
+      '@babel/helper-replace-supers': 7.22.1
+      '@babel/helper-skip-transparent-expression-wrappers': 7.20.0
+      '@babel/helper-split-export-declaration': 7.18.6
+      semver: 6.3.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/helper-create-regexp-features-plugin@7.22.1(@babel/core@7.22.1):
+    resolution: {integrity: sha512-WWjdnfR3LPIe+0EY8td7WmjhytxXtjKAEpnAxun/hkNiyOaPlvGK+NZaBFIdi9ndYV3Gav7BpFvtUwnaJlwi1w==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-annotate-as-pure': 7.18.6
+      regexpu-core: 5.3.2
+      semver: 6.3.0
+    dev: true
+
+  /@babel/helper-define-polyfill-provider@0.4.0(@babel/core@7.22.1):
+    resolution: {integrity: sha512-RnanLx5ETe6aybRi1cO/edaRH+bNYWaryCEmjDDYyNr4wnSzyOp8T0dWipmqVHKEY3AbVKUom50AKSlj1zmKbg==}
+    peerDependencies:
+      '@babel/core': ^7.4.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+      debug: 4.3.4(supports-color@5.5.0)
+      lodash.debounce: 4.0.8
+      resolve: 1.22.2
+      semver: 6.3.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/helper-environment-visitor@7.22.1:
+    resolution: {integrity: sha512-Z2tgopurB/kTbidvzeBrc2To3PUP/9i5MUe+fU6QJCQDyPwSH2oRapkLw3KGECDYSjhQZCNxEvNvZlLw8JjGwA==}
+    engines: {node: '>=6.9.0'}
+
+  /@babel/helper-function-name@7.21.0:
+    resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/template': 7.21.9
+      '@babel/types': 7.22.3
+
+  /@babel/helper-hoist-variables@7.18.6:
+    resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.22.3
+
+  /@babel/helper-member-expression-to-functions@7.22.3:
+    resolution: {integrity: sha512-Gl7sK04b/2WOb6OPVeNy9eFKeD3L6++CzL3ykPOWqTn08xgYYK0wz4TUh2feIImDXxcVW3/9WQ1NMKY66/jfZA==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.22.3
+    dev: true
+
+  /@babel/helper-module-imports@7.21.4:
+    resolution: {integrity: sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.22.3
+
+  /@babel/helper-module-transforms@7.22.1:
+    resolution: {integrity: sha512-dxAe9E7ySDGbQdCVOY/4+UcD8M9ZFqZcZhSPsPacvCG4M+9lwtDDQfI2EoaSvmf7W/8yCBkGU0m7Pvt1ru3UZw==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/helper-environment-visitor': 7.22.1
+      '@babel/helper-module-imports': 7.21.4
+      '@babel/helper-simple-access': 7.21.5
+      '@babel/helper-split-export-declaration': 7.18.6
+      '@babel/helper-validator-identifier': 7.19.1
+      '@babel/template': 7.21.9
+      '@babel/traverse': 7.22.1(supports-color@5.5.0)
+      '@babel/types': 7.22.3
+    transitivePeerDependencies:
+      - supports-color
+
+  /@babel/helper-optimise-call-expression@7.18.6:
+    resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.22.3
+    dev: true
+
+  /@babel/helper-plugin-utils@7.21.5:
+    resolution: {integrity: sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==}
+    engines: {node: '>=6.9.0'}
+    dev: true
+
+  /@babel/helper-remap-async-to-generator@7.18.9(@babel/core@7.22.1):
+    resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-annotate-as-pure': 7.18.6
+      '@babel/helper-environment-visitor': 7.22.1
+      '@babel/helper-wrap-function': 7.20.5
+      '@babel/types': 7.22.3
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/helper-replace-supers@7.22.1:
+    resolution: {integrity: sha512-ut4qrkE4AuSfrwHSps51ekR1ZY/ygrP1tp0WFm8oVq6nzc/hvfV/22JylndIbsf2U2M9LOMwiSddr6y+78j+OQ==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/helper-environment-visitor': 7.22.1
+      '@babel/helper-member-expression-to-functions': 7.22.3
+      '@babel/helper-optimise-call-expression': 7.18.6
+      '@babel/template': 7.21.9
+      '@babel/traverse': 7.22.1(supports-color@5.5.0)
+      '@babel/types': 7.22.3
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/helper-simple-access@7.21.5:
+    resolution: {integrity: sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.22.3
+
+  /@babel/helper-skip-transparent-expression-wrappers@7.20.0:
+    resolution: {integrity: sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.22.3
+    dev: true
+
+  /@babel/helper-split-export-declaration@7.18.6:
+    resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/types': 7.22.3
+
+  /@babel/helper-string-parser@7.21.5:
+    resolution: {integrity: sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==}
+    engines: {node: '>=6.9.0'}
+
+  /@babel/helper-validator-identifier@7.19.1:
+    resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
+    engines: {node: '>=6.9.0'}
+
+  /@babel/helper-validator-option@7.21.0:
+    resolution: {integrity: sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==}
+    engines: {node: '>=6.9.0'}
+
+  /@babel/helper-wrap-function@7.20.5:
+    resolution: {integrity: sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/helper-function-name': 7.21.0
+      '@babel/template': 7.21.9
+      '@babel/traverse': 7.22.1(supports-color@5.5.0)
+      '@babel/types': 7.22.3
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/helpers@7.22.3:
+    resolution: {integrity: sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/template': 7.21.9
+      '@babel/traverse': 7.22.1(supports-color@5.5.0)
+      '@babel/types': 7.22.3
+    transitivePeerDependencies:
+      - supports-color
+
+  /@babel/highlight@7.18.6:
+    resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/helper-validator-identifier': 7.19.1
+      chalk: 2.4.2
+      js-tokens: 4.0.0
+
+  /@babel/parser@7.22.3:
+    resolution: {integrity: sha512-vrukxyW/ep8UD1UDzOYpTKQ6abgjFoeG6L+4ar9+c5TN9QnlqiOi6QK7LSR5ewm/ERyGkT/Ai6VboNrxhbr9Uw==}
+    engines: {node: '>=6.0.0'}
+    hasBin: true
+    dependencies:
+      '@babel/types': 7.22.3
+
+  /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-6r4yRwEnorYByILoDRnEqxtojYKuiIv9FojW2E8GUKo9eWBwbKcd9IiZOZpdyXc64RmyGGyPu3/uAcrz/dq2kQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.13.0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/helper-skip-transparent-expression-wrappers': 7.20.0
+      '@babel/plugin-transform-optional-chaining': 7.22.3(@babel/core@7.22.1)
+    dev: true
+
+  /@babel/plugin-external-helpers@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-wNqc87qjLvsD1PIMQBzLn1bMuTlGzqLzM/1VGQ22Wm51cbCWS9k71ydp5iZS4hjwQNuTWSn/xbZkkusNENwtZg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-proposal-class-properties@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-proposal-decorators@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-XjTKH3sHr6pPqG+hR1NCdVupwiosfdKM2oSMyKQVQ5Bym9l/p7BuLAqT5U32zZzRCfPq/TPRPzMiiTE9bOXU4w==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/helper-replace-supers': 7.22.1
+      '@babel/helper-split-export-declaration': 7.18.6
+      '@babel/plugin-syntax-decorators': 7.22.3(@babel/core@7.22.1)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-proposal-object-rest-spread@7.20.7(@babel/core@7.22.1):
+    resolution: {integrity: sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/compat-data': 7.22.3
+      '@babel/core': 7.22.1
+      '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-parameters': 7.22.3(@babel/core@7.22.1)
+    dev: true
+
+  /@babel/plugin-proposal-private-property-in-object@7.21.0(@babel/core@7.22.1):
+    resolution: {integrity: sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-annotate-as-pure': 7.18.6
+      '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.1)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-proposal-unicode-property-regex@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==}
+    engines: {node: '>=4'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.22.1):
+    resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.22.1):
+    resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-class-static-block@7.14.5(@babel/core@7.22.1):
+    resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-decorators@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-R16Zuge73+8/nLcDjkIpyhi5wIbN7i7fiuLJR8yQX7vPAa/ltUKtd3iLbb4AgP5nrLi91HnNUNosELIGUGH1bg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-export-namespace-from@7.8.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-import-assertions@7.20.0(@babel/core@7.22.1):
+    resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-import-attributes@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-i35jZJv6aO7hxEbIWQ41adVfOzjm9dcYDNeWlBMd8p0ZQRtNUCBrmGwZt+H5lb+oOC9a3svp956KP0oWGA1YsA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.22.1):
+    resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-jsx@7.21.4(@babel/core@7.22.1):
+    resolution: {integrity: sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.22.1):
+    resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.22.1):
+    resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-private-property-in-object@7.14.5(@babel/core@7.22.1):
+    resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.22.1):
+    resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-typescript@7.21.4(@babel/core@7.22.1):
+    resolution: {integrity: sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-arrow-functions@7.21.5(@babel/core@7.22.1):
+    resolution: {integrity: sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-async-generator-functions@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-36A4Aq48t66btydbZd5Fk0/xJqbpg/v4QWI4AH4cYHBXy9Mu42UOupZpebKFiCFNT9S9rJFcsld0gsv0ayLjtA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-environment-visitor': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.22.1)
+      '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.1)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-transform-async-to-generator@7.20.7(@babel/core@7.22.1):
+    resolution: {integrity: sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-module-imports': 7.21.4
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/helper-remap-async-to-generator': 7.18.9(@babel/core@7.22.1)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-transform-block-scoped-functions@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-block-scoping@7.21.0(@babel/core@7.22.1):
+    resolution: {integrity: sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-class-properties@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-mASLsd6rhOrLZ5F3WbCxkzl67mmOnqik0zrg5W6D/X0QMW7HtvnoL1dRARLKIbMP3vXwkwziuLesPqWVGIl6Bw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-transform-class-static-block@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-5BirgNWNOx7cwbTJCOmKFJ1pZjwk5MUfMIwiBBvsirCJMZeQgs5pk6i1OlkVg+1Vef5LfBahFOrdCnAWvkVKMw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.12.0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.1)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-transform-classes@7.21.0(@babel/core@7.22.1):
+    resolution: {integrity: sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-annotate-as-pure': 7.18.6
+      '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-environment-visitor': 7.22.1
+      '@babel/helper-function-name': 7.21.0
+      '@babel/helper-optimise-call-expression': 7.18.6
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/helper-replace-supers': 7.22.1
+      '@babel/helper-split-export-declaration': 7.18.6
+      globals: 11.12.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-transform-computed-properties@7.21.5(@babel/core@7.22.1):
+    resolution: {integrity: sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/template': 7.21.9
+    dev: true
+
+  /@babel/plugin-transform-destructuring@7.21.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-dotall-regex@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-duplicate-keys@7.18.9(@babel/core@7.22.1):
+    resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-dynamic-import@7.22.1(@babel/core@7.22.1):
+    resolution: {integrity: sha512-rlhWtONnVBPdmt+jeewS0qSnMz/3yLFrqAP8hHC6EDcrYRSyuz9f9yQhHvVn2Ad6+yO9fHXac5piudeYrInxwQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.1)
+    dev: true
+
+  /@babel/plugin-transform-exponentiation-operator@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-builder-binary-assignment-operator-visitor': 7.22.3
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-export-namespace-from@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-5Ti1cHLTDnt3vX61P9KZ5IG09bFXp4cDVFJIAeCZuxu9OXXJJZp5iP0n/rzM2+iAutJY+KWEyyHcRaHlpQ/P5g==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.1)
+    dev: true
+
+  /@babel/plugin-transform-for-of@7.21.5(@babel/core@7.22.1):
+    resolution: {integrity: sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-function-name@7.18.9(@babel/core@7.22.1):
+    resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-function-name': 7.21.0
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-json-strings@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-IuvOMdeOOY2X4hRNAT6kwbePtK21BUyrAEgLKviL8pL6AEEVUVcqtRdN/HJXBLGIbt9T3ETmXRnFedRRmQNTYw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.1)
+    dev: true
+
+  /@babel/plugin-transform-literals@7.18.9(@babel/core@7.22.1):
+    resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-logical-assignment-operators@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-CbayIfOw4av2v/HYZEsH+Klks3NC2/MFIR3QR8gnpGNNPEaq2fdlVCRYG/paKs7/5hvBLQ+H70pGWOHtlNEWNA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.1)
+    dev: true
+
+  /@babel/plugin-transform-member-expression-literals@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-modules-amd@7.20.11(@babel/core@7.22.1):
+    resolution: {integrity: sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-module-transforms': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-transform-modules-commonjs@7.21.2(@babel/core@7.22.1):
+    resolution: {integrity: sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-module-transforms': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/helper-simple-access': 7.21.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-transform-modules-commonjs@7.21.5(@babel/core@7.22.1):
+    resolution: {integrity: sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-module-transforms': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/helper-simple-access': 7.21.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-transform-modules-systemjs@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-V21W3bKLxO3ZjcBJZ8biSvo5gQ85uIXW2vJfh7JSWf/4SLUSr1tOoHX3ruN4+Oqa2m+BKfsxTR1I+PsvkIWvNw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-hoist-variables': 7.18.6
+      '@babel/helper-module-transforms': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/helper-validator-identifier': 7.19.1
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-transform-modules-umd@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-module-transforms': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-transform-named-capturing-groups-regex@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-c6HrD/LpUdNNJsISQZpds3TXvfYIAbo+efE9aWmY/PmSRD0agrJ9cPMt4BmArwUQ7ZymEWTFjTyp+yReLJZh0Q==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-new-target@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-5RuJdSo89wKdkRTqtM9RVVJzHum9c2s0te9rB7vZC1zKKxcioWIy+xcu4OoIAjyFZhb/bp5KkunuLin1q7Ct+w==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-nullish-coalescing-operator@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-CpaoNp16nX7ROtLONNuCyenYdY/l7ZsR6aoVa7rW7nMWisoNoQNIH5Iay/4LDyRjKMuElMqXiBoOQCDLTMGZiw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.1)
+    dev: true
+
+  /@babel/plugin-transform-numeric-separator@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-+AF88fPDJrnseMh5vD9+SH6wq4ZMvpiTMHh58uLs+giMEyASFVhcT3NkoyO+NebFCNnpHJEq5AXO2txV4AGPDQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.1)
+    dev: true
+
+  /@babel/plugin-transform-object-rest-spread@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-38bzTsqMMCI46/TQnJwPPpy33EjLCc1Gsm2hRTF6zTMWnKsN61vdrpuzIEGQyKEhDSYDKyZHrrd5FMj4gcUHhw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/compat-data': 7.22.3
+      '@babel/core': 7.22.1
+      '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-parameters': 7.22.3(@babel/core@7.22.1)
+    dev: true
+
+  /@babel/plugin-transform-object-super@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/helper-replace-supers': 7.22.1
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-transform-optional-catch-binding@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-bnDFWXFzWY0BsOyqaoSXvMQ2F35zutQipugog/rqotL2S4ciFOKlRYUu9djt4iq09oh2/34hqfRR2k1dIvuu4g==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.1)
+    dev: true
+
+  /@babel/plugin-transform-optional-chaining@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-63v3/UFFxhPKT8j8u1jTTGVyITxl7/7AfOqK8C5gz1rHURPUGe3y5mvIf68eYKGoBNahtJnTxBKug4BQOnzeJg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/helper-skip-transparent-expression-wrappers': 7.20.0
+      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.1)
+    dev: true
+
+  /@babel/plugin-transform-parameters@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-x7QHQJHPuD9VmfpzboyGJ5aHEr9r7DsAsdxdhJiTB3J3j8dyl+NFZ+rX5Q2RWFDCs61c06qBfS4ys2QYn8UkMw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-private-methods@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-fC7jtjBPFqhqpPAE+O4LKwnLq7gGkD3ZmC2E3i4qWH34mH3gOg2Xrq5YMHUq6DM30xhqM1DNftiRaSqVjEG+ug==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-transform-private-property-in-object@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-C7MMl4qWLpgVCbXfj3UW8rR1xeCnisQ0cU7YJHV//8oNBS0aCIVg1vFnZXxOckHhEpQyqNNkWmvSEWnMLlc+Vw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-annotate-as-pure': 7.18.6
+      '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.1)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-transform-property-literals@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-react-display-name@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-react-jsx-development@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/plugin-transform-react-jsx': 7.22.3(@babel/core@7.22.1)
+    dev: true
+
+  /@babel/plugin-transform-react-jsx-self@7.21.0(@babel/core@7.22.1):
+    resolution: {integrity: sha512-f/Eq+79JEu+KUANFks9UZCcvydOOGMgF7jBrcwjHa5jTZD8JivnhCJYvmlhR/WTXBWonDExPoW0eO/CR4QJirA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-react-jsx-source@7.19.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-react-jsx@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-JEulRWG2f04a7L8VWaOngWiK6p+JOSpB+DAtwfJgOaej1qdbNxqtK7MwTBHjUA10NeFcszlFNqCdbRcirzh2uQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-annotate-as-pure': 7.18.6
+      '@babel/helper-module-imports': 7.21.4
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.22.1)
+      '@babel/types': 7.22.3
+    dev: true
+
+  /@babel/plugin-transform-react-pure-annotations@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-annotate-as-pure': 7.18.6
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-regenerator@7.21.5(@babel/core@7.22.1):
+    resolution: {integrity: sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      regenerator-transform: 0.15.1
+    dev: true
+
+  /@babel/plugin-transform-reserved-words@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-shorthand-properties@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-spread@7.20.7(@babel/core@7.22.1):
+    resolution: {integrity: sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/helper-skip-transparent-expression-wrappers': 7.20.0
+    dev: true
+
+  /@babel/plugin-transform-sticky-regex@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-template-literals@7.18.9(@babel/core@7.22.1):
+    resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-typeof-symbol@7.18.9(@babel/core@7.22.1):
+    resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-typescript@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-pyjnCIniO5PNaEuGxT28h0HbMru3qCVrMqVgVOz/krComdIrY9W6FCLBq9NWHY8HDGaUlan+UhmZElDENIfCcw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-annotate-as-pure': 7.18.6
+      '@babel/helper-create-class-features-plugin': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.22.1)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/plugin-transform-unicode-escapes@7.21.5(@babel/core@7.22.1):
+    resolution: {integrity: sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-unicode-property-regex@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-5ScJ+OmdX+O6HRuMGW4kv7RL9vIKdtdAj9wuWUKy1wbHY3jaM/UlyIiC1G7J6UJiiyMukjjK0QwL3P0vBd0yYg==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-unicode-regex@7.18.6(@babel/core@7.22.1):
+    resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/plugin-transform-unicode-sets-regex@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-hNufLdkF8vqywRp+P55j4FHXqAX2LRUccoZHH7AFn1pq5ZOO2ISKW9w13bFZVjBoTqeve2HOgoJCcaziJVhGNw==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-create-regexp-features-plugin': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+    dev: true
+
+  /@babel/preset-env@7.22.2(@babel/core@7.22.1):
+    resolution: {integrity: sha512-UPNK9pgphMULvA2EMKIWHU90C47PKyuvQ8pE1MzH7l9PgFcRabdrHhlePpBuWxYZQ+TziP2nycKoI5C1Yhdm9Q==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/compat-data': 7.22.3
+      '@babel/core': 7.22.1
+      '@babel/helper-compilation-targets': 7.22.1(@babel/core@7.22.1)
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/helper-validator-option': 7.21.0
+      '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-proposal-private-property-in-object': 7.21.0(@babel/core@7.22.1)
+      '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.1)
+      '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.1)
+      '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.22.1)
+      '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.22.1)
+      '@babel/plugin-syntax-export-namespace-from': 7.8.3(@babel/core@7.22.1)
+      '@babel/plugin-syntax-import-assertions': 7.20.0(@babel/core@7.22.1)
+      '@babel/plugin-syntax-import-attributes': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.1)
+      '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.1)
+      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.1)
+      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.1)
+      '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.1)
+      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.1)
+      '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.1)
+      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.1)
+      '@babel/plugin-syntax-private-property-in-object': 7.14.5(@babel/core@7.22.1)
+      '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.1)
+      '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-transform-arrow-functions': 7.21.5(@babel/core@7.22.1)
+      '@babel/plugin-transform-async-generator-functions': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-async-to-generator': 7.20.7(@babel/core@7.22.1)
+      '@babel/plugin-transform-block-scoped-functions': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-transform-block-scoping': 7.21.0(@babel/core@7.22.1)
+      '@babel/plugin-transform-class-properties': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-class-static-block': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-classes': 7.21.0(@babel/core@7.22.1)
+      '@babel/plugin-transform-computed-properties': 7.21.5(@babel/core@7.22.1)
+      '@babel/plugin-transform-destructuring': 7.21.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-transform-duplicate-keys': 7.18.9(@babel/core@7.22.1)
+      '@babel/plugin-transform-dynamic-import': 7.22.1(@babel/core@7.22.1)
+      '@babel/plugin-transform-exponentiation-operator': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-transform-export-namespace-from': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-for-of': 7.21.5(@babel/core@7.22.1)
+      '@babel/plugin-transform-function-name': 7.18.9(@babel/core@7.22.1)
+      '@babel/plugin-transform-json-strings': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-literals': 7.18.9(@babel/core@7.22.1)
+      '@babel/plugin-transform-logical-assignment-operators': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-member-expression-literals': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-transform-modules-amd': 7.20.11(@babel/core@7.22.1)
+      '@babel/plugin-transform-modules-commonjs': 7.21.5(@babel/core@7.22.1)
+      '@babel/plugin-transform-modules-systemjs': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-modules-umd': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-transform-named-capturing-groups-regex': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-new-target': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-nullish-coalescing-operator': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-numeric-separator': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-object-rest-spread': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-object-super': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-transform-optional-catch-binding': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-optional-chaining': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-parameters': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-private-methods': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-private-property-in-object': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-property-literals': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-transform-regenerator': 7.21.5(@babel/core@7.22.1)
+      '@babel/plugin-transform-reserved-words': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-transform-shorthand-properties': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-transform-spread': 7.20.7(@babel/core@7.22.1)
+      '@babel/plugin-transform-sticky-regex': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-transform-template-literals': 7.18.9(@babel/core@7.22.1)
+      '@babel/plugin-transform-typeof-symbol': 7.18.9(@babel/core@7.22.1)
+      '@babel/plugin-transform-unicode-escapes': 7.21.5(@babel/core@7.22.1)
+      '@babel/plugin-transform-unicode-property-regex': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-unicode-regex': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-transform-unicode-sets-regex': 7.22.3(@babel/core@7.22.1)
+      '@babel/preset-modules': 0.1.5(@babel/core@7.22.1)
+      '@babel/types': 7.22.3
+      babel-plugin-polyfill-corejs2: 0.4.3(@babel/core@7.22.1)
+      babel-plugin-polyfill-corejs3: 0.8.1(@babel/core@7.22.1)
+      babel-plugin-polyfill-regenerator: 0.5.0(@babel/core@7.22.1)
+      core-js-compat: 3.30.2
+      semver: 6.3.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/preset-modules@0.1.5(@babel/core@7.22.1):
+    resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/plugin-proposal-unicode-property-regex': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-transform-dotall-regex': 7.18.6(@babel/core@7.22.1)
+      '@babel/types': 7.22.3
+      esutils: 2.0.3
+    dev: true
+
+  /@babel/preset-react@7.22.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-lxDz1mnZ9polqClBCVBjIVUypoB4qV3/tZUDb/IlYbW1kiiLaXaX+bInbRjl+lNQ/iUZraQ3+S8daEmoELMWug==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/helper-validator-option': 7.21.0
+      '@babel/plugin-transform-react-display-name': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-transform-react-jsx': 7.22.3(@babel/core@7.22.1)
+      '@babel/plugin-transform-react-jsx-development': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-transform-react-pure-annotations': 7.18.6(@babel/core@7.22.1)
+    dev: true
+
+  /@babel/preset-typescript@7.21.5(@babel/core@7.22.1):
+    resolution: {integrity: sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==}
+    engines: {node: '>=6.9.0'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-plugin-utils': 7.21.5
+      '@babel/helper-validator-option': 7.21.0
+      '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.22.1)
+      '@babel/plugin-transform-modules-commonjs': 7.21.5(@babel/core@7.22.1)
+      '@babel/plugin-transform-typescript': 7.22.3(@babel/core@7.22.1)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@babel/regjsgen@0.8.0:
+    resolution: {integrity: sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==}
+    dev: true
+
+  /@babel/runtime@7.21.0:
+    resolution: {integrity: sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      regenerator-runtime: 0.13.11
+    dev: true
+
+  /@babel/runtime@7.22.3:
+    resolution: {integrity: sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      regenerator-runtime: 0.13.11
+
+  /@babel/template@7.21.9:
+    resolution: {integrity: sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/code-frame': 7.21.4
+      '@babel/parser': 7.22.3
+      '@babel/types': 7.22.3
+
+  /@babel/traverse@7.22.1(supports-color@5.5.0):
+    resolution: {integrity: sha512-lAWkdCoUFnmwLBhIRLciFntGYsIIoC6vIbN8zrLPqBnJmPu7Z6nzqnKd7FsxQUNAvZfVZ0x6KdNvNp8zWIOHSQ==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/code-frame': 7.21.4
+      '@babel/generator': 7.22.3
+      '@babel/helper-environment-visitor': 7.22.1
+      '@babel/helper-function-name': 7.21.0
+      '@babel/helper-hoist-variables': 7.18.6
+      '@babel/helper-split-export-declaration': 7.18.6
+      '@babel/parser': 7.22.3
+      '@babel/types': 7.22.3
+      debug: 4.3.4(supports-color@5.5.0)
+      globals: 11.12.0
+    transitivePeerDependencies:
+      - supports-color
+
+  /@babel/types@7.22.3:
+    resolution: {integrity: sha512-P3na3xIQHTKY4L0YOG7pM8M8uoUIB910WQaSiiMCZUC2Cy8XFEQONGABFnHWBa2gpGKODTAJcNhi5Zk0sLRrzg==}
+    engines: {node: '>=6.9.0'}
+    dependencies:
+      '@babel/helper-string-parser': 7.21.5
+      '@babel/helper-validator-identifier': 7.19.1
+      to-fast-properties: 2.0.0
+
+  /@bcoe/v8-coverage@0.2.3:
+    resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
+    dev: true
+
+  /@bloomberg/record-tuple-polyfill@0.0.4:
+    resolution: {integrity: sha512-h0OYmPR3A5Dfbetra/GzxBAzQk8sH7LhRkRUTdagX6nrtlUgJGYCTv4bBK33jsTQw9HDd8PE2x1Ma+iRKEDUsw==}
+    dev: true
+
+  /@chenshuai2144/sketch-color@1.0.9(react@18.2.0):
+    resolution: {integrity: sha512-obzSy26cb7Pm7OprWyVpgMpIlrZpZ0B7vbrU0RMbvRg0YAI890S5Xy02Aj1Nhl4+KTbi1lVYHt6HQP8Hm9s+1w==}
+    peerDependencies:
+      react: '>=16.12.0'
+    dependencies:
+      react: 18.2.0
+      reactcss: 1.2.3(react@18.2.0)
+      tinycolor2: 1.6.0
+
+  /@cspotcode/source-map-support@0.8.1:
+    resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
+    engines: {node: '>=12'}
+    dependencies:
+      '@jridgewell/trace-mapping': 0.3.9
+    dev: true
+
+  /@csstools/postcss-color-function@1.1.1(postcss@8.4.24):
+    resolution: {integrity: sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.24)
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /@csstools/postcss-font-format-keywords@1.0.1(postcss@8.4.24):
+    resolution: {integrity: sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /@csstools/postcss-hwb-function@1.0.2(postcss@8.4.24):
+    resolution: {integrity: sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /@csstools/postcss-ic-unit@1.0.1(postcss@8.4.24):
+    resolution: {integrity: sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.24)
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /@csstools/postcss-is-pseudo-class@2.0.7(postcss@8.4.24):
+    resolution: {integrity: sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.13)
+      postcss: 8.4.24
+      postcss-selector-parser: 6.0.13
+    dev: true
+
+  /@csstools/postcss-normalize-display-values@1.0.1(postcss@8.4.24):
+    resolution: {integrity: sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /@csstools/postcss-oklab-function@1.1.1(postcss@8.4.24):
+    resolution: {integrity: sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.24)
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /@csstools/postcss-progressive-custom-properties@1.3.0(postcss@8.4.24):
+    resolution: {integrity: sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.3
+    dependencies:
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /@csstools/postcss-stepped-value-functions@1.0.1(postcss@8.4.24):
+    resolution: {integrity: sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /@csstools/postcss-unset-value@1.0.2(postcss@8.4.24):
+    resolution: {integrity: sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      postcss: 8.4.24
+    dev: true
+
+  /@csstools/selector-specificity@2.2.0(postcss-selector-parser@6.0.13):
+    resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==}
+    engines: {node: ^14 || ^16 || >=18}
+    peerDependencies:
+      postcss-selector-parser: ^6.0.10
+    dependencies:
+      postcss-selector-parser: 6.0.13
+    dev: true
+
+  /@ctrl/tinycolor@3.6.0:
+    resolution: {integrity: sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==}
+    engines: {node: '>=10'}
+
+  /@emotion/babel-plugin@11.11.0:
+    resolution: {integrity: sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==}
+    dependencies:
+      '@babel/helper-module-imports': 7.21.4
+      '@babel/runtime': 7.22.3
+      '@emotion/hash': 0.9.1
+      '@emotion/memoize': 0.8.1
+      '@emotion/serialize': 1.1.2
+      babel-plugin-macros: 3.1.0
+      convert-source-map: 1.9.0
+      escape-string-regexp: 4.0.0
+      find-root: 1.1.0
+      source-map: 0.5.7
+      stylis: 4.2.0
+    dev: false
+
+  /@emotion/cache@11.11.0:
+    resolution: {integrity: sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==}
+    dependencies:
+      '@emotion/memoize': 0.8.1
+      '@emotion/sheet': 1.2.2
+      '@emotion/utils': 1.2.1
+      '@emotion/weak-memoize': 0.3.1
+      stylis: 4.2.0
+    dev: false
+
+  /@emotion/css@11.11.0:
+    resolution: {integrity: sha512-m4g6nKzZyiKyJ3WOfdwrBdcujVcpaScIWHAnyNKPm/A/xJKwfXPfQAbEVi1kgexWTDakmg+r2aDj0KvnMTo4oQ==}
+    dependencies:
+      '@emotion/babel-plugin': 11.11.0
+      '@emotion/cache': 11.11.0
+      '@emotion/serialize': 1.1.2
+      '@emotion/sheet': 1.2.2
+      '@emotion/utils': 1.2.1
+    dev: false
+
+  /@emotion/hash@0.8.0:
+    resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
+
+  /@emotion/hash@0.9.1:
+    resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==}
+    dev: false
+
+  /@emotion/is-prop-valid@1.2.1:
+    resolution: {integrity: sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==}
+    dependencies:
+      '@emotion/memoize': 0.8.1
+    dev: true
+
+  /@emotion/memoize@0.8.1:
+    resolution: {integrity: sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==}
+
+  /@emotion/serialize@1.1.2:
+    resolution: {integrity: sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==}
+    dependencies:
+      '@emotion/hash': 0.9.1
+      '@emotion/memoize': 0.8.1
+      '@emotion/unitless': 0.8.1
+      '@emotion/utils': 1.2.1
+      csstype: 3.1.2
+    dev: false
+
+  /@emotion/sheet@1.2.2:
+    resolution: {integrity: sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==}
+    dev: false
+
+  /@emotion/stylis@0.8.5:
+    resolution: {integrity: sha512-h6KtPihKFn3T9fuIrwvXXUOwlx3rfUvfZIcP5a6rh8Y7zjE3O06hT5Ss4S/YI1AYhuZ1kjaE/5EaOOI2NqSylQ==}
+    dev: true
+
+  /@emotion/unitless@0.7.5:
+    resolution: {integrity: sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==}
+
+  /@emotion/unitless@0.8.1:
+    resolution: {integrity: sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==}
+
+  /@emotion/utils@1.2.1:
+    resolution: {integrity: sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==}
+    dev: false
+
+  /@emotion/weak-memoize@0.3.1:
+    resolution: {integrity: sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==}
+    dev: false
+
+  /@esbuild-kit/cjs-loader@2.4.2:
+    resolution: {integrity: sha512-BDXFbYOJzT/NBEtp71cvsrGPwGAMGRB/349rwKuoxNSiKjPraNNnlK6MIIabViCjqZugu6j+xeMDlEkWdHHJSg==}
+    dependencies:
+      '@esbuild-kit/core-utils': 3.1.0
+      get-tsconfig: 4.5.0
+    dev: true
+
+  /@esbuild-kit/core-utils@3.1.0:
+    resolution: {integrity: sha512-Uuk8RpCg/7fdHSceR1M6XbSZFSuMrxcePFuGgyvsBn+u339dk5OeL4jv2EojwTN2st/unJGsVm4qHWjWNmJ/tw==}
+    dependencies:
+      esbuild: 0.17.19
+      source-map-support: 0.5.21
+    dev: true
+
+  /@esbuild-kit/esm-loader@2.5.5:
+    resolution: {integrity: sha512-Qwfvj/qoPbClxCRNuac1Du01r9gvNOT+pMYtJDapfB1eoGN1YlJ1BixLyL9WVENRx5RXgNLdfYdx/CuswlGhMw==}
+    dependencies:
+      '@esbuild-kit/core-utils': 3.1.0
+      get-tsconfig: 4.5.0
+    dev: true
+
+  /@esbuild/android-arm64@0.16.17:
+    resolution: {integrity: sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-arm64@0.17.19:
+    resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-arm@0.16.17:
+    resolution: {integrity: sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-arm@0.17.19:
+    resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-x64@0.16.17:
+    resolution: {integrity: sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-x64@0.17.19:
+    resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-arm64@0.16.17:
+    resolution: {integrity: sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-arm64@0.17.19:
+    resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-x64@0.16.17:
+    resolution: {integrity: sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-x64@0.17.19:
+    resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-arm64@0.16.17:
+    resolution: {integrity: sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-arm64@0.17.19:
+    resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-x64@0.16.17:
+    resolution: {integrity: sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-x64@0.17.19:
+    resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm64@0.16.17:
+    resolution: {integrity: sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm64@0.17.19:
+    resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm@0.16.17:
+    resolution: {integrity: sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm@0.17.19:
+    resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ia32@0.16.17:
+    resolution: {integrity: sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ia32@0.17.19:
+    resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-loong64@0.16.17:
+    resolution: {integrity: sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-loong64@0.17.19:
+    resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-mips64el@0.16.17:
+    resolution: {integrity: sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-mips64el@0.17.19:
+    resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ppc64@0.16.17:
+    resolution: {integrity: sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ppc64@0.17.19:
+    resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-riscv64@0.16.17:
+    resolution: {integrity: sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-riscv64@0.17.19:
+    resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-s390x@0.16.17:
+    resolution: {integrity: sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-s390x@0.17.19:
+    resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-x64@0.16.17:
+    resolution: {integrity: sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-x64@0.17.19:
+    resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/netbsd-x64@0.16.17:
+    resolution: {integrity: sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/netbsd-x64@0.17.19:
+    resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/openbsd-x64@0.16.17:
+    resolution: {integrity: sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/openbsd-x64@0.17.19:
+    resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/sunos-x64@0.16.17:
+    resolution: {integrity: sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/sunos-x64@0.17.19:
+    resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-arm64@0.16.17:
+    resolution: {integrity: sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-arm64@0.17.19:
+    resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-ia32@0.16.17:
+    resolution: {integrity: sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-ia32@0.17.19:
+    resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-x64@0.16.17:
+    resolution: {integrity: sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-x64@0.17.19:
+    resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@eslint-community/eslint-utils@4.4.0(eslint@7.32.0):
+    resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+    dependencies:
+      eslint: 7.32.0
+      eslint-visitor-keys: 3.4.1
+    dev: true
+
+  /@eslint-community/eslint-utils@4.4.0(eslint@8.35.0):
+    resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+    dependencies:
+      eslint: 8.35.0
+      eslint-visitor-keys: 3.4.1
+    dev: true
+
+  /@eslint-community/eslint-utils@4.4.0(eslint@8.41.0):
+    resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || >=8.0.0
+    dependencies:
+      eslint: 8.41.0
+      eslint-visitor-keys: 3.4.1
+
+  /@eslint-community/regexpp@4.5.1:
+    resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==}
+    engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+
+  /@eslint/eslintrc@0.4.3:
+    resolution: {integrity: sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==}
+    engines: {node: ^10.12.0 || >=12.0.0}
+    dependencies:
+      ajv: 6.12.6
+      debug: 4.3.4(supports-color@5.5.0)
+      espree: 7.3.1
+      globals: 13.20.0
+      ignore: 4.0.6
+      import-fresh: 3.3.0
+      js-yaml: 3.14.1
+      minimatch: 3.1.2
+      strip-json-comments: 3.1.1
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@eslint/eslintrc@2.0.3:
+    resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dependencies:
+      ajv: 6.12.6
+      debug: 4.3.4(supports-color@5.5.0)
+      espree: 9.5.2
+      globals: 13.20.0
+      ignore: 5.2.4
+      import-fresh: 3.3.0
+      js-yaml: 4.1.0
+      minimatch: 3.1.2
+      strip-json-comments: 3.1.1
+    transitivePeerDependencies:
+      - supports-color
+
+  /@eslint/js@8.35.0:
+    resolution: {integrity: sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dev: true
+
+  /@eslint/js@8.41.0:
+    resolution: {integrity: sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  /@exodus/schemasafe@1.0.1:
+    resolution: {integrity: sha512-PQdbF8dGd4LnbwBlcc4ML8RKYdplm+e9sUeWBTr4zgF13/Shiuov9XznvM4T8cb1CfyKK21yTUkuAIIh/DAH/g==}
+    dev: true
+
+  /@floating-ui/core@0.6.2:
+    resolution: {integrity: sha512-jktYRmZwmau63adUG3GKOAVCofBXkk55S/zQ94XOorAHhwqFIOFAy1rSp2N0Wp6/tGbe9V3u/ExlGZypyY17rg==}
+    dev: true
+
+  /@floating-ui/dom@0.4.5:
+    resolution: {integrity: sha512-b+prvQgJt8pieaKYMSJBXHxX/DYwdLsAWxKYqnO5dO2V4oo/TYBZJAUQCVNjTWWsrs6o4VDrNcP9+E70HAhJdw==}
+    dependencies:
+      '@floating-ui/core': 0.6.2
+    dev: true
+
+  /@floating-ui/react-dom-interactions@0.3.1(@types/react@18.2.7)(react-dom@18.1.0)(react@18.1.0):
+    resolution: {integrity: sha512-tP2KEh7EHJr5hokSBHcPGojb+AorDNUf0NYfZGg/M+FsMvCOOsSEeEF0O1NDfETIzDnpbHnCs0DuvCFhSMSStg==}
+    deprecated: Package renamed to @floating-ui/react
+    dependencies:
+      '@floating-ui/react-dom': 0.6.3(@types/react@18.2.7)(react-dom@18.1.0)(react@18.1.0)
+      aria-hidden: 1.2.3
+      point-in-polygon: 1.1.0
+      use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.7)(react@18.1.0)
+    transitivePeerDependencies:
+      - '@types/react'
+      - react
+      - react-dom
+    dev: true
+
+  /@floating-ui/react-dom@0.6.3(@types/react@18.2.7)(react-dom@18.1.0)(react@18.1.0):
+    resolution: {integrity: sha512-hC+pS5D6AgS2wWjbmSQ6UR6Kpy+drvWGJIri6e1EDGADTPsCaa4KzCgmCczHrQeInx9tqs81EyDmbKJYY2swKg==}
+    peerDependencies:
+      react: '>=16.8.0'
+      react-dom: '>=16.8.0'
+    dependencies:
+      '@floating-ui/dom': 0.4.5
+      react: 18.1.0
+      react-dom: 18.1.0(react@18.1.0)
+      use-isomorphic-layout-effect: 1.1.2(@types/react@18.2.7)(react@18.1.0)
+    transitivePeerDependencies:
+      - '@types/react'
+    dev: true
+
+  /@formatjs/ecma402-abstract@1.11.4:
+    resolution: {integrity: sha512-EBikYFp2JCdIfGEb5G9dyCkTGDmC57KSHhRQOC3aYxoPWVZvfWCDjZwkGYHN7Lis/fmuWl906bnNTJifDQ3sXw==}
+    dependencies:
+      '@formatjs/intl-localematcher': 0.2.25
+      tslib: 2.5.2
+    dev: true
+
+  /@formatjs/fast-memoize@1.2.1:
+    resolution: {integrity: sha512-Rg0e76nomkz3vF9IPlKeV+Qynok0r7YZjL6syLz4/urSg0IbjPZCB/iYUMNsYA643gh4mgrX3T7KEIFIxJBQeg==}
+    dependencies:
+      tslib: 2.5.2
+    dev: true
+
+  /@formatjs/icu-messageformat-parser@2.1.0:
+    resolution: {integrity: sha512-Qxv/lmCN6hKpBSss2uQ8IROVnta2r9jd3ymUEIjm2UyIkUCHVcbUVRGL/KS/wv7876edvsPe+hjHVJ4z8YuVaw==}
+    dependencies:
+      '@formatjs/ecma402-abstract': 1.11.4
+      '@formatjs/icu-skeleton-parser': 1.3.6
+      tslib: 2.5.2
+    dev: true
+
+  /@formatjs/icu-skeleton-parser@1.3.6:
+    resolution: {integrity: sha512-I96mOxvml/YLrwU2Txnd4klA7V8fRhb6JG/4hm3VMNmeJo1F03IpV2L3wWt7EweqNLES59SZ4d6hVOPCSf80Bg==}
+    dependencies:
+      '@formatjs/ecma402-abstract': 1.11.4
+      tslib: 2.5.2
+    dev: true
+
+  /@formatjs/intl-displaynames@1.2.10:
+    resolution: {integrity: sha512-GROA2RP6+7Ouu0WnHFF78O5XIU7pBfI19WM1qm93l6MFWibUk67nCfVCK3VAYJkLy8L8ZxjkYT11VIAfvSz8wg==}
+    dependencies:
+      '@formatjs/intl-utils': 2.3.0
+    dev: true
+
+  /@formatjs/intl-listformat@1.4.8:
+    resolution: {integrity: sha512-WNMQlEg0e50VZrGIkgD5n7+DAMGt3boKi1GJALfhFMymslJb5i+5WzWxyj/3a929Z6MAFsmzRIJjKuv+BxKAOQ==}
+    dependencies:
+      '@formatjs/intl-utils': 2.3.0
+    dev: true
+
+  /@formatjs/intl-localematcher@0.2.25:
+    resolution: {integrity: sha512-YmLcX70BxoSopLFdLr1Ds99NdlTI2oWoLbaUW2M406lxOIPzE1KQhRz2fPUkq34xVZQaihCoU29h0KK7An3bhA==}
+    dependencies:
+      tslib: 2.5.2
+    dev: true
+
+  /@formatjs/intl-relativetimeformat@4.5.16:
+    resolution: {integrity: sha512-IQ0haY97oHAH5OYUdykNiepdyEWj3SAT+Fp9ZpR85ov2JNiFx+12WWlxlVS8ehdyncC2ZMt/SwFIy2huK2+6/A==}
+    dependencies:
+      '@formatjs/intl-utils': 2.3.0
+    dev: true
+
+  /@formatjs/intl-unified-numberformat@3.3.7:
+    resolution: {integrity: sha512-KnWgLRHzCAgT9eyt3OS34RHoyD7dPDYhRcuKn+/6Kv2knDF8Im43J6vlSW6Hm1w63fNq3ZIT1cFk7RuVO3Psag==}
+    deprecated: We have renamed the package to @formatjs/intl-numberformat
+    dependencies:
+      '@formatjs/intl-utils': 2.3.0
+    dev: true
+
+  /@formatjs/intl-utils@2.3.0:
+    resolution: {integrity: sha512-KWk80UPIzPmUg+P0rKh6TqspRw0G6eux1PuJr+zz47ftMaZ9QDwbGzHZbtzWkl5hgayM/qrKRutllRC7D/vVXQ==}
+    deprecated: the package is rather renamed to @formatjs/ecma-abstract with some changes in functionality (primarily selectUnit is removed and we don't plan to make any further changes to this package
+    dev: true
+
+  /@humanwhocodes/config-array@0.11.8:
+    resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==}
+    engines: {node: '>=10.10.0'}
+    dependencies:
+      '@humanwhocodes/object-schema': 1.2.1
+      debug: 4.3.4(supports-color@5.5.0)
+      minimatch: 3.1.2
+    transitivePeerDependencies:
+      - supports-color
+
+  /@humanwhocodes/config-array@0.5.0:
+    resolution: {integrity: sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==}
+    engines: {node: '>=10.10.0'}
+    dependencies:
+      '@humanwhocodes/object-schema': 1.2.1
+      debug: 4.3.4(supports-color@5.5.0)
+      minimatch: 3.1.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@humanwhocodes/module-importer@1.0.1:
+    resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+    engines: {node: '>=12.22'}
+
+  /@humanwhocodes/object-schema@1.2.1:
+    resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
+
+  /@iconify/types@2.0.0:
+    resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
+    dev: true
+
+  /@iconify/utils@2.1.1:
+    resolution: {integrity: sha512-H8xz74JDzDw8f0qLxwIaxFMnFkbXTZNWEufOk3WxaLFHV4h0A2FjIDgNk5LzC0am4jssnjdeJJdRs3UFu3582Q==}
+    dependencies:
+      '@antfu/install-pkg': 0.1.1
+      '@antfu/utils': 0.7.2
+      '@iconify/types': 2.0.0
+      debug: 4.3.4(supports-color@5.5.0)
+      kolorist: 1.8.0
+      local-pkg: 0.4.3
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@istanbuljs/load-nyc-config@1.1.0:
+    resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
+    engines: {node: '>=8'}
+    dependencies:
+      camelcase: 5.3.1
+      find-up: 4.1.0
+      get-package-type: 0.1.0
+      js-yaml: 3.14.1
+      resolve-from: 5.0.0
+    dev: true
+
+  /@istanbuljs/schema@0.1.3:
+    resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /@jest/console@29.5.0:
+    resolution: {integrity: sha512-NEpkObxPwyw/XxZVLPmAGKE89IQRp4puc6IQRPru6JKd1M3fW9v1xM1AnzIJE65hbCkzQAdnL8P47e9hzhiYLQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/types': 29.5.0
+      '@types/node': 20.2.5
+      chalk: 4.1.2
+      jest-message-util: 29.5.0
+      jest-util: 29.5.0
+      slash: 3.0.0
+    dev: true
+
+  /@jest/core@29.5.0(ts-node@10.9.1):
+    resolution: {integrity: sha512-28UzQc7ulUrOQw1IsN/kv1QES3q2kkbl/wGslyhAclqZ/8cMdB5M68BffkIdSJgKBUt50d3hbwJ92XESlE7LiQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+    dependencies:
+      '@jest/console': 29.5.0
+      '@jest/reporters': 29.5.0
+      '@jest/test-result': 29.5.0
+      '@jest/transform': 29.5.0
+      '@jest/types': 29.5.0
+      '@types/node': 20.2.5
+      ansi-escapes: 4.3.2
+      chalk: 4.1.2
+      ci-info: 3.8.0
+      exit: 0.1.2
+      graceful-fs: 4.2.11
+      jest-changed-files: 29.5.0
+      jest-config: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1)
+      jest-haste-map: 29.5.0
+      jest-message-util: 29.5.0
+      jest-regex-util: 29.4.3
+      jest-resolve: 29.5.0
+      jest-resolve-dependencies: 29.5.0
+      jest-runner: 29.5.0
+      jest-runtime: 29.5.0
+      jest-snapshot: 29.5.0
+      jest-util: 29.5.0
+      jest-validate: 29.5.0
+      jest-watcher: 29.5.0
+      micromatch: 4.0.5
+      pretty-format: 29.5.0
+      slash: 3.0.0
+      strip-ansi: 6.0.1
+    transitivePeerDependencies:
+      - supports-color
+      - ts-node
+    dev: true
+
+  /@jest/environment@29.5.0:
+    resolution: {integrity: sha512-5FXw2+wD29YU1d4I2htpRX7jYnAyTRjP2CsXQdo9SAM8g3ifxWPSV0HnClSn71xwctr0U3oZIIH+dtbfmnbXVQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/fake-timers': 29.5.0
+      '@jest/types': 29.5.0
+      '@types/node': 20.2.5
+      jest-mock: 29.5.0
+    dev: true
+
+  /@jest/expect-utils@29.5.0:
+    resolution: {integrity: sha512-fmKzsidoXQT2KwnrwE0SQq3uj8Z763vzR8LnLBwC2qYWEFpjX8daRsk6rHUM1QvNlEW/UJXNXm59ztmJJWs2Mg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      jest-get-type: 29.4.3
+    dev: true
+
+  /@jest/expect@29.5.0:
+    resolution: {integrity: sha512-PueDR2HGihN3ciUNGr4uelropW7rqUfTiOn+8u0leg/42UhblPxHkfoh0Ruu3I9Y1962P3u2DY4+h7GVTSVU6g==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      expect: 29.5.0
+      jest-snapshot: 29.5.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@jest/fake-timers@29.5.0:
+    resolution: {integrity: sha512-9ARvuAAQcBwDAqOnglWq2zwNIRUDtk/SCkp/ToGEhFv5r86K21l+VEs0qNTaXtyiY0lEePl3kylijSYJQqdbDg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/types': 29.5.0
+      '@sinonjs/fake-timers': 10.2.0
+      '@types/node': 20.2.5
+      jest-message-util: 29.5.0
+      jest-mock: 29.5.0
+      jest-util: 29.5.0
+    dev: true
+
+  /@jest/globals@29.5.0:
+    resolution: {integrity: sha512-S02y0qMWGihdzNbUiqSAiKSpSozSuHX5UYc7QbnHP+D9Lyw8DgGGCinrN9uSuHPeKgSSzvPom2q1nAtBvUsvPQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/environment': 29.5.0
+      '@jest/expect': 29.5.0
+      '@jest/types': 29.5.0
+      jest-mock: 29.5.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@jest/reporters@29.5.0:
+    resolution: {integrity: sha512-D05STXqj/M8bP9hQNSICtPqz97u7ffGzZu+9XLucXhkOFBqKcXe04JLZOgIekOxdb73MAoBUFnqvf7MCpKk5OA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+    dependencies:
+      '@bcoe/v8-coverage': 0.2.3
+      '@jest/console': 29.5.0
+      '@jest/test-result': 29.5.0
+      '@jest/transform': 29.5.0
+      '@jest/types': 29.5.0
+      '@jridgewell/trace-mapping': 0.3.18
+      '@types/node': 20.2.5
+      chalk: 4.1.2
+      collect-v8-coverage: 1.0.1
+      exit: 0.1.2
+      glob: 7.2.3
+      graceful-fs: 4.2.11
+      istanbul-lib-coverage: 3.2.0
+      istanbul-lib-instrument: 5.2.1
+      istanbul-lib-report: 3.0.0
+      istanbul-lib-source-maps: 4.0.1
+      istanbul-reports: 3.1.5
+      jest-message-util: 29.5.0
+      jest-util: 29.5.0
+      jest-worker: 29.5.0
+      slash: 3.0.0
+      string-length: 4.0.2
+      strip-ansi: 6.0.1
+      v8-to-istanbul: 9.1.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@jest/schemas@29.4.3:
+    resolution: {integrity: sha512-VLYKXQmtmuEz6IxJsrZwzG9NvtkQsWNnWMsKxqWNu3+CnfzJQhp0WDDKWLVV9hLKr0l3SLLFRqcYHjhtyuDVxg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@sinclair/typebox': 0.25.24
+    dev: true
+
+  /@jest/source-map@29.4.3:
+    resolution: {integrity: sha512-qyt/mb6rLyd9j1jUts4EQncvS6Yy3PM9HghnNv86QBlV+zdL2inCdK1tuVlL+J+lpiw2BI67qXOrX3UurBqQ1w==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jridgewell/trace-mapping': 0.3.18
+      callsites: 3.1.0
+      graceful-fs: 4.2.11
+    dev: true
+
+  /@jest/test-result@29.5.0:
+    resolution: {integrity: sha512-fGl4rfitnbfLsrfx1uUpDEESS7zM8JdgZgOCQuxQvL1Sn/I6ijeAVQWGfXI9zb1i9Mzo495cIpVZhA0yr60PkQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/console': 29.5.0
+      '@jest/types': 29.5.0
+      '@types/istanbul-lib-coverage': 2.0.4
+      collect-v8-coverage: 1.0.1
+    dev: true
+
+  /@jest/test-sequencer@29.5.0:
+    resolution: {integrity: sha512-yPafQEcKjkSfDXyvtgiV4pevSeyuA6MQr6ZIdVkWJly9vkqjnFfcfhRQqpD5whjoU8EORki752xQmjaqoFjzMQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/test-result': 29.5.0
+      graceful-fs: 4.2.11
+      jest-haste-map: 29.5.0
+      slash: 3.0.0
+    dev: true
+
+  /@jest/transform@29.5.0:
+    resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@babel/core': 7.22.1
+      '@jest/types': 29.5.0
+      '@jridgewell/trace-mapping': 0.3.18
+      babel-plugin-istanbul: 6.1.1
+      chalk: 4.1.2
+      convert-source-map: 2.0.0
+      fast-json-stable-stringify: 2.1.0
+      graceful-fs: 4.2.11
+      jest-haste-map: 29.5.0
+      jest-regex-util: 29.4.3
+      jest-util: 29.5.0
+      micromatch: 4.0.5
+      pirates: 4.0.5
+      slash: 3.0.0
+      write-file-atomic: 4.0.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@jest/types@27.5.1:
+    resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+    dependencies:
+      '@types/istanbul-lib-coverage': 2.0.4
+      '@types/istanbul-reports': 3.0.1
+      '@types/node': 20.2.5
+      '@types/yargs': 16.0.5
+      chalk: 4.1.2
+    dev: true
+
+  /@jest/types@29.5.0:
+    resolution: {integrity: sha512-qbu7kN6czmVRc3xWFQcAN03RAUamgppVUdXrvl1Wr3jlNF93o9mJbGcDWrwGB6ht44u7efB1qCFgVQmca24Uog==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/schemas': 29.4.3
+      '@types/istanbul-lib-coverage': 2.0.4
+      '@types/istanbul-reports': 3.0.1
+      '@types/node': 20.2.5
+      '@types/yargs': 17.0.24
+      chalk: 4.1.2
+    dev: true
+
+  /@jridgewell/gen-mapping@0.3.3:
+    resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==}
+    engines: {node: '>=6.0.0'}
+    dependencies:
+      '@jridgewell/set-array': 1.1.2
+      '@jridgewell/sourcemap-codec': 1.4.15
+      '@jridgewell/trace-mapping': 0.3.18
+
+  /@jridgewell/resolve-uri@3.1.0:
+    resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
+    engines: {node: '>=6.0.0'}
+
+  /@jridgewell/resolve-uri@3.1.1:
+    resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==}
+    engines: {node: '>=6.0.0'}
+    dev: true
+
+  /@jridgewell/set-array@1.1.2:
+    resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
+    engines: {node: '>=6.0.0'}
+
+  /@jridgewell/source-map@0.3.3:
+    resolution: {integrity: sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==}
+    dependencies:
+      '@jridgewell/gen-mapping': 0.3.3
+      '@jridgewell/trace-mapping': 0.3.18
+
+  /@jridgewell/sourcemap-codec@1.4.14:
+    resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
+
+  /@jridgewell/sourcemap-codec@1.4.15:
+    resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+
+  /@jridgewell/trace-mapping@0.3.18:
+    resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==}
+    dependencies:
+      '@jridgewell/resolve-uri': 3.1.0
+      '@jridgewell/sourcemap-codec': 1.4.14
+
+  /@jridgewell/trace-mapping@0.3.9:
+    resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==}
+    dependencies:
+      '@jridgewell/resolve-uri': 3.1.1
+      '@jridgewell/sourcemap-codec': 1.4.15
+    dev: true
+
+  /@loadable/component@5.15.2(react@18.1.0):
+    resolution: {integrity: sha512-ryFAZOX5P2vFkUdzaAtTG88IGnr9qxSdvLRvJySXcUA4B4xVWurUNADu3AnKPksxOZajljqTrDEDcYjeL4lvLw==}
+    engines: {node: '>=8'}
+    peerDependencies:
+      react: '>=16.3.0'
+    dependencies:
+      '@babel/runtime': 7.21.0
+      hoist-non-react-statics: 3.3.2
+      react: 18.1.0
+      react-is: 16.13.1
+    dev: true
+
+  /@loadable/component@5.15.2(react@18.2.0):
+    resolution: {integrity: sha512-ryFAZOX5P2vFkUdzaAtTG88IGnr9qxSdvLRvJySXcUA4B4xVWurUNADu3AnKPksxOZajljqTrDEDcYjeL4lvLw==}
+    engines: {node: '>=8'}
+    peerDependencies:
+      react: '>=16.3.0'
+    dependencies:
+      '@babel/runtime': 7.21.0
+      hoist-non-react-statics: 3.3.2
+      react: 18.2.0
+      react-is: 16.13.1
+    dev: true
+
+  /@nicolo-ribaudo/chokidar-2@2.1.8-no-fsevents.3:
+    resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==}
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1:
+    resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==}
+    dependencies:
+      eslint-scope: 5.1.1
+    dev: true
+
+  /@nodelib/fs.scandir@2.1.5:
+    resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+    engines: {node: '>= 8'}
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      run-parallel: 1.2.0
+
+  /@nodelib/fs.stat@2.0.5:
+    resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
+    engines: {node: '>= 8'}
+
+  /@nodelib/fs.walk@1.2.8:
+    resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
+    engines: {node: '>= 8'}
+    dependencies:
+      '@nodelib/fs.scandir': 2.1.5
+      fastq: 1.15.0
+
+  /@pkgr/utils@2.4.1:
+    resolution: {integrity: sha512-JOqwkgFEyi+OROIyq7l4Jy28h/WwhDnG/cPkXG2Z1iFbubB6jsHW1NDvmyOzTBxHr3yg68YGirmh1JUgMqa+9w==}
+    engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+    dependencies:
+      cross-spawn: 7.0.3
+      fast-glob: 3.2.12
+      is-glob: 4.0.3
+      open: 9.1.0
+      picocolors: 1.0.0
+      tslib: 2.5.2
+    dev: true
+
+  /@pmmmwh/react-refresh-webpack-plugin@0.5.10(react-refresh@0.14.0)(webpack@5.84.1):
+    resolution: {integrity: sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==}
+    engines: {node: '>= 10.13'}
+    peerDependencies:
+      '@types/webpack': 4.x || 5.x
+      react-refresh: '>=0.10.0 <1.0.0'
+      sockjs-client: ^1.4.0
+      type-fest: '>=0.17.0 <4.0.0'
+      webpack: '>=4.43.0 <6.0.0'
+      webpack-dev-server: 3.x || 4.x
+      webpack-hot-middleware: 2.x
+      webpack-plugin-serve: 0.x || 1.x
+    peerDependenciesMeta:
+      '@types/webpack':
+        optional: true
+      sockjs-client:
+        optional: true
+      type-fest:
+        optional: true
+      webpack-dev-server:
+        optional: true
+      webpack-hot-middleware:
+        optional: true
+      webpack-plugin-serve:
+        optional: true
+    dependencies:
+      ansi-html-community: 0.0.8
+      common-path-prefix: 3.0.0
+      core-js-pure: 3.30.2
+      error-stack-parser: 2.1.4
+      find-up: 5.0.0
+      html-entities: 2.3.3
+      loader-utils: 2.0.4
+      react-refresh: 0.14.0
+      schema-utils: 3.1.2
+      source-map: 0.7.4
+      webpack: 5.84.1
+    dev: true
+
+  /@qixian.cs/path-to-regexp@6.1.0:
+    resolution: {integrity: sha512-2jIiLiVZB1jnY7IIRQKtoV8Gnr7XIhk4mC88ONGunZE3hYt5IHUG4BE/6+JiTBjjEWQLBeWnZB8hGpppkufiVw==}
+    dev: false
+
+  /@radix-ui/popper@0.0.10:
+    resolution: {integrity: sha512-YFKuPqQPKscreQid7NuB4it3PMzSwGg03vgrud6sVliHkI43QNAOHyrHyMNo015jg6QK5GVDn+7J2W5uygqSGA==}
+    dependencies:
+      '@babel/runtime': 7.22.3
+      csstype: 3.1.2
+    dev: true
+
+  /@rc-component/color-picker@1.1.1(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-MKYqgEncpISQiZIaj8ykcdzZewgjslEfDo2iHg627jPnt+DbWIKG1T8MS55qXjuxkokgL0cNueyGnOndfaaNKw==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@ctrl/tinycolor': 3.6.0
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /@rc-component/context@1.3.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-6QdaCJ7Wn5UZLJs15IEfqy4Ru3OaL5ctqpQYWd5rlfV9wwzrzdt6+kgAQZV/qdB0MUPN4nhyBfRembQCIvBf+w==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /@rc-component/mini-decimal@1.0.1:
+    resolution: {integrity: sha512-9N8nRk0oKj1qJzANKl+n9eNSMUGsZtjwNuDCiZ/KA+dt1fE3zq5x2XxclRcAbOIXnZcJ53ozP2Pa60gyELXagA==}
+    engines: {node: '>=8.x'}
+    dependencies:
+      '@babel/runtime': 7.22.3
+
+  /@rc-component/mutate-observer@1.0.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-okqRJSfNisXdI6CUeOLZC5ukBW/8kir2Ii4PJiKpUt+3+uS7dxwJUMxsUZquxA1rQuL8YcEmKVp/TCnR+yUdZA==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /@rc-component/portal@1.1.1(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-m8w3dFXX0H6UkJ4wtfrSwhe2/6M08uz24HHrF8pWfAXPwA9hwCuTE5per/C86KwNLouRpwFGcr7LfpHaa1F38g==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /@rc-component/tour@1.8.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-rrRGioHTLQlGca27G2+lw7QpRb3uuMYCUIJjj31/B44VCJS0P2tqYhOgtzvWQmaLMlWH3ZlpzotkKX13NT4XEA==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0)
+      '@rc-component/trigger': 1.13.3(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /@rc-component/trigger@1.13.3(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-CA4s8QGj2kagp8dmYRVcSIW5IErw/YBxSeFEsQmt6SB0oaj9pj+akkB6O0S/Y6ww5JrIDu9Bukq89se1oW9F3w==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      rc-align: 4.0.15(react-dom@18.2.0)(react@18.2.0)
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /@remix-run/router@1.6.2:
+    resolution: {integrity: sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA==}
+    engines: {node: '>=14'}
+    dev: true
+
+  /@sinclair/typebox@0.25.24:
+    resolution: {integrity: sha512-XJfwUVUKDHF5ugKwIcxEgc9k8b7HbznCp6eUfWgu710hMPNIO4aw4/zB5RogDQz8nd6gyCDpU9O/m6qYEWY6yQ==}
+    dev: true
+
+  /@sinonjs/commons@3.0.0:
+    resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==}
+    dependencies:
+      type-detect: 4.0.8
+    dev: true
+
+  /@sinonjs/fake-timers@10.2.0:
+    resolution: {integrity: sha512-OPwQlEdg40HAj5KNF8WW6q2KG4Z+cBCZb3m4ninfTZKaBmbIJodviQsDBoYMPHkOyJJMHnOJo5j2+LKDOhOACg==}
+    dependencies:
+      '@sinonjs/commons': 3.0.0
+    dev: true
+
+  /@stylelint/postcss-css-in-js@0.37.3(postcss-syntax@0.36.2)(postcss@7.0.39):
+    resolution: {integrity: sha512-scLk3cSH1H9KggSniseb2KNAU5D9FWc3H7BxCSAIdtU9OWIyw0zkEZ9qEKHryRM+SExYXRKNb7tOOVNAsQ3iwg==}
+    deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
+    peerDependencies:
+      postcss: '>=7.0.0'
+      postcss-syntax: '>=0.36.2'
+    dependencies:
+      '@babel/core': 7.22.1
+      postcss: 7.0.39
+      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@stylelint/postcss-css-in-js@0.38.0(postcss-syntax@0.36.2)(postcss@8.4.24):
+    resolution: {integrity: sha512-XOz5CAe49kS95p5yRd+DAIWDojTjfmyAQ4bbDlXMdbZTQ5t0ThjSLvWI6JI2uiS7MFurVBkZ6zUqcimzcLTBoQ==}
+    deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
+    peerDependencies:
+      postcss: '>=7.0.0'
+      postcss-syntax: '>=0.36.2'
+    dependencies:
+      '@babel/core': 7.21.0
+      postcss: 8.4.24
+      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@stylelint/postcss-markdown@0.36.2(postcss-syntax@0.36.2)(postcss@7.0.39):
+    resolution: {integrity: sha512-2kGbqUVJUGE8dM+bMzXG/PYUWKkjLIkRLWNh39OaADkiabDRdw8ATFCgbMz5xdIcvwspPAluSL7uY+ZiTWdWmQ==}
+    deprecated: 'Use the original unforked package instead: postcss-markdown'
+    peerDependencies:
+      postcss: '>=7.0.0'
+      postcss-syntax: '>=0.36.2'
+    dependencies:
+      postcss: 7.0.39
+      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39)
+      remark: 13.0.0
+      unist-util-find-all-after: 3.0.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@svgr/babel-plugin-add-jsx-attribute@6.5.1(@babel/core@7.22.1):
+    resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+    dev: true
+
+  /@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.22.1):
+    resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+    dev: true
+
+  /@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.22.1):
+    resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+    dev: true
+
+  /@svgr/babel-plugin-replace-jsx-attribute-value@6.5.1(@babel/core@7.22.1):
+    resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+    dev: true
+
+  /@svgr/babel-plugin-svg-dynamic-title@6.5.1(@babel/core@7.22.1):
+    resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+    dev: true
+
+  /@svgr/babel-plugin-svg-em-dimensions@6.5.1(@babel/core@7.22.1):
+    resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+    dev: true
+
+  /@svgr/babel-plugin-transform-react-native-svg@6.5.1(@babel/core@7.22.1):
+    resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+    dev: true
+
+  /@svgr/babel-plugin-transform-svg-component@6.5.1(@babel/core@7.22.1):
+    resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+    dev: true
+
+  /@svgr/babel-preset@6.5.1(@babel/core@7.22.1):
+    resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@svgr/babel-plugin-add-jsx-attribute': 6.5.1(@babel/core@7.22.1)
+      '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.22.1)
+      '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.22.1)
+      '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1(@babel/core@7.22.1)
+      '@svgr/babel-plugin-svg-dynamic-title': 6.5.1(@babel/core@7.22.1)
+      '@svgr/babel-plugin-svg-em-dimensions': 6.5.1(@babel/core@7.22.1)
+      '@svgr/babel-plugin-transform-react-native-svg': 6.5.1(@babel/core@7.22.1)
+      '@svgr/babel-plugin-transform-svg-component': 6.5.1(@babel/core@7.22.1)
+    dev: true
+
+  /@svgr/core@6.5.1:
+    resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==}
+    engines: {node: '>=10'}
+    dependencies:
+      '@babel/core': 7.22.1
+      '@svgr/babel-preset': 6.5.1(@babel/core@7.22.1)
+      '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1)
+      camelcase: 6.3.0
+      cosmiconfig: 7.1.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@svgr/hast-util-to-babel-ast@6.5.1:
+    resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==}
+    engines: {node: '>=10'}
+    dependencies:
+      '@babel/types': 7.22.3
+      entities: 4.5.0
+    dev: true
+
+  /@svgr/plugin-jsx@6.5.1(@svgr/core@6.5.1):
+    resolution: {integrity: sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      '@svgr/core': ^6.0.0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@svgr/babel-preset': 6.5.1(@babel/core@7.22.1)
+      '@svgr/core': 6.5.1
+      '@svgr/hast-util-to-babel-ast': 6.5.1
+      svg-parser: 2.0.4
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@svgr/plugin-svgo@6.5.1(@svgr/core@6.5.1):
+    resolution: {integrity: sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      '@svgr/core': '*'
+    dependencies:
+      '@svgr/core': 6.5.1
+      cosmiconfig: 7.1.0
+      deepmerge: 4.3.1
+      svgo: 2.8.0
+    dev: true
+
+  /@tanstack/match-sorter-utils@8.8.4:
+    resolution: {integrity: sha512-rKH8LjZiszWEvmi01NR72QWZ8m4xmXre0OOwlRGnjU01Eqz/QnN+cqpty2PJ0efHblq09+KilvyR7lsbzmXVEw==}
+    engines: {node: '>=12'}
+    dependencies:
+      remove-accents: 0.4.2
+    dev: true
+
+  /@tanstack/query-core@4.29.11:
+    resolution: {integrity: sha512-8C+hF6SFAb/TlFZyS9FItgNwrw4PMa7YeX+KQYe2ZAiEz6uzg6yIr+QBzPkUwZ/L0bXvGd1sufTm3wotoz+GwQ==}
+    dev: true
+
+  /@tanstack/react-query-devtools@4.29.11(@tanstack/react-query@4.29.11)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-paOSRfNtUbeo3anTtKgRSaMGplAN2VilmzLR9a3lbVZVCF4EzvL1Xmp4Xv9cDN8kGuv2CZTvUP6lvyxPlKSpew==}
+    peerDependencies:
+      '@tanstack/react-query': 4.29.11
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+    dependencies:
+      '@tanstack/match-sorter-utils': 8.8.4
+      '@tanstack/react-query': 4.29.11(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      superjson: 1.12.3
+      use-sync-external-store: 1.2.0(react@18.2.0)
+    dev: true
+
+  /@tanstack/react-query@4.29.11(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-aLaOAhBnCr12YKPjDsZOc0fAtkyaW7f9KfVfw49oYpfe0H9EPXBUgDBIKJ8qdHF3uGzTVSMcmpiw1Za41BLZlw==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0
+      react-native: '*'
+    peerDependenciesMeta:
+      react-dom:
+        optional: true
+      react-native:
+        optional: true
+    dependencies:
+      '@tanstack/query-core': 4.29.11
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      use-sync-external-store: 1.2.0(react@18.2.0)
+    dev: true
+
+  /@testing-library/dom@8.20.0:
+    resolution: {integrity: sha512-d9ULIT+a4EXLX3UU8FBjauG9NnsZHkHztXoIcTsOKoOw030fyjheN9svkTULjJxtYag9DZz5Jz5qkWZDPxTFwA==}
+    engines: {node: '>=12'}
+    dependencies:
+      '@babel/code-frame': 7.21.4
+      '@babel/runtime': 7.22.3
+      '@types/aria-query': 5.0.1
+      aria-query: 5.1.3
+      chalk: 4.1.2
+      dom-accessibility-api: 0.5.16
+      lz-string: 1.5.0
+      pretty-format: 27.5.1
+    dev: true
+
+  /@testing-library/react@13.4.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==}
+    engines: {node: '>=12'}
+    peerDependencies:
+      react: ^18.0.0
+      react-dom: ^18.0.0
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@testing-library/dom': 8.20.0
+      '@types/react-dom': 18.2.4
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /@tootallnate/once@2.0.0:
+    resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
+    engines: {node: '>= 10'}
+    dev: true
+
+  /@trysound/sax@0.2.0:
+    resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
+    engines: {node: '>=10.13.0'}
+    dev: true
+
+  /@tsconfig/node10@1.0.9:
+    resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==}
+    dev: true
+
+  /@tsconfig/node12@1.0.11:
+    resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==}
+    dev: true
+
+  /@tsconfig/node14@1.0.3:
+    resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==}
+    dev: true
+
+  /@tsconfig/node16@1.0.4:
+    resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==}
+    dev: true
+
+  /@types/aria-query@5.0.1:
+    resolution: {integrity: sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==}
+    dev: true
+
+  /@types/babel__core@7.20.1:
+    resolution: {integrity: sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==}
+    dependencies:
+      '@babel/parser': 7.22.3
+      '@babel/types': 7.22.3
+      '@types/babel__generator': 7.6.4
+      '@types/babel__template': 7.4.1
+      '@types/babel__traverse': 7.20.0
+    dev: true
+
+  /@types/babel__generator@7.6.4:
+    resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==}
+    dependencies:
+      '@babel/types': 7.22.3
+    dev: true
+
+  /@types/babel__template@7.4.1:
+    resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==}
+    dependencies:
+      '@babel/parser': 7.22.3
+      '@babel/types': 7.22.3
+    dev: true
+
+  /@types/babel__traverse@7.20.0:
+    resolution: {integrity: sha512-TBOjqAGf0hmaqRwpii5LLkJLg7c6OMm4nHLmpsUxwk9bBHtoTC6dAHdVWdGv4TBxj2CZOZY8Xfq8WmfoVi7n4Q==}
+    dependencies:
+      '@babel/types': 7.22.3
+    dev: true
+
+  /@types/body-parser@1.19.2:
+    resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==}
+    dependencies:
+      '@types/connect': 3.4.35
+      '@types/node': 20.2.5
+    dev: true
+
+  /@types/classnames@2.3.1:
+    resolution: {integrity: sha512-zeOWb0JGBoVmlQoznvqXbE0tEC/HONsnoUNH19Hc96NFsTAwTXbTqb8FMYkru1F/iqp7a18Ws3nWJvtA1sHD1A==}
+    deprecated: This is a stub types definition. classnames provides its own type definitions, so you do not need this installed.
+    dependencies:
+      classnames: 2.3.2
+    dev: true
+
+  /@types/connect@3.4.35:
+    resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==}
+    dependencies:
+      '@types/node': 20.2.5
+    dev: true
+
+  /@types/eslint-scope@3.7.4:
+    resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==}
+    dependencies:
+      '@types/eslint': 8.40.0
+      '@types/estree': 1.0.1
+
+  /@types/eslint@7.29.0:
+    resolution: {integrity: sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==}
+    dependencies:
+      '@types/estree': 1.0.1
+      '@types/json-schema': 7.0.12
+    dev: true
+
+  /@types/eslint@8.40.0:
+    resolution: {integrity: sha512-nbq2mvc/tBrK9zQQuItvjJl++GTN5j06DaPtp3hZCpngmG6Q3xoyEmd0TwZI0gAy/G1X0zhGBbr2imsGFdFV0g==}
+    dependencies:
+      '@types/estree': 1.0.1
+      '@types/json-schema': 7.0.12
+
+  /@types/estree@1.0.1:
+    resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==}
+
+  /@types/express-serve-static-core@4.17.35:
+    resolution: {integrity: sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==}
+    dependencies:
+      '@types/node': 20.2.5
+      '@types/qs': 6.9.7
+      '@types/range-parser': 1.2.4
+      '@types/send': 0.17.1
+    dev: true
+
+  /@types/express@4.17.17:
+    resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==}
+    dependencies:
+      '@types/body-parser': 1.19.2
+      '@types/express-serve-static-core': 4.17.35
+      '@types/qs': 6.9.7
+      '@types/serve-static': 1.15.1
+    dev: true
+
+  /@types/glob@7.2.0:
+    resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==}
+    dependencies:
+      '@types/minimatch': 5.1.2
+      '@types/node': 20.2.5
+    dev: true
+
+  /@types/graceful-fs@4.1.6:
+    resolution: {integrity: sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==}
+    dependencies:
+      '@types/node': 20.2.5
+    dev: true
+
+  /@types/hapi__joi@17.1.9:
+    resolution: {integrity: sha512-oOMFT8vmCTFncsF1engrs04jatz8/Anwx3De9uxnOK4chgSEgWBvFtpSoJo8u3784JNO+ql5tzRR6phHoRnscQ==}
+    dev: true
+
+  /@types/history@4.7.11:
+    resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==}
+    dev: true
+
+  /@types/hoist-non-react-statics@3.3.1:
+    resolution: {integrity: sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==}
+    dependencies:
+      '@types/react': 18.2.7
+      hoist-non-react-statics: 3.3.2
+    dev: true
+
+  /@types/html-minifier-terser@6.1.0:
+    resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==}
+    dev: true
+
+  /@types/invariant@2.2.35:
+    resolution: {integrity: sha512-DxX1V9P8zdJPYQat1gHyY0xj3efl8gnMVjiM9iCY6y27lj+PoQWkgjt8jDqmovPqULkKVpKRg8J36iQiA+EtEg==}
+    dev: true
+
+  /@types/isomorphic-fetch@0.0.34:
+    resolution: {integrity: sha512-BmJKuPCZCR6pbYYgi5nKFJrPC4pLoBgsi/B1nFN64Ba+hLLGUcKPIh7eVlR2xG763Ap08hgQafq/Wx4RFb0omQ==}
+    dev: true
+
+  /@types/istanbul-lib-coverage@2.0.4:
+    resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==}
+    dev: true
+
+  /@types/istanbul-lib-report@3.0.0:
+    resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==}
+    dependencies:
+      '@types/istanbul-lib-coverage': 2.0.4
+    dev: true
+
+  /@types/istanbul-reports@3.0.1:
+    resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==}
+    dependencies:
+      '@types/istanbul-lib-report': 3.0.0
+    dev: true
+
+  /@types/jest@29.5.1:
+    resolution: {integrity: sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==}
+    dependencies:
+      expect: 29.5.0
+      pretty-format: 29.5.0
+    dev: true
+
+  /@types/js-cookie@2.2.7:
+    resolution: {integrity: sha512-aLkWa0C0vO5b4Sr798E26QgOkss68Un0bLjs7u9qxzPT5CG+8DuNTffWES58YzJs3hrVAOs1wonycqEBqNJubA==}
+    dev: true
+
+  /@types/jsdom@20.0.1:
+    resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==}
+    dependencies:
+      '@types/node': 20.2.5
+      '@types/tough-cookie': 4.0.2
+      parse5: 7.1.2
+    dev: true
+
+  /@types/json-schema@7.0.12:
+    resolution: {integrity: sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==}
+
+  /@types/lodash@4.14.195:
+    resolution: {integrity: sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==}
+    dev: true
+
+  /@types/mdast@3.0.11:
+    resolution: {integrity: sha512-Y/uImid8aAwrEA24/1tcRZwpxX3pIFTSilcNDKSPn+Y2iDywSEachzRuvgAYYLR3wpGXAsMbv5lvKLDZLeYPAw==}
+    dependencies:
+      '@types/unist': 2.0.6
+    dev: true
+
+  /@types/mime@1.3.2:
+    resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==}
+    dev: true
+
+  /@types/mime@3.0.1:
+    resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==}
+    dev: true
+
+  /@types/minimatch@5.1.2:
+    resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==}
+    dev: true
+
+  /@types/minimist@1.2.2:
+    resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==}
+    dev: true
+
+  /@types/node@12.20.55:
+    resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
+    dev: true
+
+  /@types/node@20.2.5:
+    resolution: {integrity: sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==}
+
+  /@types/normalize-package-data@2.4.1:
+    resolution: {integrity: sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==}
+    dev: true
+
+  /@types/parse-json@4.0.0:
+    resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==}
+
+  /@types/prettier@2.7.2:
+    resolution: {integrity: sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==}
+    dev: true
+
+  /@types/prop-types@15.7.5:
+    resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
+    dev: true
+
+  /@types/qs@6.9.7:
+    resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==}
+    dev: true
+
+  /@types/range-parser@1.2.4:
+    resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==}
+    dev: true
+
+  /@types/react-dom@18.2.4:
+    resolution: {integrity: sha512-G2mHoTMTL4yoydITgOGwWdWMVd8sNgyEP85xVmMKAPUBwQWm9wBPQUmvbeF4V3WBY1P7mmL4BkjQ0SqUpf1snw==}
+    dependencies:
+      '@types/react': 18.2.7
+    dev: true
+
+  /@types/react-helmet@6.1.6:
+    resolution: {integrity: sha512-ZKcoOdW/Tg+kiUbkFCBtvDw0k3nD4HJ/h/B9yWxN4uDO8OkRksWTO+EL+z/Qu3aHTeTll3Ro0Cc/8UhwBCMG5A==}
+    dependencies:
+      '@types/react': 18.2.7
+    dev: true
+
+  /@types/react-redux@7.1.25:
+    resolution: {integrity: sha512-bAGh4e+w5D8dajd6InASVIyCo4pZLJ66oLb80F9OBLO1gKESbZcRCJpTT6uLXX+HAB57zw1WTdwJdAsewuTweg==}
+    dependencies:
+      '@types/hoist-non-react-statics': 3.3.1
+      '@types/react': 18.2.7
+      hoist-non-react-statics: 3.3.2
+      redux: 4.2.1
+    dev: true
+
+  /@types/react-router-dom@4.3.5:
+    resolution: {integrity: sha512-eFajSUASYbPHg2BDM1G8Btx+YqGgvROPIg6sBhl3O4kbDdYXdFdfrgQFf/pcBuQVObjfT9AL/dd15jilR5DIEA==}
+    dependencies:
+      '@types/history': 4.7.11
+      '@types/react': 18.2.7
+      '@types/react-router': 5.1.20
+    dev: true
+
+  /@types/react-router-redux@5.0.22:
+    resolution: {integrity: sha512-0Vcr0HzpZTC+PQVY6vGJ57yv1hFZSPFs/QHqYPbn2uEDKUYBV3dAZQtoTYhsa1bGqRE91yedgX29AM68FlxfmA==}
+    dependencies:
+      '@types/history': 4.7.11
+      '@types/react': 18.2.7
+      '@types/react-router': 5.1.20
+      redux: 4.2.1
+    dev: true
+
+  /@types/react-router@5.1.20:
+    resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==}
+    dependencies:
+      '@types/history': 4.7.11
+      '@types/react': 18.2.7
+    dev: true
+
+  /@types/react@18.2.7:
+    resolution: {integrity: sha512-ojrXpSH2XFCmHm7Jy3q44nXDyN54+EYKP2lBhJ2bqfyPj6cIUW/FZW/Csdia34NQgq7KYcAlHi5184m4X88+yw==}
+    dependencies:
+      '@types/prop-types': 15.7.5
+      '@types/scheduler': 0.16.3
+      csstype: 3.1.2
+    dev: true
+
+  /@types/scheduler@0.16.3:
+    resolution: {integrity: sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==}
+    dev: true
+
+  /@types/semver@7.5.0:
+    resolution: {integrity: sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==}
+    dev: true
+
+  /@types/send@0.17.1:
+    resolution: {integrity: sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==}
+    dependencies:
+      '@types/mime': 1.3.2
+      '@types/node': 20.2.5
+    dev: true
+
+  /@types/serve-static@1.15.1:
+    resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==}
+    dependencies:
+      '@types/mime': 3.0.1
+      '@types/node': 20.2.5
+    dev: true
+
+  /@types/stack-utils@2.0.1:
+    resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==}
+    dev: true
+
+  /@types/tough-cookie@4.0.2:
+    resolution: {integrity: sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==}
+    dev: true
+
+  /@types/unist@2.0.6:
+    resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==}
+    dev: true
+
+  /@types/use-sync-external-store@0.0.3:
+    resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==}
+    dev: true
+
+  /@types/yargs-parser@21.0.0:
+    resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==}
+    dev: true
+
+  /@types/yargs@16.0.5:
+    resolution: {integrity: sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==}
+    dependencies:
+      '@types/yargs-parser': 21.0.0
+    dev: true
+
+  /@types/yargs@17.0.24:
+    resolution: {integrity: sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==}
+    dependencies:
+      '@types/yargs-parser': 21.0.0
+    dev: true
+
+  /@typescript-eslint/eslint-plugin@5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.35.0)(typescript@5.0.2):
+    resolution: {integrity: sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      '@typescript-eslint/parser': ^5.0.0
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@typescript-eslint/parser': 5.48.1(eslint@8.35.0)(typescript@5.0.2)
+      '@typescript-eslint/scope-manager': 5.48.1
+      '@typescript-eslint/type-utils': 5.48.1(eslint@8.35.0)(typescript@5.0.2)
+      '@typescript-eslint/utils': 5.48.1(eslint@8.35.0)(typescript@5.0.2)
+      debug: 4.3.4(supports-color@5.5.0)
+      eslint: 8.35.0
+      ignore: 5.2.4
+      natural-compare-lite: 1.4.0
+      regexpp: 3.2.0
+      semver: 7.5.1
+      tsutils: 3.21.0(typescript@5.0.2)
+      typescript: 5.0.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@typescript-eslint/eslint-plugin@5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.41.0)(typescript@5.0.2):
+    resolution: {integrity: sha512-9nY5K1Rp2ppmpb9s9S2aBiF3xo5uExCehMDmYmmFqqyxgenbHJ3qbarcLt4ITgaD6r/2ypdlcFRdcuVPnks+fQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      '@typescript-eslint/parser': ^5.0.0
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@typescript-eslint/parser': 5.48.1(eslint@8.41.0)(typescript@5.0.2)
+      '@typescript-eslint/scope-manager': 5.48.1
+      '@typescript-eslint/type-utils': 5.48.1(eslint@8.41.0)(typescript@5.0.2)
+      '@typescript-eslint/utils': 5.48.1(eslint@8.41.0)(typescript@5.0.2)
+      debug: 4.3.4(supports-color@5.5.0)
+      eslint: 8.41.0
+      ignore: 5.2.4
+      natural-compare-lite: 1.4.0
+      regexpp: 3.2.0
+      semver: 7.5.1
+      tsutils: 3.21.0(typescript@5.0.2)
+      typescript: 5.0.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@typescript-eslint/eslint-plugin@5.59.7(@typescript-eslint/parser@5.59.7)(eslint@7.32.0)(typescript@4.9.5):
+    resolution: {integrity: sha512-BL+jYxUFIbuYwy+4fF86k5vdT9lT0CNJ6HtwrIvGh0PhH8s0yy5rjaKH2fDCrz5ITHy07WCzVGNvAmjJh4IJFA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      '@typescript-eslint/parser': ^5.0.0
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@eslint-community/regexpp': 4.5.1
+      '@typescript-eslint/parser': 5.59.7(eslint@7.32.0)(typescript@4.9.5)
+      '@typescript-eslint/scope-manager': 5.59.7
+      '@typescript-eslint/type-utils': 5.59.7(eslint@7.32.0)(typescript@4.9.5)
+      '@typescript-eslint/utils': 5.59.7(eslint@7.32.0)(typescript@4.9.5)
+      debug: 4.3.4(supports-color@5.5.0)
+      eslint: 7.32.0
+      grapheme-splitter: 1.0.4
+      ignore: 5.2.4
+      natural-compare-lite: 1.4.0
+      semver: 7.5.1
+      tsutils: 3.21.0(typescript@4.9.5)
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@typescript-eslint/experimental-utils@4.33.0(eslint@7.32.0)(typescript@4.9.5):
+    resolution: {integrity: sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==}
+    engines: {node: ^10.12.0 || >=12.0.0}
+    peerDependencies:
+      eslint: '*'
+    dependencies:
+      '@types/json-schema': 7.0.12
+      '@typescript-eslint/scope-manager': 4.33.0
+      '@typescript-eslint/types': 4.33.0
+      '@typescript-eslint/typescript-estree': 4.33.0(typescript@4.9.5)
+      eslint: 7.32.0
+      eslint-scope: 5.1.1
+      eslint-utils: 3.0.0(eslint@7.32.0)
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+    dev: true
+
+  /@typescript-eslint/parser@5.48.1(eslint@8.35.0)(typescript@5.0.2):
+    resolution: {integrity: sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@typescript-eslint/scope-manager': 5.48.1
+      '@typescript-eslint/types': 5.48.1
+      '@typescript-eslint/typescript-estree': 5.48.1(typescript@5.0.2)
+      debug: 4.3.4(supports-color@5.5.0)
+      eslint: 8.35.0
+      typescript: 5.0.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@typescript-eslint/parser@5.48.1(eslint@8.41.0)(typescript@5.0.2):
+    resolution: {integrity: sha512-4yg+FJR/V1M9Xoq56SF9Iygqm+r5LMXvheo6DQ7/yUWynQ4YfCRnsKuRgqH4EQ5Ya76rVwlEpw4Xu+TgWQUcdA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@typescript-eslint/scope-manager': 5.48.1
+      '@typescript-eslint/types': 5.48.1
+      '@typescript-eslint/typescript-estree': 5.48.1(typescript@5.0.2)
+      debug: 4.3.4(supports-color@5.5.0)
+      eslint: 8.41.0
+      typescript: 5.0.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@typescript-eslint/parser@5.59.7(eslint@7.32.0)(typescript@4.9.5):
+    resolution: {integrity: sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@typescript-eslint/scope-manager': 5.59.7
+      '@typescript-eslint/types': 5.59.7
+      '@typescript-eslint/typescript-estree': 5.59.7(typescript@4.9.5)
+      debug: 4.3.4(supports-color@5.5.0)
+      eslint: 7.32.0
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@typescript-eslint/scope-manager@4.33.0:
+    resolution: {integrity: sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==}
+    engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1}
+    dependencies:
+      '@typescript-eslint/types': 4.33.0
+      '@typescript-eslint/visitor-keys': 4.33.0
+    dev: true
+
+  /@typescript-eslint/scope-manager@5.48.1:
+    resolution: {integrity: sha512-S035ueRrbxRMKvSTv9vJKIWgr86BD8s3RqoRZmsSh/s8HhIs90g6UlK8ZabUSjUZQkhVxt7nmZ63VJ9dcZhtDQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dependencies:
+      '@typescript-eslint/types': 5.48.1
+      '@typescript-eslint/visitor-keys': 5.48.1
+    dev: true
+
+  /@typescript-eslint/scope-manager@5.59.7:
+    resolution: {integrity: sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dependencies:
+      '@typescript-eslint/types': 5.59.7
+      '@typescript-eslint/visitor-keys': 5.59.7
+    dev: true
+
+  /@typescript-eslint/type-utils@5.48.1(eslint@8.35.0)(typescript@5.0.2):
+    resolution: {integrity: sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '*'
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@typescript-eslint/typescript-estree': 5.48.1(typescript@5.0.2)
+      '@typescript-eslint/utils': 5.48.1(eslint@8.35.0)(typescript@5.0.2)
+      debug: 4.3.4(supports-color@5.5.0)
+      eslint: 8.35.0
+      tsutils: 3.21.0(typescript@5.0.2)
+      typescript: 5.0.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@typescript-eslint/type-utils@5.48.1(eslint@8.41.0)(typescript@5.0.2):
+    resolution: {integrity: sha512-Hyr8HU8Alcuva1ppmqSYtM/Gp0q4JOp1F+/JH5D1IZm/bUBrV0edoewQZiEc1r6I8L4JL21broddxK8HAcZiqQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '*'
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@typescript-eslint/typescript-estree': 5.48.1(typescript@5.0.2)
+      '@typescript-eslint/utils': 5.48.1(eslint@8.41.0)(typescript@5.0.2)
+      debug: 4.3.4(supports-color@5.5.0)
+      eslint: 8.41.0
+      tsutils: 3.21.0(typescript@5.0.2)
+      typescript: 5.0.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@typescript-eslint/type-utils@5.59.7(eslint@7.32.0)(typescript@4.9.5):
+    resolution: {integrity: sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: '*'
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@typescript-eslint/typescript-estree': 5.59.7(typescript@4.9.5)
+      '@typescript-eslint/utils': 5.59.7(eslint@7.32.0)(typescript@4.9.5)
+      debug: 4.3.4(supports-color@5.5.0)
+      eslint: 7.32.0
+      tsutils: 3.21.0(typescript@4.9.5)
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@typescript-eslint/types@4.33.0:
+    resolution: {integrity: sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==}
+    engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1}
+    dev: true
+
+  /@typescript-eslint/types@5.48.1:
+    resolution: {integrity: sha512-xHyDLU6MSuEEdIlzrrAerCGS3T7AA/L8Hggd0RCYBi0w3JMvGYxlLlXHeg50JI9Tfg5MrtsfuNxbS/3zF1/ATg==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dev: true
+
+  /@typescript-eslint/types@5.59.7:
+    resolution: {integrity: sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dev: true
+
+  /@typescript-eslint/typescript-estree@4.33.0(typescript@4.9.5):
+    resolution: {integrity: sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==}
+    engines: {node: ^10.12.0 || >=12.0.0}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@typescript-eslint/types': 4.33.0
+      '@typescript-eslint/visitor-keys': 4.33.0
+      debug: 4.3.4(supports-color@5.5.0)
+      globby: 11.1.0
+      is-glob: 4.0.3
+      semver: 7.5.1
+      tsutils: 3.21.0(typescript@4.9.5)
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@typescript-eslint/typescript-estree@5.48.1(typescript@5.0.2):
+    resolution: {integrity: sha512-Hut+Osk5FYr+sgFh8J/FHjqX6HFcDzTlWLrFqGoK5kVUN3VBHF/QzZmAsIXCQ8T/W9nQNBTqalxi1P3LSqWnRA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@typescript-eslint/types': 5.48.1
+      '@typescript-eslint/visitor-keys': 5.48.1
+      debug: 4.3.4(supports-color@5.5.0)
+      globby: 11.1.0
+      is-glob: 4.0.3
+      semver: 7.5.1
+      tsutils: 3.21.0(typescript@5.0.2)
+      typescript: 5.0.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@typescript-eslint/typescript-estree@5.59.7(typescript@4.9.5):
+    resolution: {integrity: sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@typescript-eslint/types': 5.59.7
+      '@typescript-eslint/visitor-keys': 5.59.7
+      debug: 4.3.4(supports-color@5.5.0)
+      globby: 11.1.0
+      is-glob: 4.0.3
+      semver: 7.5.1
+      tsutils: 3.21.0(typescript@4.9.5)
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@typescript-eslint/typescript-estree@5.59.7(typescript@5.0.2):
+    resolution: {integrity: sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      typescript: '*'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@typescript-eslint/types': 5.59.7
+      '@typescript-eslint/visitor-keys': 5.59.7
+      debug: 4.3.4(supports-color@5.5.0)
+      globby: 11.1.0
+      is-glob: 4.0.3
+      semver: 7.5.1
+      tsutils: 3.21.0(typescript@5.0.2)
+      typescript: 5.0.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@typescript-eslint/utils@5.48.1(eslint@8.35.0)(typescript@5.0.2):
+    resolution: {integrity: sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+    dependencies:
+      '@types/json-schema': 7.0.12
+      '@types/semver': 7.5.0
+      '@typescript-eslint/scope-manager': 5.48.1
+      '@typescript-eslint/types': 5.48.1
+      '@typescript-eslint/typescript-estree': 5.48.1(typescript@5.0.2)
+      eslint: 8.35.0
+      eslint-scope: 5.1.1
+      eslint-utils: 3.0.0(eslint@8.35.0)
+      semver: 7.5.1
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+    dev: true
+
+  /@typescript-eslint/utils@5.48.1(eslint@8.41.0)(typescript@5.0.2):
+    resolution: {integrity: sha512-SmQuSrCGUOdmGMwivW14Z0Lj8dxG1mOFZ7soeJ0TQZEJcs3n5Ndgkg0A4bcMFzBELqLJ6GTHnEU+iIoaD6hFGA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+    dependencies:
+      '@types/json-schema': 7.0.12
+      '@types/semver': 7.5.0
+      '@typescript-eslint/scope-manager': 5.48.1
+      '@typescript-eslint/types': 5.48.1
+      '@typescript-eslint/typescript-estree': 5.48.1(typescript@5.0.2)
+      eslint: 8.41.0
+      eslint-scope: 5.1.1
+      eslint-utils: 3.0.0(eslint@8.41.0)
+      semver: 7.5.1
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+    dev: true
+
+  /@typescript-eslint/utils@5.59.7(eslint@7.32.0)(typescript@4.9.5):
+    resolution: {integrity: sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.0(eslint@7.32.0)
+      '@types/json-schema': 7.0.12
+      '@types/semver': 7.5.0
+      '@typescript-eslint/scope-manager': 5.59.7
+      '@typescript-eslint/types': 5.59.7
+      '@typescript-eslint/typescript-estree': 5.59.7(typescript@4.9.5)
+      eslint: 7.32.0
+      eslint-scope: 5.1.1
+      semver: 7.5.1
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+    dev: true
+
+  /@typescript-eslint/utils@5.59.7(eslint@8.35.0)(typescript@5.0.2):
+    resolution: {integrity: sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.35.0)
+      '@types/json-schema': 7.0.12
+      '@types/semver': 7.5.0
+      '@typescript-eslint/scope-manager': 5.59.7
+      '@typescript-eslint/types': 5.59.7
+      '@typescript-eslint/typescript-estree': 5.59.7(typescript@5.0.2)
+      eslint: 8.35.0
+      eslint-scope: 5.1.1
+      semver: 7.5.1
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+    dev: true
+
+  /@typescript-eslint/utils@5.59.7(eslint@8.41.0)(typescript@5.0.2):
+    resolution: {integrity: sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.41.0)
+      '@types/json-schema': 7.0.12
+      '@types/semver': 7.5.0
+      '@typescript-eslint/scope-manager': 5.59.7
+      '@typescript-eslint/types': 5.59.7
+      '@typescript-eslint/typescript-estree': 5.59.7(typescript@5.0.2)
+      eslint: 8.41.0
+      eslint-scope: 5.1.1
+      semver: 7.5.1
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+    dev: true
+
+  /@typescript-eslint/visitor-keys@4.33.0:
+    resolution: {integrity: sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==}
+    engines: {node: ^8.10.0 || ^10.13.0 || >=11.10.1}
+    dependencies:
+      '@typescript-eslint/types': 4.33.0
+      eslint-visitor-keys: 2.1.0
+    dev: true
+
+  /@typescript-eslint/visitor-keys@5.48.1:
+    resolution: {integrity: sha512-Ns0XBwmfuX7ZknznfXozgnydyR8F6ev/KEGePP4i74uL3ArsKbEhJ7raeKr1JSa997DBDwol/4a0Y+At82c9dA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dependencies:
+      '@typescript-eslint/types': 5.48.1
+      eslint-visitor-keys: 3.4.1
+    dev: true
+
+  /@typescript-eslint/visitor-keys@5.59.7:
+    resolution: {integrity: sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dependencies:
+      '@typescript-eslint/types': 5.59.7
+      eslint-visitor-keys: 3.4.1
+    dev: true
+
+  /@umijs/ast@4.0.69:
+    resolution: {integrity: sha512-Bsq9j00EHL5owk3KpfZyGB65JZ29wyd8w1WBHWjgKX1LkKmiprV73E6DgFjIyNVNw3mX2r2HNtmFPJycmJR0mw==}
+    dependencies:
+      '@umijs/bundler-utils': 4.0.69
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@umijs/babel-preset-umi@4.0.69(styled-components@5.3.11):
+    resolution: {integrity: sha512-0978ONVhvUuu0c5CRcwaMZYrvNYjmNaTD0JRNZQMaT9/2H65rnj9dazY4OT07dSEN9ZKIcJb3mTalNdVw2/rHA==}
+    dependencies:
+      '@babel/runtime': 7.21.0
+      '@bloomberg/record-tuple-polyfill': 0.0.4
+      '@umijs/bundler-utils': 4.0.69
+      '@umijs/utils': 4.0.69
+      babel-plugin-styled-components: 2.1.1(styled-components@5.3.11)
+      core-js: 3.28.0
+    transitivePeerDependencies:
+      - styled-components
+      - supports-color
+    dev: true
+
+  /@umijs/bundler-esbuild@4.0.69:
+    resolution: {integrity: sha512-3WcjSnQT818pSZsgE+Q10ADA+e8Co1Wd1M3Hxk05hLoIpUlMXkA5E/NS/C0UY+D3g/4R9zoxd7oqSvT62VEajw==}
+    hasBin: true
+    dependencies:
+      '@umijs/bundler-utils': 4.0.69
+      '@umijs/utils': 4.0.69
+      enhanced-resolve: 5.9.3
+      postcss: 8.4.24
+      postcss-flexbugs-fixes: 5.0.2(postcss@8.4.24)
+      postcss-preset-env: 7.5.0(postcss@8.4.24)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@umijs/bundler-utils@4.0.59:
+    resolution: {integrity: sha512-hgScOWi1x3vrKMAMFdZNanDN0p4Iae1avsuP8vcpLtXBNSgGbWeNJCv0fVgInyfH1EsTNd2CzhqwR8lFOhA+tg==}
+    dependencies:
+      '@umijs/utils': 4.0.59
+      esbuild: 0.16.17
+      regenerate: 1.4.2
+      regenerate-unicode-properties: 10.1.0
+      spdy: 4.0.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@umijs/bundler-utils@4.0.69:
+    resolution: {integrity: sha512-xdKsz3q0zHpR+oeYz0nrxsHBv7++CmFsSZBh3SjQlmyOr8yrjMsqF9VaW1olh+syrkHFvxX5OdMF21oQPuIQVg==}
+    dependencies:
+      '@umijs/utils': 4.0.69
+      esbuild: 0.16.17
+      regenerate: 1.4.2
+      regenerate-unicode-properties: 10.1.0
+      spdy: 4.0.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@umijs/bundler-vite@4.0.69(@types/node@20.2.5)(postcss@8.4.24):
+    resolution: {integrity: sha512-IZVX230PbLPlBOgecZR1O5q90g09H/DjbmedUUgmK5bdmG8tdLXnGnZYgQ1V8rp9WjAr+4TkO4kVkui3Az16Cw==}
+    hasBin: true
+    dependencies:
+      '@svgr/core': 6.5.1
+      '@umijs/bundler-utils': 4.0.69
+      '@umijs/utils': 4.0.69
+      '@vitejs/plugin-react': 4.0.0(vite@4.3.1)
+      less: 4.1.3
+      postcss-preset-env: 7.5.0(postcss@8.4.24)
+      rollup-plugin-visualizer: 5.9.0
+      vite: 4.3.1(@types/node@20.2.5)(less@4.1.3)
+    transitivePeerDependencies:
+      - '@types/node'
+      - postcss
+      - rollup
+      - sass
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+    dev: true
+
+  /@umijs/bundler-webpack@4.0.69(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1):
+    resolution: {integrity: sha512-p1h3MvcYr5aecrWwLDS0UZf5GgrITQuZAEl382zC6quB2TtWrJ/5BNxxQxuMyt9/Uf5IeqSvlLJGfp0ipyaD8Q==}
+    hasBin: true
+    dependencies:
+      '@pmmmwh/react-refresh-webpack-plugin': 0.5.10(react-refresh@0.14.0)(webpack@5.84.1)
+      '@svgr/core': 6.5.1
+      '@svgr/plugin-jsx': 6.5.1(@svgr/core@6.5.1)
+      '@svgr/plugin-svgo': 6.5.1(@svgr/core@6.5.1)
+      '@types/hapi__joi': 17.1.9
+      '@umijs/babel-preset-umi': 4.0.69(styled-components@5.3.11)
+      '@umijs/bundler-utils': 4.0.69
+      '@umijs/case-sensitive-paths-webpack-plugin': 1.0.1
+      '@umijs/mfsu': 4.0.69
+      '@umijs/utils': 4.0.69
+      cors: 2.8.5
+      css-loader: 6.7.1(webpack@5.84.1)
+      es5-imcompatible-versions: 0.1.82
+      fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.0.2)(webpack@5.84.1)
+      jest-worker: 29.4.3
+      lightningcss: 1.19.0
+      node-libs-browser: 2.2.1
+      postcss: 8.4.24
+      postcss-preset-env: 7.5.0(postcss@8.4.24)
+      react-error-overlay: 6.0.9
+      react-refresh: 0.14.0
+    transitivePeerDependencies:
+      - '@types/webpack'
+      - sockjs-client
+      - styled-components
+      - supports-color
+      - type-fest
+      - typescript
+      - webpack
+      - webpack-dev-server
+      - webpack-hot-middleware
+      - webpack-plugin-serve
+    dev: true
+
+  /@umijs/case-sensitive-paths-webpack-plugin@1.0.1:
+    resolution: {integrity: sha512-kDKJ8yTarxwxGJDInG33hOpaQRZ//XpNuuznQ/1Mscypw6kappzFmrBr2dOYave++K7JHouoANF354UpbEQw0Q==}
+    dev: true
+
+  /@umijs/core@4.0.69:
+    resolution: {integrity: sha512-UXeEJqSY5kTf+cqrBYkTIVZ/JxPYrnoP6VAyZmHVgydv6+eoalFKhuhOcX5X5diIBK1F2Xcs9nUtJHn+OH/y+w==}
+    dependencies:
+      '@umijs/bundler-utils': 4.0.69
+      '@umijs/utils': 4.0.69
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@umijs/did-you-know@1.0.3:
+    resolution: {integrity: sha512-9EZ+rgY9+2HEaE+Z9dGkal2ccw8L4uuz77tCB5WpskW7NBZX5nOj82sqF/shEtA5tU3SWO/Mi4n35K3iONvDtw==}
+    dev: true
+
+  /@umijs/es-module-parser-darwin-arm64@0.0.7:
+    resolution: {integrity: sha512-1QeNupekuVYVvL4UHyCRq4ISP2PNk4rDd9UOPONW+KpqTyP9p7RfgGpwB0VLPaFSu2ADtm0XZyIaYEGPY6zuDw==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@umijs/es-module-parser-darwin-x64@0.0.7:
+    resolution: {integrity: sha512-FBFmfigmToPc9qBCW7wHiTYpqnLdPbAvoMGOydzAu2NspdPEF7TfILcr8vCPNbNe3vCobS+T/YM1dP+SagERlA==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@umijs/es-module-parser-linux-arm-gnueabihf@0.0.7:
+    resolution: {integrity: sha512-AXfmg3htkadLGsXUyiyrTig4omGCWIN4l+HS7Qapqv0wlfFYSpC0KPemjyBQgzXO70tDcT+1FNhGjIy+yr2pIQ==}
+    engines: {node: '>= 10'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@umijs/es-module-parser-linux-arm64-gnu@0.0.7:
+    resolution: {integrity: sha512-2wSdChFc39fPJwvS8tRq+jx8qNlIwrjRk1hb3N5o0rJR+rqt+ceAyNPbYwpNBmUHW7xtmDQvJUeinvr7hIBP+w==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@umijs/es-module-parser-linux-arm64-musl@0.0.7:
+    resolution: {integrity: sha512-cqQffARWkmQ3n1RYNKZR3aD6X8YaP6u1maASjDgPQOpZMAlv/OSDrM/7iGujWTs0PD0haockNG9/DcP6lgPHMw==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@umijs/es-module-parser-linux-x64-gnu@0.0.7:
+    resolution: {integrity: sha512-PHrKHtT665Za0Ydjch4ACrNpRU+WIIden12YyF1CtMdhuLDSoU6UfdhF3NoDbgEUcXVDX/ftOqmj0SbH3R1uew==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@umijs/es-module-parser-linux-x64-musl@0.0.7:
+    resolution: {integrity: sha512-cyZvUK5lcECLWzLp/eU1lFlCETcz+LEb+wrdARQSST1dgoIGZsT4cqM1WzYmdZNk3o883tiZizLt58SieEiHBQ==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@umijs/es-module-parser-win32-arm64-msvc@0.0.7:
+    resolution: {integrity: sha512-V7WxnUI88RboSl0RWLNQeKBT7EDW35fW6Tn92zqtoHHxrhAIL9DtDyvC8REP4qTxeZ6Oej/Ax5I6IjsLx3yTOg==}
+    engines: {node: '>= 10'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@umijs/es-module-parser-win32-x64-msvc@0.0.7:
+    resolution: {integrity: sha512-X3Pqy0l38hg6wMPquPeMHuoHU+Cx+wzyz32SVYCta+RPJQ7n9PjrEBiIuVAw5+GJZjSABN7LVr8u/n0RZT9EQA==}
+    engines: {node: '>= 10'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@umijs/es-module-parser@0.0.7:
+    resolution: {integrity: sha512-x47CMi/Hw7Nkz3RXTUqlldH/UM+Tcmw2PziV3k+itJqTFJc8oVx3lzdUgCnG+eL3ZtmLPbOEBhPb30V0NytNDQ==}
+    engines: {node: '>= 10'}
+    optionalDependencies:
+      '@umijs/es-module-parser-darwin-arm64': 0.0.7
+      '@umijs/es-module-parser-darwin-x64': 0.0.7
+      '@umijs/es-module-parser-linux-arm-gnueabihf': 0.0.7
+      '@umijs/es-module-parser-linux-arm64-gnu': 0.0.7
+      '@umijs/es-module-parser-linux-arm64-musl': 0.0.7
+      '@umijs/es-module-parser-linux-x64-gnu': 0.0.7
+      '@umijs/es-module-parser-linux-x64-musl': 0.0.7
+      '@umijs/es-module-parser-win32-arm64-msvc': 0.0.7
+      '@umijs/es-module-parser-win32-x64-msvc': 0.0.7
+    dev: true
+
+  /@umijs/fabric@2.14.1:
+    resolution: {integrity: sha512-fOyXcbViOB+/jW+g2rCiK9XjSZVn4OzFuMZpSCriCdR/KxhxLTokvJWFm3CzBEmg9vXfrBFQ4c/ykmqoVacHtw==}
+    hasBin: true
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/eslint-parser': 7.21.8(@babel/core@7.22.1)(eslint@7.32.0)
+      '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-proposal-decorators': 7.22.3(@babel/core@7.22.1)
+      '@babel/preset-env': 7.22.2(@babel/core@7.22.1)
+      '@babel/preset-react': 7.22.3(@babel/core@7.22.1)
+      '@babel/preset-typescript': 7.21.5(@babel/core@7.22.1)
+      '@typescript-eslint/eslint-plugin': 5.59.7(@typescript-eslint/parser@5.59.7)(eslint@7.32.0)(typescript@4.9.5)
+      '@typescript-eslint/parser': 5.59.7(eslint@7.32.0)(typescript@4.9.5)
+      chalk: 4.1.2
+      eslint: 7.32.0
+      eslint-config-prettier: 8.8.0(eslint@7.32.0)
+      eslint-formatter-pretty: 4.1.0
+      eslint-plugin-babel: 5.3.1(eslint@7.32.0)
+      eslint-plugin-jest: 24.7.0(@typescript-eslint/eslint-plugin@5.59.7)(eslint@7.32.0)(typescript@4.9.5)
+      eslint-plugin-promise: 6.1.1(eslint@7.32.0)
+      eslint-plugin-react: 7.32.2(eslint@7.32.0)
+      eslint-plugin-react-hooks: 4.6.0(eslint@7.32.0)
+      eslint-plugin-unicorn: 20.1.0(eslint@7.32.0)
+      fast-glob: 3.2.12
+      os-locale: 5.0.0
+      prettier: 2.8.8
+      prettier-plugin-packagejson: 2.3.0(prettier@2.8.8)
+      prettier-plugin-two-style-order: 1.0.1(prettier@2.8.8)
+      stylelint: 13.13.1
+      stylelint-config-css-modules: 2.3.0(stylelint@13.13.1)
+      stylelint-config-prettier: 8.0.2(stylelint@13.13.1)
+      stylelint-config-standard: 20.0.0(stylelint@13.13.1)
+      stylelint-declaration-block-no-ignored-properties: 2.7.0(stylelint@13.13.1)
+      typescript: 4.9.5
+    transitivePeerDependencies:
+      - postcss-jsx
+      - postcss-markdown
+      - supports-color
+    dev: true
+
+  /@umijs/history@5.3.1:
+    resolution: {integrity: sha512-/e0cEGrR2bIWQD7pRl3dl9dcyRGeC9hoW0OCvUTT/hjY0EfUrkd6G8ZanVghPMpDuY5usxq9GVcvrT8KNXLWvA==}
+    dependencies:
+      '@babel/runtime': 7.21.0
+      query-string: 6.14.1
+    dev: true
+
+  /@umijs/lint@4.0.69(eslint@8.35.0)(jest@29.5.0)(styled-components@5.3.11)(stylelint@14.8.2)(typescript@5.0.2):
+    resolution: {integrity: sha512-1b5e2wKLdbDczNIPQ6brO7eYUL633HtvEm+tf+4dOQJhvczs0zm6xUZAot0LMDPl/yyliFbLV3gk12ijcNRx6Q==}
+    dependencies:
+      '@babel/core': 7.21.0
+      '@babel/eslint-parser': 7.19.1(@babel/core@7.21.0)(eslint@8.35.0)
+      '@stylelint/postcss-css-in-js': 0.38.0(postcss-syntax@0.36.2)(postcss@8.4.24)
+      '@typescript-eslint/eslint-plugin': 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.35.0)(typescript@5.0.2)
+      '@typescript-eslint/parser': 5.48.1(eslint@8.35.0)(typescript@5.0.2)
+      '@umijs/babel-preset-umi': 4.0.69(styled-components@5.3.11)
+      eslint-plugin-jest: 27.2.1(@typescript-eslint/eslint-plugin@5.48.1)(eslint@8.35.0)(jest@29.5.0)(typescript@5.0.2)
+      eslint-plugin-react: 7.32.2(eslint@8.35.0)
+      eslint-plugin-react-hooks: 4.6.0(eslint@8.35.0)
+      postcss: 8.4.24
+      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39)
+      stylelint-config-standard: 25.0.0(stylelint@14.8.2)
+    transitivePeerDependencies:
+      - eslint
+      - jest
+      - postcss-html
+      - postcss-jsx
+      - postcss-less
+      - postcss-markdown
+      - postcss-scss
+      - styled-components
+      - stylelint
+      - supports-color
+      - typescript
+    dev: true
+
+  /@umijs/lint@4.0.69(eslint@8.41.0)(jest@29.5.0)(styled-components@5.3.11)(stylelint@14.16.1)(typescript@5.0.2):
+    resolution: {integrity: sha512-1b5e2wKLdbDczNIPQ6brO7eYUL633HtvEm+tf+4dOQJhvczs0zm6xUZAot0LMDPl/yyliFbLV3gk12ijcNRx6Q==}
+    dependencies:
+      '@babel/core': 7.21.0
+      '@babel/eslint-parser': 7.19.1(@babel/core@7.21.0)(eslint@8.41.0)
+      '@stylelint/postcss-css-in-js': 0.38.0(postcss-syntax@0.36.2)(postcss@8.4.24)
+      '@typescript-eslint/eslint-plugin': 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.41.0)(typescript@5.0.2)
+      '@typescript-eslint/parser': 5.48.1(eslint@8.41.0)(typescript@5.0.2)
+      '@umijs/babel-preset-umi': 4.0.69(styled-components@5.3.11)
+      eslint-plugin-jest: 27.2.1(@typescript-eslint/eslint-plugin@5.48.1)(eslint@8.41.0)(jest@29.5.0)(typescript@5.0.2)
+      eslint-plugin-react: 7.32.2(eslint@8.41.0)
+      eslint-plugin-react-hooks: 4.6.0(eslint@8.41.0)
+      postcss: 8.4.24
+      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39)
+      stylelint-config-standard: 25.0.0(stylelint@14.16.1)
+    transitivePeerDependencies:
+      - eslint
+      - jest
+      - postcss-html
+      - postcss-jsx
+      - postcss-less
+      - postcss-markdown
+      - postcss-scss
+      - styled-components
+      - stylelint
+      - supports-color
+      - typescript
+    dev: true
+
+  /@umijs/max-plugin-openapi@2.0.3:
+    resolution: {integrity: sha512-pV2GLscYHdOYNbQ1jgC+s99CGYFHegT/B+uRWVomL6+2mCdm9mP/KDSzGjkLZpL7PeXDlfPMsx/vSqAvDBGE2A==}
+    dependencies:
+      '@umijs/openapi': 1.8.3
+      rimraf: 4.4.1
+      serve-static: 1.15.0
+      swagger-ui-dist: 4.19.0
+    transitivePeerDependencies:
+      - chokidar
+      - encoding
+      - postcss-jsx
+      - postcss-markdown
+      - supports-color
+    dev: true
+
+  /@umijs/max@4.0.69(@babel/core@7.22.1)(@types/node@20.2.5)(@types/react-dom@18.2.4)(@types/react@18.2.7)(dva@2.5.0-beta.2)(jest@29.5.0)(postcss@8.4.24)(prettier@2.8.8)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1):
+    resolution: {integrity: sha512-S6V27+g1NR6NjawRvAX596WwY68UBFPw76uydBv4QjdXGkMnSVIXLU8/zySf3ZWRLkchG3VcNH8PlBIIPkpgCQ==}
+    hasBin: true
+    dependencies:
+      '@umijs/lint': 4.0.69(eslint@8.35.0)(jest@29.5.0)(styled-components@5.3.11)(stylelint@14.8.2)(typescript@5.0.2)
+      '@umijs/plugins': 4.0.69(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@4.24.10)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      antd: 4.24.10(react-dom@18.2.0)(react@18.2.0)
+      eslint: 8.35.0
+      stylelint: 14.8.2
+      umi: 4.0.69(@babel/core@7.22.1)(@types/node@20.2.5)(@types/react@18.2.7)(eslint@8.35.0)(jest@29.5.0)(postcss@8.4.24)(prettier@2.8.8)(react-dom@18.2.0)(react@18.2.0)(styled-components@5.3.11)(stylelint@14.8.2)(typescript@5.0.2)(webpack@5.84.1)
+    transitivePeerDependencies:
+      - '@babel/core'
+      - '@types/lodash.merge'
+      - '@types/node'
+      - '@types/react'
+      - '@types/react-dom'
+      - '@types/webpack'
+      - '@volar/vue-language-plugin-pug'
+      - '@volar/vue-typescript'
+      - babel-plugin-styled-components
+      - debug
+      - dva
+      - jest
+      - postcss
+      - postcss-html
+      - postcss-jsx
+      - postcss-less
+      - postcss-markdown
+      - postcss-scss
+      - prettier
+      - prop-types
+      - rc-field-form
+      - react
+      - react-dom
+      - react-native
+      - rollup
+      - sass
+      - sockjs-client
+      - styled-components
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+      - type-fest
+      - typescript
+      - webpack
+      - webpack-dev-server
+      - webpack-hot-middleware
+      - webpack-plugin-serve
+    dev: true
+
+  /@umijs/mfsu@4.0.69:
+    resolution: {integrity: sha512-ITLKw1DGAOMSeiQicXXO5nQh9FLMaf0/lxaZtAPYboq9DcodfJIG+J4xHYTjE+Ns5/9TQjkqMqTsKUCGCN6SIw==}
+    dependencies:
+      '@umijs/bundler-esbuild': 4.0.69
+      '@umijs/bundler-utils': 4.0.69
+      '@umijs/utils': 4.0.69
+      enhanced-resolve: 5.9.3
+      is-equal: 1.6.4
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@umijs/openapi@1.8.3:
+    resolution: {integrity: sha512-17xgd/x2aouxl/cITy0YD3TJ+kPf/rX+zXLJYg/Cf1DavMLntoqalcUQeh5/VtVO2+rSGtEepC3Ppl54LHqSUA==}
+    dependencies:
+      '@umijs/fabric': 2.14.1
+      chalk: 4.1.2
+      dayjs: 1.11.7
+      glob: 7.2.3
+      lodash: 4.17.21
+      memoizee: 0.4.15
+      mock.js: 0.2.0
+      mockjs: 1.1.0
+      node-fetch: 2.6.11
+      nunjucks: 3.2.4
+      openapi3-ts: 2.0.2
+      prettier: 2.8.8
+      reserved-words: 0.1.2
+      rimraf: 3.0.2
+      swagger2openapi: 7.0.8
+      tiny-pinyin: 1.3.2
+    transitivePeerDependencies:
+      - chokidar
+      - encoding
+      - postcss-jsx
+      - postcss-markdown
+      - supports-color
+    dev: true
+
+  /@umijs/plugin-run@4.0.69:
+    resolution: {integrity: sha512-GzdbWdTUZt4/ZtxOn7AdPffrLXIaBp6ZiT5zJIugRuWnKLwJyNSmrAy1iD3ks4ZyEGfAqRd9Ou0Q+clmLGR7FA==}
+    dependencies:
+      tsx: 3.12.7
+    dev: true
+
+  /@umijs/plugins@4.0.59(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@5.5.1)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-Sa0CI09Ewu1r4p+CQxMpCf6HYjaAVf2OtvW7z3J5CLe7hDo45KQ5/9iYKCXV5GEoSVXvYkiDJyDjCerEkfU/gw==}
+    dependencies:
+      '@ahooksjs/use-request': 2.8.15(react@18.2.0)
+      '@ant-design/antd-theme-variable': 1.0.0
+      '@ant-design/icons': 4.8.0(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/pro-components': 2.4.16(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@tanstack/react-query': 4.29.11(react-dom@18.2.0)(react@18.2.0)
+      '@tanstack/react-query-devtools': 4.29.11(@tanstack/react-query@4.29.11)(react-dom@18.2.0)(react@18.2.0)
+      '@umijs/bundler-utils': 4.0.59
+      '@umijs/valtio': 1.0.3(react@18.2.0)
+      antd-dayjs-webpack-plugin: 1.0.6(dayjs@1.11.7)
+      axios: 0.27.2
+      babel-plugin-import: 1.13.6
+      dayjs: 1.11.7
+      dva-core: 2.0.4(redux@4.2.1)
+      dva-immer: 1.0.1(dva@2.5.0-beta.2)
+      dva-loading: 3.0.24(dva-core@2.0.4)
+      event-emitter: 0.3.5
+      fast-deep-equal: 3.1.3
+      intl: 1.2.5
+      lodash: 4.17.21
+      moment: 2.29.4
+      qiankun: 2.10.8
+      react-intl: 3.12.1(react@18.2.0)
+      react-redux: 8.0.5(@types/react-dom@18.2.4)(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1)
+      redux: 4.2.1
+      styled-components: 6.0.0-beta.9(react-dom@18.2.0)(react@18.2.0)(tslib@2.5.2)
+      tslib: 2.5.2
+      warning: 4.0.3
+    transitivePeerDependencies:
+      - '@types/lodash.merge'
+      - '@types/react'
+      - '@types/react-dom'
+      - antd
+      - babel-plugin-styled-components
+      - debug
+      - dva
+      - prop-types
+      - rc-field-form
+      - react
+      - react-dom
+      - react-native
+      - shallowequal
+      - stylis
+      - supports-color
+    dev: true
+
+  /@umijs/plugins@4.0.69(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@4.24.10)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-tPDO816TFrE+UJ1293n+TytSGw53VexP6pZREPTwKZNdHgAgV/WdnKV0rsWsyUouiDXXbFCPwnoc1HNK+ve34w==}
+    dependencies:
+      '@ahooksjs/use-request': 2.8.15(react@18.2.0)
+      '@ant-design/antd-theme-variable': 1.0.0
+      '@ant-design/icons': 4.8.0(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/moment-webpack-plugin': 0.0.3
+      '@ant-design/pro-components': 2.4.16(antd@4.24.10)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@tanstack/react-query': 4.29.11(react-dom@18.2.0)(react@18.2.0)
+      '@tanstack/react-query-devtools': 4.29.11(@tanstack/react-query@4.29.11)(react-dom@18.2.0)(react@18.2.0)
+      '@umijs/bundler-utils': 4.0.69
+      '@umijs/valtio': 1.0.3(react@18.2.0)
+      antd-dayjs-webpack-plugin: 1.0.6(dayjs@1.11.7)
+      axios: 0.27.2
+      babel-plugin-import: 1.13.6
+      dayjs: 1.11.7
+      dva-core: 2.0.4(redux@4.2.1)
+      dva-immer: 1.0.1(dva@2.5.0-beta.2)
+      dva-loading: 3.0.24(dva-core@2.0.4)
+      event-emitter: 0.3.5
+      fast-deep-equal: 3.1.3
+      intl: 1.2.5
+      lodash: 4.17.21
+      moment: 2.29.4
+      qiankun: 2.10.8
+      react-intl: 3.12.1(react@18.2.0)
+      react-redux: 8.0.5(@types/react-dom@18.2.4)(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1)
+      redux: 4.2.1
+      styled-components: 6.0.0-rc.0(react-dom@18.2.0)(react@18.2.0)
+      tslib: 2.5.2
+      warning: 4.0.3
+    transitivePeerDependencies:
+      - '@types/lodash.merge'
+      - '@types/react'
+      - '@types/react-dom'
+      - antd
+      - babel-plugin-styled-components
+      - debug
+      - dva
+      - prop-types
+      - rc-field-form
+      - react
+      - react-dom
+      - react-native
+      - supports-color
+    dev: true
+
+  /@umijs/plugins@4.0.69(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@5.5.1)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-tPDO816TFrE+UJ1293n+TytSGw53VexP6pZREPTwKZNdHgAgV/WdnKV0rsWsyUouiDXXbFCPwnoc1HNK+ve34w==}
+    dependencies:
+      '@ahooksjs/use-request': 2.8.15(react@18.2.0)
+      '@ant-design/antd-theme-variable': 1.0.0
+      '@ant-design/icons': 4.8.0(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/moment-webpack-plugin': 0.0.3
+      '@ant-design/pro-components': 2.4.16(antd@5.5.1)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@tanstack/react-query': 4.29.11(react-dom@18.2.0)(react@18.2.0)
+      '@tanstack/react-query-devtools': 4.29.11(@tanstack/react-query@4.29.11)(react-dom@18.2.0)(react@18.2.0)
+      '@umijs/bundler-utils': 4.0.69
+      '@umijs/valtio': 1.0.3(react@18.2.0)
+      antd-dayjs-webpack-plugin: 1.0.6(dayjs@1.11.7)
+      axios: 0.27.2
+      babel-plugin-import: 1.13.6
+      dayjs: 1.11.7
+      dva-core: 2.0.4(redux@4.2.1)
+      dva-immer: 1.0.1(dva@2.5.0-beta.2)
+      dva-loading: 3.0.24(dva-core@2.0.4)
+      event-emitter: 0.3.5
+      fast-deep-equal: 3.1.3
+      intl: 1.2.5
+      lodash: 4.17.21
+      moment: 2.29.4
+      qiankun: 2.10.8
+      react-intl: 3.12.1(react@18.2.0)
+      react-redux: 8.0.5(@types/react-dom@18.2.4)(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1)
+      redux: 4.2.1
+      styled-components: 6.0.0-rc.0(react-dom@18.2.0)(react@18.2.0)
+      tslib: 2.5.2
+      warning: 4.0.3
+    transitivePeerDependencies:
+      - '@types/lodash.merge'
+      - '@types/react'
+      - '@types/react-dom'
+      - antd
+      - babel-plugin-styled-components
+      - debug
+      - dva
+      - prop-types
+      - rc-field-form
+      - react
+      - react-dom
+      - react-native
+      - supports-color
+    dev: true
+
+  /@umijs/preset-umi@4.0.69(@types/node@20.2.5)(@types/react@18.2.7)(postcss@8.4.24)(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1):
+    resolution: {integrity: sha512-W/Olv2ldPtGnPa+mbsFZwoyEhykCcWTbkmowf/4AewHe0n5CJEyqjeo1cOlD7fr8RbpIqzoxdlMrlMi/bBqbNQ==}
+    dependencies:
+      '@iconify/utils': 2.1.1
+      '@svgr/core': 6.5.1
+      '@umijs/ast': 4.0.69
+      '@umijs/babel-preset-umi': 4.0.69(styled-components@5.3.11)
+      '@umijs/bundler-utils': 4.0.69
+      '@umijs/bundler-vite': 4.0.69(@types/node@20.2.5)(postcss@8.4.24)
+      '@umijs/bundler-webpack': 4.0.69(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1)
+      '@umijs/core': 4.0.69
+      '@umijs/did-you-know': 1.0.3
+      '@umijs/es-module-parser': 0.0.7
+      '@umijs/history': 5.3.1
+      '@umijs/mfsu': 4.0.69
+      '@umijs/plugin-run': 4.0.69
+      '@umijs/renderer-react': 4.0.69(react-dom@18.1.0)(react@18.1.0)
+      '@umijs/server': 4.0.69
+      '@umijs/ui': 3.0.1
+      '@umijs/utils': 4.0.69
+      '@umijs/zod2ts': 4.0.69
+      babel-plugin-dynamic-import-node: 2.3.3
+      click-to-react-component: 1.0.8(@types/react@18.2.7)(react-dom@18.1.0)(react@18.1.0)
+      core-js: 3.28.0
+      current-script-polyfill: 1.0.0
+      enhanced-resolve: 5.9.3
+      fast-glob: 3.2.12
+      html-webpack-plugin: 5.5.0(webpack@5.84.1)
+      path-to-regexp: 1.7.0
+      postcss-prefix-selector: 1.16.0(postcss@8.4.24)
+      react: 18.1.0
+      react-dom: 18.1.0(react@18.1.0)
+      react-router: 6.3.0(react@18.1.0)
+      react-router-dom: 6.3.0(react-dom@18.1.0)(react@18.1.0)
+      regenerator-runtime: 0.13.11
+    transitivePeerDependencies:
+      - '@types/node'
+      - '@types/react'
+      - '@types/webpack'
+      - postcss
+      - rollup
+      - sass
+      - sockjs-client
+      - styled-components
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+      - type-fest
+      - typescript
+      - webpack
+      - webpack-dev-server
+      - webpack-hot-middleware
+      - webpack-plugin-serve
+    dev: true
+
+  /@umijs/renderer-react@4.0.69(react-dom@18.1.0)(react@18.1.0):
+    resolution: {integrity: sha512-7jD97cXoesulvqESJipTV3KJ0eEvtp94Kk/nUH82vYysHQlCS+P/WeWXqKo7nC4fvDCDGMz4aUV16r6Is7ZL8A==}
+    peerDependencies:
+      react: '>=16.8'
+      react-dom: '>=16.8'
+    dependencies:
+      '@babel/runtime': 7.21.0
+      '@loadable/component': 5.15.2(react@18.1.0)
+      history: 5.3.0
+      react: 18.1.0
+      react-dom: 18.1.0(react@18.1.0)
+      react-helmet-async: 1.3.0(react-dom@18.1.0)(react@18.1.0)
+      react-router-dom: 6.3.0(react-dom@18.1.0)(react@18.1.0)
+    dev: true
+
+  /@umijs/renderer-react@4.0.69(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-7jD97cXoesulvqESJipTV3KJ0eEvtp94Kk/nUH82vYysHQlCS+P/WeWXqKo7nC4fvDCDGMz4aUV16r6Is7ZL8A==}
+    peerDependencies:
+      react: '>=16.8'
+      react-dom: '>=16.8'
+    dependencies:
+      '@babel/runtime': 7.21.0
+      '@loadable/component': 5.15.2(react@18.2.0)
+      history: 5.3.0
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      react-helmet-async: 1.3.0(react-dom@18.2.0)(react@18.2.0)
+      react-router-dom: 6.3.0(react-dom@18.2.0)(react@18.2.0)
+    dev: true
+
+  /@umijs/request-record@1.1.4(umi@4.0.69):
+    resolution: {integrity: sha512-GFfAxgqbOMlhFpqGLNxizA4ywmPK+mxfJ53IdBw1IDd2Vzp5qLzlelbx0X1X+2v4dh9KE57YtjT9H7us66uw7Q==}
+    peerDependencies:
+      umi: '>=3'
+    dependencies:
+      chokidar: 3.5.3
+      express: 4.18.2
+      lodash: 4.17.21
+      prettier: 2.8.8
+      umi: 4.0.69(@babel/core@7.22.1)(@types/node@20.2.5)(@types/react@18.2.7)(eslint@8.41.0)(jest@29.5.0)(postcss@8.4.24)(prettier@2.8.8)(react-dom@18.2.0)(react@18.2.0)(styled-components@5.3.11)(stylelint@14.16.1)(typescript@5.0.2)(webpack@5.84.1)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@umijs/route-utils@2.2.2:
+    resolution: {integrity: sha512-cMk6qizy0pfpiwpVCvNQB0BKBUJEH33pDv5q5k2tSleSDw2abkJkTu2Kd5hKzoESLuFK43oGeOfcplZqm2bRxw==}
+    dependencies:
+      '@qixian.cs/path-to-regexp': 6.1.0
+      fast-deep-equal: 3.1.3
+      lodash.isequal: 4.5.0
+      memoize-one: 5.2.1
+    dev: false
+
+  /@umijs/route-utils@4.0.1:
+    resolution: {integrity: sha512-+1ixf1BTOLuH+ORb4x8vYMPeIt38n9q0fJDwhv9nSxrV46mxbLF0nmELIo9CKQB2gHfuC4+hww6xejJ6VYnBHQ==}
+
+  /@umijs/server@4.0.69:
+    resolution: {integrity: sha512-znL4i6XC1dLmDCHk7fw3cKlehB4qKUqJeIao6j/eSzlfm6mCFzygsGqxzN8obrjCV0ohe/F/4WIRJDkEqwHleQ==}
+    dependencies:
+      '@umijs/bundler-utils': 4.0.69
+      history: 5.3.0
+      react: 18.1.0
+      react-dom: 18.1.0(react@18.1.0)
+      react-router-dom: 6.3.0(react-dom@18.1.0)(react@18.1.0)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@umijs/test@4.0.69(@babel/core@7.22.1):
+    resolution: {integrity: sha512-xkTNawfhz2xC0qqR2Q+JDJPoLNosSBNDAuna86YxNZK/WCvJ7n3/jehz2l9S6wxmstDW06yrXNM+IPoipUBAmg==}
+    dependencies:
+      '@babel/plugin-transform-modules-commonjs': 7.21.2(@babel/core@7.22.1)
+      '@jest/types': 27.5.1
+      '@umijs/bundler-utils': 4.0.69
+      '@umijs/utils': 4.0.69
+      babel-jest: 29.5.0(@babel/core@7.22.1)
+      esbuild: 0.16.17
+      identity-obj-proxy: 3.0.0
+      isomorphic-unfetch: 4.0.2
+    transitivePeerDependencies:
+      - '@babel/core'
+      - supports-color
+    dev: true
+
+  /@umijs/ui@3.0.1:
+    resolution: {integrity: sha512-zcz37AJH0xt/6XVVbyO/hmsK9Hq4vH23HZ4KYVi5A8rbM9KeJkJigTS7ELOdArawZhVNGe+h3a5Oixs4a2QsWw==}
+    dev: true
+
+  /@umijs/use-params@1.0.9(react@18.2.0):
+    resolution: {integrity: sha512-QlN0RJSBVQBwLRNxbxjQ5qzqYIGn+K7USppMoIOVlf7fxXHsnQZ2bEsa6Pm74bt6DVQxpUE8HqvdStn6Y9FV1w==}
+    peerDependencies:
+      react: '*'
+    dependencies:
+      react: 18.2.0
+
+  /@umijs/utils@4.0.59:
+    resolution: {integrity: sha512-NLRoZArsQArQyzIM/I3isWlRAYSpEh8lQ4JTqdIZQmyjRlNw1Lp80kDxlTcsmEpEa3ZkpHKKZNLJNpI99JdqTA==}
+    dependencies:
+      chokidar: 3.5.3
+      pino: 7.11.0
+    dev: true
+
+  /@umijs/utils@4.0.69:
+    resolution: {integrity: sha512-lLUsceXtNWBFb+A6/Sw/BRBrBCJMGCurkkuwFsPjVxuiHtJrI3X7RBUMH0uFilhG78dhQdHGN2tc+NH7Z1YXKw==}
+    dependencies:
+      chokidar: 3.5.3
+      pino: 7.11.0
+    dev: true
+
+  /@umijs/valtio@1.0.3(react@18.2.0):
+    resolution: {integrity: sha512-fjr1UMZLFOO+uy5YtLVcmvr+m2ZlU9rp04yXlCaPrKkdBg/UNPBVo6YS9TBx2v0a62gYaztLL3Put3dcNGH5tQ==}
+    dependencies:
+      valtio: 1.9.0(react@18.2.0)
+    transitivePeerDependencies:
+      - react
+    dev: true
+
+  /@umijs/zod2ts@4.0.69:
+    resolution: {integrity: sha512-whXJSz9vm8cuU+qUSGtcacuPGUG7Vp2yv1fiJ726mukb/bJS4uG/3tcCOOlkztV5cvkRB4QtZ6IEMaqvxtt7xw==}
+    dev: true
+
+  /@vitejs/plugin-react@4.0.0(vite@4.3.1):
+    resolution: {integrity: sha512-HX0XzMjL3hhOYm+0s95pb0Z7F8O81G7joUHgfDd/9J/ZZf5k4xX6QAMFkKsHFxaHlf6X7GD7+XuaZ66ULiJuhQ==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    peerDependencies:
+      vite: ^4.2.0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/plugin-transform-react-jsx-self': 7.21.0(@babel/core@7.22.1)
+      '@babel/plugin-transform-react-jsx-source': 7.19.6(@babel/core@7.22.1)
+      react-refresh: 0.14.0
+      vite: 4.3.1(@types/node@20.2.5)(less@4.1.3)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /@webassemblyjs/ast@1.11.6:
+    resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==}
+    dependencies:
+      '@webassemblyjs/helper-numbers': 1.11.6
+      '@webassemblyjs/helper-wasm-bytecode': 1.11.6
+
+  /@webassemblyjs/floating-point-hex-parser@1.11.6:
+    resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==}
+
+  /@webassemblyjs/helper-api-error@1.11.6:
+    resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==}
+
+  /@webassemblyjs/helper-buffer@1.11.6:
+    resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==}
+
+  /@webassemblyjs/helper-numbers@1.11.6:
+    resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==}
+    dependencies:
+      '@webassemblyjs/floating-point-hex-parser': 1.11.6
+      '@webassemblyjs/helper-api-error': 1.11.6
+      '@xtuc/long': 4.2.2
+
+  /@webassemblyjs/helper-wasm-bytecode@1.11.6:
+    resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==}
+
+  /@webassemblyjs/helper-wasm-section@1.11.6:
+    resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==}
+    dependencies:
+      '@webassemblyjs/ast': 1.11.6
+      '@webassemblyjs/helper-buffer': 1.11.6
+      '@webassemblyjs/helper-wasm-bytecode': 1.11.6
+      '@webassemblyjs/wasm-gen': 1.11.6
+
+  /@webassemblyjs/ieee754@1.11.6:
+    resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==}
+    dependencies:
+      '@xtuc/ieee754': 1.2.0
+
+  /@webassemblyjs/leb128@1.11.6:
+    resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==}
+    dependencies:
+      '@xtuc/long': 4.2.2
+
+  /@webassemblyjs/utf8@1.11.6:
+    resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==}
+
+  /@webassemblyjs/wasm-edit@1.11.6:
+    resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==}
+    dependencies:
+      '@webassemblyjs/ast': 1.11.6
+      '@webassemblyjs/helper-buffer': 1.11.6
+      '@webassemblyjs/helper-wasm-bytecode': 1.11.6
+      '@webassemblyjs/helper-wasm-section': 1.11.6
+      '@webassemblyjs/wasm-gen': 1.11.6
+      '@webassemblyjs/wasm-opt': 1.11.6
+      '@webassemblyjs/wasm-parser': 1.11.6
+      '@webassemblyjs/wast-printer': 1.11.6
+
+  /@webassemblyjs/wasm-gen@1.11.6:
+    resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==}
+    dependencies:
+      '@webassemblyjs/ast': 1.11.6
+      '@webassemblyjs/helper-wasm-bytecode': 1.11.6
+      '@webassemblyjs/ieee754': 1.11.6
+      '@webassemblyjs/leb128': 1.11.6
+      '@webassemblyjs/utf8': 1.11.6
+
+  /@webassemblyjs/wasm-opt@1.11.6:
+    resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==}
+    dependencies:
+      '@webassemblyjs/ast': 1.11.6
+      '@webassemblyjs/helper-buffer': 1.11.6
+      '@webassemblyjs/wasm-gen': 1.11.6
+      '@webassemblyjs/wasm-parser': 1.11.6
+
+  /@webassemblyjs/wasm-parser@1.11.6:
+    resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==}
+    dependencies:
+      '@webassemblyjs/ast': 1.11.6
+      '@webassemblyjs/helper-api-error': 1.11.6
+      '@webassemblyjs/helper-wasm-bytecode': 1.11.6
+      '@webassemblyjs/ieee754': 1.11.6
+      '@webassemblyjs/leb128': 1.11.6
+      '@webassemblyjs/utf8': 1.11.6
+
+  /@webassemblyjs/wast-printer@1.11.6:
+    resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==}
+    dependencies:
+      '@webassemblyjs/ast': 1.11.6
+      '@xtuc/long': 4.2.2
+
+  /@xtuc/ieee754@1.2.0:
+    resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
+
+  /@xtuc/long@4.2.2:
+    resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
+
+  /a-sync-waterfall@1.0.1:
+    resolution: {integrity: sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==}
+    dev: true
+
+  /abab@2.0.6:
+    resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==}
+    dev: true
+
+  /accepts@1.3.8:
+    resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
+    engines: {node: '>= 0.6'}
+    dependencies:
+      mime-types: 2.1.35
+      negotiator: 0.6.3
+    dev: true
+
+  /acorn-globals@7.0.1:
+    resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==}
+    dependencies:
+      acorn: 8.8.2
+      acorn-walk: 8.2.0
+    dev: true
+
+  /acorn-import-assertions@1.9.0(acorn@8.8.2):
+    resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==}
+    peerDependencies:
+      acorn: ^8
+    dependencies:
+      acorn: 8.8.2
+
+  /acorn-jsx@5.3.2(acorn@7.4.1):
+    resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+    peerDependencies:
+      acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+    dependencies:
+      acorn: 7.4.1
+    dev: true
+
+  /acorn-jsx@5.3.2(acorn@8.8.2):
+    resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+    peerDependencies:
+      acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+    dependencies:
+      acorn: 8.8.2
+
+  /acorn-walk@8.2.0:
+    resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
+    engines: {node: '>=0.4.0'}
+    dev: true
+
+  /acorn@7.4.1:
+    resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+    dev: true
+
+  /acorn@8.8.2:
+    resolution: {integrity: sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==}
+    engines: {node: '>=0.4.0'}
+    hasBin: true
+
+  /add-dom-event-listener@1.1.0:
+    resolution: {integrity: sha512-WCxx1ixHT0GQU9hb0KI/mhgRQhnU+U3GvwY6ZvVjYq8rsihIGoaIOUbY0yMPBxLH5MDtr0kz3fisWGNcbWW7Jw==}
+    dependencies:
+      object-assign: 4.1.1
+
+  /address@1.2.2:
+    resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==}
+    engines: {node: '>= 10.0.0'}
+    dev: false
+
+  /agent-base@4.3.0:
+    resolution: {integrity: sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==}
+    engines: {node: '>= 4.0.0'}
+    dependencies:
+      es6-promisify: 5.0.0
+    dev: true
+
+  /agent-base@6.0.2:
+    resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
+    engines: {node: '>= 6.0.0'}
+    dependencies:
+      debug: 4.3.4(supports-color@5.5.0)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /aggregate-error@3.1.0:
+    resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
+    engines: {node: '>=8'}
+    dependencies:
+      clean-stack: 2.2.0
+      indent-string: 4.0.0
+    dev: true
+
+  /ahooks-v3-count@1.0.0:
+    resolution: {integrity: sha512-V7uUvAwnimu6eh/PED4mCDjE7tokeZQLKlxg9lCTMPhN+NjsSbtdacByVlR1oluXQzD3MOw55wylDmQo4+S9ZQ==}
+    dev: true
+
+  /ahooks@3.7.7(react@18.2.0):
+    resolution: {integrity: sha512-5e5WlPq81Y84UnTLOKIQeq2cJw4aa7yj8fR2Nb/oMmXPrWMjIMCbPS1o+fpxSfCaNA3AzOnnMc8AehWRZltkJQ==}
+    engines: {node: '>=8.0.0'}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@types/js-cookie': 2.2.7
+      ahooks-v3-count: 1.0.0
+      dayjs: 1.11.7
+      intersection-observer: 0.12.2
+      js-cookie: 2.2.1
+      lodash: 4.17.21
+      react: 18.2.0
+      resize-observer-polyfill: 1.5.1
+      screenfull: 5.2.0
+      tslib: 2.5.2
+    dev: true
+
+  /ajv-keywords@3.5.2(ajv@6.12.6):
+    resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
+    peerDependencies:
+      ajv: ^6.9.1
+    dependencies:
+      ajv: 6.12.6
+
+  /ajv@6.12.6:
+    resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+    dependencies:
+      fast-deep-equal: 3.1.3
+      fast-json-stable-stringify: 2.1.0
+      json-schema-traverse: 0.4.1
+      uri-js: 4.4.1
+
+  /ajv@8.12.0:
+    resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
+    dependencies:
+      fast-deep-equal: 3.1.3
+      json-schema-traverse: 1.0.0
+      require-from-string: 2.0.2
+      uri-js: 4.4.1
+    dev: true
+
+  /ansi-colors@4.1.3:
+    resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /ansi-escapes@4.3.2:
+    resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+    engines: {node: '>=8'}
+    dependencies:
+      type-fest: 0.21.3
+    dev: true
+
+  /ansi-html-community@0.0.8:
+    resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==}
+    engines: {'0': node >= 0.8.0}
+    hasBin: true
+    dev: true
+
+  /ansi-regex@5.0.1:
+    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
+    engines: {node: '>=8'}
+
+  /ansi-styles@3.2.1:
+    resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+    engines: {node: '>=4'}
+    dependencies:
+      color-convert: 1.9.3
+
+  /ansi-styles@4.3.0:
+    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+    engines: {node: '>=8'}
+    dependencies:
+      color-convert: 2.0.1
+
+  /ansi-styles@5.2.0:
+    resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /antd-dayjs-webpack-plugin@1.0.6(dayjs@1.11.7):
+    resolution: {integrity: sha512-UlK3BfA0iE2c5+Zz/Bd2iPAkT6cICtrKG4/swSik5MZweBHtgmu1aUQCHvICdiv39EAShdZy/edfP6mlkS/xXg==}
+    peerDependencies:
+      dayjs: '*'
+    dependencies:
+      dayjs: 1.11.7
+    dev: true
+
+  /antd-mobile-alita@2.3.4(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-MlCFwuXQRAzifBEuhari4Jf9nbvsiyrm7HJvoGVMkjXKXk8PaaTJL6hTo7UwI3uD/CFeTxhW9X27Z8sd65J4fw==}
+    dependencies:
+      array-tree-filter: 2.1.0
+      babel-runtime: 6.26.0
+      classnames: 2.3.2
+      normalize.css: 7.0.0
+      rc-checkbox: 2.0.3
+      rc-collapse: 1.9.3(react-dom@18.2.0)(react@18.2.0)
+      rc-slider: 8.2.0(react-dom@18.2.0)(react@18.2.0)
+      rc-swipeout: 2.0.11
+      rmc-calendar: 1.1.4(react-dom@18.2.0)(react@18.2.0)
+      rmc-cascader: 5.0.3(react-dom@18.2.0)(react@18.2.0)
+      rmc-date-picker: 6.0.10(react-dom@18.2.0)(react@18.2.0)
+      rmc-dialog: 1.1.1(react-dom@18.2.0)(react@18.2.0)
+      rmc-drawer: 0.4.11
+      rmc-feedback: 2.0.0
+      rmc-input-number: 1.0.5
+      rmc-list-view: 0.11.5
+      rmc-notification: 1.0.0(react-dom@18.2.0)(react@18.2.0)
+      rmc-nuka-carousel: 3.0.1
+      rmc-picker: 5.0.10(react-dom@18.2.0)(react@18.2.0)
+      rmc-pull-to-refresh: 1.0.13
+      rmc-steps: 1.0.1
+      rmc-tabs: 1.2.29
+      rmc-tooltip: 1.0.1(react-dom@18.2.0)(react@18.2.0)
+    transitivePeerDependencies:
+      - react
+      - react-dom
+    dev: true
+
+  /antd-mobile-icons@0.2.2:
+    resolution: {integrity: sha512-iquIc7EsQTndk5nMv9pQQv+/OY5YnjVIPhtCFo7W7JL+Gjqzq/YJ/HO2WxUxyCgYha2NsTTNAb2vPa/M4zAi2g==}
+    dev: true
+
+  /antd@4.24.10(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-GihdwTGFW0dUaWjcvSIfejFcT63HjEp2EbYd+ojEXayldhey230KrHDJ+C53rkrkzLvymrPBfSxlLxJzyFIZsg==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@ant-design/colors': 6.0.0
+      '@ant-design/icons': 4.8.0(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/react-slick': 0.29.2(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      '@ctrl/tinycolor': 3.6.0
+      classnames: 2.3.2
+      copy-to-clipboard: 3.3.3
+      lodash: 4.17.21
+      moment: 2.29.4
+      rc-cascader: 3.7.2(react-dom@18.2.0)(react@18.2.0)
+      rc-checkbox: 3.0.1(react-dom@18.2.0)(react@18.2.0)
+      rc-collapse: 3.4.2(react-dom@18.2.0)(react@18.2.0)
+      rc-dialog: 9.0.2(react-dom@18.2.0)(react@18.2.0)
+      rc-drawer: 6.1.6(react-dom@18.2.0)(react@18.2.0)
+      rc-dropdown: 4.0.1(react-dom@18.2.0)(react@18.2.0)
+      rc-field-form: 1.27.4(react-dom@18.2.0)(react@18.2.0)
+      rc-image: 5.13.0(react-dom@18.2.0)(react@18.2.0)
+      rc-input: 0.1.4(react-dom@18.2.0)(react@18.2.0)
+      rc-input-number: 7.3.11(react-dom@18.2.0)(react@18.2.0)
+      rc-mentions: 1.13.1(react-dom@18.2.0)(react@18.2.0)
+      rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0)
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-notification: 4.6.1(react-dom@18.2.0)(react@18.2.0)
+      rc-pagination: 3.2.0(react-dom@18.2.0)(react@18.2.0)
+      rc-picker: 2.7.2(react-dom@18.2.0)(react@18.2.0)
+      rc-progress: 3.4.1(react-dom@18.2.0)(react@18.2.0)
+      rc-rate: 2.9.2(react-dom@18.2.0)(react@18.2.0)
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-segmented: 2.1.2(react-dom@18.2.0)(react@18.2.0)
+      rc-select: 14.1.17(react-dom@18.2.0)(react@18.2.0)
+      rc-slider: 10.0.1(react-dom@18.2.0)(react@18.2.0)
+      rc-steps: 5.0.0(react-dom@18.2.0)(react@18.2.0)
+      rc-switch: 3.2.2(react-dom@18.2.0)(react@18.2.0)
+      rc-table: 7.26.0(react-dom@18.2.0)(react@18.2.0)
+      rc-tabs: 12.5.10(react-dom@18.2.0)(react@18.2.0)
+      rc-textarea: 0.4.7(react-dom@18.2.0)(react@18.2.0)
+      rc-tooltip: 5.2.2(react-dom@18.2.0)(react@18.2.0)
+      rc-tree: 5.7.4(react-dom@18.2.0)(react@18.2.0)
+      rc-tree-select: 5.5.5(react-dom@18.2.0)(react@18.2.0)
+      rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0)
+      rc-upload: 4.3.4(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      scroll-into-view-if-needed: 2.2.31
+    dev: true
+
+  /antd@5.5.1(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-H9vPVGQ/8fT9Zidl4fzMSVAOCDIe/ZQtiU2hDzrN2tqAbaxOet+1HqfoKv7dfy+e0ttKIFvs6Y2yWw/ign1MwQ==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@ant-design/colors': 7.0.0
+      '@ant-design/cssinjs': 1.9.1(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/icons': 5.1.3(react-dom@18.2.0)(react@18.2.0)
+      '@ant-design/react-slick': 1.0.1(react@18.2.0)
+      '@babel/runtime': 7.22.3
+      '@ctrl/tinycolor': 3.6.0
+      '@rc-component/color-picker': 1.1.1(react-dom@18.2.0)(react@18.2.0)
+      '@rc-component/mutate-observer': 1.0.0(react-dom@18.2.0)(react@18.2.0)
+      '@rc-component/tour': 1.8.0(react-dom@18.2.0)(react@18.2.0)
+      '@rc-component/trigger': 1.13.3(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      copy-to-clipboard: 3.3.3
+      dayjs: 1.11.7
+      qrcode.react: 3.1.0(react@18.2.0)
+      rc-cascader: 3.12.0(react-dom@18.2.0)(react@18.2.0)
+      rc-checkbox: 3.0.1(react-dom@18.2.0)(react@18.2.0)
+      rc-collapse: 3.5.2(react-dom@18.2.0)(react@18.2.0)
+      rc-dialog: 9.1.0(react-dom@18.2.0)(react@18.2.0)
+      rc-drawer: 6.1.6(react-dom@18.2.0)(react@18.2.0)
+      rc-dropdown: 4.1.0(react-dom@18.2.0)(react@18.2.0)
+      rc-field-form: 1.31.0(react-dom@18.2.0)(react@18.2.0)
+      rc-image: 5.16.0(react-dom@18.2.0)(react@18.2.0)
+      rc-input: 1.0.4(react-dom@18.2.0)(react@18.2.0)
+      rc-input-number: 7.4.2(react-dom@18.2.0)(react@18.2.0)
+      rc-mentions: 2.2.0(react-dom@18.2.0)(react@18.2.0)
+      rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0)
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-notification: 5.0.4(react-dom@18.2.0)(react@18.2.0)
+      rc-pagination: 3.4.2(react-dom@18.2.0)(react@18.2.0)
+      rc-picker: 3.7.6(dayjs@1.11.7)(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0)
+      rc-progress: 3.4.1(react-dom@18.2.0)(react@18.2.0)
+      rc-rate: 2.10.0(react-dom@18.2.0)(react@18.2.0)
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-segmented: 2.2.2(react-dom@18.2.0)(react@18.2.0)
+      rc-select: 14.5.1(react-dom@18.2.0)(react@18.2.0)
+      rc-slider: 10.1.1(react-dom@18.2.0)(react@18.2.0)
+      rc-steps: 6.0.0(react-dom@18.2.0)(react@18.2.0)
+      rc-switch: 4.1.0(react-dom@18.2.0)(react@18.2.0)
+      rc-table: 7.32.1(react-dom@18.2.0)(react@18.2.0)
+      rc-tabs: 12.6.0(react-dom@18.2.0)(react@18.2.0)
+      rc-textarea: 1.2.3(react-dom@18.2.0)(react@18.2.0)
+      rc-tooltip: 6.0.1(react-dom@18.2.0)(react@18.2.0)
+      rc-tree: 5.7.4(react-dom@18.2.0)(react@18.2.0)
+      rc-tree-select: 5.9.0(react-dom@18.2.0)(react@18.2.0)
+      rc-upload: 4.3.4(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      scroll-into-view-if-needed: 3.0.10
+      throttle-debounce: 5.0.0
+    transitivePeerDependencies:
+      - date-fns
+      - luxon
+      - moment
+
+  /anymatch@3.1.3:
+    resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+    engines: {node: '>= 8'}
+    dependencies:
+      normalize-path: 3.0.0
+      picomatch: 2.3.1
+
+  /arg@4.1.3:
+    resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==}
+    dev: true
+
+  /argparse@1.0.10:
+    resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+    dependencies:
+      sprintf-js: 1.0.3
+    dev: true
+
+  /argparse@2.0.1:
+    resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+
+  /aria-hidden@1.2.3:
+    resolution: {integrity: sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      tslib: 2.5.2
+    dev: true
+
+  /aria-query@5.1.3:
+    resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==}
+    dependencies:
+      deep-equal: 2.2.1
+    dev: true
+
+  /array-buffer-byte-length@1.0.0:
+    resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==}
+    dependencies:
+      call-bind: 1.0.2
+      is-array-buffer: 3.0.2
+    dev: true
+
+  /array-flatten@1.1.1:
+    resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
+    dev: true
+
+  /array-includes@3.1.6:
+    resolution: {integrity: sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.21.2
+      get-intrinsic: 1.2.1
+      is-string: 1.0.7
+    dev: true
+
+  /array-tree-filter@2.1.0:
+    resolution: {integrity: sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==}
+
+  /array-union@1.0.2:
+    resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      array-uniq: 1.0.3
+    dev: true
+
+  /array-union@2.1.0:
+    resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+    engines: {node: '>=8'}
+
+  /array-uniq@1.0.3:
+    resolution: {integrity: sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /array.prototype.flatmap@1.3.1:
+    resolution: {integrity: sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.21.2
+      es-shim-unscopables: 1.0.0
+    dev: true
+
+  /array.prototype.tosorted@1.1.1:
+    resolution: {integrity: sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.21.2
+      es-shim-unscopables: 1.0.0
+      get-intrinsic: 1.2.1
+    dev: true
+
+  /arrify@1.0.1:
+    resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /asap@1.0.0:
+    resolution: {integrity: sha512-Ej9qjcXY+8Tuy1cNqiwNMwFRXOy9UwgTeMA8LxreodygIPV48lx8PU1ecFxb5ZeU1DpMKxiq6vGLTxcitWZPbA==}
+    dev: true
+
+  /asap@2.0.6:
+    resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
+    dev: true
+
+  /asn1.js@5.4.1:
+    resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==}
+    dependencies:
+      bn.js: 4.12.0
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+      safer-buffer: 2.1.2
+    dev: true
+
+  /asn1@0.2.6:
+    resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==}
+    dependencies:
+      safer-buffer: 2.1.2
+    dev: true
+
+  /assert-plus@1.0.0:
+    resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==}
+    engines: {node: '>=0.8'}
+    dev: true
+
+  /assert@1.5.0:
+    resolution: {integrity: sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==}
+    dependencies:
+      object-assign: 4.1.1
+      util: 0.10.3
+    dev: true
+
+  /astral-regex@2.0.0:
+    resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /async-limiter@1.0.1:
+    resolution: {integrity: sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==}
+    dev: true
+
+  /async-validator@4.2.5:
+    resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+
+  /async@2.6.4:
+    resolution: {integrity: sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==}
+    dependencies:
+      lodash: 4.17.21
+    dev: true
+
+  /asynckit@0.4.0:
+    resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
+    dev: true
+
+  /at-least-node@1.0.0:
+    resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
+    engines: {node: '>= 4.0.0'}
+    dev: false
+
+  /atomic-sleep@1.0.0:
+    resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==}
+    engines: {node: '>=8.0.0'}
+    dev: true
+
+  /autoprefixer@10.4.14(postcss@8.4.24):
+    resolution: {integrity: sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==}
+    engines: {node: ^10 || ^12 || >=14}
+    hasBin: true
+    peerDependencies:
+      postcss: ^8.1.0
+    dependencies:
+      browserslist: 4.21.6
+      caniuse-lite: 1.0.30001489
+      fraction.js: 4.2.0
+      normalize-range: 0.1.2
+      picocolors: 1.0.0
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /autoprefixer@9.8.8:
+    resolution: {integrity: sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==}
+    hasBin: true
+    dependencies:
+      browserslist: 4.21.6
+      caniuse-lite: 1.0.30001489
+      normalize-range: 0.1.2
+      num2fraction: 1.2.2
+      picocolors: 0.2.1
+      postcss: 7.0.39
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /available-typed-arrays@1.0.5:
+    resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==}
+    engines: {node: '>= 0.4'}
+    dev: true
+
+  /aws-sign2@0.7.0:
+    resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==}
+    dev: true
+
+  /aws4@1.12.0:
+    resolution: {integrity: sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==}
+    dev: true
+
+  /axios@0.27.2:
+    resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==}
+    dependencies:
+      follow-redirects: 1.15.2
+      form-data: 4.0.0
+    transitivePeerDependencies:
+      - debug
+    dev: true
+
+  /babel-jest@29.5.0(@babel/core@7.22.1):
+    resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    peerDependencies:
+      '@babel/core': ^7.8.0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@jest/transform': 29.5.0
+      '@types/babel__core': 7.20.1
+      babel-plugin-istanbul: 6.1.1
+      babel-preset-jest: 29.5.0(@babel/core@7.22.1)
+      chalk: 4.1.2
+      graceful-fs: 4.2.11
+      slash: 3.0.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /babel-plugin-dynamic-import-node@2.3.3:
+    resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==}
+    dependencies:
+      object.assign: 4.1.4
+    dev: true
+
+  /babel-plugin-import@1.13.6:
+    resolution: {integrity: sha512-N7FYnGh0DFsvDRkAPsvFq/metVfVD7P2h1rokOPpEH4cZbdRHCW+2jbXt0nnuqowkm/xhh2ww1anIdEpfYa7ZA==}
+    dependencies:
+      '@babel/helper-module-imports': 7.21.4
+    dev: true
+
+  /babel-plugin-istanbul@6.1.1:
+    resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
+    engines: {node: '>=8'}
+    dependencies:
+      '@babel/helper-plugin-utils': 7.21.5
+      '@istanbuljs/load-nyc-config': 1.1.0
+      '@istanbuljs/schema': 0.1.3
+      istanbul-lib-instrument: 5.2.1
+      test-exclude: 6.0.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /babel-plugin-jest-hoist@29.5.0:
+    resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@babel/template': 7.21.9
+      '@babel/types': 7.22.3
+      '@types/babel__core': 7.20.1
+      '@types/babel__traverse': 7.20.0
+    dev: true
+
+  /babel-plugin-macros@3.1.0:
+    resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==}
+    engines: {node: '>=10', npm: '>=6'}
+    dependencies:
+      '@babel/runtime': 7.22.3
+      cosmiconfig: 7.1.0
+      resolve: 1.22.2
+    dev: false
+
+  /babel-plugin-polyfill-corejs2@0.4.3(@babel/core@7.22.1):
+    resolution: {integrity: sha512-bM3gHc337Dta490gg+/AseNB9L4YLHxq1nGKZZSHbhXv4aTYU2MD2cjza1Ru4S6975YLTaL1K8uJf6ukJhhmtw==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/compat-data': 7.22.3
+      '@babel/core': 7.22.1
+      '@babel/helper-define-polyfill-provider': 0.4.0(@babel/core@7.22.1)
+      semver: 6.3.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /babel-plugin-polyfill-corejs3@0.8.1(@babel/core@7.22.1):
+    resolution: {integrity: sha512-ikFrZITKg1xH6pLND8zT14UPgjKHiGLqex7rGEZCH2EvhsneJaJPemmpQaIZV5AL03II+lXylw3UmddDK8RU5Q==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-define-polyfill-provider': 0.4.0(@babel/core@7.22.1)
+      core-js-compat: 3.30.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /babel-plugin-polyfill-regenerator@0.5.0(@babel/core@7.22.1):
+    resolution: {integrity: sha512-hDJtKjMLVa7Z+LwnTCxoDLQj6wdc+B8dun7ayF2fYieI6OzfuvcLMB32ihJZ4UhCBwNYGl5bg/x/P9cMdnkc2g==}
+    peerDependencies:
+      '@babel/core': ^7.0.0-0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/helper-define-polyfill-provider': 0.4.0(@babel/core@7.22.1)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /babel-plugin-styled-components@2.1.1(styled-components@5.3.11):
+    resolution: {integrity: sha512-c8lJlszObVQPguHkI+akXv8+Jgb9Ccujx0EetL7oIvwU100LxO6XAGe45qry37wUL40a5U9f23SYrivro2XKhA==}
+    peerDependencies:
+      styled-components: '>= 2'
+    dependencies:
+      '@babel/helper-annotate-as-pure': 7.18.6
+      '@babel/helper-module-imports': 7.21.4
+      babel-plugin-syntax-jsx: 6.18.0
+      lodash: 4.17.21
+      picomatch: 2.3.1
+      styled-components: 5.3.11(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0)
+    dev: true
+
+  /babel-plugin-styled-components@2.1.3(styled-components@5.3.11):
+    resolution: {integrity: sha512-jBioLwBVHpOMU4NsueH/ADcHrjS0Y/WTpt2eGVmmuSFNEv2DF3XhcMncuZlbbjxQ4vzxg+yEr6E6TNjrIQbsJQ==}
+    peerDependencies:
+      styled-components: '>= 2'
+    dependencies:
+      '@babel/helper-annotate-as-pure': 7.18.6
+      '@babel/helper-module-imports': 7.21.4
+      babel-plugin-syntax-jsx: 6.18.0
+      lodash: 4.17.21
+      picomatch: 2.3.1
+      styled-components: 5.3.11(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0)
+    dev: true
+
+  /babel-plugin-syntax-jsx@6.18.0:
+    resolution: {integrity: sha512-qrPaCSo9c8RHNRHIotaufGbuOBN8rtdC4QrrFFc43vyWCCz7Kl7GL1PGaXtMGQZUXrkCjNEgxDfmAuAabr/rlw==}
+    dev: true
+
+  /babel-preset-current-node-syntax@1.0.1(@babel/core@7.22.1):
+    resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.22.1)
+      '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.22.1)
+      '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.22.1)
+      '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.22.1)
+      '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.22.1)
+      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.22.1)
+      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.22.1)
+      '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.22.1)
+      '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.22.1)
+      '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.22.1)
+      '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.22.1)
+      '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.22.1)
+    dev: true
+
+  /babel-preset-jest@29.5.0(@babel/core@7.22.1):
+    resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    peerDependencies:
+      '@babel/core': ^7.0.0
+    dependencies:
+      '@babel/core': 7.22.1
+      babel-plugin-jest-hoist: 29.5.0
+      babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.1)
+    dev: true
+
+  /babel-runtime-jsx-plus@0.1.5:
+    resolution: {integrity: sha512-5qjZDfUzZGxHgX8o0tkS9o0HbyBvnUuaAtqHC9IN5CgjWFGJBg6a0Xp31wiG7btiHV0dP5t1t8cthlTCYwtnig==}
+    dev: true
+
+  /babel-runtime@6.26.0:
+    resolution: {integrity: sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==}
+    dependencies:
+      core-js: 2.6.12
+      regenerator-runtime: 0.11.1
+    dev: true
+
+  /babel-types@6.26.0:
+    resolution: {integrity: sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==}
+    dependencies:
+      babel-runtime: 6.26.0
+      esutils: 2.0.3
+      lodash: 4.17.21
+      to-fast-properties: 1.0.3
+    dev: true
+
+  /bail@1.0.5:
+    resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==}
+    dev: true
+
+  /balanced-match@1.0.2:
+    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+
+  /balanced-match@2.0.0:
+    resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==}
+    dev: true
+
+  /base64-js@1.5.1:
+    resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+    dev: true
+
+  /bcrypt-pbkdf@1.0.2:
+    resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==}
+    dependencies:
+      tweetnacl: 0.14.5
+    dev: true
+
+  /big-integer@1.6.51:
+    resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==}
+    engines: {node: '>=0.6'}
+    dev: true
+
+  /big.js@5.2.2:
+    resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
+
+  /binary-extensions@2.2.0:
+    resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
+    engines: {node: '>=8'}
+
+  /bl@4.1.0:
+    resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+    dependencies:
+      buffer: 5.7.1
+      inherits: 2.0.4
+      readable-stream: 3.6.2
+    dev: true
+
+  /blink-diff@1.0.13:
+    resolution: {integrity: sha512-2hIEnGq8wruXfje9GvDV41VXo+4YdjrjL5ZMlVJT3Wi5k1jjz20fCTlVejSXoERirhEVsFYz9NmgdUYgQ41Giw==}
+    hasBin: true
+    dependencies:
+      pngjs-image: 0.11.7
+      preceptor-core: 0.10.1
+      promise: 6.0.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /bn.js@4.12.0:
+    resolution: {integrity: sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==}
+    dev: true
+
+  /bn.js@5.2.1:
+    resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==}
+    dev: true
+
+  /body-parser@1.20.1:
+    resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==}
+    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+    dependencies:
+      bytes: 3.1.2
+      content-type: 1.0.5
+      debug: 2.6.9
+      depd: 2.0.0
+      destroy: 1.2.0
+      http-errors: 2.0.0
+      iconv-lite: 0.4.24
+      on-finished: 2.4.1
+      qs: 6.11.0
+      raw-body: 2.5.1
+      type-is: 1.6.18
+      unpipe: 1.0.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /boolbase@1.0.0:
+    resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
+    dev: true
+
+  /bplist-parser@0.2.0:
+    resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==}
+    engines: {node: '>= 5.10.0'}
+    dependencies:
+      big-integer: 1.6.51
+    dev: true
+
+  /brace-expansion@1.1.11:
+    resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+    dependencies:
+      balanced-match: 1.0.2
+      concat-map: 0.0.1
+
+  /brace-expansion@2.0.1:
+    resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+    dependencies:
+      balanced-match: 1.0.2
+    dev: true
+
+  /braces@3.0.2:
+    resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+    engines: {node: '>=8'}
+    dependencies:
+      fill-range: 7.0.1
+
+  /brorand@1.1.0:
+    resolution: {integrity: sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==}
+    dev: true
+
+  /browserify-aes@1.2.0:
+    resolution: {integrity: sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==}
+    dependencies:
+      buffer-xor: 1.0.3
+      cipher-base: 1.0.4
+      create-hash: 1.2.0
+      evp_bytestokey: 1.0.3
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+    dev: true
+
+  /browserify-cipher@1.0.1:
+    resolution: {integrity: sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==}
+    dependencies:
+      browserify-aes: 1.2.0
+      browserify-des: 1.0.2
+      evp_bytestokey: 1.0.3
+    dev: true
+
+  /browserify-des@1.0.2:
+    resolution: {integrity: sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==}
+    dependencies:
+      cipher-base: 1.0.4
+      des.js: 1.0.1
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+    dev: true
+
+  /browserify-rsa@4.1.0:
+    resolution: {integrity: sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==}
+    dependencies:
+      bn.js: 5.2.1
+      randombytes: 2.1.0
+    dev: true
+
+  /browserify-sign@4.2.1:
+    resolution: {integrity: sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==}
+    dependencies:
+      bn.js: 5.2.1
+      browserify-rsa: 4.1.0
+      create-hash: 1.2.0
+      create-hmac: 1.1.7
+      elliptic: 6.5.4
+      inherits: 2.0.4
+      parse-asn1: 5.1.6
+      readable-stream: 3.6.2
+      safe-buffer: 5.2.1
+    dev: true
+
+  /browserify-zlib@0.2.0:
+    resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==}
+    dependencies:
+      pako: 1.0.11
+    dev: true
+
+  /browserslist@4.21.6:
+    resolution: {integrity: sha512-PF07dKGXKR+/bljJzCB6rAYtHEu21TthLxmJagtQizx+rwiqdRDBO5971Xu1N7MgcMLi4+mr4Cnl76x7O3DHtA==}
+    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+    hasBin: true
+    dependencies:
+      caniuse-lite: 1.0.30001489
+      electron-to-chromium: 1.4.411
+      node-releases: 2.0.12
+      update-browserslist-db: 1.0.11(browserslist@4.21.6)
+
+  /bser@2.1.1:
+    resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
+    dependencies:
+      node-int64: 0.4.0
+    dev: true
+
+  /buffer-crc32@0.2.13:
+    resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
+    dev: true
+
+  /buffer-from@1.1.2:
+    resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+
+  /buffer-xor@1.0.3:
+    resolution: {integrity: sha512-571s0T7nZWK6vB67HI5dyUF7wXiNcfaPPPTl6zYCNApANjIvYJTg7hlud/+cJpdAhS7dVzqMLmfhfHR3rAcOjQ==}
+    dev: true
+
+  /buffer@4.9.2:
+    resolution: {integrity: sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==}
+    dependencies:
+      base64-js: 1.5.1
+      ieee754: 1.2.1
+      isarray: 1.0.0
+    dev: true
+
+  /buffer@5.7.1:
+    resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+    dependencies:
+      base64-js: 1.5.1
+      ieee754: 1.2.1
+    dev: true
+
+  /builtin-status-codes@3.0.0:
+    resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==}
+    dev: true
+
+  /bundle-name@3.0.0:
+    resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==}
+    engines: {node: '>=12'}
+    dependencies:
+      run-applescript: 5.0.0
+    dev: true
+
+  /bytes@3.1.2:
+    resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
+    engines: {node: '>= 0.8'}
+    dev: true
+
+  /call-bind@1.0.2:
+    resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
+    dependencies:
+      function-bind: 1.1.1
+      get-intrinsic: 1.2.1
+    dev: true
+
+  /call-me-maybe@1.0.2:
+    resolution: {integrity: sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==}
+    dev: true
+
+  /callsites@3.1.0:
+    resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+    engines: {node: '>=6'}
+
+  /camel-case@4.1.2:
+    resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
+    dependencies:
+      pascal-case: 3.1.2
+      tslib: 2.5.2
+    dev: true
+
+  /camelcase-keys@6.2.2:
+    resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==}
+    engines: {node: '>=8'}
+    dependencies:
+      camelcase: 5.3.1
+      map-obj: 4.3.0
+      quick-lru: 4.0.1
+    dev: true
+
+  /camelcase@5.3.1:
+    resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /camelcase@6.3.0:
+    resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /camelize@1.0.1:
+    resolution: {integrity: sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ==}
+    dev: true
+
+  /caniuse-lite@1.0.30001489:
+    resolution: {integrity: sha512-x1mgZEXK8jHIfAxm+xgdpHpk50IN3z3q3zP261/WS+uvePxW8izXuCu6AHz0lkuYTlATDehiZ/tNyYBdSQsOUQ==}
+
+  /carlo@0.9.46:
+    resolution: {integrity: sha512-FwZ/wxjqe+5RgzF2SRsPSWsVB9+McAVRWW0tRkmbh7fBjrf3HFZZbcr8vr61p1K+NBaAPv57DRjxgIyfbHmd7g==}
+    engines: {node: '>=7.6.0'}
+    dependencies:
+      debug: 4.3.4(supports-color@5.5.0)
+      puppeteer-core: 1.12.2
+    transitivePeerDependencies:
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+    dev: true
+
+  /caseless@0.12.0:
+    resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
+    dev: true
+
+  /chalk@2.4.2:
+    resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+    engines: {node: '>=4'}
+    dependencies:
+      ansi-styles: 3.2.1
+      escape-string-regexp: 1.0.5
+      supports-color: 5.5.0
+
+  /chalk@4.1.2:
+    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+    engines: {node: '>=10'}
+    dependencies:
+      ansi-styles: 4.3.0
+      supports-color: 7.2.0
+
+  /char-regex@1.0.2:
+    resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /character-entities-legacy@1.1.4:
+    resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==}
+    dev: true
+
+  /character-entities@1.2.4:
+    resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==}
+    dev: true
+
+  /character-reference-invalid@1.1.4:
+    resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==}
+    dev: true
+
+  /chokidar@3.5.3:
+    resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+    engines: {node: '>= 8.10.0'}
+    dependencies:
+      anymatch: 3.1.3
+      braces: 3.0.2
+      glob-parent: 5.1.2
+      is-binary-path: 2.1.0
+      is-glob: 4.0.3
+      normalize-path: 3.0.0
+      readdirp: 3.6.0
+    optionalDependencies:
+      fsevents: 2.3.2
+
+  /chrome-trace-event@1.0.3:
+    resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==}
+    engines: {node: '>=6.0'}
+
+  /ci-info@2.0.0:
+    resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==}
+    dev: true
+
+  /ci-info@3.8.0:
+    resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /cipher-base@1.0.4:
+    resolution: {integrity: sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==}
+    dependencies:
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+    dev: true
+
+  /cjs-module-lexer@1.2.2:
+    resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==}
+    dev: true
+
+  /classnames@2.3.2:
+    resolution: {integrity: sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==}
+
+  /clean-css@5.3.2:
+    resolution: {integrity: sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==}
+    engines: {node: '>= 10.0'}
+    dependencies:
+      source-map: 0.6.1
+    dev: true
+
+  /clean-regexp@1.0.0:
+    resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==}
+    engines: {node: '>=4'}
+    dependencies:
+      escape-string-regexp: 1.0.5
+    dev: true
+
+  /clean-stack@2.2.0:
+    resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /cli-cursor@3.1.0:
+    resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+    engines: {node: '>=8'}
+    dependencies:
+      restore-cursor: 3.1.0
+    dev: true
+
+  /cli-spinners@2.9.0:
+    resolution: {integrity: sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /cli-truncate@2.1.0:
+    resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==}
+    engines: {node: '>=8'}
+    dependencies:
+      slice-ansi: 3.0.0
+      string-width: 4.2.3
+    dev: true
+
+  /click-to-react-component@1.0.8(@types/react@18.2.7)(react-dom@18.1.0)(react@18.1.0):
+    resolution: {integrity: sha512-YBNYOp00udy+NBEnUmM/3Df0Yco1iHNQ8k0ltlJVcDYK9AuYt14xPoJicBh/BokLqbzkci1p+pbdY5r4JXZC4g==}
+    peerDependencies:
+      react: '>=16.8.0'
+    dependencies:
+      '@floating-ui/react-dom-interactions': 0.3.1(@types/react@18.2.7)(react-dom@18.1.0)(react@18.1.0)
+      htm: 3.1.1
+      react: 18.1.0
+      react-merge-refs: 1.1.0
+    transitivePeerDependencies:
+      - '@types/react'
+      - react-dom
+    dev: true
+
+  /cliui@8.0.1:
+    resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+    engines: {node: '>=12'}
+    dependencies:
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      wrap-ansi: 7.0.0
+    dev: true
+
+  /clone-regexp@2.2.0:
+    resolution: {integrity: sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==}
+    engines: {node: '>=6'}
+    dependencies:
+      is-regexp: 2.1.0
+    dev: true
+
+  /clone@1.0.4:
+    resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+    engines: {node: '>=0.8'}
+    dev: true
+
+  /co@4.6.0:
+    resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
+    engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
+    dev: true
+
+  /collect-v8-coverage@1.0.1:
+    resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==}
+    dev: true
+
+  /color-convert@1.9.3:
+    resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+    dependencies:
+      color-name: 1.1.3
+
+  /color-convert@2.0.1:
+    resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+    engines: {node: '>=7.0.0'}
+    dependencies:
+      color-name: 1.1.4
+
+  /color-name@1.1.3:
+    resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+
+  /color-name@1.1.4:
+    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+  /colord@2.9.3:
+    resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==}
+    dev: true
+
+  /colorette@2.0.20:
+    resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+    dev: true
+
+  /combined-stream@1.0.8:
+    resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
+    engines: {node: '>= 0.8'}
+    dependencies:
+      delayed-stream: 1.0.0
+    dev: true
+
+  /commander@10.0.1:
+    resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==}
+    engines: {node: '>=14'}
+    dev: true
+
+  /commander@2.20.3:
+    resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
+
+  /commander@4.1.1:
+    resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==}
+    engines: {node: '>= 6'}
+    dev: true
+
+  /commander@5.1.0:
+    resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==}
+    engines: {node: '>= 6'}
+    dev: true
+
+  /commander@6.2.1:
+    resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==}
+    engines: {node: '>= 6'}
+    dev: true
+
+  /commander@7.2.0:
+    resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
+    engines: {node: '>= 10'}
+    dev: true
+
+  /commander@8.3.0:
+    resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
+    engines: {node: '>= 12'}
+    dev: true
+
+  /common-path-prefix@3.0.0:
+    resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==}
+    dev: true
+
+  /commondir@1.0.1:
+    resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
+    dev: true
+
+  /component-classes@1.2.6:
+    resolution: {integrity: sha512-hPFGULxdwugu1QWW3SvVOCUHLzO34+a2J6Wqy0c5ASQkfi9/8nZcBB0ZohaEbXOQlCflMAEMmEWk7u7BVs4koA==}
+    dependencies:
+      component-indexof: 0.0.3
+    dev: true
+
+  /component-indexof@0.0.3:
+    resolution: {integrity: sha512-puDQKvx/64HZXb4hBwIcvQLaLgux8o1CbWl39s41hrIIZDl1lJiD5jc22gj3RBeGK0ovxALDYpIbyjqDUUl0rw==}
+    dev: true
+
+  /compute-scroll-into-view@1.0.20:
+    resolution: {integrity: sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==}
+    dev: true
+
+  /compute-scroll-into-view@3.0.3:
+    resolution: {integrity: sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==}
+
+  /concat-map@0.0.1:
+    resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+
+  /concat-stream@1.6.2:
+    resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==}
+    engines: {'0': node >= 0.8}
+    dependencies:
+      buffer-from: 1.1.2
+      inherits: 2.0.4
+      readable-stream: 2.3.8
+      typedarray: 0.0.6
+    dev: true
+
+  /console-browserify@1.2.0:
+    resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==}
+    dev: true
+
+  /constants-browserify@1.0.0:
+    resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==}
+    dev: true
+
+  /content-disposition@0.5.4:
+    resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
+    engines: {node: '>= 0.6'}
+    dependencies:
+      safe-buffer: 5.2.1
+    dev: true
+
+  /content-type@1.0.5:
+    resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==}
+    engines: {node: '>= 0.6'}
+    dev: true
+
+  /convert-source-map@1.9.0:
+    resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
+
+  /convert-source-map@2.0.0:
+    resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+    dev: true
+
+  /cookie-signature@1.0.6:
+    resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==}
+    dev: true
+
+  /cookie@0.5.0:
+    resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
+    engines: {node: '>= 0.6'}
+    dev: true
+
+  /copy-anything@2.0.6:
+    resolution: {integrity: sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==}
+    dependencies:
+      is-what: 3.14.1
+    dev: true
+
+  /copy-anything@3.0.5:
+    resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==}
+    engines: {node: '>=12.13'}
+    dependencies:
+      is-what: 4.1.11
+    dev: true
+
+  /copy-to-clipboard@3.3.3:
+    resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
+    dependencies:
+      toggle-selection: 1.0.6
+
+  /core-js-compat@3.30.2:
+    resolution: {integrity: sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==}
+    dependencies:
+      browserslist: 4.21.6
+    dev: true
+
+  /core-js-pure@3.30.2:
+    resolution: {integrity: sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg==}
+    requiresBuild: true
+    dev: true
+
+  /core-js@1.2.7:
+    resolution: {integrity: sha512-ZiPp9pZlgxpWRu0M+YWbm6+aQ84XEfH1JRXvfOc/fILWI0VKhLC2LX13X1NYq4fULzLMq7Hfh43CSo2/aIaUPA==}
+    deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.
+    dev: true
+
+  /core-js@2.6.12:
+    resolution: {integrity: sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==}
+    deprecated: core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.
+    requiresBuild: true
+    dev: true
+
+  /core-js@3.28.0:
+    resolution: {integrity: sha512-GiZn9D4Z/rSYvTeg1ljAIsEqFm0LaN9gVtwDCrKL80zHtS31p9BAjmTxVqTQDMpwlMolJZOFntUG2uwyj7DAqw==}
+    requiresBuild: true
+    dev: true
+
+  /core-util-is@1.0.2:
+    resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
+    dev: true
+
+  /core-util-is@1.0.3:
+    resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+    dev: true
+
+  /cors@2.8.5:
+    resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==}
+    engines: {node: '>= 0.10'}
+    dependencies:
+      object-assign: 4.1.1
+      vary: 1.1.2
+    dev: true
+
+  /cosmiconfig@6.0.0:
+    resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==}
+    engines: {node: '>=8'}
+    dependencies:
+      '@types/parse-json': 4.0.0
+      import-fresh: 3.3.0
+      parse-json: 5.2.0
+      path-type: 4.0.0
+      yaml: 1.10.2
+    dev: false
+
+  /cosmiconfig@7.1.0:
+    resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==}
+    engines: {node: '>=10'}
+    dependencies:
+      '@types/parse-json': 4.0.0
+      import-fresh: 3.3.0
+      parse-json: 5.2.0
+      path-type: 4.0.0
+      yaml: 1.10.2
+
+  /create-ecdh@4.0.4:
+    resolution: {integrity: sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==}
+    dependencies:
+      bn.js: 4.12.0
+      elliptic: 6.5.4
+    dev: true
+
+  /create-hash@1.2.0:
+    resolution: {integrity: sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==}
+    dependencies:
+      cipher-base: 1.0.4
+      inherits: 2.0.4
+      md5.js: 1.3.5
+      ripemd160: 2.0.2
+      sha.js: 2.4.11
+    dev: true
+
+  /create-hmac@1.1.7:
+    resolution: {integrity: sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==}
+    dependencies:
+      cipher-base: 1.0.4
+      create-hash: 1.2.0
+      inherits: 2.0.4
+      ripemd160: 2.0.2
+      safe-buffer: 5.2.1
+      sha.js: 2.4.11
+    dev: true
+
+  /create-react-class@15.7.0:
+    resolution: {integrity: sha512-QZv4sFWG9S5RUvkTYWbflxeZX+JG7Cz0Tn33rQBJ+WFQTqTfUTjMjiv9tnfXazjsO5r0KhPs+AqCjyrQX6h2ng==}
+    dependencies:
+      loose-envify: 1.4.0
+      object-assign: 4.1.1
+    dev: true
+
+  /create-require@1.1.1:
+    resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==}
+    dev: true
+
+  /cross-env@7.0.3:
+    resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
+    engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
+    hasBin: true
+    dependencies:
+      cross-spawn: 7.0.3
+    dev: true
+
+  /cross-port-killer@1.4.0:
+    resolution: {integrity: sha512-ujqfftKsSeorFMVI6JP25xMBixHEaDWVK+NarRZAGnJjR5AhebRQU+g+k/Lj8OHwM6f+wrrs8u5kkCdI7RLtxQ==}
+    hasBin: true
+    dev: true
+
+  /cross-spawn@7.0.3:
+    resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+    engines: {node: '>= 8'}
+    dependencies:
+      path-key: 3.1.1
+      shebang-command: 2.0.0
+      which: 2.0.2
+
+  /crypto-browserify@3.12.0:
+    resolution: {integrity: sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==}
+    dependencies:
+      browserify-cipher: 1.0.1
+      browserify-sign: 4.2.1
+      create-ecdh: 4.0.4
+      create-hash: 1.2.0
+      create-hmac: 1.1.7
+      diffie-hellman: 5.0.3
+      inherits: 2.0.4
+      pbkdf2: 3.1.2
+      public-encrypt: 4.0.3
+      randombytes: 2.1.0
+      randomfill: 1.0.4
+    dev: true
+
+  /css-animation@1.6.1:
+    resolution: {integrity: sha512-/48+/BaEaHRY6kNQ2OIPzKf9A6g8WjZYjhiNDNuIVbsm5tXCGIAsHDjB4Xu1C4vXJtUWZo26O68OQkDpNBaPog==}
+    dependencies:
+      babel-runtime: 6.26.0
+      component-classes: 1.2.6
+    dev: true
+
+  /css-blank-pseudo@3.0.3(postcss@8.4.24):
+    resolution: {integrity: sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==}
+    engines: {node: ^12 || ^14 || >=16}
+    hasBin: true
+    peerDependencies:
+      postcss: ^8.4
+    dependencies:
+      postcss: 8.4.24
+      postcss-selector-parser: 6.0.13
+    dev: true
+
+  /css-color-keywords@1.0.0:
+    resolution: {integrity: sha512-FyyrDHZKEjXDpNJYvVsV960FiqQyXc/LlYmsxl2BcdMb2WPx0OGRVgTg55rPSyLSNMqP52R9r8geSp7apN3Ofg==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /css-functions-list@3.1.0:
+    resolution: {integrity: sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==}
+    engines: {node: '>=12.22'}
+    dev: true
+
+  /css-has-pseudo@3.0.4(postcss@8.4.24):
+    resolution: {integrity: sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==}
+    engines: {node: ^12 || ^14 || >=16}
+    hasBin: true
+    peerDependencies:
+      postcss: ^8.4
+    dependencies:
+      postcss: 8.4.24
+      postcss-selector-parser: 6.0.13
+    dev: true
+
+  /css-loader@6.7.1(webpack@5.84.1):
+    resolution: {integrity: sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==}
+    engines: {node: '>= 12.13.0'}
+    peerDependencies:
+      webpack: ^5.0.0
+    dependencies:
+      icss-utils: 5.1.0(postcss@8.4.24)
+      postcss: 8.4.24
+      postcss-modules-extract-imports: 3.0.0(postcss@8.4.24)
+      postcss-modules-local-by-default: 4.0.3(postcss@8.4.24)
+      postcss-modules-scope: 3.0.0(postcss@8.4.24)
+      postcss-modules-values: 4.0.0(postcss@8.4.24)
+      postcss-value-parser: 4.2.0
+      semver: 7.5.1
+      webpack: 5.84.1
+    dev: true
+
+  /css-prefers-color-scheme@6.0.3(postcss@8.4.24):
+    resolution: {integrity: sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==}
+    engines: {node: ^12 || ^14 || >=16}
+    hasBin: true
+    peerDependencies:
+      postcss: ^8.4
+    dependencies:
+      postcss: 8.4.24
+    dev: true
+
+  /css-select@4.3.0:
+    resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
+    dependencies:
+      boolbase: 1.0.0
+      css-what: 6.1.0
+      domhandler: 4.3.1
+      domutils: 2.8.0
+      nth-check: 2.1.1
+    dev: true
+
+  /css-to-react-native@3.2.0:
+    resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==}
+    dependencies:
+      camelize: 1.0.1
+      css-color-keywords: 1.0.0
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /css-tree@1.1.3:
+    resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
+    engines: {node: '>=8.0.0'}
+    dependencies:
+      mdn-data: 2.0.14
+      source-map: 0.6.1
+    dev: true
+
+  /css-what@6.1.0:
+    resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
+    engines: {node: '>= 6'}
+    dev: true
+
+  /cssdb@6.6.3:
+    resolution: {integrity: sha512-7GDvDSmE+20+WcSMhP17Q1EVWUrLlbxxpMDqG731n8P99JhnQZHR9YvtjPvEHfjFUjvQJvdpKCjlKOX+xe4UVA==}
+    dev: true
+
+  /cssesc@3.0.0:
+    resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
+    engines: {node: '>=4'}
+    hasBin: true
+    dev: true
+
+  /csso@4.2.0:
+    resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==}
+    engines: {node: '>=8.0.0'}
+    dependencies:
+      css-tree: 1.1.3
+    dev: true
+
+  /cssom@0.3.8:
+    resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==}
+    dev: true
+
+  /cssom@0.5.0:
+    resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==}
+    dev: true
+
+  /cssstyle@2.3.0:
+    resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==}
+    engines: {node: '>=8'}
+    dependencies:
+      cssom: 0.3.8
+    dev: true
+
+  /csstype@3.1.2:
+    resolution: {integrity: sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==}
+
+  /current-script-polyfill@1.0.0:
+    resolution: {integrity: sha512-qv8s+G47V6Hq+g2kRE5th+ASzzrL7b6l+tap1DHKK25ZQJv3yIFhH96XaQ7NGL+zRW3t/RDbweJf/dJDe5Z5KA==}
+    dev: true
+
+  /d@1.0.1:
+    resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==}
+    dependencies:
+      es5-ext: 0.10.62
+      type: 1.2.0
+    dev: true
+
+  /dashdash@1.14.1:
+    resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==}
+    engines: {node: '>=0.10'}
+    dependencies:
+      assert-plus: 1.0.0
+    dev: true
+
+  /data-uri-to-buffer@4.0.1:
+    resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
+    engines: {node: '>= 12'}
+    dev: true
+
+  /data-urls@3.0.2:
+    resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==}
+    engines: {node: '>=12'}
+    dependencies:
+      abab: 2.0.6
+      whatwg-mimetype: 3.0.0
+      whatwg-url: 11.0.0
+    dev: true
+
+  /date-fns@2.30.0:
+    resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==}
+    engines: {node: '>=0.11'}
+    dependencies:
+      '@babel/runtime': 7.22.3
+    dev: true
+
+  /date-format@0.0.0:
+    resolution: {integrity: sha512-kAmAdtsjW5nQ02FERwI1bP4xe6HQBPwy5kpAF4CRSLOMUs/vgMIEEwpy6JqUs7NitTyhZiImxwAjgPpnteycHg==}
+    deprecated: 0.x is no longer supported. Please upgrade to 4.x or higher.
+    dev: true
+
+  /dayjs@1.11.7:
+    resolution: {integrity: sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ==}
+
+  /debug@0.7.4:
+    resolution: {integrity: sha512-EohAb3+DSHSGx8carOSKJe8G0ayV5/i609OD0J2orCkuyae7SyZSz2aoLmQF2s0Pj5gITDebwPH7GFBlqOUQ1Q==}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+    dev: true
+
+  /debug@2.6.9:
+    resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+    dependencies:
+      ms: 2.0.0
+
+  /debug@3.2.7:
+    resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+    dependencies:
+      ms: 2.1.3
+    dev: true
+
+  /debug@4.3.4(supports-color@5.5.0):
+    resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+    engines: {node: '>=6.0'}
+    peerDependencies:
+      supports-color: '*'
+    peerDependenciesMeta:
+      supports-color:
+        optional: true
+    dependencies:
+      ms: 2.1.2
+      supports-color: 5.5.0
+
+  /decamelize-keys@1.1.1:
+    resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      decamelize: 1.2.0
+      map-obj: 1.0.1
+    dev: true
+
+  /decamelize@1.2.0:
+    resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /decimal.js@10.4.3:
+    resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==}
+    dev: true
+
+  /decode-uri-component@0.2.2:
+    resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
+    engines: {node: '>=0.10'}
+    dev: true
+
+  /dedent@0.7.0:
+    resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==}
+    dev: true
+
+  /deep-equal@2.2.1:
+    resolution: {integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==}
+    dependencies:
+      array-buffer-byte-length: 1.0.0
+      call-bind: 1.0.2
+      es-get-iterator: 1.1.3
+      get-intrinsic: 1.2.1
+      is-arguments: 1.1.1
+      is-array-buffer: 3.0.2
+      is-date-object: 1.0.5
+      is-regex: 1.1.4
+      is-shared-array-buffer: 1.0.2
+      isarray: 2.0.5
+      object-is: 1.1.5
+      object-keys: 1.1.1
+      object.assign: 4.1.4
+      regexp.prototype.flags: 1.5.0
+      side-channel: 1.0.4
+      which-boxed-primitive: 1.0.2
+      which-collection: 1.0.1
+      which-typed-array: 1.1.9
+    dev: true
+
+  /deep-is@0.1.4:
+    resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+
+  /deepmerge@4.3.1:
+    resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+    engines: {node: '>=0.10.0'}
+
+  /default-browser-id@3.0.0:
+    resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==}
+    engines: {node: '>=12'}
+    dependencies:
+      bplist-parser: 0.2.0
+      untildify: 4.0.0
+    dev: true
+
+  /default-browser@4.0.0:
+    resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==}
+    engines: {node: '>=14.16'}
+    dependencies:
+      bundle-name: 3.0.0
+      default-browser-id: 3.0.0
+      execa: 7.1.1
+      titleize: 3.0.0
+    dev: true
+
+  /defaults@1.0.4:
+    resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+    dependencies:
+      clone: 1.0.4
+    dev: true
+
+  /define-lazy-prop@2.0.0:
+    resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
+    engines: {node: '>=8'}
+
+  /define-lazy-prop@3.0.0:
+    resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /define-properties@1.2.0:
+    resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      has-property-descriptors: 1.0.0
+      object-keys: 1.1.1
+    dev: true
+
+  /delayed-stream@1.0.0:
+    resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
+    engines: {node: '>=0.4.0'}
+    dev: true
+
+  /depd@2.0.0:
+    resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
+    engines: {node: '>= 0.8'}
+    dev: true
+
+  /des.js@1.0.1:
+    resolution: {integrity: sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==}
+    dependencies:
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+    dev: true
+
+  /destroy@1.2.0:
+    resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
+    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
+    dev: true
+
+  /detect-indent@6.1.0:
+    resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /detect-indent@7.0.1:
+    resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==}
+    engines: {node: '>=12.20'}
+    dev: true
+
+  /detect-libc@1.0.3:
+    resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==}
+    engines: {node: '>=0.10'}
+    hasBin: true
+    dev: true
+
+  /detect-newline@3.1.0:
+    resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /detect-newline@4.0.0:
+    resolution: {integrity: sha512-1aXUEPdfGdzVPFpzGJJNgq9o81bGg1s09uxTWsqBlo9PI332uyJRQq13+LK/UN4JfxJbFdCXonUFQ9R/p7yCtw==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    dev: true
+
+  /detect-node@2.1.0:
+    resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
+    dev: true
+
+  /detect-port-alt@1.1.6:
+    resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==}
+    engines: {node: '>= 4.2.1'}
+    hasBin: true
+    dependencies:
+      address: 1.2.2
+      debug: 2.6.9
+    transitivePeerDependencies:
+      - supports-color
+    dev: false
+
+  /diff-sequences@29.4.3:
+    resolution: {integrity: sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dev: true
+
+  /diff@4.0.2:
+    resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==}
+    engines: {node: '>=0.3.1'}
+    dev: true
+
+  /diffie-hellman@5.0.3:
+    resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==}
+    dependencies:
+      bn.js: 4.12.0
+      miller-rabin: 4.0.1
+      randombytes: 2.1.0
+    dev: true
+
+  /dir-glob@3.0.1:
+    resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+    engines: {node: '>=8'}
+    dependencies:
+      path-type: 4.0.0
+
+  /doctrine@2.1.0:
+    resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      esutils: 2.0.3
+    dev: true
+
+  /doctrine@3.0.0:
+    resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+    engines: {node: '>=6.0.0'}
+    dependencies:
+      esutils: 2.0.3
+
+  /dom-accessibility-api@0.5.16:
+    resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
+    dev: true
+
+  /dom-align@1.12.4:
+    resolution: {integrity: sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==}
+
+  /dom-converter@0.2.0:
+    resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==}
+    dependencies:
+      utila: 0.4.0
+    dev: true
+
+  /dom-serializer@0.2.2:
+    resolution: {integrity: sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==}
+    dependencies:
+      domelementtype: 2.3.0
+      entities: 2.2.0
+    dev: true
+
+  /dom-serializer@1.4.1:
+    resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
+    dependencies:
+      domelementtype: 2.3.0
+      domhandler: 4.3.1
+      entities: 2.2.0
+    dev: true
+
+  /dom-walk@0.1.2:
+    resolution: {integrity: sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==}
+    dev: true
+
+  /domain-browser@1.2.0:
+    resolution: {integrity: sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==}
+    engines: {node: '>=0.4', npm: '>=1.2'}
+    dev: true
+
+  /domelementtype@1.3.1:
+    resolution: {integrity: sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==}
+    dev: true
+
+  /domelementtype@2.3.0:
+    resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
+    dev: true
+
+  /domexception@4.0.0:
+    resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==}
+    engines: {node: '>=12'}
+    dependencies:
+      webidl-conversions: 7.0.0
+    dev: true
+
+  /domhandler@2.4.2:
+    resolution: {integrity: sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==}
+    dependencies:
+      domelementtype: 1.3.1
+    dev: true
+
+  /domhandler@4.3.1:
+    resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
+    engines: {node: '>= 4'}
+    dependencies:
+      domelementtype: 2.3.0
+    dev: true
+
+  /domutils@1.7.0:
+    resolution: {integrity: sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==}
+    dependencies:
+      dom-serializer: 0.2.2
+      domelementtype: 1.3.1
+    dev: true
+
+  /domutils@2.8.0:
+    resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
+    dependencies:
+      dom-serializer: 1.4.1
+      domelementtype: 2.3.0
+      domhandler: 4.3.1
+    dev: true
+
+  /dot-case@3.0.4:
+    resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
+    dependencies:
+      no-case: 3.0.4
+      tslib: 2.5.2
+    dev: true
+
+  /dotenv@8.6.0:
+    resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /duplexer@0.1.2:
+    resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
+    dev: false
+
+  /duplexify@4.1.2:
+    resolution: {integrity: sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==}
+    dependencies:
+      end-of-stream: 1.4.4
+      inherits: 2.0.4
+      readable-stream: 3.6.2
+      stream-shift: 1.0.1
+    dev: true
+
+  /dva-core@1.5.0-beta.2(redux@3.7.2):
+    resolution: {integrity: sha512-xmtr/J63EZXBdVXNBW+QCD7p9CaE8kAo2U1faRyv3PIGcy0G3Y6IBDNtoBB/Cj3nzk/jvX0dv96Hnh1kpSnI7Q==}
+    peerDependencies:
+      redux: 3.x
+    dependencies:
+      '@babel/runtime': 7.22.3
+      flatten: 1.0.3
+      global: 4.4.0
+      invariant: 2.2.4
+      is-plain-object: 2.0.4
+      redux: 3.7.2
+      redux-saga: 0.16.2
+      warning: 3.0.0
+    dev: true
+
+  /dva-core@2.0.4(redux@3.7.2):
+    resolution: {integrity: sha512-Zh39llFyItu9HKXKfCZVf9UFtDTcypdAjGBew1S+wK8BGVzFpm1GPTdd6uIMeg7O6STtCvt2Qv+RwUut1GFynA==}
+    peerDependencies:
+      redux: 4.x
+    dependencies:
+      '@babel/runtime': 7.22.3
+      flatten: 1.0.3
+      global: 4.4.0
+      invariant: 2.2.4
+      is-plain-object: 2.0.4
+      redux: 3.7.2
+      redux-saga: 0.16.2
+      warning: 3.0.0
+    dev: true
+
+  /dva-core@2.0.4(redux@4.2.1):
+    resolution: {integrity: sha512-Zh39llFyItu9HKXKfCZVf9UFtDTcypdAjGBew1S+wK8BGVzFpm1GPTdd6uIMeg7O6STtCvt2Qv+RwUut1GFynA==}
+    peerDependencies:
+      redux: 4.x
+    dependencies:
+      '@babel/runtime': 7.22.3
+      flatten: 1.0.3
+      global: 4.4.0
+      invariant: 2.2.4
+      is-plain-object: 2.0.4
+      redux: 4.2.1
+      redux-saga: 0.16.2
+      warning: 3.0.0
+    dev: true
+
+  /dva-immer@1.0.1(dva@2.5.0-beta.2):
+    resolution: {integrity: sha512-Oe+yFTtu2UMNcMoBLLTa/ms1RjUry38Yf0ClN8LiHbF+gT2QAdLYLk3miu1dDtm3Sxl9nk+DH1edKX0Hy49uQg==}
+    peerDependencies:
+      dva: ^2.5.0-0
+    dependencies:
+      '@babel/runtime': 7.22.3
+      dva: 2.5.0-beta.2(react-dom@18.2.0)(react@18.2.0)
+      immer: 8.0.4
+    dev: true
+
+  /dva-loading@3.0.24(dva-core@2.0.4):
+    resolution: {integrity: sha512-3j4bmuXOYH93xe+CC//z3Si8XMx6DLJveep+UbzKy0jhA7oQrCCZTdKxu0UPYXeAMYXpCO25pG4JOnVhzmC7ug==}
+    peerDependencies:
+      dva-core: ^1.1.0 || ^1.5.0-0 || ^1.6.0-0
+    dependencies:
+      '@babel/runtime': 7.22.3
+      dva-core: 2.0.4(redux@4.2.1)
+    dev: true
+
+  /dva@2.5.0-beta.2(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-kc2+CHhF1cNIU3Rg1miMhHgOKJ/VDrq9d6ynVBZf1EN2YKWU3MVFq/uTTBqMr2qkR0m9f8VKHOFmfKLtfMI93Q==}
+    peerDependencies:
+      react: 15.x || ^16.0.0-0
+      react-dom: 15.x || ^16.0.0-0
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@types/isomorphic-fetch': 0.0.34
+      '@types/react-router-dom': 4.3.5
+      '@types/react-router-redux': 5.0.22
+      dva-core: 1.5.0-beta.2(redux@3.7.2)
+      global: 4.4.0
+      history: 4.10.1
+      invariant: 2.2.4
+      isomorphic-fetch: 2.2.1
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      react-redux: 5.1.2(react@18.2.0)(redux@3.7.2)
+      react-router-dom: 4.3.1(react@18.2.0)
+      react-router-redux: 5.0.0-alpha.9(react@18.2.0)
+      redux: 3.7.2
+    dev: true
+
+  /ecc-jsbn@0.1.2:
+    resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==}
+    dependencies:
+      jsbn: 0.1.1
+      safer-buffer: 2.1.2
+    dev: true
+
+  /ee-first@1.1.1:
+    resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
+    dev: true
+
+  /electron-to-chromium@1.4.411:
+    resolution: {integrity: sha512-5VXLW4Qw89vM2WTICHua/y8v7fKGDRVa2VPOtBB9IpLvW316B+xd8yD1wTmLPY2ot/00P/qt87xdolj4aG/Lzg==}
+
+  /elliptic@6.5.4:
+    resolution: {integrity: sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==}
+    dependencies:
+      bn.js: 4.12.0
+      brorand: 1.1.0
+      hash.js: 1.1.7
+      hmac-drbg: 1.0.1
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+      minimalistic-crypto-utils: 1.0.1
+    dev: true
+
+  /email-addresses@3.1.0:
+    resolution: {integrity: sha512-k0/r7GrWVL32kZlGwfPNgB2Y/mMXVTq/decgLczm/j34whdaspNrZO8CnXPf1laaHxI6ptUlsnAxN+UAPw+fzg==}
+    dev: true
+
+  /emittery@0.13.1:
+    resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /emoji-regex@8.0.0:
+    resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+    dev: true
+
+  /emojis-list@3.0.0:
+    resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
+    engines: {node: '>= 4'}
+
+  /encodeurl@1.0.2:
+    resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
+    engines: {node: '>= 0.8'}
+    dev: true
+
+  /encoding@0.1.13:
+    resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==}
+    dependencies:
+      iconv-lite: 0.6.3
+    dev: true
+
+  /end-of-stream@1.4.4:
+    resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
+    dependencies:
+      once: 1.4.0
+    dev: true
+
+  /enhanced-resolve@5.14.1:
+    resolution: {integrity: sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==}
+    engines: {node: '>=10.13.0'}
+    dependencies:
+      graceful-fs: 4.2.11
+      tapable: 2.2.1
+
+  /enhanced-resolve@5.9.3:
+    resolution: {integrity: sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==}
+    engines: {node: '>=10.13.0'}
+    dependencies:
+      graceful-fs: 4.2.11
+      tapable: 2.2.1
+    dev: true
+
+  /enquirer@2.3.6:
+    resolution: {integrity: sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==}
+    engines: {node: '>=8.6'}
+    dependencies:
+      ansi-colors: 4.1.3
+    dev: true
+
+  /entities@1.1.2:
+    resolution: {integrity: sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==}
+    dev: true
+
+  /entities@2.2.0:
+    resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
+    dev: true
+
+  /entities@4.5.0:
+    resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
+    engines: {node: '>=0.12'}
+    dev: true
+
+  /errno@0.1.8:
+    resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
+    hasBin: true
+    requiresBuild: true
+    dependencies:
+      prr: 1.0.1
+    dev: true
+    optional: true
+
+  /error-ex@1.3.2:
+    resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+    dependencies:
+      is-arrayish: 0.2.1
+
+  /error-stack-parser@2.1.4:
+    resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==}
+    dependencies:
+      stackframe: 1.3.4
+    dev: true
+
+  /es-abstract@1.21.2:
+    resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      array-buffer-byte-length: 1.0.0
+      available-typed-arrays: 1.0.5
+      call-bind: 1.0.2
+      es-set-tostringtag: 2.0.1
+      es-to-primitive: 1.2.1
+      function.prototype.name: 1.1.5
+      get-intrinsic: 1.2.1
+      get-symbol-description: 1.0.0
+      globalthis: 1.0.3
+      gopd: 1.0.1
+      has: 1.0.3
+      has-property-descriptors: 1.0.0
+      has-proto: 1.0.1
+      has-symbols: 1.0.3
+      internal-slot: 1.0.5
+      is-array-buffer: 3.0.2
+      is-callable: 1.2.7
+      is-negative-zero: 2.0.2
+      is-regex: 1.1.4
+      is-shared-array-buffer: 1.0.2
+      is-string: 1.0.7
+      is-typed-array: 1.1.10
+      is-weakref: 1.0.2
+      object-inspect: 1.12.3
+      object-keys: 1.1.1
+      object.assign: 4.1.4
+      regexp.prototype.flags: 1.5.0
+      safe-regex-test: 1.0.0
+      string.prototype.trim: 1.2.7
+      string.prototype.trimend: 1.0.6
+      string.prototype.trimstart: 1.0.6
+      typed-array-length: 1.0.4
+      unbox-primitive: 1.0.2
+      which-typed-array: 1.1.9
+    dev: true
+
+  /es-get-iterator@1.1.3:
+    resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==}
+    dependencies:
+      call-bind: 1.0.2
+      get-intrinsic: 1.2.1
+      has-symbols: 1.0.3
+      is-arguments: 1.1.1
+      is-map: 2.0.2
+      is-set: 2.0.2
+      is-string: 1.0.7
+      isarray: 2.0.5
+      stop-iteration-iterator: 1.0.0
+    dev: true
+
+  /es-module-lexer@1.2.1:
+    resolution: {integrity: sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==}
+
+  /es-set-tostringtag@2.0.1:
+    resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      get-intrinsic: 1.2.1
+      has: 1.0.3
+      has-tostringtag: 1.0.0
+    dev: true
+
+  /es-shim-unscopables@1.0.0:
+    resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==}
+    dependencies:
+      has: 1.0.3
+    dev: true
+
+  /es-to-primitive@1.2.1:
+    resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      is-callable: 1.2.7
+      is-date-object: 1.0.5
+      is-symbol: 1.0.4
+    dev: true
+
+  /es5-ext@0.10.62:
+    resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==}
+    engines: {node: '>=0.10'}
+    requiresBuild: true
+    dependencies:
+      es6-iterator: 2.0.3
+      es6-symbol: 3.1.3
+      next-tick: 1.1.0
+    dev: true
+
+  /es5-imcompatible-versions@0.1.82:
+    resolution: {integrity: sha512-Y4vitTOiUyvIHPMcj6yrLaS2Un1SLlH9opeHZmpF68e8CFL173XeDkSA2UOVnDDB9WRi2+wztzbcIXRhIeQVnA==}
+    dev: true
+
+  /es6-iterator@2.0.3:
+    resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==}
+    dependencies:
+      d: 1.0.1
+      es5-ext: 0.10.62
+      es6-symbol: 3.1.3
+    dev: true
+
+  /es6-promise@3.3.1:
+    resolution: {integrity: sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==}
+    dev: true
+
+  /es6-promise@4.2.8:
+    resolution: {integrity: sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==}
+    dev: true
+
+  /es6-promisify@5.0.0:
+    resolution: {integrity: sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==}
+    dependencies:
+      es6-promise: 4.2.8
+    dev: true
+
+  /es6-symbol@3.1.3:
+    resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==}
+    dependencies:
+      d: 1.0.1
+      ext: 1.7.0
+    dev: true
+
+  /es6-weak-map@2.0.3:
+    resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==}
+    dependencies:
+      d: 1.0.1
+      es5-ext: 0.10.62
+      es6-iterator: 2.0.3
+      es6-symbol: 3.1.3
+    dev: true
+
+  /esbuild@0.16.17:
+    resolution: {integrity: sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
+    optionalDependencies:
+      '@esbuild/android-arm': 0.16.17
+      '@esbuild/android-arm64': 0.16.17
+      '@esbuild/android-x64': 0.16.17
+      '@esbuild/darwin-arm64': 0.16.17
+      '@esbuild/darwin-x64': 0.16.17
+      '@esbuild/freebsd-arm64': 0.16.17
+      '@esbuild/freebsd-x64': 0.16.17
+      '@esbuild/linux-arm': 0.16.17
+      '@esbuild/linux-arm64': 0.16.17
+      '@esbuild/linux-ia32': 0.16.17
+      '@esbuild/linux-loong64': 0.16.17
+      '@esbuild/linux-mips64el': 0.16.17
+      '@esbuild/linux-ppc64': 0.16.17
+      '@esbuild/linux-riscv64': 0.16.17
+      '@esbuild/linux-s390x': 0.16.17
+      '@esbuild/linux-x64': 0.16.17
+      '@esbuild/netbsd-x64': 0.16.17
+      '@esbuild/openbsd-x64': 0.16.17
+      '@esbuild/sunos-x64': 0.16.17
+      '@esbuild/win32-arm64': 0.16.17
+      '@esbuild/win32-ia32': 0.16.17
+      '@esbuild/win32-x64': 0.16.17
+    dev: true
+
+  /esbuild@0.17.19:
+    resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
+    optionalDependencies:
+      '@esbuild/android-arm': 0.17.19
+      '@esbuild/android-arm64': 0.17.19
+      '@esbuild/android-x64': 0.17.19
+      '@esbuild/darwin-arm64': 0.17.19
+      '@esbuild/darwin-x64': 0.17.19
+      '@esbuild/freebsd-arm64': 0.17.19
+      '@esbuild/freebsd-x64': 0.17.19
+      '@esbuild/linux-arm': 0.17.19
+      '@esbuild/linux-arm64': 0.17.19
+      '@esbuild/linux-ia32': 0.17.19
+      '@esbuild/linux-loong64': 0.17.19
+      '@esbuild/linux-mips64el': 0.17.19
+      '@esbuild/linux-ppc64': 0.17.19
+      '@esbuild/linux-riscv64': 0.17.19
+      '@esbuild/linux-s390x': 0.17.19
+      '@esbuild/linux-x64': 0.17.19
+      '@esbuild/netbsd-x64': 0.17.19
+      '@esbuild/openbsd-x64': 0.17.19
+      '@esbuild/sunos-x64': 0.17.19
+      '@esbuild/win32-arm64': 0.17.19
+      '@esbuild/win32-ia32': 0.17.19
+      '@esbuild/win32-x64': 0.17.19
+    dev: true
+
+  /escalade@3.1.1:
+    resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
+    engines: {node: '>=6'}
+
+  /escape-html@1.0.3:
+    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+    dev: true
+
+  /escape-string-regexp@1.0.5:
+    resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+    engines: {node: '>=0.8.0'}
+
+  /escape-string-regexp@2.0.0:
+    resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /escape-string-regexp@4.0.0:
+    resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+    engines: {node: '>=10'}
+
+  /escodegen@2.0.0:
+    resolution: {integrity: sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==}
+    engines: {node: '>=6.0'}
+    hasBin: true
+    dependencies:
+      esprima: 4.0.1
+      estraverse: 5.3.0
+      esutils: 2.0.3
+      optionator: 0.8.3
+    optionalDependencies:
+      source-map: 0.6.1
+    dev: true
+
+  /eslint-ast-utils@1.1.0:
+    resolution: {integrity: sha512-otzzTim2/1+lVrlH19EfQQJEhVJSu0zOb9ygb3iapN6UlyaDtyRq4b5U1FuW0v1lRa9Fp/GJyHkSwm6NqABgCA==}
+    engines: {node: '>=4'}
+    dependencies:
+      lodash.get: 4.4.2
+      lodash.zip: 4.2.0
+    dev: true
+
+  /eslint-config-prettier@8.8.0(eslint@7.32.0):
+    resolution: {integrity: sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==}
+    hasBin: true
+    peerDependencies:
+      eslint: '>=7.0.0'
+    dependencies:
+      eslint: 7.32.0
+    dev: true
+
+  /eslint-formatter-pretty@4.1.0:
+    resolution: {integrity: sha512-IsUTtGxF1hrH6lMWiSl1WbGaiP01eT6kzywdY1U+zLc0MP+nwEnUiS9UI8IaOTUhTeQJLlCEWIbXINBH4YJbBQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      '@types/eslint': 7.29.0
+      ansi-escapes: 4.3.2
+      chalk: 4.1.2
+      eslint-rule-docs: 1.1.235
+      log-symbols: 4.1.0
+      plur: 4.0.0
+      string-width: 4.2.3
+      supports-hyperlinks: 2.3.0
+    dev: true
+
+  /eslint-plugin-babel@5.3.1(eslint@7.32.0):
+    resolution: {integrity: sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g==}
+    engines: {node: '>=4'}
+    peerDependencies:
+      eslint: '>=4.0.0'
+    dependencies:
+      eslint: 7.32.0
+      eslint-rule-composer: 0.3.0
+    dev: true
+
+  /eslint-plugin-jest@24.7.0(@typescript-eslint/eslint-plugin@5.59.7)(eslint@7.32.0)(typescript@4.9.5):
+    resolution: {integrity: sha512-wUxdF2bAZiYSKBclsUMrYHH6WxiBreNjyDxbRv345TIvPeoCEgPNEn3Sa+ZrSqsf1Dl9SqqSREXMHExlMMu1DA==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      '@typescript-eslint/eslint-plugin': '>= 4'
+      eslint: '>=5'
+    peerDependenciesMeta:
+      '@typescript-eslint/eslint-plugin':
+        optional: true
+    dependencies:
+      '@typescript-eslint/eslint-plugin': 5.59.7(@typescript-eslint/parser@5.59.7)(eslint@7.32.0)(typescript@4.9.5)
+      '@typescript-eslint/experimental-utils': 4.33.0(eslint@7.32.0)(typescript@4.9.5)
+      eslint: 7.32.0
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+    dev: true
+
+  /eslint-plugin-jest@27.2.1(@typescript-eslint/eslint-plugin@5.48.1)(eslint@8.35.0)(jest@29.5.0)(typescript@5.0.2):
+    resolution: {integrity: sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    peerDependencies:
+      '@typescript-eslint/eslint-plugin': ^5.0.0
+      eslint: ^7.0.0 || ^8.0.0
+      jest: '*'
+    peerDependenciesMeta:
+      '@typescript-eslint/eslint-plugin':
+        optional: true
+      jest:
+        optional: true
+    dependencies:
+      '@typescript-eslint/eslint-plugin': 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.35.0)(typescript@5.0.2)
+      '@typescript-eslint/utils': 5.59.7(eslint@8.35.0)(typescript@5.0.2)
+      eslint: 8.35.0
+      jest: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1)
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+    dev: true
+
+  /eslint-plugin-jest@27.2.1(@typescript-eslint/eslint-plugin@5.48.1)(eslint@8.41.0)(jest@29.5.0)(typescript@5.0.2):
+    resolution: {integrity: sha512-l067Uxx7ZT8cO9NJuf+eJHvt6bqJyz2Z29wykyEdz/OtmcELQl2MQGQLX8J94O1cSJWAwUSEvCjwjA7KEK3Hmg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    peerDependencies:
+      '@typescript-eslint/eslint-plugin': ^5.0.0
+      eslint: ^7.0.0 || ^8.0.0
+      jest: '*'
+    peerDependenciesMeta:
+      '@typescript-eslint/eslint-plugin':
+        optional: true
+      jest:
+        optional: true
+    dependencies:
+      '@typescript-eslint/eslint-plugin': 5.48.1(@typescript-eslint/parser@5.48.1)(eslint@8.41.0)(typescript@5.0.2)
+      '@typescript-eslint/utils': 5.59.7(eslint@8.41.0)(typescript@5.0.2)
+      eslint: 8.41.0
+      jest: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1)
+    transitivePeerDependencies:
+      - supports-color
+      - typescript
+    dev: true
+
+  /eslint-plugin-promise@6.1.1(eslint@7.32.0):
+    resolution: {integrity: sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    peerDependencies:
+      eslint: ^7.0.0 || ^8.0.0
+    dependencies:
+      eslint: 7.32.0
+    dev: true
+
+  /eslint-plugin-react-hooks@4.6.0(eslint@7.32.0):
+    resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
+    dependencies:
+      eslint: 7.32.0
+    dev: true
+
+  /eslint-plugin-react-hooks@4.6.0(eslint@8.35.0):
+    resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
+    dependencies:
+      eslint: 8.35.0
+    dev: true
+
+  /eslint-plugin-react-hooks@4.6.0(eslint@8.41.0):
+    resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
+    dependencies:
+      eslint: 8.41.0
+    dev: true
+
+  /eslint-plugin-react@7.32.2(eslint@7.32.0):
+    resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==}
+    engines: {node: '>=4'}
+    peerDependencies:
+      eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+    dependencies:
+      array-includes: 3.1.6
+      array.prototype.flatmap: 1.3.1
+      array.prototype.tosorted: 1.1.1
+      doctrine: 2.1.0
+      eslint: 7.32.0
+      estraverse: 5.3.0
+      jsx-ast-utils: 3.3.3
+      minimatch: 3.1.2
+      object.entries: 1.1.6
+      object.fromentries: 2.0.6
+      object.hasown: 1.1.2
+      object.values: 1.1.6
+      prop-types: 15.8.1
+      resolve: 2.0.0-next.4
+      semver: 6.3.0
+      string.prototype.matchall: 4.0.8
+    dev: true
+
+  /eslint-plugin-react@7.32.2(eslint@8.35.0):
+    resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==}
+    engines: {node: '>=4'}
+    peerDependencies:
+      eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+    dependencies:
+      array-includes: 3.1.6
+      array.prototype.flatmap: 1.3.1
+      array.prototype.tosorted: 1.1.1
+      doctrine: 2.1.0
+      eslint: 8.35.0
+      estraverse: 5.3.0
+      jsx-ast-utils: 3.3.3
+      minimatch: 3.1.2
+      object.entries: 1.1.6
+      object.fromentries: 2.0.6
+      object.hasown: 1.1.2
+      object.values: 1.1.6
+      prop-types: 15.8.1
+      resolve: 2.0.0-next.4
+      semver: 6.3.0
+      string.prototype.matchall: 4.0.8
+    dev: true
+
+  /eslint-plugin-react@7.32.2(eslint@8.41.0):
+    resolution: {integrity: sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==}
+    engines: {node: '>=4'}
+    peerDependencies:
+      eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+    dependencies:
+      array-includes: 3.1.6
+      array.prototype.flatmap: 1.3.1
+      array.prototype.tosorted: 1.1.1
+      doctrine: 2.1.0
+      eslint: 8.41.0
+      estraverse: 5.3.0
+      jsx-ast-utils: 3.3.3
+      minimatch: 3.1.2
+      object.entries: 1.1.6
+      object.fromentries: 2.0.6
+      object.hasown: 1.1.2
+      object.values: 1.1.6
+      prop-types: 15.8.1
+      resolve: 2.0.0-next.4
+      semver: 6.3.0
+      string.prototype.matchall: 4.0.8
+    dev: true
+
+  /eslint-plugin-unicorn@20.1.0(eslint@7.32.0):
+    resolution: {integrity: sha512-XQxLBJT/gnwyRR6cfYsIK1AdekQchAt5tmcsnldevGjgR2xoZsRUa5/i6e0seNHy2RoT57CkTnbVHwHF8No8LA==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      eslint: '>=7.0.0'
+    dependencies:
+      ci-info: 2.0.0
+      clean-regexp: 1.0.0
+      eslint: 7.32.0
+      eslint-ast-utils: 1.1.0
+      eslint-template-visitor: 2.3.2(eslint@7.32.0)
+      eslint-utils: 2.1.0
+      import-modules: 2.1.0
+      lodash: 4.17.21
+      pluralize: 8.0.0
+      read-pkg-up: 7.0.1
+      regexp-tree: 0.1.27
+      reserved-words: 0.1.2
+      safe-regex: 2.1.1
+      semver: 7.5.1
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /eslint-rule-composer@0.3.0:
+    resolution: {integrity: sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==}
+    engines: {node: '>=4.0.0'}
+    dev: true
+
+  /eslint-rule-docs@1.1.235:
+    resolution: {integrity: sha512-+TQ+x4JdTnDoFEXXb3fDvfGOwnyNV7duH8fXWTPD1ieaBmB8omj7Gw/pMBBu4uI2uJCCU8APDaQJzWuXnTsH4A==}
+    dev: true
+
+  /eslint-scope@5.1.1:
+    resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+    engines: {node: '>=8.0.0'}
+    dependencies:
+      esrecurse: 4.3.0
+      estraverse: 4.3.0
+
+  /eslint-scope@7.2.0:
+    resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dependencies:
+      esrecurse: 4.3.0
+      estraverse: 5.3.0
+
+  /eslint-template-visitor@2.3.2(eslint@7.32.0):
+    resolution: {integrity: sha512-3ydhqFpuV7x1M9EK52BPNj6V0Kwu0KKkcIAfpUhwHbR8ocRln/oUHgfxQupY8O1h4Qv/POHDumb/BwwNfxbtnA==}
+    peerDependencies:
+      eslint: '>=7.0.0'
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/eslint-parser': 7.21.8(@babel/core@7.22.1)(eslint@7.32.0)
+      eslint: 7.32.0
+      eslint-visitor-keys: 2.1.0
+      esquery: 1.5.0
+      multimap: 1.1.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /eslint-utils@2.1.0:
+    resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==}
+    engines: {node: '>=6'}
+    dependencies:
+      eslint-visitor-keys: 1.3.0
+    dev: true
+
+  /eslint-utils@3.0.0(eslint@7.32.0):
+    resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
+    engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
+    peerDependencies:
+      eslint: '>=5'
+    dependencies:
+      eslint: 7.32.0
+      eslint-visitor-keys: 2.1.0
+    dev: true
+
+  /eslint-utils@3.0.0(eslint@8.35.0):
+    resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
+    engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
+    peerDependencies:
+      eslint: '>=5'
+    dependencies:
+      eslint: 8.35.0
+      eslint-visitor-keys: 2.1.0
+    dev: true
+
+  /eslint-utils@3.0.0(eslint@8.41.0):
+    resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
+    engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
+    peerDependencies:
+      eslint: '>=5'
+    dependencies:
+      eslint: 8.41.0
+      eslint-visitor-keys: 2.1.0
+    dev: true
+
+  /eslint-visitor-keys@1.3.0:
+    resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /eslint-visitor-keys@2.1.0:
+    resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /eslint-visitor-keys@3.4.1:
+    resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+
+  /eslint@7.32.0:
+    resolution: {integrity: sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==}
+    engines: {node: ^10.12.0 || >=12.0.0}
+    hasBin: true
+    dependencies:
+      '@babel/code-frame': 7.12.11
+      '@eslint/eslintrc': 0.4.3
+      '@humanwhocodes/config-array': 0.5.0
+      ajv: 6.12.6
+      chalk: 4.1.2
+      cross-spawn: 7.0.3
+      debug: 4.3.4(supports-color@5.5.0)
+      doctrine: 3.0.0
+      enquirer: 2.3.6
+      escape-string-regexp: 4.0.0
+      eslint-scope: 5.1.1
+      eslint-utils: 2.1.0
+      eslint-visitor-keys: 2.1.0
+      espree: 7.3.1
+      esquery: 1.5.0
+      esutils: 2.0.3
+      fast-deep-equal: 3.1.3
+      file-entry-cache: 6.0.1
+      functional-red-black-tree: 1.0.1
+      glob-parent: 5.1.2
+      globals: 13.20.0
+      ignore: 4.0.6
+      import-fresh: 3.3.0
+      imurmurhash: 0.1.4
+      is-glob: 4.0.3
+      js-yaml: 3.14.1
+      json-stable-stringify-without-jsonify: 1.0.1
+      levn: 0.4.1
+      lodash.merge: 4.6.2
+      minimatch: 3.1.2
+      natural-compare: 1.4.0
+      optionator: 0.9.1
+      progress: 2.0.3
+      regexpp: 3.2.0
+      semver: 7.5.1
+      strip-ansi: 6.0.1
+      strip-json-comments: 3.1.1
+      table: 6.8.1
+      text-table: 0.2.0
+      v8-compile-cache: 2.3.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /eslint@8.35.0:
+    resolution: {integrity: sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    hasBin: true
+    dependencies:
+      '@eslint/eslintrc': 2.0.3
+      '@eslint/js': 8.35.0
+      '@humanwhocodes/config-array': 0.11.8
+      '@humanwhocodes/module-importer': 1.0.1
+      '@nodelib/fs.walk': 1.2.8
+      ajv: 6.12.6
+      chalk: 4.1.2
+      cross-spawn: 7.0.3
+      debug: 4.3.4(supports-color@5.5.0)
+      doctrine: 3.0.0
+      escape-string-regexp: 4.0.0
+      eslint-scope: 7.2.0
+      eslint-utils: 3.0.0(eslint@8.35.0)
+      eslint-visitor-keys: 3.4.1
+      espree: 9.5.2
+      esquery: 1.5.0
+      esutils: 2.0.3
+      fast-deep-equal: 3.1.3
+      file-entry-cache: 6.0.1
+      find-up: 5.0.0
+      glob-parent: 6.0.2
+      globals: 13.20.0
+      grapheme-splitter: 1.0.4
+      ignore: 5.2.4
+      import-fresh: 3.3.0
+      imurmurhash: 0.1.4
+      is-glob: 4.0.3
+      is-path-inside: 3.0.3
+      js-sdsl: 4.4.0
+      js-yaml: 4.1.0
+      json-stable-stringify-without-jsonify: 1.0.1
+      levn: 0.4.1
+      lodash.merge: 4.6.2
+      minimatch: 3.1.2
+      natural-compare: 1.4.0
+      optionator: 0.9.1
+      regexpp: 3.2.0
+      strip-ansi: 6.0.1
+      strip-json-comments: 3.1.1
+      text-table: 0.2.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /eslint@8.41.0:
+    resolution: {integrity: sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    hasBin: true
+    dependencies:
+      '@eslint-community/eslint-utils': 4.4.0(eslint@8.41.0)
+      '@eslint-community/regexpp': 4.5.1
+      '@eslint/eslintrc': 2.0.3
+      '@eslint/js': 8.41.0
+      '@humanwhocodes/config-array': 0.11.8
+      '@humanwhocodes/module-importer': 1.0.1
+      '@nodelib/fs.walk': 1.2.8
+      ajv: 6.12.6
+      chalk: 4.1.2
+      cross-spawn: 7.0.3
+      debug: 4.3.4(supports-color@5.5.0)
+      doctrine: 3.0.0
+      escape-string-regexp: 4.0.0
+      eslint-scope: 7.2.0
+      eslint-visitor-keys: 3.4.1
+      espree: 9.5.2
+      esquery: 1.5.0
+      esutils: 2.0.3
+      fast-deep-equal: 3.1.3
+      file-entry-cache: 6.0.1
+      find-up: 5.0.0
+      glob-parent: 6.0.2
+      globals: 13.20.0
+      graphemer: 1.4.0
+      ignore: 5.2.4
+      import-fresh: 3.3.0
+      imurmurhash: 0.1.4
+      is-glob: 4.0.3
+      is-path-inside: 3.0.3
+      js-yaml: 4.1.0
+      json-stable-stringify-without-jsonify: 1.0.1
+      levn: 0.4.1
+      lodash.merge: 4.6.2
+      minimatch: 3.1.2
+      natural-compare: 1.4.0
+      optionator: 0.9.1
+      strip-ansi: 6.0.1
+      strip-json-comments: 3.1.1
+      text-table: 0.2.0
+    transitivePeerDependencies:
+      - supports-color
+
+  /espree@7.3.1:
+    resolution: {integrity: sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==}
+    engines: {node: ^10.12.0 || >=12.0.0}
+    dependencies:
+      acorn: 7.4.1
+      acorn-jsx: 5.3.2(acorn@7.4.1)
+      eslint-visitor-keys: 1.3.0
+    dev: true
+
+  /espree@9.5.2:
+    resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==}
+    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+    dependencies:
+      acorn: 8.8.2
+      acorn-jsx: 5.3.2(acorn@8.8.2)
+      eslint-visitor-keys: 3.4.1
+
+  /esprima@4.0.1:
+    resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+    engines: {node: '>=4'}
+    hasBin: true
+    dev: true
+
+  /esquery@1.5.0:
+    resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
+    engines: {node: '>=0.10'}
+    dependencies:
+      estraverse: 5.3.0
+
+  /esrecurse@4.3.0:
+    resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+    engines: {node: '>=4.0'}
+    dependencies:
+      estraverse: 5.3.0
+
+  /estraverse@4.3.0:
+    resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+    engines: {node: '>=4.0'}
+
+  /estraverse@5.3.0:
+    resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+    engines: {node: '>=4.0'}
+
+  /esutils@2.0.3:
+    resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+    engines: {node: '>=0.10.0'}
+
+  /etag@1.8.1:
+    resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
+    engines: {node: '>= 0.6'}
+    dev: true
+
+  /event-emitter@0.3.5:
+    resolution: {integrity: sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==}
+    dependencies:
+      d: 1.0.1
+      es5-ext: 0.10.62
+    dev: true
+
+  /events@3.3.0:
+    resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
+    engines: {node: '>=0.8.x'}
+
+  /evp_bytestokey@1.0.3:
+    resolution: {integrity: sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==}
+    dependencies:
+      md5.js: 1.3.5
+      safe-buffer: 5.2.1
+    dev: true
+
+  /execa@4.1.0:
+    resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==}
+    engines: {node: '>=10'}
+    dependencies:
+      cross-spawn: 7.0.3
+      get-stream: 5.2.0
+      human-signals: 1.1.1
+      is-stream: 2.0.1
+      merge-stream: 2.0.0
+      npm-run-path: 4.0.1
+      onetime: 5.1.2
+      signal-exit: 3.0.7
+      strip-final-newline: 2.0.0
+    dev: true
+
+  /execa@5.1.1:
+    resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+    engines: {node: '>=10'}
+    dependencies:
+      cross-spawn: 7.0.3
+      get-stream: 6.0.1
+      human-signals: 2.1.0
+      is-stream: 2.0.1
+      merge-stream: 2.0.0
+      npm-run-path: 4.0.1
+      onetime: 5.1.2
+      signal-exit: 3.0.7
+      strip-final-newline: 2.0.0
+    dev: true
+
+  /execa@7.1.1:
+    resolution: {integrity: sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==}
+    engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0}
+    dependencies:
+      cross-spawn: 7.0.3
+      get-stream: 6.0.1
+      human-signals: 4.3.1
+      is-stream: 3.0.0
+      merge-stream: 2.0.0
+      npm-run-path: 5.1.0
+      onetime: 6.0.0
+      signal-exit: 3.0.7
+      strip-final-newline: 3.0.0
+    dev: true
+
+  /execall@2.0.0:
+    resolution: {integrity: sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==}
+    engines: {node: '>=8'}
+    dependencies:
+      clone-regexp: 2.2.0
+    dev: true
+
+  /exenv@1.2.2:
+    resolution: {integrity: sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==}
+    dev: true
+
+  /exit@0.1.2:
+    resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
+    engines: {node: '>= 0.8.0'}
+    dev: true
+
+  /expect@29.5.0:
+    resolution: {integrity: sha512-yM7xqUrCO2JdpFo4XpM82t+PJBFybdqoQuJLDGeDX2ij8NZzqRHyu3Hp188/JX7SWqud+7t4MUdvcgGBICMHZg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/expect-utils': 29.5.0
+      jest-get-type: 29.4.3
+      jest-matcher-utils: 29.5.0
+      jest-message-util: 29.5.0
+      jest-util: 29.5.0
+    dev: true
+
+  /express@4.18.2:
+    resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==}
+    engines: {node: '>= 0.10.0'}
+    dependencies:
+      accepts: 1.3.8
+      array-flatten: 1.1.1
+      body-parser: 1.20.1
+      content-disposition: 0.5.4
+      content-type: 1.0.5
+      cookie: 0.5.0
+      cookie-signature: 1.0.6
+      debug: 2.6.9
+      depd: 2.0.0
+      encodeurl: 1.0.2
+      escape-html: 1.0.3
+      etag: 1.8.1
+      finalhandler: 1.2.0
+      fresh: 0.5.2
+      http-errors: 2.0.0
+      merge-descriptors: 1.0.1
+      methods: 1.1.2
+      on-finished: 2.4.1
+      parseurl: 1.3.3
+      path-to-regexp: 0.1.7
+      proxy-addr: 2.0.7
+      qs: 6.11.0
+      range-parser: 1.2.1
+      safe-buffer: 5.2.1
+      send: 0.18.0
+      serve-static: 1.15.0
+      setprototypeof: 1.2.0
+      statuses: 2.0.1
+      type-is: 1.6.18
+      utils-merge: 1.0.1
+      vary: 1.1.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /ext@1.7.0:
+    resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==}
+    dependencies:
+      type: 2.7.2
+    dev: true
+
+  /extend@3.0.2:
+    resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
+    dev: true
+
+  /extract-zip@1.7.0:
+    resolution: {integrity: sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==}
+    hasBin: true
+    dependencies:
+      concat-stream: 1.6.2
+      debug: 2.6.9
+      mkdirp: 0.5.6
+      yauzl: 2.10.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /extsprintf@1.3.0:
+    resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==}
+    engines: {'0': node >=0.6.0}
+    dev: true
+
+  /fast-deep-equal@3.1.3:
+    resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+
+  /fast-glob@3.2.12:
+    resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==}
+    engines: {node: '>=8.6.0'}
+    dependencies:
+      '@nodelib/fs.stat': 2.0.5
+      '@nodelib/fs.walk': 1.2.8
+      glob-parent: 5.1.2
+      merge2: 1.4.1
+      micromatch: 4.0.5
+
+  /fast-json-stable-stringify@2.1.0:
+    resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+
+  /fast-levenshtein@2.0.6:
+    resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+
+  /fast-redact@3.2.0:
+    resolution: {integrity: sha512-zaTadChr+NekyzallAMXATXLOR8MNx3zqpZ0MUF2aGf4EathnG0f32VLODNlY8IuGY3HoRO2L6/6fSzNsLaHIw==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /fast-safe-stringify@2.1.1:
+    resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==}
+    dev: true
+
+  /fastest-levenshtein@1.0.16:
+    resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==}
+    engines: {node: '>= 4.9.1'}
+    dev: true
+
+  /fastq@1.15.0:
+    resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==}
+    dependencies:
+      reusify: 1.0.4
+
+  /fb-watchman@2.0.2:
+    resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
+    dependencies:
+      bser: 2.1.1
+    dev: true
+
+  /fbjs@0.8.18:
+    resolution: {integrity: sha512-EQaWFK+fEPSoibjNy8IxUtaFOMXcWsY0JaVrQoZR9zC8N2Ygf9iDITPWjUTVIax95b6I742JFLqASHfsag/vKA==}
+    dependencies:
+      core-js: 1.2.7
+      isomorphic-fetch: 2.2.1
+      loose-envify: 1.4.0
+      object-assign: 4.1.1
+      promise: 7.3.1
+      setimmediate: 1.0.5
+      ua-parser-js: 0.7.35
+    dev: true
+
+  /fd-slicer@1.1.0:
+    resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
+    dependencies:
+      pend: 1.2.0
+    dev: true
+
+  /fetch-blob@3.2.0:
+    resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
+    engines: {node: ^12.20 || >= 14.13}
+    dependencies:
+      node-domexception: 1.0.0
+      web-streams-polyfill: 3.2.1
+    dev: true
+
+  /file-entry-cache@6.0.1:
+    resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+    engines: {node: ^10.12.0 || >=12.0.0}
+    dependencies:
+      flat-cache: 3.0.4
+
+  /filename-reserved-regex@2.0.0:
+    resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /filenamify@4.3.0:
+    resolution: {integrity: sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==}
+    engines: {node: '>=8'}
+    dependencies:
+      filename-reserved-regex: 2.0.0
+      strip-outer: 1.0.1
+      trim-repeated: 1.0.0
+    dev: true
+
+  /filesize@8.0.7:
+    resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==}
+    engines: {node: '>= 0.4.0'}
+    dev: false
+
+  /fill-range@7.0.1:
+    resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+    engines: {node: '>=8'}
+    dependencies:
+      to-regex-range: 5.0.1
+
+  /filter-obj@1.1.0:
+    resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /finalhandler@1.2.0:
+    resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
+    engines: {node: '>= 0.8'}
+    dependencies:
+      debug: 2.6.9
+      encodeurl: 1.0.2
+      escape-html: 1.0.3
+      on-finished: 2.4.1
+      parseurl: 1.3.3
+      statuses: 2.0.1
+      unpipe: 1.0.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /find-cache-dir@3.3.2:
+    resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==}
+    engines: {node: '>=8'}
+    dependencies:
+      commondir: 1.0.1
+      make-dir: 3.1.0
+      pkg-dir: 4.2.0
+    dev: true
+
+  /find-root@1.1.0:
+    resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==}
+    dev: false
+
+  /find-up@3.0.0:
+    resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==}
+    engines: {node: '>=6'}
+    dependencies:
+      locate-path: 3.0.0
+    dev: false
+
+  /find-up@4.1.0:
+    resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+    engines: {node: '>=8'}
+    dependencies:
+      locate-path: 5.0.0
+      path-exists: 4.0.0
+    dev: true
+
+  /find-up@5.0.0:
+    resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+    engines: {node: '>=10'}
+    dependencies:
+      locate-path: 6.0.0
+      path-exists: 4.0.0
+
+  /flat-cache@3.0.4:
+    resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
+    engines: {node: ^10.12.0 || >=12.0.0}
+    dependencies:
+      flatted: 3.2.7
+      rimraf: 3.0.2
+
+  /flatted@3.2.7:
+    resolution: {integrity: sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==}
+
+  /flatten@1.0.3:
+    resolution: {integrity: sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==}
+    deprecated: flatten is deprecated in favor of utility frameworks such as lodash.
+    dev: true
+
+  /follow-redirects@1.15.2:
+    resolution: {integrity: sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==}
+    engines: {node: '>=4.0'}
+    peerDependencies:
+      debug: '*'
+    peerDependenciesMeta:
+      debug:
+        optional: true
+    dev: true
+
+  /for-each@0.3.3:
+    resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+    dependencies:
+      is-callable: 1.2.7
+    dev: true
+
+  /forever-agent@0.6.1:
+    resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==}
+    dev: true
+
+  /fork-ts-checker-webpack-plugin@6.5.3(eslint@8.41.0)(typescript@5.0.2)(webpack@5.84.1):
+    resolution: {integrity: sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==}
+    engines: {node: '>=10', yarn: '>=1.0.0'}
+    peerDependencies:
+      eslint: '>= 6'
+      typescript: '>= 2.7'
+      vue-template-compiler: '*'
+      webpack: '>= 4'
+    peerDependenciesMeta:
+      eslint:
+        optional: true
+      vue-template-compiler:
+        optional: true
+    dependencies:
+      '@babel/code-frame': 7.21.4
+      '@types/json-schema': 7.0.12
+      chalk: 4.1.2
+      chokidar: 3.5.3
+      cosmiconfig: 6.0.0
+      deepmerge: 4.3.1
+      eslint: 8.41.0
+      fs-extra: 9.1.0
+      glob: 7.2.3
+      memfs: 3.5.1
+      minimatch: 3.1.2
+      schema-utils: 2.7.0
+      semver: 7.5.1
+      tapable: 1.1.3
+      typescript: 5.0.2
+      webpack: 5.84.1
+    dev: false
+
+  /fork-ts-checker-webpack-plugin@8.0.0(typescript@5.0.2)(webpack@5.84.1):
+    resolution: {integrity: sha512-mX3qW3idpueT2klaQXBzrIM/pHw+T0B/V9KHEvNrqijTq9NFnMZU6oreVxDYcf33P8a5cW+67PjodNHthGnNVg==}
+    engines: {node: '>=12.13.0', yarn: '>=1.0.0'}
+    peerDependencies:
+      typescript: '>3.6.0'
+      webpack: ^5.11.0
+    dependencies:
+      '@babel/code-frame': 7.21.4
+      chalk: 4.1.2
+      chokidar: 3.5.3
+      cosmiconfig: 7.1.0
+      deepmerge: 4.3.1
+      fs-extra: 10.1.0
+      memfs: 3.5.1
+      minimatch: 3.1.2
+      node-abort-controller: 3.1.1
+      schema-utils: 3.1.2
+      semver: 7.5.1
+      tapable: 2.2.1
+      typescript: 5.0.2
+      webpack: 5.84.1
+    dev: true
+
+  /form-data@2.3.3:
+    resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==}
+    engines: {node: '>= 0.12'}
+    dependencies:
+      asynckit: 0.4.0
+      combined-stream: 1.0.8
+      mime-types: 2.1.35
+    dev: true
+
+  /form-data@4.0.0:
+    resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==}
+    engines: {node: '>= 6'}
+    dependencies:
+      asynckit: 0.4.0
+      combined-stream: 1.0.8
+      mime-types: 2.1.35
+    dev: true
+
+  /formdata-polyfill@4.0.10:
+    resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
+    engines: {node: '>=12.20.0'}
+    dependencies:
+      fetch-blob: 3.2.0
+    dev: true
+
+  /forwarded@0.2.0:
+    resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
+    engines: {node: '>= 0.6'}
+    dev: true
+
+  /fraction.js@4.2.0:
+    resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
+    dev: true
+
+  /fresh@0.5.2:
+    resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==}
+    engines: {node: '>= 0.6'}
+    dev: true
+
+  /fs-extra@10.1.0:
+    resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
+    engines: {node: '>=12'}
+    dependencies:
+      graceful-fs: 4.2.11
+      jsonfile: 6.1.0
+      universalify: 2.0.0
+    dev: true
+
+  /fs-extra@8.1.0:
+    resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
+    engines: {node: '>=6 <7 || >=8'}
+    dependencies:
+      graceful-fs: 4.2.11
+      jsonfile: 4.0.0
+      universalify: 0.1.2
+    dev: true
+
+  /fs-extra@9.1.0:
+    resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      at-least-node: 1.0.0
+      graceful-fs: 4.2.11
+      jsonfile: 6.1.0
+      universalify: 2.0.0
+    dev: false
+
+  /fs-monkey@1.0.3:
+    resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==}
+
+  /fs-readdir-recursive@1.1.0:
+    resolution: {integrity: sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==}
+    dev: true
+
+  /fs.realpath@1.0.0:
+    resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+
+  /fsevents@2.3.2:
+    resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+    requiresBuild: true
+    optional: true
+
+  /function-bind@1.1.1:
+    resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
+
+  /function.prototype.name@1.1.5:
+    resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.21.2
+      functions-have-names: 1.2.3
+    dev: true
+
+  /functional-red-black-tree@1.0.1:
+    resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==}
+    dev: true
+
+  /functions-have-names@1.2.3:
+    resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+    dev: true
+
+  /gensync@1.0.0-beta.2:
+    resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+    engines: {node: '>=6.9.0'}
+
+  /get-caller-file@2.0.5:
+    resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+    engines: {node: 6.* || 8.* || >= 10.*}
+    dev: true
+
+  /get-intrinsic@1.2.1:
+    resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==}
+    dependencies:
+      function-bind: 1.1.1
+      has: 1.0.3
+      has-proto: 1.0.1
+      has-symbols: 1.0.3
+    dev: true
+
+  /get-own-enumerable-property-symbols@3.0.2:
+    resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==}
+    dev: true
+
+  /get-package-type@0.1.0:
+    resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
+    engines: {node: '>=8.0.0'}
+    dev: true
+
+  /get-stdin@8.0.0:
+    resolution: {integrity: sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /get-stream@5.2.0:
+    resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
+    engines: {node: '>=8'}
+    dependencies:
+      pump: 3.0.0
+    dev: true
+
+  /get-stream@6.0.1:
+    resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /get-symbol-description@1.0.0:
+    resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      get-intrinsic: 1.2.1
+    dev: true
+
+  /get-tsconfig@4.5.0:
+    resolution: {integrity: sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==}
+    dev: true
+
+  /getnpmregistry@1.0.1:
+    resolution: {integrity: sha512-OZRQ1RmRC0JduSLlQrHAaBLLrB23D3gaREsMBtM7aV8pxKB3duPs+a7iH7662b8zu1G9H6wiOvZc814g/bcHVg==}
+    dependencies:
+      node-fetch: 2.6.11
+    transitivePeerDependencies:
+      - encoding
+    dev: true
+
+  /getpass@0.1.7:
+    resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==}
+    dependencies:
+      assert-plus: 1.0.0
+    dev: true
+
+  /gh-pages@3.2.3:
+    resolution: {integrity: sha512-jA1PbapQ1jqzacECfjUaO9gV8uBgU6XNMV0oXLtfCX3haGLe5Atq8BxlrADhbD6/UdG9j6tZLWAkAybndOXTJg==}
+    engines: {node: '>=10'}
+    hasBin: true
+    dependencies:
+      async: 2.6.4
+      commander: 2.20.3
+      email-addresses: 3.1.0
+      filenamify: 4.3.0
+      find-cache-dir: 3.3.2
+      fs-extra: 8.1.0
+      globby: 6.1.0
+    dev: true
+
+  /git-hooks-list@1.0.3:
+    resolution: {integrity: sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ==}
+    dev: true
+
+  /git-hooks-list@3.1.0:
+    resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==}
+    dev: true
+
+  /glob-parent@5.1.2:
+    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+    engines: {node: '>= 6'}
+    dependencies:
+      is-glob: 4.0.3
+
+  /glob-parent@6.0.2:
+    resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+    engines: {node: '>=10.13.0'}
+    dependencies:
+      is-glob: 4.0.3
+
+  /glob-to-regexp@0.4.1:
+    resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
+
+  /glob@7.2.3:
+    resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+    dependencies:
+      fs.realpath: 1.0.0
+      inflight: 1.0.6
+      inherits: 2.0.4
+      minimatch: 3.1.2
+      once: 1.4.0
+      path-is-absolute: 1.0.1
+
+  /glob@9.3.5:
+    resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==}
+    engines: {node: '>=16 || 14 >=14.17'}
+    dependencies:
+      fs.realpath: 1.0.0
+      minimatch: 8.0.4
+      minipass: 4.2.8
+      path-scurry: 1.9.2
+    dev: true
+
+  /global-modules@2.0.0:
+    resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==}
+    engines: {node: '>=6'}
+    dependencies:
+      global-prefix: 3.0.0
+
+  /global-prefix@3.0.0:
+    resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==}
+    engines: {node: '>=6'}
+    dependencies:
+      ini: 1.3.8
+      kind-of: 6.0.3
+      which: 1.3.1
+
+  /global@4.4.0:
+    resolution: {integrity: sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==}
+    dependencies:
+      min-document: 2.19.0
+      process: 0.11.10
+    dev: true
+
+  /globals@11.12.0:
+    resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+    engines: {node: '>=4'}
+
+  /globals@13.20.0:
+    resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==}
+    engines: {node: '>=8'}
+    dependencies:
+      type-fest: 0.20.2
+
+  /globalthis@1.0.3:
+    resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      define-properties: 1.2.0
+    dev: true
+
+  /globby@10.0.0:
+    resolution: {integrity: sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw==}
+    engines: {node: '>=8'}
+    dependencies:
+      '@types/glob': 7.2.0
+      array-union: 2.1.0
+      dir-glob: 3.0.1
+      fast-glob: 3.2.12
+      glob: 7.2.3
+      ignore: 5.2.4
+      merge2: 1.4.1
+      slash: 3.0.0
+    dev: true
+
+  /globby@11.1.0:
+    resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+    engines: {node: '>=10'}
+    dependencies:
+      array-union: 2.1.0
+      dir-glob: 3.0.1
+      fast-glob: 3.2.12
+      ignore: 5.2.4
+      merge2: 1.4.1
+      slash: 3.0.0
+
+  /globby@13.1.4:
+    resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    dependencies:
+      dir-glob: 3.0.1
+      fast-glob: 3.2.12
+      ignore: 5.2.4
+      merge2: 1.4.1
+      slash: 4.0.0
+    dev: true
+
+  /globby@6.1.0:
+    resolution: {integrity: sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      array-union: 1.0.2
+      glob: 7.2.3
+      object-assign: 4.1.1
+      pify: 2.3.0
+      pinkie-promise: 2.0.1
+    dev: true
+
+  /globjoin@0.1.4:
+    resolution: {integrity: sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==}
+    dev: true
+
+  /gonzales-pe@4.3.0:
+    resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==}
+    engines: {node: '>=0.6.0'}
+    hasBin: true
+    dependencies:
+      minimist: 1.2.8
+    dev: true
+
+  /gopd@1.0.1:
+    resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+    dependencies:
+      get-intrinsic: 1.2.1
+    dev: true
+
+  /graceful-fs@4.2.11:
+    resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
+
+  /grapheme-splitter@1.0.4:
+    resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
+    dev: true
+
+  /graphemer@1.4.0:
+    resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+
+  /gzip-size@6.0.0:
+    resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==}
+    engines: {node: '>=10'}
+    dependencies:
+      duplexer: 0.1.2
+    dev: false
+
+  /handle-thing@2.0.1:
+    resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==}
+    dev: true
+
+  /har-schema@2.0.0:
+    resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /har-validator@5.1.5:
+    resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==}
+    engines: {node: '>=6'}
+    deprecated: this library is no longer supported
+    dependencies:
+      ajv: 6.12.6
+      har-schema: 2.0.0
+    dev: true
+
+  /hard-rejection@2.1.0:
+    resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /harmony-reflect@1.6.2:
+    resolution: {integrity: sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==}
+    dev: true
+
+  /has-bigints@1.0.2:
+    resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+    dev: true
+
+  /has-flag@3.0.0:
+    resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+    engines: {node: '>=4'}
+
+  /has-flag@4.0.0:
+    resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
+    engines: {node: '>=8'}
+
+  /has-property-descriptors@1.0.0:
+    resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
+    dependencies:
+      get-intrinsic: 1.2.1
+    dev: true
+
+  /has-proto@1.0.1:
+    resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==}
+    engines: {node: '>= 0.4'}
+    dev: true
+
+  /has-symbols@1.0.3:
+    resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+    engines: {node: '>= 0.4'}
+    dev: true
+
+  /has-tostringtag@1.0.0:
+    resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      has-symbols: 1.0.3
+    dev: true
+
+  /has@1.0.3:
+    resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
+    engines: {node: '>= 0.4.0'}
+    dependencies:
+      function-bind: 1.1.1
+
+  /hash-base@3.1.0:
+    resolution: {integrity: sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==}
+    engines: {node: '>=4'}
+    dependencies:
+      inherits: 2.0.4
+      readable-stream: 3.6.2
+      safe-buffer: 5.2.1
+    dev: true
+
+  /hash.js@1.1.7:
+    resolution: {integrity: sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==}
+    dependencies:
+      inherits: 2.0.4
+      minimalistic-assert: 1.0.1
+    dev: true
+
+  /he@1.2.0:
+    resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
+    hasBin: true
+    dev: true
+
+  /history@4.10.1:
+    resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==}
+    dependencies:
+      '@babel/runtime': 7.22.3
+      loose-envify: 1.4.0
+      resolve-pathname: 3.0.0
+      tiny-invariant: 1.3.1
+      tiny-warning: 1.0.3
+      value-equal: 1.0.1
+    dev: true
+
+  /history@5.3.0:
+    resolution: {integrity: sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==}
+    dependencies:
+      '@babel/runtime': 7.22.3
+    dev: true
+
+  /hmac-drbg@1.0.1:
+    resolution: {integrity: sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==}
+    dependencies:
+      hash.js: 1.1.7
+      minimalistic-assert: 1.0.1
+      minimalistic-crypto-utils: 1.0.1
+    dev: true
+
+  /hoist-non-react-statics@2.5.5:
+    resolution: {integrity: sha512-rqcy4pJo55FTTLWt+bU8ukscqHeE/e9KWvsOW2b/a3afxQZhwkQdT1rPPCJ0rYXdj4vNcasY8zHTH+jF/qStxw==}
+    dev: true
+
+  /hoist-non-react-statics@3.3.2:
+    resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
+    dependencies:
+      react-is: 16.13.1
+    dev: true
+
+  /hosted-git-info@2.8.9:
+    resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
+    dev: true
+
+  /hosted-git-info@4.1.0:
+    resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
+    engines: {node: '>=10'}
+    dependencies:
+      lru-cache: 6.0.0
+    dev: true
+
+  /hotkeys-js@3.10.2:
+    resolution: {integrity: sha512-Z6vLmJTYzkbZZXlBkhrYB962Q/rZGc/WHQiyEGu9ZZVF7bAeFDjjDa31grWREuw9Ygb4zmlov2bTkPYqj0aFnQ==}
+    dev: false
+
+  /hpack.js@2.1.6:
+    resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==}
+    dependencies:
+      inherits: 2.0.4
+      obuf: 1.1.2
+      readable-stream: 2.3.8
+      wbuf: 1.7.3
+    dev: true
+
+  /htm@3.1.1:
+    resolution: {integrity: sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ==}
+    dev: true
+
+  /html-encoding-sniffer@3.0.0:
+    resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==}
+    engines: {node: '>=12'}
+    dependencies:
+      whatwg-encoding: 2.0.0
+    dev: true
+
+  /html-entities@2.3.3:
+    resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==}
+    dev: true
+
+  /html-escaper@2.0.2:
+    resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+    dev: true
+
+  /html-minifier-terser@6.1.0:
+    resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==}
+    engines: {node: '>=12'}
+    hasBin: true
+    dependencies:
+      camel-case: 4.1.2
+      clean-css: 5.3.2
+      commander: 8.3.0
+      he: 1.2.0
+      param-case: 3.0.4
+      relateurl: 0.2.7
+      terser: 5.17.6
+    dev: true
+
+  /html-tags@3.3.1:
+    resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /html-webpack-plugin@5.5.0(webpack@5.84.1):
+    resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==}
+    engines: {node: '>=10.13.0'}
+    peerDependencies:
+      webpack: ^5.20.0
+    dependencies:
+      '@types/html-minifier-terser': 6.1.0
+      html-minifier-terser: 6.1.0
+      lodash: 4.17.21
+      pretty-error: 4.0.0
+      tapable: 2.2.1
+      webpack: 5.84.1
+    dev: true
+
+  /htmlparser2@3.10.1:
+    resolution: {integrity: sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==}
+    dependencies:
+      domelementtype: 1.3.1
+      domhandler: 2.4.2
+      domutils: 1.7.0
+      entities: 1.1.2
+      inherits: 2.0.4
+      readable-stream: 3.6.2
+    dev: true
+
+  /htmlparser2@6.1.0:
+    resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==}
+    dependencies:
+      domelementtype: 2.3.0
+      domhandler: 4.3.1
+      domutils: 2.8.0
+      entities: 2.2.0
+    dev: true
+
+  /http-deceiver@1.2.7:
+    resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==}
+    dev: true
+
+  /http-errors@2.0.0:
+    resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
+    engines: {node: '>= 0.8'}
+    dependencies:
+      depd: 2.0.0
+      inherits: 2.0.4
+      setprototypeof: 1.2.0
+      statuses: 2.0.1
+      toidentifier: 1.0.1
+    dev: true
+
+  /http-proxy-agent@5.0.0:
+    resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==}
+    engines: {node: '>= 6'}
+    dependencies:
+      '@tootallnate/once': 2.0.0
+      agent-base: 6.0.2
+      debug: 4.3.4(supports-color@5.5.0)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /http-signature@1.2.0:
+    resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==}
+    engines: {node: '>=0.8', npm: '>=1.3.7'}
+    dependencies:
+      assert-plus: 1.0.0
+      jsprim: 1.4.2
+      sshpk: 1.17.0
+    dev: true
+
+  /http2-client@1.3.5:
+    resolution: {integrity: sha512-EC2utToWl4RKfs5zd36Mxq7nzHHBuomZboI0yYL6Y0RmBgT7Sgkq4rQ0ezFTYoIsSs7Tm9SJe+o2FcAg6GBhGA==}
+    dev: true
+
+  /https-browserify@1.0.0:
+    resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==}
+    dev: true
+
+  /https-proxy-agent@2.2.4:
+    resolution: {integrity: sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==}
+    engines: {node: '>= 4.5.0'}
+    dependencies:
+      agent-base: 4.3.0
+      debug: 3.2.7
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /https-proxy-agent@5.0.1:
+    resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
+    engines: {node: '>= 6'}
+    dependencies:
+      agent-base: 6.0.2
+      debug: 4.3.4(supports-color@5.5.0)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /human-signals@1.1.1:
+    resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==}
+    engines: {node: '>=8.12.0'}
+    dev: true
+
+  /human-signals@2.1.0:
+    resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+    engines: {node: '>=10.17.0'}
+    dev: true
+
+  /human-signals@4.3.1:
+    resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==}
+    engines: {node: '>=14.18.0'}
+    dev: true
+
+  /husky@7.0.4:
+    resolution: {integrity: sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==}
+    engines: {node: '>=12'}
+    hasBin: true
+    dev: true
+
+  /iconv-lite@0.4.24:
+    resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      safer-buffer: 2.1.2
+    dev: true
+
+  /iconv-lite@0.6.3:
+    resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      safer-buffer: 2.1.2
+    dev: true
+
+  /icss-utils@5.1.0(postcss@8.4.24):
+    resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==}
+    engines: {node: ^10 || ^12 || >= 14}
+    peerDependencies:
+      postcss: ^8.1.0
+    dependencies:
+      postcss: 8.4.24
+    dev: true
+
+  /identity-obj-proxy@3.0.0:
+    resolution: {integrity: sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==}
+    engines: {node: '>=4'}
+    dependencies:
+      harmony-reflect: 1.6.2
+    dev: true
+
+  /ieee754@1.2.1:
+    resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
+    dev: true
+
+  /ignore@4.0.6:
+    resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==}
+    engines: {node: '>= 4'}
+    dev: true
+
+  /ignore@5.2.4:
+    resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==}
+    engines: {node: '>= 4'}
+
+  /image-size@0.5.5:
+    resolution: {integrity: sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==}
+    engines: {node: '>=0.10.0'}
+    hasBin: true
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /immer@8.0.4:
+    resolution: {integrity: sha512-jMfL18P+/6P6epANRvRk6q8t+3gGhqsJ9EuJ25AXE+9bNTYtssvzeYbEd0mXRYWCmmXSIbnlpz6vd6iJlmGGGQ==}
+    dev: true
+
+  /immer@9.0.21:
+    resolution: {integrity: sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==}
+    dev: false
+
+  /import-fresh@3.3.0:
+    resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+    engines: {node: '>=6'}
+    dependencies:
+      parent-module: 1.0.1
+      resolve-from: 4.0.0
+
+  /import-html-entry@1.14.6:
+    resolution: {integrity: sha512-5MQkbwIr8n/bXOoE05M5/Nm0lnHO46vnb3D6svSvtVwpDqwhd/X14zjLcU31QWZ6gL8rUXNzj6vKHx4yOUL6gQ==}
+    dependencies:
+      '@babel/runtime': 7.22.3
+    dev: true
+
+  /import-lazy@4.0.0:
+    resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /import-local@3.1.0:
+    resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==}
+    engines: {node: '>=8'}
+    hasBin: true
+    dependencies:
+      pkg-dir: 4.2.0
+      resolve-cwd: 3.0.0
+    dev: true
+
+  /import-modules@2.1.0:
+    resolution: {integrity: sha512-8HEWcnkbGpovH9yInoisxaSoIg9Brbul+Ju3Kqe2UsYDUBJD/iQjSgEj0zPcTDPKfPp2fs5xlv1i+JSye/m1/A==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /imurmurhash@0.1.4:
+    resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+    engines: {node: '>=0.8.19'}
+
+  /indent-string@4.0.0:
+    resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /inflight@1.0.6:
+    resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+    dependencies:
+      once: 1.4.0
+      wrappy: 1.0.2
+
+  /inherits@2.0.1:
+    resolution: {integrity: sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==}
+    dev: true
+
+  /inherits@2.0.3:
+    resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==}
+    dev: true
+
+  /inherits@2.0.4:
+    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+  /ini@1.3.8:
+    resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+
+  /internal-slot@1.0.5:
+    resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      get-intrinsic: 1.2.1
+      has: 1.0.3
+      side-channel: 1.0.4
+    dev: true
+
+  /intersection-observer@0.12.2:
+    resolution: {integrity: sha512-7m1vEcPCxXYI8HqnL8CKI6siDyD+eIWSwgB3DZA+ZTogxk9I4CDnj4wilt9x/+/QbHI4YG5YZNmC6458/e9Ktg==}
+    dev: true
+
+  /intl-format-cache@4.3.1:
+    resolution: {integrity: sha512-OEUYNA7D06agqPOYhbTkl0T8HA3QKSuwWh1HiClEnpd9vw7N+3XsQt5iZ0GUEchp5CW1fQk/tary+NsbF3yQ1Q==}
+    dev: true
+
+  /intl-messageformat-parser@3.6.4:
+    resolution: {integrity: sha512-RgPGwue0mJtoX2Ax8EmMzJzttxjnva7gx0Q7mKJ4oALrTZvtmCeAw5Msz2PcjW4dtCh/h7vN/8GJCxZO1uv+OA==}
+    deprecated: We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser
+    dependencies:
+      '@formatjs/intl-unified-numberformat': 3.3.7
+    dev: true
+
+  /intl-messageformat@7.8.4:
+    resolution: {integrity: sha512-yS0cLESCKCYjseCOGXuV4pxJm/buTfyCJ1nzQjryHmSehlptbZbn9fnlk1I9peLopZGGbjj46yHHiTAEZ1qOTA==}
+    dependencies:
+      intl-format-cache: 4.3.1
+      intl-messageformat-parser: 3.6.4
+    dev: true
+
+  /intl-messageformat@9.13.0:
+    resolution: {integrity: sha512-7sGC7QnSQGa5LZP7bXLDhVDtQOeKGeBFGHF2Y8LVBwYZoQZCgWeKoPGTa5GMG8g/TzDgeXuYJQis7Ggiw2xTOw==}
+    dependencies:
+      '@formatjs/ecma402-abstract': 1.11.4
+      '@formatjs/fast-memoize': 1.2.1
+      '@formatjs/icu-messageformat-parser': 2.1.0
+      tslib: 2.5.2
+    dev: true
+
+  /intl@1.2.5:
+    resolution: {integrity: sha512-rK0KcPHeBFBcqsErKSpvZnrOmWOj+EmDkyJ57e90YWaQNqbcivcqmKDlHEeNprDWOsKzPsh1BfSpPQdDvclHVw==}
+    dev: true
+
+  /invariant@2.2.4:
+    resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
+    dependencies:
+      loose-envify: 1.4.0
+
+  /invert-kv@3.0.1:
+    resolution: {integrity: sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /ipaddr.js@1.9.1:
+    resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
+    engines: {node: '>= 0.10'}
+    dev: true
+
+  /irregular-plurals@3.5.0:
+    resolution: {integrity: sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /is-alphabetical@1.0.4:
+    resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==}
+    dev: true
+
+  /is-alphanumerical@1.0.4:
+    resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==}
+    dependencies:
+      is-alphabetical: 1.0.4
+      is-decimal: 1.0.4
+    dev: true
+
+  /is-arguments@1.1.1:
+    resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      has-tostringtag: 1.0.0
+    dev: true
+
+  /is-array-buffer@3.0.2:
+    resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==}
+    dependencies:
+      call-bind: 1.0.2
+      get-intrinsic: 1.2.1
+      is-typed-array: 1.1.10
+    dev: true
+
+  /is-arrayish@0.2.1:
+    resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+
+  /is-arrow-function@2.0.3:
+    resolution: {integrity: sha512-iDStzcT1FJMzx+TjCOK//uDugSe/Mif/8a+T0htydQ3qkJGvSweTZpVYz4hpJH0baloSPiAFQdA8WslAgJphvQ==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      is-callable: 1.2.7
+    dev: true
+
+  /is-async-function@2.0.0:
+    resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      has-tostringtag: 1.0.0
+    dev: true
+
+  /is-bigint@1.0.4:
+    resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+    dependencies:
+      has-bigints: 1.0.2
+    dev: true
+
+  /is-binary-path@2.1.0:
+    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+    engines: {node: '>=8'}
+    dependencies:
+      binary-extensions: 2.2.0
+
+  /is-boolean-object@1.1.2:
+    resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      has-tostringtag: 1.0.0
+    dev: true
+
+  /is-buffer@2.0.5:
+    resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /is-callable@1.2.7:
+    resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+    engines: {node: '>= 0.4'}
+    dev: true
+
+  /is-core-module@2.12.1:
+    resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==}
+    dependencies:
+      has: 1.0.3
+
+  /is-date-object@1.0.5:
+    resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      has-tostringtag: 1.0.0
+    dev: true
+
+  /is-decimal@1.0.4:
+    resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==}
+    dev: true
+
+  /is-docker@2.2.1:
+    resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
+    engines: {node: '>=8'}
+    hasBin: true
+
+  /is-docker@3.0.0:
+    resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    hasBin: true
+    dev: true
+
+  /is-equal@1.6.4:
+    resolution: {integrity: sha512-NiPOTBb5ahmIOYkJ7mVTvvB1bydnTzixvfO+59AjJKBpyjPBIULL3EHGxySyZijlVpewveJyhiLQThcivkkAtw==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      es-get-iterator: 1.1.3
+      functions-have-names: 1.2.3
+      has: 1.0.3
+      has-bigints: 1.0.2
+      has-symbols: 1.0.3
+      is-arrow-function: 2.0.3
+      is-bigint: 1.0.4
+      is-boolean-object: 1.1.2
+      is-callable: 1.2.7
+      is-date-object: 1.0.5
+      is-generator-function: 1.0.10
+      is-number-object: 1.0.7
+      is-regex: 1.1.4
+      is-string: 1.0.7
+      is-symbol: 1.0.4
+      isarray: 2.0.5
+      object-inspect: 1.12.3
+      object.entries: 1.1.6
+      object.getprototypeof: 1.0.4
+      which-boxed-primitive: 1.0.2
+      which-collection: 1.0.1
+    dev: true
+
+  /is-extglob@2.1.1:
+    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
+    engines: {node: '>=0.10.0'}
+
+  /is-finalizationregistry@1.0.2:
+    resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==}
+    dependencies:
+      call-bind: 1.0.2
+    dev: true
+
+  /is-fullwidth-code-point@3.0.0:
+    resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /is-generator-fn@2.1.0:
+    resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /is-generator-function@1.0.10:
+    resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      has-tostringtag: 1.0.0
+    dev: true
+
+  /is-glob@4.0.3:
+    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      is-extglob: 2.1.1
+
+  /is-hexadecimal@1.0.4:
+    resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==}
+    dev: true
+
+  /is-inside-container@1.0.0:
+    resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==}
+    engines: {node: '>=14.16'}
+    hasBin: true
+    dependencies:
+      is-docker: 3.0.0
+    dev: true
+
+  /is-interactive@1.0.0:
+    resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /is-map@2.0.2:
+    resolution: {integrity: sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==}
+    dev: true
+
+  /is-negative-zero@2.0.2:
+    resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
+    engines: {node: '>= 0.4'}
+    dev: true
+
+  /is-number-object@1.0.7:
+    resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      has-tostringtag: 1.0.0
+    dev: true
+
+  /is-number@7.0.0:
+    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+    engines: {node: '>=0.12.0'}
+
+  /is-obj@1.0.1:
+    resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /is-path-inside@3.0.3:
+    resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+    engines: {node: '>=8'}
+
+  /is-plain-obj@1.1.0:
+    resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /is-plain-obj@2.1.0:
+    resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /is-plain-obj@4.1.0:
+    resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /is-plain-object@2.0.4:
+    resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      isobject: 3.0.1
+    dev: true
+
+  /is-plain-object@5.0.0:
+    resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /is-potential-custom-element-name@1.0.1:
+    resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
+    dev: true
+
+  /is-promise@2.2.2:
+    resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==}
+    dev: true
+
+  /is-regex@1.1.4:
+    resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      has-tostringtag: 1.0.0
+    dev: true
+
+  /is-regexp@1.0.0:
+    resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /is-regexp@2.1.0:
+    resolution: {integrity: sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /is-root@2.1.0:
+    resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==}
+    engines: {node: '>=6'}
+    dev: false
+
+  /is-set@2.0.2:
+    resolution: {integrity: sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==}
+    dev: true
+
+  /is-shared-array-buffer@1.0.2:
+    resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
+    dependencies:
+      call-bind: 1.0.2
+    dev: true
+
+  /is-stream@1.1.0:
+    resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /is-stream@2.0.1:
+    resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /is-stream@3.0.0:
+    resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    dev: true
+
+  /is-string@1.0.7:
+    resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      has-tostringtag: 1.0.0
+    dev: true
+
+  /is-symbol@1.0.4:
+    resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      has-symbols: 1.0.3
+    dev: true
+
+  /is-typed-array@1.1.10:
+    resolution: {integrity: sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      available-typed-arrays: 1.0.5
+      call-bind: 1.0.2
+      for-each: 0.3.3
+      gopd: 1.0.1
+      has-tostringtag: 1.0.0
+    dev: true
+
+  /is-typedarray@1.0.0:
+    resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
+    dev: true
+
+  /is-unicode-supported@0.1.0:
+    resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /is-url@1.2.4:
+    resolution: {integrity: sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==}
+    dev: true
+
+  /is-weakmap@2.0.1:
+    resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==}
+    dev: true
+
+  /is-weakref@1.0.2:
+    resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+    dependencies:
+      call-bind: 1.0.2
+    dev: true
+
+  /is-weakset@2.0.2:
+    resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==}
+    dependencies:
+      call-bind: 1.0.2
+      get-intrinsic: 1.2.1
+    dev: true
+
+  /is-what@3.14.1:
+    resolution: {integrity: sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==}
+    dev: true
+
+  /is-what@4.1.11:
+    resolution: {integrity: sha512-gr9+qDrJvdwT4+N2TAACsZQIB4Ow9j2eefqlh3m9JUV41M1LoKhcE+/j+IVni/r6U8Jnc1PwhjdjVJr+Xmtb0A==}
+    engines: {node: '>=12.13'}
+    dev: true
+
+  /is-wsl@2.2.0:
+    resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
+    engines: {node: '>=8'}
+    dependencies:
+      is-docker: 2.2.1
+
+  /isarray@0.0.1:
+    resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==}
+    dev: true
+
+  /isarray@1.0.0:
+    resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+    dev: true
+
+  /isarray@2.0.5:
+    resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+    dev: true
+
+  /isexe@2.0.0:
+    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+
+  /isobject@3.0.1:
+    resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /isomorphic-fetch@2.2.1:
+    resolution: {integrity: sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==}
+    dependencies:
+      node-fetch: 1.7.3
+      whatwg-fetch: 3.6.2
+    dev: true
+
+  /isomorphic-unfetch@4.0.2:
+    resolution: {integrity: sha512-1Yd+CF/7al18/N2BDbsLBcp6RO3tucSW+jcLq24dqdX5MNbCNTw1z4BsGsp4zNmjr/Izm2cs/cEqZPp4kvWSCA==}
+    dependencies:
+      node-fetch: 3.3.1
+      unfetch: 5.0.0
+    dev: true
+
+  /isstream@0.1.2:
+    resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==}
+    dev: true
+
+  /istanbul-lib-coverage@3.2.0:
+    resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /istanbul-lib-instrument@5.2.1:
+    resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
+    engines: {node: '>=8'}
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/parser': 7.22.3
+      '@istanbuljs/schema': 0.1.3
+      istanbul-lib-coverage: 3.2.0
+      semver: 6.3.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /istanbul-lib-report@3.0.0:
+    resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==}
+    engines: {node: '>=8'}
+    dependencies:
+      istanbul-lib-coverage: 3.2.0
+      make-dir: 3.1.0
+      supports-color: 7.2.0
+    dev: true
+
+  /istanbul-lib-source-maps@4.0.1:
+    resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
+    engines: {node: '>=10'}
+    dependencies:
+      debug: 4.3.4(supports-color@5.5.0)
+      istanbul-lib-coverage: 3.2.0
+      source-map: 0.6.1
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /istanbul-reports@3.1.5:
+    resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==}
+    engines: {node: '>=8'}
+    dependencies:
+      html-escaper: 2.0.2
+      istanbul-lib-report: 3.0.0
+    dev: true
+
+  /jest-changed-files@29.5.0:
+    resolution: {integrity: sha512-IFG34IUMUaNBIxjQXF/iu7g6EcdMrGRRxaUSw92I/2g2YC6vCdTltl4nHvt7Ci5nSJwXIkCu8Ka1DKF+X7Z1Ag==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      execa: 5.1.1
+      p-limit: 3.1.0
+    dev: true
+
+  /jest-circus@29.5.0:
+    resolution: {integrity: sha512-gq/ongqeQKAplVxqJmbeUOJJKkW3dDNPY8PjhJ5G0lBRvu0e3EWGxGy5cI4LAGA7gV2UHCtWBI4EMXK8c9nQKA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/environment': 29.5.0
+      '@jest/expect': 29.5.0
+      '@jest/test-result': 29.5.0
+      '@jest/types': 29.5.0
+      '@types/node': 20.2.5
+      chalk: 4.1.2
+      co: 4.6.0
+      dedent: 0.7.0
+      is-generator-fn: 2.1.0
+      jest-each: 29.5.0
+      jest-matcher-utils: 29.5.0
+      jest-message-util: 29.5.0
+      jest-runtime: 29.5.0
+      jest-snapshot: 29.5.0
+      jest-util: 29.5.0
+      p-limit: 3.1.0
+      pretty-format: 29.5.0
+      pure-rand: 6.0.2
+      slash: 3.0.0
+      stack-utils: 2.0.6
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /jest-cli@29.5.0(@types/node@20.2.5)(ts-node@10.9.1):
+    resolution: {integrity: sha512-L1KcP1l4HtfwdxXNFCL5bmUbLQiKrakMUriBEcc1Vfz6gx31ORKdreuWvmQVBit+1ss9NNR3yxjwfwzZNdQXJw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    hasBin: true
+    peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+    dependencies:
+      '@jest/core': 29.5.0(ts-node@10.9.1)
+      '@jest/test-result': 29.5.0
+      '@jest/types': 29.5.0
+      chalk: 4.1.2
+      exit: 0.1.2
+      graceful-fs: 4.2.11
+      import-local: 3.1.0
+      jest-config: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1)
+      jest-util: 29.5.0
+      jest-validate: 29.5.0
+      prompts: 2.4.2
+      yargs: 17.7.2
+    transitivePeerDependencies:
+      - '@types/node'
+      - supports-color
+      - ts-node
+    dev: true
+
+  /jest-config@29.5.0(@types/node@20.2.5)(ts-node@10.9.1):
+    resolution: {integrity: sha512-kvDUKBnNJPNBmFFOhDbm59iu1Fii1Q6SxyhXfvylq3UTHbg6o7j/g8k2dZyXWLvfdKB1vAPxNZnMgtKJcmu3kA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    peerDependencies:
+      '@types/node': '*'
+      ts-node: '>=9.0.0'
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      ts-node:
+        optional: true
+    dependencies:
+      '@babel/core': 7.22.1
+      '@jest/test-sequencer': 29.5.0
+      '@jest/types': 29.5.0
+      '@types/node': 20.2.5
+      babel-jest: 29.5.0(@babel/core@7.22.1)
+      chalk: 4.1.2
+      ci-info: 3.8.0
+      deepmerge: 4.3.1
+      glob: 7.2.3
+      graceful-fs: 4.2.11
+      jest-circus: 29.5.0
+      jest-environment-node: 29.5.0
+      jest-get-type: 29.4.3
+      jest-regex-util: 29.4.3
+      jest-resolve: 29.5.0
+      jest-runner: 29.5.0
+      jest-util: 29.5.0
+      jest-validate: 29.5.0
+      micromatch: 4.0.5
+      parse-json: 5.2.0
+      pretty-format: 29.5.0
+      slash: 3.0.0
+      strip-json-comments: 3.1.1
+      ts-node: 10.9.1(@types/node@20.2.5)(typescript@5.0.2)
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /jest-diff@29.5.0:
+    resolution: {integrity: sha512-LtxijLLZBduXnHSniy0WMdaHjmQnt3g5sa16W4p0HqukYTTsyTW3GD1q41TyGl5YFXj/5B2U6dlh5FM1LIMgxw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      chalk: 4.1.2
+      diff-sequences: 29.4.3
+      jest-get-type: 29.4.3
+      pretty-format: 29.5.0
+    dev: true
+
+  /jest-docblock@29.4.3:
+    resolution: {integrity: sha512-fzdTftThczeSD9nZ3fzA/4KkHtnmllawWrXO69vtI+L9WjEIuXWs4AmyME7lN5hU7dB0sHhuPfcKofRsUb/2Fg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      detect-newline: 3.1.0
+    dev: true
+
+  /jest-each@29.5.0:
+    resolution: {integrity: sha512-HM5kIJ1BTnVt+DQZ2ALp3rzXEl+g726csObrW/jpEGl+CDSSQpOJJX2KE/vEg8cxcMXdyEPu6U4QX5eruQv5hA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/types': 29.5.0
+      chalk: 4.1.2
+      jest-get-type: 29.4.3
+      jest-util: 29.5.0
+      pretty-format: 29.5.0
+    dev: true
+
+  /jest-environment-jsdom@29.5.0:
+    resolution: {integrity: sha512-/KG8yEK4aN8ak56yFVdqFDzKNHgF4BAymCx2LbPNPsUshUlfAl0eX402Xm1pt+eoG9SLZEUVifqXtX8SK74KCw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    peerDependencies:
+      canvas: ^2.5.0
+    peerDependenciesMeta:
+      canvas:
+        optional: true
+    dependencies:
+      '@jest/environment': 29.5.0
+      '@jest/fake-timers': 29.5.0
+      '@jest/types': 29.5.0
+      '@types/jsdom': 20.0.1
+      '@types/node': 20.2.5
+      jest-mock: 29.5.0
+      jest-util: 29.5.0
+      jsdom: 20.0.3
+    transitivePeerDependencies:
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+    dev: true
+
+  /jest-environment-node@29.5.0:
+    resolution: {integrity: sha512-ExxuIK/+yQ+6PRGaHkKewYtg6hto2uGCgvKdb2nfJfKXgZ17DfXjvbZ+jA1Qt9A8EQSfPnt5FKIfnOO3u1h9qw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/environment': 29.5.0
+      '@jest/fake-timers': 29.5.0
+      '@jest/types': 29.5.0
+      '@types/node': 20.2.5
+      jest-mock: 29.5.0
+      jest-util: 29.5.0
+    dev: true
+
+  /jest-get-type@29.4.3:
+    resolution: {integrity: sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dev: true
+
+  /jest-haste-map@29.5.0:
+    resolution: {integrity: sha512-IspOPnnBro8YfVYSw6yDRKh/TiCdRngjxeacCps1cQ9cgVN6+10JUcuJ1EabrgYLOATsIAigxA0rLR9x/YlrSA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/types': 29.5.0
+      '@types/graceful-fs': 4.1.6
+      '@types/node': 20.2.5
+      anymatch: 3.1.3
+      fb-watchman: 2.0.2
+      graceful-fs: 4.2.11
+      jest-regex-util: 29.4.3
+      jest-util: 29.5.0
+      jest-worker: 29.5.0
+      micromatch: 4.0.5
+      walker: 1.0.8
+    optionalDependencies:
+      fsevents: 2.3.2
+    dev: true
+
+  /jest-leak-detector@29.5.0:
+    resolution: {integrity: sha512-u9YdeeVnghBUtpN5mVxjID7KbkKE1QU4f6uUwuxiY0vYRi9BUCLKlPEZfDGR67ofdFmDz9oPAy2G92Ujrntmow==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      jest-get-type: 29.4.3
+      pretty-format: 29.5.0
+    dev: true
+
+  /jest-matcher-utils@29.5.0:
+    resolution: {integrity: sha512-lecRtgm/rjIK0CQ7LPQwzCs2VwW6WAahA55YBuI+xqmhm7LAaxokSB8C97yJeYyT+HvQkH741StzpU41wohhWw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      chalk: 4.1.2
+      jest-diff: 29.5.0
+      jest-get-type: 29.4.3
+      pretty-format: 29.5.0
+    dev: true
+
+  /jest-message-util@29.5.0:
+    resolution: {integrity: sha512-Kijeg9Dag6CKtIDA7O21zNTACqD5MD/8HfIV8pdD94vFyFuer52SigdC3IQMhab3vACxXMiFk+yMHNdbqtyTGA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@babel/code-frame': 7.21.4
+      '@jest/types': 29.5.0
+      '@types/stack-utils': 2.0.1
+      chalk: 4.1.2
+      graceful-fs: 4.2.11
+      micromatch: 4.0.5
+      pretty-format: 29.5.0
+      slash: 3.0.0
+      stack-utils: 2.0.6
+    dev: true
+
+  /jest-mock@29.5.0:
+    resolution: {integrity: sha512-GqOzvdWDE4fAV2bWQLQCkujxYWL7RxjCnj71b5VhDAGOevB3qj3Ovg26A5NI84ZpODxyzaozXLOh2NCgkbvyaw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/types': 29.5.0
+      '@types/node': 20.2.5
+      jest-util: 29.5.0
+    dev: true
+
+  /jest-pnp-resolver@1.2.3(jest-resolve@29.5.0):
+    resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
+    engines: {node: '>=6'}
+    peerDependencies:
+      jest-resolve: '*'
+    peerDependenciesMeta:
+      jest-resolve:
+        optional: true
+    dependencies:
+      jest-resolve: 29.5.0
+    dev: true
+
+  /jest-regex-util@29.4.3:
+    resolution: {integrity: sha512-O4FglZaMmWXbGHSQInfXewIsd1LMn9p3ZXB/6r4FOkyhX2/iP/soMG98jGvk/A3HAN78+5VWcBGO0BJAPRh4kg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dev: true
+
+  /jest-resolve-dependencies@29.5.0:
+    resolution: {integrity: sha512-sjV3GFr0hDJMBpYeUuGduP+YeCRbd7S/ck6IvL3kQ9cpySYKqcqhdLLC2rFwrcL7tz5vYibomBrsFYWkIGGjOg==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      jest-regex-util: 29.4.3
+      jest-snapshot: 29.5.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /jest-resolve@29.5.0:
+    resolution: {integrity: sha512-1TzxJ37FQq7J10jPtQjcc+MkCkE3GBpBecsSUWJ0qZNJpmg6m0D9/7II03yJulm3H/fvVjgqLh/k2eYg+ui52w==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      chalk: 4.1.2
+      graceful-fs: 4.2.11
+      jest-haste-map: 29.5.0
+      jest-pnp-resolver: 1.2.3(jest-resolve@29.5.0)
+      jest-util: 29.5.0
+      jest-validate: 29.5.0
+      resolve: 1.22.2
+      resolve.exports: 2.0.2
+      slash: 3.0.0
+    dev: true
+
+  /jest-runner@29.5.0:
+    resolution: {integrity: sha512-m7b6ypERhFghJsslMLhydaXBiLf7+jXy8FwGRHO3BGV1mcQpPbwiqiKUR2zU2NJuNeMenJmlFZCsIqzJCTeGLQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/console': 29.5.0
+      '@jest/environment': 29.5.0
+      '@jest/test-result': 29.5.0
+      '@jest/transform': 29.5.0
+      '@jest/types': 29.5.0
+      '@types/node': 20.2.5
+      chalk: 4.1.2
+      emittery: 0.13.1
+      graceful-fs: 4.2.11
+      jest-docblock: 29.4.3
+      jest-environment-node: 29.5.0
+      jest-haste-map: 29.5.0
+      jest-leak-detector: 29.5.0
+      jest-message-util: 29.5.0
+      jest-resolve: 29.5.0
+      jest-runtime: 29.5.0
+      jest-util: 29.5.0
+      jest-watcher: 29.5.0
+      jest-worker: 29.5.0
+      p-limit: 3.1.0
+      source-map-support: 0.5.13
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /jest-runtime@29.5.0:
+    resolution: {integrity: sha512-1Hr6Hh7bAgXQP+pln3homOiEZtCDZFqwmle7Ew2j8OlbkIu6uE3Y/etJQG8MLQs3Zy90xrp2C0BRrtPHG4zryw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/environment': 29.5.0
+      '@jest/fake-timers': 29.5.0
+      '@jest/globals': 29.5.0
+      '@jest/source-map': 29.4.3
+      '@jest/test-result': 29.5.0
+      '@jest/transform': 29.5.0
+      '@jest/types': 29.5.0
+      '@types/node': 20.2.5
+      chalk: 4.1.2
+      cjs-module-lexer: 1.2.2
+      collect-v8-coverage: 1.0.1
+      glob: 7.2.3
+      graceful-fs: 4.2.11
+      jest-haste-map: 29.5.0
+      jest-message-util: 29.5.0
+      jest-mock: 29.5.0
+      jest-regex-util: 29.4.3
+      jest-resolve: 29.5.0
+      jest-snapshot: 29.5.0
+      jest-util: 29.5.0
+      slash: 3.0.0
+      strip-bom: 4.0.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /jest-snapshot@29.5.0:
+    resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/generator': 7.22.3
+      '@babel/plugin-syntax-jsx': 7.21.4(@babel/core@7.22.1)
+      '@babel/plugin-syntax-typescript': 7.21.4(@babel/core@7.22.1)
+      '@babel/traverse': 7.22.1(supports-color@5.5.0)
+      '@babel/types': 7.22.3
+      '@jest/expect-utils': 29.5.0
+      '@jest/transform': 29.5.0
+      '@jest/types': 29.5.0
+      '@types/babel__traverse': 7.20.0
+      '@types/prettier': 2.7.2
+      babel-preset-current-node-syntax: 1.0.1(@babel/core@7.22.1)
+      chalk: 4.1.2
+      expect: 29.5.0
+      graceful-fs: 4.2.11
+      jest-diff: 29.5.0
+      jest-get-type: 29.4.3
+      jest-matcher-utils: 29.5.0
+      jest-message-util: 29.5.0
+      jest-util: 29.5.0
+      natural-compare: 1.4.0
+      pretty-format: 29.5.0
+      semver: 7.5.1
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /jest-util@29.5.0:
+    resolution: {integrity: sha512-RYMgG/MTadOr5t8KdhejfvUU82MxsCu5MF6KuDUHl+NuwzUt+Sm6jJWxTJVrDR1j5M/gJVCPKQEpWXY+yIQ6lQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/types': 29.5.0
+      '@types/node': 20.2.5
+      chalk: 4.1.2
+      ci-info: 3.8.0
+      graceful-fs: 4.2.11
+      picomatch: 2.3.1
+    dev: true
+
+  /jest-validate@29.5.0:
+    resolution: {integrity: sha512-pC26etNIi+y3HV8A+tUGr/lph9B18GnzSRAkPaaZJIE1eFdiYm6/CewuiJQ8/RlfHd1u/8Ioi8/sJ+CmbA+zAQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/types': 29.5.0
+      camelcase: 6.3.0
+      chalk: 4.1.2
+      jest-get-type: 29.4.3
+      leven: 3.1.0
+      pretty-format: 29.5.0
+    dev: true
+
+  /jest-watcher@29.5.0:
+    resolution: {integrity: sha512-KmTojKcapuqYrKDpRwfqcQ3zjMlwu27SYext9pt4GlF5FUgB+7XE1mcCnSm6a4uUpFyQIkb6ZhzZvHl+jiBCiA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/test-result': 29.5.0
+      '@jest/types': 29.5.0
+      '@types/node': 20.2.5
+      ansi-escapes: 4.3.2
+      chalk: 4.1.2
+      emittery: 0.13.1
+      jest-util: 29.5.0
+      string-length: 4.0.2
+    dev: true
+
+  /jest-worker@27.5.1:
+    resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
+    engines: {node: '>= 10.13.0'}
+    dependencies:
+      '@types/node': 20.2.5
+      merge-stream: 2.0.0
+      supports-color: 8.1.1
+
+  /jest-worker@29.4.3:
+    resolution: {integrity: sha512-GLHN/GTAAMEy5BFdvpUfzr9Dr80zQqBrh0fz1mtRMe05hqP45+HfQltu7oTBfduD0UeZs09d+maFtFYAXFWvAA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@types/node': 20.2.5
+      jest-util: 29.5.0
+      merge-stream: 2.0.0
+      supports-color: 8.1.1
+    dev: true
+
+  /jest-worker@29.5.0:
+    resolution: {integrity: sha512-NcrQnevGoSp4b5kg+akIpthoAFHxPBcb5P6mYPY0fUNT+sSvmtu6jlkEle3anczUKIKEbMxFimk9oTP/tpIPgA==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@types/node': 20.2.5
+      jest-util: 29.5.0
+      merge-stream: 2.0.0
+      supports-color: 8.1.1
+    dev: true
+
+  /jest@29.5.0(@types/node@20.2.5)(ts-node@10.9.1):
+    resolution: {integrity: sha512-juMg3he2uru1QoXX078zTa7pO85QyB9xajZc6bU+d9yEGwrKX6+vGmJQ3UdVZsvTEUARIdObzH68QItim6OSSQ==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    hasBin: true
+    peerDependencies:
+      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
+    peerDependenciesMeta:
+      node-notifier:
+        optional: true
+    dependencies:
+      '@jest/core': 29.5.0(ts-node@10.9.1)
+      '@jest/types': 29.5.0
+      import-local: 3.1.0
+      jest-cli: 29.5.0(@types/node@20.2.5)(ts-node@10.9.1)
+    transitivePeerDependencies:
+      - '@types/node'
+      - supports-color
+      - ts-node
+    dev: true
+
+  /js-cookie@2.2.1:
+    resolution: {integrity: sha512-HvdH2LzI/EAZcUwA8+0nKNtWHqS+ZmijLA30RwZA0bo7ToCckjK5MkGhjED9KoRcXO6BaGI3I9UIzSA1FKFPOQ==}
+    dev: true
+
+  /js-sdsl@4.4.0:
+    resolution: {integrity: sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==}
+    dev: true
+
+  /js-tokens@4.0.0:
+    resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+
+  /js-yaml@3.14.1:
+    resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+    hasBin: true
+    dependencies:
+      argparse: 1.0.10
+      esprima: 4.0.1
+    dev: true
+
+  /js-yaml@4.1.0:
+    resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+    hasBin: true
+    dependencies:
+      argparse: 2.0.1
+
+  /jsbn@0.1.1:
+    resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==}
+    dev: true
+
+  /jsdom@20.0.3:
+    resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      canvas: ^2.5.0
+    peerDependenciesMeta:
+      canvas:
+        optional: true
+    dependencies:
+      abab: 2.0.6
+      acorn: 8.8.2
+      acorn-globals: 7.0.1
+      cssom: 0.5.0
+      cssstyle: 2.3.0
+      data-urls: 3.0.2
+      decimal.js: 10.4.3
+      domexception: 4.0.0
+      escodegen: 2.0.0
+      form-data: 4.0.0
+      html-encoding-sniffer: 3.0.0
+      http-proxy-agent: 5.0.0
+      https-proxy-agent: 5.0.1
+      is-potential-custom-element-name: 1.0.1
+      nwsapi: 2.2.4
+      parse5: 7.1.2
+      saxes: 6.0.0
+      symbol-tree: 3.2.4
+      tough-cookie: 4.1.2
+      w3c-xmlserializer: 4.0.0
+      webidl-conversions: 7.0.0
+      whatwg-encoding: 2.0.0
+      whatwg-mimetype: 3.0.0
+      whatwg-url: 11.0.0
+      ws: 8.13.0
+      xml-name-validator: 4.0.0
+    transitivePeerDependencies:
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+    dev: true
+
+  /jsesc@0.5.0:
+    resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
+    hasBin: true
+    dev: true
+
+  /jsesc@2.5.2:
+    resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
+    engines: {node: '>=4'}
+    hasBin: true
+
+  /json-parse-even-better-errors@2.3.1:
+    resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+
+  /json-schema-traverse@0.4.1:
+    resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+
+  /json-schema-traverse@1.0.0:
+    resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+    dev: true
+
+  /json-schema@0.4.0:
+    resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==}
+    dev: true
+
+  /json-stable-stringify-without-jsonify@1.0.1:
+    resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+
+  /json-stringify-safe@5.0.1:
+    resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==}
+    dev: true
+
+  /json2mq@0.2.0:
+    resolution: {integrity: sha512-SzoRg7ux5DWTII9J2qkrZrqV1gt+rTaoufMxEzXbS26Uid0NwaJd123HcoB80TgubEppxxIGdNxCx50fEoEWQA==}
+    dependencies:
+      string-convert: 0.2.1
+
+  /json5@2.2.3:
+    resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+    engines: {node: '>=6'}
+    hasBin: true
+
+  /jsonfile@4.0.0:
+    resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
+    optionalDependencies:
+      graceful-fs: 4.2.11
+    dev: true
+
+  /jsonfile@6.1.0:
+    resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
+    dependencies:
+      universalify: 2.0.0
+    optionalDependencies:
+      graceful-fs: 4.2.11
+
+  /jsprim@1.4.2:
+    resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==}
+    engines: {node: '>=0.6.0'}
+    dependencies:
+      assert-plus: 1.0.0
+      extsprintf: 1.3.0
+      json-schema: 0.4.0
+      verror: 1.10.0
+    dev: true
+
+  /jsx-ast-utils@3.3.3:
+    resolution: {integrity: sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==}
+    engines: {node: '>=4.0'}
+    dependencies:
+      array-includes: 3.1.6
+      object.assign: 4.1.4
+    dev: true
+
+  /kind-of@6.0.3:
+    resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+    engines: {node: '>=0.10.0'}
+
+  /kleur@3.0.3:
+    resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
+    engines: {node: '>=6'}
+
+  /known-css-properties@0.21.0:
+    resolution: {integrity: sha512-sZLUnTqimCkvkgRS+kbPlYW5o8q5w1cu+uIisKpEWkj31I8mx8kNG162DwRav8Zirkva6N5uoFsm9kzK4mUXjw==}
+    dev: true
+
+  /known-css-properties@0.25.0:
+    resolution: {integrity: sha512-b0/9J1O9Jcyik1GC6KC42hJ41jKwdO/Mq8Mdo5sYN+IuRTXs2YFHZC3kZSx6ueusqa95x3wLYe/ytKjbAfGixA==}
+    dev: true
+
+  /known-css-properties@0.26.0:
+    resolution: {integrity: sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==}
+    dev: true
+
+  /kolorist@1.8.0:
+    resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==}
+    dev: true
+
+  /lcid@3.1.1:
+    resolution: {integrity: sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==}
+    engines: {node: '>=8'}
+    dependencies:
+      invert-kv: 3.0.1
+    dev: true
+
+  /less@4.1.3:
+    resolution: {integrity: sha512-w16Xk/Ta9Hhyei0Gpz9m7VS8F28nieJaL/VyShID7cYvP6IL5oHeL6p4TXSDJqZE/lNv0oJ2pGVjJsRkfwm5FA==}
+    engines: {node: '>=6'}
+    hasBin: true
+    dependencies:
+      copy-anything: 2.0.6
+      parse-node-version: 1.0.1
+      tslib: 2.5.2
+    optionalDependencies:
+      errno: 0.1.8
+      graceful-fs: 4.2.11
+      image-size: 0.5.5
+      make-dir: 2.1.0
+      mime: 1.6.0
+      needle: 3.2.0
+      source-map: 0.6.1
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /leven@3.1.0:
+    resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /levn@0.3.0:
+    resolution: {integrity: sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==}
+    engines: {node: '>= 0.8.0'}
+    dependencies:
+      prelude-ls: 1.1.2
+      type-check: 0.3.2
+    dev: true
+
+  /levn@0.4.1:
+    resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+    engines: {node: '>= 0.8.0'}
+    dependencies:
+      prelude-ls: 1.2.1
+      type-check: 0.4.0
+
+  /lightningcss-darwin-arm64@1.19.0:
+    resolution: {integrity: sha512-wIJmFtYX0rXHsXHSr4+sC5clwblEMji7HHQ4Ub1/CznVRxtCFha6JIt5JZaNf8vQrfdZnBxLLC6R8pC818jXqg==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /lightningcss-darwin-x64@1.19.0:
+    resolution: {integrity: sha512-Lif1wD6P4poaw9c/4Uh2z+gmrWhw/HtXFoeZ3bEsv6Ia4tt8rOJBdkfVaUJ6VXmpKHALve+iTyP2+50xY1wKPw==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /lightningcss-linux-arm-gnueabihf@1.19.0:
+    resolution: {integrity: sha512-P15VXY5682mTXaiDtbnLYQflc8BYb774j2R84FgDLJTN6Qp0ZjWEFyN1SPqyfTj2B2TFjRHRUvQSSZ7qN4Weig==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /lightningcss-linux-arm64-gnu@1.19.0:
+    resolution: {integrity: sha512-zwXRjWqpev8wqO0sv0M1aM1PpjHz6RVIsBcxKszIG83Befuh4yNysjgHVplF9RTU7eozGe3Ts7r6we1+Qkqsww==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /lightningcss-linux-arm64-musl@1.19.0:
+    resolution: {integrity: sha512-vSCKO7SDnZaFN9zEloKSZM5/kC5gbzUjoJQ43BvUpyTFUX7ACs/mDfl2Eq6fdz2+uWhUh7vf92c4EaaP4udEtA==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /lightningcss-linux-x64-gnu@1.19.0:
+    resolution: {integrity: sha512-0AFQKvVzXf9byrXUq9z0anMGLdZJS+XSDqidyijI5njIwj6MdbvX2UZK/c4FfNmeRa2N/8ngTffoIuOUit5eIQ==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /lightningcss-linux-x64-musl@1.19.0:
+    resolution: {integrity: sha512-SJoM8CLPt6ECCgSuWe+g0qo8dqQYVcPiW2s19dxkmSI5+Uu1GIRzyKA0b7QqmEXolA+oSJhQqCmJpzjY4CuZAg==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /lightningcss-win32-x64-msvc@1.19.0:
+    resolution: {integrity: sha512-C+VuUTeSUOAaBZZOPT7Etn/agx/MatzJzGRkeV+zEABmPuntv1zihncsi+AyGmjkkzq3wVedEy7h0/4S84mUtg==}
+    engines: {node: '>= 12.0.0'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /lightningcss@1.19.0:
+    resolution: {integrity: sha512-yV5UR7og+Og7lQC+70DA7a8ta1uiOPnWPJfxa0wnxylev5qfo4P+4iMpzWAdYWOca4jdNQZii+bDL/l+4hUXIA==}
+    engines: {node: '>= 12.0.0'}
+    dependencies:
+      detect-libc: 1.0.3
+    optionalDependencies:
+      lightningcss-darwin-arm64: 1.19.0
+      lightningcss-darwin-x64: 1.19.0
+      lightningcss-linux-arm-gnueabihf: 1.19.0
+      lightningcss-linux-arm64-gnu: 1.19.0
+      lightningcss-linux-arm64-musl: 1.19.0
+      lightningcss-linux-x64-gnu: 1.19.0
+      lightningcss-linux-x64-musl: 1.19.0
+      lightningcss-win32-x64-msvc: 1.19.0
+    dev: true
+
+  /lines-and-columns@1.2.4:
+    resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+
+  /lint-staged@10.5.4:
+    resolution: {integrity: sha512-EechC3DdFic/TdOPgj/RB3FicqE6932LTHCUm0Y2fsD9KGlLB+RwJl2q1IYBIvEsKzDOgn0D4gll+YxG5RsrKg==}
+    hasBin: true
+    dependencies:
+      chalk: 4.1.2
+      cli-truncate: 2.1.0
+      commander: 6.2.1
+      cosmiconfig: 7.1.0
+      debug: 4.3.4(supports-color@5.5.0)
+      dedent: 0.7.0
+      enquirer: 2.3.6
+      execa: 4.1.0
+      listr2: 3.14.0(enquirer@2.3.6)
+      log-symbols: 4.1.0
+      micromatch: 4.0.5
+      normalize-path: 3.0.0
+      please-upgrade-node: 3.2.0
+      string-argv: 0.3.1
+      stringify-object: 3.3.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /listr2@3.14.0(enquirer@2.3.6):
+    resolution: {integrity: sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==}
+    engines: {node: '>=10.0.0'}
+    peerDependencies:
+      enquirer: '>= 2.3.0 < 3'
+    peerDependenciesMeta:
+      enquirer:
+        optional: true
+    dependencies:
+      cli-truncate: 2.1.0
+      colorette: 2.0.20
+      enquirer: 2.3.6
+      log-update: 4.0.0
+      p-map: 4.0.0
+      rfdc: 1.3.0
+      rxjs: 7.8.1
+      through: 2.3.8
+      wrap-ansi: 7.0.0
+    dev: true
+
+  /loader-runner@4.3.0:
+    resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
+    engines: {node: '>=6.11.5'}
+
+  /loader-utils@2.0.4:
+    resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==}
+    engines: {node: '>=8.9.0'}
+    dependencies:
+      big.js: 5.2.2
+      emojis-list: 3.0.0
+      json5: 2.2.3
+
+  /loader-utils@3.2.1:
+    resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==}
+    engines: {node: '>= 12.13.0'}
+    dev: false
+
+  /local-pkg@0.4.3:
+    resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==}
+    engines: {node: '>=14'}
+    dev: true
+
+  /locate-path@3.0.0:
+    resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
+    engines: {node: '>=6'}
+    dependencies:
+      p-locate: 3.0.0
+      path-exists: 3.0.0
+    dev: false
+
+  /locate-path@5.0.0:
+    resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+    engines: {node: '>=8'}
+    dependencies:
+      p-locate: 4.1.0
+    dev: true
+
+  /locate-path@6.0.0:
+    resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+    engines: {node: '>=10'}
+    dependencies:
+      p-locate: 5.0.0
+
+  /lodash-es@4.17.21:
+    resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+    dev: true
+
+  /lodash.debounce@4.0.8:
+    resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
+    dev: true
+
+  /lodash.get@4.4.2:
+    resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==}
+    dev: true
+
+  /lodash.groupby@4.6.0:
+    resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==}
+    dev: true
+
+  /lodash.isequal@4.5.0:
+    resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==}
+    dev: false
+
+  /lodash.merge@4.6.2:
+    resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+
+  /lodash.throttle@4.1.1:
+    resolution: {integrity: sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==}
+    dev: true
+
+  /lodash.tonumber@4.0.3:
+    resolution: {integrity: sha512-SY0SwuPOHRwKcCNTdsntPYb+Zddz5mDUIVFABzRMqmAiL41pMeyoQFGxYAw5zdc9NnH4pbJqiqqp5ckfxa+zSA==}
+
+  /lodash.truncate@4.4.2:
+    resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==}
+    dev: true
+
+  /lodash.zip@4.2.0:
+    resolution: {integrity: sha512-C7IOaBBK/0gMORRBd8OETNx3kmOkgIWIPvyDpZSCTwUrpYmgZwJkjZeOD8ww4xbOUOs4/attY+pciKvadNfFbg==}
+    dev: true
+
+  /lodash@4.17.21:
+    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+  /log-symbols@4.1.0:
+    resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+    engines: {node: '>=10'}
+    dependencies:
+      chalk: 4.1.2
+      is-unicode-supported: 0.1.0
+    dev: true
+
+  /log-update@4.0.0:
+    resolution: {integrity: sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==}
+    engines: {node: '>=10'}
+    dependencies:
+      ansi-escapes: 4.3.2
+      cli-cursor: 3.1.0
+      slice-ansi: 4.0.0
+      wrap-ansi: 6.2.0
+    dev: true
+
+  /log4js@1.1.1:
+    resolution: {integrity: sha512-lYb14ZSs1M/CUFuvy7Zk3VZLDtqrqOaVql9CE0tv8g6/qE1Gfq97XKdltBsjSxxvcJ+t8fAXOnvFxSsms7gGVg==}
+    engines: {node: '>=0.12'}
+    deprecated: 1.x is no longer supported. Please upgrade to 6.x or higher.
+    dependencies:
+      debug: 2.6.9
+      semver: 5.7.1
+      streamroller: 0.4.1
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /longest-streak@2.0.4:
+    resolution: {integrity: sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==}
+    dev: true
+
+  /loose-envify@1.4.0:
+    resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+    hasBin: true
+    dependencies:
+      js-tokens: 4.0.0
+
+  /lower-case@2.0.2:
+    resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
+    dependencies:
+      tslib: 2.5.2
+    dev: true
+
+  /lru-cache@5.1.1:
+    resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+    dependencies:
+      yallist: 3.1.1
+
+  /lru-cache@6.0.0:
+    resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+    engines: {node: '>=10'}
+    dependencies:
+      yallist: 4.0.0
+
+  /lru-cache@9.1.1:
+    resolution: {integrity: sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==}
+    engines: {node: 14 || >=16.14}
+    dev: true
+
+  /lru-queue@0.1.0:
+    resolution: {integrity: sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==}
+    dependencies:
+      es5-ext: 0.10.62
+    dev: true
+
+  /lz-string@1.5.0:
+    resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
+    hasBin: true
+    dev: true
+
+  /make-dir@2.1.0:
+    resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
+    engines: {node: '>=6'}
+    dependencies:
+      pify: 4.0.1
+      semver: 5.7.1
+    dev: true
+
+  /make-dir@3.1.0:
+    resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
+    engines: {node: '>=8'}
+    dependencies:
+      semver: 6.3.0
+    dev: true
+
+  /make-error@1.3.6:
+    resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
+    dev: true
+
+  /makeerror@1.0.12:
+    resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+    dependencies:
+      tmpl: 1.0.5
+    dev: true
+
+  /map-age-cleaner@0.1.3:
+    resolution: {integrity: sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==}
+    engines: {node: '>=6'}
+    dependencies:
+      p-defer: 1.0.0
+    dev: true
+
+  /map-obj@1.0.1:
+    resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /map-obj@4.3.0:
+    resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /mathml-tag-names@2.1.3:
+    resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
+    dev: true
+
+  /md5.js@1.3.5:
+    resolution: {integrity: sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==}
+    dependencies:
+      hash-base: 3.1.0
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+    dev: true
+
+  /mdast-util-from-markdown@0.8.5:
+    resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==}
+    dependencies:
+      '@types/mdast': 3.0.11
+      mdast-util-to-string: 2.0.0
+      micromark: 2.11.4
+      parse-entities: 2.0.0
+      unist-util-stringify-position: 2.0.3
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /mdast-util-to-markdown@0.6.5:
+    resolution: {integrity: sha512-XeV9sDE7ZlOQvs45C9UKMtfTcctcaj/pGwH8YLbMHoMOXNNCn2LsqVQOqrF1+/NU8lKDAqozme9SCXWyo9oAcQ==}
+    dependencies:
+      '@types/unist': 2.0.6
+      longest-streak: 2.0.4
+      mdast-util-to-string: 2.0.0
+      parse-entities: 2.0.0
+      repeat-string: 1.6.1
+      zwitch: 1.0.5
+    dev: true
+
+  /mdast-util-to-string@2.0.0:
+    resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==}
+    dev: true
+
+  /mdn-data@2.0.14:
+    resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
+    dev: true
+
+  /media-typer@0.3.0:
+    resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
+    engines: {node: '>= 0.6'}
+    dev: true
+
+  /mem@5.1.1:
+    resolution: {integrity: sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==}
+    engines: {node: '>=8'}
+    dependencies:
+      map-age-cleaner: 0.1.3
+      mimic-fn: 2.1.0
+      p-is-promise: 2.1.0
+    dev: true
+
+  /memfs@3.5.1:
+    resolution: {integrity: sha512-UWbFJKvj5k+nETdteFndTpYxdeTMox/ULeqX5k/dpaQJCCFmj5EeKv3dBcyO2xmkRAx2vppRu5dVG7SOtsGOzA==}
+    engines: {node: '>= 4.0.0'}
+    dependencies:
+      fs-monkey: 1.0.3
+
+  /memoize-one@5.2.1:
+    resolution: {integrity: sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==}
+    dev: false
+
+  /memoizee@0.4.15:
+    resolution: {integrity: sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==}
+    dependencies:
+      d: 1.0.1
+      es5-ext: 0.10.62
+      es6-weak-map: 2.0.3
+      event-emitter: 0.3.5
+      is-promise: 2.2.2
+      lru-queue: 0.1.0
+      next-tick: 1.1.0
+      timers-ext: 0.1.7
+    dev: true
+
+  /meow@9.0.0:
+    resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      '@types/minimist': 1.2.2
+      camelcase-keys: 6.2.2
+      decamelize: 1.2.0
+      decamelize-keys: 1.1.1
+      hard-rejection: 2.1.0
+      minimist-options: 4.1.0
+      normalize-package-data: 3.0.3
+      read-pkg-up: 7.0.1
+      redent: 3.0.0
+      trim-newlines: 3.0.1
+      type-fest: 0.18.1
+      yargs-parser: 20.2.9
+    dev: true
+
+  /merge-descriptors@1.0.1:
+    resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==}
+    dev: true
+
+  /merge-stream@2.0.0:
+    resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+
+  /merge2@1.4.1:
+    resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+    engines: {node: '>= 8'}
+
+  /methods@1.1.2:
+    resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
+    engines: {node: '>= 0.6'}
+    dev: true
+
+  /micromark@2.11.4:
+    resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==}
+    dependencies:
+      debug: 4.3.4(supports-color@5.5.0)
+      parse-entities: 2.0.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /micromatch@4.0.5:
+    resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+    engines: {node: '>=8.6'}
+    dependencies:
+      braces: 3.0.2
+      picomatch: 2.3.1
+
+  /miller-rabin@4.0.1:
+    resolution: {integrity: sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==}
+    hasBin: true
+    dependencies:
+      bn.js: 4.12.0
+      brorand: 1.1.0
+    dev: true
+
+  /mime-db@1.52.0:
+    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
+    engines: {node: '>= 0.6'}
+
+  /mime-types@2.1.35:
+    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
+    engines: {node: '>= 0.6'}
+    dependencies:
+      mime-db: 1.52.0
+
+  /mime@1.6.0:
+    resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
+    engines: {node: '>=4'}
+    hasBin: true
+    dev: true
+
+  /mime@2.6.0:
+    resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==}
+    engines: {node: '>=4.0.0'}
+    hasBin: true
+    dev: true
+
+  /mimic-fn@2.1.0:
+    resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /mimic-fn@4.0.0:
+    resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /min-document@2.19.0:
+    resolution: {integrity: sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==}
+    dependencies:
+      dom-walk: 0.1.2
+    dev: true
+
+  /min-indent@1.0.1:
+    resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /minimalistic-assert@1.0.1:
+    resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
+    dev: true
+
+  /minimalistic-crypto-utils@1.0.1:
+    resolution: {integrity: sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==}
+    dev: true
+
+  /minimatch@3.1.2:
+    resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+    dependencies:
+      brace-expansion: 1.1.11
+
+  /minimatch@8.0.4:
+    resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==}
+    engines: {node: '>=16 || 14 >=14.17'}
+    dependencies:
+      brace-expansion: 2.0.1
+    dev: true
+
+  /minimist-options@4.1.0:
+    resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==}
+    engines: {node: '>= 6'}
+    dependencies:
+      arrify: 1.0.1
+      is-plain-obj: 1.1.0
+      kind-of: 6.0.3
+    dev: true
+
+  /minimist@1.2.8:
+    resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+    dev: true
+
+  /minipass@4.2.8:
+    resolution: {integrity: sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /minipass@6.0.2:
+    resolution: {integrity: sha512-MzWSV5nYVT7mVyWCwn2o7JH13w2TBRmmSqSRCKzTw+lmft9X4z+3wjvs06Tzijo5z4W/kahUCDpRXTF+ZrmF/w==}
+    engines: {node: '>=16 || 14 >=14.17'}
+    dev: true
+
+  /mkdirp@0.5.6:
+    resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
+    hasBin: true
+    dependencies:
+      minimist: 1.2.8
+    dev: true
+
+  /mock.js@0.2.0:
+    resolution: {integrity: sha512-DKI8Rh/h7Mma+fg+6aD0uUvwn0QXAjKG6q3s+lTaCboCQ/kvQMBN9IXRBzgEaz4aPiYoRnKU9jVsfZp0mHpWrQ==}
+    dev: true
+
+  /mockjs@1.1.0:
+    resolution: {integrity: sha512-eQsKcWzIaZzEZ07NuEyO4Nw65g0hdWAyurVol1IPl1gahRwY+svqzfgfey8U8dahLwG44d6/RwEzuK52rSa/JQ==}
+    hasBin: true
+    dependencies:
+      commander: 10.0.1
+    dev: true
+
+  /moment@2.29.4:
+    resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==}
+
+  /ms@2.0.0:
+    resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
+
+  /ms@2.1.2:
+    resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
+  /ms@2.1.3:
+    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
+    dev: true
+
+  /multimap@1.1.0:
+    resolution: {integrity: sha512-0ZIR9PasPxGXmRsEF8jsDzndzHDj7tIav+JUmvIFB/WHswliFnquxECT/De7GR4yg99ky/NlRKJT82G1y271bw==}
+    dev: true
+
+  /nanoid@3.3.6:
+    resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==}
+    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+    hasBin: true
+    dev: true
+
+  /natural-compare-lite@1.4.0:
+    resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
+    dev: true
+
+  /natural-compare@1.4.0:
+    resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+
+  /needle@3.2.0:
+    resolution: {integrity: sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==}
+    engines: {node: '>= 4.4.x'}
+    hasBin: true
+    requiresBuild: true
+    dependencies:
+      debug: 3.2.7
+      iconv-lite: 0.6.3
+      sax: 1.2.4
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+    optional: true
+
+  /negotiator@0.6.3:
+    resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
+    engines: {node: '>= 0.6'}
+    dev: true
+
+  /neo-async@2.6.2:
+    resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
+
+  /next-tick@1.1.0:
+    resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==}
+    dev: true
+
+  /no-case@3.0.4:
+    resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
+    dependencies:
+      lower-case: 2.0.2
+      tslib: 2.5.2
+    dev: true
+
+  /node-abort-controller@3.1.1:
+    resolution: {integrity: sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==}
+    dev: true
+
+  /node-domexception@1.0.0:
+    resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
+    engines: {node: '>=10.5.0'}
+    dev: true
+
+  /node-fetch-h2@2.3.0:
+    resolution: {integrity: sha512-ofRW94Ab0T4AOh5Fk8t0h8OBWrmjb0SSB20xh1H8YnPV9EJ+f5AMoYSUQ2zgJ4Iq2HAK0I2l5/Nequ8YzFS3Hg==}
+    engines: {node: 4.x || >=6.0.0}
+    dependencies:
+      http2-client: 1.3.5
+    dev: true
+
+  /node-fetch@1.7.3:
+    resolution: {integrity: sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==}
+    dependencies:
+      encoding: 0.1.13
+      is-stream: 1.1.0
+    dev: true
+
+  /node-fetch@2.6.0:
+    resolution: {integrity: sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==}
+    engines: {node: 4.x || >=6.0.0}
+    dev: true
+
+  /node-fetch@2.6.11:
+    resolution: {integrity: sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==}
+    engines: {node: 4.x || >=6.0.0}
+    peerDependencies:
+      encoding: ^0.1.0
+    peerDependenciesMeta:
+      encoding:
+        optional: true
+    dependencies:
+      whatwg-url: 5.0.0
+    dev: true
+
+  /node-fetch@3.3.1:
+    resolution: {integrity: sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    dependencies:
+      data-uri-to-buffer: 4.0.1
+      fetch-blob: 3.2.0
+      formdata-polyfill: 4.0.10
+    dev: true
+
+  /node-import-ts@1.0.6:
+    resolution: {integrity: sha512-zm2zxUn5KI+jjDyx80MbrIrLRUwQ3oQYGotgZ+Z6xTSaXoUgIIO7h5mks5c9v4tBBpc+VlIyyq5WkGcdCn7qfA==}
+    dependencies:
+      '@types/node': 12.20.55
+      import-fresh: 3.3.0
+      typescript: 3.9.10
+    dev: true
+
+  /node-int64@0.4.0:
+    resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+    dev: true
+
+  /node-libs-browser@2.2.1:
+    resolution: {integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==}
+    dependencies:
+      assert: 1.5.0
+      browserify-zlib: 0.2.0
+      buffer: 4.9.2
+      console-browserify: 1.2.0
+      constants-browserify: 1.0.0
+      crypto-browserify: 3.12.0
+      domain-browser: 1.2.0
+      events: 3.3.0
+      https-browserify: 1.0.0
+      os-browserify: 0.3.0
+      path-browserify: 0.0.1
+      process: 0.11.10
+      punycode: 1.4.1
+      querystring-es3: 0.2.1
+      readable-stream: 2.3.8
+      stream-browserify: 2.0.2
+      stream-http: 2.8.3
+      string_decoder: 1.3.0
+      timers-browserify: 2.0.12
+      tty-browserify: 0.0.0
+      url: 0.11.0
+      util: 0.11.1
+      vm-browserify: 1.1.2
+    dev: true
+
+  /node-readfiles@0.2.0:
+    resolution: {integrity: sha512-SU00ZarexNlE4Rjdm83vglt5Y9yiQ+XI1XpflWlb7q7UTN1JUItm69xMeiQCTxtTfnzt+83T8Cx+vI2ED++VDA==}
+    dependencies:
+      es6-promise: 3.3.1
+    dev: true
+
+  /node-releases@2.0.12:
+    resolution: {integrity: sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==}
+
+  /normalize-package-data@2.5.0:
+    resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
+    dependencies:
+      hosted-git-info: 2.8.9
+      resolve: 1.22.2
+      semver: 5.7.1
+      validate-npm-package-license: 3.0.4
+    dev: true
+
+  /normalize-package-data@3.0.3:
+    resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==}
+    engines: {node: '>=10'}
+    dependencies:
+      hosted-git-info: 4.1.0
+      is-core-module: 2.12.1
+      semver: 7.5.1
+      validate-npm-package-license: 3.0.4
+    dev: true
+
+  /normalize-path@3.0.0:
+    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+    engines: {node: '>=0.10.0'}
+
+  /normalize-range@0.1.2:
+    resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /normalize-selector@0.2.0:
+    resolution: {integrity: sha512-dxvWdI8gw6eAvk9BlPffgEoGfM7AdijoCwOEJge3e3ulT2XLgmU7KvvxprOaCu05Q1uGRHmOhHe1r6emZoKyFw==}
+    dev: true
+
+  /normalize.css@7.0.0:
+    resolution: {integrity: sha512-LYaFZxj2Q1Q9e1VJ0f6laG46Rt5s9URhKyckNaA2vZnL/0gwQHWhM7ALQkp3WBQKM5sXRLQ5Ehrfkp+E/ZiCRg==}
+    dev: true
+
+  /npm-run-path@4.0.1:
+    resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+    engines: {node: '>=8'}
+    dependencies:
+      path-key: 3.1.1
+    dev: true
+
+  /npm-run-path@5.1.0:
+    resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    dependencies:
+      path-key: 4.0.0
+    dev: true
+
+  /nth-check@2.1.1:
+    resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
+    dependencies:
+      boolbase: 1.0.0
+    dev: true
+
+  /num2fraction@1.2.2:
+    resolution: {integrity: sha512-Y1wZESM7VUThYY+4W+X4ySH2maqcA+p7UR+w8VWNWVAd6lwuXXWz/w/Cz43J/dI2I+PS6wD5N+bJUF+gjWvIqg==}
+    dev: true
+
+  /nunjucks@3.2.4:
+    resolution: {integrity: sha512-26XRV6BhkgK0VOxfbU5cQI+ICFUtMLixv1noZn1tGU38kQH5A5nmmbk/O45xdyBhD1esk47nKrY0mvQpZIhRjQ==}
+    engines: {node: '>= 6.9.0'}
+    hasBin: true
+    peerDependencies:
+      chokidar: ^3.3.0
+    peerDependenciesMeta:
+      chokidar:
+        optional: true
+    dependencies:
+      a-sync-waterfall: 1.0.1
+      asap: 2.0.6
+      commander: 5.1.0
+    dev: true
+
+  /nwsapi@2.2.4:
+    resolution: {integrity: sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==}
+    dev: true
+
+  /oas-kit-common@1.0.8:
+    resolution: {integrity: sha512-pJTS2+T0oGIwgjGpw7sIRU8RQMcUoKCDWFLdBqKB2BNmGpbBMH2sdqAaOXUg8OzonZHU0L7vfJu1mJFEiYDWOQ==}
+    dependencies:
+      fast-safe-stringify: 2.1.1
+    dev: true
+
+  /oas-linter@3.2.2:
+    resolution: {integrity: sha512-KEGjPDVoU5K6swgo9hJVA/qYGlwfbFx+Kg2QB/kd7rzV5N8N5Mg6PlsoCMohVnQmo+pzJap/F610qTodKzecGQ==}
+    dependencies:
+      '@exodus/schemasafe': 1.0.1
+      should: 13.2.3
+      yaml: 1.10.2
+    dev: true
+
+  /oas-resolver@2.5.6:
+    resolution: {integrity: sha512-Yx5PWQNZomfEhPPOphFbZKi9W93CocQj18NlD2Pa4GWZzdZpSJvYwoiuurRI7m3SpcChrnO08hkuQDL3FGsVFQ==}
+    hasBin: true
+    dependencies:
+      node-fetch-h2: 2.3.0
+      oas-kit-common: 1.0.8
+      reftools: 1.1.9
+      yaml: 1.10.2
+      yargs: 17.7.2
+    dev: true
+
+  /oas-schema-walker@1.1.5:
+    resolution: {integrity: sha512-2yucenq1a9YPmeNExoUa9Qwrt9RFkjqaMAA1X+U7sbb0AqBeTIdMHky9SQQ6iN94bO5NW0W4TRYXerG+BdAvAQ==}
+    dev: true
+
+  /oas-validator@5.0.8:
+    resolution: {integrity: sha512-cu20/HE5N5HKqVygs3dt94eYJfBi0TsZvPVXDhbXQHiEityDN+RROTleefoKRKKJ9dFAF2JBkDHgvWj0sjKGmw==}
+    dependencies:
+      call-me-maybe: 1.0.2
+      oas-kit-common: 1.0.8
+      oas-linter: 3.2.2
+      oas-resolver: 2.5.6
+      oas-schema-walker: 1.1.5
+      reftools: 1.1.9
+      should: 13.2.3
+      yaml: 1.10.2
+    dev: true
+
+  /oauth-sign@0.9.0:
+    resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==}
+    dev: true
+
+  /object-assign@4.1.1:
+    resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+    engines: {node: '>=0.10.0'}
+
+  /object-inspect@1.12.3:
+    resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==}
+    dev: true
+
+  /object-is@1.1.5:
+    resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+    dev: true
+
+  /object-keys@1.1.1:
+    resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+    engines: {node: '>= 0.4'}
+    dev: true
+
+  /object.assign@4.1.4:
+    resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      has-symbols: 1.0.3
+      object-keys: 1.1.1
+    dev: true
+
+  /object.entries@1.1.6:
+    resolution: {integrity: sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.21.2
+    dev: true
+
+  /object.fromentries@2.0.6:
+    resolution: {integrity: sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.21.2
+    dev: true
+
+  /object.getprototypeof@1.0.4:
+    resolution: {integrity: sha512-xV/FkUNM9sHa56AB5deXrlIR+jBtDAHieyfm6XZUuehqlMX+YJPh8CAYtPrXGA/mFLFttasTc9ihhpkPrH7pLw==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.21.2
+      reflect.getprototypeof: 1.0.3
+    dev: true
+
+  /object.hasown@1.1.2:
+    resolution: {integrity: sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==}
+    dependencies:
+      define-properties: 1.2.0
+      es-abstract: 1.21.2
+    dev: true
+
+  /object.values@1.1.6:
+    resolution: {integrity: sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.21.2
+    dev: true
+
+  /obuf@1.1.2:
+    resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
+    dev: true
+
+  /omit.js@2.0.2:
+    resolution: {integrity: sha512-hJmu9D+bNB40YpL9jYebQl4lsTW6yEHRTroJzNLqQJYHm7c+NQnJGfZmIWh8S3q3KoaxV1aLhV6B3+0N0/kyJg==}
+
+  /on-exit-leak-free@0.2.0:
+    resolution: {integrity: sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==}
+    dev: true
+
+  /on-finished@2.4.1:
+    resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
+    engines: {node: '>= 0.8'}
+    dependencies:
+      ee-first: 1.1.1
+    dev: true
+
+  /once@1.4.0:
+    resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+    dependencies:
+      wrappy: 1.0.2
+
+  /onetime@5.1.2:
+    resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+    engines: {node: '>=6'}
+    dependencies:
+      mimic-fn: 2.1.0
+    dev: true
+
+  /onetime@6.0.0:
+    resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+    engines: {node: '>=12'}
+    dependencies:
+      mimic-fn: 4.0.0
+    dev: true
+
+  /open@8.4.2:
+    resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
+    engines: {node: '>=12'}
+    dependencies:
+      define-lazy-prop: 2.0.0
+      is-docker: 2.2.1
+      is-wsl: 2.2.0
+
+  /open@9.1.0:
+    resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==}
+    engines: {node: '>=14.16'}
+    dependencies:
+      default-browser: 4.0.0
+      define-lazy-prop: 3.0.0
+      is-inside-container: 1.0.0
+      is-wsl: 2.2.0
+    dev: true
+
+  /openapi3-ts@2.0.2:
+    resolution: {integrity: sha512-TxhYBMoqx9frXyOgnRHufjQfPXomTIHYKhSKJ6jHfj13kS8OEIhvmE8CTuQyKtjjWttAjX5DPxM1vmalEpo8Qw==}
+    dependencies:
+      yaml: 1.10.2
+    dev: true
+
+  /optionator@0.8.3:
+    resolution: {integrity: sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==}
+    engines: {node: '>= 0.8.0'}
+    dependencies:
+      deep-is: 0.1.4
+      fast-levenshtein: 2.0.6
+      levn: 0.3.0
+      prelude-ls: 1.1.2
+      type-check: 0.3.2
+      word-wrap: 1.2.3
+    dev: true
+
+  /optionator@0.9.1:
+    resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
+    engines: {node: '>= 0.8.0'}
+    dependencies:
+      deep-is: 0.1.4
+      fast-levenshtein: 2.0.6
+      levn: 0.4.1
+      prelude-ls: 1.2.1
+      type-check: 0.4.0
+      word-wrap: 1.2.3
+
+  /ora@5.4.1:
+    resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      bl: 4.1.0
+      chalk: 4.1.2
+      cli-cursor: 3.1.0
+      cli-spinners: 2.9.0
+      is-interactive: 1.0.0
+      is-unicode-supported: 0.1.0
+      log-symbols: 4.1.0
+      strip-ansi: 6.0.1
+      wcwidth: 1.0.1
+    dev: true
+
+  /os-browserify@0.3.0:
+    resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==}
+    dev: true
+
+  /os-locale@5.0.0:
+    resolution: {integrity: sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==}
+    engines: {node: '>=10'}
+    dependencies:
+      execa: 4.1.0
+      lcid: 3.1.1
+      mem: 5.1.1
+    dev: true
+
+  /p-defer@1.0.0:
+    resolution: {integrity: sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /p-is-promise@2.1.0:
+    resolution: {integrity: sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /p-limit@2.3.0:
+    resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+    engines: {node: '>=6'}
+    dependencies:
+      p-try: 2.2.0
+
+  /p-limit@3.1.0:
+    resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      yocto-queue: 0.1.0
+
+  /p-locate@3.0.0:
+    resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
+    engines: {node: '>=6'}
+    dependencies:
+      p-limit: 2.3.0
+    dev: false
+
+  /p-locate@4.1.0:
+    resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+    engines: {node: '>=8'}
+    dependencies:
+      p-limit: 2.3.0
+    dev: true
+
+  /p-locate@5.0.0:
+    resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+    engines: {node: '>=10'}
+    dependencies:
+      p-limit: 3.1.0
+
+  /p-map@4.0.0:
+    resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      aggregate-error: 3.1.0
+    dev: true
+
+  /p-try@2.2.0:
+    resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+    engines: {node: '>=6'}
+
+  /pako@0.2.9:
+    resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==}
+    dev: true
+
+  /pako@1.0.11:
+    resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==}
+    dev: true
+
+  /param-case@3.0.4:
+    resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
+    dependencies:
+      dot-case: 3.0.4
+      tslib: 2.5.2
+    dev: true
+
+  /parent-module@1.0.1:
+    resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+    engines: {node: '>=6'}
+    dependencies:
+      callsites: 3.1.0
+
+  /parse-asn1@5.1.6:
+    resolution: {integrity: sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==}
+    dependencies:
+      asn1.js: 5.4.1
+      browserify-aes: 1.2.0
+      evp_bytestokey: 1.0.3
+      pbkdf2: 3.1.2
+      safe-buffer: 5.2.1
+    dev: true
+
+  /parse-entities@2.0.0:
+    resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==}
+    dependencies:
+      character-entities: 1.2.4
+      character-entities-legacy: 1.1.4
+      character-reference-invalid: 1.1.4
+      is-alphanumerical: 1.0.4
+      is-decimal: 1.0.4
+      is-hexadecimal: 1.0.4
+    dev: true
+
+  /parse-json@5.2.0:
+    resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+    engines: {node: '>=8'}
+    dependencies:
+      '@babel/code-frame': 7.21.4
+      error-ex: 1.3.2
+      json-parse-even-better-errors: 2.3.1
+      lines-and-columns: 1.2.4
+
+  /parse-node-version@1.0.1:
+    resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==}
+    engines: {node: '>= 0.10'}
+    dev: true
+
+  /parse5@7.1.2:
+    resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==}
+    dependencies:
+      entities: 4.5.0
+    dev: true
+
+  /parseurl@1.3.3:
+    resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
+    engines: {node: '>= 0.8'}
+    dev: true
+
+  /pascal-case@3.1.2:
+    resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
+    dependencies:
+      no-case: 3.0.4
+      tslib: 2.5.2
+    dev: true
+
+  /path-browserify@0.0.1:
+    resolution: {integrity: sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==}
+    dev: true
+
+  /path-exists@3.0.0:
+    resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==}
+    engines: {node: '>=4'}
+    dev: false
+
+  /path-exists@4.0.0:
+    resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+    engines: {node: '>=8'}
+
+  /path-is-absolute@1.0.1:
+    resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+    engines: {node: '>=0.10.0'}
+
+  /path-key@3.1.1:
+    resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+    engines: {node: '>=8'}
+
+  /path-key@4.0.0:
+    resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /path-parse@1.0.7:
+    resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+
+  /path-scurry@1.9.2:
+    resolution: {integrity: sha512-qSDLy2aGFPm8i4rsbHd4MNyTcrzHFsLQykrtbuGRknZZCBBVXSv2tSCDN2Cg6Rt/GFRw8GoW9y9Ecw5rIPG1sg==}
+    engines: {node: '>=16 || 14 >=14.17'}
+    dependencies:
+      lru-cache: 9.1.1
+      minipass: 6.0.2
+    dev: true
+
+  /path-to-regexp@0.1.7:
+    resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
+    dev: true
+
+  /path-to-regexp@1.7.0:
+    resolution: {integrity: sha512-nifX1uj4S9IrK/w3Xe7kKvNEepXivANs9ng60Iq7PU/BlouV3yL/VUhFqTuTq33ykwUqoNcTeGo5vdOBP4jS/Q==}
+    dependencies:
+      isarray: 0.0.1
+    dev: true
+
+  /path-to-regexp@1.8.0:
+    resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==}
+    dependencies:
+      isarray: 0.0.1
+    dev: true
+
+  /path-to-regexp@2.4.0:
+    resolution: {integrity: sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==}
+
+  /path-type@4.0.0:
+    resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+    engines: {node: '>=8'}
+
+  /pbkdf2@3.1.2:
+    resolution: {integrity: sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==}
+    engines: {node: '>=0.12'}
+    dependencies:
+      create-hash: 1.2.0
+      create-hmac: 1.1.7
+      ripemd160: 2.0.2
+      safe-buffer: 5.2.1
+      sha.js: 2.4.11
+    dev: true
+
+  /pend@1.2.0:
+    resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
+    dev: true
+
+  /performance-now@2.1.0:
+    resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==}
+    dev: true
+
+  /picocolors@0.2.1:
+    resolution: {integrity: sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==}
+    dev: true
+
+  /picocolors@1.0.0:
+    resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
+
+  /picomatch@2.3.1:
+    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
+    engines: {node: '>=8.6'}
+
+  /pify@2.3.0:
+    resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /pify@4.0.1:
+    resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /pinkie-promise@2.0.1:
+    resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      pinkie: 2.0.4
+    dev: true
+
+  /pinkie@2.0.4:
+    resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /pino-abstract-transport@0.5.0:
+    resolution: {integrity: sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==}
+    dependencies:
+      duplexify: 4.1.2
+      split2: 4.2.0
+    dev: true
+
+  /pino-std-serializers@4.0.0:
+    resolution: {integrity: sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==}
+    dev: true
+
+  /pino@7.11.0:
+    resolution: {integrity: sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==}
+    hasBin: true
+    dependencies:
+      atomic-sleep: 1.0.0
+      fast-redact: 3.2.0
+      on-exit-leak-free: 0.2.0
+      pino-abstract-transport: 0.5.0
+      pino-std-serializers: 4.0.0
+      process-warning: 1.0.0
+      quick-format-unescaped: 4.0.4
+      real-require: 0.1.0
+      safe-stable-stringify: 2.4.3
+      sonic-boom: 2.8.0
+      thread-stream: 0.15.2
+    dev: true
+
+  /pirates@4.0.5:
+    resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==}
+    engines: {node: '>= 6'}
+    dev: true
+
+  /pkg-dir@4.2.0:
+    resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
+    engines: {node: '>=8'}
+    dependencies:
+      find-up: 4.1.0
+    dev: true
+
+  /pkg-up@3.1.0:
+    resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==}
+    engines: {node: '>=8'}
+    dependencies:
+      find-up: 3.0.0
+    dev: false
+
+  /please-upgrade-node@3.2.0:
+    resolution: {integrity: sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==}
+    dependencies:
+      semver-compare: 1.0.0
+    dev: true
+
+  /plur@4.0.0:
+    resolution: {integrity: sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==}
+    engines: {node: '>=10'}
+    dependencies:
+      irregular-plurals: 3.5.0
+    dev: true
+
+  /pluralize@8.0.0:
+    resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /pngjs-image@0.11.7:
+    resolution: {integrity: sha512-JRyrmT+HXa1/gvdHpebus8TGqKa8WRgcsHz/DDalxRsMhvu6AOA99/enBFjZIPvmXVAzwKR051s80TuE1IiCpg==}
+    dependencies:
+      iconv-lite: 0.4.24
+      pako: 0.2.9
+      pngjs: 2.3.1
+      request: 2.88.2
+      stream-buffers: 1.0.1
+      underscore: 1.7.0
+    dev: true
+
+  /pngjs@2.3.1:
+    resolution: {integrity: sha512-ITNPqvx+SSssNFOgHQzGG87HrqQ0g2nMSHc1jjU5Piq9xJEJ40fiFEPz0S5HSSXxBHrTnhaBHIayTO5aRfk2vw==}
+    engines: {iojs: '>= 1.0.0', node: '>=0.10.0'}
+    dev: true
+
+  /point-in-polygon@1.1.0:
+    resolution: {integrity: sha512-3ojrFwjnnw8Q9242TzgXuTD+eKiutbzyslcq1ydfu82Db2y+Ogbmyrkpv0Hgj31qwT3lbS9+QAAO/pIQM35XRw==}
+    dev: true
+
+  /postcss-attribute-case-insensitive@5.0.2(postcss@8.4.24):
+    resolution: {integrity: sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      postcss: 8.4.24
+      postcss-selector-parser: 6.0.13
+    dev: true
+
+  /postcss-clamp@4.1.0(postcss@8.4.24):
+    resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==}
+    engines: {node: '>=7.6.0'}
+    peerDependencies:
+      postcss: ^8.4.6
+    dependencies:
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /postcss-color-functional-notation@4.2.4(postcss@8.4.24):
+    resolution: {integrity: sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /postcss-color-hex-alpha@8.0.4(postcss@8.4.24):
+    resolution: {integrity: sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.4
+    dependencies:
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /postcss-color-rebeccapurple@7.1.1(postcss@8.4.24):
+    resolution: {integrity: sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /postcss-custom-media@8.0.2(postcss@8.4.24):
+    resolution: {integrity: sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.3
+    dependencies:
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /postcss-custom-properties@12.1.11(postcss@8.4.24):
+    resolution: {integrity: sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /postcss-custom-selectors@6.0.3(postcss@8.4.24):
+    resolution: {integrity: sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.3
+    dependencies:
+      postcss: 8.4.24
+      postcss-selector-parser: 6.0.13
+    dev: true
+
+  /postcss-dir-pseudo-class@6.0.5(postcss@8.4.24):
+    resolution: {integrity: sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      postcss: 8.4.24
+      postcss-selector-parser: 6.0.13
+    dev: true
+
+  /postcss-double-position-gradients@3.1.2(postcss@8.4.24):
+    resolution: {integrity: sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.24)
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /postcss-env-function@4.0.6(postcss@8.4.24):
+    resolution: {integrity: sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.4
+    dependencies:
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /postcss-flexbugs-fixes@5.0.2(postcss@8.4.24):
+    resolution: {integrity: sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==}
+    peerDependencies:
+      postcss: ^8.1.4
+    dependencies:
+      postcss: 8.4.24
+    dev: true
+
+  /postcss-focus-visible@6.0.4(postcss@8.4.24):
+    resolution: {integrity: sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.4
+    dependencies:
+      postcss: 8.4.24
+      postcss-selector-parser: 6.0.13
+    dev: true
+
+  /postcss-focus-within@5.0.4(postcss@8.4.24):
+    resolution: {integrity: sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.4
+    dependencies:
+      postcss: 8.4.24
+      postcss-selector-parser: 6.0.13
+    dev: true
+
+  /postcss-font-variant@5.0.0(postcss@8.4.24):
+    resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==}
+    peerDependencies:
+      postcss: ^8.1.0
+    dependencies:
+      postcss: 8.4.24
+    dev: true
+
+  /postcss-gap-properties@3.0.5(postcss@8.4.24):
+    resolution: {integrity: sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      postcss: 8.4.24
+    dev: true
+
+  /postcss-html@0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39):
+    resolution: {integrity: sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==}
+    peerDependencies:
+      postcss: '>=5.0.0'
+      postcss-syntax: '>=0.36.0'
+    dependencies:
+      htmlparser2: 3.10.1
+      postcss: 7.0.39
+      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39)
+    dev: true
+
+  /postcss-image-set-function@4.0.7(postcss@8.4.24):
+    resolution: {integrity: sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /postcss-initial@4.0.1(postcss@8.4.24):
+    resolution: {integrity: sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==}
+    peerDependencies:
+      postcss: ^8.0.0
+    dependencies:
+      postcss: 8.4.24
+    dev: true
+
+  /postcss-lab-function@4.2.1(postcss@8.4.24):
+    resolution: {integrity: sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.24)
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /postcss-less@3.1.4:
+    resolution: {integrity: sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==}
+    engines: {node: '>=6.14.4'}
+    dependencies:
+      postcss: 7.0.39
+    dev: true
+
+  /postcss-less@4.0.1:
+    resolution: {integrity: sha512-C92S4sHlbDpefJ2QQJjrucCcypq3+KZPstjfuvgOCNnGx0tF9h8hXgAlOIATGAxMXZXaF+nVp+/Mi8pCAWdSmw==}
+    engines: {node: '>=10'}
+    dependencies:
+      postcss: 8.4.24
+    dev: true
+
+  /postcss-logical@5.0.4(postcss@8.4.24):
+    resolution: {integrity: sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.4
+    dependencies:
+      postcss: 8.4.24
+    dev: true
+
+  /postcss-media-minmax@5.0.0(postcss@8.4.24):
+    resolution: {integrity: sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==}
+    engines: {node: '>=10.0.0'}
+    peerDependencies:
+      postcss: ^8.1.0
+    dependencies:
+      postcss: 8.4.24
+    dev: true
+
+  /postcss-media-query-parser@0.2.3:
+    resolution: {integrity: sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==}
+    dev: true
+
+  /postcss-modules-extract-imports@3.0.0(postcss@8.4.24):
+    resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==}
+    engines: {node: ^10 || ^12 || >= 14}
+    peerDependencies:
+      postcss: ^8.1.0
+    dependencies:
+      postcss: 8.4.24
+    dev: true
+
+  /postcss-modules-local-by-default@4.0.3(postcss@8.4.24):
+    resolution: {integrity: sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==}
+    engines: {node: ^10 || ^12 || >= 14}
+    peerDependencies:
+      postcss: ^8.1.0
+    dependencies:
+      icss-utils: 5.1.0(postcss@8.4.24)
+      postcss: 8.4.24
+      postcss-selector-parser: 6.0.13
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /postcss-modules-scope@3.0.0(postcss@8.4.24):
+    resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==}
+    engines: {node: ^10 || ^12 || >= 14}
+    peerDependencies:
+      postcss: ^8.1.0
+    dependencies:
+      postcss: 8.4.24
+      postcss-selector-parser: 6.0.13
+    dev: true
+
+  /postcss-modules-values@4.0.0(postcss@8.4.24):
+    resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==}
+    engines: {node: ^10 || ^12 || >= 14}
+    peerDependencies:
+      postcss: ^8.1.0
+    dependencies:
+      icss-utils: 5.1.0(postcss@8.4.24)
+      postcss: 8.4.24
+    dev: true
+
+  /postcss-nesting@10.2.0(postcss@8.4.24):
+    resolution: {integrity: sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.13)
+      postcss: 8.4.24
+      postcss-selector-parser: 6.0.13
+    dev: true
+
+  /postcss-opacity-percentage@1.1.3(postcss@8.4.24):
+    resolution: {integrity: sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      postcss: 8.4.24
+    dev: true
+
+  /postcss-overflow-shorthand@3.0.4(postcss@8.4.24):
+    resolution: {integrity: sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /postcss-page-break@3.0.4(postcss@8.4.24):
+    resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==}
+    peerDependencies:
+      postcss: ^8
+    dependencies:
+      postcss: 8.4.24
+    dev: true
+
+  /postcss-place@7.0.5(postcss@8.4.24):
+    resolution: {integrity: sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      postcss: 8.4.24
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /postcss-prefix-selector@1.16.0(postcss@8.4.24):
+    resolution: {integrity: sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==}
+    peerDependencies:
+      postcss: '>4 <9'
+    dependencies:
+      postcss: 8.4.24
+    dev: true
+
+  /postcss-preset-env@7.5.0(postcss@8.4.24):
+    resolution: {integrity: sha512-0BJzWEfCdTtK2R3EiKKSdkE51/DI/BwnhlnicSW482Ym6/DGHud8K0wGLcdjip1epVX0HKo4c8zzTeV/SkiejQ==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.4
+    dependencies:
+      '@csstools/postcss-color-function': 1.1.1(postcss@8.4.24)
+      '@csstools/postcss-font-format-keywords': 1.0.1(postcss@8.4.24)
+      '@csstools/postcss-hwb-function': 1.0.2(postcss@8.4.24)
+      '@csstools/postcss-ic-unit': 1.0.1(postcss@8.4.24)
+      '@csstools/postcss-is-pseudo-class': 2.0.7(postcss@8.4.24)
+      '@csstools/postcss-normalize-display-values': 1.0.1(postcss@8.4.24)
+      '@csstools/postcss-oklab-function': 1.1.1(postcss@8.4.24)
+      '@csstools/postcss-progressive-custom-properties': 1.3.0(postcss@8.4.24)
+      '@csstools/postcss-stepped-value-functions': 1.0.1(postcss@8.4.24)
+      '@csstools/postcss-unset-value': 1.0.2(postcss@8.4.24)
+      autoprefixer: 10.4.14(postcss@8.4.24)
+      browserslist: 4.21.6
+      css-blank-pseudo: 3.0.3(postcss@8.4.24)
+      css-has-pseudo: 3.0.4(postcss@8.4.24)
+      css-prefers-color-scheme: 6.0.3(postcss@8.4.24)
+      cssdb: 6.6.3
+      postcss: 8.4.24
+      postcss-attribute-case-insensitive: 5.0.2(postcss@8.4.24)
+      postcss-clamp: 4.1.0(postcss@8.4.24)
+      postcss-color-functional-notation: 4.2.4(postcss@8.4.24)
+      postcss-color-hex-alpha: 8.0.4(postcss@8.4.24)
+      postcss-color-rebeccapurple: 7.1.1(postcss@8.4.24)
+      postcss-custom-media: 8.0.2(postcss@8.4.24)
+      postcss-custom-properties: 12.1.11(postcss@8.4.24)
+      postcss-custom-selectors: 6.0.3(postcss@8.4.24)
+      postcss-dir-pseudo-class: 6.0.5(postcss@8.4.24)
+      postcss-double-position-gradients: 3.1.2(postcss@8.4.24)
+      postcss-env-function: 4.0.6(postcss@8.4.24)
+      postcss-focus-visible: 6.0.4(postcss@8.4.24)
+      postcss-focus-within: 5.0.4(postcss@8.4.24)
+      postcss-font-variant: 5.0.0(postcss@8.4.24)
+      postcss-gap-properties: 3.0.5(postcss@8.4.24)
+      postcss-image-set-function: 4.0.7(postcss@8.4.24)
+      postcss-initial: 4.0.1(postcss@8.4.24)
+      postcss-lab-function: 4.2.1(postcss@8.4.24)
+      postcss-logical: 5.0.4(postcss@8.4.24)
+      postcss-media-minmax: 5.0.0(postcss@8.4.24)
+      postcss-nesting: 10.2.0(postcss@8.4.24)
+      postcss-opacity-percentage: 1.1.3(postcss@8.4.24)
+      postcss-overflow-shorthand: 3.0.4(postcss@8.4.24)
+      postcss-page-break: 3.0.4(postcss@8.4.24)
+      postcss-place: 7.0.5(postcss@8.4.24)
+      postcss-pseudo-class-any-link: 7.1.6(postcss@8.4.24)
+      postcss-replace-overflow-wrap: 4.0.0(postcss@8.4.24)
+      postcss-selector-not: 5.0.0(postcss@8.4.24)
+      postcss-value-parser: 4.2.0
+    dev: true
+
+  /postcss-pseudo-class-any-link@7.1.6(postcss@8.4.24):
+    resolution: {integrity: sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==}
+    engines: {node: ^12 || ^14 || >=16}
+    peerDependencies:
+      postcss: ^8.2
+    dependencies:
+      postcss: 8.4.24
+      postcss-selector-parser: 6.0.13
+    dev: true
+
+  /postcss-replace-overflow-wrap@4.0.0(postcss@8.4.24):
+    resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==}
+    peerDependencies:
+      postcss: ^8.0.3
+    dependencies:
+      postcss: 8.4.24
+    dev: true
+
+  /postcss-resolve-nested-selector@0.1.1:
+    resolution: {integrity: sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==}
+    dev: true
+
+  /postcss-safe-parser@4.0.2:
+    resolution: {integrity: sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==}
+    engines: {node: '>=6.0.0'}
+    dependencies:
+      postcss: 7.0.39
+    dev: true
+
+  /postcss-safe-parser@6.0.0(postcss@8.4.24):
+    resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==}
+    engines: {node: '>=12.0'}
+    peerDependencies:
+      postcss: ^8.3.3
+    dependencies:
+      postcss: 8.4.24
+    dev: true
+
+  /postcss-sass@0.4.4:
+    resolution: {integrity: sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==}
+    dependencies:
+      gonzales-pe: 4.3.0
+      postcss: 7.0.39
+    dev: true
+
+  /postcss-scss@2.1.1:
+    resolution: {integrity: sha512-jQmGnj0hSGLd9RscFw9LyuSVAa5Bl1/KBPqG1NQw9w8ND55nY4ZEsdlVuYJvLPpV+y0nwTV5v/4rHPzZRihQbA==}
+    engines: {node: '>=6.0.0'}
+    dependencies:
+      postcss: 7.0.39
+    dev: true
+
+  /postcss-selector-not@5.0.0(postcss@8.4.24):
+    resolution: {integrity: sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==}
+    peerDependencies:
+      postcss: ^8.1.0
+    dependencies:
+      balanced-match: 1.0.2
+      postcss: 8.4.24
+    dev: true
+
+  /postcss-selector-parser@6.0.13:
+    resolution: {integrity: sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==}
+    engines: {node: '>=4'}
+    dependencies:
+      cssesc: 3.0.0
+      util-deprecate: 1.0.2
+    dev: true
+
+  /postcss-sorting@6.0.0(postcss@8.4.24):
+    resolution: {integrity: sha512-bYJ0vgAiGbjCBKi7B07CzsBc9eM84nLEbavUmwNp8rAa+PNyrgdH+6PpnqTtciLuUs99c4rFQQmCaYgeBQYmSQ==}
+    peerDependencies:
+      postcss: ^8.0.4
+    dependencies:
+      lodash: 4.17.21
+      postcss: 8.4.24
+    dev: true
+
+  /postcss-syntax@0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39):
+    resolution: {integrity: sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==}
+    peerDependencies:
+      postcss: '>=5.0.0'
+      postcss-html: '*'
+      postcss-jsx: '*'
+      postcss-less: '*'
+      postcss-markdown: '*'
+      postcss-scss: '*'
+    peerDependenciesMeta:
+      postcss-html:
+        optional: true
+      postcss-jsx:
+        optional: true
+      postcss-less:
+        optional: true
+      postcss-markdown:
+        optional: true
+      postcss-scss:
+        optional: true
+    dependencies:
+      postcss: 7.0.39
+      postcss-html: 0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39)
+      postcss-less: 3.1.4
+      postcss-scss: 2.1.1
+    dev: true
+
+  /postcss-value-parser@4.2.0:
+    resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
+    dev: true
+
+  /postcss@7.0.39:
+    resolution: {integrity: sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==}
+    engines: {node: '>=6.0.0'}
+    dependencies:
+      picocolors: 0.2.1
+      source-map: 0.6.1
+    dev: true
+
+  /postcss@8.4.24:
+    resolution: {integrity: sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==}
+    engines: {node: ^10 || ^12 || >=14}
+    dependencies:
+      nanoid: 3.3.6
+      picocolors: 1.0.0
+      source-map-js: 1.0.2
+    dev: true
+
+  /preceptor-core@0.10.1:
+    resolution: {integrity: sha512-WLDk+UowEESixvlhiamGOj/iqWrp8IWeCCHvBZrLh0g4/A1Fa77fDQWqQUd5S5rScT+9u49aDfa45xYRkxqmiA==}
+    dependencies:
+      log4js: 1.1.1
+      underscore: 1.7.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /prelude-ls@1.1.2:
+    resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==}
+    engines: {node: '>= 0.8.0'}
+    dev: true
+
+  /prelude-ls@1.2.1:
+    resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+    engines: {node: '>= 0.8.0'}
+
+  /prettier-plugin-organize-imports@3.2.2(prettier@2.8.8)(typescript@5.0.2):
+    resolution: {integrity: sha512-e97lE6odGSiHonHJMTYC0q0iLXQyw0u5z/PJpvP/3vRy6/Zi9kLBwFAbEGjDzIowpjQv8b+J04PDamoUSQbzGA==}
+    peerDependencies:
+      '@volar/vue-language-plugin-pug': ^1.0.4
+      '@volar/vue-typescript': ^1.0.4
+      prettier: '>=2.0'
+      typescript: '>=2.9'
+    peerDependenciesMeta:
+      '@volar/vue-language-plugin-pug':
+        optional: true
+      '@volar/vue-typescript':
+        optional: true
+    dependencies:
+      prettier: 2.8.8
+      typescript: 5.0.2
+    dev: true
+
+  /prettier-plugin-packagejson@2.3.0(prettier@2.8.8):
+    resolution: {integrity: sha512-2SAPMMk1UDkqsB7DifWKcwCm6VC52JXMrzLHfbcQHJRWhRCj9zziOy+s+2XOyPBeyqFqS+A/1IKzOrxKFTo6pw==}
+    peerDependencies:
+      prettier: '>= 1.16.0'
+    peerDependenciesMeta:
+      prettier:
+        optional: true
+    dependencies:
+      prettier: 2.8.8
+      sort-package-json: 1.57.0
+    dev: true
+
+  /prettier-plugin-packagejson@2.4.3(prettier@2.8.8):
+    resolution: {integrity: sha512-kPeeviJiwy0BgOSk7No8NmzzXfW4R9FYWni6ziA5zc1kGVVrKnBzMZdu2TUhI+I7h8/5Htt3vARYOk7KKJTTNQ==}
+    peerDependencies:
+      prettier: '>= 1.16.0'
+    peerDependenciesMeta:
+      prettier:
+        optional: true
+    dependencies:
+      prettier: 2.8.8
+      sort-package-json: 2.4.1
+      synckit: 0.8.5
+    dev: true
+
+  /prettier-plugin-two-style-order@1.0.1(prettier@2.8.8):
+    resolution: {integrity: sha512-ETltO2FRR/Pxc7bsgz2XwuzWSPwafl7/v5+5Rria4S579CTas7dya+xsmbkix0q1tYQiuRjVVdfGnCKlH/aOuQ==}
+    peerDependencies:
+      prettier: '>= 2.0.0'
+    dependencies:
+      postcss: 8.4.24
+      postcss-less: 4.0.1
+      postcss-sorting: 6.0.0(postcss@8.4.24)
+      prettier: 2.8.8
+    dev: true
+
+  /prettier@1.15.3:
+    resolution: {integrity: sha512-gAU9AGAPMaKb3NNSUUuhhFAS7SCO4ALTN4nRIn6PJ075Qd28Yn2Ig2ahEJWdJwJmlEBTUfC7mMUSFy8MwsOCfg==}
+    engines: {node: '>=4'}
+    hasBin: true
+    dev: true
+
+  /prettier@2.8.8:
+    resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+    dev: true
+
+  /pretty-error@4.0.0:
+    resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==}
+    dependencies:
+      lodash: 4.17.21
+      renderkid: 3.0.0
+    dev: true
+
+  /pretty-format@27.5.1:
+    resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
+    engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+    dependencies:
+      ansi-regex: 5.0.1
+      ansi-styles: 5.2.0
+      react-is: 17.0.2
+    dev: true
+
+  /pretty-format@29.5.0:
+    resolution: {integrity: sha512-V2mGkI31qdttvTFX7Mt4efOqHXqJWMu4/r66Xh3Z3BwZaPfPJgp6/gbwoujRpPUtfEF6AUUWx3Jim3GCw5g/Qw==}
+    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+    dependencies:
+      '@jest/schemas': 29.4.3
+      ansi-styles: 5.2.0
+      react-is: 18.2.0
+    dev: true
+
+  /process-nextick-args@2.0.1:
+    resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+    dev: true
+
+  /process-warning@1.0.0:
+    resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==}
+    dev: true
+
+  /process@0.11.10:
+    resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
+    engines: {node: '>= 0.6.0'}
+    dev: true
+
+  /progress@2.0.3:
+    resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==}
+    engines: {node: '>=0.4.0'}
+    dev: true
+
+  /promise@6.0.0:
+    resolution: {integrity: sha512-PjIqIEWR8EWwP5ml3Wf5KWIP3sIdXAew9vQ6vLOLV+z4LMa/8ZQyLd7sTWe2r8OuA8A9jsIYptDfbEn/L36ogw==}
+    dependencies:
+      asap: 1.0.0
+    dev: true
+
+  /promise@7.3.1:
+    resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==}
+    dependencies:
+      asap: 2.0.6
+    dev: true
+
+  /prompts@2.4.2:
+    resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+    engines: {node: '>= 6'}
+    dependencies:
+      kleur: 3.0.3
+      sisteransi: 1.0.5
+
+  /prop-types@15.8.1:
+    resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+    dependencies:
+      loose-envify: 1.4.0
+      object-assign: 4.1.1
+      react-is: 16.13.1
+
+  /proxy-addr@2.0.7:
+    resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
+    engines: {node: '>= 0.10'}
+    dependencies:
+      forwarded: 0.2.0
+      ipaddr.js: 1.9.1
+    dev: true
+
+  /proxy-compare@2.4.0:
+    resolution: {integrity: sha512-FD8KmQUQD6Mfpd0hywCOzcon/dbkFP8XBd9F1ycbKtvVsfv6TsFUKJ2eC0Iz2y+KzlkdT1Z8SY6ZSgm07zOyqg==}
+    dev: true
+
+  /proxy-from-env@1.1.0:
+    resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==}
+    dev: true
+
+  /prr@1.0.1:
+    resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
+    dev: true
+    optional: true
+
+  /psl@1.9.0:
+    resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==}
+    dev: true
+
+  /public-encrypt@4.0.3:
+    resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==}
+    dependencies:
+      bn.js: 4.12.0
+      browserify-rsa: 4.1.0
+      create-hash: 1.2.0
+      parse-asn1: 5.1.6
+      randombytes: 2.1.0
+      safe-buffer: 5.2.1
+    dev: true
+
+  /pump@3.0.0:
+    resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
+    dependencies:
+      end-of-stream: 1.4.4
+      once: 1.4.0
+    dev: true
+
+  /punycode@1.3.2:
+    resolution: {integrity: sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==}
+    dev: true
+
+  /punycode@1.4.1:
+    resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
+    dev: true
+
+  /punycode@2.3.0:
+    resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==}
+    engines: {node: '>=6'}
+
+  /puppeteer-core@1.12.2:
+    resolution: {integrity: sha512-M+atMV5e+MwJdR+OwQVZ1xqAIwh3Ou4nUxNuf334GwpcLG+LDj5BwIph4J9y8YAViByRtWGL+uF8qX2Ggzb+Fg==}
+    engines: {node: '>=6.4.0'}
+    requiresBuild: true
+    dependencies:
+      debug: 4.3.4(supports-color@5.5.0)
+      extract-zip: 1.7.0
+      https-proxy-agent: 2.2.4
+      mime: 2.6.0
+      progress: 2.0.3
+      proxy-from-env: 1.1.0
+      rimraf: 2.7.1
+      ws: 6.2.2
+    transitivePeerDependencies:
+      - bufferutil
+      - supports-color
+      - utf-8-validate
+    dev: true
+
+  /pure-rand@6.0.2:
+    resolution: {integrity: sha512-6Yg0ekpKICSjPswYOuC5sku/TSWaRYlA0qsXqJgM/d/4pLPHPuTxK7Nbf7jFKzAeedUhR8C7K9Uv63FBsSo8xQ==}
+    dev: true
+
+  /qiankun@2.10.8:
+    resolution: {integrity: sha512-5w6QeM1INFavJdIWfSoDIVv2InV8MEojauvY5tY9Biu8hhE5Rml/HM2t/Y60kZcuOpgy/HGX+tcc6NkQuzDoCg==}
+    dependencies:
+      '@babel/runtime': 7.22.3
+      import-html-entry: 1.14.6
+      lodash: 4.17.21
+      single-spa: 5.9.4
+    dev: true
+
+  /qrcode.react@3.1.0(react@18.2.0):
+    resolution: {integrity: sha512-oyF+Urr3oAMUG/OiOuONL3HXM+53wvuH3mtIWQrYmsXoAq0DkvZp2RYUWFSMFtbdOpuS++9v+WAkzNVkMlNW6Q==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+    dependencies:
+      react: 18.2.0
+
+  /qs@6.11.0:
+    resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
+    engines: {node: '>=0.6'}
+    dependencies:
+      side-channel: 1.0.4
+    dev: true
+
+  /qs@6.11.2:
+    resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==}
+    engines: {node: '>=0.6'}
+    dependencies:
+      side-channel: 1.0.4
+    dev: true
+
+  /qs@6.5.3:
+    resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==}
+    engines: {node: '>=0.6'}
+    dev: true
+
+  /query-string@6.14.1:
+    resolution: {integrity: sha512-XDxAeVmpfu1/6IjyT/gXHOl+S0vQ9owggJ30hhWKdHAsNPOcasn5o9BW0eejZqL2e4vMjhAxoW3jVHcD6mbcYw==}
+    engines: {node: '>=6'}
+    dependencies:
+      decode-uri-component: 0.2.2
+      filter-obj: 1.1.0
+      split-on-first: 1.1.0
+      strict-uri-encode: 2.0.0
+    dev: true
+
+  /querystring-es3@0.2.1:
+    resolution: {integrity: sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==}
+    engines: {node: '>=0.4.x'}
+    dev: true
+
+  /querystring@0.2.0:
+    resolution: {integrity: sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==}
+    engines: {node: '>=0.4.x'}
+    deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
+    dev: true
+
+  /querystring@0.2.1:
+    resolution: {integrity: sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==}
+    engines: {node: '>=0.4.x'}
+    deprecated: The querystring API is considered Legacy. new code should use the URLSearchParams API instead.
+    dev: false
+
+  /querystringify@2.2.0:
+    resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==}
+    dev: true
+
+  /queue-microtask@1.2.3:
+    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+  /quick-format-unescaped@4.0.4:
+    resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==}
+    dev: true
+
+  /quick-lru@4.0.1:
+    resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /raf@3.4.1:
+    resolution: {integrity: sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==}
+    dependencies:
+      performance-now: 2.1.0
+    dev: true
+
+  /randombytes@2.1.0:
+    resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
+    dependencies:
+      safe-buffer: 5.2.1
+
+  /randomfill@1.0.4:
+    resolution: {integrity: sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==}
+    dependencies:
+      randombytes: 2.1.0
+      safe-buffer: 5.2.1
+    dev: true
+
+  /range-parser@1.2.1:
+    resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
+    engines: {node: '>= 0.6'}
+    dev: true
+
+  /raw-body@2.5.1:
+    resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==}
+    engines: {node: '>= 0.8'}
+    dependencies:
+      bytes: 3.1.2
+      http-errors: 2.0.0
+      iconv-lite: 0.4.24
+      unpipe: 1.0.0
+    dev: true
+
+  /rc-align@2.4.5:
+    resolution: {integrity: sha512-nv9wYUYdfyfK+qskThf4BQUSIadeI/dCsfaMZfNEoxm9HwOIioQ+LyqmMK6jWHAZQgOzMLaqawhuBXlF63vgjw==}
+    dependencies:
+      babel-runtime: 6.26.0
+      dom-align: 1.12.4
+      prop-types: 15.8.1
+      rc-util: 4.21.1
+    dev: true
+
+  /rc-align@4.0.15(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-wqJtVH60pka/nOX7/IspElA8gjPNQKIx/ZqJ6heATCkXpe1Zg4cPVrMD2vC96wjsFFL8WsmhPbx9tdMo1qqlIA==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      dom-align: 1.12.4
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      resize-observer-polyfill: 1.5.1
+
+  /rc-animate@2.11.1(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-1NyuCGFJG/0Y+9RKh5y/i/AalUCA51opyyS/jO2seELpgymZm2u9QV3xwODwEuzkmeQ1BDPxMLmYLcTJedPlkQ==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      babel-runtime: 6.26.0
+      classnames: 2.3.2
+      css-animation: 1.6.1
+      prop-types: 15.8.1
+      raf: 3.4.1
+      rc-util: 4.21.1
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      react-lifecycles-compat: 3.0.4
+    dev: true
+
+  /rc-cascader@3.12.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-QTeGPTNYX33alozNy9lYg7YKpvYVwquai/mrFRR8mHlHnK7QlqJyMqbs2p7rc5eeKARKMRTUeoN5CfO+Gr9UBw==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      array-tree-filter: 2.1.0
+      classnames: 2.3.2
+      rc-select: 14.5.1(react-dom@18.2.0)(react@18.2.0)
+      rc-tree: 5.7.4(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-cascader@3.7.2(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-5nPEM76eMyikd0NFiy1gjwiB9m+bOzjY6Lnd5bVC6Ar3XLlOpOnlCcV3oBFWLN3f7B18tAGpaAVlT2uyEDCv9w==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      array-tree-filter: 2.1.0
+      classnames: 2.3.2
+      rc-select: 14.1.17(react-dom@18.2.0)(react@18.2.0)
+      rc-tree: 5.7.4(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-checkbox@2.0.3:
+    resolution: {integrity: sha512-sSDV5AcxK5CxBTyUNj9pb0zfhdgLLsWKHwJG18ikeGoIwklcxXvIF6cI/KGVbPLFDa8mPS5WLOlLRqbq/1/ouw==}
+    dependencies:
+      babel-runtime: 6.26.0
+      classnames: 2.3.2
+      prop-types: 15.8.1
+      rc-util: 4.21.1
+    dev: true
+
+  /rc-checkbox@3.0.1(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-k7nxDWxYF+jDI0ZcCvuvj71xONmWRVe5+1MKcERRR9MRyP3tZ69b+yUCSXXh+sik4/Hc9P5wHr2nnUoGS2zBjA==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-collapse@1.9.3(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-8cG+FzudmgFCC9zRGKXJZA36zoI9Dmyjp6UDi8N80sXUch0JOpsZDxgcFzw4HPpPpK/dARtTilEe9zyuspnW0w==}
+    dependencies:
+      classnames: 2.3.2
+      css-animation: 1.6.1
+      prop-types: 15.8.1
+      rc-animate: 2.11.1(react-dom@18.2.0)(react@18.2.0)
+    transitivePeerDependencies:
+      - react
+      - react-dom
+    dev: true
+
+  /rc-collapse@3.4.2(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-jpTwLgJzkhAgp2Wpi3xmbTbbYExg6fkptL67Uu5LCRVEj6wqmy0DHTjjeynsjOLsppHGHu41t1ELntZ0lEvS/Q==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      shallowequal: 1.1.0
+    dev: true
+
+  /rc-collapse@3.5.2(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-/TNiT3DW1t3sUCiVD/DPUYooJZ3BLA93/2rZsB3eM2bGJCCla2X9D2E4tgm7LGMQGy5Atb2lMUn2FQuvQNvavQ==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-dialog@9.0.2(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-s3U+24xWUuB6Bn2Lk/Qt6rufy+uT+QvWkiFhNBcO9APLxcFFczWamaq7x9h8SCuhfc1nHcW4y8NbMsnAjNnWyg==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-dialog@9.1.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-5ry+JABAWEbaKyYsmITtrJbZbJys8CtMyzV8Xn4LYuXMeUx5XVHNyJRoqLFE4AzBuXXzOWeaC49cg+XkxK6kHA==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-drawer@6.1.6(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-EBRFM9o3lPU5kYh8sFoXYA9KxpdT765HDqj/AbZWicXkhwEYUH7MjUH0ctenPCiHBxXQUgIUvK14+6rPuURd6w==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-dropdown@4.0.1(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-OdpXuOcme1rm45cR0Jzgfl1otzmU4vuBVb+etXM8vcaULGokAKVpKlw8p6xzspG7jGd/XxShvq+N3VNEfk/l5g==}
+    peerDependencies:
+      react: '>=16.11.0'
+      react-dom: '>=16.11.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-dropdown@4.1.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-VZjMunpBdlVzYpEdJSaV7WM7O0jf8uyDjirxXLZRNZ+tAC+NzD3PXPEtliFwGzVwBBdCmGuSqiS9DWcOLxQ9tw==}
+    peerDependencies:
+      react: '>=16.11.0'
+      react-dom: '>=16.11.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@rc-component/trigger': 1.13.3(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-field-form@1.27.4(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-PQColQnZimGKArnOh8V2907+VzDCXcqtFvHgevDLtqWc/P7YASb/FqntSmdS8q3VND5SHX3Y1vgMIzY22/f/0Q==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      async-validator: 4.2.5
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-field-form@1.31.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-3u6crithuSQMfHaDL3rMvzjG5oXJQIgCTxDfT0pJL9kI/C2LWuR8GrApzOvB9gKcf8VvvnejzmSPnsUJz4YGmQ==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      async-validator: 4.2.5
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-field-form@1.32.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-vr5pA0/gWiBZf0HKdevQJcWSsAac10Z8Nj1Brs3OOCnExk7l+u8GtsW+4cRSqJLug5fxV11dOGXpxf7+aHT/2A==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      async-validator: 4.2.5
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-gesture@0.0.22:
+    resolution: {integrity: sha512-6G6qrCE0MUTXyjh/powj91XkjRjoFL4HiJLPU5lALXHvGX+/efcUjGYUrHrrw0mwQdmrmg4POqnY/bibns+G3g==}
+    dependencies:
+      babel-runtime: 6.26.0
+    dev: true
+
+  /rc-image@5.13.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-iZTOmw5eWo2+gcrJMMcnd7SsxVHl3w5xlyCgsULUdJhJbnuI8i/AL0tVOsE7aLn9VfOh1qgDT3mC2G75/c7mqg==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      rc-dialog: 9.0.2(react-dom@18.2.0)(react@18.2.0)
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-image@5.16.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-11DOye57IgTXh2yTsmxFNynZJG3tdx8RZnnaqb38eYWrBPPyhVHIuURxyiSZ8B68lEUAggR7SBA0Zb95KP/CyQ==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@rc-component/portal': 1.1.1(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      rc-dialog: 9.1.0(react-dom@18.2.0)(react@18.2.0)
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-input-number@7.3.11(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-aMWPEjFeles6PQnMqP5eWpxzsvHm9rh1jQOWXExUEIxhX62Fyl/ptifLHOn17+waDG1T/YUb6flfJbvwRhHrbA==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-input-number@7.4.2(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-yGturTw7WGP+M1GbJ+UTAO7L4buxeW6oilhL9Sq3DezsRS8/9qec4UiXUbeoiX9bzvRXH11JvgskBtxSp4YSNg==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@rc-component/mini-decimal': 1.0.1
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-input@0.1.4(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-FqDdNz+fV2dKNgfXzcSLKvC+jEs1709t7nD+WdfjrdSaOcefpgc7BUJYadc3usaING+b7ediMTfKxuJBsEFbXA==}
+    peerDependencies:
+      react: '>=16.0.0'
+      react-dom: '>=16.0.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-input@1.0.4(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-clY4oneVHRtKHYf/HCxT/MO+4BGzCIywSNLosXWOm7fcQAS0jQW7n0an8Raa8JMB8kpxc8m28p7SNwFZmlMj6g==}
+    peerDependencies:
+      react: '>=16.0.0'
+      react-dom: '>=16.0.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-mentions@1.13.1(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-FCkaWw6JQygtOz0+Vxz/M/NWqrWHB9LwqlY2RtcuFqWJNFK9njijOOzTSsBGANliGufVUzx/xuPHmZPBV0+Hgw==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0)
+      rc-textarea: 0.4.7(react-dom@18.2.0)(react@18.2.0)
+      rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-mentions@2.2.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-R7ncCldr02uKgJBBPlXdtnOGQIjZ9C3uoIMi4fabU3CPFdmefYlNF6QM4u2AzgcGt8V0KkoHTN5T6HPdUpet8g==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@rc-component/trigger': 1.13.3(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      rc-input: 1.0.4(react-dom@18.2.0)(react@18.2.0)
+      rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0)
+      rc-textarea: 1.2.3(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-menu@9.8.4(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-lmw2j8I2fhdIzHmC9ajfImfckt0WDb2KVJJBBRIsxPEw2kGkEfjLMUoB1NgiNT/Q5cC8PdjGOGQjHJIJMwyNMw==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-overflow: 1.3.0(react-dom@18.2.0)(react@18.2.0)
+      rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-menu@9.9.2(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-kVJwaQn5VUu6DIddxd/jz3QupTPg0tNYq+mpFP8wYsRF5JgzPA9fPVw+CfwlTPwA1w7gzEY42S8pj6M3uev5CQ==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@rc-component/trigger': 1.13.3(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-overflow: 1.3.0(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: false
+
+  /rc-motion@2.7.3(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-2xUvo8yGHdOHeQbdI8BtBsCIrWKchEmFEIskf0nmHtJsou+meLd/JE+vnvSX2JxcBrJtXY2LuBpxAOxrbY/wMQ==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-notification@4.6.1(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-NSmFYwrrdY3+un1GvDAJQw62Xi9LNMSsoQyo95tuaYrcad5Bn9gJUL8AREufRxSQAQnr64u3LtP3EUyLYT6bhw==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-notification@5.0.4(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-3535oellIRlt1LspERfK8yvCqb8Gio3R02rULciaSc1xe3H7ArTU/khlUTv1ddGzua4HhmF4D4Rwz/+mBxETvg==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-overflow@1.3.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-p2Qt4SWPTHAYl4oAao1THy669Fm5q8pYBDBHRaFOekCvcdcrgIx0ByXQMEkyPm8wUDX4BK6aARWecvCRc/7CTA==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-pagination@3.2.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-5tIXjB670WwwcAJzAqp2J+cOBS9W3cH/WU1EiYwXljuZ4vtZXKlY2Idq8FZrnYBz8KhN3vwPo9CoV/SJS6SL1w==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-pagination@3.4.2(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-arFQKD15h26+rSXRnQNA8b/tHy98/853W/leXkas2WlViOYG5A2qgEg7CRX64GKb9TqJjdqnDzaMAvl0qF4Tig==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-picker@2.7.2(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-KbUKgbzgWVN5L+V9xhZDKSmseHIyFneBlmuMtMrZ9fU7Oypw6D+owS5kuUicIEV08Y17oXt8dUqauMeC5IFBPg==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      date-fns: 2.30.0
+      dayjs: 1.11.7
+      moment: 2.29.4
+      rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      shallowequal: 1.1.0
+    dev: true
+
+  /rc-picker@3.7.6(dayjs@1.11.7)(moment@2.29.4)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-v84wVXjgx5hQ5vTLjMeMMtj6+gn480Gqzwur2A2+o8+eFnhY4jKmuqzHmD8sEevrz0WT/j1pLHFxAV8/lksI2A==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      date-fns: '>= 2.x'
+      dayjs: '>= 1.x'
+      luxon: '>= 3.x'
+      moment: '>= 2.x'
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    peerDependenciesMeta:
+      date-fns:
+        optional: true
+      dayjs:
+        optional: true
+      luxon:
+        optional: true
+      moment:
+        optional: true
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@rc-component/trigger': 1.13.3(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      dayjs: 1.11.7
+      moment: 2.29.4
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-progress@3.4.1(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-eAFDHXlk8aWpoXl0llrenPMt9qKHQXphxcVsnKs0FHC6eCSk1ebJtyaVjJUzKe0233ogiLDeEFK1Uihz3s67hw==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-rate@2.10.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-TCjEpKPeN1m0EnGDDbb1KyxjNTJRzoReiPdtbrBJEey4Ryf/UGOQ6vqmz2yC6DJdYVDVUoZPdoz043ryh0t/nQ==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-rate@2.9.2(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-SaiZFyN8pe0Fgphv8t3+kidlej+cq/EALkAJAc3A0w0XcPaH2L1aggM8bhe1u6GAGuQNAoFvTLjw4qLPGRKV5g==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-resize-observer@0.2.6(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-YX6nYnd6fk7zbuvT6oSDMKiZjyngjHoy+fz+vL3Tez38d/G5iGdaDJa2yE7345G6sc4Mm1IGRUIwclvltddhmA==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      resize-observer-polyfill: 1.5.1
+
+  /rc-resize-observer@1.3.1(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-iFUdt3NNhflbY3mwySv5CA1TC06zdJ+pfo0oc27xpf4PIOvfZwZGtD9Kz41wGYqC4SLio93RVAirSSpYlV/uYg==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      resize-observer-polyfill: 1.5.1
+
+  /rc-segmented@2.1.2(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-qGo1bCr83ESXpXVOCXjFe1QJlCAQXyi9KCiy8eX3rIMYlTeJr/ftySIaTnYsitL18SvWf5ZEHsfqIWoX0EMfFQ==}
+    peerDependencies:
+      react: '>=16.0.0'
+      react-dom: '>=16.0.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-segmented@2.2.2(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-Mq52M96QdHMsNdE/042ibT5vkcGcD5jxKp7HgPC2SRofpia99P5fkfHy1pEaajLMF/kj0+2Lkq1UZRvqzo9mSA==}
+    peerDependencies:
+      react: '>=16.0.0'
+      react-dom: '>=16.0.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-select@14.1.17(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-6qQhMqtoUkkboRqXKKFRR5Nu1mrnw2mC1uxIBIczg7aiJ94qCZBg4Ww8OLT9f4xdyCgbFSGh6r3yB9EBsjoHGA==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '*'
+      react-dom: '*'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-overflow: 1.3.0(react-dom@18.2.0)(react@18.2.0)
+      rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      rc-virtual-list: 3.5.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-select@14.5.1(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-RQ3yiguq6yJ+kbtip7/6RTq2hOotS/s00nyZL2nxyz5194C6uOtSB8Kgsw3c6ZXII1EDjuJX3zLI1pkxkNWyww==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '*'
+      react-dom: '*'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@rc-component/trigger': 1.13.3(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-overflow: 1.3.0(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      rc-virtual-list: 3.5.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-slider@10.0.1(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-igTKF3zBet7oS/3yNiIlmU8KnZ45npmrmHlUUio8PNbIhzMcsh+oE/r2UD42Y6YD2D/s+kzCQkzQrPD6RY435Q==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      shallowequal: 1.1.0
+    dev: true
+
+  /rc-slider@10.1.1(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-gn8oXazZISEhnmRinI89Z/JD/joAaM35jp+gDtIVSTD/JJMCCBqThqLk1SVJmvtfeiEF/kKaFY0+qt4SDHFUDw==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-slider@8.2.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-rnO36M3VhMoPWh1kRuCeJoluT4duAW7+5aLaAn9oLu2pKEKsuOFUh5DmA2kEo88UmvPV6nr7HHDeZuC8SNM/lA==}
+    dependencies:
+      babel-runtime: 6.26.0
+      classnames: 2.3.2
+      prop-types: 15.8.1
+      rc-tooltip: 3.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 4.21.1
+      shallowequal: 1.1.0
+      warning: 3.0.0
+    transitivePeerDependencies:
+      - react
+      - react-dom
+    dev: true
+
+  /rc-steps@5.0.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-9TgRvnVYirdhbV0C3syJFj9EhCRqoJAsxt4i1rED5o8/ZcSv5TLIYyo4H8MCjLPvbe2R+oBAm/IYBEtC+OS1Rw==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-steps@6.0.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-+KfMZIty40mYCQSDvYbZ1jwnuObLauTiIskT1hL4FFOBHP6ZOr8LK0m143yD3kEN5XKHSEX1DIwCj3AYZpoeNQ==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-swipeout@2.0.11:
+    resolution: {integrity: sha512-d37Lgn4RX4OOQyuA2BFo0rGlUwrmZk5q83srH3ixJ1Y1jidr2GKjgJDbNeGUVZPNfYBL91Elu6+xfVGftWf4Lg==}
+    dependencies:
+      babel-runtime: 6.26.0
+      classnames: 2.3.2
+      rc-gesture: 0.0.22
+      react-native-swipeout: 2.3.6
+    dev: true
+
+  /rc-switch@3.2.2(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-+gUJClsZZzvAHGy1vZfnwySxj+MjLlGRyXKXScrtCTcmiYNPzxDFOxdQ/3pK1Kt/0POvwJ/6ALOR8gwdXGhs+A==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-switch@4.1.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-TI8ufP2Az9oEbvyCeVE4+90PDSljGyuwix3fV58p7HV2o4wBnVToEyomJRVyTaZeqNPAp+vqeo4Wnj5u0ZZQBg==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-table@7.26.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-0cD8e6S+DTGAt5nBZQIPFYEaIukn17sfa5uFL98faHlH/whZzD8ii3dbFL4wmUDEL4BLybhYop+QUfZJ4CPvNQ==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      shallowequal: 1.1.0
+    dev: true
+
+  /rc-table@7.32.1(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-fHMQteKMocUC9I9Vex3eBLH7QsiaMR/qtzh3B1Ty2PoNGwVTwVdDFyRL05zch+JU3KnNNczgQeVvtf/p//gdrQ==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@rc-component/context': 1.3.0(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-tabs@12.5.10(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-Ay0l0jtd4eXepFH9vWBvinBjqOpqzcsJTerBGwJy435P2S90Uu38q8U/mvc1sxUEVOXX5ZCFbxcWPnfG3dH+tQ==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-dropdown: 4.0.1(react-dom@18.2.0)(react@18.2.0)
+      rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0)
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-tabs@12.6.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-L9yIptdrmft573MEsc+xKoGbXzfg3V6NYvgT0sNh+PSzWaeF34W7CIPi98lcWjtsYB80oFMOcAXRilUFxLHTaA==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-dropdown: 4.1.0(react-dom@18.2.0)(react@18.2.0)
+      rc-menu: 9.8.4(react-dom@18.2.0)(react@18.2.0)
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-textarea@0.4.7(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-IQPd1CDI3mnMlkFyzt2O4gQ2lxUsnBAeJEoZGJnkkXgORNqyM9qovdrCj9NzcRfpHgLdzaEbU3AmobNFGUznwQ==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      shallowequal: 1.1.0
+    dev: true
+
+  /rc-textarea@1.2.3(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-YvN8IskIVBRRzcS4deT0VAMim31+T3IoVX4yoCJ+b/iVCvw7yf0usR7x8OaHiUOUoURKcn/3lfGjmtzplcy99g==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-input: 1.0.4(react-dom@18.2.0)(react@18.2.0)
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-tooltip@3.7.3(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-dE2ibukxxkrde7wH9W8ozHKUO4aQnPZ6qBHtrTH9LoO836PjDdiaWO73fgPB05VfJs9FbZdmGPVEbXCeOP99Ww==}
+    dependencies:
+      babel-runtime: 6.26.0
+      prop-types: 15.8.1
+      rc-trigger: 2.6.5(react-dom@18.2.0)(react@18.2.0)
+    transitivePeerDependencies:
+      - react
+      - react-dom
+    dev: true
+
+  /rc-tooltip@5.2.2(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-jtQzU/18S6EI3lhSGoDYhPqNpWajMtS5VV/ld1LwyfrDByQpYmw/LW6U7oFXXLukjfDHQ7Ju705A82PRNFWYhg==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-trigger: 5.3.4(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-tooltip@6.0.1(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-MdvPlsD1fDSxKp9+HjXrc/CxLmA/s11QYIh1R7aExxfodKP7CZA++DG1AjrW80F8IUdHYcR43HAm0Y2BYPelHA==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@rc-component/trigger': 1.13.3(react-dom@18.2.0)(react@18.2.0)
+      classnames: 2.3.2
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-tree-select@5.5.5(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-k2av7jF6tW9bIO4mQhaVdV4kJ1c54oxV3/hHVU+oD251Gb5JN+m1RbJFTMf1o0rAFqkvto33rxMdpafaGKQRJw==}
+    peerDependencies:
+      react: '*'
+      react-dom: '*'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-select: 14.1.17(react-dom@18.2.0)(react@18.2.0)
+      rc-tree: 5.7.4(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+    dev: true
+
+  /rc-tree-select@5.9.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-oh3blESzLfLCBPSiVDtZ2irzrWWZUMeHvnSwRvFo79br8Z+K/1OhXhXBZmROvfKwaH8YUugAQy8B2j5EGQbdyA==}
+    peerDependencies:
+      react: '*'
+      react-dom: '*'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-select: 14.5.1(react-dom@18.2.0)(react@18.2.0)
+      rc-tree: 5.7.4(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-tree@5.7.4(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-7VfDq4jma+6fvlzfDXvUJ34SaO2EWkcXGBmPgeFmVKsLNNXcKGl4cRAhs6Ts1zqnX994vu/hb3f1dyTjn43RFg==}
+    engines: {node: '>=10.x'}
+    peerDependencies:
+      react: '*'
+      react-dom: '*'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      rc-virtual-list: 3.5.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-trigger@2.6.5(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-m6Cts9hLeZWsTvWnuMm7oElhf+03GOjOLfTuU0QmdB9ZrW7jR2IpI5rpNM7i9MvAAlMAmTx5Zr7g3uu/aMvZAw==}
+    dependencies:
+      babel-runtime: 6.26.0
+      classnames: 2.3.2
+      prop-types: 15.8.1
+      rc-align: 2.4.5
+      rc-animate: 2.11.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 4.21.1
+      react-lifecycles-compat: 3.0.4
+    transitivePeerDependencies:
+      - react
+      - react-dom
+    dev: true
+
+  /rc-trigger@5.3.4(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-mQv+vas0TwKcjAO2izNPkqR4j86OemLRmvL2nOzdP9OWNWA1ivoTt5hzFqYNW9zACwmTezRiN8bttrC7cZzYSw==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-align: 4.0.15(react-dom@18.2.0)(react@18.2.0)
+      rc-motion: 2.7.3(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-upload@4.3.4(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-uVbtHFGNjHG/RyAfm9fluXB6pvArAGyAx8z7XzXXyorEgVIWj6mOlriuDm0XowDHYz4ycNK0nE0oP3cbFnzxiQ==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /rc-util@4.21.1:
+    resolution: {integrity: sha512-Z+vlkSQVc1l8O2UjR3WQ+XdWlhj5q9BMQNLk2iOBch75CqPfrJyGtcWMcnhRlNuDu0Ndtt4kLVO8JI8BrABobg==}
+    dependencies:
+      add-dom-event-listener: 1.1.0
+      prop-types: 15.8.1
+      react-is: 16.13.1
+      react-lifecycles-compat: 3.0.4
+      shallowequal: 1.1.0
+
+  /rc-util@5.32.2(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-nfwctiglkgaRjJAnWp0W6BH9Am0cuLOz5HbcBrswQVeLDwnuoholdGex/vZjwug/oq5H1wBwao12DpP61FI1yA==}
+    peerDependencies:
+      react: '>=16.9.0'
+      react-dom: '>=16.9.0'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      react-is: 16.13.1
+
+  /rc-virtual-list@3.5.2(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-sE2G9hTPjVmatQni8OP2Kx33+Oth6DMKm67OblBBmgMBJDJQOOFpSGH7KZ6Pm85rrI2IGxDRXZCr0QhYOH2pfQ==}
+    engines: {node: '>=8.x'}
+    peerDependencies:
+      react: '*'
+      react-dom: '*'
+    dependencies:
+      '@babel/runtime': 7.22.3
+      classnames: 2.3.2
+      rc-resize-observer: 1.3.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 5.32.2(react-dom@18.2.0)(react@18.2.0)
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /react-dev-inspector@1.8.4(eslint@8.41.0)(react@18.2.0)(typescript@5.0.2)(webpack@5.84.1):
+    resolution: {integrity: sha512-+MpF43RHTKjkilQ4TgUfSgpVlJFKpL4uPc/0FBJAMNPICYxw27q81++AcBIThfxFmBgsFbMj3EKZwkaPZ43V7w==}
+    engines: {node: '>=12.0.0'}
+    peerDependencies:
+      react: '>=16.8.0'
+    dependencies:
+      '@babel/core': 7.22.1
+      '@babel/generator': 7.22.3
+      '@babel/parser': 7.22.3
+      '@babel/traverse': 7.22.1(supports-color@5.5.0)
+      '@babel/types': 7.22.3
+      hotkeys-js: 3.10.2
+      loader-utils: 2.0.4
+      querystring: 0.2.1
+      react: 18.2.0
+      react-dev-utils: 12.0.1(eslint@8.41.0)(typescript@5.0.2)(webpack@5.84.1)
+    transitivePeerDependencies:
+      - eslint
+      - supports-color
+      - typescript
+      - vue-template-compiler
+      - webpack
+    dev: false
+
+  /react-dev-utils@12.0.1(eslint@8.41.0)(typescript@5.0.2)(webpack@5.84.1):
+    resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      typescript: '>=2.7'
+      webpack: '>=4'
+    peerDependenciesMeta:
+      typescript:
+        optional: true
+    dependencies:
+      '@babel/code-frame': 7.21.4
+      address: 1.2.2
+      browserslist: 4.21.6
+      chalk: 4.1.2
+      cross-spawn: 7.0.3
+      detect-port-alt: 1.1.6
+      escape-string-regexp: 4.0.0
+      filesize: 8.0.7
+      find-up: 5.0.0
+      fork-ts-checker-webpack-plugin: 6.5.3(eslint@8.41.0)(typescript@5.0.2)(webpack@5.84.1)
+      global-modules: 2.0.0
+      globby: 11.1.0
+      gzip-size: 6.0.0
+      immer: 9.0.21
+      is-root: 2.1.0
+      loader-utils: 3.2.1
+      open: 8.4.2
+      pkg-up: 3.1.0
+      prompts: 2.4.2
+      react-error-overlay: 6.0.11
+      recursive-readdir: 2.2.3
+      shell-quote: 1.8.1
+      strip-ansi: 6.0.1
+      text-table: 0.2.0
+      typescript: 5.0.2
+      webpack: 5.84.1
+    transitivePeerDependencies:
+      - eslint
+      - supports-color
+      - vue-template-compiler
+    dev: false
+
+  /react-dom@18.1.0(react@18.1.0):
+    resolution: {integrity: sha512-fU1Txz7Budmvamp7bshe4Zi32d0ll7ect+ccxNu9FlObT605GOEB8BfO4tmRJ39R5Zj831VCpvQ05QPBW5yb+w==}
+    peerDependencies:
+      react: ^18.1.0
+    dependencies:
+      loose-envify: 1.4.0
+      react: 18.1.0
+      scheduler: 0.22.0
+    dev: true
+
+  /react-dom@18.2.0(react@18.2.0):
+    resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
+    peerDependencies:
+      react: ^18.2.0
+    dependencies:
+      loose-envify: 1.4.0
+      react: 18.2.0
+      scheduler: 0.23.0
+
+  /react-error-overlay@6.0.11:
+    resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==}
+    dev: false
+
+  /react-error-overlay@6.0.9:
+    resolution: {integrity: sha512-nQTTcUu+ATDbrSD1BZHr5kgSD4oF8OFjxun8uAaL8RwPBacGBNPf/yAuVVdx17N8XNzRDMrZ9XcKZHCjPW+9ew==}
+    dev: true
+
+  /react-fast-compare@3.2.2:
+    resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==}
+
+  /react-helmet-async@1.3.0(react-dom@18.1.0)(react@18.1.0):
+    resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==}
+    peerDependencies:
+      react: ^16.6.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0
+    dependencies:
+      '@babel/runtime': 7.22.3
+      invariant: 2.2.4
+      prop-types: 15.8.1
+      react: 18.1.0
+      react-dom: 18.1.0(react@18.1.0)
+      react-fast-compare: 3.2.2
+      shallowequal: 1.1.0
+    dev: true
+
+  /react-helmet-async@1.3.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==}
+    peerDependencies:
+      react: ^16.6.0 || ^17.0.0 || ^18.0.0
+      react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0
+    dependencies:
+      '@babel/runtime': 7.22.3
+      invariant: 2.2.4
+      prop-types: 15.8.1
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      react-fast-compare: 3.2.2
+      shallowequal: 1.1.0
+
+  /react-intl@3.12.1(react@18.2.0):
+    resolution: {integrity: sha512-cgumW29mwROIqyp8NXStYsoIm27+8FqnxykiLSawWjOxGIBeLuN/+p2srei5SRIumcJefOkOIHP+NDck05RgHg==}
+    peerDependencies:
+      react: ^16.3.0
+    dependencies:
+      '@formatjs/intl-displaynames': 1.2.10
+      '@formatjs/intl-listformat': 1.4.8
+      '@formatjs/intl-relativetimeformat': 4.5.16
+      '@formatjs/intl-unified-numberformat': 3.3.7
+      '@formatjs/intl-utils': 2.3.0
+      '@types/hoist-non-react-statics': 3.3.1
+      '@types/invariant': 2.2.35
+      hoist-non-react-statics: 3.3.2
+      intl-format-cache: 4.3.1
+      intl-messageformat: 7.8.4
+      intl-messageformat-parser: 3.6.4
+      react: 18.2.0
+      shallow-equal: 1.2.1
+    dev: true
+
+  /react-is@16.13.1:
+    resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+
+  /react-is@17.0.2:
+    resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
+    dev: true
+
+  /react-is@18.2.0:
+    resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
+    dev: true
+
+  /react-lifecycles-compat@3.0.4:
+    resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==}
+
+  /react-merge-refs@1.1.0:
+    resolution: {integrity: sha512-alTKsjEL0dKH/ru1Iyn7vliS2QRcBp9zZPGoWxUOvRGWPUYgjo+V01is7p04It6KhgrzhJGnIj9GgX8W4bZoCQ==}
+    dev: true
+
+  /react-native-swipeout@2.3.6:
+    resolution: {integrity: sha512-t9suUCspzck4vp2pWggWe0frS/QOtX6yYCawHnEes75A7dZCEE74bxX2A1bQzGH9cUMjq6xsdfC94RbiDKIkJg==}
+    deprecated: Package no longer supported. Use at your own risk or consider using https://github.com/software-mansion/react-native-gesture-handler
+    dependencies:
+      create-react-class: 15.7.0
+      prop-types: 15.8.1
+      react-tween-state: 0.1.5
+    dev: true
+
+  /react-redux@5.1.2(react@18.2.0)(redux@3.7.2):
+    resolution: {integrity: sha512-Ns1G0XXc8hDyH/OcBHOxNgQx9ayH3SPxBnFCOidGKSle8pKihysQw2rG/PmciUQRoclhVBO8HMhiRmGXnDja9Q==}
+    peerDependencies:
+      react: ^0.14.0 || ^15.0.0-0 || ^16.0.0-0
+      redux: ^2.0.0 || ^3.0.0 || ^4.0.0-0
+    dependencies:
+      '@babel/runtime': 7.22.3
+      hoist-non-react-statics: 3.3.2
+      invariant: 2.2.4
+      loose-envify: 1.4.0
+      prop-types: 15.8.1
+      react: 18.2.0
+      react-is: 16.13.1
+      react-lifecycles-compat: 3.0.4
+      redux: 3.7.2
+    dev: true
+
+  /react-redux@7.2.9(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-Gx4L3uM182jEEayZfRbI/G11ZpYdNAnBs70lFVMNdHJI76XYtR+7m0MN+eAs7UHBPhWXcnFPaS+9owSCJQHNpQ==}
+    peerDependencies:
+      react: ^16.8.3 || ^17 || ^18
+      react-dom: '*'
+      react-native: '*'
+    peerDependenciesMeta:
+      react-dom:
+        optional: true
+      react-native:
+        optional: true
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@types/react-redux': 7.1.25
+      hoist-non-react-statics: 3.3.2
+      loose-envify: 1.4.0
+      prop-types: 15.8.1
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      react-is: 17.0.2
+    dev: true
+
+  /react-redux@8.0.5(@types/react-dom@18.2.4)(@types/react@18.2.7)(react-dom@18.2.0)(react@18.2.0)(redux@4.2.1):
+    resolution: {integrity: sha512-Q2f6fCKxPFpkXt1qNRZdEDLlScsDWyrgSj0mliK59qU6W5gvBiKkdMEG2lJzhd1rCctf0hb6EtePPLZ2e0m1uw==}
+    peerDependencies:
+      '@types/react': ^16.8 || ^17.0 || ^18.0
+      '@types/react-dom': ^16.8 || ^17.0 || ^18.0
+      react: ^16.8 || ^17.0 || ^18.0
+      react-dom: ^16.8 || ^17.0 || ^18.0
+      react-native: '>=0.59'
+      redux: ^4
+    peerDependenciesMeta:
+      '@types/react':
+        optional: true
+      '@types/react-dom':
+        optional: true
+      react-dom:
+        optional: true
+      react-native:
+        optional: true
+      redux:
+        optional: true
+    dependencies:
+      '@babel/runtime': 7.22.3
+      '@types/hoist-non-react-statics': 3.3.1
+      '@types/react': 18.2.7
+      '@types/react-dom': 18.2.4
+      '@types/use-sync-external-store': 0.0.3
+      hoist-non-react-statics: 3.3.2
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      react-is: 18.2.0
+      redux: 4.2.1
+      use-sync-external-store: 1.2.0(react@18.2.0)
+    dev: true
+
+  /react-refresh@0.14.0:
+    resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /react-router-dom@4.3.1(react@18.2.0):
+    resolution: {integrity: sha512-c/MlywfxDdCp7EnB7YfPMOfMD3tOtIjrQlj/CKfNMBxdmpJP8xcz5P/UAFn3JbnQCNUxsHyVVqllF9LhgVyFCA==}
+    peerDependencies:
+      react: '>=15'
+    dependencies:
+      history: 4.10.1
+      invariant: 2.2.4
+      loose-envify: 1.4.0
+      prop-types: 15.8.1
+      react: 18.2.0
+      react-router: 4.3.1(react@18.2.0)
+      warning: 4.0.3
+    dev: true
+
+  /react-router-dom@6.11.2(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      react: '>=16.8'
+      react-dom: '>=16.8'
+    dependencies:
+      '@remix-run/router': 1.6.2
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      react-router: 6.11.2(react@18.2.0)
+    dev: true
+
+  /react-router-dom@6.3.0(react-dom@18.1.0)(react@18.1.0):
+    resolution: {integrity: sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==}
+    peerDependencies:
+      react: '>=16.8'
+      react-dom: '>=16.8'
+    dependencies:
+      history: 5.3.0
+      react: 18.1.0
+      react-dom: 18.1.0(react@18.1.0)
+      react-router: 6.3.0(react@18.1.0)
+    dev: true
+
+  /react-router-dom@6.3.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==}
+    peerDependencies:
+      react: '>=16.8'
+      react-dom: '>=16.8'
+    dependencies:
+      history: 5.3.0
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      react-router: 6.3.0(react@18.2.0)
+    dev: true
+
+  /react-router-redux@5.0.0-alpha.9(react@18.2.0):
+    resolution: {integrity: sha512-euSgNIANnRXr4GydIuwA7RZCefrLQzIw5WdXspS8NPYbV+FxrKSS9MKG7U9vb6vsKHONnA4VxrVNWfnMUnUQAw==}
+    deprecated: This project is no longer maintained.
+    peerDependencies:
+      react: '>=15'
+    dependencies:
+      history: 4.10.1
+      prop-types: 15.8.1
+      react: 18.2.0
+      react-router: 4.3.1(react@18.2.0)
+    dev: true
+
+  /react-router@4.3.1(react@18.2.0):
+    resolution: {integrity: sha512-yrvL8AogDh2X42Dt9iknk4wF4V8bWREPirFfS9gLU1huk6qK41sg7Z/1S81jjTrGHxa3B8R3J6xIkDAA6CVarg==}
+    peerDependencies:
+      react: '>=15'
+    dependencies:
+      history: 4.10.1
+      hoist-non-react-statics: 2.5.5
+      invariant: 2.2.4
+      loose-envify: 1.4.0
+      path-to-regexp: 1.8.0
+      prop-types: 15.8.1
+      react: 18.2.0
+      warning: 4.0.3
+    dev: true
+
+  /react-router@6.11.2(react@18.2.0):
+    resolution: {integrity: sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg==}
+    engines: {node: '>=14'}
+    peerDependencies:
+      react: '>=16.8'
+    dependencies:
+      '@remix-run/router': 1.6.2
+      react: 18.2.0
+    dev: true
+
+  /react-router@6.3.0(react@18.1.0):
+    resolution: {integrity: sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==}
+    peerDependencies:
+      react: '>=16.8'
+    dependencies:
+      history: 5.3.0
+      react: 18.1.0
+    dev: true
+
+  /react-router@6.3.0(react@18.2.0):
+    resolution: {integrity: sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==}
+    peerDependencies:
+      react: '>=16.8'
+    dependencies:
+      history: 5.3.0
+      react: 18.2.0
+    dev: true
+
+  /react-sortable-hoc@2.0.0(prop-types@15.8.1)(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-JZUw7hBsAHXK7PTyErJyI7SopSBFRcFHDjWW5SWjcugY0i6iH7f+eJkY8cJmGMlZ1C9xz1J3Vjz0plFpavVeRg==}
+    peerDependencies:
+      prop-types: ^15.5.7
+      react: ^16.3.0 || ^17.0.0
+      react-dom: ^16.3.0 || ^17.0.0
+    dependencies:
+      '@babel/runtime': 7.22.3
+      invariant: 2.2.4
+      prop-types: 15.8.1
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+
+  /react-tween-state@0.1.5:
+    resolution: {integrity: sha512-sJQpjsdn0wjlDIUpfpb7jQGnOG8hAEW2e8k0KPA+xmf5KFa6Xat2JldbmxBhaqP0S/uIXhVE5ymKyH/b9X8nYA==}
+    dependencies:
+      raf: 3.4.1
+      tween-functions: 1.2.0
+    dev: true
+
+  /react@18.1.0:
+    resolution: {integrity: sha512-4oL8ivCz5ZEPyclFQXaNksK3adutVS8l2xzZU0cqEFrE9Sb7fC0EFK5uEk74wIreL1DERyjvsU915j1pcT2uEQ==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      loose-envify: 1.4.0
+    dev: true
+
+  /react@18.2.0:
+    resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      loose-envify: 1.4.0
+
+  /reactcss@1.2.3(react@18.2.0):
+    resolution: {integrity: sha512-KiwVUcFu1RErkI97ywr8nvx8dNOpT03rbnma0SSalTYjkrPYaEajR4a/MRt6DZ46K6arDRbWMNHF+xH7G7n/8A==}
+    peerDependencies:
+      react: '*'
+    dependencies:
+      lodash: 4.17.21
+      react: 18.2.0
+
+  /read-pkg-up@7.0.1:
+    resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
+    engines: {node: '>=8'}
+    dependencies:
+      find-up: 4.1.0
+      read-pkg: 5.2.0
+      type-fest: 0.8.1
+    dev: true
+
+  /read-pkg@5.2.0:
+    resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
+    engines: {node: '>=8'}
+    dependencies:
+      '@types/normalize-package-data': 2.4.1
+      normalize-package-data: 2.5.0
+      parse-json: 5.2.0
+      type-fest: 0.6.0
+    dev: true
+
+  /readable-stream@1.1.14:
+    resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==}
+    dependencies:
+      core-util-is: 1.0.3
+      inherits: 2.0.4
+      isarray: 0.0.1
+      string_decoder: 0.10.31
+    dev: true
+
+  /readable-stream@2.3.8:
+    resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+    dependencies:
+      core-util-is: 1.0.3
+      inherits: 2.0.4
+      isarray: 1.0.0
+      process-nextick-args: 2.0.1
+      safe-buffer: 5.1.2
+      string_decoder: 1.1.1
+      util-deprecate: 1.0.2
+    dev: true
+
+  /readable-stream@3.6.2:
+    resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+    engines: {node: '>= 6'}
+    dependencies:
+      inherits: 2.0.4
+      string_decoder: 1.3.0
+      util-deprecate: 1.0.2
+    dev: true
+
+  /readdirp@3.6.0:
+    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+    engines: {node: '>=8.10.0'}
+    dependencies:
+      picomatch: 2.3.1
+
+  /real-require@0.1.0:
+    resolution: {integrity: sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==}
+    engines: {node: '>= 12.13.0'}
+    dev: true
+
+  /recursive-readdir@2.2.3:
+    resolution: {integrity: sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==}
+    engines: {node: '>=6.0.0'}
+    dependencies:
+      minimatch: 3.1.2
+    dev: false
+
+  /redent@3.0.0:
+    resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
+    engines: {node: '>=8'}
+    dependencies:
+      indent-string: 4.0.0
+      strip-indent: 3.0.0
+    dev: true
+
+  /redux-saga@0.16.2:
+    resolution: {integrity: sha512-iIjKnRThI5sKPEASpUvySemjzwqwI13e3qP7oLub+FycCRDysLSAOwt958niZW6LhxfmS6Qm1BzbU70w/Koc4w==}
+    dev: true
+
+  /redux@3.7.2:
+    resolution: {integrity: sha512-pNqnf9q1hI5HHZRBkj3bAngGZW/JMCmexDlOxw4XagXY2o1327nHH54LoTjiPJ0gizoqPDRqWyX/00g0hD6w+A==}
+    dependencies:
+      lodash: 4.17.21
+      lodash-es: 4.17.21
+      loose-envify: 1.4.0
+      symbol-observable: 1.2.0
+    dev: true
+
+  /redux@4.2.1:
+    resolution: {integrity: sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==}
+    dependencies:
+      '@babel/runtime': 7.22.3
+    dev: true
+
+  /reflect.getprototypeof@1.0.3:
+    resolution: {integrity: sha512-TTAOZpkJ2YLxl7mVHWrNo3iDMEkYlva/kgFcXndqMgbo/AZUmmavEkdXV+hXtE4P8xdyEKRzalaFqZVuwIk/Nw==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.21.2
+      get-intrinsic: 1.2.1
+      globalthis: 1.0.3
+      which-builtin-type: 1.1.3
+    dev: true
+
+  /reftools@1.1.9:
+    resolution: {integrity: sha512-OVede/NQE13xBQ+ob5CKd5KyeJYU2YInb1bmV4nRoOfquZPkAkxuOXicSe1PvqIuZZ4kD13sPKBbR7UFDmli6w==}
+    dev: true
+
+  /regenerate-unicode-properties@10.1.0:
+    resolution: {integrity: sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==}
+    engines: {node: '>=4'}
+    dependencies:
+      regenerate: 1.4.2
+    dev: true
+
+  /regenerate@1.4.2:
+    resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
+    dev: true
+
+  /regenerator-runtime@0.11.1:
+    resolution: {integrity: sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==}
+    dev: true
+
+  /regenerator-runtime@0.13.11:
+    resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==}
+
+  /regenerator-transform@0.15.1:
+    resolution: {integrity: sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==}
+    dependencies:
+      '@babel/runtime': 7.22.3
+    dev: true
+
+  /regexp-tree@0.1.27:
+    resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==}
+    hasBin: true
+    dev: true
+
+  /regexp.prototype.flags@1.5.0:
+    resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      functions-have-names: 1.2.3
+    dev: true
+
+  /regexpp@3.2.0:
+    resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /regexpu-core@5.3.2:
+    resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==}
+    engines: {node: '>=4'}
+    dependencies:
+      '@babel/regjsgen': 0.8.0
+      regenerate: 1.4.2
+      regenerate-unicode-properties: 10.1.0
+      regjsparser: 0.9.1
+      unicode-match-property-ecmascript: 2.0.0
+      unicode-match-property-value-ecmascript: 2.1.0
+    dev: true
+
+  /regjsparser@0.9.1:
+    resolution: {integrity: sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==}
+    hasBin: true
+    dependencies:
+      jsesc: 0.5.0
+    dev: true
+
+  /relateurl@0.2.7:
+    resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==}
+    engines: {node: '>= 0.10'}
+    dev: true
+
+  /remark-parse@9.0.0:
+    resolution: {integrity: sha512-geKatMwSzEXKHuzBNU1z676sGcDcFoChMK38TgdHJNAYfFtsfHDQG7MoJAjs6sgYMqyLduCYWDIWZIxiPeafEw==}
+    dependencies:
+      mdast-util-from-markdown: 0.8.5
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /remark-stringify@9.0.1:
+    resolution: {integrity: sha512-mWmNg3ZtESvZS8fv5PTvaPckdL4iNlCHTt8/e/8oN08nArHRHjNZMKzA/YW3+p7/lYqIw4nx1XsjCBo/AxNChg==}
+    dependencies:
+      mdast-util-to-markdown: 0.6.5
+    dev: true
+
+  /remark@13.0.0:
+    resolution: {integrity: sha512-HDz1+IKGtOyWN+QgBiAT0kn+2s6ovOxHyPAFGKVE81VSzJ+mq7RwHFledEvB5F1p4iJvOah/LOKdFuzvRnNLCA==}
+    dependencies:
+      remark-parse: 9.0.0
+      remark-stringify: 9.0.1
+      unified: 9.2.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /remove-accents@0.4.2:
+    resolution: {integrity: sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==}
+    dev: true
+
+  /renderkid@3.0.0:
+    resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==}
+    dependencies:
+      css-select: 4.3.0
+      dom-converter: 0.2.0
+      htmlparser2: 6.1.0
+      lodash: 4.17.21
+      strip-ansi: 6.0.1
+    dev: true
+
+  /repeat-string@1.6.1:
+    resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==}
+    engines: {node: '>=0.10'}
+    dev: true
+
+  /request@2.88.2:
+    resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==}
+    engines: {node: '>= 6'}
+    deprecated: request has been deprecated, see https://github.com/request/request/issues/3142
+    dependencies:
+      aws-sign2: 0.7.0
+      aws4: 1.12.0
+      caseless: 0.12.0
+      combined-stream: 1.0.8
+      extend: 3.0.2
+      forever-agent: 0.6.1
+      form-data: 2.3.3
+      har-validator: 5.1.5
+      http-signature: 1.2.0
+      is-typedarray: 1.0.0
+      isstream: 0.1.2
+      json-stringify-safe: 5.0.1
+      mime-types: 2.1.35
+      oauth-sign: 0.9.0
+      performance-now: 2.1.0
+      qs: 6.5.3
+      safe-buffer: 5.2.1
+      tough-cookie: 2.5.0
+      tunnel-agent: 0.6.0
+      uuid: 3.4.0
+    dev: true
+
+  /require-directory@2.1.1:
+    resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /require-from-string@2.0.2:
+    resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /requires-port@1.0.0:
+    resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
+    dev: true
+
+  /reserved-words@0.1.2:
+    resolution: {integrity: sha512-0S5SrIUJ9LfpbVl4Yzij6VipUdafHrOTzvmfazSw/jeZrZtQK303OPZW+obtkaw7jQlTQppy0UvZWm9872PbRw==}
+    dev: true
+
+  /resize-observer-polyfill@1.5.1:
+    resolution: {integrity: sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==}
+
+  /resolve-cwd@3.0.0:
+    resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
+    engines: {node: '>=8'}
+    dependencies:
+      resolve-from: 5.0.0
+    dev: true
+
+  /resolve-from@4.0.0:
+    resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+    engines: {node: '>=4'}
+
+  /resolve-from@5.0.0:
+    resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /resolve-pathname@3.0.0:
+    resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==}
+    dev: true
+
+  /resolve.exports@2.0.2:
+    resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /resolve@1.22.2:
+    resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==}
+    hasBin: true
+    dependencies:
+      is-core-module: 2.12.1
+      path-parse: 1.0.7
+      supports-preserve-symlinks-flag: 1.0.0
+
+  /resolve@2.0.0-next.4:
+    resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==}
+    hasBin: true
+    dependencies:
+      is-core-module: 2.12.1
+      path-parse: 1.0.7
+      supports-preserve-symlinks-flag: 1.0.0
+    dev: true
+
+  /restore-cursor@3.1.0:
+    resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+    engines: {node: '>=8'}
+    dependencies:
+      onetime: 5.1.2
+      signal-exit: 3.0.7
+    dev: true
+
+  /reusify@1.0.4:
+    resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+  /rfdc@1.3.0:
+    resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==}
+    dev: true
+
+  /rimraf@2.7.1:
+    resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==}
+    hasBin: true
+    dependencies:
+      glob: 7.2.3
+    dev: true
+
+  /rimraf@3.0.2:
+    resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+    hasBin: true
+    dependencies:
+      glob: 7.2.3
+
+  /rimraf@4.4.1:
+    resolution: {integrity: sha512-Gk8NlF062+T9CqNGn6h4tls3k6T1+/nXdOcSZVikNVtlRdYpA7wRJJMoXmuvOnLW844rPjdQ7JgXCYM6PPC/og==}
+    engines: {node: '>=14'}
+    hasBin: true
+    dependencies:
+      glob: 9.3.5
+    dev: true
+
+  /ripemd160@2.0.2:
+    resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
+    dependencies:
+      hash-base: 3.1.0
+      inherits: 2.0.4
+    dev: true
+
+  /rmc-align@1.0.0:
+    resolution: {integrity: sha512-3gEa5/+hqqoEVoeQ25KoRc8DOsXIdSaVpaBq1zQFaV941LR3xvZIRTlxTDT/IagYwoGM1KZea/jd7cNMYP34Rg==}
+    dependencies:
+      babel-runtime: 6.26.0
+      dom-align: 1.12.4
+      rc-util: 4.21.1
+    dev: true
+
+  /rmc-calendar@1.1.4(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-xxQZaPFDnpHt4IFO8mukYrXSgC1W8LcNVp+EoX4iyeOJFimungOKB/iP5/cy+st8yXq8lUgk9TXsHNtM6Xo6ZA==}
+    dependencies:
+      babel-runtime: 6.26.0
+      rc-animate: 2.11.1(react-dom@18.2.0)(react@18.2.0)
+      rmc-date-picker: 6.0.10(react-dom@18.2.0)(react@18.2.0)
+    transitivePeerDependencies:
+      - react
+      - react-dom
+    dev: true
+
+  /rmc-cascader@5.0.3(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-PxDhMjWViDdG4SMZqoXtAthGwgDyYnyxxZEE17IDDYsiCHpWtOhoIL8nsI+/hZ212UT/XF2LpqCsOlMoJiYk+w==}
+    dependencies:
+      array-tree-filter: 2.1.0
+      babel-runtime: 6.26.0
+      rmc-picker: 5.0.10(react-dom@18.2.0)(react@18.2.0)
+    transitivePeerDependencies:
+      - react
+      - react-dom
+    dev: true
+
+  /rmc-date-picker@6.0.10(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-/9+I6lm3EDEl6M7862V6++zFuxwsM0UEq8wSHbotYIPPmyB/65gx1cviblghOv2QfB0O9+U2w3qEJlRP/WsMrA==}
+    dependencies:
+      babel-runtime: 6.26.0
+      rmc-picker: 5.0.10(react-dom@18.2.0)(react@18.2.0)
+    transitivePeerDependencies:
+      - react
+      - react-dom
+    dev: true
+
+  /rmc-dialog@1.1.1(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-28aJqtPTX6v13Z/aU1WBy1AFIXkE74PxZXde7JvtEIy9hQDTjH8fqOi822BpzAbXCyNE7jF9iFomy3H2ClsDJA==}
+    dependencies:
+      babel-runtime: 6.26.0
+      rc-animate: 2.11.1(react-dom@18.2.0)(react@18.2.0)
+    transitivePeerDependencies:
+      - react
+      - react-dom
+    dev: true
+
+  /rmc-drawer@0.4.11:
+    resolution: {integrity: sha512-YfB9XEJ8iM0MMuLWAK4313uOxSM8NAljC8Cqun1KamXutglYTuRviUuTLNSOzV8HHPp5kNpsVduvPCGLWXvThw==}
+    engines: {node: '>=4.0.0'}
+    dependencies:
+      babel-runtime: 6.26.0
+      classnames: 2.3.2
+      prop-types: 15.8.1
+    dev: true
+
+  /rmc-feedback@2.0.0:
+    resolution: {integrity: sha512-5PWOGOW7VXks/l3JzlOU9NIxRpuaSS8d9zA3UULUCuTKnpwBHNvv1jSJzxgbbCQeYzROWUpgKI4za3X4C/mKmQ==}
+    dependencies:
+      babel-runtime: 6.26.0
+      classnames: 2.3.2
+    dev: true
+
+  /rmc-input-number@1.0.5:
+    resolution: {integrity: sha512-prPkEtoOVde77GnEnEaBeWjBobMOPgGqU5bd0gxfp1kt1pUN740mMpVAcH7uxpJjVfmw+kuGWtiz4S7CueagSg==}
+    dependencies:
+      babel-runtime: 6.26.0
+      classnames: 2.3.2
+      rmc-feedback: 2.0.0
+    dev: true
+
+  /rmc-list-view@0.11.5:
+    resolution: {integrity: sha512-eMOC5394tLNawcdEEhF7boMpQgpjJGDdL5lS+LblAWdBec7Q4EYkUdnrKNbt+O9k5RGM6nSLAGZK5oB4FN85Lg==}
+    dependencies:
+      babel-runtime: 6.26.0
+      classnames: 2.3.2
+      fbjs: 0.8.18
+      prop-types: 15.8.1
+      warning: 3.0.0
+      zscroller: 0.4.8
+    dev: true
+
+  /rmc-notification@1.0.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-9sPxjltFvtRLt2v312Hu7OXwk53pHkBYgINRDmnJ3A5NF1qtJeCCcdN0Xr0fzJ6sbQvtGju822tWHdzYA9u7Vw==}
+    dependencies:
+      babel-runtime: 6.26.0
+      classnames: 2.3.2
+      prop-types: 15.8.1
+      rc-animate: 2.11.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 4.21.1
+    transitivePeerDependencies:
+      - react
+      - react-dom
+    dev: true
+
+  /rmc-nuka-carousel@3.0.1:
+    resolution: {integrity: sha512-w2EPTERMUUZqcUSKFuejjin7xsMlhrLrtS0A/igTXpFJGq3kemDKcRi7q3pSYDuZBHYBl5iV4UqsLLkjdFtrYA==}
+    dependencies:
+      exenv: 1.2.2
+      raf: 3.4.1
+    dev: true
+
+  /rmc-picker@5.0.10(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-KZ70+WjcaZHnG5GyCxWCPFWAZ12s6NqyrbW73LeqH0WEqaTMMs0sOrk2f4mQAZ/CGT0XcFN6VZLw7Ozoxfn7LA==}
+    dependencies:
+      babel-runtime: 6.26.0
+      classnames: 2.3.2
+      rmc-dialog: 1.1.1(react-dom@18.2.0)(react@18.2.0)
+      rmc-feedback: 2.0.0
+    transitivePeerDependencies:
+      - react
+      - react-dom
+    dev: true
+
+  /rmc-pull-to-refresh@1.0.13:
+    resolution: {integrity: sha512-iYLsURiR7G/sKmRA6p2kq6ZXicn7Hyeo6VQFljssV1eMW+fzDgihhaz0kv5mza0f88vphGJvjOihT9E6+xGb6Q==}
+    dependencies:
+      babel-runtime: 6.26.0
+      classnames: 2.3.2
+    dev: true
+
+  /rmc-steps@1.0.1:
+    resolution: {integrity: sha512-8ijtwp4D1CYTtI2yerXJYqCv+GQbiBc9T12nrFngd/vM0y+58CnznGphTAueF6IWf7qbxBwcjTrcFgg7bP2YGA==}
+    dependencies:
+      babel-runtime: 6.26.0
+      classnames: 2.3.2
+    dev: true
+
+  /rmc-tabs@1.2.29:
+    resolution: {integrity: sha512-wiJS9WSJi9JH9GQO+FqncX+zaHP31qHa/S8nDW9UXUx0qbCX294QcJEnvfB+WmsfUws7rXjs6sOQp5EDiObnHg==}
+    dependencies:
+      babel-runtime: 6.26.0
+      rc-gesture: 0.0.22
+    dev: true
+
+  /rmc-tooltip@1.0.1(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-fSDArf2BlMVrHExmBiqb2TkCRJHshvXFJQ/7tMraLellwaJLNiwrxtWpW329k3S+zTtoVG8UxFS1TjBGEsMzRg==}
+    dependencies:
+      babel-runtime: 6.26.0
+      rmc-trigger: 1.0.12(react-dom@18.2.0)(react@18.2.0)
+    transitivePeerDependencies:
+      - react
+      - react-dom
+    dev: true
+
+  /rmc-trigger@1.0.12(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-AccQniX7PX7Pm8hBhHEsnf3JU6CA61Xc7fAt2WbO+oXrGaI/jqN8C3COhhOXG54S5iTOjLS26j858zshwAxR9A==}
+    dependencies:
+      babel-runtime: 6.26.0
+      rc-animate: 2.11.1(react-dom@18.2.0)(react@18.2.0)
+      rc-util: 4.21.1
+      rmc-align: 1.0.0
+    transitivePeerDependencies:
+      - react
+      - react-dom
+    dev: true
+
+  /rollup-plugin-visualizer@5.9.0:
+    resolution: {integrity: sha512-bbDOv47+Bw4C/cgs0czZqfm8L82xOZssk4ayZjG40y9zbXclNk7YikrZTDao6p7+HDiGxrN0b65SgZiVm9k1Cg==}
+    engines: {node: '>=14'}
+    hasBin: true
+    peerDependencies:
+      rollup: 2.x || 3.x
+    peerDependenciesMeta:
+      rollup:
+        optional: true
+    dependencies:
+      open: 8.4.2
+      picomatch: 2.3.1
+      source-map: 0.7.4
+      yargs: 17.7.2
+    dev: true
+
+  /rollup@3.23.0:
+    resolution: {integrity: sha512-h31UlwEi7FHihLe1zbk+3Q7z1k/84rb9BSwmBSr/XjOCEaBJ2YyedQDuM0t/kfOS0IxM+vk1/zI9XxYj9V+NJQ==}
+    engines: {node: '>=14.18.0', npm: '>=8.0.0'}
+    hasBin: true
+    optionalDependencies:
+      fsevents: 2.3.2
+    dev: true
+
+  /run-applescript@5.0.0:
+    resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==}
+    engines: {node: '>=12'}
+    dependencies:
+      execa: 5.1.1
+    dev: true
+
+  /run-parallel@1.2.0:
+    resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+    dependencies:
+      queue-microtask: 1.2.3
+
+  /rxjs@7.8.1:
+    resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+    dependencies:
+      tslib: 2.5.2
+    dev: true
+
+  /safe-buffer@5.1.2:
+    resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
+    dev: true
+
+  /safe-buffer@5.2.1:
+    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
+
+  /safe-regex-test@1.0.0:
+    resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==}
+    dependencies:
+      call-bind: 1.0.2
+      get-intrinsic: 1.2.1
+      is-regex: 1.1.4
+    dev: true
+
+  /safe-regex@2.1.1:
+    resolution: {integrity: sha512-rx+x8AMzKb5Q5lQ95Zoi6ZbJqwCLkqi3XuJXp5P3rT8OEc6sZCJG5AE5dU3lsgRr/F4Bs31jSlVN+j5KrsGu9A==}
+    dependencies:
+      regexp-tree: 0.1.27
+    dev: true
+
+  /safe-stable-stringify@2.4.3:
+    resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /safer-buffer@2.1.2:
+    resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+    dev: true
+
+  /sax@1.2.4:
+    resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
+    dev: true
+    optional: true
+
+  /saxes@6.0.0:
+    resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
+    engines: {node: '>=v12.22.7'}
+    dependencies:
+      xmlchars: 2.2.0
+    dev: true
+
+  /scheduler@0.22.0:
+    resolution: {integrity: sha512-6QAm1BgQI88NPYymgGQLCZgvep4FyePDWFpXVK+zNSUgHwlqpJy8VEh8Et0KxTACS4VWwMousBElAZOH9nkkoQ==}
+    dependencies:
+      loose-envify: 1.4.0
+    dev: true
+
+  /scheduler@0.23.0:
+    resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
+    dependencies:
+      loose-envify: 1.4.0
+
+  /schema-utils@2.7.0:
+    resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==}
+    engines: {node: '>= 8.9.0'}
+    dependencies:
+      '@types/json-schema': 7.0.12
+      ajv: 6.12.6
+      ajv-keywords: 3.5.2(ajv@6.12.6)
+    dev: false
+
+  /schema-utils@3.1.2:
+    resolution: {integrity: sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==}
+    engines: {node: '>= 10.13.0'}
+    dependencies:
+      '@types/json-schema': 7.0.12
+      ajv: 6.12.6
+      ajv-keywords: 3.5.2(ajv@6.12.6)
+
+  /screenfull@5.2.0:
+    resolution: {integrity: sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /scroll-into-view-if-needed@2.2.31:
+    resolution: {integrity: sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==}
+    dependencies:
+      compute-scroll-into-view: 1.0.20
+    dev: true
+
+  /scroll-into-view-if-needed@3.0.10:
+    resolution: {integrity: sha512-t44QCeDKAPf1mtQH3fYpWz8IM/DyvHLjs8wUvvwMYxk5moOqCzrMSxK6HQVD0QVmVjXFavoFIPRVrMuJPKAvtg==}
+    dependencies:
+      compute-scroll-into-view: 3.0.3
+
+  /select-hose@2.0.0:
+    resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==}
+    dev: true
+
+  /semver-compare@1.0.0:
+    resolution: {integrity: sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==}
+    dev: true
+
+  /semver@5.7.1:
+    resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
+    hasBin: true
+    dev: true
+
+  /semver@6.3.0:
+    resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
+    hasBin: true
+
+  /semver@7.3.5:
+    resolution: {integrity: sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==}
+    engines: {node: '>=10'}
+    hasBin: true
+    dependencies:
+      lru-cache: 6.0.0
+    dev: true
+
+  /semver@7.5.1:
+    resolution: {integrity: sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==}
+    engines: {node: '>=10'}
+    hasBin: true
+    dependencies:
+      lru-cache: 6.0.0
+
+  /send@0.18.0:
+    resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
+    engines: {node: '>= 0.8.0'}
+    dependencies:
+      debug: 2.6.9
+      depd: 2.0.0
+      destroy: 1.2.0
+      encodeurl: 1.0.2
+      escape-html: 1.0.3
+      etag: 1.8.1
+      fresh: 0.5.2
+      http-errors: 2.0.0
+      mime: 1.6.0
+      ms: 2.1.3
+      on-finished: 2.4.1
+      range-parser: 1.2.1
+      statuses: 2.0.1
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /serialize-javascript@6.0.1:
+    resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==}
+    dependencies:
+      randombytes: 2.1.0
+
+  /serve-static@1.15.0:
+    resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
+    engines: {node: '>= 0.8.0'}
+    dependencies:
+      encodeurl: 1.0.2
+      escape-html: 1.0.3
+      parseurl: 1.3.3
+      send: 0.18.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /setimmediate@1.0.5:
+    resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
+    dev: true
+
+  /setprototypeof@1.2.0:
+    resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
+    dev: true
+
+  /sha.js@2.4.11:
+    resolution: {integrity: sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==}
+    hasBin: true
+    dependencies:
+      inherits: 2.0.4
+      safe-buffer: 5.2.1
+    dev: true
+
+  /shallow-equal@1.2.1:
+    resolution: {integrity: sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==}
+    dev: true
+
+  /shallowequal@1.1.0:
+    resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
+
+  /shebang-command@2.0.0:
+    resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+    engines: {node: '>=8'}
+    dependencies:
+      shebang-regex: 3.0.0
+
+  /shebang-regex@3.0.0:
+    resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+    engines: {node: '>=8'}
+
+  /shell-quote@1.8.1:
+    resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==}
+    dev: false
+
+  /should-equal@2.0.0:
+    resolution: {integrity: sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==}
+    dependencies:
+      should-type: 1.4.0
+    dev: true
+
+  /should-format@3.0.3:
+    resolution: {integrity: sha512-hZ58adtulAk0gKtua7QxevgUaXTTXxIi8t41L3zo9AHvjXO1/7sdLECuHeIN2SRtYXpNkmhoUP2pdeWgricQ+Q==}
+    dependencies:
+      should-type: 1.4.0
+      should-type-adaptors: 1.1.0
+    dev: true
+
+  /should-type-adaptors@1.1.0:
+    resolution: {integrity: sha512-JA4hdoLnN+kebEp2Vs8eBe9g7uy0zbRo+RMcU0EsNy+R+k049Ki+N5tT5Jagst2g7EAja+euFuoXFCa8vIklfA==}
+    dependencies:
+      should-type: 1.4.0
+      should-util: 1.0.1
+    dev: true
+
+  /should-type@1.4.0:
+    resolution: {integrity: sha512-MdAsTu3n25yDbIe1NeN69G4n6mUnJGtSJHygX3+oN0ZbO3DTiATnf7XnYJdGT42JCXurTb1JI0qOBR65shvhPQ==}
+    dev: true
+
+  /should-util@1.0.1:
+    resolution: {integrity: sha512-oXF8tfxx5cDk8r2kYqlkUJzZpDBqVY/II2WhvU0n9Y3XYvAYRmeaf1PvvIvTgPnv4KJ+ES5M0PyDq5Jp+Ygy2g==}
+    dev: true
+
+  /should@13.2.3:
+    resolution: {integrity: sha512-ggLesLtu2xp+ZxI+ysJTmNjh2U0TsC+rQ/pfED9bUZZ4DKefP27D+7YJVVTvKsmjLpIi9jAa7itwDGkDDmt1GQ==}
+    dependencies:
+      should-equal: 2.0.0
+      should-format: 3.0.3
+      should-type: 1.4.0
+      should-type-adaptors: 1.1.0
+      should-util: 1.0.1
+    dev: true
+
+  /side-channel@1.0.4:
+    resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
+    dependencies:
+      call-bind: 1.0.2
+      get-intrinsic: 1.2.1
+      object-inspect: 1.12.3
+    dev: true
+
+  /signal-exit@3.0.7:
+    resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
+    dev: true
+
+  /single-spa@5.9.4:
+    resolution: {integrity: sha512-QkEoh0AzGuU82qnbUUk0ydF78QbU5wMKqKKJn7uUQfBiOYlRQEfIOpLM4m23Sab+kTOLI1kbYhYeiQ7fX5KVVw==}
+    dev: true
+
+  /sisteransi@1.0.5:
+    resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
+  /slash2@2.0.0:
+    resolution: {integrity: sha512-7ElvBydJPi3MHU/KEOblFSbO/skl4Z69jKkFCpYIYVOMSIZsKi4gYU43HGeZPmjxCXrHekoDAAewphPQNnsqtA==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /slash@2.0.0:
+    resolution: {integrity: sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /slash@3.0.0:
+    resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+    engines: {node: '>=8'}
+
+  /slash@4.0.0:
+    resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /slice-ansi@3.0.0:
+    resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==}
+    engines: {node: '>=8'}
+    dependencies:
+      ansi-styles: 4.3.0
+      astral-regex: 2.0.0
+      is-fullwidth-code-point: 3.0.0
+    dev: true
+
+  /slice-ansi@4.0.0:
+    resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      ansi-styles: 4.3.0
+      astral-regex: 2.0.0
+      is-fullwidth-code-point: 3.0.0
+    dev: true
+
+  /sonic-boom@2.8.0:
+    resolution: {integrity: sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==}
+    dependencies:
+      atomic-sleep: 1.0.0
+    dev: true
+
+  /sort-object-keys@1.1.3:
+    resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==}
+    dev: true
+
+  /sort-package-json@1.57.0:
+    resolution: {integrity: sha512-FYsjYn2dHTRb41wqnv+uEqCUvBpK3jZcTp9rbz2qDTmel7Pmdtf+i2rLaaPMRZeSVM60V3Se31GyWFpmKs4Q5Q==}
+    hasBin: true
+    dependencies:
+      detect-indent: 6.1.0
+      detect-newline: 3.1.0
+      git-hooks-list: 1.0.3
+      globby: 10.0.0
+      is-plain-obj: 2.1.0
+      sort-object-keys: 1.1.3
+    dev: true
+
+  /sort-package-json@2.4.1:
+    resolution: {integrity: sha512-Nd3rgLBJcZ4iw7tpuOhwBupG6SvUDU0Fy1cZGAMorA2JmDUb+29Dg5phJK9gapa2Ak9d15w/RuMl/viwX+nKwQ==}
+    hasBin: true
+    dependencies:
+      detect-indent: 7.0.1
+      detect-newline: 4.0.0
+      git-hooks-list: 3.1.0
+      globby: 13.1.4
+      is-plain-obj: 4.1.0
+      sort-object-keys: 1.1.3
+    dev: true
+
+  /source-map-js@1.0.2:
+    resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /source-map-support@0.5.13:
+    resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
+    dependencies:
+      buffer-from: 1.1.2
+      source-map: 0.6.1
+    dev: true
+
+  /source-map-support@0.5.21:
+    resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
+    dependencies:
+      buffer-from: 1.1.2
+      source-map: 0.6.1
+
+  /source-map@0.5.7:
+    resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
+    engines: {node: '>=0.10.0'}
+    dev: false
+
+  /source-map@0.6.1:
+    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+    engines: {node: '>=0.10.0'}
+
+  /source-map@0.7.4:
+    resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
+    engines: {node: '>= 8'}
+    dev: true
+
+  /spdx-correct@3.2.0:
+    resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
+    dependencies:
+      spdx-expression-parse: 3.0.1
+      spdx-license-ids: 3.0.13
+    dev: true
+
+  /spdx-exceptions@2.3.0:
+    resolution: {integrity: sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==}
+    dev: true
+
+  /spdx-expression-parse@3.0.1:
+    resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+    dependencies:
+      spdx-exceptions: 2.3.0
+      spdx-license-ids: 3.0.13
+    dev: true
+
+  /spdx-license-ids@3.0.13:
+    resolution: {integrity: sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==}
+    dev: true
+
+  /spdy-transport@3.0.0:
+    resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==}
+    dependencies:
+      debug: 4.3.4(supports-color@5.5.0)
+      detect-node: 2.1.0
+      hpack.js: 2.1.6
+      obuf: 1.1.2
+      readable-stream: 3.6.2
+      wbuf: 1.7.3
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /spdy@4.0.2:
+    resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==}
+    engines: {node: '>=6.0.0'}
+    dependencies:
+      debug: 4.3.4(supports-color@5.5.0)
+      handle-thing: 2.0.1
+      http-deceiver: 1.2.7
+      select-hose: 2.0.0
+      spdy-transport: 3.0.0
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /specificity@0.4.1:
+    resolution: {integrity: sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==}
+    hasBin: true
+    dev: true
+
+  /split-on-first@1.1.0:
+    resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /split2@4.2.0:
+    resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+    engines: {node: '>= 10.x'}
+    dev: true
+
+  /sprintf-js@1.0.3:
+    resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+    dev: true
+
+  /sshpk@1.17.0:
+    resolution: {integrity: sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==}
+    engines: {node: '>=0.10.0'}
+    hasBin: true
+    dependencies:
+      asn1: 0.2.6
+      assert-plus: 1.0.0
+      bcrypt-pbkdf: 1.0.2
+      dashdash: 1.14.1
+      ecc-jsbn: 0.1.2
+      getpass: 0.1.7
+      jsbn: 0.1.1
+      safer-buffer: 2.1.2
+      tweetnacl: 0.14.5
+    dev: true
+
+  /stable@0.1.8:
+    resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==}
+    deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
+    dev: true
+
+  /stack-utils@2.0.6:
+    resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      escape-string-regexp: 2.0.0
+    dev: true
+
+  /stackframe@1.3.4:
+    resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==}
+    dev: true
+
+  /statuses@2.0.1:
+    resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
+    engines: {node: '>= 0.8'}
+    dev: true
+
+  /stop-iteration-iterator@1.0.0:
+    resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      internal-slot: 1.0.5
+    dev: true
+
+  /stream-browserify@2.0.2:
+    resolution: {integrity: sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==}
+    dependencies:
+      inherits: 2.0.4
+      readable-stream: 2.3.8
+    dev: true
+
+  /stream-buffers@1.0.1:
+    resolution: {integrity: sha512-t+8bSU8qPq7NnWHWAvikjcZf+biErLZzD15RroYft1IKQwYbkRyiwppT7kNqwdtYLS59YPxc4sTSvwbLSMaodw==}
+    engines: {node: '>= 0.3.0'}
+    dev: true
+
+  /stream-http@2.8.3:
+    resolution: {integrity: sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==}
+    dependencies:
+      builtin-status-codes: 3.0.0
+      inherits: 2.0.4
+      readable-stream: 2.3.8
+      to-arraybuffer: 1.0.1
+      xtend: 4.0.2
+    dev: true
+
+  /stream-shift@1.0.1:
+    resolution: {integrity: sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==}
+    dev: true
+
+  /streamroller@0.4.1:
+    resolution: {integrity: sha512-w0GGkMlWOiIBIYTmOWHTWKy9Y5hKxGKpQ5WpiHqwhvoSoMHXNTITrk6ZsR3fdgz3Bi/c+CXVHwmfPUQFkEPL+A==}
+    engines: {node: '>=0.12.0'}
+    deprecated: 0.x is no longer supported. Please upgrade to 3.x or higher.
+    dependencies:
+      date-format: 0.0.0
+      debug: 0.7.4
+      mkdirp: 0.5.6
+      readable-stream: 1.1.14
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /strict-uri-encode@2.0.0:
+    resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /string-argv@0.3.1:
+    resolution: {integrity: sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==}
+    engines: {node: '>=0.6.19'}
+    dev: true
+
+  /string-convert@0.2.1:
+    resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==}
+
+  /string-length@4.0.2:
+    resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      char-regex: 1.0.2
+      strip-ansi: 6.0.1
+    dev: true
+
+  /string-width@4.2.3:
+    resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+    engines: {node: '>=8'}
+    dependencies:
+      emoji-regex: 8.0.0
+      is-fullwidth-code-point: 3.0.0
+      strip-ansi: 6.0.1
+    dev: true
+
+  /string.prototype.matchall@4.0.8:
+    resolution: {integrity: sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.21.2
+      get-intrinsic: 1.2.1
+      has-symbols: 1.0.3
+      internal-slot: 1.0.5
+      regexp.prototype.flags: 1.5.0
+      side-channel: 1.0.4
+    dev: true
+
+  /string.prototype.trim@1.2.7:
+    resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.21.2
+    dev: true
+
+  /string.prototype.trimend@1.0.6:
+    resolution: {integrity: sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.21.2
+    dev: true
+
+  /string.prototype.trimstart@1.0.6:
+    resolution: {integrity: sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==}
+    dependencies:
+      call-bind: 1.0.2
+      define-properties: 1.2.0
+      es-abstract: 1.21.2
+    dev: true
+
+  /string_decoder@0.10.31:
+    resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==}
+    dev: true
+
+  /string_decoder@1.1.1:
+    resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+    dependencies:
+      safe-buffer: 5.1.2
+    dev: true
+
+  /string_decoder@1.3.0:
+    resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+    dependencies:
+      safe-buffer: 5.2.1
+    dev: true
+
+  /stringify-object@3.3.0:
+    resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==}
+    engines: {node: '>=4'}
+    dependencies:
+      get-own-enumerable-property-symbols: 3.0.2
+      is-obj: 1.0.1
+      is-regexp: 1.0.0
+    dev: true
+
+  /strip-ansi@6.0.1:
+    resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+    engines: {node: '>=8'}
+    dependencies:
+      ansi-regex: 5.0.1
+
+  /strip-bom@4.0.0:
+    resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /strip-final-newline@2.0.0:
+    resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /strip-final-newline@3.0.0:
+    resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /strip-indent@3.0.0:
+    resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+    engines: {node: '>=8'}
+    dependencies:
+      min-indent: 1.0.1
+    dev: true
+
+  /strip-json-comments@3.1.1:
+    resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+    engines: {node: '>=8'}
+
+  /strip-outer@1.0.1:
+    resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      escape-string-regexp: 1.0.5
+    dev: true
+
+  /style-search@0.1.0:
+    resolution: {integrity: sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==}
+    dev: true
+
+  /styled-components@5.3.11(react-dom@18.2.0)(react-is@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-uuzIIfnVkagcVHv9nE0VPlHPSCmXIUGKfJ42LNjxCCTDTL5sgnJ8Z7GZBq0EnLYGln77tPpEpExt2+qa+cZqSw==}
+    engines: {node: '>=10'}
+    peerDependencies:
+      react: '>= 16.8.0'
+      react-dom: '>= 16.8.0'
+      react-is: '>= 16.8.0'
+    dependencies:
+      '@babel/helper-module-imports': 7.21.4
+      '@babel/traverse': 7.22.1(supports-color@5.5.0)
+      '@emotion/is-prop-valid': 1.2.1
+      '@emotion/stylis': 0.8.5
+      '@emotion/unitless': 0.7.5
+      babel-plugin-styled-components: 2.1.3(styled-components@5.3.11)
+      css-to-react-native: 3.2.0
+      hoist-non-react-statics: 3.3.2
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      react-is: 18.2.0
+      shallowequal: 1.1.0
+      supports-color: 5.5.0
+    dev: true
+
+  /styled-components@6.0.0-beta.9(react-dom@18.2.0)(react@18.2.0)(tslib@2.5.2):
+    resolution: {integrity: sha512-RYtmvWZForwSd24aZgi3iGZM/6HvJkP7zobHK+bwC01vI6QhHK5MX9ayXEnJWaFY7DoEWoAnar5ACiGVkTCoCQ==}
+    engines: {node: '>= 14'}
+    peerDependencies:
+      babel-plugin-styled-components: '>= 2'
+      react: '>= 16.8.0'
+      react-dom: '>= 16.8.0'
+      shallowequal: '>= 1'
+      stylis: ^4.0.0
+      tslib: ^2.0.0
+    peerDependenciesMeta:
+      babel-plugin-styled-components:
+        optional: true
+      shallowequal:
+        optional: true
+      stylis:
+        optional: true
+      tslib:
+        optional: true
+    dependencies:
+      '@babel/cli': 7.21.5(@babel/core@7.22.1)
+      '@babel/core': 7.22.1
+      '@babel/helper-module-imports': 7.21.4
+      '@babel/plugin-external-helpers': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.1)
+      '@babel/preset-env': 7.22.2(@babel/core@7.22.1)
+      '@babel/preset-react': 7.22.3(@babel/core@7.22.1)
+      '@babel/preset-typescript': 7.21.5(@babel/core@7.22.1)
+      '@babel/traverse': 7.22.1(supports-color@5.5.0)
+      '@emotion/unitless': 0.8.1
+      css-to-react-native: 3.2.0
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      tslib: 2.5.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /styled-components@6.0.0-rc.0(react-dom@18.2.0)(react@18.2.0):
+    resolution: {integrity: sha512-3+Lnu1NC5JuieYi8dV/nhmlK7/yzqZW43u4P7WgIJfu5Dq5AiPU3t4efu0nWLmlMEmWrSXdrinxfbDnqnpP6hg==}
+    engines: {node: '>= 14'}
+    peerDependencies:
+      babel-plugin-styled-components: '>= 2'
+      react: '>= 16.8.0'
+      react-dom: '>= 16.8.0'
+    peerDependenciesMeta:
+      babel-plugin-styled-components:
+        optional: true
+    dependencies:
+      '@babel/cli': 7.21.5(@babel/core@7.22.1)
+      '@babel/core': 7.22.1
+      '@babel/helper-module-imports': 7.21.4
+      '@babel/plugin-external-helpers': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.22.1)
+      '@babel/plugin-proposal-object-rest-spread': 7.20.7(@babel/core@7.22.1)
+      '@babel/preset-env': 7.22.2(@babel/core@7.22.1)
+      '@babel/preset-react': 7.22.3(@babel/core@7.22.1)
+      '@babel/preset-typescript': 7.21.5(@babel/core@7.22.1)
+      '@babel/traverse': 7.22.1(supports-color@5.5.0)
+      '@emotion/unitless': 0.8.1
+      css-to-react-native: 3.2.0
+      react: 18.2.0
+      react-dom: 18.2.0(react@18.2.0)
+      shallowequal: 1.1.0
+      stylis: 4.2.0
+      tslib: 2.5.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /stylelint-config-css-modules@2.3.0(stylelint@13.13.1):
+    resolution: {integrity: sha512-nSxwaJMv9wBrTAi+O4qXubyi1AR9eB36tJpY0uaFhKgEc3fwWGUzUK1Edl8AQHAoU7wmUeKtsuYjblyRP/V7rw==}
+    peerDependencies:
+      stylelint: 11.x - 14.x
+    dependencies:
+      stylelint: 13.13.1
+    dev: true
+
+  /stylelint-config-prettier@8.0.2(stylelint@13.13.1):
+    resolution: {integrity: sha512-TN1l93iVTXpF9NJstlvP7nOu9zY2k+mN0NSFQ/VEGz15ZIP9ohdDZTtCWHs5LjctAhSAzaILULGbgiM0ItId3A==}
+    engines: {node: '>= 10', npm: '>= 5'}
+    hasBin: true
+    peerDependencies:
+      stylelint: '>=11.0.0'
+    dependencies:
+      stylelint: 13.13.1
+    dev: true
+
+  /stylelint-config-recommended@3.0.0(stylelint@13.13.1):
+    resolution: {integrity: sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==}
+    peerDependencies:
+      stylelint: '>=10.1.0'
+    dependencies:
+      stylelint: 13.13.1
+    dev: true
+
+  /stylelint-config-recommended@7.0.0(stylelint@14.16.1):
+    resolution: {integrity: sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==}
+    peerDependencies:
+      stylelint: ^14.4.0
+    dependencies:
+      stylelint: 14.16.1
+    dev: true
+
+  /stylelint-config-recommended@7.0.0(stylelint@14.8.2):
+    resolution: {integrity: sha512-yGn84Bf/q41J4luis1AZ95gj0EQwRX8lWmGmBwkwBNSkpGSpl66XcPTulxGa/Z91aPoNGuIGBmFkcM1MejMo9Q==}
+    peerDependencies:
+      stylelint: ^14.4.0
+    dependencies:
+      stylelint: 14.8.2
+    dev: true
+
+  /stylelint-config-standard@20.0.0(stylelint@13.13.1):
+    resolution: {integrity: sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA==}
+    peerDependencies:
+      stylelint: '>=10.1.0'
+    dependencies:
+      stylelint: 13.13.1
+      stylelint-config-recommended: 3.0.0(stylelint@13.13.1)
+    dev: true
+
+  /stylelint-config-standard@25.0.0(stylelint@14.16.1):
+    resolution: {integrity: sha512-21HnP3VSpaT1wFjFvv9VjvOGDtAviv47uTp3uFmzcN+3Lt+RYRv6oAplLaV51Kf792JSxJ6svCJh/G18E9VnCA==}
+    peerDependencies:
+      stylelint: ^14.4.0
+    dependencies:
+      stylelint: 14.16.1
+      stylelint-config-recommended: 7.0.0(stylelint@14.16.1)
+    dev: true
+
+  /stylelint-config-standard@25.0.0(stylelint@14.8.2):
+    resolution: {integrity: sha512-21HnP3VSpaT1wFjFvv9VjvOGDtAviv47uTp3uFmzcN+3Lt+RYRv6oAplLaV51Kf792JSxJ6svCJh/G18E9VnCA==}
+    peerDependencies:
+      stylelint: ^14.4.0
+    dependencies:
+      stylelint: 14.8.2
+      stylelint-config-recommended: 7.0.0(stylelint@14.8.2)
+    dev: true
+
+  /stylelint-declaration-block-no-ignored-properties@2.7.0(stylelint@13.13.1):
+    resolution: {integrity: sha512-44SpI9+9Oc1ICuwwRfwS/3npQ2jPobDSTnwWdNgZGryGqQCp17CgEIWjCv1BgUOSzND3RqywNCNLKvO1AOxbfg==}
+    engines: {node: '>=6'}
+    peerDependencies:
+      stylelint: ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0 || ^13.0.0 || ^14.0.0 || ^15.0.0
+    dependencies:
+      stylelint: 13.13.1
+    dev: true
+
+  /stylelint@13.13.1:
+    resolution: {integrity: sha512-Mv+BQr5XTUrKqAXmpqm6Ddli6Ief+AiPZkRsIrAoUKFuq/ElkUh9ZMYxXD0iQNZ5ADghZKLOWz1h7hTClB7zgQ==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+    dependencies:
+      '@stylelint/postcss-css-in-js': 0.37.3(postcss-syntax@0.36.2)(postcss@7.0.39)
+      '@stylelint/postcss-markdown': 0.36.2(postcss-syntax@0.36.2)(postcss@7.0.39)
+      autoprefixer: 9.8.8
+      balanced-match: 2.0.0
+      chalk: 4.1.2
+      cosmiconfig: 7.1.0
+      debug: 4.3.4(supports-color@5.5.0)
+      execall: 2.0.0
+      fast-glob: 3.2.12
+      fastest-levenshtein: 1.0.16
+      file-entry-cache: 6.0.1
+      get-stdin: 8.0.0
+      global-modules: 2.0.0
+      globby: 11.1.0
+      globjoin: 0.1.4
+      html-tags: 3.3.1
+      ignore: 5.2.4
+      import-lazy: 4.0.0
+      imurmurhash: 0.1.4
+      known-css-properties: 0.21.0
+      lodash: 4.17.21
+      log-symbols: 4.1.0
+      mathml-tag-names: 2.1.3
+      meow: 9.0.0
+      micromatch: 4.0.5
+      normalize-selector: 0.2.0
+      postcss: 7.0.39
+      postcss-html: 0.36.0(postcss-syntax@0.36.2)(postcss@7.0.39)
+      postcss-less: 3.1.4
+      postcss-media-query-parser: 0.2.3
+      postcss-resolve-nested-selector: 0.1.1
+      postcss-safe-parser: 4.0.2
+      postcss-sass: 0.4.4
+      postcss-scss: 2.1.1
+      postcss-selector-parser: 6.0.13
+      postcss-syntax: 0.36.2(postcss-html@0.36.0)(postcss-less@3.1.4)(postcss-scss@2.1.1)(postcss@7.0.39)
+      postcss-value-parser: 4.2.0
+      resolve-from: 5.0.0
+      slash: 3.0.0
+      specificity: 0.4.1
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      style-search: 0.1.0
+      sugarss: 2.0.0
+      svg-tags: 1.0.0
+      table: 6.8.1
+      v8-compile-cache: 2.3.0
+      write-file-atomic: 3.0.3
+    transitivePeerDependencies:
+      - postcss-jsx
+      - postcss-markdown
+      - supports-color
+    dev: true
+
+  /stylelint@14.16.1:
+    resolution: {integrity: sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    hasBin: true
+    dependencies:
+      '@csstools/selector-specificity': 2.2.0(postcss-selector-parser@6.0.13)
+      balanced-match: 2.0.0
+      colord: 2.9.3
+      cosmiconfig: 7.1.0
+      css-functions-list: 3.1.0
+      debug: 4.3.4(supports-color@5.5.0)
+      fast-glob: 3.2.12
+      fastest-levenshtein: 1.0.16
+      file-entry-cache: 6.0.1
+      global-modules: 2.0.0
+      globby: 11.1.0
+      globjoin: 0.1.4
+      html-tags: 3.3.1
+      ignore: 5.2.4
+      import-lazy: 4.0.0
+      imurmurhash: 0.1.4
+      is-plain-object: 5.0.0
+      known-css-properties: 0.26.0
+      mathml-tag-names: 2.1.3
+      meow: 9.0.0
+      micromatch: 4.0.5
+      normalize-path: 3.0.0
+      picocolors: 1.0.0
+      postcss: 8.4.24
+      postcss-media-query-parser: 0.2.3
+      postcss-resolve-nested-selector: 0.1.1
+      postcss-safe-parser: 6.0.0(postcss@8.4.24)
+      postcss-selector-parser: 6.0.13
+      postcss-value-parser: 4.2.0
+      resolve-from: 5.0.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      style-search: 0.1.0
+      supports-hyperlinks: 2.3.0
+      svg-tags: 1.0.0
+      table: 6.8.1
+      v8-compile-cache: 2.3.0
+      write-file-atomic: 4.0.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /stylelint@14.8.2:
+    resolution: {integrity: sha512-tjDfexCYfoPdl/xcDJ9Fv+Ko9cvzbDnmdiaqEn3ovXHXasi/hbkt5tSjsiReQ+ENqnz0eltaX/AOO+AlzVdcNA==}
+    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+    hasBin: true
+    dependencies:
+      balanced-match: 2.0.0
+      colord: 2.9.3
+      cosmiconfig: 7.1.0
+      css-functions-list: 3.1.0
+      debug: 4.3.4(supports-color@5.5.0)
+      execall: 2.0.0
+      fast-glob: 3.2.12
+      fastest-levenshtein: 1.0.16
+      file-entry-cache: 6.0.1
+      get-stdin: 8.0.0
+      global-modules: 2.0.0
+      globby: 11.1.0
+      globjoin: 0.1.4
+      html-tags: 3.3.1
+      ignore: 5.2.4
+      import-lazy: 4.0.0
+      imurmurhash: 0.1.4
+      is-plain-object: 5.0.0
+      known-css-properties: 0.25.0
+      mathml-tag-names: 2.1.3
+      meow: 9.0.0
+      micromatch: 4.0.5
+      normalize-path: 3.0.0
+      normalize-selector: 0.2.0
+      picocolors: 1.0.0
+      postcss: 8.4.24
+      postcss-media-query-parser: 0.2.3
+      postcss-resolve-nested-selector: 0.1.1
+      postcss-safe-parser: 6.0.0(postcss@8.4.24)
+      postcss-selector-parser: 6.0.13
+      postcss-value-parser: 4.2.0
+      resolve-from: 5.0.0
+      specificity: 0.4.1
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+      style-search: 0.1.0
+      supports-hyperlinks: 2.3.0
+      svg-tags: 1.0.0
+      table: 6.8.1
+      v8-compile-cache: 2.3.0
+      write-file-atomic: 4.0.2
+    transitivePeerDependencies:
+      - supports-color
+    dev: true
+
+  /stylis@4.2.0:
+    resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==}
+
+  /sugarss@2.0.0:
+    resolution: {integrity: sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==}
+    dependencies:
+      postcss: 7.0.39
+    dev: true
+
+  /superjson@1.12.3:
+    resolution: {integrity: sha512-0j+U70KUtP8+roVPbwfqkyQI7lBt7ETnuA7KXbTDX3mCKiD/4fXs2ldKSMdt0MCfpTwiMxo20yFU3vu6ewETpQ==}
+    engines: {node: '>=10'}
+    dependencies:
+      copy-anything: 3.0.5
+    dev: true
+
+  /supports-color@5.5.0:
+    resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+    engines: {node: '>=4'}
+    dependencies:
+      has-flag: 3.0.0
+
+  /supports-color@7.2.0:
+    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+    engines: {node: '>=8'}
+    dependencies:
+      has-flag: 4.0.0
+
+  /supports-color@8.1.1:
+    resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+    engines: {node: '>=10'}
+    dependencies:
+      has-flag: 4.0.0
+
+  /supports-hyperlinks@2.3.0:
+    resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==}
+    engines: {node: '>=8'}
+    dependencies:
+      has-flag: 4.0.0
+      supports-color: 7.2.0
+    dev: true
+
+  /supports-preserve-symlinks-flag@1.0.0:
+    resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+    engines: {node: '>= 0.4'}
+
+  /svg-parser@2.0.4:
+    resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==}
+    dev: true
+
+  /svg-tags@1.0.0:
+    resolution: {integrity: sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==}
+    dev: true
+
+  /svgo@2.8.0:
+    resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+    dependencies:
+      '@trysound/sax': 0.2.0
+      commander: 7.2.0
+      css-select: 4.3.0
+      css-tree: 1.1.3
+      csso: 4.2.0
+      picocolors: 1.0.0
+      stable: 0.1.8
+    dev: true
+
+  /swagger-ui-dist@4.19.0:
+    resolution: {integrity: sha512-9C9fJGI18gK5AhaU5YRyPY1lXJH4lmWh8h9zFMrJBkYzdRjCbAzYl1ayWPYgwFvag/Luqi3Co599OK/39IS2QQ==}
+    dev: true
+
+  /swagger2openapi@7.0.8:
+    resolution: {integrity: sha512-upi/0ZGkYgEcLeGieoz8gT74oWHA0E7JivX7aN9mAf+Tc7BQoRBvnIGHoPDw+f9TXTW4s6kGYCZJtauP6OYp7g==}
+    hasBin: true
+    dependencies:
+      call-me-maybe: 1.0.2
+      node-fetch: 2.6.11
+      node-fetch-h2: 2.3.0
+      node-readfiles: 0.2.0
+      oas-kit-common: 1.0.8
+      oas-resolver: 2.5.6
+      oas-schema-walker: 1.1.5
+      oas-validator: 5.0.8
+      reftools: 1.1.9
+      yaml: 1.10.2
+      yargs: 17.7.2
+    transitivePeerDependencies:
+      - encoding
+    dev: true
+
+  /swr@2.1.5(react@18.2.0):
+    resolution: {integrity: sha512-/OhfZMcEpuz77KavXST5q6XE9nrOBOVcBLWjMT+oAE/kQHyE3PASrevXCtQDZ8aamntOfFkbVJp7Il9tNBQWrw==}
+    peerDependencies:
+      react: ^16.11.0 || ^17.0.0 || ^18.0.0
+    dependencies:
+      react: 18.2.0
+      use-sync-external-store: 1.2.0(react@18.2.0)
+
+  /symbol-observable@1.2.0:
+    resolution: {integrity: sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /symbol-tree@3.2.4:
+    resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+    dev: true
+
+  /synckit@0.8.5:
+    resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    dependencies:
+      '@pkgr/utils': 2.4.1
+      tslib: 2.5.2
+    dev: true
+
+  /table@6.8.1:
+    resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==}
+    engines: {node: '>=10.0.0'}
+    dependencies:
+      ajv: 8.12.0
+      lodash.truncate: 4.4.2
+      slice-ansi: 4.0.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+    dev: true
+
+  /tapable@1.1.3:
+    resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==}
+    engines: {node: '>=6'}
+    dev: false
+
+  /tapable@2.2.1:
+    resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+    engines: {node: '>=6'}
+
+  /terser-webpack-plugin@5.3.9(webpack@5.84.1):
+    resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==}
+    engines: {node: '>= 10.13.0'}
+    peerDependencies:
+      '@swc/core': '*'
+      esbuild: '*'
+      uglify-js: '*'
+      webpack: ^5.1.0
+    peerDependenciesMeta:
+      '@swc/core':
+        optional: true
+      esbuild:
+        optional: true
+      uglify-js:
+        optional: true
+    dependencies:
+      '@jridgewell/trace-mapping': 0.3.18
+      jest-worker: 27.5.1
+      schema-utils: 3.1.2
+      serialize-javascript: 6.0.1
+      terser: 5.17.6
+      webpack: 5.84.1
+
+  /terser@5.17.6:
+    resolution: {integrity: sha512-V8QHcs8YuyLkLHsJO5ucyff1ykrLVsR4dNnS//L5Y3NiSXpbK1J+WMVUs67eI0KTxs9JtHhgEQpXQVHlHI92DQ==}
+    engines: {node: '>=10'}
+    hasBin: true
+    dependencies:
+      '@jridgewell/source-map': 0.3.3
+      acorn: 8.8.2
+      commander: 2.20.3
+      source-map-support: 0.5.21
+
+  /test-exclude@6.0.0:
+    resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
+    engines: {node: '>=8'}
+    dependencies:
+      '@istanbuljs/schema': 0.1.3
+      glob: 7.2.3
+      minimatch: 3.1.2
+    dev: true
+
+  /text-table@0.2.0:
+    resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+
+  /thread-stream@0.15.2:
+    resolution: {integrity: sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==}
+    dependencies:
+      real-require: 0.1.0
+    dev: true
+
+  /throttle-debounce@5.0.0:
+    resolution: {integrity: sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==}
+    engines: {node: '>=12.22'}
+
+  /through@2.3.8:
+    resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+    dev: true
+
+  /timers-browserify@2.0.12:
+    resolution: {integrity: sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==}
+    engines: {node: '>=0.6.0'}
+    dependencies:
+      setimmediate: 1.0.5
+    dev: true
+
+  /timers-ext@0.1.7:
+    resolution: {integrity: sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==}
+    dependencies:
+      es5-ext: 0.10.62
+      next-tick: 1.1.0
+    dev: true
+
+  /tiny-invariant@1.3.1:
+    resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==}
+    dev: true
+
+  /tiny-pinyin@1.3.2:
+    resolution: {integrity: sha512-uHNGu4evFt/8eNLldazeAM1M8JrMc1jshhJJfVRARTN3yT8HEEibofeQ7QETWQ5ISBjd6fKtTVBCC/+mGS6FpA==}
+    dev: true
+
+  /tiny-warning@1.0.3:
+    resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
+    dev: true
+
+  /tinycolor2@1.6.0:
+    resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==}
+
+  /titleize@3.0.0:
+    resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /tmpl@1.0.5:
+    resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
+    dev: true
+
+  /to-arraybuffer@1.0.1:
+    resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==}
+    dev: true
+
+  /to-fast-properties@1.0.3:
+    resolution: {integrity: sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==}
+    engines: {node: '>=0.10.0'}
+    dev: true
+
+  /to-fast-properties@2.0.0:
+    resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+    engines: {node: '>=4'}
+
+  /to-regex-range@5.0.1:
+    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+    engines: {node: '>=8.0'}
+    dependencies:
+      is-number: 7.0.0
+
+  /toggle-selection@1.0.6:
+    resolution: {integrity: sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==}
+
+  /toidentifier@1.0.1:
+    resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
+    engines: {node: '>=0.6'}
+    dev: true
+
+  /tough-cookie@2.5.0:
+    resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==}
+    engines: {node: '>=0.8'}
+    dependencies:
+      psl: 1.9.0
+      punycode: 2.3.0
+    dev: true
+
+  /tough-cookie@4.1.2:
+    resolution: {integrity: sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==}
+    engines: {node: '>=6'}
+    dependencies:
+      psl: 1.9.0
+      punycode: 2.3.0
+      universalify: 0.2.0
+      url-parse: 1.5.10
+    dev: true
+
+  /tr46@0.0.3:
+    resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
+    dev: true
+
+  /tr46@3.0.0:
+    resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==}
+    engines: {node: '>=12'}
+    dependencies:
+      punycode: 2.3.0
+    dev: true
+
+  /trim-newlines@3.0.1:
+    resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /trim-repeated@1.0.0:
+    resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==}
+    engines: {node: '>=0.10.0'}
+    dependencies:
+      escape-string-regexp: 1.0.5
+    dev: true
+
+  /trough@1.0.5:
+    resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==}
+    dev: true
+
+  /ts-node@10.9.1(@types/node@20.2.5)(typescript@5.0.2):
+    resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==}
+    hasBin: true
+    peerDependencies:
+      '@swc/core': '>=1.2.50'
+      '@swc/wasm': '>=1.2.50'
+      '@types/node': '*'
+      typescript: '>=2.7'
+    peerDependenciesMeta:
+      '@swc/core':
+        optional: true
+      '@swc/wasm':
+        optional: true
+    dependencies:
+      '@cspotcode/source-map-support': 0.8.1
+      '@tsconfig/node10': 1.0.9
+      '@tsconfig/node12': 1.0.11
+      '@tsconfig/node14': 1.0.3
+      '@tsconfig/node16': 1.0.4
+      '@types/node': 20.2.5
+      acorn: 8.8.2
+      acorn-walk: 8.2.0
+      arg: 4.1.3
+      create-require: 1.1.1
+      diff: 4.0.2
+      make-error: 1.3.6
+      typescript: 5.0.2
+      v8-compile-cache-lib: 3.0.1
+      yn: 3.1.1
+    dev: true
+
+  /tslib@1.14.1:
+    resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+    dev: true
+
+  /tslib@2.5.2:
+    resolution: {integrity: sha512-5svOrSA2w3iGFDs1HibEVBGbDrAY82bFQ3HZ3ixB+88nsbsWQoKqDRb5UBYAUPEzbBn6dAp5gRNXglySbx1MlA==}
+    dev: true
+
+  /tsutils@3.21.0(typescript@4.9.5):
+    resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+    engines: {node: '>= 6'}
+    peerDependencies:
+      typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
+    dependencies:
+      tslib: 1.14.1
+      typescript: 4.9.5
+    dev: true
+
+  /tsutils@3.21.0(typescript@5.0.2):
+    resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
+    engines: {node: '>= 6'}
+    peerDependencies:
+      typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
+    dependencies:
+      tslib: 1.14.1
+      typescript: 5.0.2
+    dev: true
+
+  /tsx@3.12.7:
+    resolution: {integrity: sha512-C2Ip+jPmqKd1GWVQDvz/Eyc6QJbGfE7NrR3fx5BpEHMZsEHoIxHL1j+lKdGobr8ovEyqeNkPLSKp6SCSOt7gmw==}
+    hasBin: true
+    dependencies:
+      '@esbuild-kit/cjs-loader': 2.4.2
+      '@esbuild-kit/core-utils': 3.1.0
+      '@esbuild-kit/esm-loader': 2.5.5
+    optionalDependencies:
+      fsevents: 2.3.2
+    dev: true
+
+  /tty-browserify@0.0.0:
+    resolution: {integrity: sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==}
+    dev: true
+
+  /tunnel-agent@0.6.0:
+    resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
+    dependencies:
+      safe-buffer: 5.2.1
+    dev: true
+
+  /tween-functions@1.2.0:
+    resolution: {integrity: sha512-PZBtLYcCLtEcjL14Fzb1gSxPBeL7nWvGhO5ZFPGqziCcr8uvHp0NDmdjBchp6KHL+tExcg0m3NISmKxhU394dA==}
+    dev: true
+
+  /tweetnacl@0.14.5:
+    resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}
+    dev: true
+
+  /type-check@0.3.2:
+    resolution: {integrity: sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==}
+    engines: {node: '>= 0.8.0'}
+    dependencies:
+      prelude-ls: 1.1.2
+    dev: true
+
+  /type-check@0.4.0:
+    resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+    engines: {node: '>= 0.8.0'}
+    dependencies:
+      prelude-ls: 1.2.1
+
+  /type-detect@4.0.8:
+    resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /type-fest@0.18.1:
+    resolution: {integrity: sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /type-fest@0.20.2:
+    resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
+    engines: {node: '>=10'}
+
+  /type-fest@0.21.3:
+    resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /type-fest@0.6.0:
+    resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /type-fest@0.8.1:
+    resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /type-is@1.6.18:
+    resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
+    engines: {node: '>= 0.6'}
+    dependencies:
+      media-typer: 0.3.0
+      mime-types: 2.1.35
+    dev: true
+
+  /type@1.2.0:
+    resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==}
+    dev: true
+
+  /type@2.7.2:
+    resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==}
+    dev: true
+
+  /typed-array-length@1.0.4:
+    resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==}
+    dependencies:
+      call-bind: 1.0.2
+      for-each: 0.3.3
+      is-typed-array: 1.1.10
+    dev: true
+
+  /typedarray-to-buffer@3.1.5:
+    resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
+    dependencies:
+      is-typedarray: 1.0.0
+    dev: true
+
+  /typedarray@0.0.6:
+    resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==}
+    dev: true
+
+  /typescript@3.9.10:
+    resolution: {integrity: sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==}
+    engines: {node: '>=4.2.0'}
+    hasBin: true
+    dev: true
+
+  /typescript@4.9.5:
+    resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==}
+    engines: {node: '>=4.2.0'}
+    hasBin: true
+    dev: true
+
+  /typescript@5.0.2:
+    resolution: {integrity: sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==}
+    engines: {node: '>=12.20'}
+    hasBin: true
+
+  /ua-parser-js@0.7.35:
+    resolution: {integrity: sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==}
+    dev: true
+
+  /umi-presets-pro@2.0.3(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@5.5.1)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)(umi@4.0.69):
+    resolution: {integrity: sha512-sHKynw/fi7UeUftzTRPRsrV5GHV4BWvWYhyvwkg8s+shmt0ROPW/52y4gxBziEvetxl8yWMKUCWk50OUDOcrww==}
+    dependencies:
+      '@alita/plugins': 3.2.22(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@5.5.1)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@umijs/max-plugin-openapi': 2.0.3
+      '@umijs/plugins': 4.0.69(@types/react-dom@18.2.4)(@types/react@18.2.7)(antd@5.5.1)(dva@2.5.0-beta.2)(prop-types@15.8.1)(rc-field-form@1.32.0)(react-dom@18.2.0)(react@18.2.0)
+      '@umijs/request-record': 1.1.4(umi@4.0.69)
+      swagger-ui-dist: 4.19.0
+    transitivePeerDependencies:
+      - '@types/lodash.merge'
+      - '@types/react'
+      - '@types/react-dom'
+      - antd
+      - babel-plugin-styled-components
+      - chokidar
+      - debug
+      - dva
+      - encoding
+      - postcss-jsx
+      - postcss-markdown
+      - prop-types
+      - rc-field-form
+      - react
+      - react-dom
+      - react-native
+      - shallowequal
+      - stylis
+      - supports-color
+      - umi
+    dev: true
+
+  /umi-request@1.4.0:
+    resolution: {integrity: sha512-OknwtQZddZHi0Ggi+Vr/olJ7HNMx4AzlywyK0W3NZBT7B0stjeZ9lcztA85dBgdAj3KVk8uPJPZSnGaDjELhrA==}
+    dependencies:
+      isomorphic-fetch: 2.2.1
+      qs: 6.11.2
+    dev: true
+
+  /umi-utils@1.7.3:
+    resolution: {integrity: sha512-KLUGIKXkuPOq8LACQN57nj9rSPIjLz8eLbR4mZpihJ3BgL3f1bZFvmUV/VYHr9D7PfFH2Vb1Y6UAOuNkKL9g2g==}
+    dependencies:
+      chalk: 2.4.2
+      dotenv: 8.6.0
+      is-url: 1.2.4
+      node-fetch: 2.6.0
+      prettier: 1.15.3
+      slash2: 2.0.0
+    dev: true
+
+  /umi@4.0.69(@babel/core@7.22.1)(@types/node@20.2.5)(@types/react@18.2.7)(eslint@8.35.0)(jest@29.5.0)(postcss@8.4.24)(prettier@2.8.8)(react-dom@18.2.0)(react@18.2.0)(styled-components@5.3.11)(stylelint@14.8.2)(typescript@5.0.2)(webpack@5.84.1):
+    resolution: {integrity: sha512-n6MqLQnJKpCDPzzMptSBa/2yfawNs0yXSWg6yWwKAyVew+IxodqD99+6i9ssGCudXPaC5AnbjIqF4bwa1IjTWw==}
+    engines: {node: '>=14'}
+    hasBin: true
+    dependencies:
+      '@babel/runtime': 7.21.0
+      '@umijs/bundler-utils': 4.0.69
+      '@umijs/bundler-webpack': 4.0.69(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1)
+      '@umijs/core': 4.0.69
+      '@umijs/lint': 4.0.69(eslint@8.35.0)(jest@29.5.0)(styled-components@5.3.11)(stylelint@14.8.2)(typescript@5.0.2)
+      '@umijs/preset-umi': 4.0.69(@types/node@20.2.5)(@types/react@18.2.7)(postcss@8.4.24)(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1)
+      '@umijs/renderer-react': 4.0.69(react-dom@18.2.0)(react@18.2.0)
+      '@umijs/server': 4.0.69
+      '@umijs/test': 4.0.69(@babel/core@7.22.1)
+      '@umijs/utils': 4.0.69
+      prettier-plugin-organize-imports: 3.2.2(prettier@2.8.8)(typescript@5.0.2)
+      prettier-plugin-packagejson: 2.4.3(prettier@2.8.8)
+    transitivePeerDependencies:
+      - '@babel/core'
+      - '@types/node'
+      - '@types/react'
+      - '@types/webpack'
+      - '@volar/vue-language-plugin-pug'
+      - '@volar/vue-typescript'
+      - eslint
+      - jest
+      - postcss
+      - postcss-html
+      - postcss-jsx
+      - postcss-less
+      - postcss-markdown
+      - postcss-scss
+      - prettier
+      - react
+      - react-dom
+      - rollup
+      - sass
+      - sockjs-client
+      - styled-components
+      - stylelint
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+      - type-fest
+      - typescript
+      - webpack
+      - webpack-dev-server
+      - webpack-hot-middleware
+      - webpack-plugin-serve
+    dev: true
+
+  /umi@4.0.69(@babel/core@7.22.1)(@types/node@20.2.5)(@types/react@18.2.7)(eslint@8.41.0)(jest@29.5.0)(postcss@8.4.24)(prettier@2.8.8)(react-dom@18.2.0)(react@18.2.0)(styled-components@5.3.11)(stylelint@14.16.1)(typescript@5.0.2)(webpack@5.84.1):
+    resolution: {integrity: sha512-n6MqLQnJKpCDPzzMptSBa/2yfawNs0yXSWg6yWwKAyVew+IxodqD99+6i9ssGCudXPaC5AnbjIqF4bwa1IjTWw==}
+    engines: {node: '>=14'}
+    hasBin: true
+    dependencies:
+      '@babel/runtime': 7.21.0
+      '@umijs/bundler-utils': 4.0.69
+      '@umijs/bundler-webpack': 4.0.69(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1)
+      '@umijs/core': 4.0.69
+      '@umijs/lint': 4.0.69(eslint@8.41.0)(jest@29.5.0)(styled-components@5.3.11)(stylelint@14.16.1)(typescript@5.0.2)
+      '@umijs/preset-umi': 4.0.69(@types/node@20.2.5)(@types/react@18.2.7)(postcss@8.4.24)(styled-components@5.3.11)(typescript@5.0.2)(webpack@5.84.1)
+      '@umijs/renderer-react': 4.0.69(react-dom@18.2.0)(react@18.2.0)
+      '@umijs/server': 4.0.69
+      '@umijs/test': 4.0.69(@babel/core@7.22.1)
+      '@umijs/utils': 4.0.69
+      prettier-plugin-organize-imports: 3.2.2(prettier@2.8.8)(typescript@5.0.2)
+      prettier-plugin-packagejson: 2.4.3(prettier@2.8.8)
+    transitivePeerDependencies:
+      - '@babel/core'
+      - '@types/node'
+      - '@types/react'
+      - '@types/webpack'
+      - '@volar/vue-language-plugin-pug'
+      - '@volar/vue-typescript'
+      - eslint
+      - jest
+      - postcss
+      - postcss-html
+      - postcss-jsx
+      - postcss-less
+      - postcss-markdown
+      - postcss-scss
+      - prettier
+      - react
+      - react-dom
+      - rollup
+      - sass
+      - sockjs-client
+      - styled-components
+      - stylelint
+      - stylus
+      - sugarss
+      - supports-color
+      - terser
+      - type-fest
+      - typescript
+      - webpack
+      - webpack-dev-server
+      - webpack-hot-middleware
+      - webpack-plugin-serve
+    dev: true
+
+  /unbox-primitive@1.0.2:
+    resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
+    dependencies:
+      call-bind: 1.0.2
+      has-bigints: 1.0.2
+      has-symbols: 1.0.3
+      which-boxed-primitive: 1.0.2
+    dev: true
+
+  /underscore@1.7.0:
+    resolution: {integrity: sha512-cp0oQQyZhUM1kpJDLdGO1jPZHgS/MpzoWYfe9+CM2h/QGDZlqwT2T3YGukuBdaNJ/CAPoeyAZRRHz8JFo176vA==}
+    dev: true
+
+  /unfetch@5.0.0:
+    resolution: {integrity: sha512-3xM2c89siXg0nHvlmYsQ2zkLASvVMBisZm5lF3gFDqfF2xonNStDJyMpvaOBe0a1Edxmqrf2E0HBdmy9QyZaeg==}
+    dev: true
+
+  /unicode-canonical-property-names-ecmascript@2.0.0:
+    resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /unicode-match-property-ecmascript@2.0.0:
+    resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
+    engines: {node: '>=4'}
+    dependencies:
+      unicode-canonical-property-names-ecmascript: 2.0.0
+      unicode-property-aliases-ecmascript: 2.1.0
+    dev: true
+
+  /unicode-match-property-value-ecmascript@2.1.0:
+    resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /unicode-property-aliases-ecmascript@2.1.0:
+    resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==}
+    engines: {node: '>=4'}
+    dev: true
+
+  /unified@9.2.2:
+    resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==}
+    dependencies:
+      '@types/unist': 2.0.6
+      bail: 1.0.5
+      extend: 3.0.2
+      is-buffer: 2.0.5
+      is-plain-obj: 2.1.0
+      trough: 1.0.5
+      vfile: 4.2.1
+    dev: true
+
+  /unist-util-find-all-after@3.0.2:
+    resolution: {integrity: sha512-xaTC/AGZ0rIM2gM28YVRAFPIZpzbpDtU3dRmp7EXlNVA8ziQc4hY3H7BHXM1J49nEmiqc3svnqMReW+PGqbZKQ==}
+    dependencies:
+      unist-util-is: 4.1.0
+    dev: true
+
+  /unist-util-is@4.1.0:
+    resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==}
+    dev: true
+
+  /unist-util-stringify-position@2.0.3:
+    resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==}
+    dependencies:
+      '@types/unist': 2.0.6
+    dev: true
+
+  /universalify@0.1.2:
+    resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
+    engines: {node: '>= 4.0.0'}
+    dev: true
+
+  /universalify@0.2.0:
+    resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
+    engines: {node: '>= 4.0.0'}
+    dev: true
+
+  /universalify@2.0.0:
+    resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
+    engines: {node: '>= 10.0.0'}
+
+  /unpipe@1.0.0:
+    resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
+    engines: {node: '>= 0.8'}
+    dev: true
+
+  /untildify@4.0.0:
+    resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==}
+    engines: {node: '>=8'}
+    dev: true
+
+  /update-browserslist-db@1.0.11(browserslist@4.21.6):
+    resolution: {integrity: sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==}
+    hasBin: true
+    peerDependencies:
+      browserslist: '>= 4.21.0'
+    dependencies:
+      browserslist: 4.21.6
+      escalade: 3.1.1
+      picocolors: 1.0.0
+
+  /uri-js@4.4.1:
+    resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+    dependencies:
+      punycode: 2.3.0
+
+  /url-parse@1.5.10:
+    resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==}
+    dependencies:
+      querystringify: 2.2.0
+      requires-port: 1.0.0
+    dev: true
+
+  /url@0.11.0:
+    resolution: {integrity: sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==}
+    dependencies:
+      punycode: 1.3.2
+      querystring: 0.2.0
+    dev: true
+
+  /use-isomorphic-layout-effect@1.1.2(@types/react@18.2.7)(react@18.1.0):
+    resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==}
+    peerDependencies:
+      '@types/react': '*'
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+    peerDependenciesMeta:
+      '@types/react':
+        optional: true
+    dependencies:
+      '@types/react': 18.2.7
+      react: 18.1.0
+    dev: true
+
+  /use-json-comparison@1.0.6(react@18.2.0):
+    resolution: {integrity: sha512-xPadt5yMRbEmVfOSGFSMqjjICrq7nLbfSH3rYIXsrtcuFX7PmbYDN/ku8ObBn3v8o/yZelO1OxUS5+5TI3+fUw==}
+    peerDependencies:
+      react: '>=16.9.0'
+    dependencies:
+      react: 18.2.0
+
+  /use-media-antd-query@1.1.0(react@18.2.0):
+    resolution: {integrity: sha512-B6kKZwNV4R+l4Rl11sWO7HqOay9alzs1Vp1b4YJqjz33YxbltBCZtt/yxXxkXN9rc1S7OeEL/GbwC30Wmqhw6Q==}
+    peerDependencies:
+      react: '>=16.9.0'
+    dependencies:
+      react: 18.2.0
+
+  /use-sync-external-store@1.2.0(react@18.2.0):
+    resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==}
+    peerDependencies:
+      react: ^16.8.0 || ^17.0.0 || ^18.0.0
+    dependencies:
+      react: 18.2.0
+
+  /util-deprecate@1.0.2:
+    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+    dev: true
+
+  /util@0.10.3:
+    resolution: {integrity: sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==}
+    dependencies:
+      inherits: 2.0.1
+    dev: true
+
+  /util@0.11.1:
+    resolution: {integrity: sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==}
+    dependencies:
+      inherits: 2.0.3
+    dev: true
+
+  /utila@0.4.0:
+    resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==}
+    dev: true
+
+  /utils-merge@1.0.1:
+    resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==}
+    engines: {node: '>= 0.4.0'}
+    dev: true
+
+  /uuid@3.4.0:
+    resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==}
+    deprecated: Please upgrade  to version 7 or higher.  Older versions may use Math.random() in certain circumstances, which is known to be problematic.  See https://v8.dev/blog/math-random for details.
+    hasBin: true
+    dev: true
+
+  /v8-compile-cache-lib@3.0.1:
+    resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==}
+    dev: true
+
+  /v8-compile-cache@2.3.0:
+    resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==}
+    dev: true
+
+  /v8-to-istanbul@9.1.0:
+    resolution: {integrity: sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA==}
+    engines: {node: '>=10.12.0'}
+    dependencies:
+      '@jridgewell/trace-mapping': 0.3.18
+      '@types/istanbul-lib-coverage': 2.0.4
+      convert-source-map: 1.9.0
+    dev: true
+
+  /validate-npm-package-license@3.0.4:
+    resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+    dependencies:
+      spdx-correct: 3.2.0
+      spdx-expression-parse: 3.0.1
+    dev: true
+
+  /valtio@1.9.0(react@18.2.0):
+    resolution: {integrity: sha512-mQLFsAlKbYascZygFQh6lXuDjU5WHLoeZ8He4HqMnWfasM96V6rDbeFkw1XeG54xycmDonr/Jb4xgviHtuySrA==}
+    engines: {node: '>=12.20.0'}
+    peerDependencies:
+      react: '>=16.8'
+    peerDependenciesMeta:
+      react:
+        optional: true
+    dependencies:
+      proxy-compare: 2.4.0
+      react: 18.2.0
+      use-sync-external-store: 1.2.0(react@18.2.0)
+    dev: true
+
+  /value-equal@1.0.1:
+    resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==}
+    dev: true
+
+  /vary@1.1.2:
+    resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
+    engines: {node: '>= 0.8'}
+    dev: true
+
+  /verror@1.10.0:
+    resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==}
+    engines: {'0': node >=0.6.0}
+    dependencies:
+      assert-plus: 1.0.0
+      core-util-is: 1.0.2
+      extsprintf: 1.3.0
+    dev: true
+
+  /vfile-message@2.0.4:
+    resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==}
+    dependencies:
+      '@types/unist': 2.0.6
+      unist-util-stringify-position: 2.0.3
+    dev: true
+
+  /vfile@4.2.1:
+    resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==}
+    dependencies:
+      '@types/unist': 2.0.6
+      is-buffer: 2.0.5
+      unist-util-stringify-position: 2.0.3
+      vfile-message: 2.0.4
+    dev: true
+
+  /vite@4.3.1(@types/node@20.2.5)(less@4.1.3):
+    resolution: {integrity: sha512-EPmfPLAI79Z/RofuMvkIS0Yr091T2ReUoXQqc5ppBX/sjFRhHKiPPF/R46cTdoci/XgeQpB23diiJxq5w30vdg==}
+    engines: {node: ^14.18.0 || >=16.0.0}
+    hasBin: true
+    peerDependencies:
+      '@types/node': '>= 14'
+      less: '*'
+      sass: '*'
+      stylus: '*'
+      sugarss: '*'
+      terser: ^5.4.0
+    peerDependenciesMeta:
+      '@types/node':
+        optional: true
+      less:
+        optional: true
+      sass:
+        optional: true
+      stylus:
+        optional: true
+      sugarss:
+        optional: true
+      terser:
+        optional: true
+    dependencies:
+      '@types/node': 20.2.5
+      esbuild: 0.17.19
+      less: 4.1.3
+      postcss: 8.4.24
+      rollup: 3.23.0
+    optionalDependencies:
+      fsevents: 2.3.2
+    dev: true
+
+  /vm-browserify@1.1.2:
+    resolution: {integrity: sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==}
+    dev: true
+
+  /w3c-xmlserializer@4.0.0:
+    resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==}
+    engines: {node: '>=14'}
+    dependencies:
+      xml-name-validator: 4.0.0
+    dev: true
+
+  /walker@1.0.8:
+    resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
+    dependencies:
+      makeerror: 1.0.12
+    dev: true
+
+  /warning@3.0.0:
+    resolution: {integrity: sha512-jMBt6pUrKn5I+OGgtQ4YZLdhIeJmObddh6CsibPxyQ5yPZm1XExSyzC1LCNX7BzhxWgiHmizBWJTHJIjMjTQYQ==}
+    dependencies:
+      loose-envify: 1.4.0
+    dev: true
+
+  /warning@4.0.3:
+    resolution: {integrity: sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==}
+    dependencies:
+      loose-envify: 1.4.0
+
+  /watchpack@2.4.0:
+    resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==}
+    engines: {node: '>=10.13.0'}
+    dependencies:
+      glob-to-regexp: 0.4.1
+      graceful-fs: 4.2.11
+
+  /wbuf@1.7.3:
+    resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==}
+    dependencies:
+      minimalistic-assert: 1.0.1
+    dev: true
+
+  /wcwidth@1.0.1:
+    resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+    dependencies:
+      defaults: 1.0.4
+    dev: true
+
+  /web-streams-polyfill@3.2.1:
+    resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==}
+    engines: {node: '>= 8'}
+    dev: true
+
+  /webidl-conversions@3.0.1:
+    resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
+    dev: true
+
+  /webidl-conversions@7.0.0:
+    resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /webpack-sources@3.2.3:
+    resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
+    engines: {node: '>=10.13.0'}
+
+  /webpack@5.84.1:
+    resolution: {integrity: sha512-ZP4qaZ7vVn/K8WN/p990SGATmrL1qg4heP/MrVneczYtpDGJWlrgZv55vxaV2ul885Kz+25MP2kSXkPe3LZfmg==}
+    engines: {node: '>=10.13.0'}
+    hasBin: true
+    peerDependencies:
+      webpack-cli: '*'
+    peerDependenciesMeta:
+      webpack-cli:
+        optional: true
+    dependencies:
+      '@types/eslint-scope': 3.7.4
+      '@types/estree': 1.0.1
+      '@webassemblyjs/ast': 1.11.6
+      '@webassemblyjs/wasm-edit': 1.11.6
+      '@webassemblyjs/wasm-parser': 1.11.6
+      acorn: 8.8.2
+      acorn-import-assertions: 1.9.0(acorn@8.8.2)
+      browserslist: 4.21.6
+      chrome-trace-event: 1.0.3
+      enhanced-resolve: 5.14.1
+      es-module-lexer: 1.2.1
+      eslint-scope: 5.1.1
+      events: 3.3.0
+      glob-to-regexp: 0.4.1
+      graceful-fs: 4.2.11
+      json-parse-even-better-errors: 2.3.1
+      loader-runner: 4.3.0
+      mime-types: 2.1.35
+      neo-async: 2.6.2
+      schema-utils: 3.1.2
+      tapable: 2.2.1
+      terser-webpack-plugin: 5.3.9(webpack@5.84.1)
+      watchpack: 2.4.0
+      webpack-sources: 3.2.3
+    transitivePeerDependencies:
+      - '@swc/core'
+      - esbuild
+      - uglify-js
+
+  /whatwg-encoding@2.0.0:
+    resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==}
+    engines: {node: '>=12'}
+    dependencies:
+      iconv-lite: 0.6.3
+    dev: true
+
+  /whatwg-fetch@3.6.2:
+    resolution: {integrity: sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==}
+    dev: true
+
+  /whatwg-mimetype@3.0.0:
+    resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /whatwg-url@11.0.0:
+    resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==}
+    engines: {node: '>=12'}
+    dependencies:
+      tr46: 3.0.0
+      webidl-conversions: 7.0.0
+    dev: true
+
+  /whatwg-url@5.0.0:
+    resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
+    dependencies:
+      tr46: 0.0.3
+      webidl-conversions: 3.0.1
+    dev: true
+
+  /which-boxed-primitive@1.0.2:
+    resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+    dependencies:
+      is-bigint: 1.0.4
+      is-boolean-object: 1.1.2
+      is-number-object: 1.0.7
+      is-string: 1.0.7
+      is-symbol: 1.0.4
+    dev: true
+
+  /which-builtin-type@1.1.3:
+    resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      function.prototype.name: 1.1.5
+      has-tostringtag: 1.0.0
+      is-async-function: 2.0.0
+      is-date-object: 1.0.5
+      is-finalizationregistry: 1.0.2
+      is-generator-function: 1.0.10
+      is-regex: 1.1.4
+      is-weakref: 1.0.2
+      isarray: 2.0.5
+      which-boxed-primitive: 1.0.2
+      which-collection: 1.0.1
+      which-typed-array: 1.1.9
+    dev: true
+
+  /which-collection@1.0.1:
+    resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==}
+    dependencies:
+      is-map: 2.0.2
+      is-set: 2.0.2
+      is-weakmap: 2.0.1
+      is-weakset: 2.0.2
+    dev: true
+
+  /which-typed-array@1.1.9:
+    resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==}
+    engines: {node: '>= 0.4'}
+    dependencies:
+      available-typed-arrays: 1.0.5
+      call-bind: 1.0.2
+      for-each: 0.3.3
+      gopd: 1.0.1
+      has-tostringtag: 1.0.0
+      is-typed-array: 1.1.10
+    dev: true
+
+  /which@1.3.1:
+    resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
+    hasBin: true
+    dependencies:
+      isexe: 2.0.0
+
+  /which@2.0.2:
+    resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+    engines: {node: '>= 8'}
+    hasBin: true
+    dependencies:
+      isexe: 2.0.0
+
+  /word-wrap@1.2.3:
+    resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==}
+    engines: {node: '>=0.10.0'}
+
+  /wrap-ansi@6.2.0:
+    resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+    engines: {node: '>=8'}
+    dependencies:
+      ansi-styles: 4.3.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+    dev: true
+
+  /wrap-ansi@7.0.0:
+    resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+    engines: {node: '>=10'}
+    dependencies:
+      ansi-styles: 4.3.0
+      string-width: 4.2.3
+      strip-ansi: 6.0.1
+    dev: true
+
+  /wrappy@1.0.2:
+    resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+
+  /write-file-atomic@3.0.3:
+    resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
+    dependencies:
+      imurmurhash: 0.1.4
+      is-typedarray: 1.0.0
+      signal-exit: 3.0.7
+      typedarray-to-buffer: 3.1.5
+    dev: true
+
+  /write-file-atomic@4.0.2:
+    resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==}
+    engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
+    dependencies:
+      imurmurhash: 0.1.4
+      signal-exit: 3.0.7
+    dev: true
+
+  /ws@6.2.2:
+    resolution: {integrity: sha512-zmhltoSR8u1cnDsD43TX59mzoMZsLKqUweyYBAIvTngR3shc0W6aOZylZmq/7hqyVxPdi+5Ud2QInblgyE72fw==}
+    peerDependencies:
+      bufferutil: ^4.0.1
+      utf-8-validate: ^5.0.2
+    peerDependenciesMeta:
+      bufferutil:
+        optional: true
+      utf-8-validate:
+        optional: true
+    dependencies:
+      async-limiter: 1.0.1
+    dev: true
+
+  /ws@8.13.0:
+    resolution: {integrity: sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==}
+    engines: {node: '>=10.0.0'}
+    peerDependencies:
+      bufferutil: ^4.0.1
+      utf-8-validate: '>=5.0.2'
+    peerDependenciesMeta:
+      bufferutil:
+        optional: true
+      utf-8-validate:
+        optional: true
+    dev: true
+
+  /xml-name-validator@4.0.0:
+    resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /xmlchars@2.2.0:
+    resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
+    dev: true
+
+  /xtend@4.0.2:
+    resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
+    engines: {node: '>=0.4'}
+    dev: true
+
+  /y18n@5.0.8:
+    resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /yallist@3.1.1:
+    resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+
+  /yallist@4.0.0:
+    resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
+  /yaml@1.10.2:
+    resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
+    engines: {node: '>= 6'}
+
+  /yargs-parser@20.2.9:
+    resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /yargs-parser@21.1.1:
+    resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+    engines: {node: '>=12'}
+    dev: true
+
+  /yargs@17.7.2:
+    resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+    engines: {node: '>=12'}
+    dependencies:
+      cliui: 8.0.1
+      escalade: 3.1.1
+      get-caller-file: 2.0.5
+      require-directory: 2.1.1
+      string-width: 4.2.3
+      y18n: 5.0.8
+      yargs-parser: 21.1.1
+    dev: true
+
+  /yauzl@2.10.0:
+    resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
+    dependencies:
+      buffer-crc32: 0.2.13
+      fd-slicer: 1.1.0
+    dev: true
+
+  /yn@3.1.1:
+    resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /yocto-queue@0.1.0:
+    resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+    engines: {node: '>=10'}
+
+  /zscroller@0.4.8:
+    resolution: {integrity: sha512-G5NiNLKx2+QhhvZi2yV1jjVXY50otktxkseX2hG2N/eixohOUk0AY8ZpbAxNqS9oJS/NxItCsowupy2tsXxAMw==}
+    dependencies:
+      babel-runtime: 6.26.0
+    dev: true
+
+  /zwitch@1.0.5:
+    resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==}
+    dev: true
diff --git a/public/CNAME b/public/CNAME
new file mode 100644
index 0000000..30c2d4d
--- /dev/null
+++ b/public/CNAME
@@ -0,0 +1 @@
+preview.pro.ant.design
\ No newline at end of file
diff --git a/public/bg.png b/public/bg.png
new file mode 100644
index 0000000..2b08d4f
Binary files /dev/null and b/public/bg.png differ
diff --git a/public/demos/index.html b/public/demos/index.html
new file mode 100644
index 0000000..232f260
--- /dev/null
+++ b/public/demos/index.html
@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/3.6.6/fabric.min.js"></script>
+  <title>Fabric.js Text Editing</title>
+</head>
+    <style>
+        body {
+    background: ivory;
+  }
+    </style>
+<body>
+    <!-- <script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/3.4.0/fabric.js"></script> -->
+    <canvas id="c" width="1300" height="1200" ></canvas>
+  <script>
+ const canvas = new fabric.Canvas('c')
+
+fabric.RectWithText = fabric.util.createClass(fabric.Rect, {
+    type: 'rectWithText',
+    text: null,
+    textOffsetLeft: 0,
+    textOffsetTop: 0,
+    _prevObjectStacking: null,
+    _prevAngle: 0,
+    recalcTextPosition: function () {
+      const sin = Math.sin(fabric.util.degreesToRadians(this.angle))
+      const cos = Math.cos(fabric.util.degreesToRadians(this.angle))
+      const newTop = sin * this.textOffsetLeft + cos * this.textOffsetTop
+      const newLeft = cos * this.textOffsetLeft - sin * this.textOffsetTop
+      const rectLeftTop = this.getPointByOrigin('left', 'top')
+      this.text.set('left', rectLeftTop.x + newLeft)
+      this.text.set('top', rectLeftTop.y + newTop)
+    },
+    initialize: function (rectOptions, textOptions, text) {
+      this.callSuper('initialize', rectOptions)
+      this.text = new fabric.Textbox(text, {
+        ...textOptions,
+        selectable: false,
+        evented: false,
+      })
+      this.textOffsetLeft = this.text.left - this.left
+      this.textOffsetTop = this.text.top - this.top
+      this.on('moving', () => {
+        this.recalcTextPosition()
+      })
+      this.on('rotating', () => {
+        this.text.rotate(this.text.angle + this.angle - this._prevAngle)
+        this.recalcTextPosition()
+        this._prevAngle = this.angle
+      })
+      this.on('scaling', (e) => {
+        this.recalcTextPosition()
+      })
+      this.on('added', () => {
+        this.canvas.add(this.text)
+      })
+      this.on('removed', () => {
+        this.canvas.remove(this.text)
+      })
+      this.on('mousedown:before', () => {
+        this._prevObjectStacking = this.canvas.preserveObjectStacking
+        this.canvas.preserveObjectStacking = true
+      })
+      //双击   
+      this.on('mousedblclick', () => {
+        this.text.selectable = true
+        this.text.evented = true
+        this.canvas.setActiveObject(this.text)
+        this.text.enterEditing()
+        this.selectable = false
+      })
+      this.on('deselected', () => {
+        this.canvas.preserveObjectStacking = this._prevObjectStacking
+      })
+      this.text.on('editing:exited', () => {
+        this.text.selectable = false
+        this.text.evented = false
+        this.selectable = true
+      })
+    }
+})
+
+const rectOptions = {
+  left: 10,
+  top: 10,
+  width: 200,
+  height: 75,
+  fill: 'rgba(30, 30, 30, 0.3)',
+}
+const textOptions = {
+  left: 35,
+  top: 30,
+  width: 150,
+  fill: 'white',
+  shadow: new fabric.Shadow({
+    color: 'rgba(34, 34, 100, 0.4)',
+    blur: 2,
+    offsetX: -2,
+    offsetY: 2
+  }),
+  fontSize: 30,
+}
+const rectWithText = new fabric.RectWithText(rectOptions, textOptions, 'Some text')
+canvas.add(rectWithText)
+
+  </script>
+</body>
+</html>
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..e2e9325
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/icons/icon-128x128.png b/public/icons/icon-128x128.png
new file mode 100644
index 0000000..48d0e23
Binary files /dev/null and b/public/icons/icon-128x128.png differ
diff --git a/public/icons/icon-192x192.png b/public/icons/icon-192x192.png
new file mode 100644
index 0000000..938e9b5
Binary files /dev/null and b/public/icons/icon-192x192.png differ
diff --git a/public/icons/icon-512x512.png b/public/icons/icon-512x512.png
new file mode 100644
index 0000000..21fc108
Binary files /dev/null and b/public/icons/icon-512x512.png differ
diff --git a/public/images/computePowerAllocation/icon1.png b/public/images/computePowerAllocation/icon1.png
new file mode 100644
index 0000000..2c6a354
Binary files /dev/null and b/public/images/computePowerAllocation/icon1.png differ
diff --git a/public/images/computePowerAllocation/slideBtn1.png b/public/images/computePowerAllocation/slideBtn1.png
new file mode 100644
index 0000000..65b553e
Binary files /dev/null and b/public/images/computePowerAllocation/slideBtn1.png differ
diff --git a/public/images/computePowerAllocation/slideBtn2.png b/public/images/computePowerAllocation/slideBtn2.png
new file mode 100644
index 0000000..91ab9cd
Binary files /dev/null and b/public/images/computePowerAllocation/slideBtn2.png differ
diff --git a/public/images/icons/logo.svg b/public/images/icons/logo.svg
new file mode 100644
index 0000000..9d46ecd
--- /dev/null
+++ b/public/images/icons/logo.svg
@@ -0,0 +1,24 @@
+<svg width="64" height="24" viewBox="0 0 64 24" fill="none" xmlns="http://www.w3.org/2000/svg">
+<mask id="mask0_3180_54416" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="64" height="24">
+<rect width="64" height="24" fill="#D9D9D9"/>
+</mask>
+<g mask="url(#mask0_3180_54416)">
+<path d="M14.039 4.05812L11.9366 4.49908C11.8873 4.51252 11.8707 4.57396 11.9072 4.6098L13.5648 6.2674C13.6006 6.30324 13.6627 6.28724 13.6755 6.23796L14.1203 4.1394C14.1337 4.09012 14.0883 4.04532 14.039 4.05812Z" fill="#E42F2F"/>
+<path d="M15.1781 2.93749L12.133 3.75349C12.0972 3.76309 12.0856 3.80789 12.1112 3.83413L14.3404 6.06325C14.3666 6.08949 14.4114 6.07733 14.421 6.04149L15.237 2.99637C15.2466 2.96053 15.214 2.92789 15.1781 2.93749Z" fill="#FAEC18"/>
+<path d="M21.4489 12.7755L17.8688 9.19532L16.4736 7.80013C16.3801 7.70669 16.2284 7.70669 16.1344 7.80013L10.0608 13.8737C9.9494 13.9851 9.76828 13.9851 9.65692 13.8737L8.0006 12.2174C7.88924 12.106 7.88924 11.9249 8.0006 11.8136L13.0803 6.73388C13.1737 6.64044 13.1737 6.48877 13.0803 6.39469L11.7017 5.01612C11.6083 4.92268 11.4566 4.92268 11.3625 5.01612L4.47804 11.9019C4.3846 11.9953 4.3846 12.147 4.47804 12.2411L8.10108 15.8641L9.49628 17.2593C9.58972 17.3528 9.7414 17.3528 9.83548 17.2593L16.1657 10.9291C16.2771 10.8177 16.4582 10.8177 16.5696 10.9291L18.2259 12.5854C18.3372 12.6968 18.3372 12.8779 18.2259 12.9892L11.8956 19.3195C11.8022 19.4129 11.8022 19.5646 11.8956 19.6587L13.2313 20.9944C13.3248 21.0878 13.4764 21.0878 13.5705 20.9944L21.4496 13.1153C21.5424 13.0206 21.5424 12.8689 21.4489 12.7755Z" fill="#154DDD"/>
+<path d="M33.2839 6.32767H32.0116V5.51871H29.5962V6.21951H28.3239V5.51871H26.1569L26.0596 4.41919H28.3239V3.58911H29.5962V4.41919H32.0116V3.58911H33.2839V4.41919H35.6884V5.51871H33.2839V6.32767ZM26.0596 11.0611L27.0087 8.64575H28.2164L27.3217 11.0611H26.0596ZM33.8445 11.6109C33.7581 12.441 33.2193 12.9587 32.3137 13.0125C31.785 13.0554 30.9441 12.9907 30.2433 12.8723L29.9629 11.8048C30.5882 11.9232 31.3217 11.9776 31.7633 11.945C32.281 11.9232 32.5287 11.6864 32.5613 11.2224C32.6369 10.2842 32.626 9.14111 32.5613 8.24639C32.5505 8.13887 32.5185 8.09535 32.4103 8.09535H30.5127C30.3725 10.6938 29.2621 11.977 26.5985 13.2819L26.2644 12.064C28.162 11.1046 29.0567 9.97247 29.2186 8.09599H26.8468L26.7604 7.01759H29.2404V6.30591H30.5345V7.01759H33.0144C33.5213 7.01759 33.8017 7.32991 33.8445 7.81567C33.8663 8.02047 33.8765 8.21439 33.8874 8.41983H35.0624L35.9252 11.072H34.6209L33.8983 8.65663C33.9629 9.70239 33.9412 10.727 33.8445 11.6109Z" fill="#154DDD"/>
+<path d="M39.57 9.79973V9.85349C39.57 10.8884 39.538 11.8913 39.2033 13.2391H37.8555C38.3406 11.5137 38.3515 10.4141 38.3515 9.19557V4.51589C38.3515 4.03077 38.6427 3.76133 39.1604 3.76133H40.8961C41.4139 3.76133 41.7044 4.01989 41.7044 4.51589V12.1716C41.7044 12.7649 41.2948 13.1309 40.6804 13.1745C40.3675 13.1962 40.0443 13.1527 39.8395 13.0989L39.57 11.9885C39.7428 12.0314 39.9905 12.0532 40.1736 12.0532C40.3784 12.0532 40.4865 11.9348 40.4865 11.7511V9.79973H39.57ZM40.4865 4.96902C40.4865 4.90438 40.4436 4.86086 40.379 4.86086H39.6891C39.6244 4.86086 39.5707 4.90374 39.5707 4.96902V6.32773H40.4871V4.96902H40.4865ZM40.4865 7.31973H39.57V8.80773H40.4865V7.31973ZM47.6993 11.8593V12.9805H42.082L41.9745 11.8593H44.3252V9.67046H42.5896L42.4814 8.54917H44.3252V6.53254H43.387C43.2897 6.97478 43.1713 7.39525 43.0203 7.79397H41.8343C42.2439 6.65093 42.4596 5.45413 42.4923 4.07429H43.6462C43.6353 4.53765 43.6033 4.99077 43.5598 5.41125H44.3252V3.54565H45.5867V5.41125H47.3659V6.53254H45.5867V8.54917H47.3012V9.67046H45.5867V11.8593H47.6993Z" fill="#154DDD"/>
+<path d="M59.5924 11.9886L59.2039 13.3364C56.8212 12.3335 55.3978 11.5143 54.6433 9.9617C53.8887 11.4171 52.4007 12.4846 49.9853 13.3255L49.6404 12.0315C52.3361 10.9748 53.4356 10.0692 53.8023 8.47306H49.9425L49.8241 7.33002H53.9322C53.9431 7.18986 53.9431 7.03882 53.9431 6.88778V5.19498H50.6113L50.5037 4.09546H58.8058V5.19498H55.2577V7.14634V7.32938H59.3869V8.47242H55.3325C55.9482 10.3604 57.5329 11.2231 59.5924 11.9886Z" fill="#154DDD"/>
+<path d="M25.8777 18.3961L26.5938 18.3277C26.6367 18.5632 26.7244 18.7366 26.8562 18.8467C26.9881 18.9574 27.166 19.0125 27.3894 19.0125C27.6262 19.0125 27.8054 18.9632 27.925 18.8653C28.0454 18.7667 28.1055 18.6521 28.1055 18.5203C28.1055 18.4358 28.0799 18.3641 28.0294 18.3046C27.9788 18.2451 27.8905 18.1939 27.7644 18.1498C27.678 18.1203 27.4815 18.0685 27.175 17.9936C26.7801 17.8976 26.5036 17.7798 26.3442 17.6403C26.1202 17.4438 26.0082 17.2038 26.0082 16.9209C26.0082 16.7392 26.0607 16.5689 26.1663 16.4102C26.2719 16.2515 26.423 16.1312 26.6214 16.048C26.8198 15.9654 27.0585 15.9238 27.3388 15.9238C27.7964 15.9238 28.1407 16.0224 28.3724 16.2189C28.6041 16.4153 28.725 16.6777 28.7366 17.0061L28.0006 17.0381C27.9692 16.8544 27.9014 16.7226 27.7977 16.6419C27.694 16.5613 27.5385 16.5216 27.3311 16.5216C27.1174 16.5216 26.9497 16.5645 26.8287 16.6509C26.7506 16.7059 26.7116 16.7801 26.7116 16.8729C26.7116 16.9574 26.7481 17.0298 26.821 17.0899C26.9138 17.1661 27.1391 17.2461 27.4975 17.3286C27.8559 17.4112 28.1202 17.497 28.2924 17.5859C28.4646 17.6749 28.5983 17.7958 28.695 17.9488C28.7922 18.1024 28.8402 18.2918 28.8402 18.5178C28.8402 18.7226 28.782 18.9145 28.6662 19.0931C28.5503 19.2717 28.3858 19.4048 28.174 19.4918C27.9615 19.5789 27.6972 19.6224 27.3804 19.6224C26.9196 19.6224 26.5657 19.5181 26.3186 19.3094C26.0735 19.1001 25.9263 18.7961 25.8777 18.3961Z" fill="#154DDD"/>
+<path d="M29.3547 15.9854H30.0907V17.9207C30.0907 18.2279 30.0997 18.427 30.1183 18.5178C30.1496 18.6644 30.2245 18.7815 30.3435 18.8698C30.4619 18.9582 30.6239 19.0029 30.8299 19.0029C31.0386 19.0029 31.196 18.9614 31.3023 18.8775C31.4085 18.7937 31.4725 18.6913 31.4936 18.569C31.5154 18.4474 31.5263 18.2445 31.5263 17.9623V15.9854H32.2623V17.8625C32.2623 18.2913 32.2424 18.5946 32.2027 18.7719C32.1631 18.9492 32.0895 19.0983 31.9826 19.2206C31.8757 19.3428 31.7323 19.4394 31.5538 19.5118C31.3746 19.5841 31.141 19.6199 30.8523 19.6199C30.5042 19.6199 30.2399 19.5802 30.06 19.5015C29.8802 19.4228 29.7381 19.3204 29.6338 19.1943C29.5295 19.0682 29.4603 18.9364 29.4271 18.7981C29.3791 18.5933 29.3547 18.2913 29.3547 17.8913V15.9854Z" fill="#154DDD"/>
+<path d="M32.9363 19.559V15.9858H34.1177C34.5651 15.9858 34.8569 16.0038 34.9932 16.0396C35.2019 16.0934 35.3772 16.2098 35.518 16.389C35.6588 16.5689 35.7292 16.8006 35.7292 17.0847C35.7292 17.3042 35.6889 17.4886 35.6076 17.6383C35.5264 17.7881 35.4233 17.9052 35.2979 17.9903C35.1724 18.0754 35.0457 18.1318 34.9164 18.1599C34.7404 18.1938 34.4864 18.2111 34.1529 18.2111H33.6729V19.559H32.9363ZM33.6729 16.59V17.6038H34.0755C34.3654 17.6038 34.5593 17.5852 34.6572 17.5474C34.7552 17.5103 34.832 17.4514 34.887 17.3721C34.9427 17.2927 34.9702 17.1999 34.9702 17.0943C34.9702 16.9644 34.9312 16.8569 34.8531 16.7724C34.775 16.6879 34.6764 16.6348 34.5574 16.6137C34.4697 16.5977 34.2931 16.5894 34.0275 16.5894H33.6729V16.59Z" fill="#154DDD"/>
+<path d="M36.2317 19.559V15.9858H38.935V16.5906H36.9677V17.383H38.7981V17.9852H36.9677V18.958H39.0048V19.5602H36.2317V19.559Z" fill="#154DDD"/>
+<path d="M39.5295 19.559V15.9858H41.079C41.4687 15.9858 41.7516 16.0178 41.9283 16.0818C42.1049 16.1458 42.2463 16.2604 42.3519 16.4242C42.4575 16.5881 42.5113 16.7762 42.5113 16.9874C42.5113 17.2556 42.4307 17.477 42.27 17.6518C42.1094 17.8265 41.8687 17.9366 41.5487 17.982C41.7081 18.0729 41.8393 18.1727 41.943 18.2815C42.0467 18.3903 42.1862 18.5836 42.3622 18.8614L42.8076 19.5583H41.927L41.3945 18.7807C41.2057 18.503 41.0764 18.3276 41.0067 18.2553C40.9369 18.183 40.8633 18.1337 40.7852 18.1068C40.7071 18.0799 40.5836 18.0665 40.4147 18.0665H40.2655V19.5583H39.5295V19.559ZM40.2662 17.4969H40.8108C41.1641 17.4969 41.3843 17.4822 41.4726 17.4527C41.5609 17.4233 41.6294 17.3734 41.6787 17.3017C41.7279 17.23 41.7535 17.141 41.7535 17.0335C41.7535 16.9132 41.7209 16.8159 41.655 16.7423C41.5891 16.6687 41.4969 16.6214 41.3779 16.6022C41.3183 16.5938 41.1391 16.59 40.8409 16.59H40.2662V17.4969Z" fill="#154DDD"/>
+<path d="M43.9417 19.559L42.6387 15.9858H43.4368L44.3596 18.6303L45.2524 15.9858H46.0332L44.7276 19.559H43.9417Z" fill="#154DDD"/>
+<path d="M46.2847 19.559V15.9858H47.0207V19.559H46.2847Z" fill="#154DDD"/>
+<path d="M47.4341 18.3961L48.1502 18.3277C48.1931 18.5632 48.2808 18.7366 48.4126 18.8467C48.5445 18.9574 48.7224 19.0125 48.9464 19.0125C49.1832 19.0125 49.3618 18.9632 49.4821 18.8653C49.6024 18.7667 49.6626 18.6521 49.6626 18.5203C49.6626 18.4358 49.637 18.3641 49.5864 18.3046C49.5358 18.2451 49.4475 18.1939 49.3214 18.1498C49.235 18.1203 49.0386 18.0685 48.732 17.9936C48.3371 17.8976 48.0606 17.7798 47.9013 17.6403C47.6773 17.4438 47.5653 17.2038 47.5653 16.9209C47.5653 16.7392 47.6178 16.5689 47.7234 16.4102C47.8283 16.2515 47.98 16.1312 48.1784 16.048C48.3762 15.9654 48.6155 15.9238 48.8958 15.9238C49.3534 15.9238 49.6978 16.0224 49.9294 16.2189C50.1605 16.4153 50.2821 16.6777 50.2936 17.0061L49.5576 17.0381C49.5262 16.8544 49.4584 16.7226 49.3547 16.6419C49.251 16.5613 49.0955 16.5216 48.8882 16.5216C48.6744 16.5216 48.5067 16.5645 48.3858 16.6509C48.3077 16.7059 48.2686 16.7801 48.2686 16.8729C48.2686 16.9574 48.3051 17.0298 48.3781 17.0899C48.4709 17.1661 48.6962 17.2461 49.0546 17.3286C49.413 17.4112 49.6773 17.497 49.8494 17.5859C50.0216 17.6749 50.1554 17.7958 50.252 17.9488C50.3493 18.1024 50.3973 18.2918 50.3973 18.5178C50.3973 18.7226 50.339 18.9145 50.2232 19.0931C50.1074 19.2717 49.9429 19.4048 49.731 19.4918C49.5186 19.5789 49.2542 19.6224 48.9374 19.6224C48.4766 19.6224 48.1227 19.5181 47.8757 19.3094C47.6293 19.1001 47.4821 18.7961 47.4341 18.3961Z" fill="#154DDD"/>
+<path d="M50.8933 19.559V15.9858H51.6293V19.559H50.8933Z" fill="#154DDD"/>
+<path d="M52.0798 17.7939C52.0798 17.4298 52.1355 17.1245 52.2462 16.8774C52.3288 16.6957 52.4421 16.5318 52.5854 16.3872C52.7288 16.2425 52.8862 16.135 53.0565 16.0653C53.2837 15.9712 53.5454 15.9238 53.8424 15.9238C54.3794 15.9238 54.8094 16.087 55.132 16.4141C55.4546 16.7405 55.6158 17.1949 55.6158 17.7766C55.6158 18.3533 55.4558 18.8051 55.1358 19.1309C54.8158 19.4566 54.3877 19.6198 53.8526 19.6198C53.3106 19.6198 52.8792 19.4579 52.5592 19.1334C52.2398 18.8096 52.0798 18.3629 52.0798 17.7939ZM52.8382 17.7696C52.8382 18.1741 52.9336 18.4813 53.1243 18.6899C53.315 18.8985 53.557 19.0029 53.8507 19.0029C54.1445 19.0029 54.3851 18.8992 54.5733 18.6918C54.7614 18.4845 54.8555 18.1741 54.8555 17.7593C54.8555 17.3497 54.764 17.0445 54.581 16.8429C54.3979 16.6413 54.1547 16.5408 53.8507 16.5408C53.5474 16.5408 53.3029 16.6425 53.1173 16.8467C52.931 17.0509 52.8382 17.3587 52.8382 17.7696Z" fill="#154DDD"/>
+<path d="M56.0967 19.559V15.9858H56.8128L58.3053 18.3724V15.9858H58.9895V19.559H58.2509L56.7808 17.2287V19.559H56.0967Z" fill="#154DDD"/>
+</g>
+</svg>
diff --git a/public/images/model.png b/public/images/model.png
new file mode 100644
index 0000000..9242b28
Binary files /dev/null and b/public/images/model.png differ
diff --git a/public/logo.svg b/public/logo.svg
new file mode 100644
index 0000000..239bf69
--- /dev/null
+++ b/public/logo.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200" version="1.1" viewBox="0 0 200 200"><title>Group 28 Copy 5</title><desc>Created with Sketch.</desc><defs><linearGradient id="linearGradient-1" x1="62.102%" x2="108.197%" y1="0%" y2="37.864%"><stop offset="0%" stop-color="#4285EB"/><stop offset="100%" stop-color="#2EC7FF"/></linearGradient><linearGradient id="linearGradient-2" x1="69.644%" x2="54.043%" y1="0%" y2="108.457%"><stop offset="0%" stop-color="#29CDFF"/><stop offset="37.86%" stop-color="#148EFF"/><stop offset="100%" stop-color="#0A60FF"/></linearGradient><linearGradient id="linearGradient-3" x1="69.691%" x2="16.723%" y1="-12.974%" y2="117.391%"><stop offset="0%" stop-color="#FA816E"/><stop offset="41.473%" stop-color="#F74A5C"/><stop offset="100%" stop-color="#F51D2C"/></linearGradient><linearGradient id="linearGradient-4" x1="68.128%" x2="30.44%" y1="-35.691%" y2="114.943%"><stop offset="0%" stop-color="#FA8E7D"/><stop offset="51.264%" stop-color="#F74A5C"/><stop offset="100%" stop-color="#F51D2C"/></linearGradient></defs><g id="Page-1" fill="none" fill-rule="evenodd" stroke="none" stroke-width="1"><g id="logo" transform="translate(-20.000000, -20.000000)"><g id="Group-28-Copy-5" transform="translate(20.000000, 20.000000)"><g id="Group-27-Copy-3"><g id="Group-25" fill-rule="nonzero"><g id="2"><path id="Shape" fill="url(#linearGradient-1)" d="M91.5880863,4.17652823 L4.17996544,91.5127728 C-0.519240605,96.2081146 -0.519240605,103.791885 4.17996544,108.487227 L91.5880863,195.823472 C96.2872923,200.518814 103.877304,200.518814 108.57651,195.823472 L145.225487,159.204632 C149.433969,154.999611 149.433969,148.181924 145.225487,143.976903 C141.017005,139.771881 134.193707,139.771881 129.985225,143.976903 L102.20193,171.737352 C101.032305,172.906015 99.2571609,172.906015 98.0875359,171.737352 L28.285908,101.993122 C27.1162831,100.824459 27.1162831,99.050775 28.285908,97.8821118 L98.0875359,28.1378823 C99.2571609,26.9692191 101.032305,26.9692191 102.20193,28.1378823 L129.985225,55.8983314 C134.193707,60.1033528 141.017005,60.1033528 145.225487,55.8983314 C149.433969,51.69331 149.433969,44.8756232 145.225487,40.6706018 L108.58055,4.05574592 C103.862049,-0.537986846 96.2692618,-0.500797906 91.5880863,4.17652823 Z"/><path id="Shape" fill="url(#linearGradient-2)" d="M91.5880863,4.17652823 L4.17996544,91.5127728 C-0.519240605,96.2081146 -0.519240605,103.791885 4.17996544,108.487227 L91.5880863,195.823472 C96.2872923,200.518814 103.877304,200.518814 108.57651,195.823472 L145.225487,159.204632 C149.433969,154.999611 149.433969,148.181924 145.225487,143.976903 C141.017005,139.771881 134.193707,139.771881 129.985225,143.976903 L102.20193,171.737352 C101.032305,172.906015 99.2571609,172.906015 98.0875359,171.737352 L28.285908,101.993122 C27.1162831,100.824459 27.1162831,99.050775 28.285908,97.8821118 L98.0875359,28.1378823 C100.999864,25.6271836 105.751642,20.541824 112.729652,19.3524487 C117.915585,18.4685261 123.585219,20.4140239 129.738554,25.1889424 C125.624663,21.0784292 118.571995,14.0340304 108.58055,4.05574592 C103.862049,-0.537986846 96.2692618,-0.500797906 91.5880863,4.17652823 Z"/></g><path id="Shape" fill="url(#linearGradient-3)" d="M153.685633,135.854579 C157.894115,140.0596 164.717412,140.0596 168.925894,135.854579 L195.959977,108.842726 C200.659183,104.147384 200.659183,96.5636133 195.960527,91.8688194 L168.690777,64.7181159 C164.472332,60.5180858 157.646868,60.5241425 153.435895,64.7316526 C149.227413,68.936674 149.227413,75.7543607 153.435895,79.9593821 L171.854035,98.3623765 C173.02366,99.5310396 173.02366,101.304724 171.854035,102.473387 L153.685633,120.626849 C149.47715,124.83187 149.47715,131.649557 153.685633,135.854579 Z"/></g><ellipse id="Combined-Shape" cx="100.519" cy="100.437" fill="url(#linearGradient-4)" rx="23.6" ry="23.581"/></g></g></g></g></svg>
\ No newline at end of file
diff --git a/public/my_logo.svg b/public/my_logo.svg
new file mode 100644
index 0000000..dc16d57
--- /dev/null
+++ b/public/my_logo.svg
@@ -0,0 +1 @@
+<svg id="图层_1" data-name="图层 1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 220 220"><defs><style>.cls-1{fill:none;}.cls-2{clip-path:url(#clip-path);}</style><clipPath id="clip-path"><rect class="cls-1" x="4.5" y="4.5" width="211.01" height="211.01"/></clipPath></defs><g class="cls-2"><image width="1166" height="221" transform="translate(4.13 4.94) scale(0.95)" xlink:href="data:image/png;base64,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"/></g></svg>
\ No newline at end of file
diff --git a/public/pro_icon.svg b/public/pro_icon.svg
new file mode 100644
index 0000000..e075b78
--- /dev/null
+++ b/public/pro_icon.svg
@@ -0,0 +1,5 @@
+<svg width="42" height="42" xmlns="http://www.w3.org/2000/svg">
+ <g>
+  <path fill="#070707" d="m6.717392,13.773912l5.6,0c2.8,0 4.7,1.9 4.7,4.7c0,2.8 -2,4.7 -4.9,4.7l-2.5,0l0,4.3l-2.9,0l0,-13.7zm2.9,2.2l0,4.9l1.9,0c1.6,0 2.6,-0.9 2.6,-2.4c0,-1.6 -0.9,-2.4 -2.6,-2.4l-1.9,0l0,-0.1zm8.9,11.5l2.7,0l0,-5.7c0,-1.4 0.8,-2.3 2.2,-2.3c0.4,0 0.8,0.1 1,0.2l0,-2.4c-0.2,-0.1 -0.5,-0.1 -0.8,-0.1c-1.2,0 -2.1,0.7 -2.4,2l-0.1,0l0,-1.9l-2.7,0l0,10.2l0.1,0zm11.7,0.1c-3.1,0 -5,-2 -5,-5.3c0,-3.3 2,-5.3 5,-5.3s5,2 5,5.3c0,3.4 -1.9,5.3 -5,5.3zm0,-2.1c1.4,0 2.2,-1.1 2.2,-3.2c0,-2 -0.8,-3.2 -2.2,-3.2c-1.4,0 -2.2,1.2 -2.2,3.2c0,2.1 0.8,3.2 2.2,3.2z" class="st0" id="Ant-Design-Pro"/>
+ </g>
+</svg>
\ No newline at end of file
diff --git a/public/scripts/loading.js b/public/scripts/loading.js
new file mode 100644
index 0000000..c1ced54
--- /dev/null
+++ b/public/scripts/loading.js
@@ -0,0 +1,202 @@
+/**
+ * loading 占位
+ * 解决首次加载时白屏的问题
+ */
+ (function () {
+  const _root = document.querySelector('#root');
+  if (_root && _root.innerHTML === '') {
+    _root.innerHTML = `
+      <style>
+        html,
+        body,
+        #root {
+          height: 100%;
+          margin: 0;
+          padding: 0;
+        }
+        #root {
+          background-repeat: no-repeat;
+          background-size: 100% auto;
+        }
+
+        .loading-title {
+          font-size: 1.1rem;
+        }
+
+        .loading-sub-title {
+          margin-top: 20px;
+          font-size: 1rem;
+          color: #888;
+        }
+
+        .page-loading-warp {
+          display: flex;
+          align-items: center;
+          justify-content: center;
+          padding: 26px;
+        }
+        .ant-spin {
+          position: absolute;
+          display: none;
+          -webkit-box-sizing: border-box;
+          box-sizing: border-box;
+          margin: 0;
+          padding: 0;
+          color: rgba(0, 0, 0, 0.65);
+          color: #1890ff;
+          font-size: 14px;
+          font-variant: tabular-nums;
+          line-height: 1.5;
+          text-align: center;
+          list-style: none;
+          opacity: 0;
+          -webkit-transition: -webkit-transform 0.3s
+            cubic-bezier(0.78, 0.14, 0.15, 0.86);
+          transition: -webkit-transform 0.3s
+            cubic-bezier(0.78, 0.14, 0.15, 0.86);
+          transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);
+          transition: transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86),
+            -webkit-transform 0.3s cubic-bezier(0.78, 0.14, 0.15, 0.86);
+          -webkit-font-feature-settings: "tnum";
+          font-feature-settings: "tnum";
+        }
+
+        .ant-spin-spinning {
+          position: static;
+          display: inline-block;
+          opacity: 1;
+        }
+
+        .ant-spin-dot {
+          position: relative;
+          display: inline-block;
+          width: 20px;
+          height: 20px;
+          font-size: 20px;
+        }
+
+        .ant-spin-dot-item {
+          position: absolute;
+          display: block;
+          width: 9px;
+          height: 9px;
+          background-color: #1890ff;
+          border-radius: 100%;
+          -webkit-transform: scale(0.75);
+          -ms-transform: scale(0.75);
+          transform: scale(0.75);
+          -webkit-transform-origin: 50% 50%;
+          -ms-transform-origin: 50% 50%;
+          transform-origin: 50% 50%;
+          opacity: 0.3;
+          -webkit-animation: antspinmove 1s infinite linear alternate;
+          animation: antSpinMove 1s infinite linear alternate;
+        }
+
+        .ant-spin-dot-item:nth-child(1) {
+          top: 0;
+          left: 0;
+        }
+
+        .ant-spin-dot-item:nth-child(2) {
+          top: 0;
+          right: 0;
+          -webkit-animation-delay: 0.4s;
+          animation-delay: 0.4s;
+        }
+
+        .ant-spin-dot-item:nth-child(3) {
+          right: 0;
+          bottom: 0;
+          -webkit-animation-delay: 0.8s;
+          animation-delay: 0.8s;
+        }
+
+        .ant-spin-dot-item:nth-child(4) {
+          bottom: 0;
+          left: 0;
+          -webkit-animation-delay: 1.2s;
+          animation-delay: 1.2s;
+        }
+
+        .ant-spin-dot-spin {
+          -webkit-transform: rotate(45deg);
+          -ms-transform: rotate(45deg);
+          transform: rotate(45deg);
+          -webkit-animation: antrotate 1.2s infinite linear;
+          animation: antRotate 1.2s infinite linear;
+        }
+
+        .ant-spin-lg .ant-spin-dot {
+          width: 32px;
+          height: 32px;
+          font-size: 32px;
+        }
+
+        .ant-spin-lg .ant-spin-dot i {
+          width: 14px;
+          height: 14px;
+        }
+
+        @media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
+          .ant-spin-blur {
+            background: #fff;
+            opacity: 0.5;
+          }
+        }
+
+        @-webkit-keyframes antSpinMove {
+          to {
+            opacity: 1;
+          }
+        }
+
+        @keyframes antSpinMove {
+          to {
+            opacity: 1;
+          }
+        }
+
+        @-webkit-keyframes antRotate {
+          to {
+            -webkit-transform: rotate(405deg);
+            transform: rotate(405deg);
+          }
+        }
+
+        @keyframes antRotate {
+          to {
+            -webkit-transform: rotate(405deg);
+            transform: rotate(405deg);
+          }
+        }
+      </style>
+
+      <div style="
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        justify-content: center;
+        height: 100%;
+        min-height: 362px;
+      ">
+        <div class="page-loading-warp">
+          <div class="ant-spin ant-spin-lg ant-spin-spinning">
+            <span class="ant-spin-dot ant-spin-dot-spin">
+              <i class="ant-spin-dot-item"></i>
+              <i class="ant-spin-dot-item"></i>
+              <i class="ant-spin-dot-item"></i>
+              <i class="ant-spin-dot-item"></i>
+            </span>
+          </div>
+        </div>
+        <div class="loading-title">
+          正在加载资源
+        </div>
+        <div class="loading-sub-title">
+          初次加载资源可能需要较多时间 请耐心等待
+        </div>
+      </div>
+    `;
+  }
+})();
diff --git a/src/access.ts b/src/access.ts
new file mode 100644
index 0000000..4209f2e
--- /dev/null
+++ b/src/access.ts
@@ -0,0 +1,22 @@
+import {IRoute} from "@umijs/max";
+
+/**
+ * @see https://umijs.org/zh-CN/plugins/plugin-access
+ * */
+export default function access(initialState: { currentUser?: API.CurrentUser } | undefined) {
+  // const { currentUser } = initialState ?? {};
+  // const read_paths = currentUser?.read_paths || []
+  // const update_paths = currentUser?.update_paths || []
+  return {
+    // canReadMenu: read_paths?.includes(history.location.pathname),
+    canReadMenu: (route: IRoute)=>{
+      // return read_paths?.includes(route.path)
+      return true
+    },
+    canUpdate: (path: string)=>{
+      // return update_paths?.includes(path)
+      return true
+    }
+  };
+}
+
diff --git a/src/app.tsx b/src/app.tsx
new file mode 100644
index 0000000..94aabbc
--- /dev/null
+++ b/src/app.tsx
@@ -0,0 +1,231 @@
+import { AvatarDropdown, AvatarName, Footer, Question, SelectLang } from '@/components';
+import { LinkOutlined } from '@ant-design/icons';
+import type { Settings as LayoutSettings } from '@ant-design/pro-components';
+import { SettingDrawer } from '@ant-design/pro-components';
+import { RunTimeLayoutConfig, getLocale, history } from '@umijs/max';
+import { RequestConfig } from 'umi';
+import defaultSettings from '../config/defaultSettings';
+import { errorConfig } from './requestErrorConfig';
+const isDev = process.env.NODE_ENV === 'development';
+const loginPath = '/showInfo';
+// @ts-ignore
+import { SelectRole } from '@/components/RightContent';
+import zhCN from '@/locales/zh-CN';
+import { postMenuGetMenu } from '@/services/system/Menu';
+import { getUserGetUserInfo } from '@/services/system/User';
+import fixMenuItemIcon from '@/utils/FixMenuItemIcon';
+import { getAllRouteNameTile } from '@/utils/common';
+import { addLocale } from '@@/plugin-locale';
+import { MenuDataItem } from '@ant-design/pro-layout';
+import { Button } from 'antd';
+import cookie from 'react-cookies';
+/**
+ * @see  https://umijs.org/zh-CN/plugins/plugin-initial-state
+ * */
+// 自定义路由路径集合
+const isCustomPageTitlePaths: string[] = ['/resource/algorithm-model-detail'];
+
+export async function getInitialState(): Promise<{
+  settings?: Partial<LayoutSettings>;
+  currentUser?: API.UserView;
+  loading?: boolean;
+  fetchUserInfo?: any;
+  menuData?: MenuDataItem[];
+}> {
+  const fetchUserInfo = async () => {
+    // try {
+    //   const msg = await getUserGetUserInfo();
+    //   return msg.data.userInfo;
+    // } catch (error) {
+    //   history.push(loginPath);
+    // }
+    history.push(loginPath);
+    return undefined;
+  };
+  // 如果不是登录页面,执行
+  const { location } = history;
+  if (location.pathname !== loginPath && localStorage.getItem('access')) {
+    const currentUser = await fetchUserInfo();
+    const menus = await postMenuGetMenu();
+    if (getLocale() === 'zh-CN') {
+      let localData = getAllRouteNameTile(menus.data.routes, '');
+      let localRes: any = {};
+      localData.forEach((v) => {
+        // console.log(v.title,'localData_v')
+        localRes[`menu${v.name}`] = v.title;
+      });
+      console.log(localRes, 'getAllRouteNameTile');
+      addLocale('zh-CN', localRes, {
+        momentLocale: 'zh-CN',
+        antd: zhCN,
+      });
+    }
+
+    return {
+      fetchUserInfo,
+      currentUser,
+      settings: defaultSettings as Partial<LayoutSettings>,
+      menuData: [
+        {
+          path: '/welcome',
+          key: '',
+          name: 'welcome',
+          icon: 'HomeOutlined',
+          access: '',
+          component: 'Welcome',
+          title: '首页',
+          // routes: [],
+        },
+      ],
+    };
+  }
+
+  return {
+    fetchUserInfo,
+    settings: defaultSettings as Partial<LayoutSettings>,
+  };
+}
+
+// ProLayout 支持的api https://procomponents.ant.design/components/layout
+export const layout: RunTimeLayoutConfig = ({ initialState, setInitialState }) => {
+  return {
+    actionsRender: () => [
+      <SelectRole key="selectRole" />,
+      <Question key="doc" />,
+      <SelectLang key="SelectLang" />,
+    ],
+    avatarProps: {
+      src: SERVER_HOST + initialState?.currentUser?.avatarUrl,
+      title: <AvatarName />,
+      render: (_, avatarChildren) => {
+        // console.log(avatarChildren,'')
+        return <AvatarDropdown>{avatarChildren}</AvatarDropdown>;
+      },
+    },
+    pageTitleRender: () => {
+      console.log(history, 'pageTitleRender');
+      // TODO 目前使用路由path全匹配,后续改成从接口字段读取
+      let isCustom: boolean = false;
+      for (let i = 0; i < isCustomPageTitlePaths.length; i++) {
+        const item = isCustomPageTitlePaths[i];
+        if (history.location.pathname.includes(item)) {
+          isCustom = true;
+          break;
+        } else {
+          isCustom = false;
+        }
+      }
+      return isCustom ? '' : undefined;
+      // 默认不进行重定义 使用null即可
+    },
+    footerRender: () => <Footer />,
+    onPageChange: () => {
+      const { location } = history;
+      // 如果没有登录,重定向到 login
+      if (!initialState?.currentUser && location.pathname !== loginPath) {
+        history.push(loginPath);
+      }
+    },
+    menuDataRender: () => {
+      if (initialState?.menuData !== undefined) {
+        return fixMenuItemIcon(initialState?.menuData || []);
+      }
+    },
+    layoutBgImgList: [
+      {
+        src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/D2LWSqNny4sAAAAAAAAAAAAAFl94AQBr',
+        left: 85,
+        bottom: 100,
+        height: '303px',
+      },
+      {
+        src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/C2TWRpJpiC0AAAAAAAAAAAAAFl94AQBr',
+        bottom: -68,
+        right: -45,
+        height: '303px',
+      },
+      {
+        src: 'https://mdn.alipayobjects.com/yuyan_qk0oxh/afts/img/F6vSTbj8KpYAAAAAAAAAAAAAFl94AQBr',
+        bottom: 0,
+        left: 0,
+        width: '331px',
+      },
+    ],
+    links: isDev
+      ? [
+          // eslint-disable-next-line react/jsx-key
+          <Button
+            onClick={() => {
+              window.open('https://funcion_woqu.gitee.io/fabric-doc/api/');
+            }}
+          >
+            <LinkOutlined />
+            <span>fabric 中文文档</span>
+          </Button>,
+        ]
+      : [],
+    menuHeaderRender: undefined,
+    // 自定义 403 页面
+    // unAccessible: <div>unAccessible</div>,
+    // 增加一个 loading 的状态
+    childrenRender: (children) => {
+      // if (initialState?.loading) return <PageLoading />;
+      return (
+        <>
+          {children}
+          {isDev && (
+            <SettingDrawer
+              disableUrlParams
+              enableDarkTheme
+              settings={initialState?.settings}
+              onSettingChange={(settings) => {
+                setInitialState((preInitialState) => ({
+                  ...preInitialState,
+                  settings,
+                }));
+              }}
+            />
+          )}
+        </>
+      );
+    },
+    ...initialState?.settings,
+  };
+};
+
+const csrfAndJwtHeaderInterceptor = (url: string, options: RequestConfig) => {
+  const csrfHeader = { 'X-CSRFToken': cookie.load('csrftoken') };
+  let bearerToken = {};
+  const access = localStorage.getItem('access');
+  if (access) {
+    bearerToken = { 'X-Token': `${access}` };
+  }
+  let locale = getLocale();
+  return {
+    url: `${url}`,
+    options: {
+      ...options,
+      interceptors: true,
+      headers: { ...csrfHeader, ...bearerToken, 'Accept-Language': locale },
+    },
+  };
+};
+
+const responseHeaderInterceptor = (response: Response) => {
+  if ('new-token' in response.headers) {
+    localStorage.setItem('access', (response.headers['new-token'] || '') as string);
+    window.location.reload();
+  }
+  return response;
+};
+
+/**
+ * @name request 配置,可以配置错误处理
+ * 它基于 axios 和 ahooks 的 useRequest 提供了一套统一的网络请求和错误处理方案。
+ * @doc https://umijs.org/docs/max/request#配置
+ */
+export const request = {
+  ...errorConfig,
+  requestInterceptors: [csrfAndJwtHeaderInterceptor],
+  responseInterceptors: [responseHeaderInterceptor],
+};
diff --git a/src/components/BatchOperation/isBatchDelete.tsx b/src/components/BatchOperation/isBatchDelete.tsx
new file mode 100644
index 0000000..30f384b
--- /dev/null
+++ b/src/components/BatchOperation/isBatchDelete.tsx
@@ -0,0 +1,54 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-16 14:30:15
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-16 14:35:20
+ * @FilePath: \general-ai-platform-web\src\components\BatchOperation\isBatchDelete.tsx
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+import { ExclamationCircleOutlined } from '@ant-design/icons';
+// import { useIntl } from '@ant-design/pro-components';
+import { useIntl } from '@umijs/max';
+import { Button, Modal } from 'antd';
+import { FormattedMessage } from 'react-intl';
+
+type IsBatchDeleteProps = {
+  // eslint-disable-next-line @typescript-eslint/ban-types
+  deleteApi: Function;
+};
+
+const IsBatchDelete: React.FC<IsBatchDeleteProps> = (props) => {
+  const intl = useIntl();
+
+  return (
+    <Button
+      danger
+      onClick={async () => {
+        Modal.confirm({
+          icon: <ExclamationCircleOutlined />,
+          title: intl.formatMessage({
+            id: 'common.modal.table.delete.title',
+            defaultMessage: '$$$',
+          }),
+          content: intl.formatMessage({
+            id: 'common.modal.table.delete.content',
+            defaultMessage: '$$$',
+          }),
+          okText: intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' }),
+          cancelText: intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' }),
+          onOk() {
+            // TODO 未对接批量删除接口
+            props.deleteApi();
+          },
+          onCancel() {
+            console.log('Cancel');
+          },
+        });
+      }}
+    >
+      <FormattedMessage id="pages.searchTable.batchDeletion" defaultMessage="Batch deletion" />
+    </Button>
+  );
+};
+
+export default IsBatchDelete;
diff --git a/src/components/DictionaryBox/isEnable.tsx b/src/components/DictionaryBox/isEnable.tsx
new file mode 100644
index 0000000..767702b
--- /dev/null
+++ b/src/components/DictionaryBox/isEnable.tsx
@@ -0,0 +1,32 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-15 15:01:34
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-22 13:24:58
+ * @FilePath: \general-ai-platform-web\src\components\DictionaryBox\isEnable.tsx
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+import { isEnableEnum } from '@/enums/common';
+import { Badge } from 'antd';
+import { FormattedMessage } from 'react-intl';
+
+type IsEnableBoxProps = {
+  isEnable: boolean;
+};
+
+const IsEnableBox: React.FC<IsEnableBoxProps> = (props) => {
+  const { isEnable } = props;
+
+  const currentItem = isEnableEnum[isEnable ? '1' : '0']
+
+  return (
+    <div style={{ display: 'flex', alignItems: 'center'}}>
+      <Badge status={isEnable ? 'success' : 'default'}></Badge>
+      <span style={{color: currentItem.color, paddingLeft: 4 }}>
+        <FormattedMessage id={isEnable ? 'common.enable' : 'common.disable'} defaultMessage="$$$" />
+      </span>
+    </div>
+  );
+};
+
+export default IsEnableBox;
diff --git a/src/components/Footer/index.tsx b/src/components/Footer/index.tsx
new file mode 100644
index 0000000..0ca2152
--- /dev/null
+++ b/src/components/Footer/index.tsx
@@ -0,0 +1,18 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-22 10:02:59
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-12-05 10:56:42
+ * @FilePath: \react-adpro-fabric\src\components\Footer\index.tsx
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+import { GithubOutlined } from '@ant-design/icons';
+import { DefaultFooter } from '@ant-design/pro-components';
+import { useIntl } from '@umijs/max';
+import React from 'react';
+
+const Footer: React.FC = () => {
+  return <></>
+};
+
+export default Footer;
diff --git a/src/components/HeaderDropdown/index.tsx b/src/components/HeaderDropdown/index.tsx
new file mode 100644
index 0000000..52abe00
--- /dev/null
+++ b/src/components/HeaderDropdown/index.tsx
@@ -0,0 +1,23 @@
+import { Dropdown } from 'antd';
+import type { DropDownProps } from 'antd/es/dropdown';
+import React from 'react';
+import { useEmotionCss } from '@ant-design/use-emotion-css';
+import classNames from 'classnames';
+
+export type HeaderDropdownProps = {
+  overlayClassName?: string;
+  placement?: 'bottomLeft' | 'bottomRight' | 'topLeft' | 'topCenter' | 'topRight' | 'bottomCenter';
+} & Omit<DropDownProps, 'overlay'>;
+
+const HeaderDropdown: React.FC<HeaderDropdownProps> = ({ overlayClassName: cls, ...restProps }) => {
+  const className = useEmotionCss(({ token }) => {
+    return {
+      [`@media screen and (max-width: ${token.screenXS}px)`]: {
+        width: '100%',
+      },
+    };
+  });
+  return <Dropdown overlayClassName={classNames(className, cls)} {...restProps} />;
+};
+
+export default HeaderDropdown;
diff --git a/src/components/IconSelector/Category.tsx b/src/components/IconSelector/Category.tsx
new file mode 100644
index 0000000..1a862c3
--- /dev/null
+++ b/src/components/IconSelector/Category.tsx
@@ -0,0 +1,63 @@
+import * as React from 'react';
+import CopyableIcon from './CopyableIcon';
+import type { ThemeType } from './index';
+import type { CategoriesKeys } from './fields';
+import { useIntl } from '@umijs/max';
+import styles from './style.less';
+
+interface CategoryProps {
+  title: CategoriesKeys;
+  icons: string[];
+  theme: ThemeType;
+  newIcons: string[];
+  onSelect: (type: string, name: string) => any;
+}
+
+const Category: React.FC<CategoryProps> = props => {
+
+  const { icons, title, newIcons, theme } = props;
+  const intl = useIntl();
+  const [justCopied, setJustCopied] = React.useState<string | null>(null);
+  const copyId = React.useRef<NodeJS.Timeout | null>(null);
+  const onSelect = React.useCallback((type: string, text: string) => {
+    const { onSelect } = props;
+    if (onSelect) {
+      onSelect(type, text);
+    }
+    setJustCopied(type);
+    copyId.current = setTimeout(() => {
+      setJustCopied(null);
+    }, 2000);
+  }, []);
+  React.useEffect(
+    () => () => {
+      if (copyId.current) {
+        clearTimeout(copyId.current);
+      }
+    },
+    [],
+  );
+
+  return (
+    <div>
+      <h4 style={{paddingTop: 16}}>{intl.formatMessage({
+        id: `app.docs.components.icon.category.${title}`,
+        defaultMessage: '信息',
+      })}</h4>
+      <ul className={styles.anticonsList}>
+        {icons.map(name => (
+          <CopyableIcon
+            key={name}
+            name={name}
+            theme={theme}
+            isNew={newIcons.includes(name)}
+            justCopied={justCopied}
+            onSelect={onSelect}
+          />
+        ))}
+      </ul>
+    </div>
+  );
+};
+
+export default Category;
diff --git a/src/components/IconSelector/CopyableIcon.tsx b/src/components/IconSelector/CopyableIcon.tsx
new file mode 100644
index 0000000..214b5c7
--- /dev/null
+++ b/src/components/IconSelector/CopyableIcon.tsx
@@ -0,0 +1,52 @@
+import * as React from 'react';
+import { Tooltip } from 'antd';
+import classNames from 'classnames';
+import * as AntdIcons from '@ant-design/icons';
+import type { ThemeType } from './index';
+import styles from './style.less';
+
+const allIcons: {
+  [key: string]: any;
+} = AntdIcons;
+
+export interface CopyableIconProps {
+  name: string;
+  isNew: boolean;
+  theme: ThemeType;
+  justCopied: string | null;
+  onSelect: (type: string, text: string) => any;
+}
+
+const CopyableIcon: React.FC<CopyableIconProps> = ({
+  name,
+  justCopied,
+  onSelect,
+  theme,
+}) => {
+  const className = classNames({
+    gn: true,
+    themeBgHover: true,
+    copied: justCopied === name,
+    [theme]: !!theme,
+  });
+  return (
+    <li className={className}
+    style={{
+      lineHeight: '48px',
+    }}
+      onClick={() => {
+        if (onSelect) {
+          onSelect(theme, name);
+        }
+      }}>
+      <Tooltip title={name}>
+        {React.createElement(allIcons[name], { className: styles.anticon })}
+      </Tooltip>
+      {/* <span className={styles.anticonClass}>
+          <Badge dot={isNew}>{name}</Badge>
+        </span> */}
+    </li>
+  );
+};
+
+export default CopyableIcon;
diff --git a/src/components/IconSelector/IconPicSearcher.tsx b/src/components/IconSelector/IconPicSearcher.tsx
new file mode 100644
index 0000000..3a4cf01
--- /dev/null
+++ b/src/components/IconSelector/IconPicSearcher.tsx
@@ -0,0 +1,233 @@
+import React, { useCallback, useEffect, useState } from 'react';
+import { Upload, Tooltip, Popover, Modal, Progress, Spin, Result } from 'antd';
+import * as AntdIcons from '@ant-design/icons';
+import { useIntl } from '@umijs/max';
+import './style.less';
+
+const allIcons: { [key: string]: any } = AntdIcons;
+
+const { Dragger } = Upload;
+interface AntdIconClassifier {
+  load: () => void;
+  predict: (imgEl: HTMLImageElement) => void;
+}
+declare global {
+  interface Window {
+    antdIconClassifier: AntdIconClassifier;
+  }
+}
+
+interface PicSearcherState {
+  loading: boolean;
+  modalOpen: boolean;
+  popoverVisible: boolean;
+  icons: iconObject[];
+  fileList: any[];
+  error: boolean;
+  modelLoaded: boolean;
+}
+
+interface iconObject {
+  type: string;
+  score: number;
+}
+
+const PicSearcher: React.FC = () => {
+  const intl = useIntl();
+  const {formatMessage} = intl;
+  const [state, setState] = useState<PicSearcherState>({
+    loading: false,
+    modalOpen: false,
+    popoverVisible: false,
+    icons: [],
+    fileList: [],
+    error: false,
+    modelLoaded: false,
+  });
+  const predict = (imgEl: HTMLImageElement) => {
+    try {
+      let icons: any[] = window.antdIconClassifier.predict(imgEl);
+      if (gtag && icons.length) {
+        gtag('event', 'icon', {
+          event_category: 'search-by-image',
+          event_label: icons[0].className,
+        });
+      }
+      icons = icons.map(i => ({ score: i.score, type: i.className.replace(/\s/g, '-') }));
+      setState(prev => ({ ...prev, loading: false, error: false, icons }));
+    } catch {
+      setState(prev => ({ ...prev, loading: false, error: true }));
+    }
+  };
+  // eslint-disable-next-line class-methods-use-this
+  const toImage = (url: string) =>
+    new Promise(resolve => {
+      const img = new Image();
+      img.setAttribute('crossOrigin', 'anonymous');
+      img.src = url;
+      img.onload = () => {
+        resolve(img);
+      };
+    });
+
+  const uploadFile = useCallback((file: File) => {
+    setState(prev => ({ ...prev, loading: true }));
+    const reader = new FileReader();
+    reader.onload = () => {
+      toImage(reader.result as string).then(predict);
+      setState(prev => ({
+        ...prev,
+        fileList: [{ uid: 1, name: file.name, status: 'done', url: reader.result }],
+      }));
+    };
+    reader.readAsDataURL(file);
+  }, []);
+
+  const onPaste = useCallback((event: ClipboardEvent) => {
+    const items = event.clipboardData && event.clipboardData.items;
+    let file = null;
+    if (items && items.length) {
+      for (let i = 0; i < items.length; i++) {
+        if (items[i].type.includes('image')) {
+          file = items[i].getAsFile();
+          break;
+        }
+      }
+    }
+    if (file) {
+      uploadFile(file);
+    }
+  }, []);
+  const toggleModal = useCallback(() => {
+    setState(prev => ({
+      ...prev,
+      modalOpen: !prev.modalOpen,
+      popoverVisible: false,
+      fileList: [],
+      icons: [],
+    }));
+    if (!localStorage.getItem('disableIconTip')) {
+      localStorage.setItem('disableIconTip', 'true');
+    }
+  }, []);
+
+  useEffect(() => {
+    const script = document.createElement('script');
+    script.onload = async () => {
+      await window.antdIconClassifier.load();
+      setState(prev => ({ ...prev, modelLoaded: true }));
+      document.addEventListener('paste', onPaste);
+    };
+    script.src = 'https://cdn.jsdelivr.net/gh/lewis617/antd-icon-classifier@0.0/dist/main.js';
+    document.head.appendChild(script);
+    setState(prev => ({ ...prev, popoverVisible: !localStorage.getItem('disableIconTip') }));
+    return () => {
+      document.removeEventListener('paste', onPaste);
+    };
+  }, []);
+
+  return (
+    <div className="iconPicSearcher">
+      <Popover
+        content={formatMessage({id: 'app.docs.components.icon.pic-searcher.intro'})}
+        open={state.popoverVisible}
+      >
+        <AntdIcons.CameraOutlined className="icon-pic-btn" onClick={toggleModal} />
+      </Popover>
+      <Modal
+        title={intl.formatMessage({
+          id: 'app.docs.components.icon.pic-searcher.title',
+          defaultMessage: '信息',
+        })}
+        open={state.modalOpen}
+        onCancel={toggleModal}
+        footer={null}
+      >
+        {state.modelLoaded || (
+          <Spin
+            spinning={!state.modelLoaded}
+            tip={formatMessage({
+              id: 'app.docs.components.icon.pic-searcher.modelloading',
+
+            })}
+          >
+            <div style={{ height: 100 }} />
+          </Spin>
+        )}
+        {state.modelLoaded && (
+          <Dragger
+            accept="image/jpeg, image/png"
+            listType="picture"
+            customRequest={o => uploadFile(o.file as File)}
+            fileList={state.fileList}
+            showUploadList={{ showPreviewIcon: false, showRemoveIcon: false }}
+          >
+            <p className="ant-upload-drag-icon">
+              <AntdIcons.InboxOutlined />
+            </p>
+            <p className="ant-upload-text">
+              {formatMessage({id: 'app.docs.components.icon.pic-searcher.upload-text'})}
+            </p>
+            <p className="ant-upload-hint">
+              {formatMessage({id: 'app.docs.components.icon.pic-searcher.upload-hint'})}
+            </p>
+          </Dragger>
+        )}
+        <Spin
+          spinning={state.loading}
+          tip={formatMessage({id: 'app.docs.components.icon.pic-searcher.matching'})}
+        >
+          <div className="icon-pic-search-result">
+            {state.icons.length > 0 && (
+              <div className="result-tip">
+                {formatMessage({id: 'app.docs.components.icon.pic-searcher.result-tip'})}
+              </div>
+            )}
+            <table>
+              {state.icons.length > 0 && (
+                <thead>
+                  <tr>
+                    <th className="col-icon">
+                      {formatMessage({id: 'app.docs.components.icon.pic-searcher.th-icon'})}
+                    </th>
+                    <th>{formatMessage({id: 'app.docs.components.icon.pic-searcher.th-score'})}</th>
+                  </tr>
+                </thead>
+              )}
+              <tbody>
+                {state.icons.map(icon => {
+                  const { type } = icon;
+                  const iconName = `${type
+                    .split('-')
+                    .map(str => `${str[0].toUpperCase()}${str.slice(1)}`)
+                    .join('')}Outlined`;
+                  return (
+                    <tr key={iconName}>
+                      <td className="col-icon">
+                          <Tooltip title={icon.type} placement="right">
+                            {React.createElement(allIcons[iconName])}
+                          </Tooltip>
+                      </td>
+                      <td>
+                        <Progress percent={Math.ceil(icon.score * 100)} />
+                      </td>
+                    </tr>
+                  );
+                })}
+              </tbody>
+            </table>
+            {state.error && (
+              <Result
+                status="500"
+                title="503"
+                subTitle={formatMessage({id: 'app.docs.components.icon.pic-searcher.server-error'})}
+              />
+            )}
+          </div>
+        </Spin>
+      </Modal>
+    </div>
+  );
+};
+
+export default PicSearcher;
diff --git a/src/components/IconSelector/fields.ts b/src/components/IconSelector/fields.ts
new file mode 100644
index 0000000..de37e67
--- /dev/null
+++ b/src/components/IconSelector/fields.ts
@@ -0,0 +1,223 @@
+import * as AntdIcons from '@ant-design/icons/lib/icons';
+
+const all = Object.keys(AntdIcons)
+  .map(n => n.replace(/(Outlined|Filled|TwoTone)$/, ''))
+  .filter((n, i, arr) => arr.indexOf(n) === i);
+
+const direction = [
+  'StepBackward',
+  'StepForward',
+  'FastBackward',
+  'FastForward',
+  'Shrink',
+  'ArrowsAlt',
+  'Down',
+  'Up',
+  'Left',
+  'Right',
+  'CaretUp',
+  'CaretDown',
+  'CaretLeft',
+  'CaretRight',
+  'UpCircle',
+  'DownCircle',
+  'LeftCircle',
+  'RightCircle',
+  'DoubleRight',
+  'DoubleLeft',
+  'VerticalLeft',
+  'VerticalRight',
+  'VerticalAlignTop',
+  'VerticalAlignMiddle',
+  'VerticalAlignBottom',
+  'Forward',
+  'Backward',
+  'Rollback',
+  'Enter',
+  'Retweet',
+  'Swap',
+  'SwapLeft',
+  'SwapRight',
+  'ArrowUp',
+  'ArrowDown',
+  'ArrowLeft',
+  'ArrowRight',
+  'PlayCircle',
+  'UpSquare',
+  'DownSquare',
+  'LeftSquare',
+  'RightSquare',
+  'Login',
+  'Logout',
+  'MenuFold',
+  'MenuUnfold',
+  'BorderBottom',
+  'BorderHorizontal',
+  'BorderInner',
+  'BorderOuter',
+  'BorderLeft',
+  'BorderRight',
+  'BorderTop',
+  'BorderVerticle',
+  'PicCenter',
+  'PicLeft',
+  'PicRight',
+  'RadiusBottomleft',
+  'RadiusBottomright',
+  'RadiusUpleft',
+  'RadiusUpright',
+  'Fullscreen',
+  'FullscreenExit',
+];
+
+const suggestion = [
+  'Question',
+  'QuestionCircle',
+  'Plus',
+  'PlusCircle',
+  'Pause',
+  'PauseCircle',
+  'Minus',
+  'MinusCircle',
+  'PlusSquare',
+  'MinusSquare',
+  'Info',
+  'InfoCircle',
+  'Exclamation',
+  'ExclamationCircle',
+  'Close',
+  'CloseCircle',
+  'CloseSquare',
+  'Check',
+  'CheckCircle',
+  'CheckSquare',
+  'ClockCircle',
+  'Warning',
+  'IssuesClose',
+  'Stop',
+];
+
+const editor = [
+  'Edit',
+  'Form',
+  'Copy',
+  'Scissor',
+  'Delete',
+  'Snippets',
+  'Diff',
+  'Highlight',
+  'AlignCenter',
+  'AlignLeft',
+  'AlignRight',
+  'BgColors',
+  'Bold',
+  'Italic',
+  'Underline',
+  'Strikethrough',
+  'Redo',
+  'Undo',
+  'ZoomIn',
+  'ZoomOut',
+  'FontColors',
+  'FontSize',
+  'LineHeight',
+  'Dash',
+  'SmallDash',
+  'SortAscending',
+  'SortDescending',
+  'Drag',
+  'OrderedList',
+  'UnorderedList',
+  'RadiusSetting',
+  'ColumnWidth',
+  'ColumnHeight',
+];
+
+const data = [
+  'AreaChart',
+  'PieChart',
+  'BarChart',
+  'DotChart',
+  'LineChart',
+  'RadarChart',
+  'HeatMap',
+  'Fall',
+  'Rise',
+  'Stock',
+  'BoxPlot',
+  'Fund',
+  'Sliders',
+];
+
+const logo = [
+  'Android',
+  'Apple',
+  'Windows',
+  'Ie',
+  'Chrome',
+  'Github',
+  'Aliwangwang',
+  'Dingding',
+  'WeiboSquare',
+  'WeiboCircle',
+  'TaobaoCircle',
+  'Html5',
+  'Weibo',
+  'Twitter',
+  'Wechat',
+  'Youtube',
+  'AlipayCircle',
+  'Taobao',
+  'Skype',
+  'Qq',
+  'MediumWorkmark',
+  'Gitlab',
+  'Medium',
+  'Linkedin',
+  'GooglePlus',
+  'Dropbox',
+  'Facebook',
+  'Codepen',
+  'CodeSandbox',
+  'CodeSandboxCircle',
+  'Amazon',
+  'Google',
+  'CodepenCircle',
+  'Alipay',
+  'AntDesign',
+  'AntCloud',
+  'Aliyun',
+  'Zhihu',
+  'Slack',
+  'SlackSquare',
+  'Behance',
+  'BehanceSquare',
+  'Dribbble',
+  'DribbbleSquare',
+  'Instagram',
+  'Yuque',
+  'Alibaba',
+  'Yahoo',
+  'Reddit',
+  'Sketch',
+  'WhatsApp',
+  'Dingtalk',
+];
+
+const datum = [...direction, ...suggestion, ...editor, ...data, ...logo];
+
+const other = all.filter(n => !datum.includes(n));
+
+export const categories = {
+  direction,
+  suggestion,
+  editor,
+  data,
+  logo,
+  other,
+};
+
+export default categories;
+
+export type Categories = typeof categories;
+export type CategoriesKeys = keyof Categories;
diff --git a/src/components/IconSelector/icon.ts b/src/components/IconSelector/icon.ts
new file mode 100644
index 0000000..041a68e
--- /dev/null
+++ b/src/components/IconSelector/icon.ts
@@ -0,0 +1,11 @@
+import React from 'react'
+import * as icons from '@ant-design/icons'
+// 自定义样式style
+const Icon = (props: { icon: string, style?: object}) => {
+  const { icon, style  } = props;
+  const antIcon: { [key: string]: any } = icons;
+  return React.createElement(antIcon[icon], { style });
+
+};
+
+export default Icon
diff --git a/src/components/IconSelector/index.tsx b/src/components/IconSelector/index.tsx
new file mode 100644
index 0000000..db88e69
--- /dev/null
+++ b/src/components/IconSelector/index.tsx
@@ -0,0 +1,147 @@
+import * as React from 'react';
+import Icon, * as AntdIcons from '@ant-design/icons';
+import { Radio, Input, Empty } from 'antd';
+import type { RadioChangeEvent } from 'antd/es/radio/interface';
+import {debounce } from 'lodash';
+import Category from './Category';
+import IconPicSearcher from './IconPicSearcher';
+import { FilledIcon, OutlinedIcon, TwoToneIcon } from './themeIcons';
+import type { CategoriesKeys } from './fields';
+import { categories } from './fields';
+// import { useIntl } from '@umijs/max';
+
+export enum ThemeType {
+  Filled = 'Filled',
+  Outlined = 'Outlined',
+  TwoTone = 'TwoTone',
+}
+
+const allIcons: { [key: string]: any } = AntdIcons;
+
+interface IconSelectorProps {
+  //intl: any;
+  onSelect: any;
+}
+
+interface IconSelectorState {
+  theme: ThemeType;
+  searchKey: string;
+}
+
+const IconSelector: React.FC<IconSelectorProps> = (props) => {
+  // const intl = useIntl();
+  // const { messages } = intl;
+  const { onSelect } = props;
+  const [displayState, setDisplayState] = React.useState<IconSelectorState>({
+    theme: ThemeType.Outlined,
+    searchKey: '',
+  });
+
+  const newIconNames: string[] = [];
+
+  const handleSearchIcon = React.useCallback(
+    debounce((searchKey: string) => {
+      setDisplayState(prevState => ({ ...prevState, searchKey }));
+    }),
+    [],
+  );
+
+  const handleChangeTheme = React.useCallback((e: RadioChangeEvent) => {
+    setDisplayState(prevState => ({ ...prevState, theme: e.target.value as ThemeType }));
+  }, []);
+
+  const renderCategories = React.useMemo<React.ReactNode | React.ReactNode[]>(() => {
+    const { searchKey = '', theme } = displayState;
+
+    const categoriesResult = Object.keys(categories)
+      .map((key: CategoriesKeys) => {
+        let iconList = categories[key];
+        if (searchKey) {
+          const matchKey = searchKey
+            // eslint-disable-next-line prefer-regex-literals
+            .replace(new RegExp(`^<([a-zA-Z]*)\\s/>$`, 'gi'), (_, name) => name)
+            .replace(/(Filled|Outlined|TwoTone)$/, '')
+            .toLowerCase();
+          iconList = iconList.filter((iconName:string) => iconName.toLowerCase().includes(matchKey));
+        }
+
+        // CopyrightCircle is same as Copyright, don't show it
+        iconList = iconList.filter((icon:string) => icon !== 'CopyrightCircle');
+
+        return {
+          category: key,
+          icons: iconList.map((iconName:string) => iconName + theme).filter((iconName:string) => allIcons[iconName]),
+        };
+      })
+      .filter(({ icons }) => !!icons.length)
+      .map(({ category, icons }) => (
+        <Category
+          key={category}
+          title={category as CategoriesKeys}
+          theme={theme}
+          icons={icons}
+          newIcons={newIconNames}
+          onSelect={(type, name) => {
+            if (onSelect) {
+              onSelect(name, allIcons[name]);
+            }
+          }}
+        />
+      ));
+    return categoriesResult.length === 0 ? <Empty style={{ margin: '2em 0' }} /> : categoriesResult;
+  }, [displayState.searchKey, displayState.theme]);
+  return (
+    <>
+      <div className='gn' style={{ display: 'flex', justifyContent: 'space-between' }}>
+        {/* 
+        * //TODO 二级:输入框上方提示文案悬浮会覆盖清空菜单图标项按钮
+        */}
+      <Input.Search
+          // placeholder={messages['app.docs.components.icon.search.placeholder']}
+          style={{ marginRight: 12, flex: 1 }}
+          allowClear
+          onChange={e => handleSearchIcon(e.currentTarget.value)}
+          size="large"
+          autoFocus
+          suffix={<IconPicSearcher />}
+        />
+        {/* <Icon component={OutlinedIcon} /> <Icon component={FilledIcon} TwoToneIcon /> */}
+        <Radio.Group
+          value={displayState.theme}
+          onChange={handleChangeTheme}
+          size="large"
+          optionType="button"
+          buttonStyle="solid"
+          options={[
+            {
+              label:  <>线性</> ,
+              value: ThemeType.Outlined
+            },
+            {
+              label: <>填充</> ,
+              value: ThemeType.Filled
+            },
+            {
+              label: <>彩色</>,
+              value: ThemeType.TwoTone
+            },
+          ]}
+        >
+          {/* <Radio.Button value={ThemeType.Outlined}>
+            <Icon components={OutlinedIcon} /> {messages['app.docs.components.icon.outlined']}
+          </Radio.Button>
+          <Radio.Button value={ThemeType.Filled}>
+            <Icon components={FilledIcon} /> {messages['app.docs.components.icon.filled']}
+          </Radio.Button>
+          <Radio.Button value={ThemeType.TwoTone}>
+            <Icon components={TwoToneIcon} /> {messages['app.docs.components.icon.two-tone']}
+          </Radio.Button> */}
+        </Radio.Group>
+      
+      </div>
+      {renderCategories}
+    </>
+  );
+};
+
+export default IconSelector
diff --git a/src/components/IconSelector/style.less b/src/components/IconSelector/style.less
new file mode 100644
index 0000000..0a4353d
--- /dev/null
+++ b/src/components/IconSelector/style.less
@@ -0,0 +1,137 @@
+.iconPicSearcher {
+  display: inline-block;
+  margin: 0 8px;
+
+  .icon-pic-btn {
+    color: @text-color-secondary;
+    cursor: pointer;
+    transition: all 0.3s;
+
+    &:hover {
+      color: @input-icon-hover-color;
+    }
+  }
+}
+
+.icon-pic-preview {
+  width: 30px;
+  height: 30px;
+  margin-top: 10px;
+  padding: 8px;
+  text-align: center;
+  border: 1px solid @border-color-base;
+  border-radius: 4px;
+
+  > img {
+    max-width: 50px;
+    max-height: 50px;
+  }
+}
+
+.icon-pic-search-result {
+  min-height: 50px;
+  padding: 0 10px;
+
+  > .result-tip {
+    padding: 10px 0;
+    color: @text-color-secondary;
+  }
+
+  > table {
+    width: 100%;
+
+    .col-icon {
+      width: 80px;
+      padding: 10px 0;
+
+      > .anticon {
+        font-size: 30px;
+
+        :hover {
+          color: @link-hover-color;
+        }
+      }
+    }
+  }
+}
+
+ul.anticonsList {
+  margin: 2px 0;
+  overflow: hidden;
+  direction: ltr;
+  list-style: none;
+
+  li {
+    position: relative;
+    float: left;
+    width: 48px;
+    height: 48px;
+    margin: 3px 0;
+    padding: 2px 0 0;
+    overflow: hidden;
+    color: #555;
+    text-align: center;
+    list-style: none;
+    background-color: inherit;
+    border-radius: 4px;
+    cursor: pointer;
+    transition: color 0.3s ease-in-out, background-color 0.3s ease-in-out;
+
+    .rtl & {
+      margin: 3px 0;
+      padding: 2px 0 0;
+    }
+
+    .anticon {
+      margin: 4px 0 2px;
+      font-size: 24px;
+      transition: transform 0.3s ease-in-out;
+      will-change: transform;
+    }
+
+    .anticonClass {
+      display: block;
+      font-family: 'Lucida Console', Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
+      white-space: nowrap;
+      text-align: center;
+      transform: scale(0.83);
+
+      .ant-badge {
+        transition: color 0.3s ease-in-out;
+      }
+    }
+
+    &:hover {
+      color: #fff;
+      background-color: @primary-color;
+
+      .anticon {
+        transform: scale(1.4);
+      }
+
+      .ant-badge {
+        color: #fff;
+      }
+    }
+
+    &.TwoTone:hover {
+      background-color: #8ecafe;
+    }
+
+    &.copied:hover {
+      color: rgba(255, 255, 255, 0.2);
+    }
+
+    &.copied::after {
+      top: -2px;
+      opacity: 1;
+    }
+  }
+}
+
+.copied-code {
+  padding: 2px 4px;
+  font-size: 12px;
+  background: #f5f5f5;
+  border-radius: 2px;
+}
diff --git a/src/components/IconSelector/themeIcons.tsx b/src/components/IconSelector/themeIcons.tsx
new file mode 100644
index 0000000..abefe04
--- /dev/null
+++ b/src/components/IconSelector/themeIcons.tsx
@@ -0,0 +1,41 @@
+import * as React from 'react';
+
+
+export const FilledIcon: React.FC = props => {
+  const path =
+    'M864 64H160C107 64 64 107 64 160v' +
+    '704c0 53 43 96 96 96h704c53 0 96-43 96-96V16' +
+    '0c0-53-43-96-96-96z';
+  return (
+    <svg {...props} viewBox="0 0 1024 1024">
+      <path d={path} />
+    </svg>
+  );
+};
+
+export const OutlinedIcon: React.FC = props => {
+  const path =
+    'M864 64H160C107 64 64 107 64 160v7' +
+    '04c0 53 43 96 96 96h704c53 0 96-43 96-96V160c' +
+    '0-53-43-96-96-96z m-12 800H172c-6.6 0-12-5.4-' +
+    '12-12V172c0-6.6 5.4-12 12-12h680c6.6 0 12 5.4' +
+    ' 12 12v680c0 6.6-5.4 12-12 12z';
+  return (
+    <svg {...props} viewBox="0 0 1024 1024">
+      <path d={path} />
+    </svg>
+  );
+};
+
+export const TwoToneIcon: React.FC = props => {
+  const path =
+    'M16 512c0 273.932 222.066 496 496 49' +
+    '6s496-222.068 496-496S785.932 16 512 16 16 238.' +
+    '066 16 512z m496 368V144c203.41 0 368 164.622 3' +
+    '68 368 0 203.41-164.622 368-368 368z';
+  return (
+    <svg {...props} viewBox="0 0 1024 1024">
+      <path d={path} />
+    </svg>
+  );
+};
diff --git a/src/components/RightContent/AvatarDropdown.tsx b/src/components/RightContent/AvatarDropdown.tsx
new file mode 100644
index 0000000..029c89e
--- /dev/null
+++ b/src/components/RightContent/AvatarDropdown.tsx
@@ -0,0 +1,136 @@
+import { LogoutOutlined, SettingOutlined, UserOutlined } from '@ant-design/icons';
+import { useEmotionCss } from '@ant-design/use-emotion-css';
+// @ts-ignore
+import { history, useModel } from '@umijs/max';
+import { Spin } from 'antd';
+import { stringify } from 'querystring';
+import type { MenuInfo } from 'rc-menu/lib/interface';
+import React, { useCallback } from 'react';
+import { flushSync } from 'react-dom';
+import HeaderDropdown from '../HeaderDropdown';
+import {postJwtJsonInBlacklist} from "@/services/system/Jwt";
+
+export type GlobalHeaderRightProps = {
+  menu?: boolean;
+  children?: React.ReactNode;
+};
+
+export const AvatarName = () => {
+  const { initialState } = useModel('@@initialState');
+  const { currentUser } = initialState || {};
+  return <span className="anticon">{currentUser?.nickName}</span>;
+};
+
+export const AvatarDropdown: React.FC<GlobalHeaderRightProps> = ({ menu, children }) => {
+  /**
+   * 退出登录,并且将当前的 url 保存
+   */
+  const loginOut = async () => {
+    await postJwtJsonInBlacklist()
+    // await UserLogOut();
+    localStorage.removeItem('access')
+    const { search, pathname } = window.location;
+    const urlParams = new URL(window.location.href).searchParams;
+    /** 此方法会跳转到 redirect 参数所在的位置 */
+    const redirect = urlParams.get('redirect');
+    // Note: There may be security issues, please note
+    if (window.location.pathname !== '/showInfo' && !redirect) {
+      history.replace({
+        pathname: '/showInfo',
+        search: stringify({
+          redirect: pathname + search,
+        }),
+      });
+    }
+  };
+  const actionClassName = useEmotionCss(({ token }) => {
+    return {
+      display: 'flex',
+      height: '48px',
+      marginLeft: 'auto',
+      overflow: 'hidden',
+      alignItems: 'center',
+      padding: '0 8px',
+      cursor: 'pointer',
+      borderRadius: token.borderRadius,
+      '&:hover': {
+        backgroundColor: token.colorBgTextHover,
+      },
+    };
+  });
+  const { initialState, setInitialState } = useModel('@@initialState');
+
+  const onMenuClick = useCallback(
+    (event: MenuInfo) => {
+      const { key } = event;
+      if (key === 'logout') {
+        flushSync(() => {
+          setInitialState((s) => ({ ...s, currentUser: undefined, menuData: undefined }));
+        });
+        loginOut().then(() => {});
+        return;
+      }
+      history.push(`/account/${key}`);
+    },  
+    [setInitialState],
+  );
+
+  const loading = (
+    <span className={actionClassName}>
+      <Spin
+        size="small"
+        style={{
+          marginLeft: 8,
+          marginRight: 8,
+        }}
+      />
+    </span>
+  );
+  console.log(initialState)
+  if (!initialState) {
+    return loading;
+  }
+
+  const { currentUser } = initialState;
+
+  if (!currentUser || !currentUser.nickName) {
+    return loading;
+  }
+
+  const menuItems = [
+    ...(menu
+      ? [
+          {
+            key: 'center',
+            icon: <UserOutlined />,
+            label: '个人中心',
+          },
+          {
+            key: 'settings',
+            icon: <SettingOutlined />,
+            label: '个人设置',
+          },
+          {
+            type: 'divider' as const,
+          },
+        ]
+      : []),
+    {
+      key: 'logout',
+      icon: <LogoutOutlined />,
+      label: '退出登录',
+    },
+  ];
+
+  return (
+    <HeaderDropdown
+      menu={{
+        selectedKeys: [],
+        onClick: onMenuClick,
+        items: menuItems,
+      }}
+    >
+      {children}
+    </HeaderDropdown>
+  );
+};
diff --git a/src/components/RightContent/index.tsx b/src/components/RightContent/index.tsx
new file mode 100644
index 0000000..4418bb9
--- /dev/null
+++ b/src/components/RightContent/index.tsx
@@ -0,0 +1,66 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-01 13:56:33
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-28 11:34:00
+ * @FilePath: \general-ai-platform-web\src\components\RightContent\index.tsx
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+import { QuestionCircleOutlined } from '@ant-design/icons';
+import { SelectLang as UmiSelectLang } from '@umijs/max';
+import React from 'react';
+import { Select } from 'antd';
+import {useModel} from "@@/exports";
+export type SiderTheme = 'light' | 'dark';
+import {postUserSetUserRole} from "@/services/system/User";
+
+export const SelectLang = () => {
+  return (
+    <UmiSelectLang
+      style={{
+        padding: 4,
+      }}
+    />
+  );
+};
+
+export const Question = () => {
+  return (
+    <div
+      style={{
+        display: 'flex',
+        height: 26,
+      }}
+      onClick={() => {
+        window.open('https://pro.ant.design/docs/getting-started');
+      }}
+    >
+      <QuestionCircleOutlined />
+    </div>
+  );
+};
+
+export const SelectRole = () => {
+
+  const { initialState } = useModel('@@initialState');
+  const { currentUser } = initialState || {};
+
+  return (
+    <span className='gn'>
+      {
+        currentUser && (
+          <Select
+            defaultValue={currentUser.roleId}
+            options={currentUser?.roles || []}
+            onSelect={value => {
+              postUserSetUserRole({roleId: value}).then((resp) => {
+                console.log(resp)
+              })
+            }}
+          />
+        )
+      }
+    </span>
+
+  );
+};
diff --git a/src/components/TableActionCard/index.tsx b/src/components/TableActionCard/index.tsx
new file mode 100644
index 0000000..8729d05
--- /dev/null
+++ b/src/components/TableActionCard/index.tsx
@@ -0,0 +1,68 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-14 15:49:36
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-16 15:10:41
+ * @FilePath: \general-ai-platform-web\src\components\TableActionCard\index.tsx
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+
+import { DownOutlined } from '@ant-design/icons';
+import { Dropdown } from 'antd';
+import React from 'react';
+
+//TODO 表单的操作按钮集合 key的报错未解决
+type actionsProps = {
+  key: string;
+  renderDom: any
+}
+
+export type TableActionItemProps = {
+  renderActions: actionsProps[];
+};
+
+const TableActionCard: React.FC<TableActionItemProps> = (props) => {
+  const { renderActions } = props;
+  const maxActionCount = 3;
+  let prevActions: any[] = [];
+  const moreActions: { key: string; label: any }[] = [];
+  if (renderActions.length <= maxActionCount) {
+    prevActions = renderActions;
+  } else {
+    // eslint-disable-next-line array-callback-return
+    renderActions.map((item, index) => {
+      if (index < maxActionCount - 1) {
+        prevActions.push(item);
+      } else {
+        moreActions.push({
+          key: index + '',
+          label: item.renderDom,
+        });
+      }
+      // eslint-disable-next-line react/jsx-key
+    });
+  }
+  return (
+    <div>
+      {prevActions.map((item) => {
+        return (
+          <span style={{ paddingRight: 8 }} key={item.key}>
+            {item.renderDom}
+          </span>
+        );
+      })}
+      {moreActions.length ? (
+        <Dropdown menu={{ items: moreActions }}>
+          <a>
+            更多
+            <DownOutlined />
+          </a>
+        </Dropdown>
+      ) : (
+        <></>
+      )}
+    </div>
+  );
+};
+
+export default TableActionCard;
diff --git a/src/components/TableActionCard/isConfirmAction.tsx b/src/components/TableActionCard/isConfirmAction.tsx
new file mode 100644
index 0000000..fea2ee7
--- /dev/null
+++ b/src/components/TableActionCard/isConfirmAction.tsx
@@ -0,0 +1,55 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-16 14:30:15
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-16 16:22:15
+ * @FilePath: \general-ai-platform-web\src\components\BatchOperation\isBatchDelete.tsx
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+// import { useIntl } from '@ant-design/pro-components';
+import { useIntl } from '@umijs/max';
+import { Button, Popconfirm } from 'antd';
+import { FormattedMessage } from 'react-intl';
+
+type isConfirmActionProps = {
+  // eslint-disable-next-line @typescript-eslint/ban-types
+  confirmAction: Function;
+  title: string;
+  description?: string;
+  buttonText?: string;
+  buttonFormatText?: string;
+};
+
+const IsConfirmAction: React.FC<isConfirmActionProps> = (props) => {
+  const intl = useIntl();
+  const description = props.description || `确认${props.title}吗?`;
+  return (
+    <Popconfirm
+      title={props.title}
+      description={description}
+      onConfirm={() => {
+        props.confirmAction();
+      }}
+      onCancel={() => {}}
+      okText={intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' })}
+      cancelText={intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' })}
+    >
+      <Button
+        type="link"
+        size="small"
+        onClick={() => {
+          // setPublishModalOpen(true);
+        }}
+      >
+        {/* 自定义文案优先 */}
+        {props.buttonText ? (
+          props.buttonText
+        ) : (
+          <FormattedMessage id={props.buttonFormatText} defaultMessage="$$$" />
+        )}
+      </Button>
+    </Popconfirm>
+  );
+};
+
+export default IsConfirmAction;
diff --git a/src/components/TableActionCard/isDelete.tsx b/src/components/TableActionCard/isDelete.tsx
new file mode 100644
index 0000000..649cb9c
--- /dev/null
+++ b/src/components/TableActionCard/isDelete.tsx
@@ -0,0 +1,44 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-16 14:30:15
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-16 14:56:27
+ * @FilePath: \general-ai-platform-web\src\components\BatchOperation\isBatchDelete.tsx
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+// import { useIntl } from '@ant-design/pro-components';
+import { useIntl } from '@umijs/max';
+import { Button, Popconfirm } from 'antd';
+import { FormattedMessage } from 'react-intl';
+
+type IsDeleteProps = {
+  // eslint-disable-next-line @typescript-eslint/ban-types
+  deleteApi: Function;
+};
+
+const IsDelete: React.FC<IsDeleteProps> = (props) => {
+  const intl = useIntl();
+
+  return (
+    <Popconfirm
+      key="destroy"
+      placement="topLeft"
+      title={intl.formatMessage({ id: 'common.tip.title', defaultMessage: '$$$' })}
+      description={intl.formatMessage({
+        id: 'common.modal.table.delete.content',
+        defaultMessage: '$$$',
+      })}
+      okText={intl.formatMessage({ id: 'common.yes', defaultMessage: '$$$' })}
+      cancelText={intl.formatMessage({ id: 'common.no', defaultMessage: '$$$' })}
+      onConfirm={() => {
+        props.deleteApi();
+      }}
+    >
+      <Button type="link" size="small" danger>
+        <FormattedMessage id="pages.searchTable.destroy" defaultMessage="Destroy" />
+      </Button>
+    </Popconfirm>
+  );
+};
+
+export default IsDelete;
diff --git a/src/components/TablePaginationCard/index.tsx b/src/components/TablePaginationCard/index.tsx
new file mode 100644
index 0000000..179f36d
--- /dev/null
+++ b/src/components/TablePaginationCard/index.tsx
@@ -0,0 +1,39 @@
+/**
+ * 未使用 验证中
+ */
+import { TableDropdown } from '@ant-design/pro-components';
+import React from 'react';
+
+export type TablePaginationCardProps = {
+  total: number;
+  pageSize: number;
+  current: number;
+  // eslint-disable-next-line @typescript-eslint/ban-types
+  onChange: Function
+  
+};
+// 分页器
+const TablePaginationCard: React.FC<TablePaginationCardProps> = (props) => {
+  const { total, pageSize, current, onChange } = props;
+  const totalPage = Math.ceil(total / pageSize);
+
+  const handleChange = (page: number, pageSize: number) => {
+    onChange(page, pageSize);
+  };
+
+  return (
+    <div>
+      <span>
+        Total {total} items, {totalPage} pages
+      </span>
+      <TableDropdown
+        total={totalPage as number}
+        current={current}
+        pageSize={pageSize}
+        onClick={(e) => handleChange(e, pageSize)}
+      />
+    </div>
+  );
+};
+
+export default TablePaginationCard;
diff --git a/src/components/VideoPlayer/index.tsx b/src/components/VideoPlayer/index.tsx
new file mode 100644
index 0000000..d68c571
--- /dev/null
+++ b/src/components/VideoPlayer/index.tsx
@@ -0,0 +1,54 @@
+import React from 'react';
+import videojs from 'video.js';
+import './video.css';
+import './videojs-new-markers.js'
+
+export const VideoJS = (props) => {
+  const videoRef = React.useRef(null);
+  const playerRef = React.useRef(null);
+  const {options, onReady} = props;
+
+  React.useEffect(() => {
+
+    // Make sure Video.js player is only initialized once
+    if (!playerRef.current) {
+      // The Video.js player needs to be _inside_ the component el for React 18 Strict Mode.
+      const videoElement = document.createElement("video-js");
+
+      videoElement.classList.add('vjs-big-play-centered');
+      videoRef.current.appendChild(videoElement);
+
+      const player = playerRef.current = videojs(videoElement, options, () => {
+        videojs.log('player is ready');
+        onReady && onReady(player);
+      });
+
+      // You could update an existing player in the `else` block here
+      // on prop change, for example:
+    } else {
+      const player = playerRef.current;
+      player.autoplay(options.autoplay);
+      player.src(options.sources);
+    }
+  }, [options, videoRef]);
+
+  // Dispose the Video.js player when the functional component unmounts
+  React.useEffect(() => {
+    const player = playerRef.current;
+
+    return () => {
+      if (player && !player.isDisposed()) {
+        player.dispose();
+        playerRef.current = null;
+      }
+    };
+  }, [playerRef]);
+
+  return (
+    <div data-vjs-player={true}>
+      <div ref={videoRef} />
+    </div>
+  );
+}
+
+export default VideoJS;
diff --git a/src/components/VideoPlayer/video.css b/src/components/VideoPlayer/video.css
new file mode 100644
index 0000000..3acf9c9
--- /dev/null
+++ b/src/components/VideoPlayer/video.css
@@ -0,0 +1,1957 @@
+.bubble{
+  /*border: 2px solid #DB372C;*/
+  position: relative;
+  border-radius: 7px;
+  background: #DB372C;
+  .text {
+    color: #fff;
+    font-size: 30px;
+    font-weight: 500;
+    text-align: center;
+    padding: 20px;
+  }
+}
+.bubble::before{
+  content: '';
+  width: 0;
+  height: 0;
+  border: 10px solid;
+  position: absolute;
+  bottom: -20px;
+  left: 20px;
+  border-color: #DB372C transparent transparent;
+}
+
+.vjs-svg-icon {
+  display: inline-block;
+  background-repeat: no-repeat;
+  background-position: center;
+  fill: #FFFFFF;
+  height: 1.5em;
+  width: 1.5em;
+}
+.vjs-svg-icon:before {
+  content: none !important;
+}
+
+.vjs-svg-icon:hover,
+.vjs-control:focus .vjs-svg-icon {
+  filter: drop-shadow(0 0 0.25em #fff);
+}
+
+.vjs-modal-dialog .vjs-modal-dialog-content, .video-js .vjs-modal-dialog, .vjs-button > .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+
+.vjs-button > .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before {
+  text-align: center;
+}
+
+@font-face {
+  font-family: VideoJS;
+  src: url(data:application/font-woff;charset=utf-8;base64,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) format("woff");
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-play, .video-js .vjs-play-control .vjs-icon-placeholder, .video-js .vjs-big-play-button .vjs-icon-placeholder:before {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-play:before, .video-js .vjs-play-control .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before {
+  content: "\f101";
+}
+
+.vjs-icon-play-circle {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-play-circle:before {
+  content: "\f102";
+}
+
+.vjs-icon-pause, .video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-pause:before, .video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder:before {
+  content: "\f103";
+}
+
+.vjs-icon-volume-mute, .video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-volume-mute:before, .video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder:before {
+  content: "\f104";
+}
+
+.vjs-icon-volume-low, .video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-volume-low:before, .video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder:before {
+  content: "\f105";
+}
+
+.vjs-icon-volume-mid, .video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-volume-mid:before, .video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder:before {
+  content: "\f106";
+}
+
+.vjs-icon-volume-high, .video-js .vjs-mute-control .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-volume-high:before, .video-js .vjs-mute-control .vjs-icon-placeholder:before {
+  content: "\f107";
+}
+
+.vjs-icon-fullscreen-enter, .video-js .vjs-fullscreen-control .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-fullscreen-enter:before, .video-js .vjs-fullscreen-control .vjs-icon-placeholder:before {
+  content: "\f108";
+}
+
+.vjs-icon-fullscreen-exit, .video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-fullscreen-exit:before, .video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder:before {
+  content: "\f109";
+}
+
+.vjs-icon-spinner {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-spinner:before {
+  content: "\f10a";
+}
+
+.vjs-icon-subtitles, .video-js .vjs-subs-caps-button .vjs-icon-placeholder,
+.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder,
+.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder,
+.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder,
+.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder, .video-js .vjs-subtitles-button .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-subtitles:before, .video-js .vjs-subs-caps-button .vjs-icon-placeholder:before,
+.video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder:before,
+.video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder:before,
+.video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder:before,
+.video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder:before, .video-js .vjs-subtitles-button .vjs-icon-placeholder:before {
+  content: "\f10b";
+}
+
+.vjs-icon-captions, .video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder,
+.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder, .video-js .vjs-captions-button .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-captions:before, .video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder:before,
+.video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder:before, .video-js .vjs-captions-button .vjs-icon-placeholder:before {
+  content: "\f10c";
+}
+
+.vjs-icon-hd {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-hd:before {
+  content: "\f10d";
+}
+
+.vjs-icon-chapters, .video-js .vjs-chapters-button .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-chapters:before, .video-js .vjs-chapters-button .vjs-icon-placeholder:before {
+  content: "\f10e";
+}
+
+.vjs-icon-downloading {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-downloading:before {
+  content: "\f10f";
+}
+
+.vjs-icon-file-download {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-file-download:before {
+  content: "\f110";
+}
+
+.vjs-icon-file-download-done {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-file-download-done:before {
+  content: "\f111";
+}
+
+.vjs-icon-file-download-off {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-file-download-off:before {
+  content: "\f112";
+}
+
+.vjs-icon-share {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-share:before {
+  content: "\f113";
+}
+
+.vjs-icon-cog {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-cog:before {
+  content: "\f114";
+}
+
+.vjs-icon-square {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-square:before {
+  content: "\f115";
+}
+
+.vjs-icon-circle, .vjs-seek-to-live-control .vjs-icon-placeholder, .video-js .vjs-volume-level, .video-js .vjs-play-progress {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-circle:before, .vjs-seek-to-live-control .vjs-icon-placeholder:before, .video-js .vjs-volume-level:before, .video-js .vjs-play-progress:before {
+  content: "\f116";
+}
+
+.vjs-icon-circle-outline {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-circle-outline:before {
+  content: "\f117";
+}
+
+.vjs-icon-circle-inner-circle {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-circle-inner-circle:before {
+  content: "\f118";
+}
+
+.vjs-icon-cancel, .video-js .vjs-control.vjs-close-button .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-cancel:before, .video-js .vjs-control.vjs-close-button .vjs-icon-placeholder:before {
+  content: "\f119";
+}
+
+.vjs-icon-repeat {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-repeat:before {
+  content: "\f11a";
+}
+
+.vjs-icon-replay, .video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-replay:before, .video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder:before {
+  content: "\f11b";
+}
+
+.vjs-icon-replay-5, .video-js .vjs-skip-backward-5 .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-replay-5:before, .video-js .vjs-skip-backward-5 .vjs-icon-placeholder:before {
+  content: "\f11c";
+}
+
+.vjs-icon-replay-10, .video-js .vjs-skip-backward-10 .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-replay-10:before, .video-js .vjs-skip-backward-10 .vjs-icon-placeholder:before {
+  content: "\f11d";
+}
+
+.vjs-icon-replay-30, .video-js .vjs-skip-backward-30 .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-replay-30:before, .video-js .vjs-skip-backward-30 .vjs-icon-placeholder:before {
+  content: "\f11e";
+}
+
+.vjs-icon-forward-5, .video-js .vjs-skip-forward-5 .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-forward-5:before, .video-js .vjs-skip-forward-5 .vjs-icon-placeholder:before {
+  content: "\f11f";
+}
+
+.vjs-icon-forward-10, .video-js .vjs-skip-forward-10 .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-forward-10:before, .video-js .vjs-skip-forward-10 .vjs-icon-placeholder:before {
+  content: "\f120";
+}
+
+.vjs-icon-forward-30, .video-js .vjs-skip-forward-30 .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-forward-30:before, .video-js .vjs-skip-forward-30 .vjs-icon-placeholder:before {
+  content: "\f121";
+}
+
+.vjs-icon-audio, .video-js .vjs-audio-button .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-audio:before, .video-js .vjs-audio-button .vjs-icon-placeholder:before {
+  content: "\f122";
+}
+
+.vjs-icon-next-item {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-next-item:before {
+  content: "\f123";
+}
+
+.vjs-icon-previous-item {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-previous-item:before {
+  content: "\f124";
+}
+
+.vjs-icon-shuffle {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-shuffle:before {
+  content: "\f125";
+}
+
+.vjs-icon-cast {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-cast:before {
+  content: "\f126";
+}
+
+.vjs-icon-picture-in-picture-enter, .video-js .vjs-picture-in-picture-control .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-picture-in-picture-enter:before, .video-js .vjs-picture-in-picture-control .vjs-icon-placeholder:before {
+  content: "\f127";
+}
+
+.vjs-icon-picture-in-picture-exit, .video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-picture-in-picture-exit:before, .video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder:before {
+  content: "\f128";
+}
+
+.vjs-icon-facebook {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-facebook:before {
+  content: "\f129";
+}
+
+.vjs-icon-linkedin {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-linkedin:before {
+  content: "\f12a";
+}
+
+.vjs-icon-twitter {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-twitter:before {
+  content: "\f12b";
+}
+
+.vjs-icon-tumblr {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-tumblr:before {
+  content: "\f12c";
+}
+
+.vjs-icon-pinterest {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-pinterest:before {
+  content: "\f12d";
+}
+
+.vjs-icon-audio-description, .video-js .vjs-descriptions-button .vjs-icon-placeholder {
+  font-family: VideoJS;
+  font-weight: normal;
+  font-style: normal;
+}
+.vjs-icon-audio-description:before, .video-js .vjs-descriptions-button .vjs-icon-placeholder:before {
+  content: "\f12e";
+}
+
+.video-js {
+  display: inline-block;
+  vertical-align: top;
+  box-sizing: border-box;
+  color: #fff;
+  background-color: #000;
+  position: relative;
+  padding: 0;
+  font-size: 10px;
+  line-height: 1;
+  font-weight: normal;
+  font-style: normal;
+  font-family: Arial, Helvetica, sans-serif;
+  word-break: initial;
+}
+.video-js:-moz-full-screen {
+  position: absolute;
+}
+.video-js:-webkit-full-screen {
+  width: 100% !important;
+  height: 100% !important;
+}
+
+.video-js[tabindex="-1"] {
+  outline: none;
+}
+
+.video-js *,
+.video-js *:before,
+.video-js *:after {
+  box-sizing: inherit;
+}
+
+.video-js ul {
+  font-family: inherit;
+  font-size: inherit;
+  line-height: inherit;
+  list-style-position: outside;
+  margin-left: 0;
+  margin-right: 0;
+  margin-top: 0;
+  margin-bottom: 0;
+}
+
+.video-js.vjs-fluid,
+.video-js.vjs-16-9,
+.video-js.vjs-4-3,
+.video-js.vjs-9-16,
+.video-js.vjs-1-1 {
+  width: 100%;
+  max-width: 100%;
+}
+
+.video-js.vjs-fluid:not(.vjs-audio-only-mode),
+.video-js.vjs-16-9:not(.vjs-audio-only-mode),
+.video-js.vjs-4-3:not(.vjs-audio-only-mode),
+.video-js.vjs-9-16:not(.vjs-audio-only-mode),
+.video-js.vjs-1-1:not(.vjs-audio-only-mode) {
+  height: 0;
+}
+
+.video-js.vjs-16-9:not(.vjs-audio-only-mode) {
+  padding-top: 56.25%;
+}
+
+.video-js.vjs-4-3:not(.vjs-audio-only-mode) {
+  padding-top: 75%;
+}
+
+.video-js.vjs-9-16:not(.vjs-audio-only-mode) {
+  padding-top: 177.7777777778%;
+}
+
+.video-js.vjs-1-1:not(.vjs-audio-only-mode) {
+  padding-top: 100%;
+}
+
+.video-js.vjs-fill:not(.vjs-audio-only-mode) {
+  width: 100%;
+  height: 100%;
+}
+
+.video-js .vjs-tech {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+
+.video-js.vjs-audio-only-mode .vjs-tech {
+  display: none;
+}
+
+body.vjs-full-window,
+body.vjs-pip-window {
+  padding: 0;
+  margin: 0;
+  height: 100%;
+}
+
+.vjs-full-window .video-js.vjs-fullscreen,
+body.vjs-pip-window .video-js {
+  position: fixed;
+  overflow: hidden;
+  z-index: 1000;
+  left: 0;
+  top: 0;
+  bottom: 0;
+  right: 0;
+}
+
+.video-js.vjs-fullscreen:not(.vjs-ios-native-fs),
+body.vjs-pip-window .video-js {
+  width: 100% !important;
+  height: 100% !important;
+  padding-top: 0 !important;
+  display: block;
+}
+
+.video-js.vjs-fullscreen.vjs-user-inactive {
+  cursor: none;
+}
+
+.vjs-pip-container .vjs-pip-text {
+  position: absolute;
+  bottom: 10%;
+  font-size: 2em;
+  background-color: rgba(0, 0, 0, 0.7);
+  padding: 0.5em;
+  text-align: center;
+  width: 100%;
+}
+
+.vjs-layout-tiny.vjs-pip-container .vjs-pip-text,
+.vjs-layout-x-small.vjs-pip-container .vjs-pip-text,
+.vjs-layout-small.vjs-pip-container .vjs-pip-text {
+  bottom: 0;
+  font-size: 1.4em;
+}
+
+.vjs-hidden {
+  display: none !important;
+}
+
+.vjs-disabled {
+  opacity: 0.5;
+  cursor: default;
+}
+
+.video-js .vjs-offscreen {
+  height: 1px;
+  left: -9999px;
+  position: absolute;
+  top: 0;
+  width: 1px;
+}
+
+.vjs-lock-showing {
+  display: block !important;
+  opacity: 1 !important;
+  visibility: visible !important;
+}
+
+.vjs-no-js {
+  padding: 20px;
+  color: #fff;
+  background-color: #000;
+  font-size: 18px;
+  font-family: Arial, Helvetica, sans-serif;
+  text-align: center;
+  width: 300px;
+  height: 150px;
+  margin: 0px auto;
+}
+
+.vjs-no-js a,
+.vjs-no-js a:visited {
+  color: #66A8CC;
+}
+
+.video-js .vjs-big-play-button {
+  font-size: 3em;
+  line-height: 1.5em;
+  height: 1.63332em;
+  width: 3em;
+  display: block;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  padding: 0;
+  margin-top: -0.81666em;
+  margin-left: -1.5em;
+  cursor: pointer;
+  opacity: 1;
+  border: 0.06666em solid #fff;
+  background-color: #2B333F;
+  background-color: rgba(43, 51, 63, 0.7);
+  border-radius: 0.3em;
+  transition: all 0.4s;
+}
+.vjs-big-play-button .vjs-svg-icon {
+  width: 0.75em;
+  height: 0.75em;
+}
+
+.video-js:hover .vjs-big-play-button,
+.video-js .vjs-big-play-button:focus {
+  border-color: #fff;
+  background-color: #73859f;
+  background-color: rgba(115, 133, 159, 0.5);
+  transition: all 0s;
+}
+
+.vjs-controls-disabled .vjs-big-play-button,
+.vjs-has-started .vjs-big-play-button,
+.vjs-using-native-controls .vjs-big-play-button,
+.vjs-error .vjs-big-play-button {
+  display: none;
+}
+
+.vjs-has-started.vjs-paused.vjs-show-big-play-button-on-pause .vjs-big-play-button {
+  display: block;
+}
+
+.video-js button {
+  background: none;
+  border: none;
+  color: inherit;
+  display: inline-block;
+  font-size: inherit;
+  line-height: inherit;
+  text-transform: none;
+  text-decoration: none;
+  transition: none;
+  -webkit-appearance: none;
+  -moz-appearance: none;
+  appearance: none;
+}
+
+.vjs-control .vjs-button {
+  width: 100%;
+  height: 100%;
+}
+
+.video-js .vjs-control.vjs-close-button {
+  cursor: pointer;
+  height: 3em;
+  position: absolute;
+  right: 0;
+  top: 0.5em;
+  z-index: 2;
+}
+.video-js .vjs-modal-dialog {
+  background: rgba(0, 0, 0, 0.8);
+  background: linear-gradient(180deg, rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0));
+  overflow: auto;
+}
+
+.video-js .vjs-modal-dialog > * {
+  box-sizing: border-box;
+}
+
+.vjs-modal-dialog .vjs-modal-dialog-content {
+  font-size: 1.2em;
+  line-height: 1.5;
+  padding: 20px 24px;
+  z-index: 1;
+}
+
+.vjs-menu-button {
+  cursor: pointer;
+}
+
+.vjs-menu-button.vjs-disabled {
+  cursor: default;
+}
+
+.vjs-workinghover .vjs-menu-button.vjs-disabled:hover .vjs-menu {
+  display: none;
+}
+
+.vjs-menu .vjs-menu-content {
+  display: block;
+  padding: 0;
+  margin: 0;
+  font-family: Arial, Helvetica, sans-serif;
+  overflow: auto;
+}
+
+.vjs-menu .vjs-menu-content > * {
+  box-sizing: border-box;
+}
+
+.vjs-scrubbing .vjs-control.vjs-menu-button:hover .vjs-menu {
+  display: none;
+}
+
+.vjs-menu li {
+  display: flex;
+  justify-content: center;
+  list-style: none;
+  margin: 0;
+  padding: 0.2em 0;
+  line-height: 1.4em;
+  font-size: 1.2em;
+  text-align: center;
+  text-transform: lowercase;
+}
+
+.vjs-menu li.vjs-menu-item:focus,
+.vjs-menu li.vjs-menu-item:hover,
+.js-focus-visible .vjs-menu li.vjs-menu-item:hover {
+  background-color: #73859f;
+  background-color: rgba(115, 133, 159, 0.5);
+}
+
+.vjs-menu li.vjs-selected,
+.vjs-menu li.vjs-selected:focus,
+.vjs-menu li.vjs-selected:hover,
+.js-focus-visible .vjs-menu li.vjs-selected:hover {
+  background-color: #fff;
+  color: #2B333F;
+}
+.vjs-menu li.vjs-selected .vjs-svg-icon,
+.vjs-menu li.vjs-selected:focus .vjs-svg-icon,
+.vjs-menu li.vjs-selected:hover .vjs-svg-icon,
+.js-focus-visible .vjs-menu li.vjs-selected:hover .vjs-svg-icon {
+  fill: #000000;
+}
+
+.video-js .vjs-menu *:not(.vjs-selected):focus:not(:focus-visible),
+.js-focus-visible .vjs-menu *:not(.vjs-selected):focus:not(.focus-visible) {
+  background: none;
+}
+
+.vjs-menu li.vjs-menu-title {
+  text-align: center;
+  text-transform: uppercase;
+  font-size: 1em;
+  line-height: 2em;
+  padding: 0;
+  margin: 0 0 0.3em 0;
+  font-weight: bold;
+  cursor: default;
+}
+
+.vjs-menu-button-popup .vjs-menu {
+  display: none;
+  position: absolute;
+  bottom: 0;
+  width: 10em;
+  left: -3em;
+  height: 0em;
+  margin-bottom: 1.5em;
+  border-top-color: rgba(43, 51, 63, 0.7);
+}
+
+.vjs-pip-window .vjs-menu-button-popup .vjs-menu {
+  left: unset;
+  right: 1em;
+}
+
+.vjs-menu-button-popup .vjs-menu .vjs-menu-content {
+  background-color: #2B333F;
+  background-color: rgba(43, 51, 63, 0.7);
+  position: absolute;
+  width: 100%;
+  bottom: 1.5em;
+  max-height: 15em;
+}
+
+.vjs-layout-tiny .vjs-menu-button-popup .vjs-menu .vjs-menu-content,
+.vjs-layout-x-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content {
+  max-height: 5em;
+}
+
+.vjs-layout-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content {
+  max-height: 10em;
+}
+
+.vjs-layout-medium .vjs-menu-button-popup .vjs-menu .vjs-menu-content {
+  max-height: 14em;
+}
+
+.vjs-layout-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content,
+.vjs-layout-x-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content,
+.vjs-layout-huge .vjs-menu-button-popup .vjs-menu .vjs-menu-content {
+  max-height: 25em;
+}
+
+.vjs-workinghover .vjs-menu-button-popup.vjs-hover .vjs-menu,
+.vjs-menu-button-popup .vjs-menu.vjs-lock-showing {
+  display: block;
+}
+
+.video-js .vjs-menu-button-inline {
+  transition: all 0.4s;
+  overflow: hidden;
+}
+
+.video-js .vjs-menu-button-inline:before {
+  width: 2.222222222em;
+}
+
+.video-js .vjs-menu-button-inline:hover,
+.video-js .vjs-menu-button-inline:focus,
+.video-js .vjs-menu-button-inline.vjs-slider-active {
+  width: 12em;
+}
+
+.vjs-menu-button-inline .vjs-menu {
+  opacity: 0;
+  height: 100%;
+  width: auto;
+  position: absolute;
+  left: 4em;
+  top: 0;
+  padding: 0;
+  margin: 0;
+  transition: all 0.4s;
+}
+
+.vjs-menu-button-inline:hover .vjs-menu,
+.vjs-menu-button-inline:focus .vjs-menu,
+.vjs-menu-button-inline.vjs-slider-active .vjs-menu {
+  display: block;
+  opacity: 1;
+}
+
+.vjs-menu-button-inline .vjs-menu-content {
+  width: auto;
+  height: 100%;
+  margin: 0;
+  overflow: hidden;
+}
+
+.video-js .vjs-control-bar {
+  display: none;
+  width: 100%;
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  height: 3em;
+  background-color: rgba(0,0,0,0.54);
+  /*background-color: rgba(0,0,0,0.54) !important;*/
+}
+
+.vjs-has-started .vjs-control-bar,
+.vjs-audio-only-mode .vjs-control-bar {
+  display: flex;
+  visibility: visible;
+  opacity: 1;
+  transition: visibility 0.1s, opacity 0.1s;
+}
+
+.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {
+  visibility: visible;
+  opacity: 0;
+  pointer-events: none;
+  transition: visibility 1s, opacity 1s;
+}
+
+.vjs-controls-disabled .vjs-control-bar,
+.vjs-using-native-controls .vjs-control-bar,
+.vjs-error .vjs-control-bar {
+  display: none !important;
+}
+
+.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar,
+.vjs-audio-only-mode.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {
+  opacity: 1;
+  visibility: visible;
+  pointer-events: auto;
+}
+
+.video-js .vjs-control {
+  position: relative;
+  text-align: center;
+  margin: 0;
+  padding: 0;
+  height: 100%;
+  width: 4em;
+  flex: none;
+}
+
+.video-js .vjs-control.vjs-visible-text {
+  width: auto;
+  padding-left: 1em;
+  padding-right: 1em;
+}
+
+.vjs-button > .vjs-icon-placeholder:before {
+  font-size: 1.8em;
+  line-height: 1.67;
+}
+
+.vjs-button > .vjs-icon-placeholder {
+  display: block;
+}
+
+.vjs-button > .vjs-svg-icon {
+  display: inline-block;
+}
+
+.video-js .vjs-control:focus:before,
+.video-js .vjs-control:hover:before,
+.video-js .vjs-control:focus {
+  text-shadow: 0em 0em 1em white;
+}
+
+.video-js *:not(.vjs-visible-text) > .vjs-control-text {
+  border: 0;
+  clip: rect(0 0 0 0);
+  height: 1px;
+  overflow: hidden;
+  padding: 0;
+  position: absolute;
+  width: 1px;
+}
+
+.video-js .vjs-custom-control-spacer {
+  display: none;
+}
+
+.video-js .vjs-progress-control {
+  cursor: pointer;
+  flex: auto;
+  display: flex;
+  align-items: center;
+  min-width: 4em;
+  touch-action: none;
+}
+
+.video-js .vjs-progress-control.disabled {
+  cursor: default;
+}
+
+.vjs-live .vjs-progress-control {
+  display: none;
+}
+
+.vjs-liveui .vjs-progress-control {
+  display: flex;
+  align-items: center;
+}
+
+.video-js .vjs-progress-holder {
+  flex: auto;
+  transition: all 0.2s;
+  height: 0.3em;
+}
+
+.video-js .vjs-progress-control .vjs-progress-holder {
+  margin: 0 10px;
+}
+
+.video-js .vjs-progress-control:hover .vjs-progress-holder {
+  font-size: 1.6666666667em;
+}
+
+.video-js .vjs-progress-control:hover .vjs-progress-holder.disabled {
+  font-size: 1em;
+}
+
+.video-js .vjs-progress-holder .vjs-play-progress,
+.video-js .vjs-progress-holder .vjs-load-progress,
+.video-js .vjs-progress-holder .vjs-load-progress div {
+  position: absolute;
+  display: block;
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  width: 0;
+}
+
+.video-js .vjs-play-progress {
+  background-color: #fff;
+}
+.video-js .vjs-play-progress:before {
+  font-size: 0.9em;
+  position: absolute;
+  right: -0.5em;
+  line-height: 0.35em;
+  z-index: 1;
+}
+
+.vjs-svg-icons-enabled .vjs-play-progress:before {
+  content: none !important;
+}
+
+.vjs-play-progress .vjs-svg-icon {
+  position: absolute;
+  top: -0.35em;
+  right: -0.4em;
+  width: 1em;
+  height: 1em;
+  pointer-events: none;
+  line-height: 0.15em;
+  z-index: 1;
+}
+
+.video-js .vjs-load-progress {
+  background: rgba(115, 133, 159, 0.5);
+}
+
+.video-js .vjs-load-progress div {
+  background: #383838;
+}
+
+.video-js .vjs-time-tooltip {
+  background-color: #fff;
+  background-color: rgba(255, 255, 255, 0.8);
+  border-radius: 0.3em;
+  color: #000;
+  float: right;
+  font-family: Arial, Helvetica, sans-serif;
+  font-size: 1em;
+  padding: 6px 8px 8px 8px;
+  pointer-events: none;
+  position: absolute;
+  top: -3.4em;
+  visibility: hidden;
+  z-index: 1;
+}
+
+.vjs-progress-control:hover .vjs-progress-holder .vjs-play-progress .vjs-svg-icon {
+  width: 0.8em;
+  height: 0.8em;
+  top: -0.25em;
+  right: -0.5em;
+  line-height: 0.35em;
+}
+
+.video-js .vjs-progress-holder:focus .vjs-time-tooltip {
+  display: none;
+}
+
+.video-js .vjs-progress-control:hover .vjs-time-tooltip,
+.video-js .vjs-progress-control:hover .vjs-progress-holder:focus .vjs-time-tooltip {
+  display: block;
+  font-size: 0.6em;
+  visibility: visible;
+}
+
+.video-js .vjs-progress-control.disabled:hover .vjs-time-tooltip {
+  font-size: 1em;
+}
+
+.video-js .vjs-progress-control .vjs-mouse-display {
+  display: none;
+  position: absolute;
+  width: 1px;
+  height: 100%;
+  background-color: #000;
+  z-index: 1;
+}
+
+.video-js .vjs-progress-control:hover .vjs-mouse-display {
+  display: block;
+}
+
+.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display {
+  visibility: hidden;
+  opacity: 0;
+  transition: visibility 1s, opacity 1s;
+}
+
+.vjs-mouse-display .vjs-time-tooltip {
+  color: #fff;
+  background-color: #000;
+  background-color: rgba(0, 0, 0, 0.8);
+}
+
+.video-js .vjs-slider {
+  position: relative;
+  cursor: pointer;
+  padding: 0;
+  margin: 0 0.45em 0 0.45em;
+  /* iOS Safari */
+  -webkit-touch-callout: none;
+  /* Safari, and Chrome 53 */
+  -webkit-user-select: none;
+  /* Non-prefixed version, currently supported by Chrome and Opera */
+  -moz-user-select: none;
+  user-select: none;
+  background-color: #73859f;
+  background-color: rgba(115, 133, 159, 0.5);
+}
+
+.video-js .vjs-slider.disabled {
+  cursor: default;
+}
+
+.video-js .vjs-slider:focus {
+  text-shadow: 0em 0em 1em white;
+  box-shadow: 0 0 1em #fff;
+}
+
+.video-js .vjs-mute-control {
+  cursor: pointer;
+  flex: none;
+}
+.video-js .vjs-volume-control {
+  cursor: pointer;
+  margin-right: 1em;
+  display: flex;
+}
+
+.video-js .vjs-volume-control.vjs-volume-horizontal {
+  width: 5em;
+}
+
+.video-js .vjs-volume-panel .vjs-volume-control {
+  visibility: visible;
+  opacity: 0;
+  width: 1px;
+  height: 1px;
+  margin-left: -1px;
+}
+
+.video-js .vjs-volume-panel {
+  transition: width 1s;
+}
+.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control, .video-js .vjs-volume-panel:active .vjs-volume-control, .video-js .vjs-volume-panel:focus .vjs-volume-control, .video-js .vjs-volume-panel .vjs-volume-control:active, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active {
+  visibility: visible;
+  opacity: 1;
+  position: relative;
+  transition: visibility 0.1s, opacity 0.1s, height 0.1s, width 0.1s, left 0s, top 0s;
+}
+.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-horizontal, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-horizontal {
+  width: 5em;
+  height: 3em;
+  margin-right: 0;
+}
+.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-vertical, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-vertical {
+  left: -3.5em;
+  transition: left 0s;
+}
+.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover, .video-js .vjs-volume-panel.vjs-volume-panel-horizontal:active, .video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active {
+  width: 10em;
+  transition: width 0.1s;
+}
+.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-mute-toggle-only {
+  width: 4em;
+}
+
+.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical {
+  height: 8em;
+  width: 3em;
+  left: -3000em;
+  transition: visibility 1s, opacity 1s, height 1s 1s, width 1s 1s, left 1s 1s, top 1s 1s;
+}
+
+.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal {
+  transition: visibility 1s, opacity 1s, height 1s 1s, width 1s, left 1s 1s, top 1s 1s;
+}
+
+.video-js .vjs-volume-panel {
+  display: flex;
+}
+
+.video-js .vjs-volume-bar {
+  margin: 1.35em 0.45em;
+}
+
+.vjs-volume-bar.vjs-slider-horizontal {
+  width: 5em;
+  height: 0.3em;
+}
+
+.vjs-volume-bar.vjs-slider-vertical {
+  width: 0.3em;
+  height: 5em;
+  margin: 1.35em auto;
+}
+
+.video-js .vjs-volume-level {
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  background-color: #fff;
+}
+.video-js .vjs-volume-level:before {
+  position: absolute;
+  font-size: 0.9em;
+  z-index: 1;
+}
+
+.vjs-slider-vertical .vjs-volume-level {
+  width: 0.3em;
+}
+.vjs-slider-vertical .vjs-volume-level:before {
+  top: -0.5em;
+  left: -0.3em;
+  z-index: 1;
+}
+
+.vjs-svg-icons-enabled .vjs-volume-level:before {
+  content: none;
+}
+
+.vjs-volume-level .vjs-svg-icon {
+  position: absolute;
+  width: 0.6em;
+  height: 0.6em;
+  top: -0.55em;
+  pointer-events: none;
+}
+
+.vjs-mute-control .vjs-svg-icon {
+  width: 1.75em;
+  height: 1.75em;
+}
+
+.vjs-slider-horizontal .vjs-volume-level {
+  height: 0.3em;
+}
+.vjs-slider-horizontal .vjs-volume-level:before {
+  line-height: 0.35em;
+  right: -0.5em;
+}
+
+.vjs-slider-horizontal .vjs-volume-level .vjs-svg-icon {
+  top: -0.15em;
+  right: -0.3em;
+  line-height: 0.05em;
+}
+
+.vjs-slider-vertical .vjs-volume-level .vjs-svg-icon {
+  top: -0.9em;
+  right: -0.15em;
+}
+
+.video-js .vjs-volume-panel.vjs-volume-panel-vertical {
+  width: 4em;
+}
+
+.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level {
+  height: 100%;
+}
+
+.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level {
+  width: 100%;
+}
+
+.video-js .vjs-volume-vertical {
+  width: 3em;
+  height: 8em;
+  bottom: 8em;
+  background-color: #2B333F;
+  background-color: rgba(43, 51, 63, 0.7);
+}
+
+.video-js .vjs-volume-horizontal .vjs-menu {
+  left: -2em;
+}
+
+.video-js .vjs-volume-tooltip {
+  background-color: #fff;
+  background-color: rgba(255, 255, 255, 0.8);
+  border-radius: 0.3em;
+  color: #000;
+  float: right;
+  font-family: Arial, Helvetica, sans-serif;
+  font-size: 1em;
+  padding: 6px 8px 8px 8px;
+  pointer-events: none;
+  position: absolute;
+  top: -3.4em;
+  visibility: hidden;
+  z-index: 1;
+}
+
+.video-js .vjs-volume-control:hover .vjs-volume-tooltip,
+.video-js .vjs-volume-control:hover .vjs-progress-holder:focus .vjs-volume-tooltip {
+  display: block;
+  font-size: 1em;
+  visibility: visible;
+}
+
+.video-js .vjs-volume-vertical:hover .vjs-volume-tooltip,
+.video-js .vjs-volume-vertical:hover .vjs-progress-holder:focus .vjs-volume-tooltip {
+  left: 1em;
+  top: -12px;
+}
+
+.video-js .vjs-volume-control.disabled:hover .vjs-volume-tooltip {
+  font-size: 1em;
+}
+
+.video-js .vjs-volume-control .vjs-mouse-display {
+  display: none;
+  position: absolute;
+  width: 100%;
+  height: 1px;
+  background-color: #000;
+  z-index: 1;
+}
+
+.video-js .vjs-volume-horizontal .vjs-mouse-display {
+  width: 1px;
+  height: 100%;
+}
+
+.video-js .vjs-volume-control:hover .vjs-mouse-display {
+  display: block;
+}
+
+.video-js.vjs-user-inactive .vjs-volume-control .vjs-mouse-display {
+  visibility: hidden;
+  opacity: 0;
+  transition: visibility 1s, opacity 1s;
+}
+
+.vjs-mouse-display .vjs-volume-tooltip {
+  color: #fff;
+  background-color: #000;
+  background-color: rgba(0, 0, 0, 0.8);
+}
+
+.vjs-poster {
+  display: inline-block;
+  vertical-align: middle;
+  cursor: pointer;
+  margin: 0;
+  padding: 0;
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  height: 100%;
+}
+
+.vjs-has-started .vjs-poster,
+.vjs-using-native-controls .vjs-poster {
+  display: none;
+}
+
+.vjs-audio.vjs-has-started .vjs-poster,
+.vjs-has-started.vjs-audio-poster-mode .vjs-poster,
+.vjs-pip-container.vjs-has-started .vjs-poster {
+  display: block;
+}
+
+.vjs-poster img {
+  width: 100%;
+  height: 100%;
+  -o-object-fit: contain;
+  object-fit: contain;
+}
+
+.video-js .vjs-live-control {
+  display: flex;
+  align-items: flex-start;
+  flex: auto;
+  font-size: 1em;
+  line-height: 3em;
+}
+
+.video-js:not(.vjs-live) .vjs-live-control,
+.video-js.vjs-liveui .vjs-live-control {
+  display: none;
+}
+
+.video-js .vjs-seek-to-live-control {
+  align-items: center;
+  cursor: pointer;
+  flex: none;
+  display: inline-flex;
+  height: 100%;
+  padding-left: 0.5em;
+  padding-right: 0.5em;
+  font-size: 1em;
+  line-height: 3em;
+  width: auto;
+  min-width: 4em;
+}
+
+.video-js.vjs-live:not(.vjs-liveui) .vjs-seek-to-live-control,
+.video-js:not(.vjs-live) .vjs-seek-to-live-control {
+  display: none;
+}
+
+.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge {
+  cursor: auto;
+}
+
+.vjs-seek-to-live-control .vjs-icon-placeholder {
+  margin-right: 0.5em;
+  color: #888;
+}
+
+.vjs-svg-icons-enabled .vjs-seek-to-live-control {
+  line-height: 0;
+}
+
+.vjs-seek-to-live-control .vjs-svg-icon {
+  width: 1em;
+  height: 1em;
+  pointer-events: none;
+  fill: #888888;
+}
+
+.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-icon-placeholder {
+  color: red;
+}
+
+.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-svg-icon {
+  fill: red;
+}
+
+.video-js .vjs-time-control {
+  flex: none;
+  font-size: 1em;
+  line-height: 3em;
+  min-width: 2em;
+  width: auto;
+  padding-left: 1em;
+  padding-right: 1em;
+}
+
+.vjs-live .vjs-time-control,
+.vjs-live .vjs-time-divider,
+.video-js .vjs-current-time,
+.video-js .vjs-duration {
+  display: none;
+}
+
+.vjs-time-divider {
+  display: none;
+  line-height: 3em;
+}
+
+.video-js .vjs-play-control {
+  cursor: pointer;
+}
+
+.video-js .vjs-play-control .vjs-icon-placeholder {
+  flex: none;
+}
+
+.vjs-text-track-display {
+  position: absolute;
+  bottom: 3em;
+  left: 0;
+  right: 0;
+  top: 0;
+  pointer-events: none;
+}
+
+.video-js.vjs-controls-disabled .vjs-text-track-display,
+.video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display {
+  bottom: 1em;
+}
+
+.video-js .vjs-text-track {
+  font-size: 1.4em;
+  text-align: center;
+  margin-bottom: 0.1em;
+}
+
+.vjs-subtitles {
+  color: #fff;
+}
+
+.vjs-captions {
+  color: #fc6;
+}
+
+.vjs-tt-cue {
+  display: block;
+}
+
+video::-webkit-media-text-track-display {
+  transform: translateY(-3em);
+}
+
+.video-js.vjs-controls-disabled video::-webkit-media-text-track-display,
+.video-js.vjs-user-inactive.vjs-playing video::-webkit-media-text-track-display {
+  transform: translateY(-1.5em);
+}
+
+.video-js .vjs-picture-in-picture-control {
+  cursor: pointer;
+  flex: none;
+}
+.video-js.vjs-audio-only-mode .vjs-picture-in-picture-control,
+.vjs-pip-window .vjs-picture-in-picture-control {
+  display: none;
+}
+
+.video-js .vjs-fullscreen-control {
+  cursor: pointer;
+  flex: none;
+}
+.video-js.vjs-audio-only-mode .vjs-fullscreen-control,
+.vjs-pip-window .vjs-fullscreen-control {
+  display: none;
+}
+
+.vjs-playback-rate > .vjs-menu-button,
+.vjs-playback-rate .vjs-playback-rate-value {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+}
+
+.vjs-playback-rate .vjs-playback-rate-value {
+  pointer-events: none;
+  font-size: 1.5em;
+  line-height: 2;
+  text-align: center;
+}
+
+.vjs-playback-rate .vjs-menu {
+  width: 4em;
+  left: 0em;
+}
+
+.vjs-error .vjs-error-display .vjs-modal-dialog-content {
+  font-size: 1.4em;
+  text-align: center;
+}
+
+.vjs-error .vjs-error-display:before {
+  color: #fff;
+  content: "X";
+  font-family: Arial, Helvetica, sans-serif;
+  font-size: 4em;
+  left: 0;
+  line-height: 1;
+  margin-top: -0.5em;
+  position: absolute;
+  text-shadow: 0.05em 0.05em 0.1em #000;
+  text-align: center;
+  top: 50%;
+  vertical-align: middle;
+  width: 100%;
+}
+
+.vjs-loading-spinner {
+  display: none;
+  position: absolute;
+  top: 50%;
+  left: 50%;
+  transform: translate(-50%, -50%);
+  opacity: 0.85;
+  text-align: left;
+  border: 0.6em solid rgba(43, 51, 63, 0.7);
+  box-sizing: border-box;
+  background-clip: padding-box;
+  width: 5em;
+  height: 5em;
+  border-radius: 50%;
+  visibility: hidden;
+}
+
+.vjs-seeking .vjs-loading-spinner,
+.vjs-waiting .vjs-loading-spinner {
+  display: block;
+  animation: vjs-spinner-show 0s linear 0.3s forwards;
+}
+
+.vjs-loading-spinner:before,
+.vjs-loading-spinner:after {
+  content: "";
+  position: absolute;
+  margin: -0.6em;
+  box-sizing: inherit;
+  width: inherit;
+  height: inherit;
+  border-radius: inherit;
+  opacity: 1;
+  border: inherit;
+  border-color: transparent;
+  border-top-color: white;
+}
+
+.vjs-seeking .vjs-loading-spinner:before,
+.vjs-seeking .vjs-loading-spinner:after,
+.vjs-waiting .vjs-loading-spinner:before,
+.vjs-waiting .vjs-loading-spinner:after {
+  animation: vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite, vjs-spinner-fade 1.1s linear infinite;
+}
+
+.vjs-seeking .vjs-loading-spinner:before,
+.vjs-waiting .vjs-loading-spinner:before {
+  border-top-color: rgb(255, 255, 255);
+}
+
+.vjs-seeking .vjs-loading-spinner:after,
+.vjs-waiting .vjs-loading-spinner:after {
+  border-top-color: rgb(255, 255, 255);
+  animation-delay: 0.44s;
+}
+
+@keyframes vjs-spinner-show {
+  to {
+    visibility: visible;
+  }
+}
+@keyframes vjs-spinner-spin {
+  100% {
+    transform: rotate(360deg);
+  }
+}
+@keyframes vjs-spinner-fade {
+  0% {
+    border-top-color: #73859f;
+  }
+  20% {
+    border-top-color: #73859f;
+  }
+  35% {
+    border-top-color: white;
+  }
+  60% {
+    border-top-color: #73859f;
+  }
+  100% {
+    border-top-color: #73859f;
+  }
+}
+.video-js.vjs-audio-only-mode .vjs-captions-button {
+  display: none;
+}
+
+.vjs-chapters-button .vjs-menu ul {
+  width: 24em;
+}
+
+.video-js.vjs-audio-only-mode .vjs-descriptions-button {
+  display: none;
+}
+
+.vjs-subs-caps-button + .vjs-menu .vjs-captions-menu-item .vjs-svg-icon {
+  margin-left: 0.3em;
+}
+
+.video-js .vjs-subs-caps-button + .vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder {
+  vertical-align: middle;
+  display: inline-block;
+  margin-bottom: -0.1em;
+}
+
+.video-js .vjs-subs-caps-button + .vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before {
+  font-family: VideoJS;
+  content: "\f10c";
+  font-size: 1.5em;
+  line-height: inherit;
+}
+
+.video-js.vjs-audio-only-mode .vjs-subs-caps-button {
+  display: none;
+}
+
+.video-js .vjs-audio-button + .vjs-menu .vjs-description-menu-item .vjs-menu-item-text .vjs-icon-placeholder,
+.video-js .vjs-audio-button + .vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder {
+  vertical-align: middle;
+  display: inline-block;
+  margin-bottom: -0.1em;
+}
+
+.video-js .vjs-audio-button + .vjs-menu .vjs-description-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before,
+.video-js .vjs-audio-button + .vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before {
+  font-family: VideoJS;
+  content: " \f12e";
+  font-size: 1.5em;
+  line-height: inherit;
+}
+
+.video-js.vjs-layout-small .vjs-current-time,
+.video-js.vjs-layout-small .vjs-time-divider,
+.video-js.vjs-layout-small .vjs-duration,
+.video-js.vjs-layout-small .vjs-remaining-time,
+.video-js.vjs-layout-small .vjs-playback-rate,
+.video-js.vjs-layout-small .vjs-volume-control, .video-js.vjs-layout-x-small .vjs-current-time,
+.video-js.vjs-layout-x-small .vjs-time-divider,
+.video-js.vjs-layout-x-small .vjs-duration,
+.video-js.vjs-layout-x-small .vjs-remaining-time,
+.video-js.vjs-layout-x-small .vjs-playback-rate,
+.video-js.vjs-layout-x-small .vjs-volume-control, .video-js.vjs-layout-tiny .vjs-current-time,
+.video-js.vjs-layout-tiny .vjs-time-divider,
+.video-js.vjs-layout-tiny .vjs-duration,
+.video-js.vjs-layout-tiny .vjs-remaining-time,
+.video-js.vjs-layout-tiny .vjs-playback-rate,
+.video-js.vjs-layout-tiny .vjs-volume-control {
+  display: none;
+}
+.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover, .video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:active, .video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active, .video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover, .video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover, .video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:active, .video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active, .video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover, .video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:hover, .video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:active, .video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active, .video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover {
+  width: auto;
+  width: initial;
+}
+.video-js.vjs-layout-x-small .vjs-progress-control, .video-js.vjs-layout-tiny .vjs-progress-control {
+  display: none;
+}
+.video-js.vjs-layout-x-small .vjs-custom-control-spacer {
+  flex: auto;
+  display: block;
+}
+
+.vjs-modal-dialog.vjs-text-track-settings {
+  background-color: #2B333F;
+  background-color: rgba(43, 51, 63, 0.75);
+  color: #fff;
+  height: 70%;
+}
+
+.vjs-text-track-settings .vjs-modal-dialog-content {
+  display: table;
+}
+
+.vjs-text-track-settings .vjs-track-settings-colors,
+.vjs-text-track-settings .vjs-track-settings-font,
+.vjs-text-track-settings .vjs-track-settings-controls {
+  display: table-cell;
+}
+
+.vjs-text-track-settings .vjs-track-settings-controls {
+  text-align: right;
+  vertical-align: bottom;
+}
+
+@supports (display: grid) {
+  .vjs-text-track-settings .vjs-modal-dialog-content {
+    display: grid;
+    grid-template-columns: 1fr 1fr;
+    grid-template-rows: 1fr;
+    padding: 20px 24px 0px 24px;
+  }
+  .vjs-track-settings-controls .vjs-default-button {
+    margin-bottom: 20px;
+  }
+  .vjs-text-track-settings .vjs-track-settings-controls {
+    grid-column: 1/-1;
+  }
+  .vjs-layout-small .vjs-text-track-settings .vjs-modal-dialog-content,
+  .vjs-layout-x-small .vjs-text-track-settings .vjs-modal-dialog-content,
+  .vjs-layout-tiny .vjs-text-track-settings .vjs-modal-dialog-content {
+    grid-template-columns: 1fr;
+  }
+}
+.vjs-text-track-settings select {
+  font-size: inherit;
+}
+
+.vjs-track-setting > select {
+  margin-right: 1em;
+  margin-bottom: 0.5em;
+}
+
+.vjs-text-track-settings fieldset {
+  margin: 10px;
+  border: none;
+}
+
+.vjs-text-track-settings fieldset span {
+  display: inline-block;
+  padding: 0 0.6em 0.8em;
+}
+
+.vjs-text-track-settings fieldset span > select {
+  max-width: 7.3em;
+}
+
+.vjs-text-track-settings legend {
+  color: #fff;
+  font-weight: bold;
+  font-size: 1.2em;
+}
+
+.vjs-text-track-settings .vjs-label {
+  margin: 0 0.5em 0.5em 0;
+}
+
+.vjs-track-settings-controls button:focus,
+.vjs-track-settings-controls button:active {
+  outline-style: solid;
+  outline-width: medium;
+  background-image: linear-gradient(0deg, #fff 88%, #73859f 100%);
+}
+
+.vjs-track-settings-controls button:hover {
+  color: rgba(43, 51, 63, 0.75);
+}
+
+.vjs-track-settings-controls button {
+  background-color: #fff;
+  background-image: linear-gradient(-180deg, #fff 88%, #73859f 100%);
+  color: #2B333F;
+  cursor: pointer;
+  border-radius: 2px;
+}
+
+.vjs-track-settings-controls .vjs-default-button {
+  margin-right: 1em;
+}
+
+.vjs-title-bar {
+  background: rgba(0, 0, 0, 0.9);
+  background: linear-gradient(180deg, rgba(0, 0, 0, 0.9) 0%, rgba(0, 0, 0, 0.7) 60%, rgba(0, 0, 0, 0) 100%);
+  font-size: 1.2em;
+  line-height: 1.5;
+  transition: opacity 0.1s;
+  padding: 0.666em 1.333em 4em;
+  pointer-events: none;
+  position: absolute;
+  top: 0;
+  width: 100%;
+}
+
+.vjs-title-bar-title,
+.vjs-title-bar-description {
+  margin: 0;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.vjs-title-bar-title {
+  font-weight: bold;
+  margin-bottom: 0.333em;
+}
+
+.vjs-playing.vjs-user-inactive .vjs-title-bar {
+  opacity: 0;
+  transition: opacity 1s;
+}
+
+.video-js .vjs-skip-forward-5 {
+  cursor: pointer;
+}
+.video-js .vjs-skip-forward-10 {
+  cursor: pointer;
+}
+.video-js .vjs-skip-forward-30 {
+  cursor: pointer;
+}
+.video-js .vjs-skip-backward-5 {
+  cursor: pointer;
+}
+.video-js .vjs-skip-backward-10 {
+  cursor: pointer;
+}
+.video-js .vjs-skip-backward-30 {
+  cursor: pointer;
+}
+@media print {
+  .video-js > *:not(.vjs-tech):not(.vjs-poster) {
+    visibility: hidden;
+  }
+}
+.vjs-resize-manager {
+  position: absolute;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  border: none;
+  z-index: -1000;
+}
+
+.js-focus-visible .video-js *:focus:not(.focus-visible) {
+  outline: none;
+}
+
+.video-js *:focus:not(:focus-visible) {
+  outline: none;
+}
diff --git a/src/components/VideoPlayer/videojs-new-markers.js b/src/components/VideoPlayer/videojs-new-markers.js
new file mode 100644
index 0000000..96cc46c
--- /dev/null
+++ b/src/components/VideoPlayer/videojs-new-markers.js
@@ -0,0 +1,172 @@
+import videojs from 'video.js';
+
+const Plugin = videojs.getPlugin('plugin');
+
+
+let is_jump = false;
+class Advanced extends Plugin {
+
+  constructor(player, options) {
+    super(player, options);
+
+
+    this.on(player, ['playing', 'pause'], this.updateState);
+    this.on('statechanged', this.logState);
+    player.ready(()=>{
+      player.controlBar.progressControl.on('keyup', (event) => {
+        const keyCode = event.which || event.keyCode;
+
+        // 检查是否按下左箭头键
+        if (keyCode === 37) {
+          // 处理左箭头键事件
+          console.log('左箭头键被按下');
+          // 在这里执行你的逻辑
+        }
+
+        // 检查是否按下右箭头键
+        if (keyCode === 39) {
+          // 处理右箭头键事件
+          console.log('右箭头键被按下');
+          // 在这里执行你的逻辑
+        }
+      })
+
+      player.controlBar.progressControl.on('mousemove', (event) => {
+        is_jump = false;
+      })
+
+      player.controlBar.progressControl.on('mouseup', (event) => {
+        is_jump = true;
+      })
+    })
+
+    this.player.on('loadedmetadata', () => {
+      // 获取视频的持续时间
+      let markers = []
+      if (options && 'video_config_options' in options) {
+        markers = Object.values(options['video_config_options'].result).map((v) => {
+          return {
+            time: Math.floor(v.time/options['video_config_options'].info.fps),
+            duration: Math.ceil(v.duration/options['video_config_options'].info.fps),
+          }
+        })
+      }
+      const duration = this.player.duration();
+      markers.forEach((v)=>{
+        let redBlock = document.createElement("div");
+        let tooltip = document.createElement('div');
+        let markerBlock = document.createElement('div');
+        let tooltip_text = document.createElement('div');
+
+        markerBlock.style.height= '200px'
+        markerBlock.appendChild(tooltip);
+        markerBlock.appendChild(redBlock);
+        // 将文本提示添加到红色块
+        redBlock.style.position = "absolute";
+        redBlock.style.width = "10px";
+        redBlock.style.height = "20px";
+        redBlock.style.backgroundColor = "rgba(219,55, 4, 0.6)";
+
+        // 计算红色块的位置
+        const left = (v.time / this.player.duration()) * 100;
+        const width = ((v.time + v.duration)/ this.player.duration()) * 100 - left;
+        const zIndex = 100 - Math.floor(width) || 100;
+        let progress = this.player.controlBar.progressControl.el();
+        let progressBar = progress.querySelector(".vjs-progress-holder");
+        let progressBarWidth = progressBar.offsetWidth;
+        let leftPosition = (50 / this.player.duration()) * progressBarWidth - 5;
+
+        // 设置红色块的位置
+        redBlock.style.left = left+"%";
+        redBlock.style.width =  width +'%';
+        redBlock.style.zIndex = 1;
+        redBlock.style.top = "-8px";
+        redBlock.style.borderRadius = '2px'
+        redBlock.addEventListener('click', () => {
+          // 弹出警报
+          // if (is_jump) {
+          //   this.player.currentTime(v.time);
+          // }
+
+        });
+        tooltip.className = 'tooltip';
+        tooltip.style.height = '20px'
+        tooltip.style.display = 'flex'
+        tooltip.style.justifyContent = 'center'
+        tooltip.style.alignItems = 'center'
+
+        tooltip_text.className='bubble'
+        tooltip_text.style.height = '30px'
+        tooltip_text.style.width = '80px'
+        tooltip_text.style.padding = '6px'
+        tooltip_text.style.height = '30px'
+        tooltip_text.textContent = options?.error_type
+        tooltip.appendChild(tooltip_text)
+
+        tooltip.style.position = "absolute";
+        tooltip.style.top = "-76px";
+        tooltip.style.left = left+"%";
+        tooltip.style.display = 'none';
+        redBlock.addEventListener('mouseenter', function () {
+          tooltip.style.display = 'block';
+          redBlock.style.transform = 'scale(1.1)';
+        });
+
+        // 鼠标移出红色块时隐藏文本提示
+        redBlock.addEventListener('mouseleave', function () {
+          tooltip.style.display = 'none';
+          redBlock.style.transform = 'scale(1)';
+        });
+        // 将红色块添加到进度条中
+        progressBar.appendChild(markerBlock);
+      })
+
+      // 在这里可以执行其他与视频持续时间相关的操作
+    });
+  }
+
+
+
+  updateOverlay() {
+    // console.log(22222222)
+    // const overlayPosition = 5; // 在5秒处显示红色块
+    //
+    // if (currentTime >= overlayPosition && currentTime <= overlayPosition + 5) {
+    //   // 创建一个覆盖层
+    //   const overlay = document.createElement('div');
+    //   overlay.className = 'overlay';
+    //   overlay.style.position = 'absolute';
+    //   overlay.style.left = '50%';
+    //   overlay.style.transform = 'translateX(-50%)';
+    //   overlay.style.top = '50%';
+    //   overlay.style.transform = 'translateY(-50%)';
+    //   overlay.style.width = '10px';
+    //   overlay.style.height = '10px';
+    //   overlay.style.backgroundColor = 'red';
+    //
+    //   // 将覆盖层添加到视频容器中
+    //   this.player().el().appendChild(overlay);
+    // } else {
+    //   // 如果不在5秒处,移除覆盖层
+    //   const overlay = this.player().el().querySelector('.overlay');
+    //   if (overlay) {
+    //     overlay.remove();
+    //   }
+    // }
+  }
+
+  dispose() {
+    super.dispose();
+    videojs.log('the advanced plugin is being disposed');
+  }
+
+  updateState() {
+    this.setState({playing: !this.player.paused()});
+  }
+
+  logState(changed) {
+    videojs.log(`the player is now ${this.state.playing ? 'playing' : 'paused'}`);
+  }
+}
+
+videojs.registerPlugin('advanced', Advanced);
diff --git a/src/components/WebRtcPlayer/index.tsx b/src/components/WebRtcPlayer/index.tsx
new file mode 100644
index 0000000..2a96abc
--- /dev/null
+++ b/src/components/WebRtcPlayer/index.tsx
@@ -0,0 +1,32 @@
+import React, {useEffect} from 'react';
+// @ts-ignore
+import WebRtcStreamer from 'webrtc-streamer/html/webrtcstreamer.js';
+export type Props = {
+  stream_url?: string;
+  server_url: string;
+  is_open: boolean;
+};
+const WebRTCStreamer : React.FC<Props> = (props) =>{
+  let webRtcServer: { connect: (arg0: string) => void; disconnect: () => void; } | null = null;
+
+  useEffect(() => {
+    if (props.is_open) {
+      webRtcServer = new WebRtcStreamer("video", props.server_url);
+      if (webRtcServer && props.stream_url) {
+        webRtcServer.connect(props.stream_url);
+
+      }
+    }
+    if (webRtcServer) {
+      webRtcServer.disconnect();
+    }
+  }, [props.is_open, props.server_url, props.stream_url]);
+
+  return (
+    <div style={{height: '100%', width: '100%'}}>
+      <video style={{height: '100%', width: '100%'}} id="video" muted={true} controls={true} autoPlay={true} />
+    </div>
+  );
+}
+
+export default WebRTCStreamer;
diff --git a/src/components/index.ts b/src/components/index.ts
new file mode 100644
index 0000000..ca88a6d
--- /dev/null
+++ b/src/components/index.ts
@@ -0,0 +1,12 @@
+/**
+ * 这个文件作为组件的目录
+ * 目的是统一管理对外输出的组件,方便分类
+ */
+/**
+ * 布局组件
+ */
+import Footer from './Footer';
+import { Question, SelectLang } from './RightContent';
+import { AvatarDropdown, AvatarName } from './RightContent/AvatarDropdown';
+
+export { Footer, Question, SelectLang, AvatarDropdown, AvatarName };
diff --git a/src/enums/common.ts b/src/enums/common.ts
new file mode 100644
index 0000000..47e9ee7
--- /dev/null
+++ b/src/enums/common.ts
@@ -0,0 +1,9 @@
+// 是否启用
+export const isEnableEnum = {
+    '0' : {
+        color: '#999999',
+    },
+    '1' : {
+        color: '#52C41A',
+    }
+}
\ No newline at end of file
diff --git a/src/global.css b/src/global.css
new file mode 100644
index 0000000..e11a1a9
--- /dev/null
+++ b/src/global.css
@@ -0,0 +1,280 @@
+html,
+body,
+#root {
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
+}
+.colorWeak {
+  filter: invert(80%);
+}
+.ant-layout {
+  min-height: 100vh;
+}
+.ant-pro-sider.ant-layout-sider.ant-pro-sider-fixed {
+  left: unset;
+}
+canvas {
+  display: block;
+}
+body {
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+ul,
+ol {
+  list-style: none;
+}
+@media (max-width: 768px) {
+  .ant-table {
+    width: 100%;
+    overflow-x: auto;
+  }
+  .ant-table-thead > tr > th,
+  .ant-table-tbody > tr > th,
+  .ant-table-thead > tr > td,
+  .ant-table-tbody > tr > td {
+    white-space: pre;
+  }
+  .ant-table-thead > tr > th > span,
+  .ant-table-tbody > tr > th > span,
+  .ant-table-thead > tr > td > span,
+  .ant-table-tbody > tr > td > span {
+    display: block;
+  }
+}
+.keep-alive-tabs .ant-tabs-nav {
+  margin: 0;
+}
+.ant-pro .ant-pro-layout .ant-pro-layout-content {
+  padding: 0;
+}
+.ant-pro-form-login-page-left {
+  max-width: none !important;
+}
+.ant-pro-card-col.ant-pro-card-split-vertical {
+  border-inline-end: none;
+}
+.ant-pro-card-col.ant-pro-card-split-horizontal {
+  border-block-end: none;
+}
+/* 1108 update 全局样式新增调整 */
+.ant-table-cell .ant-btn.ant-btn-sm {
+  padding: 0;
+}
+.ant-pro-table-search .ant-form-item .ant-form-item-label {
+  text-align: left;
+}
+.ant-btn-link {
+  color: #155BD4;
+}
+.ant-pro-card .ant-pro-card-title {
+  color: #333333;
+  font-weight: 700;
+  font-size: 16px;
+}
+.ant-modal .ant-modal-content {
+  padding: 20px 24px;
+}
+.ant-modal-header {
+  padding-bottom: 10px;
+}
+/* 单行文本溢出显示省略号 */
+.single_line {
+  white-space: nowrap;
+  /* 防止文本换行 */
+  overflow: hidden;
+  /* 隐藏溢出的文本 */
+  text-overflow: ellipsis;
+  /* 显示省略号 */
+}
+/* 多行文本溢出显示省略号 */
+.two_line {
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 2;
+  /* 限制显示的行数 */
+  overflow: hidden;
+  /* 隐藏溢出的文本 */
+}
+* {
+  padding: 0;
+  margin: 0;
+}
+/* 颜色 */
+.theme_color,
+.ant-table-cell > a,
+.ant-descriptions-item-content > a,
+a.ant-dropdown-trigger {
+  color: #155BD4;
+}
+.theme_bg_color {
+  background-color: #155BD4;
+}
+.ant-btn-link.ant-btn-dangerous,
+.ant-btn-default.ant-btn-dangerous {
+  color: #E80D0D;
+}
+.ant-btn-default.ant-btn-dangerous {
+  border-color: #E80D0D;
+}
+.ant-menu-light .ant-menu-item-selected,
+.ant-menu-light > .ant-menu .ant-menu-item-selected {
+  background-color: #e8effb;
+}
+.ant-select-dropdown .ant-select-item-option-active:not(.ant-select-item-option-disabled) {
+  background-color: #e8effb;
+}
+.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected,
+.ant-tree .ant-tree-checkbox + span.ant-tree-node-selected {
+  background-color: #e8effb;
+  color: #155BD4;
+}
+.ant-steps .ant-steps-item-active > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-title {
+  color: #155BD4;
+}
+.ant-steps .ant-steps-item-active > .ant-steps-item-container > .ant-steps-item-content > .ant-steps-item-description {
+  color: #155BD4;
+}
+/* 表单 */
+.ant-form-item {
+  margin-bottom: 16px;
+}
+.ant-steps .ant-steps-item-finish .ant-steps-item-icon {
+  background-color: rgba(21, 91, 212, 0.1);
+  border-color: #155BD4;
+}
+.ant-pro-form-group-container {
+  gap: 0px 16px !important;
+}
+.ant-modal .ant-modal-title {
+  font-size: 18px;
+}
+.ant-modal-body .ant-pro-steps-form-steps-container {
+  max-width: 1900px !important;
+}
+/* 列表table && proTable */
+.ant-pro-table .ant-pro-table-list-toolbar-left {
+  flex: 0.3;
+}
+.ant-pro-table .ant-pro-table-search .ant-form .ant-pro-query-filter-row-split {
+  padding-right: 0 !important;
+}
+.rc-virtual-list-scrollbar-thumb {
+  display: none;
+}
+/* ant-descriptions */
+.ant-descriptions .ant-descriptions-row > th,
+.ant-descriptions .ant-descriptions-row > td {
+  padding-right: 12px;
+}
+::-webkit-scrollbar-track-piece {
+  -webkit-border-radius: 0;
+}
+::-webkit-scrollbar {
+  width: 5px;
+  height: 10px;
+}
+::-webkit-scrollbar-thumb {
+  height: 50px;
+  background-color: #CCC;
+  -webkit-border-radius: 6px;
+  outline-offset: -2px;
+  -moz-opacity: 0.5;
+  -khtml-opacity: 0.5;
+  opacity: 0.5;
+}
+::-webkit-scrollbar-thumb:hover {
+  height: 50px;
+  background-color: #878987;
+  -webkit-border-radius: 6px;
+}
+.gn {
+  /* UI 规范表 // update 使用中
+  适用说明 
+  字体大小、颜色、粗细
+  页面间距
+*/
+}
+.gn .ant-pro-checkcard-content {
+  padding-inline: 0;
+  padding-block: 0;
+}
+.gn .ant-table-wrapper table tr th.ant-table-selection-column,
+.gn .ant-table-wrapper table tr td.ant-table-selection-column,
+.gn .ant-table-wrapper .ant-table-selection-column {
+  text-align: left;
+}
+.gn .ant-transfer-customize-list .ant-table-wrapper .ant-table-small .ant-table-selection-column {
+  padding-left: 12px;
+}
+.gn .ant-tabs > .ant-tabs-nav .ant-tabs-nav-wrap .ant-tabs-nav-list {
+  padding: 0 24px;
+  margin-block-start: 0;
+}
+.gn .ant-tabs > .ant-tabs-nav .ant-tabs-nav-wrap .ant-tabs-nav-list .ant-tabs-tab-active {
+  font-weight: 700;
+}
+.gn .ant-pro-table-list-toolbar-container {
+  padding-block: 8px;
+}
+.gn .ant-pro-global-header-header-actions-item > * {
+  padding-block: 0;
+}
+.gn .ant-radio-group-large .ant-radio-button-wrapper {
+  height: 32px;
+  line-height: 32px;
+}
+.gn .ant-input-affix-wrapper-lg {
+  height: 32px;
+  line-height: 32px;
+  font-size: 14px;
+}
+.gn .ant-btn.ant-btn-lg {
+  font-size: 14px;
+  height: 32px;
+  border-radius: 4px;
+}
+.gn .ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:last-child) {
+  border-start-start-radius: 4px;
+  border-end-start-radius: 4px;
+}
+.gn.h2 {
+  font-size: 18px;
+}
+.gn.h3 {
+  font-weight: 600;
+}
+.gn.h4 {
+  font-size: 14px;
+  font-weight: 700;
+  line-height: 18px;
+  color: #333333;
+}
+.gn .des_1 {
+  font-size: 12px;
+  font-weight: 400;
+  line-height: 22px;
+  color: #666666;
+}
+.gn .border_bottom_1 {
+  border-bottom: 1px solid #E0E0E0;
+}
+.gn.themeBgHover:hover {
+  background-color: #155BD4;
+}
+.showInfoDemo_wrap .ant-upload-wrapper .ant-upload-list.ant-upload-list-picture .ant-upload-list-item .ant-upload-list-item-thumbnail {
+  width: 100px;
+  height: auto;
+}
+.showInfoDemo_wrap .ant-upload-wrapper .ant-upload-list.ant-upload-list-picture .ant-upload-list-item {
+  height: auto;
+}
+.showInfoDemo_wrap .ant-upload-list-item-name {
+  display: none;
+}
+.showInfoDemo_wrap .ant-upload-extra {
+  padding: 0 !important;
+}
diff --git a/src/global.less b/src/global.less
new file mode 100644
index 0000000..126df4f
--- /dev/null
+++ b/src/global.less
@@ -0,0 +1,358 @@
+html,
+body,
+#root {
+  height: 100%;
+  margin: 0;
+  padding: 0;
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,
+    'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
+    'Noto Color Emoji';
+}
+
+.colorWeak {
+  filter: invert(80%);
+}
+
+.ant-layout {
+  min-height: 100vh;
+}
+.ant-pro-sider.ant-layout-sider.ant-pro-sider-fixed {
+  left: unset;
+}
+
+canvas {
+  display: block;
+}
+
+body {
+  text-rendering: optimizeLegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+
+ul,
+ol {
+  list-style: none;
+}
+
+@media (max-width: 768px) {
+  .ant-table {
+    width: 100%;
+    overflow-x: auto;
+    &-thead > tr,
+    &-tbody > tr {
+      > th,
+      > td {
+        white-space: pre;
+        > span {
+          display: block;
+        }
+      }
+    }
+  }
+}
+
+.keep-alive-tabs {
+  .ant-tabs-nav {
+    margin: 0;
+  }
+}
+
+.ant-pro .ant-pro-layout .ant-pro-layout-content {
+  padding: 0;
+}
+
+
+.ant-pro-form-login-page-left{
+  max-width: none !important;
+}
+
+.ant-pro-card-col.ant-pro-card-split-vertical {
+  border-inline-end: none;
+}
+
+.ant-pro-card-col.ant-pro-card-split-horizontal {
+  border-block-end: none;
+}
+/* 1108 update 全局样式新增调整 */
+
+
+// TODO_update 全局小尺寸按钮,统一间距 (列表操作栏位按钮)
+.ant-table-cell .ant-btn.ant-btn-sm{
+  padding: 0;
+}
+// 更多
+.ant-pro-table-search .ant-form-item .ant-form-item-label{
+  text-align: left
+}
+
+.ant-btn-link{
+  color: #155BD4;
+}
+
+.ant-pro-card .ant-pro-card-title {
+  color: #333333;
+  font-weight: 700;
+  font-size: 16px;
+}
+
+// 弹出框
+.ant-modal .ant-modal-content{
+  padding: 20px 24px;
+}
+.ant-modal-header{
+  padding-bottom: 10px;
+}
+
+// TODO_update 自定义样式块
+
+/* 单行文本溢出显示省略号 */
+.single_line {
+  white-space: nowrap;      /* 防止文本换行 */
+  overflow: hidden;        /* 隐藏溢出的文本 */
+  text-overflow: ellipsis; /* 显示省略号 */
+}
+
+/* 多行文本溢出显示省略号 */
+.two_line {
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 2; /* 限制显示的行数 */
+  overflow: hidden;       /* 隐藏溢出的文本 */
+}
+
+* {
+  padding: 0;
+  margin: 0;
+}
+
+
+/* 颜色 */
+.theme_color, .ant-table-cell>a,
+.ant-descriptions-item-content>a,
+a.ant-dropdown-trigger{
+  color: #155BD4;
+}
+
+.theme_bg_color{
+  background-color: #155BD4;
+}
+
+.ant-btn-link.ant-btn-dangerous, .ant-btn-default.ant-btn-dangerous {
+  color: #E80D0D;
+}
+.ant-btn-default.ant-btn-dangerous{
+  border-color: #E80D0D;
+}
+
+.ant-menu-light .ant-menu-item-selected, .ant-menu-light>.ant-menu .ant-menu-item-selected {
+  background-color: #e8effb;
+}
+
+.ant-select-dropdown .ant-select-item-option-active:not(.ant-select-item-option-disabled) {
+  background-color: #e8effb;
+}
+.ant-tree .ant-tree-node-content-wrapper.ant-tree-node-selected, .ant-tree .ant-tree-checkbox+span.ant-tree-node-selected {
+  background-color: #e8effb;
+  color: #155BD4;
+}
+
+.ant-steps .ant-steps-item-active>.ant-steps-item-container>.ant-steps-item-content{
+  &> .ant-steps-item-title{
+    color: #155BD4;
+
+  }
+  &> .ant-steps-item-description{
+    color: #155BD4;
+    // color: #155cd5;
+
+  }
+}
+
+/* 表单 */
+.ant-form-item {
+  margin-bottom: 16px;
+}
+// 分步表单步骤条
+.ant-steps .ant-steps-item-finish .ant-steps-item-icon{
+  background-color: rgba(#155BD4, 0.1);
+  border-color: #155BD4;
+}
+// 表单项之间间距
+.ant-pro-form-group-container{
+  gap: 0px 16px !important;
+}
+.ant-modal .ant-modal-title{
+  font-size: 18px;
+}
+
+
+.ant-modal-body .ant-pro-steps-form-steps-container{
+  max-width: 1900px !important;
+}
+/* 列表table && proTable */
+// proTable 
+.ant-pro-table{
+  // 标题栏左侧文字最大弹性占比
+  .ant-pro-table-list-toolbar-left{
+    flex: 0.3
+  }
+  // 筛选表单
+  .ant-pro-table-search{
+    .ant-form{
+      .ant-pro-query-filter-row-split{
+        padding-right: 0 !important;
+      }
+    }
+  }
+}
+.rc-virtual-list-scrollbar-thumb{
+  display: none
+}
+/* ant-descriptions */
+.ant-descriptions{
+  .ant-descriptions-row >th,  
+  .ant-descriptions-row >td {
+    padding-right: 12px;
+  }
+}
+
+// 美化滚动条
+::-webkit-scrollbar-track-piece {
+  -webkit-border-radius: 0
+}
+::-webkit-scrollbar {
+  width: 5px;
+  height: 10px
+}
+::-webkit-scrollbar-thumb {
+  height: 50px;
+  background-color: #CCC;
+  -webkit-border-radius: 6px;
+  outline-offset: -2px;
+  -moz-opacity: 0.5;
+  -khtml-opacity: 0.5;
+  opacity: 0.5
+}
+::-webkit-scrollbar-thumb:hover {
+  height: 50px;
+  background-color: #878987;
+  -webkit-border-radius: 6px
+}
+
+.gn {
+  // TODO_update 重置覆盖默认样式,使用统一类名gn + 需要覆盖的类名
+  .ant-pro-checkcard-content {
+    padding-inline: 0;
+    padding-block: 0;
+  }
+  .ant-table-wrapper table tr th.ant-table-selection-column,
+  .ant-table-wrapper table tr td.ant-table-selection-column,
+  .ant-table-wrapper .ant-table-selection-column{
+    text-align: left;
+  }
+  .ant-transfer-customize-list .ant-table-wrapper .ant-table-small .ant-table-selection-column{
+    padding-left: 12px;
+  }
+
+  .ant-tabs >.ant-tabs-nav .ant-tabs-nav-wrap{
+    .ant-tabs-nav-list{
+      padding: 0 24px;
+      margin-block-start: 0;
+      .ant-tabs-tab-active{
+        font-weight: 700
+      }
+    }
+  }
+
+  .ant-pro-table-list-toolbar-container {
+    padding-block: 8px;
+  }
+
+  .ant-pro-global-header-header-actions-item >*{
+    padding-block: 0;
+  }
+
+  .ant-radio-group-large .ant-radio-button-wrapper {
+    height: 32px;
+    line-height: 32px;
+  }
+  .ant-input-affix-wrapper-lg{
+    height: 32px;
+    line-height: 32px;
+    font-size: 14px;
+  }
+  .ant-btn.ant-btn-lg {
+    font-size: 14px;
+    height: 32px;
+    border-radius: 4px;
+  }
+  .ant-input-search .ant-input-group .ant-input-affix-wrapper:not(:last-child) {
+    border-start-start-radius: 4px;
+    border-end-start-radius: 4px;
+}
+  
+  /* UI 规范表 // update 使用中
+  适用说明 
+  字体大小、颜色、粗细
+  页面间距
+*/
+  // &.p1 {
+  // line-height: ;
+  //   font-weight: 600;
+  // }
+  &.h2{
+    font-size: 18px;
+  }
+
+  &.h3{
+    font-weight: 600;
+  }
+
+  &.h4{
+    font-size: 14px;
+    font-weight: 700;
+    line-height: 18px;
+    color: rgba(51, 51, 51, 1);
+
+  }
+
+  .des_1{
+    font-size: 12px;
+    font-weight: 400;
+    line-height: 22px;
+    color: rgba(102, 102, 102, 1)
+  }
+  // 边框
+  .border_bottom_1 {
+    border-bottom: 1px solid #E0E0E0
+  }
+
+  &.themeBgHover:hover{
+    background-color: #155BD4;
+  }
+}
+// .p1{
+
+// }
+
+.showInfoDemo_wrap{
+  .ant-upload-wrapper .ant-upload-list.ant-upload-list-picture .ant-upload-list-item .ant-upload-list-item-thumbnail{
+    width: 100px;
+    height: auto;
+  }
+  .ant-upload-wrapper .ant-upload-list.ant-upload-list-picture .ant-upload-list-item{
+    height: auto;
+  }
+.ant-upload-list-item-name{
+    display: none;
+  }
+  .ant-upload-extra{
+    padding: 0 !important;
+  }
+}
+
+
+
+
+
diff --git a/src/global.tsx b/src/global.tsx
new file mode 100644
index 0000000..afa1fab
--- /dev/null
+++ b/src/global.tsx
@@ -0,0 +1,91 @@
+import { useIntl } from '@umijs/max';
+import { Button, message, notification } from 'antd';
+import defaultSettings from '../config/defaultSettings';
+
+const { pwa } = defaultSettings;
+const isHttps = document.location.protocol === 'https:';
+
+const clearCache = () => {
+  // remove all caches
+  if (window.caches) {
+    caches
+      .keys()
+      .then((keys) => {
+        keys.forEach((key) => {
+          caches.delete(key);
+        });
+      })
+      .catch((e) => console.log(e));
+  }
+};
+
+// if pwa is true
+if (pwa) {
+  // Notify user if offline now
+  window.addEventListener('sw.offline', () => {
+    message.warning(useIntl().formatMessage({ id: 'app.pwa.offline' }));
+  });
+
+  // Pop up a prompt on the page asking the user if they want to use the latest version
+  window.addEventListener('sw.updated', (event: Event) => {
+    const e = event as CustomEvent;
+    const reloadSW = async () => {
+      // Check if there is sw whose state is waiting in ServiceWorkerRegistration
+      // https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration
+      const worker = e.detail && e.detail.waiting;
+      if (!worker) {
+        return true;
+      }
+      // Send skip-waiting event to waiting SW with MessageChannel
+      await new Promise((resolve, reject) => {
+        const channel = new MessageChannel();
+        channel.port1.onmessage = (msgEvent) => {
+          if (msgEvent.data.error) {
+            reject(msgEvent.data.error);
+          } else {
+            resolve(msgEvent.data);
+          }
+        };
+        worker.postMessage({ type: 'skip-waiting' }, [channel.port2]);
+      });
+
+      clearCache();
+      window.location.reload();
+      return true;
+    };
+    const key = `open${Date.now()}`;
+    const btn = (
+      <Button
+        type="primary"
+        onClick={() => {
+          notification.destroy(key);
+          reloadSW();
+        }}
+      >
+        {useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.ok' })}
+      </Button>
+    );
+    notification.open({
+      message: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated' }),
+      description: useIntl().formatMessage({ id: 'app.pwa.serviceworker.updated.hint' }),
+      btn,
+      key,
+      onClose: async () => null,
+    });
+  });
+} else if ('serviceWorker' in navigator && isHttps) {
+  // unregister service worker
+  const { serviceWorker } = navigator;
+  if (serviceWorker.getRegistrations) {
+    serviceWorker.getRegistrations().then((sws) => {
+      sws.forEach((sw) => {
+        sw.unregister();
+      });
+    });
+  }
+  serviceWorker.getRegistration().then((sw) => {
+    if (sw) sw.unregister();
+  });
+
+  clearCache();
+}
diff --git a/src/hooks/useUuid.ts b/src/hooks/useUuid.ts
new file mode 100644
index 0000000..ef58cfc
--- /dev/null
+++ b/src/hooks/useUuid.ts
@@ -0,0 +1,15 @@
+import { v4 as uuidv4 } from 'uuid';
+
+export type useUuidProps = {
+  fetchUuid: () => string;
+};
+export const useUuid = (): useUuidProps => {
+  const fetchUuid = () => {
+    const id = uuidv4();
+    console.log(id);
+    return id;
+  };
+  return {
+    fetchUuid,
+  };
+};
diff --git a/src/layouts/context.tsx b/src/layouts/context.tsx
new file mode 100644
index 0000000..68754a7
--- /dev/null
+++ b/src/layouts/context.tsx
@@ -0,0 +1,20 @@
+import { createContext } from 'react'
+
+interface KeepAliveTabContextType {
+  refreshTab: (path?: string) => void;
+  closeTab: (path?: string) => void;
+  closeOtherTab: (path?: string) => void;
+  onShow: (cb: () => void) => void;
+  onHidden: (cb: () => void) => void;
+}
+
+const defaultValue = {
+  refreshTab: () => { },
+  closeTab: () => { },
+  closeOtherTab: () => { },
+  onShow: () => { },
+  onHidden: () => { },
+}
+
+
+export const KeepAliveTabContext = createContext<KeepAliveTabContextType>(defaultValue);
diff --git a/src/layouts/index.tsx b/src/layouts/index.tsx
new file mode 100644
index 0000000..1dfb9fb
--- /dev/null
+++ b/src/layouts/index.tsx
@@ -0,0 +1,138 @@
+import { Dropdown, Tabs } from 'antd';
+import { useCallback, useMemo } from 'react';
+import { history } from '@umijs/max';
+
+import { KeepAliveTab, useKeepAliveTabs } from './useKeepAliveTabs';
+import type { ItemType, MenuInfo } from 'rc-menu/lib/interface';
+import { KeepAliveTabContext } from './context';
+enum OperationType {
+  REFRESH = 'refresh',
+  CLOSE = 'close',
+  CLOSEOTHER = 'close-other',
+}
+
+
+type MenuItemType = ItemType & { key: OperationType } | null;
+
+const KeepAliveLayout = () => {
+
+  const {
+    keepAliveTabs,
+    activeTabRoutePath,
+    closeTab,
+    refreshTab,
+    closeOtherTab,
+    onHidden,
+    onShow,
+  } = useKeepAliveTabs();
+
+  const menuItems: MenuItemType[] = useMemo(() => [
+    {
+      label: '刷新',
+      key: OperationType.REFRESH,
+    },
+    keepAliveTabs.length <= 1 ? null : {
+      label: '关闭',
+      key: OperationType.CLOSE,
+    },
+    keepAliveTabs.length <= 1 ? null : {
+      label: '关闭其他',
+      key: OperationType.CLOSEOTHER,
+    },
+  ].filter(o => o), [keepAliveTabs]);
+
+  const menuClick = useCallback(({ key, domEvent }: MenuInfo, tab: KeepAliveTab) => {
+    domEvent.stopPropagation();
+
+    if (key === OperationType.REFRESH) {
+      refreshTab(tab.routePath);
+    } else if (key === OperationType.CLOSE) {
+      closeTab(tab.routePath);
+    } else if (key === OperationType.CLOSEOTHER) {
+      closeOtherTab(tab.routePath);
+    }
+  }, [closeOtherTab, closeTab, refreshTab]);
+
+
+  const renderTabTitle = useCallback((tab: KeepAliveTab) => {
+    return (
+      <Dropdown
+        menu={{ items: menuItems, onClick: (e) => menuClick(e, tab) }}
+        trigger={['contextMenu']}
+      >
+        <div style={{ margin: '-12px 0', padding: '12px 0' }}>
+          {/*{tab.icon}*/}
+          {tab.title}
+        </div>
+      </Dropdown>
+    )
+  }, [menuItems]);
+
+  const tabItems = useMemo(() => {
+    let finalKeepAliveTabs = keepAliveTabs
+    // .filter(item => !item?.isHideTab)
+    return finalKeepAliveTabs.map(tab => {
+      console.log(tab,'tabItems')
+      // TODO 未找到合适办法只去除tab标题栏位,保留页面内容
+      return {
+        key: tab.routePath,
+        label: renderTabTitle(tab),
+        children: (
+          <div
+            key={tab.key}
+            style={{ height: 'calc(100vh - 232px)', overflow: 'auto' }}
+          >
+            {tab.children}
+          </div>
+        ),
+        // style: {display: 'none'},
+        closable: keepAliveTabs.length > 1,
+        forceRender: true
+      }
+    })
+  }, [keepAliveTabs]);
+
+  const onTabsChange = useCallback((tabRoutePath: string) => {
+    const curTab = keepAliveTabs.find(o => o.routePath === tabRoutePath);
+    if (curTab) {
+      history.push(curTab?.pathname);
+    }
+  }, [keepAliveTabs]);
+
+  const onTabEdit = (
+    targetKey: React.MouseEvent | React.KeyboardEvent | string,
+    action: 'add' | 'remove',
+  ) => {
+    if (action === 'remove') {
+      closeTab(targetKey as string);
+    }
+  };
+
+  const keepAliveContextValue = useMemo(
+    () => ({
+      closeTab,
+      closeOtherTab,
+      refreshTab,
+      onHidden,
+      onShow,
+    }),
+    [closeTab, closeOtherTab, refreshTab, onHidden, onShow]
+  );
+
+  return (
+    <KeepAliveTabContext.Provider value={keepAliveContextValue}>
+      <Tabs
+        type="editable-card"
+        items={tabItems}
+        activeKey={activeTabRoutePath}
+        onChange={onTabsChange}
+        className='keep-alive-tabs'
+        hideAdd
+        animated={false}
+        onEdit={onTabEdit}
+      />
+    </KeepAliveTabContext.Provider>
+  )
+}
+
+export default KeepAliveLayout;
diff --git a/src/layouts/treeAndTableList.tsx b/src/layouts/treeAndTableList.tsx
new file mode 100644
index 0000000..88f272d
--- /dev/null
+++ b/src/layouts/treeAndTableList.tsx
@@ -0,0 +1,69 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-21 13:42:31
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-24 16:01:20
+ * @FilePath: \general-ai-platform-web\src\layouts\treeAndTableList.tsx
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+import { ProCard } from '@ant-design/pro-components';
+import { CardProps } from 'antd';
+// 此模块使用的 ProCardType
+export interface ProCardTypeProps extends CardProps {
+  colSpan?: string;
+  headerBordered?: boolean;
+}
+
+// 当前组件类型
+type TreeAndTableListProps = {
+  leftCard?: ProCardTypeProps;
+  rightCard?: ProCardTypeProps;
+  leftDom: any;
+  rightDom: any;
+};
+
+const TreeAndTableList: React.FC<TreeAndTableListProps> = (props) => {
+  // 业务层接收
+  const { leftCard, rightCard, leftDom, rightDom } = props;
+
+  // 统一配置
+  let finalLeftCard: ProCardTypeProps = {
+    // 左侧卡片
+    headStyle: { paddingTop: 24, paddingLeft: 20, paddingRight: 20, paddingBottom:12 ,borderBottom: '1px solid #E0E0E0' },
+    bodyStyle: {paddingLeft: 20, paddingRight: 20},
+    colSpan: '22%',
+  };
+  let finalRightCard: ProCardTypeProps = {
+    headStyle: { padding: 0, margin: 0, background: 'transparent' },
+    bodyStyle: { padding: 0, margin: 0 },
+    headerBordered: true,
+    // 右侧卡片
+    colSpan: '76.5%',
+  };
+  if (leftCard) {
+    Object.assign(finalLeftCard, leftCard);
+  }
+
+  if (rightCard) {
+    Object.assign(finalRightCard, rightCard);
+  }
+  return (
+    <>
+      <ProCard
+        style={{ display: 'flex', width: '100%', background: 'transparent' }}
+        bodyStyle={{
+          padding: 0,
+          margin: 0,
+          display: 'flex',
+          justifyContent: 'space-between',
+        }}
+      >
+        {/*  后续依据业务需要动态调整 */}
+        <ProCard {...finalLeftCard}>{leftDom}</ProCard>
+        <ProCard {...finalRightCard}>{rightDom}</ProCard>
+      </ProCard>
+    </>
+  );
+};
+
+export default TreeAndTableList;
diff --git a/src/layouts/useKeepAliveTabs.tsx b/src/layouts/useKeepAliveTabs.tsx
new file mode 100644
index 0000000..4d369fb
--- /dev/null
+++ b/src/layouts/useKeepAliveTabs.tsx
@@ -0,0 +1,152 @@
+import { useCallback, useEffect, useState, useRef } from 'react';
+import { useMatchRoute } from './useMatchRoute';
+import { history } from '@umijs/max';
+
+export interface KeepAliveTab {
+  isHideTab: any;
+  title: string;
+  routePath: string;
+  key: string;  // 这个key,后面刷新有用到它
+  pathname: string;
+  icon?: any;
+  children: any;
+}
+
+function getKey() {
+  return new Date().getTime().toString();
+}
+
+export function useKeepAliveTabs() {
+  const [keepAliveTabs, setKeepAliveTabs] = useState<KeepAliveTab[]>([]);
+  const [activeTabRoutePath, setActiveTabRoutePath] = useState<string>('');
+
+  const keepAliveShowEvents = useRef<Record<string, Array<() => void>>>({});
+  const keepAliveHiddenEvents = useRef<Record<string, Array<() => void>>>({});
+
+  const matchRoute = useMatchRoute();
+
+  const onShow = useCallback((cb: () => void) => {
+    if (!keepAliveShowEvents.current[activeTabRoutePath]) {
+      keepAliveShowEvents.current[activeTabRoutePath] = [];
+    }
+    keepAliveShowEvents.current[activeTabRoutePath].push(cb);
+  }, [activeTabRoutePath])
+
+  const onHidden = useCallback((cb: () => void) => {
+    if (!keepAliveHiddenEvents.current[activeTabRoutePath]) {
+      keepAliveHiddenEvents.current[activeTabRoutePath] = [];
+    }
+    keepAliveHiddenEvents.current[activeTabRoutePath].push(cb);
+  }, [activeTabRoutePath])
+
+  // 关闭tab
+  const closeTab = useCallback(
+    (routePath: string = activeTabRoutePath) => {
+
+      const index = keepAliveTabs.findIndex(o => o.routePath === routePath);
+      if (keepAliveTabs[index].routePath === activeTabRoutePath) {
+        if (index > 0) {
+          history.push(keepAliveTabs[index - 1].routePath);
+        } else {
+          history.push(keepAliveTabs[index + 1].routePath);
+        }
+      }
+      keepAliveTabs.splice(index, 1);
+
+      delete keepAliveHiddenEvents.current[routePath];
+      delete keepAliveShowEvents.current[routePath];
+
+      setKeepAliveTabs([...keepAliveTabs]);
+    },
+    [activeTabRoutePath],
+  );
+
+  // 关闭其他
+  const closeOtherTab = useCallback((routePath: string = activeTabRoutePath) => {
+    const toCloseTabs = keepAliveTabs.filter(o => o.routePath !== routePath);
+    // 清除被关闭的tab注册的onShow事件和onHidden事件
+    toCloseTabs.forEach(tab => {
+      delete keepAliveHiddenEvents.current[tab.routePath];
+      delete keepAliveShowEvents.current[tab.routePath];
+    });
+
+    setKeepAliveTabs(prev => prev.filter(o => o.routePath === routePath));
+  }, [activeTabRoutePath]);
+
+  // 刷新tab
+  const refreshTab = useCallback((routePath: string = activeTabRoutePath) => {
+    setKeepAliveTabs(prev => {
+      const index = prev.findIndex(tab => tab.routePath === routePath);
+
+      if (index >= 0) {
+        // 这个react的特性,key变了,组件会卸载重新渲染
+        prev[index].key = getKey();
+      }
+
+      delete keepAliveHiddenEvents.current[prev[index].routePath];
+      delete keepAliveShowEvents.current[prev[index].routePath];
+
+      return [...prev];
+    });
+  }, [activeTabRoutePath]);
+
+  useEffect(() => {
+
+    if (!matchRoute) return;
+
+    const existKeepAliveTab = keepAliveTabs.find(o => o.routePath === matchRoute?.routePath);
+
+    setActiveTabRoutePath(matchRoute.routePath);
+
+    // 如果不存在则需要插入
+    if (!existKeepAliveTab) {
+      setKeepAliveTabs(prev => [...prev, {
+        title: matchRoute.title,
+        key: getKey(),
+        routePath: matchRoute.routePath,
+        pathname: matchRoute.pathname,
+        children: matchRoute.children,
+        icon: matchRoute.icon,
+        isHideTab: matchRoute.isHideTab
+      }]);
+    } else if (existKeepAliveTab.pathname !== matchRoute.pathname) {
+      // 如果是同一个路由,但是参数不同,我们只需要刷新当前页签并且把pathname设置为新的pathname, children设置为新的children
+      setKeepAliveTabs(prev => {
+        const index = prev.findIndex(tab => tab.routePath === matchRoute.routePath);
+
+        if (index >= 0) {
+          prev[index].key = getKey();
+          prev[index].pathname = matchRoute.pathname;
+          prev[index].children = matchRoute.children;
+        }
+
+        delete keepAliveHiddenEvents.current[prev[index].routePath];
+        delete keepAliveShowEvents.current[prev[index].routePath];
+
+        return [...prev];
+      });
+    } else {
+      // 如果存在,触发组件的onShow的回调
+      (keepAliveShowEvents.current[existKeepAliveTab.routePath] || []).forEach(cb => {
+        cb();
+      });
+    }
+
+    // 路由改变,执行上一个tab的onHidden事件
+    (keepAliveHiddenEvents.current[activeTabRoutePath] || []).forEach(cb => {
+      cb();
+    });
+
+  }, [matchRoute])
+
+
+  return {
+    keepAliveTabs,
+    activeTabRoutePath,
+    closeTab,
+    refreshTab,
+    closeOtherTab,
+    onShow,
+    onHidden,
+  }
+}
diff --git a/src/layouts/useMatchRoute.tsx b/src/layouts/useMatchRoute.tsx
new file mode 100644
index 0000000..f5ae488
--- /dev/null
+++ b/src/layouts/useMatchRoute.tsx
@@ -0,0 +1,88 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-01 13:56:33
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-10 11:26:54
+ * @FilePath: \general-ai-platform-web\src\layouts\useMatchRoute.tsx
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+import { IRoute, history, useAppData, useIntl, useLocation, useOutlet, useSelectedRoutes } from '@umijs/max';
+import { useEffect, useState } from 'react';
+
+type CustomIRoute = IRoute & {
+  name: string;
+}
+
+interface MatchRouteType {
+  title: string;
+  pathname: string; //  /user/1
+  children: any;
+  routePath: string; // /user/:id
+  icon?: any;
+  isHideTab?: boolean
+}
+
+export function useMatchRoute() {
+  // 获取匹配到的路由
+  const selectedRoutes = useSelectedRoutes();
+  // 获取路由组件实例
+  const children = useOutlet();
+  // 获取所有路由
+  const { routes } = useAppData();
+  // 获取当前url
+  const { pathname } = useLocation();
+  // 国际化方法,因为默认菜单做了国际化,所以需要把菜单转成中文
+  const { formatMessage } = useIntl();
+
+  const [matchRoute, setMatchRoute] = useState<MatchRouteType | undefined>();
+
+  // 处理菜单名称
+  const getMenuTitle = (lastRoute: any) => {
+    let curRoute = lastRoute.route;
+    let names = ['menu'];
+    while (curRoute.parentId && !curRoute.isLayout) {
+      if ((routes[curRoute.parentId] as CustomIRoute).name) {
+        names.push((routes[curRoute.parentId] as CustomIRoute).name);
+      } else {
+        break;
+      }
+      curRoute = routes[curRoute.parentId];
+    }
+    names.push(lastRoute.route.name);
+
+    return formatMessage({ id: names.join('.') });
+  }
+
+  // 监听pathname变了,说明路由有变化,重新匹配,返回新路由信息
+  useEffect(() => {
+
+    // 获取当前匹配的路由
+    const lastRoute = selectedRoutes.at(-1);
+
+    if (!lastRoute?.route?.path) return;
+
+    const routeDetail = routes[(lastRoute.route as any).id];
+
+    // 如果匹配的路由需要重定向,这里直接重定向
+    if (routeDetail?.redirect) {
+      history.replace(routeDetail?.redirect);
+      return;
+    }
+
+    // 获取菜单名称
+    const title = getMenuTitle(lastRoute);
+    console.log(lastRoute,'lastRoute')
+    setMatchRoute({
+      title,
+      pathname,
+      children,
+      routePath: lastRoute.route.path,
+      icon: (lastRoute.route as any).icon,  // icon是拓展出来的字段
+      isHideTab: (lastRoute.route as any)?.isHideTab || false, //isHideTab 是否在tab栏位中隐藏
+    });
+
+  }, [pathname])
+
+
+  return matchRoute;
+}
diff --git a/src/locales/bn-BD.ts b/src/locales/bn-BD.ts
new file mode 100644
index 0000000..f9f6afd
--- /dev/null
+++ b/src/locales/bn-BD.ts
@@ -0,0 +1,26 @@
+import component from './bn-BD/component';
+import globalHeader from './bn-BD/globalHeader';
+import menu from './bn-BD/menu';
+import pages from './bn-BD/pages';
+import pwa from './bn-BD/pwa';
+import settingDrawer from './bn-BD/settingDrawer';
+import settings from './bn-BD/settings';
+
+export default {
+  'navBar.lang': 'ভাষা',
+  'layout.user.link.help': 'সহায়তা',
+  'layout.user.link.privacy': 'গোপনীয়তা',
+  'layout.user.link.terms': 'শর্তাদি',
+  'app.copyright.produced': 'প্রযোজনা করেছেন অ্যান্ট ফিনান্সিয়াল এক্সপেরিয়েন্স ডিপার্টমেন্ট',
+  'app.preview.down.block': 'আপনার স্থানীয় প্রকল্পে এই পৃষ্ঠাটি ডাউনলোড করুন',
+  'app.welcome.link.fetch-blocks': 'সমস্ত ব্লক পান',
+  'app.welcome.link.block-list':
+    '`block` ডেভেলপমেন্ট এর উপর ভিত্তি করে দ্রুত স্ট্যান্ডার্ড, পৃষ্ঠাসমূহ তৈরি করুন।',
+  ...globalHeader,
+  ...menu,
+  ...settingDrawer,
+  ...settings,
+  ...pwa,
+  ...component,
+  ...pages,
+};
diff --git a/src/locales/bn-BD/component.ts b/src/locales/bn-BD/component.ts
new file mode 100644
index 0000000..a546e75
--- /dev/null
+++ b/src/locales/bn-BD/component.ts
@@ -0,0 +1,5 @@
+export default {
+  'component.tagSelect.expand': 'বিস্তৃত',
+  'component.tagSelect.collapse': 'সঙ্কুচিত',
+  'component.tagSelect.all': 'সব',
+};
diff --git a/src/locales/bn-BD/globalHeader.ts b/src/locales/bn-BD/globalHeader.ts
new file mode 100644
index 0000000..2679be4
--- /dev/null
+++ b/src/locales/bn-BD/globalHeader.ts
@@ -0,0 +1,17 @@
+export default {
+  'component.globalHeader.search': 'অনুসন্ধান করুন',
+  'component.globalHeader.search.example1': 'অনুসন্ধান উদাহরণ ১',
+  'component.globalHeader.search.example2': 'অনুসন্ধান উদাহরণ ২',
+  'component.globalHeader.search.example3': 'অনুসন্ধান উদাহরণ ৩',
+  'component.globalHeader.help': 'সহায়তা',
+  'component.globalHeader.notification': 'বিজ্ঞপ্তি',
+  'component.globalHeader.notification.empty': 'আপনি সমস্ত বিজ্ঞপ্তি দেখেছেন।',
+  'component.globalHeader.message': 'বার্তা',
+  'component.globalHeader.message.empty': 'আপনি সমস্ত বার্তা দেখেছেন।',
+  'component.globalHeader.event': 'ঘটনা',
+  'component.globalHeader.event.empty': 'আপনি সমস্ত ইভেন্ট দেখেছেন।',
+  'component.noticeIcon.clear': 'সাফ',
+  'component.noticeIcon.cleared': 'সাফ করা হয়েছে',
+  'component.noticeIcon.empty': 'বিজ্ঞপ্তি নেই',
+  'component.noticeIcon.view-more': 'আরো দেখুন',
+};
diff --git a/src/locales/bn-BD/menu.ts b/src/locales/bn-BD/menu.ts
new file mode 100644
index 0000000..ae511a0
--- /dev/null
+++ b/src/locales/bn-BD/menu.ts
@@ -0,0 +1,52 @@
+export default {
+  'menu.welcome': 'স্বাগতম',
+  'menu.more-blocks': 'আরও ব্লক',
+  'menu.home': 'নীড়',
+  'menu.admin': 'অ্যাডমিন',
+  'menu.admin.sub-page': 'উপ-পৃষ্ঠা',
+  'menu.login': 'প্রবেশ',
+  'menu.register': 'নিবন্ধন',
+  'menu.register-result': 'নিবন্ধনে ফলাফল',
+  'menu.dashboard': 'ড্যাশবোর্ড',
+  'menu.dashboard.analysis': 'বিশ্লেষণ',
+  'menu.dashboard.monitor': 'নিরীক্ষণ',
+  'menu.dashboard.workplace': 'কর্মক্ষেত্র',
+  'menu.exception.403': '403',
+  'menu.exception.404': '404',
+  'menu.exception.500': '500',
+  'menu.form': 'ফর্ম',
+  'menu.form.basic-form': 'বেসিক ফর্ম',
+  'menu.form.step-form': 'পদক্ষেপ ফর্ম',
+  'menu.form.step-form.info': 'পদক্ষেপ ফর্ম (স্থানান্তর তথ্য লিখুন)',
+  'menu.form.step-form.confirm': 'পদক্ষেপ ফর্ম (স্থানান্তর তথ্য নিশ্চিত করুন)',
+  'menu.form.step-form.result': 'পদক্ষেপ ফর্ম (সমাপ্ত)',
+  'menu.form.advanced-form': 'উন্নত ফর্ম',
+  'menu.list': 'তালিকা',
+  'menu.list.table-list': 'অনুসন্ধানের টেবিল',
+  'menu.list.basic-list': 'বেসিক তালিকা',
+  'menu.list.card-list': 'কার্ডের তালিকা',
+  'menu.list.search-list': 'অনুসন্ধানের তালিকা',
+  'menu.list.search-list.articles': 'অনুসন্ধানের তালিকা (নিবন্ধসমূহ)',
+  'menu.list.search-list.projects': 'অনুসন্ধানের তালিকা (প্রকল্পগুলি)',
+  'menu.list.search-list.applications': 'অনুসন্ধানের তালিকা (অ্যাপ্লিকেশন)',
+  'menu.profile': 'প্রোফাইল',
+  'menu.profile.basic': 'বেসিক প্রোফাইল',
+  'menu.profile.advanced': 'উন্নত প্রোফাইল',
+  'menu.result': 'ফলাফল',
+  'menu.result.success': 'সাফল্য',
+  'menu.result.fail': 'ব্যর্থ',
+  'menu.exception': 'ব্যতিক্রম',
+  'menu.exception.not-permission': '403',
+  'menu.exception.not-find': '404',
+  'menu.exception.server-error': '500',
+  'menu.exception.trigger': 'ট্রিগার',
+  'menu.account': 'হিসাব',
+  'menu.account.center': 'অ্যাকাউন্ট কেন্দ্র',
+  'menu.account.settings': 'অ্যাকাউন্ট সেটিংস',
+  'menu.account.trigger': 'ট্রিগার ত্রুটি',
+  'menu.account.logout': 'প্রস্থান',
+  'menu.editor': 'গ্রাফিক সম্পাদক',
+  'menu.editor.flow': 'ফ্লো এডিটর',
+  'menu.editor.mind': 'মাইন্ড এডিটর',
+  'menu.editor.koni': 'কোনি সম্পাদক',
+};
diff --git a/src/locales/bn-BD/pages.ts b/src/locales/bn-BD/pages.ts
new file mode 100644
index 0000000..529900a
--- /dev/null
+++ b/src/locales/bn-BD/pages.ts
@@ -0,0 +1,68 @@
+export default {
+  'pages.layouts.userLayout.title':
+    'পিঁপড়া ডিজাইন হচ্ছে সিহু জেলার সবচেয়ে প্রভাবশালী ওয়েব ডিজাইনের স্পেসিফিকেশন',
+  'pages.login.accountLogin.tab': 'অ্যাকাউন্টে লগইন',
+  'pages.login.accountLogin.errorMessage': 'ভুল ব্যবহারকারীর নাম/পাসওয়ার্ড(admin/ant.design)',
+  'pages.login.failure': 'লগইন ব্যর্থ হয়েছে। আবার চেষ্টা করুন!',
+  'pages.login.success': 'সফল লগইন!',
+  'pages.login.username.placeholder': 'ব্যবহারকারীর নাম: admin or user',
+  'pages.login.username.required': 'আপনার ব্যবহারকারীর নাম ইনপুট করুন!',
+  'pages.login.password.placeholder': 'পাসওয়ার্ড: ant.design',
+  'pages.login.password.required': 'আপনার পাসওয়ার্ড ইনপুট করুন!',
+  'pages.login.phoneLogin.tab': 'ফোন লগইন',
+  'pages.login.phoneLogin.errorMessage': 'যাচাইকরণ কোড ত্রুটি',
+  'pages.login.phoneNumber.placeholder': 'ফোন নম্বর',
+  'pages.login.phoneNumber.required': 'আপনার ফোন নম্বর ইনপুট করুন!',
+  'pages.login.phoneNumber.invalid': 'ফোন নম্বরটি সঠিক নয়!',
+  'pages.login.captcha.placeholder': 'যাচাইকরণের কোড',
+  'pages.login.captcha.required': 'দয়া করে ভেরিফিকেশন কোডটি ইনপুট করুন!',
+  'pages.login.phoneLogin.getVerificationCode': 'কোড পান',
+  'pages.getCaptchaSecondText': 'সেকেন্ড',
+  'pages.login.rememberMe': 'আমাকে মনে রাখুন',
+  'pages.login.forgotPassword': 'পাসওয়ার্ড ভুলে গেছেন?',
+  'pages.login.submit': 'প্রবেশ করুন',
+  'pages.login.loginWith': 'লগইন করতে পারেন:',
+  'pages.login.registerAccount': 'অ্যাকাউন্ট নিবন্ধন করুন',
+  'pages.welcome.link': 'স্বাগতম',
+  'pages.welcome.alertMessage': 'দ্রুত এবং শক্তিশালী ভারী শুল্ক উপাদান প্রকাশ করা হয়েছে।',
+  'pages.admin.subPage.title': 'এই পৃষ্ঠাটি কেবল অ্যাডমিন দ্বারা দেখা যাবে',
+  'pages.admin.subPage.alertMessage':
+    'UMI UI এখন প্রকাশিত হয়েছে, অভিজ্ঞতা শুরু করতে npm run ui ব্যবহার করতে স্বাগতম।',
+  'pages.searchTable.createForm.newRule': 'নতুন বিধি',
+  'pages.searchTable.updateForm.ruleConfig': 'বিধি কনফিগারেশন',
+  'pages.searchTable.updateForm.basicConfig': 'মৌলিক তথ্য',
+  'pages.searchTable.updateForm.ruleName.nameLabel': 'বিধি নাম',
+  'pages.searchTable.updateForm.ruleName.nameRules': 'বিধির নাম লিখুন!',
+  'pages.searchTable.updateForm.ruleDesc.descLabel': 'বিধির বিবরণ',
+  'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'কমপক্ষে পাঁচটি অক্ষর লিখুন',
+  'pages.searchTable.updateForm.ruleDesc.descRules':
+    'কমপক্ষে পাঁচটি অক্ষরের একটি বিধান বিবরণ লিখুন!',
+  'pages.searchTable.updateForm.ruleProps.title': 'বৈশিষ্ট্য কনফিগার করুন',
+  'pages.searchTable.updateForm.object': 'নিরীক্ষণ অবজেক্ট',
+  'pages.searchTable.updateForm.ruleProps.templateLabel': 'বিধি টেম্পলেট',
+  'pages.searchTable.updateForm.ruleProps.typeLabel': 'বিধি প্রকার',
+  'pages.searchTable.updateForm.schedulingPeriod.title': 'সময়সূচী নির্ধারণ করুন',
+  'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'শুরুর সময়',
+  'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'একটি শুরুর সময় চয়ন করুন!',
+  'pages.searchTable.titleDesc': 'বর্ণনা',
+  'pages.searchTable.ruleName': 'বিধি নাম প্রয়োজন',
+  'pages.searchTable.titleCallNo': 'পরিষেবা কল সংখ্যা',
+  'pages.searchTable.titleStatus': 'অবস্থা',
+  'pages.searchTable.nameStatus.default': 'ডিফল্ট',
+  'pages.searchTable.nameStatus.running': 'চলমান',
+  'pages.searchTable.nameStatus.online': 'অনলাইন',
+  'pages.searchTable.nameStatus.abnormal': 'অস্বাভাবিক',
+  'pages.searchTable.titleUpdatedAt': 'সর্বশেষ নির্ধারিত',
+  'pages.searchTable.exception': 'ব্যতিক্রম জন্য কারণ লিখুন!',
+  'pages.searchTable.titleOption': 'অপশন',
+  'pages.searchTable.config': 'কনফিগারেশন',
+  'pages.searchTable.subscribeAlert': 'সতর্কতা সাবস্ক্রাইব করুন',
+  'pages.searchTable.title': 'ইনকয়েরি ফরম',
+  'pages.searchTable.new': 'নতুন',
+  'pages.searchTable.chosen': 'নির্বাচিত',
+  'pages.searchTable.item': 'আইটেম',
+  'pages.searchTable.totalServiceCalls': 'পরিষেবা কলগুলির মোট সংখ্যা',
+  'pages.searchTable.tenThousand': '000',
+  'pages.searchTable.batchDeletion': 'একসাখে ডিলিট',
+  'pages.searchTable.batchApproval': 'একসাখে অনুমোদন',
+};
diff --git a/src/locales/bn-BD/pwa.ts b/src/locales/bn-BD/pwa.ts
new file mode 100644
index 0000000..233fb30
--- /dev/null
+++ b/src/locales/bn-BD/pwa.ts
@@ -0,0 +1,7 @@
+export default {
+  'app.pwa.offline': 'আপনি এখন অফলাইন',
+  'app.pwa.serviceworker.updated': 'নতুন সামগ্রী উপলব্ধ',
+  'app.pwa.serviceworker.updated.hint':
+    'বর্তমান পৃষ্ঠাটি পুনরায় লোড করতে দয়া করে "রিফ্রেশ" বোতাম টিপুন',
+  'app.pwa.serviceworker.updated.ok': 'রিফ্রেশ',
+};
diff --git a/src/locales/bn-BD/settingDrawer.ts b/src/locales/bn-BD/settingDrawer.ts
new file mode 100644
index 0000000..2bd1d04
--- /dev/null
+++ b/src/locales/bn-BD/settingDrawer.ts
@@ -0,0 +1,31 @@
+export default {
+  'app.setting.pagestyle': 'পৃষ্ঠা স্টাইল সেটিং',
+  'app.setting.pagestyle.dark': 'ডার্ক স্টাইল',
+  'app.setting.pagestyle.light': 'লাইট স্টাইল',
+  'app.setting.content-width': 'সামগ্রীর প্রস্থ',
+  'app.setting.content-width.fixed': 'স্থির',
+  'app.setting.content-width.fluid': 'প্রবাহী',
+  'app.setting.themecolor': 'থিম রঙ',
+  'app.setting.themecolor.dust': 'ডাস্ট রেড',
+  'app.setting.themecolor.volcano': 'আগ্নেয়গিরি',
+  'app.setting.themecolor.sunset': 'সানসেট কমলা',
+  'app.setting.themecolor.cyan': 'সবুজাভ নীল',
+  'app.setting.themecolor.green': 'পোলার সবুজ',
+  'app.setting.themecolor.daybreak': 'দিবস ব্রেক ব্লু (ডিফল্ট)',
+  'app.setting.themecolor.geekblue': 'গিক আঠালো',
+  'app.setting.themecolor.purple': 'গোল্ডেন বেগুনি',
+  'app.setting.navigationmode': 'নেভিগেশন মোড',
+  'app.setting.sidemenu': 'সাইড মেনু লেআউট',
+  'app.setting.topmenu': 'টপ মেনু লেআউট',
+  'app.setting.fixedheader': 'স্থির হেডার',
+  'app.setting.fixedsidebar': 'স্থির সাইডবার',
+  'app.setting.fixedsidebar.hint': 'সাইড মেনু বিন্যাসে কাজ করে',
+  'app.setting.hideheader': 'স্ক্রোল করার সময় হেডার লুকানো',
+  'app.setting.hideheader.hint': 'লুকানো হেডার সক্ষম থাকলে কাজ করে',
+  'app.setting.othersettings': 'অন্যান্য সেটিংস্',
+  'app.setting.weakmode': 'দুর্বল মোড',
+  'app.setting.copy': 'সেটিং কপি করুন',
+  'app.setting.copyinfo': 'সাফল্যের অনুলিপি করুন - প্রতিস্থাপন করুন: src/models/setting.js',
+  'app.setting.production.hint':
+    'কেবল বিকাশের পরিবেশে প্যানেল শো সেট করা হচ্ছে, দয়া করে ম্যানুয়ালি সংশোধন করুন',
+};
diff --git a/src/locales/bn-BD/settings.ts b/src/locales/bn-BD/settings.ts
new file mode 100644
index 0000000..93cf904
--- /dev/null
+++ b/src/locales/bn-BD/settings.ts
@@ -0,0 +1,59 @@
+export default {
+  'app.settings.menuMap.basic': 'মৌলিক বৈশিষ্ট্যসহ',
+  'app.settings.menuMap.security': 'নিরাপত্তা বিন্যাস',
+  'app.settings.menuMap.binding': 'অ্যাকাউন্ট বাঁধাই',
+  'app.settings.menuMap.notification': 'নতুন বার্তা বিজ্ঞপ্তি',
+  'app.settings.basic.avatar': 'অবতার',
+  'app.settings.basic.change-avatar': 'অবতার পরিবর্তন করুন',
+  'app.settings.basic.email': 'ইমেইল',
+  'app.settings.basic.email-message': 'আপনার ইমেইল ইনপুট করুন!',
+  'app.settings.basic.nickname': 'ডাক নাম',
+  'app.settings.basic.nickname-message': 'আপনার ডাকনামটি ইনপুট করুন!',
+  'app.settings.basic.profile': 'ব্যক্তিগত প্রোফাইল',
+  'app.settings.basic.profile-message': 'আপনার ব্যক্তিগত প্রোফাইল ইনপুট করুন!',
+  'app.settings.basic.profile-placeholder': 'নিজের সাথে সংক্ষিপ্ত পরিচয়',
+  'app.settings.basic.country': 'দেশ/অঞ্চল',
+  'app.settings.basic.country-message': 'আপনার দেশ ইনপুট করুন!',
+  'app.settings.basic.geographic': 'প্রদেশ বা শহর',
+  'app.settings.basic.geographic-message': 'আপনার ভৌগলিক তথ্য ইনপুট করুন!',
+  'app.settings.basic.address': 'রাস্তার ঠিকানা',
+  'app.settings.basic.address-message': 'দয়া করে আপনার ঠিকানা ইনপুট করুন!',
+  'app.settings.basic.phone': 'ফোন নম্বর',
+  'app.settings.basic.phone-message': 'আপনার ফোন ইনপুট করুন!',
+  'app.settings.basic.update': 'তথ্য হালনাগাদ',
+  'app.settings.security.strong': 'শক্তিশালী',
+  'app.settings.security.medium': 'মধ্যম',
+  'app.settings.security.weak': 'দুর্বল',
+  'app.settings.security.password': 'অ্যাকাউন্টের পাসওয়ার্ড',
+  'app.settings.security.password-description': 'বর্তমান পাসওয়ার্ড শক্তি',
+  'app.settings.security.phone': 'সুরক্ষা ফোন',
+  'app.settings.security.phone-description': 'আবদ্ধ ফোন',
+  'app.settings.security.question': 'নিরাপত্তা প্রশ্ন',
+  'app.settings.security.question-description':
+    'সুরক্ষা প্রশ্ন সেট করা নেই, এবং সুরক্ষা নীতি কার্যকরভাবে অ্যাকাউন্ট সুরক্ষা রক্ষা করতে পারে',
+  'app.settings.security.email': 'ব্যাকআপ ইমেইল',
+  'app.settings.security.email-description': 'বাউন্ড ইমেইল',
+  'app.settings.security.mfa': 'MFA ডিভাইস',
+  'app.settings.security.mfa-description':
+    "আনবাউন্ড এমএফএ ডিভাইস, বাঁধাইয়ের পরে, দু'বার নিশ্চিত করা যায়",
+  'app.settings.security.modify': 'পরিবর্তন করুন',
+  'app.settings.security.set': 'সেট',
+  'app.settings.security.bind': 'বাঁধাই',
+  'app.settings.binding.taobao': 'বাঁধাই তাওবাও',
+  'app.settings.binding.taobao-description': 'বর্তমানে আনবাউন্ড তাওবাও অ্যাকাউন্ট',
+  'app.settings.binding.alipay': 'বাইন্ডিং আলিপে',
+  'app.settings.binding.alipay-description': 'বর্তমানে আনবাউন্ড আলিপে অ্যাকাউন্ট',
+  'app.settings.binding.dingding': 'বাঁধাই ডিঙ্গটালক',
+  'app.settings.binding.dingding-description': 'বর্তমানে আনবাউন্ড ডিঙ্গটাল অ্যাকাউন্ট',
+  'app.settings.binding.bind': 'বাঁধাই',
+  'app.settings.notification.password': 'অ্যাকাউন্টের পাসওয়ার্ড',
+  'app.settings.notification.password-description':
+    'অন্যান্য ব্যবহারকারীর বার্তাগুলি স্টেশন চিঠি আকারে জানানো হবে',
+  'app.settings.notification.messages': 'সিস্টেম বার্তা',
+  'app.settings.notification.messages-description':
+    'সিস্টেম বার্তাগুলি স্টেশন চিঠির আকারে জানানো হবে',
+  'app.settings.notification.todo': 'করণীয় বিজ্ঞপ্তি',
+  'app.settings.notification.todo-description': 'করণীয় তালিকাটি স্টেশন থেকে চিঠি আকারে জানানো হবে',
+  'app.settings.open': 'খোলা',
+  'app.settings.close': 'বন্ধ',
+};
diff --git a/src/locales/en-US.ts b/src/locales/en-US.ts
new file mode 100644
index 0000000..b84dade
--- /dev/null
+++ b/src/locales/en-US.ts
@@ -0,0 +1,29 @@
+import component from './en-US/component';
+import globalHeader from './en-US/globalHeader';
+import menu from './en-US/menu';
+import pages from './en-US/pages';
+import pwa from './en-US/pwa';
+import settingDrawer from './en-US/settingDrawer';
+import settings from './en-US/settings';
+import * as deviceEn from "@/locales/en-US/device";
+import * as resourceEn from "@/locales/en-US/resource";
+
+export default {
+  'navBar.lang': 'Languages',
+  'layout.user.link.help': 'Help',
+  'layout.user.link.privacy': 'Privacy',
+  'layout.user.link.terms': 'Terms',
+  'app.copyright.produced': 'Produced by Ant Financial Experience Department',
+  'app.preview.down.block': 'Download this page to your local project',
+  'app.welcome.link.fetch-blocks': 'Get all block',
+  'app.welcome.link.block-list': 'Quickly build standard, pages based on `block` development',
+  ...globalHeader,
+  ...menu,
+  ...settingDrawer,
+  ...settings,
+  ...pwa,
+  ...component,
+  ...pages,
+  ...Object.assign({}, ...Object.values(deviceEn)),
+  ...Object.assign({}, ...Object.values(resourceEn)),
+};
diff --git a/src/locales/en-US/component.ts b/src/locales/en-US/component.ts
new file mode 100644
index 0000000..3ba7eed
--- /dev/null
+++ b/src/locales/en-US/component.ts
@@ -0,0 +1,5 @@
+export default {
+  'component.tagSelect.expand': 'Expand',
+  'component.tagSelect.collapse': 'Collapse',
+  'component.tagSelect.all': 'All',
+};
diff --git a/src/locales/en-US/device.ts b/src/locales/en-US/device.ts
new file mode 100644
index 0000000..99300ff
--- /dev/null
+++ b/src/locales/en-US/device.ts
@@ -0,0 +1,4 @@
+export const device: {[key: string]: string} = {'device.device.table.list.id': 'id', 'device.device.table.list.name': 'name', 'device.device.table.list.code': 'code', 'device.device.table.list.position': 'position', 'device.device.table.list.param': 'param', 'device.device.table.list.spec': 'spec', 'device.device.table.list.categoryFkId': 'category_fk_id', 'device.device.table.list.groupFkId': 'group_fk_id', 'device.device.table.list.isEnable': 'is_enable', 'device.device.table.list.remark': 'remark', 'device.device.table.list.createTime': 'create_time', 'device.device.table.list.updateTime': 'update_time', 'device.device.table.rule.required.name': 'name is required', 'device.device.table.rule.required.code': 'code is required'}
+export const device_category: {[key: string]: string} = {'device.device_category.table.list.id': 'id', 'device.device_category.table.list.name': 'name', 'device.device_category.table.list.code': 'code', 'device.device_category.table.list.remark': 'remark', 'device.device_category.table.list.createTime': 'create_time', 'device.device_category.table.list.updateTime': 'update_time', 'device.device_category.table.rule.required.name': 'name is required', 'device.device_category.table.rule.required.code': 'code is required'}
+export const device_group: {[key: string]: string} = {'device.device_group.table.list.id': 'id', 'device.device_group.table.list.name': 'name', 'device.device_group.table.list.code': 'code', 'device.device_group.table.list.address': 'address', 'device.device_group.table.list.telephone': 'telephone', 'device.device_group.table.list.lon': 'lon', 'device.device_group.table.list.lat': 'lat', 'device.device_group.table.list.managerName': 'manager_name', 'device.device_group.table.list.managerPhone': 'manager_phone', 'device.device_group.table.list.isEnable': 'is_enable', 'device.device_group.table.list.parentFkId': 'parent_fk_id', 'device.device_group.table.list.remark': 'remark', 'device.device_group.table.list.createTime': 'create_time', 'device.device_group.table.list.updateTime': 'update_time', 'device.device_group.table.rule.required.name': 'name is required', 'device.device_group.table.rule.required.code': 'code is required', 'device.device_group.table.rule.required.managerName': 'manager_name is required', 'device.device_group.table.rule.required.managerPhone': 'manager_phone is required', 'device.device_group.table.rule.required.parentFkId': 'parent_fk_id is required'}
+export const device_relation: {[key: string]: string} = {'device.device_relation.table.list.id': 'id', 'device.device_relation.table.list.deviceParentFkId': 'device_parent_fk_id', 'device.device_relation.table.list.deviceSonFkId': 'device_son_fk_id', 'device.device_relation.table.list.createTime': 'create_time', 'device.device_relation.table.list.updateTime': 'update_time', 'device.device_relation.table.rule.required.deviceParentFkId': 'device_parent_fk_id is required', 'device.device_relation.table.rule.required.deviceSonFkId': 'device_son_fk_id is required'}
diff --git a/src/locales/en-US/globalHeader.ts b/src/locales/en-US/globalHeader.ts
new file mode 100644
index 0000000..60b6d4e
--- /dev/null
+++ b/src/locales/en-US/globalHeader.ts
@@ -0,0 +1,17 @@
+export default {
+  'component.globalHeader.search': 'Search',
+  'component.globalHeader.search.example1': 'Search example 1',
+  'component.globalHeader.search.example2': 'Search example 2',
+  'component.globalHeader.search.example3': 'Search example 3',
+  'component.globalHeader.help': 'Help',
+  'component.globalHeader.notification': 'Notification',
+  'component.globalHeader.notification.empty': 'You have viewed all notifications.',
+  'component.globalHeader.message': 'Message',
+  'component.globalHeader.message.empty': 'You have viewed all messsages.',
+  'component.globalHeader.event': 'Event',
+  'component.globalHeader.event.empty': 'You have viewed all events.',
+  'component.noticeIcon.clear': 'Clear',
+  'component.noticeIcon.cleared': 'Cleared',
+  'component.noticeIcon.empty': 'No notifications',
+  'component.noticeIcon.view-more': 'View more',
+};
diff --git a/src/locales/en-US/menu.ts b/src/locales/en-US/menu.ts
new file mode 100644
index 0000000..eae3e53
--- /dev/null
+++ b/src/locales/en-US/menu.ts
@@ -0,0 +1,52 @@
+export default {
+  'menu.welcome': 'Welcome',
+  'menu.more-blocks': 'More Blocks',
+  'menu.home': 'Home',
+  'menu.admin': 'Admin',
+  'menu.admin.sub-page': 'Sub-Page',
+  'menu.login': 'Login',
+  'menu.register': 'Register',
+  'menu.register-result': 'Register Result',
+  'menu.dashboard': 'Dashboard',
+  'menu.dashboard.analysis': 'Analysis',
+  'menu.dashboard.monitor': 'Monitor',
+  'menu.dashboard.workplace': 'Workplace',
+  'menu.exception.403': '403',
+  'menu.exception.404': '404',
+  'menu.exception.500': '500',
+  'menu.form': 'Form',
+  'menu.form.basic-form': 'Basic Form',
+  'menu.form.step-form': 'Step Form',
+  'menu.form.step-form.info': 'Step Form(write transfer information)',
+  'menu.form.step-form.confirm': 'Step Form(confirm transfer information)',
+  'menu.form.step-form.result': 'Step Form(finished)',
+  'menu.form.advanced-form': 'Advanced Form',
+  'menu.list': 'List',
+  'menu.list.table-list': 'Search Table',
+  'menu.list.basic-list': 'Basic List',
+  'menu.list.card-list': 'Card List',
+  'menu.list.search-list': 'Search List',
+  'menu.list.search-list.articles': 'Search List(articles)',
+  'menu.list.search-list.projects': 'Search List(projects)',
+  'menu.list.search-list.applications': 'Search List(applications)',
+  'menu.profile': 'Profile',
+  'menu.profile.basic': 'Basic Profile',
+  'menu.profile.advanced': 'Advanced Profile',
+  'menu.result': 'Result',
+  'menu.result.success': 'Success',
+  'menu.result.fail': 'Fail',
+  'menu.exception': 'Exception',
+  'menu.exception.not-permission': '403',
+  'menu.exception.not-find': '404',
+  'menu.exception.server-error': '500',
+  'menu.exception.trigger': 'Trigger',
+  'menu.account': 'Account',
+  'menu.account.center': 'Account Center',
+  'menu.account.settings': 'Account Settings',
+  'menu.account.trigger': 'Trigger Error',
+  'menu.account.logout': 'Logout',
+  'menu.editor': 'Graphic Editor',
+  'menu.editor.flow': 'Flow Editor',
+  'menu.editor.mind': 'Mind Editor',
+  'menu.editor.koni': 'Koni Editor',
+};
diff --git a/src/locales/en-US/pages.ts b/src/locales/en-US/pages.ts
new file mode 100644
index 0000000..486f5e8
--- /dev/null
+++ b/src/locales/en-US/pages.ts
@@ -0,0 +1,68 @@
+export default {
+  'pages.layouts.userLayout.title':
+    'Ant Design is the most influential web design specification in Xihu district',
+  'pages.login.accountLogin.tab': 'Account Login',
+  'pages.login.accountLogin.errorMessage': 'Incorrect username/password(admin/ant.design)',
+  'pages.login.failure': 'Login failed, please try again!',
+  'pages.login.success': 'Login successful!',
+  'pages.login.username.placeholder': 'Username: admin or user',
+  'pages.login.username.required': 'Please input your username!',
+  'pages.login.password.placeholder': 'Password: ant.design',
+  'pages.login.password.required': 'Please input your password!',
+  'pages.login.phoneLogin.tab': 'Phone Login',
+  'pages.login.phoneLogin.errorMessage': 'Verification Code Error',
+  'pages.login.phoneNumber.placeholder': 'Phone Number',
+  'pages.login.phoneNumber.required': 'Please input your phone number!',
+  'pages.login.phoneNumber.invalid': 'Phone number is invalid!',
+  'pages.login.captcha.placeholder': 'Verification Code',
+  'pages.login.captcha.required': 'Please input verification code!',
+  'pages.login.phoneLogin.getVerificationCode': 'Get Code',
+  'pages.getCaptchaSecondText': 'sec(s)',
+  'pages.login.rememberMe': 'Remember me',
+  'pages.login.forgotPassword': 'Forgot Password ?',
+  'pages.login.submit': 'Login',
+  'pages.login.loginWith': 'Login with :',
+  'pages.login.registerAccount': 'Register Account',
+  'pages.welcome.link': 'Welcome',
+  'pages.welcome.alertMessage': 'Faster and stronger heavy-duty components have been released.',
+  'pages.admin.subPage.title': 'This page can only be viewed by Admin',
+  'pages.admin.subPage.alertMessage':
+    'Umi ui is now released, welcome to use npm run ui to start the experience.',
+  'pages.searchTable.createForm.newRule': 'New Rule',
+  'pages.searchTable.updateForm.ruleConfig': 'Rule configuration',
+  'pages.searchTable.updateForm.basicConfig': 'Basic Information',
+  'pages.searchTable.updateForm.ruleName.nameLabel': 'Rule Name',
+  'pages.searchTable.updateForm.ruleName.nameRules': 'Please enter the rule name!',
+  'pages.searchTable.updateForm.ruleDesc.descLabel': 'Rule Description',
+  'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'Please enter at least five characters',
+  'pages.searchTable.updateForm.ruleDesc.descRules':
+    'Please enter a rule description of at least five characters!',
+  'pages.searchTable.updateForm.ruleProps.title': 'Configure Properties',
+  'pages.searchTable.updateForm.object': 'Monitoring Object',
+  'pages.searchTable.updateForm.ruleProps.templateLabel': 'Rule Template',
+  'pages.searchTable.updateForm.ruleProps.typeLabel': 'Rule Type',
+  'pages.searchTable.updateForm.schedulingPeriod.title': 'Set Scheduling Period',
+  'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Starting Time',
+  'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'Please choose a start time!',
+  'pages.searchTable.titleDesc': 'Description',
+  'pages.searchTable.ruleName': 'Rule name is required',
+  'pages.searchTable.titleCallNo': 'Number of Service Calls',
+  'pages.searchTable.titleStatus': 'Status',
+  'pages.searchTable.nameStatus.default': 'default',
+  'pages.searchTable.nameStatus.running': 'running',
+  'pages.searchTable.nameStatus.online': 'online',
+  'pages.searchTable.nameStatus.abnormal': 'abnormal',
+  'pages.searchTable.titleUpdatedAt': 'Last Scheduled at',
+  'pages.searchTable.exception': 'Please enter the reason for the exception!',
+  'pages.searchTable.titleOption': 'Option',
+  'pages.searchTable.config': 'Configuration',
+  'pages.searchTable.subscribeAlert': 'Subscribe to alerts',
+  'pages.searchTable.title': 'Enquiry Form',
+  'pages.searchTable.new': 'New',
+  'pages.searchTable.chosen': 'chosen',
+  'pages.searchTable.item': 'item',
+  'pages.searchTable.totalServiceCalls': 'Total Number of Service Calls',
+  'pages.searchTable.tenThousand': '0000',
+  'pages.searchTable.batchDeletion': 'batch deletion',
+  'pages.searchTable.batchApproval': 'batch approval',
+};
diff --git a/src/locales/en-US/pwa.ts b/src/locales/en-US/pwa.ts
new file mode 100644
index 0000000..ed8d199
--- /dev/null
+++ b/src/locales/en-US/pwa.ts
@@ -0,0 +1,6 @@
+export default {
+  'app.pwa.offline': 'You are offline now',
+  'app.pwa.serviceworker.updated': 'New content is available',
+  'app.pwa.serviceworker.updated.hint': 'Please press the "Refresh" button to reload current page',
+  'app.pwa.serviceworker.updated.ok': 'Refresh',
+};
diff --git a/src/locales/en-US/resource.ts b/src/locales/en-US/resource.ts
new file mode 100644
index 0000000..da11e6c
--- /dev/null
+++ b/src/locales/en-US/resource.ts
@@ -0,0 +1,3 @@
+export const algorithm_model: {[key: string]: string} = {'resource.algorithm_model.table.list.id': 'id', 'resource.algorithm_model.table.list.name': 'name', 'resource.algorithm_model.table.list.type': 'type', 'resource.algorithm_model.table.list.remark': 'remark', 'resource.algorithm_model.table.list.createTime': 'create_time', 'resource.algorithm_model.table.list.updateTime': 'update_time', 'resource.algorithm_model.table.rule.required.name': 'name is required'}
+export const container_image: {[key: string]: string} = {'resource.container_image.table.list.id': 'id', 'resource.container_image.table.list.name': 'name', 'resource.container_image.table.list.version': 'version', 'resource.container_image.table.list.path': 'path', 'resource.container_image.table.list.startCode': 'start_code', 'resource.container_image.table.list.type': 'type', 'resource.container_image.table.list.remark': 'remark', 'resource.container_image.table.list.createTime': 'create_time', 'resource.container_image.table.list.updateTime': 'update_time', 'resource.container_image.table.rule.required.name': 'name is required', 'resource.container_image.table.rule.required.version': 'version is required'}
+export const model_version: {[key: string]: string} = {'resource.model_version.table.list.id': 'id', 'resource.model_version.table.list.modelFkId': 'model_fk_id', 'resource.model_version.table.list.version': 'version', 'resource.model_version.table.list.path': 'path', 'resource.model_version.table.list.startCode': 'start_code', 'resource.model_version.table.list.isEnable': 'is_enable', 'resource.model_version.table.list.remark': 'remark', 'resource.model_version.table.list.createTime': 'create_time', 'resource.model_version.table.list.updateTime': 'update_time', 'resource.model_version.table.rule.required.modelFkId': 'model_fk_id is required', 'resource.model_version.table.rule.required.path': 'path is required'}
diff --git a/src/locales/en-US/settingDrawer.ts b/src/locales/en-US/settingDrawer.ts
new file mode 100644
index 0000000..a644905
--- /dev/null
+++ b/src/locales/en-US/settingDrawer.ts
@@ -0,0 +1,31 @@
+export default {
+  'app.setting.pagestyle': 'Page style setting',
+  'app.setting.pagestyle.dark': 'Dark style',
+  'app.setting.pagestyle.light': 'Light style',
+  'app.setting.content-width': 'Content Width',
+  'app.setting.content-width.fixed': 'Fixed',
+  'app.setting.content-width.fluid': 'Fluid',
+  'app.setting.themecolor': 'Theme Color',
+  'app.setting.themecolor.dust': 'Dust Red',
+  'app.setting.themecolor.volcano': 'Volcano',
+  'app.setting.themecolor.sunset': 'Sunset Orange',
+  'app.setting.themecolor.cyan': 'Cyan',
+  'app.setting.themecolor.green': 'Polar Green',
+  'app.setting.themecolor.daybreak': 'Daybreak Blue (default)',
+  'app.setting.themecolor.geekblue': 'Geek Glue',
+  'app.setting.themecolor.purple': 'Golden Purple',
+  'app.setting.navigationmode': 'Navigation Mode',
+  'app.setting.sidemenu': 'Side Menu Layout',
+  'app.setting.topmenu': 'Top Menu Layout',
+  'app.setting.fixedheader': 'Fixed Header',
+  'app.setting.fixedsidebar': 'Fixed Sidebar',
+  'app.setting.fixedsidebar.hint': 'Works on Side Menu Layout',
+  'app.setting.hideheader': 'Hidden Header when scrolling',
+  'app.setting.hideheader.hint': 'Works when Hidden Header is enabled',
+  'app.setting.othersettings': 'Other Settings',
+  'app.setting.weakmode': 'Weak Mode',
+  'app.setting.copy': 'Copy Setting',
+  'app.setting.copyinfo': 'copy success,please replace defaultSettings in src/models/setting.js',
+  'app.setting.production.hint':
+    'Setting panel shows in development environment only, please manually modify',
+};
diff --git a/src/locales/en-US/settings.ts b/src/locales/en-US/settings.ts
new file mode 100644
index 0000000..822dd00
--- /dev/null
+++ b/src/locales/en-US/settings.ts
@@ -0,0 +1,60 @@
+export default {
+  'app.settings.menuMap.basic': 'Basic Settings',
+  'app.settings.menuMap.security': 'Security Settings',
+  'app.settings.menuMap.binding': 'Account Binding',
+  'app.settings.menuMap.notification': 'New Message Notification',
+  'app.settings.basic.avatar': 'Avatar',
+  'app.settings.basic.change-avatar': 'Change avatar',
+  'app.settings.basic.email': 'Email',
+  'app.settings.basic.email-message': 'Please input your email!',
+  'app.settings.basic.nickname': 'Nickname',
+  'app.settings.basic.nickname-message': 'Please input your Nickname!',
+  'app.settings.basic.profile': 'Personal profile',
+  'app.settings.basic.profile-message': 'Please input your personal profile!',
+  'app.settings.basic.profile-placeholder': 'Brief introduction to yourself',
+  'app.settings.basic.country': 'Country/Region',
+  'app.settings.basic.country-message': 'Please input your country!',
+  'app.settings.basic.geographic': 'Province or city',
+  'app.settings.basic.geographic-message': 'Please input your geographic info!',
+  'app.settings.basic.address': 'Street Address',
+  'app.settings.basic.address-message': 'Please input your address!',
+  'app.settings.basic.phone': 'Phone Number',
+  'app.settings.basic.phone-message': 'Please input your phone!',
+  'app.settings.basic.update': 'Update Information',
+  'app.settings.security.strong': 'Strong',
+  'app.settings.security.medium': 'Medium',
+  'app.settings.security.weak': 'Weak',
+  'app.settings.security.password': 'Account Password',
+  'app.settings.security.password-description': 'Current password strength',
+  'app.settings.security.phone': 'Security Phone',
+  'app.settings.security.phone-description': 'Bound phone',
+  'app.settings.security.question': 'Security Question',
+  'app.settings.security.question-description':
+    'The security question is not set, and the security policy can effectively protect the account security',
+  'app.settings.security.email': 'Backup Email',
+  'app.settings.security.email-description': 'Bound Email',
+  'app.settings.security.mfa': 'MFA Device',
+  'app.settings.security.mfa-description':
+    'Unbound MFA device, after binding, can be confirmed twice',
+  'app.settings.security.modify': 'Modify',
+  'app.settings.security.set': 'Set',
+  'app.settings.security.bind': 'Bind',
+  'app.settings.binding.taobao': 'Binding Taobao',
+  'app.settings.binding.taobao-description': 'Currently unbound Taobao account',
+  'app.settings.binding.alipay': 'Binding Alipay',
+  'app.settings.binding.alipay-description': 'Currently unbound Alipay account',
+  'app.settings.binding.dingding': 'Binding DingTalk',
+  'app.settings.binding.dingding-description': 'Currently unbound DingTalk account',
+  'app.settings.binding.bind': 'Bind',
+  'app.settings.notification.password': 'Account Password',
+  'app.settings.notification.password-description':
+    'Messages from other users will be notified in the form of a station letter',
+  'app.settings.notification.messages': 'System Messages',
+  'app.settings.notification.messages-description':
+    'System messages will be notified in the form of a station letter',
+  'app.settings.notification.todo': 'To-do Notification',
+  'app.settings.notification.todo-description':
+    'The to-do list will be notified in the form of a letter from the station',
+  'app.settings.open': 'Open',
+  'app.settings.close': 'Close',
+};
diff --git a/src/locales/fa-IR.ts b/src/locales/fa-IR.ts
new file mode 100644
index 0000000..c27343d
--- /dev/null
+++ b/src/locales/fa-IR.ts
@@ -0,0 +1,24 @@
+import component from './fa-IR/component';
+import globalHeader from './fa-IR/globalHeader';
+import menu from './fa-IR/menu';
+import pages from './fa-IR/pages';
+import pwa from './fa-IR/pwa';
+import settingDrawer from './fa-IR/settingDrawer';
+import settings from './fa-IR/settings';
+
+export default {
+  'navBar.lang': 'زبان ها  ',
+  'layout.user.link.help': 'کمک',
+  'layout.user.link.privacy': 'حریم خصوصی',
+  'layout.user.link.terms': 'مقررات',
+  'app.preview.down.block': 'این صفحه را در پروژه محلی خود بارگیری کنید',
+  'app.welcome.link.fetch-blocks': 'دریافت تمام بلوک',
+  'app.welcome.link.block-list': 'به سرعت صفحات استاندارد مبتنی بر توسعه "بلوک" را بسازید',
+  ...globalHeader,
+  ...menu,
+  ...settingDrawer,
+  ...settings,
+  ...pwa,
+  ...component,
+  ...pages,
+};
diff --git a/src/locales/fa-IR/component.ts b/src/locales/fa-IR/component.ts
new file mode 100644
index 0000000..91e7a05
--- /dev/null
+++ b/src/locales/fa-IR/component.ts
@@ -0,0 +1,5 @@
+export default {
+  'component.tagSelect.expand': 'باز',
+  'component.tagSelect.collapse': 'بسته ',
+  'component.tagSelect.all': 'همه',
+};
diff --git a/src/locales/fa-IR/globalHeader.ts b/src/locales/fa-IR/globalHeader.ts
new file mode 100644
index 0000000..1a92fbb
--- /dev/null
+++ b/src/locales/fa-IR/globalHeader.ts
@@ -0,0 +1,17 @@
+export default {
+  'component.globalHeader.search': 'جستجو ',
+  'component.globalHeader.search.example1': 'مثال 1 را جستجو کنید',
+  'component.globalHeader.search.example2': 'مثال 2 را جستجو کنید',
+  'component.globalHeader.search.example3': 'مثال 3 را جستجو کنید',
+  'component.globalHeader.help': 'کمک',
+  'component.globalHeader.notification': 'اعلان',
+  'component.globalHeader.notification.empty': 'شما همه اعلان ها را مشاهده کرده اید.',
+  'component.globalHeader.message': 'پیام',
+  'component.globalHeader.message.empty': 'شما همه پیام ها را مشاهده کرده اید.',
+  'component.globalHeader.event': 'رویداد',
+  'component.globalHeader.event.empty': 'شما همه رویدادها را مشاهده کرده اید.',
+  'component.noticeIcon.clear': 'پاک کردن',
+  'component.noticeIcon.cleared': 'پاک شد',
+  'component.noticeIcon.empty': 'بدون اعلان',
+  'component.noticeIcon.view-more': 'نمایش بیشتر',
+};
diff --git a/src/locales/fa-IR/menu.ts b/src/locales/fa-IR/menu.ts
new file mode 100644
index 0000000..c67e003
--- /dev/null
+++ b/src/locales/fa-IR/menu.ts
@@ -0,0 +1,52 @@
+export default {
+  'menu.welcome': 'خوش آمدید',
+  'menu.more-blocks': 'بلوک های بیشتر',
+  'menu.home': 'خانه',
+  'menu.admin': 'مدیر',
+  'menu.admin.sub-page': 'زیر صفحه',
+  'menu.login': 'ورود',
+  'menu.register': 'ثبت نام',
+  'menu.register-result': 'ثبت نام نتیجه',
+  'menu.dashboard': 'داشبورد',
+  'menu.dashboard.analysis': 'تحلیل و بررسی',
+  'menu.dashboard.monitor': 'نظارت',
+  'menu.dashboard.workplace': 'محل کار',
+  'menu.exception.403': '403',
+  'menu.exception.404': '404',
+  'menu.exception.500': '500',
+  'menu.form': 'فرم',
+  'menu.form.basic-form': 'فرم اساسی',
+  'menu.form.step-form': 'فرم مرحله',
+  'menu.form.step-form.info': 'فرم مرحله (نوشتن اطلاعات انتقال)',
+  'menu.form.step-form.confirm': 'فرم مرحله (تأیید اطلاعات انتقال)',
+  'menu.form.step-form.result': 'فرم مرحله (تمام شده)',
+  'menu.form.advanced-form': 'فرم پیشرفته',
+  'menu.list': 'لیست',
+  'menu.list.table-list': 'جدول جستجو',
+  'menu.list.basic-list': 'لیست اصلی',
+  'menu.list.card-list': 'لیست کارت',
+  'menu.list.search-list': 'لیست جستجو',
+  'menu.list.search-list.articles': 'لیست جستجو (مقالات)',
+  'menu.list.search-list.projects': 'لیست جستجو (پروژه ها)',
+  'menu.list.search-list.applications': 'لیست جستجو (برنامه ها)',
+  'menu.profile': 'مشخصات',
+  'menu.profile.basic': 'مشخصات عمومی',
+  'menu.profile.advanced': 'مشخصات پیشرفته',
+  'menu.result': 'نتیجه',
+  'menu.result.success': 'موفق',
+  'menu.result.fail': 'ناموفق',
+  'menu.exception': 'استثنا',
+  'menu.exception.not-permission': '403',
+  'menu.exception.not-find': '404',
+  'menu.exception.server-error': '500',
+  'menu.exception.trigger': 'راه اندازی',
+  'menu.account': 'حساب',
+  'menu.account.center': 'مرکز حساب',
+  'menu.account.settings': 'تنظیمات حساب',
+  'menu.account.trigger': 'خطای راه اندازی',
+  'menu.account.logout': 'خروج',
+  'menu.editor': 'ویرایشگر گرافیک',
+  'menu.editor.flow': 'ویرایشگر جریان',
+  'menu.editor.mind': 'ویرایشگر ذهن',
+  'menu.editor.koni': 'ویرایشگر Koni',
+};
diff --git a/src/locales/fa-IR/pages.ts b/src/locales/fa-IR/pages.ts
new file mode 100644
index 0000000..8b949b6
--- /dev/null
+++ b/src/locales/fa-IR/pages.ts
@@ -0,0 +1,67 @@
+export default {
+  'pages.layouts.userLayout.title': 'طراحی مورچه تأثیرگذارترین مشخصات طراحی وب در منطقه Xihu است',
+  'pages.login.accountLogin.tab': 'ورود به حساب کاربری',
+  'pages.login.accountLogin.errorMessage': 'نام کاربری / رمزعبور نادرست (مدیر / ant.design)',
+  'pages.login.failure': 'ورود به سیستم با شکست مواجه شد، لطفا دوباره سعی کنید!',
+  'pages.login.success': 'ورود موفق!',
+  'pages.login.username.placeholder': 'نام کاربری: مدیر یا کاربر',
+  'pages.login.username.required': 'لطفا نام کاربری خود را وارد کنید!',
+  'pages.login.password.placeholder': 'رمز عبور: ant.design',
+  'pages.login.password.required': 'لطفاً رمز ورود خود را وارد کنید!',
+  'pages.login.phoneLogin.tab': 'ورود به سیستم تلفن',
+  'pages.login.phoneLogin.errorMessage': 'خطای کد تأیید',
+  'pages.login.phoneNumber.placeholder': 'شماره تلفن',
+  'pages.login.phoneNumber.required': 'لطفاً شماره تلفن خود را وارد کنید!',
+  'pages.login.phoneNumber.invalid': 'شماره تلفن نامعتبر است!',
+  'pages.login.captcha.placeholder': 'کد تایید',
+  'pages.login.captcha.required': 'لطفا کد تأیید را وارد کنید!',
+  'pages.login.phoneLogin.getVerificationCode': 'دریافت کد',
+  'pages.getCaptchaSecondText': 'ثانیه',
+  'pages.login.rememberMe': 'مرا به خاطر بسپار',
+  'pages.login.forgotPassword': 'رمز عبور را فراموش کرده اید ?',
+  'pages.login.submit': 'ارسال',
+  'pages.login.loginWith': 'وارد شوید با :',
+  'pages.login.registerAccount': 'ثبت نام',
+  'pages.welcome.link': 'خوش آمدید',
+  'pages.welcome.alertMessage': 'اجزای سنگین تر سریعتر و قوی تر آزاد شده اند.',
+  'pages.admin.subPage.title': 'این صفحه فقط توسط مدیر قابل مشاهده است',
+  'pages.admin.subPage.alertMessage':
+    'رابط کاربری Umi اکنون منتشر شده است ، برای شروع تجربه استفاده از npm run ui خوش آمدید.',
+  'pages.searchTable.createForm.newRule': 'قانون جدید',
+  'pages.searchTable.updateForm.ruleConfig': 'پیکربندی قانون',
+  'pages.searchTable.updateForm.basicConfig': 'اطلاعات اولیه',
+  'pages.searchTable.updateForm.ruleName.nameLabel': ' نام قانون',
+  'pages.searchTable.updateForm.ruleName.nameRules': 'لطفاً نام قانون را وارد کنید!',
+  'pages.searchTable.updateForm.ruleDesc.descLabel': 'شرح قانون',
+  'pages.searchTable.updateForm.ruleDesc.descPlaceholder': 'لطفاً حداقل پنج حرف وارد کنید',
+  'pages.searchTable.updateForm.ruleDesc.descRules':
+    'لطفاً حداقل یک قانون حاوی پنج کاراکتر شرح دهید!',
+  'pages.searchTable.updateForm.ruleProps.title': 'پیکربندی خصوصیات',
+  'pages.searchTable.updateForm.object': 'نظارت بر شی',
+  'pages.searchTable.updateForm.ruleProps.templateLabel': 'الگوی قانون',
+  'pages.searchTable.updateForm.ruleProps.typeLabel': 'نوع قانون',
+  'pages.searchTable.updateForm.schedulingPeriod.title': 'تنظیم دوره زمان بندی',
+  'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'زمان شروع',
+  'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'لطفاً زمان شروع را انتخاب کنید!',
+  'pages.searchTable.titleDesc': 'شرح',
+  'pages.searchTable.ruleName': 'نام قانون لازم است',
+  'pages.searchTable.titleCallNo': 'تعداد تماس های خدماتی',
+  'pages.searchTable.titleStatus': 'وضعیت',
+  'pages.searchTable.nameStatus.default': 'پیش فرض',
+  'pages.searchTable.nameStatus.running': 'در حال دویدن',
+  'pages.searchTable.nameStatus.online': 'برخط',
+  'pages.searchTable.nameStatus.abnormal': 'غیرطبیعی',
+  'pages.searchTable.titleUpdatedAt': 'آخرین برنامه ریزی در',
+  'pages.searchTable.exception': 'لطفا دلیل استثنا را وارد کنید!',
+  'pages.searchTable.titleOption': 'گزینه',
+  'pages.searchTable.config': 'پیکربندی',
+  'pages.searchTable.subscribeAlert': 'مشترک شدن در هشدارها',
+  'pages.searchTable.title': 'فرم درخواست',
+  'pages.searchTable.new': 'جدید',
+  'pages.searchTable.chosen': 'انتخاب شده',
+  'pages.searchTable.item': 'مورد',
+  'pages.searchTable.totalServiceCalls': 'تعداد کل تماس های خدماتی',
+  'pages.searchTable.tenThousand': '0000',
+  'pages.searchTable.batchDeletion': 'حذف دسته ای',
+  'pages.searchTable.batchApproval': 'تصویب دسته ای',
+};
diff --git a/src/locales/fa-IR/pwa.ts b/src/locales/fa-IR/pwa.ts
new file mode 100644
index 0000000..54831b4
--- /dev/null
+++ b/src/locales/fa-IR/pwa.ts
@@ -0,0 +1,7 @@
+export default {
+  'app.pwa.offline': 'شما اکنون آفلاین هستید',
+  'app.pwa.serviceworker.updated': 'مطالب جدید در دسترس است',
+  'app.pwa.serviceworker.updated.hint':
+    'لطفاً برای بارگیری مجدد صفحه فعلی ، دکمه "تازه سازی" را فشار دهید',
+  'app.pwa.serviceworker.updated.ok': 'تازه سازی',
+};
diff --git a/src/locales/fa-IR/settingDrawer.ts b/src/locales/fa-IR/settingDrawer.ts
new file mode 100644
index 0000000..cb223d5
--- /dev/null
+++ b/src/locales/fa-IR/settingDrawer.ts
@@ -0,0 +1,32 @@
+export default {
+  'app.setting.pagestyle': 'تنظیم نوع صفحه',
+  'app.setting.pagestyle.dark': 'سبک تیره',
+  'app.setting.pagestyle.light': 'سبک سبک',
+  'app.setting.content-width': 'عرض محتوا',
+  'app.setting.content-width.fixed': 'ثابت',
+  'app.setting.content-width.fluid': 'شناور',
+  'app.setting.themecolor': 'رنگ تم',
+  'app.setting.themecolor.dust': 'گرد و غبار قرمز',
+  'app.setting.themecolor.volcano': 'آتشفشان',
+  'app.setting.themecolor.sunset': 'غروب نارنجی',
+  'app.setting.themecolor.cyan': 'فیروزه ای',
+  'app.setting.themecolor.green': 'سبز قطبی',
+  'app.setting.themecolor.daybreak': 'آبی روشن(پیشفرض)',
+  'app.setting.themecolor.geekblue': 'چسب گیک',
+  'app.setting.themecolor.purple': 'بنفش طلایی',
+  'app.setting.navigationmode': 'حالت پیمایش',
+  'app.setting.sidemenu': 'طرح منوی کناری',
+  'app.setting.topmenu': 'طرح منوی بالایی',
+  'app.setting.fixedheader': 'سرصفحه ثابت',
+  'app.setting.fixedsidebar': 'نوار کناری ثابت',
+  'app.setting.fixedsidebar.hint': 'کار بر روی منوی کناری',
+  'app.setting.hideheader': 'هدر پنهان هنگام پیمایش',
+  'app.setting.hideheader.hint': 'وقتی Hidden Header فعال باشد کار می کند',
+  'app.setting.othersettings': 'تنظیمات دیگر',
+  'app.setting.weakmode': 'حالت ضعیف',
+  'app.setting.copy': 'تنظیمات کپی',
+  'app.setting.copyinfo':
+    'موفقیت در کپی کردن , لطفا defaultSettings را در src / models / setting.js جایگزین کنید',
+  'app.setting.production.hint':
+    'صفحه تنظیم فقط در محیط توسعه نمایش داده می شود ، لطفاً دستی تغییر دهید',
+};
diff --git a/src/locales/fa-IR/settings.ts b/src/locales/fa-IR/settings.ts
new file mode 100644
index 0000000..040bc31
--- /dev/null
+++ b/src/locales/fa-IR/settings.ts
@@ -0,0 +1,60 @@
+export default {
+  'app.settings.menuMap.basic': 'تنظیمات پایه ',
+  'app.settings.menuMap.security': 'تنظیمات امنیتی',
+  'app.settings.menuMap.binding': 'صحافی حساب',
+  'app.settings.menuMap.notification': 'اعلان پیام جدید',
+  'app.settings.basic.avatar': 'آواتار',
+  'app.settings.basic.change-avatar': 'آواتار را تغییر دهید',
+  'app.settings.basic.email': 'ایمیل',
+  'app.settings.basic.email-message': 'لطفا ایمیل خود را وارد کنید!',
+  'app.settings.basic.nickname': 'نام مستعار',
+  'app.settings.basic.nickname-message': 'لطفاً نام مستعار خود را وارد کنید!',
+  'app.settings.basic.profile': 'پروفایل شخصی',
+  'app.settings.basic.profile-message': 'لطفاً مشخصات شخصی خود را وارد کنید!',
+  'app.settings.basic.profile-placeholder': 'معرفی مختصر خودتان',
+  'app.settings.basic.country': 'کشور / منطقه',
+  'app.settings.basic.country-message': 'لطفاً کشور خود را وارد کنید!',
+  'app.settings.basic.geographic': 'استان یا شهر',
+  'app.settings.basic.geographic-message': 'لطفاً اطلاعات جغرافیایی خود را وارد کنید!',
+  'app.settings.basic.address': 'آدرس خیابان',
+  'app.settings.basic.address-message': 'لطفا آدرس خود را وارد کنید!',
+  'app.settings.basic.phone': 'شماره تلفن',
+  'app.settings.basic.phone-message': 'لطفاً تلفن خود را وارد کنید!',
+  'app.settings.basic.update': 'به روز رسانی اطلاعات',
+  'app.settings.security.strong': 'قوی',
+  'app.settings.security.medium': 'متوسط',
+  'app.settings.security.weak': 'ضعیف',
+  'app.settings.security.password': 'رمز عبور حساب کاربری',
+  'app.settings.security.password-description': 'قدرت رمز عبور فعلی',
+  'app.settings.security.phone': 'تلفن امنیتی',
+  'app.settings.security.phone-description': 'تلفن مقید',
+  'app.settings.security.question': 'سوال امنیتی',
+  'app.settings.security.question-description':
+    'سوال امنیتی تنظیم نشده است و سیاست امنیتی می تواند به طور موثر از امنیت حساب محافظت کند',
+  'app.settings.security.email': 'ایمیل پشتیبان',
+  'app.settings.security.email-description': 'ایمیل مقید',
+  'app.settings.security.mfa': 'دستگاه MFA',
+  'app.settings.security.mfa-description':
+    'دستگاه MFA بسته نشده ، پس از اتصال ، می تواند دو بار تأیید شود',
+  'app.settings.security.modify': 'تغییر',
+  'app.settings.security.set': 'تنظیم',
+  'app.settings.security.bind': 'بستن',
+  'app.settings.binding.taobao': 'اتصال Taobao',
+  'app.settings.binding.taobao-description': 'حساب Taobao در حال حاضر بسته نشده است',
+  'app.settings.binding.alipay': 'اتصال Alipay',
+  'app.settings.binding.alipay-description': 'حساب Alipay در حال حاضر بسته نشده است',
+  'app.settings.binding.dingding': 'اتصال DingTalk',
+  'app.settings.binding.dingding-description': 'حساب DingTalk در حال حاضر محدود نشده است',
+  'app.settings.binding.bind': 'بستن',
+  'app.settings.notification.password': 'رمز عبور حساب کاربری',
+  'app.settings.notification.password-description':
+    'پیام های سایر کاربران در قالب یک نامه ایستگاهی اعلام خواهد شد',
+  'app.settings.notification.messages': 'پیام های سیستم',
+  'app.settings.notification.messages-description':
+    'پیام های سیستم به صورت نامه ایستگاه مطلع می شوند',
+  'app.settings.notification.todo': 'اعلان کارها',
+  'app.settings.notification.todo-description':
+    'لیست کارها به صورت نامه ای از ایستگاه اطلاع داده می شود',
+  'app.settings.open': 'باز کن',
+  'app.settings.close': 'بستن',
+};
diff --git a/src/locales/id-ID.ts b/src/locales/id-ID.ts
new file mode 100644
index 0000000..aecd2bd
--- /dev/null
+++ b/src/locales/id-ID.ts
@@ -0,0 +1,25 @@
+import component from './id-ID/component';
+import globalHeader from './id-ID/globalHeader';
+import menu from './id-ID/menu';
+import pages from './id-ID/pages';
+import pwa from './id-ID/pwa';
+import settingDrawer from './id-ID/settingDrawer';
+import settings from './id-ID/settings';
+
+export default {
+  'navbar.lang': 'Bahasa',
+  'layout.user.link.help': 'Bantuan',
+  'layout.user.link.privacy': 'Privasi',
+  'layout.user.link.terms': 'Ketentuan',
+  'app.preview.down.block': 'Unduh halaman ini dalam projek lokal anda',
+  'app.welcome.link.fetch-blocks': 'Dapatkan semua blok',
+  'app.welcome.link.block-list':
+    'Buat standar dengan cepat, halaman-halaman berdasarkan pengembangan `block`',
+  ...globalHeader,
+  ...menu,
+  ...settingDrawer,
+  ...settings,
+  ...pwa,
+  ...component,
+  ...pages,
+};
diff --git a/src/locales/id-ID/component.ts b/src/locales/id-ID/component.ts
new file mode 100644
index 0000000..fe583af
--- /dev/null
+++ b/src/locales/id-ID/component.ts
@@ -0,0 +1,5 @@
+export default {
+  'component.tagSelect.expand': 'Perluas',
+  'component.tagSelect.collapse': 'Lipat',
+  'component.tagSelect.all': 'Semua',
+};
diff --git a/src/locales/id-ID/globalHeader.ts b/src/locales/id-ID/globalHeader.ts
new file mode 100644
index 0000000..e6283ea
--- /dev/null
+++ b/src/locales/id-ID/globalHeader.ts
@@ -0,0 +1,17 @@
+export default {
+  'component.globalHeader.search': 'Pencarian',
+  'component.globalHeader.search.example1': 'Contoh 1 Pencarian',
+  'component.globalHeader.search.example2': 'Contoh 2 Pencarian',
+  'component.globalHeader.search.example3': 'Contoh 3 Pencarian',
+  'component.globalHeader.help': 'Bantuan',
+  'component.globalHeader.notification': 'Notifikasi',
+  'component.globalHeader.notification.empty': 'Anda telah membaca semua notifikasi',
+  'component.globalHeader.message': 'Pesan',
+  'component.globalHeader.message.empty': 'Anda telah membaca semua pesan.',
+  'component.globalHeader.event': 'Acara',
+  'component.globalHeader.event.empty': 'Anda telah melihat semua acara.',
+  'component.noticeIcon.clear': 'Kosongkan',
+  'component.noticeIcon.cleared': 'Berhasil dikosongkan',
+  'component.noticeIcon.empty': 'Tidak ada pemberitahuan',
+  'component.noticeIcon.view-more': 'Melihat lebih',
+};
diff --git a/src/locales/id-ID/menu.ts b/src/locales/id-ID/menu.ts
new file mode 100644
index 0000000..254ff44
--- /dev/null
+++ b/src/locales/id-ID/menu.ts
@@ -0,0 +1,52 @@
+export default {
+  'menu.welcome': 'Selamat Datang',
+  'menu.more-blocks': 'Blocks Lainnya',
+  'menu.home': 'Halaman Awal',
+  'menu.admin': 'Admin',
+  'menu.admin.sub-page': 'Sub-Halaman',
+  'menu.login': 'Masuk',
+  'menu.register': 'Pendaftaran',
+  'menu.register-result': 'Hasil Pendaftaran',
+  'menu.dashboard': 'Dasbor',
+  'menu.dashboard.analysis': 'Analisis',
+  'menu.dashboard.monitor': 'Monitor',
+  'menu.dashboard.workplace': 'Workplace',
+  'menu.exception.403': '403',
+  'menu.exception.404': '404',
+  'menu.exception.500': '500',
+  'menu.form': 'Form',
+  'menu.form.basic-form': 'Form Dasar',
+  'menu.form.step-form': 'Form Bertahap',
+  'menu.form.step-form.info': 'Form Bertahap(menulis informasi yang dibagikan)',
+  'menu.form.step-form.confirm': 'Form Bertahap(konfirmasi informasi yang dibagikan)',
+  'menu.form.step-form.result': 'Form Bertahap(selesai)',
+  'menu.form.advanced-form': 'Form Lanjutan',
+  'menu.list': 'Daftar',
+  'menu.list.table-list': 'Tabel Pencarian',
+  'menu.list.basic-list': 'Daftar Dasar',
+  'menu.list.card-list': 'Daftar Kartu',
+  'menu.list.search-list': 'Daftar Pencarian',
+  'menu.list.search-list.articles': 'Daftar Pencarian(artikel)',
+  'menu.list.search-list.projects': 'Daftar Pencarian(projek)',
+  'menu.list.search-list.applications': 'Daftar Pencarian(aplikasi)',
+  'menu.profile': 'Profil',
+  'menu.profile.basic': 'Profil Dasar',
+  'menu.profile.advanced': 'Profile Lanjutan',
+  'menu.result': 'Hasil',
+  'menu.result.success': 'Sukses',
+  'menu.result.fail': 'Gagal',
+  'menu.exception': 'Pengecualian',
+  'menu.exception.not-permission': '403',
+  'menu.exception.not-find': '404',
+  'menu.exception.server-error': '500',
+  'menu.exception.trigger': 'Jalankan',
+  'menu.account': 'Akun',
+  'menu.account.center': 'Detail Akun',
+  'menu.account.settings': 'Pengaturan Akun',
+  'menu.account.trigger': 'Mengaktivasi Error',
+  'menu.account.logout': 'Keluar',
+  'menu.editor': 'Penyusun Grafis',
+  'menu.editor.flow': 'Penyusun Alur',
+  'menu.editor.mind': 'Penyusun Mind',
+  'menu.editor.koni': 'Penyusun Koni',
+};
diff --git a/src/locales/id-ID/pages.ts b/src/locales/id-ID/pages.ts
new file mode 100644
index 0000000..50b7e20
--- /dev/null
+++ b/src/locales/id-ID/pages.ts
@@ -0,0 +1,70 @@
+export default {
+  'pages.layouts.userLayout.title':
+    'Ant Design adalah spesifikasi desain Web yang paling berpengaruh di Kabupaten Xihu',
+  'pages.login.accountLogin.tab': 'Login dengan akun',
+  'pages.login.accountLogin.errorMessage': 'Nama pengguna dan kata sandi salah(admin/ant.design)',
+  'pages.login.failure': 'Log masuk gagal, silakan coba lagi!',
+  'pages.login.success': 'Login berhasil!',
+  'pages.login.username.placeholder': 'nama pengguna: admin atau user',
+  'pages.login.username.required': 'Nama pengguna harus diisi!',
+  'pages.login.password.placeholder': 'kata sandi: ant.design',
+  'pages.login.password.required': 'Kata sandi harus diisi!',
+  'pages.login.phoneLogin.tab': 'Login dengan ponsel',
+  'pages.login.phoneLogin.errorMessage': 'Kesalahan kode verifikasi',
+  'pages.login.phoneNumber.placeholder': 'masukkan nomor telepon',
+  'pages.login.phoneNumber.required': 'Nomor ponsel harus diisi!',
+  'pages.login.phoneNumber.invalid': 'Nomor ponsel tidak valid!',
+  'pages.login.captcha.placeholder': 'kode verifikasi',
+  'pages.login.captcha.required': 'Kode verifikasi diperlukan!',
+  'pages.login.phoneLogin.getVerificationCode': 'Dapatkan kode',
+  'pages.getCaptchaSecondText': 'detik tersisa',
+  'pages.login.rememberMe': 'Ingat saya',
+  'pages.login.forgotPassword': 'Lupa Kata Sandi?',
+  'pages.login.submit': 'Masuk',
+  'pages.login.loginWith': 'Masuk dengan :',
+  'pages.login.registerAccount': 'Daftar Akun',
+  'pages.welcome.link': 'Selamat datang',
+  'pages.welcome.alertMessage':
+    'Komponen heavy-duty yang lebih cepat dan lebih kuat telah dirilis.',
+  'pages.admin.subPage.title': 'Halaman ini hanya dapat dilihat oleh admin',
+  'pages.admin.subPage.alertMessage':
+    'umi ui telah dirilis, silahkan gunakan npm run ui untuk memulai pengalaman.',
+  'pages.searchTable.createForm.newRule': 'Aturan baru',
+  'pages.searchTable.updateForm.ruleConfig': 'Konfigurasi aturan',
+  'pages.searchTable.updateForm.basicConfig': 'Informasi dasar',
+  'pages.searchTable.updateForm.ruleName.nameLabel': 'Nama aturan',
+  'pages.searchTable.updateForm.ruleName.nameRules': 'Harap masukkan nama aturan!',
+  'pages.searchTable.updateForm.ruleDesc.descLabel': 'Deskripsi aturan',
+  'pages.searchTable.updateForm.ruleDesc.descPlaceholder':
+    'Harap masukkan setidaknya lima karakter',
+  'pages.searchTable.updateForm.ruleDesc.descRules':
+    'Harap masukkan deskripsi aturan setidaknya lima karakter!',
+  'pages.searchTable.updateForm.ruleProps.title': 'Properti aturan',
+  'pages.searchTable.updateForm.object': 'Objek pemantauan',
+  'pages.searchTable.updateForm.ruleProps.templateLabel': 'Template aturan',
+  'pages.searchTable.updateForm.ruleProps.typeLabel': 'Jenis aturan',
+  'pages.searchTable.updateForm.schedulingPeriod.title': 'Periode penjadwalan',
+  'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Waktu mulai',
+  'pages.searchTable.updateForm.schedulingPeriod.timeRules': 'Pilih waktu mulai!',
+  'pages.searchTable.titleDesc': 'deskripsi',
+  'pages.searchTable.ruleName': 'Nama aturan wajib diisi',
+  'pages.searchTable.titleCallNo': 'Jumlah panggilan',
+  'pages.searchTable.titleStatus': 'Status',
+  'pages.searchTable.nameStatus.default': 'default',
+  'pages.searchTable.nameStatus.running': 'menyala',
+  'pages.searchTable.nameStatus.online': 'online',
+  'pages.searchTable.nameStatus.abnormal': 'abnormal',
+  'pages.searchTable.titleUpdatedAt': 'Waktu terjadwal',
+  'pages.searchTable.exception': 'Harap masukkan alasan pengecualian!',
+  'pages.searchTable.titleOption': 'Pengoperasian',
+  'pages.searchTable.config': 'Konfigurasi',
+  'pages.searchTable.subscribeAlert': 'Berlangganan notifikasi',
+  'pages.searchTable.title': 'Formulir pertanyaan',
+  'pages.searchTable.new': 'Baru',
+  'pages.searchTable.chosen': 'Terpilih',
+  'pages.searchTable.item': 'item',
+  'pages.searchTable.totalServiceCalls': 'Jumlah total panggilan layanan',
+  'pages.searchTable.tenThousand': '0000',
+  'pages.searchTable.batchDeletion': 'Penghapusan batch',
+  'pages.searchTable.batchApproval': 'Persetujuan batch',
+};
diff --git a/src/locales/id-ID/pwa.ts b/src/locales/id-ID/pwa.ts
new file mode 100644
index 0000000..b2cb8a1
--- /dev/null
+++ b/src/locales/id-ID/pwa.ts
@@ -0,0 +1,7 @@
+export default {
+  'app.pwa.offline': 'Koneksi anda terputus',
+  'app.pwa.serviceworker.updated': 'Konten baru sudah tersedia',
+  'app.pwa.serviceworker.updated.hint':
+    'Silahkan klik tombol "Refresh" untuk memuat ulang halaman ini',
+  'app.pwa.serviceworker.updated.ok': 'Memuat ulang',
+};
diff --git a/src/locales/id-ID/settingDrawer.ts b/src/locales/id-ID/settingDrawer.ts
new file mode 100644
index 0000000..f2d3e40
--- /dev/null
+++ b/src/locales/id-ID/settingDrawer.ts
@@ -0,0 +1,32 @@
+export default {
+  'app.setting.pagestyle': 'Pengaturan style Halaman',
+  'app.setting.pagestyle.dark': 'Style Gelap',
+  'app.setting.pagestyle.light': 'Style Cerah',
+  'app.setting.content-width': 'Lebar Konten',
+  'app.setting.content-width.fixed': 'Tetap',
+  'app.setting.content-width.fluid': 'Fluid',
+  'app.setting.themecolor': 'Theme Color',
+  'app.setting.themecolor.dust': 'Dust Red',
+  'app.setting.themecolor.volcano': 'Volcano',
+  'app.setting.themecolor.sunset': 'Sunset Orange',
+  'app.setting.themecolor.cyan': 'Cyan',
+  'app.setting.themecolor.green': 'Polar Green',
+  'app.setting.themecolor.daybreak': 'Daybreak Blue (bawaan)',
+  'app.setting.themecolor.geekblue': 'Geek Glue',
+  'app.setting.themecolor.purple': 'Golden Purple',
+  'app.setting.navigationmode': 'Mode Navigasi',
+  'app.setting.sidemenu': 'Susunan Menu Samping',
+  'app.setting.topmenu': 'Susunan Menu Atas',
+  'app.setting.fixedheader': 'Header Tetap',
+  'app.setting.fixedsidebar': 'Sidebar Tetap',
+  'app.setting.fixedsidebar.hint': 'Berjalan pada Susunan Menu Samping',
+  'app.setting.hideheader': 'Sembunyikan Header ketika gulir ke bawah',
+  'app.setting.hideheader.hint': 'Bekerja ketika Header tersembunyi dimunculkan',
+  'app.setting.othersettings': 'Pengaturan Lainnya',
+  'app.setting.weakmode': 'Mode Lemah',
+  'app.setting.copy': 'Salin Pengaturan',
+  'app.setting.copyinfo':
+    'Berhasil disalin,tolong ubah defaultSettings pada src/models/setting.js',
+  'app.setting.production.hint':
+    'Panel pengaturan hanya muncul pada lingkungan pengembangan, silahkan modifikasi secara menual',
+};
diff --git a/src/locales/id-ID/settings.ts b/src/locales/id-ID/settings.ts
new file mode 100644
index 0000000..04b7d12
--- /dev/null
+++ b/src/locales/id-ID/settings.ts
@@ -0,0 +1,60 @@
+export default {
+  'app.settings.menuMap.basic': 'Pengaturan Dasar',
+  'app.settings.menuMap.security': 'Pengaturan Keamanan',
+  'app.settings.menuMap.binding': 'Pengikatan Akun',
+  'app.settings.menuMap.notification': 'Notifikasi Pesan Baru',
+  'app.settings.basic.avatar': 'Avatar',
+  'app.settings.basic.change-avatar': 'Ubah avatar',
+  'app.settings.basic.email': 'Email',
+  'app.settings.basic.email-message': 'Tolong masukkan email!',
+  'app.settings.basic.nickname': 'Nickname',
+  'app.settings.basic.nickname-message': 'Tolong masukkan Nickname!',
+  'app.settings.basic.profile': 'Profil Personal',
+  'app.settings.basic.profile-message': 'Tolong masukkan profil personal!',
+  'app.settings.basic.profile-placeholder': 'Perkenalan Singkat tentang Diri Anda',
+  'app.settings.basic.country': 'Negara/Wilayah',
+  'app.settings.basic.country-message': 'Tolong masukkan negara anda!',
+  'app.settings.basic.geographic': 'Provinsi atau kota',
+  'app.settings.basic.geographic-message': 'Tolong masukkan info geografis anda!',
+  'app.settings.basic.address': 'Alamat Jalan',
+  'app.settings.basic.address-message': 'Tolong masukkan Alamat Jalan anda!',
+  'app.settings.basic.phone': 'Nomor Ponsel',
+  'app.settings.basic.phone-message': 'Tolong masukkan Nomor Ponsel anda!',
+  'app.settings.basic.update': 'Perbarui Informasi',
+  'app.settings.security.strong': 'Kuat',
+  'app.settings.security.medium': 'Sedang',
+  'app.settings.security.weak': 'Lemah',
+  'app.settings.security.password': 'Kata Sandi Akun',
+  'app.settings.security.password-description': 'Kekuatan Kata Sandi saat ini',
+  'app.settings.security.phone': 'Keamanan Ponsel',
+  'app.settings.security.phone-description': 'Mengikat Ponsel',
+  'app.settings.security.question': 'Pertanyaan Keamanan',
+  'app.settings.security.question-description':
+    'Pertanyaan Keamanan belum diatur, dan kebijakan keamanan dapat melindungi akun secara efektif',
+  'app.settings.security.email': 'Email Cadangan',
+  'app.settings.security.email-description': 'Mengikat Email',
+  'app.settings.security.mfa': 'Perangka MFA',
+  'app.settings.security.mfa-description':
+    'Tidak mengikat Perangkat MFA, setelah diikat, dapat dikonfirmasi dua kali',
+  'app.settings.security.modify': 'Modifikasi',
+  'app.settings.security.set': 'Setel',
+  'app.settings.security.bind': 'Ikat',
+  'app.settings.binding.taobao': 'Mengikat Taobao',
+  'app.settings.binding.taobao-description': 'Tidak mengikat akun Taobao saat ini',
+  'app.settings.binding.alipay': 'Mengikat Alipay',
+  'app.settings.binding.alipay-description': 'Tidak mengikat akun Alipay saat ini',
+  'app.settings.binding.dingding': 'Mengikat DingTalk',
+  'app.settings.binding.dingding-description': 'Tidak mengikat akun DingTalk',
+  'app.settings.binding.bind': 'Ikat',
+  'app.settings.notification.password': 'Kata Sandi Akun',
+  'app.settings.notification.password-description':
+    'Pesan dari pengguna lain akan diberitahu dalam bentuk surat',
+  'app.settings.notification.messages': 'Pesan Sistem',
+  'app.settings.notification.messages-description':
+    'Pesan sistem akan diberitahu dalam bentuk surat',
+  'app.settings.notification.todo': 'Notifikasi daftar To-do',
+  'app.settings.notification.todo-description':
+    'Daftar to-do akan diberitahukan dalam bentuk surat dari stasiun',
+  'app.settings.open': 'Buka',
+  'app.settings.close': 'Tutup',
+};
diff --git a/src/locales/ja-JP.ts b/src/locales/ja-JP.ts
new file mode 100644
index 0000000..1602887
--- /dev/null
+++ b/src/locales/ja-JP.ts
@@ -0,0 +1,24 @@
+import component from './ja-JP/component';
+import globalHeader from './ja-JP/globalHeader';
+import menu from './ja-JP/menu';
+import pages from './ja-JP/pages';
+import pwa from './ja-JP/pwa';
+import settingDrawer from './ja-JP/settingDrawer';
+import settings from './ja-JP/settings';
+
+export default {
+  'navBar.lang': '言語',
+  'layout.user.link.help': 'ヘルプ',
+  'layout.user.link.privacy': 'プライバシー',
+  'layout.user.link.terms': '利用規約',
+  'app.preview.down.block': 'このページをローカルプロジェクトにダウンロードしてください',
+  'app.welcome.link.fetch-blocks': '',
+  'app.welcome.link.block-list': '',
+  ...globalHeader,
+  ...menu,
+  ...settingDrawer,
+  ...settings,
+  ...pwa,
+  ...component,
+  ...pages,
+};
diff --git a/src/locales/ja-JP/component.ts b/src/locales/ja-JP/component.ts
new file mode 100644
index 0000000..40f238c
--- /dev/null
+++ b/src/locales/ja-JP/component.ts
@@ -0,0 +1,5 @@
+export default {
+  'component.tagSelect.expand': '展開',
+  'component.tagSelect.collapse': '折りたたむ',
+  'component.tagSelect.all': 'すべて',
+};
diff --git a/src/locales/ja-JP/globalHeader.ts b/src/locales/ja-JP/globalHeader.ts
new file mode 100644
index 0000000..1642938
--- /dev/null
+++ b/src/locales/ja-JP/globalHeader.ts
@@ -0,0 +1,17 @@
+export default {
+  'component.globalHeader.search': '検索',
+  'component.globalHeader.search.example1': '検索例1',
+  'component.globalHeader.search.example2': '検索例2',
+  'component.globalHeader.search.example3': '検索例3',
+  'component.globalHeader.help': 'ヘルプ',
+  'component.globalHeader.notification': '通知',
+  'component.globalHeader.notification.empty': 'すべての通知を表示しました。',
+  'component.globalHeader.message': 'メッセージ',
+  'component.globalHeader.message.empty': 'すべてのメッセージを表示しました。',
+  'component.globalHeader.event': 'イベント',
+  'component.globalHeader.event.empty': 'すべてのイベントを表示しました。',
+  'component.noticeIcon.clear': 'クリア',
+  'component.noticeIcon.cleared': 'クリア済み',
+  'component.noticeIcon.empty': '通知なし',
+  'component.noticeIcon.view-more': 'もっと見る',
+};
diff --git a/src/locales/ja-JP/menu.ts b/src/locales/ja-JP/menu.ts
new file mode 100644
index 0000000..af6ed0e
--- /dev/null
+++ b/src/locales/ja-JP/menu.ts
@@ -0,0 +1,52 @@
+export default {
+  'menu.welcome': 'ようこそ',
+  'menu.more-blocks': 'その他のブロック',
+  'menu.home': 'ホーム',
+  'menu.admin': '管理者',
+  'menu.admin.sub-page': 'サブページ',
+  'menu.login': 'ログイン',
+  'menu.register': '登録',
+  'menu.register-result': '登録結果',
+  'menu.dashboard': 'ダッシュボード',
+  'menu.dashboard.analysis': '分析',
+  'menu.dashboard.monitor': 'モニター',
+  'menu.dashboard.workplace': '職場',
+  'menu.exception.403': '403',
+  'menu.exception.404': '404',
+  'menu.exception.500': '500',
+  'menu.form': 'フォーム',
+  'menu.form.basic-form': '基本フォーム',
+  'menu.form.step-form': 'ステップフォーム',
+  'menu.form.step-form.info': 'ステップフォーム(転送情報の書き込み)',
+  'menu.form.step-form.confirm': 'ステップフォーム(転送情報の確認)',
+  'menu.form.step-form.result': 'ステップフォーム(完成)',
+  'menu.form.advanced-form': '高度なフォーム',
+  'menu.list': 'リスト',
+  'menu.list.table-list': '検索テーブル',
+  'menu.list.basic-list': '基本リスト',
+  'menu.list.card-list': 'カードリスト',
+  'menu.list.search-list': '検索リスト',
+  'menu.list.search-list.articles': '検索リスト(記事)',
+  'menu.list.search-list.projects': '検索リスト(プロジェクト)',
+  'menu.list.search-list.applications': '検索リスト(アプリ)',
+  'menu.profile': 'プロフィール',
+  'menu.profile.basic': '基本プロフィール',
+  'menu.profile.advanced': '高度なプロフィール',
+  'menu.result': '結果',
+  'menu.result.success': '成功',
+  'menu.result.fail': '失敗',
+  'menu.exception': '例外',
+  'menu.exception.not-permission': '403',
+  'menu.exception.not-find': '404',
+  'menu.exception.server-error': '500',
+  'menu.exception.trigger': 'トリガー',
+  'menu.account': 'アカウント',
+  'menu.account.center': 'アカウントセンター',
+  'menu.account.settings': 'アカウント設定',
+  'menu.account.trigger': 'トリガーエラー',
+  'menu.account.logout': 'ログアウト',
+  'menu.editor': 'グラフィックエディタ',
+  'menu.editor.flow': 'フローエディタ',
+  'menu.editor.mind': 'マインドエディター',
+  'menu.editor.koni': 'コニエディター',
+};
diff --git a/src/locales/ja-JP/pages.ts b/src/locales/ja-JP/pages.ts
new file mode 100644
index 0000000..11b4514
--- /dev/null
+++ b/src/locales/ja-JP/pages.ts
@@ -0,0 +1,67 @@
+export default {
+  'pages.layouts.userLayout.title': 'Ant Designは、西湖区で最も影響力のあるWebデザイン仕様です。',
+  'pages.login.accountLogin.tab': 'アカウントログイン',
+  'pages.login.accountLogin.errorMessage':
+    'ユーザー名/パスワードが正しくありません(admin/ant.design)',
+  'pages.login.failure': 'ログインに失敗したら、もう一度試してください!',
+  'pages.login.success': 'ログイン成功!',
+  'pages.login.username.placeholder': 'ユーザー名:adminまたはuser',
+  'pages.login.username.required': 'ユーザー名を入力してください!',
+  'pages.login.password.placeholder': 'パスワード:ant.design',
+  'pages.login.password.required': 'パスワードを入力してください!',
+  'pages.login.phoneLogin.tab': '電話ログイン',
+  'pages.login.phoneLogin.errorMessage': '検証コードエラー',
+  'pages.login.phoneNumber.placeholder': '電話番号',
+  'pages.login.phoneNumber.required': '電話番号を入力してください!',
+  'pages.login.phoneNumber.invalid': '電話番号が無効です!',
+  'pages.login.captcha.placeholder': '確認コード',
+  'pages.login.captcha.required': '確認コードを入力してください!',
+  'pages.login.phoneLogin.getVerificationCode': '確認コードを取得',
+  'pages.getCaptchaSecondText': '秒',
+  'pages.login.rememberMe': 'Remember me',
+  'pages.login.forgotPassword': 'パスワードをお忘れですか?',
+  'pages.login.submit': 'ログイン',
+  'pages.login.loginWith': 'その他のログイン方法:',
+  'pages.login.registerAccount': 'アカウント登録',
+  'pages.welcome.link': 'ようこそ',
+  'pages.welcome.alertMessage': 'より高速で強力な頑丈なコンポーネントがリリースされました。',
+  'pages.admin.subPage.title': 'このページは管理者のみが表示できます',
+  'pages.admin.subPage.alertMessage':
+    'Umi uiがリリースされました。npm run uiを使用して体験してください。',
+  'pages.searchTable.createForm.newRule': '新しいルール',
+  'pages.searchTable.updateForm.ruleConfig': 'ルール構成',
+  'pages.searchTable.updateForm.basicConfig': '基本情報',
+  'pages.searchTable.updateForm.ruleName.nameLabel': 'ルール名',
+  'pages.searchTable.updateForm.ruleName.nameRules': 'ルール名を入力してください!',
+  'pages.searchTable.updateForm.ruleDesc.descLabel': 'ルールの説明',
+  'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '5文字以上入力してください',
+  'pages.searchTable.updateForm.ruleDesc.descRules': '5文字以上のルールの説明を入力してください!',
+  'pages.searchTable.updateForm.ruleProps.title': 'プロパティの構成',
+  'pages.searchTable.updateForm.object': '監視対象',
+  'pages.searchTable.updateForm.ruleProps.templateLabel': 'ルールテンプレート',
+  'pages.searchTable.updateForm.ruleProps.typeLabel': 'ルールタイプ',
+  'pages.searchTable.updateForm.schedulingPeriod.title': 'スケジュール期間の設定',
+  'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '開始時間',
+  'pages.searchTable.updateForm.schedulingPeriod.timeRules': '開始時間を選択してください!',
+  'pages.searchTable.titleDesc': '説明',
+  'pages.searchTable.ruleName': 'ルール名が必要です',
+  'pages.searchTable.titleCallNo': 'サービスコール数',
+  'pages.searchTable.titleStatus': 'ステータス',
+  'pages.searchTable.nameStatus.default': 'デフォルト',
+  'pages.searchTable.nameStatus.running': '起動中',
+  'pages.searchTable.nameStatus.online': 'オンライン',
+  'pages.searchTable.nameStatus.abnormal': '異常',
+  'pages.searchTable.titleUpdatedAt': '最終スケジュール',
+  'pages.searchTable.exception': '例外の理由を入力してください!',
+  'pages.searchTable.titleOption': 'オプション',
+  'pages.searchTable.config': '構成',
+  'pages.searchTable.subscribeAlert': 'アラートを購読する',
+  'pages.searchTable.title': 'お問い合わせフォーム',
+  'pages.searchTable.new': '新しい',
+  'pages.searchTable.chosen': '選んだ項目',
+  'pages.searchTable.item': '項目',
+  'pages.searchTable.totalServiceCalls': 'サービスコールの総数',
+  'pages.searchTable.tenThousand': '万',
+  'pages.searchTable.batchDeletion': 'バッチ削除',
+  'pages.searchTable.batchApproval': 'バッチ承認',
+};
diff --git a/src/locales/ja-JP/pwa.ts b/src/locales/ja-JP/pwa.ts
new file mode 100644
index 0000000..ace23ae
--- /dev/null
+++ b/src/locales/ja-JP/pwa.ts
@@ -0,0 +1,7 @@
+export default {
+  'app.pwa.offline': 'あなたは今オフラインです',
+  'app.pwa.serviceworker.updated': '新しいコンテンツが利用可能です',
+  'app.pwa.serviceworker.updated.hint':
+    '現在のページをリロードするには、「更新」ボタンを押してください',
+  'app.pwa.serviceworker.updated.ok': 'リフレッシュ',
+};
diff --git a/src/locales/ja-JP/settingDrawer.ts b/src/locales/ja-JP/settingDrawer.ts
new file mode 100644
index 0000000..67a22df
--- /dev/null
+++ b/src/locales/ja-JP/settingDrawer.ts
@@ -0,0 +1,31 @@
+export default {
+  'app.setting.pagestyle': 'ページスタイル設定',
+  'app.setting.pagestyle.dark': 'ダークスタイル',
+  'app.setting.pagestyle.light': 'ライトスタイル',
+  'app.setting.content-width': 'コンテンツの幅',
+  'app.setting.content-width.fixed': '固定',
+  'app.setting.content-width.fluid': '流体',
+  'app.setting.themecolor': 'テーマカラー',
+  'app.setting.themecolor.dust': 'ダストレッド',
+  'app.setting.themecolor.volcano': 'ボルケ-ノ',
+  'app.setting.themecolor.sunset': 'サンセットオレンジ',
+  'app.setting.themecolor.cyan': 'シアン',
+  'app.setting.themecolor.green': 'ポーラーグリーン',
+  'app.setting.themecolor.daybreak': '夜明けの青(デフォルト)',
+  'app.setting.themecolor.geekblue': 'ギーク ブルー',
+  'app.setting.themecolor.purple': 'ゴールデンパープル',
+  'app.setting.navigationmode': 'ナビゲーションモード',
+  'app.setting.sidemenu': 'サイドメニューのレイアウト',
+  'app.setting.topmenu': 'トップメニューのレイアウト',
+  'app.setting.fixedheader': '固定ヘッダー',
+  'app.setting.fixedsidebar': '固定サイドバー',
+  'app.setting.fixedsidebar.hint': 'サイドメニューのレイアウトで動作します',
+  'app.setting.hideheader': 'スクロール時の非表示ヘッダー',
+  'app.setting.hideheader.hint': '非表示ヘッダーが有効になっている場合に機能します',
+  'app.setting.othersettings': 'その他の設定',
+  'app.setting.weakmode': 'ウィークモード',
+  'app.setting.copy': 'コピー設定',
+  'app.setting.copyinfo':
+    'コピーが成功しました。src/models/setting.jsのdefaultSettingsを置き換えてください',
+  'app.setting.production.hint': '設定パネルは開発環境でのみ表示されます。手動で変更してください',
+};
diff --git a/src/locales/ja-JP/settings.ts b/src/locales/ja-JP/settings.ts
new file mode 100644
index 0000000..de52481
--- /dev/null
+++ b/src/locales/ja-JP/settings.ts
@@ -0,0 +1,59 @@
+export default {
+  'app.settings.menuMap.basic': '基本設定',
+  'app.settings.menuMap.security': 'セキュリティ設定',
+  'app.settings.menuMap.binding': 'アカウントのバインド',
+  'app.settings.menuMap.notification': '新しいメッセージの通知',
+  'app.settings.basic.avatar': 'アバター',
+  'app.settings.basic.change-avatar': 'アバターを変更する',
+  'app.settings.basic.email': 'メール',
+  'app.settings.basic.email-message': 'メールアドレスを入力してください!',
+  'app.settings.basic.nickname': 'ニックネーム',
+  'app.settings.basic.nickname-message': 'ニックネームを入力してください!',
+  'app.settings.basic.profile': '個人プロフィール',
+  'app.settings.basic.profile-message': '個人プロフィールを入力してください!',
+  'app.settings.basic.profile-placeholder': '自己紹介',
+  'app.settings.basic.country': '国/地域',
+  'app.settings.basic.country-message': 'あなたの国を入力してください!',
+  'app.settings.basic.geographic': '州または市',
+  'app.settings.basic.geographic-message': '地理情報を入力してください!',
+  'app.settings.basic.address': '住所',
+  'app.settings.basic.address-message': '住所を入力してください!',
+  'app.settings.basic.phone': '電話番号',
+  'app.settings.basic.phone-message': '電話番号を入力してください!',
+  'app.settings.basic.update': '更新情報',
+  'app.settings.security.strong': '強い',
+  'app.settings.security.medium': 'ミディアム',
+  'app.settings.security.weak': '弱い',
+  'app.settings.security.password': 'アカウントパスワード',
+  'app.settings.security.password-description': '現在のパスワードの強度',
+  'app.settings.security.phone': 'セキュリティ電話番号',
+  'app.settings.security.phone-description': 'バインドされた電話番号',
+  'app.settings.security.question': '秘密の質問',
+  'app.settings.security.question-description':
+    'セキュリティの質問が設定されてません。セキュリティポリシーはアカウントのセキュリティを効果的に保護できます',
+  'app.settings.security.email': 'バックアップメール',
+  'app.settings.security.email-description': 'バインドされたメール',
+  'app.settings.security.mfa': '多要素認証デバイス',
+  'app.settings.security.mfa-description':
+    'バインドされていない多要素認証デバイスは、バインド後、2回確認できます',
+  'app.settings.security.modify': '変更する',
+  'app.settings.security.set': 'セットする',
+  'app.settings.security.bind': 'バインド',
+  'app.settings.binding.taobao': 'タオバオをバインドする',
+  'app.settings.binding.taobao-description': '現在バインドされていないタオバオアカウント',
+  'app.settings.binding.alipay': 'アリペイをバインドする',
+  'app.settings.binding.alipay-description': '現在バインドされていないアリペイアカウント',
+  'app.settings.binding.dingding': 'ディントークをバインドする',
+  'app.settings.binding.dingding-description': '現在バインドされていないディントークアカウント',
+  'app.settings.binding.bind': 'バインド',
+  'app.settings.notification.password': 'アカウントパスワード',
+  'app.settings.notification.password-description':
+    '他のユーザーからのメッセージは、ステーションレターの形式で通知されます',
+  'app.settings.notification.messages': 'システムメッセージ',
+  'app.settings.notification.messages-description':
+    'システムメッセージは、ステーションレターの形式で通知されます',
+  'app.settings.notification.todo': 'To Do(用事) 通知',
+  'app.settings.notification.todo-description': 'To Doタスクは、内部レターの形式で通知されます',
+  'app.settings.open': '開く',
+  'app.settings.close': '閉じる',
+};
diff --git a/src/locales/pt-BR.ts b/src/locales/pt-BR.ts
new file mode 100644
index 0000000..d501a8a
--- /dev/null
+++ b/src/locales/pt-BR.ts
@@ -0,0 +1,22 @@
+import component from './pt-BR/component';
+import globalHeader from './pt-BR/globalHeader';
+import menu from './pt-BR/menu';
+import pages from './pt-BR/pages';
+import pwa from './pt-BR/pwa';
+import settingDrawer from './pt-BR/settingDrawer';
+import settings from './pt-BR/settings';
+
+export default {
+  'navBar.lang': 'Idiomas',
+  'layout.user.link.help': 'ajuda',
+  'layout.user.link.privacy': 'política de privacidade',
+  'layout.user.link.terms': 'termos de serviços',
+  'app.preview.down.block': 'Download this page to your local project',
+  ...globalHeader,
+  ...menu,
+  ...settingDrawer,
+  ...settings,
+  ...pwa,
+  ...component,
+  ...pages,
+};
diff --git a/src/locales/pt-BR/component.ts b/src/locales/pt-BR/component.ts
new file mode 100644
index 0000000..7cf9999
--- /dev/null
+++ b/src/locales/pt-BR/component.ts
@@ -0,0 +1,5 @@
+export default {
+  'component.tagSelect.expand': 'Expandir',
+  'component.tagSelect.collapse': 'Diminuir',
+  'component.tagSelect.all': 'Todas',
+};
diff --git a/src/locales/pt-BR/globalHeader.ts b/src/locales/pt-BR/globalHeader.ts
new file mode 100644
index 0000000..d232ca7
--- /dev/null
+++ b/src/locales/pt-BR/globalHeader.ts
@@ -0,0 +1,17 @@
+export default {
+  'component.globalHeader.search': 'Busca',
+  'component.globalHeader.search.example1': 'Exemplo de busca 1',
+  'component.globalHeader.search.example2': 'Exemplo de busca 2',
+  'component.globalHeader.search.example3': 'Exemplo de busca 3',
+  'component.globalHeader.help': 'Ajuda',
+  'component.globalHeader.notification': 'Notificação',
+  'component.globalHeader.notification.empty': 'Você visualizou todas as notificações.',
+  'component.globalHeader.message': 'Mensagem',
+  'component.globalHeader.message.empty': 'Você visualizou todas as mensagens.',
+  'component.globalHeader.event': 'Evento',
+  'component.globalHeader.event.empty': 'Você visualizou todos os eventos.',
+  'component.noticeIcon.clear': 'Limpar',
+  'component.noticeIcon.cleared': 'Limpo',
+  'component.noticeIcon.empty': 'Sem notificações',
+  'component.noticeIcon.view-more': 'Veja mais',
+};
diff --git a/src/locales/pt-BR/menu.ts b/src/locales/pt-BR/menu.ts
new file mode 100644
index 0000000..aded8ff
--- /dev/null
+++ b/src/locales/pt-BR/menu.ts
@@ -0,0 +1,52 @@
+export default {
+  'menu.welcome': 'Welcome',
+  'menu.more-blocks': 'More Blocks',
+  'menu.home': 'Início',
+  'menu.admin': 'Admin',
+  'menu.admin.sub-page': 'Sub-Page',
+  'menu.login': 'Login',
+  'menu.register': 'Registro',
+  'menu.register-result': 'Resultado de registro',
+  'menu.dashboard': 'Dashboard',
+  'menu.dashboard.analysis': 'Análise',
+  'menu.dashboard.monitor': 'Monitor',
+  'menu.dashboard.workplace': 'Ambiente de Trabalho',
+  'menu.exception.403': '403',
+  'menu.exception.404': '404',
+  'menu.exception.500': '500',
+  'menu.form': 'Formulário',
+  'menu.form.basic-form': 'Formulário Básico',
+  'menu.form.step-form': 'Formulário Assistido',
+  'menu.form.step-form.info': 'Formulário Assistido(gravar informações de transferência)',
+  'menu.form.step-form.confirm': 'Formulário Assistido(confirmar informações de transferência)',
+  'menu.form.step-form.result': 'Formulário Assistido(finalizado)',
+  'menu.form.advanced-form': 'Formulário Avançado',
+  'menu.list': 'Lista',
+  'menu.list.table-list': 'Tabela de Busca',
+  'menu.list.basic-list': 'Lista Básica',
+  'menu.list.card-list': 'Lista de Card',
+  'menu.list.search-list': 'Lista de Busca',
+  'menu.list.search-list.articles': 'Lista de Busca(artigos)',
+  'menu.list.search-list.projects': 'Lista de Busca(projetos)',
+  'menu.list.search-list.applications': 'Lista de Busca(aplicações)',
+  'menu.profile': 'Perfil',
+  'menu.profile.basic': 'Perfil Básico',
+  'menu.profile.advanced': 'Perfil Avançado',
+  'menu.result': 'Resultado',
+  'menu.result.success': 'Sucesso',
+  'menu.result.fail': 'Falha',
+  'menu.exception': 'Exceção',
+  'menu.exception.not-permission': '403',
+  'menu.exception.not-find': '404',
+  'menu.exception.server-error': '500',
+  'menu.exception.trigger': 'Disparar',
+  'menu.account': 'Conta',
+  'menu.account.center': 'Central da Conta',
+  'menu.account.settings': 'Configurar Conta',
+  'menu.account.trigger': 'Disparar Erro',
+  'menu.account.logout': 'Sair',
+  'menu.editor': 'Graphic Editor',
+  'menu.editor.flow': 'Flow Editor',
+  'menu.editor.mind': 'Mind Editor',
+  'menu.editor.koni': 'Koni Editor',
+};
diff --git a/src/locales/pt-BR/pages.ts b/src/locales/pt-BR/pages.ts
new file mode 100644
index 0000000..01522ff
--- /dev/null
+++ b/src/locales/pt-BR/pages.ts
@@ -0,0 +1,70 @@
+export default {
+  'pages.layouts.userLayout.title':
+    'Ant Design é a especificação de web design mais influente no distrito de Xihu',
+  'pages.login.accountLogin.tab': 'Login da conta',
+  'pages.login.accountLogin.errorMessage': 'usuário/senha incorreto(admin/ant.design)',
+  'pages.login.failure': 'Login falhou, por favor tente novamente!',
+  'pages.login.success': 'Login efetuado com sucesso!',
+  'pages.login.username.placeholder': 'Usuário: admin or user',
+  'pages.login.username.required': 'Por favor insira seu usuário!',
+  'pages.login.password.placeholder': 'Senha: ant.design',
+  'pages.login.password.required': 'Por favor insira sua senha!',
+  'pages.login.phoneLogin.tab': 'Login com Telefone',
+  'pages.login.phoneLogin.errorMessage': 'Erro de Código de Verificação',
+  'pages.login.phoneNumber.placeholder': 'Telefone',
+  'pages.login.phoneNumber.required': 'Por favor entre com seu telefone!',
+  'pages.login.phoneNumber.invalid': 'Telefone é inválido!',
+  'pages.login.captcha.placeholder': 'Código de Verificação',
+  'pages.login.captcha.required': 'Por favor entre com o código de verificação!',
+  'pages.login.phoneLogin.getVerificationCode': 'Obter Código',
+  'pages.getCaptchaSecondText': 'seg(s)',
+  'pages.login.rememberMe': 'Lembre-me',
+  'pages.login.forgotPassword': 'Perdeu a Senha ?',
+  'pages.login.submit': 'Enviar',
+  'pages.login.loginWith': 'Login com :',
+  'pages.login.registerAccount': 'Registra Conta',
+  'pages.welcome.link': 'Bem-vindo',
+  'pages.welcome.alertMessage': 'Componentes pesados mais rápidos e mais fortes foram lançados.',
+  'pages.admin.subPage.title': 'Esta página só pode ser vista pelo Admin',
+  'pages.admin.subPage.alertMessage':
+    'O Umi ui foi lançado, bem-vindo ao usar o npm run ui para iniciar a experiência.',
+  'pages.searchTable.createForm.newRule': 'Neva Regra',
+  'pages.searchTable.updateForm.ruleConfig': 'Configuração de Regra',
+  'pages.searchTable.updateForm.basicConfig': 'Informação básica',
+  'pages.searchTable.updateForm.ruleName.nameLabel': 'Nome da Regra',
+  'pages.searchTable.updateForm.ruleName.nameRules': 'Por favor entre com o nome da regra!',
+  'pages.searchTable.updateForm.ruleDesc.descLabel': 'Descrição da Regra',
+  'pages.searchTable.updateForm.ruleDesc.descPlaceholder':
+    'Por favor insira ao menos cinco caracteres',
+  'pages.searchTable.updateForm.ruleDesc.descRules':
+    'Insira uma descrição de regra de pelo menos cinco caracteres!',
+  'pages.searchTable.updateForm.ruleProps.title': 'Configurar Propriedades',
+  'pages.searchTable.updateForm.object': 'Objeto de Monitoramento',
+  'pages.searchTable.updateForm.ruleProps.templateLabel': 'Modelo de Regra',
+  'pages.searchTable.updateForm.ruleProps.typeLabel': 'Tipo de Regra',
+  'pages.searchTable.updateForm.schedulingPeriod.title': 'Definir Período de Agendamento',
+  'pages.searchTable.updateForm.schedulingPeriod.timeLabel': 'Hora de Início',
+  'pages.searchTable.updateForm.schedulingPeriod.timeRules':
+    'Por favor selecione um horáriod e início!',
+  'pages.searchTable.titleDesc': 'Descrição',
+  'pages.searchTable.ruleName': 'O nome da regra é obrigatório',
+  'pages.searchTable.titleCallNo': 'Número de chamadas de serviço',
+  'pages.searchTable.titleStatus': 'Status',
+  'pages.searchTable.nameStatus.default': 'padrão',
+  'pages.searchTable.nameStatus.running': 'executando',
+  'pages.searchTable.nameStatus.online': 'online',
+  'pages.searchTable.nameStatus.abnormal': 'anormal',
+  'pages.searchTable.titleUpdatedAt': 'Última programação em',
+  'pages.searchTable.exception': 'Por favor, indique o motivo da exceção!',
+  'pages.searchTable.titleOption': 'Opção',
+  'pages.searchTable.config': 'Configuração',
+  'pages.searchTable.subscribeAlert': 'Inscreva-se para receber alertas',
+  'pages.searchTable.title': 'Formulário de Consulta',
+  'pages.searchTable.new': 'Novo',
+  'pages.searchTable.chosen': 'selecionado',
+  'pages.searchTable.item': 'item',
+  'pages.searchTable.totalServiceCalls': 'Número total de chamadas de serviço',
+  'pages.searchTable.tenThousand': '0000',
+  'pages.searchTable.batchDeletion': 'deleção em lote',
+  'pages.searchTable.batchApproval': 'aprovação em lote',
+};
diff --git a/src/locales/pt-BR/pwa.ts b/src/locales/pt-BR/pwa.ts
new file mode 100644
index 0000000..05cc797
--- /dev/null
+++ b/src/locales/pt-BR/pwa.ts
@@ -0,0 +1,7 @@
+export default {
+  'app.pwa.offline': 'Você está offline agora',
+  'app.pwa.serviceworker.updated': 'Novo conteúdo está disponível',
+  'app.pwa.serviceworker.updated.hint':
+    'Por favor, pressione o botão "Atualizar" para recarregar a página atual',
+  'app.pwa.serviceworker.updated.ok': 'Atualizar',
+};
diff --git a/src/locales/pt-BR/settingDrawer.ts b/src/locales/pt-BR/settingDrawer.ts
new file mode 100644
index 0000000..8a10b57
--- /dev/null
+++ b/src/locales/pt-BR/settingDrawer.ts
@@ -0,0 +1,32 @@
+export default {
+  'app.setting.pagestyle': 'Configuração de estilo da página',
+  'app.setting.pagestyle.dark': 'Dark style',
+  'app.setting.pagestyle.light': 'Light style',
+  'app.setting.content-width': 'Largura do conteúdo',
+  'app.setting.content-width.fixed': 'Fixo',
+  'app.setting.content-width.fluid': 'Fluido',
+  'app.setting.themecolor': 'Cor do Tema',
+  'app.setting.themecolor.dust': 'Dust Red',
+  'app.setting.themecolor.volcano': 'Volcano',
+  'app.setting.themecolor.sunset': 'Sunset Orange',
+  'app.setting.themecolor.cyan': 'Cyan',
+  'app.setting.themecolor.green': 'Polar Green',
+  'app.setting.themecolor.daybreak': 'Daybreak Blue (default)',
+  'app.setting.themecolor.geekblue': 'Geek Glue',
+  'app.setting.themecolor.purple': 'Golden Purple',
+  'app.setting.navigationmode': 'Modo de Navegação',
+  'app.setting.sidemenu': 'Layout do Menu Lateral',
+  'app.setting.topmenu': 'Layout do Menu Superior',
+  'app.setting.fixedheader': 'Cabeçalho fixo',
+  'app.setting.fixedsidebar': 'Barra lateral fixa',
+  'app.setting.fixedsidebar.hint': 'Funciona no layout do menu lateral',
+  'app.setting.hideheader': 'Esconder o cabeçalho quando rolar',
+  'app.setting.hideheader.hint': 'Funciona quando o esconder cabeçalho está abilitado',
+  'app.setting.othersettings': 'Outras configurações',
+  'app.setting.weakmode': 'Weak Mode',
+  'app.setting.copy': 'Copiar Configuração',
+  'app.setting.copyinfo':
+    'copiado com sucesso,por favor trocar o defaultSettings em src/models/setting.js',
+  'app.setting.production.hint':
+    'O painel de configuração apenas é exibido no ambiente de desenvolvimento, por favor modifique manualmente o',
+};
diff --git a/src/locales/pt-BR/settings.ts b/src/locales/pt-BR/settings.ts
new file mode 100644
index 0000000..aad2e38
--- /dev/null
+++ b/src/locales/pt-BR/settings.ts
@@ -0,0 +1,60 @@
+export default {
+  'app.settings.menuMap.basic': 'Configurações Básicas',
+  'app.settings.menuMap.security': 'Configurações de Segurança',
+  'app.settings.menuMap.binding': 'Vinculação de Conta',
+  'app.settings.menuMap.notification': 'Mensagens de Notificação',
+  'app.settings.basic.avatar': 'Avatar',
+  'app.settings.basic.change-avatar': 'Alterar avatar',
+  'app.settings.basic.email': 'Email',
+  'app.settings.basic.email-message': 'Por favor insira seu email!',
+  'app.settings.basic.nickname': 'Nome de usuário',
+  'app.settings.basic.nickname-message': 'Por favor insira seu nome de usuário!',
+  'app.settings.basic.profile': 'Perfil pessoal',
+  'app.settings.basic.profile-message': 'Por favor insira seu perfil pessoal!',
+  'app.settings.basic.profile-placeholder': 'Breve introdução sua',
+  'app.settings.basic.country': 'País/Região',
+  'app.settings.basic.country-message': 'Por favor insira país!',
+  'app.settings.basic.geographic': 'Província, estado ou cidade',
+  'app.settings.basic.geographic-message': 'Por favor insira suas informações geográficas!',
+  'app.settings.basic.address': 'Endereço',
+  'app.settings.basic.address-message': 'Por favor insira seu endereço!',
+  'app.settings.basic.phone': 'Número de telefone',
+  'app.settings.basic.phone-message': 'Por favor insira seu número de telefone!',
+  'app.settings.basic.update': 'Atualizar Informações',
+  'app.settings.security.strong': 'Forte',
+  'app.settings.security.medium': 'Média',
+  'app.settings.security.weak': 'Fraca',
+  'app.settings.security.password': 'Senha da Conta',
+  'app.settings.security.password-description': 'Força da senha',
+  'app.settings.security.phone': 'Telefone de Seguraça',
+  'app.settings.security.phone-description': 'Telefone vinculado',
+  'app.settings.security.question': 'Pergunta de Segurança',
+  'app.settings.security.question-description':
+    'A pergunta de segurança não está definida e a política de segurança pode proteger efetivamente a segurança da conta',
+  'app.settings.security.email': 'Email de Backup',
+  'app.settings.security.email-description': 'Email vinculado',
+  'app.settings.security.mfa': 'Dispositivo MFA',
+  'app.settings.security.mfa-description':
+    'O dispositivo MFA não vinculado, após a vinculação, pode ser confirmado duas vezes',
+  'app.settings.security.modify': 'Modificar',
+  'app.settings.security.set': 'Atribuir',
+  'app.settings.security.bind': 'Vincular',
+  'app.settings.binding.taobao': 'Vincular Taobao',
+  'app.settings.binding.taobao-description': 'Atualmente não vinculado à conta Taobao',
+  'app.settings.binding.alipay': 'Vincular Alipay',
+  'app.settings.binding.alipay-description': 'Atualmente não vinculado à conta Alipay',
+  'app.settings.binding.dingding': 'Vincular DingTalk',
+  'app.settings.binding.dingding-description': 'Atualmente não vinculado à conta DingTalk',
+  'app.settings.binding.bind': 'Vincular',
+  'app.settings.notification.password': 'Senha da Conta',
+  'app.settings.notification.password-description':
+    'Mensagens de outros usuários serão notificadas na forma de uma estação de letra',
+  'app.settings.notification.messages': 'Mensagens de Sistema',
+  'app.settings.notification.messages-description':
+    'Mensagens de sistema serão notificadas na forma de uma estação de letra',
+  'app.settings.notification.todo': 'Notificação de To-do',
+  'app.settings.notification.todo-description':
+    'A lista de to-do será notificada na forma de uma estação de letra',
+  'app.settings.open': 'Aberto',
+  'app.settings.close': 'Fechado',
+};
diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts
new file mode 100644
index 0000000..322c136
--- /dev/null
+++ b/src/locales/zh-CN.ts
@@ -0,0 +1,41 @@
+import component from './zh-CN/component';
+import globalHeader from './zh-CN/globalHeader';
+import menu from './zh-CN/menu';
+import pages from './zh-CN/pages';
+import pwa from './zh-CN/pwa';
+import settingDrawer from './zh-CN/settingDrawer';
+import settings from './zh-CN/settings';
+import common from './zh-CN/common';
+import app from './zh-CN/app';
+import {interface_api, dynamic_menu, api, role, user, post, department, operation_record} from "@/locales/zh-CN/system";
+import * as analysisZh from "@/locales/zh-CN/analysis";
+import * as errorTypesZh from "@/locales/zh-CN/errorTypes";
+import * as deviceZh from "@/locales/zh-CN/device";
+import * as resourceZh from "@/locales/zh-CN/resource";
+import * as projectZh from "@/locales/zh-CN/project";
+export default {
+  'navBar.lang': '语言',
+  'layout.user.link.help': '帮助',
+  'layout.user.link.privacy': '隐私',
+  'layout.user.link.terms': '条款',
+  'app.copyright.produced': 'fabric',
+  'app.preview.down.block': '下载此页面到本地项目',
+  'app.welcome.link.fetch-blocks': '获取全部区块',
+  'app.welcome.link.block-list': '基于 block 开发,快速构建标准页面',
+  ...pages,
+  ...globalHeader,
+  ...menu,
+  ...settingDrawer,
+  ...settings,
+  ...pwa,
+  ...common,
+  ...component,
+  ...interface_api, ...dynamic_menu, ...api, ...role, ...user, ...post, ...department, ...operation_record,
+  ...app,
+
+  ...Object.assign({}, ...Object.values(analysisZh)),
+  ...Object.assign({}, ...Object.values(errorTypesZh)),
+  ...Object.assign({}, ...Object.values(deviceZh)),
+  ...Object.assign({}, ...Object.values(resourceZh)),
+  ...Object.assign({}, ...Object.values(projectZh)),
+};
diff --git a/src/locales/zh-CN/analysis.ts b/src/locales/zh-CN/analysis.ts
new file mode 100644
index 0000000..9126934
--- /dev/null
+++ b/src/locales/zh-CN/analysis.ts
@@ -0,0 +1,19 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-22 10:02:59
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-12-05 14:30:17
+ * @FilePath: \react-adpro-fabric\src\locales\zh-CN\analysis.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+export const action_detection: { [key: string]: string } = {
+  'analysis.action_detection.table.list.position': '地点',
+  'analysis.action_detection.table.list.imagesPath': '截图',
+  'analysis.action_detection.table.list.id': 'ID',
+  'analysis.action_detection.table.list.source': '视频来源',
+  'analysis.action_detection.table.list.configFile': '配置文件路径',
+  'analysis.action_detection.table.list.type': '类型',
+  'analysis.action_detection.table.list.remark': '备注',
+  'analysis.action_detection.table.list.createTime': '创建时间',
+  'analysis.action_detection.table.list.updateTime': '更新时间',
+};
diff --git a/src/locales/zh-CN/app.ts b/src/locales/zh-CN/app.ts
new file mode 100644
index 0000000..5be68e2
--- /dev/null
+++ b/src/locales/zh-CN/app.ts
@@ -0,0 +1,23 @@
+export default {
+  'app.docs.components.icon.search.placeholder': '在此搜索图标,点击图标可复制代码',
+  'app.docs.components.icon.outlined': '线框风格',
+  'app.docs.components.icon.filled': '实底风格',
+  'app.docs.components.icon.two-tone': '双色风格',
+  'app.docs.components.icon.category.direction': '方向性图标',
+  'app.docs.components.icon.category.suggestion': '提示建议性图标',
+  'app.docs.components.icon.category.editor': '编辑类图标',
+  'app.docs.components.icon.category.data': '数据类图标',
+  'app.docs.components.icon.category.other': '网站通用图标',
+  'app.docs.components.icon.category.logo': '品牌和标识',
+  'app.docs.components.icon.pic-searcher.intro': 'AI 截图搜索上线了,快来体验吧!🎉',
+  'app.docs.components.icon.pic-searcher.title': '上传图片搜索图标',
+  'app.docs.components.icon.pic-searcher.upload-text': '点击/拖拽/粘贴上传图片',
+  'app.docs.components.icon.pic-searcher.upload-hint':
+    '我们会通过上传的图片进行匹配,得到最相似的图标',
+  'app.docs.components.icon.pic-searcher.server-error': '识别服务暂不可用',
+  'app.docs.components.icon.pic-searcher.matching': '匹配中...',
+  'app.docs.components.icon.pic-searcher.modelloading': '神经网络模型加载中...',
+  'app.docs.components.icon.pic-searcher.result-tip': '为您匹配到以下图标:',
+  'app.docs.components.icon.pic-searcher.th-icon': '图标',
+  'app.docs.components.icon.pic-searcher.th-score': '匹配度',
+};
diff --git a/src/locales/zh-CN/common.ts b/src/locales/zh-CN/common.ts
new file mode 100644
index 0000000..ef8ae6c
--- /dev/null
+++ b/src/locales/zh-CN/common.ts
@@ -0,0 +1,275 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-01 13:56:33
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-12-05 14:53:28
+ * @FilePath: \general-ai-platform-web\src\locales\zh-CN\common.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+export default {
+  'common.modal.table.update.title': '更新表单',
+  'common.modal.table.create.title': '新增表单',
+  'common.modal.table.delete.title': '确定要删除吗?',
+  'common.modal.table.delete.content': '确定删除吗,删除后将无法找回,请谨慎操作',
+  'common.enable': '开启',
+  'common.disable': '禁用',
+  'common.yes': '是',
+  'common.no': '否',
+  'common.success': '成功',
+  'common.error': '错误',
+  'common.failure': '失败',
+  'common.permission.no_permission': '无权',
+  'common.permission.query': '查询',
+  'common.permission.update': '更改',
+  'common.permission.all': '所有权限',
+  'common.click_download': '点击下载',
+  'common.auto': '自动',
+  'common.edit': '编辑',
+  'common.has_required_no_input': '有必填项没有填',
+  'common.more_than': '需要大于',
+  'common.less_than': '需要小于',
+  'common.required': '必须项',
+  'common.please_input': '请输入',
+  'common.please_select': '请选择',
+  'common.open': '开启',
+  'common.close': '关闭',
+  'common.show': '展示',
+  'common.hide': '隐藏',
+  'common.open_video': '打开视频',
+  'common.create_son': '新增子节点',
+  'common.publish': '发布',
+  'common.confirm_publish': '确认发布',
+  'common.set_default': '设为默认版本',
+  'common.bind_device': '绑定设备',
+  'common.tip.title': '温馨提示',
+  'common.video_opening': '视频打开中',
+  'common.open_failure': '打开失败',
+  'common.start_process': '开始运行',
+  'common.finish_process': '关闭运行',
+  fabric: {
+    imagemap: {
+      imagemap: 'Image Map',
+      'imagemap-editing-confirm':
+        'The image map contents have been modified. Do you want to do that anyway?',
+      'imagemap-editor': 'Image Map Editor',
+      marker: {
+        'choose-icon': 'Choose icon from Fontawesome',
+        'search-icon': 'Search {{length}} icons for...',
+      },
+      link: {
+        'link-enabled': 'Link Enabled',
+      },
+      tooltip: {
+        'tooltip-enabled': 'Tooltip Enabled',
+      },
+      style: {
+        'fill-color': 'Fill Color',
+        'stroke-color': 'Stroke Color',
+        'stroke-width': 'Stroke Width',
+        rx: 'Radius x',
+        ry: 'Radius y',
+      },
+      shadow: {
+        'shadow-enabled': 'Shadow Enabled',
+        'offset-x': 'Offset X',
+        'offset-y': 'Offset Y',
+      },
+      animation: {
+        'animation-type': 'Animation Type',
+        none: 'None',
+        fade: 'Fade',
+        bounce: 'Bounce',
+        shake: 'Shake',
+        scaling: 'Scaling',
+        rotation: 'Rotation',
+        flash: 'Flash',
+        'auto-play': 'Auto Play',
+        playback: 'Playback',
+        'bounce-type': 'Bounce Type',
+        'shake-type': 'Shake Type',
+      },
+      trigger: {
+        'trigger-enabled': 'Trigger Enabled',
+      },
+      image: {
+        'image-load-type': 'Image Load Type',
+        'file-upload': 'File Upload',
+        'image-url': 'Image URL',
+      },
+      svg: {
+        'add-svg': 'Add SVG',
+      },
+      filter: {
+        grayscale: 'Grayscale',
+        invert: 'Invert',
+        sepia: 'Sepia',
+        brownie: 'Brownie',
+        vintage: 'Vintage',
+        blackwhite: 'Black/White',
+        technicolor: 'Technicolor',
+        polaroid: 'Polaroid',
+        gamma: 'Gamma',
+        'gamma-color': 'Gamma Color',
+        brightness: 'Brightness',
+        contrast: 'Contrast',
+        saturation: 'Saturation',
+        sharpen: 'Sharpen',
+        emboss: 'Emboss',
+        hue: 'Hue',
+        noise: 'Noise',
+        pixelate: 'Pixelate',
+        blur: 'Blur',
+      },
+      element: {
+        'mouse-hover-enabled': 'Hover enabled',
+      },
+    },
+    workflow: {
+      workflow: 'Workflow',
+      'workflow-list': 'Workflow List',
+      'workflow-editor': 'Workflow Editor',
+      'workflow-info': 'Workflow Info',
+      'workflow-editing-confirm':
+        'Workflow content has been modified. Do you want to do that anyway?',
+      'node-configuration': 'Node Configuration',
+      variables: 'Global Parameters',
+      'variables-add': 'Add Global Parameters',
+      'variables-modify': 'Modify Global Parameters',
+      'virtual-button-execute-failed': '{{name}} execute failed',
+      'virtual-button-execute-success': '{{name}} execute success',
+      'validate-fields-error': 'A node with the wrong setting exists.',
+      'node-name-required': 'Please input node name',
+      'node-description-required': 'Please input node description',
+    },
+    flow: {
+      flow: '流程图',
+      list: '流程列表',
+      editor: '流程编辑器',
+      info: '流程信息',
+    },
+    hexgrid: {
+      hexgrid: 'HexGrid',
+    },
+    action: {
+      selection: 'Selection mode(Q)',
+      grab: 'Grab mode(W or Alt + Drag)',
+      'zoom-in': 'Zoom in',
+      'zoom-out': 'Zoom out',
+      'one-to-one': '1:1',
+      fit: 'Scale to fit',
+      preview: 'Preview',
+      'canvas-list': 'Canvas list',
+      'bring-forward': 'Bring forward',
+      'send-backwards': 'Send backwards',
+      'bring-to-front': 'Bring to front',
+      'send-to-back': 'Send to back',
+      'align-left': 'Align left',
+      'align-center': 'Align center',
+      'align-right': 'Align right',
+      'object-group': 'Group',
+      'object-ungroup': 'Ungroup',
+      crop: 'Crop image',
+      'crop-save': 'Save crop image',
+      'crop-cancel': 'Cancel crop image',
+      'image-save': 'Save Image',
+      clone: 'Clone',
+      delete: 'Delete',
+      save: 'Save',
+      back: 'Back',
+      upload: 'Upload',
+      download: 'Download',
+      ok: 'Ok',
+      cancel: 'Cancel',
+      'search-list': 'Search list',
+      add: 'Add',
+      modify: 'Modify',
+      'all-delete': 'All delete',
+      clear: 'Clear',
+      start: 'Start',
+      pause: 'Pause',
+      stop: 'Stop',
+      execute: 'Execute',
+      'go-github': 'Go Github!!',
+      'go-docs': 'Go Documents!!',
+    },
+    common: {
+      name: 'Name',
+      description: 'Description',
+      width: 'Width',
+      height: 'Height',
+      icon: 'Icon',
+      locked: 'Lock',
+      visible: 'Visible',
+      left: 'Left',
+      top: 'Top',
+      key: 'Key',
+      type: 'Type',
+      value: 'Value',
+      title: 'Title',
+      file: 'File',
+      image: 'Image',
+      enabled: 'Enabled',
+      angle: 'Angle',
+      state: 'State',
+      url: 'URL',
+      current: 'Current',
+      new: 'New',
+      color: 'Color',
+      blur: 'Blur',
+      loop: 'Loop',
+      delay: 'Delay',
+      duration: 'Duration',
+      offset: 'Offset',
+      horizontal: 'Horizontal',
+      vertical: 'Vertical',
+      opacity: 'Opacity',
+      code: 'Code',
+      layout: 'Layout',
+      fixed: 'Fixed',
+      responsive: 'Responsive',
+      fullscreen: 'Fullscreen',
+      src: 'Src',
+      svg: 'SVG',
+    },
+    color: {
+      red: 'Red',
+      green: 'Green',
+      blue: 'Blue',
+    },
+    validation: {
+      'enter-property': '请输入',
+      'already-property': '已存在',
+    },
+    shortcut: {
+      q: 'Selection',
+      w: 'Grab',
+      plus: 'Zoom In',
+      minus: 'Zoom Out',
+      h: 'Shortcut Help',
+      escape: 'Deselect',
+      'arrow-up': 'Move Up',
+      'arrow-down': 'Move Down',
+      'arrow-left': 'Move Left',
+      'arrow-right': 'Move Right',
+      delete: 'Delete',
+      'ctrl-a': 'Select All',
+      'ctrl-c': 'Copy',
+      'ctrl-v': 'Paste',
+      'ctrl-x': 'Cut',
+      'ctrl-z': 'Undo',
+      'ctrl-y': 'Redo',
+      'alt-mouse-left': 'Grab',
+      'shfit-mouse-left': 'Multi Selection',
+      'mouse-left': 'Select',
+      'mouse-right': 'Context Memu',
+      o: 'Zoom 1:1',
+      p: 'Zoom Fit',
+    },
+    placeholder: {
+      'search-node': 'Search a node',
+    },
+    fiber: {
+      fiber: 'FiberCable',
+    },
+  },
+};
diff --git a/src/locales/zh-CN/component.ts b/src/locales/zh-CN/component.ts
new file mode 100644
index 0000000..1f1fead
--- /dev/null
+++ b/src/locales/zh-CN/component.ts
@@ -0,0 +1,5 @@
+export default {
+  'component.tagSelect.expand': '展开',
+  'component.tagSelect.collapse': '收起',
+  'component.tagSelect.all': '全部',
+};
diff --git a/src/locales/zh-CN/device.ts b/src/locales/zh-CN/device.ts
new file mode 100644
index 0000000..7fff0ab
--- /dev/null
+++ b/src/locales/zh-CN/device.ts
@@ -0,0 +1,71 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-01 13:56:33
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-21 14:23:38
+ * @FilePath: \general-ai-platform-web\src\locales\zh-CN\device.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+export const device: { [key: string]: string } = {
+  'device.device.table.list.id': 'ID',
+  'device.device.table.list.name': '设备名称',
+  'device.device.table.list.code': '设备代码',
+  'device.device.table.list.position': '位置',
+  'device.device.table.list.param': '设备参数',
+  'device.device.table.list.spec': '设备规格',
+  'device.device.table.list.categoryFkId': '设备类别',
+  'device.device.table.list.groupFkId': '设备分组',
+  'device.device.table.list.isEnable': '是否启用',
+  'device.device.table.list.remark': '备注',
+  'device.device.table.list.createTime': '创建时间',
+  'device.device.table.list.updateTime': '更新时间',
+  'device.device.table.rule.required.name': '设备名称为必填项',
+  'device.device.table.rule.required.code': '设备代码为必填项',
+  'device.device.table.list.add': '新建设备',
+  'device.device.table.list.update': '更新设备',
+};
+export const device_category: { [key: string]: string } = {
+  'device.device_category.table.list.id': 'ID',
+  'device.device_category.table.list.name': '类别名称',
+  'device.device_category.table.list.code': '类别代码',
+  'device.device_category.table.list.remark': '备注',
+  'device.device_category.table.list.createTime': '创建时间',
+  'device.device_category.table.list.updateTime': '更新时间',
+  'device.device_category.table.rule.required.name': '类别名称为必填项',
+  'device.device_category.table.rule.required.code': '类别代码为必填项',
+  'device.device_category.table.list.add': '新建设备类别',
+  'device.device_category.table.list.update': '更新设备类别',
+};
+export const device_group: { [key: string]: string } = {
+  'device.device_group.table.list.id': 'ID',
+  'device.device_group.table.list.name': '分组名称',
+  'device.device_group.table.list.code': '分组代码',
+  'device.device_group.table.list.address': '地址',
+  'device.device_group.table.list.telephone': '电话',
+  'device.device_group.table.list.lon': '经度',
+  'device.device_group.table.list.lat': '纬度',
+  'device.device_group.table.list.managerName': '负责人姓名',
+  'device.device_group.table.list.managerPhone': '负责人联系方式',
+  'device.device_group.table.list.isEnable': '是否启用',
+  'device.device_group.table.list.parentFkId': '父节点',
+  'device.device_group.table.list.remark': '备注',
+  'device.device_group.table.list.createTime': '创建时间',
+  'device.device_group.table.list.updateTime': '更新时间',
+  'device.device_group.table.rule.required.name': '分组名称为必填项',
+  'device.device_group.table.rule.required.code': '分组代码为必填项',
+  'device.device_group.table.rule.required.managerName': '负责人姓名为必填项',
+  'device.device_group.table.rule.required.managerPhone': '负责人联系方式为必填项',
+  'device.device_group.table.rule.required.parentFkId': '父节点为必填项',
+  'device.device_group.table.list.add': '新建设备分组',
+  'device.device_group.table.list.update': '更新设备分组',
+  'device.device_group.table.list.treeAdd': '添加根节点',
+};
+export const device_relation: { [key: string]: string } = {
+  'device.device_relation.table.list.id': 'ID',
+  'device.device_relation.table.list.deviceParentFkId': '设备父节点',
+  'device.device_relation.table.list.deviceSonFkId': '设备父节点',
+  'device.device_relation.table.list.createTime': '创建时间',
+  'device.device_relation.table.list.updateTime': '更新时间',
+  'device.device_relation.table.rule.required.deviceParentFkId': '设备父节点为必填项',
+  'device.device_relation.table.rule.required.deviceSonFkId': '设备父节点为必填项',
+};
diff --git a/src/locales/zh-CN/errorTypes.ts b/src/locales/zh-CN/errorTypes.ts
new file mode 100644
index 0000000..3357bf1
--- /dev/null
+++ b/src/locales/zh-CN/errorTypes.ts
@@ -0,0 +1 @@
+export const errorTypes: {[key: string]: string} = {'error_type.playing_phone': '玩手机', 'error_type.person': '离岗', 'error_type.sleep': '睡觉'}
diff --git a/src/locales/zh-CN/globalHeader.ts b/src/locales/zh-CN/globalHeader.ts
new file mode 100644
index 0000000..9fd66a5
--- /dev/null
+++ b/src/locales/zh-CN/globalHeader.ts
@@ -0,0 +1,17 @@
+export default {
+  'component.globalHeader.search': '站内搜索',
+  'component.globalHeader.search.example1': '搜索提示一',
+  'component.globalHeader.search.example2': '搜索提示二',
+  'component.globalHeader.search.example3': '搜索提示三',
+  'component.globalHeader.help': '使用文档',
+  'component.globalHeader.notification': '通知',
+  'component.globalHeader.notification.empty': '你已查看所有通知',
+  'component.globalHeader.message': '消息',
+  'component.globalHeader.message.empty': '您已读完所有消息',
+  'component.globalHeader.event': '待办',
+  'component.globalHeader.event.empty': '你已完成所有待办',
+  'component.noticeIcon.clear': '清空',
+  'component.noticeIcon.cleared': '清空了',
+  'component.noticeIcon.empty': '暂无数据',
+  'component.noticeIcon.view-more': '查看更多',
+};
diff --git a/src/locales/zh-CN/menu.ts b/src/locales/zh-CN/menu.ts
new file mode 100644
index 0000000..98aef86
--- /dev/null
+++ b/src/locales/zh-CN/menu.ts
@@ -0,0 +1,75 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-01 13:56:33
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-10 14:44:54
+ * @FilePath: \general-ai-platform-web\src\locales\zh-CN\menu.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+export default {
+  'menu.fabricImageMapEditor': '图形预览',
+  'menu.welcome': '欢迎',
+  'menu.more-blocks': '更多区块',
+  'menu.home': '首页',
+  'menu.admin': '管理页',
+  'menu.admin.sub-page': '二级管理页',
+  'menu.login': '登录',
+  'menu.register': '注册',
+  'menu.register-result': '注册结果',
+  'menu.dashboard': 'Dashboard',
+  'menu.dashboard.analysis': '分析页',
+  'menu.dashboard.monitor': '监控页',
+  'menu.dashboard.workplace': '工作台',
+  'menu.exception.403': '403',
+  'menu.exception.404': '404',
+  'menu.exception.500': '500',
+  'menu.form': '表单页',
+  'menu.form.basic-form': '基础表单',
+  'menu.form.step-form': '分步表单',
+  'menu.form.step-form.info': '分步表单(填写转账信息)',
+  'menu.form.step-form.confirm': '分步表单(确认转账信息)',
+  'menu.form.step-form.result': '分步表单(完成)',
+  'menu.form.advanced-form': '高级表单',
+  'menu.list': '列表页',
+  'menu.list.table-list': '查询表格',
+  'menu.list.basic-list': '标准列表',
+  'menu.list.card-list': '卡片列表',
+  'menu.list.search-list': '搜索列表',
+  'menu.list.search-list.articles': '搜索列表(文章)',
+  'menu.list.search-list.projects': '搜索列表(项目)',
+  'menu.list.search-list.applications': '搜索列表(应用)',
+  'menu.profile': '详情页',
+  'menu.profile.basic': '基础详情页',
+  'menu.profile.advanced': '高级详情页',
+  'menu.result': '结果页',
+  'menu.result.success': '成功页',
+  'menu.result.fail': '失败页',
+  'menu.exception': '异常页',
+  'menu.exception.not-permission': '403',
+  'menu.exception.not-find': '404',
+  'menu.exception.server-error': '500',
+  'menu.exception.trigger': '触发错误',
+  'menu.account': '个人页',
+  'menu.account.center': '个人中心',
+  'menu.account.settings': '个人设置',
+  'menu.account.trigger': '触发报错',
+  'menu.account.logout': '退出登录',
+  'menu.editor': '图形编辑器',
+  'menu.editor.flow': '流程编辑器',
+  'menu.editor.mind': '脑图编辑器',
+  'menu.editor.koni': '拓扑编辑器',
+  'menu.list.system': '系统设置',
+  'menu.list.system.menu-list': '菜单列表',
+  'menu.list.system.interface-list': '接口列表',
+  'menu.list.system.api-list': '接口列表',
+  'menu.list.system.role-list': '角色列表',
+  'menu.list.system.user-list': '用户列表',
+  'menu.list.system.post-list': '岗位列表',
+  'menu.list.system.operation_record-list': '操作记录',
+  'menu.list.system.dictionary-list': '字典列表',
+  'menu.list.system.department-list': '部门列表',
+  'menu.list.staff': '人力资源',
+  'menu.list.staff.employee-list': '员工列表',
+  'menu.device.device-relation-list': '设备版本列表',
+  'menu.resource.algorithm-model-detail': '模型详情'
+};
diff --git a/src/locales/zh-CN/pages.ts b/src/locales/zh-CN/pages.ts
new file mode 100644
index 0000000..f38c701
--- /dev/null
+++ b/src/locales/zh-CN/pages.ts
@@ -0,0 +1,72 @@
+export default {
+  'pages.layouts.userLayout.title': 'Ant Design 是西湖区最具影响力的 Web 设计规范',
+  'pages.login.accountLogin.tab': '账户密码登录',
+  'pages.login.accountLogin.errorMessage': '错误的用户名和密码(admin/ant.design)',
+  'pages.login.failure': '登录失败,请重试!',
+  'pages.login.success': '登录成功!',
+  'pages.login.username.placeholder': '用户名: admin or user',
+  'pages.login.username.required': '用户名是必填项!',
+  'pages.login.password.placeholder': '密码: ant.design',
+  'pages.login.password.required': '密码是必填项!',
+  'pages.login.phoneLogin.tab': '手机号登录',
+  'pages.login.phoneLogin.errorMessage': '验证码错误',
+  'pages.login.phoneNumber.placeholder': '请输入手机号!',
+  'pages.login.phoneNumber.required': '手机号是必填项!',
+  'pages.login.phoneNumber.invalid': '不合法的手机号!',
+  'pages.login.captcha.placeholder': '请输入验证码!',
+  'pages.login.captcha.required': '验证码是必填项!',
+  'pages.login.phoneLogin.getVerificationCode': '获取验证码',
+  'pages.getCaptchaSecondText': '秒后重新获取',
+  'pages.login.rememberMe': '自动登录',
+  'pages.login.forgotPassword': '忘记密码 ?',
+  'pages.login.submit': '登录',
+  'pages.login.loginWith': '其他登录方式 :',
+  'pages.login.registerAccount': '注册账户',
+  'pages.welcome.link': '欢迎使用',
+  'pages.welcome.alertMessage': '更快更强的重型组件,已经发布。',
+  'pages.admin.subPage.title': ' 这个页面只有 admin 权限才能查看',
+  'pages.admin.subPage.alertMessage': 'umi ui 现已发布,欢迎使用 npm run ui 启动体验。',
+  'pages.searchTable.createForm.newRule': '新建规则',
+  'pages.searchTable.detail': '详情',
+  'pages.searchTable.update': '更新',
+  'pages.searchTable.destroy': '删除',
+  'pages.searchTable.create_son_menu': '添加子菜单',
+  'pages.searchTable.create_root_menu': '添加根菜单',
+  'pages.searchTable.create_son_department': '添加子部门',
+  'pages.searchTable.create_root_department': '添加根部门',
+  'pages.searchTable.updateForm.ruleConfig': '规则配置',
+  'pages.searchTable.updateForm.basicConfig': '基本信息',
+  'pages.searchTable.updateForm.ruleName.nameLabel': '规则名称',
+  'pages.searchTable.updateForm.ruleName.nameRules': '请输入规则名称!',
+  'pages.searchTable.updateForm.ruleDesc.descLabel': '规则描述',
+  'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '请输入至少五个字符',
+  'pages.searchTable.updateForm.ruleDesc.descRules': '请输入至少五个字符的规则描述!',
+  'pages.searchTable.updateForm.ruleProps.title': '配置规则属性',
+  'pages.searchTable.updateForm.object': '监控对象',
+  'pages.searchTable.updateForm.ruleProps.templateLabel': '规则模板',
+  'pages.searchTable.updateForm.ruleProps.typeLabel': '规则类型',
+  'pages.searchTable.updateForm.schedulingPeriod.title': '设定调度周期',
+  'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '开始时间',
+  'pages.searchTable.updateForm.schedulingPeriod.timeRules': '请选择开始时间!',
+  'pages.searchTable.titleDesc': '描述',
+  'pages.searchTable.ruleName': '规则名称为必填项',
+  'pages.searchTable.titleCallNo': '服务调用次数',
+  'pages.searchTable.titleStatus': '状态',
+  'pages.searchTable.nameStatus.default': '关闭',
+  'pages.searchTable.nameStatus.running': '运行中',
+  'pages.searchTable.nameStatus.online': '已上线',
+  'pages.searchTable.nameStatus.abnormal': '异常',
+  'pages.searchTable.titleUpdatedAt': '上次调度时间',
+  'pages.searchTable.exception': '请输入异常原因!',
+  'pages.searchTable.titleOption': '操作',
+  'pages.searchTable.config': '配置',
+  'pages.searchTable.subscribeAlert': '订阅警报',
+  'pages.searchTable.title': '查询表格',
+  'pages.searchTable.new': '新建',
+  'pages.searchTable.chosen': '已选择',
+  'pages.searchTable.item': '项',
+  'pages.searchTable.totalServiceCalls': '服务调用次数总计',
+  'pages.searchTable.tenThousand': '万',
+  'pages.searchTable.batchDeletion': '批量删除',
+  'pages.searchTable.batchApproval': '批量审批',
+};
diff --git a/src/locales/zh-CN/project.ts b/src/locales/zh-CN/project.ts
new file mode 100644
index 0000000..9fb563d
--- /dev/null
+++ b/src/locales/zh-CN/project.ts
@@ -0,0 +1,24 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-01 13:56:33
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-17 14:36:31
+ * @FilePath: \general-ai-platform-web\src\locales\zh-CN\project.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+export const project: { [key: string]: string } = {
+  'project.project.table.list.id': 'ID',
+  'project.project.table.list.name': '项目名称',
+  'project.project.table.list.code': '项目代码',
+  'project.project.table.list.info': '项目简介',
+  'project.project.table.list.inferConfig': '推理配置',
+  'project.project.table.list.isEnable': '是否启用',
+  'project.project.table.list.remark': '备注',
+  'project.project.table.list.createTime': '创建时间',
+  'project.project.table.list.updateTime': '更新时间',
+  'project.project.table.rule.required.name': '项目名称为必填项',
+  'project.project.table.rule.required.code': '项目代码为必填项',
+  'project.project.table.rule.required.info': '项目简介为必填项',
+  'project.project.table.list.add': '新建项目',
+  'project.project.table.list.update': '更新项目',
+};
diff --git a/src/locales/zh-CN/pwa.ts b/src/locales/zh-CN/pwa.ts
new file mode 100644
index 0000000..e950484
--- /dev/null
+++ b/src/locales/zh-CN/pwa.ts
@@ -0,0 +1,6 @@
+export default {
+  'app.pwa.offline': '当前处于离线状态',
+  'app.pwa.serviceworker.updated': '有新内容',
+  'app.pwa.serviceworker.updated.hint': '请点击“刷新”按钮或者手动刷新页面',
+  'app.pwa.serviceworker.updated.ok': '刷新',
+};
diff --git a/src/locales/zh-CN/resource.ts b/src/locales/zh-CN/resource.ts
new file mode 100644
index 0000000..b043f40
--- /dev/null
+++ b/src/locales/zh-CN/resource.ts
@@ -0,0 +1,81 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-01 13:56:33
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-14 14:59:00
+ * @FilePath: \general-ai-platform-web\src\locales\zh-CN\resource.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+export const algorithm_model: { [key: string]: string } = {
+  'resource.algorithm_model.table.list.defaultVersionFkId': '默认版本',
+  'resource.algorithm_model.table.list.id': 'ID',
+  'resource.algorithm_model.table.list.name': '模型名称',
+  'resource.algorithm_model.table.list.categoryFkId': '模型类别',
+  'resource.algorithm_model.table.list.remark': '备注',
+  'resource.algorithm_model.table.list.createTime': '创建时间',
+  'resource.algorithm_model.table.list.updateTime': '更新时间',
+  'resource.algorithm_model.table.rule.required.name': '模型名称为必填项',
+  'resource.algorithm_model.table.rule.required.categoryFkId': '模型类别为必填项',
+  'resource.algorithm_model.table.list.add': '新建模型',
+  'resource.algorithm_model.table.list.update': '更新模型',
+};
+export const business_image: { [key: string]: string } = {
+  'resource.business_image.table.list.id': 'ID',
+  'resource.business_image.table.list.name': '镜像名称',
+  'resource.business_image.table.list.version': '镜像版本',
+  'resource.business_image.table.list.projectFkId': '项目',
+  'resource.business_image.table.list.path': '镜像地址',
+  'resource.business_image.table.list.startCode': '启动代码',
+  'resource.business_image.table.list.config': '配置',
+  'resource.business_image.table.list.configHash': '配置hash',
+  'resource.business_image.table.list.remark': '备注',
+  'resource.business_image.table.list.createTime': '创建时间',
+  'resource.business_image.table.list.updateTime': '更新时间',
+  'resource.business_image.table.rule.required.name': '镜像名称为必填项',
+  'resource.business_image.table.rule.required.version': '镜像版本为必填项',
+  'resource.business_image.table.rule.required.projectFkId': '项目为必填项',
+  'resource.business_image.table.list.add': '新建业务镜像',
+  'resource.business_image.table.list.update': '更新业务镜像',
+};
+export const model_category: { [key: string]: string } = {
+  'resource.model_category.table.list.id': 'ID',
+  'resource.model_category.table.list.name': '类别名称',
+  'resource.model_category.table.list.code': '类别代码',
+  'resource.model_category.table.list.remark': '备注',
+  'resource.model_category.table.list.createTime': '创建时间',
+  'resource.model_category.table.list.updateTime': '更新时间',
+  'resource.model_category.table.rule.required.name': '类别名称为必填项',
+  'resource.model_category.table.rule.required.code': '类别代码为必填项',
+  'resource.model_category.table.list.add': '新建模型类别',
+  'resource.model_category.table.list.update': '更新模型类别',
+};
+export const model_image: { [key: string]: string } = {
+  'resource.model_image.table.list.id': 'ID',
+  'resource.model_image.table.list.name': '镜像名称',
+  'resource.model_image.table.list.modelVersionFkId': '模型版本',
+  'resource.model_image.table.list.path': '镜像地址',
+  'resource.model_image.table.list.startCode': '启动代码',
+  'resource.model_image.table.list.remark': '备注',
+  'resource.model_image.table.list.createTime': '创建时间',
+  'resource.model_image.table.list.updateTime': '更新时间',
+  'resource.model_image.table.rule.required.name': '镜像名称为必填项',
+  'resource.model_image.table.rule.required.modelVersionFkId': '模型版本为必填项',
+  'resource.model_image.table.list.add': '新建模型镜像',
+  'resource.model_image.table.list.update': '更新模型镜像',
+};
+export const model_version: { [key: string]: string } = {
+  'resource.model_version.table.list.status': '状态',
+  'resource.model_version.table.list.id': 'ID',
+  'resource.model_version.table.list.modelFkId': '模型',
+  'resource.model_version.table.list.version': '模型版本',
+  'resource.model_version.table.list.path': '模型地址',
+  'resource.model_version.table.list.startCode': '启动代码',
+  'resource.model_version.table.list.isEnable': '是否启用',
+  'resource.model_version.table.list.remark': '备注',
+  'resource.model_version.table.list.createTime': '创建时间',
+  'resource.model_version.table.list.updateTime': '更新时间',
+  'resource.model_version.table.rule.required.modelFkId': '模型为必填项',
+  'resource.model_version.table.rule.required.path': '模型地址为必填项',
+  'resource.model_version.table.list.add': '新建模型版本',
+  'resource.model_version.table.list.update': '更新模型版本',
+};
diff --git a/src/locales/zh-CN/settingDrawer.ts b/src/locales/zh-CN/settingDrawer.ts
new file mode 100644
index 0000000..3f44958
--- /dev/null
+++ b/src/locales/zh-CN/settingDrawer.ts
@@ -0,0 +1,31 @@
+export default {
+  'app.setting.pagestyle': '整体风格设置',
+  'app.setting.pagestyle.dark': '暗色菜单风格',
+  'app.setting.pagestyle.light': '亮色菜单风格',
+  'app.setting.content-width': '内容区域宽度',
+  'app.setting.content-width.fixed': '定宽',
+  'app.setting.content-width.fluid': '流式',
+  'app.setting.themecolor': '主题色',
+  'app.setting.themecolor.dust': '薄暮',
+  'app.setting.themecolor.volcano': '火山',
+  'app.setting.themecolor.sunset': '日暮',
+  'app.setting.themecolor.cyan': '明青',
+  'app.setting.themecolor.green': '极光绿',
+  'app.setting.themecolor.daybreak': '拂晓蓝(默认)',
+  'app.setting.themecolor.geekblue': '极客蓝',
+  'app.setting.themecolor.purple': '酱紫',
+  'app.setting.navigationmode': '导航模式',
+  'app.setting.sidemenu': '侧边菜单布局',
+  'app.setting.topmenu': '顶部菜单布局',
+  'app.setting.fixedheader': '固定 Header',
+  'app.setting.fixedsidebar': '固定侧边菜单',
+  'app.setting.fixedsidebar.hint': '侧边菜单布局时可配置',
+  'app.setting.hideheader': '下滑时隐藏 Header',
+  'app.setting.hideheader.hint': '固定 Header 时可配置',
+  'app.setting.othersettings': '其他设置',
+  'app.setting.weakmode': '色弱模式',
+  'app.setting.copy': '拷贝设置',
+  'app.setting.copyinfo': '拷贝成功,请到 config/defaultSettings.js 中替换默认配置',
+  'app.setting.production.hint':
+    '配置栏只在开发环境用于预览,生产环境不会展现,请拷贝后手动修改配置文件',
+};
diff --git a/src/locales/zh-CN/settings.ts b/src/locales/zh-CN/settings.ts
new file mode 100644
index 0000000..df8af43
--- /dev/null
+++ b/src/locales/zh-CN/settings.ts
@@ -0,0 +1,55 @@
+export default {
+  'app.settings.menuMap.basic': '基本设置',
+  'app.settings.menuMap.security': '安全设置',
+  'app.settings.menuMap.binding': '账号绑定',
+  'app.settings.menuMap.notification': '新消息通知',
+  'app.settings.basic.avatar': '头像',
+  'app.settings.basic.change-avatar': '更换头像',
+  'app.settings.basic.email': '邮箱',
+  'app.settings.basic.email-message': '请输入您的邮箱!',
+  'app.settings.basic.nickname': '昵称',
+  'app.settings.basic.nickname-message': '请输入您的昵称!',
+  'app.settings.basic.profile': '个人简介',
+  'app.settings.basic.profile-message': '请输入个人简介!',
+  'app.settings.basic.profile-placeholder': '个人简介',
+  'app.settings.basic.country': '国家/地区',
+  'app.settings.basic.country-message': '请输入您的国家或地区!',
+  'app.settings.basic.geographic': '所在省市',
+  'app.settings.basic.geographic-message': '请输入您的所在省市!',
+  'app.settings.basic.address': '街道地址',
+  'app.settings.basic.address-message': '请输入您的街道地址!',
+  'app.settings.basic.phone': '联系电话',
+  'app.settings.basic.phone-message': '请输入您的联系电话!',
+  'app.settings.basic.update': '更新基本信息',
+  'app.settings.security.strong': '强',
+  'app.settings.security.medium': '中',
+  'app.settings.security.weak': '弱',
+  'app.settings.security.password': '账户密码',
+  'app.settings.security.password-description': '当前密码强度',
+  'app.settings.security.phone': '密保手机',
+  'app.settings.security.phone-description': '已绑定手机',
+  'app.settings.security.question': '密保问题',
+  'app.settings.security.question-description': '未设置密保问题,密保问题可有效保护账户安全',
+  'app.settings.security.email': '备用邮箱',
+  'app.settings.security.email-description': '已绑定邮箱',
+  'app.settings.security.mfa': 'MFA 设备',
+  'app.settings.security.mfa-description': '未绑定 MFA 设备,绑定后,可以进行二次确认',
+  'app.settings.security.modify': '修改',
+  'app.settings.security.set': '设置',
+  'app.settings.security.bind': '绑定',
+  'app.settings.binding.taobao': '绑定淘宝',
+  'app.settings.binding.taobao-description': '当前未绑定淘宝账号',
+  'app.settings.binding.alipay': '绑定支付宝',
+  'app.settings.binding.alipay-description': '当前未绑定支付宝账号',
+  'app.settings.binding.dingding': '绑定钉钉',
+  'app.settings.binding.dingding-description': '当前未绑定钉钉账号',
+  'app.settings.binding.bind': '绑定',
+  'app.settings.notification.password': '账户密码',
+  'app.settings.notification.password-description': '其他用户的消息将以站内信的形式通知',
+  'app.settings.notification.messages': '系统消息',
+  'app.settings.notification.messages-description': '系统消息将以站内信的形式通知',
+  'app.settings.notification.todo': '待办任务',
+  'app.settings.notification.todo-description': '待办任务将以站内信的形式通知',
+  'app.settings.open': '开',
+  'app.settings.close': '关',
+};
diff --git a/src/locales/zh-CN/system.ts b/src/locales/zh-CN/system.ts
new file mode 100644
index 0000000..bde69eb
--- /dev/null
+++ b/src/locales/zh-CN/system.ts
@@ -0,0 +1,154 @@
+export const interface_api: { [key: string]: string } = {
+  'system.interface.table.list.id': 'ID',
+  'system.interface.table.list.name': '权限名称',
+  'system.interface.table.list.value': '权限值',
+  'system.interface.table.list.method': '请求方式',
+  'system.interface.table.list.url': '接口地址',
+  'system.interface.table.list.add': '新建接口',
+  'system.interface.table.list.update': '更新接口',
+  'system.interface.table.rule.required.name': '权限名称为必填项',
+  'system.interface.table.rule.required.value': '权限值为必填项',
+  'system.interface.table.rule.required.method': '请求方式为必填项',
+  'system.interface.table.rule.required.url': '接口地址为必填项',
+  'system.interface.enum.GET': 'GET',
+  'system.interface.enum.POST': 'POST',
+  'system.interface.enum.DELETE': 'DELETE',
+  'system.interface.enum.PUT': 'PUT',
+  'system.interface.enum.PATCH': 'PATCH'
+}
+export const dynamic_menu: { [key: string]: string } = {
+  'system.menu.table.list.id': 'ID',
+  'system.menu.table.list.parentId': '父节点',
+  'system.menu.table.list.type': '菜单类型',
+  'system.menu.table.list.type_M': '目录',
+  'system.menu.table.list.type_C': '菜单',
+  'system.menu.table.list.type_F': '按钮',
+  'system.menu.table.list.type_E': '外链',
+  'system.menu.table.list.title': '展示名称',
+  'system.menu.table.list.sort': '顺序',
+  'system.menu.table.list.name': '路由名称',
+  'system.menu.table.list.path': '路由路径',
+  'system.menu.table.list.component': '组件路径',
+  'system.menu.table.list.icon': '图标',
+  'system.menu.table.list.permission': '权限标识',
+  'system.menu.table.list.hidden': '是否隐藏',
+  'system.menu.table.list.remark': '备注',
+  'system.menu.table.list.externalLink': '外链地址',
+  'system.menu.table.list.add': '添加根菜单',
+  'system.menu.table.list.create_son_menu': '添加子菜单',
+  'system.menu.table.list.update': '更新菜单',
+
+  'system.menu.table.rule.required.name': '菜单名称为必填项',
+  'system.menu.table.rule.required.value': '菜单值为必填项',
+  'system.menu.table.rule.required.icon': '图标为必填项',
+  'system.menu.table.rule.required.sequence': '顺序为必填项',
+  'system.menu.table.rule.required.is_dir': '是否为目录为必填项',
+  'system.menu.table.rule.required.is_external_link': '是否是外链接为必填项',
+  'system.menu.table.rule.required.parent_fk_id': '父节点为必填项'
+}
+export const api: { [key: string]: string } = {
+  'system.api.table.list.id': 'ID',
+  'system.api.table.list.path': '接口路径',
+  'system.api.table.list.method': '请求方式',
+  'system.api.table.list.apiGroup': '接口分组',
+  'system.api.table.list.description': '接口描述',
+  'system.api.table.rule.required.path': '接口路径为必填项',
+  'system.api.enum.GET': 'GET',
+  'system.api.enum.POST': 'POST',
+  'system.api.enum.DELETE': 'DELETE',
+  'system.api.enum.PUT': 'PUT',
+  'system.api.enum.PATCH': 'PATCH'
+}
+
+export const role: { [key: string]: string } = {
+  'system.role.table.list.id': 'ID',
+  'system.role.table.list.name': '角色名称',
+  'system.role.table.list.code': '角色代码',
+  'system.role.table.list.sort': '排序',
+  'system.role.table.list.status': '状态',
+  'system.role.table.list.remark': '备注',
+  'system.role.table.action.set_permission': '设置权限',
+  'system.role.table.list.api_permission': 'api权限',
+  'system.role.table.list.menu_permission': '菜单权限',
+  'system.role.table.list.resource_permission': '资源权限',
+  'system.role.table.list.create': '新建角色',
+  'system.role.table.list.set_permission': '设置权限',
+  'system.role.table.list.update': '更新角色',
+  'system.role.table.rule.required.name': '角色名称为必填项',
+  'system.role.table.rule.required.code': '角色代码为必填项',
+}
+
+export const user: { [key: string]: string } = {
+  'system.user.table.list.id': 'ID',
+  'system.user.table.list.userName': '用户名',
+  'system.user.table.list.nickName': '昵称',
+  'system.user.table.list.password': '密码',
+  'system.user.table.list.password_re': '再一次确认密码',
+  'system.user.table.list.roleId': '角色',
+  'system.user.table.list.roleIds': '角色',
+  'system.user.table.list.phone': '手机',
+  'system.user.table.list.email': '邮件',
+  'system.user.table.list.avatarId': '头像',
+  'system.user.table.list.postId': '岗位',
+  'system.user.table.list.postIds': '岗位',
+  'system.user.table.list.deptId': '部门',
+  'system.user.table.list.enable': '是否启用',
+  'system.user.table.list.remark': '备注',
+  'system.user.table.list.create': '新建用户',
+  'system.user.table.list.update': '更新用户',
+  'system.user.table.rule.required.userName': '用户名为必填项',
+  'system.user.table.rule.required.nickName': '昵称为必填项',
+  'system.user.table.rule.required.password': '密码为必填项',
+  'system.user.table.rule.password.not_same': '两次密码不一致'
+}
+
+export const post: { [key: string]: string } = {
+  'system.post.table.list.id': 'ID',
+  'system.post.table.list.name': '岗位名称',
+  'system.post.table.list.code': '岗位代码',
+  'system.post.table.list.sort': '排序',
+  'system.post.table.list.status': '状态',
+  'system.post.table.list.remark': '备注',
+  'system.post.table.list.create': '新建岗位',
+  'system.post.table.list.update': '更新岗位',
+  'system.post.table.rule.required.name': '岗位名称为必填项',
+  'system.post.table.rule.required.code': '岗位代码为必填项',
+}
+
+export const department: { [key: string]: string } = {
+  'system.department.table.list.id': 'ID',
+  'system.department.table.list.parentId': '父节点',
+  'system.department.table.list.name': '部门名称',
+  'system.department.table.list.code': '部门代码',
+  'system.department.table.list.phone': '部门电话',
+  'system.department.table.list.email': '部门邮箱',
+  'system.department.table.list.sort': '排序',
+  'system.department.table.list.status': '状态',
+  'system.department.table.list.remark': '备注',
+  'system.department.table.list.create': '添加根部门',
+  'system.department.table.list.create_son_department': '添加子部门',
+  'system.department.table.list.update': '更新部门',
+  'system.department.table.rule.required.name': '部门名称为必填项',
+  'system.department.table.rule.required.code': '部门代码为必填项',
+}
+export const operation_record: { [key: string]: string } = {
+  'system.operation.table.list.id': 'ID',
+  'system.operation.table.list.status': '请求状态',
+  'system.operation.table.list.ip': '请求IP',
+  'system.operation.table.list.path': '接口路径',
+  'system.operation.table.list.method': '请求方法',
+  'system.operation.table.list.latency': '延迟',
+  'system.operation.table.list.agent': '代理',
+  'system.operation.table.list.error_message': '错误信息',
+  'system.operation.table.list.body': '请求Body',
+  'system.operation.table.list.resp': '响应Body',
+  'system.operation.table.list.user_id': '用户ID',
+  'system.operation.table.list.sort': '排序',
+  'system.operation.table.list.remark': '备注',
+  'system.operation.table.list.create': '新建操作日志',
+  'system.operation.table.list.createTime': '创建时间',
+  'system.operation.table.list.updateTime': '更新时间',
+
+  'system.operation.table.rule.list.ip': '请填写IP',
+  'system.operation.table.rule.list.path': '请填写接口路径',
+}
diff --git a/src/locales/zh-TW.ts b/src/locales/zh-TW.ts
new file mode 100644
index 0000000..6ad5f93
--- /dev/null
+++ b/src/locales/zh-TW.ts
@@ -0,0 +1,20 @@
+import component from './zh-TW/component';
+import globalHeader from './zh-TW/globalHeader';
+import menu from './zh-TW/menu';
+import pwa from './zh-TW/pwa';
+import settingDrawer from './zh-TW/settingDrawer';
+import settings from './zh-TW/settings';
+
+export default {
+  'navBar.lang': '語言',
+  'layout.user.link.help': '幫助',
+  'layout.user.link.privacy': '隱私',
+  'layout.user.link.terms': '條款',
+  'app.preview.down.block': '下載此頁面到本地項目',
+  ...globalHeader,
+  ...menu,
+  ...settingDrawer,
+  ...settings,
+  ...pwa,
+  ...component,
+};
diff --git a/src/locales/zh-TW/component.ts b/src/locales/zh-TW/component.ts
new file mode 100644
index 0000000..ba48e29
--- /dev/null
+++ b/src/locales/zh-TW/component.ts
@@ -0,0 +1,5 @@
+export default {
+  'component.tagSelect.expand': '展開',
+  'component.tagSelect.collapse': '收起',
+  'component.tagSelect.all': '全部',
+};
diff --git a/src/locales/zh-TW/globalHeader.ts b/src/locales/zh-TW/globalHeader.ts
new file mode 100644
index 0000000..ed58451
--- /dev/null
+++ b/src/locales/zh-TW/globalHeader.ts
@@ -0,0 +1,17 @@
+export default {
+  'component.globalHeader.search': '站內搜索',
+  'component.globalHeader.search.example1': '搜索提示壹',
+  'component.globalHeader.search.example2': '搜索提示二',
+  'component.globalHeader.search.example3': '搜索提示三',
+  'component.globalHeader.help': '使用手冊',
+  'component.globalHeader.notification': '通知',
+  'component.globalHeader.notification.empty': '妳已查看所有通知',
+  'component.globalHeader.message': '消息',
+  'component.globalHeader.message.empty': '您已讀完所有消息',
+  'component.globalHeader.event': '待辦',
+  'component.globalHeader.event.empty': '妳已完成所有待辦',
+  'component.noticeIcon.clear': '清空',
+  'component.noticeIcon.cleared': '清空了',
+  'component.noticeIcon.empty': '暫無資料',
+  'component.noticeIcon.view-more': '查看更多',
+};
diff --git a/src/locales/zh-TW/menu.ts b/src/locales/zh-TW/menu.ts
new file mode 100644
index 0000000..0ef54c9
--- /dev/null
+++ b/src/locales/zh-TW/menu.ts
@@ -0,0 +1,52 @@
+export default {
+  'menu.welcome': '歡迎',
+  'menu.more-blocks': '更多區塊',
+  'menu.home': '首頁',
+  'menu.admin': '权限',
+  'menu.admin.sub-page': '二级管理页',
+  'menu.login': '登錄',
+  'menu.register': '註冊',
+  'menu.register-result': '註冊結果',
+  'menu.dashboard': 'Dashboard',
+  'menu.dashboard.analysis': '分析頁',
+  'menu.dashboard.monitor': '監控頁',
+  'menu.dashboard.workplace': '工作臺',
+  'menu.exception.403': '403',
+  'menu.exception.404': '404',
+  'menu.exception.500': '500',
+  'menu.form': '表單頁',
+  'menu.form.basic-form': '基礎表單',
+  'menu.form.step-form': '分步表單',
+  'menu.form.step-form.info': '分步表單(填寫轉賬信息)',
+  'menu.form.step-form.confirm': '分步表單(確認轉賬信息)',
+  'menu.form.step-form.result': '分步表單(完成)',
+  'menu.form.advanced-form': '高級表單',
+  'menu.list': '列表頁',
+  'menu.list.table-list': '查詢表格',
+  'menu.list.basic-list': '標淮列表',
+  'menu.list.card-list': '卡片列表',
+  'menu.list.search-list': '搜索列表',
+  'menu.list.search-list.articles': '搜索列表(文章)',
+  'menu.list.search-list.projects': '搜索列表(項目)',
+  'menu.list.search-list.applications': '搜索列表(應用)',
+  'menu.profile': '詳情頁',
+  'menu.profile.basic': '基礎詳情頁',
+  'menu.profile.advanced': '高級詳情頁',
+  'menu.result': '結果頁',
+  'menu.result.success': '成功頁',
+  'menu.result.fail': '失敗頁',
+  'menu.exception': '异常页',
+  'menu.exception.not-permission': '403',
+  'menu.exception.not-find': '404',
+  'menu.exception.server-error': '500',
+  'menu.exception.trigger': '触发错误',
+  'menu.account': '個人頁',
+  'menu.account.center': '個人中心',
+  'menu.account.settings': '個人設置',
+  'menu.account.trigger': '觸發報錯',
+  'menu.account.logout': '退出登錄',
+  'menu.editor': '圖形編輯器',
+  'menu.editor.flow': '流程編輯器',
+  'menu.editor.mind': '腦圖編輯器',
+  'menu.editor.koni': '拓撲編輯器',
+};
diff --git a/src/locales/zh-TW/pages.ts b/src/locales/zh-TW/pages.ts
new file mode 100644
index 0000000..9027ed9
--- /dev/null
+++ b/src/locales/zh-TW/pages.ts
@@ -0,0 +1,65 @@
+export default {
+  'pages.layouts.userLayout.title': 'Ant Design 是西湖區最具影響力的 Web 設計規範',
+  'pages.login.accountLogin.tab': '賬戶密碼登錄',
+  'pages.login.accountLogin.errorMessage': '錯誤的用戶名和密碼(admin/ant.design)',
+  'pages.login.failure': '登錄失敗,請重試!',
+  'pages.login.success': '登錄成功!',
+  'pages.login.username.placeholder': '用戶名: admin or user',
+  'pages.login.username.required': '用戶名是必填項!',
+  'pages.login.password.placeholder': '密碼: ant.design',
+  'pages.login.password.required': '密碼是必填項!',
+  'pages.login.phoneLogin.tab': '手機號登錄',
+  'pages.login.phoneLogin.errorMessage': '驗證碼錯誤',
+  'pages.login.phoneNumber.placeholder': '請輸入手機號!',
+  'pages.login.phoneNumber.required': '手機號是必填項!',
+  'pages.login.phoneNumber.invalid': '不合法的手機號!',
+  'pages.login.captcha.placeholder': '請輸入驗證碼!',
+  'pages.login.captcha.required': '驗證碼是必填項!',
+  'pages.login.phoneLogin.getVerificationCode': '獲取驗證碼',
+  'pages.getCaptchaSecondText': '秒後重新獲取',
+  'pages.login.rememberMe': '自動登錄',
+  'pages.login.forgotPassword': '忘記密碼 ?',
+  'pages.login.submit': '登錄',
+  'pages.login.loginWith': '其他登錄方式 :',
+  'pages.login.registerAccount': '註冊賬戶',
+  'pages.welcome.link': '歡迎使用',
+  'pages.welcome.alertMessage': '更快更強的重型組件,已經發布。',
+  'pages.admin.subPage.title': '這個頁面只有 admin 權限才能查看',
+  'pages.admin.subPage.alertMessage': 'umi ui 現已發佈,歡迎使用 npm run ui 啓動體驗。',
+  'pages.searchTable.createForm.newRule': '新建規則',
+  'pages.searchTable.updateForm.ruleConfig': '規則配置',
+  'pages.searchTable.updateForm.basicConfig': '基本信息',
+  'pages.searchTable.updateForm.ruleName.nameLabel': '規則名稱',
+  'pages.searchTable.updateForm.ruleName.nameRules': '請輸入規則名稱!',
+  'pages.searchTable.updateForm.ruleDesc.descLabel': '規則描述',
+  'pages.searchTable.updateForm.ruleDesc.descPlaceholder': '請輸入至少五個字符',
+  'pages.searchTable.updateForm.ruleDesc.descRules': '請輸入至少五個字符的規則描述!',
+  'pages.searchTable.updateForm.ruleProps.title': '配置規則屬性',
+  'pages.searchTable.updateForm.object': '監控對象',
+  'pages.searchTable.updateForm.ruleProps.templateLabel': '規則模板',
+  'pages.searchTable.updateForm.ruleProps.typeLabel': '規則類型',
+  'pages.searchTable.updateForm.schedulingPeriod.title': '設定調度週期',
+  'pages.searchTable.updateForm.schedulingPeriod.timeLabel': '開始時間',
+  'pages.searchTable.updateForm.schedulingPeriod.timeRules': '請選擇開始時間!',
+  'pages.searchTable.titleDesc': '描述',
+  'pages.searchTable.ruleName': '規則名稱爲必填項',
+  'pages.searchTable.titleCallNo': '服務調用次數',
+  'pages.searchTable.titleStatus': '狀態',
+  'pages.searchTable.nameStatus.default': '關閉',
+  'pages.searchTable.nameStatus.running': '運行中',
+  'pages.searchTable.nameStatus.online': '已上線',
+  'pages.searchTable.nameStatus.abnormal': '異常',
+  'pages.searchTable.titleUpdatedAt': '上次調度時間',
+  'pages.searchTable.exception': '請輸入異常原因!',
+  'pages.searchTable.titleOption': '操作',
+  'pages.searchTable.config': '配置',
+  'pages.searchTable.subscribeAlert': '訂閱警報',
+  'pages.searchTable.title': '查詢表格',
+  'pages.searchTable.new': '新建',
+  'pages.searchTable.chosen': '已選擇',
+  'pages.searchTable.item': '項',
+  'pages.searchTable.totalServiceCalls': '服務調用次數總計',
+  'pages.searchTable.tenThousand': '萬',
+  'pages.searchTable.batchDeletion': '批量刪除',
+  'pages.searchTable.batchApproval': '批量審批',
+};
diff --git a/src/locales/zh-TW/pwa.ts b/src/locales/zh-TW/pwa.ts
new file mode 100644
index 0000000..108a6e4
--- /dev/null
+++ b/src/locales/zh-TW/pwa.ts
@@ -0,0 +1,6 @@
+export default {
+  'app.pwa.offline': '當前處於離線狀態',
+  'app.pwa.serviceworker.updated': '有新內容',
+  'app.pwa.serviceworker.updated.hint': '請點擊“刷新”按鈕或者手動刷新頁面',
+  'app.pwa.serviceworker.updated.ok': '刷新',
+};
diff --git a/src/locales/zh-TW/settingDrawer.ts b/src/locales/zh-TW/settingDrawer.ts
new file mode 100644
index 0000000..454da28
--- /dev/null
+++ b/src/locales/zh-TW/settingDrawer.ts
@@ -0,0 +1,31 @@
+export default {
+  'app.setting.pagestyle': '整體風格設置',
+  'app.setting.pagestyle.dark': '暗色菜單風格',
+  'app.setting.pagestyle.light': '亮色菜單風格',
+  'app.setting.content-width': '內容區域寬度',
+  'app.setting.content-width.fixed': '定寬',
+  'app.setting.content-width.fluid': '流式',
+  'app.setting.themecolor': '主題色',
+  'app.setting.themecolor.dust': '薄暮',
+  'app.setting.themecolor.volcano': '火山',
+  'app.setting.themecolor.sunset': '日暮',
+  'app.setting.themecolor.cyan': '明青',
+  'app.setting.themecolor.green': '極光綠',
+  'app.setting.themecolor.daybreak': '拂曉藍(默認)',
+  'app.setting.themecolor.geekblue': '極客藍',
+  'app.setting.themecolor.purple': '醬紫',
+  'app.setting.navigationmode': '導航模式',
+  'app.setting.sidemenu': '側邊菜單布局',
+  'app.setting.topmenu': '頂部菜單布局',
+  'app.setting.fixedheader': '固定 Header',
+  'app.setting.fixedsidebar': '固定側邊菜單',
+  'app.setting.fixedsidebar.hint': '側邊菜單布局時可配置',
+  'app.setting.hideheader': '下滑時隱藏 Header',
+  'app.setting.hideheader.hint': '固定 Header 時可配置',
+  'app.setting.othersettings': '其他設置',
+  'app.setting.weakmode': '色弱模式',
+  'app.setting.copy': '拷貝設置',
+  'app.setting.copyinfo': '拷貝成功,請到 config/defaultSettings.js 中替換默認配置',
+  'app.setting.production.hint':
+    '配置欄只在開發環境用於預覽,生產環境不會展現,請拷貝後手動修改配置文件',
+};
diff --git a/src/locales/zh-TW/settings.ts b/src/locales/zh-TW/settings.ts
new file mode 100644
index 0000000..dd45151
--- /dev/null
+++ b/src/locales/zh-TW/settings.ts
@@ -0,0 +1,55 @@
+export default {
+  'app.settings.menuMap.basic': '基本設置',
+  'app.settings.menuMap.security': '安全設置',
+  'app.settings.menuMap.binding': '賬號綁定',
+  'app.settings.menuMap.notification': '新消息通知',
+  'app.settings.basic.avatar': '頭像',
+  'app.settings.basic.change-avatar': '更換頭像',
+  'app.settings.basic.email': '郵箱',
+  'app.settings.basic.email-message': '請輸入您的郵箱!',
+  'app.settings.basic.nickname': '昵稱',
+  'app.settings.basic.nickname-message': '請輸入您的昵稱!',
+  'app.settings.basic.profile': '個人簡介',
+  'app.settings.basic.profile-message': '請輸入個人簡介!',
+  'app.settings.basic.profile-placeholder': '個人簡介',
+  'app.settings.basic.country': '國家/地區',
+  'app.settings.basic.country-message': '請輸入您的國家或地區!',
+  'app.settings.basic.geographic': '所在省市',
+  'app.settings.basic.geographic-message': '請輸入您的所在省市!',
+  'app.settings.basic.address': '街道地址',
+  'app.settings.basic.address-message': '請輸入您的街道地址!',
+  'app.settings.basic.phone': '聯系電話',
+  'app.settings.basic.phone-message': '請輸入您的聯系電話!',
+  'app.settings.basic.update': '更新基本信息',
+  'app.settings.security.strong': '強',
+  'app.settings.security.medium': '中',
+  'app.settings.security.weak': '弱',
+  'app.settings.security.password': '賬戶密碼',
+  'app.settings.security.password-description': '當前密碼強度',
+  'app.settings.security.phone': '密保手機',
+  'app.settings.security.phone-description': '已綁定手機',
+  'app.settings.security.question': '密保問題',
+  'app.settings.security.question-description': '未設置密保問題,密保問題可有效保護賬戶安全',
+  'app.settings.security.email': '備用郵箱',
+  'app.settings.security.email-description': '已綁定郵箱',
+  'app.settings.security.mfa': 'MFA 設備',
+  'app.settings.security.mfa-description': '未綁定 MFA 設備,綁定後,可以進行二次確認',
+  'app.settings.security.modify': '修改',
+  'app.settings.security.set': '設置',
+  'app.settings.security.bind': '綁定',
+  'app.settings.binding.taobao': '綁定淘寶',
+  'app.settings.binding.taobao-description': '當前未綁定淘寶賬號',
+  'app.settings.binding.alipay': '綁定支付寶',
+  'app.settings.binding.alipay-description': '當前未綁定支付寶賬號',
+  'app.settings.binding.dingding': '綁定釘釘',
+  'app.settings.binding.dingding-description': '當前未綁定釘釘賬號',
+  'app.settings.binding.bind': '綁定',
+  'app.settings.notification.password': '賬戶密碼',
+  'app.settings.notification.password-description': '其他用戶的消息將以站內信的形式通知',
+  'app.settings.notification.messages': '系統消息',
+  'app.settings.notification.messages-description': '系統消息將以站內信的形式通知',
+  'app.settings.notification.todo': '待辦任務',
+  'app.settings.notification.todo-description': '待辦任務將以站內信的形式通知',
+  'app.settings.open': '開',
+  'app.settings.close': '關',
+};
diff --git a/src/manifest.json b/src/manifest.json
new file mode 100644
index 0000000..839bc5b
--- /dev/null
+++ b/src/manifest.json
@@ -0,0 +1,22 @@
+{
+  "name": "Ant Design Pro",
+  "short_name": "Ant Design Pro",
+  "display": "standalone",
+  "start_url": "./?utm_source=homescreen",
+  "theme_color": "#002140",
+  "background_color": "#001529",
+  "icons": [
+    {
+      "src": "icons/icon-192x192.png",
+      "sizes": "192x192"
+    },
+    {
+      "src": "icons/icon-128x128.png",
+      "sizes": "128x128"
+    },
+    {
+      "src": "icons/icon-512x512.png",
+      "sizes": "512x512"
+    }
+  ]
+}
diff --git a/src/pages/404.tsx b/src/pages/404.tsx
new file mode 100644
index 0000000..729f3b2
--- /dev/null
+++ b/src/pages/404.tsx
@@ -0,0 +1,104 @@
+import {
+  ProCard,
+  ProForm,
+  ProFormDependency,
+  ProFormSelect,
+  ProFormText,
+  ProFormUploadDragger,
+} from '@ant-design/pro-components';
+import { Form, Image } from 'antd';
+import React, { useState } from 'react';
+// @ts-ignore
+import cookie from 'react-cookies';
+const ShowInfoDemo: React.FC = () => {
+  const [form] = Form.useForm<API.ModelImage>();
+  const [imageUrl, setImageUrl] = useState<string>('');
+  // useEffect(()=>{
+
+  // }, [])
+  const initialValues = {
+    cardCode: '100100199508081010',
+    gender: '男',
+  };
+  return (
+    <div className="showInfoDemo_wrap">
+      <ProCard wrap title={'选择图片'} bodyStyle={{ display: 'flex' }}>
+        <div>
+          <ProFormUploadDragger
+            width={800}
+            name="projectFilePath"
+            action="/api/v1/file/uploadFile"
+            max={1}
+            fieldProps={{
+              showUploadList: false,
+              listType: 'picture-card',
+              beforeUpload: (file) => {
+                const reader = new FileReader();
+                reader.onload = (e) => {
+                  setImageUrl(e.target?.result as string);
+                };
+
+                reader.readAsDataURL(file);
+
+                // 返回 false 可以阻止上传
+                // 返回 Promise 可以异步操作
+                return true;
+              },
+              maxCount: 1,
+              name: 'file',
+              // beforeUpload: beforeUploadFile,
+              data: { path: 'project/files' },
+              headers: {
+                'X-CSRFToken': cookie.load('csrftoken'),
+                Authorization: `Bearer ${localStorage.getItem('access') || ''}`,
+              },
+            }}
+          >
+            <Image width={800} src={imageUrl} preview={false} />
+          </ProFormUploadDragger>
+
+          {/* <Image width={800} height={800} src={imageUrl}>
+
+          </Image> */}
+        </div>
+
+        {/* 展示信息 */}
+        <div style={{ flex: 1, padding: 20 }}>
+          <ProForm
+            form={form}
+            initialValues={initialValues} // 设置初始值
+            submitter={
+              { render: false } // 隐藏提交按钮
+            } // 配置 submitter
+          >
+            <ProFormSelect
+              fieldProps={{
+                labelInValue: true,
+              }}
+              request={async () => [
+                // TODO 使用接口数据与  initialValues 值对应
+                { label: '证件号码', value: 'cardCode' },
+                { label: '性别', value: 'gender' },
+              ]}
+              name="name1"
+              label="展示数据"
+            />
+            <ProFormDependency name={['name1']}>
+              {({ name1 }) => {
+                if (name1) {
+                  console.log(name1, 'ProFormDependency_name1');
+                  return (
+                    <ProFormText label={name1.label} name={name1.value} disabled required={false} />
+                  );
+                }
+                return <></>;
+              }}
+            </ProFormDependency>
+          </ProForm>
+        </div>
+      </ProCard>
+    </div>
+  );
+};
+
+export default ShowInfoDemo;
diff --git a/src/pages/Admin.tsx b/src/pages/Admin.tsx
new file mode 100644
index 0000000..2f93986
--- /dev/null
+++ b/src/pages/Admin.tsx
@@ -0,0 +1,45 @@
+import { HeartTwoTone, SmileTwoTone } from '@ant-design/icons';
+import { PageContainer } from '@ant-design/pro-components';
+import { useIntl } from '@umijs/max';
+import { Alert, Card, Typography } from 'antd';
+import React from 'react';
+
+const Admin: React.FC = () => {
+  const intl = useIntl();
+  return (
+    <PageContainer
+      content={intl.formatMessage({
+        id: 'pages.admin.subPage.title',
+        defaultMessage: 'This page can only be viewed by admin',
+      })}
+    >
+      <Card>
+        <Alert
+          message={intl.formatMessage({
+            id: 'pages.welcome.alertMessage',
+            defaultMessage: 'Faster and stronger heavy-duty components have been released.',
+          })}
+          type="success"
+          showIcon
+          banner
+          style={{
+            margin: -12,
+            marginBottom: 48,
+          }}
+        />
+        <Typography.Title level={2} style={{ textAlign: 'center' }}>
+          <SmileTwoTone /> Ant Design Pro <HeartTwoTone twoToneColor="#eb2f96" /> You
+        </Typography.Title>
+      </Card>
+      <p style={{ textAlign: 'center', marginTop: 24 }}>
+        Want to add more pages? Please refer to{' '}
+        <a href="https://pro.ant.design/docs/block-cn" target="_blank" rel="noopener noreferrer">
+          use block
+        </a>
+        。
+      </p>
+    </PageContainer>
+  );
+};
+
+export default Admin;
diff --git a/src/pages/Fabric/ImageMapEditor/ColumnDrawer.tsx b/src/pages/Fabric/ImageMapEditor/ColumnDrawer.tsx
new file mode 100644
index 0000000..652cf83
--- /dev/null
+++ b/src/pages/Fabric/ImageMapEditor/ColumnDrawer.tsx
@@ -0,0 +1,53 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-01 13:56:33
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-12-06 16:16:10
+ * @FilePath: \general-ai-platform-web\src\pages\Resource\ModelCategoryList\components\ColumnDrawer.tsx
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+import React from "react";
+import {Drawer} from "antd";
+import {ProColumns, ProDescriptions, ProDescriptionsItemProps} from "@ant-design/pro-components";
+
+export type ColumnDrawProps = {
+  handleDrawer: (id?: any)=>void;
+  isShowDetail: boolean;
+  columns: ProColumns<API.ModelCategory>[];
+  currentRow: Record<string,any>;
+};
+
+
+const ColumnDrawer: React.FC<ColumnDrawProps> = (props) => {
+
+  return (
+    <Drawer
+      width={500}
+      open={props.isShowDetail}
+      onClose={() => {
+        props.handleDrawer();
+      }}
+      closable={true}
+    >
+      {props.currentRow?.id && (
+        <ProDescriptions<API.ModelCategory>
+          style={{
+            // paddingLeft: 4,
+            // paddingRight: 4
+          }}
+          column={2}
+          title={props.currentRow?.id}
+          request={async () => ({
+            data: props.currentRow || {},
+          })}
+          params={{
+            id: props.currentRow?.id,
+          }}
+          columns={props.columns as ProDescriptionsItemProps<API.ModelCategory>[]}
+        />
+      )}
+    </Drawer>
+  )
+}
+export {ColumnDrawer}
+
diff --git a/src/pages/Fabric/ImageMapEditor/Descriptors.json b/src/pages/Fabric/ImageMapEditor/Descriptors.json
new file mode 100644
index 0000000..4b1e7f4
--- /dev/null
+++ b/src/pages/Fabric/ImageMapEditor/Descriptors.json
@@ -0,0 +1,253 @@
+{
+  "MARKER": [{
+    "name": "Marker",
+    "description": "",
+    "type": "marker",
+    "icon": {
+      "prefix": "fas",
+      "name": "map-marker-alt"
+    },
+    "option": {
+      "type": "i-text",
+      "text": "\uf3c5",
+      "fontFamily": "Font Awesome 5 Free",
+      "fontWeight": 900,
+      "fontSize": 60,
+      "width": 30,
+      "height": 30,
+      "editable": false,
+      "name": "New marker"
+    }
+  }],
+  "TEXT": [{
+    "name": "Text",
+    "description": "",
+    "type": "text",
+    "icon": {
+      "prefix": "fas",
+      "name": "font"
+    },
+    "option": {
+      "type": "textbox",
+      "text": "输入文字",
+      "width": 60,
+      "height": 30,
+      "fontSize": 32,
+      "name": "New text"
+    }
+  }],
+  "IMAGE": [{
+      "name": "Image",
+      "description": "",
+      "type": "image",
+      "icon": {
+        "prefix": "fas",
+        "name": "image"
+      },
+      "option": {
+        "type": "image",
+        "name": "New image",
+        "src": "./images/sample/transparentBg.png"
+      }
+    },
+    {
+      "name": "GIF",
+      "description": "",
+      "type": "gif",
+      "icon": {
+        "prefix": "fas",
+        "name": "image"
+      },
+      "option": {
+        "type": "gif",
+        "width": 400,
+        "height": 400,
+        "name": "New gif",
+        "src": ""
+      }
+    }
+  ],
+  "SHAPE": [{
+      "name": "Triangle",
+      "description": "",
+      "type": "shape",
+      "icon": {
+        "prefix": "fas",
+        "name": "play",
+        "style": {
+          "transform": "rotate(270deg)"
+        }
+      },
+      "option": {
+        "type": "triangle",
+        "width": 30,
+        "height": 30,
+        "name": "New shape"
+      }
+    },
+    {
+      "name": "Rectangle",
+      "description": "",
+      "type": "shape",
+      "icon": {
+        "prefix": "fas",
+        "name": "stop"
+      },
+      "option": {
+        "type": "rect",
+        "width": 40,
+        "height": 40,
+        "name": "New shape"
+      }
+    },
+    {
+      "name": "Circle",
+      "description": "",
+      "type": "shape",
+      "icon": {
+        "prefix": "fas",
+        "name": "circle"
+      },
+      "option": {
+        "type": "circle",
+        "radius": 30,
+        "name": "New shape"
+      }
+    },
+    {
+      "name": "Cube",
+      "description": "",
+      "type": "shape",
+      "icon": {
+        "prefix": "fas",
+        "name": "cube"
+      },
+      "option": {
+        "type": "cube",
+        "width": 80,
+        "height": 80,
+        "name": "New shape"
+      }
+    },
+    {
+      "name": "node",
+      "description": "",
+      "type": "node",
+      "icon": {
+        "prefix": "fas",
+        "name": "font"
+      },
+      "option": {
+        "type": "node"
+      }
+    }
+  ],
+  "DRAWING": [{
+      "name": "Polygon",
+      "description": "",
+      "type": "drawing",
+      "icon": {
+        "prefix": "fas",
+        "name": "draw-polygon"
+      },
+      "option": {
+        "type": "polygon",
+        "name": "New polygon"
+      }
+    },
+    {
+      "name": "Line",
+      "description": "",
+      "type": "drawing",
+      "icon": {
+        "prefix": "fas",
+        "name": "minus"
+      },
+      "option": {
+        "type": "line",
+        "name": "New line"
+      }
+    },
+    {
+      "name": "Arrow",
+      "description": "",
+      "type": "drawing",
+      "icon": {
+        "prefix": "fas",
+        "name": "long-arrow-alt-right"
+      },
+      "option": {
+        "type": "arrow",
+        "name": "New arrow"
+      }
+    }
+  ],
+  "ELEMENT": [
+    {
+      "name": "Element",
+      "description": "",
+      "type": "element",
+      "icon": {
+        "prefix": "fab",
+        "name": "html5"
+      },
+      "option": {
+        "superType": "element",
+        "type": "element",
+        "width": 480,
+        "height": 270,
+        "name": "New element"
+      }
+    },
+    {
+      "name": "Iframe",
+      "description": "",
+      "type": "element",
+      "icon": {
+        "prefix": "fas",
+        "name": "window-maximize"
+      },
+      "option": {
+        "superType": "element",
+        "type": "iframe",
+        "width": 480,
+        "height": 270,
+        "name": "New iframe"
+      }
+    },
+    {
+      "name": "Video",
+      "description": "",
+      "type": "element",
+      "icon": {
+        "prefix": "fab",
+        "name": "youtube"
+      },
+      "option": {
+        "superType": "element",
+        "type": "video",
+        "width": 480,
+        "height": 270,
+        "name": "New video",
+        "autoplay": true,
+        "muted": true,
+        "loop": true
+      }
+    }
+  ],
+  "SVG": [{
+    "name": "Default",
+    "description": "",
+    "type": "default",
+    "icon": {
+      "prefix": "fas",
+      "name": "bezier-curve"
+    },
+    "option": {
+      "type": "svg",
+      "superType": "svg",
+      "name": "New SVG",
+      "loadType": "svg"
+    }
+  }]
+}
diff --git a/src/pages/Fabric/ImageMapEditor/ImageMapConfigurations.tsx b/src/pages/Fabric/ImageMapEditor/ImageMapConfigurations.tsx
new file mode 100644
index 0000000..e69de29
diff --git a/src/pages/Fabric/ImageMapEditor/ImageMapHeaderToolbar.tsx b/src/pages/Fabric/ImageMapEditor/ImageMapHeaderToolbar.tsx
new file mode 100644
index 0000000..d084237
--- /dev/null
+++ b/src/pages/Fabric/ImageMapEditor/ImageMapHeaderToolbar.tsx
@@ -0,0 +1,185 @@
+
+
+import React, { useState } from 'react';
+import { useIntl } from '@umijs/max';
+import { Flex } from '../components/flex';
+import { Button } from 'antd';
+import Icon from '@ant-design/icons';
+
+
+const ImageMapHeaderToolbar : React.FC = (props) => {
+	// static propTypes = {
+	// 	canvasRef: PropTypes.any,
+	// 	selectedItem: PropTypes.object,
+	// };
+
+    const intl = useIntl();
+    const { canvasRef, selectedItem } = props;
+    const isCropping = canvasRef ? canvasRef.handler?.interactionMode === 'crop' : false;
+		return (
+			<Flex className="rde-editor-header-toolbar-container" flex="1">
+				{/* <Flex.Item className="rde-canvas-toolbar rde-canvas-toolbar-list">
+					<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						icon="layer-group"
+						tooltipTitle={i18n.t('action.canvas-list')}
+					/>
+					<div className="rde-canvas-list">
+						<ImageMapList canvasRef={canvasRef} selectedItem={selectedItem} />
+					</div>
+				</Flex.Item>
+				<Flex.Item className="rde-canvas-toolbar rde-canvas-toolbar-alignment">
+					<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						disabled={isCropping}
+						onClick={() => canvasRef.handler?.bringForward()}
+						icon="angle-up"
+						tooltipTitle={i18n.t('action.bring-forward')}
+					/>
+					<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						disabled={isCropping}
+						onClick={() => canvasRef.handler?.sendBackwards()}
+						icon="angle-down"
+						tooltipTitle={i18n.t('action.send-backwards')}
+					/>
+					<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						disabled={isCropping}
+						onClick={() => canvasRef.handler?.bringToFront()}
+						icon="angle-double-up"
+						tooltipTitle={i18n.t('action.bring-to-front')}
+					/>
+					<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						disabled={isCropping}
+						onClick={() => canvasRef.handler?.sendToBack()}
+						icon="angle-double-down"
+						tooltipTitle={i18n.t('action.send-to-back')}
+					/>
+				</Flex.Item>
+				<Flex.Item className="rde-canvas-toolbar rde-canvas-toolbar-alignment">
+					<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						disabled={isCropping}
+						onClick={() => canvasRef.handler?.alignmentHandler.left()}
+						icon="align-left"
+						tooltipTitle={i18n.t('action.align-left')}
+					/>
+					<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						disabled={isCropping}
+						onClick={() => canvasRef.handler?.alignmentHandler.center()}
+						icon="align-center"
+						tooltipTitle={i18n.t('action.align-center')}
+					/>
+					<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						disabled={isCropping}
+						onClick={() => canvasRef.handler?.alignmentHandler.right()}
+						icon="align-right"
+						tooltipTitle={i18n.t('action.align-right')}
+					/>
+				</Flex.Item>
+				<Flex.Item className="rde-canvas-toolbar rde-canvas-toolbar-group">
+					<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						disabled={isCropping}
+						onClick={() => canvasRef.handler?.toGroup()}
+						icon="object-group"
+						tooltipTitle={i18n.t('action.object-group')}
+					/>
+					<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						disabled={isCropping}
+						onClick={() => canvasRef.handler?.toActiveSelection()}
+						icon="object-ungroup"
+						tooltipTitle={i18n.t('action.object-ungroup')}
+					/>
+				</Flex.Item>
+				<Flex.Item className="rde-canvas-toolbar rde-canvas-toolbar-crop">
+					<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						disabled={canvasRef ? !canvasRef.handler?.cropHandler.validType() : true}
+						onClick={() => canvasRef.handler?.cropHandler.start()}
+						icon="crop"
+						tooltipTitle={i18n.t('action.crop')}
+					/>
+					<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						disabled={canvasRef ? !canvasRef.handler?.cropHandler.cropRect : true}
+						onClick={() => canvasRef.handler?.cropHandler.finish()}
+						icon="check"
+						tooltipTitle={i18n.t('action.crop-save')}
+					/>
+					<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						disabled={canvasRef ? !canvasRef.handler?.cropHandler.cropRect : true}
+						onClick={() => canvasRef.handler?.cropHandler.cancel()}
+						icon="times"
+						tooltipTitle={i18n.t('action.crop-cancel')}
+					/>
+				</Flex.Item>
+				<Flex.Item className="rde-canvas-toolbar rde-canvas-toolbar-operation">
+					<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						disabled={isCropping}
+						onClick={() => canvasRef.handler?.saveImage()}
+						icon="image"
+						tooltipTitle={i18n.t('action.image-save')}
+					/>
+					<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						disabled={isCropping}
+						onClick={() => canvasRef.handler?.duplicate()}
+						icon="clone"
+						tooltipTitle={i18n.t('action.clone')}
+					/>
+					<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						disabled={isCropping}
+						onClick={() => canvasRef.handler?.remove()}
+						icon="trash"
+						tooltipTitle={i18n.t('action.delete')}
+					/>
+				</Flex.Item> */}
+				<Flex.Item className="rde-canvas-toolbar rde-canvas-toolbar-history">
+					<Button
+						className="rde-action-btn"
+						disabled={isCropping || (canvasRef && !canvasRef.handler?.transactionHandler.undos.length)}
+						onClick={() => canvasRef.handler?.transactionHandler.undo()}
+					>
+						<Icon name="undo-alt" style={{ marginRight: 8 }} />
+						Undo
+					</Button>
+					<Button
+						className="rde-action-btn"
+						disabled={isCropping || (canvasRef && !canvasRef.handler?.transactionHandler.redos.length)}
+						onClick={() => canvasRef.handler?.transactionHandler.redo()}
+					>
+						Redo
+						<Icon name="redo-alt" style={{ marginLeft: 8 }} />
+					</Button>
+				</Flex.Item>
+			</Flex>
+		);
+	
+}
+
+export default ImageMapHeaderToolbar;
\ No newline at end of file
diff --git a/src/pages/Fabric/ImageMapEditor/ImageMapItems.tsx b/src/pages/Fabric/ImageMapEditor/ImageMapItems.tsx
new file mode 100644
index 0000000..d7b4176
--- /dev/null
+++ b/src/pages/Fabric/ImageMapEditor/ImageMapItems.tsx
@@ -0,0 +1,33 @@
+// import { Flex } from "../components/flex";
+import { Button } from 'antd';
+import React, { useEffect, useRef, useState } from 'react';
+
+export type ImageMapItemsProps = {
+  ref: any;
+  canvasRef: any;
+  descriptors: Record<string, any>;
+};
+
+const ImageMapItems: React.FC<ImageMapItemsProps> = (props) => {
+  const { descriptors } = props;
+
+//   const renderItems = (items) => (
+//     <Flex flexWrap="wrap" flexDirection="column" style={{ width: '100%' }}>
+//       {items.map((item) => renderItem(item))}
+//     </Flex>
+//   );
+
+console.log(descriptors,'descriptors')
+
+  return (
+    <ul>
+      {descriptors && Object.keys(descriptors).map((key) => (
+        <li key={key} style={{marginBottom: 12}}>
+            <Button type='primary'> {key}</Button>
+        </li>
+      ))}
+    </ul>
+  );
+};
+
+export default ImageMapItems;
diff --git a/src/pages/Fabric/ImageMapEditor/ImageMapItems0.js b/src/pages/Fabric/ImageMapEditor/ImageMapItems0.js
new file mode 100644
index 0000000..fdf7577
--- /dev/null
+++ b/src/pages/Fabric/ImageMapEditor/ImageMapItems0.js
@@ -0,0 +1,331 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { Collapse, notification, Input, message } from 'antd';
+import classnames from 'classnames';
+import i18n from 'i18next';
+
+import { Flex } from '../../components/flex';
+import Icon from '../../components/icon/Icon';
+import Scrollbar from '../../components/common/Scrollbar';
+import CommonButton from '../../components/common/CommonButton';
+import { SVGModal } from '../../components/common';
+
+notification.config({
+	top: 80,
+	duration: 2,
+});
+
+class ImageMapItems extends Component {
+	static propTypes = {
+		canvasRef: PropTypes.any,
+		descriptors: PropTypes.object,
+	};
+
+	state = {
+		activeKey: [],
+		collapse: false,
+		textSearch: '',
+		descriptors: {},
+		filteredDescriptors: [],
+		svgModalVisible: false,
+	};
+
+	componentDidMount() {
+		const { canvasRef } = this.props;
+		this.waitForCanvasRender(canvasRef);
+	}
+
+	UNSAFE_componentWillReceiveProps(nextProps) {
+		if (JSON.stringify(this.props.descriptors) !== JSON.stringify(nextProps.descriptors)) {
+			const descriptors = Object.keys(nextProps.descriptors).reduce((prev, key) => {
+				return prev.concat(nextProps.descriptors[key]);
+			}, []);
+			this.setState({
+				descriptors,
+			});
+		}
+	}
+
+	shouldComponentUpdate(nextProps, nextState) {
+		if (JSON.stringify(this.state.descriptors) !== JSON.stringify(nextState.descriptors)) {
+			return true;
+		} else if (JSON.stringify(this.state.filteredDescriptors) !== JSON.stringify(nextState.filteredDescriptors)) {
+			return true;
+		} else if (this.state.textSearch !== nextState.textSearch) {
+			return true;
+		} else if (JSON.stringify(this.state.activeKey) !== JSON.stringify(nextState.activeKey)) {
+			return true;
+		} else if (this.state.collapse !== nextState.collapse) {
+			return true;
+		} else if (this.state.svgModalVisible !== nextState.svgModalVisible) {
+			return true;
+		}
+		return false;
+	}
+
+	componentWillUnmount() {
+		const { canvasRef } = this.props;
+		this.detachEventListener(canvasRef);
+	}
+
+	waitForCanvasRender = canvas => {
+		setTimeout(() => {
+			if (canvas) {
+				this.attachEventListener(canvas);
+				return;
+			}
+			const { canvasRef } = this.props;
+			this.waitForCanvasRender(canvasRef);
+		}, 5);
+	};
+
+	attachEventListener = canvas => {
+		canvas.canvas.wrapperEl.addEventListener('dragenter', this.events.onDragEnter, false);
+		canvas.canvas.wrapperEl.addEventListener('dragover', this.events.onDragOver, false);
+		canvas.canvas.wrapperEl.addEventListener('dragleave', this.events.onDragLeave, false);
+		canvas.canvas.wrapperEl.addEventListener('drop', this.events.onDrop, false);
+	};
+
+	detachEventListener = canvas => {
+		canvas.canvas.wrapperEl.removeEventListener('dragenter', this.events.onDragEnter);
+		canvas.canvas.wrapperEl.removeEventListener('dragover', this.events.onDragOver);
+		canvas.canvas.wrapperEl.removeEventListener('dragleave', this.events.onDragLeave);
+		canvas.canvas.wrapperEl.removeEventListener('drop', this.events.onDrop);
+	};
+
+	/* eslint-disable react/sort-comp, react/prop-types */
+	handlers = {
+		onAddItem: (item, centered) => {
+			const { canvasRef } = this.props;
+			if (canvasRef.handler.interactionMode === 'polygon') {
+				message.info('Already drawing');
+				return;
+			}
+			const id = fetchUuid();
+			const option = Object.assign({}, item.option, { id });
+			if (item.option.superType === 'svg' && item.type === 'default') {
+				this.handlers.onSVGModalVisible(item.option);
+				return;
+			}
+			canvasRef.handler.add(option, centered);
+		},
+		onAddSVG: (option, centered) => {
+			const { canvasRef } = this.props;
+			canvasRef.handler.add({ ...option, type: 'svg', superType: 'svg', id: fetchUuid(), name: 'New SVG' }, centered);
+			this.handlers.onSVGModalVisible();
+		},
+		onDrawingItem: item => {
+			const { canvasRef } = this.props;
+			if (canvasRef.handler.interactionMode === 'polygon') {
+				message.info('Already drawing');
+				return;
+			}
+			if (item.option.type === 'line') {
+				canvasRef.handler.drawingHandler.line.init();
+			} else if (item.option.type === 'arrow') {
+				canvasRef.handler.drawingHandler.arrow.init();
+			} else {
+				canvasRef.handler.drawingHandler.polygon.init();
+			}
+		},
+		onChangeActiveKey: activeKey => {
+			this.setState({
+				activeKey,
+			});
+		},
+		onCollapse: () => {
+			this.setState({
+				collapse: !this.state.collapse,
+			});
+		},
+		onSearchNode: e => {
+			const filteredDescriptors = this.handlers
+				.transformList()
+				.filter(descriptor => descriptor.name.toLowerCase().includes(e.target.value.toLowerCase()));
+			this.setState({
+				textSearch: e.target.value,
+				filteredDescriptors,
+			});
+		},
+		transformList: () => {
+			return Object.values(this.props.descriptors).reduce((prev, curr) => prev.concat(curr), []);
+		},
+		onSVGModalVisible: () => {
+			this.setState(prevState => {
+				return {
+					svgModalVisible: !prevState.svgModalVisible,
+				};
+			});
+		},
+	};
+
+	events = {
+		onDragStart: (e, item) => {
+			this.item = item;
+			const { target } = e;
+			target.classList.add('dragging');
+		},
+		onDragOver: e => {
+			if (e.preventDefault) {
+				e.preventDefault();
+			}
+			e.dataTransfer.dropEffect = 'copy';
+			return false;
+		},
+		onDragEnter: e => {
+			const { target } = e;
+			target.classList.add('over');
+		},
+		onDragLeave: e => {
+			const { target } = e;
+			target.classList.remove('over');
+		},
+		onDrop: e => {
+			e = e || window.event;
+			if (e.preventDefault) {
+				e.preventDefault();
+			}
+			if (e.stopPropagation) {
+				e.stopPropagation();
+			}
+			const { layerX, layerY } = e;
+			const dt = e.dataTransfer;
+			if (dt.types.length && dt.types[0] === 'Files') {
+				const { files } = dt;
+				Array.from(files).forEach(file => {
+					file.uid = fetchUuid();
+					const { type } = file;
+					if (type === 'image/png' || type === 'image/jpeg' || type === 'image/jpg') {
+						const item = {
+							option: {
+								type: 'image',
+								file,
+								left: layerX,
+								top: layerY,
+							},
+						};
+						this.handlers.onAddItem(item, false);
+					} else {
+						notification.warn({
+							message: 'Not supported file type',
+						});
+					}
+				});
+				return false;
+			}
+			const option = Object.assign({}, this.item.option, { left: layerX, top: layerY });
+			const newItem = Object.assign({}, this.item, { option });
+			this.handlers.onAddItem(newItem, false);
+			return false;
+		},
+		onDragEnd: e => {
+			this.item = null;
+			e.target.classList.remove('dragging');
+		},
+	};
+
+	renderItems = items => (
+		<Flex flexWrap="wrap" flexDirection="column" style={{ width: '100%' }}>
+			{items.map(item => this.renderItem(item))}
+		</Flex>
+	);
+
+	renderItem = (item, centered) =>
+		item.type === 'drawing' ? (
+			<div
+				key={item.name}
+				draggable
+				onClick={e => this.handlers.onDrawingItem(item)}
+				className="rde-editor-items-item"
+				style={{ justifyContent: this.state.collapse ? 'center' : null }}
+			>
+				<span className="rde-editor-items-item-icon">
+					<Icon name={item.icon.name} prefix={item.icon.prefix} style={item.icon.style} />
+				</span>
+				{this.state.collapse ? null : <div className="rde-editor-items-item-text">{item.name}</div>}
+			</div>
+		) : (
+			<div
+				key={item.name}
+				draggable
+				onClick={e => this.handlers.onAddItem(item, centered)}
+				onDragStart={e => this.events.onDragStart(e, item)}
+				onDragEnd={e => this.events.onDragEnd(e, item)}
+				className="rde-editor-items-item"
+				style={{ justifyContent: this.state.collapse ? 'center' : null }}
+			>
+				<span className="rde-editor-items-item-icon">
+					<Icon name={item.icon.name} prefix={item.icon.prefix} style={item.icon.style} />
+				</span>
+				{this.state.collapse ? null : <div className="rde-editor-items-item-text">{item.name}</div>}
+			</div>
+		);
+
+	render() {
+		const { descriptors } = this.props;
+		const { collapse, textSearch, filteredDescriptors, activeKey, svgModalVisible, svgOption } = this.state;
+		const className = classnames('rde-editor-items', {
+			minimize: collapse,
+		});
+		return (
+			<div className={className}>
+				<Flex flex="1" flexDirection="column" style={{ height: '100%' }}>
+					<Flex justifyContent="center" alignItems="center" style={{ height: 40 }}>
+						<CommonButton
+							icon={collapse ? 'angle-double-right' : 'angle-double-left'}
+							shape="circle"
+							className="rde-action-btn"
+							style={{ margin: '0 4px' }}
+							onClick={this.handlers.onCollapse}
+						/>
+						{collapse ? null : (
+							<Input
+								style={{ margin: '8px' }}
+								placeholder={i18n.t('action.search-list')}
+								onChange={this.handlers.onSearchNode}
+								value={textSearch}
+								allowClear
+							/>
+						)}
+					</Flex>
+					<Scrollbar>
+						<Flex flex="1" style={{ overflowY: 'hidden' }}>
+							{(textSearch.length && this.renderItems(filteredDescriptors)) ||
+								(collapse ? (
+									<Flex
+										flexWrap="wrap"
+										flexDirection="column"
+										style={{ width: '100%' }}
+										justifyContent="center"
+									>
+										{this.handlers.transformList().map(item => this.renderItem(item))}
+									</Flex>
+								) : (
+									<Collapse
+										style={{ width: '100%' }}
+										bordered={false}
+										activeKey={activeKey.length ? activeKey : Object.keys(descriptors)}
+										onChange={this.handlers.onChangeActiveKey}
+									>
+										{Object.keys(descriptors).map(key => (
+											<Collapse.Panel key={key} header={key} showArrow={!collapse}>
+												{this.renderItems(descriptors[key])}
+											</Collapse.Panel>
+										))}
+									</Collapse>
+								))}
+						</Flex>
+					</Scrollbar>
+				</Flex>
+				<SVGModal
+					visible={svgModalVisible}
+					onOk={this.handlers.onAddSVG}
+					onCancel={this.handlers.onSVGModalVisible}
+					option={svgOption}
+				/>
+			</div>
+		);
+	}
+}
+
+export default ImageMapItems;
diff --git a/src/pages/Fabric/ImageMapEditor/index.tsx b/src/pages/Fabric/ImageMapEditor/index.tsx
new file mode 100644
index 0000000..7a86d4f
--- /dev/null
+++ b/src/pages/Fabric/ImageMapEditor/index.tsx
@@ -0,0 +1,258 @@
+// import { useUuid } from '@/hooks/useUuid';
+import { ProCard } from '@ant-design/pro-components';
+import { useIntl } from '@umijs/max';
+import { Button } from 'antd';
+import React, { useEffect, useRef, useState } from 'react';
+// import Canvas from '../canvas/Canvas';
+import { currJson1 } from '@/testData/fabricGroup1';
+import { bgImageData } from '@/testData/testSvg';
+import { fabric } from 'fabric';
+import { ColumnDrawer } from './ColumnDrawer';
+
+export const ModelCategoryColumns = [
+  {
+    title: '模型id',
+    dataIndex: 'modelId',
+  },
+  {
+    title: '模型状态',
+    dataIndex: 'label',
+  },
+  {
+    title: '模型名称',
+    dataIndex: 'des',
+  },
+];
+const ImageMapEditor: React.FC = () => {
+  const intl = useIntl();
+  const canvasRef = useRef(null);
+  const itemsRef = useRef(null);
+  const [cvs, setCanvas] = useState(null);
+  const [descriptors, setDescriptors] = useState<Record<string, any>>({});
+  const [category_fk_id_open, set_category_fk_id_open] = useState(false);
+  const [currentModelUserProperty, setCurrentModelUserProperty] = useState<Record<string, any>>({});
+
+  const [changeId, setChangeId] = useState<string[]>([]);
+
+  const [clipPathData, setClipPathData] = useState({
+    width: 1200, // 宽
+    height: 900, // 高
+  });
+  const [jsonData, setJsonData] = useState<Record<string, any>>({});
+
+  /*test */
+  // const { fetchUuid } = useUuid();
+
+  function changeModelStatus() {
+    setChangeId(['2', '3']);
+  }
+
+  const handle_category_fk_id = (id: any) => {
+    if (category_fk_id_open) {
+      set_category_fk_id_open(false);
+    }
+  };
+
+  useEffect(() => {
+    const canvasObject = new fabric.Canvas(canvasRef.current);
+    canvasObject.setBackgroundImage(bgImageData.src, canvasObject.renderAll.bind(canvasObject), {
+      width: clipPathData.width,
+      height: clipPathData.height,
+      originX: 'left',
+      originY: 'top',
+    });
+    canvasObject.loadFromJSON(JSON.stringify(currJson1), () => {
+      canvasObject.renderAll();
+      // const groupObjectList = canvasObject.getObjects()
+
+      // const groupObject = canvasObject.getObjects()[0];
+
+      // 选中组合对象
+      // console.log(groupObject, 'groupObject', canvasObject.getObjects());
+      // 注册事件监听器
+      canvasObject.on('mouse:up', (event) => {
+        // 获取事件的目标对象
+        const targetObject = event.target;
+        // 检查目标对象是否为组合对象
+        if (targetObject && targetObject?.userProperty) {
+          console.log('Group selected:', targetObject);
+          setCurrentModelUserProperty(targetObject.userProperty);
+          set_category_fk_id_open(true);
+          // canvasObject.setActiveObject(groupObject);
+          // canvasObject.requestRenderAll();
+          // 在这里可以执行你想要的操作
+          // 添加缩放动画
+          // targetObject.animate('scaleX', '+=0.1', {
+          //   duration: 500, // 动画持续时间,单位毫秒
+          //   onChange: canvasObject.renderAll.bind(canvasObject), // 在动画过程中实时渲染画布
+          //   onComplete: () => {
+          //     console.log('Animation complete!');
+          //     // 在动画完成后执行其他操作
+          //   },
+          // });
+          // targetObject.animate('scaleY', '+=0.1', {
+          //   duration: 500, // 动画持续时间,单位毫秒
+          //   onChange: canvasObject.renderAll.bind(canvasObject), // 在动画过程中实时渲染画布
+          //   onComplete: () => {
+          //     console.log('Animation complete!');
+          //     // 在动画完成后执行其他操作
+          //   },
+          // });
+        }
+      });
+
+      
+    // 设置目标的速度和方向
+    const velocity = {
+      // scaleX: 0.1, // 0 ~ 1
+      // scaleY: 0.1, // 0 ~ 1
+      opacity: 0.1, // 0 ~ 1
+    };
+
+
+      function animate() {
+        canvasObject
+          .getObjects()
+          .concat()
+          .forEach(function (obj) {
+            obj.opacity += velocity.opacity;
+
+            if( obj.opacity <= 0.5 ||  obj.opacity >= 1){
+              velocity.opacity = -velocity.opacity;
+            }
+            // obj.rotate(obj.get('angle') + 1);
+            // 位移   
+            // obj.left += velocity.x;
+            // obj.top += velocity.y;
+            // // 碰撞检测
+            // if (obj.left <= 0 || obj.left + obj.width >= clipPathData.width) {
+            //   velocity.x = -velocity.x; // 水平方向反弹
+            // }
+  
+            // if (obj.top <= 0 || obj.top + obj.height >= clipPathData.height) {
+            //   velocity.y = -velocity.y; // 垂直方向反弹
+            // }x
+            //   if (obj.left > 900 || obj.left < -100 || obj.top > 500) {
+            //     newCanvas.remove(obj);
+            //   }
+            //   else {
+            //   }
+          });
+          canvasObject.renderAll();
+        fabric.util.requestAnimFrame(animate);
+      }
+  
+
+      if (changeId && changeId.length) {
+        canvasObject
+          .getObjects().forEach(item=>{
+            if(changeId.includes(item?.userProperty?.id) ){
+              const groupObject = item
+               // 选中组合对象
+        // canvasObject.setActiveObject(groupObject); // 可以改变 selectable 值
+        canvasObject.requestRenderAll();
+        // 获取组合对象中的子对象
+        const objectsInGroup = groupObject.getObjects();
+        // 遍历子对象找到要修改的子对象
+        const objectToModify = objectsInGroup.find((obj) => obj.get('type') === 'circle');
+        const objectToModify2 = objectsInGroup.find((obj) => obj.get('type') === 'i-text');
+        //
+        if (groupObject?.userProperty) {
+          groupObject.set({
+            userProperty: {
+              ...groupObject?.userProperty,
+              status: '1',
+            },
+          });
+        }
+
+        // 修改子对象的属性
+        if (objectToModify) {
+          objectToModify.set({
+            fill: 'rgba(248,9,3,0.94)',
+            stroke: 'rgba(255,243,47,1)',
+            // height: 60,
+            // 添加其他属性...
+          });
+          // 重新渲染Canvas
+          canvasObject.renderAll();
+        }
+        if (objectToModify2) {
+          objectToModify2.set({
+            text: '警告',
+          });
+          // 重新渲染Canvas
+          canvasObject.renderAll();
+        }
+            }
+          })
+        // 获取组合对象(选中目标对象)
+        // const groupObject = canvasObject
+        //   .getObjects()
+        //   .find((item) => item?.userProperty?.id === changeId);
+        // console.log(groupObject, 'groupObject', canvasObject.getObjects());
+       
+      }
+
+      // 获取组合对象中的属性
+      //   const properties = groupObject.getObjects().map(obj => {
+      // 	return {
+      // 	  type: obj.get('type'),
+      // 	  width: obj.get('width'),
+      // 	  height: obj.get('height'),
+      // 	  fill: obj.get('fill'),
+      // 	  left: obj.get('left'),
+      // 	  top: obj.get('top')
+      // 	  // 添加其他属性...
+      // 	};
+      //   });
+
+      //   console.log('Properties of the selected group:', properties);
+    });
+    return () => {
+      canvasObject.dispose();
+    };
+  }, [changeId]);
+
+  useEffect(() => {
+    // TODO_3 需要加个loading效果
+    import('./Descriptors.json').then((descriptors) => {
+      setDescriptors(descriptors);
+    });
+    // console.log(fetchUuid(), 'fetchUuid');
+  }, []);
+
+  return (
+    <ProCard
+      gutter={24}
+      extra={
+        <>
+          <Button type="primary" onClick={changeModelStatus}>
+            切换状态
+          </Button>
+        </>
+      }
+    >
+      {/* <ProCard colSpan={4}>
+        <ImageMapItems ref={itemsRef} canvasRef={canvasRef} descriptors={descriptors} />
+      </ProCard> */}
+      <ProCard colSpan={24} style={{ padding: 0, margin: 0 }} bodyStyle={{ padding: 0, margin: 0 }}>
+        <canvas
+          ref={canvasRef}
+          {...clipPathData}
+          style={{ border: '1px dashed #eee' }}
+        ></canvas>
+      </ProCard>
+
+      <ColumnDrawer
+        handleDrawer={handle_category_fk_id}
+        isShowDetail={category_fk_id_open}
+        columns={ModelCategoryColumns}
+        currentRow={currentModelUserProperty}
+      />
+    </ProCard>
+    // 属性预览
+  );
+};
+
+export default ImageMapEditor;
diff --git a/src/pages/Fabric/ImageMapEditor/index0.js b/src/pages/Fabric/ImageMapEditor/index0.js
new file mode 100644
index 0000000..1a65392
--- /dev/null
+++ b/src/pages/Fabric/ImageMapEditor/index0.js
@@ -0,0 +1,829 @@
+import { Badge, Button, Menu, Popconfirm } from 'antd';
+import i18n from 'i18next';
+import {debounce } from 'lodash';
+import React, { Component } from 'react';
+import Canvas from '../../canvas/Canvas';
+import CommonButton from '../../components/common/CommonButton';
+import { Content } from '../../components/layout';
+import SandBox from '../../components/sandbox/SandBox';
+import '../../libs/fontawesome-5.2.0/css/all.css';
+import '../../styles/index.less';
+import ImageMapConfigurations from './ImageMapConfigurations';
+import ImageMapFooterToolbar from './ImageMapFooterToolbar';
+import ImageMapHeaderToolbar from './ImageMapHeaderToolbar';
+import ImageMapItems from './ImageMapItems';
+import ImageMapPreview from './ImageMapPreview';
+import ImageMapTitle from './ImageMapTitle';
+import {json1} from '../../testData/01'
+
+const propertiesToInclude = [
+	'id',
+	'name',
+	'locked',
+	'file',
+	'src',
+	'link',
+	'tooltip',
+	'animation',
+	'layout',
+	'workareaWidth',
+	'workareaHeight',
+	'videoLoadType',
+	'autoplay',
+	'shadow',
+	'muted',
+	'loop',
+	'code',
+	'icon',
+	'userProperty',
+	'trigger',
+	'configuration',
+	'superType',
+	'points',
+	'svg',
+	'loadType',
+];
+
+// 右侧展示栏
+const defaultOption = {
+	stroke: 'rgba(255, 255, 255, 0)',
+	strokeUniform: true,
+	resource: {},
+	link: {
+		enabled: false,
+		type: 'resource',
+		state: 'new',
+		dashboard: {},
+	},
+	tooltip: {
+		enabled: true,
+		type: 'resource',
+		template: '<div>{{message.name}}</div>',
+	},
+	animation: {
+		type: 'none',
+		loop: true,
+		autoplay: true,
+		duration: 1000,
+	},
+	userProperty: {},
+	trigger: {
+		enabled: false,
+		type: 'alarm',
+		script: 'return message.value > 0;',
+		effect: 'style',
+	},
+};
+
+class ImageMapEditor extends Component {
+	state = {
+		selectedItem: null,
+		zoomRatio: 1,
+		preview: false,
+		loading: false,
+		progress: 0,
+		animations: [],
+		styles: [],
+		dataSources: [],
+		editing: false,
+		descriptors: {},
+		objects: undefined,
+	};
+
+	componentDidMount() {
+		this.showLoading(true);
+		import('./Descriptors.json').then(descriptors => {
+			this.setState(
+				{
+					descriptors,
+				},
+				() => {
+					this.showLoading(false);
+				},
+			);
+		});
+		this.setState({
+			selectedItem: null,
+		});
+	}
+
+	canvasHandlers = {
+		onAdd: target => {
+			const { editing } = this.state;
+			this.forceUpdate();
+			if (!editing) {
+				this.changeEditing(true);
+			}
+			if (target.type === 'activeSelection') {
+				this.canvasHandlers.onSelect(null);
+				return;
+			}
+			this.canvasRef.handler.select(target);
+		},
+		onSelect: target => {
+			const { selectedItem } = this.state;
+			if (target && target.id && target.id !== 'workarea' && target.type !== 'activeSelection') {
+				if (selectedItem && target.id === selectedItem.id) {
+					return;
+				}
+				this.canvasRef.handler.getObjects().forEach(obj => {
+					if (obj) {
+						this.canvasRef.handler.animationHandler.resetAnimation(obj, true);
+					}
+				});
+				this.setState({
+					selectedItem: target,
+				});
+				return;
+			}
+			this.canvasRef.handler.getObjects().forEach(obj => {
+				if (obj) {
+					this.canvasRef.handler.animationHandler.resetAnimation(obj, true);
+				}
+			});
+			this.setState({
+				selectedItem: null,
+			});
+		},
+		onRemove: () => {
+			const { editing } = this.state;
+			if (!editing) {
+				this.changeEditing(true);
+			}
+			this.canvasHandlers.onSelect(null);
+		},
+		onModified: debounce(() => {
+			const { editing } = this.state;
+			this.forceUpdate();
+			if (!editing) {
+				this.changeEditing(true);
+			}
+		}, 300),
+		onZoom: zoom => {
+			this.setState({
+				zoomRatio: zoom,
+			});
+		},
+		onChange: (selectedItem, changedValues, allValues) => {
+			const { editing } = this.state;
+			if (!editing) {
+				this.changeEditing(true);
+			}
+			const changedKey = Object.keys(changedValues)[0];
+			const changedValue = changedValues[changedKey];
+			if (allValues.workarea) {
+				this.canvasHandlers.onChangeWokarea(changedKey, changedValue, allValues.workarea);
+				return;
+			}
+			if (changedKey === 'width' || changedKey === 'height') {
+				this.canvasRef.handler.scaleToResize(allValues.width, allValues.height);
+				return;
+			}
+			if (changedKey === 'angle') {
+				this.canvasRef.handler.rotate(allValues.angle);
+				return;
+			}
+			if (changedKey === 'locked') {
+				this.canvasRef.handler.setObject({
+					lockMovementX: changedValue,
+					lockMovementY: changedValue,
+					hasControls: !changedValue,
+					hoverCursor: changedValue ? 'pointer' : 'move',
+					editable: !changedValue,
+					locked: changedValue,
+				});
+				return;
+			}
+			if (changedKey === 'file' || changedKey === 'src' || changedKey === 'code') {
+				if (selectedItem.type === 'image') {
+					this.canvasRef.handler.setImageById(selectedItem.id, changedValue);
+				} else if (selectedItem.superType === 'element') {
+					this.canvasRef.handler.elementHandler.setById(selectedItem.id, changedValue);
+				}
+				return;
+			}
+			if (changedKey === 'link') {
+				const link = Object.assign({}, defaultOption.link, allValues.link);
+				this.canvasRef.handler.set(changedKey, link);
+				return;
+			}
+			if (changedKey === 'tooltip') {
+				const tooltip = Object.assign({}, defaultOption.tooltip, allValues.tooltip);
+				this.canvasRef.handler.set(changedKey, tooltip);
+				return;
+			}
+			if (changedKey === 'animation') {
+				const animation = Object.assign({}, defaultOption.animation, allValues.animation);
+				this.canvasRef.handler.set(changedKey, animation);
+				return;
+			}
+			if (changedKey === 'icon') {
+				const { unicode, styles } = changedValue[Object.keys(changedValue)[0]];
+				const uni = parseInt(unicode, 16);
+				if (styles[0] === 'brands') {
+					this.canvasRef.handler.set('fontFamily', 'Font Awesome 5 Brands');
+				} else if (styles[0] === 'regular') {
+					this.canvasRef.handler.set('fontFamily', 'Font Awesome 5 Regular');
+				} else {
+					this.canvasRef.handler.set('fontFamily', 'Font Awesome 5 Free');
+				}
+				this.canvasRef.handler.set('text', String.fromCodePoint(uni));
+				this.canvasRef.handler.set('icon', changedValue);
+				return;
+			}
+			if (changedKey === 'shadow') {
+				if (allValues.shadow.enabled) {
+					if ('blur' in allValues.shadow) {
+						this.canvasRef.handler.setShadow(allValues.shadow);
+					} else {
+						this.canvasRef.handler.setShadow({
+							enabled: true,
+							blur: 15,
+							offsetX: 10,
+							offsetY: 10,
+						});
+					}
+				} else {
+					this.canvasRef.handler.setShadow(null);
+				}
+				return;
+			}
+			if (changedKey === 'fontWeight') {
+				this.canvasRef.handler.set(changedKey, changedValue ? 'bold' : 'normal');
+				return;
+			}
+			if (changedKey === 'fontStyle') {
+				this.canvasRef.handler.set(changedKey, changedValue ? 'italic' : 'normal');
+				return;
+			}
+			if (changedKey === 'textAlign') {
+				this.canvasRef.handler.set(changedKey, Object.keys(changedValue)[0]);
+				return;
+			}
+			if (changedKey === 'trigger') {
+				const trigger = Object.assign({}, defaultOption.trigger, allValues.trigger);
+				this.canvasRef.handler.set(changedKey, trigger);
+				return;
+			}
+			if (changedKey === 'filters') {
+				const filterKey = Object.keys(changedValue)[0];
+				const filterValue = allValues.filters[filterKey];
+				if (filterKey === 'gamma') {
+					const rgb = [filterValue.r, filterValue.g, filterValue.b];
+					this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey].enabled, {
+						gamma: rgb,
+					});
+					return;
+				}
+				if (filterKey === 'brightness') {
+					this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey].enabled, {
+						brightness: filterValue.brightness,
+					});
+					return;
+				}
+				if (filterKey === 'contrast') {
+					this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey].enabled, {
+						contrast: filterValue.contrast,
+					});
+					return;
+				}
+				if (filterKey === 'saturation') {
+					this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey].enabled, {
+						saturation: filterValue.saturation,
+					});
+					return;
+				}
+				if (filterKey === 'hue') {
+					this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey].enabled, {
+						rotation: filterValue.rotation,
+					});
+					return;
+				}
+				if (filterKey === 'noise') {
+					this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey].enabled, {
+						noise: filterValue.noise,
+					});
+					return;
+				}
+				if (filterKey === 'pixelate') {
+					this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey].enabled, {
+						blocksize: filterValue.blocksize,
+					});
+					return;
+				}
+				if (filterKey === 'blur') {
+					this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey].enabled, {
+						value: filterValue.value,
+					});
+					return;
+				}
+				this.canvasRef.handler.imageHandler.applyFilterByType(filterKey, changedValue[filterKey]);
+				return;
+			}
+			if (changedKey === 'chartOption') {
+				try {
+					const sandbox = new SandBox();
+					const compiled = sandbox.compile(changedValue);
+					const { animations, styles } = this.state;
+					const chartOption = compiled(3, animations, styles, selectedItem.userProperty);
+					selectedItem.setChartOptionStr(changedValue);
+					this.canvasRef.handler.elementHandler.setById(selectedItem.id, chartOption);
+				} catch (error) {
+					console.error(error);
+				}
+				return;
+			}
+			this.canvasRef.handler.set(changedKey, changedValue);
+		},
+		onChangeWokarea: (changedKey, changedValue, allValues) => {
+			if (changedKey === 'layout') {
+				this.canvasRef.handler.workareaHandler.setLayout(changedValue);
+				return;
+			}
+			if (changedKey === 'file' || changedKey === 'src') {
+				this.canvasRef.handler.workareaHandler.setImage(changedValue);
+				return;
+			}
+			if (changedKey === 'width' || changedKey === 'height') {
+				this.canvasRef.handler.originScaleToResize(
+					this.canvasRef.handler.workarea,
+					allValues.width,
+					allValues.height,
+				);
+				this.canvasRef.canvas.centerObject(this.canvasRef.handler.workarea);
+				return;
+			}
+			this.canvasRef.handler.workarea.set(changedKey, changedValue);
+			this.canvasRef.canvas.requestRenderAll();
+		},
+		onTooltip: (ref, target) => {
+			const value = Math.random() * 10 + 1;
+			return (
+				<div>
+					<div>
+						<div>
+							<Button>{target.id}</Button>
+						</div>
+						<Badge count={value} />
+					</div>
+				</div>
+			);
+		},
+		onClick: (canvas, target) => {
+			const { link } = target;
+			if (link.state === 'current') {
+				document.location.href = link.url;
+				return;
+			}
+			window.open(link.url);
+		},
+		onContext: (ref, event, target) => {
+			if ((target && target.id === 'workarea') || !target) {
+				const { layerX: left, layerY: top } = event;
+				return (
+					<Menu>
+						<Menu.SubMenu key="add" style={{ width: 120 }} title={i18n.t('action.add')}>
+							{this.transformList().map(item => {
+								const option = Object.assign({}, item.option, { left, top });
+								const newItem = Object.assign({}, item, { option });
+								return (
+									<Menu.Item style={{ padding: 0 }} key={item.name}>
+										{this.itemsRef.renderItem(newItem, false)}
+									</Menu.Item>
+								);
+							})}
+						</Menu.SubMenu>
+					</Menu>
+				);
+			}
+			if (target.type === 'activeSelection') {
+				return (
+					<Menu>
+						<Menu.Item
+							onClick={() => {
+								this.canvasRef.handler.toGroup();
+							}}
+						>
+							{i18n.t('action.object-group')}
+						</Menu.Item>
+						<Menu.Item
+							onClick={() => {
+								this.canvasRef.handler.duplicate();
+							}}
+						>
+							{i18n.t('action.clone')}
+						</Menu.Item>
+						<Menu.Item
+							onClick={() => {
+								this.canvasRef.handler.remove();
+							}}
+						>
+							{i18n.t('action.delete')}
+						</Menu.Item>
+					</Menu>
+				);
+			}
+			if (target.type === 'group') {
+				return (
+					<Menu>
+						<Menu.Item
+							onClick={() => {
+								this.canvasRef.handler.toActiveSelection();
+							}}
+						>
+							{i18n.t('action.object-ungroup')}
+						</Menu.Item>
+						<Menu.Item
+							onClick={() => {
+								this.canvasRef.handler.duplicate();
+							}}
+						>
+							{i18n.t('action.clone')}
+						</Menu.Item>
+						<Menu.Item
+							onClick={() => {
+								this.canvasRef.handler.remove();
+							}}
+						>
+							{i18n.t('action.delete')}
+						</Menu.Item>
+					</Menu>
+				);
+			}
+			return (
+				<Menu>
+					<Menu.Item
+						onClick={() => {
+							this.canvasRef.handler.duplicateById(target.id);
+						}}
+					>
+						{i18n.t('action.clone')}
+					</Menu.Item>
+					<Menu.Item
+						onClick={() => {
+							this.canvasRef.handler.removeById(target.id);
+						}}
+					>
+						{i18n.t('action.delete')}
+					</Menu.Item>
+				</Menu>
+			);
+		},
+		onTransaction: transaction => {
+			this.forceUpdate();
+		},
+	};
+
+	handlers = {
+		onChangePreview: checked => {
+			let data;
+			if (this.canvasRef) {
+				data = this.canvasRef.handler.exportJSON().filter(obj => {
+					if (!obj.id) {
+						return false;
+					}
+					return true;
+				});
+			}
+			this.setState({
+				preview: typeof checked === 'object' ? false : checked,
+				objects: data,
+			});
+		},
+		onProgress: progress => {
+			this.setState({
+				progress,
+			});
+		},
+		onImport: files => {
+			console.log(files,'onImport_files')
+			if (files) {
+				this.showLoading(true);
+				setTimeout(() => {
+					const reader = new FileReader();
+					reader.onprogress = e => {
+						if (e.lengthComputable) {
+							const progress = parseInt((e.loaded / e.total) * 100, 10);
+							this.handlers.onProgress(progress);
+						}
+					};
+					reader.onload = e => {
+						const { objects, animations, styles, dataSources } = JSON.parse(e.target.result);
+						this.setState({
+							animations,
+							styles,
+							dataSources,
+						});
+						if (objects) {
+							this.canvasRef.handler.clear(true);
+							const data = objects.filter(obj => {
+								if (!obj.id) {
+									return false;
+								}
+								return true;
+							});
+							this.canvasRef.handler.importJSON(data);
+						}
+					};
+					reader.onloadend = () => {
+						this.showLoading(false);
+					};
+					reader.onerror = () => {
+						this.showLoading(false);
+					};
+					reader.readAsText(files[0]);
+				}, 500);
+			}
+		},
+		onUpload: () => {
+			const inputEl = document.createElement('input');
+			inputEl.accept = '.json';
+			inputEl.type = 'file';
+			inputEl.hidden = true;
+			inputEl.onchange = e => {
+				this.handlers.onImport(e.target.files);
+			};
+			document.body.appendChild(inputEl); // required for firefox
+			inputEl.click();
+			inputEl.remove();
+		},
+		onUploadTest: () => {
+			const { objects, animations, styles, dataSources } = json1;
+			this.setState({
+				animations,
+				styles,
+				dataSources,
+			});
+			if (objects) {
+				this.canvasRef.handler.clear(true);
+				const data = objects.filter(obj => {
+					if (!obj.id) {
+						return false;
+					}
+					return true;
+				});
+				this.canvasRef.handler.importJSON(data);
+			}
+			// const inputEl = document.createElement('input');
+			// inputEl.accept = '.json';
+			// inputEl.type = 'file';
+			// inputEl.hidden = true;
+			// inputEl.onchange = e => {
+			// 	console.log(e,'onUploadTest_e')
+			// 	this.handlers.onImport(e.target.files);
+			// };
+			// document.body.appendChild(inputEl); // required for firefox
+			// inputEl.click();
+			// inputEl.remove();
+		},
+		onDownload: () => {
+			this.showLoading(true);
+			const objects = this.canvasRef.handler.exportJSON().filter(obj => {
+				if (!obj.id) {
+					return false;
+				}
+				return true;
+			});
+			const { animations, styles, dataSources } = this.state;
+			const exportDatas = {
+				objects,
+				animations,
+				styles,
+				dataSources,
+			};
+			const anchorEl = document.createElement('a');
+			anchorEl.href = `data:text/json;charset=utf-8,${encodeURIComponent(
+				JSON.stringify(exportDatas, null, '\t'),
+			)}`;
+			anchorEl.download = `${this.canvasRef.handler.workarea.name || 'sample'}.json`;
+			document.body.appendChild(anchorEl); // required for firefox
+			anchorEl.click();
+			anchorEl.remove();
+			this.showLoading(false);
+		},
+		onChangeAnimations: animations => {
+			if (!this.state.editing) {
+				this.changeEditing(true);
+			}
+			this.setState({
+				animations,
+			});
+		},
+		onChangeStyles: styles => {
+			if (!this.state.editing) {
+				this.changeEditing(true);
+			}
+			this.setState({
+				styles,
+			});
+		},
+		onChangeDataSources: dataSources => {
+			if (!this.state.editing) {
+				this.changeEditing(true);
+			}
+			this.setState({
+				dataSources,
+			});
+		},
+		onSaveImage: () => {
+			this.canvasRef.handler.saveCanvasImage();
+		},
+	};
+
+	transformList = () => {
+		return Object.values(this.state.descriptors).reduce((prev, curr) => prev.concat(curr), []);
+	};
+
+	showLoading = loading => {
+		this.setState({
+			loading,
+		});
+	};
+
+	changeEditing = editing => {
+		this.setState({
+			editing,
+		});
+	};
+
+	render() {
+		const {
+			preview,
+			selectedItem,
+			zoomRatio,
+			loading,
+			progress,
+			animations,
+			styles,
+			dataSources,
+			editing,
+			descriptors,
+			objects,
+		} = this.state;
+		const {
+			onAdd,
+			onRemove,
+			onSelect,
+			onModified,
+			onChange,
+			onZoom,
+			onTooltip,
+			onClick,
+			onContext,
+			onTransaction,
+		} = this.canvasHandlers;
+		const {
+			onChangePreview,
+			onDownload,
+			onUpload,
+			onUploadTest,
+			onChangeAnimations,
+			onChangeStyles,
+			onChangeDataSources,
+			onSaveImage,
+		} = this.handlers;
+		// 操作栏
+		const action = (
+			<React.Fragment>
+				<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						icon="object-group"
+						tooltipTitle={'矩形文字'}
+						tooltipPlacement="bottomRight"
+						onClick={onUploadTest}
+					/>
+				<CommonButton
+					className="rde-action-btn"
+					shape="circle"
+					icon="file-download"
+					disabled={!editing}
+					tooltipTitle={i18n.t('action.download')}
+					onClick={onDownload}
+					tooltipPlacement="bottomRight"
+				/>
+				{editing ? (
+					<Popconfirm
+						title={i18n.t('imagemap.imagemap-editing-confirm')}
+						okText={i18n.t('action.ok')}
+						cancelText={i18n.t('action.cancel')}
+						onConfirm={onUpload}
+						placement="bottomRight"
+					>
+						<CommonButton
+							className="rde-action-btn"
+							shape="circle"
+							icon="file-upload"
+							tooltipTitle={i18n.t('action.upload')}
+							tooltipPlacement="bottomRight"
+						/>
+					</Popconfirm>
+				) : (
+					<CommonButton
+						className="rde-action-btn"
+						shape="circle"
+						icon="file-upload"
+						tooltipTitle={i18n.t('action.upload')}
+						tooltipPlacement="bottomRight"
+						onClick={onUpload}
+					/>
+				)}
+				<CommonButton
+					className="rde-action-btn"
+					shape="circle"
+					icon="image"
+					tooltipTitle={i18n.t('action.image-save')}
+					onClick={onSaveImage}
+					tooltipPlacement="bottomRight"
+				/>
+			</React.Fragment>
+		);
+		const titleContent = (
+			<React.Fragment>
+				<span>{i18n.t('imagemap.imagemap-editor')}</span>
+			</React.Fragment>
+		);
+		const title = <ImageMapTitle title={titleContent} action={action} />;
+		const content = (
+			<div className="rde-editor">
+				<ImageMapItems
+					ref={c => {
+						this.itemsRef = c;
+					}}
+					canvasRef={this.canvasRef}
+					descriptors={descriptors}
+				/>
+				<div className="rde-editor-canvas-container">
+					<div className="rde-editor-header-toolbar">
+						<ImageMapHeaderToolbar
+							canvasRef={this.canvasRef}
+							selectedItem={selectedItem}
+							onSelect={onSelect}
+						/>
+					</div>
+					<div
+						ref={c => {
+							this.container = c;
+						}}
+						className="rde-editor-canvas"
+					>
+						<Canvas
+							ref={c => {
+								this.canvasRef = c;
+							}}
+							className="rde-canvas"
+							minZoom={1}
+							maxZoom={500}
+							objectOption={defaultOption}
+							propertiesToInclude={propertiesToInclude}
+							onModified={onModified}
+							onAdd={onAdd}
+							onRemove={onRemove}
+							onSelect={onSelect}
+							onZoom={onZoom}
+							onTooltip={onTooltip}
+							onClick={onClick}
+							onContext={onContext}
+							onTransaction={onTransaction}
+							keyEvent={{
+								transaction: true,
+							}}
+							canvasOption={{
+								selectionColor: 'rgba(8, 151, 156, 0.3)',
+							}}
+						/>
+					</div>
+					<div className="rde-editor-footer-toolbar">
+						<ImageMapFooterToolbar
+							canvasRef={this.canvasRef}
+							preview={preview}
+							onChangePreview={onChangePreview}
+							zoomRatio={zoomRatio}
+						/>
+					</div>
+				</div>
+				<ImageMapConfigurations
+					canvasRef={this.canvasRef}
+					onChange={onChange}
+					selectedItem={selectedItem}
+					onChangeAnimations={onChangeAnimations}
+					onChangeStyles={onChangeStyles}
+					onChangeDataSources={onChangeDataSources}
+					animations={animations}
+					styles={styles}
+					dataSources={dataSources}
+				/>
+				<ImageMapPreview
+					preview={preview}
+					onChangePreview={onChangePreview}
+					onTooltip={onTooltip}
+					onClick={onClick}
+					objects={objects}
+				/>
+			</div>
+		);
+		return <Content title={title} content={content} loading={loading} className="" />;
+	}
+}
+
+export default ImageMapEditor;
diff --git a/src/pages/Fabric/ImageMapEditor/index1.tsx b/src/pages/Fabric/ImageMapEditor/index1.tsx
new file mode 100644
index 0000000..b7cdc47
--- /dev/null
+++ b/src/pages/Fabric/ImageMapEditor/index1.tsx
@@ -0,0 +1,318 @@
+import { useUuid } from '@/hooks/useUuid';
+import { ProCard } from '@ant-design/pro-components';
+import { useIntl } from '@umijs/max';
+import { Button } from 'antd';
+import React, { useEffect, useRef, useState } from 'react';
+// import Canvas from '../canvas/Canvas';
+import { currJson1 } from '@/testData/fabricGroup1';
+import { bgImageData } from '@/testData/testSvg';
+import { fabric } from 'fabric';
+import { ColumnDrawer } from './ColumnDrawer';
+// import CustomCanvas from '../canvas/CustomCanvas';
+// static data
+const propertiesToInclude = [
+  'id',
+  'name',
+  'locked',
+  'file',
+  'src',
+  'link',
+  'tooltip',
+  'animation',
+  'layout',
+  'workareaWidth',
+  'workareaHeight',
+  'videoLoadType',
+  'autoplay',
+  'shadow',
+  'muted',
+  'loop',
+  'code',
+  'icon',
+  'userProperty',
+  'trigger',
+  'configuration',
+  'superType',
+  'points',
+  'svg',
+  'loadType',
+];
+
+// 右侧展示栏
+const defaultOption = {
+  // 动画
+  animation: {
+    type: 'none',
+    loop: true,
+    autoplay: true,
+    duration: 1000,
+  },
+  // 用户属性
+  userProperty: {},
+};
+
+export const ModelCategoryColumns = [
+  {
+    title: '模型id',
+    dataIndex: 'modelId',
+  },
+  {
+    title: '模型状态',
+    dataIndex: 'label',
+  },
+  {
+    title: '模型名称',
+    dataIndex: 'des',
+  },
+];
+const ImageMapEditor: React.FC = () => {
+  const intl = useIntl();
+
+  const canvasRef = useRef(null);
+  const itemsRef = useRef(null);
+  const [cvs, setCanvas] = useState(null);
+  const [descriptors, setDescriptors] = useState<Record<string, any>>({});
+  const [category_fk_id_open, set_category_fk_id_open] = useState(false);
+  const [currentModelUserProperty, setCurrentModelUserProperty] = useState<Record<string, any>>({});
+
+  const [changeId, setChangeId] = useState<string[]>([]);
+
+  const [clipPathData, setClipPathData] = useState({
+    width: 1200, // 宽
+    height: 900, // 高
+  });
+  const [jsonData, setJsonData] = useState<Record<string, any>>({});
+
+  /*test */
+  const { fetchUuid } = useUuid();
+
+  function changeModelStatus() {
+    setChangeId(['2', '3']);
+  }
+
+  const handle_category_fk_id = (id: any) => {
+    if (category_fk_id_open) {
+      set_category_fk_id_open(false);
+    }
+  };
+
+  useEffect(() => {
+    const canvasObject = new fabric.Canvas(canvasRef.current);
+    canvasObject.setBackgroundImage(bgImageData.src, canvasObject.renderAll.bind(canvasObject), {
+      width: clipPathData.width,
+      height: clipPathData.height,
+      originX: 'left',
+      originY: 'top',
+    });
+    canvasObject.loadFromJSON(JSON.stringify(currJson1), () => {
+      canvasObject.renderAll();
+      // const groupObjectList = canvasObject.getObjects()
+
+      // const groupObject = canvasObject.getObjects()[0];
+
+      // 选中组合对象
+      // console.log(groupObject, 'groupObject', canvasObject.getObjects());
+      // 注册事件监听器
+      canvasObject.on('mouse:up', (event) => {
+        // 获取事件的目标对象
+        const targetObject = event.target;
+        // 检查目标对象是否为组合对象
+        if (targetObject && targetObject?.userProperty) {
+          console.log('Group selected:', targetObject);
+          setCurrentModelUserProperty(targetObject.userProperty);
+          set_category_fk_id_open(true);
+          // canvasObject.setActiveObject(groupObject);
+          // canvasObject.requestRenderAll();
+          // 在这里可以执行你想要的操作
+          // 添加缩放动画
+          // targetObject.animate('scaleX', '+=0.1', {
+          //   duration: 500, // 动画持续时间,单位毫秒
+          //   onChange: canvasObject.renderAll.bind(canvasObject), // 在动画过程中实时渲染画布
+          //   onComplete: () => {
+          //     console.log('Animation complete!');
+          //     // 在动画完成后执行其他操作
+          //   },
+          // });
+          // targetObject.animate('scaleY', '+=0.1', {
+          //   duration: 500, // 动画持续时间,单位毫秒
+          //   onChange: canvasObject.renderAll.bind(canvasObject), // 在动画过程中实时渲染画布
+          //   onComplete: () => {
+          //     console.log('Animation complete!');
+          //     // 在动画完成后执行其他操作
+          //   },
+          // });
+        }
+      });
+
+      
+    // 设置目标的速度和方向
+    const velocity = {
+      // scaleX: 0.1, // 0 ~ 1
+      // scaleY: 0.1, // 0 ~ 1
+      opacity: 0.1, // 0 ~ 1
+    };
+
+
+      function animate() {
+        canvasObject
+          .getObjects()
+          .concat()
+          .forEach(function (obj) {
+            obj.opacity += velocity.opacity;
+
+            if( obj.opacity <= 0.5 ||  obj.opacity >= 1){
+              velocity.opacity = -velocity.opacity;
+            }
+            // obj.rotate(obj.get('angle') + 1);
+            // 位移   
+            // obj.left += velocity.x;
+            // obj.top += velocity.y;
+            // // 碰撞检测
+            // if (obj.left <= 0 || obj.left + obj.width >= clipPathData.width) {
+            //   velocity.x = -velocity.x; // 水平方向反弹
+            // }
+  
+            // if (obj.top <= 0 || obj.top + obj.height >= clipPathData.height) {
+            //   velocity.y = -velocity.y; // 垂直方向反弹
+            // }x
+            //   if (obj.left > 900 || obj.left < -100 || obj.top > 500) {
+            //     newCanvas.remove(obj);
+            //   }
+            //   else {
+            //   }
+          });
+          canvasObject.renderAll();
+        fabric.util.requestAnimFrame(animate);
+      }
+      // setTimeout(() => {
+      //   fabric.util.requestAnimFrame(animate);
+      // }, 1000);
+
+      if (changeId && changeId.length) {
+        canvasObject
+          .getObjects().forEach(item=>{
+            if(changeId.includes(item?.userProperty?.id) ){
+              const groupObject = item
+               // 选中组合对象
+        // canvasObject.setActiveObject(groupObject); // 可以改变 selectable 值
+        canvasObject.requestRenderAll();
+        // 获取组合对象中的子对象
+        const objectsInGroup = groupObject.getObjects();
+        // 遍历子对象找到要修改的子对象
+        const objectToModify = objectsInGroup.find((obj) => obj.get('type') === 'circle');
+        const objectToModify2 = objectsInGroup.find((obj) => obj.get('type') === 'i-text');
+        //
+        if (groupObject?.userProperty) {
+          groupObject.set({
+            userProperty: {
+              ...groupObject?.userProperty,
+              status: '1',
+            },
+          });
+        }
+
+        // 修改子对象的属性
+        if (objectToModify) {
+          objectToModify.set({
+            fill: 'rgba(248,9,3,0.94)',
+            stroke: 'rgba(255,243,47,1)',
+            // height: 60,
+            // 添加其他属性...
+          });
+          // 重新渲染Canvas
+          canvasObject.renderAll();
+        }
+        if (objectToModify2) {
+          objectToModify2.set({
+            text: '警告',
+          });
+          // 重新渲染Canvas
+          canvasObject.renderAll();
+        }
+            }
+          })
+        // 获取组合对象(选中目标对象)
+        // const groupObject = canvasObject
+        //   .getObjects()
+        //   .find((item) => item?.userProperty?.id === changeId);
+        // console.log(groupObject, 'groupObject', canvasObject.getObjects());
+       
+      }
+
+      // 获取组合对象中的属性
+      //   const properties = groupObject.getObjects().map(obj => {
+      // 	return {
+      // 	  type: obj.get('type'),
+      // 	  width: obj.get('width'),
+      // 	  height: obj.get('height'),
+      // 	  fill: obj.get('fill'),
+      // 	  left: obj.get('left'),
+      // 	  top: obj.get('top')
+      // 	  // 添加其他属性...
+      // 	};
+      //   });
+
+      //   console.log('Properties of the selected group:', properties);
+    });
+    return () => {
+      canvasObject.dispose();
+    };
+  }, [changeId]);
+
+  useEffect(() => {
+    // TODO_3 需要加个loading效果
+    import('./Descriptors.json').then((descriptors) => {
+      setDescriptors(descriptors);
+    });
+    console.log(fetchUuid(), 'fetchUuid');
+  }, []);
+
+  return (
+    <ProCard
+      gutter={24}
+      extra={
+        <>
+          <Button type="primary" onClick={changeModelStatus}>
+            切换状态
+          </Button>
+        </>
+      }
+    >
+      {/* <ProCard colSpan={4}>
+        <ImageMapItems ref={itemsRef} canvasRef={canvasRef} descriptors={descriptors} />
+      </ProCard> */}
+      <ProCard colSpan={24} style={{ padding: 0, margin: 0 }} bodyStyle={{ padding: 0, margin: 0 }}>
+        <canvas
+          id={`canvas_${fetchUuid()}`}
+          ref={canvasRef}
+          {...clipPathData}
+          style={{ border: '1px dashed #eee' }}
+        ></canvas>
+        {/* <CustomCanvas ref={canvasRef} jsonData={jsonData} ></CustomCanvas> */}
+        {/* <Canvas
+          ref={canvasRef}
+          className="rde-canvas"
+          minZoom={1}
+          maxZoom={500}
+          propertiesToInclude={propertiesToInclude}
+          keyEvent={{
+            transaction: true,
+          }}
+          canvasOption={{
+            selectionColor: 'rgba(8, 151, 156, 0.3)',
+          }}
+        /> */}
+      </ProCard>
+
+      <ColumnDrawer
+        handleDrawer={handle_category_fk_id}
+        isShowDetail={category_fk_id_open}
+        columns={ModelCategoryColumns}
+        currentRow={currentModelUserProperty}
+      />
+    </ProCard>
+    // 属性预览
+  );
+};
+
+export default ImageMapEditor;
diff --git a/src/pages/Fabric/canvas/Canvas.tsx b/src/pages/Fabric/canvas/Canvas.tsx
new file mode 100644
index 0000000..bae3eb4
--- /dev/null
+++ b/src/pages/Fabric/canvas/Canvas.tsx
@@ -0,0 +1,200 @@
+import { useUuid } from '@/hooks/useUuid';
+import { fabric } from 'fabric';
+import React, { Component, useRef } from 'react';
+// import ResizeObserver from 'resize-observer-polyfill';
+import { defaults } from './constants';
+import Handler, { HandlerOptions } from './handlers/Handler';
+import './styles/canvas.less';
+import './styles/contextmenu.less';
+import './styles/fabricjs.less';
+import './styles/tooltip.less';
+import { FabricCanvas } from './utils';
+
+// eslint-disable-next-line react-hooks/rules-of-hooks
+
+export interface CanvasInstance {
+  handler: Handler;
+  canvas: FabricCanvas;
+  container: HTMLDivElement;
+}
+
+export type CanvasProps = HandlerOptions & {
+  responsive?: boolean;
+  style?: React.CSSProperties;
+};
+
+interface IState {
+  id: string;
+  loaded: boolean;
+}
+
+class InternalCanvas extends Component<CanvasProps, IState> implements CanvasInstance {
+  public handler!: Handler;
+  public canvas!: FabricCanvas;
+  public container!: HTMLDivElement;
+  private containerRef = React.createRef<HTMLDivElement>();
+  //   private resizeObserver!: ResizeObserver;
+
+  static defaultProps: CanvasProps = {
+    id: useUuid().fetchUuid(),
+    editable: true,
+    zoomEnabled: true,
+    minZoom: 30,
+    maxZoom: 300,
+    responsive: true,
+    width: 0,
+    height: 0,
+  };
+
+  state: IState = {
+    id: useUuid().fetchUuid(),
+    loaded: false,
+  };
+
+  componentDidMount() {
+    // eslint-disable-next-line @typescript-eslint/no-unused-vars
+    const { editable, canvasOption, width, height, responsive, ...other } = this.props;
+    const { id } = this.state;
+    const mergedCanvasOption = Object.assign({}, defaults.canvasOption, canvasOption, {
+      width,
+      height,
+      selection:
+        (typeof canvasOption?.selection !== 'undefined' && canvasOption?.selection) || editable,
+    });
+    this.canvas = new fabric.Canvas(`canvas_${id}`, mergedCanvasOption);
+    this.canvas.setBackgroundColor(
+      mergedCanvasOption.backgroundColor,
+      this.canvas.renderAll.bind(this.canvas),
+    );
+    this.canvas.renderAll();
+    this.container = this.containerRef.current;
+    this.handler = new Handler({
+      id,
+      width,
+      height,
+      editable,
+      canvas: this.canvas,
+      container: this.containerRef.current,
+      canvasOption: mergedCanvasOption,
+      ...other,
+    });
+    if (this.props.responsive) {
+      //   this.createObserver();
+    } else {
+      this.handleLoad();
+    }
+  }
+
+  componentDidUpdate(prevProps: CanvasProps) {
+    if (this.props.width !== prevProps.width || this.props.height !== prevProps.height) {
+      this.handler.eventHandler.resize(this.props.width, this.props.height);
+    }
+    if (this.props.editable !== prevProps.editable) {
+      this.handler.editable = this.props.editable;
+    }
+    if (this.props.responsive !== prevProps.responsive) {
+      //   if (!this.props.responsive) {
+      //     this.destroyObserver();
+      //   } else {
+      //     this.destroyObserver();
+      //     this.createObserver();
+      //   }
+    }
+    if (JSON.stringify(this.props.canvasOption) !== JSON.stringify(prevProps.canvasOption)) {
+      this.handler.setCanvasOption(this.props.canvasOption);
+    }
+    if (JSON.stringify(this.props.keyEvent) !== JSON.stringify(prevProps.keyEvent)) {
+      this.handler.setKeyEvent(this.props.keyEvent);
+    }
+    if (JSON.stringify(this.props.fabricObjects) !== JSON.stringify(prevProps.fabricObjects)) {
+      this.handler.setFabricObjects(this.props.fabricObjects);
+    }
+    if (JSON.stringify(this.props.workareaOption) !== JSON.stringify(prevProps.workareaOption)) {
+      this.handler.setWorkareaOption(this.props.workareaOption);
+    }
+    if (JSON.stringify(this.props.guidelineOption) !== JSON.stringify(prevProps.guidelineOption)) {
+      this.handler.setGuidelineOption(this.props.guidelineOption);
+    }
+    if (JSON.stringify(this.props.objectOption) !== JSON.stringify(prevProps.objectOption)) {
+      this.handler.setObjectOption(this.props.objectOption);
+    }
+    if (JSON.stringify(this.props.gridOption) !== JSON.stringify(prevProps.gridOption)) {
+      this.handler.setGridOption(this.props.gridOption);
+    }
+    if (
+      JSON.stringify(this.props.propertiesToInclude) !==
+      JSON.stringify(prevProps.propertiesToInclude)
+    ) {
+      this.handler.setPropertiesToInclude(this.props.propertiesToInclude);
+    }
+    if (
+      JSON.stringify(this.props.activeSelectionOption) !==
+      JSON.stringify(prevProps.activeSelectionOption)
+    ) {
+      this.handler.setActiveSelectionOption(this.props.activeSelectionOption);
+    }
+  }
+
+  componentWillUnmount() {
+    // this.destroyObserver();
+    this.handler.destroy();
+  }
+
+  //   createObserver = () => {
+  //     this.resizeObserver = new ResizeObserver((entries: ResizeObserverEntry[]) => {
+  //       const { width = 0, height = 0 } = (entries[0] && entries[0].contentRect) || {};
+  //       this.handler.eventHandler.resize(width, height);
+  //       if (!this.state.loaded) {
+  //         this.handleLoad();
+  //       }
+  //     });
+  //     this.resizeObserver.observe(this.containerRef.current);
+  //   };
+
+  //   destroyObserver = () => {
+  //     if (this.resizeObserver) {
+  //       this.resizeObserver.disconnect();
+  //       this.resizeObserver = null;
+  //     }
+  //   };
+
+  handleLoad = () => {
+    this.setState(
+      {
+        loaded: true,
+      },
+      () => {
+        if (this.props.onLoad) {
+          this.props.onLoad(this.handler, this.canvas);
+        }
+      },
+    );
+  };
+
+  render() {
+    const { style } = this.props;
+    const { id } = this.state;
+    return (
+      <div
+        ref={this.containerRef}
+        id={id}
+        className="rde-canvas"
+        style={{ width: '100%', height: '100%', ...style }}
+      >
+        <canvas id={`canvas_${id}`} />
+      </div>
+    );
+  }
+}
+
+const Canvas: React.FC<CanvasProps> = (props, ref) => {
+  const canvasRef = useRef<InternalCanvas>();
+  React.useImperativeHandle(ref, () => ({
+    handler: canvasRef.current.handler,
+    canvas: canvasRef.current.canvas,
+    container: canvasRef.current.container,
+  }));
+  return <InternalCanvas ref={canvasRef} {...props} />;
+};
+
+export default React.forwardRef<CanvasInstance, CanvasProps>(Canvas);
diff --git a/src/pages/Fabric/canvas/CanvasObject.ts b/src/pages/Fabric/canvas/CanvasObject.ts
new file mode 100644
index 0000000..705a7fd
--- /dev/null
+++ b/src/pages/Fabric/canvas/CanvasObject.ts
@@ -0,0 +1,104 @@
+import { PropTypes } from 'prop-types';
+import { fabric } from 'fabric';
+
+import {
+	Arrow,
+	Gif,
+	Element,
+	Iframe,
+	Video,
+	Node,
+	Link,
+	CurvedLink,
+	OrthogonalLink,
+	Line,
+	Cube,
+} from './objects';
+import { FabricObject } from './utils';
+import { Code } from './objects/Element';
+import Svg, { SvgOption } from './objects/Svg';
+
+export interface ObjectSchema {
+	create: (...option: any) => fabric.Object;
+}
+
+export interface CanvasObjectSchema {
+	[key: string]: ObjectSchema;
+}
+
+export const createCanvasObject = (objectSchema: CanvasObjectSchema) => objectSchema;
+
+const CanvasObject: CanvasObjectSchema = {
+	group: {
+		create: ({ objects, ...option }: { objects: FabricObject[] }) => new fabric.Group(objects, option),
+	},
+	'i-text': {
+		create: ({ text, ...option }: { text: string }) => new fabric.IText(text, option),
+	},
+	textbox: {
+		create: ({ text, ...option }: { text: string }) => new fabric.Textbox(text, option),
+	},
+	triangle: {
+		create: (option: any) => new fabric.Triangle(option),
+	},
+	circle: {
+		create: (option: any) => new fabric.Circle(option),
+	},
+	rect: {
+		create: (option: any) => new fabric.Rect(option),
+	},
+	cube: {
+		create: (option: any) => new Cube(option),
+	},
+	image: {
+		create: ({ element = new Image(), ...option }) =>
+			new fabric.Image(element, {
+				...option,
+				crossOrigin: 'anonymous',
+			}),
+	},
+	polygon: {
+		create: ({ points, ...option }: { points: any }) =>
+			new fabric.Polygon(points, {
+				...option,
+				perPixelTargetFind: true,
+			}),
+	},
+	line: {
+		create: ({ points, ...option }: { points: any }) => new Line(points, option),
+	},
+	arrow: {
+		create: ({ points, ...option }: { points: any }) => new Arrow(points, option),
+	},
+	element: {
+		create: ({ code, ...option }: { code: Code }) => new Element(code, option),
+	},
+	iframe: {
+		create: ({ src, ...option }: { src: string }) => new Iframe(src, option),
+	},
+	video: {
+		create: ({ src, file, ...option }: { src: string; file: File }) => new Video(src || file, option),
+	},
+	gif: {
+		create: (option: any) => new Gif(option),
+	},
+	node: {
+		create: (option: any) => new Node(option),
+	},
+	link: {
+		create: (fromNode, fromPort, toNode, toPort, option) => new Link(fromNode, fromPort, toNode, toPort, option),
+	},
+	curvedLink: {
+		create: (fromNode, fromPort, toNode, toPort, option) =>
+			new CurvedLink(fromNode, fromPort, toNode, toPort, option),
+	},
+	orthogonalLink: {
+		create: (fromNode, fromPort, toNode, toPort, option) =>
+			new OrthogonalLink(fromNode, fromPort, toNode, toPort, option),
+	},
+	svg: {
+		create: (option: SvgOption) => new Svg(option),
+	}
+};
+
+export default CanvasObject;
diff --git a/src/pages/Fabric/canvas/CustomCanvas.tsx b/src/pages/Fabric/canvas/CustomCanvas.tsx
new file mode 100644
index 0000000..131cd77
--- /dev/null
+++ b/src/pages/Fabric/canvas/CustomCanvas.tsx
@@ -0,0 +1,34 @@
+import React, { useRef, useEffect } from 'react';
+import { fabric } from 'fabric';
+// import { Fabric } from 'react-fabricjs';
+
+
+export type customCanvasProps = {
+  jsonData: Record<string,any>
+}
+
+const CustomCanvas: React.FC<customCanvasProps>  = ({ jsonData }) => {
+  const canvasRef = useRef(null);
+
+  useEffect(() => {
+    const canvas = new fabric.Canvas(canvasRef.current);
+
+    // 通过JSON数据创建Fabric对象
+    if (jsonData) {
+      canvas.loadFromJSON(jsonData, () => {
+        canvas.renderAll();
+      });
+    }
+
+    // 如果需要添加其他元素或者自定义操作,可以在这里进行
+
+    return () => {
+      // 在组件卸载时清理
+      canvas.dispose();
+    };
+  }, [jsonData]);
+
+  return <Fabric ref={canvasRef} />;
+};
+
+export default CustomCanvas;
diff --git a/src/pages/Fabric/canvas/constants/code.ts b/src/pages/Fabric/canvas/constants/code.ts
new file mode 100644
index 0000000..07813e0
--- /dev/null
+++ b/src/pages/Fabric/canvas/constants/code.ts
@@ -0,0 +1,19 @@
+export const ESCAPE = 'Escape';
+export const DELETE = 'Delete';
+export const BACKSPACE = 'Backspace';
+export const EQUAL = 'Equal';
+export const MINUS = 'Minus';
+export const KEY_A = 'KeyA';
+export const KEY_Q = 'KeyQ';
+export const KEY_W = 'KeyW';
+export const KEY_C = 'KeyC';
+export const KEY_V = 'KeyV';
+export const KEY_Z = 'KeyZ';
+export const KEY_Y = 'KeyY';
+export const KEY_O = 'KeyO';
+export const KEY_P = 'KeyP';
+export const KEY_X = 'KeyX';
+export const ARROW_UP = 'ArrowUp';
+export const ARROW_DOWN = 'ArrowDown';
+export const ARROW_LEFT = 'ArrowLeft';
+export const ARROW_RIGHT = 'ArrowRight';
diff --git a/src/pages/Fabric/canvas/constants/defaults.ts b/src/pages/Fabric/canvas/constants/defaults.ts
new file mode 100644
index 0000000..a2d5109
--- /dev/null
+++ b/src/pages/Fabric/canvas/constants/defaults.ts
@@ -0,0 +1,75 @@
+import { FabricObjectOption, WorkareaObject } from '../utils';
+
+export const canvasOption = {
+	preserveObjectStacking: true,
+	width: 300,
+	height: 150,
+	selection: true,
+	defaultCursor: 'default',
+	backgroundColor: '#f3f3f3',
+};
+
+export const keyEvent = {
+	move: true,
+	all: true,
+	copy: true,
+	paste: true,
+	esc: true,
+	del: true,
+	clipboard: false,
+	transaction: true,
+	zoom: true,
+	cut: true,
+	grab: true,
+};
+
+export const gridOption = {
+	enabled: false,
+	grid: 10,
+	snapToGrid: false,
+	lineColor: '#ebebeb',
+	borderColor: '#cccccc',
+};
+
+export const workareaOption: Partial<WorkareaObject> = {
+	width: 600,
+	height: 400,
+	workareaWidth: 600,
+	workareaHeight: 400,
+	lockScalingX: true,
+	lockScalingY: true,
+	scaleX: 1,
+	scaleY: 1,
+	backgroundColor: '#fff',
+	hasBorders: false,
+	hasControls: false,
+	selectable: false,
+	lockMovementX: true,
+	lockMovementY: true,
+	hoverCursor: 'default',
+	name: '',
+	id: 'workarea',
+	type: 'image',
+	layout: 'fixed', // fixed, responsive, fullscreen
+	link: {},
+	tooltip: {
+		enabled: false,
+	},
+	isElement: false,
+};
+
+export const objectOption: Partial<FabricObjectOption> = {
+	rotation: 0,
+	centeredRotation: true,
+	strokeUniform: true,
+};
+
+export const guidelineOption = {
+	enabled: true,
+};
+
+export const activeSelectionOption = {
+	hasControls: true,
+};
+
+export const propertiesToInclude = ['id', 'name', 'locked', 'editable'];
diff --git a/src/pages/Fabric/canvas/constants/index.ts b/src/pages/Fabric/canvas/constants/index.ts
new file mode 100644
index 0000000..4a28da5
--- /dev/null
+++ b/src/pages/Fabric/canvas/constants/index.ts
@@ -0,0 +1,4 @@
+import * as defaults from './defaults';
+import * as code from './code';
+
+export { defaults, code };
diff --git a/src/pages/Fabric/canvas/global.d.ts b/src/pages/Fabric/canvas/global.d.ts
new file mode 100644
index 0000000..68057ea
--- /dev/null
+++ b/src/pages/Fabric/canvas/global.d.ts
@@ -0,0 +1,62 @@
+// export {};
+
+type T = Window & typeof globalThis;
+
+declare module 'fabric/fabric-impl' {
+	// Common
+	class Gif {}
+	class Arrow {}
+	// Element
+	class Iframe {}
+	class Element {}
+	class Video {}
+	// Node
+	class Node {}
+	// Link
+	class Link {}
+	class CurvedLink {}
+	class OrthogonalLink {}
+	class Cube {}
+	// SVG
+	class Svg {}
+
+	interface ICreateProperties {
+		type: 'string';
+		initialize(options: any): void;
+		toObject?(propertiesToInclude: string[]): void;
+		_render?(ctx: CanvasRenderingContext2D): void;
+	}
+
+	interface IUtilClass {
+		/**
+		 * Helper for creation of "classes".
+		 * @param [parent] optional "Class" to inherit from
+		 * @param [properties] Properties shared by all instances of this class
+		 *                  (be careful modifying objects defined here as this would affect all instances)
+		 */
+		createClass(parent: any, properties?: ICreateProperties);
+	}
+
+	type IUtil = fabric.IUtil & IUtilClass;
+
+	export const util: IUtil;
+}
+
+declare global {
+	interface Window {
+		// gifler: any;
+		adsbygoogle: any;
+	}
+}
+
+declare class MediaElementPlayer {
+	constructor(
+		id: string,
+		options: {
+			pauseOtherPlayers: boolean;
+			videoWidth: string;
+			videoHeight: string;
+			success: (mediaeElement: any, originalNode: any, instance: any) => void;
+		},
+	);
+}
diff --git a/src/pages/Fabric/canvas/handlers/AlignmentHandler.ts b/src/pages/Fabric/canvas/handlers/AlignmentHandler.ts
new file mode 100644
index 0000000..909bb86
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/AlignmentHandler.ts
@@ -0,0 +1,63 @@
+import Handler from './Handler';
+
+class AlignmentHandler {
+    handler: Handler;
+    constructor(handler: Handler) {
+        this.handler = handler;
+    }
+
+    /**
+     * Align left at selection
+     */
+    public left = () => {
+        const activeObject = this.handler.canvas.getActiveObject();
+        if (activeObject && activeObject.type === 'activeSelection') {
+            const activeSelection = activeObject as fabric.ActiveSelection;
+            const activeObjectLeft = -(activeObject.width / 2);
+            activeSelection.forEachObject(obj => {
+                obj.set({
+                    left: activeObjectLeft,
+                });
+                obj.setCoords();
+                this.handler.canvas.renderAll();
+            });
+        }
+    }
+
+    /**
+     * Align center at selection
+     */
+    public center = () => {
+        const activeObject = this.handler.canvas.getActiveObject();
+        if (activeObject && activeObject.type === 'activeSelection') {
+            const activeSelection = activeObject as fabric.ActiveSelection;
+            activeSelection.forEachObject(obj => {
+                obj.set({
+                    left: 0 - ((obj.width * obj.scaleX) / 2),
+                });
+                obj.setCoords();
+                this.handler.canvas.renderAll();
+            });
+        }
+    }
+
+    /**
+     * Align right at selection
+     */
+    public right = () => {
+        const activeObject = this.handler.canvas.getActiveObject();
+        if (activeObject && activeObject.type === 'activeSelection') {
+            const activeSelection = activeObject as fabric.ActiveSelection;
+            const activeObjectLeft = (activeObject.width / 2);
+            activeSelection.forEachObject(obj => {
+                obj.set({
+                    left: activeObjectLeft - (obj.width * obj.scaleX),
+                });
+                obj.setCoords();
+                this.handler.canvas.renderAll();
+            });
+        }
+    }
+}
+
+export default AlignmentHandler;
diff --git a/src/pages/Fabric/canvas/handlers/AnimationHandler.ts b/src/pages/Fabric/canvas/handlers/AnimationHandler.ts
new file mode 100644
index 0000000..6468693
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/AnimationHandler.ts
@@ -0,0 +1,338 @@
+// import anime from 'animejs';
+import { message } from 'antd';
+import { Handler } from '.';
+import { FabricObject } from '../utils';
+
+class AnimationHandler {
+	handler: Handler;
+
+	constructor(handler: Handler) {
+		this.handler = handler;
+	}
+
+	/**
+	 * Play the animation
+	 * @param {string} id
+	 * @param {boolean} [hasControls]
+	 * @returns
+	 */
+	public play = (id: string, hasControls?: boolean) => {
+		const findObject = this.handler.findById(id);
+		if (!findObject) {
+			return;
+		}
+		if (findObject.anime) {
+			findObject.anime.restart();
+			return;
+		}
+		if (findObject.animation.type === 'none') {
+			return;
+		}
+		const instance = this.getAnime(findObject, hasControls);
+		if (instance) {
+			findObject.set('anime', instance);
+			findObject.set({
+				hasControls: false,
+				lockMovementX: true,
+				lockMovementY: true,
+				hoverCursor: 'pointer',
+			});
+			this.handler.canvas.requestRenderAll();
+			instance.play();
+		}
+	};
+
+	/**
+	 * Pause the animation
+	 * @param {string} id
+	 * @returns
+	 */
+	public pause = (id: string) => {
+		const findObject = this.handler.findById(id);
+		if (!findObject) {
+			return;
+		}
+		findObject.anime.pause();
+	};
+
+	/**
+	 * Stop the animation
+	 * @param {string} id
+	 * @param {boolean} [hasControls=true]
+	 * @returns
+	 */
+	public stop = (id: string, hasControls = true) => {
+		const findObject = this.handler.findById(id);
+		if (!findObject) {
+			return;
+		}
+		this.resetAnimation(findObject, hasControls);
+	};
+
+	/**
+	 * Restart the animation
+	 * @param {string} id
+	 * @returns
+	 */
+	public restart = (id: string) => {
+		const findObject = this.handler.findById(id);
+		if (!findObject) {
+			return;
+		}
+		if (!findObject.anime) {
+			return;
+		}
+		this.stop(id);
+		this.play(id);
+	};
+
+	/**
+	 * Reset animation
+	 *
+	 * @param {FabricObject} obj
+	 * @param {boolean} [hasControls=true]
+	 * @returns
+	 */
+	public resetAnimation = (obj: FabricObject, hasControls = true) => {
+		if (!obj.anime) {
+			return;
+		}
+		let option;
+		if (this.handler.editable) {
+			option = {
+				anime: null,
+				hasControls,
+				lockMovementX: !hasControls,
+				lockMovementY: !hasControls,
+				hoverCursor: hasControls ? 'move' : 'pointer',
+			};
+		} else {
+			option = {
+				anime: null,
+				hasControls: false,
+				lockMovementX: true,
+				lockMovementY: true,
+				hoverCursor: 'pointer',
+			};
+		}
+		anime.remove(obj);
+		const { type } = obj.animation;
+		if (type === 'fade') {
+			Object.assign(option, {
+				opacity: obj.originOpacity,
+				originOpacity: null,
+			});
+		} else if (type === 'bounce') {
+			if (obj.animation.bounce === 'vertical') {
+				Object.assign(option, {
+					top: obj.originTop,
+					originTop: null,
+				});
+			} else {
+				Object.assign(option, {
+					left: obj.originLeft,
+					originLeft: null,
+				});
+			}
+		} else if (type === 'shake') {
+			if (obj.animation.shake === 'vertical') {
+				Object.assign(option, {
+					top: obj.originTop,
+					originTop: null,
+				});
+			} else {
+				Object.assign(option, {
+					left: obj.originLeft,
+					originLeft: null,
+				});
+			}
+		} else if (type === 'scaling') {
+			Object.assign(option, {
+				scaleX: obj.originScaleX,
+				scaleY: obj.originScaleY,
+				originScaleX: null,
+				originScaleY: null,
+			});
+		} else if (type === 'rotation') {
+			Object.assign(option, {
+				angle: obj.originAngle,
+				rotation: obj.originAngle,
+				left: obj.originLeft,
+				top: obj.originTop,
+				originLeft: null,
+				originTop: null,
+				originAngle: null,
+			});
+		} else if (type === 'flash') {
+			if (obj.type === 'svg') {
+				(obj as fabric.Group)._objects.forEach(child =>
+					this.handler.setByPartial(child, {
+						fill: (child as FabricObject).originFill,
+						stroke: (child as FabricObject).originStroke,
+						originFill: null,
+						originStroke: null,
+					}),
+				);
+			}
+			Object.assign(option, {
+				fill: obj.originFill,
+				stroke: obj.originStroke,
+				originFill: null,
+				originStroke: null,
+			});
+		} else {
+			console.warn('Not supported type.');
+		}
+		obj.set(option);
+		this.handler.canvas.renderAll();
+	};
+
+	/**
+	 * Get animation option
+	 *
+	 * @param {FabricObject} obj
+	 * @param {boolean} [hasControls]
+	 * @returns
+	 */
+	getAnime = (obj: FabricObject, hasControls?: boolean) => {
+		const { delay = 0, duration = 100, autoplay = true, loop = true, type, ...other } = obj.animation;
+		const option: anime.AnimeParams = {
+			targets: obj,
+			delay,
+			loop,
+			autoplay,
+			duration,
+			direction: 'alternate',
+			begin: () => {
+				obj.set({
+					hasControls: false,
+					lockMovementX: true,
+					lockMovementY: true,
+					hoverCursor: 'pointer',
+				});
+				this.handler.canvas.requestRenderAll();
+			},
+			update: (instance: anime.AnimeInstance) => {
+				if (type === 'flash') {
+					// I don't know why it works. Magic code...
+					message.warning('instance.animations[0] undefined.');
+					message.warning('instance.animations[1] undefined.');
+					const fill = instance.animations[0]?.currentValue;
+					const stroke = instance.animations[1]?.currentValue;
+					if (obj.type === 'svg') {
+						obj.setFill(fill);
+						obj.setStroke(stroke);
+					} else {
+						obj.set('fill', '');
+						obj.set('fill', fill);
+						obj.set('stroke', stroke);
+					}
+				} else if (type === 'rotation') {
+					let angle = instance.animations[0].currentValue as string | number;
+					if (typeof angle === 'string') {
+						angle = parseInt(angle, 10);
+					}
+					obj.rotate(angle);
+					this.handler.canvas.requestRenderAll();
+					return;
+				}
+				obj.setCoords();
+				this.handler.canvas.requestRenderAll();
+			},
+			complete: () => {
+				this.resetAnimation(obj, hasControls);
+			},
+		};
+		if (type === 'fade') {
+			const { opacity = 0 } = other;
+			obj.set('originOpacity', obj.opacity);
+			Object.assign(option, {
+				opacity,
+				easing: 'easeInQuad',
+			});
+		} else if (type === 'bounce') {
+			const { offset = 1 } = other;
+			if (other.bounce === 'vertical') {
+				obj.set('originTop', obj.top);
+				Object.assign(option, {
+					top: obj.top + offset,
+					easing: 'easeInQuad',
+				});
+			} else {
+				obj.set('originLeft', obj.left);
+				Object.assign(option, {
+					left: obj.left + offset,
+					easing: 'easeInQuad',
+				});
+			}
+		} else if (type === 'shake') {
+			const { offset = 1 } = other;
+			if (other.shake === 'vertical') {
+				obj.set('originTop', obj.top);
+				Object.assign(option, {
+					top: obj.top + offset,
+					delay: 0,
+					elasticity: 1000,
+					duration: 500,
+				});
+			} else {
+				obj.set('originLeft', obj.left);
+				Object.assign(option, {
+					left: obj.left + offset,
+					delay: 0,
+					elasticity: 1000,
+					duration: 500,
+				});
+			}
+		} else if (type === 'scaling') {
+			const { scale = 2 } = other;
+			obj.set('originScaleX', obj.scaleX);
+			obj.set('originScaleY', obj.scaleY);
+			obj.set({
+				originScaleX: obj.scaleX,
+				originScaleY: obj.scaleY,
+			});
+			const scaleX = obj.scaleX * scale;
+			const scaleY = obj.scaleY * scale;
+			Object.assign(option, {
+				scaleX,
+				scaleY,
+				easing: 'easeInQuad',
+			});
+		} else if (type === 'rotation') {
+			const { angle = 360 } = other;
+			obj.set('rotation', obj.angle);
+			obj.set('originAngle', obj.angle);
+			obj.set('originLeft', obj.left);
+			obj.set('originTop', obj.top);
+			Object.assign(option, {
+				rotation: angle,
+				easing: 'linear',
+				direction: 'normal',
+			});
+		} else if (type === 'flash') {
+			const { fill = obj.fill, stroke = obj.stroke } = other;
+			if (obj.type === 'svg') {
+				(obj as fabric.Group)._objects.forEach(child =>
+					this.handler.setByPartial(child, {
+						originFill: child.fill,
+						originStroke: child.stroke,
+					}),
+				);
+			}
+			obj.set('originFill', obj.fill as string);
+			obj.set('originStroke', obj.stroke);
+			Object.assign(option, {
+				fill,
+				stroke,
+				easing: 'easeInQuad',
+			});
+		} else {
+			console.warn('Not supported type.');
+			return null;
+		}
+		return anime(option);
+	};
+}
+
+export default AnimationHandler;
diff --git a/src/pages/Fabric/canvas/handlers/ChartHandler.ts b/src/pages/Fabric/canvas/handlers/ChartHandler.ts
new file mode 100644
index 0000000..e583a32
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/ChartHandler.ts
@@ -0,0 +1,14 @@
+import * as echarts from 'echarts';
+
+import Handler from './Handler';
+
+class ChartHandler {
+    handler?: Handler;
+    instance?: echarts.ECharts;
+
+    constructor(handler: Handler) {
+        this.handler = handler;
+    }
+}
+
+export default ChartHandler;
diff --git a/src/pages/Fabric/canvas/handlers/ContextmenuHandler.ts b/src/pages/Fabric/canvas/handlers/ContextmenuHandler.ts
new file mode 100644
index 0000000..9376999
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/ContextmenuHandler.ts
@@ -0,0 +1,71 @@
+import ReactDOM from 'react-dom';
+import {debounce } from 'lodash';
+
+import { Handler } from '.';
+
+class ContextmenuHandler {
+	handler: Handler;
+	contextmenuEl: HTMLDivElement;
+
+	constructor(handler: Handler) {
+		this.handler = handler;
+		this.initialize();
+	}
+
+	/**
+	 * Initialize contextmenu
+	 *
+	 */
+	public initialize() {
+		this.contextmenuEl = document.createElement('div');
+		this.contextmenuEl.id = `${this.handler.id}_contextmenu`;
+		this.contextmenuEl.className = 'rde-contextmenu contextmenu-hidden';
+		document.body.appendChild(this.contextmenuEl);
+	}
+
+	/**
+	 * Destroy contextmenu
+	 *
+	 */
+	public destory() {
+		if (this.contextmenuEl) {
+			document.body.removeChild(this.contextmenuEl);
+		}
+	}
+
+	/**
+	 * Show context menu
+	 *
+	 */
+	public show = debounce(async (e, target) => {
+		const { onContext } = this.handler;
+		while (this.contextmenuEl.hasChildNodes()) {
+			this.contextmenuEl.removeChild(this.contextmenuEl.firstChild);
+		}
+		const contextmenu = document.createElement('div');
+		contextmenu.className = 'rde-contextmenu-right';
+		const element = await onContext(this.contextmenuEl, e, target);
+		if (!element) {
+			return;
+		}
+		contextmenu.innerHTML = element;
+		this.contextmenuEl.appendChild(contextmenu);
+		ReactDOM.render(element, contextmenu);
+		this.contextmenuEl.classList.remove('contextmenu-hidden');
+		const { clientX: left, clientY: top } = e;
+		this.contextmenuEl.style.left = `${left}px`;
+		this.contextmenuEl.style.top = `${top}px`;
+	}, 100);
+
+	/**
+	 * Hide context menu
+	 *
+	 */
+	public hide = debounce(() => {
+		if (this.contextmenuEl) {
+			this.contextmenuEl.classList.add('contextmenu-hidden');
+		}
+	}, 100);
+}
+
+export default ContextmenuHandler;
diff --git a/src/pages/Fabric/canvas/handlers/CropHandler.ts b/src/pages/Fabric/canvas/handlers/CropHandler.ts
new file mode 100644
index 0000000..6e60e6a
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/CropHandler.ts
@@ -0,0 +1,278 @@
+import { fabric } from 'fabric';
+
+import { Handler } from '.';
+import { FabricImage } from '../utils';
+
+class CropHandler {
+	handler: Handler;
+	cropRect: fabric.Rect;
+	cropObject: FabricImage;
+
+	constructor(handler: Handler) {
+		this.handler = handler;
+		this.cropRect = null;
+		this.cropObject = null;
+	}
+
+	/**
+	 * Validate crop type
+	 *
+	 * @returns
+	 */
+	public validType = () => {
+		const activeObject = this.handler.canvas.getActiveObject();
+		if (!activeObject) {
+			return false;
+		}
+		if (activeObject.type === 'image') {
+			return true;
+		}
+		return false;
+	};
+
+	/**
+	 * Start crop image
+	 *
+	 */
+	public start = () => {
+		if (this.validType()) {
+			this.handler.interactionMode = 'crop';
+			this.cropObject = this.handler.canvas.getActiveObject() as FabricImage;
+			const { left, top } = this.cropObject;
+			this.cropRect = new fabric.Rect({
+				width: this.cropObject.width,
+				height: this.cropObject.height,
+				scaleX: this.cropObject.scaleX,
+				scaleY: this.cropObject.scaleY,
+				originX: 'left',
+				originY: 'top',
+				left,
+				top,
+				hasRotatingPoint: false,
+				fill: 'rgba(0, 0, 0, 0.2)',
+			});
+			this.handler.canvas.add(this.cropRect);
+			this.handler.canvas.setActiveObject(this.cropRect);
+			this.cropObject.selectable = false;
+			this.cropObject.evented = false;
+			this.handler.canvas.renderAll();
+		}
+	};
+
+	/**
+	 * Finish crop image
+	 *
+	 */
+	public finish = () => {
+		const { left, top, width, height, scaleX, scaleY } = this.cropRect;
+		const croppedImg = this.cropObject.toDataURL({
+			left: left - this.cropObject.left,
+			top: top - this.cropObject.top,
+			width: width * scaleX,
+			height: height * scaleY,
+		});
+		this.handler.setImage(this.cropObject, croppedImg);
+		this.cancel();
+	};
+
+	/**
+	 * Cancel crop
+	 *
+	 */
+	public cancel = () => {
+		this.handler.interactionMode = 'selection';
+		this.cropObject.selectable = true;
+		this.cropObject.evented = true;
+		this.handler.canvas.setActiveObject(this.cropObject);
+		this.handler.canvas.remove(this.cropRect);
+		this.cropRect = null;
+		this.cropObject = null;
+		this.handler.canvas.renderAll();
+	};
+
+	/**
+	 * Resize crop
+	 *
+	 * @param {FabricEvent} opt
+	 */
+	public resize = (opt: fabric.IEvent) => {
+		const {
+			target,
+			transform: { original, corner },
+		} = opt;
+		const { left, top, width, height, scaleX, scaleY } = target;
+		const {
+			left: cropLeft,
+			top: cropTop,
+			width: cropWidth,
+			height: cropHeight,
+			scaleX: cropScaleX,
+			scaleY: cropScaleY,
+		} = this.cropObject;
+		if (corner === 'tl') {
+			if (Math.round(cropLeft) > Math.round(left)) {
+				// left
+				const originRight = Math.round(cropLeft + cropWidth);
+				const targetRight = Math.round(target.getBoundingRect().left + target.getBoundingRect().width);
+				const diffRightRatio = 1 - (originRight - targetRight) / cropWidth;
+				target.set({
+					left: cropLeft,
+					scaleX: diffRightRatio > 1 ? 1 : diffRightRatio,
+				});
+			}
+			if (Math.round(cropTop) > Math.round(top)) {
+				// top
+				const originBottom = Math.round(cropTop + cropHeight);
+				const targetBottom = Math.round(target.getBoundingRect().top + target.getBoundingRect().height);
+				const diffBottomRatio = 1 - (originBottom - targetBottom) / cropHeight;
+				target.set({
+					top: cropTop,
+					scaleY: diffBottomRatio > 1 ? 1 : diffBottomRatio,
+				});
+			}
+		} else if (corner === 'bl') {
+			if (Math.round(cropLeft) > Math.round(left)) {
+				// left
+				const originRight = Math.round(cropLeft + cropWidth);
+				const targetRight = Math.round(target.getBoundingRect().left + target.getBoundingRect().width);
+				const diffRightRatio = 1 - (originRight - targetRight) / cropWidth;
+				target.set({
+					left: cropLeft,
+					scaleX: diffRightRatio > 1 ? 1 : diffRightRatio,
+				});
+			}
+			if (Math.round(cropTop + cropHeight * cropScaleY) < Math.round(top + height * scaleY)) {
+				// bottom
+				const diffTopRatio = 1 - (original.top - cropTop) / cropHeight;
+				target.set({
+					top: original.top,
+					scaleY: diffTopRatio > 1 ? 1 : diffTopRatio,
+				});
+			}
+		} else if (corner === 'tr') {
+			if (Math.round(cropLeft + cropWidth * cropScaleX) < Math.round(left + width * scaleX)) {
+				// right
+				const diffLeftRatio = 1 - (original.left - cropLeft) / cropWidth;
+				target.set({
+					left: original.left,
+					scaleX: diffLeftRatio > 1 ? 1 : diffLeftRatio,
+				});
+			}
+			if (Math.round(cropTop) > Math.round(top)) {
+				// top
+				const originBottom = Math.round(cropTop + cropHeight);
+				const targetBottom = Math.round(target.getBoundingRect().top + target.getBoundingRect().height);
+				const diffBottomRatio = 1 - (originBottom - targetBottom) / cropHeight;
+				target.set({
+					top: cropTop,
+					scaleY: diffBottomRatio > 1 ? 1 : diffBottomRatio,
+				});
+			}
+		} else if (corner === 'br') {
+			if (Math.round(cropLeft + cropWidth * cropScaleX) < Math.round(left + width * scaleX)) {
+				// right
+				const diffLeftRatio = 1 - (original.left - cropLeft) / cropWidth;
+				target.set({
+					left: original.left,
+					scaleX: diffLeftRatio > 1 ? 1 : diffLeftRatio,
+				});
+			}
+			if (Math.round(cropTop + cropHeight * cropScaleY) < Math.round(top + height * scaleY)) {
+				// bottom
+				const diffTopRatio = 1 - (original.top - cropTop) / cropHeight;
+				target.set({
+					top: original.top,
+					scaleY: diffTopRatio > 1 ? 1 : diffTopRatio,
+				});
+			}
+		} else if (corner === 'ml') {
+			if (Math.round(cropLeft) > Math.round(left)) {
+				// left
+				const originRight = Math.round(cropLeft + cropWidth);
+				const targetRight = Math.round(target.getBoundingRect().left + target.getBoundingRect().width);
+				const diffRightRatio = 1 - (originRight - targetRight) / cropWidth;
+				target.set({
+					left: cropLeft,
+					scaleX: diffRightRatio > 1 ? 1 : diffRightRatio,
+				});
+			}
+		} else if (corner === 'mt') {
+			if (Math.round(cropTop) > Math.round(top)) {
+				// top
+				const originBottom = Math.round(cropTop + cropHeight);
+				const targetBottom = Math.round(target.getBoundingRect().top + target.getBoundingRect().height);
+				const diffBottomRatio = 1 - (originBottom - targetBottom) / cropHeight;
+				target.set({
+					top: cropTop,
+					scaleY: diffBottomRatio > 1 ? 1 : diffBottomRatio,
+				});
+			}
+		} else if (corner === 'mb') {
+			if (Math.round(cropTop + cropHeight * cropScaleY) < Math.round(top + height * scaleY)) {
+				// bottom
+				const diffTopRatio = 1 - (original.top - cropTop) / cropHeight;
+				target.set({
+					top: original.top,
+					scaleY: diffTopRatio > 1 ? 1 : diffTopRatio,
+				});
+			}
+		} else if (corner === 'mr') {
+			if (Math.round(cropLeft + cropWidth * cropScaleX) < Math.round(left + width * scaleX)) {
+				// right
+				const diffLeftRatio = 1 - (original.left - cropLeft) / cropWidth;
+				target.set({
+					left: original.left,
+					scaleX: diffLeftRatio > 1 ? 1 : diffLeftRatio,
+				});
+			}
+		}
+	};
+
+	/**
+	 * Resize crop
+	 *
+	 * @param {FabricEvent} opt
+	 */
+	public moving = (opt: fabric.IEvent) => {
+		const { target } = opt;
+		const { left, top, width, height, scaleX, scaleY } = target;
+		const {
+			left: cropLeft,
+			top: cropTop,
+			width: cropWidth,
+			height: cropHeight,
+		} = this.cropObject.getBoundingRect();
+		const movedTop = () => {
+			if (Math.round(cropTop) >= Math.round(top)) {
+				target.set({
+					top: cropTop,
+				});
+			} else if (Math.round(cropTop + cropHeight) <= Math.round(top + height * scaleY)) {
+				target.set({
+					top: cropTop + cropHeight - height * scaleY,
+				});
+			}
+		};
+		if (Math.round(cropLeft) >= Math.round(left)) {
+			target.set({
+				left: Math.max(left, cropLeft),
+			});
+			movedTop();
+		} else if (Math.round(cropLeft + cropWidth) <= Math.round(left + width * scaleX)) {
+			target.set({
+				left: cropLeft + cropWidth - width * scaleX,
+			});
+			movedTop();
+		} else if (Math.round(cropTop) >= Math.round(top)) {
+			target.set({
+				top: cropTop,
+			});
+		} else if (Math.round(cropTop + cropHeight) <= Math.round(top + height * scaleY)) {
+			target.set({
+				top: cropTop + cropHeight - height * scaleY,
+			});
+		}
+	};
+}
+
+export default CropHandler;
diff --git a/src/pages/Fabric/canvas/handlers/CustomHandler.ts b/src/pages/Fabric/canvas/handlers/CustomHandler.ts
new file mode 100644
index 0000000..f97f9cf
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/CustomHandler.ts
@@ -0,0 +1,14 @@
+import { Handler } from '.';
+
+class CustomHandler {
+	handler: Handler;
+
+	constructor(handler: Handler) {
+		this.handler = handler;
+		this.initialze();
+	}
+
+	protected initialze() {}
+}
+
+export default CustomHandler;
diff --git a/src/pages/Fabric/canvas/handlers/DrawingHandler.ts b/src/pages/Fabric/canvas/handlers/DrawingHandler.ts
new file mode 100644
index 0000000..da7006d
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/DrawingHandler.ts
@@ -0,0 +1,374 @@
+import { fabric } from 'fabric';
+import { useUuid } from '@/hooks/useUuid';
+import { Arrow, Line } from '../objects';
+import { FabricEvent, FabricObject } from '../utils';
+import Handler from './Handler';
+
+// eslint-disable-next-line react-hooks/rules-of-hooks
+const { fetchUuid } = useUuid();
+
+class DrawingHandler {
+	handler: Handler;
+	constructor(handler: Handler) {
+		this.handler = handler;
+	}
+
+	polygon = {
+		init: () => {
+			this.handler.interactionHandler.drawing('polygon');
+			this.handler.pointArray = [];
+			this.handler.lineArray = [];
+			this.handler.activeLine = null;
+			this.handler.activeShape = null;
+		},
+		finish: () => {
+			this.handler.pointArray.forEach(point => {
+				this.handler.canvas.remove(point);
+			});
+			this.handler.lineArray.forEach(line => {
+				this.handler.canvas.remove(line);
+			});
+			this.handler.canvas.remove(this.handler.activeLine);
+			this.handler.canvas.remove(this.handler.activeShape);
+			this.handler.pointArray = [];
+			this.handler.lineArray = [];
+			this.handler.activeLine = null;
+			this.handler.activeShape = null;
+			this.handler.canvas.renderAll();
+			this.handler.interactionHandler.selection();
+		},
+		addPoint: (opt: FabricEvent) => {
+			const { e, absolutePointer } = opt;
+			const { x, y } = absolutePointer;
+			const circle = new fabric.Circle({
+				radius: 1,
+				fill: '#ffffff',
+				stroke: '#333333',
+				strokeWidth: 0.5,
+				left: x,
+				top: y,
+				selectable: false,
+				hasBorders: false,
+				hasControls: false,
+				originX: 'center',
+				originY: 'center',
+				hoverCursor: 'pointer',
+			}) as FabricObject<fabric.Circle>;
+			circle.set({
+				id: fetchUuid(),
+			});
+			if (!this.handler.pointArray.length) {
+				circle.set({
+					fill: 'red',
+				});
+			}
+			const points = [x, y, x, y];
+			const line = new fabric.Line(points, {
+				strokeWidth: 1,
+				fill: '#999999',
+				stroke: '#999999',
+				originX: 'center',
+				originY: 'center',
+				selectable: false,
+				hasBorders: false,
+				hasControls: false,
+				evented: false,
+			}) as FabricObject<fabric.Line>;
+			line.set({
+				class: 'line',
+			});
+			if (this.handler.activeShape) {
+				const position = this.handler.canvas.getPointer(e);
+				const activeShapePoints = this.handler.activeShape.get('points') as Array<{ x: number; y: number }>;
+				activeShapePoints.push({
+					x: position.x,
+					y: position.y,
+				});
+				const polygon = new fabric.Polygon(activeShapePoints, {
+					stroke: '#333333',
+					strokeWidth: 1,
+					fill: '#cccccc',
+					opacity: 0.1,
+					selectable: false,
+					hasBorders: false,
+					hasControls: false,
+					evented: false,
+				});
+				this.handler.canvas.remove(this.handler.activeShape);
+				this.handler.canvas.add(polygon);
+				this.handler.activeShape = polygon;
+				this.handler.canvas.renderAll();
+			} else {
+				const polyPoint = [{ x, y }];
+				const polygon = new fabric.Polygon(polyPoint, {
+					stroke: '#333333',
+					strokeWidth: 1,
+					fill: '#cccccc',
+					opacity: 0.1,
+					selectable: false,
+					hasBorders: false,
+					hasControls: false,
+					evented: false,
+				});
+				this.handler.activeShape = polygon;
+				this.handler.canvas.add(polygon);
+			}
+			this.handler.activeLine = line;
+			this.handler.pointArray.push(circle);
+			this.handler.lineArray.push(line);
+			this.handler.canvas.add(line);
+			this.handler.canvas.add(circle);
+		},
+		generate: (pointArray: FabricObject<fabric.Circle>[]) => {
+			const points = [] as any[];
+			const id = fetchUuid();
+			pointArray.forEach(point => {
+				points.push({
+					x: point.left,
+					y: point.top,
+				});
+				this.handler.canvas.remove(point);
+			});
+			this.handler.lineArray.forEach(line => {
+				this.handler.canvas.remove(line);
+			});
+			this.handler.canvas.remove(this.handler.activeShape).remove(this.handler.activeLine);
+			const option = {
+				id,
+				points,
+				type: 'polygon',
+				stroke: 'rgba(0, 0, 0, 1)',
+				strokeWidth: 1,
+				fill: 'rgba(0, 0, 0, 0.25)',
+				opacity: 1,
+				objectCaching: !this.handler.editable,
+				name: 'New polygon',
+				superType: 'drawing',
+			};
+			this.handler.add(option, false);
+			this.handler.pointArray = [];
+			this.handler.activeLine = null;
+			this.handler.activeShape = null;
+			this.handler.interactionHandler.selection();
+		},
+		// TODO... polygon resize
+		// createResize: (target, points) => {
+		//     points.forEach((point, index) => {
+		//         const { x, y } = point;
+		//         const circle = new fabric.Circle({
+		//             name: index,
+		//             radius: 3,
+		//             fill: '#ffffff',
+		//             stroke: '#333333',
+		//             strokeWidth: 0.5,
+		//             left: x,
+		//             top: y,
+		//             hasBorders: false,
+		//             hasControls: false,
+		//             originX: 'center',
+		//             originY: 'center',
+		//             hoverCursor: 'pointer',
+		//             parentId: target.id,
+		//         });
+		//         this.handler.pointArray.push(circle);
+		//     });
+		//     const group = [target].concat(this.pointArray);
+		//     this.handler.canvas.add(new fabric.Group(group, { type: 'polygon', id: fetchUuid() }));
+		// },
+		// removeResize: () => {
+		//     if (this.handler.pointArray) {
+		//         this.handler.pointArray.forEach((point) => {
+		//             this.handler.canvas.remove(point);
+		//         });
+		//         this.handler.pointArray = [];
+		//     }
+		// },
+		// movingResize: (target, e) => {
+		//     const points = target.diffPoints || target.points;
+		//     const diffPoints = [];
+		//     points.forEach((point) => {
+		//         diffPoints.push({
+		//             x: point.x + e.movementX,
+		//             y: point.y + e.movementY,
+		//         });
+		//     });
+		//     target.set({
+		//         diffPoints,
+		//     });
+		//     this.handler.canvas.renderAll();
+		// },
+	};
+
+	line = {
+		init: () => {
+			this.handler.interactionHandler.drawing('line');
+			this.handler.pointArray = [];
+			this.handler.activeLine = null;
+		},
+		finish: () => {
+			this.handler.pointArray.forEach(point => {
+				this.handler.canvas.remove(point);
+			});
+			this.handler.canvas.remove(this.handler.activeLine);
+			this.handler.pointArray = [];
+			this.handler.activeLine = null;
+			this.handler.canvas.renderAll();
+			this.handler.interactionHandler.selection();
+		},
+		addPoint: (opt: FabricEvent) => {
+			const { absolutePointer } = opt;
+			const { x, y } = absolutePointer;
+			const circle = new fabric.Circle({
+				radius: 3,
+				fill: '#ffffff',
+				stroke: '#333333',
+				strokeWidth: 0.5,
+				left: x,
+				top: y,
+				selectable: false,
+				hasBorders: false,
+				hasControls: false,
+				originX: 'center',
+				originY: 'center',
+				hoverCursor: 'pointer',
+			});
+			if (!this.handler.pointArray.length) {
+				circle.set({
+					fill: 'red',
+				});
+			}
+			const points = [x, y, x, y];
+			this.handler.activeLine = new Line(points, {
+				strokeWidth: 2,
+				fill: '#999999',
+				stroke: '#999999',
+				originX: 'center',
+				originY: 'center',
+				selectable: false,
+				hasBorders: false,
+				hasControls: false,
+				evented: false,
+			});
+			this.handler.activeLine.set({
+				class: 'line',
+			});
+			this.handler.pointArray.push(circle);
+			this.handler.canvas.add(this.handler.activeLine);
+			this.handler.canvas.add(circle);
+		},
+		generate: (opt: FabricEvent) => {
+			const { absolutePointer } = opt;
+			const { x, y } = absolutePointer;
+			let points = [] as number[];
+			const id = fetchUuid();
+			this.handler.pointArray.forEach(point => {
+				points = points.concat(point.left, point.top, x, y);
+				this.handler.canvas.remove(point);
+			});
+			this.handler.canvas.remove(this.handler.activeLine);
+			const option = {
+				id,
+				points,
+				type: 'line',
+				stroke: 'rgba(0, 0, 0, 1)',
+				strokeWidth: 3,
+				opacity: 1,
+				objectCaching: !this.handler.editable,
+				name: 'New line',
+				superType: 'drawing',
+			};
+			this.handler.add(option, false);
+			this.handler.pointArray = [];
+			this.handler.activeLine = null;
+			this.handler.interactionHandler.selection();
+		},
+	};
+
+	arrow = {
+		init: () => {
+			this.handler.interactionHandler.drawing('arrow');
+			this.handler.pointArray = [];
+			this.handler.activeLine = null;
+		},
+		finish: () => {
+			this.handler.pointArray.forEach(point => {
+				this.handler.canvas.remove(point);
+			});
+			this.handler.canvas.remove(this.handler.activeLine);
+			this.handler.pointArray = [];
+			this.handler.activeLine = null;
+			this.handler.canvas.renderAll();
+			this.handler.interactionHandler.selection();
+		},
+		addPoint: (opt: FabricEvent) => {
+			const { absolutePointer } = opt;
+			const { x, y } = absolutePointer;
+			const circle = new fabric.Circle({
+				radius: 3,
+				fill: '#ffffff',
+				stroke: '#333333',
+				strokeWidth: 0.5,
+				left: x,
+				top: y,
+				selectable: false,
+				hasBorders: false,
+				hasControls: false,
+				originX: 'center',
+				originY: 'center',
+				hoverCursor: 'pointer',
+			});
+			if (!this.handler.pointArray.length) {
+				circle.set({
+					fill: 'red',
+				});
+			}
+			const points = [x, y, x, y];
+			this.handler.activeLine = new Arrow(points, {
+				strokeWidth: 2,
+				fill: '#999999',
+				stroke: '#999999',
+				class: 'line',
+				originX: 'center',
+				originY: 'center',
+				selectable: false,
+				hasBorders: false,
+				hasControls: false,
+				evented: false,
+			});
+			this.handler.pointArray.push(circle);
+			this.handler.canvas.add(this.handler.activeLine);
+			this.handler.canvas.add(circle);
+		},
+		generate: (opt: FabricEvent) => {
+			const { absolutePointer } = opt;
+			const { x, y } = absolutePointer;
+			let points = [] as number[];
+			this.handler.pointArray.forEach(point => {
+				points = points.concat(point.left, point.top, x, y);
+				this.handler.canvas.remove(point);
+			});
+			this.handler.canvas.remove(this.handler.activeLine);
+			const option = {
+				id: fetchUuid(),
+				points,
+				type: 'arrow',
+				stroke: 'rgba(0, 0, 0, 1)',
+				strokeWidth: 3,
+				opacity: 1,
+				objectCaching: !this.handler.editable,
+				name: 'New line',
+				superType: 'drawing',
+			};
+			this.handler.add(option, false);
+			this.handler.pointArray = [];
+			this.handler.activeLine = null;
+			this.handler.interactionHandler.selection();
+		},
+	};
+
+	orthogonal = {};
+
+	curve = {};
+}
+
+export default DrawingHandler;
diff --git a/src/pages/Fabric/canvas/handlers/ElementHandler.ts b/src/pages/Fabric/canvas/handlers/ElementHandler.ts
new file mode 100644
index 0000000..d2b6154
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/ElementHandler.ts
@@ -0,0 +1,187 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-12-05 13:39:46
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-12-05 15:51:59
+ * @FilePath: \react-adpro-fabric\src\pages\Fabric\canvas\handlers\ElementHandler.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+import { fabric } from 'fabric';
+
+import Handler from './Handler';
+import { VideoObject } from '../objects/Video';
+import { IframeObject } from '../objects/Iframe';
+import { ElementObject } from '../objects/Element';
+
+export type ElementType = 'container' | 'script' | 'style';
+
+export type ElementObjectType = VideoObject  | IframeObject | ElementObject;
+
+export interface ElementCode {
+    html?: string;
+    css?: string;
+    js?: string;
+}
+
+class ElementHandler {
+    handler?: Handler;
+
+    constructor(handler: Handler) {
+        this.handler = handler;
+    }
+
+    /**
+     * Set element by id
+     * @param {string} id
+     * @param {*} source
+     * @returns {void}
+     */
+    public setById = (id: string, source: any): void => {
+        const obj = this.handler.findById(id) as ElementObjectType;
+        if (!obj) {
+            return;
+        }
+        this.set(obj, source);
+    }
+
+    /**
+     * Set element
+     * @param {ElementObjectType} obj
+     * @param {*} source
+     */
+    public set = (obj: ElementObjectType, source: any) => {
+        obj.setSource(source);
+    }
+
+    /**
+     * Find element by id with type
+     * @param {string} id
+     * @param {ElementType} [type='container']
+     * @returns
+     */
+    public findById = (id: string, type: ElementType = 'container') => {
+        return document.getElementById(`${id}_${type}`);
+    }
+
+    /**
+     * Remove element
+     * @param {HTMLElement} el
+     * @returns
+     */
+    public remove = (el: HTMLElement) => {
+        if (!el) {
+            return;
+        }
+        this.handler.container.removeChild(el);
+    }
+
+    /**
+     * Remove element by id
+     * @param {string} id
+     */
+    public removeById = (id: string) => {
+        const el = this.findById(id);
+        const scriptEl = this.findById(id, 'script');
+        const styleEl = this.findById(id, 'style');
+        if (el) {
+            if (el.remove) {
+                el.remove();
+            } else {
+                this.remove(el);
+            }
+        }
+        if (scriptEl) {
+            if (scriptEl.remove) {
+                scriptEl.remove();
+            } else {
+                document.head.removeChild(scriptEl);
+            }
+        }
+        if (styleEl) {
+            if (styleEl.remove) {
+                styleEl.remove();
+            } else {
+                document.head.removeChild(styleEl);
+            }
+        }
+    }
+
+    /**
+     * Remove element by ids
+     * @param {string[]} ids
+     */
+    public removeByIds = (ids: string[]) => {
+        ids.forEach(id => {
+            this.removeById(id);
+        });
+    }
+
+    /**
+     * Set position
+     * @param {HTMLElement} el
+     * @param {number} left
+     * @param {number} top
+     * @returns
+     */
+    public setPosition = (el: HTMLElement, obj: fabric.Object) => {
+        if (!el) {
+            return;
+        }
+        obj.setCoords();
+        const zoom = this.handler.canvas.getZoom();
+        const { scaleX, scaleY, width, height } = obj;
+        const { left, top } = obj.getBoundingRect(false);
+        const padLeft = ((width * scaleX * zoom) - width) / 2;
+        const padTop = ((height * scaleY * zoom) - height) / 2;
+        el.style.left = `${left + padLeft}px`;
+        el.style.top = `${top + padTop}px`;
+    }
+
+    public setPositionByOrigin = (el: HTMLElement, obj: fabric.Object, left: number, top: number) => {
+        if (!el) {
+            return;
+        }
+        obj.setCoords();
+        const zoom = this.handler.canvas.getZoom();
+        const { scaleX, scaleY, width, height } = obj;
+        const padLeft = ((width * scaleX * zoom) - width) / 2;
+        const padTop = ((height * scaleY * zoom) - height) / 2;
+        el.style.left = `${left + padLeft}px`;
+        el.style.top = `${top + padTop}px`;
+    }
+
+    /**
+     * Set size
+     * @param {HTMLElement} el
+     * @param {number} width
+     * @param {number} height
+     * @returns
+     */
+    public setSize = (el: HTMLElement, obj: fabric.Object) => {
+        if (!el) {
+            return;
+        }
+        const { width, height } = obj;
+        el.style.width = `${width}px`;
+        el.style.height = `${height}px`;
+    }
+
+    /**
+     * Set scale or angle
+     * @param {HTMLElement} el
+     * @param {number} scaleX
+     * @param {number} scaleY
+     * @param {number} angle
+     * @returns
+     */
+    public setScaleOrAngle = (el: HTMLElement, obj: fabric.Object) => {
+        if (!el) {
+            return;
+        }
+        const zoom = this.handler.canvas.getZoom();
+        const { scaleX, scaleY, angle } = obj;
+        el.style.transform = `rotate(${angle}deg) scale(${scaleX * zoom}, ${scaleY * zoom})`;
+    }
+}
+
+export default ElementHandler;
diff --git a/src/pages/Fabric/canvas/handlers/EventHandler.ts b/src/pages/Fabric/canvas/handlers/EventHandler.ts
new file mode 100644
index 0000000..3725617
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/EventHandler.ts
@@ -0,0 +1,879 @@
+// import anime from 'animejs';
+import { fabric } from 'fabric';
+import { code } from '../constants';
+import { NodeObject } from '../objects/Node';
+import { VideoObject } from '../objects/Video';
+import { FabricEvent, FabricObject } from '../utils';
+import Handler from './Handler';
+
+/**
+ * Event Handler Class
+ * @author salgum1114
+ * @class EventHandler
+ */
+class EventHandler {
+	handler: Handler;
+	code: string;
+	panning: boolean;
+
+	constructor(handler: Handler) {
+		this.handler = handler;
+		this.initialize();
+	}
+
+	/**
+	 * Attch event on document
+	 *
+	 */
+	public initialize() {
+		if (this.handler.editable) {
+			// @ts-ignore
+			this.handler.canvas.on({
+				'object:modified': this.modified,
+				'object:scaling': this.scaling,
+				'object:scaled': this.scaled,
+				'object:moving': this.moving,
+				'object:moved': this.moved,
+				'object:rotating': this.rotating,
+				'object:rotated': this.rotated,
+				'mouse:wheel': this.mousewheel,
+				'mouse:down': this.mousedown,
+				'mouse:move': this.mousemove,
+				'mouse:up': this.mouseup,
+				'selection:cleared': this.selection,
+				'selection:created': this.selection,
+				'selection:updated': this.selection,
+			});
+		} else {
+			// @ts-ignore
+			this.handler.canvas.on({
+				'mouse:down': this.mousedown,
+				'mouse:move': this.mousemove,
+				'mouse:out': this.mouseout,
+				'mouse:up': this.mouseup,
+				'mouse:wheel': this.mousewheel,
+			});
+		}
+		this.handler.canvas.wrapperEl.tabIndex = 1000;
+		this.handler.canvas.wrapperEl.addEventListener('keydown', this.keydown, false);
+		this.handler.canvas.wrapperEl.addEventListener('keyup', this.keyup, false);
+		this.handler.canvas.wrapperEl.addEventListener('mousedown', this.onmousedown, false);
+		this.handler.canvas.wrapperEl.addEventListener('contextmenu', this.contextmenu, false);
+		if (this.handler.keyEvent.clipboard) {
+			document.addEventListener('paste', this.paste, false);
+		}
+	}
+
+	/**
+	 * Detach event on document
+	 *
+	 */
+	public destroy = () => {
+		if (this.handler.editable) {
+			this.handler.canvas.off({
+				'object:modified': this.modified,
+				'object:scaling': this.scaling,
+				'object:moving': this.moving,
+				'object:moved': this.moved,
+				'object:rotating': this.rotating,
+				'mouse:wheel': this.mousewheel,
+				'mouse:down': this.mousedown,
+				'mouse:move': this.mousemove,
+				'mouse:up': this.mouseup,
+				'selection:cleared': this.selection,
+				'selection:created': this.selection,
+				'selection:updated': this.selection,
+			});
+		} else {
+			this.handler.canvas.off({
+				'mouse:down': this.mousedown,
+				'mouse:move': this.mousemove,
+				'mouse:out': this.mouseout,
+				'mouse:up': this.mouseup,
+				'mouse:wheel': this.mousewheel,
+			});
+			this.handler.getObjects().forEach(object => {
+				object.off('mousedown', this.handler.eventHandler.object.mousedown);
+				// if (object.anime) {
+				// 	anime.remove(object);
+				// }
+			});
+		}
+		this.handler.canvas.wrapperEl.removeEventListener('keydown', this.keydown);
+		this.handler.canvas.wrapperEl.removeEventListener('keyup', this.keyup);
+		this.handler.canvas.wrapperEl.removeEventListener('mousedown', this.onmousedown);
+		this.handler.canvas.wrapperEl.removeEventListener('contextmenu', this.contextmenu);
+		if (this.handler.keyEvent.clipboard) {
+			this.handler.canvas.wrapperEl.removeEventListener('paste', this.paste);
+		}
+	};
+
+	/**
+	 * Individual object event
+	 *
+	 */
+	public object = {
+		/**
+		 * Mouse down event on object
+		 * @param {FabricEvent} opt
+		 */
+		mousedown: (opt: FabricEvent) => {
+			const { target } = opt;
+			if (target && target.link && target.link.enabled) {
+				const { onClick } = this.handler;
+				if (onClick) {
+					onClick(this.handler.canvas, target);
+				}
+			}
+		},
+		/**
+		 * Mouse double click event on object
+		 * @param {FabricEvent} opt
+		 */
+		mousedblclick: (opt: FabricEvent) => {
+			const { target } = opt;
+			if (target) {
+				const { onDblClick } = this.handler;
+				if (onDblClick) {
+					onDblClick(this.handler.canvas, target);
+				}
+			}
+		},
+	};
+
+	/**
+	 * Modified event object
+	 *
+	 * @param {FabricEvent} opt
+	 * @returns
+	 */
+	public modified = (opt: FabricEvent) => {
+		const { target } = opt;
+		if (!target) {
+			return;
+		}
+		if (target.type === 'circle' && target.parentId) {
+			return;
+		}
+		const { onModified } = this.handler;
+		if (onModified) {
+			onModified(target);
+		}
+	};
+
+	/**
+	 * Moving event object
+	 *
+	 * @param {FabricEvent} opt
+	 * @returns
+	 */
+	public moving = (opt: FabricEvent) => {
+		const { target } = opt as any;
+		if (this.handler.interactionMode === 'crop') {
+			this.handler.cropHandler.moving(opt);
+		} else {
+			if (this.handler.editable && this.handler.guidelineOption.enabled) {
+				this.handler.guidelineHandler.movingGuidelines(target);
+			}
+			if (target.type === 'activeSelection') {
+				const activeSelection = target as fabric.ActiveSelection;
+				activeSelection.getObjects().forEach((obj: any) => {
+					const left = target.left + obj.left + target.width / 2;
+					const top = target.top + obj.top + target.height / 2;
+					if (obj.superType === 'node') {
+						this.handler.portHandler.setCoords({ ...obj, left, top });
+					} else if (obj.superType === 'element') {
+						const { id } = obj;
+						const el = this.handler.elementHandler.findById(id);
+						// TODO... Element object incorrect position
+						this.handler.elementHandler.setPositionByOrigin(el, obj, left, top);
+					}
+				});
+				return;
+			}
+			if (target.superType === 'node') {
+				this.handler.portHandler.setCoords(target);
+			} else if (target.superType === 'element') {
+				const { id } = target;
+				const el = this.handler.elementHandler.findById(id);
+				this.handler.elementHandler.setPosition(el, target);
+			}
+		}
+	};
+
+	/**
+	 * Moved event object
+	 *
+	 * @param {FabricEvent} opt
+	 */
+	public moved = (opt: FabricEvent) => {
+		const { target } = opt;
+		this.handler.gridHandler.setCoords(target);
+		if (!this.handler.transactionHandler.active) {
+			this.handler.transactionHandler.save('moved');
+		}
+		if (target.superType === 'element') {
+			const { id } = target;
+			const el = this.handler.elementHandler.findById(id);
+			this.handler.elementHandler.setPosition(el, target);
+		}
+	};
+
+	/**
+	 * Scaling event object
+	 *
+	 * @param {FabricEvent} opt
+	 */
+	public scaling = (opt: FabricEvent) => {
+		const { target } = opt as any;
+		if (this.handler.interactionMode === 'crop') {
+			this.handler.cropHandler.resize(opt);
+		}
+		// TODO...this.handler.guidelineHandler.scalingGuidelines(target);
+		if (target.superType === 'element') {
+			const { id, width, height } = target;
+			const el = this.handler.elementHandler.findById(id);
+			// update the element
+			this.handler.elementHandler.setScaleOrAngle(el, target);
+			this.handler.elementHandler.setSize(el, target);
+			this.handler.elementHandler.setPosition(el, target);
+			const video = target as VideoObject;
+			if (video.type === 'video' && video.player) {
+				video.player.setPlayerSize(width, height);
+			}
+		}
+	};
+
+	/**
+	 * Scaled event object
+	 *
+	 * @param {FabricEvent} opt
+	 */
+	public scaled = (_opt: FabricEvent) => {
+		if (!this.handler.transactionHandler.active) {
+			this.handler.transactionHandler.save('scaled');
+		}
+	};
+
+	/**
+	 * Rotating event object
+	 *
+	 * @param {FabricEvent} opt
+	 */
+	public rotating = (opt: FabricEvent) => {
+		const { target } = opt as any;
+		if (target.superType === 'element') {
+			const { id } = target;
+			const el = this.handler.elementHandler.findById(id);
+			// update the element
+			this.handler.elementHandler.setScaleOrAngle(el, target);
+		}
+	};
+
+	/**
+	 * Rotated event object
+	 *
+	 * @param {FabricEvent} opt
+	 */
+	public rotated = (_opt: FabricEvent) => {
+		if (!this.handler.transactionHandler.active) {
+			this.handler.transactionHandler.save('rotated');
+		}
+	};
+
+	/**
+	 * Moing object at keyboard arrow key down event
+	 *
+	 * @param {KeyboardEvent} e
+	 * @returns
+	 */
+	public arrowmoving = (e: KeyboardEvent) => {
+		const activeObject = this.handler.canvas.getActiveObject() as FabricObject;
+		if (!activeObject) {
+			return false;
+		}
+		if (activeObject.id === 'workarea') {
+			return false;
+		}
+		if (e.code === code.ARROW_UP) {
+			activeObject.set('top', activeObject.top - 2);
+			activeObject.setCoords();
+			this.handler.canvas.renderAll();
+			return true;
+		} else if (e.code === code.ARROW_DOWN) {
+			activeObject.set('top', activeObject.top + 2);
+			activeObject.setCoords();
+			this.handler.canvas.renderAll();
+			return true;
+		} else if (e.code === code.ARROW_LEFT) {
+			activeObject.set('left', activeObject.left - 2);
+			activeObject.setCoords();
+			this.handler.canvas.renderAll();
+			return true;
+		} else if (e.code === code.ARROW_RIGHT) {
+			activeObject.set('left', activeObject.left + 2);
+			activeObject.setCoords();
+			this.handler.canvas.renderAll();
+			return true;
+		}
+		if (this.handler.onModified) {
+			this.handler.onModified(activeObject);
+		}
+		return true;
+	};
+
+	/**
+	 * Zoom at mouse wheel event
+	 *
+	 * @param {FabricEvent<WheelEvent>} opt
+	 * @returns
+	 */
+	public mousewheel = (opt: FabricEvent) => {
+		const event = opt as FabricEvent<WheelEvent>;
+		const { zoomEnabled } = this.handler;
+		if (!zoomEnabled) {
+			return;
+		}
+		const delta = event.e.deltaY;
+		let zoomRatio = this.handler.canvas.getZoom();
+		if (delta > 0) {
+			zoomRatio -= this.handler.zoomStep;
+		} else {
+			zoomRatio += this.handler.zoomStep;
+		}
+		this.handler.zoomHandler.zoomToPoint(
+			new fabric.Point(this.handler.canvas.getWidth() / 2, this.handler.canvas.getHeight() / 2),
+			zoomRatio,
+		);
+		event.e.preventDefault();
+		event.e.stopPropagation();
+	};
+
+	/**
+	 * Mouse down event on object
+	 *
+	 * @param {FabricEvent<MouseEvent>} opt
+	 * @returns
+	 */
+	public mousedown = (opt: FabricEvent) => {
+		const event = opt as FabricEvent<MouseEvent>;
+		const { editable } = this.handler;
+		if (event.e.altKey && editable && !this.handler.interactionHandler.isDrawingMode()) {
+			this.handler.interactionHandler.grab();
+			this.panning = true;
+			return;
+		}
+		if (this.handler.interactionMode === 'grab') {
+			this.panning = true;
+			return;
+		}
+		const { target } = event;
+		if (editable) {
+			if (this.handler.prevTarget && this.handler.prevTarget.superType === 'link') {
+				this.handler.prevTarget.set({
+					stroke: this.handler.prevTarget.originStroke || this.handler.prevTarget.stroke,
+				});
+			}
+			if (target && target.type === 'fromPort') {
+				this.handler.linkHandler.init(target);
+				return;
+			}
+			if (
+				target &&
+				this.handler.interactionMode === 'link' &&
+				(target.type === 'toPort' || target.superType === 'node')
+			) {
+				let toPort;
+				if (target.superType === 'node') {
+					toPort = target.toPort;
+				} else {
+					toPort = target;
+				}
+				this.handler.linkHandler.generate(toPort);
+				return;
+			}
+			this.handler.guidelineHandler.viewportTransform = this.handler.canvas.viewportTransform;
+			this.handler.guidelineHandler.zoom = this.handler.canvas.getZoom();
+			if (this.handler.interactionMode === 'selection') {
+				if (target && target.superType === 'link') {
+					target.set({
+						stroke: target.selectedStroke || 'green',
+					});
+				}
+				this.handler.prevTarget = target;
+				return;
+			}
+			if (this.handler.interactionMode === 'polygon') {
+				if (target && this.handler.pointArray.length && target.id === this.handler.pointArray[0].id) {
+					this.handler.drawingHandler.polygon.generate(this.handler.pointArray);
+				} else {
+					this.handler.drawingHandler.polygon.addPoint(event);
+				}
+			} else if (this.handler.interactionMode === 'line') {
+				if (this.handler.pointArray.length && this.handler.activeLine) {
+					this.handler.drawingHandler.line.generate(event);
+				} else {
+					this.handler.drawingHandler.line.addPoint(event);
+				}
+			} else if (this.handler.interactionMode === 'arrow') {
+				if (this.handler.pointArray.length && this.handler.activeLine) {
+					this.handler.drawingHandler.arrow.generate(event);
+				} else {
+					this.handler.drawingHandler.arrow.addPoint(event);
+				}
+			}
+		}
+	};
+
+	/**
+	 * Mouse move event on canvas
+	 *
+	 * @param {FabricEvent<MouseEvent>} opt
+	 * @returns
+	 */
+	public mousemove = (opt: FabricEvent) => {
+		const event = opt as FabricEvent<MouseEvent>;
+		if (this.handler.interactionMode === 'grab' && this.panning) {
+			this.handler.interactionHandler.moving(event.e);
+			this.handler.canvas.requestRenderAll();
+		}
+		if (!this.handler.editable && event.target) {
+			if (event.target.superType === 'element') {
+				return;
+			}
+			if (event.target.id !== 'workarea') {
+				if (event.target !== this.handler.target) {
+					this.handler.tooltipHandler.show(event.target);
+				}
+			} else {
+				this.handler.tooltipHandler.hide(event.target);
+			}
+		}
+		if (this.handler.interactionMode === 'polygon') {
+			if (this.handler.activeLine && this.handler.activeLine.class === 'line') {
+				const pointer = this.handler.canvas.getPointer(event.e);
+				this.handler.activeLine.set({ x2: pointer.x, y2: pointer.y });
+				const points = this.handler.activeShape.get('points');
+				points[this.handler.pointArray.length] = {
+					x: pointer.x,
+					y: pointer.y,
+				};
+				this.handler.activeShape.set({
+					points,
+				});
+				this.handler.canvas.requestRenderAll();
+			}
+		} else if (this.handler.interactionMode === 'line') {
+			if (this.handler.activeLine && this.handler.activeLine.class === 'line') {
+				const pointer = this.handler.canvas.getPointer(event.e);
+				this.handler.activeLine.set({ x2: pointer.x, y2: pointer.y });
+			}
+			this.handler.canvas.requestRenderAll();
+		} else if (this.handler.interactionMode === 'arrow') {
+			if (this.handler.activeLine && this.handler.activeLine.class === 'line') {
+				const pointer = this.handler.canvas.getPointer(event.e);
+				this.handler.activeLine.set({ x2: pointer.x, y2: pointer.y });
+			}
+			this.handler.canvas.requestRenderAll();
+		} else if (this.handler.interactionMode === 'link') {
+			if (this.handler.activeLine && this.handler.activeLine.class === 'line') {
+				const pointer = this.handler.canvas.getPointer(event.e);
+				this.handler.activeLine.set({ x2: pointer.x, y2: pointer.y });
+			}
+			this.handler.canvas.requestRenderAll();
+		}
+		return;
+	};
+
+	/**
+	 * Mouse up event on canvas
+	 *
+	 * @param {FabricEvent<MouseEvent>} opt
+	 * @returns
+	 */
+	public mouseup = (opt: FabricEvent) => {
+		const event = opt as FabricEvent<MouseEvent>;
+		if (this.handler.interactionMode === 'grab') {
+			this.panning = false;
+			return;
+		}
+		const { target, e } = event;
+		if (this.handler.interactionMode === 'selection') {
+			if (target && e.shiftKey && target.superType === 'node') {
+				const node = target as NodeObject;
+				this.handler.canvas.discardActiveObject();
+				const nodes = [] as NodeObject[];
+				this.handler.nodeHandler.getNodePath(node, nodes);
+				const activeSelection = new fabric.ActiveSelection(nodes, {
+					canvas: this.handler.canvas,
+					...this.handler.activeSelectionOption,
+				});
+				this.handler.canvas.setActiveObject(activeSelection);
+				this.handler.canvas.requestRenderAll();
+			}
+		}
+		if (this.handler.editable && this.handler.guidelineOption.enabled) {
+			this.handler.guidelineHandler.verticalLines.length = 0;
+			this.handler.guidelineHandler.horizontalLines.length = 0;
+		}
+		this.handler.canvas.renderAll();
+	};
+
+	/**
+	 * Mouse out event on canvas
+	 *
+	 * @param {FabricEvent<MouseEvent>} opt
+	 */
+	public mouseout = (opt: FabricEvent) => {
+		const event = opt as FabricEvent<MouseEvent>;
+		if (!event.target) {
+			this.handler.tooltipHandler.hide();
+		}
+	};
+
+	/**
+	 * Selection event event on canvas
+	 *
+	 * @param {FabricEvent} opt
+	 */
+	public selection = (opt: FabricEvent) => {
+		const { onSelect, activeSelectionOption } = this.handler;
+		const target = opt.target as FabricObject<fabric.ActiveSelection>;
+		if (target && target.type === 'activeSelection') {
+			target.set({
+				...activeSelectionOption,
+			});
+		}
+		if (onSelect) {
+			onSelect(target);
+		}
+	};
+
+	/**
+	 * Called resize event on canvas
+	 *
+	 * @param {number} nextWidth
+	 * @param {number} nextHeight
+	 * @returns
+	 */
+	public resize = (nextWidth: number, nextHeight: number) => {
+		this.handler.canvas.setWidth(nextWidth).setHeight(nextHeight);
+		this.handler.canvas.setBackgroundColor(
+			this.handler.canvasOption.backgroundColor,
+			this.handler.canvas.renderAll.bind(this.handler.canvas),
+		);
+		if (!this.handler.workarea) {
+			return;
+		}
+		const diffWidth = nextWidth / 2 - this.handler.width / 2;
+		const diffHeight = nextHeight / 2 - this.handler.height / 2;
+		this.handler.width = nextWidth;
+		this.handler.height = nextHeight;
+		if (this.handler.workarea.layout === 'fixed') {
+			this.handler.canvas.centerObject(this.handler.workarea);
+			this.handler.workarea.setCoords();
+			if (this.handler.gridOption.enabled) {
+				return;
+			}
+			this.handler.canvas.getObjects().forEach((obj: FabricObject) => {
+				if (obj.id !== 'workarea') {
+					const left = obj.left + diffWidth;
+					const top = obj.top + diffHeight;
+					obj.set({
+						left,
+						top,
+					});
+					obj.setCoords();
+					if (obj.superType === 'element') {
+						const { id } = obj;
+						const el = this.handler.elementHandler.findById(id);
+						// update the element
+						this.handler.elementHandler.setPosition(el, obj);
+					}
+				}
+			});
+			this.handler.canvas.requestRenderAll();
+			return;
+		}
+		if (this.handler.workarea.layout === 'responsive') {
+			const { scaleX } = this.handler.workareaHandler.calculateScale();
+			const center = this.handler.canvas.getCenter();
+			const deltaPoint = new fabric.Point(diffWidth, diffHeight);
+			this.handler.canvas.relativePan(deltaPoint);
+			this.handler.zoomHandler.zoomToPoint(new fabric.Point(center.left, center.top), scaleX);
+			return;
+		}
+		const scaleX = nextWidth / this.handler.workarea.width;
+		const scaleY = nextHeight / this.handler.workarea.height;
+		const diffScaleX = nextWidth / (this.handler.workarea.width * this.handler.workarea.scaleX);
+		const diffScaleY = nextHeight / (this.handler.workarea.height * this.handler.workarea.scaleY);
+		this.handler.workarea.set({
+			scaleX,
+			scaleY,
+		});
+		this.handler.canvas.getObjects().forEach((obj: any) => {
+			const { id } = obj;
+			if (obj.id !== 'workarea') {
+				const left = obj.left * diffScaleX;
+				const top = obj.top * diffScaleY;
+				const newScaleX = obj.scaleX * diffScaleX;
+				const newScaleY = obj.scaleY * diffScaleY;
+				obj.set({
+					scaleX: newScaleX,
+					scaleY: newScaleY,
+					left,
+					top,
+				});
+				obj.setCoords();
+				if (obj.superType === 'element') {
+					const video = obj as VideoObject;
+					const { width, height } = obj;
+					const el = this.handler.elementHandler.findById(id);
+					this.handler.elementHandler.setSize(el, obj);
+					if (video.player) {
+						video.player.setPlayerSize(width, height);
+					}
+					this.handler.elementHandler.setPosition(el, obj);
+				}
+			}
+		});
+		this.handler.canvas.renderAll();
+	};
+
+	/**
+	 * Paste event on canvas
+	 *
+	 * @param {ClipboardEvent} e
+	 * @returns
+	 */
+	public paste = async (e: ClipboardEvent) => {
+		if (this.handler.canvas.wrapperEl !== document.activeElement) {
+			return false;
+		}
+		if (e.preventDefault) {
+			e.preventDefault();
+		}
+		if (e.stopPropagation) {
+			e.stopPropagation();
+		}
+		const clipboardData = e.clipboardData;
+		if (clipboardData.types.length) {
+			clipboardData.types.forEach((clipboardType: string) => {
+				if (clipboardType === 'text/plain') {
+					const textPlain = clipboardData.getData('text/plain');
+					try {
+						const objects = JSON.parse(textPlain);
+						const {
+							gridOption: { grid = 10 },
+							isCut,
+						} = this.handler;
+						const padding = isCut ? 0 : grid;
+						if (objects && Array.isArray(objects)) {
+							const filteredObjects = objects.filter(obj => obj !== null);
+							if (filteredObjects.length === 1) {
+								const obj = filteredObjects[0];
+								if (typeof obj.cloneable !== 'undefined' && !obj.cloneable) {
+									return;
+								}
+								obj.left = obj.properties.left + padding;
+								obj.top = obj.properties.top + padding;
+								const createdObj = this.handler.add(obj, false, true);
+								this.handler.canvas.setActiveObject(createdObj as FabricObject);
+								this.handler.canvas.requestRenderAll();
+							} else {
+								const nodes = [] as any[];
+								const targets = [] as any[];
+								objects.forEach(obj => {
+									if (!obj) {
+										return;
+									}
+									if (obj.superType === 'link') {
+										obj.fromNodeId = nodes[obj.fromNodeIndex].id;
+										obj.toNodeId = nodes[obj.toNodeIndex].id;
+									} else {
+										obj.left = obj.properties.left + padding;
+										obj.top = obj.properties.top + padding;
+									}
+									const createdObj = this.handler.add(obj, false, true);
+									if (obj.superType === 'node') {
+										nodes.push(createdObj);
+									} else {
+										targets.push(createdObj);
+									}
+								});
+								const activeSelection = new fabric.ActiveSelection(nodes.length ? nodes : targets, {
+									canvas: this.handler.canvas,
+									...this.handler.activeSelectionOption,
+								});
+								this.handler.canvas.setActiveObject(activeSelection);
+								this.handler.canvas.requestRenderAll();
+							}
+							if (!this.handler.transactionHandler.active) {
+								this.handler.transactionHandler.save('paste');
+							}
+							this.handler.isCut = false;
+							this.handler.copy();
+						}
+					} catch (error) {
+						console.error(error);
+						// const item = {
+						//     id: uuv4id(),
+						//     type: 'textbox',
+						//     text: textPlain,
+						// };
+						// this.handler.add(item, true);
+					}
+				} else if (clipboardType === 'text/html') {
+					// Todo ...
+					// const textHtml = clipboardData.getData('text/html');
+					// console.log(textHtml);
+				} else if (clipboardType === 'Files') {
+					// Array.from(clipboardData.files).forEach((file) => {
+					//     const { type } = file;
+					//     if (type === 'image/png' || type === 'image/jpeg' || type === 'image/jpg') {
+					//         const item = {
+					//             id: fetchUuid(),
+					//             type: 'image',
+					//             file,
+					//             superType: 'image',
+					//         };
+					//         this.handler.add(item, true);
+					//     } else {
+					//         console.error('Not supported file type');
+					//     }
+					// });
+				}
+			});
+		}
+		return true;
+	};
+
+	/**
+	 * Keydown event on document
+	 *
+	 * @param {KeyboardEvent} e
+	 */
+	public keydown = (e: KeyboardEvent) => {
+		const { keyEvent, editable } = this.handler;
+		if (!Object.keys(keyEvent).length) {
+			return;
+		}
+		const { clipboard, grab } = keyEvent;
+		if (this.handler.interactionHandler.isDrawingMode()) {
+			if (this.handler.shortcutHandler.isEscape(e)) {
+				if (this.handler.interactionMode === 'polygon') {
+					this.handler.drawingHandler.polygon.finish();
+				} else if (this.handler.interactionMode === 'line') {
+					this.handler.drawingHandler.line.finish();
+				} else if (this.handler.interactionMode === 'arrow') {
+					this.handler.drawingHandler.arrow.finish();
+				} else if (this.handler.interactionMode === 'link') {
+					this.handler.linkHandler.finish();
+				}
+			}
+			return;
+		}
+		if (this.handler.shortcutHandler.isW(e) && grab) {
+			this.code = e.code;
+			this.handler.interactionHandler.grab();
+			return;
+		}
+		if (e.altKey && editable && grab) {
+			this.handler.interactionHandler.grab();
+			return;
+		}
+		if (this.handler.shortcutHandler.isEscape(e)) {
+			if (this.handler.interactionMode === 'selection') {
+				this.handler.canvas.discardActiveObject();
+				this.handler.canvas.renderAll();
+			}
+			this.handler.tooltipHandler.hide();
+		}
+		if (this.handler.canvas.wrapperEl !== document.activeElement) {
+			return;
+		}
+		if (editable) {
+			if (this.handler.shortcutHandler.isQ(e)) {
+				this.code = e.code;
+			} else if (this.handler.shortcutHandler.isDelete(e)) {
+				this.handler.remove();
+			} else if (this.handler.shortcutHandler.isArrow(e)) {
+				this.arrowmoving(e);
+			} else if (this.handler.shortcutHandler.isCtrlA(e)) {
+				e.preventDefault();
+				this.handler.selectAll();
+			} else if (this.handler.shortcutHandler.isCtrlC(e)) {
+				e.preventDefault();
+				this.handler.copy();
+			} else if (this.handler.shortcutHandler.isCtrlV(e) && !clipboard) {
+				e.preventDefault();
+				this.handler.paste();
+			} else if (this.handler.shortcutHandler.isCtrlX(e)) {
+				e.preventDefault();
+				this.handler.cut();
+			} else if (this.handler.shortcutHandler.isCtrlZ(e)) {
+				e.preventDefault();
+				this.handler.transactionHandler.undo();
+			} else if (this.handler.shortcutHandler.isCtrlY(e)) {
+				e.preventDefault();
+				this.handler.transactionHandler.redo();
+			} else if (this.handler.shortcutHandler.isPlus(e)) {
+				e.preventDefault();
+				this.handler.zoomHandler.zoomIn();
+			} else if (this.handler.shortcutHandler.isMinus(e)) {
+				e.preventDefault();
+				this.handler.zoomHandler.zoomOut();
+			} else if (this.handler.shortcutHandler.isO(e)) {
+				e.preventDefault();
+				this.handler.zoomHandler.zoomOneToOne();
+			} else if (this.handler.shortcutHandler.isP(e)) {
+				e.preventDefault();
+				this.handler.zoomHandler.zoomToFit();
+			}
+			return;
+		}
+		return;
+	};
+
+	/**
+	 * Key up event on canvas
+	 *
+	 * @param {KeyboardEvent} _e
+	 */
+	public keyup = (e: KeyboardEvent) => {
+		if (this.handler.interactionHandler.isDrawingMode()) {
+			return;
+		}
+		if (!this.handler.shortcutHandler.isW(e)) {
+			this.handler.interactionHandler.selection();
+		}
+	};
+
+	/**
+	 * Context menu event on canvas
+	 *
+	 * @param {MouseEvent} e
+	 */
+	public contextmenu = (e: MouseEvent) => {
+		e.preventDefault();
+		const { editable, onContext } = this.handler;
+		if (editable && onContext) {
+			const target = this.handler.canvas.findTarget(e, false) as FabricObject;
+			if (target && target.type !== 'activeSelection') {
+				this.handler.select(target);
+			}
+			this.handler.contextmenuHandler.show(e, target);
+		}
+	};
+
+	/**
+	 * Mouse down event on canvas
+	 *
+	 * @param {MouseEvent} _e
+	 */
+	public onmousedown = (_e: MouseEvent) => {
+		this.handler.contextmenuHandler.hide();
+	};
+}
+
+export default EventHandler;
diff --git a/src/pages/Fabric/canvas/handlers/FiberHandler.ts b/src/pages/Fabric/canvas/handlers/FiberHandler.ts
new file mode 100644
index 0000000..e509a88
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/FiberHandler.ts
@@ -0,0 +1,21 @@
+import { fabric } from 'fabric';
+import CustomHandler from './CustomHandler';
+
+class FiberHandler extends CustomHandler {
+	protected initialze() {
+		this.handler.canvas.on('mouse:down', this.mousedown);
+	}
+
+	private mousedown(opt: fabric.IEvent) {
+		const { subTargets } = opt;
+		if (subTargets.length) {
+			const target = subTargets[0];
+			console.log(target);
+			if (target.type === 'container') {
+			} else if (target.type === 'coreContainer') {
+			}
+		}
+	}
+}
+
+export default FiberHandler;
diff --git a/src/pages/Fabric/canvas/handlers/GridHandler.ts b/src/pages/Fabric/canvas/handlers/GridHandler.ts
new file mode 100644
index 0000000..7245285
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/GridHandler.ts
@@ -0,0 +1,87 @@
+import { fabric } from 'fabric';
+
+import Handler from './Handler';
+import { FabricObject } from '../utils';
+import { NodeObject } from '../objects/Node';
+
+class GridHandler {
+	handler?: Handler;
+
+	constructor(handler: Handler) {
+		this.handler = handler;
+		this.initialize();
+	}
+
+	/**
+	 * Init grid
+	 *
+	 */
+	public initialize = () => {
+		const { grid, lineColor, borderColor, enabled } = this.handler.gridOption;
+		if (enabled && grid) {
+			const width = 5000;
+			const gridLength = width / grid;
+			const lineOptions = {
+				stroke: lineColor,
+				selectable: false,
+				evented: false,
+				id: 'grid',
+			};
+			for (let i = 0; i < gridLength; i++) {
+				const distance = i * grid;
+				const fhorizontal = new fabric.Line([distance, -width, distance, width], lineOptions);
+				const shorizontal = new fabric.Line([distance - width, -width, distance - width, width], lineOptions);
+				this.handler.canvas.add(fhorizontal);
+				this.handler.canvas.add(shorizontal);
+				const fvertical = new fabric.Line([-width, distance - width, width, distance - width], lineOptions);
+				const svertical = new fabric.Line([-width, distance, width, distance], lineOptions);
+				this.handler.canvas.add(fvertical);
+				this.handler.canvas.add(svertical);
+				if (i % 5 === 0) {
+					fhorizontal.set({ stroke: borderColor });
+					shorizontal.set({ stroke: borderColor });
+					fvertical.set({ stroke: borderColor });
+					svertical.set({ stroke: borderColor });
+				}
+			}
+		}
+	};
+
+	/**
+	 * Set coords in grid
+	 * @param {(FabricObject | fabric.ActiveSelection)} target
+	 * @returns
+	 */
+	public setCoords = (target: FabricObject | fabric.ActiveSelection) => {
+		const {
+			gridOption: { enabled, grid, snapToGrid },
+		} = this.handler;
+		if (enabled && grid && snapToGrid) {
+			if (target.type === 'activeSelection') {
+				const activeSelection = target as fabric.ActiveSelection;
+				activeSelection.set({
+					left: Math.round(target.left / grid) * grid,
+					top: Math.round(target.top / grid) * grid,
+				});
+				activeSelection.setCoords();
+				activeSelection.getObjects().forEach((obj: any) => {
+					if (obj.superType === 'node') {
+						const left = target.left + obj.left + target.width / 2;
+						const top = target.top + obj.top + target.height / 2;
+						this.handler.portHandler.setCoords({ ...obj, left, top });
+					}
+				});
+				return;
+			}
+			const obj = target as FabricObject;
+			obj.set({
+				left: Math.round(target.left / grid) * grid,
+				top: Math.round(target.top / grid) * grid,
+			});
+			target.setCoords();
+			this.handler.portHandler.setCoords(target as NodeObject);
+		}
+	};
+}
+
+export default GridHandler;
diff --git a/src/pages/Fabric/canvas/handlers/GuidelineHandler.ts b/src/pages/Fabric/canvas/handlers/GuidelineHandler.ts
new file mode 100644
index 0000000..4d1478f
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/GuidelineHandler.ts
@@ -0,0 +1,378 @@
+import { fabric } from 'fabric';
+import { FabricEvent, FabricObject, WorkareaObject } from '../utils';
+import Handler from './Handler';
+
+class GuidelineHandler {
+	handler: Handler;
+	verticalLines: { x?: number; y1?: number; y2?: number }[];
+	horizontalLines: { y?: number; x1?: number; x2?: number }[];
+	ctx: CanvasRenderingContext2D;
+	viewportTransform: number[];
+
+	aligningLineOffset = 5;
+	aligningLineMargin = 4;
+	aligningLineWidth = 1;
+	aligningLineColor = 'rgb(255, 0, 0)';
+	zoom = 1;
+
+	constructor(handler: Handler) {
+		this.handler = handler;
+		this.initialize();
+	}
+
+	/**
+	 * Initialize guideline handler
+	 *
+	 */
+	public initialize() {
+		if (this.handler.guidelineOption.enabled) {
+			// @ts-ignore
+			this.handler.canvas.on({
+				'before:render': this.beforeRender,
+				'after:render': this.afterRender,
+			});
+		} else {
+			this.handler.canvas.off({
+				'before:render': this.beforeRender,
+				'after:render': this.afterRender,
+			});
+		}
+		this.ctx = this.handler.canvas.getSelectionContext();
+		this.aligningLineOffset = 5;
+		this.aligningLineMargin = 4;
+		this.aligningLineWidth = 1;
+		this.aligningLineColor = 'rgb(255, 0, 0)';
+		this.viewportTransform = this.handler.canvas.viewportTransform;
+		this.zoom = 1;
+		this.verticalLines = [];
+		this.horizontalLines = [];
+	}
+
+	/**
+	 * Destroy guideline handler
+	 *
+	 * @author salgum1114
+	 */
+	public destroy() {
+		this.handler.canvas.off({
+			'before:render': this.beforeRender,
+			'after:render': this.afterRender,
+		});
+	}
+
+	/**
+	 * Before the render
+	 *
+	 * @param {FabricEvent} _opt
+	 */
+	public beforeRender = (_opt: FabricEvent) => {
+		this.handler.canvas.clearContext(this.handler.guidelineHandler.ctx);
+	};
+
+	/**
+	 * After the render
+	 *
+	 * @param {FabricEvent} _opt
+	 */
+	public afterRender = (_opt: FabricEvent) => {
+		for (let i = this.handler.guidelineHandler.verticalLines.length; i--; ) {
+			this.handler.guidelineHandler.drawVerticalLine(this.handler.guidelineHandler.verticalLines[i]);
+		}
+		for (let i = this.handler.guidelineHandler.horizontalLines.length; i--; ) {
+			this.handler.guidelineHandler.drawHorizontalLine(this.handler.guidelineHandler.horizontalLines[i]);
+		}
+		this.handler.guidelineHandler.verticalLines.length = 0;
+		this.handler.guidelineHandler.horizontalLines.length = 0;
+	};
+
+	drawVerticalLine = (coords: { x?: number; y1?: number; y2?: number }) => {
+		this.drawLine(
+			coords.x + 0.5,
+			coords.y1 > coords.y2 ? coords.y2 : coords.y1,
+			coords.x + 0.5,
+			coords.y2 > coords.y1 ? coords.y2 : coords.y1,
+		);
+	};
+
+	drawHorizontalLine = (coords: { y?: number; x1?: number; x2?: number }) => {
+		this.drawLine(
+			coords.x1 > coords.x2 ? coords.x2 : coords.x1,
+			coords.y + 0.5,
+			coords.x2 > coords.x1 ? coords.x2 : coords.x1,
+			coords.y + 0.5,
+		);
+	};
+
+	drawLine = (x1: number, y1: number, x2: number, y2: number) => {
+		const { ctx, aligningLineWidth, aligningLineColor, viewportTransform, zoom } = this;
+		ctx.save();
+		ctx.lineWidth = aligningLineWidth;
+		ctx.strokeStyle = aligningLineColor;
+		ctx.beginPath();
+		ctx.moveTo(x1 * zoom + viewportTransform[4], y1 * zoom + viewportTransform[5]);
+		ctx.lineTo(x2 * zoom + viewportTransform[4], y2 * zoom + viewportTransform[5]);
+		ctx.stroke();
+		ctx.restore();
+	};
+
+	isInRange = (v1: number, v2: number) => {
+		const { aligningLineMargin } = this;
+		v1 = Math.round(v1);
+		v2 = Math.round(v2);
+		for (let i = v1 - aligningLineMargin, len = v1 + aligningLineMargin; i <= len; i++) {
+			if (i === v2) {
+				return true;
+			}
+		}
+		return false;
+	};
+
+	movingGuidelines = (target: FabricObject) => {
+		const canvasObjects = this.handler.canvas.getObjects() as FabricObject[];
+		const activeObjectCenter = target.getCenterPoint();
+		const activeObjectLeft = activeObjectCenter.x;
+		const activeObjectTop = activeObjectCenter.y;
+		const activeObjectBoundingRect = target.getBoundingRect();
+		const activeObjectHeight = activeObjectBoundingRect.height / this.viewportTransform[3];
+		const activeObjectWidth = activeObjectBoundingRect.width / this.viewportTransform[0];
+		let horizontalInTheRange = false;
+		let verticalInTheRange = false;
+		const { _currentTransform: transform } = this.handler.canvas as any;
+		if (!transform) {
+			return;
+		}
+
+		// It should be trivial to DRY this up by encapsulating (repeating) creation of x1, x2, y1, and y2 into functions,
+		// but we're not doing it here for perf. reasons -- as this a function that's invoked on every mouse move
+
+		for (let i = canvasObjects.length; i--; ) {
+			if (
+				canvasObjects[i] === target ||
+				canvasObjects[i].superType === 'port' ||
+				canvasObjects[i].superType === 'link' ||
+				!canvasObjects[i].evented
+			) {
+				continue;
+			}
+
+			const objectCenter = canvasObjects[i].getCenterPoint();
+			const objectLeft = objectCenter.x;
+			const objectTop = objectCenter.y;
+			const objectBoundingRect = canvasObjects[i].getBoundingRect();
+			const objectHeight = objectBoundingRect.height / this.viewportTransform[3];
+			const objectWidth = objectBoundingRect.width / this.viewportTransform[0];
+
+			// snap by the horizontal center line
+			if (this.isInRange(objectLeft, activeObjectLeft)) {
+				verticalInTheRange = true;
+				if (canvasObjects[i].id === 'workarea') {
+					const y1 = -5000;
+					const y2 = 5000;
+					this.verticalLines.push({
+						x: objectLeft,
+						y1,
+						y2,
+					});
+				} else {
+					this.verticalLines.push({
+						x: objectLeft,
+						y1:
+							objectTop < activeObjectTop
+								? objectTop - objectHeight / 2 - this.aligningLineOffset
+								: objectTop + objectHeight / 2 + this.aligningLineOffset,
+						y2:
+							activeObjectTop > objectTop
+								? activeObjectTop + activeObjectHeight / 2 + this.aligningLineOffset
+								: activeObjectTop - activeObjectHeight / 2 - this.aligningLineOffset,
+					});
+				}
+				target.setPositionByOrigin(new fabric.Point(objectLeft, activeObjectTop), 'center', 'center');
+			}
+
+			// snap by the left edge
+			if (this.isInRange(objectLeft - objectWidth / 2, activeObjectLeft - activeObjectWidth / 2)) {
+				verticalInTheRange = true;
+				if (canvasObjects[i].id === 'workarea') {
+					const workarea = canvasObjects[i] as WorkareaObject;
+					const y1 = -5000;
+					const y2 = 5000;
+					let x = objectLeft - objectWidth / 2;
+					if (workarea.layout === 'fullscreen') {
+						x = 0;
+					}
+					this.verticalLines.push({
+						x,
+						y1,
+						y2,
+					});
+				} else {
+					this.verticalLines.push({
+						x: objectLeft - objectWidth / 2,
+						y1:
+							objectTop < activeObjectTop
+								? objectTop - objectHeight / 2 - this.aligningLineOffset
+								: objectTop + objectHeight / 2 + this.aligningLineOffset,
+						y2:
+							activeObjectTop > objectTop
+								? activeObjectTop + activeObjectHeight / 2 + this.aligningLineOffset
+								: activeObjectTop - activeObjectHeight / 2 - this.aligningLineOffset,
+					});
+				}
+				target.setPositionByOrigin(
+					new fabric.Point(objectLeft - objectWidth / 2 + activeObjectWidth / 2, activeObjectTop),
+					'center',
+					'center',
+				);
+			}
+
+			// snap by the right edge
+			if (this.isInRange(objectLeft + objectWidth / 2, activeObjectLeft + activeObjectWidth / 2)) {
+				verticalInTheRange = true;
+				if (canvasObjects[i].id === 'workarea') {
+					const workarea = canvasObjects[i] as WorkareaObject;
+					const y1 = -5000;
+					const y2 = 5000;
+					let x = objectLeft + objectWidth / 2;
+					if (workarea.layout === 'fullscreen') {
+						x = this.handler.canvas.getWidth();
+					}
+					this.verticalLines.push({
+						x,
+						y1,
+						y2,
+					});
+				} else {
+					this.verticalLines.push({
+						x: objectLeft + objectWidth / 2,
+						y1:
+							objectTop < activeObjectTop
+								? objectTop - objectHeight / 2 - this.aligningLineOffset
+								: objectTop + objectHeight / 2 + this.aligningLineOffset,
+						y2:
+							activeObjectTop > objectTop
+								? activeObjectTop + activeObjectHeight / 2 + this.aligningLineOffset
+								: activeObjectTop - activeObjectHeight / 2 - this.aligningLineOffset,
+					});
+				}
+				target.setPositionByOrigin(
+					new fabric.Point(objectLeft + objectWidth / 2 - activeObjectWidth / 2, activeObjectTop),
+					'center',
+					'center',
+				);
+			}
+
+			// snap by the vertical center line
+			if (this.isInRange(objectTop, activeObjectTop)) {
+				horizontalInTheRange = true;
+				if (canvasObjects[i].id === 'workarea') {
+					const x1 = -5000;
+					const x2 = 5000;
+					this.horizontalLines.push({
+						y: objectTop,
+						x1,
+						x2,
+					});
+				} else {
+					this.horizontalLines.push({
+						y: objectTop,
+						x1:
+							objectLeft < activeObjectLeft
+								? objectLeft - objectWidth / 2 - this.aligningLineOffset
+								: objectLeft + objectWidth / 2 + this.aligningLineOffset,
+						x2:
+							activeObjectLeft > objectLeft
+								? activeObjectLeft + activeObjectWidth / 2 + this.aligningLineOffset
+								: activeObjectLeft - activeObjectWidth / 2 - this.aligningLineOffset,
+					});
+				}
+				target.setPositionByOrigin(new fabric.Point(activeObjectLeft, objectTop), 'center', 'center');
+			}
+
+			// snap by the top edge
+			if (this.isInRange(objectTop - objectHeight / 2, activeObjectTop - activeObjectHeight / 2)) {
+				horizontalInTheRange = true;
+				if (canvasObjects[i].id === 'workarea') {
+					const workarea = canvasObjects[i] as WorkareaObject;
+					const x1 = -5000;
+					const x2 = 5000;
+					let y = objectTop - objectHeight / 2;
+					if (workarea.layout === 'fullscreen') {
+						y = 0;
+					}
+					this.horizontalLines.push({
+						y,
+						x1,
+						x2,
+					});
+				} else {
+					this.horizontalLines.push({
+						y: objectTop - objectHeight / 2,
+						x1:
+							objectLeft < activeObjectLeft
+								? objectLeft - objectWidth / 2 - this.aligningLineOffset
+								: objectLeft + objectWidth / 2 + this.aligningLineOffset,
+						x2:
+							activeObjectLeft > objectLeft
+								? activeObjectLeft + activeObjectWidth / 2 + this.aligningLineOffset
+								: activeObjectLeft - activeObjectWidth / 2 - this.aligningLineOffset,
+					});
+				}
+				target.setPositionByOrigin(
+					new fabric.Point(activeObjectLeft, objectTop - objectHeight / 2 + activeObjectHeight / 2),
+					'center',
+					'center',
+				);
+			}
+
+			// snap by the bottom edge
+			if (this.isInRange(objectTop + objectHeight / 2, activeObjectTop + activeObjectHeight / 2)) {
+				horizontalInTheRange = true;
+				if (canvasObjects[i].id === 'workarea') {
+					const workarea = canvasObjects[i] as WorkareaObject;
+					const x1 = -5000;
+					const x2 = 5000;
+					let y = objectTop + objectHeight / 2;
+					if (workarea.layout === 'fullscreen') {
+						y = this.handler.canvas.getHeight();
+					}
+					this.horizontalLines.push({
+						y,
+						x1,
+						x2,
+					});
+				} else {
+					this.horizontalLines.push({
+						y: objectTop + objectHeight / 2,
+						x1:
+							objectLeft < activeObjectLeft
+								? objectLeft - objectWidth / 2 - this.aligningLineOffset
+								: objectLeft + objectWidth / 2 + this.aligningLineOffset,
+						x2:
+							activeObjectLeft > objectLeft
+								? activeObjectLeft + activeObjectWidth / 2 + this.aligningLineOffset
+								: activeObjectLeft - activeObjectWidth / 2 - this.aligningLineOffset,
+					});
+				}
+				target.setPositionByOrigin(
+					new fabric.Point(activeObjectLeft, objectTop + objectHeight / 2 - activeObjectHeight / 2),
+					'center',
+					'center',
+				);
+			}
+		}
+
+		if (!horizontalInTheRange) {
+			this.horizontalLines.length = 0;
+		}
+
+		if (!verticalInTheRange) {
+			this.verticalLines.length = 0;
+		}
+	};
+
+	scalingGuidelines = (_target: FabricObject) => {
+		// TODO... object scaling guideline
+	};
+}
+
+export default GuidelineHandler;
diff --git a/src/pages/Fabric/canvas/handlers/Handler.ts b/src/pages/Fabric/canvas/handlers/Handler.ts
new file mode 100644
index 0000000..2c5e0a9
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/Handler.ts
@@ -0,0 +1,1980 @@
+import { fabric } from 'fabric';
+import { union } from 'lodash';
+import { useUuid } from '@/hooks/useUuid';
+import { message } from 'antd';
+import {
+    AlignmentHandler,
+    AnimationHandler,
+    ChartHandler,
+    ContextmenuHandler,
+    CropHandler,
+    CustomHandler,
+    DrawingHandler,
+    ElementHandler,
+    EventHandler,
+    GridHandler,
+    GuidelineHandler,
+    ImageHandler,
+    InteractionHandler,
+    LinkHandler,
+    NodeHandler,
+    PortHandler,
+    ShortcutHandler,
+    TooltipHandler,
+    TransactionHandler,
+    WorkareaHandler,
+    ZoomHandler,
+} from '.';
+import CanvasObject from '../CanvasObject';
+import { defaults } from '../constants';
+import { LinkObject } from '../objects/Link';
+import { NodeObject } from '../objects/Node';
+import { PortObject } from '../objects/Port';
+import {
+    CanvasOption,
+    FabricCanvas,
+    FabricElement,
+    FabricGroup,
+    FabricImage,
+    FabricObject,
+    FabricObjectOption,
+    FabricObjects,
+    GridOption,
+    GuidelineOption,
+    InteractionMode,
+    KeyEvent,
+    WorkareaObject,
+    WorkareaOption,
+} from '../utils';
+import { LinkOption } from './LinkHandler';
+import { TransactionEvent } from './TransactionHandler';
+
+// eslint-disable-next-line react-hooks/rules-of-hooks
+const { fetchUuid } = useUuid();
+
+export interface HandlerCallback {
+	/**
+	 * When has been added object in Canvas, Called function
+	 *
+	 */
+	onAdd?: (object: FabricObject) => void;
+	/**
+	 * Return contextmenu element
+	 *
+	 */
+	onContext?: (el: HTMLDivElement, e: React.MouseEvent, target?: FabricObject) => Promise<any> | any;
+	/**
+	 * Return tooltip element
+	 *
+	 */
+	onTooltip?: (el: HTMLDivElement, target?: FabricObject) => Promise<any> | any;
+	/**
+	 * When zoom, Called function
+	 */
+	onZoom?: (zoomRatio: number) => void;
+	/**
+	 * When clicked object, Called function
+	 *
+	 */
+	onClick?: (canvas: FabricCanvas, target: FabricObject) => void;
+	/**
+	 * When double clicked object, Called function
+	 *
+	 */
+	onDblClick?: (canvas: FabricCanvas, target: FabricObject) => void;
+	/**
+	 * When modified object, Called function
+	 */
+	onModified?: (target: FabricObject) => void;
+	/**
+	 * When select object, Called function
+	 *
+	 */
+	onSelect?: (target: FabricObject) => void;
+	/**
+	 * When has been removed object in Canvas, Called function
+	 *
+	 */
+	onRemove?: (target: FabricObject) => void;
+	/**
+	 * When has been undo or redo, Called function
+	 *
+	 */
+	onTransaction?: (transaction: TransactionEvent) => void;
+	/**
+	 * When has been changed interaction mode, Called function
+	 *
+	 */
+	onInteraction?: (interactionMode: InteractionMode) => void;
+	/**
+	 * When canvas has been loaded
+	 *
+	 */
+	onLoad?: (handler: Handler, canvas?: fabric.Canvas) => void;
+}
+
+export interface HandlerOption {
+	/**
+	 * Canvas id
+	 * @type {string}
+	 */
+	id?: string;
+	/**
+	 * Canvas object
+	 * @type {FabricCanvas}
+	 */
+	canvas?: FabricCanvas;
+	/**
+	 * Canvas parent element
+	 * @type {HTMLDivElement}
+	 */
+	container?: HTMLDivElement;
+	/**
+	 * Canvas editable
+	 * @type {boolean}
+	 */
+	editable?: boolean;
+	/**
+	 * Canvas interaction mode
+	 * @type {InteractionMode}
+	 */
+	interactionMode?: InteractionMode;
+	/**
+	 * Persist properties for object
+	 * @type {string[]}
+	 */
+	propertiesToInclude?: string[];
+	/**
+	 * Minimum zoom ratio
+	 * @type {number}
+	 */
+	minZoom?: number;
+	/**
+	 * Maximum zoom ratio
+	 * @type {number}
+	 */
+	maxZoom?: number;
+	/**
+	 * Zoom ratio step
+	 * @type {number}
+	 */
+	zoomStep?: number;
+	/**
+	 * Workarea option
+	 * @type {WorkareaOption}
+	 */
+	workareaOption?: WorkareaOption;
+	/**
+	 * Canvas option
+	 * @type {CanvasOption}
+	 */
+	canvasOption?: CanvasOption;
+	/**
+	 * Grid option
+	 * @type {GridOption}
+	 */
+	gridOption?: GridOption;
+	/**
+	 * Default option for Fabric Object
+	 * @type {FabricObjectOption}
+	 */
+	objectOption?: FabricObjectOption;
+	/**
+	 * Guideline option
+	 * @type {GuidelineOption}
+	 */
+	guidelineOption?: GuidelineOption;
+	/**
+	 * Whether to use zoom
+	 * @type {boolean}
+	 */
+	zoomEnabled?: boolean;
+	/**
+	 * ActiveSelection option
+	 * @type {Partial<FabricObjectOption<fabric.ActiveSelection>>}
+	 */
+	activeSelectionOption?: Partial<FabricObjectOption<fabric.ActiveSelection>>;
+	/**
+	 * Canvas width
+	 * @type {number}
+	 */
+	width?: number;
+	/**
+	 * Canvas height
+	 * @type {number}
+	 */
+	height?: number;
+	/**
+	 * Keyboard event in Canvas
+	 * @type {KeyEvent}
+	 */
+	keyEvent?: KeyEvent;
+	/**
+	 * Append custom objects
+	 * @type {{ [key: string]: any }}
+	 */
+	fabricObjects?: FabricObjects;
+	handlers?: { [key: string]: CustomHandler };
+	[key: string]: any;
+}
+
+export type HandlerOptions = HandlerOption & HandlerCallback;
+
+/**
+ * Main handler for Canvas
+ * @class Handler
+ * @implements {HandlerOptions}
+ */
+class Handler implements HandlerOptions {
+	public id: string;
+	public canvas: FabricCanvas;
+	public workarea: WorkareaObject;
+	public container: HTMLDivElement;
+	public editable: boolean;
+	public interactionMode: InteractionMode;
+	public minZoom: number;
+	public maxZoom: number;
+	public zoomStep: number = 0.05;
+	public propertiesToInclude?: string[] = defaults.propertiesToInclude;
+	public workareaOption?: WorkareaOption = defaults.workareaOption;
+	public canvasOption?: CanvasOption = defaults.canvasOption;
+	public gridOption?: GridOption = defaults.gridOption;
+	public objectOption?: FabricObjectOption = defaults.objectOption;
+	public guidelineOption?: GuidelineOption = defaults.guidelineOption;
+	public keyEvent?: KeyEvent = defaults.keyEvent;
+	public activeSelectionOption?: Partial<FabricObjectOption<fabric.ActiveSelection>> = defaults.activeSelectionOption;
+	public fabricObjects?: FabricObjects = CanvasObject;
+	public zoomEnabled?: boolean;
+	public width?: number;
+	public height?: number;
+
+	public onAdd?: (object: FabricObject) => void;
+	public onContext?: (el: HTMLDivElement, e: React.MouseEvent, target?: FabricObject) => Promise<any>;
+	public onTooltip?: (el: HTMLDivElement, target?: FabricObject) => Promise<any>;
+	public onZoom?: (zoomRatio: number) => void;
+	public onClick?: (canvas: FabricCanvas, target: FabricObject) => void;
+	public onDblClick?: (canvas: FabricCanvas, target: FabricObject) => void;
+	public onModified?: (target: FabricObject) => void;
+	public onSelect?: (target: FabricObject) => void;
+	public onRemove?: (target: FabricObject) => void;
+	public onTransaction?: (transaction: TransactionEvent) => void;
+	public onInteraction?: (interactionMode: InteractionMode) => void;
+	public onLoad?: (handler: Handler, canvas?: fabric.Canvas) => void;
+
+	public imageHandler: ImageHandler;
+	public chartHandler: ChartHandler;
+	public elementHandler: ElementHandler;
+	public cropHandler: CropHandler;
+	public animationHandler: AnimationHandler;
+	public contextmenuHandler: ContextmenuHandler;
+	public tooltipHandler: TooltipHandler;
+	public zoomHandler: ZoomHandler;
+	public workareaHandler: WorkareaHandler;
+	public interactionHandler: InteractionHandler;
+	public transactionHandler: TransactionHandler;
+	public gridHandler: GridHandler;
+	public portHandler: PortHandler;
+	public linkHandler: LinkHandler;
+	public nodeHandler: NodeHandler;
+	public alignmentHandler: AlignmentHandler;
+	public guidelineHandler: GuidelineHandler;
+	public eventHandler: EventHandler;
+	public drawingHandler: DrawingHandler;
+	public shortcutHandler: ShortcutHandler;
+	public handlers: { [key: string]: CustomHandler } = {};
+
+	public objectMap: Record<string, FabricObject> = {};
+	public objects: FabricObject[];
+	public activeLine?: any;
+	public activeShape?: any;
+	public zoom = 1;
+	public prevTarget?: FabricObject;
+	public target?: FabricObject;
+	public pointArray?: any[];
+	public lineArray?: any[];
+	public isCut = false;
+
+	private isRequsetAnimFrame = false;
+	private requestFrame: any;
+	/**
+	 * Copied object
+	 *
+	 * @private
+	 * @type {*}
+	 */
+	private clipboard: any;
+
+	constructor(options: HandlerOptions) {
+		this.initialize(options);
+	}
+
+	/**
+	 * Initialize handler
+	 *
+	 * @author salgum1114
+	 * @param {HandlerOptions} options
+	 */
+	public initialize(options: HandlerOptions) {
+		this.initOption(options);
+		this.initCallback(options);
+		this.initHandler();
+	}
+
+	/**
+	 * Init class fields
+	 * @param {HandlerOptions} options
+	 */
+	public initOption = (options: HandlerOptions) => {
+		this.id = options.id;
+		this.canvas = options.canvas;
+		this.container = options.container;
+		this.editable = options.editable;
+		this.interactionMode = options.interactionMode;
+		this.minZoom = options.minZoom;
+		this.maxZoom = options.maxZoom;
+		this.zoomStep = options.zoomStep || 0.05;
+		this.zoomEnabled = options.zoomEnabled;
+		this.width = options.width;
+		this.height = options.height;
+		this.objects = [];
+		this.setPropertiesToInclude(options.propertiesToInclude);
+		this.setWorkareaOption(options.workareaOption);
+		this.setCanvasOption(options.canvasOption);
+		this.setGridOption(options.gridOption);
+		this.setObjectOption(options.objectOption);
+		this.setFabricObjects(options.fabricObjects);
+		this.setGuidelineOption(options.guidelineOption);
+		this.setActiveSelectionOption(options.activeSelectionOption);
+		this.setKeyEvent(options.keyEvent);
+	};
+
+	/**
+	 * Initialize callback
+	 * @param {HandlerOptions} options
+	 */
+	public initCallback = (options: HandlerOptions) => {
+		this.onAdd = options.onAdd;
+		this.onTooltip = options.onTooltip;
+		this.onZoom = options.onZoom;
+		this.onContext = options.onContext;
+		this.onClick = options.onClick;
+		this.onModified = options.onModified;
+		this.onDblClick = options.onDblClick;
+		this.onSelect = options.onSelect;
+		this.onRemove = options.onRemove;
+		this.onTransaction = options.onTransaction;
+		this.onInteraction = options.onInteraction;
+		this.onLoad = options.onLoad;
+	};
+
+	/**
+	 * Initialize handlers
+	 *
+	 */
+	public initHandler = () => {
+		this.workareaHandler = new WorkareaHandler(this);
+		this.imageHandler = new ImageHandler(this);
+		this.chartHandler = new ChartHandler(this);
+		this.elementHandler = new ElementHandler(this);
+		this.cropHandler = new CropHandler(this);
+		this.animationHandler = new AnimationHandler(this);
+		this.contextmenuHandler = new ContextmenuHandler(this);
+		this.tooltipHandler = new TooltipHandler(this);
+		this.zoomHandler = new ZoomHandler(this, this.zoomStep);
+		this.interactionHandler = new InteractionHandler(this);
+		this.transactionHandler = new TransactionHandler(this);
+		this.gridHandler = new GridHandler(this);
+		this.portHandler = new PortHandler(this);
+		this.linkHandler = new LinkHandler(this);
+		this.nodeHandler = new NodeHandler(this);
+		this.alignmentHandler = new AlignmentHandler(this);
+		this.guidelineHandler = new GuidelineHandler(this);
+		this.eventHandler = new EventHandler(this);
+		this.drawingHandler = new DrawingHandler(this);
+		this.shortcutHandler = new ShortcutHandler(this);
+	};
+
+	/**
+	 * Get primary object
+	 * @returns {FabricObject[]}
+	 */
+	public getObjects = (): FabricObject[] => {
+		const objects = this.canvas.getObjects().filter((obj: FabricObject) => {
+			if (obj.id === 'workarea') {
+				return false;
+			} else if (obj.id === 'grid') {
+				return false;
+			} else if (obj.superType === 'port') {
+				return false;
+			} else if (!obj.id) {
+				return false;
+			}
+			return true;
+		}) as FabricObject[];
+		if (objects.length) {
+			objects.forEach(obj => (this.objectMap[obj.id] = obj));
+		} else {
+			this.objectMap = {};
+		}
+		return objects;
+	};
+
+	/**
+	 * Set key pair
+	 * @param {keyof FabricObject} key
+	 * @param {*} value
+	 * @returns
+	 */
+	public set = (key: keyof FabricObject, value: any) => {
+		const activeObject = this.canvas.getActiveObject() as FabricObject;
+		if (!activeObject) {
+			return;
+		}
+		if (activeObject.type === 'svg' && (key === 'fill' || key === 'stroke')) {
+			(activeObject as FabricGroup)._objects.forEach(obj => obj.set(key, value));
+		}
+		activeObject.set(key, value);
+		activeObject.setCoords();
+		this.canvas.requestRenderAll();
+		const { id, superType, type, player, width, height } = activeObject as any;
+		if (superType === 'element') {
+			if (key === 'visible') {
+				if (value) {
+					activeObject.element.style.display = 'block';
+				} else {
+					activeObject.element.style.display = 'none';
+				}
+			}
+			const el = this.elementHandler.findById(id);
+			// update the element
+			this.elementHandler.setScaleOrAngle(el, activeObject);
+			this.elementHandler.setSize(el, activeObject);
+			this.elementHandler.setPosition(el, activeObject);
+			if (type === 'video' && player) {
+				player.setPlayerSize(width, height);
+			}
+		}
+		const { onModified } = this;
+		if (onModified) {
+			onModified(activeObject);
+		}
+	};
+
+	/**
+	 * Set option
+	 * @param {Partial<FabricObject>} option
+	 * @returns
+	 */
+	public setObject = (option: Partial<FabricObject>) => {
+		const activeObject = this.canvas.getActiveObject() as any;
+		if (!activeObject) {
+			return;
+		}
+		Object.keys(option).forEach(key => {
+			if (option[key] !== activeObject[key]) {
+				activeObject.set(key, option[key]);
+				activeObject.setCoords();
+			}
+		});
+		this.canvas.requestRenderAll();
+		const { id, superType, type, player, width, height } = activeObject;
+		if (superType === 'element') {
+			if ('visible' in option) {
+				if (option.visible) {
+					activeObject.element.style.display = 'block';
+				} else {
+					activeObject.element.style.display = 'none';
+				}
+			}
+			const el = this.elementHandler.findById(id);
+			// update the element
+			this.elementHandler.setScaleOrAngle(el, activeObject);
+			this.elementHandler.setSize(el, activeObject);
+			this.elementHandler.setPosition(el, activeObject);
+			if (type === 'video' && player) {
+				player.setPlayerSize(width, height);
+			}
+		}
+		const { onModified } = this;
+		if (onModified) {
+			onModified(activeObject);
+		}
+	};
+
+	/**
+	 * Set key pair by object
+	 * @param {FabricObject} obj
+	 * @param {string} key
+	 * @param {*} value
+	 * @returns
+	 */
+	public setByObject = (obj: any, key: string, value: any) => {
+		if (!obj) {
+			return;
+		}
+		if (obj.type === 'svg') {
+			if (key === 'fill') {
+				obj.setFill(value);
+			} else if (key === 'stroke') {
+				obj.setStroke(value);
+			}
+		}
+		obj.set(key, value);
+		obj.setCoords();
+		this.canvas.renderAll();
+		const { id, superType, type, player, width, height } = obj as any;
+		if (superType === 'element') {
+			if (key === 'visible') {
+				if (value) {
+					obj.element.style.display = 'block';
+				} else {
+					obj.element.style.display = 'none';
+				}
+			}
+			const el = this.elementHandler.findById(id);
+			// update the element
+			this.elementHandler.setScaleOrAngle(el, obj);
+			this.elementHandler.setSize(el, obj);
+			this.elementHandler.setPosition(el, obj);
+			if (type === 'video' && player) {
+				player.setPlayerSize(width, height);
+			}
+		}
+		const { onModified } = this;
+		if (onModified) {
+			onModified(obj);
+		}
+	};
+
+	/**
+	 * Set key pair by id
+	 * @param {string} id
+	 * @param {string} key
+	 * @param {*} value
+	 */
+	public setById = (id: string, key: string, value: any) => {
+		const findObject = this.findById(id);
+		this.setByObject(findObject, key, value);
+	};
+
+	/**
+	 * Set partial by object
+	 * @param {FabricObject} obj
+	 * @param {FabricObjectOption} option
+	 * @returns
+	 */
+	public setByPartial = (obj: FabricObject, option: FabricObjectOption) => {
+		if (!obj) {
+			return;
+		}
+		if (obj.type === 'svg') {
+			if (option.fill) {
+				obj.setFill(option.fill);
+			} else if (option.stroke) {
+				obj.setStroke(option.stroke);
+			}
+		}
+		obj.set(option);
+		obj.setCoords();
+		this.canvas.renderAll();
+		const { id, superType, type, player, width, height } = obj as any;
+		if (superType === 'element') {
+			if ('visible' in option) {
+				if (option.visible) {
+					obj.element.style.display = 'block';
+				} else {
+					obj.element.style.display = 'none';
+				}
+			}
+			const el = this.elementHandler.findById(id);
+			// update the element
+			this.elementHandler.setScaleOrAngle(el, obj);
+			this.elementHandler.setSize(el, obj);
+			this.elementHandler.setPosition(el, obj);
+			if (type === 'video' && player) {
+				player.setPlayerSize(width, height);
+			}
+		}
+	};
+
+	/**
+	 * Set shadow
+	 * @param {fabric.Shadow} option
+	 * @returns
+	 */
+	public setShadow = (option: fabric.IShadowOptions) => {
+		const activeObject = this.canvas.getActiveObject() as FabricObject;
+		if (!activeObject) {
+			return;
+		}
+		activeObject.set('shadow', new fabric.Shadow(option));
+		this.canvas.requestRenderAll();
+		const { onModified } = this;
+		if (onModified) {
+			onModified(activeObject);
+		}
+	};
+
+	/**
+	 * Set the image
+	 * @param {FabricImage} obj
+	 * @param {(File | string)} [source]
+	 * @returns
+	 */
+	public setImage = (obj: FabricImage, source?: File | string): Promise<FabricImage> => {
+		return new Promise(resolve => {
+			if (!source) {
+				obj.set('file', null);
+				obj.set('src', null);
+				resolve(
+					obj.setSrc('./images/sample/transparentBg.png', () => this.canvas.renderAll(), {
+						dirty: true,
+					}) as FabricImage,
+				);
+			}
+			if (source instanceof File) {
+				const reader = new FileReader();
+				reader.onload = () => {
+					obj.set('file', source);
+					obj.set('src', null);
+					resolve(
+						obj.setSrc(reader.result as string, () => this.canvas.renderAll(), {
+							dirty: true,
+						}) as FabricImage,
+					);
+				};
+				reader.readAsDataURL(source);
+			} else {
+				obj.set('file', null);
+				obj.set('src', source);
+				resolve(
+					obj.setSrc(source, () => this.canvas.renderAll(), {
+						dirty: true,
+					}) as FabricImage,
+				);
+			}
+		});
+	};
+
+	/**
+	 * Set image by id
+	 * @param {string} id
+	 * @param {*} source
+	 * @returns
+	 */
+	public setImageById = (id: string, source: any) => {
+		const findObject = this.findById(id) as FabricImage;
+		return Promise.resolve(this.setImage(findObject, source));
+	};
+
+	/**
+	 * Set visible
+	 * @param {boolean} [visible]
+	 * @returns
+	 */
+	public setVisible = (visible?: boolean) => {
+		const activeObject = this.canvas.getActiveObject() as FabricElement;
+		if (!activeObject) {
+			return;
+		}
+		if (activeObject.superType === 'element') {
+			if (visible) {
+				activeObject.element.style.display = 'block';
+			} else {
+				activeObject.element.style.display = 'none';
+			}
+		}
+		activeObject.set({
+			visible,
+		});
+		this.canvas.renderAll();
+	};
+
+	/**
+	 * Set the position on Object
+	 *
+	 * @param {FabricObject} obj
+	 * @param {boolean} [centered]
+	 */
+	public centerObject = (obj: FabricObject, centered?: boolean) => {
+		if (centered) {
+			this.canvas.centerObject(obj);
+			obj.setCoords();
+		} else {
+			this.setByPartial(obj, {
+				left:
+					obj.left / this.canvas.getZoom() -
+					obj.width / 2 -
+					this.canvas.viewportTransform[4] / this.canvas.getZoom(),
+				top:
+					obj.top / this.canvas.getZoom() -
+					obj.height / 2 -
+					this.canvas.viewportTransform[5] / this.canvas.getZoom(),
+			});
+		}
+	};
+
+	/**
+	 * Add object
+	 * @param {FabricObjectOption} obj
+	 * @param {boolean} [centered=true]
+	 * @param {boolean} [loaded=false]
+	 * @param {boolean} [group=false]
+	 * @returns
+	 */
+	public add = (obj: FabricObjectOption, centered = true, loaded = false, group = false) => {
+		const { editable, onAdd, gridOption, objectOption } = this;
+		const option: any = {
+			hasControls: editable,
+			hasBorders: editable,
+			selectable: editable,
+			lockMovementX: !editable,
+			lockMovementY: !editable,
+			hoverCursor: !editable ? 'pointer' : 'move',
+		};
+		if (obj.type === 'i-text') {
+			option.editable = false;
+		} else {
+			option.editable = editable;
+		}
+		if (editable && this.workarea.layout === 'fullscreen') {
+			option.scaleX = this.workarea.scaleX;
+			option.scaleY = this.workarea.scaleY;
+		}
+		const newOption = Object.assign(
+			{},
+			objectOption,
+			obj,
+			{
+				container: this.container.id,
+				editable,
+			},
+			option,
+		);
+		// Individually create canvas object
+		if (obj.superType === 'link') {
+			return this.linkHandler.create(newOption, loaded);
+		}
+		let createdObj;
+		// Create canvas object
+		console.log(obj, 'obj_newOption', newOption)
+		// return
+		if (obj.type === 'image') {
+			createdObj = this.addImage(newOption);
+		} else if (obj.type === 'group') {
+			createdObj = this.addGroup(newOption);
+		} else {
+			createdObj = this.fabricObjects[obj.type].create(newOption);
+		}
+		if (group) {
+			return createdObj;
+		}
+		this.canvas.add(createdObj);
+		this.objects = this.getObjects();
+		if (!editable && !(obj.superType === 'element')) {
+			createdObj.on('mousedown', this.eventHandler.object.mousedown);
+		}
+		if (createdObj.dblclick) {
+			createdObj.on('mousedblclick', this.eventHandler.object.mousedblclick);
+		}
+		if (this.objects.some(object => object.type === 'gif')) {
+			this.startRequestAnimFrame();
+		} else {
+			this.stopRequestAnimFrame();
+		}
+		if (obj.superType !== 'drawing' && obj.superType !== 'link' && editable && !loaded) {
+			this.centerObject(createdObj, centered);
+		}
+		if (createdObj.superType === 'node') {
+			this.portHandler.create(createdObj as NodeObject);
+			if (createdObj.iconButton) {
+				this.canvas.add(createdObj.iconButton);
+			}
+		}
+		if (!editable && createdObj.animation && createdObj.animation.autoplay) {
+			this.animationHandler.play(createdObj.id);
+		}
+		if (createdObj.superType === 'node') {
+			createdObj.set('shadow', {
+				color: createdObj.stroke,
+			} as fabric.Shadow);
+		}
+		if (gridOption.enabled) {
+			this.gridHandler.setCoords(createdObj);
+		}
+		if (!this.transactionHandler.active && !loaded) {
+			this.transactionHandler.save('add');
+		}
+		if (onAdd && editable && !loaded) {
+			onAdd(createdObj);
+		}
+		return createdObj;
+	};
+
+	/**
+	 * Add group object
+	 *
+	 * @param {FabricGroup} obj
+	 * @param {boolean} [centered=true]
+	 * @param {boolean} [loaded=false]
+	 * @returns
+	 */
+	public addGroup = (obj: FabricGroup) => {
+		const { objects = [], ...other } = obj;
+		const _objects = objects.map(child => this.add(child, false, true, true)) as FabricObject[];
+		return new fabric.Group(_objects, other) as FabricGroup;
+	};
+
+	/**
+	 * Add iamge object
+	 * @param {FabricImage} obj
+	 * @returns
+	 */
+	public addImage = (obj: FabricImage) => {
+		const { objectOption } = this;
+		const { filters = [], src, file, ...otherOption } = obj;
+		const image = new Image();
+		// if (typeof src === 'string') {
+		// 	image.src = src;
+		// }
+		const createdObj = new fabric.Image(image, {
+			...objectOption,
+			...otherOption,
+		}) as FabricImage;
+		createdObj.set({
+			filters: this.imageHandler.createFilters(filters),
+		});
+		this.setImage(createdObj, src || file);
+		return createdObj;
+	};
+
+	/**
+	 * Remove object
+	 * @param {FabricObject} target
+	 * @returns {any}
+	 */
+	public remove = (target?: FabricObject) => {
+		const activeObject = target || (this.canvas.getActiveObject() as any);
+		if (this.prevTarget && this.prevTarget.superType === 'link') {
+			this.linkHandler.remove(this.prevTarget as LinkObject);
+			if (!this.transactionHandler.active) {
+				this.transactionHandler.save('remove');
+			}
+			return;
+		}
+		if (!activeObject) {
+			return;
+		}
+		if (typeof activeObject.deletable !== 'undefined' && !activeObject.deletable) {
+			return;
+		}
+		if (activeObject.type !== 'activeSelection') {
+			this.canvas.discardActiveObject();
+			if (activeObject.superType === 'element') {
+				this.elementHandler.removeById(activeObject.id);
+			}
+			if (activeObject.superType === 'link') {
+				this.linkHandler.remove(activeObject);
+			} else if (activeObject.superType === 'node') {
+				if (activeObject.toPort) {
+					if (activeObject.toPort.links.length) {
+						activeObject.toPort.links.forEach((link: any) => {
+							this.linkHandler.remove(link, 'from');
+						});
+					}
+					this.canvas.remove(activeObject.toPort);
+				}
+				if (activeObject.fromPort && activeObject.fromPort.length) {
+					activeObject.fromPort.forEach((port: any) => {
+						if (port.links.length) {
+							port.links.forEach((link: any) => {
+								this.linkHandler.remove(link, 'to');
+							});
+						}
+						this.canvas.remove(port);
+					});
+				}
+			}
+			this.canvas.remove(activeObject);
+		} else {
+			const { _objects: activeObjects } = activeObject;
+			const existDeleted = activeObjects.some(
+				(obj: any) => typeof obj.deletable !== 'undefined' && !obj.deletable,
+			);
+			if (existDeleted) {
+				return;
+			}
+			this.canvas.discardActiveObject();
+			activeObjects.forEach((obj: any) => {
+				if (obj.superType === 'element') {
+					this.elementHandler.removeById(obj.id);
+				} else if (obj.superType === 'node') {
+					if (obj.toPort) {
+						if (obj.toPort.links.length) {
+							obj.toPort.links.forEach((link: any) => {
+								this.linkHandler.remove(link, 'from');
+							});
+						}
+						this.canvas.remove(obj.toPort);
+					}
+					if (obj.fromPort && obj.fromPort.length) {
+						obj.fromPort.forEach((port: any) => {
+							if (port.links.length) {
+								port.links.forEach((link: any) => {
+									this.linkHandler.remove(link, 'to');
+								});
+							}
+							this.canvas.remove(port);
+						});
+					}
+				}
+				this.canvas.remove(obj);
+			});
+		}
+		if (!this.transactionHandler.active) {
+			this.transactionHandler.save('remove');
+		}
+		this.objects = this.getObjects();
+		const { onRemove } = this;
+		if (onRemove) {
+			onRemove(activeObject);
+		}
+	};
+
+	/**
+	 * Remove object by id
+	 * @param {string} id
+	 */
+	public removeById = (id: string) => {
+		const findObject = this.findById(id);
+		if (findObject) {
+			this.remove(findObject);
+		}
+	};
+
+	/**
+	 * Delete at origin object list
+	 * @param {string} id
+	 */
+	public removeOriginById = (id: string) => {
+		const object = this.findOriginByIdWithIndex(id);
+		if (object.index > 0) {
+			this.objects.splice(object.index, 1);
+		}
+	};
+
+	/**
+	 * Duplicate object
+	 * @returns
+	 */
+	public duplicate = () => {
+		const {
+			onAdd,
+			propertiesToInclude,
+			gridOption: { grid = 10 },
+		} = this;
+		const activeObject = this.canvas.getActiveObject() as FabricObject;
+		if (!activeObject) {
+			return;
+		}
+		if (typeof activeObject.cloneable !== 'undefined' && !activeObject.cloneable) {
+			return;
+		}
+		activeObject.clone((clonedObj: FabricObject) => {
+			this.canvas.discardActiveObject();
+			clonedObj.set({
+				left: clonedObj.left + grid,
+				top: clonedObj.top + grid,
+				evented: true,
+			});
+			if (clonedObj.type === 'activeSelection') {
+				const activeSelection = clonedObj as fabric.ActiveSelection;
+				activeSelection.canvas = this.canvas;
+				activeSelection.forEachObject((obj: any) => {
+					obj.set('id', fetchUuid());
+					if (obj.superType === 'node') {
+						obj.set('shadow', {
+							color: obj.stroke,
+						} as fabric.Shadow);
+					}
+					this.canvas.add(obj);
+					this.objects = this.getObjects();
+					if (obj.dblclick) {
+						obj.on('mousedblclick', this.eventHandler.object.mousedblclick);
+					}
+				});
+				if (onAdd) {
+					onAdd(activeSelection);
+				}
+				activeSelection.setCoords();
+			} else {
+				if (activeObject.id === clonedObj.id) {
+					clonedObj.set('id', fetchUuid());
+				}
+				if (clonedObj.superType === 'node') {
+					clonedObj.set('shadow', {
+						color: clonedObj.stroke,
+					} as fabric.Shadow);
+				}
+				this.canvas.add(clonedObj);
+				this.objects = this.getObjects();
+				if (clonedObj.dblclick) {
+					clonedObj.on('mousedblclick', this.eventHandler.object.mousedblclick);
+				}
+				if (onAdd) {
+					onAdd(clonedObj);
+				}
+			}
+			this.canvas.setActiveObject(clonedObj);
+			this.portHandler.create(clonedObj as NodeObject);
+			this.canvas.requestRenderAll();
+		}, propertiesToInclude);
+	};
+
+	/**
+	 * Duplicate object by id
+	 * @param {string} id
+	 * @returns
+	 */
+	public duplicateById = (id: string) => {
+		const {
+			onAdd,
+			propertiesToInclude,
+			gridOption: { grid = 10 },
+		} = this;
+		const findObject = this.findById(id);
+		if (findObject) {
+			if (typeof findObject.cloneable !== 'undefined' && !findObject.cloneable) {
+				return false;
+			}
+			findObject.clone((cloned: FabricObject) => {
+				cloned.set({
+					left: cloned.left + grid,
+					top: cloned.top + grid,
+					id: fetchUuid(),
+					evented: true,
+				});
+				this.canvas.add(cloned);
+				this.objects = this.getObjects();
+				if (onAdd) {
+					onAdd(cloned);
+				}
+				if (cloned.dblclick) {
+					cloned.on('mousedblclick', this.eventHandler.object.mousedblclick);
+				}
+				this.canvas.setActiveObject(cloned);
+				this.portHandler.create(cloned as NodeObject);
+				this.canvas.requestRenderAll();
+			}, propertiesToInclude);
+		}
+		return true;
+	};
+
+	/**
+	 * Cut object
+	 *
+	 */
+	public cut = () => {
+		this.copy();
+		this.remove();
+		this.isCut = true;
+	};
+
+	/**
+	 * Copy to clipboard
+	 *
+	 * @param {*} value
+	 */
+	public copyToClipboard = (value: any) => {
+		const textarea = document.createElement('textarea');
+		document.body.appendChild(textarea);
+		textarea.value = value;
+		textarea.select();
+		document.execCommand('copy');
+		document.body.removeChild(textarea);
+		this.canvas.wrapperEl.focus();
+	};
+
+	/**
+	 * Copy object
+	 *
+	 * @returns
+	 */
+	public copy = () => {
+		const { propertiesToInclude } = this;
+		const activeObject = this.canvas.getActiveObject() as FabricObject;
+		if (activeObject && activeObject.superType === 'link') {
+			return false;
+		}
+		if (activeObject) {
+			if (typeof activeObject.cloneable !== 'undefined' && !activeObject.cloneable) {
+				return false;
+			}
+			if (activeObject.type === 'activeSelection') {
+				const activeSelection = activeObject as fabric.ActiveSelection;
+				if (activeSelection.getObjects().some((obj: any) => obj.superType === 'node')) {
+					if (this.keyEvent.clipboard) {
+						const links = [] as any[];
+						const objects = activeSelection.getObjects().map((obj: any, index: number) => {
+							if (typeof obj.cloneable !== 'undefined' && !obj.cloneable) {
+								return null;
+							}
+							if (obj.fromPort.length) {
+								obj.fromPort.forEach((port: any) => {
+									if (port.links.length) {
+										port.links.forEach((link: any) => {
+											const linkTarget = {
+												fromNodeIndex: index,
+												fromPortId: port.id,
+												type: 'curvedLink',
+												superType: 'link',
+											} as any;
+											const findIndex = activeSelection
+												.getObjects()
+												.findIndex((compObj: any) => compObj.id === link.toNode.id);
+											if (findIndex >= 0) {
+												linkTarget.toNodeIndex = findIndex;
+												links.push(linkTarget);
+											}
+										});
+									}
+								});
+							}
+							return {
+								name: obj.name,
+								description: obj.description,
+								superType: obj.superType,
+								type: obj.type,
+								nodeClazz: obj.nodeClazz,
+								configuration: obj.configuration,
+								properties: {
+									left: activeObject.left + activeObject.width / 2 + obj.left || 0,
+									top: activeObject.top + activeObject.height / 2 + obj.top || 0,
+									iconName: obj.descriptor.icon,
+								},
+							};
+						});
+						this.copyToClipboard(JSON.stringify(objects.concat(links), null, '\t'));
+						return true;
+					}
+					this.clipboard = activeObject;
+					return true;
+				}
+			}
+			activeObject.clone((cloned: FabricObject) => {
+				if (this.keyEvent.clipboard) {
+					if (cloned.superType === 'node') {
+						const node = {
+							name: cloned.name,
+							description: cloned.description,
+							superType: cloned.superType,
+							type: cloned.type,
+							nodeClazz: cloned.nodeClazz,
+							configuration: cloned.configuration,
+							properties: {
+								left: cloned.left || 0,
+								top: cloned.top || 0,
+								iconName: cloned.descriptor.icon,
+							},
+						};
+						const objects = [node];
+						this.copyToClipboard(JSON.stringify(objects, null, '\t'));
+					} else {
+						this.copyToClipboard(JSON.stringify(cloned.toObject(propertiesToInclude), null, '\t'));
+					}
+				} else {
+					this.clipboard = cloned;
+				}
+			}, propertiesToInclude);
+		}
+		return true;
+	};
+
+	/**
+	 * Paste object
+	 *
+	 * @returns
+	 */
+	public paste = () => {
+		const {
+			onAdd,
+			propertiesToInclude,
+			gridOption: { grid = 10 },
+			clipboard,
+			isCut,
+		} = this;
+		const padding = isCut ? 0 : grid;
+		if (!clipboard) {
+			return false;
+		}
+		if (typeof clipboard.cloneable !== 'undefined' && !clipboard.cloneable) {
+			return false;
+		}
+		this.isCut = false;
+		if (clipboard.type === 'activeSelection') {
+			if (clipboard.getObjects().some((obj: any) => obj.superType === 'node')) {
+				this.canvas.discardActiveObject();
+				const objects = [] as any[];
+				const linkObjects = [] as LinkOption[];
+				clipboard.getObjects().forEach((obj: any) => {
+					if (typeof obj.cloneable !== 'undefined' && !obj.cloneable) {
+						return;
+					}
+					const clonedObj = obj.duplicate();
+					if (clonedObj.type === 'SwitchNode') {
+						clonedObj.set({
+							left: obj.left + padding + padding,
+							top: obj.top + padding,
+						});
+					} else {
+						clonedObj.set({
+							left: obj.left + padding,
+							top: obj.top + padding,
+						});
+					}
+					if (obj.fromPort.length) {
+						obj.fromPort.forEach((port: PortObject) => {
+							if (port.links.length) {
+								port.links.forEach((link: LinkObject) => {
+									const linkTarget = {
+										fromNode: clonedObj.id,
+										fromPort: port.id,
+									} as any;
+									const findIndex = clipboard
+										.getObjects()
+										.findIndex((compObj: any) => compObj.id === link.toNode.id);
+									if (findIndex >= 0) {
+										linkTarget.toNodeIndex = findIndex;
+										linkObjects.push(linkTarget);
+									}
+								});
+							}
+						});
+					}
+					if (clonedObj.dblclick) {
+						clonedObj.on('mousedblclick', this.eventHandler.object.mousedblclick);
+					}
+					this.canvas.add(clonedObj);
+					this.objects = this.getObjects();
+					this.portHandler.create(clonedObj);
+					objects.push(clonedObj);
+				});
+				if (linkObjects.length) {
+					linkObjects.forEach((linkObject: any) => {
+						const { fromNode, fromPort, toNodeIndex } = linkObject;
+						const toNode = objects[toNodeIndex];
+						const link = {
+							type: 'curvedLink',
+							fromNodeId: fromNode,
+							fromPortId: fromPort,
+							toNodeId: toNode.id,
+							toPortId: toNode.toPort.id,
+						};
+						this.linkHandler.create(link);
+					});
+				}
+				const activeSelection = new fabric.ActiveSelection(objects, {
+					canvas: this.canvas,
+					...this.activeSelectionOption,
+				});
+				if (isCut) {
+					this.clipboard = null;
+				} else {
+					this.clipboard = activeSelection;
+				}
+				if (!this.transactionHandler.active) {
+					this.transactionHandler.save('paste');
+				}
+				this.canvas.setActiveObject(activeSelection);
+				this.canvas.renderAll();
+				return true;
+			}
+		}
+		clipboard.clone((clonedObj: any) => {
+			this.canvas.discardActiveObject();
+			clonedObj.set({
+				left: clonedObj.left + padding,
+				top: clonedObj.top + padding,
+				id: isCut ? clipboard.id : fetchUuid(),
+				evented: true,
+			});
+			if (clonedObj.type === 'activeSelection') {
+				clonedObj.canvas = this.canvas;
+				clonedObj.forEachObject((obj: any) => {
+					obj.set('id', isCut ? obj.id : fetchUuid());
+					this.canvas.add(obj);
+					if (obj.dblclick) {
+						obj.on('mousedblclick', this.eventHandler.object.mousedblclick);
+					}
+				});
+			} else {
+				if (clonedObj.superType === 'node') {
+					clonedObj = clonedObj.duplicate();
+				}
+				this.canvas.add(clonedObj);
+				if (clonedObj.dblclick) {
+					clonedObj.on('mousedblclick', this.eventHandler.object.mousedblclick);
+				}
+			}
+			const newClipboard = clipboard.set({
+				top: clonedObj.top,
+				left: clonedObj.left,
+			});
+			if (isCut) {
+				this.clipboard = null;
+			} else {
+				this.clipboard = newClipboard;
+			}
+			if (clonedObj.superType === 'node') {
+				this.portHandler.create(clonedObj);
+			}
+			if (!this.transactionHandler.active) {
+				this.transactionHandler.save('paste');
+			}
+			// TODO...
+			// After toGroup svg elements not rendered.
+			this.objects = this.getObjects();
+			if (onAdd) {
+				onAdd(clonedObj);
+			}
+			clonedObj.setCoords();
+			this.canvas.setActiveObject(clonedObj);
+			this.canvas.requestRenderAll();
+		}, propertiesToInclude);
+		return true;
+	};
+
+	/**
+	 * Find object by object
+	 * @param {FabricObject} obj
+	 */
+	public find = (obj: FabricObject) => this.findById(obj.id);
+
+	/**
+	 * Find object by id
+	 * @param {string} id
+	 * @returns {(FabricObject | null)}
+	 */
+	public findById = (id: string): FabricObject | null => {
+		let findObject;
+		const exist = this.objects.some(obj => {
+			if (obj.id === id) {
+				findObject = obj;
+				return true;
+			}
+			return false;
+		});
+		if (!exist) {
+			message.warning('Not found object by id.');
+			return null;
+		}
+		return findObject;
+	};
+
+	/**
+	 * Find object in origin list
+	 * @param {string} id
+	 * @returns
+	 */
+	public findOriginById = (id: string) => {
+		let findObject: FabricObject;
+		const exist = this.objects.some(obj => {
+			if (obj.id === id) {
+				findObject = obj;
+				return true;
+			}
+			return false;
+		});
+		if (!exist) {
+			console.warn('Not found object by id.');
+			return null;
+		}
+		return findObject;
+	};
+
+	/**
+	 * Return origin object list
+	 * @param {string} id
+	 * @returns
+	 */
+	public findOriginByIdWithIndex = (id: string) => {
+		let findObject;
+		let index = -1;
+		const exist = this.objects.some((obj, i) => {
+			if (obj.id === id) {
+				findObject = obj;
+				index = i;
+				return true;
+			}
+			return false;
+		});
+		if (!exist) {
+			console.warn('Not found object by id.');
+			return {};
+		}
+		return {
+			object: findObject,
+			index,
+		};
+	};
+
+	/**
+	 * Select object
+	 * @param {FabricObject} obj
+	 * @param {boolean} [find]
+	 */
+	public select = (obj: FabricObject, find?: boolean) => {
+		let findObject = obj;
+		if (find) {
+			findObject = this.find(obj);
+		}
+		if (findObject) {
+			this.canvas.discardActiveObject();
+			this.canvas.setActiveObject(findObject);
+			this.canvas.requestRenderAll();
+		}
+	};
+
+	/**
+	 * Select by id
+	 * @param {string} id
+	 */
+	public selectById = (id: string) => {
+		const findObject = this.findById(id);
+		if (findObject) {
+			this.canvas.discardActiveObject();
+			this.canvas.setActiveObject(findObject);
+			this.canvas.requestRenderAll();
+		}
+	};
+
+	/**
+	 * Select all
+	 * @returns
+	 */
+	public selectAll = () => {
+		this.canvas.discardActiveObject();
+		const filteredObjects = this.canvas.getObjects().filter((obj: any) => {
+			if (obj.id === 'workarea') {
+				return false;
+			} else if (!obj.evented) {
+				return false;
+			} else if (obj.superType === 'link') {
+				return false;
+			} else if (obj.superType === 'port') {
+				return false;
+			} else if (obj.superType === 'element') {
+				return false;
+			} else if (obj.locked) {
+				return false;
+			}
+			return true;
+		});
+		if (!filteredObjects.length) {
+			return;
+		}
+		if (filteredObjects.length === 1) {
+			this.canvas.setActiveObject(filteredObjects[0]);
+			this.canvas.renderAll();
+			return;
+		}
+		const activeSelection = new fabric.ActiveSelection(filteredObjects, {
+			canvas: this.canvas,
+			...this.activeSelectionOption,
+		});
+		this.canvas.setActiveObject(activeSelection);
+		this.canvas.renderAll();
+	};
+
+	/**
+	 * Save origin width, height
+	 * @param {FabricObject} obj
+	 * @param {number} width
+	 * @param {number} height
+	 */
+	public originScaleToResize = (obj: FabricObject, width: number, height: number) => {
+		if (obj.id === 'workarea') {
+			this.setByPartial(obj, {
+				workareaWidth: obj.width,
+				workareaHeight: obj.height,
+			});
+		}
+		this.setByPartial(obj, {
+			scaleX: width / obj.width,
+			scaleY: height / obj.height,
+		});
+	};
+
+	/**
+	 * When set the width, height, Adjust the size
+	 * @param {number} width
+	 * @param {number} height
+	 */
+	public scaleToResize = (width: number, height: number) => {
+		const activeObject = this.canvas.getActiveObject() as FabricObject;
+		const { id } = activeObject;
+		const obj = {
+			id,
+			scaleX: width / activeObject.width,
+			scaleY: height / activeObject.height,
+		};
+		this.setObject(obj);
+		activeObject.setCoords();
+		this.canvas.requestRenderAll();
+	};
+
+	/**
+	 * Import json
+	 * @param {*} json
+	 * @param {(canvas: FabricCanvas) => void} [callback]
+	 */
+	public importJSON = async (json: any, callback?: (canvas: FabricCanvas) => void) => {
+		if (typeof json === 'string') {
+			json = JSON.parse(json);
+		}
+		let prevLeft = 0;
+		let prevTop = 0;
+		this.canvas.setBackgroundColor(this.canvasOption.backgroundColor, this.canvas.renderAll.bind(this.canvas));
+		const workarea = json.find((obj: FabricObjectOption) => obj.id === 'workarea');
+		if (!this.workarea) {
+			this.workareaHandler.initialize();
+		}
+		if (workarea) {
+			prevLeft = workarea.left;
+			prevTop = workarea.top;
+			this.workarea.set(workarea);
+			await this.workareaHandler.setImage(workarea.src, true);
+			this.workarea.setCoords();
+		} else {
+			this.canvas.centerObject(this.workarea);
+			this.workarea.setCoords();
+			prevLeft = this.workarea.left;
+			prevTop = this.workarea.top;
+		}
+		json.forEach((obj: FabricObjectOption) => {
+			if (obj.id === 'workarea') {
+				return;
+			}
+			const canvasWidth = this.canvas.getWidth();
+			const canvasHeight = this.canvas.getHeight();
+			const { width, height, scaleX, scaleY, layout, left, top } = this.workarea;
+			if (layout === 'fullscreen') {
+				const leftRatio = canvasWidth / (width * scaleX);
+				const topRatio = canvasHeight / (height * scaleY);
+				obj.left *= leftRatio;
+				obj.top *= topRatio;
+				obj.scaleX *= leftRatio;
+				obj.scaleY *= topRatio;
+			} else {
+				const diffLeft = left - prevLeft;
+				const diffTop = top - prevTop;
+				obj.left += diffLeft;
+				obj.top += diffTop;
+			}
+			if (obj.superType === 'element') {
+				obj.id = fetchUuid();
+			}
+			this.add(obj, false, true);
+			this.canvas.renderAll();
+		});
+		this.objects = this.getObjects();
+		if (callback) {
+			callback(this.canvas);
+		}
+		return Promise.resolve(this.canvas);
+	};
+
+	/**
+	 * Export json
+	 */
+	public exportJSON = () => this.canvas.toObject(this.propertiesToInclude).objects as FabricObject[];
+
+	/**
+	 * Active selection to group
+	 * @returns
+	 */
+	public toGroup = (target?: FabricObject) => {
+		const activeObject = target || (this.canvas.getActiveObject() as fabric.ActiveSelection);
+		if (!activeObject) {
+			return null;
+		}
+		if (activeObject.type !== 'activeSelection') {
+			return null;
+		}
+		const group = activeObject.toGroup() as FabricObject<fabric.Group>;
+		group.set({
+			id: fetchUuid(),
+			name: 'New group',
+			type: 'group',
+			...this.objectOption,
+		});
+		this.objects = this.getObjects();
+		if (!this.transactionHandler.active) {
+			this.transactionHandler.save('group');
+		}
+		if (this.onSelect) {
+			this.onSelect(group);
+		}
+		this.canvas.renderAll();
+		return group;
+	};
+
+	/**
+	 * Group to active selection
+	 * @returns
+	 */
+	public toActiveSelection = (target?: FabricObject) => {
+		const activeObject = target || (this.canvas.getActiveObject() as fabric.Group);
+		if (!activeObject) {
+			return;
+		}
+		if (activeObject.type !== 'group') {
+			return;
+		}
+		const activeSelection = activeObject.toActiveSelection();
+		this.objects = this.getObjects();
+		if (!this.transactionHandler.active) {
+			this.transactionHandler.save('ungroup');
+		}
+		if (this.onSelect) {
+			this.onSelect(activeSelection);
+		}
+		this.canvas.renderAll();
+		return activeSelection;
+	};
+
+	/**
+	 * Bring forward
+	 */
+	public bringForward = () => {
+		const activeObject = this.canvas.getActiveObject() as FabricObject;
+		if (activeObject) {
+			this.canvas.bringForward(activeObject);
+			if (!this.transactionHandler.active) {
+				this.transactionHandler.save('bringForward');
+			}
+			const { onModified } = this;
+			if (onModified) {
+				onModified(activeObject);
+			}
+		}
+	};
+
+	/**
+	 * Bring to front
+	 */
+	public bringToFront = () => {
+		const activeObject = this.canvas.getActiveObject() as FabricObject;
+		if (activeObject) {
+			this.canvas.bringToFront(activeObject);
+			if (!this.transactionHandler.active) {
+				this.transactionHandler.save('bringToFront');
+			}
+			const { onModified } = this;
+			if (onModified) {
+				onModified(activeObject);
+			}
+		}
+	};
+
+	/**
+	 * Send backwards
+	 * @returns
+	 */
+	public sendBackwards = () => {
+		const activeObject = this.canvas.getActiveObject() as FabricObject;
+		if (activeObject) {
+			const firstObject = this.canvas.getObjects()[1] as FabricObject;
+			if (firstObject.id === activeObject.id) {
+				return;
+			}
+			if (!this.transactionHandler.active) {
+				this.transactionHandler.save('sendBackwards');
+			}
+			this.canvas.sendBackwards(activeObject);
+			const { onModified } = this;
+			if (onModified) {
+				onModified(activeObject);
+			}
+		}
+	};
+
+	/**
+	 * Send to back
+	 */
+	public sendToBack = () => {
+		const activeObject = this.canvas.getActiveObject() as FabricObject;
+		if (activeObject) {
+			this.canvas.sendToBack(activeObject);
+			this.canvas.sendToBack(this.canvas.getObjects()[1]);
+			if (!this.transactionHandler.active) {
+				this.transactionHandler.save('sendToBack');
+			}
+			const { onModified } = this;
+			if (onModified) {
+				onModified(activeObject);
+			}
+		}
+	};
+
+	/**
+	 * Clear canvas
+	 * @param {boolean} [includeWorkarea=false]
+	 */
+	public clear = (includeWorkarea = false) => {
+		const ids = this.canvas.getObjects().reduce((prev, curr: any) => {
+			if (curr.superType === 'element') {
+				prev.push(curr.id);
+				return prev;
+			}
+			return prev;
+		}, []);
+		this.elementHandler.removeByIds(ids);
+		if (includeWorkarea) {
+			this.canvas.clear();
+			this.workarea = null;
+		} else {
+			this.canvas.discardActiveObject();
+			this.canvas.getObjects().forEach((obj: any) => {
+				if (obj.id === 'grid' || obj.id === 'workarea') {
+					return;
+				}
+				this.canvas.remove(obj);
+			});
+		}
+		this.objects = this.getObjects();
+		this.canvas.renderAll();
+	};
+
+	/**
+	 * Start request animation frame
+	 */
+	public startRequestAnimFrame = () => {
+		if (!this.isRequsetAnimFrame) {
+			this.isRequsetAnimFrame = true;
+			const render = () => {
+				this.canvas.renderAll();
+				this.requestFrame = fabric.util.requestAnimFrame(render);
+			};
+			fabric.util.requestAnimFrame(render);
+		}
+	};
+
+	/**
+	 * Stop request animation frame
+	 */
+	public stopRequestAnimFrame = () => {
+		this.isRequsetAnimFrame = false;
+		const cancelRequestAnimFrame = (() =>
+			window.cancelAnimationFrame ||
+			// || window.webkitCancelRequestAnimationFrame
+			// || window.mozCancelRequestAnimationFrame
+			// || window.oCancelRequestAnimationFrame
+			// || window.msCancelRequestAnimationFrame
+			clearTimeout)();
+		cancelRequestAnimFrame(this.requestFrame);
+	};
+
+	/**
+	 * Save target object as image
+	 * @param {FabricObject} targetObject
+	 * @param {string} [option={ name: 'New Image', format: 'png', quality: 1 }]
+	 */
+	public saveImage = (targetObject: FabricObject, option = { name: 'New Image', format: 'png', quality: 1 }) => {
+		let dataUrl;
+		let target = targetObject;
+		if (target) {
+			dataUrl = target.toDataURL(option);
+		} else {
+			target = this.canvas.getActiveObject() as FabricObject;
+			if (target) {
+				dataUrl = target.toDataURL(option);
+			}
+		}
+		if (dataUrl) {
+			const anchorEl = document.createElement('a');
+			anchorEl.href = dataUrl;
+			anchorEl.download = `${option.name}.png`;
+			document.body.appendChild(anchorEl);
+			anchorEl.click();
+			anchorEl.remove();
+		}
+	};
+
+	/**
+	 * Save canvas as image
+	 * @param {string} [option={ name: 'New Image', format: 'png', quality: 1 }]
+	 */
+	public saveCanvasImage = (option = { name: 'New Image', format: 'png', quality: 1 }) => {
+		// If it's zoomed out/in, the container will also include in the image
+		// hence need to reset the zoom level.
+		this.zoomHandler.zoomOneToOne();
+
+		const { left, top, width, height } = this.workarea;
+		const dataUrl = this.canvas.toDataURL({
+			...option,
+			left,
+			top,
+			width,
+			height,
+			enableRetinaScaling: true,
+		});
+
+		if (dataUrl) {
+			const anchorEl = document.createElement('a');
+			anchorEl.href = dataUrl;
+			anchorEl.download = `${option.name}.png`;
+			document.body.appendChild(anchorEl);
+			anchorEl.click();
+			anchorEl.remove();
+		}
+	};
+
+	/**
+	 * Sets "angle" of an instance with centered rotation
+	 *
+	 * @param {number} angle
+	 */
+	public rotate = (angle: number) => {
+		const activeObject = this.canvas.getActiveObject();
+		if (activeObject) {
+			this.set('rotation', angle);
+			activeObject.rotate(angle);
+			this.canvas.requestRenderAll();
+		}
+	};
+
+	/**
+	 * Destroy canvas
+	 *
+	 */
+	public destroy = () => {
+		this.eventHandler.destroy();
+		this.guidelineHandler.destroy();
+		this.contextmenuHandler.destory();
+		this.tooltipHandler.destroy();
+		this.clear(true);
+	};
+
+	/**
+	 * Set canvas option
+	 *
+	 * @param {CanvasOption} canvasOption
+	 */
+	public setCanvasOption = (canvasOption: CanvasOption) => {
+		this.canvasOption = Object.assign({}, this.canvasOption, canvasOption);
+		this.canvas.setBackgroundColor(canvasOption.backgroundColor, this.canvas.renderAll.bind(this.canvas));
+		if (typeof canvasOption.width !== 'undefined' && typeof canvasOption.height !== 'undefined') {
+			if (this.eventHandler) {
+				this.eventHandler.resize(canvasOption.width, canvasOption.height);
+			} else {
+				this.canvas.setWidth(canvasOption.width).setHeight(canvasOption.height);
+			}
+		}
+		if (typeof canvasOption.selection !== 'undefined') {
+			this.canvas.selection = canvasOption.selection;
+		}
+		if (typeof canvasOption.hoverCursor !== 'undefined') {
+			this.canvas.hoverCursor = canvasOption.hoverCursor;
+		}
+		if (typeof canvasOption.defaultCursor !== 'undefined') {
+			this.canvas.defaultCursor = canvasOption.defaultCursor;
+		}
+		if (typeof canvasOption.preserveObjectStacking !== 'undefined') {
+			this.canvas.preserveObjectStacking = canvasOption.preserveObjectStacking;
+		}
+	};
+
+	/**
+	 * Set keyboard event
+	 *
+	 * @param {KeyEvent} keyEvent
+	 */
+	public setKeyEvent = (keyEvent: KeyEvent) => {
+		this.keyEvent = Object.assign({}, this.keyEvent, keyEvent);
+	};
+
+	/**
+	 * Set fabric objects
+	 *
+	 * @param {FabricObjects} fabricObjects
+	 */
+	public setFabricObjects = (fabricObjects: FabricObjects) => {
+		this.fabricObjects = Object.assign({}, this.fabricObjects, fabricObjects);
+	};
+
+	/**
+	 * Set workarea option
+	 *
+	 * @param {WorkareaOption} workareaOption
+	 */
+	public setWorkareaOption = (workareaOption: WorkareaOption) => {
+		this.workareaOption = Object.assign({}, this.workareaOption, workareaOption);
+		if (this.workarea) {
+			this.workarea.set({
+				...workareaOption,
+			});
+		}
+	};
+
+	/**
+	 * Set guideline option
+	 *
+	 * @param {GuidelineOption} guidelineOption
+	 */
+	public setGuidelineOption = (guidelineOption: GuidelineOption) => {
+		this.guidelineOption = Object.assign({}, this.guidelineOption, guidelineOption);
+		if (this.guidelineHandler) {
+			this.guidelineHandler.initialize();
+		}
+	};
+
+	/**
+	 * Set grid option
+	 *
+	 * @param {GridOption} gridOption
+	 */
+	public setGridOption = (gridOption: GridOption) => {
+		this.gridOption = Object.assign({}, this.gridOption, gridOption);
+	};
+
+	/**
+	 * Set object option
+	 *
+	 * @param {FabricObjectOption} objectOption
+	 */
+	public setObjectOption = (objectOption: FabricObjectOption) => {
+		this.objectOption = Object.assign({}, this.objectOption, objectOption);
+	};
+
+	/**
+	 * Set activeSelection option
+	 *
+	 * @param {Partial<FabricObjectOption<fabric.ActiveSelection>>} activeSelectionOption
+	 */
+	public setActiveSelectionOption = (activeSelectionOption: Partial<FabricObjectOption<fabric.ActiveSelection>>) => {
+		this.activeSelectionOption = Object.assign({}, this.activeSelectionOption, activeSelectionOption);
+	};
+
+	/**
+	 * Set propertiesToInclude
+	 *
+	 * @param {string[]} propertiesToInclude
+	 */
+	public setPropertiesToInclude = (propertiesToInclude: string[]) => {
+		this.propertiesToInclude = union(propertiesToInclude, this.propertiesToInclude);
+	};
+
+	/**
+	 * Register custom handler
+	 *
+	 * @param {string} name
+	 * @param {typeof CustomHandler} handler
+	 */
+	public registerHandler = (name: string, handler: typeof CustomHandler) => {
+		this.handlers[name] = new handler(this);
+		return this.handlers[name];
+	};
+}
+
+export default Handler;
diff --git a/src/pages/Fabric/canvas/handlers/ImageHandler.ts b/src/pages/Fabric/canvas/handlers/ImageHandler.ts
new file mode 100644
index 0000000..0f94b71
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/ImageHandler.ts
@@ -0,0 +1,683 @@
+import { fabric } from 'fabric';
+import {isEqual} from 'lodash';
+import Handler from './Handler';
+
+export type GrayscaleModeType = 'average' | 'luminosity' | 'lightness';
+
+export interface RemoveColorFilter {
+	color?: string;
+	distance?: number;
+	fragmentSource?: any;
+	useAlpahe?: any;
+}
+
+export interface BlendColorFilter {
+	color?: string;
+	mode?: string;
+	alpha?: number;
+}
+
+export interface GammaFilter {
+	gamma?: number[];
+}
+
+export interface BlendImageFilter {
+	image?: fabric.Image;
+	mode?: string;
+	alpha?: number;
+}
+
+export interface HueRotationFilter {
+	rotation?: number;
+}
+
+export type ResizeType = 'bilinear' | 'hermite' | 'sliceHack' | 'lanczos';
+
+export interface ResizeFilter {
+	resizeType?: ResizeType;
+	scaleX?: number;
+	scaleY?: number;
+	lanczosLobes?: number;
+}
+
+export interface TintFilter {
+	color?: string;
+	opacity?: number;
+}
+
+export interface MaskFilter {
+	mask?: fabric.Image;
+	/**
+	 * Rgb channel (0, 1, 2 or 3)
+	 * @default 0
+	 */
+	channel: number;
+}
+
+export interface MultiplyFilter {
+	/**
+	 * Color to multiply the image pixels with
+	 * @default #000000
+	 */
+	color: string;
+}
+
+export interface GradientTransparencyFilter {
+	/** @default 100 */
+	threshold?: number;
+}
+
+export interface ColorMatrixFilter {
+	/** Filter matrix */
+	matrix?: number[];
+}
+
+export interface RemoveWhiteFilter {
+	/** @default 30 */
+	threshold?: number;
+	/** @default 20 */
+	distance?: number;
+}
+
+export type ValuesOf<T extends any[]> = T[number];
+
+export interface IFilter {
+	type: typeof FILTER_TYPES[number];
+	[key: string]: any;
+}
+
+export const FILTER_TYPES = [
+	'grayscale',
+	'invert',
+	'remove-color',
+	'sepia',
+	'brownie',
+	'brightness',
+	'contrast',
+	'saturation',
+	'noise',
+	'vintage',
+	'pixelate',
+	'blur',
+	'sharpen',
+	'emboss',
+	'technicolor',
+	'polaroid',
+	'blend-color',
+	'gamma',
+	'kodachrome',
+	'blackwhite',
+	'blend-image',
+	'hue',
+	'resize',
+	'tint',
+	'mask',
+	'multiply',
+	'sepia2',
+];
+
+export const capitalize = (str: string) => (str ? str.charAt(0).toUpperCase() + str.slice(1) : false);
+
+const SHARPEN_MATRIX = [0, -1, 0, -1, 5, -1, 0, -1, 0];
+const EMBOSS_MATRIX = [1, 1, 1, 1, 0.7, -1, -1, -1, -1];
+
+/**
+ * Image Handler
+ * @author salgum1114
+ * @date 2019-09-01
+ * @class ImageHandler
+ * @implements {IBaseHandler}
+ */
+class ImageHandler {
+	handler: Handler;
+
+	constructor(handler: Handler) {
+		this.handler = handler;
+	}
+
+	/**
+	 * Create filter by type
+	 * @param {IFilter} filter
+	 */
+	public createFilter = (filter: IFilter) => {
+		const { type: filterType, ...other } = filter;
+		const type = filterType.toLowerCase();
+		if (type === 'grayscale') {
+			return new fabric.Image.filters.Grayscale(other);
+		} else if (type === 'invert') {
+			return new fabric.Image.filters.Invert();
+			// } else if (type === 'remove-color') {
+			//     return new fabric.Image.filters.RemoveColor(other);
+		} else if (type === 'sepia') {
+			return new fabric.Image.filters.Sepia();
+			// } else if (type === 'brownie') {
+			//     return new fabric.Image.filters.Brownie();
+		} else if (type === 'brightness') {
+			return new fabric.Image.filters.Brightness({ brightness: other.brightness });
+		} else if (type === 'contrast') {
+			return new fabric.Image.filters.Contrast(other);
+		} else if (type === 'saturation') {
+			return new fabric.Image.filters.Saturation(other);
+		} else if (type === 'noise') {
+			return new fabric.Image.filters.Noise({ noise: other.noise });
+			// } else if (type === 'vintage') {
+			//     return new fabric.Image.filters.Vintage();
+		} else if (type === 'pixelate') {
+			return new fabric.Image.filters.Pixelate(other);
+			// } else if (type === 'blur') {
+			//     return new fabric.Image.filters.Blur(other);
+		} else if (type === 'sharpen') {
+			return new fabric.Image.filters.Convolute({
+				matrix: SHARPEN_MATRIX,
+			});
+		} else if (type === 'emboss') {
+			return new fabric.Image.filters.Convolute({
+				matrix: EMBOSS_MATRIX,
+			});
+			// } else if (type === 'technicolor') {
+			//     return new fabric.Image.filters.Technicolor();
+			// } else if (type === 'polaroid') {
+			//     return new fabric.Image.filters.Polaroid();
+		} else if (type === 'blend-color') {
+			return new fabric.Image.filters.BlendColor(other);
+			// } else if (type === 'gamma') {
+			//     return new fabric.Image.filters.Gamma(other);
+			// } else if (type === 'kodachrome') {
+			//     return new fabric.Image.filters.Kodachrome();
+			// } else if (type === 'blackwhite') {
+			//     return new fabric.Image.filters.BlackWhite();
+		} else if (type === 'blend-image') {
+			return new fabric.Image.filters.BlendImage(other);
+			// } else if (type === 'hue') {
+			//     return new fabric.Image.filters.HueRotation(other);
+		} else if (type === 'resize') {
+			return new fabric.Image.filters.Resize(other);
+		} else if (type === 'tint') {
+			return new fabric.Image.filters.Tint(other);
+		} else if (type === 'mask') {
+			return new fabric.Image.filters.Mask({
+				channel: other.channel,
+				mask: other.mask,
+			});
+		} else if (type === 'multiply') {
+			return new fabric.Image.filters.Multiply({
+				color: other.color,
+			});
+		} else if (type === 'sepia2') {
+			return new fabric.Image.filters.Sepia2(other);
+		}
+		return false;
+	};
+
+	/**
+	 * Create filter by types
+	 * @param {IFilter[]} filters
+	 */
+	public createFilters = (filters: IFilter[]) => {
+		return filters.reduce((prev, filter) => {
+			let type = filter.type;
+			if (type.toLowerCase() === 'convolute' && isEqual(filter.matrix, SHARPEN_MATRIX)) {
+				type = 'sharpen';
+			} else if (type.toLowerCase() === 'convolute' && isEqual(filter.matrix, EMBOSS_MATRIX)) {
+				type = 'emboss';
+			}
+			const findIndex = FILTER_TYPES.findIndex(filterType => type.toLowerCase() === filterType);
+			if (findIndex > -1) {
+				prev[findIndex] = this.createFilter({
+					...filter,
+					type,
+				});
+			}
+			return prev;
+		}, []);
+	};
+
+	/**
+	 * Apply filter by type
+	 * @param {string} type
+	 * @param {*} [value]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applyFilterByType = (type: string, apply = true, value?: any, imageObj?: fabric.Image): void => {
+		const obj = imageObj || (this.handler.canvas.getActiveObject() as any);
+		const findIndex = FILTER_TYPES.findIndex(ft => ft === type);
+		if (obj.filters && findIndex > -1) {
+			if (apply) {
+				obj.filters[findIndex] = this.createFilter({
+					type,
+					...value,
+				});
+				obj.applyFilters();
+			} else {
+				obj.filters[findIndex] = false;
+				obj.applyFilters();
+			}
+			this.handler.canvas.requestRenderAll();
+		}
+	};
+
+	/**
+	 * Apply filter in image
+	 * @param {fabric.Image} [imageObj]
+	 * @param {number} index
+	 * @param {fabric.IBaseFilter} filter
+	 */
+	public applyFilter = (index: number, filter: fabric.IBaseFilter | boolean, imageObj?: fabric.Image): void => {
+		const obj = imageObj || (this.handler.canvas.getActiveObject() as any);
+		if (obj.filters) {
+			obj.filters[index] = filter;
+			obj.applyFilters();
+			this.handler.canvas.requestRenderAll();
+		}
+	};
+
+	/**
+	 * Apply filter value in image
+	 * @param {fabric.Image} [imageObj]
+	 * @param {number} index
+	 * @param {string} prop
+	 * @param {any} value
+	 */
+	public applyFilterValue = (index: number, prop: string, value: any, imageObj?: fabric.Image): void => {
+		const obj = imageObj || (this.handler.canvas.getActiveObject() as fabric.Image);
+		if (obj.filters) {
+			const filter = obj.filters[index];
+			if (filter) {
+				filter.setOptions({
+					[prop]: value,
+				});
+				obj.applyFilters();
+				this.handler.canvas.requestRenderAll();
+			}
+		}
+	};
+
+	/**
+	 * Apply grayscale in image
+	 * @param {fabric.Image} [imageObj]
+	 * @param {boolean} [grayscale=false]
+	 * @param {GrayscaleModeType} [value]
+	 */
+	public applyGrayscale = (grayscale = false, value?: GrayscaleModeType, imageObj?: fabric.Image): void => {
+		this.applyFilter(
+			0,
+			grayscale &&
+				new fabric.Image.filters.Grayscale(
+					value
+						? {
+								mode: value,
+						  }
+						: undefined,
+				),
+			imageObj,
+		);
+	};
+
+	/**
+	 * Apply invert in image
+	 * @param {fabric.Image} [imageObj]
+	 * @param {boolean} [invert=false]
+	 */
+	public applyInvert = (invert = false, imageObj?: fabric.Image): void => {
+		this.applyFilter(1, invert && new fabric.Image.filters.Invert(), imageObj);
+	};
+
+	/**
+	 * Apply remove color in image
+	 * @param {fabric.Image} [imageObj]
+	 * @param {boolean} [removeColor=false]
+	 * @param {RemoveColorFilter} [value]
+	 */
+	// public applyRemoveColor = (removeColor = false, value?: RemoveColorFilter, imageObj?: fabric.Image): void => {
+	//     this.applyFilter(2, removeColor && new fabric.Image.filters.RemoveColor(value), imageObj);
+	// }
+
+	/**
+	 * Apply sepia in image
+	 * @param {fabric.Image} [imageObj]
+	 * @param {boolean} [sepia=false]
+	 */
+	public applySepia = (sepia = false, imageObj?: fabric.Image): void => {
+		this.applyFilter(3, sepia && new fabric.Image.filters.Sepia(), imageObj);
+	};
+
+	/**
+	 * Apply brownie in image
+	 * @param {boolean} [brownie=false]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	// public applyBrownie = (brownie = false, imageObj?: fabric.Image): void => {
+	//     this.applyFilter(4, brownie && new fabric.Image.filters.Brownie(), imageObj);
+	// }
+
+	/**
+	 * Apply brightness in image
+	 * @param {boolean} [brightness=false]
+	 * @param {number} [value]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applyBrightness = (brightness = false, value?: number, imageObj?: fabric.Image): void => {
+		this.applyFilter(
+			5,
+			brightness &&
+				new fabric.Image.filters.Brightness(
+					value
+						? {
+								brightness: value,
+						  }
+						: undefined,
+				),
+			imageObj,
+		);
+	};
+
+	/**
+	 * Apply contrast in image
+	 * @param {boolean} [contrast=false]
+	 * @param {number} [value]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applyContrast = (contrast = false, value?: number, imageObj?: fabric.Image): void => {
+		this.applyFilter(
+			6,
+			contrast &&
+				new fabric.Image.filters.Contrast(
+					value
+						? {
+								contrast: value,
+						  }
+						: undefined,
+				),
+			imageObj,
+		);
+	};
+
+	/**
+	 * Apply saturation in image
+	 * @param {boolean} [saturation=false]
+	 * @param {number} [value]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applySaturation = (saturation = false, value?: number, imageObj?: fabric.Image): void => {
+		this.applyFilter(
+			7,
+			saturation &&
+				new fabric.Image.filters.Saturation(
+					value
+						? {
+								saturation: value,
+						  }
+						: undefined,
+				),
+			imageObj,
+		);
+	};
+
+	/**
+	 * Apply noise in image
+	 * @param {boolean} [noise=false]
+	 * @param {number} [value]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applyNoise = (noise = false, value?: number, imageObj?: fabric.Image): void => {
+		this.applyFilter(
+			8,
+			noise &&
+				new fabric.Image.filters.Noise(
+					value
+						? {
+								noise: value,
+						  }
+						: undefined,
+				),
+			imageObj,
+		);
+	};
+
+	/**
+	 * Apply vintage in image
+	 * @param {boolean} [vintage=false]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	// public applyVintage = (vintage = false, imageObj?: fabric.Image): void => {
+	//     this.applyFilter(9, vintage && new fabric.Image.filters.Vintage(), imageObj);
+	// }
+
+	/**
+	 * Apply pixelate in image
+	 * @param {boolean} [pixelate=false]
+	 * @param {number} [value]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applyPixelate = (pixelate = false, value?: number, imageObj?: fabric.Image): void => {
+		this.applyFilter(
+			10,
+			pixelate &&
+				new fabric.Image.filters.Pixelate(
+					value
+						? {
+								blocksize: value,
+						  }
+						: undefined,
+				),
+			imageObj,
+		);
+	};
+
+	/**
+	 * Apply blur in image
+	 * @param {boolean} [blur=false]
+	 * @param {number} [value]
+	 * @param {fabric.Image} imageObj
+	 */
+	// public applyBlur = (blur = false, value?: number, imageObj?: fabric.Image): void => {
+	//     this.applyFilter(11, blur && new fabric.Image.filters.Blur(value ? {
+	//         value,
+	//     } : undefined), imageObj);
+	// }
+
+	/**
+	 * Apply sharpen in image
+	 * @param {boolean} [sharpen=false]
+	 * @param {number[]} [value=[0, -1,  0, -1,  5, -1, 0, -1,  0]]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applySharpen = (sharpen = false, value: number[] = SHARPEN_MATRIX, imageObj?: fabric.Image): void => {
+		this.applyFilter(
+			12,
+			sharpen &&
+				new fabric.Image.filters.Convolute(
+					value
+						? {
+								matrix: value,
+						  }
+						: undefined,
+				),
+			imageObj,
+		);
+	};
+
+	/**
+	 * Apply emboss in image
+	 * @param {boolean} [emboss=false]
+	 * @param {number[]} [value=[1, 1, 1, 1, 0.7, -1, -1, -1, -1]]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applyEmboss = (emboss = false, value: number[] = EMBOSS_MATRIX, imageObj?: fabric.Image): void => {
+		this.applyFilter(
+			13,
+			emboss &&
+				new fabric.Image.filters.Convolute(
+					value
+						? {
+								matrix: value,
+						  }
+						: undefined,
+				),
+			imageObj,
+		);
+	};
+
+	/**
+	 * Apply technicolor in image
+	 * @param {boolean} [technicolor=false]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	// public applyTechnicolor = (technicolor = false, imageObj?: fabric.Image): void => {
+	//     this.applyFilter(14, technicolor && new fabric.Image.filters.Technicolor(), imageObj);
+	// }
+
+	/**
+	 * Apply polaroid in image
+	 * @param {boolean} [polaroid=false]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	// public applyPolaroid = (polaroid = false, imageObj?: fabric.Image): void => {
+	//     this.applyFilter(15, polaroid && new fabric.Image.filters.Polaroid(), imageObj);
+	// }
+
+	/**
+	 * Apply blend color in image
+	 * @param {boolean} [blend=false]
+	 * @param {BlendColorFilter} [value]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applyBlendColor = (blend = false, value?: BlendColorFilter, imageObj?: fabric.Image): void => {
+		this.applyFilter(16, blend && new fabric.Image.filters.BlendColor(value), imageObj);
+	};
+
+	/**
+	 * Apply gamma in image
+	 * @param {boolean} [gamma=false]
+	 * @param {GammaFilter} [value]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	// public applyGamma = (gamma = false, value?: GammaFilter, imageObj?: fabric.Image): void => {
+	//     this.applyFilter(17, gamma && new fabric.Image.filters.Gamma(value), imageObj);
+	// }
+
+	/**
+	 * Apply kodachrome in image
+	 * @param {boolean} [kodachrome=false]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	// public applyKodachrome = (kodachrome = false, imageObj?: fabric.Image): void => {
+	//     this.applyFilter(18, kodachrome && new fabric.Image.filters.Kodachrome(), imageObj);
+	// }
+
+	/**
+	 * Apply black white in image
+	 * @param {boolean} [blackWhite=false]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	// public applyBlackWhite = (blackWhite = false, imageObj?: fabric.Image): void => {
+	//     this.applyFilter(19, blackWhite && new fabric.Image.filters.BlackWhite(), imageObj);
+	// }
+
+	/**
+	 * Apply blend image in image
+	 * @param {boolean} [blendImage=false]
+	 * @param {BlendImageFilter} value
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applyBlendImage = (blendImage = false, value?: BlendImageFilter, imageObj?: fabric.Image): void => {
+		this.applyFilter(20, blendImage && new fabric.Image.filters.BlendImage(value), imageObj);
+	};
+
+	/**
+	 * Apply hue rotation in image
+	 * @param {boolean} [hue=false]
+	 * @param {HueRotationFilter} [value]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	// public applyHue = (hue = false, value?: HueRotationFilter, imageObj?: fabric.Image): void => {
+	//     this.applyFilter(21, hue && new fabric.Image.filters.HueRotation(value ? {
+	//         rotation: value,
+	//     } : undefined), imageObj);
+	// }
+
+	/**
+	 * Apply resize in image
+	 * @param {boolean} [resize=false]
+	 * @param {ResizeFilter} [value]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applyResize = (resize = false, value?: ResizeFilter, imageObj?: fabric.Image): void => {
+		this.applyFilter(22, resize && new fabric.Image.filters.Resize(value), imageObj);
+	};
+
+	/**
+	 * Apply tint in image
+	 * @param {boolean} [tint=false]
+	 * @param {TintFilter} [value]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applyTint = (tint = false, value?: TintFilter, imageObj?: fabric.Image): void => {
+		this.applyFilter(23, tint && new fabric.Image.filters.Tint(value), imageObj);
+	};
+
+	/**
+	 * Apply mask in image
+	 * @param {boolean} [mask=false]
+	 * @param {MaskFilter} [value]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applyMask = (mask = false, value?: MaskFilter, imageObj?: fabric.Image): void => {
+		this.applyFilter(24, mask && new fabric.Image.filters.Mask(value), imageObj);
+	};
+
+	/**
+	 * Apply multiply in image
+	 * @param {boolean} [multiply=false]
+	 * @param {MultiplyFilter} [value]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applyMultiply = (multiply = false, value?: MultiplyFilter, imageObj?: fabric.Image): void => {
+		this.applyFilter(25, multiply && new fabric.Image.filters.Multiply(value), imageObj);
+	};
+
+	/**
+	 * Apply sepia2 in image
+	 * @param {boolean} [sepia2=false]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applySepia2 = (sepia2 = false, imageObj?: fabric.Image): void => {
+		this.applyFilter(26, sepia2 && new fabric.Image.filters.Sepia2(), imageObj);
+	};
+
+	/**
+	 * Apply gradient transparency in image
+	 * @param {boolean} [gradientTransparency=false]
+	 * @param {GradientTransparencyFilter} [value]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applyGradientTransparency = (
+		gradientTransparency = false,
+		value?: GradientTransparencyFilter,
+		imageObj?: fabric.Image,
+	): void => {
+		this.applyFilter(27, gradientTransparency && new fabric.Image.filters.GradientTransparency(value), imageObj);
+	};
+
+	/**
+	 * Apply color matrix in image
+	 * @param {boolean} [colorMatrix=false]
+	 * @param {ColorMatrixFilter} [value]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applyColorMatrix = (colorMatrix = false, value?: ColorMatrixFilter, imageObj?: fabric.Image): void => {
+		this.applyFilter(28, colorMatrix && new fabric.Image.filters.ColorMatrix(value), imageObj);
+	};
+
+	/**
+	 * Apply remove white in image
+	 * @param {boolean} [removeWhite=false]
+	 * @param {RemoveWhiteFilter} [value]
+	 * @param {fabric.Image} [imageObj]
+	 */
+	public applyRemoveWhite = (removeWhite = false, value?: RemoveWhiteFilter, imageObj?: fabric.Image): void => {
+		this.applyFilter(29, removeWhite && new fabric.Image.filters.RemoveWhite(value), imageObj);
+	};
+}
+
+export default ImageHandler;
diff --git a/src/pages/Fabric/canvas/handlers/InteractionHandler.ts b/src/pages/Fabric/canvas/handlers/InteractionHandler.ts
new file mode 100644
index 0000000..aaa93d5
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/InteractionHandler.ts
@@ -0,0 +1,177 @@
+import { fabric } from 'fabric';
+import { FabricObject, InteractionMode } from '../utils';
+import Handler from './Handler';
+
+type IReturnType = { selectable?: boolean; evented?: boolean } | boolean;
+
+class InteractionHandler {
+	handler: Handler;
+
+	constructor(handler: Handler) {
+		this.handler = handler;
+		if (this.handler.editable) {
+			this.selection();
+		}
+	}
+
+	/**
+	 * Change selection mode
+	 * @param {(obj: FabricObject) => IReturnType} [callback]
+	 */
+	public selection = (callback?: (obj: FabricObject) => IReturnType) => {
+		if (this.handler.interactionMode === 'selection') {
+			return;
+		}
+		this.handler.interactionMode = 'selection';
+		if (typeof this.handler.canvasOption.selection === 'undefined') {
+			this.handler.canvas.selection = true;
+		} else {
+			this.handler.canvas.selection = this.handler.canvasOption.selection;
+		}
+		this.handler.canvas.defaultCursor = 'default';
+		this.handler.workarea.hoverCursor = 'default';
+		this.handler.getObjects().forEach(obj => {
+			if (callback) {
+				this.interactionCallback(obj, callback);
+			} else {
+				// When typeof selection is ActiveSelection, ignoring selectable, because link position left: 0, top: 0
+				if (obj.superType === 'link' || obj.superType === 'port') {
+					obj.selectable = false;
+					obj.evented = true;
+					obj.hoverCursor = 'pointer';
+					return;
+				}
+				if (this.handler.editable) {
+					obj.hoverCursor = 'move';
+				} else {
+					obj.hoverCursor = 'pointer';
+				}
+				obj.selectable = true;
+				obj.evented = true;
+			}
+		});
+		this.handler.canvas.renderAll();
+		this.handler.onInteraction?.('selection');
+	};
+
+	/**
+	 * Change grab mode
+	 * @param {(obj: FabricObject) => IReturnType} [callback]
+	 */
+	public grab = (callback?: (obj: FabricObject) => IReturnType) => {
+		if (this.handler.interactionMode === 'grab') {
+			return;
+		}
+		this.handler.interactionMode = 'grab';
+		this.handler.canvas.selection = false;
+		this.handler.canvas.defaultCursor = 'grab';
+		this.handler.workarea.hoverCursor = 'grab';
+		this.handler.getObjects().forEach(obj => {
+			if (callback) {
+				this.interactionCallback(obj, callback);
+			} else {
+				obj.selectable = false;
+				obj.evented = this.handler.editable ? false : true;
+			}
+		});
+		this.handler.canvas.renderAll();
+		this.handler.onInteraction?.('grab');
+	};
+
+	/**
+	 * Change drawing mode
+	 * @param {InteractionMode} [type]
+	 * @param {(obj: FabricObject) => IReturnType} [callback]
+	 */
+	public drawing = (type?: InteractionMode, callback?: (obj: FabricObject) => IReturnType) => {
+		if (this.isDrawingMode()) {
+			return;
+		}
+		this.handler.interactionMode = type;
+		this.handler.canvas.selection = false;
+		this.handler.canvas.defaultCursor = 'pointer';
+		this.handler.workarea.hoverCursor = 'pointer';
+		this.handler.getObjects().forEach(obj => {
+			if (callback) {
+				this.interactionCallback(obj, callback);
+			} else {
+				obj.selectable = false;
+				obj.evented = this.handler.editable ? false : true;
+			}
+		});
+		this.handler.canvas.renderAll();
+		this.handler.onInteraction?.(type);
+	};
+
+	public linking = (callback?: (obj: FabricObject) => IReturnType) => {
+		if (this.isDrawingMode()) {
+			return;
+		}
+		this.handler.interactionMode = 'link';
+		this.handler.canvas.selection = false;
+		this.handler.canvas.defaultCursor = 'default';
+		this.handler.workarea.hoverCursor = 'default';
+		this.handler.getObjects().forEach(obj => {
+			if (callback) {
+				this.interactionCallback(obj, callback);
+			} else {
+				if (obj.superType === 'node' || obj.superType === 'port') {
+					obj.hoverCursor = 'pointer';
+					obj.selectable = false;
+					obj.evented = true;
+					return;
+				}
+				obj.selectable = false;
+				obj.evented = this.handler.editable ? false : true;
+			}
+		});
+		this.handler.canvas.renderAll();
+		this.handler.onInteraction?.('link');
+	};
+
+	/**
+	 * Moving objects in grap mode
+	 * @param {MouseEvent} e
+	 */
+	public moving = (e: MouseEvent) => {
+		if (this.isDrawingMode()) {
+			return;
+		}
+		const delta = new fabric.Point(e.movementX, e.movementY);
+		this.handler.canvas.relativePan(delta);
+		this.handler.canvas.requestRenderAll();
+		this.handler.objects.forEach(obj => {
+			if (obj.superType === 'element') {
+				const { id } = obj;
+				const el = this.handler.elementHandler.findById(id);
+				// update the element
+				this.handler.elementHandler.setPosition(el, obj);
+			}
+		});
+	};
+
+	/**
+	 * Whether is drawing mode
+	 * @returns
+	 */
+	public isDrawingMode = () => {
+		return (
+			this.handler.interactionMode === 'link' ||
+			this.handler.interactionMode === 'arrow' ||
+			this.handler.interactionMode === 'line' ||
+			this.handler.interactionMode === 'polygon'
+		);
+	};
+
+	/**
+	 * Interaction callback
+	 *
+	 * @param {FabricObject} obj
+	 * @param {(obj: FabricObject) => void} [callback]
+	 */
+	private interactionCallback = (obj: FabricObject, callback?: (obj: FabricObject) => void) => {
+		callback(obj);
+	};
+}
+
+export default InteractionHandler;
diff --git a/src/pages/Fabric/canvas/handlers/LinkHandler.ts b/src/pages/Fabric/canvas/handlers/LinkHandler.ts
new file mode 100644
index 0000000..a232d76
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/LinkHandler.ts
@@ -0,0 +1,297 @@
+import { message } from 'antd';
+import { CurvedLink } from '../objects';
+import { LinkObject } from '../objects/Link';
+import { NodeObject } from '../objects/Node';
+import { PortObject } from '../objects/Port';
+import Handler from './Handler';
+
+export interface LinkOption {
+  /**
+   * Link Type
+   * @type {string}
+   */
+  type: string;
+  /**
+   * FromNode id of Link
+   * @type {string}
+   */
+  fromNodeId?: string;
+  /**
+   * FromPort id of Link
+   * @type {string}
+   */
+  fromPortId?: string;
+  /**
+   * ToNode id of Link
+   * @type {string}
+   */
+  toNodeId?: string;
+  /**
+   * ToPort id of Link
+   * @type {string}
+   */
+  toPortId?: string;
+}
+
+/**
+ * Link Handler Class
+ * @author salgum1114
+ * @class LinkHandler
+ */
+class LinkHandler {
+  private port: PortObject = null;
+  handler: Handler;
+
+  constructor(handler: Handler) {
+    this.handler = handler;
+  }
+
+  /**
+   * On source port click, start link
+   * @param {PortObject} port
+   */
+  init = (port: PortObject) => {
+    if (this.isDrawing()) {
+      return;
+    }
+    if (this.isConnected(port)) {
+      return;
+    }
+    this.port = port;
+    this.port.set({
+      fill: port.selectFill,
+    });
+    this.handler.interactionHandler.linking();
+    const { left, top, nodeId, id } = port;
+    const fromPort = { left, top, id };
+    const toPort = { left, top };
+    const fromNode = this.handler.objectMap[nodeId];
+    this.handler.activeLine = new CurvedLink(fromNode, fromPort, null, toPort, {
+      strokeWidth: 4,
+      fill: '#999999',
+      stroke: '#999999',
+      class: 'line',
+      originX: 'center',
+      originY: 'center',
+      selectable: false,
+      hasBorders: false,
+      hasControls: false,
+      evented: false,
+    });
+    this.handler.canvas.add(this.handler.activeLine);
+  };
+
+  /**
+   * End drawing link.
+   */
+  finish = (link?: LinkObject) => {
+    if (!link) {
+      this.port.set({
+        fill: this.port.originFill,
+      });
+    }
+    this.handler.interactionHandler.selection();
+    this.handler.canvas.remove(this.handler.activeLine);
+    this.handler.activeLine = null;
+    this.handler.canvas.renderAll();
+  };
+
+  /**
+   * On dest port click, finish link
+   * @param {PortObject} port
+   */
+  generate = (port: PortObject) => {
+    if (!port) {
+      message.warning(!port);
+      return;
+    }
+    if (this.isDuplicate(port)) {
+      return;
+    }
+    if (this.isSameNode(port)) {
+      return;
+    }
+    const link = {
+      type: 'curvedLink',
+      fromNodeId: this.handler.activeLine.fromNode.id,
+      fromPortId: this.handler.activeLine.fromPort.id,
+      toNodeId: port.nodeId,
+      toPortId: port.id,
+    };
+    const createdLink = this.create(link);
+    this.finish(createdLink);
+    // TODO...
+    // Save transactions unconditionally
+    if (!this.handler.transactionHandler.active) {
+      this.handler.transactionHandler.save('add');
+    }
+  };
+
+  /**
+   * Add link in Canvas
+   * @param {LinkOption} link
+   * @param {boolean} [loaded=false]
+   * @returns
+   */
+  create = (link: LinkOption, loaded = false) => {
+    const fromNode = this.handler.objectMap[link.fromNodeId] as NodeObject;
+    const fromPort = fromNode.fromPort.filter((port) => port.id === link.fromPortId || !port.id)[0];
+    const toNode = this.handler.objectMap[link.toNodeId] as NodeObject;
+    const { toPort } = toNode;
+    const createdObj = this.handler.fabricObjects[link.type].create(
+      fromNode,
+      fromPort,
+      toNode,
+      toPort,
+      {
+        ...link,
+      },
+    ) as LinkObject;
+    this.handler.canvas.add(createdObj);
+    this.handler.objects = this.handler.getObjects();
+    const { editable } = this.handler;
+    if (this.handler.onAdd && editable && !loaded) {
+      this.handler.onAdd(createdObj);
+    }
+    this.handler.canvas.renderAll();
+    createdObj.setPort(fromNode, fromPort, toNode, toPort);
+    this.handler.portHandler.setCoords(fromNode);
+    this.handler.portHandler.setCoords(toNode);
+    this.handler.canvas.requestRenderAll();
+    return createdObj;
+  };
+
+  /**
+   * Set coordinate of link
+   * @param {number} x1
+   * @param {number} y1
+   * @param {number} x2
+   * @param {number} y2
+   * @param {LinkObject} link
+   */
+  setCoords = (x1: number, y1: number, x2: number, y2: number, link: LinkObject) => {
+    link.set({
+      x1,
+      y1,
+      x2,
+      y2,
+    });
+    link.setCoords();
+  };
+
+  /**
+   * When the link is deleted, linked FromNode delete
+   * @param {LinkObject} link
+   */
+  removeFrom = (link: LinkObject) => {
+    if (link.fromPort) {
+      let index = -1;
+      if (link.fromPort.links.length) {
+        link.fromPort.links.some((portLink: any, i: number) => {
+          if (link.id === portLink.id) {
+            index = i;
+            return true;
+          }
+          return false;
+        });
+        if (index > -1) {
+          link.fromPort.links.splice(index, 1);
+        }
+      }
+      link.setPortEnabled(link.fromNode, link.fromPort, true);
+    }
+  };
+
+  /**
+   * When the link is deleted, linked ToNode delete
+   * @param {LinkObject} link
+   */
+  removeTo = (link: LinkObject) => {
+    if (link.toNode.toPort.links.length) {
+      let index = -1;
+      link.toNode.toPort.links.some((portLink: any, i: number) => {
+        if (link.id === portLink.id) {
+          index = i;
+          return true;
+        }
+        return false;
+      });
+      if (index > -1) {
+        link.toNode.toPort.links.splice(index, 1);
+      }
+      link.setPortEnabled(link.toNode, link.toNode.toPort, true);
+    }
+  };
+
+  /**
+   * When the link is deleted, linked node delete
+   * @param {LinkObject} link
+   */
+  removeAll = (link: LinkObject) => {
+    this.removeFrom(link);
+    this.removeTo(link);
+  };
+
+  /**
+   * Remove link in canvas
+   * @param {LinkObject} link
+   * @param {string} [type]
+   */
+  remove = (link: LinkObject, type?: string) => {
+    if (type === 'from') {
+      this.removeFrom(link);
+    } else if (type === 'to') {
+      this.removeTo(link);
+    } else {
+      this.removeAll(link);
+    }
+    this.handler.canvas.remove(link);
+    this.handler.objects = this.handler.getObjects();
+  };
+
+  /**
+   * Check if there is a port connected
+   * @param {PortObject} port
+   * @returns
+   */
+  isConnected = (port: PortObject) => {
+    message.warning('A connected node already exists.');
+    return !port.enabled;
+  };
+
+  /**
+   * Check if select same node
+   * @param {PortObject} port
+   * @returns
+   */
+  isSameNode = (port: PortObject) => {
+    const validate = port.nodeId === this.handler.activeLine.fromNode.id;
+    message.warning('Cannot select the same node.');
+    return validate;
+  };
+
+  /**
+   * Check if select same node
+   * @param {PortObject} port
+   * @returns
+   */
+  isDuplicate = (port: PortObject) => {
+    const validate = port.links.some(
+      (link) => link.fromNode.id === this.handler.activeLine.fromNode.id,
+    );
+    message.warning('Duplicate connections cannot be made.');
+    return validate;
+  };
+
+  /**
+   * Check if draw the link
+   * @returns
+   */
+  isDrawing = () => {
+    const validate = this.handler.interactionMode === 'link' && this.handler.activeLine;
+    message.warning('Already drawing links.');
+    return validate;
+  };
+}
+
+export default LinkHandler;
diff --git a/src/pages/Fabric/canvas/handlers/NodeHandler.ts b/src/pages/Fabric/canvas/handlers/NodeHandler.ts
new file mode 100644
index 0000000..71dd580
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/NodeHandler.ts
@@ -0,0 +1,283 @@
+import { fabric } from 'fabric';
+import { LinkObject } from '../objects/Link';
+import { NodeObject } from '../objects/Node';
+import { FabricObject } from '../utils';
+import Handler from './Handler';
+
+class NodeHandler {
+	handler: Handler;
+	constructor(handler: Handler) {
+		this.handler = handler;
+	}
+
+	/**
+	 * Get the node path by target object
+	 * @param {NodeObject} target
+	 * @param {NodeObject[]} [nodes=[]]
+	 * @param {string} [direction='init']
+	 */
+	getNodePath = (target: NodeObject, nodes: NodeObject[] = [], direction = 'init') => {
+		if (target) {
+			if (direction === 'to' || direction === 'init') {
+				if (target.toPort) {
+					target.toPort.links.forEach(link => {
+						if (link.fromNode) {
+							nodes.push(link.fromNode);
+							this.getNodePath(link.fromNode, nodes, 'to');
+						}
+					});
+				}
+				if (direction === 'init') {
+					nodes.push(target);
+				}
+			}
+			if (direction === 'from' || direction === 'init') {
+				target.fromPort.forEach(port => {
+					port.links.forEach(link => {
+						if (link.toNode) {
+							nodes.push(link.toNode);
+							this.getNodePath(link.toNode, nodes, 'from');
+						}
+					});
+				});
+			}
+		}
+	};
+
+	/**
+	 * Select the node path
+	 * @param {string[]} [path]
+	 */
+	selectByPath = (path?: string[]) => {
+		if (!path || !path.length) {
+			return;
+		}
+		const targetObjects = this.handler.objects.filter(object => path.some(id => id === object.id));
+		const nonTargetObjects = this.handler.objects.filter(object => path.some(id => id !== object.id));
+		nonTargetObjects.forEach((object: any) => {
+			if (object.superType === 'link') {
+				const { fromNode, toNode } = object as LinkObject;
+				if (fromNode && toNode) {
+					const fromIndex = targetObjects.findIndex(obj => obj.id === fromNode.id);
+					const toIndex = targetObjects.findIndex(obj => obj.id === toNode.id);
+					if (fromIndex >= 0 && targetObjects[fromIndex] && toIndex >= 0 && targetObjects[toIndex]) {
+						object.set({
+							opacity: 1,
+							shadow: {
+								color: object.stroke,
+							},
+						});
+						this.highlightingNode(object, 300);
+						this.handler.canvas.requestRenderAll();
+						return;
+					}
+				}
+			}
+			object.set({
+				opacity: 0.2,
+			});
+			if (object.superType === 'node') {
+				if (object.toPort) {
+					object.toPort.set({
+						opacity: 0.2,
+					});
+				}
+				object.fromPort.forEach((port: any) => {
+					port.set({
+						opacity: 0.2,
+					});
+				});
+			}
+			if (!object.animating) {
+				object.set('shadow', {
+					blur: 0,
+				});
+			}
+		});
+		targetObjects.forEach((object: any) => {
+			object.set({
+				opacity: 1,
+				shadow: {
+					color: object.stroke,
+				},
+			});
+			this.highlightingNode(object, 300);
+			if (object.toPort) {
+				object.toPort.set({
+					opacity: 1,
+				});
+			}
+			if (object.fromPort) {
+				object.fromPort.forEach((port: any) => {
+					port.set({
+						opacity: 1,
+					});
+				});
+			}
+		});
+		this.handler.canvas.requestRenderAll();
+	};
+
+	/**
+	 * Select node by id
+	 * @param {string} id
+	 */
+	selectById = (id: string) => {
+		this.handler.objects.forEach((object: FabricObject) => {
+			if (id === object.id) {
+				object.set('shadow', {
+					color: object.stroke,
+					blur: 50,
+				} as fabric.Shadow);
+				return;
+			} else if (id === object.nodeId) {
+				return;
+			}
+			object.set('shadow', {
+				blur: 0,
+			} as fabric.Shadow);
+		});
+		this.handler.canvas.requestRenderAll();
+	};
+
+	/**
+	 * Deselect nodes
+	 */
+	deselect = () => {
+		this.handler.objects.forEach((object: FabricObject) => {
+			object.set({
+				opacity: 1,
+			});
+			if (object.superType === 'node') {
+				const node = object as NodeObject;
+				if (node.toPort) {
+					node.toPort.set({
+						opacity: 1,
+					});
+				}
+				node.fromPort.forEach(port => {
+					port.set({
+						opacity: 1,
+					});
+				});
+			}
+			if (!object.animating) {
+				const node = object as FabricObject;
+				node.set('shadow', {
+					blur: 0,
+				} as fabric.Shadow);
+			}
+		});
+		this.handler.canvas.renderAll();
+	};
+
+	/**
+	 * Highlight path by ids
+	 * @param {string[]} [path]
+	 */
+	highlightingByPath = (path?: string[]) => {
+		if (!path || !path.length) {
+			return;
+		}
+		const targetObjects = this.handler.objects.filter((obj: FabricObject) => path.some(id => id === obj.id));
+		const nonTargetObjects = this.handler.objects.filter((obj: FabricObject) => path.some(id => id !== obj.id));
+		const lastObject = targetObjects.filter((obj: FabricObject) => obj.id === path[path.length - 1])[0];
+		targetObjects.forEach((object: FabricObject) => {
+			if (lastObject) {
+				object.set('shadow', {
+					color: lastObject.stroke,
+				} as fabric.Shadow);
+			} else {
+				object.set('shadow', {
+					color: object.stroke,
+				} as fabric.Shadow);
+			}
+			this.highlightingNode(object);
+			this.handler.canvas.requestRenderAll();
+		});
+		nonTargetObjects.forEach((object: FabricObject) => {
+			if (object.superType === 'link') {
+				const { fromNode, toNode } = object;
+				if (fromNode && toNode) {
+					const fromIndex = targetObjects.findIndex((obj: FabricObject) => obj.id === fromNode.id);
+					const toIndex = targetObjects.findIndex((obj: FabricObject) => obj.id === toNode.id);
+					if (fromIndex >= 0 && targetObjects[fromIndex] && toIndex >= 0 && targetObjects[toIndex]) {
+						if (lastObject) {
+							object.set('shadow', {
+								color: lastObject.stroke,
+							} as fabric.Shadow);
+						} else {
+							object.set('shadow', {
+								color: object.stroke,
+							} as fabric.Shadow);
+						}
+						this.highlightingNode(object);
+						this.highlightingLink(object, lastObject);
+						return;
+					}
+				}
+			}
+		});
+		this.handler.canvas.requestRenderAll();
+	};
+
+	/**
+	 * Highlight link
+	 * @param {FabricObject} object
+	 * @param {FabricObject} targetObject
+	 * @param {number} [duration=500]
+	 */
+	highlightingLink = (object: FabricObject, targetObject: FabricObject, duration = 500) => {
+		object.animation = {
+			duration,
+			type: 'flash',
+			stroke: targetObject ? targetObject.stroke : object.stroke,
+			loop: 1,
+			delay: 0,
+		};
+		this.handler.animationHandler.play(object.id, false);
+	};
+
+	/**
+	 * Highlight node
+	 *
+	 * @param {*} object
+	 * @param {number} [duration=500]
+	 * @param {number} [minBlur=0]
+	 * @param {number} [maxBlur=50]
+	 */
+	highlightingNode = (object: FabricObject, duration = 500, minBlur = 0, maxBlur = 50) => {
+		const onComplete = () => {
+			if ((object.shadow as fabric.Shadow).blur === maxBlur) {
+				object.animating = true;
+				object.animate('shadow.blur', minBlur, {
+					easing: fabric.util.ease.easeInOutQuad,
+					onChange: (value: number) => {
+						(object.shadow as fabric.Shadow).blur = value;
+						this.handler.canvas.requestRenderAll();
+					},
+					onComplete: () => {
+						object.animating = false;
+						if (object.superType === 'link') {
+							object.set({
+								stroke: object.originStroke || object.stroke,
+							});
+						}
+					},
+				});
+			}
+		};
+		object.animating = true;
+		object.animate('shadow.blur', maxBlur, {
+			easing: fabric.util.ease.easeInOutQuad,
+			duration,
+			onChange: (value: number) => {
+				(object.shadow as fabric.Shadow).blur = value;
+				this.handler.canvas.requestRenderAll();
+			},
+			onComplete,
+		});
+	};
+}
+
+export default NodeHandler;
diff --git a/src/pages/Fabric/canvas/handlers/PortHandler.ts b/src/pages/Fabric/canvas/handlers/PortHandler.ts
new file mode 100644
index 0000000..996ee80
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/PortHandler.ts
@@ -0,0 +1,195 @@
+import Handler from './Handler';
+import { NodeObject } from '../objects/Node';
+import { PortObject } from '../objects/Port';
+
+class PortHandler {
+	handler?: Handler;
+
+	constructor(handler: Handler) {
+		this.handler = handler;
+	}
+
+	/**
+	 * Create port
+	 * @param {NodeObject} target
+	 */
+	create = (target: NodeObject) => {
+		if (!target.createToPort) {
+			return;
+		}
+		const toPort = target.createToPort(target.left + target.width / 2, target.top);
+		if (toPort) {
+			toPort.on('mouseover', () => {
+				if (
+					this.handler.interactionMode === 'link' &&
+					this.handler.activeLine &&
+					this.handler.activeLine.class === 'line'
+				) {
+					if (toPort.links.some(link => link.fromNode === this.handler.activeLine.fromNode)) {
+						toPort.set({
+							fill: 'red',
+						});
+						this.handler.canvas.renderAll();
+						return;
+					}
+					toPort.set({
+						fill: 'green',
+					});
+					this.handler.canvas.renderAll();
+				}
+			});
+			toPort.on('mouseout', () => {
+				toPort.set({
+					fill: toPort.originFill,
+				});
+				this.handler.canvas.renderAll();
+			});
+			this.handler.canvas.add(toPort);
+			toPort.setCoords();
+			this.handler.canvas.bringToFront(toPort);
+		}
+		const fromPort = target.createFromPort(target.left + target.width / 2, target.top + target.height);
+		if (fromPort && fromPort.length) {
+			fromPort.forEach(port => {
+				if (port) {
+					port.on('mouseover', () => {
+						if (this.handler.interactionMode !== 'link') {
+							if (port.enabled) {
+								if (this.handler.activeLine) {
+									port.set({
+										fill: 'red',
+									});
+									this.handler.canvas.renderAll();
+									return;
+								}
+								port.set({
+									fill: 'green',
+								});
+								this.handler.canvas.renderAll();
+								return;
+							}
+							port.set({
+								fill: 'red',
+							});
+							this.handler.canvas.renderAll();
+						}
+					});
+					port.on('mouseout', () => {
+						if (this.handler.interactionMode !== 'link') {
+							port.set({
+								fill: port.enabled ? port.originFill : port.hoverFill,
+							});
+						}
+						this.handler.canvas.renderAll();
+					});
+					this.handler.canvas.add(port);
+					port.setCoords();
+					this.handler.canvas.bringToFront(port);
+				}
+			});
+		}
+	};
+
+	/**
+	 * Set coords port
+	 * @param {NodeObject} target
+	 */
+	setCoords = (target: NodeObject) => {
+		if (target.toPort) {
+			const toCoords = {
+				left: target.left + target.width / 2,
+				top: target.top,
+			};
+			target.toPort.set({
+				...toCoords,
+			});
+			target.toPort.setCoords();
+			if (target.toPort.links.length) {
+				target.toPort.links.forEach(link => {
+					const fromPort = link.fromNode.fromPort.filter(port => port.id === link.fromPort.id)[0];
+					this.handler.linkHandler.setCoords(fromPort.left, fromPort.top, toCoords.left, toCoords.top, link);
+				});
+			}
+		}
+		if (target.fromPort) {
+			const fromCoords = {
+				left: target.left + target.width / 2,
+				top: target.top + target.height,
+			};
+			target.fromPort.forEach(port => {
+				const left = port.leftDiff ? fromCoords.left + port.leftDiff : fromCoords.left;
+				const top = port.topDiff ? fromCoords.top + port.topDiff : fromCoords.top;
+				port.set({
+					left,
+					top,
+				});
+				port.setCoords();
+				if (port.links.length) {
+					port.links.forEach(link => {
+						this.handler.linkHandler.setCoords(
+							left,
+							top,
+							link.toNode.toPort.left,
+							link.toNode.toPort.top,
+							link,
+						);
+					});
+				}
+			});
+		}
+	};
+
+	/**
+	 * Recreate port
+	 * @param {NodeObject} target
+	 */
+	recreate = (target: NodeObject) => {
+		const { fromPort, toPort } = target;
+		const ports = target.ports as PortObject[];
+		if (ports) {
+			ports.forEach(port => {
+				target.removeWithUpdate(port);
+				this.handler.canvas.remove(port.fromPort);
+			});
+		}
+		this.handler.canvas.remove(target.toPort);
+		if (target.toPort) {
+			target.toPort.links.forEach(link => {
+				this.handler.linkHandler.remove(link, 'from');
+			});
+		}
+		if (target.fromPort) {
+			target.fromPort.forEach((port: any) => {
+				if (port.links.length) {
+					port.links.forEach((link: any) => {
+						this.handler.linkHandler.remove(link, 'to');
+					});
+				}
+			});
+		}
+		this.create(target);
+		toPort.links.forEach((link: any) => {
+			link.fromNode = link.fromNode.id;
+			link.fromPort = link.fromPort.id;
+			link.toNode = target.toPort.nodeId;
+			link.toPort = target.toPort.id;
+			this.handler.linkHandler.create(link);
+		});
+		fromPort
+			.filter(op => target.fromPort.some(np => np.id === op.id))
+			.forEach(port => {
+				port.links.forEach((link: any) => {
+					if (link.fromPort.id === port.id) {
+						link.fromNode = port.nodeId;
+						link.fromPort = port.id;
+						link.toNode = link.toNode.id;
+						link.toPort = link.toPort.id;
+						this.handler.linkHandler.create(link);
+						this.setCoords(target);
+					}
+				});
+			});
+	};
+}
+
+export default PortHandler;
diff --git a/src/pages/Fabric/canvas/handlers/ShortcutHandler.ts b/src/pages/Fabric/canvas/handlers/ShortcutHandler.ts
new file mode 100644
index 0000000..9155d72
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/ShortcutHandler.ts
@@ -0,0 +1,170 @@
+import Handler from './Handler';
+import { KeyEvent } from '../utils';
+import { code } from '../constants';
+
+/**
+ * Shortcut Handler Class
+ *
+ * @author salgum1114
+ * @class ShortcutHandler
+ */
+class ShortcutHandler {
+	handler: Handler;
+	keyEvent: KeyEvent;
+	constructor(handler: Handler) {
+		this.handler = handler;
+		this.keyEvent = handler.keyEvent;
+	}
+
+	/**
+	 * Whether keydown Escape
+	 *
+	 * @param {KeyboardEvent} e
+	 * @returns
+	 */
+	public isEscape = (e: KeyboardEvent) => {
+		return e.code === code.ESCAPE && this.keyEvent.esc;
+	};
+
+	/**
+	 * Whether keydown Q
+	 *
+	 * @param {KeyboardEvent} e
+	 * @returns
+	 */
+	public isQ = (e: KeyboardEvent) => {
+		return e.code === code.KEY_Q;
+	};
+
+	/**
+	 * Whether keydown W
+	 *
+	 * @param {KeyboardEvent} e
+	 * @returns
+	 */
+	public isW = (e: KeyboardEvent) => {
+		return e.code === code.KEY_W;
+	};
+
+	/**
+	 * Whether keydown Delete or Backpsace
+	 *
+	 * @param {KeyboardEvent} e
+	 * @returns
+	 */
+	public isDelete = (e: KeyboardEvent) => {
+		return (e.code === code.BACKSPACE || e.code === code.DELETE) && this.keyEvent.del;
+	};
+
+	/**
+	 * Whether keydown Arrow
+	 *
+	 * @param {KeyboardEvent} e
+	 * @returns
+	 */
+	public isArrow = (e: KeyboardEvent) => {
+		return e.code.includes('Arrow') && this.keyEvent.move;
+	};
+
+	/**
+	 * Whether keydown Ctrl + A
+	 *
+	 * @param {KeyboardEvent} e
+	 * @returns
+	 */
+	public isCtrlA = (e: KeyboardEvent) => {
+		return (e.ctrlKey || e.metaKey) && e.code === code.KEY_A && this.keyEvent.all;
+	};
+
+	/**
+	 * Whether keydown Ctrl + C
+	 *
+	 * @param {KeyboardEvent} e
+	 * @returns
+	 */
+	public isCtrlC = (e: KeyboardEvent) => {
+		return (e.ctrlKey || e.metaKey) && e.code === code.KEY_C && this.keyEvent.copy;
+	};
+
+	/**
+	 * Whether keydown Ctrl + V
+	 *
+	 * @param {KeyboardEvent} e
+	 * @returns
+	 */
+	public isCtrlV = (e: KeyboardEvent) => {
+		return (e.ctrlKey || e.metaKey) && e.code === code.KEY_V && this.keyEvent.paste;
+	};
+
+	/**
+	 * Whether keydown Ctrl + Z
+	 *
+	 * @param {KeyboardEvent} e
+	 * @returns
+	 */
+	public isCtrlZ = (e: KeyboardEvent) => {
+		return (e.ctrlKey || e.metaKey) && e.code === code.KEY_Z && this.keyEvent.transaction;
+	};
+
+	/**
+	 * Whether keydown Ctrl + Y
+	 *
+	 * @param {KeyboardEvent} e
+	 * @returns
+	 */
+	public isCtrlY = (e: KeyboardEvent) => {
+		return (e.ctrlKey || e.metaKey) && e.code === code.KEY_Y && this.keyEvent.transaction;
+	};
+
+	/**
+	 * Whether keydown Plus Or Equal
+	 *
+	 * @param {KeyboardEvent} e
+	 * @returns
+	 */
+	public isPlus = (e: KeyboardEvent) => {
+		return e.code === code.EQUAL && this.keyEvent.zoom;
+	};
+
+	/**
+	 * Whether keydown Minus
+	 *
+	 * @param {KeyboardEvent} e
+	 * @returns
+	 */
+	public isMinus = (e: KeyboardEvent) => {
+		return e.code === code.MINUS && this.keyEvent.zoom;
+	};
+
+	/**
+	 * Whether keydown O
+	 *
+	 * @param {KeyboardEvent} e
+	 * @returns
+	 */
+	public isO = (e: KeyboardEvent) => {
+		return e.code === code.KEY_O && this.keyEvent.zoom;
+	};
+
+	/**
+	 * Whether keydown P
+	 *
+	 * @param {KeyboardEvent} e
+	 * @returns
+	 */
+	public isP = (e: KeyboardEvent) => {
+		return e.code === code.KEY_P && this.keyEvent.zoom;
+	};
+
+	/**
+	 * Whether keydown Ctrl + X
+	 *
+	 * @param {KeyboardEvent} e
+	 * @returns
+	 */
+	public isCtrlX = (e: KeyboardEvent) => {
+		return (e.ctrlKey || e.metaKey) && e.code === code.KEY_X && this.keyEvent.cut;
+	};
+}
+
+export default ShortcutHandler;
diff --git a/src/pages/Fabric/canvas/handlers/TooltipHandler.ts b/src/pages/Fabric/canvas/handlers/TooltipHandler.ts
new file mode 100644
index 0000000..6511463
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/TooltipHandler.ts
@@ -0,0 +1,98 @@
+import {debounce } from 'lodash';
+import ReactDOM from 'react-dom';
+import { FabricObject } from '../utils';
+import Handler from './Handler';
+
+
+class TooltipHandler {
+	handler: Handler;
+	tooltipEl: HTMLDivElement;
+	target?: fabric.Object;
+
+	constructor(handler: Handler) {
+		this.handler = handler;
+		if (!handler.editable) {
+			this.initialize();
+		}
+	}
+
+	/**
+	 * Initialize tooltip
+	 *
+	 * @author salgum1114
+	 */
+	public initialize() {
+		this.tooltipEl = document.createElement('div');
+		this.tooltipEl.id = `${this.handler.id}_tooltip`;
+		this.tooltipEl.className = 'rde-tooltip tooltip-hidden';
+		document.body.appendChild(this.tooltipEl);
+	}
+
+	/**
+	 * Destroy tooltip
+	 *
+	 * @author salgum1114
+	 */
+	public destroy() {
+		if (this.tooltipEl) {
+			document.body.removeChild(this.tooltipEl);
+		}
+	}
+
+	/**
+	 * Show tooltip
+	 *
+	 * @param {FabricObject} [target]
+	 */
+	public show = debounce(async (target?: FabricObject) => {
+		if (target.tooltip && target.tooltip.enabled) {
+			while (this.tooltipEl.hasChildNodes()) {
+				this.tooltipEl.removeChild(this.tooltipEl.firstChild);
+			}
+			const tooltip = document.createElement('div');
+			tooltip.className = 'rde-tooltip-right';
+			let element = target.name as any;
+			const { onTooltip } = this.handler;
+			if (onTooltip) {
+				element = await onTooltip(tooltip, target);
+				if (!element) {
+					return;
+				}
+			}
+			tooltip.innerHTML = element;
+			this.tooltipEl.appendChild(tooltip);
+			ReactDOM.render(element, tooltip);
+			this.tooltipEl.classList.remove('tooltip-hidden');
+			const zoom = this.handler.canvas.getZoom();
+			const { clientHeight } = this.tooltipEl;
+			const { width, height, scaleX, scaleY } = target;
+			const { left, top } = target.getBoundingRect();
+			const { _offset: offset } = this.handler.canvas.calcOffset() as any;
+			const objWidthDiff = width * scaleX * zoom;
+			const objHeightDiff = (height * scaleY * zoom) / 2 - clientHeight / 2;
+			const calcLeft = offset.left + left + objWidthDiff;
+			const calcTop = offset.top + top + objHeightDiff;
+			if (document.body.clientWidth <= calcLeft + this.tooltipEl.offsetWidth) {
+				this.tooltipEl.style.left = `${left + offset.left - this.tooltipEl.offsetWidth}px`;
+				tooltip.className = 'rde-tooltip-left';
+			} else {
+				this.tooltipEl.style.left = `${calcLeft}px`;
+			}
+			this.tooltipEl.style.top = `${calcTop}px`;
+			this.handler.target = target;
+		}
+	}, 100);
+
+	/**
+	 * Hide tooltip
+	 * @param {fabric.Object} [_target]
+	 */
+	public hide = debounce((_target?: fabric.Object) => {
+		this.handler.target = null;
+		if (this.tooltipEl) {
+			this.tooltipEl.classList.add('tooltip-hidden');
+		}
+	}, 100);
+}
+
+export default TooltipHandler;
diff --git a/src/pages/Fabric/canvas/handlers/TransactionHandler.ts b/src/pages/Fabric/canvas/handlers/TransactionHandler.ts
new file mode 100644
index 0000000..d1f4a67
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/TransactionHandler.ts
@@ -0,0 +1,184 @@
+import { fabric } from 'fabric';
+import {throttle} from 'lodash';
+
+import Handler from './Handler';
+import { FabricObject } from '../utils';
+import { NodeObject } from '../objects/Node';
+import { LinkObject } from '../objects/Link';
+
+export type TransactionType =
+	| 'add'
+	| 'remove'
+	| 'moved'
+	| 'scaled'
+	| 'rotated'
+	| 'skewed'
+	| 'group'
+	| 'ungroup'
+	| 'paste'
+	| 'bringForward'
+	| 'bringToFront'
+	| 'sendBackwards'
+	| 'sendToBack'
+	| 'redo'
+	| 'undo';
+
+export interface TransactionTransform {
+	scaleX?: number;
+	scaleY?: number;
+	skewX?: number;
+	skewY?: number;
+	angle?: number;
+	left?: number;
+	top?: number;
+	flipX?: number;
+	flipY?: number;
+	originX?: string;
+	originY?: string;
+}
+
+export interface TransactionEvent {
+	json: string;
+	type: TransactionType;
+}
+
+class TransactionHandler {
+	handler: Handler;
+	redos: TransactionEvent[];
+	undos: TransactionEvent[];
+	active: boolean = false;
+	state: FabricObject[] = [];
+
+	constructor(handler: Handler) {
+		this.handler = handler;
+		this.initialize();
+	}
+
+	/**
+	 * Initialize transaction handler
+	 *
+	 */
+	public initialize = () => {
+		this.redos = [];
+		this.undos = [];
+		this.state = [];
+		this.active = false;
+	};
+
+	/**
+	 * Save transaction
+	 *
+	 * @param {TransactionType} type
+	 * @param {*} [canvasJSON]
+	 * @param {boolean} [isWorkarea=true]
+	 */
+	public save = (type: TransactionType, canvasJSON?: any, _isWorkarea: boolean = true) => {
+		if (!this.handler.keyEvent.transaction) {
+			return;
+		}
+		try {
+			if (this.state) {
+				const json = JSON.stringify(this.state);
+				this.redos = [];
+				this.undos.push({
+					type,
+					json,
+				});
+			}
+			const { objects }: { objects: FabricObject[] } =
+				canvasJSON || this.handler.canvas.toJSON(this.handler.propertiesToInclude);
+			this.state = objects.filter(obj => {
+				if (obj.id === 'workarea') {
+					return false;
+				} else if (obj.id === 'grid') {
+					return false;
+				} else if (obj.superType === 'port') {
+					return false;
+				}
+				return true;
+			});
+		} catch (error) {
+			console.error(error);
+		}
+	};
+
+	/**
+	 * Undo transaction
+	 *
+	 */
+	public undo = throttle(() => {
+		const undo = this.undos.pop();
+		if (!undo) {
+			return;
+		}
+		this.redos.push({
+			type: 'redo',
+			json: JSON.stringify(this.state),
+		});
+		this.replay(undo);
+	}, 100);
+
+	/**
+	 * Redo transaction
+	 *
+	 */
+	public redo = throttle(() => {
+		const redo = this.redos.pop();
+		if (!redo) {
+			return;
+		}
+		this.undos.push({
+			type: 'undo',
+			json: JSON.stringify(this.state),
+		});
+		this.replay(redo);
+	}, 100);
+
+	/**
+	 * Replay transaction
+	 *
+	 * @param {TransactionEvent} transaction
+	 */
+	public replay = (transaction: TransactionEvent) => {
+		const objects = JSON.parse(transaction.json) as FabricObject[];
+		this.state = objects;
+		this.active = true;
+		this.handler.canvas.renderOnAddRemove = false;
+		this.handler.clear();
+		this.handler.canvas.discardActiveObject();
+		fabric.util.enlivenObjects(
+			objects,
+			(enlivenObjects: FabricObject[]) => {
+				enlivenObjects.forEach(obj => {
+					const targetIndex = this.handler.canvas._objects.length;
+					if (obj.superType === 'node') {
+						this.handler.canvas.insertAt(obj, targetIndex, false);
+						this.handler.portHandler.create(obj as NodeObject);
+					} else if (obj.superType === 'link') {
+						const link = obj as LinkObject;
+						this.handler.objects = this.handler.getObjects();
+						this.handler.linkHandler.create({
+							type: 'curvedLink',
+							fromNodeId: link.fromNode?.id,
+							fromPortId: link.fromPort?.id,
+							toNodeId: link.toNode?.id,
+							toPortId: link.toPort?.id,
+						});
+					} else {
+						this.handler.canvas.insertAt(obj, targetIndex, false);
+					}
+				});
+				this.handler.canvas.renderOnAddRemove = true;
+				this.active = false;
+				this.handler.canvas.renderAll();
+				this.handler.objects = this.handler.getObjects();
+				if (this.handler.onTransaction) {
+					this.handler.onTransaction(transaction);
+				}
+			},
+			null,
+		);
+	};
+}
+
+export default TransactionHandler;
diff --git a/src/pages/Fabric/canvas/handlers/WorkareaHandler.ts b/src/pages/Fabric/canvas/handlers/WorkareaHandler.ts
new file mode 100644
index 0000000..9d9aed4
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/WorkareaHandler.ts
@@ -0,0 +1,354 @@
+import { fabric } from 'fabric';
+
+import { Handler } from '.';
+import { WorkareaLayout, WorkareaObject, FabricImage } from '../utils';
+import { VideoObject } from '../objects/Video';
+
+class WorkareaHandler {
+	handler: Handler;
+
+	constructor(handler: Handler) {
+		this.handler = handler;
+		this.initialize();
+	}
+
+	/**
+	 * Initialize workarea
+	 *
+	 * @author salgum1114
+	 */
+	public initialize() {
+		const { workareaOption } = this.handler;
+		const image = new Image(workareaOption.width, workareaOption.height);
+		image.width = workareaOption.width;
+		image.height = workareaOption.height;
+		this.handler.workarea = new fabric.Image(image, workareaOption) as WorkareaObject;
+		this.handler.canvas.add(this.handler.workarea);
+		this.handler.objects = this.handler.getObjects();
+		this.handler.canvas.centerObject(this.handler.workarea);
+		this.handler.canvas.renderAll();
+	}
+
+	/**
+	 * Set the layout on workarea
+	 * @param {WorkareaLayout} layout
+	 * @returns
+	 */
+	public setLayout = (layout: WorkareaLayout) => {
+		this.handler.workarea.set('layout', layout);
+		const { _element, isElement, workareaWidth, workareaHeight } = this.handler.workarea;
+		const { canvas } = this.handler;
+		let scaleX = 1;
+		let scaleY = 1;
+		const isFixed = layout === 'fixed';
+		const isResponsive = layout === 'responsive';
+		const isFullscreen = layout === 'fullscreen';
+		if (isElement) {
+			if (isFixed) {
+				scaleX = workareaWidth / _element.width;
+				scaleY = workareaHeight / _element.height;
+			} else if (isResponsive) {
+				const scales = this.calculateScale();
+				scaleX = scales.scaleX;
+				scaleY = scales.scaleY;
+			} else {
+				scaleX = canvas.getWidth() / _element.width;
+				scaleY = canvas.getHeight() / _element.height;
+			}
+		}
+		this.handler.getObjects().forEach(obj => {
+			const { id, player } = obj as VideoObject;
+			if (id !== 'workarea') {
+				const objScaleX = !isFullscreen ? 1 : scaleX;
+				const objScaleY = !isFullscreen ? 1 : scaleY;
+				const objWidth = obj.width * objScaleX * canvas.getZoom();
+				const objHeight = obj.height * objScaleY * canvas.getZoom();
+				const el = this.handler.elementHandler.findById(obj.id);
+				this.handler.elementHandler.setSize(el, obj);
+				if (player) {
+					player.setPlayerSize(objWidth, objHeight);
+				}
+				obj.set({
+					scaleX: !isFullscreen ? 1 : objScaleX,
+					scaleY: !isFullscreen ? 1 : objScaleY,
+				});
+			}
+		});
+		if (isResponsive) {
+			const center = canvas.getCenter();
+			if (isElement) {
+				this.handler.workarea.set({
+					scaleX: 1,
+					scaleY: 1,
+				});
+				this.handler.zoomHandler.zoomToPoint(new fabric.Point(center.left, center.top), scaleX);
+			} else {
+				this.handler.workarea.set({
+					width: workareaWidth,
+					height: workareaHeight,
+				});
+				scaleX = canvas.getWidth() / workareaWidth;
+				scaleY = canvas.getHeight() / workareaHeight;
+				if (workareaHeight >= workareaWidth) {
+					scaleX = scaleY;
+				} else {
+					scaleY = scaleX;
+				}
+				this.handler.zoomHandler.zoomToPoint(new fabric.Point(center.left, center.top), scaleX);
+			}
+			canvas.centerObject(this.handler.workarea);
+			canvas.renderAll();
+			return;
+		}
+		if (isElement) {
+			this.handler.workarea.set({
+				width: _element.width,
+				height: _element.height,
+				scaleX,
+				scaleY,
+			});
+		} else {
+			const width = isFixed ? workareaWidth : this.handler.canvas.getWidth();
+			const height = isFixed ? workareaHeight : this.handler.canvas.getHeight();
+			this.handler.workarea.set({
+				width,
+				height,
+				backgroundColor: 'rgba(255, 255, 255, 1)',
+			});
+			this.handler.canvas.renderAll();
+			if (isFixed) {
+				canvas.centerObject(this.handler.workarea);
+			} else {
+				this.handler.workarea.set({
+					left: 0,
+					top: 0,
+				});
+			}
+		}
+		canvas.centerObject(this.handler.workarea);
+		const center = canvas.getCenter();
+		canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);
+		this.handler.zoomHandler.zoomToPoint(new fabric.Point(center.left, center.top), 1);
+		canvas.renderAll();
+	};
+
+	/**
+	 * Set the responsive image on Workarea
+	 * @param {string | File} [source]
+	 * @param {boolean} [loaded]
+	 * @returns
+	 */
+	public setResponsiveImage = async (source: string | File, loaded?: boolean) => {
+		const imageFromUrl = async (src: string = '') => {
+			return new Promise<WorkareaObject>(resolve => {
+				fabric.Image.fromURL(src, (img: any) => {
+					const { canvas, workarea, editable } = this.handler;
+					const { workareaWidth, workareaHeight } = workarea;
+					const { scaleX, scaleY } = this.calculateScale(img);
+					if (img._element) {
+						workarea.set({
+							...img,
+							isElement: true,
+							selectable: false,
+						});
+					} else {
+						const image = new Image(workareaWidth, workareaHeight);
+						workarea.setElement(image);
+						workarea.set({
+							isElement: false,
+							selectable: false,
+							width: workareaWidth,
+							height: workareaHeight,
+						});
+					}
+					if (editable && !loaded) {
+						canvas.getObjects().forEach(obj => {
+							const { id, player } = obj as VideoObject;
+							if (id !== 'workarea') {
+								const objWidth = obj.width * scaleX;
+								const objHeight = obj.height * scaleY;
+								const el = this.handler.elementHandler.findById(id);
+								this.handler.elementHandler.setScaleOrAngle(el, obj);
+								this.handler.elementHandler.setSize(el, obj);
+								if (player) {
+									player.setPlayerSize(objWidth, objHeight);
+								}
+								obj.set({
+									scaleX: 1,
+									scaleY: 1,
+								});
+								obj.setCoords();
+							}
+						});
+					}
+					// 파일이 없을 경우 Canvas의 nextWidth, nextHeight 값이 변경되기 전 상태에서 zoomToFit이 동작함
+					// 정상 동작 resize event logic => zoomToFit
+					// 현재 동작 zoomToFit -> resize event logic
+					this.handler.zoomHandler.zoomToFit();
+					canvas.centerObject(workarea);
+					resolve(workarea);
+				});
+			});
+		};
+		const { workarea } = this.handler;
+		if (!source) {
+			workarea.set({
+				src: null,
+				file: null,
+			});
+			return imageFromUrl(source as string);
+		}
+		if (source instanceof File) {
+			return new Promise<WorkareaObject>(resolve => {
+				const reader = new FileReader();
+				reader.onload = () => {
+					workarea.set({
+						file: source,
+					});
+					imageFromUrl(reader.result as string).then(resolve);
+				};
+				reader.readAsDataURL(source);
+			});
+		} else {
+			workarea.set({
+				src: source,
+			});
+			return imageFromUrl(source);
+		}
+	};
+
+	/**
+	 * Set the image on Workarea
+	 * @param {string | File} source
+	 * @param {boolean} [loaded=false]
+	 * @returns
+	 */
+	setImage = async (source: string | File, loaded = false) => {
+		const { canvas, workarea, editable } = this.handler;
+		if (workarea.layout === 'responsive') {
+			return this.setResponsiveImage(source, loaded);
+		}
+		const imageFromUrl = async (src: string) => {
+			return new Promise<WorkareaObject>(resolve => {
+				fabric.Image.fromURL(src, (img: any) => {
+					let width = canvas.getWidth();
+					let height = canvas.getHeight();
+					if (workarea.layout === 'fixed') {
+						width = workarea.width * workarea.scaleX;
+						height = workarea.height * workarea.scaleY;
+					}
+					let scaleX = 1;
+					let scaleY = 1;
+					if (img._element) {
+						scaleX = width / img.width;
+						scaleY = height / img.height;
+						img.set({
+							originX: 'left',
+							originY: 'top',
+							scaleX,
+							scaleY,
+						});
+						workarea.set({
+							...img,
+							isElement: true,
+							selectable: false,
+						});
+					} else {
+						workarea.setElement(new Image());
+						workarea.set({
+							width,
+							height,
+							scaleX,
+							scaleY,
+							isElement: false,
+							selectable: false,
+						});
+					}
+					canvas.centerObject(workarea);
+					if (editable && !loaded) {
+						const { layout } = workarea;
+						canvas.getObjects().forEach(obj => {
+							const { id, player } = obj as VideoObject;
+							if (id !== 'workarea') {
+								scaleX = layout === 'fullscreen' ? scaleX : obj.scaleX;
+								scaleY = layout === 'fullscreen' ? scaleY : obj.scaleY;
+								const el = this.handler.elementHandler.findById(id);
+								this.handler.elementHandler.setSize(el, obj);
+								if (player) {
+									const objWidth = obj.width * scaleX;
+									const objHeight = obj.height * scaleY;
+									player.setPlayerSize(objWidth, objHeight);
+								}
+								obj.set({
+									scaleX,
+									scaleY,
+								});
+								obj.setCoords();
+							}
+						});
+					}
+					const center = canvas.getCenter();
+					const zoom = loaded || workarea.layout === 'fullscreen' ? 1 : this.handler.canvas.getZoom();
+					canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);
+					this.handler.zoomHandler.zoomToPoint(new fabric.Point(center.left, center.top), zoom);
+					canvas.renderAll();
+					resolve(workarea);
+				});
+			});
+		};
+		if (!source) {
+			workarea.set({
+				src: null,
+				file: null,
+			});
+			return imageFromUrl(source as string);
+		}
+		if (source instanceof File) {
+			return new Promise<WorkareaObject>(resolve => {
+				const reader = new FileReader();
+				reader.onload = () => {
+					workarea.set({
+						file: source,
+					});
+					imageFromUrl(reader.result as string).then(resolve);
+				};
+				reader.readAsDataURL(source);
+			});
+		} else {
+			workarea.set({
+				src: source,
+			});
+			return imageFromUrl(source);
+		}
+	};
+
+	/**
+	 * Calculate scale to the image
+	 *
+	 * @param {FabricImage} [image]
+	 * @returns
+	 */
+	public calculateScale = (image?: FabricImage) => {
+		const { canvas, workarea } = this.handler;
+		const { workareaWidth, workareaHeight } = workarea;
+		const { _element } = image || workarea;
+		const width = _element?.width || workareaWidth;
+		const height = _element?.height || workareaHeight;
+		let scaleX = canvas.getWidth() / width;
+		let scaleY = canvas.getHeight() / height;
+		if (height >= width) {
+			scaleX = scaleY;
+			if (canvas.getWidth() < width * scaleX) {
+				scaleX = scaleX * (canvas.getWidth() / (width * scaleX));
+			}
+		} else {
+			scaleY = scaleX;
+			if (canvas.getHeight() < height * scaleX) {
+				scaleX = scaleX * (canvas.getHeight() / (height * scaleX));
+			}
+		}
+		return { scaleX, scaleY };
+	};
+}
+
+export default WorkareaHandler;
diff --git a/src/pages/Fabric/canvas/handlers/ZoomHandler.ts b/src/pages/Fabric/canvas/handlers/ZoomHandler.ts
new file mode 100644
index 0000000..a6dfe71
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/ZoomHandler.ts
@@ -0,0 +1,154 @@
+import { fabric } from 'fabric';
+
+import { VideoObject } from '../objects/Video';
+import { FabricObject } from '../utils';
+import Handler from './Handler';
+
+class ZoomHandler {
+	handler?: Handler;
+	private _zoomStep?: number;
+
+	constructor(handler: Handler, zoomStep: number = 0.05) {
+		this.handler = handler;
+		this._zoomStep = zoomStep;
+	}
+
+	/**
+	 * Zoom to point
+	 *
+	 * @param {fabric.Point} point
+	 * @param {number} zoom ex) 0 ~ 1. Not percentage value.
+	 */
+	public zoomToPoint = (point: fabric.Point, zoom: number) => {
+		const { minZoom, maxZoom } = this.handler;
+		let zoomRatio = zoom;
+		if (zoom <= minZoom / 100) {
+			zoomRatio = minZoom / 100;
+		} else if (zoom >= maxZoom / 100) {
+			zoomRatio = maxZoom / 100;
+		}
+		this.handler.canvas.zoomToPoint(point, zoomRatio);
+		this.handler.getObjects().forEach(obj => {
+			if (obj.superType === 'element') {
+				const { id, width, height, player } = obj as VideoObject;
+				const el = this.handler.elementHandler.findById(id);
+				// update the element
+				this.handler.elementHandler.setScaleOrAngle(el, obj);
+				this.handler.elementHandler.setSize(el, obj);
+				this.handler.elementHandler.setPosition(el, obj);
+				if (player) {
+					player.setPlayerSize(width, height);
+				}
+			}
+		});
+		if (this.handler.onZoom) {
+			this.handler.onZoom(zoomRatio);
+		}
+		this.handler.canvas.requestRenderAll();
+	};
+
+	/**
+	 * Zoom one to one
+	 *
+	 */
+	public zoomOneToOne = () => {
+		const center = this.handler.canvas.getCenter();
+		this.handler.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);
+		this.zoomToPoint(new fabric.Point(center.left, center.top), 1);
+	};
+
+	/**
+	 * Zoom to fit
+	 *
+	 */
+	public zoomToFit = () => {
+		let scaleX = this.handler.canvas.getWidth() / this.handler.workarea.width;
+		const scaleY = this.handler.canvas.getHeight() / this.handler.workarea.height;
+		if (this.handler.workarea.height >= this.handler.workarea.width) {
+			scaleX = scaleY;
+			if (this.handler.canvas.getWidth() < this.handler.workarea.width * scaleX) {
+				scaleX = scaleX * (this.handler.canvas.getWidth() / (this.handler.workarea.width * scaleX));
+			}
+		} else {
+			if (this.handler.canvas.getHeight() < this.handler.workarea.height * scaleX) {
+				scaleX = scaleX * (this.handler.canvas.getHeight() / (this.handler.workarea.height * scaleX));
+			}
+		}
+		const center = this.handler.canvas.getCenter();
+		this.handler.canvas.setViewportTransform([1, 0, 0, 1, 0, 0]);
+		this.zoomToPoint(new fabric.Point(center.left, center.top), scaleX);
+	};
+
+	/**
+	 * Zoom in
+	 *
+	 */
+	public zoomIn = () => {
+		let zoomRatio = this.handler.canvas.getZoom();
+		zoomRatio += this._zoomStep;
+		const center = this.handler.canvas.getCenter();
+		this.zoomToPoint(new fabric.Point(center.left, center.top), zoomRatio);
+	};
+
+	/**
+	 * Zoom out
+	 *
+	 */
+	public zoomOut = () => {
+		let zoomRatio = this.handler.canvas.getZoom();
+		zoomRatio -= this._zoomStep;
+		const center = this.handler.canvas.getCenter();
+		this.zoomToPoint(new fabric.Point(center.left, center.top), zoomRatio);
+	};
+
+	/**
+	 * Zoom to center with object
+	 *
+	 * @param {FabricObject} target If zoomFit true, rescaled canvas zoom.
+	 */
+	public zoomToCenterWithObject = (target: FabricObject, zoomFit?: boolean) => {
+		const { left: canvasLeft, top: canvasTop } = this.handler.canvas.getCenter();
+		const { left, top, width, height } = target;
+		const diffTop = canvasTop - (top + height / 2);
+		const diffLeft = canvasLeft - (left + width / 2);
+		if (zoomFit) {
+			let scaleX;
+			let scaleY;
+			scaleX = this.handler.canvas.getWidth() / width;
+			scaleY = this.handler.canvas.getHeight() / height;
+			if (height > width) {
+				scaleX = scaleY;
+				if (this.handler.canvas.getWidth() < width * scaleX) {
+					scaleX = scaleX * (this.handler.canvas.getWidth() / (width * scaleX));
+				}
+			} else {
+				scaleY = scaleX;
+				if (this.handler.canvas.getHeight() < height * scaleX) {
+					scaleX = scaleX * (this.handler.canvas.getHeight() / (height * scaleX));
+				}
+			}
+			this.handler.canvas.setViewportTransform([1, 0, 0, 1, diffLeft, diffTop]);
+			this.zoomToPoint(new fabric.Point(canvasLeft, canvasTop), scaleX);
+		} else {
+			const zoom = this.handler.canvas.getZoom();
+			this.handler.canvas.setViewportTransform([1, 0, 0, 1, diffLeft, diffTop]);
+			this.zoomToPoint(new fabric.Point(canvasLeft, canvasTop), zoom);
+		}
+	};
+
+	/**
+	 * Zoom to center with objects
+	 *
+	 * @param {boolean} [zoomFit] If zoomFit true, rescaled canvas zoom.
+	 * @returns
+	 */
+	public zoomToCenter = (zoomFit?: boolean) => {
+		const activeObject = this.handler.canvas.getActiveObject();
+		if (!activeObject) {
+			return;
+		}
+		this.zoomToCenterWithObject(activeObject, zoomFit);
+	};
+}
+
+export default ZoomHandler;
diff --git a/src/pages/Fabric/canvas/handlers/index.ts b/src/pages/Fabric/canvas/handlers/index.ts
new file mode 100644
index 0000000..4bd7ded
--- /dev/null
+++ b/src/pages/Fabric/canvas/handlers/index.ts
@@ -0,0 +1,45 @@
+export { default as Handler } from './Handler';
+
+export { default as ImageHandler } from './ImageHandler';
+
+export { default as ChartHandler } from './ChartHandler';
+
+export { default as ElementHandler } from './ElementHandler';
+
+export { default as CropHandler } from './CropHandler';
+
+export { default as AnimationHandler } from './AnimationHandler';
+
+export { default as ContextmenuHandler } from './ContextmenuHandler';
+
+export { default as TooltipHandler } from './TooltipHandler';
+
+export { default as TransactionHandler } from './TransactionHandler';
+
+export { default as ZoomHandler } from './ZoomHandler';
+
+export { default as WorkareaHandler } from './WorkareaHandler';
+
+export { default as InteractionHandler } from './InteractionHandler';
+
+export { default as GridHandler } from './GridHandler';
+
+export { default as PortHandler } from './PortHandler';
+
+export { default as LinkHandler } from './LinkHandler';
+
+export { default as NodeHandler } from './NodeHandler';
+
+export { default as AlignmentHandler } from './AlignmentHandler';
+
+export { default as GuidelineHandler } from './GuidelineHandler';
+
+export { default as EventHandler } from './EventHandler';
+
+export { default as DrawingHandler } from './DrawingHandler';
+
+export { default as ShortcutHandler } from './ShortcutHandler';
+
+export { default as FiberHandler } from './FiberHandler';
+
+export { default as CustomHandler } from './CustomHandler';
diff --git a/src/pages/Fabric/canvas/index.tsx b/src/pages/Fabric/canvas/index.tsx
new file mode 100644
index 0000000..92dd636
--- /dev/null
+++ b/src/pages/Fabric/canvas/index.tsx
@@ -0,0 +1,6 @@
+export * from './Canvas';
+export { default as Canvas } from './Canvas';
+export { default as CanvasObject } from './CanvasObject';
+export * from './handlers';
+export * from './objects';
+export * from './utils';
diff --git a/src/pages/Fabric/canvas/objects/Arrow.ts b/src/pages/Fabric/canvas/objects/Arrow.ts
new file mode 100644
index 0000000..1a5fcc0
--- /dev/null
+++ b/src/pages/Fabric/canvas/objects/Arrow.ts
@@ -0,0 +1,42 @@
+import { fabric } from 'fabric';
+
+const Arrow = fabric.util.createClass(fabric.Line, {
+	type: 'arrow',
+	superType: 'drawing',
+	initialize(points: any, options: any) {
+		if (!points) {
+			const { x1, x2, y1, y2 } = options;
+			points = [x1, y1, x2, y2];
+		}
+		options = options || {};
+		this.callSuper('initialize', points, options);
+	},
+	_render(ctx: CanvasRenderingContext2D) {
+		this.callSuper('_render', ctx);
+		ctx.save();
+		const xDiff = this.x2 - this.x1;
+		const yDiff = this.y2 - this.y1;
+		const angle = Math.atan2(yDiff, xDiff);
+		ctx.translate((this.x2 - this.x1) / 2, (this.y2 - this.y1) / 2);
+		ctx.rotate(angle);
+		ctx.beginPath();
+		// Move 5px in front of line to start the arrow so it does not have the square line end showing in front (0,0)
+		ctx.moveTo(5, 0);
+		ctx.lineTo(-5, 5);
+		ctx.lineTo(-5, -5);
+		ctx.closePath();
+		ctx.fillStyle = this.stroke;
+		ctx.fill();
+		ctx.restore();
+	},
+});
+
+Arrow.fromObject = (options: any, callback: any) => {
+	const { x1, x2, y1, y2 } = options;
+	return callback(new Arrow([x1, y1, x2, y2], options));
+};
+
+// @ts-ignore
+window.fabric.Arrow = Arrow;
+
+export default Arrow;
diff --git a/src/pages/Fabric/canvas/objects/Chart.ts b/src/pages/Fabric/canvas/objects/Chart.ts
new file mode 100644
index 0000000..50dbb05
--- /dev/null
+++ b/src/pages/Fabric/canvas/objects/Chart.ts
@@ -0,0 +1,112 @@
+import * as echarts from 'echarts';
+import { fabric } from 'fabric';
+import { FabricElement, toObject } from '../utils';
+
+export interface ChartObject extends FabricElement {
+	setSource: (source: echarts.EChartOption) => void;
+	setChartOption: (chartOption: echarts.EChartOption) => void;
+	chartOption: echarts.EChartOption;
+	instance: echarts.ECharts;
+}
+
+const Chart = fabric.util.createClass(fabric.Rect, {
+	type: 'chart',
+	superType: 'element',
+	hasRotatingPoint: false,
+	initialize(chartOption: echarts.EChartOption, options: any) {
+		options = options || {};
+		this.callSuper('initialize', options);
+		this.set({
+			chartOption,
+			fill: 'rgba(255, 255, 255, 0)',
+			stroke: 'rgba(255, 255, 255, 0)',
+		});
+	},
+	setSource(source: echarts.EChartOption | string) {
+		if (typeof source === 'string') {
+			this.setChartOptionStr(source);
+		} else {
+			this.setChartOption(source);
+		}
+	},
+	setChartOptionStr(chartOptionStr: string) {
+		this.set({
+			chartOptionStr,
+		});
+	},
+	setChartOption(chartOption: echarts.EChartOption) {
+		this.set({
+			chartOption,
+		});
+		this.distroyChart();
+		this.createChart(chartOption);
+	},
+	createChart(chartOption: echarts.EChartOption) {
+		this.instance = echarts.init(this.element);
+		if (!chartOption) {
+			this.instance.setOption({
+				xAxis: {},
+				yAxis: {},
+				series: [
+					{
+						type: 'line',
+						data: [
+							[0, 1],
+							[1, 2],
+							[2, 3],
+							[3, 4],
+						],
+					},
+				],
+			});
+		} else {
+			this.instance.setOption(chartOption);
+		}
+	},
+	distroyChart() {
+		if (this.instance) {
+			this.instance.dispose();
+		}
+	},
+	toObject(propertiesToInclude: string[]) {
+		return toObject(this, propertiesToInclude, {
+			chartOption: this.get('chartOption'),
+			container: this.get('container'),
+			editable: this.get('editable'),
+		});
+	},
+	_render(ctx: CanvasRenderingContext2D) {
+		this.callSuper('_render', ctx);
+		if (!this.instance) {
+			const { id, scaleX, scaleY, width, height, angle, editable, chartOption } = this;
+			const zoom = this.canvas.getZoom();
+			const left = this.calcCoords().tl.x;
+			const top = this.calcCoords().tl.y;
+			const padLeft = (width * scaleX * zoom - width) / 2;
+			const padTop = (height * scaleY * zoom - height) / 2;
+			this.element = fabric.util.makeElement('div', {
+				id: `${id}_container`,
+				style: `transform: rotate(${angle}deg) scale(${scaleX * zoom}, ${scaleY * zoom});
+                        width: ${width}px;
+                        height: ${height}px;
+                        left: ${left + padLeft}px;
+                        top: ${top + padTop}px;
+                        position: absolute;
+                        user-select: ${editable ? 'none' : 'auto'};
+                        pointer-events: ${editable ? 'none' : 'auto'};`,
+			}) as HTMLDivElement;
+			this.createChart(chartOption);
+			const container = document.getElementById(this.container);
+			container.appendChild(this.element);
+		}
+	},
+});
+
+Chart.fromObject = (options: ChartObject, callback: (obj: ChartObject) => any) => {
+	return callback(new Chart(options.chartOption, options));
+};
+
+// @ts-ignore
+window.fabric.Chart = Chart;
+
+export default Chart;
diff --git a/src/pages/Fabric/canvas/objects/CirclePort.ts b/src/pages/Fabric/canvas/objects/CirclePort.ts
new file mode 100644
index 0000000..8e46cb5
--- /dev/null
+++ b/src/pages/Fabric/canvas/objects/CirclePort.ts
@@ -0,0 +1,32 @@
+import { fabric } from 'fabric';
+
+import { PortObject } from './Port';
+
+const CirclePort = fabric.util.createClass(fabric.Circle, {
+	type: 'port',
+	superType: 'port',
+	initialize(options: any) {
+		options = options || {};
+		this.callSuper('initialize', options);
+	},
+	toObject() {
+		return fabric.util.object.extend(this.callSuper('toObject'), {
+			id: this.get('id'),
+			superType: this.get('superType'),
+			enabled: this.get('enabled'),
+			nodeId: this.get('nodeId'),
+		});
+	},
+	_render(ctx: CanvasRenderingContext2D) {
+		this.callSuper('_render', ctx);
+	},
+});
+
+CirclePort.fromObject = (options: PortObject, callback: (obj: PortObject) => any) => {
+	return callback(new CirclePort(options));
+};
+
+// @ts-ignore
+window.fabric.CirclePort = CirclePort;
+
+export default CirclePort;
diff --git a/src/pages/Fabric/canvas/objects/Cube.ts b/src/pages/Fabric/canvas/objects/Cube.ts
new file mode 100644
index 0000000..9b981cb
--- /dev/null
+++ b/src/pages/Fabric/canvas/objects/Cube.ts
@@ -0,0 +1,83 @@
+import { fabric } from 'fabric';
+import { FabricObject } from '../utils';
+
+export interface CubeObject extends FabricObject {}
+
+const Cube = fabric.util.createClass(fabric.Object, {
+	type: 'cube',
+	superType: 'shape',
+	initialize(options: any) {
+		options = options || {};
+		this.callSuper('initialize', options);
+	},
+	shadeColor(color: any, percent: number) {
+		color = color.substr(1);
+		const num = parseInt(color, 16);
+		const amt = Math.round(2.55 * percent);
+		const R = (num >> 16) + amt;
+		const G = ((num >> 8) & 0x00ff) + amt;
+		const B = (num & 0x0000ff) + amt;
+		return (
+			'#' +
+			(
+				0x1000000 +
+				(R < 255 ? (R < 1 ? 0 : R) : 255) * 0x10000 +
+				(G < 255 ? (G < 1 ? 0 : G) : 255) * 0x100 +
+				(B < 255 ? (B < 1 ? 0 : B) : 255)
+			)
+				.toString(16)
+				.slice(1)
+		);
+	},
+	_render(ctx: CanvasRenderingContext2D) {
+		const { width, height, fill } = this;
+		const wx = width / 2;
+		const wy = width / 2;
+		const h = height / 2;
+		const x = 0;
+		const y = wy;
+		ctx.beginPath();
+		ctx.moveTo(x, y);
+		ctx.lineTo(x - wx, y - wx * 0.5);
+		ctx.lineTo(x - wx, y - h - wx * 0.5);
+		ctx.lineTo(x, y - h * 1);
+		ctx.closePath();
+		ctx.fillStyle = this.shadeColor(fill, -10);
+		ctx.strokeStyle = fill;
+		ctx.stroke();
+		ctx.fill();
+
+		ctx.beginPath();
+		ctx.moveTo(x, y);
+		ctx.lineTo(x + wy, y - wy * 0.5);
+		ctx.lineTo(x + wy, y - h - wy * 0.5);
+		ctx.lineTo(x, y - h * 1);
+		ctx.closePath();
+		ctx.fillStyle = this.shadeColor(fill, 10);
+		ctx.strokeStyle = this.shadeColor(fill, 50);
+		ctx.stroke();
+		ctx.fill();
+
+		ctx.beginPath();
+		ctx.moveTo(x, y - h);
+		ctx.lineTo(x - wx, y - h - wx * 0.5);
+		ctx.lineTo(x - wx + wy, y - h - (wx * 0.5 + wy * 0.5));
+		ctx.lineTo(x + wy, y - h - wy * 0.5);
+		ctx.closePath();
+		ctx.fillStyle = this.shadeColor(fill, 20);
+		ctx.strokeStyle = this.shadeColor(fill, 60);
+		ctx.stroke();
+		ctx.fill();
+
+		ctx.restore();
+	},
+});
+
+Cube.fromObject = (options: CubeObject, callback: (obj: CubeObject) => any) => {
+	return callback(new Cube(options));
+};
+
+// @ts-ignore
+window.fabric.Cube = Cube;
+
+export default Cube;
diff --git a/src/pages/Fabric/canvas/objects/CurvedLink.ts b/src/pages/Fabric/canvas/objects/CurvedLink.ts
new file mode 100644
index 0000000..7be54d5
--- /dev/null
+++ b/src/pages/Fabric/canvas/objects/CurvedLink.ts
@@ -0,0 +1,58 @@
+import { fabric } from 'fabric';
+import Link, { LinkObject } from './Link';
+import { NodeObject } from './Node';
+import { PortObject } from './Port';
+
+const CurvedLink = fabric.util.createClass(Link, {
+	type: 'curvedLink',
+	superType: 'link',
+	initialize(
+		fromNode: Partial<NodeObject>,
+		fromPort: Partial<PortObject>,
+		toNode: Partial<NodeObject>,
+		toPort: Partial<PortObject>,
+		options: Partial<LinkObject>,
+	) {
+		options = options || {};
+		this.callSuper('initialize', fromNode, fromPort, toNode, toPort, options);
+	},
+	_render(ctx: CanvasRenderingContext2D) {
+		// Drawing curved link
+		const { x1, y1, x2, y2 } = this;
+		ctx.lineWidth = this.strokeWidth;
+		ctx.strokeStyle = this.stroke;
+		const fp = { x: (x1 - x2) / 2, y: (y1 - y2) / 2 };
+		const sp = { x: (x2 - x1) / 2, y: (y2 - y1) / 2 };
+		ctx.beginPath();
+		ctx.moveTo(fp.x, fp.y);
+		ctx.bezierCurveTo(fp.x, sp.y, sp.x, fp.y, sp.x, sp.y);
+		ctx.stroke();
+		ctx.save();
+		const xDiff = x2 - x1;
+		const yDiff = y2 - y1;
+		const angle = Math.atan2(yDiff, xDiff);
+		ctx.translate((x2 - x1) / 2, (y2 - y1) / 2);
+		ctx.rotate(angle >= 0 ? 1.57 : -1.57);
+		ctx.beginPath();
+		if (this.arrow) {
+			// Move 5px in front of line to start the arrow so it does not have the square line end showing in front (0,0)
+			ctx.moveTo(5, 0);
+			ctx.lineTo(-5, 5);
+			ctx.lineTo(-5, -5);
+		}
+		ctx.closePath();
+		ctx.fillStyle = this.stroke;
+		ctx.fill();
+		ctx.restore();
+	},
+});
+
+CurvedLink.fromObject = (options: LinkObject, callback: (obj: LinkObject) => any) => {
+	const { fromNode, fromPort, toNode, toPort } = options;
+	return callback(new CurvedLink(fromNode, fromPort, toNode, toPort, options));
+};
+
+// @ts-ignore
+window.fabric.CurvedLink = CurvedLink;
+
+export default CurvedLink;
diff --git a/src/pages/Fabric/canvas/objects/Element.ts b/src/pages/Fabric/canvas/objects/Element.ts
new file mode 100644
index 0000000..ad73997
--- /dev/null
+++ b/src/pages/Fabric/canvas/objects/Element.ts
@@ -0,0 +1,101 @@
+import { fabric } from 'fabric';
+import { FabricElement, toObject } from '../utils';
+
+export interface Code {
+	html: string;
+	css: string;
+	js: string;
+}
+
+export interface ElementObject extends FabricElement {
+	setSource: (source: Code) => void;
+	setCode: (code: Code) => void;
+	code: Code;
+}
+
+const initialCode: Code = {
+	html: '',
+	css: '',
+	js: '',
+};
+
+const Element = fabric.util.createClass(fabric.Rect, {
+	type: 'element',
+	superType: 'element',
+	hasRotatingPoint: false,
+	initialize(code = initialCode, options: any) {
+		options = options || {};
+		this.callSuper('initialize', options);
+		this.set({
+			code,
+			fill: 'rgba(255, 255, 255, 0)',
+			stroke: 'rgba(255, 255, 255, 0)',
+		});
+	},
+	setSource(source: any) {
+		this.setCode(source);
+	},
+	setCode(code = initialCode) {
+		this.set({
+			code,
+		});
+		const { css, js, html } = code;
+		this.styleEl.innerHTML = css;
+		this.scriptEl.innerHTML = js;
+		this.element.innerHTML = html;
+	},
+	toObject(propertiesToInclude: string[]) {
+		return toObject(this, propertiesToInclude, {
+			code: this.get('code'),
+			container: this.get('container'),
+			editable: this.get('editable'),
+		});
+	},
+	_render(ctx: CanvasRenderingContext2D) {
+		this.callSuper('_render', ctx);
+		if (!this.element) {
+			const { id, scaleX, scaleY, width, height, angle, editable, code } = this;
+			const zoom = this.canvas.getZoom();
+			const left = this.calcCoords().tl.x;
+			const top = this.calcCoords().tl.y;
+			const padLeft = (width * scaleX * zoom - width) / 2;
+			const padTop = (height * scaleY * zoom - height) / 2;
+			this.element = fabric.util.makeElement('div', {
+				id: `${id}_container`,
+				style: `transform: rotate(${angle}deg) scale(${scaleX * zoom}, ${scaleY * zoom});
+                        width: ${width}px;
+                        height: ${height}px;
+                        left: ${left + padLeft}px;
+                        top: ${top + padTop}px;
+                        position: absolute;
+                        user-select: ${editable ? 'none' : 'auto'};
+                        pointer-events: ${editable ? 'none' : 'auto'};`,
+			}) as HTMLDivElement;
+			const { html, css, js } = code;
+			this.styleEl = document.createElement('style');
+			this.styleEl.id = `${id}_style`;
+			this.styleEl.type = 'text/css';
+			this.styleEl.innerHTML = css;
+			document.head.appendChild(this.styleEl);
+
+			this.scriptEl = document.createElement('script');
+			this.scriptEl.id = `${id}_script`;
+			this.scriptEl.type = 'text/javascript';
+			this.scriptEl.innerHTML = js;
+			document.head.appendChild(this.scriptEl);
+
+			const container = document.getElementById(this.container);
+			container.appendChild(this.element);
+			this.element.innerHTML = html;
+		}
+	},
+});
+
+Element.fromObject = (options: ElementObject, callback: (obj: ElementObject) => any) => {
+	return callback(new Element(options.code, options));
+};
+
+// @ts-ignore
+window.fabric.Element = Element;
+
+export default Element;
diff --git a/src/pages/Fabric/canvas/objects/Gif.ts b/src/pages/Fabric/canvas/objects/Gif.ts
new file mode 100644
index 0000000..6d8fe5a
--- /dev/null
+++ b/src/pages/Fabric/canvas/objects/Gif.ts
@@ -0,0 +1,51 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-12-05 13:55:45
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-12-05 15:55:58
+ * @FilePath: \react-adpro-fabric\src\pages\Fabric\canvas\objects\Gif.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+import { fabric } from 'fabric';
+// import 'gifler';
+
+const Gif = fabric.util.createClass(fabric.Object, {
+	type: 'gif',
+	superType: 'image',
+	gifCanvas: null,
+	isStarted: false,
+	initialize(options: any) {
+		options = options || {};
+		this.callSuper('initialize', options);
+		this.gifCanvas = document.createElement('canvas');
+	},
+	drawFrame(ctx: CanvasRenderingContext2D, frame: any) {
+		// update canvas size
+		this.gifCanvas.width = frame.width;
+		this.gifCanvas.height = frame.height;
+		// update canvas that we are using for fabric.js
+		ctx.drawImage(frame.buffer, -frame.width / 2, -frame.height / 2, frame.width, frame.height);
+	},
+	_render(ctx: CanvasRenderingContext2D) {
+		this.callSuper('_render', ctx);
+		if (!this.isStarted) {
+			this.isStarted = true;
+			window
+				// @ts-ignore
+				.gifler('./images/sample/earth.gif')
+				.frames(this.gifCanvas, (_c: CanvasRenderingContext2D, frame: any) => {
+					this.isStarted = true;
+					this.drawFrame(ctx, frame);
+				});
+		}
+	},
+});
+
+Gif.fromObject = (options: any, callback: (obj: any) => any) => {
+	return callback(new Gif(options));
+};
+
+// @ts-ignore
+window.fabric.Gif = Gif;
+
+export default Gif;
diff --git a/src/pages/Fabric/canvas/objects/Iframe.ts b/src/pages/Fabric/canvas/objects/Iframe.ts
new file mode 100644
index 0000000..44eb6ed
--- /dev/null
+++ b/src/pages/Fabric/canvas/objects/Iframe.ts
@@ -0,0 +1,79 @@
+import { fabric } from 'fabric';
+import { FabricElement, toObject } from '../utils';
+
+export interface IframeObject extends FabricElement {
+	setSource: (source: string) => void;
+	setSrc: (src: string) => void;
+	src: string;
+	iframeElement: HTMLIFrameElement;
+}
+
+const Iframe = fabric.util.createClass(fabric.Rect, {
+	type: 'iframe',
+	superType: 'element',
+	hasRotatingPoint: false,
+	initialize(src: string = '', options: any) {
+		options = options || {};
+		this.callSuper('initialize', options);
+		this.set({
+			src,
+			fill: 'rgba(255, 255, 255, 0)',
+			stroke: 'rgba(255, 255, 255, 0)',
+		});
+	},
+	setSource(source: any) {
+		this.setSrc(source);
+	},
+	setSrc(src: string) {
+		this.set({
+			src,
+		});
+		this.iframeElement.src = src;
+	},
+	toObject(propertiesToInclude: string[]) {
+		return toObject(this, propertiesToInclude, {
+			src: this.get('src'),
+			container: this.get('container'),
+			editable: this.get('editable'),
+		});
+	},
+	_render(ctx: CanvasRenderingContext2D) {
+		this.callSuper('_render', ctx);
+		if (!this.element) {
+			const { id, scaleX, scaleY, width, height, angle, editable, src } = this;
+			const zoom = this.canvas.getZoom();
+			const left = this.calcCoords().tl.x;
+			const top = this.calcCoords().tl.y;
+			const padLeft = (width * scaleX * zoom - width) / 2;
+			const padTop = (height * scaleY * zoom - height) / 2;
+			this.iframeElement = fabric.util.makeElement('iframe', {
+				id,
+				src,
+				width: '100%',
+				height: '100%',
+			});
+			this.element = fabric.util.wrapElement(this.iframeElement, 'div', {
+				id: `${id}_container`,
+				style: `transform: rotate(${angle}deg) scale(${scaleX * zoom}, ${scaleY * zoom});
+                        width: ${width}px;
+                        height: ${height}px;
+                        left: ${left + padLeft}px;
+                        top: ${top + padTop}px;
+                        position: absolute;
+                        user-select: ${editable ? 'none' : 'auto'};
+                        pointer-events: ${editable ? 'none' : 'auto'};`,
+			}) as HTMLDivElement;
+			const container = document.getElementById(this.container);
+			container.appendChild(this.element);
+		}
+	},
+});
+
+Iframe.fromObject = (options: IframeObject, callback: (obj: IframeObject) => any) => {
+	return callback(new Iframe(options.src, options));
+};
+
+// @ts-ignore
+window.fabric.Iframe = Iframe;
+
+export default Iframe;
diff --git a/src/pages/Fabric/canvas/objects/Line.ts b/src/pages/Fabric/canvas/objects/Line.ts
new file mode 100644
index 0000000..6a0b263
--- /dev/null
+++ b/src/pages/Fabric/canvas/objects/Line.ts
@@ -0,0 +1,26 @@
+import { fabric } from 'fabric';
+
+const Line = fabric.util.createClass(fabric.Line, {
+	type: 'line',
+	superType: 'drawing',
+	initialize(points: any, options: any) {
+		if (!points) {
+			const { x1, x2, y1, y2 } = options;
+			points = [x1, y1, x2, y2];
+		}
+		options = options || {};
+		this.callSuper('initialize', points, options);
+	},
+	_render(ctx: CanvasRenderingContext2D) {
+		this.callSuper('_render', ctx);
+	},
+});
+
+Line.fromObject = (options: any, callback: any) => {
+	const { x1, x2, y1, y2 } = options;
+	return callback(new Line([x1, y1, x2, y2], options));
+};
+
+window.fabric.Line = Line;
+
+export default Line;
diff --git a/src/pages/Fabric/canvas/objects/Link.ts b/src/pages/Fabric/canvas/objects/Link.ts
new file mode 100644
index 0000000..7c85672
--- /dev/null
+++ b/src/pages/Fabric/canvas/objects/Link.ts
@@ -0,0 +1,130 @@
+import { fabric } from 'fabric';
+import { useUuid } from '@/hooks/useUuid';
+import { FabricObject } from '../utils';
+import { NodeObject, OUT_PORT_TYPE } from './Node';
+import { PortObject } from './Port';
+
+
+// eslint-disable-next-line react-hooks/rules-of-hooks
+const { fetchUuid } = useUuid();
+
+export interface LinkObject extends FabricObject<fabric.Line> {
+	fromNode?: NodeObject;
+	toNode?: NodeObject;
+	fromPort?: PortObject;
+	toPort?: PortObject;
+	fromPortIndex?: number;
+	setPort?: (fromNode: NodeObject, fromPort: PortObject, toNode: NodeObject, toPort: PortObject) => void;
+	setPortEnabled?: (node: NodeObject, port: PortObject, enabled: boolean) => void;
+}
+
+const Link = fabric.util.createClass(fabric.Line, {
+	type: 'link',
+	superType: 'link',
+	initialize(
+		fromNode: Partial<NodeObject>,
+		fromPort: Partial<PortObject>,
+		toNode: Partial<NodeObject>,
+		toPort: Partial<PortObject>,
+		options: Partial<LinkObject>,
+	) {
+		options = options || {};
+		const coords = [fromPort.left, fromPort.top, toPort.left, toPort.top];
+		Object.assign(options, {
+			strokeWidth: 4,
+			id: options.id || fetchUuid(),
+			originX: 'center',
+			originY: 'center',
+			lockScalingX: true,
+			lockScalingY: true,
+			lockRotation: true,
+			hasRotatingPoint: false,
+			hasControls: false,
+			hasBorders: false,
+			perPixelTargetFind: true,
+			lockMovementX: true,
+			lockMovementY: true,
+			selectable: false,
+			fromNode,
+			fromPort,
+			toNode,
+			toPort,
+			hoverCursor: 'pointer',
+		});
+		this.callSuper('initialize', coords, options);
+	},
+	setPort(fromNode: NodeObject, fromPort: PortObject, _toNode: NodeObject, toPort: PortObject) {
+		if (fromNode.type === 'BroadcastNode') {
+			fromPort = fromNode.fromPort[0];
+		}
+		fromPort.links.push(this);
+		toPort.links.push(this);
+		this.setPortEnabled(fromNode, fromPort, false);
+	},
+	setPortEnabled(node: NodeObject, port: PortObject, enabled: boolean) {
+		if (node.descriptor.outPortType !== OUT_PORT_TYPE.BROADCAST) {
+			port.set({
+				enabled,
+				fill: enabled ? port.originFill : port.selectFill,
+			});
+		} else {
+			if (node.toPort.id === port.id) {
+				return;
+			}
+			port.links.forEach((link, index) => {
+				link.set({
+					fromPort: port,
+					fromPortIndex: index,
+				});
+			});
+			node.set({
+				configuration: {
+					outputCount: port.links.length,
+				},
+			});
+		}
+	},
+	toObject() {
+		return fabric.util.object.extend(this.callSuper('toObject'), {
+			id: this.get('id'),
+			name: this.get('name'),
+			superType: this.get('superType'),
+			configuration: this.get('configuration'),
+			fromNode: this.get('fromNode'),
+			fromPort: this.get('fromPort'),
+			toNode: this.get('toNode'),
+			toPort: this.get('toPort'),
+		});
+	},
+	_render(ctx: CanvasRenderingContext2D) {
+		this.callSuper('_render', ctx);
+		ctx.save();
+		const xDiff = this.x2 - this.x1;
+		const yDiff = this.y2 - this.y1;
+		const angle = Math.atan2(yDiff, xDiff);
+		ctx.translate((this.x2 - this.x1) / 2, (this.y2 - this.y1) / 2);
+		ctx.rotate(angle);
+		ctx.beginPath();
+		if (this.arrow) {
+			// Move 5px in front of line to start the arrow so it does not have the square line end showing in front (0,0)
+			ctx.moveTo(5, 0);
+			ctx.lineTo(-5, 5);
+			ctx.lineTo(-5, -5);
+		}
+		ctx.closePath();
+		ctx.lineWidth = this.strokeWidth;
+		ctx.fillStyle = this.stroke;
+		ctx.fill();
+		ctx.restore();
+	},
+});
+
+Link.fromObject = (options: LinkObject, callback: (obj: LinkObject) => any) => {
+	const { fromNode, fromPort, toNode, toPort } = options;
+	return callback(new Link(fromNode, fromPort, toNode, toPort, options));
+};
+
+// @ts-ignore
+window.fabric.Link = Link;
+
+export default Link;
diff --git a/src/pages/Fabric/canvas/objects/Node.ts b/src/pages/Fabric/canvas/objects/Node.ts
new file mode 100644
index 0000000..2573a9e
--- /dev/null
+++ b/src/pages/Fabric/canvas/objects/Node.ts
@@ -0,0 +1,298 @@
+import { fabric } from 'fabric';
+import { useUuid } from '@/hooks/useUuid';
+
+import { FabricObject } from '../utils';
+import { LinkObject } from './Link';
+import Port, { PortObject } from './Port';
+
+// eslint-disable-next-line react-hooks/rules-of-hooks
+const { fetchUuid } = useUuid();
+export const NODE_COLORS = {
+	TRIGGER: {
+		fill: '#48C9B0',
+		border: '#1ABC9C',
+	},
+	LOGIC: {
+		fill: '#AF7AC5',
+		border: '#9B59B6',
+	},
+	DATA: {
+		fill: '#5DADE2',
+		border: '#3498DB',
+	},
+	ACTION: {
+		fill: '#F5B041',
+		border: 'rgb(243, 156, 18)',
+	},
+};
+
+export const OUT_PORT_TYPE = {
+	SINGLE: 'SINGLE',
+	STATIC: 'STATIC',
+	DYNAMIC: 'DYNAMIC',
+	BROADCAST: 'BROADCAST',
+	NONE: 'NONE',
+};
+
+export const DESCRIPTIONS = {
+	script: "intl.formatMessage({ id: 'fabric.common.name', defaultMessage: '$$$' })",
+	template: "intl.formatMessage({ id: 'fabric.common.name', defaultMessage: '$$$' })",
+	json: "intl.formatMessage({ id: 'fabric.common.name', defaultMessage: '$$$' })",
+	cron: "intl.formatMessage({ id: 'fabric.common.name', defaultMessage: '$$$' })",
+};
+
+export const getEllipsis = (text: string, length: number) => {
+	if (!length) {
+		return /[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/.test(text)
+			? text.length > 8
+				? text.substring(0, 8).concat('...')
+				: text
+			: text.length > 15
+			? text.substring(0, 15).concat('...')
+			: text;
+	}
+	return /[ㄱ-ㅎ|ㅏ-ㅣ|가-힣]/.test(text)
+		? text.length > length / 2
+			? text.substring(0, length / 2).concat('...')
+			: text
+		: text.length > length
+		? text.substring(0, length).concat('...')
+		: text;
+};
+
+export type NodeType = 'TRIGGER' | 'LOGIC' | 'DATA' | 'ACTION';
+
+export interface NodeObject extends FabricObject<fabric.Group> {
+	errorFlag?: fabric.IText;
+	label?: fabric.Text;
+	toPort?: PortObject;
+	errors?: any;
+	fromPort?: PortObject[];
+	descriptor?: Record<string, any>;
+	nodeClazz?: string;
+	configuration?: Record<string, any>;
+	defaultPortOption?: () => Partial<PortObject>;
+	toPortOption?: () => Partial<PortObject>;
+	fromPortOption?: () => Partial<PortObject>;
+	createToPort?: (left: number, top: number) => PortObject;
+	createFromPort?: (left: number, top: number) => PortObject[];
+	singlePort?: (portOption: Partial<PortObject>) => PortObject[];
+	staticPort?: (portOption: Partial<PortObject>) => PortObject[];
+	dynamicPort?: (portOption: Partial<PortObject>) => PortObject[];
+	broadcastPort?: (portOption: Partial<PortObject>) => PortObject[];
+	setErrors?: (errors: any) => void;
+	duplicate?: () => NodeObject;
+}
+
+const Node = fabric.util.createClass(fabric.Group, {
+	type: 'node',
+	superType: 'node',
+	initialize(options: any) {
+		options = options || {};
+		const icon = new fabric.IText(options.icon || '\uE174', {
+			fontFamily: 'Font Awesome 5 Free',
+			fontWeight: 900,
+			fontSize: 20,
+			fill: 'rgba(255, 255, 255, 0.8)',
+		});
+		let name = 'Default Node';
+		if (options.name) {
+			name = getEllipsis(options.name, 18);
+		}
+		this.label = new fabric.Text(name || 'Default Node', {
+			fontSize: 16,
+			fontFamily: 'polestar',
+			fontWeight: 500,
+			fill: 'rgba(255, 255, 255, 0.8)',
+		});
+		const rect = new fabric.Rect({
+			rx: 10,
+			ry: 10,
+			width: 200,
+			height: 40,
+			fill: options.fill || 'rgba(0, 0, 0, 0.3)',
+			stroke: options.stroke || 'rgba(0, 0, 0, 0)',
+			strokeWidth: 2,
+		});
+		this.errorFlag = new fabric.IText('\uf071', {
+			fontFamily: 'Font Awesome 5 Free',
+			fontWeight: 900,
+			fontSize: 14,
+			fill: 'rgba(255, 0, 0, 0.8)',
+			visible: options.errors,
+		});
+		const node = [rect, icon, this.label, this.errorFlag];
+		const option = Object.assign({}, options, {
+			id: options.id || fetchUuid(),
+			width: 200,
+			height: 40,
+			originX: 'left',
+			originY: 'top',
+			hasRotatingPoint: false,
+			hasControls: false,
+		});
+		this.callSuper('initialize', node, option);
+		icon.set({
+			top: icon.top + 10,
+			left: icon.left + 10,
+		});
+		this.label.set({
+			top: this.label.top + this.label.height / 2 + 4,
+			left: this.label.left + 35,
+		});
+		this.errorFlag.set({
+			left: rect.left,
+			top: rect.top,
+			visible: options.errors,
+		});
+	},
+	toObject() {
+		return fabric.util.object.extend(this.callSuper('toObject'), {
+			id: this.get('id'),
+			name: this.get('name'),
+			icon: this.get('icon'),
+			description: this.get('description'),
+			superType: this.get('superType'),
+			configuration: this.get('configuration'),
+			nodeClazz: this.get('nodeClazz'),
+			descriptor: this.get('descriptor'),
+			borderColor: this.get('borderColor'),
+			borderScaleFactor: this.get('borderScaleFactor'),
+			dblclick: this.get('dblclick'),
+			deletable: this.get('deletable'),
+			cloneable: this.get('cloneable'),
+			fromPort: this.get('fromPort'),
+			toPort: this.get('toPort'),
+		});
+	},
+	defaultPortOption() {
+		const { type }: { type: NodeType } = this.descriptor as any;
+		return {
+			nodeId: this.id,
+			hasBorders: false,
+			hasControls: false,
+			hasRotatingPoint: false,
+			selectable: false,
+			originX: 'center',
+			originY: 'center',
+			lockScalingX: true,
+			lockScalingY: true,
+			superType: 'port',
+			originFill: 'rgba(0, 0, 0, 0.1)',
+			hoverFill: 'rgba(0, 0, 0, 0.1)',
+			selectFill: 'rgba(0, 0, 0, 0.1)',
+			fill: 'rgba(0, 0, 0, 0.1)',
+			hoverCursor: 'pointer',
+			strokeWidth: 2,
+			stroke: this.descriptor ? NODE_COLORS[type].border : 'rgba(0, 0, 0, 1)',
+			width: 10,
+			height: 10,
+			links: [] as LinkObject[],
+			enabled: true,
+		};
+	},
+	toPortOption() {
+		return {
+			...this.defaultPortOption(),
+		};
+	},
+	fromPortOption() {
+		return {
+			...this.defaultPortOption(),
+			angle: 45,
+		};
+	},
+	createToPort(left: number, top: number) {
+		if (this.descriptor.inEnabled) {
+			this.toPort = new Port({
+				id: 'defaultInPort',
+				type: 'toPort',
+				...this.toPortOption(),
+				left,
+				top,
+			});
+		}
+		return this.toPort;
+	},
+	createFromPort(left: number, top: number) {
+		if (this.descriptor.outPortType === OUT_PORT_TYPE.BROADCAST) {
+			this.fromPort = this.broadcastPort({ ...this.fromPortOption(), left, top });
+		} else if (this.descriptor.outPortType === OUT_PORT_TYPE.STATIC) {
+			this.fromPort = this.staticPort({ ...this.fromPortOption(), left, top });
+		} else if (this.descriptor.outPortType === OUT_PORT_TYPE.DYNAMIC) {
+			this.fromPort = this.dynamicPort({ ...this.fromPortOption(), left, top });
+		} else if (this.descriptor.outPortType === OUT_PORT_TYPE.NONE) {
+			this.fromPort = [];
+		} else {
+			this.fromPort = this.singlePort({ ...this.fromPortOption(), left, top });
+		}
+		return this.fromPort;
+	},
+	singlePort(portOption: any) {
+		const fromPort = new Port({
+			id: 'defaultFromPort',
+			type: 'fromPort',
+			...portOption,
+		});
+		return [fromPort];
+	},
+	staticPort(portOption: any) {
+		return this.descriptor.outPorts.map((outPort: any, i: number) => {
+			return new Port({
+				id: outPort,
+				type: 'fromPort',
+				...portOption,
+				left: i === 0 ? portOption.left - 20 : portOption.left + 20,
+				top: portOption.top,
+				leftDiff: i === 0 ? -20 : 20,
+				fill: i === 0 ? 'rgba(0, 255, 0, 0.3)' : 'rgba(255, 0, 0, 0.3)',
+				originFill: i === 0 ? 'rgba(0, 255, 0, 0.3)' : 'rgba(255, 0, 0, 0.3)',
+				hoverFill: i === 0 ? 'rgba(0, 255, 0, 1)' : 'rgba(255, 0, 0, 1)',
+			});
+		});
+	},
+	dynamicPort(_portOption: any): any[] {
+		return [];
+	},
+	broadcastPort(portOption: any) {
+		return this.singlePort(portOption);
+	},
+	setErrors(errors: any) {
+		this.set({
+			errors,
+		});
+		if (errors) {
+			this.errorFlag.set({
+				visible: true,
+			});
+		} else {
+			this.errorFlag.set({
+				visible: false,
+			});
+		}
+	},
+	duplicate() {
+		const options = this.toObject();
+		options.id = fetchUuid();
+		options.name = `${options.name}_clone`;
+		return new Node(options);
+	},
+	_render(ctx: CanvasRenderingContext2D) {
+		this.callSuper('_render', ctx);
+	},
+});
+
+Node.fromObject = (options: NodeObject, callback: (obj: NodeObject) => any) => {
+	return callback(new Node(options));
+};
+
+// @ts-ignore
+window.fabric.FromPort = Port;
+
+// @ts-ignore
+window.fabric.ToPort = Port;
+
+// @ts-ignore
+window.fabric.Node = Node;
+
+export default Node;
diff --git a/src/pages/Fabric/canvas/objects/OrthogonalLink.ts b/src/pages/Fabric/canvas/objects/OrthogonalLink.ts
new file mode 100644
index 0000000..3bfcff5
--- /dev/null
+++ b/src/pages/Fabric/canvas/objects/OrthogonalLink.ts
@@ -0,0 +1,61 @@
+import { fabric } from 'fabric';
+import Link, { LinkObject } from './Link';
+import { NodeObject } from './Node';
+import { PortObject } from './Port';
+
+const OrthogonalLink = fabric.util.createClass(Link, {
+	type: 'OrthogonalLink',
+	superType: 'link',
+	initialize(
+		fromNode: Partial<NodeObject>,
+		fromPort: Partial<PortObject>,
+		toNode: Partial<NodeObject>,
+		toPort: Partial<PortObject>,
+		options: Partial<LinkObject>,
+	) {
+		options = options || {};
+		this.callSuper('initialize', fromNode, fromPort, toNode, toPort, options);
+	},
+	_render(ctx: CanvasRenderingContext2D) {
+		// Drawing orthogonal link
+		const { x1, y1, x2, y2 } = this;
+		ctx.lineWidth = this.strokeWidth;
+		ctx.strokeStyle = this.stroke;
+		const fp = { x: (x1 - x2) / 2, y: (y1 - y2) / 2 };
+		const sp = { x: (x2 - x1) / 2, y: (y2 - y1) / 2 };
+		ctx.lineJoin = 'round';
+		ctx.beginPath();
+		ctx.moveTo(fp.x, fp.y);
+		ctx.lineTo(fp.x, sp.y / 2);
+		ctx.lineTo(sp.x, sp.y / 2);
+		ctx.lineTo(sp.x, sp.y);
+		ctx.stroke();
+		ctx.save();
+		const xDiff = this.x2 - this.x1;
+		const yDiff = this.y2 - this.y1;
+		const angle = Math.atan2(yDiff, xDiff);
+		ctx.translate((this.x2 - this.x1) / 2, (this.y2 - this.y1) / 2);
+		ctx.rotate(angle >= 0 ? 1.57 : -1.57);
+		ctx.beginPath();
+		if (this.arrow) {
+			// Move 5px in front of line to start the arrow so it does not have the square line end showing in front (0,0)
+			ctx.moveTo(5, 0);
+			ctx.lineTo(-5, 5);
+			ctx.lineTo(-5, -5);
+		}
+		ctx.closePath();
+		ctx.fillStyle = this.stroke;
+		ctx.fill();
+		ctx.restore();
+	},
+});
+
+OrthogonalLink.fromObject = (options: LinkObject, callback: (obj: LinkObject) => any) => {
+	const { fromNode, fromPort, toNode, toPort } = options;
+	return callback(new OrthogonalLink(fromNode, fromPort, toNode, toPort, options));
+};
+
+// @ts-ignore
+window.fabric.OrthogonalLink = OrthogonalLink;
+
+export default OrthogonalLink;
diff --git a/src/pages/Fabric/canvas/objects/Port.ts b/src/pages/Fabric/canvas/objects/Port.ts
new file mode 100644
index 0000000..8dcf1d9
--- /dev/null
+++ b/src/pages/Fabric/canvas/objects/Port.ts
@@ -0,0 +1,41 @@
+import { fabric } from 'fabric';
+
+import { FabricObject } from '../utils';
+import { LinkObject } from './Link';
+
+export interface PortObject extends FabricObject<fabric.Rect> {
+	links?: LinkObject[];
+	nodeId?: string;
+	enabled?: boolean;
+	hoverFill?: string;
+	selectFill?: string;
+}
+
+const Port = fabric.util.createClass(fabric.Rect, {
+	type: 'port',
+	superType: 'port',
+	initialize(options: any) {
+		options = options || {};
+		this.callSuper('initialize', options);
+	},
+	toObject() {
+		return fabric.util.object.extend(this.callSuper('toObject'), {
+			id: this.get('id'),
+			superType: this.get('superType'),
+			enabled: this.get('enabled'),
+			nodeId: this.get('nodeId'),
+		});
+	},
+	_render(ctx: CanvasRenderingContext2D) {
+		this.callSuper('_render', ctx);
+	},
+});
+
+Port.fromObject = (options: PortObject, callback: (obj: PortObject) => any) => {
+	return callback(new Port(options));
+};
+
+// @ts-ignore
+window.fabric.Port = Port;
+
+export default Port;
diff --git a/src/pages/Fabric/canvas/objects/Svg.ts b/src/pages/Fabric/canvas/objects/Svg.ts
new file mode 100644
index 0000000..0e57434
--- /dev/null
+++ b/src/pages/Fabric/canvas/objects/Svg.ts
@@ -0,0 +1,104 @@
+import { fabric } from 'fabric';
+import { FabricGroup, FabricObject, FabricObjectOption, toObject } from '../utils';
+
+export type SvgObject = (FabricGroup | FabricObject) & {
+	loadSvg(option: SvgOption): Promise<SvgObject>;
+	setFill(value: string): SvgObject;
+	setStroke(value: string): SvgObject;
+};
+
+export interface SvgOption extends FabricObjectOption {
+	svg?: string;
+	loadType?: 'file' | 'svg';
+}
+
+const Svg = fabric.util.createClass(fabric.Group, {
+	type: 'svg',
+	initialize(option: SvgOption = {}) {
+		this.callSuper('initialize', [], option);
+		this.loadSvg(option);
+	},
+	addSvgElements(objects: FabricObject[], options: any, path: string) {
+		const createdObj = fabric.util.groupSVGElements(objects, options, path) as SvgObject;
+		this.set(options);
+		if (createdObj.getObjects) {
+			(createdObj as FabricGroup).getObjects().forEach(obj => {
+				this.add(obj);
+				if (options.fill) {
+					obj.set('fill', options.fill);
+				}
+				if (options.stroke) {
+					obj.set('stroke', options.stroke);
+				}
+			});
+		} else {
+			createdObj.set({
+				originX: 'center',
+				originY: 'center',
+			});
+			if (options.fill) {
+				createdObj.set({
+					fill: options.fill,
+				});
+			}
+			if (options.stroke) {
+				createdObj.set({
+					stroke: options.stroke,
+				});
+			}
+			if (this._objects?.length) {
+				(this as FabricGroup)._objects.forEach(obj => this.remove(obj));
+			}
+			this.add(createdObj);
+		}
+		this.set({
+			fill: options.fill || 'rgba(0, 0, 0, 1)',
+			stroke: options.stroke || 'rgba(255, 255, 255, 0)',
+		});
+		this.setCoords();
+		if (this.canvas) {
+			this.canvas.requestRenderAll();
+		}
+		return this;
+	},
+	loadSvg(option: SvgOption) {
+		const { svg, loadType, fill, stroke } = option;
+		return new Promise<SvgObject>(resolve => {
+			if (loadType === 'svg') {
+				fabric.loadSVGFromString(svg, (objects, options) => {
+					resolve(this.addSvgElements(objects, { ...options, fill, stroke }, svg));
+				});
+			} else {
+				fabric.loadSVGFromURL(svg, (objects, options) => {
+					resolve(this.addSvgElements(objects, { ...options, fill, stroke }, svg));
+				});
+			}
+		});
+	},
+	setFill(value: any) {
+		this.getObjects().forEach((obj: FabricObject) => obj.set('fill', value));
+		return this;
+	},
+	setStroke(value: any) {
+		this.getObjects().forEach((obj: FabricObject) => obj.set('stroke', value));
+		return this;
+	},
+	toObject(propertiesToInclude: string[]) {
+		return toObject(this, propertiesToInclude, {
+			svg: this.get('svg'),
+			loadType: this.get('loadType'),
+		});
+	},
+	_render(ctx: CanvasRenderingContext2D) {
+		this.callSuper('_render', ctx);
+	},
+});
+
+Svg.fromObject = (option: SvgOption, callback: (obj: SvgObject) => any) => {
+	return callback(new Svg(option));
+};
+
+// @ts-ignore
+window.fabric.Svg = Svg;
+
+export default Svg;
diff --git a/src/pages/Fabric/canvas/objects/Video.ts b/src/pages/Fabric/canvas/objects/Video.ts
new file mode 100644
index 0000000..37f608d
--- /dev/null
+++ b/src/pages/Fabric/canvas/objects/Video.ts
@@ -0,0 +1,129 @@
+import { fabric } from 'fabric';
+// import 'mediaelement';
+// import 'mediaelement/build/mediaelementplayer.min.css';
+import { FabricElement, toObject } from '../utils';
+
+export interface VideoObject extends FabricElement {
+	setSource: (source: string | File) => void;
+	setFile: (file: File) => void;
+	setSrc: (src: string) => void;
+	file?: File;
+	src?: string;
+	videoElement?: HTMLVideoElement;
+	player?: any;
+}
+
+const Video = fabric.util.createClass(fabric.Rect, {
+	type: 'video',
+	superType: 'element',
+	hasRotatingPoint: false,
+	initialize(source: string | File, options: any) {
+		options = options || {};
+		this.callSuper('initialize', options);
+		if (source instanceof File) {
+			this.set({
+				file: source,
+				src: null,
+			});
+		} else {
+			this.set({
+				file: null,
+				src: source,
+			});
+		}
+		this.set({
+			fill: 'rgba(255, 255, 255, 0)',
+			stroke: 'rgba(255, 255, 255, 0)',
+		});
+	},
+	setSource(source: any) {
+		if (source instanceof File) {
+			this.setFile(source);
+		} else {
+			this.setSrc(source);
+		}
+	},
+	setFile(file: File) {
+		this.set({
+			file,
+			src: null,
+		});
+		const reader = new FileReader();
+		reader.onload = () => {
+			this.player.setSrc(reader.result);
+		};
+		reader.readAsDataURL(file);
+	},
+	setSrc(src: string) {
+		this.set({
+			file: null,
+			src,
+		});
+		this.player.setSrc(src);
+	},
+	toObject(propertiesToInclude: string[]) {
+		return toObject(this, propertiesToInclude, {
+			src: this.get('src'),
+			file: this.get('file'),
+			container: this.get('container'),
+			editable: this.get('editable'),
+		});
+	},
+	_render(ctx: CanvasRenderingContext2D) {
+		this.callSuper('_render', ctx);
+		if (!this.element) {
+			const { id, scaleX, scaleY, width, height, angle, editable, src, file, autoplay, muted, loop } = this;
+			const zoom = this.canvas.getZoom();
+			const left = this.calcCoords().tl.x;
+			const top = this.calcCoords().tl.y;
+			const padLeft = (width * scaleX * zoom - width) / 2;
+			const padTop = (height * scaleY * zoom - height) / 2;
+			this.videoElement = fabric.util.makeElement('video', {
+				id,
+				autoplay: editable ? false : autoplay,
+				muted: editable ? false : muted,
+				loop: editable ? false : loop,
+				preload: 'none',
+				controls: false,
+			});
+			this.element = fabric.util.wrapElement(this.videoElement, 'div', {
+				id: `${id}_container`,
+				style: `transform: rotate(${angle}deg) scale(${scaleX * zoom}, ${scaleY * zoom});
+                        width: ${width}px;
+                        height: ${height}px;
+                        left: ${left + padLeft}px;
+                        top: ${top + padTop}px;
+                        position: absolute;
+                        user-select: ${editable ? 'none' : 'auto'};
+                        pointer-events: ${editable ? 'none' : 'auto'};`,
+			}) as HTMLDivElement;
+			const container = document.getElementById(this.container);
+			container.appendChild(this.element);
+			this.player = new MediaElementPlayer(id, {
+				pauseOtherPlayers: false,
+				videoWidth: '100%',
+				videoHeight: '100%',
+				success: (_mediaeElement: any, _originalNode: any, instance: any) => {
+					if (editable) {
+						instance.pause();
+					}
+				},
+			});
+			this.player.setPlayerSize(width, height);
+			if (src) {
+				this.setSrc(src);
+			} else if (file) {
+				this.setFile(file);
+			}
+		}
+	},
+});
+
+Video.fromObject = (options: VideoObject, callback: (obj: VideoObject) => any) => {
+	return callback(new Video(options.src || options.file, options));
+};
+
+// @ts-ignore
+window.fabric.Video = Video;
+
+export default Video;
diff --git a/src/pages/Fabric/canvas/objects/index.ts b/src/pages/Fabric/canvas/objects/index.ts
new file mode 100644
index 0000000..0f8beb1
--- /dev/null
+++ b/src/pages/Fabric/canvas/objects/index.ts
@@ -0,0 +1,22 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-20 13:39:07
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-28 14:55:08
+ * @FilePath: \react-design-editor\src\canvas\objects\index.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+export { default as Arrow } from './Arrow';
+export { default as CirclePort } from './CirclePort';
+export { default as Cube } from './Cube';
+export { default as CurvedLink } from './CurvedLink';
+export { default as Element } from './Element';
+export { default as Gif } from './Gif';
+export { default as Iframe } from './Iframe';
+export { default as Line } from './Line';
+export { default as Link } from './Link';
+export { default as Node } from './Node';
+export { default as OrthogonalLink } from './OrthogonalLink';
+export { default as Port } from './Port';
+export { default as Svg } from './Svg';
+export { default as Video } from './Video';
diff --git a/src/pages/Fabric/canvas/styles/canvas.less b/src/pages/Fabric/canvas/styles/canvas.less
new file mode 100644
index 0000000..0f4ec23
--- /dev/null
+++ b/src/pages/Fabric/canvas/styles/canvas.less
@@ -0,0 +1,10 @@
+.rde-canvas {
+    position: absolute;
+    width: 100%;
+    height: 100%;
+    top: 0;
+    left: 0;
+    iframe {
+        pointer-events: none;
+    }
+}
\ No newline at end of file
diff --git a/src/pages/Fabric/canvas/styles/contextmenu.less b/src/pages/Fabric/canvas/styles/contextmenu.less
new file mode 100644
index 0000000..2c92b13
--- /dev/null
+++ b/src/pages/Fabric/canvas/styles/contextmenu.less
@@ -0,0 +1,29 @@
+.rde-contextmenu {
+    position: fixed;
+    -moz-animation: visibility .3s linear;
+    -webkit-animation: visibility .3s linear;
+    animation: visibility .3s linear;
+    z-index: 600000;
+    &-right {
+        position: relative;
+        border-radius: 4px;
+        background: rgba(0, 0, 0, 0.35);
+        color: #fff;
+        font-size: 14px;
+        padding: 8px;
+        margin-left: 12px;
+    }
+    &-left {
+        position: relative;
+        border-radius: 4px;
+        background: rgba(0, 0, 0, 0.35);
+        color: #fff;
+        font-size: 14px;
+        padding: 8px;
+    }
+    &.contextmenu-hidden {
+        display: none;
+        top: 0;
+        left: 0;
+    }
+}
\ No newline at end of file
diff --git a/src/pages/Fabric/canvas/styles/fabricjs.less b/src/pages/Fabric/canvas/styles/fabricjs.less
new file mode 100644
index 0000000..18ad3d4
--- /dev/null
+++ b/src/pages/Fabric/canvas/styles/fabricjs.less
@@ -0,0 +1,3 @@
+.canvas-container {
+	outline: none;
+}
diff --git a/src/pages/Fabric/canvas/styles/tooltip.less b/src/pages/Fabric/canvas/styles/tooltip.less
new file mode 100644
index 0000000..9c49cd9
--- /dev/null
+++ b/src/pages/Fabric/canvas/styles/tooltip.less
@@ -0,0 +1,50 @@
+.rde-tooltip {
+    position: fixed;
+    -moz-animation: visibility .3s linear;
+    -webkit-animation: visibility .3s linear;
+    animation: visibility .3s linear;
+    z-index: 600000;
+    &-right {
+        position: relative;
+        border-radius: 4px;
+        background: rgba(0, 0, 0, 0.35);
+        color: #fff;
+        font-size: 14px;
+        padding: 8px;
+        margin-left: 12px;
+        &::after {
+            content: '';
+            position: absolute;
+            top: 50%;
+            left: 0; /* To the left of the tooltip */
+            margin-left: -10px;
+            margin-top: -5px;
+            border-width: 5px;
+            border-style: solid;
+            border-color: transparent rgba(0, 0, 0, 0.35) transparent transparent;
+        }
+    }
+    &-left {
+        position: relative;
+        border-radius: 4px;
+        background: rgba(0, 0, 0, 0.35);
+        color: #fff;
+        font-size: 14px;
+        padding: 8px;
+        &::after {
+            content: '';
+            position: absolute;
+            top: 50%;
+            left: 100%; /* To the left of the tooltip */
+            margin-top: -5px;
+            border-width: 5px;
+            border-style: solid;
+            border-color: transparent transparent transparent rgba(0, 0, 0, 0.35);
+        }
+    }
+    &.tooltip-hidden {
+        display: none;
+        top: 0;
+        left: 0;
+    }
+}
\ No newline at end of file
diff --git a/src/pages/Fabric/canvas/utils/ObjectUtil.ts b/src/pages/Fabric/canvas/utils/ObjectUtil.ts
new file mode 100644
index 0000000..1fa5a8d
--- /dev/null
+++ b/src/pages/Fabric/canvas/utils/ObjectUtil.ts
@@ -0,0 +1,433 @@
+ import { fabric } from 'fabric';
+import { IFilter } from '../handlers/ImageHandler';
+
+export type AnimationType = 'fade' | 'bounce' | 'shake' | 'scaling' | 'rotation' | 'flash' | 'custom' | 'none';
+
+export interface AnimationProperty {
+	delay?: number;
+	duration?: number;
+	autoplay?: boolean;
+	loop?: boolean | number;
+	type: AnimationType;
+	offset?: number;
+	opacity?: number;
+	bounce?: 'vertical' | 'horizontal';
+	shake?: 'vertical' | 'horizontal';
+	scale?: number;
+	angle?: number;
+	fill?: string | fabric.Pattern;
+	stroke?: string;
+}
+
+export interface LinkProperty {
+	enabled?: boolean;
+	type?: string;
+	state?: string;
+	[key: string]: any;
+}
+
+export interface TooltipProperty {
+	enabled?: boolean;
+	type?: string;
+	template?: string;
+}
+
+export interface TriggerProperty {
+	enabled?: boolean;
+	type?: string;
+	script?: string;
+	effect?: string;
+}
+
+export interface FabricCanvasOption {
+	wrapperEl?: HTMLElement;
+}
+
+export type FabricCanvas<T extends any = fabric.Canvas> = T & FabricCanvasOption;
+
+export type FabricObjectOption<T extends any = fabric.IObjectOptions> = T & {
+	/**
+	 * Object id
+	 * @type {string}
+	 */
+	id?: string;
+	/**
+	 * Parent object id
+	 * @type {string}
+	 */
+	parentId?: string;
+	/**
+	 * Original opacity
+	 * @type {number}
+	 */
+	originOpacity?: number;
+	/**
+	 * Original top position
+	 * @type {number}
+	 */
+	originTop?: number;
+	/**
+	 * Original left position
+	 * @type {number}
+	 */
+	originLeft?: number;
+	/**
+	 * Original scale X
+	 * @type {number}
+	 */
+	originScaleX?: number;
+	/**
+	 * Original scale Y
+	 * @type {number}
+	 */
+	originScaleY?: number;
+	/**
+	 * Original angle
+	 * @type {number}
+	 */
+	originAngle?: number;
+	/**
+	 * Original fill color
+	 *
+	 * @type {(string | fabric.Pattern | fabric.Gradient)}
+	 */
+	originFill?: string | fabric.Pattern | fabric.Gradient;
+	/**
+	 * Original stroke color
+	 * @type {string}
+	 */
+	originStroke?: string;
+	/**
+	 * Original rotation
+	 *
+	 * @type {number}
+	 */
+	originRotation?: number;
+	/**
+	 * Object editable
+	 * @type {boolean}
+	 */
+	editable?: boolean;
+	/**
+	 * Object Super type
+	 * @type {string}
+	 */
+	superType?: string;
+	/**
+	 * @description
+	 * @type {string}
+	 */
+	description?: string;
+	/**
+	 * Animation property
+	 * @type {AnimationProperty}
+	 */
+	animation?: AnimationProperty;
+	/**
+	 * Anime instance
+	 * @type {anime.AnimeInstance}
+	 */
+	anime?: anime.AnimeInstance;
+	/**
+	 * Tooltip property
+	 * @type {TooltipProperty}
+	 */
+	tooltip?: TooltipProperty;
+	/**
+	 * Link property
+	 * @type {LinkProperty}
+	 */
+	link?: LinkProperty;
+	/**
+	 * Is running animation
+	 * @type {boolean}
+	 */
+	animating?: boolean;
+	/**
+	 * Object class
+	 * @type {string}
+	 */
+	class?: string;
+	/**
+	 * Is possible delete
+	 * @type {boolean}
+	 */
+	deletable?: boolean;
+	/**
+	 * Is enable double click
+	 * @type {boolean}
+	 */
+	dblclick?: boolean;
+	/**
+	 * Is possible clone
+	 * @type {boolean}
+	 */
+	cloneable?: boolean;
+	/**
+	 * Is locked object
+	 * @type {boolean}
+	 */
+	locked?: boolean;
+	/**
+	 * This property replaces "angle"
+	 *
+	 * @type {number}
+	 */
+	rotation?: number;
+	/**
+	 * Whether it can be clicked
+	 *
+	 * @type {boolean}
+	 */
+	clickable?: boolean;
+	[key: string]: any;
+};
+
+export type FabricObject<T extends any = fabric.Object> = T & FabricObjectOption;
+
+export type FabricGroup = FabricObject<fabric.Group> & {
+	/**
+	 * Object that config group
+	 * @type {FabricObject[]}
+	 */
+	objects?: FabricObject[];
+};
+
+export type FabricImage = FabricObject &
+	fabric.Image & {
+		/**
+		 * Image URL
+		 * @type {string}
+		 */
+		src?: string;
+		/**
+		 * Image File or Blob
+		 * @type {File}
+		 */
+		file?: File;
+		/**
+		 * Image Filter
+		 * @type {IFilter[]}
+		 */
+		filters?: IFilter[];
+		_element?: any;
+	};
+
+export interface FabricElement extends FabricObject<fabric.Rect> {
+	/**
+	 * Wrapped Element
+	 * @type {HTMLDivElement}
+	 */
+	container: HTMLDivElement;
+	/**
+	 * Target Element
+	 * @type {HTMLDivElement}
+	 */
+	element: HTMLDivElement;
+	/**
+	 * Source of Element Object
+	 */
+	setSource: (source: any) => void;
+}
+
+export type WorkareaLayout = 'fixed' | 'responsive' | 'fullscreen';
+
+export interface WorkareaOption {
+	/**
+	 * Image URL
+	 * @type {string}
+	 */
+	src?: string;
+	/**
+	 * Image File or Blbo
+	 * @type {File}
+	 */
+	file?: File;
+	/**
+	 * Workarea Width
+	 * @type {number}
+	 */
+	width?: number;
+	/**
+	 * Workarea Height
+	 * @type {number}
+	 */
+	height?: number;
+	/**
+	 * Workarea Background Color
+	 * @type {string}
+	 */
+	backgroundColor?: string;
+	/**
+	 * Workarea Layout Type
+	 * @type {WorkareaLayout}
+	 */
+	layout?: WorkareaLayout;
+}
+
+export type WorkareaObject = FabricImage & {
+	/**
+	 * Workarea Layout Type
+	 * @type {WorkareaLayout}
+	 */
+	layout?: WorkareaLayout;
+	/**
+	 * Workarea Image Element
+	 * @type {HTMLImageElement}
+	 */
+	_element?: HTMLImageElement;
+	/**
+	 * Whether exist the element
+	 * @type {boolean}
+	 */
+	isElement?: boolean;
+	/**
+	 * Stored width in workarea
+	 * @type {number}
+	 */
+	workareaWidth?: number;
+	/**
+	 * Stored height in workarea
+	 * @type {number}
+	 */
+	workareaHeight?: number;
+};
+
+export interface CanvasOption extends fabric.ICanvasOptions {
+	/**
+	 * Unique id of Canvas
+	 * @type {string}
+	 */
+	id?: string;
+}
+
+export interface GridOption {
+	/**
+	 * Whether should be enabled
+	 * @type {boolean}
+	 */
+	enabled?: boolean;
+	/**
+	 * Grid interval
+	 * @type {number}
+	 */
+	grid?: number;
+	/**
+	 * When had moved object, whether should adjust position on grid interval
+	 * @type {boolean}
+	 */
+	snapToGrid?: boolean;
+	/**
+	 * Grid line color
+	 *
+	 * @type {string}
+	 */
+	lineColor?: string;
+	/**
+	 * Grid border color
+	 *
+	 * @type {string}
+	 */
+	borderColor?: string;
+}
+
+export interface GuidelineOption {
+	/**
+	 * When have moved object, whether should show guideline
+	 * @type {boolean}
+	 */
+	enabled?: boolean;
+}
+
+export interface KeyEvent {
+	/**
+	 * Arrow key
+	 * @type {boolean}
+	 */
+	move?: boolean;
+	/**
+	 * Ctrl + A
+	 * @type {boolean}
+	 */
+	all?: boolean;
+	/**
+	 * Ctrl + C
+	 * @type {boolean}
+	 */
+	copy?: boolean;
+	/**
+	 * Ctrl + P
+	 * @type {boolean}
+	 */
+	paste?: boolean;
+	/**
+	 * Escape
+	 * @type {boolean}
+	 */
+	esc?: boolean;
+	/**
+	 * Delete or Backspace
+	 * @type {boolean}
+	 */
+	del?: boolean;
+	/**
+	 * When have copied object, whether should copy object option on clipboard
+	 * @type {boolean}
+	 */
+	clipboard?: boolean;
+	/**
+	 * Ctrl + Z, Ctrl + Y
+	 * @type {boolean}
+	 */
+	transaction?: boolean;
+	/**
+	 * Plus, Minus
+	 *
+	 * @type {boolean}
+	 */
+	zoom?: boolean;
+	/**
+	 * Ctrl + X
+	 *
+	 * @type {boolean}
+	 */
+	cut?: boolean;
+	grab?: boolean;
+}
+
+export type InteractionMode = 'selection' | 'grab' | 'polygon' | 'line' | 'arrow' | 'link' | 'crop';
+
+export interface FabricEvent<T extends any = Event> extends Omit<fabric.IEvent, 'e'> {
+	e: T;
+	target?: FabricObject;
+	subTargets?: FabricObject[];
+	button?: number;
+	isClick?: boolean;
+	pointer?: fabric.Point;
+	absolutePointer?: fabric.Point;
+	transform?: { corner: string; original: FabricObject; originX: string; originY: string; width: number };
+}
+
+export type FabricObjects = {
+	[key: string]: {
+		create: (...args: any) => FabricObject;
+	};
+};
+
+/**
+ * toObject util
+ * @param {*} obj
+ * @param {string[]} propertiesToInclude
+ * @param {{ [key: string]: any }} [properties]
+ */
+export const toObject = (obj: any, propertiesToInclude: string[], properties?: { [key: string]: any }) =>
+	fabric.util.object.extend(
+		obj.callSuper('toObject'),
+		propertiesToInclude.reduce(
+			(prev, property) =>
+				Object.assign(prev, {
+					[property]: obj.get(property),
+				}),
+			Object.assign({}, properties),
+		),
+	);
diff --git a/src/pages/Fabric/canvas/utils/index.ts b/src/pages/Fabric/canvas/utils/index.ts
new file mode 100644
index 0000000..e178192
--- /dev/null
+++ b/src/pages/Fabric/canvas/utils/index.ts
@@ -0,0 +1 @@
+export * from './ObjectUtil';
diff --git a/src/pages/Fabric/components/ace/AceEditor.js b/src/pages/Fabric/components/ace/AceEditor.js
new file mode 100644
index 0000000..781c7bb
--- /dev/null
+++ b/src/pages/Fabric/components/ace/AceEditor.js
@@ -0,0 +1,199 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { Form, Row, Col } from 'antd';
+import {debounce } from 'lodash';
+import ReactAce from 'react-ace';
+
+import 'ace-builds/src-noconflict/mode-html';
+import 'ace-builds/src-noconflict/mode-css';
+import 'ace-builds/src-noconflict/mode-javascript';
+import 'ace-builds/src-noconflict/theme-github';
+
+import AcePreview from './AcePreview';
+
+const defaultStyle = {
+    padding: 12,
+};
+
+class AceEditor extends Component {
+    handlers = {
+        onChangeHTML: debounce((value) => {
+            this.setState({
+                html: value,
+                htmlAnnotations: this.htmlRef.editor.getSession().getAnnotations(),
+            }, () => {
+                if (this.props.onChangeHTML) {
+                    this.props.onChangeHTML(value);
+                }
+            });
+        }, 500),
+        onChangeCSS: debounce((value) => {
+            this.setState({
+                css: value,
+                cssAnnotations: this.cssRef.editor.getSession().getAnnotations(),
+            }, () => {
+                if (this.props.onChangeCSS) {
+                    this.props.onChangeCSS(value);
+                }
+            });
+        }, 500),
+        onChangeJS: debounce((value) => {
+            this.setState({
+                js: value,
+                jsAnnotations: this.jsRef.editor.getSession().getAnnotations(),
+            }, () => {
+                if (this.props.onChangeJS) {
+                    this.props.onChangeJS(value);
+                }
+            });
+        }, 500),
+        onValidateHTML: (annotations) => {
+            let i = annotations.length;
+            const len = annotations.length;
+            while (i--) {
+                if (/doctype first\. Expected/.test(annotations[i].text)) {
+                    annotations.splice(i, 1);
+                } else if (/Unexpected End of file\. Expected/.test(annotations[i].text)) {
+                    annotations.splice(i, 1);
+                }
+            }
+            if (len > annotations.length) {
+                this.htmlRef.editor.getSession().setAnnotations(annotations);
+            }
+        },
+        getAnnotations: () => {
+            const { htmlAnnotations, cssAnnotations, jsAnnotations } = this.state;
+            return {
+                htmlAnnotations,
+                cssAnnotations,
+                jsAnnotations,
+            };
+        },
+        getCodes: () => {
+            const { html, css, js } = this.state;
+            return {
+                html,
+                css,
+                js,
+            };
+        },
+    }
+
+    static propTypes = {
+        isHTML: PropTypes.bool,
+        isCSS: PropTypes.bool,
+        isJS: PropTypes.bool,
+        isPreview: PropTypes.bool,
+        html: PropTypes.string,
+        css: PropTypes.string,
+        js: PropTypes.string,
+    }
+
+    static defaultProps = {
+        isHTML: true,
+        isCSS: true,
+        isJS: true,
+        isPreview: true,
+        html: '',
+        css: '',
+        js: '',
+    }
+
+    state = {
+        html: this.props.html,
+        css: this.props.css,
+        js: this.props.js,
+        htmlAnnotations: [],
+        cssAnnotations: [],
+        jsAnnotations: [],
+    }
+
+    componentWillUnmount() {
+        this.htmlRef.editor.destroy();
+        this.cssRef.editor.destroy();
+        this.jsRef.editor.destroy();
+    }
+
+    render() {
+        const { isHTML, isCSS, isJS, isPreview } = this.props;
+        const { html, css, js } = this.state;
+        return (
+            <Row>
+                {
+                    isHTML ? (
+                        <Col span={12} style={defaultStyle}>
+                            <Form.Item label="HTML" colon={false}>
+                                <ReactAce
+                                    ref={(c) => { this.htmlRef = c; }}
+                                    mode="html"
+                                    theme="github"
+                                    width="100%"
+                                    height="200px"
+                                    defaultValue={html}
+                                    value={html}
+                                    editorProps={{
+                                        $blockScrolling: true,
+                                    }}
+                                    onChange={this.handlers.onChangeHTML}
+                                />
+                            </Form.Item>
+                        </Col>
+                    ) : null
+                }
+                {
+                    isCSS ? (
+                        <Col span={12} style={defaultStyle}>
+                            <Form.Item label="CSS" colon={false}>
+                                <ReactAce
+                                    ref={(c) => { this.cssRef = c; }}
+                                    mode="css"
+                                    theme="github"
+                                    width="100%"
+                                    height="200px"
+                                    defaultValue={css}
+                                    value={css}
+                                    editorProps={{
+                                        $blockScrolling: true,
+                                    }}
+                                    onChange={this.handlers.onChangeCSS}
+                                />
+                            </Form.Item>
+                        </Col>
+                    ) : null
+                }
+                {
+                    isJS ? (
+                        <Col span={12} style={defaultStyle}>
+                            <Form.Item label="JS" colon={false}>
+                                <ReactAce
+                                    ref={(c) => { this.jsRef = c; }}
+                                    mode="javascript"
+                                    theme="github"
+                                    width="100%"
+                                    height="200px"
+                                    defaultValue={js}
+                                    value={js}
+                                    editorProps={{
+                                        $blockScrolling: true,
+                                    }}
+                                    onChange={this.handlers.onChangeJS}
+                                />
+                            </Form.Item>
+                        </Col>
+                    ) : null
+                }
+                {
+                    isPreview ? (
+                        <Col span={12} style={defaultStyle}>
+                            <Form.Item label="Preview" colon={false}>
+                                <AcePreview html={html} css={css} js={js} />
+                            </Form.Item>
+                        </Col>
+                    ) : null
+                }
+            </Row>
+        );
+    }
+}
+
+export default AceEditor;
diff --git a/src/pages/Fabric/components/ace/AceModal.js b/src/pages/Fabric/components/ace/AceModal.js
new file mode 100644
index 0000000..582dfe5
--- /dev/null
+++ b/src/pages/Fabric/components/ace/AceModal.js
@@ -0,0 +1,120 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { Form, Modal, Button, notification } from 'antd';
+import Icon from '../icon/Icon';
+import AceEditor from './AceEditor';
+
+notification.config({
+	top: 80,
+	duration: 1,
+});
+
+class AceModal extends Component {
+	static propTypes = {
+		value: PropTypes.any,
+		onChange: PropTypes.func,
+		form: PropTypes.any,
+	};
+
+	handlers = {
+		onOk: () => {
+			const { onChange } = this.props;
+			const code = this.aceRef.handlers.getCodes();
+			onChange(code);
+			this.setState({
+				visible: false,
+				code,
+			});
+		},
+		onCancel: () => {
+			this.modalHandlers.onHide();
+		},
+		onClick: () => {
+			this.modalHandlers.onShow();
+		},
+	};
+
+	modalHandlers = {
+		onShow: () => {
+			this.setState({
+				visible: true,
+			});
+		},
+		onHide: () => {
+			this.setState({
+				visible: false,
+			});
+		},
+	};
+
+	state = {
+		code: this.props.value || { html: '', css: '', js: '' },
+		visible: false,
+	};
+
+	UNSAFE_componentWillReceiveProps(nextProps) {
+		this.setState({
+			code: nextProps.value || { html: '', css: '', js: '' },
+		});
+	}
+
+	render() {
+		const { onOk, onCancel, onClick } = this.handlers;
+		const { form } = this.props;
+		const { getFieldDecorator } = form;
+		const {
+			code: { html, css, js },
+			visible,
+		} = this.state;
+		const label = (
+			<React.Fragment>
+				<span style={{ marginRight: 8 }}>Code Editor</span>
+				<Button onClick={onClick} shape="circle">
+					<Icon name="code" />
+				</Button>
+			</React.Fragment>
+		);
+		return (
+			<React.Fragment>
+				<Form.Item label={label} colon={false}>
+					{getFieldDecorator('code', {
+						rules: [
+							{
+								required: true,
+								message: 'Please input code',
+							},
+						],
+						initialValue: '',
+					})(<span />)}
+				</Form.Item>
+				<Form.Item label="HTML" colon={false}>
+					{getFieldDecorator('html', {
+						initialValue: html || '',
+					})(<pre style={{ wordBreak: 'break-all', lineHeight: '1.2em' }}>{html}</pre>)}
+				</Form.Item>
+				<Form.Item label="CSS" colon={false}>
+					{getFieldDecorator('css', {
+						initialValue: css || '',
+					})(<pre style={{ wordBreak: 'break-all', lineHeight: '1.2em' }}>{css}</pre>)}
+				</Form.Item>
+				<Form.Item label="JS" colon={false}>
+					{getFieldDecorator('js', {
+						initialValue: js || '',
+					})(<pre style={{ wordBreak: 'break-all', lineHeight: '1.2em' }}>{js}</pre>)}
+				</Form.Item>
+				<Modal onCancel={onCancel} onOk={onOk} visible={visible} width="80%">
+					<AceEditor
+						ref={(c) => {
+							this.aceRef = c;
+						}}
+						html={html}
+						css={css}
+						js={js}
+					/>
+				</Modal>
+			</React.Fragment>
+		);
+	}
+}
+
+export default AceModal;
diff --git a/src/pages/Fabric/components/ace/AcePreview.js b/src/pages/Fabric/components/ace/AcePreview.js
new file mode 100644
index 0000000..b883b0f
--- /dev/null
+++ b/src/pages/Fabric/components/ace/AcePreview.js
@@ -0,0 +1,63 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+
+class AcePreview extends Component {
+	static propTypes = {
+		html: PropTypes.string,
+		css: PropTypes.string,
+		js: PropTypes.string,
+	};
+
+	static defaultProps = {
+		html: '',
+		css: '',
+		js: '',
+	};
+
+	componentDidMount() {
+		const { html, css, js } = this.props;
+		this.iframeRender(html, css, js);
+	}
+
+	componentDidUpdate(prevProps) {
+		if (this.container) {
+			const { html, css, js } = this.props;
+			if (html !== prevProps.html || css !== prevProps.css || js !== prevProps.js) {
+				this.iframeRender(html, css, js);
+			}
+		}
+	}
+
+	iframeRender = (html, css, js) => {
+		while (this.container.hasChildNodes()) {
+			this.container.removeChild(this.container.firstChild);
+		}
+		const iframe = document.createElement('iframe');
+		iframe.width = '100%';
+		iframe.height = '200px';
+		this.container.appendChild(iframe);
+		const style = document.createElement('style');
+		style.type = 'text/css';
+		style.innerHTML = css;
+		iframe.contentDocument.head.appendChild(style);
+		const script = document.createElement('script');
+		script.type = 'text/javascript';
+		script.innerHTML = js;
+		iframe.contentDocument.head.appendChild(script);
+		iframe.contentDocument.body.innerHTML = html;
+	};
+
+	render() {
+		return (
+			<div
+				ref={(c) => {
+					this.container = c;
+				}}
+				id="code-preview"
+				style={{ width: '100%', height: 200 }}
+			/>
+		);
+	}
+}
+
+export default AcePreview;
diff --git a/src/pages/Fabric/components/common/ChartModal.js b/src/pages/Fabric/components/common/ChartModal.js
new file mode 100644
index 0000000..ecf62f9
--- /dev/null
+++ b/src/pages/Fabric/components/common/ChartModal.js
@@ -0,0 +1,109 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { Modal, Button, Form } from 'antd';
+import ReactAce from 'react-ace';
+
+import Icon from '../icon/Icon';
+
+import 'ace-builds/src-noconflict/mode-javascript';
+import 'ace-builds/src-noconflict/theme-github';
+
+
+class CodeModal extends Component {
+
+	static propTypes = {
+		value: PropTypes.any,
+		onChange: PropTypes.func,
+		form: PropTypes.any,
+	};
+
+	state = {
+		chartOption: this.props.value,
+		visible: false,
+	};
+
+	UNSAFE_componentWillReceiveProps(nextProps) {
+		this.setState({
+			chartOption: nextProps.value,
+		});
+	}
+
+	handlers = {
+		onOk: () => {
+			const { onChange } = this.props;
+			const { tempChartOption } = this.state;
+			onChange(tempChartOption);
+			this.setState({
+				visible: false,
+				chartOption: tempChartOption,
+			});
+		},
+		onCancel: () => {
+			this.modalHandlers.onHide();
+		},
+		onClick: () => {
+			this.modalHandlers.onShow();
+		},
+	};
+
+	modalHandlers = {
+		onShow: () => {
+			this.setState({
+				visible: true,
+			});
+		},
+		onHide: () => {
+			this.setState({
+				visible: false,
+			});
+		},
+	};
+
+	render() {
+		const { onOk, onCancel, onClick } = this.handlers;
+		const { form } = this.props;
+		const { getFieldDecorator } = form;
+		const { visible, chartOption, tempChartOption } = this.state;
+		const label = (
+			<React.Fragment>
+				<span style={{ marginRight: 8 }}> {"intl.formatMessage({ id: 'fabric.common.code', defaultMessage: '$$$' })"}</span>
+				<Button onClick={onClick} shape="circle" className="rde-action-btn">
+					<Icon name="edit" />
+				</Button>
+			</React.Fragment>
+		);
+		const codeLabel = <span>Code (value, styles, animations, userProperty)</span>;
+		return (
+			<React.Fragment>
+				<Form.Item label={label} colon={false}>
+					{getFieldDecorator('chartOption', {
+						initialValue: chartOption,
+					})(<pre style={{ wordBreak: 'break-all', lineHeight: '1.2em' }}>{chartOption}</pre>)}
+				</Form.Item>
+				<Modal onCancel={onCancel} onOk={onOk} visible={visible} style={{ minWidth: 800 }}>
+					<Form.Item label={codeLabel} colon={false}>
+						<ReactAce
+							ref={c => {
+								this.jsRef = c;
+							}}
+							mode="javascript"
+							theme="github"
+							width="100%"
+							height="600px"
+							defaultValue={chartOption}
+							value={tempChartOption}
+							editorProps={{
+								$blockScrolling: true,
+							}}
+							onChange={text => {
+								this.setState({ tempChartOption: text });
+							}}
+						/>
+					</Form.Item>
+				</Modal>
+			</React.Fragment>
+		);
+	}
+}
+
+export default CodeModal;
diff --git a/src/pages/Fabric/components/common/CodeModal.js b/src/pages/Fabric/components/common/CodeModal.js
new file mode 100644
index 0000000..2085edd
--- /dev/null
+++ b/src/pages/Fabric/components/common/CodeModal.js
@@ -0,0 +1,112 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { Modal, Button, Form } from 'antd';
+import ReactAce from 'react-ace';
+// import { useIntl } from '@umijs/max';
+
+import Icon from '../icon/Icon';
+
+import 'ace-builds/src-noconflict/mode-javascript';
+import 'ace-builds/src-noconflict/theme-github';
+
+// // eslint-disable-next-line react-hooks/rules-of-hooks
+// const intl = useIntl();
+
+class CodeModal extends Component {
+	handlers = {
+		onOk: () => {
+			const { onChange } = this.props;
+			const { tempCode } = this.state;
+			onChange(tempCode);
+			this.setState({
+				visible: false,
+				code: tempCode,
+			});
+		},
+		onCancel: () => {
+			this.modalHandlers.onHide();
+		},
+		onClick: () => {
+			this.modalHandlers.onShow();
+		},
+	};
+
+	modalHandlers = {
+		onShow: () => {
+			this.setState({
+				visible: true,
+			});
+		},
+		onHide: () => {
+			this.setState({
+				visible: false,
+			});
+		},
+	};
+
+	static propTypes = {
+		value: PropTypes.any,
+		onChange: PropTypes.func,
+		form: PropTypes.any,
+	};
+
+	state = {
+		code: this.props.value,
+		tempCode: this.props.value,
+		visible: false,
+	};
+
+	UNSAFE_componentWillReceiveProps(nextProps) {
+		this.setState({
+			code: nextProps.value,
+		});
+	}
+
+	render() {
+		const { onOk, onCancel, onClick } = this.handlers;
+		const { form } = this.props;
+		const { getFieldDecorator } = form;
+		const { code, visible, tempCode } = this.state;
+		const label = (
+			<React.Fragment>
+				<span style={{ marginRight: 8 }}>{"intl.formatMessage({ id: 'fabric.common.code', defaultMessage: '$$$' })"}</span>
+				<Button onClick={onClick} shape="circle" className="rde-action-btn">
+					<Icon name="edit" />
+				</Button>
+			</React.Fragment>
+		);
+		const codeLabel = <span>Code (value, styles, animations, userProperty)</span>;
+		return (
+			<React.Fragment>
+				<Form.Item label={label} colon={false}>
+					{getFieldDecorator('trigger.code', {
+						initialValue: code || this.props.value,
+					})(<pre style={{ wordBreak: 'break-all', lineHeight: '1.2em' }}>{code}</pre>)}
+				</Form.Item>
+				<Modal onCancel={onCancel} onOk={onOk} visible={visible}>
+					<Form.Item label={codeLabel} colon={false}>
+						<ReactAce
+							ref={c => {
+								this.jsRef = c;
+							}}
+							mode="javascript"
+							theme="github"
+							width="100%"
+							height="200px"
+							defaultValue={code}
+							value={tempCode}
+							editorProps={{
+								$blockScrolling: true,
+							}}
+							onChange={value => {
+								this.setState({ tempCode: value });
+							}}
+						/>
+					</Form.Item>
+				</Modal>
+			</React.Fragment>
+		);
+	}
+}
+
+export default CodeModal;
diff --git a/src/pages/Fabric/components/common/ColorPicker.js b/src/pages/Fabric/components/common/ColorPicker.js
new file mode 100644
index 0000000..9c08a9d
--- /dev/null
+++ b/src/pages/Fabric/components/common/ColorPicker.js
@@ -0,0 +1,63 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { Popover, Button } from 'antd';
+import { SketchPicker } from 'react-color';
+
+class ColorPicker extends Component {
+	static propTypes = {
+		valueType: PropTypes.oneOf(['string', 'object']),
+	};
+
+	static defaultProps = {
+		valueType: 'string',
+	};
+
+	handlers = {
+		onChange: color => {
+			const { onChange, valueType } = this.props;
+			let newColor;
+			if (valueType === 'string') {
+				newColor = `rgba(${color.rgb.r},${color.rgb.g},${color.rgb.b},${color.rgb.a})`;
+			} else {
+				newColor = color.rgb;
+			}
+			this.setState(
+				{
+					color: newColor,
+				},
+				() => {
+					onChange(newColor);
+				},
+			);
+		},
+	};
+
+	state = {
+		color: this.props.value || 'rgba(255, 255, 255, 1)',
+	};
+
+	UNSAFE_componentWillReceiveProps(nextProps) {
+		this.setState({
+			color: nextProps.value || this.state.color,
+		});
+	}
+
+	getBackgroundColor = color => {
+		if (typeof color === 'string') {
+			return color;
+		}
+		return `rgba(${color.r},${color.g},${color.b},${color.a})`;
+	};
+
+	render() {
+		const { color } = this.state;
+		const { onChange } = this.handlers;
+		return (
+			<Popover trigger="click" placement="bottom" content={<SketchPicker color={color} onChange={onChange} />}>
+				<Button style={{ background: this.getBackgroundColor(color) }} shape="circle" />
+			</Popover>
+		);
+	}
+}
+
+export default ColorPicker;
diff --git a/src/pages/Fabric/components/common/CommonButton.js b/src/pages/Fabric/components/common/CommonButton.js
new file mode 100644
index 0000000..baf14fa
--- /dev/null
+++ b/src/pages/Fabric/components/common/CommonButton.js
@@ -0,0 +1,107 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { Tooltip, Button } from 'antd';
+import Icon from '../icon/Icon';
+
+class CommonButton extends Component {
+	static propTypes = {
+		name: PropTypes.string,
+		id: PropTypes.string,
+		style: PropTypes.object,
+		wrapperStyle: PropTypes.object,
+		wrapperClassName: PropTypes.string,
+		tooltipTitle: PropTypes.string,
+		tooltipPlacement: PropTypes.string,
+		className: PropTypes.string,
+		icon: PropTypes.string,
+		iconStyle: PropTypes.object,
+		iconClassName: PropTypes.string,
+		iconAnimation: PropTypes.string,
+		visible: PropTypes.bool,
+		shape: PropTypes.string,
+		disabled: PropTypes.bool,
+		loading: PropTypes.bool,
+		type: PropTypes.string,
+	};
+
+	static defaultProps = {
+		type: 'default',
+		visible: true,
+		disabled: false,
+		loading: false,
+	};
+
+	render() {
+		return this.props.visible ? (
+			<Tooltip title={this.props.tooltipTitle} placement={this.props.tooltipPlacement}>
+				{this.props.wrapperClassName || this.props.wrapperStyle ? (
+					<span style={this.props.wrapperStyle} className={this.props.wrapperClassName}>
+						<Button
+							id={this.props.id}
+							className={this.props.className}
+							name={this.props.name}
+							style={this.props.style}
+							shape={this.props.shape}
+							size={this.props.size}
+							onClick={this.props.onClick}
+							type={this.props.type}
+							disabled={this.props.disabled}
+							loading={this.props.loading}
+						>
+							{this.props.icon ? (
+								this.props.iconAnimation ? (
+									<Icon
+										name={this.props.icon}
+										style={this.props.iconStyle}
+										className={this.props.iconClassName}
+										animation={this.props.iconAnimation}
+									/>
+								) : (
+									<Icon
+										name={this.props.icon}
+										style={this.props.iconStyle}
+										className={this.props.iconClassName}
+									/>
+								)
+							) : null}
+							{this.props.children}
+						</Button>
+					</span>
+				) : (
+					<Button
+						id={this.props.id}
+						className={this.props.className}
+						name={this.props.name}
+						style={this.props.style}
+						shape={this.props.shape}
+						size={this.props.size}
+						onClick={this.props.onClick}
+						type={this.props.type}
+						disabled={this.props.disabled}
+						loading={this.props.loading}
+					>
+						{this.props.icon ? (
+							this.props.iconAnimation ? (
+								<Icon
+									name={this.props.icon}
+									style={this.props.iconStyle}
+									className={this.props.iconClassName}
+									animation={this.props.iconAnimation}
+								/>
+							) : (
+								<Icon
+									name={this.props.icon}
+									style={this.props.iconStyle}
+									className={this.props.iconClassName}
+								/>
+							)
+						) : null}
+						{this.props.children}
+					</Button>
+				)}
+			</Tooltip>
+		) : null;
+	}
+}
+
+export default CommonButton;
diff --git a/src/pages/Fabric/components/common/EditTable.js b/src/pages/Fabric/components/common/EditTable.js
new file mode 100644
index 0000000..abfc426
--- /dev/null
+++ b/src/pages/Fabric/components/common/EditTable.js
@@ -0,0 +1,231 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { Button, Table, Modal, Input, Form } from 'antd';
+import { useIntl } from '@umijs/max';
+
+import Icon from '../icon/Icon';
+import { Flex } from '../flex';
+
+// eslint-disable-next-line react-hooks/rules-of-hooks
+const intl = useIntl();
+
+class EditTable extends Component {
+	static propTypes = {
+		userProperty: PropTypes.object,
+		form: PropTypes.any,
+		onChange: PropTypes.func,
+	};
+
+	static defaultProps = {
+		userProperty: {},
+	};
+
+	state = {
+		userProperty: this.props.userProperty,
+		tempKey: '',
+		originKey: '',
+		tempValue: '',
+		visible: false,
+		current: 'add',
+		validateStatus: '',
+		help: '',
+	};
+
+	UNSAFE_componentWillReceiveProps(nextProps) {
+		this.setState({
+			userProperty: nextProps.userProperty || {},
+		});
+	}
+
+	getDataSource = userProperty => {
+		return Object.keys(userProperty).map(key => {
+			return {
+				key,
+				value: userProperty[key],
+			};
+		});
+	};
+
+	handlers = {
+		onOk: () => {
+			const { onChange } = this.props;
+			const { tempKey, originKey, tempValue, current, validateStatus } = this.state;
+			if (validateStatus === 'error') {
+				return;
+			}
+			if (current === 'modify') {
+				delete this.state.userProperty[originKey];
+			}
+			const userProperty = Object.assign({}, this.state.userProperty, { [tempKey]: tempValue });
+			if (onChange) {
+				onChange(userProperty);
+			}
+			this.setState({
+				visible: false,
+				userProperty,
+			});
+		},
+		onCancel: () => {
+			this.modalHandlers.onHide();
+		},
+		onChangeKey: value => {
+			let validateStatus = 'success';
+			let help = '';
+			if (
+				(this.state.current === 'add' && Object.keys(this.state.userProperty).some(p => p === value)) ||
+				(this.state.current === 'modify' && this.state.originKey !== value && this.state.userProperty[value])
+			) {
+				validateStatus = 'error';
+				help = intl.formatMessage({ id: 'fabric.validation.already-property', defaultMessage: '$$$' });
+			} else if (!value.length) {
+				validateStatus = 'error';
+				help = intl.formatMessage({ id: 'fabric.validation.enter-property', defaultMessage: '$$$' });
+			} else {
+				validateStatus = 'success';
+				help = '';
+			}
+			this.setState({
+				tempKey: value,
+				validateStatus,
+				help,
+			});
+		},
+	};
+
+	modalHandlers = {
+		onShow: () => {
+			this.setState({
+				visible: true,
+			});
+		},
+		onHide: () => {
+			this.setState({
+				visible: false,
+			});
+		},
+	};
+
+	handleAdd = () => {
+		this.setState({
+			visible: true,
+			tempKey: '',
+			tempValue: '',
+			current: 'add',
+			validateStatus: '',
+			help: '',
+		});
+	};
+
+	handleEdit = key => {
+		this.setState({
+			visible: true,
+			tempKey: key,
+			originKey: key,
+			tempValue: this.state.userProperty[key],
+			current: 'modify',
+			validateStatus: '',
+			help: '',
+		});
+	};
+
+	handleDelete = key => {
+		delete this.state.userProperty[key];
+		this.setState({ userProperty: this.state.userProperty });
+	};
+
+	handleClear = () => {
+		this.setState({ userProperty: {} });
+	};
+
+	render() {
+		const { userProperty, tempKey, tempValue, visible, validateStatus, help } = this.state;
+		const { onOk, onCancel, onChangeKey } = this.handlers;
+		const columns = [
+			{
+				title: i18n.t('common.key'),
+				dataIndex: 'key',
+			},
+			{
+				title: i18n.t('common.value'),
+				dataIndex: 'value',
+			},
+			{
+				title: '',
+				dataIndex: 'action',
+				render: (text, record) => {
+					return (
+						<div>
+							<Button
+								className="rde-action-btn"
+								shape="circle"
+								onClick={() => {
+									this.handleEdit(record.key);
+								}}
+							>
+								<Icon name="edit" />
+							</Button>
+							<Button
+								className="rde-action-btn"
+								shape="circle"
+								onClick={() => {
+									this.handleDelete(record.key);
+								}}
+							>
+								<Icon name="times" />
+							</Button>
+						</div>
+					);
+				},
+			},
+		];
+		return (
+			<Flex flexDirection="column">
+				<Flex justifyContent="flex-end">
+					<Button className="rde-action-btn" shape="circle" onClick={this.handleAdd}>
+						<Icon name="plus" />
+					</Button>
+					<Button className="rde-action-btn" shape="circle" onClick={this.handleClear}>
+						<Icon name="times" />
+					</Button>
+				</Flex>
+				<Table
+					size="small"
+					pagination={{
+						pageSize: 5,
+					}}
+					columns={columns}
+					dataSource={this.getDataSource(userProperty)}
+				/>
+				<Modal onCancel={onCancel} onOk={onOk} visible={visible}>
+					<Form.Item
+						required
+						label={i18n.t('common.key')}
+						colon={false}
+						hasFeedback
+						validateStatus={validateStatus}
+						help={help}
+					>
+						<Input
+							defaultValue={tempKey}
+							value={tempKey}
+							onChange={e => {
+								onChangeKey(e.target.value);
+							}}
+						/>
+					</Form.Item>
+					<Form.Item label={i18n.t('common.value')} colon={false}>
+						<Input
+							defaultValue={tempValue}
+							value={tempValue}
+							onChange={e => {
+								this.setState({ tempValue: e.target.value });
+							}}
+						/>
+					</Form.Item>
+				</Modal>
+			</Flex>
+		);
+	}
+}
+
+export default EditTable;
diff --git a/src/pages/Fabric/components/common/FileUpload.js b/src/pages/Fabric/components/common/FileUpload.js
new file mode 100644
index 0000000..8dd57a7
--- /dev/null
+++ b/src/pages/Fabric/components/common/FileUpload.js
@@ -0,0 +1,84 @@
+import { Icon, Upload, message } from 'antd';
+import PropTypes from 'prop-types';
+import React, { Component } from 'react';
+
+const { Dragger } = Upload;
+
+class FileUpload extends Component {
+	static propTypes = {
+		onChange: PropTypes.func,
+		limit: PropTypes.number,
+		accept: PropTypes.string,
+	};
+
+	static defaultProps = {
+		limit: 5,
+	};
+
+	state = {
+		fileList: this.props.value ? [this.props.value] : [],
+	};
+
+	UNSAFE_componentWillReceiveProps(nextProps) {
+		this.setState({
+			fileList: nextProps.value ? [nextProps.value] : [],
+		});
+	}
+
+	render() {
+		const { accept, limit } = this.props;
+		const { fileList } = this.state;
+		const props = {
+			accept,
+			name: 'file',
+			multiple: false,
+			onChange: info => {
+				const isLimit = info.file.size / 1024 / 1024 < limit;
+				if (!isLimit) {
+					message.error(`Limited to ${limit}MB or less`);
+					return false;
+				}
+				const { onChange } = this.props;
+				onChange(info.file);
+			},
+			onRemove: file => {
+				this.setState(
+					({ fileList }) => {
+						const index = fileList.indexOf(file);
+						const newFileList = fileList.slice();
+						newFileList.splice(index, 1);
+						return {
+							fileList: newFileList,
+						};
+					},
+					() => {
+						const { onChange } = this.props;
+						onChange(null);
+					},
+				);
+			},
+			beforeUpload: file => {
+				const isLimit = file.size / 1024 / 1024 < limit;
+				if (!isLimit) {
+					return false;
+				}
+				this.setState({
+					fileList: [file],
+				});
+				return false;
+			},
+			fileList,
+		};
+		return (
+			<Dragger {...props}>
+				<p className="ant-upload-drag-icon">
+					<Icon type="inbox" />
+				</p>
+				<p className="ant-upload-text">Click or drag file to this area to upload</p>
+				<p className="ant-upload-hint">{`Support for a single upload. Limited to ${limit}MB or less`}</p>
+			</Dragger>
+		);
+	}
+}
+
+export default FileUpload;
diff --git a/src/pages/Fabric/components/common/InputHtml.js b/src/pages/Fabric/components/common/InputHtml.js
new file mode 100644
index 0000000..74881fc
--- /dev/null
+++ b/src/pages/Fabric/components/common/InputHtml.js
@@ -0,0 +1,96 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import ReactAce from 'react-ace';
+import {debounce } from 'lodash';
+
+import 'ace-builds/src-noconflict/mode-html';
+import 'ace-builds/src-noconflict/theme-github';
+
+class InputJson extends Component {
+	static propTypes = {
+		defaultValue: PropTypes.string,
+		value: PropTypes.string,
+		width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+		height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+		onChange: PropTypes.func,
+		onValidate: PropTypes.func,
+		disabled: PropTypes.bool,
+	};
+
+	static defaultProps = {
+		width: '100%',
+		height: '200px',
+		disabled: false,
+	};
+
+	state = {
+		text: this.props.value || '',
+	};
+
+	componentDidMount() {
+		this.debouncedValidate = debounce(errors => {
+			const { onValidate } = this.props;
+			if (onValidate) {
+				onValidate(errors);
+			}
+			const { onChange } = this.props;
+			if (onChange) {
+				onChange(this.state.text);
+			}
+		}, 200);
+	}
+
+	UNSAFE_componentWillReceiveProps(nextProps) {
+		if (nextProps.value !== this.props.value) {
+			this.setState({
+				text: nextProps.value,
+			});
+		}
+	}
+
+	onChange = (value, e) => {
+		if (this.debouncedValidate) {
+			this.debouncedValidate();
+		}
+		this.setState({
+			text: value,
+		});
+	};
+
+	onValidate = annotations => {
+		if (annotations.length) {
+			const errors = annotations
+				.filter(annotation => annotation.type === 'error')
+				.map(annotation => {
+					return new Error(`${annotation.row}:${annotation.column} ${annotation.text} error`);
+				});
+			this.debouncedValidate(errors);
+		}
+	};
+
+	render() {
+		const { defaultValue, width, height, disabled } = this.props;
+		const { text } = this.state;
+		return (
+			<ReactAce
+				ref={c => {
+					this.aceRef = c;
+				}}
+				mode="html"
+				theme="github"
+				width={width}
+				height={height}
+				defaultValue={defaultValue || text}
+				value={text}
+				editorProps={{
+					$blockScrolling: true,
+				}}
+				onChange={this.onChange}
+				onValidate={this.onValidate}
+				readOnly={disabled}
+			/>
+		);
+	}
+}
+
+export default InputJson;
diff --git a/src/pages/Fabric/components/common/InputJson.js b/src/pages/Fabric/components/common/InputJson.js
new file mode 100644
index 0000000..5761ce2
--- /dev/null
+++ b/src/pages/Fabric/components/common/InputJson.js
@@ -0,0 +1,96 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import ReactAce from 'react-ace';
+import {debounce} from 'lodash';
+
+import 'ace-builds/src-noconflict/mode-json';
+import 'ace-builds/src-noconflict/theme-github';
+
+class InputJson extends Component {
+	static propTypes = {
+		defaultValue: PropTypes.string,
+		value: PropTypes.string,
+		width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+		height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+		onChange: PropTypes.func,
+		onValidate: PropTypes.func,
+		disabled: PropTypes.bool,
+	};
+
+	static defaultProps = {
+		width: '100%',
+		height: '200px',
+		disabled: false,
+	};
+
+	state = {
+		text: this.props.value || '',
+	};
+
+	componentDidMount() {
+		this.debouncedValidate = debounce(errors => {
+			const { onValidate } = this.props;
+			if (onValidate) {
+				onValidate(errors);
+			}
+			const { onChange } = this.props;
+			if (onChange) {
+				onChange(this.state.text);
+			}
+		}, 200);
+	}
+
+	UNSAFE_componentWillReceiveProps(nextProps) {
+		if (nextProps.value !== this.props.value) {
+			this.setState({
+				text: nextProps.value,
+			});
+		}
+	}
+
+	onChange = (value, e) => {
+		if (this.debouncedValidate) {
+			this.debouncedValidate();
+		}
+		this.setState({
+			text: value,
+		});
+	};
+
+	onValidate = annotations => {
+		if (annotations.length) {
+			const errors = annotations
+				.filter(annotation => annotation.type === 'error')
+				.map(annotation => {
+					return new Error(`${annotation.row}:${annotation.column} ${annotation.text} error`);
+				});
+			this.debouncedValidate(errors);
+		}
+	};
+
+	render() {
+		const { defaultValue, width, height, disabled } = this.props;
+		const { text } = this.state;
+		return (
+			<ReactAce
+				ref={c => {
+					this.aceRef = c;
+				}}
+				mode="json"
+				theme="github"
+				width={width}
+				height={height}
+				defaultValue={defaultValue || text}
+				value={text}
+				editorProps={{
+					$blockScrolling: true,
+				}}
+				onChange={this.onChange}
+				onValidate={this.onValidate}
+				readOnly={disabled}
+			/>
+		);
+	}
+}
+
+export default InputJson;
diff --git a/src/pages/Fabric/components/common/InputScript.js b/src/pages/Fabric/components/common/InputScript.js
new file mode 100644
index 0000000..ab662f0
--- /dev/null
+++ b/src/pages/Fabric/components/common/InputScript.js
@@ -0,0 +1,96 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import ReactAce from 'react-ace';
+import {debounce } from 'lodash';
+
+import 'ace-builds/src-noconflict/mode-javascript';
+import 'ace-builds/src-noconflict/theme-github';
+
+class InputScript extends Component {
+	static propTypes = {
+		defaultValue: PropTypes.string,
+		value: PropTypes.string,
+		width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+		height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+		onChange: PropTypes.func,
+		onValidate: PropTypes.func,
+		disabled: PropTypes.bool,
+	};
+
+	static defaultProps = {
+		width: '100%',
+		height: '200px',
+		disabled: false,
+	};
+
+	state = {
+		text: this.props.value || '',
+	};
+
+	componentDidMount() {
+		this.debouncedValidate = debounce(errors => {
+			const { onValidate } = this.props;
+			if (onValidate) {
+				onValidate(errors);
+			}
+			const { onChange } = this.props;
+			if (onChange) {
+				onChange(this.state.text);
+			}
+		}, 200);
+	}
+
+	UNSAFE_componentWillReceiveProps(nextProps) {
+		if (nextProps.value !== this.props.value) {
+			this.setState({
+				text: nextProps.value,
+			});
+		}
+	}
+
+	onChange = (value, e) => {
+		if (this.debouncedValidate) {
+			this.debouncedValidate();
+		}
+		this.setState({
+			text: value,
+		});
+	};
+
+	onValidate = annotations => {
+		if (annotations.length) {
+			const errors = annotations
+				.filter(annotation => annotation.type === 'error')
+				.map(annotation => {
+					return new Error(`${annotation.row}:${annotation.column} ${annotation.text} error`);
+				});
+			this.debouncedValidate(errors);
+		}
+	};
+
+	render() {
+		const { defaultValue, width, height, dsiabled } = this.props;
+		const { text } = this.state;
+		return (
+			<ReactAce
+				ref={c => {
+					this.aceRef = c;
+				}}
+				mode="javascript"
+				theme="github"
+				width={width}
+				height={height}
+				defaultValue={defaultValue || text}
+				value={text}
+				editorProps={{
+					$blockScrolling: true,
+				}}
+				onChange={this.onChange}
+				onValidate={this.onValidate}
+				readOnly={dsiabled}
+			/>
+		);
+	}
+}
+
+export default InputScript;
diff --git a/src/pages/Fabric/components/common/InputTemplate.js b/src/pages/Fabric/components/common/InputTemplate.js
new file mode 100644
index 0000000..f31d7a7
--- /dev/null
+++ b/src/pages/Fabric/components/common/InputTemplate.js
@@ -0,0 +1,87 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import ReactAce from 'react-ace';
+
+import 'ace-builds/src-noconflict/mode-handlebars';
+import 'ace-builds/src-noconflict/theme-github';
+
+class InputTemplate extends Component {
+	static propTypes = {
+		defaultValue: PropTypes.string,
+		value: PropTypes.string,
+		width: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+		height: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
+		showLineNumbers: PropTypes.bool,
+		newLineMode: PropTypes.bool,
+		disabled: PropTypes.bool,
+	};
+
+	static defaultProps = {
+		width: '100%',
+		height: '200px',
+		showLineNumbers: true,
+		newLineMode: true,
+		disabled: false,
+	};
+
+	state = {
+		text: this.props.value || '',
+	};
+
+	componentDidMount() {
+		if (!this.props.newLineMode) {
+			this.aceRef.editor.keyBinding.addKeyboardHandler((data, hashId, keyString, keyCode, e) => {
+				if (keyCode === 13) {
+					return { command: 'null' }; // do nothing
+				}
+			});
+		}
+	}
+
+	UNSAFE_componentWillReceiveProps(nextProps) {
+		this.setState({
+			text: nextProps.value,
+		});
+	}
+
+	onChange = value => {
+		const { onChange } = this.props;
+		if (onChange) {
+			onChange(value);
+		}
+		this.setState({
+			text: value,
+		});
+	};
+
+	render() {
+		const { defaultValue, width, height, showLineNumbers, newLineMode, disabled } = this.props;
+		const { text } = this.state;
+		return (
+			<ReactAce
+				ref={c => {
+					this.aceRef = c;
+				}}
+				mode="handlebars"
+				theme="github"
+				width={width}
+				height={height}
+				defaultValue={defaultValue || text}
+				value={text}
+				editorProps={{
+					$blockScrolling: true,
+				}}
+				onChange={this.onChange}
+				onValidate={this.onValidate}
+				maxLines={!newLineMode ? 1 : null}
+				setOptions={{
+					showLineNumbers,
+					newLineMode,
+					readOnly: disabled,
+				}}
+			/>
+		);
+	}
+}
+
+export default InputTemplate;
diff --git a/src/pages/Fabric/components/common/SVGModal.js b/src/pages/Fabric/components/common/SVGModal.js
new file mode 100644
index 0000000..4b5aeae
--- /dev/null
+++ b/src/pages/Fabric/components/common/SVGModal.js
@@ -0,0 +1,103 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { Modal, Form, Radio } from 'antd';
+// import { useIntl } from '@umijs/max';
+
+import { InputHtml } from '.';
+import FileUpload from './FileUpload';
+
+class SVGModal extends Component {
+	static propTypes = {
+		onOk: PropTypes.func.isRequired,
+		onCancel: PropTypes.func,
+		visible: PropTypes.bool.isRequired,
+	};
+
+	state = {
+		loadType: 'file',
+		visible: false,
+	};
+
+	UNSAFE_componentWillReceiveProps(nextProps) {
+		if (nextProps.visible !== this.props.visible) {
+			this.setState({
+				visible: nextProps.visible,
+			});
+		}
+	}
+
+	handleChangeSvgType = e => {
+		this.props.form.resetFields();
+		this.setState({
+			loadType: e.target.value,
+		});
+	};
+
+	handleOk = () => {
+		const { form, onOk } = this.props;
+		form.validateFields((err, values) => {
+			if (err) {
+				return;
+			}
+			if (values.svg instanceof Blob) {
+				const reader = new FileReader();
+				reader.readAsDataURL(values.svg);
+				reader.onload = () => {
+					onOk({ ...values, svg: reader.result });
+				};
+			} else {
+				onOk(values);
+			}
+		});
+	};
+
+	handleCancel = () => {
+		const { onCancel } = this.props;
+		if (onCancel) {
+			onCancel();
+			return;
+		}
+		this.setState({
+			visible: false,
+		});
+	};
+
+	render() {
+		const { form } = this.props;
+		const { loadType, visible } = this.state;
+		return (
+			<Modal
+				title={"intl.formatMessage({ id: 'fabric.imagemap.svg.add-svg', defaultMessage: '$$$' })" }
+				closable
+				onCancel={this.handleCancel}
+				onOk={this.handleOk}
+				visible={visible}
+			>
+				<Form colon={false}>
+					<Form.Item label={ "intl.formatMessage({ id: 'fabric.common.type', defaultMessage: '$$$' })"}>
+						{form.getFieldDecorator('loadType', {
+							initialValue: loadType,
+						})(
+							<Radio.Group onChange={this.handleChangeSvgType}>
+								<Radio.Button value="file">{ "intl.formatMessage({ id: 'fabric.common.file', defaultMessage: '$$$' })"}</Radio.Button>
+								<Radio.Button value="svg">{ "intl.formatMessage({ id: 'fabric.common.svg', defaultMessage: '$$$' })"}</Radio.Button>
+							</Radio.Group>,
+						)}
+					</Form.Item>
+					<Form.Item label={"intl.formatMessage({ id: loadType === 'svg' ? 'fabric.common.svg' : 'fabric.common.file', defaultMessage: '$$$' })"}>
+						{form.getFieldDecorator('svg', {
+							rules: [
+								{
+									required: true,
+									message: "intl.formatMessage({ id: 'fabric.validation.enter-property', defaultMessage: '$$$' })",
+								},
+							],
+						})(loadType === 'svg' ? <InputHtml /> : <FileUpload accept=".svg" />)}
+					</Form.Item>
+				</Form>
+			</Modal>
+		);
+	}
+}
+
+export default Form.create()(SVGModal);
diff --git a/src/pages/Fabric/components/common/Scrollbar.js b/src/pages/Fabric/components/common/Scrollbar.js
new file mode 100644
index 0000000..c91833e
--- /dev/null
+++ b/src/pages/Fabric/components/common/Scrollbar.js
@@ -0,0 +1,12 @@
+import React, { Component } from 'react';
+import { Scrollbars } from 'react-custom-scrollbars';
+
+class Scrollbar extends Component {
+	renderTrack = props => <div {...props} className="rde-track-vertical" />;
+
+	render() {
+		return <Scrollbars renderTrackVertical={this.renderTrack}>{this.props.children}</Scrollbars>;
+	}
+}
+
+export default Scrollbar;
diff --git a/src/pages/Fabric/components/common/UrlModal.js b/src/pages/Fabric/components/common/UrlModal.js
new file mode 100644
index 0000000..6601b0e
--- /dev/null
+++ b/src/pages/Fabric/components/common/UrlModal.js
@@ -0,0 +1,104 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { Form, Modal, Button, Input } from 'antd';
+import { useIntl } from '@umijs/max';
+
+
+import Icon from '../icon/Icon';
+
+// eslint-disable-next-line react-hooks/rules-of-hooks
+const intl = useIntl();
+
+
+class UrlModal extends Component {
+	handlers = {
+		onOk: () => {
+			const { onChange } = this.props;
+			const { tempUrl } = this.state;
+			onChange(tempUrl);
+			this.setState({
+				visible: false,
+				url: tempUrl,
+			});
+		},
+		onCancel: () => {
+			this.modalHandlers.onHide();
+		},
+		onClick: () => {
+			this.modalHandlers.onShow();
+		},
+	};
+
+	modalHandlers = {
+		onShow: () => {
+			this.setState({
+				visible: true,
+			});
+		},
+		onHide: () => {
+			this.setState({
+				visible: false,
+			});
+		},
+	};
+
+	static propTypes = {
+		value: PropTypes.any,
+		onChange: PropTypes.func,
+		form: PropTypes.any,
+	};
+
+	state = {
+		url: this.props.value || '',
+		tempUrl: '',
+		visible: false,
+	};
+
+	UNSAFE_componentWillReceiveProps(nextProps) {
+		this.setState({
+			url: nextProps.value || '',
+		});
+	}
+
+	render() {
+		const { onOk, onCancel, onClick } = this.handlers;
+		const { form } = this.props;
+		const { getFieldDecorator } = form;
+		const { url, visible } = this.state;
+		const label = (
+			<React.Fragment>
+				<span style={{ marginRight: 8 }}>{intl.formatMessage({ id: 'fabric.common.url', defaultMessage: '$$$' })}</span>
+				<Button onClick={onClick} shape="circle" className="rde-action-btn">
+					<Icon name="edit" />
+				</Button>
+			</React.Fragment>
+		);
+		return (
+			<React.Fragment>
+				<Form.Item label={label} colon={false}>
+					{getFieldDecorator('url', {
+						rules: [
+							{
+								required: true,
+								message: '请输入url',
+							},
+						],
+						initialValue: url || '',
+					})(<span style={{ wordBreak: 'break-all' }}>{url}</span>)}
+				</Form.Item>
+				<Modal onCancel={onCancel} onOk={onOk} visible={visible}>
+					<Form.Item label={intl.formatMessage({ id: 'fabric.common.url', defaultMessage: '$$$' })} colon={false}>
+						<Input
+							defaultValue={url}
+							onChange={e => {
+								this.setState({ tempUrl: e.target.value });
+							}}
+						/>
+					</Form.Item>
+				</Modal>
+			</React.Fragment>
+		);
+	}
+}
+
+export default UrlModal;
diff --git a/src/pages/Fabric/components/common/index.js b/src/pages/Fabric/components/common/index.js
new file mode 100644
index 0000000..0847517
--- /dev/null
+++ b/src/pages/Fabric/components/common/index.js
@@ -0,0 +1,21 @@
+export { default as CodeModal } from './CodeModal';
+
+export { default as ColorPicker } from './ColorPicker';
+
+export { default as CommonButton } from './CommonButton';
+
+export { default as FileUpload } from './FileUpload';
+
+export { default as InputJson } from './InputJson';
+
+export { default as InputScript } from './InputScript';
+
+export { default as InputTemplate } from './InputTemplate';
+
+export { default as InputHtml } from './InputHtml';
+
+export { default as Scrollbar } from './Scrollbar';
+
+export { default as UrlModal } from './UrlModal';
+
+export { default as SVGModal } from './SVGModal';
diff --git a/src/pages/Fabric/components/exception/NoExistWordException.js b/src/pages/Fabric/components/exception/NoExistWordException.js
new file mode 100644
index 0000000..da70277
--- /dev/null
+++ b/src/pages/Fabric/components/exception/NoExistWordException.js
@@ -0,0 +1,10 @@
+export default class NoExistWordException {
+	constructor() {
+		this.message = 'Does not exist word.';
+		this.name = 'NoExistWordException';
+	}
+
+	toString() {
+		return `${this.name}: ${this.message}`;
+	}
+}
diff --git a/src/pages/Fabric/components/exception/UnsafetyWordException.js b/src/pages/Fabric/components/exception/UnsafetyWordException.js
new file mode 100644
index 0000000..f648bf6
--- /dev/null
+++ b/src/pages/Fabric/components/exception/UnsafetyWordException.js
@@ -0,0 +1,10 @@
+export default class UnsafetyWordException {
+	constructor() {
+		this.message = 'Includes unsafety word.';
+		this.name = 'UnsafetyWordException';
+	}
+
+	toString() {
+		return `${this.name}: ${this.message}`;
+	}
+}
diff --git a/src/pages/Fabric/components/flex/Flex.tsx b/src/pages/Fabric/components/flex/Flex.tsx
new file mode 100644
index 0000000..951d052
--- /dev/null
+++ b/src/pages/Fabric/components/flex/Flex.tsx
@@ -0,0 +1,78 @@
+import React, { Component } from 'react';
+import Item from './Item';
+
+export interface BoxProps extends React.HTMLAttributes<any> {
+	display?: 'flex' | 'inline-flex';
+	flexDirection?: 'column-reverse' | 'column' | 'row-reverse' | 'row';
+	flexWrap?: 'nowrap' | 'wrap-reverse' | 'wrap';
+	flexFlow?: string;
+	justifyContent?: 'center' | 'flex-end' | 'flex-start' | 'space-around' | 'space-between' | 'space-evenly';
+	alignItems?: 'baseline' | 'center' | 'flex-end' | 'flex-start' | 'stretch';
+	alignContent?: 'center' | 'flex-end' | 'flex-start' | 'space-around' | 'space-between' | 'stretch';
+	alignSelf?: 'baseline' | 'center' | 'flex-end' | 'flex-start' | 'stretch';
+	order?: number;
+	flexGrow?: number | string;
+	flexShrink?: number | string;
+	flexBasis?: number | string;
+	flex?: number | string;
+}
+
+class Flex extends Component<BoxProps> {
+	static Item: typeof Item;
+
+	render() {
+		const {
+			flexDirection,
+			flexWrap,
+			flexFlow,
+			justifyContent,
+			alignItems,
+			alignContent,
+			alignSelf,
+			order,
+			flexGrow,
+			flexShrink,
+			flexBasis,
+			flex,
+			style,
+			children,
+			...other
+		} = this.props;
+		const newStyle = Object.assign(
+			{},
+			{
+				display: 'flex',
+				flexDirection,
+				flexWrap,
+				flexFlow,
+				justifyContent,
+				alignItems,
+				alignContent,
+				alignSelf,
+				order,
+				flexGrow,
+				flexShrink,
+				flexBasis,
+				flex,
+			},
+			style,
+		) as any;
+		return (
+			<div
+				style={Object.keys(newStyle).reduce((prev, key) => {
+					if (newStyle[key]) {
+						return Object.assign(prev, { [key]: newStyle[key] });
+					}
+					return prev;
+				}, {})}
+				{...other}
+			>
+				{children}
+			</div>
+		);
+	}
+}
+
+Flex.Item = Item;
+
+export default Flex;
diff --git a/src/pages/Fabric/components/flex/Item.tsx b/src/pages/Fabric/components/flex/Item.tsx
new file mode 100644
index 0000000..248d17d
--- /dev/null
+++ b/src/pages/Fabric/components/flex/Item.tsx
@@ -0,0 +1,41 @@
+import React from 'react';
+
+export interface ItemProps extends React.HTMLAttributes<any> {
+	alignSelf?: 'baseline' | 'center' | 'flex-end' | 'flex-start' | 'stretch';
+	order?: number;
+	flexGrow?: number | string;
+	flexShrink?: number | string;
+	flexBasis?: number | string;
+	flex?: number | string;
+}
+
+const Item: React.SFC<ItemProps> = props => {
+	const { alignSelf, order, flexGrow, flexShrink, flexBasis, flex, style, children, ...other } = props;
+	const newStyle = Object.assign(
+		{},
+		{
+			alignSelf,
+			order,
+			flexGrow,
+			flexShrink,
+			flexBasis,
+			flex,
+		},
+		style,
+	) as any;
+	return (
+		<div
+			style={Object.keys(newStyle).reduce((prev, key) => {
+				if (newStyle[key]) {
+					return Object.assign(prev, { [key]: newStyle[key] });
+				}
+				return prev;
+			}, {})}
+			{...other}
+		>
+			{children}
+		</div>
+	);
+};
+
+export default Item;
diff --git a/src/pages/Fabric/components/flex/index.tsx b/src/pages/Fabric/components/flex/index.tsx
new file mode 100644
index 0000000..509a045
--- /dev/null
+++ b/src/pages/Fabric/components/flex/index.tsx
@@ -0,0 +1 @@
+export { default as Flex } from './Flex';
diff --git a/src/pages/Fabric/components/font/fonts.js b/src/pages/Fabric/components/font/fonts.js
new file mode 100644
index 0000000..198e05e
--- /dev/null
+++ b/src/pages/Fabric/components/font/fonts.js
@@ -0,0 +1,54 @@
+const fonts = {
+	default: [
+		{ name: 'Arial', type: 'sans-serif', ref: 'default' },
+		{ name: 'Arial Black', type: 'sans-serif', ref: 'default' },
+		{ name: 'Helvetica', type: 'sans-serif', ref: 'default' },
+		{ name: 'Verdana', type: 'sans-serif', ref: 'default' },
+		{ name: 'Trebuchet MS', type: 'sans-serif', ref: 'default' },
+		{ name: 'Tahoma', type: 'sans-serif', ref: 'default' },
+		{ name: 'MS Sans Serif', type: 'sans-serif', ref: 'default' },
+		{ name: 'Symbol', type: 'sans-serif', ref: 'default' },
+		{ name: 'Times', type: 'serif', ref: 'default' },
+		{ name: 'Times New Roman', type: 'serif', ref: 'default' },
+		{ name: 'MS Serif', type: 'serif', ref: 'default' },
+		{ name: 'New York', type: 'serif', ref: 'default' },
+		{ name: 'Palatino Linotype', type: 'serif', ref: 'default' },
+		{ name: 'Book Antiqua', type: 'serif', ref: 'default' },
+		{ name: 'Georgia', type: 'serif', ref: 'default' },
+		{ name: 'Courier New', type: 'monospace', ref: 'default' },
+		{ name: 'Courier', type: 'monospace' },
+		{ name: 'Comic Sans MS', type: 'cursive', ref: 'default' },
+		{ name: 'Lucida Console', type: 'cursive', ref: 'default' },
+		{ name: 'Impact', type: 'fantasy', ref: 'default' },
+	],
+	google: [
+		{ name: 'Abril Fatface', type: 'display', ref: 'google' },
+		{ name: 'Alegreya Sans', type: 'sans-serif', ref: 'google' },
+		{ name: 'Alegreya', type: 'serif', ref: 'google' },
+		{ name: 'Amatic SC', type: 'handwriting', ref: 'google' },
+		{ name: 'EB Garamond', type: 'serif', ref: 'google' },
+		{ name: 'Fjalla One', type: 'serif', ref: 'google' },
+		{ name: 'Josefin Sans', type: 'sans-serif', ref: 'google' },
+		{ name: 'Lato', type: 'sans-serif', ref: 'google' },
+		{ name: 'Merriweather', type: 'serif', ref: 'google' },
+		{ name: 'Montserrat', type: 'sans-serif', ref: 'google' },
+		{ name: 'Noto Sans', type: 'sans-serif', ref: 'google' },
+		{ name: 'Open Sans Condensed', type: 'sans-serif', ref: 'google' },
+		{ name: 'Open Sans', type: 'sans-serif', ref: 'google' },
+		{ name: 'Oswald', type: 'sans-serif', ref: 'google' },
+		{ name: 'Playfair Display', type: 'serif', ref: 'google' },
+		{ name: 'PT Sans Narrow', type: 'sans-serif', ref: 'google' },
+		{ name: 'PT Sans', type: 'sans-serif', ref: 'google' },
+		{ name: 'Raleway', type: 'sans-serif', ref: 'google' },
+		{ name: 'Roboto Mono', type: 'monospace', ref: 'google' },
+		{ name: 'Roboto Slab', type: 'serif', ref: 'google' },
+		{ name: 'Roboto', type: 'sans-serif', ref: 'google' },
+		{ name: 'Source Sans Pro', type: 'serif', ref: 'google' },
+	],
+};
+
+export default {
+	getFonts() {
+		return fonts;
+	},
+};
diff --git a/src/pages/Fabric/components/font/main.js b/src/pages/Fabric/components/font/main.js
new file mode 100644
index 0000000..4c5756b
--- /dev/null
+++ b/src/pages/Fabric/components/font/main.js
@@ -0,0 +1,260 @@
+'use strict';
+
+Object.defineProperty(exports, "__esModule", {
+    value: true
+});
+
+var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
+
+var _fs = require('fs');
+
+var _fs2 = _interopRequireDefault(_fs);
+
+var _path = require('path');
+
+var _path2 = _interopRequireDefault(_path);
+
+var _ttfinfo = require('ttfinfo');
+
+var _ttfinfo2 = _interopRequireDefault(_ttfinfo);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+
+function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
+
+var getPlatform = function getPlatform() {
+    return process.platform === 'darwin' ? 'osx' : /win/.test(process.platform) ? 'windows' : 'linux';
+};
+
+var recGetFile = function recGetFile(target) {
+    var stats = void 0;
+    try {
+        stats = _fs2.default.statSync(target);
+    } catch (e) {
+        // console.error(e);
+        return [];
+    }
+    if (stats.isDirectory()) {
+        var files = void 0;
+        try {
+            files = _fs2.default.readdirSync(target);
+        } catch (e) {
+            console.error(e);
+        }
+        return files.reduce(function (arr, f) {
+            return arr.concat(recGetFile(_path2.default.join(target, f)));
+        }, []);
+    } else {
+        var ext = _path2.default.extname(target).toLowerCase();
+        if (ext === '.ttf' || ext === '.otf' || ext === '.ttc' || ext === '.dfont') {
+            return [target];
+        } else {
+            return [];
+        }
+    }
+};
+
+var filterReadableFonts = function filterReadableFonts(arr) {
+    return arr.filter(function (f) {
+        var extension = _path2.default.extname(f).toLowerCase();
+        return extension === '.ttf' || extension === '.otf';
+    });
+};
+
+var tableToObj = function tableToObj(obj, file, systemFont) {
+    return {
+        family: obj['1'],
+        subFamily: obj['2'],
+        postscript: obj['6'],
+        file: file,
+        systemFont: systemFont
+    };
+};
+
+var extendedReducer = function extendedReducer(m, _ref) {
+    var family = _ref.family,
+        subFamily = _ref.subFamily,
+        file = _ref.file,
+        postscript = _ref.postscript,
+        systemFont = _ref.systemFont;
+
+    if (m.has(family)) {
+        var origFont = m.get(family);
+        return m.set(family, _extends({}, origFont, {
+            systemFont: origFont.systemFont === false ? false : systemFont,
+            subFamilies: [].concat(_toConsumableArray(origFont.subFamilies), [subFamily]),
+            files: _extends({}, origFont.files, _defineProperty({}, subFamily, file)),
+            postscriptNames: _extends({}, origFont.postscriptNames, _defineProperty({}, subFamily, postscript))
+        }));
+    } else {
+        return m.set(family, {
+            family: family,
+            systemFont: systemFont,
+            subFamilies: [subFamily],
+            files: _defineProperty({}, subFamily, file),
+            postscriptNames: _defineProperty({}, subFamily, postscript)
+        });
+    }
+};
+
+var SystemFonts = function SystemFonts() {
+    var _this = this;
+
+    var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+    var _options$ignoreSystem = options.ignoreSystemFonts,
+        ignoreSystemFonts = _options$ignoreSystem === undefined ? false : _options$ignoreSystem,
+        _options$customDirs = options.customDirs,
+        customDirs = _options$customDirs === undefined ? [] : _options$customDirs;
+
+
+    if (!Array.isArray(customDirs)) {
+        throw new Error('customDirs must be an array of folder path strings');
+    }
+
+    var customDirSet = new Set(customDirs);
+    var customFontFiles = new Set();
+
+    var getFontFiles = function getFontFiles() {
+
+        var directories = [];
+
+        if (customDirs.length > 0) {
+            directories = [].concat(_toConsumableArray(customDirs));
+        }
+
+        var platform = getPlatform();
+        if (platform === 'osx') {
+            var home = process.env.HOME;
+            directories = [].concat(_toConsumableArray(directories), [_path2.default.join(home, 'Library', 'Fonts'), _path2.default.join('/', 'Library', 'Fonts'), _path2.default.join('/', 'System', 'Library', 'Fonts')]);
+        } else if (platform === 'windows') {
+            var winDir = process.env.windir || process.env.WINDIR;
+            directories = [].concat(_toConsumableArray(directories), [_path2.default.join(winDir, 'Fonts')]);
+        } else {
+            // some flavor of Linux, most likely
+            var _home = process.env.HOME;
+            directories = [].concat(_toConsumableArray(directories), [_path2.default.join(_home, '.fonts'), _path2.default.join(_home, '.local', 'share', 'fonts'), _path2.default.join('/', 'usr', 'share', 'fonts'), _path2.default.join('/', 'usr', 'local', 'share', 'fonts')]);
+        }
+
+        return directories.reduce(function (arr, d) {
+            var files = recGetFile(d);
+            if (customDirSet.has(d)) {
+                files.forEach(function (f) {
+                    return customFontFiles.add(f);
+                });
+            }
+            return arr.concat(files);
+        }, []);
+    };
+
+    var allFontFiles = getFontFiles();
+
+    // this list includes all TTF, OTF, OTC, and DFONT files
+    this.getAllFontFilesSync = function () {
+        return [].concat(_toConsumableArray(allFontFiles));
+    };
+
+    var fontFiles = filterReadableFonts(allFontFiles);
+
+    // this list includes all TTF and OTF files (these are the ones we parse in this lib)
+    this.getFontFilesSync = function () {
+        return [].concat(_toConsumableArray(fontFiles));
+    };
+
+    this.getFontsExtended = function () {
+        return new Promise(function (resolve, reject) {
+
+            var promiseList = [];
+
+            var filteredFontFiles = !ignoreSystemFonts ? [].concat(_toConsumableArray(fontFiles)) : fontFiles.filter(function (f) {
+                return customFontFiles.has(f);
+            });
+
+            filteredFontFiles.forEach(function (file, i) {
+                promiseList.push(new Promise(function (resolve1) {
+                    _ttfinfo2.default.get(file, function (err, fontMeta) {
+                        if (!fontMeta) {
+                            resolve1(null);
+                        } else {
+                            resolve1(tableToObj(fontMeta.tables.name, file, !customFontFiles.has(file)));
+                        }
+                    });
+                }));
+            });
+            Promise.all(promiseList).then(function (res) {
+
+                var names = res.filter(function (data) {
+                    return data ? true : false;
+                }).reduce(extendedReducer, new Map());
+
+                var namesArr = [].concat(_toConsumableArray(names.values())).sort(function (a, b) {
+                    return a.family.localeCompare(b.family);
+                });
+
+                resolve(namesArr);
+            }, function (err) {
+                return reject(err);
+            });
+        });
+    };
+
+    this.getFontsExtendedSync = function () {
+
+        var filteredFontFiles = !ignoreSystemFonts ? [].concat(_toConsumableArray(fontFiles)) : fontFiles.filter(function (f) {
+            return customFontFiles.has(f);
+        });
+
+        var names = filteredFontFiles.reduce(function (arr, file) {
+            var data = void 0;
+            try {
+                data = _ttfinfo2.default.getSync(file);
+            } catch (e) {
+                return arr;
+            }
+            return arr.concat([tableToObj(data.tables.name, file, !customFontFiles.has(file))]);
+        }, []).filter(function (data) {
+            return data ? true : false;
+        }).reduce(extendedReducer, new Map());
+
+        var namesArr = [].concat(_toConsumableArray(names.values())).sort(function (a, b) {
+            return a.family.localeCompare(b.family);
+        });
+
+        return namesArr;
+    };
+
+    this.getFonts = function () {
+        return new Promise(function (resolve, reject) {
+            _this.getFontsExtended().then(function (fontList) {
+                var names = fontList.map(function (_ref2) {
+                    var family = _ref2.family;
+                    return family;
+                }).reduce(function (obj, name) {
+                    obj[name] = 1;
+                    return obj;
+                }, {});
+                resolve(Object.keys(names).sort(function (a, b) {
+                    return a.localeCompare(b);
+                }));
+            }).catch(function (err) {
+                return reject(err);
+            });
+        });
+    };
+
+    this.getFontsSync = function () {
+        var names = _this.getFontsExtendedSync().map(function (_ref3) {
+            var family = _ref3.family;
+            return family;
+        }).reduce(function (obj, name) {
+            obj[name] = 1;
+            return obj;
+        }, {});
+        return Object.keys(names).sort(function (a, b) {
+            return a.localeCompare(b);
+        });
+    };
+};
+
+exports.default = SystemFonts;
\ No newline at end of file
diff --git a/src/pages/Fabric/components/help/ShortcutHelp.tsx b/src/pages/Fabric/components/help/ShortcutHelp.tsx
new file mode 100644
index 0000000..65e0a03
--- /dev/null
+++ b/src/pages/Fabric/components/help/ShortcutHelp.tsx
@@ -0,0 +1,118 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-12-05 11:41:37
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-12-05 16:20:46
+ * @FilePath: \react-adpro-fabric\src\pages\Fabric\components\help\ShortcutHelp.tsx
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+import React from 'react';
+
+// eslint-disable-next-line react-hooks/rules-of-hooks
+
+const shortcuts = [
+  [
+    { key: ['esc'], description: 'fabric.shortcut.escape' },
+    { key: ['h'], description: 'fabric.shortcut.h' },
+    { key: ['q'], description: 'fabric.shortcut.q' },
+    { key: ['w'], description: 'fabric.shortcut.w' },
+    { key: ['o'], description: 'fabric.shortcut.o' },
+    { key: ['p'], description: 'fabric.shortcut.p' },
+    { key: ['+'], description: 'fabric.shortcut.plus' },
+    {
+      key: ['-'],
+      description: 'fabric.shortcut.minus',
+    },
+    {
+      key: ['↑'],
+      description: 'fabric.shortcut.arrow-up',
+    },
+    {
+      key: ['↓'],
+      description: 'fabric.shortcut.arrow-down',
+    },
+    {
+      key: ['←'],
+      description: 'fabric.shortcut.arrow-left',
+    },
+    {
+      key: ['→'],
+      description: 'fabric.shortcut.arrow-right',
+    },
+  ],
+  [
+    {
+      key: ['delete | backspace'],
+      description: 'fabric.shortcut.delete',
+    },
+    {
+      key: ['ctrl | cmd', 'a'],
+      description: 'fabric.shortcut.ctrl-a',
+    },
+    {
+      key: ['ctrl | cmd', 'c'],
+      description: 'fabric.shortcut.ctrl-c',
+    },
+    {
+      key: ['ctrl | cmd', 'v'],
+      description: 'fabric.shortcut.ctrl-v' ,
+    },
+    {
+      key: ['ctrl | cmd', 'x'],
+      description: 'fabric.shortcut.ctrl-x',
+    },
+    {
+      key: ['ctrl | cmd', 'z'],
+      description: 'fabric.shortcut.ctrl-z',
+    },
+    {
+      key: ['ctrl | cmd', 'y'],
+      description: 'fabric.shortcut.ctrl-y',
+    },
+    {
+      key: ['alt', 'mouse left'],
+      description: 'fabric.shortcut.alt-mouse-left',
+    },
+    {
+      key: ['shift', 'mouse left'],
+      description: 'fabric.shortcut.shfit-mouse-left',
+    },
+    {
+      key: ['mouse left'],
+      description: 'fabric.shortcut.mouse-left',
+    },
+    {
+      key: ['mouse right'],
+      description: 'fabric.shortcut.mouse-right',
+    },
+  ],
+];
+
+const ShortcutHelp: React.FC = () => {
+  return (
+    <div className="rde-shortcut-help">
+      {shortcuts.map((column, idx) => {
+        return (
+          <ul className="rde-shortcut-help-list" key={idx}>
+            {column.map((shortcut) => {
+              return (
+                <li key={shortcut.key.toString()} className="rde-shortcut-help-key">
+                  {shortcut.key.map((key) => {
+                    return (
+                      <kbd key={key} className="rde-shortcut-help-key-unit">
+                        <span>{key}</span>
+                      </kbd>
+                    );
+                  })}
+                  <span className="rde-shortcut-help-key-def">{shortcut.description}</span>
+                </li>
+              );
+            })}
+          </ul>
+        );
+      })}
+    </div>
+  );
+};
+
+export default ShortcutHelp;
diff --git a/src/pages/Fabric/components/help/index.tsx b/src/pages/Fabric/components/help/index.tsx
new file mode 100644
index 0000000..db15f64
--- /dev/null
+++ b/src/pages/Fabric/components/help/index.tsx
@@ -0,0 +1 @@
+export { default as ShortcutHelp } from './ShortcutHelp';
diff --git a/src/pages/Fabric/components/icon/Icon.js b/src/pages/Fabric/components/icon/Icon.js
new file mode 100644
index 0000000..647f0a0
--- /dev/null
+++ b/src/pages/Fabric/components/icon/Icon.js
@@ -0,0 +1,62 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+
+class Icon extends Component {
+    static propTypes = {
+        name: PropTypes.string,
+        color: PropTypes.string,
+        style: PropTypes.object,
+        className: PropTypes.string,
+        size: PropTypes.number,
+        innerIcon: PropTypes.string,
+        innerColor: PropTypes.string,
+        innerClassName: PropTypes.string,
+        innerSize: PropTypes.number,
+        prefix: PropTypes.string,
+        onClick: PropTypes.func,
+    };
+
+    static defaultProps = {
+        name: null,
+        color: '',
+        className: '',
+        size: 1,
+        innerIcon: null,
+        innerColor: '',
+        innerClassName: '',
+        innerSize: 1,
+        prefix: 'fas',
+    };
+
+    getIconHtml = (prefix, name, className, size, color) => {
+        const iconClassName = `${prefix} fa-${name} ${className}`;
+        const iconStyle = Object.assign({}, this.props.style, {
+            fontSize: `${size}em`,
+            color,
+        });
+        return (<i className={iconClassName} style={iconStyle} onClick={this.props.onClick} />);
+    }
+
+    render() {
+        const { color, size, className, innerIcon, innerColor, innerSize, innerClassName, prefix } = this.props;
+        let { name } = this.props;
+        if (name.startsWith('icon-')) {
+            name = name.substr('icon-'.length);
+        }
+        const iconHtml = this.getIconHtml(prefix, name, className, size, color);
+        let innerIconHtml = null;
+        if (innerIcon) {
+            innerIconHtml = this.getIconHtml(innerIcon, innerClassName, innerSize, innerColor);
+        } else {
+            return iconHtml;
+        }
+        return (
+            <span className="fa-stack">
+                {iconHtml}
+                {innerIconHtml}
+            </span>
+        );
+    }
+}
+
+export default Icon;
diff --git a/src/pages/Fabric/components/icon/IconChooser.js b/src/pages/Fabric/components/icon/IconChooser.js
new file mode 100644
index 0000000..e99b652
--- /dev/null
+++ b/src/pages/Fabric/components/icon/IconChooser.js
@@ -0,0 +1,161 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import {debounce } from 'lodash';
+import { Button, Modal, Form, Col, Row, Input } from 'antd';
+// import { useIntl } from '@umijs/max';
+
+import Icon from './Icon';
+import icons from '../../libs/fontawesome-5.2.0/metadata/icons.json';
+// const intl = useIntl();
+
+class IconChooser extends Component {
+	handlers = {
+		onOk: () => {
+			const { icon } = this.state;
+			const { onChange } = this.props;
+			if (onChange) {
+				onChange(icon);
+			}
+			this.setState({
+				visible: false,
+			});
+		},
+		onCancel: () => {
+			this.modalHandlers.onHide();
+		},
+		onClick: () => {
+			this.modalHandlers.onShow();
+		},
+		onClickIcon: icon => {
+			this.setState(
+				{
+					icon,
+				},
+				() => {
+					const { onChange } = this.props;
+					if (onChange) {
+						onChange(icon);
+					}
+					this.modalHandlers.onHide();
+				},
+			);
+		},
+		onSearch: debounce(value => {
+			this.setState({
+				textSearch: value,
+			});
+		}, 500),
+	};
+
+	modalHandlers = {
+		onShow: () => {
+			this.setState({
+				visible: true,
+			});
+		},
+		onHide: () => {
+			this.setState({
+				visible: false,
+			});
+		},
+	};
+
+	static propTypes = {
+		onChange: PropTypes.func,
+		icon: PropTypes.any,
+	};
+
+	static defaultProps = {
+		icon: { 'map-marker-alt': icons['map-marker-alt'] },
+	};
+
+	state = {
+		icon: this.props.icon,
+		textSearch: '',
+		visible: false,
+	};
+
+	UNSAFE_componentWillReceiveProps(nextProps) {
+		this.setState({
+			icon: nextProps.icon || this.state.icon,
+		});
+	}
+
+	getPrefix = style => {
+		let prefix = 'fas';
+		if (style === 'brands') {
+			prefix = 'fab';
+		} else if (style === 'regular') {
+			prefix = 'far';
+		}
+		return prefix;
+	};
+
+	getIcons = textSearch => {
+		const lowerCase = textSearch.toLowerCase();
+		return Object.keys(icons)
+			.filter(icon => icon.includes(lowerCase) || icons[icon].search.terms.some(term => term.includes(lowerCase)))
+			.map(icon => ({ [icon]: icons[icon] }));
+	};
+
+	render() {
+		const { onOk, onCancel, onClick, onClickIcon, onSearch } = this.handlers;
+		const { icon, visible, textSearch } = this.state;
+		const label = (
+			<React.Fragment>
+				<span style={{ marginRight: 8 }}>{"intl.formatMessage({ id: 'fabric.common.icon', defaultMessage: '$$$' })"}</span>
+				<Icon name={Object.keys(icon)[0]} prefix={this.getPrefix(icon[Object.keys(icon)[0]].styles[0])} />
+			</React.Fragment>
+		);
+		const filteredIcons = this.getIcons(textSearch);
+		const filteredIconsLength = filteredIcons.length;
+		const title = (
+			<div style={{ padding: '0 24px' }}>
+				<Input
+					onChange={e => {
+						onSearch(e.target.value);
+					}}
+					placeholder={"intl.formatMessage({ id: 'fabric.imagemap.marker.search-icon', defaultMessage: '$$$' })"}
+				/>
+			</div>
+		);
+		return (
+			<React.Fragment>
+				<Form.Item label={label} colon={false}>
+					<Button onClick={onClick}>{ "intl.formatMessage({ id: 'fabric.imagemap.marker.choose-icon', defaultMessage: '$$$' })"}</Button>
+				</Form.Item>
+				<Modal
+					onOk={onOk}
+					onCancel={onCancel}
+					width="80%"
+					visible={visible}
+					title={title}
+					bodyStyle={{ margin: 16, overflowY: 'auto', height: '600px' }}
+				>
+					<Row>
+						{filteredIcons.map(ic => {
+							const name = Object.keys(ic)[0];
+							const metadata = ic[name];
+							const prefix = this.getPrefix(metadata.styles[0]);
+							return (
+								<Col
+									onClick={onClickIcon.bind(this, ic)}
+									key={name}
+									span={4}
+									className="rde-icon-container"
+								>
+									<div className="rde-icon-top">
+										<Icon name={name} size={3} prefix={prefix} />
+									</div>
+									<div className="rde-icon-bottom">{name}</div>
+								</Col>
+							);
+						})}
+					</Row>
+				</Modal>
+			</React.Fragment>
+		);
+	}
+}
+
+export default IconChooser;
diff --git a/src/pages/Fabric/components/layout/Content.tsx b/src/pages/Fabric/components/layout/Content.tsx
new file mode 100644
index 0000000..b1be75e
--- /dev/null
+++ b/src/pages/Fabric/components/layout/Content.tsx
@@ -0,0 +1,54 @@
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
+import { Layout, Spin } from 'antd';
+
+interface IProps {
+	title?: React.ReactNode;
+	leftSider?: React.ReactNode;
+	content?: React.ReactNode;
+	rightSider?: React.ReactNode;
+	className?: string;
+	loading?: boolean;
+}
+
+class Content extends Component<IProps> {
+	static propTypes = {
+		title: PropTypes.any,
+		leftSider: PropTypes.any,
+		content: PropTypes.any,
+		rightSider: PropTypes.any,
+		className: PropTypes.string,
+		loading: PropTypes.bool,
+	};
+
+	static defaultProps = {
+		className: 'rde-content-layout-main',
+		loading: false,
+	};
+
+	render() {
+		const { title, leftSider, content, rightSider, className, loading, children } = this.props;
+		return (
+			<Spin spinning={loading}>
+				<Layout className="rde-content-layout">
+					{title}
+					<Layout
+						style={{
+							overflowY: 'auto',
+							overflowX: 'hidden',
+							minHeight: `calc(100vh - ${title ? 98 : 60}px)`,
+							height: `calc(100vh - ${title ? 98 : 60}px)`,
+						}}
+						className={className}
+					>
+						{leftSider}
+						{content || children}
+						{rightSider}
+					</Layout>
+				</Layout>
+			</Spin>
+		);
+	}
+}
+
+export default Content;
diff --git a/src/pages/Fabric/components/layout/Title.tsx b/src/pages/Fabric/components/layout/Title.tsx
new file mode 100644
index 0000000..9d5a5ba
--- /dev/null
+++ b/src/pages/Fabric/components/layout/Title.tsx
@@ -0,0 +1,127 @@
+import { Button, Menu, Modal, Tooltip } from 'antd';
+import { ClickParam } from 'antd/lib/menu';
+import { useIntl } from '@umijs/max';
+import React, { Component } from 'react';
+import { Flex } from '../flex';
+import { ShortcutHelp } from '../help';
+import Icon from '../icon/Icon';
+
+// eslint-disable-next-line react-hooks/rules-of-hooks
+const intl = useIntl();
+interface IProps {
+	onChangeEditor: (param: ClickParam) => void;
+	currentEditor: string;
+}
+
+class Title extends Component<IProps> {
+	state = {
+		visible: false,
+	};
+
+	componentDidMount() {
+		if (globalThis) {
+			(globalThis.adsbygoogle = globalThis.adsbygoogle || []).push({});
+		}
+	}
+
+	handlers = {
+		goGithub: () => {
+			window.open('https://github.com/salgum1114/react-design-editor');
+		},
+		goDocs: () => {
+			window.open('https://salgum1114.github.io/react-design-editor/docs');
+		},
+		showHelp: () => {
+			this.setState({
+				visible: true,
+			});
+		},
+	};
+
+	render() {
+		const { visible } = this.state;
+		return (
+			<Flex
+				style={{ background: 'linear-gradient(141deg,#23303e,#404040 51%,#23303e 75%)' }}
+				flexWrap="wrap"
+				flex="1"
+				alignItems="center"
+			>
+				<Flex style={{ marginLeft: 8 }} flex="0 1 auto">
+					<span style={{ color: '#fff', fontSize: 24, fontWeight: 500 }}>React Design Editor</span>
+					<Tooltip title={intl.formatMessage({ id: 'fabric.action.go-github', defaultMessage: '$$$' })} overlayStyle={{ fontSize: 16 }}>
+						<Button
+							className="rde-action-btn"
+							style={{
+								color: 'white',
+							}}
+							shape="circle"
+							size="large"
+							onClick={this.handlers.goGithub}
+						>
+							<Icon name="github" prefix="fab" size={1.5} />
+						</Button>
+					</Tooltip>
+					<Tooltip title={intl.formatMessage({ id: 'fabric.action.go-docs', defaultMessage: '$$$' })} overlayStyle={{ fontSize: 16 }}>
+						<Button
+							className="rde-action-btn"
+							style={{
+								color: 'white',
+							}}
+							shape="circle"
+							size="large"
+							onClick={this.handlers.goDocs}
+						>
+							<Icon name="book" prefix="fas" size={1.5} />
+						</Button>
+					</Tooltip>
+					<Tooltip title={intl.formatMessage({ id: 'fabric.action.shortcut-help', defaultMessage: '$$$' })} overlayStyle={{ fontSize: 16 }}>
+						<Button
+							className="rde-action-btn"
+							style={{
+								color: 'white',
+							}}
+							shape="circle"
+							size="large"
+							onClick={this.handlers.showHelp}
+						>
+							<Icon name="question" prefix="fas" size={1.5} />
+						</Button>
+					</Tooltip>
+				</Flex>
+				<Flex style={{ marginLeft: 88 }}>
+					<Menu
+						mode="horizontal"
+						theme="dark"
+						style={{ background: 'transparent', fontSize: '16px' }}
+						onClick={this.props.onChangeEditor}
+						selectedKeys={[this.props.currentEditor]}
+					>
+						<Menu.Item key="imagemap" style={{ color: '#fff' }}>
+						{intl.formatMessage({ id: 'fabric.imagemap.imagemap', defaultMessage: '$$$' })}
+						</Menu.Item>
+					</Menu>
+				</Flex>
+				<Flex flex="1" justifyContent="flex-end">
+					<ins
+						className="adsbygoogle"
+						style={{ display: 'inline-block', width: 600, height: 60 }}
+						data-ad-client="ca-pub-8569372752842198"
+						data-ad-slot="5790685139"
+					/>
+				</Flex>
+				<Modal
+					visible={visible}
+					onCancel={() => this.setState({ visible: false })}
+					closable={true}
+					footer={null}
+					width="50%"
+				>
+					<ShortcutHelp />
+				</Modal>
+			</Flex>
+		);
+	}
+}
+
+export default Title;
diff --git a/src/pages/Fabric/components/layout/index.tsx b/src/pages/Fabric/components/layout/index.tsx
new file mode 100644
index 0000000..6589b74
--- /dev/null
+++ b/src/pages/Fabric/components/layout/index.tsx
@@ -0,0 +1,3 @@
+export { default as Title } from './Title';
+
+export { default as Content } from './Content';
diff --git a/src/pages/Fabric/components/sandbox/SandBox.js b/src/pages/Fabric/components/sandbox/SandBox.js
new file mode 100644
index 0000000..4382e37
--- /dev/null
+++ b/src/pages/Fabric/components/sandbox/SandBox.js
@@ -0,0 +1,59 @@
+import UnsafetyWordException from '../exception/UnsafetyWordException';
+import NoExistWordException from '../exception/NoExistWordException';
+
+const excludeWords = [
+	'window',
+	'Window',
+	'alert',
+	'console',
+	'this',
+	'eval',
+	'new',
+	'function',
+	'Function',
+	'document',
+];
+
+const includeWords = ['return'];
+
+const parameters = ['value', 'animations', 'styles', 'userProperty'];
+
+class SandBox {
+	/**
+	 *Creates an instance of SandBox.
+	 * @param {{ excludeWords: string[], includeWords: string[] }} params
+	 * @memberof SandBox
+	 */
+	constructor(params = {}) {
+		this.excludeWords = params.excludeWords || excludeWords;
+		this.includeWords = params.includeWords || includeWords;
+	}
+
+	// eslint-disable-next-line class-methods-use-this
+	verify(code) {
+		const newCode = code.toString();
+		if (this.excludeWords.some(word => code.includes(word))) {
+			throw new UnsafetyWordException();
+		}
+		if (!this.includeWords.some(word => code.includes(word))) {
+			throw new NoExistWordException();
+		}
+		// eslint-disable-next-line no-new-func
+		return new Function(parameters, `"use strict"; ${newCode}`);
+	}
+
+	// eslint-disable-next-line consistent-return
+	compile(code) {
+		try {
+			return this.verify(code);
+		} catch (error) {
+			if (error.toString) {
+				console.error(error.toString());
+			} else {
+				console.error(error.message);
+			}
+		}
+	}
+}
+
+export default SandBox;
diff --git a/src/pages/Fabric/components/wireframe/Wireframe.js b/src/pages/Fabric/components/wireframe/Wireframe.js
new file mode 100644
index 0000000..c09f70c
--- /dev/null
+++ b/src/pages/Fabric/components/wireframe/Wireframe.js
@@ -0,0 +1,27 @@
+import React, { Component } from 'react';
+import { Flex } from '../flex';
+
+class Wireframe extends Component {
+	constructor(props) {
+		super(props);
+		this.container = React.createRef();
+	}
+
+	render() {
+		const {
+			canvasRef: { current },
+		} = this.props;
+		if (current) {
+			return (
+				<Flex flexDirection="column">
+					<div ref={this.container} flex="0 1 auto" style={{ margin: 8 }}>
+						<img width="144" height="150" src={current.handlers.exportPNG()} />
+					</div>
+				</Flex>
+			);
+		}
+		return null;
+	}
+}
+
+export default Wireframe;
diff --git a/src/pages/Hidden.tsx b/src/pages/Hidden.tsx
new file mode 100644
index 0000000..43e64d7
--- /dev/null
+++ b/src/pages/Hidden.tsx
@@ -0,0 +1,18 @@
+import { history } from '@umijs/max';
+import { Button, Result } from 'antd';
+import React from 'react';
+
+const HiddenPage: React.FC = () => (
+  <Result
+    status="403"
+    title="陆续开放中"
+    subTitle="功能陆续开放中,敬请期待!"
+    extra={
+      <Button type="primary" onClick={() => history.push('/welcome')}>
+        返回主页
+      </Button>
+    }
+  />
+);
+
+export default HiddenPage;
diff --git a/src/pages/ShowInfo.tsx b/src/pages/ShowInfo.tsx
new file mode 100644
index 0000000..26ed250
--- /dev/null
+++ b/src/pages/ShowInfo.tsx
@@ -0,0 +1,18 @@
+import { history } from '@umijs/max';
+import { Button, Result } from 'antd';
+import React from 'react';
+
+const ShowInfo: React.FC = () => (
+  <Result
+    status="404"
+    title="40411111"
+    subTitle="Sorry, the page you visited does not exist."
+    extra={
+      <Button type="primary" onClick={() => history.push('/')}>
+        Back Home1111
+      </Button>
+    }
+  />
+);
+
+export default ShowInfo;
diff --git a/src/requestErrorConfig.ts b/src/requestErrorConfig.ts
new file mode 100644
index 0000000..a9f3e77
--- /dev/null
+++ b/src/requestErrorConfig.ts
@@ -0,0 +1,116 @@
+import type { RequestOptions } from '@@/plugin-request/request';
+import type { RequestConfig } from '@umijs/max';
+import { message, notification } from 'antd';
+
+// 错误处理方案: 错误类型
+enum ErrorShowType {
+  SILENT = 0,
+  WARN_MESSAGE = 1,
+  ERROR_MESSAGE = 2,
+  NOTIFICATION = 3,
+  REDIRECT = 9,
+}
+// 与后端约定的响应数据格式
+interface ResponseStructure {
+  success: boolean;
+  data: any;
+  errorCode?: number;
+  errorMessage?: string;
+  msg?: string;
+  showType?: ErrorShowType;
+}
+
+/**
+ * @name 错误处理
+ * pro 自带的错误处理, 可以在这里做自己的改动
+ * @doc https://umijs.org/docs/max/request#配置
+ */
+export const errorConfig: RequestConfig = {
+  // 错误处理: umi@3 的错误处理方案。
+  errorConfig: {
+    // 错误抛出
+    errorThrower: (res) => {
+      let { success, data, errorCode, errorMessage, showType,msg } =
+        res as unknown as ResponseStructure;
+      if (msg && !errorMessage) {
+        errorMessage = msg
+      }
+      if (!success) {
+        const error: any = new Error(errorMessage);
+        error.name = 'BizError';
+        error.info = { errorCode, errorMessage, showType, data };
+        throw error; // 抛出自制的错误
+      }
+    },
+    // 错误接收及处理
+    errorHandler: (error: any, opts: any) => {
+      if (opts?.skipErrorHandler) throw error;
+      // 我们的 errorThrower 抛出的错误。
+      if (error.name === 'BizError') {
+        const errorInfo: ResponseStructure | undefined = error.info;
+        if (errorInfo) {
+          let { errorMessage, errorCode ,msg} = errorInfo;
+          if (msg && !errorMessage) {
+            errorMessage = msg
+          }
+          switch (errorInfo.showType) {
+            case ErrorShowType.SILENT:
+              // do nothing
+              break;
+            case ErrorShowType.WARN_MESSAGE:
+              message.warning(errorMessage);
+              break;
+            case ErrorShowType.ERROR_MESSAGE:
+              message.error(errorMessage);
+              break;
+            case ErrorShowType.NOTIFICATION:
+              notification.open({
+                description: errorMessage,
+                message: errorCode,
+              });
+              break;
+            case ErrorShowType.REDIRECT:
+              // TODO: redirect
+              break;
+            default:
+              message.error(errorMessage);
+          }
+        }
+      } else if (error.response) {
+        // Axios 的错误
+        // 请求成功发出且服务器也响应了状态码,但状态代码超出了 2xx 的范围
+        message.error(`Response status:${error.response.status}`);
+      } else if (error.request) {
+        // 请求已经成功发起,但没有收到响应
+        // \`error.request\` 在浏览器中是 XMLHttpRequest 的实例,
+        // 而在node.js中是 http.ClientRequest 的实例
+        message.error('None response! Please retry.');
+      } else {
+        // 发送请求时出了点问题
+        message.error('Request error, please retry.');
+      }
+    },
+  },
+
+  // 请求拦截器
+  requestInterceptors: [
+    (config: RequestOptions) => {
+      // 拦截请求配置,进行个性化处理。
+      const url = config?.url?.concat('?token = 123');
+      return { ...config, url };
+    },
+  ],
+
+  // 响应拦截器
+  responseInterceptors: [
+    (response) => {
+      // 拦截响应数据,进行个性化处理
+      const { data } = response as unknown as ResponseStructure;
+
+      if (data?.success === false) {
+        message.error('请求失败!');
+      }
+      return response;
+    },
+  ],
+};
diff --git a/src/service-worker.js b/src/service-worker.js
new file mode 100644
index 0000000..b86726c
--- /dev/null
+++ b/src/service-worker.js
@@ -0,0 +1,65 @@
+/* eslint-disable no-restricted-globals */
+/* eslint-disable no-underscore-dangle */
+/* globals workbox */
+workbox.core.setCacheNameDetails({
+  prefix: 'antd-pro',
+  suffix: 'v5',
+});
+// Control all opened tabs ASAP
+workbox.clientsClaim();
+
+/**
+ * Use precaching list generated by workbox in build process.
+ * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.precaching
+ */
+workbox.precaching.precacheAndRoute(self.__precacheManifest || []);
+
+/**
+ * Register a navigation route.
+ * https://developers.google.com/web/tools/workbox/modules/workbox-routing#how_to_register_a_navigation_route
+ */
+workbox.routing.registerNavigationRoute('/index.html');
+
+/**
+ * Use runtime cache:
+ * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.routing#.registerRoute
+ *
+ * Workbox provides all common caching strategies including CacheFirst, NetworkFirst etc.
+ * https://developers.google.com/web/tools/workbox/reference-docs/latest/workbox.strategies
+ */
+
+/** Handle API requests */
+workbox.routing.registerRoute(/\/api\//, workbox.strategies.networkFirst());
+
+/** Handle third party requests */
+workbox.routing.registerRoute(
+  /^https:\/\/gw\.alipayobjects\.com\//,
+  workbox.strategies.networkFirst(),
+);
+workbox.routing.registerRoute(
+  /^https:\/\/cdnjs\.cloudflare\.com\//,
+  workbox.strategies.networkFirst(),
+);
+workbox.routing.registerRoute(/\/color.less/, workbox.strategies.networkFirst());
+
+/** Response to client after skipping waiting with MessageChannel */
+addEventListener('message', (event) => {
+  const replyPort = event.ports[0];
+  const message = event.data;
+  if (replyPort && message && message.type === 'skip-waiting') {
+    event.waitUntil(
+      self.skipWaiting().then(
+        () => {
+          replyPort.postMessage({
+            error: null,
+          });
+        },
+        (error) => {
+          replyPort.postMessage({
+            error,
+          });
+        },
+      ),
+    );
+  }
+});
diff --git a/src/services/analysis/ActionDetection.ts b/src/services/analysis/ActionDetection.ts
new file mode 100644
index 0000000..8aff5de
--- /dev/null
+++ b/src/services/analysis/ActionDetection.ts
@@ -0,0 +1,21 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 分页获取ActionDetection列表 POST /action_detection/getActionDetectionList */
+export async function postActionDetectionGetActionDetectionList(
+  body: API.SearchActionDetectionParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/action_detection/getActionDetectionList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
diff --git a/src/services/analysis/index.ts b/src/services/analysis/index.ts
new file mode 100644
index 0000000..5e89982
--- /dev/null
+++ b/src/services/analysis/index.ts
@@ -0,0 +1,8 @@
+// @ts-ignore
+/* eslint-disable */
+// API 更新时间:
+// API 唯一标识:
+import * as ActionDetection from './ActionDetection';
+export default {
+  ActionDetection,
+};
diff --git a/src/services/analysis/typings.d.ts b/src/services/analysis/typings.d.ts
new file mode 100644
index 0000000..18fed1b
--- /dev/null
+++ b/src/services/analysis/typings.d.ts
@@ -0,0 +1,45 @@
+declare namespace API {
+  type ActionDetection = {
+    id?: string;
+    source?: string;
+    configFile?: string;
+    type?: string;
+    remark?: string;
+    time?: number;
+    imagesPath?: string;
+  };
+
+  type PageResult = {
+    list?: any;
+    page?: number;
+    pageSize?: number;
+    total?: number;
+  };
+
+  type Response = {
+    code?: number;
+    data?: any;
+    msg?: string;
+    success?: boolean;
+  };
+
+  type SearchActionDetectionParams = {
+    configFile?: string;
+    createTime?: string;
+    /** 排序方式:升序false(默认)|降序true */
+    desc?: boolean;
+    id?: number;
+    /** 关键字 */
+    keyword?: string;
+    /** 排序 */
+    orderKey?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+    remark?: string;
+    source?: string;
+    type?: string;
+    updateTime?: string;
+  };
+}
diff --git a/src/services/ant-design-pro/api.ts b/src/services/ant-design-pro/api.ts
new file mode 100644
index 0000000..5c75e93
--- /dev/null
+++ b/src/services/ant-design-pro/api.ts
@@ -0,0 +1,124 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 获取当前的用户 GET /api/currentUser */
+export async function currentUser(options?: { [key: string]: any }) {
+  return request<{
+    data: API.CurrentUser;
+  }>('/api/currentUser', {
+    method: 'GET',
+    ...(options || {}),
+  });
+}
+
+/** 退出登录接口 POST /api/login/outLogin */
+export async function outLogin(options?: { [key: string]: any }) {
+  return request<Record<string, any>>('/api/login/outLogin', {
+    method: 'POST',
+    ...(options || {}),
+  });
+}
+
+/** 登录接口 POST /api/login/account */
+export async function login(body: API.LoginParams, options?: { [key: string]: any }) {
+  return request<API.LoginResult>('/api/login/account', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 此处后端没有提供注释 GET /api/notices */
+export async function getNotices(options?: { [key: string]: any }) {
+  return request<API.NoticeIconList>('/api/notices', {
+    method: 'GET',
+    ...(options || {}),
+  });
+}
+
+/** 获取规则列表 GET /api/rule */
+export async function rule(
+  params: {
+    // query
+    /** 当前的页码 */
+    current?: number;
+    /** 页面的容量 */
+    pageSize?: number;
+  },
+  options?: { [key: string]: any },
+) {
+  return request<API.RuleList>('/api/rule', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
+
+/** 新建规则 PUT /api/rule */
+export async function updateRule(options?: { [key: string]: any }) {
+  return request<API.RuleListItem>('/api/rule', {
+    method: 'PUT',
+    ...(options || {}),
+  });
+}
+
+/** 新建规则 POST /api/rule */
+export async function addRule(options?: { [key: string]: any }) {
+  return request<API.RuleListItem>('/api/rule', {
+    method: 'POST',
+    ...(options || {}),
+  });
+}
+
+/** 删除规则 DELETE /api/rule */
+export async function removeRule(options?: { [key: string]: any }) {
+  return request<Record<string, any>>('/api/rule', {
+    method: 'DELETE',
+    ...(options || {}),
+  });
+}
+
+/**fabric模型 /api/v1/mock/fabricModels/1 */
+// export async function fetchFabricModelsById(options?: { [key: string]: any }) {
+//   return request<Record<string, any>>('/api/v1/mock/fabricModels/1', {
+//     method: 'GET',
+//     ...(options || {}),
+//   });
+// }
+
+
+export async function fetchFabricModelsById(
+  params: {
+    id?: number;
+  },
+  options?: { [key: string]: any },
+) {
+  return request<Record<string, any>>('/api/v1/mock/fabricModels', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
+
+export async function fetchFabricModelsById2(
+  params: {
+    id?: number;
+  },
+  options?: { [key: string]: any },
+) {
+  return request<Record<string, any>>('/api/v1/mock/fabricModels2', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
\ No newline at end of file
diff --git a/src/services/ant-design-pro/index.ts b/src/services/ant-design-pro/index.ts
new file mode 100644
index 0000000..1ac489f
--- /dev/null
+++ b/src/services/ant-design-pro/index.ts
@@ -0,0 +1,10 @@
+// @ts-ignore
+/* eslint-disable */
+// API 更新时间:
+// API 唯一标识:
+import * as api from './api';
+import * as login from './login';
+export default {
+  api,
+  login,
+};
diff --git a/src/services/ant-design-pro/login.ts b/src/services/ant-design-pro/login.ts
new file mode 100644
index 0000000..8871ed8
--- /dev/null
+++ b/src/services/ant-design-pro/login.ts
@@ -0,0 +1,21 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 发送验证码 POST /api/login/captcha */
+export async function getFakeCaptcha(
+  params: {
+    // query
+    /** 手机号 */
+    phone?: string;
+  },
+  options?: { [key: string]: any },
+) {
+  return request<API.FakeCaptcha>('/api/login/captcha', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
diff --git a/src/services/ant-design-pro/typings.d.ts b/src/services/ant-design-pro/typings.d.ts
new file mode 100644
index 0000000..13e5a68
--- /dev/null
+++ b/src/services/ant-design-pro/typings.d.ts
@@ -0,0 +1,101 @@
+// @ts-ignore
+/* eslint-disable */
+
+declare namespace API {
+  type CurrentUser = {
+    name?: string;
+    avatar?: string;
+    userid?: string;
+    email?: string;
+    signature?: string;
+    title?: string;
+    group?: string;
+    tags?: { key?: string; label?: string }[];
+    notifyCount?: number;
+    unreadCount?: number;
+    country?: string;
+    access?: string;
+    geographic?: {
+      province?: { label?: string; key?: string };
+      city?: { label?: string; key?: string };
+    };
+    address?: string;
+    phone?: string;
+  };
+
+  type LoginResult = {
+    status?: string;
+    type?: string;
+    currentAuthority?: string;
+  };
+
+  type PageParams = {
+    current?: number;
+    pageSize?: number;
+  };
+
+  type RuleListItem = {
+    key?: number;
+    disabled?: boolean;
+    href?: string;
+    avatar?: string;
+    name?: string;
+    owner?: string;
+    desc?: string;
+    callNo?: number;
+    status?: number;
+    updatedAt?: string;
+    createdAt?: string;
+    progress?: number;
+  };
+
+  type RuleList = {
+    data?: RuleListItem[];
+    /** 列表的内容总数 */
+    total?: number;
+    success?: boolean;
+  };
+
+  type FakeCaptcha = {
+    code?: number;
+    status?: string;
+  };
+
+  type LoginParams = {
+    username?: string;
+    password?: string;
+    autoLogin?: boolean;
+    type?: string;
+  };
+
+  type ErrorResponse = {
+    /** 业务约定的错误码 */
+    errorCode: string;
+    /** 业务上的错误信息 */
+    errorMessage?: string;
+    /** 业务上的请求是否成功 */
+    success?: boolean;
+  };
+
+  type NoticeIconList = {
+    data?: NoticeIconItem[];
+    /** 列表的内容总数 */
+    total?: number;
+    success?: boolean;
+  };
+
+  type NoticeIconItemType = 'notification' | 'message' | 'event';
+
+  type NoticeIconItem = {
+    id?: string;
+    extra?: string;
+    key?: string;
+    read?: boolean;
+    avatar?: string;
+    title?: string;
+    status?: string;
+    datetime?: string;
+    description?: string;
+    type?: NoticeIconItemType;
+  };
+}
diff --git a/src/services/device/Device.ts b/src/services/device/Device.ts
new file mode 100644
index 0000000..8258ff5
--- /dev/null
+++ b/src/services/device/Device.ts
@@ -0,0 +1,171 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建基础Device POST /device/createDevice */
+export async function postDeviceCreateDevice(body: API.Device, options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/device/createDevice`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除Device DELETE /device/deleteDevice */
+export async function deleteDeviceDeleteDevice(body: API.Device, options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/device/deleteDevice`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除选中Device DELETE /device/deleteDeviceByIds */
+export async function deleteDeviceDeleteDeviceByIds(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/device/deleteDeviceByIds`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 根据id获取Device POST /device/getDeviceById */
+export async function postDeviceGetDeviceById(body: API.GetById, options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.DeviceDeviceResponse }>(
+    `/api/v1/device/getDeviceById`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获取Device外键列表 POST /device/getDeviceFkSelect */
+export async function postDeviceGetDeviceFkSelect(
+  body: API.GetFkSelect,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.FkResult; msg?: string }>(
+    `/api/v1/device/getDeviceFkSelect`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取Device列表 POST /device/getDeviceList */
+export async function postDeviceGetDeviceList(
+  body: API.SearchDeviceParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/device/getDeviceList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获得Device名称列表 POST /device/getDeviceNames */
+export async function postDeviceGetDeviceNames(body: API.IdsReq, options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.NamesResult; msg?: string }>(
+    `/api/v1/device/getDeviceNames`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 修改基础Device PUT /device/updateDevice */
+export async function putDeviceUpdateDevice(body: API.Device, options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/device/updateDevice`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 关闭rtsp摄像头驱动 POST /device/closeRtspCamera */
+export async function postDeviceCloseRtspCamera(
+    body: API.KillRtspReq,
+    options?: { [key: string]: any },
+) {
+    return request<API.Response & { msg?: string }>(`/api/v1/device/closeRtspCamera`, {
+        method: 'POST',
+        headers: {
+            'Content-Type': 'application/json',
+        },
+        data: body,
+        ...(options || {}),
+    });
+}
+
+
+/** 打开rtsp摄像头驱动 POST /device/openRtspCamera */
+export async function postDeviceOpenRtspCamera(
+    body: API.RtspReq,
+    options?: { [key: string]: any },
+) {
+    return request<API.Response & { data?: API.RtspRes; msg?: string }>(
+        `/api/v1/device/openRtspCamera`,
+        {
+            method: 'POST',
+            headers: {
+                'Content-Type': 'application/json',
+            },
+            data: body,
+            ...(options || {}),
+        },
+    );
+}
+
+export async function postDeviceGetAllDeviceByGroup(
+  body: API.GetById,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.AllResult; msg?: string }>(
+    `/api/v1/device/getAllDeviceByGroup`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
diff --git a/src/services/device/DeviceCategory.ts b/src/services/device/DeviceCategory.ts
new file mode 100644
index 0000000..5c1d4a9
--- /dev/null
+++ b/src/services/device/DeviceCategory.ts
@@ -0,0 +1,138 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建基础DeviceCategory POST /device_category/createDeviceCategory */
+export async function postDeviceCategoryCreateDeviceCategory(
+  body: API.DeviceCategory,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/device_category/createDeviceCategory`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除DeviceCategory DELETE /device_category/deleteDeviceCategory */
+export async function deleteDeviceCategoryDeleteDeviceCategory(
+  body: API.DeviceCategory,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/device_category/deleteDeviceCategory`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除选中DeviceCategory DELETE /device_category/deleteDeviceCategoryByIds */
+export async function deleteDeviceCategoryDeleteDeviceCategoryByIds(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/device_category/deleteDeviceCategoryByIds`,
+    {
+      method: 'DELETE',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 根据id获取DeviceCategory POST /device_category/getDeviceCategoryById */
+export async function postDeviceCategoryGetDeviceCategoryById(
+  body: API.GetById,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.DeviceDeviceCategoryResponse }>(
+    `/api/v1/device_category/getDeviceCategoryById`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获取DeviceCategory外键列表 POST /device_category/getDeviceCategoryFkSelect */
+export async function postDeviceCategoryGetDeviceCategoryFkSelect(
+  body: API.GetFkSelect,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.FkResult; msg?: string }>(
+    `/api/v1/device_category/getDeviceCategoryFkSelect`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取DeviceCategory列表 POST /device_category/getDeviceCategoryList */
+export async function postDeviceCategoryGetDeviceCategoryList(
+  body: API.SearchDeviceCategoryParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/device_category/getDeviceCategoryList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获得DeviceCategory名称列表 POST /device_category/getDeviceCategoryNames */
+export async function postDeviceCategoryGetDeviceCategoryNames(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.NamesResult; msg?: string }>(
+    `/api/v1/device_category/getDeviceCategoryNames`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 修改基础DeviceCategory PUT /device_category/updateDeviceCategory */
+export async function putDeviceCategoryUpdateDeviceCategory(
+  body: API.DeviceCategory,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/device_category/updateDeviceCategory`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/device/DeviceGroup.ts b/src/services/device/DeviceGroup.ts
new file mode 100644
index 0000000..89f1ebc
--- /dev/null
+++ b/src/services/device/DeviceGroup.ts
@@ -0,0 +1,146 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建基础DeviceGroup POST /device_group/createDeviceGroup */
+export async function postDeviceGroupCreateDeviceGroup(
+  body: API.DeviceGroup,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/device_group/createDeviceGroup`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除DeviceGroup DELETE /device_group/deleteDeviceGroup */
+export async function deleteDeviceGroupDeleteDeviceGroup(
+  body: API.DeviceGroup,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/device_group/deleteDeviceGroup`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除选中DeviceGroup DELETE /device_group/deleteDeviceGroupByIds */
+export async function deleteDeviceGroupDeleteDeviceGroupByIds(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/device_group/deleteDeviceGroupByIds`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 根据id获取DeviceGroup POST /device_group/getDeviceGroupById */
+export async function postDeviceGroupGetDeviceGroupById(
+  body: API.GetById,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.DeviceDeviceGroupResponse }>(
+    `/api/v1/device_group/getDeviceGroupById`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获取DeviceGroup外键列表 POST /device_group/getDeviceGroupFkSelect */
+export async function postDeviceGroupGetDeviceGroupFkSelect(
+  body: API.GetFkSelect,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.FkResult; msg?: string }>(
+    `/api/v1/device_group/getDeviceGroupFkSelect`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取DeviceGroup列表 POST /device_group/getDeviceGroupList */
+export async function postDeviceGroupGetDeviceGroupList(
+  body: API.SearchDeviceGroupParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/device_group/getDeviceGroupList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获得DeviceGroup名称列表 POST /device_group/getDeviceGroupNames */
+export async function postDeviceGroupGetDeviceGroupNames(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.NamesResult; msg?: string }>(
+    `/api/v1/device_group/getDeviceGroupNames`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获取设备组树 POST /device_group/getDeviceGroupTree */
+export async function postDeviceGroupGetDeviceGroupTree(options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.TreeResponse; msg?: string }>(
+    `/api/v1/device_group/getDeviceGroupTree`,
+    {
+      method: 'POST',
+      ...(options || {}),
+    },
+  );
+}
+
+/** 修改基础DeviceGroup PUT /device_group/updateDeviceGroup */
+export async function putDeviceGroupUpdateDeviceGroup(
+  body: API.DeviceGroup,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/device_group/updateDeviceGroup`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/device/DeviceModelInGroup.ts b/src/services/device/DeviceModelInGroup.ts
new file mode 100644
index 0000000..159d3da
--- /dev/null
+++ b/src/services/device/DeviceModelInGroup.ts
@@ -0,0 +1,162 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建基础DeviceModelInGroup POST /device_model_in_group/createDeviceModelInGroup */
+export async function postDeviceModelInGroupCreateDeviceModelInGroup(
+  body: API.DeviceModelInGroup,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/device_model_in_group/createDeviceModelInGroup`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 删除DeviceModelInGroup DELETE /device_model_in_group/deleteDeviceModelInGroup */
+export async function deleteDeviceModelInGroupDeleteDeviceModelInGroup(
+  body: API.DeviceModelInGroup,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/device_model_in_group/deleteDeviceModelInGroup`,
+    {
+      method: 'DELETE',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 删除选中DeviceModelInGroup DELETE /device_model_in_group/deleteDeviceModelInGroupByIds */
+export async function deleteDeviceModelInGroupDeleteDeviceModelInGroupByIds(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/device_model_in_group/deleteDeviceModelInGroupByIds`,
+    {
+      method: 'DELETE',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 根据id获取DeviceModelInGroup POST /device_model_in_group/getDeviceModelInGroupById */
+export async function postDeviceModelInGroupGetDeviceModelInGroupById(
+  body: API.GetById,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.DeviceDeviceModelInGroupResponse }>(
+    `/api/v1/device_model_in_group/getDeviceModelInGroupById`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获取DeviceModelInGroup外键列表 POST /device_model_in_group/getDeviceModelInGroupFkSelect */
+export async function postDeviceModelInGroupGetDeviceModelInGroupFkSelect(
+  body: API.GetFkSelect,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.FkResult; msg?: string }>(
+    `/api/v1/device_model_in_group/getDeviceModelInGroupFkSelect`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取DeviceModelInGroup列表 POST /device_model_in_group/getDeviceModelInGroupList */
+export async function postDeviceModelInGroupGetDeviceModelInGroupList(
+  body: API.SearchDeviceModelInGroupParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/device_model_in_group/getDeviceModelInGroupList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获得DeviceModelInGroup名称列表 POST /device_model_in_group/getDeviceModelInGroupNames */
+export async function postDeviceModelInGroupGetDeviceModelInGroupNames(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.NamesResult; msg?: string }>(
+    `/api/v1/device_model_in_group/getDeviceModelInGroupNames`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 修改基础DeviceModelInGroup PUT /device_model_in_group/updateDeviceModelInGroup */
+export async function putDeviceModelInGroupUpdateDeviceModelInGroup(
+  body: API.DeviceModelInGroup,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/device_model_in_group/updateDeviceModelInGroup`,
+    {
+      method: 'PUT',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 更新网点中的设备 PUT /device_model_in_group/updateDevicesInGroupModel */
+export async function putRoleUpdateDevicesInGroupModel(
+  body: API.UpdateDevicesInGroupModelParams,
+  options?: { [key: string]: any },
+) {
+  return request<any>(`/api/v1/device_model_in_group/updateDevicesInGroupModel`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/device/DeviceRelation.ts b/src/services/device/DeviceRelation.ts
new file mode 100644
index 0000000..f90242f
--- /dev/null
+++ b/src/services/device/DeviceRelation.ts
@@ -0,0 +1,138 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建基础DeviceRelation POST /device_relation/createDeviceRelation */
+export async function postDeviceRelationCreateDeviceRelation(
+  body: API.DeviceRelation,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/device_relation/createDeviceRelation`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除DeviceRelation DELETE /device_relation/deleteDeviceRelation */
+export async function deleteDeviceRelationDeleteDeviceRelation(
+  body: API.DeviceRelation,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/device_relation/deleteDeviceRelation`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除选中DeviceRelation DELETE /device_relation/deleteDeviceRelationByIds */
+export async function deleteDeviceRelationDeleteDeviceRelationByIds(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/device_relation/deleteDeviceRelationByIds`,
+    {
+      method: 'DELETE',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 根据id获取DeviceRelation POST /device_relation/getDeviceRelationById */
+export async function postDeviceRelationGetDeviceRelationById(
+  body: API.GetById,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.DeviceDeviceRelationResponse }>(
+    `/api/v1/device_relation/getDeviceRelationById`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获取DeviceRelation外键列表 POST /device_relation/getDeviceRelationFkSelect */
+export async function postDeviceRelationGetDeviceRelationFkSelect(
+  body: API.GetFkSelect,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.FkResult; msg?: string }>(
+    `/api/v1/device_relation/getDeviceRelationFkSelect`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取DeviceRelation列表 POST /device_relation/getDeviceRelationList */
+export async function postDeviceRelationGetDeviceRelationList(
+  body: API.SearchDeviceRelationParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/device_relation/getDeviceRelationList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获得DeviceRelation名称列表 POST /device_relation/getDeviceRelationNames */
+export async function postDeviceRelationGetDeviceRelationNames(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.NamesResult; msg?: string }>(
+    `/api/v1/device_relation/getDeviceRelationNames`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 修改基础DeviceRelation PUT /device_relation/updateDeviceRelation */
+export async function putDeviceRelationUpdateDeviceRelation(
+  body: API.DeviceRelation,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/device_relation/updateDeviceRelation`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/device/index.ts b/src/services/device/index.ts
new file mode 100644
index 0000000..8ac824c
--- /dev/null
+++ b/src/services/device/index.ts
@@ -0,0 +1,14 @@
+// @ts-ignore
+/* eslint-disable */
+// API 更新时间:
+// API 唯一标识:
+import * as Device from './Device';
+import * as DeviceCategory from './DeviceCategory';
+import * as DeviceGroup from './DeviceGroup';
+import * as DeviceRelation from './DeviceRelation';
+export default {
+  Device,
+  DeviceCategory,
+  DeviceGroup,
+  DeviceRelation,
+};
diff --git a/src/services/device/typings.d.ts b/src/services/device/typings.d.ts
new file mode 100644
index 0000000..941743f
--- /dev/null
+++ b/src/services/device/typings.d.ts
@@ -0,0 +1,222 @@
+declare namespace API {
+  type AllResult = {
+    list?: any;
+  };
+  type Device = {
+    categoryFkId?: number;
+    code?: string;
+    createTime?: string;
+    groupFkId?: number;
+    id?: number;
+    isEnable?: boolean;
+    name?: string;
+    param?: string;
+    position?: string;
+    remark?: string;
+    spec?: string;
+    updateTime?: string;
+  };
+
+  type DeviceCategory = {
+    code?: string;
+    createTime?: string;
+    id?: number;
+    name?: string;
+    remark?: string;
+    updateTime?: string;
+  };
+
+  type RtspReq = {
+    /** rtsp地址 */
+    url?: string;
+  };
+  type KillRtspReq = {
+    /** rtsp地址 */
+    pid?: number;
+  };
+
+  type RtspRes = {
+    host?: string;
+    pid?: number;
+  };
+
+  type DeviceDeviceCategoryResponse = {
+    deviceCategory?: DeviceCategory;
+  };
+
+  type DeviceDeviceGroupResponse = {
+    deviceGroup?: DeviceGroup;
+  };
+
+  type DeviceDeviceRelationResponse = {
+    deviceRelation?: DeviceRelation;
+  };
+
+  type DeviceDeviceResponse = {
+    device?: Device;
+  };
+
+  type DeviceGroup = {
+    address?: string;
+    children?: DeviceGroup[];
+    code?: string;
+    createTime?: string;
+    id?: number;
+    isEnable?: boolean;
+    key?: string;
+    lat?: string;
+    lon?: string;
+    managerName?: string;
+    managerPhone?: string;
+    name?: string;
+    parentFkId?: number;
+    remark?: string;
+    telephone?: string;
+    updateTime?: string;
+  };
+
+  type DeviceRelation = {
+    createTime?: string;
+    deviceParentFkId?: number;
+    deviceSonFkId?: number;
+    id?: number;
+    updateTime?: string;
+  };
+
+  type FkResult = {
+    list?: any;
+  };
+
+  type GetById = {
+    /** 主键ID */
+    id?: number;
+  };
+
+  type GetFkSelect = {
+    /** 关键字 */
+    keyword?: string;
+  };
+
+  type IdsReq = {
+    ids?: number[];
+  };
+
+  type NamesResult = {
+    list?: any;
+  };
+
+  type PageResult = {
+    list?: any;
+    page?: number;
+    pageSize?: number;
+    total?: number;
+  };
+
+  type Response = {
+    code?: number;
+    data?: any;
+    msg?: string;
+    success?: boolean;
+  };
+
+  type SearchDeviceCategoryParams = {
+    code?: string;
+    createTime?: string;
+    /** 排序方式:升序false(默认)|降序true */
+    desc?: boolean;
+    id?: number;
+    /** 关键字 */
+    keyword?: string;
+    name?: string;
+    /** 排序 */
+    orderKey?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+    remark?: string;
+    updateTime?: string;
+  };
+
+  type SearchDeviceGroupParams = {
+    address?: string;
+    children?: DeviceGroup[];
+    code?: string;
+    createTime?: string;
+    /** 排序方式:升序false(默认)|降序true */
+    desc?: boolean;
+    id?: number;
+    isEnable?: boolean;
+    key?: string;
+    /** 关键字 */
+    keyword?: string;
+    lat?: string;
+    lon?: string;
+    managerName?: string;
+    managerPhone?: string;
+    name?: string;
+    /** 排序 */
+    orderKey?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+    parentFkId?: number;
+    remark?: string;
+    telephone?: string;
+    updateTime?: string;
+  };
+
+  type SearchDeviceParams = {
+    categoryFkId?: number;
+    code?: string;
+    createTime?: string;
+    /** 排序方式:升序false(默认)|降序true */
+    desc?: boolean;
+    groupFkId?: number;
+    id?: number;
+    isEnable?: boolean;
+    /** 关键字 */
+    keyword?: string;
+    name?: string;
+    /** 排序 */
+    orderKey?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+    param?: string;
+    position?: string;
+    remark?: string;
+    spec?: string;
+    updateTime?: string;
+  };
+
+  type SearchDeviceRelationParams = {
+    createTime?: string;
+    /** 排序方式:升序false(默认)|降序true */
+    desc?: boolean;
+    deviceParentFkId?: number;
+    deviceSonFkId?: number;
+    id?: number;
+    /** 关键字 */
+    keyword?: string;
+    /** 排序 */
+    orderKey?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+    updateTime?: string;
+  };
+
+  type Tree = {
+    children?: Tree[];
+    key?: number;
+    title?: string;
+  };
+
+  type TreeResponse = {
+    tree?: Tree[];
+  };
+}
diff --git a/src/services/project/Project.ts b/src/services/project/Project.ts
new file mode 100644
index 0000000..4a9fc7e
--- /dev/null
+++ b/src/services/project/Project.ts
@@ -0,0 +1,162 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建基础Project POST /project/createProject */
+export async function postProjectCreateProject(
+  body: API.Project,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/project/createProject`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除Project DELETE /project/deleteProject */
+export async function deleteProjectDeleteProject(
+  body: API.Project,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/project/deleteProject`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除选中Project DELETE /project/deleteProjectByIds */
+export async function deleteProjectDeleteProjectByIds(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/project/deleteProjectByIds`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 根据组id获得项目id和name POST /project/getProjectByGroupId */
+export async function postProjectGetProjectByGroupId(
+  body: API.GetById,
+  options?: { [key: string]: any },
+) {
+  return request<any>(`/api/v1/project/getProjectByGroupId`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 根据id获取Project POST /project/getProjectById */
+export async function postProjectGetProjectById(
+  body: API.GetById,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.ProjectProjectResponse }>(
+    `/api/v1/project/getProjectById`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获取Project外键列表 POST /project/getProjectFkSelect */
+export async function postProjectGetProjectFkSelect(
+  body: API.GetFkSelect,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.FkResult; msg?: string }>(
+    `/api/v1/project/getProjectFkSelect`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取Project列表 POST /project/getProjectList */
+export async function postProjectGetProjectList(
+  body: API.SearchProjectParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/project/getProjectList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获得Project名称列表 POST /project/getProjectNames */
+export async function postProjectGetProjectNames(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.NamesResult; msg?: string }>(
+    `/api/v1/project/getProjectNames`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 修改基础Project PUT /project/updateProject */
+export async function putProjectUpdateProject(body: API.Project, options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/project/updateProject`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 更新项目的关联组 PUT /project/updateProjectGroup */
+export async function putProjectUpdateProjectGroup(
+  body: API.UpdateProjectGroupParams,
+  options?: { [key: string]: any },
+) {
+  return request<any>(`/api/v1/project/updateProjectGroup`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/project/ProjectModelConfig.ts b/src/services/project/ProjectModelConfig.ts
new file mode 100644
index 0000000..ffa5852
--- /dev/null
+++ b/src/services/project/ProjectModelConfig.ts
@@ -0,0 +1,111 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建基础ProjectModelConfig POST /project_model_config/createProjectModelConfig */
+export async function postProjectModelConfigCreateProjectModelConfig(
+  body: API.ProjectModelConfig,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/project_model_config/createProjectModelConfig`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 删除ProjectModelConfig DELETE /project_model_config/deleteProjectModelConfig */
+export async function deleteProjectModelConfigDeleteProjectModelConfig(
+  body: API.ProjectModelConfig,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/project_model_config/deleteProjectModelConfig`,
+    {
+      method: 'DELETE',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 删除选中ProjectModelConfig DELETE /project_model_config/deleteProjectModelConfigByIds */
+export async function deleteProjectModelConfigDeleteProjectModelConfigByIds(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/project_model_config/deleteProjectModelConfigByIds`,
+    {
+      method: 'DELETE',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 根据id获取ProjectModelConfig POST /project_model_config/getProjectModelConfigById */
+export async function postProjectModelConfigGetProjectModelConfigById(
+  body: API.GetById,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.ProjectProjectModelConfigResponse }>(
+    `/api/v1/project_model_config/getProjectModelConfigById`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取ProjectModelConfig列表 POST /project_model_config/getProjectModelConfigList */
+export async function postProjectModelConfigGetProjectModelConfigList(
+  body: API.SearchProjectModelConfigParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/project_model_config/getProjectModelConfigList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 修改基础ProjectModelConfig PUT /project_model_config/updateProjectModelConfig */
+export async function putProjectModelConfigUpdateProjectModelConfig(
+  body: API.ProjectModelConfig,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/project_model_config/updateProjectModelConfig`,
+    {
+      method: 'PUT',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
diff --git a/src/services/project/index.ts b/src/services/project/index.ts
new file mode 100644
index 0000000..46874f5
--- /dev/null
+++ b/src/services/project/index.ts
@@ -0,0 +1,11 @@
+// @ts-ignore
+/* eslint-disable */
+// API 更新时间:
+// API 唯一标识:
+import * as Project from './Project';
+import * as ProjectModelConfig from './ProjectModelConfig';
+
+export default {
+  Project,
+  ProjectModelConfig,
+};
diff --git a/src/services/project/typings.d.ts b/src/services/project/typings.d.ts
new file mode 100644
index 0000000..acf0ff7
--- /dev/null
+++ b/src/services/project/typings.d.ts
@@ -0,0 +1,126 @@
+declare namespace API {
+  type FkResult = {
+    list?: any;
+  };
+
+  type GetById = {
+    /** 主键ID */
+    id?: number;
+  };
+
+  type GetFkSelect = {
+    /** 关键字 */
+    keyword?: string;
+  };
+
+  type IdsReq = {
+    ids?: number[];
+  };
+
+  type NamesResult = {
+    list?: any;
+  };
+
+  type PageResult = {
+    list?: any;
+    page?: number;
+    pageSize?: number;
+    total?: number;
+  };
+
+  type Project = {
+    code?: string;
+    createTime?: string;
+    groupIds?: number[];
+    id?: number;
+    inferConfig?: Record<string, any>;
+    info?: string;
+    isEnable?: boolean;
+    name?: string;
+    projectFilePath?: string;
+    remark?: string;
+    updateTime?: string;
+  };
+
+  type ProjectModelConfig = {
+    createTime?: string;
+    /** 设备是一个 以,隔开的存储device id的字符例如   1,2 */
+    devices?: string;
+    id?: number;
+    modelConfig?: Record<string, any>;
+    modelFkId?: number;
+    modelVersionFkId?: number;
+    projectConfig?: Record<string, any>;
+    projectGroupFkId?: number;
+    remark?: string;
+    updateTime?: string;
+  };
+
+  type ProjectProjectModelConfigResponse = {
+    ProjectModelConfig?: ProjectModelConfig;
+  };
+
+  type ProjectProjectResponse = {
+    project?: Project;
+  };
+
+  type Response = {
+    code?: number;
+    data?: any;
+    msg?: string;
+    success?: boolean;
+  };
+
+  type SearchProjectModelConfigParams = {
+    createTime?: string;
+    /** 排序方式:升序false(默认)|降序true */
+    desc?: boolean;
+    /** 设备是一个 以,隔开的存储device id的字符例如   1,2 */
+    devices?: string;
+    id?: number;
+    /** 关键字 */
+    keyword?: string;
+    modelConfig?: Record<string, any>;
+    modelFkId?: number;
+    modelVersionFkId?: number;
+    /** 排序 */
+    orderKey?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+    projectConfig?: Record<string, any>;
+    projectGroupFkId?: number;
+    remark?: string;
+    updateTime?: string;
+  };
+
+  type SearchProjectParams = {
+    code?: string;
+    createTime?: string;
+    /** 排序方式:升序false(默认)|降序true */
+    desc?: boolean;
+    groupIds?: number[];
+    id?: number;
+    inferConfig?: Record<string, any>;
+    info?: string;
+    isEnable?: boolean;
+    /** 关键字 */
+    keyword?: string;
+    name?: string;
+    /** 排序 */
+    orderKey?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+    projectFilePath?: string;
+    remark?: string;
+    updateTime?: string;
+  };
+
+  type UpdateProjectGroupParams = {
+    groupIds?: number[];
+    projectId?: number;
+  };
+}
diff --git a/src/services/resource/AlgorithmModel.ts b/src/services/resource/AlgorithmModel.ts
new file mode 100644
index 0000000..c7bce76
--- /dev/null
+++ b/src/services/resource/AlgorithmModel.ts
@@ -0,0 +1,156 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建基础AlgorithmModel POST /algorithm_model/createAlgorithmModel */
+export async function postAlgorithmModelCreateAlgorithmModel(
+  body: API.AlgorithmModel,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/algorithm_model/createAlgorithmModel`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除AlgorithmModel DELETE /algorithm_model/deleteAlgorithmModel */
+export async function deleteAlgorithmModelDeleteAlgorithmModel(
+  body: API.AlgorithmModel,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/algorithm_model/deleteAlgorithmModel`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除选中AlgorithmModel DELETE /algorithm_model/deleteAlgorithmModelByIds */
+export async function deleteAlgorithmModelDeleteAlgorithmModelByIds(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/algorithm_model/deleteAlgorithmModelByIds`,
+    {
+      method: 'DELETE',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 根据id获取AlgorithmModel POST /algorithm_model/getAlgorithmModelById */
+export async function postAlgorithmModelGetAlgorithmModelById(
+  body: API.GetById,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.ResourceAlgorithmModelResponse }>(
+    `/api/v1/algorithm_model/getAlgorithmModelById`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获取AlgorithmModel外键列表 POST /algorithm_model/getAlgorithmModelFkSelect */
+export async function postAlgorithmModelGetAlgorithmModelFkSelect(
+  body: API.GetFkSelect,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.FkResult; msg?: string }>(
+    `/api/v1/algorithm_model/getAlgorithmModelFkSelect`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取AlgorithmModel列表 POST /algorithm_model/getAlgorithmModelList */
+export async function postAlgorithmModelGetAlgorithmModelList(
+  body: API.SearchAlgorithmModelParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/algorithm_model/getAlgorithmModelList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获得AlgorithmModel名称列表 POST /algorithm_model/getAlgorithmModelNames */
+export async function postAlgorithmModelGetAlgorithmModelNames(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.NamesResult; msg?: string }>(
+    `/api/v1/algorithm_model/getAlgorithmModelNames`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 修改基础AlgorithmModel PUT /algorithm_model/updateAlgorithmModel */
+export async function putAlgorithmModelUpdateAlgorithmModel(
+  body: API.AlgorithmModel,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/algorithm_model/updateAlgorithmModel`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 根据id获取所有的版本 POST /algorithm_model/getAllVersionsById */
+export async function postAlgorithmModelGetAllVersionsById(
+    body: API.GetById,
+    options?: { [key: string]: any },
+) {
+    return request<API.Response & { data?: API.ResourceModelVersionFkSelectResponse }>(
+        `/api/v1/algorithm_model/getAllVersionsById`,
+        {
+            method: 'POST',
+            headers: {
+                'Content-Type': 'application/json',
+            },
+            data: body,
+            ...(options || {}),
+        },
+    );
+}
diff --git a/src/services/resource/BusinessImage.ts b/src/services/resource/BusinessImage.ts
new file mode 100644
index 0000000..d59635f
--- /dev/null
+++ b/src/services/resource/BusinessImage.ts
@@ -0,0 +1,138 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建基础BusinessImage POST /business_image/createBusinessImage */
+export async function postBusinessImageCreateBusinessImage(
+  body: API.BusinessImage,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/business_image/createBusinessImage`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除BusinessImage DELETE /business_image/deleteBusinessImage */
+export async function deleteBusinessImageDeleteBusinessImage(
+  body: API.BusinessImage,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/business_image/deleteBusinessImage`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除选中BusinessImage DELETE /business_image/deleteBusinessImageByIds */
+export async function deleteBusinessImageDeleteBusinessImageByIds(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/business_image/deleteBusinessImageByIds`,
+    {
+      method: 'DELETE',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 根据id获取BusinessImage POST /business_image/getBusinessImageById */
+export async function postBusinessImageGetBusinessImageById(
+  body: API.GetById,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.ResourceBusinessImageResponse }>(
+    `/api/v1/business_image/getBusinessImageById`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获取BusinessImage外键列表 POST /business_image/getBusinessImageFkSelect */
+export async function postBusinessImageGetBusinessImageFkSelect(
+  body: API.GetFkSelect,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.FkResult; msg?: string }>(
+    `/api/v1/business_image/getBusinessImageFkSelect`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取BusinessImage列表 POST /business_image/getBusinessImageList */
+export async function postBusinessImageGetBusinessImageList(
+  body: API.SearchBusinessImageParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/business_image/getBusinessImageList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获得BusinessImage名称列表 POST /business_image/getBusinessImageNames */
+export async function postBusinessImageGetBusinessImageNames(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.NamesResult; msg?: string }>(
+    `/api/v1/business_image/getBusinessImageNames`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 修改基础BusinessImage PUT /business_image/updateBusinessImage */
+export async function putBusinessImageUpdateBusinessImage(
+  body: API.BusinessImage,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/business_image/updateBusinessImage`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/resource/ModelCategory.ts b/src/services/resource/ModelCategory.ts
new file mode 100644
index 0000000..ef047bd
--- /dev/null
+++ b/src/services/resource/ModelCategory.ts
@@ -0,0 +1,138 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建基础ModelCategory POST /model_category/createModelCategory */
+export async function postModelCategoryCreateModelCategory(
+  body: API.ModelCategory,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/model_category/createModelCategory`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除ModelCategory DELETE /model_category/deleteModelCategory */
+export async function deleteModelCategoryDeleteModelCategory(
+  body: API.ModelCategory,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/model_category/deleteModelCategory`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除选中ModelCategory DELETE /model_category/deleteModelCategoryByIds */
+export async function deleteModelCategoryDeleteModelCategoryByIds(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/model_category/deleteModelCategoryByIds`,
+    {
+      method: 'DELETE',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 根据id获取ModelCategory POST /model_category/getModelCategoryById */
+export async function postModelCategoryGetModelCategoryById(
+  body: API.GetById,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.ResourceModelCategoryResponse }>(
+    `/api/v1/model_category/getModelCategoryById`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获取ModelCategory外键列表 POST /model_category/getModelCategoryFkSelect */
+export async function postModelCategoryGetModelCategoryFkSelect(
+  body: API.GetFkSelect,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.FkResult; msg?: string }>(
+    `/api/v1/model_category/getModelCategoryFkSelect`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取ModelCategory列表 POST /model_category/getModelCategoryList */
+export async function postModelCategoryGetModelCategoryList(
+  body: API.SearchModelCategoryParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/model_category/getModelCategoryList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获得ModelCategory名称列表 POST /model_category/getModelCategoryNames */
+export async function postModelCategoryGetModelCategoryNames(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.NamesResult; msg?: string }>(
+    `/api/v1/model_category/getModelCategoryNames`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 修改基础ModelCategory PUT /model_category/updateModelCategory */
+export async function putModelCategoryUpdateModelCategory(
+  body: API.ModelCategory,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/model_category/updateModelCategory`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/resource/ModelImage.ts b/src/services/resource/ModelImage.ts
new file mode 100644
index 0000000..6f3031b
--- /dev/null
+++ b/src/services/resource/ModelImage.ts
@@ -0,0 +1,135 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建基础ModelImage POST /model_image/createModelImage */
+export async function postModelImageCreateModelImage(
+  body: API.ModelImage,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/model_image/createModelImage`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除ModelImage DELETE /model_image/deleteModelImage */
+export async function deleteModelImageDeleteModelImage(
+  body: API.ModelImage,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/model_image/deleteModelImage`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除选中ModelImage DELETE /model_image/deleteModelImageByIds */
+export async function deleteModelImageDeleteModelImageByIds(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/model_image/deleteModelImageByIds`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 根据id获取ModelImage POST /model_image/getModelImageById */
+export async function postModelImageGetModelImageById(
+  body: API.GetById,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.ResourceModelImageResponse }>(
+    `/api/v1/model_image/getModelImageById`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获取ModelImage外键列表 POST /model_image/getModelImageFkSelect */
+export async function postModelImageGetModelImageFkSelect(
+  body: API.GetFkSelect,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.FkResult; msg?: string }>(
+    `/api/v1/model_image/getModelImageFkSelect`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取ModelImage列表 POST /model_image/getModelImageList */
+export async function postModelImageGetModelImageList(
+  body: API.SearchModelImageParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/model_image/getModelImageList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获得ModelImage名称列表 POST /model_image/getModelImageNames */
+export async function postModelImageGetModelImageNames(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.NamesResult; msg?: string }>(
+    `/api/v1/model_image/getModelImageNames`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 修改基础ModelImage PUT /model_image/updateModelImage */
+export async function putModelImageUpdateModelImage(
+  body: API.ModelImage,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/model_image/updateModelImage`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/resource/ModelVersion.ts b/src/services/resource/ModelVersion.ts
new file mode 100644
index 0000000..dfa2c04
--- /dev/null
+++ b/src/services/resource/ModelVersion.ts
@@ -0,0 +1,153 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建基础ModelVersion POST /model_version/createModelVersion */
+export async function postModelVersionCreateModelVersion(
+  body: API.ModelVersion,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/model_version/createModelVersion`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除ModelVersion DELETE /model_version/deleteModelVersion */
+export async function deleteModelVersionDeleteModelVersion(
+  body: API.ModelVersion,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/model_version/deleteModelVersion`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除选中ModelVersion DELETE /model_version/deleteModelVersionByIds */
+export async function deleteModelVersionDeleteModelVersionByIds(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/model_version/deleteModelVersionByIds`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 根据id获取ModelVersion POST /model_version/getModelVersionById */
+export async function postModelVersionGetModelVersionById(
+  body: API.GetById,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.ResourceModelVersionResponse }>(
+    `/api/v1/model_version/getModelVersionById`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获取ModelVersion外键列表 POST /model_version/getModelVersionFkSelect */
+export async function postModelVersionGetModelVersionFkSelect(
+  body: API.GetFkSelect,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.FkResult; msg?: string }>(
+    `/api/v1/model_version/getModelVersionFkSelect`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取ModelVersion列表 POST /model_version/getModelVersionList */
+export async function postModelVersionGetModelVersionList(
+  body: API.SearchModelVersionParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/model_version/getModelVersionList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获得ModelVersion名称列表 POST /model_version/getModelVersionNames */
+export async function postModelVersionGetModelVersionNames(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.NamesResult; msg?: string }>(
+    `/api/v1/model_version/getModelVersionNames`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 修改基础ModelVersion PUT /model_version/updateModelVersion */
+export async function putModelVersionUpdateModelVersion(
+  body: API.ModelVersion,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/model_version/updateModelVersion`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 根据ids获取ModelVersion列表 POST /model_version/getModelVersionListByIds */
+export async function postModelVersionGetModelVersionListByIds(
+    body: API.IdsReq,
+    options?: { [key: string]: any },
+) {
+    return request<API.Response & { data?: API.ResourceModelVersionListResponse }>(
+        `/api/v1/model_version/getModelVersionListByIds`,
+        {
+            method: 'POST',
+            headers: {
+                'Content-Type': 'application/json',
+            },
+            data: body,
+            ...(options || {}),
+        },
+    );
+}
diff --git a/src/services/resource/index.ts b/src/services/resource/index.ts
new file mode 100644
index 0000000..37b6132
--- /dev/null
+++ b/src/services/resource/index.ts
@@ -0,0 +1,16 @@
+// @ts-ignore
+/* eslint-disable */
+// API 更新时间:
+// API 唯一标识:
+import * as AlgorithmModel from './AlgorithmModel';
+import * as BusinessImage from './BusinessImage';
+import * as ModelCategory from './ModelCategory';
+import * as ModelImage from './ModelImage';
+import * as ModelVersion from './ModelVersion';
+export default {
+  AlgorithmModel,
+  BusinessImage,
+  ModelCategory,
+  ModelImage,
+  ModelVersion,
+};
diff --git a/src/services/resource/typings.d.ts b/src/services/resource/typings.d.ts
new file mode 100644
index 0000000..c3b795b
--- /dev/null
+++ b/src/services/resource/typings.d.ts
@@ -0,0 +1,226 @@
+declare namespace API {
+  type ResourceModelVersionListResponse = {
+    modelVersions?: ModelVersion[];
+  };
+  type AlgorithmModel = {
+    categoryFkId?: number;
+    createTime?: string;
+    id?: number;
+    name?: string;
+    defaultVersionFkId?: number;
+    remark?: string;
+    updateTime?: string;
+  };
+
+  type ResourceModelVersionFkSelectResponse = {
+    id?: number;
+    name?: string;
+  };
+
+  type BusinessImage = {
+    configHash?: string;
+    createTime?: string;
+    id?: number;
+    name?: string;
+    path?: string;
+    projectFkId?: number;
+    remark?: string;
+    startCode?: string;
+    updateTime?: string;
+    version?: string;
+  };
+
+  type FkResult = {
+    list?: any;
+  };
+
+  type GetById = {
+    /** 主键ID */
+    id?: number;
+  };
+
+  type GetFkSelect = {
+    /** 关键字 */
+    keyword?: string;
+  };
+
+  type IdsReq = {
+    ids?: number[];
+  };
+
+  type ModelCategory = {
+    code?: string;
+    createTime?: string;
+    id?: number;
+    name?: string;
+    remark?: string;
+    updateTime?: string;
+  };
+
+  type ModelImage = {
+    createTime?: string;
+    id?: number;
+    modelVersionFkId?: number;
+    name?: string;
+    path?: string;
+    remark?: string;
+    startCode?: string;
+    updateTime?: string;
+  };
+
+  type ModelVersion = {
+    createTime?: string;
+    id?: number;
+    isEnable?: boolean;
+    modelFkId?: number;
+    modelConfig?: Record<string, any>;
+    path?: string;
+    status?: number;
+    remark?: string;
+    startCode?: string;
+    updateTime?: string;
+    version?: string;
+  };
+
+  type NamesResult = {
+    list?: any;
+  };
+
+  type PageResult = {
+    list?: any;
+    page?: number;
+    pageSize?: number;
+    total?: number;
+  };
+
+  type ResourceAlgorithmModelResponse = {
+    algorithmModel?: AlgorithmModel;
+  };
+
+  type ResourceBusinessImageResponse = {
+    businessImage?: BusinessImage;
+  };
+
+  type ResourceModelCategoryResponse = {
+    modelCategory?: ModelCategory;
+  };
+
+  type ResourceModelImageResponse = {
+    modelImage?: ModelImage;
+  };
+
+  type ResourceModelVersionResponse = {
+    modelVersion?: ModelVersion;
+  };
+
+  type Response = {
+    code?: number;
+    data?: any;
+    msg?: string;
+    success?: boolean;
+  };
+
+  type SearchAlgorithmModelParams = {
+    categoryFkId?: number;
+    createTime?: string;
+    /** 排序方式:升序false(默认)|降序true */
+    desc?: boolean;
+    id?: number;
+    /** 关键字 */
+    keyword?: string;
+    name?: string;
+    /** 排序 */
+    orderKey?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+    remark?: string;
+    updateTime?: string;
+  };
+
+  type SearchBusinessImageParams = {
+    configHash?: string;
+    createTime?: string;
+    /** 排序方式:升序false(默认)|降序true */
+    desc?: boolean;
+    id?: number;
+    /** 关键字 */
+    keyword?: string;
+    name?: string;
+    /** 排序 */
+    orderKey?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+    path?: string;
+    projectFkId?: number;
+    remark?: string;
+    startCode?: string;
+    updateTime?: string;
+    version?: string;
+  };
+
+  type SearchModelCategoryParams = {
+    code?: string;
+    createTime?: string;
+    /** 排序方式:升序false(默认)|降序true */
+    desc?: boolean;
+    id?: number;
+    /** 关键字 */
+    keyword?: string;
+    name?: string;
+    /** 排序 */
+    orderKey?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+    remark?: string;
+    updateTime?: string;
+  };
+
+  type SearchModelImageParams = {
+    createTime?: string;
+    /** 排序方式:升序false(默认)|降序true */
+    desc?: boolean;
+    id?: number;
+    /** 关键字 */
+    keyword?: string;
+    modelVersionFkId?: number;
+    name?: string;
+    /** 排序 */
+    orderKey?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+    path?: string;
+    remark?: string;
+    startCode?: string;
+    updateTime?: string;
+  };
+
+  type SearchModelVersionParams = {
+    createTime?: string;
+    /** 排序方式:升序false(默认)|降序true */
+    desc?: boolean;
+    id?: number;
+    isEnable?: boolean;
+    /** 关键字 */
+    keyword?: string;
+    modelFkId?: number;
+    /** 排序 */
+    orderKey?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+    path?: string;
+    remark?: string;
+    startCode?: string;
+    updateTime?: string;
+    version?: string;
+  };
+}
diff --git a/src/services/swagger/index.ts b/src/services/swagger/index.ts
new file mode 100644
index 0000000..83cf97c
--- /dev/null
+++ b/src/services/swagger/index.ts
@@ -0,0 +1,12 @@
+// @ts-ignore
+/* eslint-disable */
+// API 更新时间:
+// API 唯一标识:
+import * as pet from './pet';
+import * as store from './store';
+import * as user from './user';
+export default {
+  pet,
+  store,
+  user,
+};
diff --git a/src/services/swagger/pet.ts b/src/services/swagger/pet.ts
new file mode 100644
index 0000000..b887475
--- /dev/null
+++ b/src/services/swagger/pet.ts
@@ -0,0 +1,153 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** Update an existing pet PUT /pet */
+export async function updatePet(body: API.Pet, options?: { [key: string]: any }) {
+  return request<any>('/pet', {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** Add a new pet to the store POST /pet */
+export async function addPet(body: API.Pet, options?: { [key: string]: any }) {
+  return request<any>('/pet', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** Find pet by ID Returns a single pet GET /pet/${param0} */
+export async function getPetById(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.getPetByIdParams,
+  options?: { [key: string]: any },
+) {
+  const { petId: param0, ...queryParams } = params;
+  return request<API.Pet>(`/pet/${param0}`, {
+    method: 'GET',
+    params: { ...queryParams },
+    ...(options || {}),
+  });
+}
+
+/** Updates a pet in the store with form data POST /pet/${param0} */
+export async function updatePetWithForm(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.updatePetWithFormParams,
+  body: { name?: string; status?: string },
+  options?: { [key: string]: any },
+) {
+  const { petId: param0, ...queryParams } = params;
+  const formData = new FormData();
+
+  Object.keys(body).forEach((ele) => {
+    const item = (body as any)[ele];
+
+    if (item !== undefined && item !== null) {
+      formData.append(
+        ele,
+        typeof item === 'object' && !(item instanceof File) ? JSON.stringify(item) : item,
+      );
+    }
+  });
+
+  return request<any>(`/pet/${param0}`, {
+    method: 'POST',
+    params: { ...queryParams },
+    data: formData,
+    ...(options || {}),
+  });
+}
+
+/** Deletes a pet DELETE /pet/${param0} */
+export async function deletePet(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.deletePetParams & {
+    // header
+    api_key?: string;
+  },
+  options?: { [key: string]: any },
+) {
+  const { petId: param0, ...queryParams } = params;
+  return request<any>(`/pet/${param0}`, {
+    method: 'DELETE',
+    headers: {},
+    params: { ...queryParams },
+    ...(options || {}),
+  });
+}
+
+/** uploads an image POST /pet/${param0}/uploadImage */
+export async function uploadFile(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.uploadFileParams,
+  body: { additionalMetadata?: string; file?: string },
+  file?: File,
+  options?: { [key: string]: any },
+) {
+  const { petId: param0, ...queryParams } = params;
+  const formData = new FormData();
+
+  if (file) {
+    formData.append('file', file);
+  }
+
+  Object.keys(body).forEach((ele) => {
+    const item = (body as any)[ele];
+
+    if (item !== undefined && item !== null) {
+      formData.append(
+        ele,
+        typeof item === 'object' && !(item instanceof File) ? JSON.stringify(item) : item,
+      );
+    }
+  });
+
+  return request<API.ApiResponse>(`/pet/${param0}/uploadImage`, {
+    method: 'POST',
+    params: { ...queryParams },
+    data: formData,
+    requestType: 'form',
+    ...(options || {}),
+  });
+}
+
+/** Finds Pets by status Multiple status values can be provided with comma separated strings GET /pet/findByStatus */
+export async function findPetsByStatus(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.findPetsByStatusParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Pet[]>('/pet/findByStatus', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
+
+/** Finds Pets by tags Muliple tags can be provided with comma separated strings. Use         tag1, tag2, tag3 for testing. GET /pet/findByTags */
+export async function findPetsByTags(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.findPetsByTagsParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Pet[]>('/pet/findByTags', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
diff --git a/src/services/swagger/store.ts b/src/services/swagger/store.ts
new file mode 100644
index 0000000..b9c689a
--- /dev/null
+++ b/src/services/swagger/store.ts
@@ -0,0 +1,48 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** Returns pet inventories by status Returns a map of status codes to quantities GET /store/inventory */
+export async function getInventory(options?: { [key: string]: any }) {
+  return request<Record<string, any>>('/store/inventory', {
+    method: 'GET',
+    ...(options || {}),
+  });
+}
+
+/** Place an order for a pet POST /store/order */
+export async function placeOrder(body: API.Order, options?: { [key: string]: any }) {
+  return request<API.Order>('/store/order', {
+    method: 'POST',
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** Find purchase order by ID For valid response try integer IDs with value >= 1 and <= 10.         Other values will generated exceptions GET /store/order/${param0} */
+export async function getOrderById(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.getOrderByIdParams,
+  options?: { [key: string]: any },
+) {
+  const { orderId: param0, ...queryParams } = params;
+  return request<API.Order>(`/store/order/${param0}`, {
+    method: 'GET',
+    params: { ...queryParams },
+    ...(options || {}),
+  });
+}
+
+/** Delete purchase order by ID For valid response try integer IDs with positive integer value.         Negative or non-integer values will generate API errors DELETE /store/order/${param0} */
+export async function deleteOrder(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.deleteOrderParams,
+  options?: { [key: string]: any },
+) {
+  const { orderId: param0, ...queryParams } = params;
+  return request<any>(`/store/order/${param0}`, {
+    method: 'DELETE',
+    params: { ...queryParams },
+    ...(options || {}),
+  });
+}
diff --git a/src/services/swagger/typings.d.ts b/src/services/swagger/typings.d.ts
new file mode 100644
index 0000000..d06bcfc
--- /dev/null
+++ b/src/services/swagger/typings.d.ts
@@ -0,0 +1,112 @@
+declare namespace API {
+  type ApiResponse = {
+    code?: number;
+    type?: string;
+    message?: string;
+  };
+
+  type Category = {
+    id?: number;
+    name?: string;
+  };
+
+  type deleteOrderParams = {
+    /** ID of the order that needs to be deleted */
+    orderId: number;
+  };
+
+  type deletePetParams = {
+    api_key?: string;
+    /** Pet id to delete */
+    petId: number;
+  };
+
+  type deleteUserParams = {
+    /** The name that needs to be deleted */
+    username: string;
+  };
+
+  type findPetsByStatusParams = {
+    /** Status values that need to be considered for filter */
+    status: ('available' | 'pending' | 'sold')[];
+  };
+
+  type findPetsByTagsParams = {
+    /** Tags to filter by */
+    tags: string[];
+  };
+
+  type getOrderByIdParams = {
+    /** ID of pet that needs to be fetched */
+    orderId: number;
+  };
+
+  type getPetByIdParams = {
+    /** ID of pet to return */
+    petId: number;
+  };
+
+  type getUserByNameParams = {
+    /** The name that needs to be fetched. Use user1 for testing.  */
+    username: string;
+  };
+
+  type loginUserParams = {
+    /** The user name for login */
+    username: string;
+    /** The password for login in clear text */
+    password: string;
+  };
+
+  type Order = {
+    id?: number;
+    petId?: number;
+    quantity?: number;
+    shipDate?: string;
+    /** Order Status */
+    status?: 'placed' | 'approved' | 'delivered';
+    complete?: boolean;
+  };
+
+  type Pet = {
+    id?: number;
+    category?: Category;
+    name: string;
+    photoUrls: string[];
+    tags?: Tag[];
+    /** pet status in the store */
+    status?: 'available' | 'pending' | 'sold';
+  };
+
+  type Tag = {
+    id?: number;
+    name?: string;
+  };
+
+  type updatePetWithFormParams = {
+    /** ID of pet that needs to be updated */
+    petId: number;
+  };
+
+  type updateUserParams = {
+    /** name that need to be updated */
+    username: string;
+  };
+
+  type uploadFileParams = {
+    /** ID of pet to update */
+    petId: number;
+  };
+
+  type User = {
+    id?: number;
+    username?: string;
+    firstName?: string;
+    lastName?: string;
+    email?: string;
+    password?: string;
+    phone?: string;
+    /** User Status */
+    userStatus?: number;
+  };
+}
diff --git a/src/services/swagger/user.ts b/src/services/swagger/user.ts
new file mode 100644
index 0000000..4dd6f42
--- /dev/null
+++ b/src/services/swagger/user.ts
@@ -0,0 +1,100 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** Create user This can only be done by the logged in user. POST /user */
+export async function createUser(body: API.User, options?: { [key: string]: any }) {
+  return request<any>('/user', {
+    method: 'POST',
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** Get user by user name GET /user/${param0} */
+export async function getUserByName(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.getUserByNameParams,
+  options?: { [key: string]: any },
+) {
+  const { username: param0, ...queryParams } = params;
+  return request<API.User>(`/user/${param0}`, {
+    method: 'GET',
+    params: { ...queryParams },
+    ...(options || {}),
+  });
+}
+
+/** Updated user This can only be done by the logged in user. PUT /user/${param0} */
+export async function updateUser(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.updateUserParams,
+  body: API.User,
+  options?: { [key: string]: any },
+) {
+  const { username: param0, ...queryParams } = params;
+  return request<any>(`/user/${param0}`, {
+    method: 'PUT',
+    params: { ...queryParams },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** Delete user This can only be done by the logged in user. DELETE /user/${param0} */
+export async function deleteUser(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.deleteUserParams,
+  options?: { [key: string]: any },
+) {
+  const { username: param0, ...queryParams } = params;
+  return request<any>(`/user/${param0}`, {
+    method: 'DELETE',
+    params: { ...queryParams },
+    ...(options || {}),
+  });
+}
+
+/** Creates list of users with given input array POST /user/createWithArray */
+export async function createUsersWithArrayInput(
+  body: API.User[],
+  options?: { [key: string]: any },
+) {
+  return request<any>('/user/createWithArray', {
+    method: 'POST',
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** Creates list of users with given input array POST /user/createWithList */
+export async function createUsersWithListInput(body: API.User[], options?: { [key: string]: any }) {
+  return request<any>('/user/createWithList', {
+    method: 'POST',
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** Logs user into the system GET /user/login */
+export async function loginUser(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.loginUserParams,
+  options?: { [key: string]: any },
+) {
+  return request<string>('/user/login', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
+
+/** Logs out current logged in user session GET /user/logout */
+export async function logoutUser(options?: { [key: string]: any }) {
+  return request<any>('/user/logout', {
+    method: 'GET',
+    ...(options || {}),
+  });
+}
diff --git a/src/services/system/Api.ts b/src/services/system/Api.ts
new file mode 100644
index 0000000..d1e2e04
--- /dev/null
+++ b/src/services/system/Api.ts
@@ -0,0 +1,108 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建基础api POST /api/createApi */
+export async function postApiCreateApi(body: API.Api, options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/api/createApi`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除api DELETE /api/deleteApi */
+export async function deleteApiDeleteApi(body: API.Api, options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/api/deleteApi`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除选中Api DELETE /api/deleteApisByIds */
+export async function deleteApiDeleteApisByIds(body: API.IdsReq, options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/api/deleteApisByIds`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 刷新casbin缓存 GET /api/freshCasbin */
+export async function getApiFreshCasbin(options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/api/freshCasbin`, {
+    method: 'GET',
+    ...(options || {}),
+  });
+}
+
+/** 获取所有的Api 不分页 POST /api/getAllApis */
+export async function postApiGetAllApis(options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.SysAPIListResponse; msg?: string }>(
+    `/api/v1/api/getAllApis`,
+    {
+      method: 'POST',
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获取所有的Api 不分页 POST /api/getAllApisByGroup */
+export async function postApiGetAllApisByGroup(options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.SysAPIByGroupResponse; msg?: string }>(
+    `/api/v1/api/getAllApisByGroup`,
+    {
+      method: 'POST',
+      ...(options || {}),
+    },
+  );
+}
+
+/** 根据id获取api POST /api/getApiById */
+export async function postApiGetApiById(body: API.GetById, options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.SysAPIResponse }>(`/api/v1/api/getApiById`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 分页获取API列表 POST /api/getApiList */
+export async function postApiGetApiList(
+  body: API.SearchApiParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(`/api/v1/api/getApiList`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 修改基础api PUT /api/updateApi */
+export async function putApiUpdateApi(body: API.Api, options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/api/updateApi`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/system/Base.ts b/src/services/system/Base.ts
new file mode 100644
index 0000000..c9cef6c
--- /dev/null
+++ b/src/services/system/Base.ts
@@ -0,0 +1,26 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 生成验证码 POST /base/captcha */
+export async function postBaseCaptcha(options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.SysCaptchaResponse; msg?: string }>(
+    `/api/v1/base/captcha`,
+    {
+      method: 'POST',
+      ...(options || {}),
+    },
+  );
+}
+
+/** 用户登录 POST /base/login */
+export async function postBaseLogin(body: API.Login, options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.LoginResponse; msg?: string }>(`/api/v1/base/login`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/system/Casbin.ts b/src/services/system/Casbin.ts
new file mode 100644
index 0000000..3583653
--- /dev/null
+++ b/src/services/system/Casbin.ts
@@ -0,0 +1,36 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 获取权限列表 POST /casbin/getPolicyPathByRoleId */
+export async function postCasbinGetPolicyPathByRoleId(
+  body: API.CasbinInReceive,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PolicyPathResponse; msg?: string }>(
+    `/api/v1/casbin/getPolicyPathByRoleId`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 更新角色api权限 POST /casbin/UpdateCasbin */
+export async function postCasbinUpdateCasbin(
+  body: API.CasbinInReceive,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/casbin/UpdateCasbin`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/system/CheckDB.ts b/src/services/system/CheckDB.ts
new file mode 100644
index 0000000..5b81e97
--- /dev/null
+++ b/src/services/system/CheckDB.ts
@@ -0,0 +1,14 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 初始化用户数据库 POST /init/checkdb */
+export async function postInitCheckdb(options?: { [key: string]: any }) {
+  return request<API.Response & { data?: Record<string, any>; msg?: string }>(
+    `/api/v1/init/checkdb`,
+    {
+      method: 'POST',
+      ...(options || {}),
+    },
+  );
+}
diff --git a/src/services/system/Department.ts b/src/services/system/Department.ts
new file mode 100644
index 0000000..22aa036
--- /dev/null
+++ b/src/services/system/Department.ts
@@ -0,0 +1,139 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建基础department POST /department/createDepartment */
+export async function postDepartmentCreateDepartment(
+  body: API.Department,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/department/createDepartment`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除department DELETE /department/deleteDepartment */
+export async function deleteDepartmentDeleteDepartment(
+  body: API.Department,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/department/deleteDepartment`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除选中Department DELETE /department/deleteDepartmentsByIds */
+export async function deleteDepartmentDeleteDepartmentsByIds(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/department/deleteDepartmentsByIds`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 根据id获取department POST /department/getDepartmentById */
+export async function postDepartmentGetDepartmentById(
+  body: API.GetById,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.DepartmentResponse }>(
+    `/api/v1/department/getDepartmentById`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取角色列表 POST /department/getDepartmentFkSelect */
+export async function postDepartmentGetDepartmentFkSelect(options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.FkResult; msg?: string }>(
+    `/api/v1/department/getDepartmentFkSelect`,
+    {
+      method: 'POST',
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取Department列表 POST /department/getDepartmentList */
+export async function postDepartmentGetDepartmentList(
+  body: API.PageInfo,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/department/getDepartmentList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获得名称列表 POST /department/getDepartmentNames */
+export async function postDepartmentGetDepartmentNames(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.NamesResult; msg?: string }>(
+    `/api/v1/department/getDepartmentNames`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获取部门树 POST /department/getDepartmentTree */
+export async function postDepartmentGetDepartmentTree(options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.TreeResponse; msg?: string }>(
+    `/api/v1/department/getDepartmentTree`,
+    {
+      method: 'POST',
+      ...(options || {}),
+    },
+  );
+}
+
+/** 修改基础department PUT /department/updateDepartment */
+export async function putDepartmentUpdateDepartment(
+  body: API.Department,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/department/updateDepartment`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/system/Dictionary.ts b/src/services/system/Dictionary.ts
new file mode 100644
index 0000000..cae1e8d
--- /dev/null
+++ b/src/services/system/Dictionary.ts
@@ -0,0 +1,84 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建Dictionary POST /sysDictionary/createDictionary */
+export async function postSysDictionaryCreateDictionary(
+  body: API.Dictionary,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/sysDictionary/createDictionary`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除Dictionary DELETE /sysDictionary/deleteDictionary */
+export async function deleteSysDictionaryDeleteDictionary(
+  body: API.Dictionary,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/sysDictionary/deleteDictionary`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 用id查询Dictionary GET /sysDictionary/findDictionary */
+export async function getSysDictionaryFindDictionary(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.getSysDictionaryFindDictionaryParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: Record<string, any>; msg?: string }>(
+    `/api/v1/sysDictionary/findDictionary`,
+    {
+      method: 'GET',
+      params: {
+        ...params,
+      },
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取Dictionary列表 GET /sysDictionary/getDictionaryList */
+export async function getSysDictionaryGetDictionaryList(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.getSysDictionaryGetDictionaryListParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/sysDictionary/getDictionaryList`,
+    {
+      method: 'GET',
+      params: {
+        ...params,
+      },
+      ...(options || {}),
+    },
+  );
+}
+
+/** 更新Dictionary PUT /sysDictionary/updateDictionary */
+export async function putSysDictionaryUpdateDictionary(
+  body: API.Dictionary,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/sysDictionary/updateDictionary`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/system/DictionaryDetail.ts b/src/services/system/DictionaryDetail.ts
new file mode 100644
index 0000000..0c3b13e
--- /dev/null
+++ b/src/services/system/DictionaryDetail.ts
@@ -0,0 +1,93 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建DictionaryDetail POST /sysDictionaryDetail/createDictionaryDetail */
+export async function postSysDictionaryDetailCreateDictionaryDetail(
+  body: API.DictionaryDetail,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/sysDictionaryDetail/createDictionaryDetail`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 删除DictionaryDetail DELETE /sysDictionaryDetail/deleteDictionaryDetail */
+export async function deleteSysDictionaryDetailDeleteDictionaryDetail(
+  body: API.DictionaryDetail,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/sysDictionaryDetail/deleteDictionaryDetail`,
+    {
+      method: 'DELETE',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 用id查询DictionaryDetail GET /sysDictionaryDetail/findDictionaryDetail */
+export async function getSysDictionaryDetailFindDictionaryDetail(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.getSysDictionaryDetailFindDictionaryDetailParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: Record<string, any>; msg?: string }>(
+    `/api/v1/sysDictionaryDetail/findDictionaryDetail`,
+    {
+      method: 'GET',
+      params: {
+        ...params,
+      },
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取DictionaryDetail列表 GET /sysDictionaryDetail/getDictionaryDetailList */
+export async function getSysDictionaryDetailGetDictionaryDetailList(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.getSysDictionaryDetailGetDictionaryDetailListParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/sysDictionaryDetail/getDictionaryDetailList`,
+    {
+      method: 'GET',
+      params: {
+        ...params,
+      },
+      ...(options || {}),
+    },
+  );
+}
+
+/** 更新DictionaryDetail PUT /sysDictionaryDetail/updateDictionaryDetail */
+export async function putSysDictionaryDetailUpdateDictionaryDetail(
+  body: API.DictionaryDetail,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/sysDictionaryDetail/updateDictionaryDetail`,
+    {
+      method: 'PUT',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
diff --git a/src/services/system/File.ts b/src/services/system/File.ts
new file mode 100644
index 0000000..bd5c60e
--- /dev/null
+++ b/src/services/system/File.ts
@@ -0,0 +1,68 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 获取文件路径 POST /file/getFileById */
+export async function postFileGetFileById(body: API.GetById, options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.FileResponse }>(`/api/v1/file/getFileById`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 上传照片 POST /file/uploadImage */
+export async function postFileUploadImage(body: {}, file?: File, options?: { [key: string]: any }) {
+  const formData = new FormData();
+
+  if (file) {
+    formData.append('file', file);
+  }
+
+  Object.keys(body).forEach((ele) => {
+    const item = (body as any)[ele];
+
+    if (item !== undefined && item !== null) {
+      formData.append(
+        ele,
+        typeof item === 'object' && !(item instanceof File) ? JSON.stringify(item) : item,
+      );
+    }
+  });
+
+  return request<API.Response & { data?: API.File; msg?: string }>(`/api/v1/file/uploadImage`, {
+    method: 'POST',
+    data: formData,
+    requestType: 'form',
+    ...(options || {}),
+  });
+}
+
+export async function postFileUploadFile(body: {}, file?: File, options?: { [key: string]: any }) {
+  const formData = new FormData();
+
+  if (file) {
+    formData.append('file', file);
+  }
+
+  Object.keys(body).forEach((ele) => {
+    const item = (body as any)[ele];
+
+    if (item !== undefined && item !== null) {
+      formData.append(
+          ele,
+          typeof item === 'object' && !(item instanceof File) ? JSON.stringify(item) : item,
+      );
+    }
+  });
+
+  return request<API.Response & { data?: API.File; msg?: string }>(`/api/v1/file/uploadFile`, {
+    method: 'POST',
+    data: formData,
+    requestType: 'form',
+    ...(options || {}),
+  });
+}
diff --git a/src/services/system/InitDB.ts b/src/services/system/InitDB.ts
new file mode 100644
index 0000000..bb8a1e0
--- /dev/null
+++ b/src/services/system/InitDB.ts
@@ -0,0 +1,15 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 初始化用户数据库 POST /init/initdb */
+export async function postInitInitdb(body: API.InitDB, options?: { [key: string]: any }) {
+  return request<API.Response & { data?: string }>(`/api/v1/init/initdb`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/system/Jwt.ts b/src/services/system/Jwt.ts
new file mode 100644
index 0000000..fb6d804
--- /dev/null
+++ b/src/services/system/Jwt.ts
@@ -0,0 +1,11 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** jwt加入黑名单 POST /jwt/jsonInBlacklist */
+export async function postJwtJsonInBlacklist(options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/jwt/jsonInBlacklist`, {
+    method: 'POST',
+    ...(options || {}),
+  });
+}
diff --git a/src/services/system/Menu.ts b/src/services/system/Menu.ts
new file mode 100644
index 0000000..3f92a06
--- /dev/null
+++ b/src/services/system/Menu.ts
@@ -0,0 +1,76 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 新增菜单 POST /menu/createMenu */
+export async function postMenuCreateMenu(body: API.Menu, options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/menu/createMenu`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除菜单 DELETE /menu/deleteMenu */
+export async function deleteMenuDeleteMenu(body: API.GetById, options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/menu/deleteMenu`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 获取用户动态路由 POST /menu/getMenu */
+export async function postMenuGetMenu(options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.RoutesResponse; msg?: string }>(
+    `/api/v1/menu/getMenu`,
+    {
+      method: 'POST',
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取基础menu列表 POST /menu/getMenuList */
+export async function postMenuGetMenuList(body: API.PageInfo, options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/menu/getMenuList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获取用户菜单树 POST /menu/getMenuTree */
+export async function postMenuGetMenuTree(options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.TreeResponse; msg?: string }>(
+    `/api/v1/menu/getMenuTree`,
+    {
+      method: 'POST',
+      ...(options || {}),
+    },
+  );
+}
+
+/** 更新菜单 PUT /menu/updateMenu */
+export async function putMenuUpdateMenu(body: API.Menu, options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/menu/updateMenu`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/system/OperationRecord.ts b/src/services/system/OperationRecord.ts
new file mode 100644
index 0000000..60cab5a
--- /dev/null
+++ b/src/services/system/OperationRecord.ts
@@ -0,0 +1,93 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建OperationRecord POST /sysOperationRecord/createOperationRecord */
+export async function postSysOperationRecordCreateOperationRecord(
+  body: API.OperationRecord,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/sysOperationRecord/createOperationRecord`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 删除OperationRecord DELETE /sysOperationRecord/deleteOperationRecord */
+export async function deleteSysOperationRecordDeleteOperationRecord(
+  body: API.OperationRecord,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/sysOperationRecord/deleteOperationRecord`,
+    {
+      method: 'DELETE',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 批量删除OperationRecord DELETE /sysOperationRecord/deleteOperationRecordByIds */
+export async function deleteSysOperationRecordDeleteOperationRecordByIds(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(
+    `/api/v1/sysOperationRecord/deleteOperationRecordByIds`,
+    {
+      method: 'DELETE',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 用id查询OperationRecord GET /sysOperationRecord/findOperationRecord */
+export async function getSysOperationRecordFindOperationRecord(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.getSysOperationRecordFindOperationRecordParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: Record<string, any>; msg?: string }>(
+    `/api/v1/sysOperationRecord/findOperationRecord`,
+    {
+      method: 'GET',
+      params: {
+        ...params,
+      },
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取OperationRecord列表 GET /sysOperationRecord/getOperationRecordList */
+export async function getSysOperationRecordGetOperationRecordList(
+  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
+  params: API.getSysOperationRecordGetOperationRecordListParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/sysOperationRecord/getOperationRecordList`,
+    {
+      method: 'GET',
+      params: {
+        ...params,
+      },
+      ...(options || {}),
+    },
+  );
+}
diff --git a/src/services/system/Post.ts b/src/services/system/Post.ts
new file mode 100644
index 0000000..7fc5e52
--- /dev/null
+++ b/src/services/system/Post.ts
@@ -0,0 +1,117 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建基础post POST /post/createPost */
+export async function postPostCreatePost(body: API.Post, options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/post/createPost`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除post DELETE /post/deletePost */
+export async function deletePostDeletePost(body: API.Post, options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/post/deletePost`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除选中Post DELETE /post/deletePostsByIds */
+export async function deletePostDeletePostsByIds(
+  body: API.IdsReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/post/deletePostsByIds`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 根据id获取post POST /post/getPostById */
+export async function postPostGetPostById(body: API.GetById, options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.PostResponse }>(`/api/v1/post/getPostById`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 分页获取角色列表 POST /post/getPostFkSelect */
+export async function postPostGetPostFkSelect(
+  body: API.GetFkSelect,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.FkResult; msg?: string }>(
+    `/api/v1/post/getPostFkSelect`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取Post列表 POST /post/getPostList */
+export async function postPostGetPostList(
+  body: API.SearchPostParams,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/post/getPostList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获得名称列表 POST /post/getPostNames */
+export async function postPostGetPostNames(body: API.IdsReq, options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.NamesResult; msg?: string }>(
+    `/api/v1/post/getPostNames`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 修改基础post PUT /post/updatePost */
+export async function putPostUpdatePost(body: API.Post, options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/post/updatePost`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/system/Role.ts b/src/services/system/Role.ts
new file mode 100644
index 0000000..5d97cab
--- /dev/null
+++ b/src/services/system/Role.ts
@@ -0,0 +1,99 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 创建角色 POST /role/createRole */
+export async function postRoleCreateRole(body: API.Role, options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.RoleResponse; msg?: string }>(
+    `/api/v1/role/createRole`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取角色列表 POST /role/getRoleFkSelect */
+export async function postRoleGetRoleFkSelect(
+  body: API.GetFkSelect,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.FkResult; msg?: string }>(
+    `/api/v1/role/getRoleFkSelect`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 分页获取角色列表 POST /role/getRoleList */
+export async function postRoleGetRoleList(body: API.PageInfo, options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/role/getRoleList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获取角色权限 POST /role/getRolePermission */
+export async function postRoleGetRolePermission(
+  body: API.GetById,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: API.RolePermissionResponse }>(
+    `/api/v1/role/getRolePermission`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 更新角色信息 PUT /role/updateRole */
+export async function putRoleUpdateRole(body: API.Role, options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.RoleResponse; msg?: string }>(
+    `/api/v1/role/updateRole`,
+    {
+      method: 'PUT',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 更新角色权限 PUT /role/updateRolePermission */
+export async function putRoleUpdateRolePermission(
+  body: API.UpdateRolePermissionParams,
+  options?: { [key: string]: any },
+) {
+  return request<any>(`/api/v1/role/updateRolePermission`, {
+    method: 'PUT',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/system/System.ts b/src/services/system/System.ts
new file mode 100644
index 0000000..314b898
--- /dev/null
+++ b/src/services/system/System.ts
@@ -0,0 +1,48 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 获取服务器信息 POST /system/getServerInfo */
+export async function postSystemGetServerInfo(options?: { [key: string]: any }) {
+  return request<API.Response & { data?: Record<string, any>; msg?: string }>(
+    `/api/v1/system/getServerInfo`,
+    {
+      method: 'POST',
+      ...(options || {}),
+    },
+  );
+}
+
+/** 获取配置文件内容 POST /system/getSystemConfig */
+export async function postSystemGetSystemConfig(options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.SysConfigResponse; msg?: string }>(
+    `/api/v1/system/getSystemConfig`,
+    {
+      method: 'POST',
+      ...(options || {}),
+    },
+  );
+}
+
+/** 重启系统 POST /system/reloadSystem */
+export async function postSystemReloadSystem(options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/system/reloadSystem`, {
+    method: 'POST',
+    ...(options || {}),
+  });
+}
+
+/** 设置配置文件内容 POST /system/setSystemConfig */
+export async function postSystemSetSystemConfig(
+  body: API.System,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { data?: string }>(`/api/v1/system/setSystemConfig`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/system/User.ts b/src/services/system/User.ts
new file mode 100644
index 0000000..12c79b6
--- /dev/null
+++ b/src/services/system/User.ts
@@ -0,0 +1,137 @@
+// @ts-ignore
+/* eslint-disable */
+import { request } from '@umijs/max';
+
+/** 用户注册账号 POST /user/admin_register */
+export async function postUserAdminRegister(body: API.Register, options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.UserResponse; msg?: string }>(
+    `/api/v1/user/admin_register`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 用户修改密码 POST /user/changePassword */
+export async function postUserChangePassword(
+  body: API.ChangePasswordReq,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/user/changePassword`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 删除用户 DELETE /user/deleteUser */
+export async function deleteUserDeleteUser(body: API.GetById, options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/user/deleteUser`, {
+    method: 'DELETE',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 获取用户信息 GET /user/getUserInfo */
+export async function getUserGetUserInfo(options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.UserView; msg?: string }>(`/api/v1/user/getUserInfo`, {
+    method: 'GET',
+    ...(options || {}),
+  });
+}
+
+/** 分页获取用户列表 POST /user/getUserList */
+export async function postUserGetUserList(body: API.PageInfo, options?: { [key: string]: any }) {
+  return request<API.Response & { data?: API.PageResult; msg?: string }>(
+    `/api/v1/user/getUserList`,
+    {
+      method: 'POST',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 重置用户密码 POST /user/resetPassword */
+export async function postUserResetPassword(body: API.User, options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/user/resetPassword`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 设置用户信息 PUT /user/SetSelfInfo */
+export async function putUserSetSelfInfo(body: API.User, options?: { [key: string]: any }) {
+  return request<API.Response & { data?: Record<string, any>; msg?: string }>(
+    `/api/v1/user/SetSelfInfo`,
+    {
+      method: 'PUT',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 设置用户信息 PUT /user/setUserInfo */
+export async function putUserSetUserInfo(body: API.User, options?: { [key: string]: any }) {
+  return request<API.Response & { data?: Record<string, any>; msg?: string }>(
+    `/api/v1/user/setUserInfo`,
+    {
+      method: 'PUT',
+      headers: {
+        'Content-Type': 'application/json',
+      },
+      data: body,
+      ...(options || {}),
+    },
+  );
+}
+
+/** 更改用户权限 POST /user/setUserRole */
+export async function postUserSetUserRole(body: API.SetUserRole, options?: { [key: string]: any }) {
+  return request<API.Response & { msg?: string }>(`/api/v1/user/setUserRole`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 设置用户权限 POST /user/setUserRoles */
+export async function postUserSetUserRoles(
+  body: API.SetUserRoles,
+  options?: { [key: string]: any },
+) {
+  return request<API.Response & { msg?: string }>(`/api/v1/user/setUserRoles`, {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
diff --git a/src/services/system/index.ts b/src/services/system/index.ts
new file mode 100644
index 0000000..fce1532
--- /dev/null
+++ b/src/services/system/index.ts
@@ -0,0 +1,38 @@
+// @ts-ignore
+/* eslint-disable */
+// API 更新时间:
+// API 唯一标识:
+import * as Api from './Api';
+import * as Base from './Base';
+import * as Casbin from './Casbin';
+import * as CheckDB from './CheckDB';
+import * as Department from './Department';
+import * as Dictionary from './Dictionary';
+import * as DictionaryDetail from './DictionaryDetail';
+import * as File from './File';
+import * as InitDB from './InitDB';
+import * as Jwt from './Jwt';
+import * as Menu from './Menu';
+import * as OperationRecord from './OperationRecord';
+import * as Post from './Post';
+import * as Role from './Role';
+import * as System from './System';
+import * as User from './User';
+export default {
+  Api,
+  Base,
+  Casbin,
+  Department,
+  File,
+  CheckDB,
+  InitDB,
+  Jwt,
+  Menu,
+  Post,
+  Role,
+  Dictionary,
+  DictionaryDetail,
+  OperationRecord,
+  System,
+  User,
+};
diff --git a/src/services/system/typings.d.ts b/src/services/system/typings.d.ts
new file mode 100644
index 0000000..37ecef7
--- /dev/null
+++ b/src/services/system/typings.d.ts
@@ -0,0 +1,1028 @@
+declare namespace API {
+  type AliyunOSS = {
+    'access-key-id'?: string;
+    'access-key-secret'?: string;
+    'base-path'?: string;
+    'bucket-name'?: string;
+    'bucket-url'?: string;
+    endpoint?: string;
+  };
+
+  type Api = {
+    /** api组 */
+    apiGroup?: string;
+    createTime?: string;
+    /** api中文描述 */
+    description?: string;
+    id?: number;
+    /** 方法:创建POST(默认)|查看GET|更新PUT|删除DELETE */
+    method?: string;
+    /** api路径 */
+    path?: string;
+    updateTime?: string;
+  };
+
+  type ApiGroup = {
+    checkable?: boolean;
+    children?: ApiGroupSon[];
+    key?: string;
+    title?: string;
+  };
+
+  type ApiGroupSon = {
+    key?: number;
+    title?: string;
+  };
+
+  type Autocode = {
+    root?: string;
+    server?: string;
+    'server-api'?: string;
+    'server-initialize'?: string;
+    'server-model'?: string;
+    'server-plug'?: string;
+    'server-request'?: string;
+    'server-router'?: string;
+    'server-service'?: string;
+    'transfer-restart'?: boolean;
+    web?: string;
+    'web-api'?: string;
+    'web-form'?: string;
+    'web-table'?: string;
+  };
+
+  type AwsS3 = {
+    'base-url'?: string;
+    bucket?: string;
+    'disable-ssl'?: boolean;
+    endpoint?: string;
+    'path-prefix'?: string;
+    region?: string;
+    's3-force-path-style'?: boolean;
+    'secret-id'?: string;
+    'secret-key'?: string;
+  };
+
+  type Captcha = {
+    /** 验证码高度 */
+    'img-height'?: number;
+    /** 验证码宽度 */
+    'img-width'?: number;
+    /** 验证码长度 */
+    'key-long'?: number;
+    /** 防爆破验证码开启此数,0代表每次登录都需要验证码,其他数字代表错误密码此数,如3代表错误三次后出现验证码 */
+    'open-captcha'?: number;
+    /** 防爆破验证码超时时间,单位:s(秒) */
+    'open-captcha-timeout'?: number;
+  };
+
+  type CasbinInfo = {
+    /** 方法 */
+    method?: string;
+    /** 路径 */
+    path?: string;
+  };
+
+  type CasbinInReceive = {
+    casbinInfos?: CasbinInfo[];
+    /** 权限id */
+    roleId?: number;
+  };
+
+  type ChangePasswordReq = {
+    /** 新密码 */
+    newPassword?: string;
+    /** 密码 */
+    password?: string;
+  };
+
+  type CORS = {
+    mode?: string;
+    whitelist?: CORSWhitelist[];
+  };
+
+  type CORSWhitelist = {
+    'allow-credentials'?: boolean;
+    'allow-headers'?: string;
+    'allow-methods'?: string;
+    'allow-origin'?: string;
+    'expose-headers'?: string;
+  };
+
+  type Department = {
+    children?: Department[];
+    code?: string;
+    createTime?: string;
+    email?: string;
+    id?: number;
+    /** userId */
+    leader?: string;
+    name?: string;
+    parentId?: number;
+    path?: string;
+    phone?: string;
+    remark?: string;
+    sort?: number;
+    /** 状态 */
+    status?: boolean;
+    updateTime?: string;
+  };
+
+  type DepartmentResponse = {
+    department?: Department;
+  };
+
+  type Detail = {
+    /** 需要比较时间的字段 */
+    compareField?: string;
+    /** 时间间隔 */
+    interval?: string;
+    /** 需要清理的表名 */
+    tableName?: string;
+  };
+
+  type Dictionary = {
+    createTime?: string;
+    /** 描述 */
+    desc?: string;
+    id?: number;
+    /** 字典名(中) */
+    name?: string;
+    /** 状态 */
+    status?: boolean;
+    sysDictionaryDetails?: DictionaryDetail[];
+    /** 字典名(英) */
+    type?: string;
+    updateTime?: string;
+  };
+
+  type DictionaryDetail = {
+    createTime?: string;
+    id?: number;
+    /** 展示值 */
+    label?: string;
+    /** 排序标记 */
+    sort?: number;
+    /** 启用状态 */
+    status?: boolean;
+    /** 关联标记 */
+    sysDictionaryID?: number;
+    updateTime?: string;
+    /** 字典值 */
+    value?: number;
+  };
+
+  type Email = {
+    /** 收件人 */
+    from?: string;
+    /** 服务器地址 */
+    host?: string;
+    /** 是否SSL */
+    'is-ssl'?: boolean;
+    /** 昵称 */
+    nickname?: string;
+    /** 端口 */
+    port?: number;
+    /** 密钥 */
+    secret?: string;
+    /** 收件人:多个以英文逗号分隔 */
+    to?: string;
+  };
+
+  type Excel = {
+    dir?: string;
+  };
+
+  type File = {
+    createTime?: string;
+    id?: number;
+    /** 文件名 */
+    name?: string;
+    path?: string;
+    /** 文件标签 */
+    tag?: string;
+    updateTime?: string;
+  };
+
+  type FileResponse = {
+    file?: File;
+  };
+
+  type FkResult = {
+    list?: any;
+  };
+
+  type GetById = {
+    /** 主键ID */
+    id?: number;
+  };
+
+  type GetFkSelect = {
+    /** 关键字 */
+    keyword?: string;
+  };
+
+  type getSysDictionaryDetailFindDictionaryDetailParams = {
+    createTime?: string;
+    id?: number;
+    /** 展示值 */
+    label?: string;
+    /** 排序标记 */
+    sort?: number;
+    /** 启用状态 */
+    status?: boolean;
+    /** 关联标记 */
+    sysDictionaryID?: number;
+    updateTime?: string;
+    /** 字典值 */
+    value?: number;
+  };
+
+  type getSysDictionaryDetailGetDictionaryDetailListParams = {
+    createTime?: string;
+    id?: number;
+    /** 关键字 */
+    keyword?: string;
+    /** 展示值 */
+    label?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+    /** 排序标记 */
+    sort?: number;
+    /** 启用状态 */
+    status?: boolean;
+    /** 关联标记 */
+    sysDictionaryID?: number;
+    updateTime?: string;
+    /** 字典值 */
+    value?: number;
+  };
+
+  type getSysDictionaryFindDictionaryParams = {
+    createTime?: string;
+    /** 描述 */
+    desc?: string;
+    id?: number;
+    /** 字典名(中) */
+    name?: string;
+    /** 状态 */
+    status?: boolean;
+    /** 字典名(英) */
+    type?: string;
+    updateTime?: string;
+  };
+
+  type getSysDictionaryGetDictionaryListParams = {
+    createTime?: string;
+    /** 描述 */
+    desc?: string;
+    id?: number;
+    /** 关键字 */
+    keyword?: string;
+    /** 字典名(中) */
+    name?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+    /** 状态 */
+    status?: boolean;
+    /** 字典名(英) */
+    type?: string;
+    updateTime?: string;
+  };
+
+  type getSysOperationRecordFindOperationRecordParams = {
+    /** 代理 */
+    agent?: string;
+    /** 请求Body */
+    body?: string;
+    createTime?: string;
+    /** 错误信息 */
+    error_message?: string;
+    id?: number;
+    /** 请求ip */
+    ip?: string;
+    /** 延迟 */
+    latency?: string;
+    /** 请求方法 */
+    method?: string;
+    /** 请求路径 */
+    path?: string;
+    /** 响应Body */
+    resp?: string;
+    /** 请求状态 */
+    status?: number;
+    updateTime?: string;
+    /** 用户id */
+    user_id?: number;
+  };
+
+  type getSysOperationRecordGetOperationRecordListParams = {
+    /** 代理 */
+    agent?: string;
+    /** 请求Body */
+    body?: string;
+    createTime?: string;
+    /** 错误信息 */
+    error_message?: string;
+    id?: number;
+    /** 请求ip */
+    ip?: string;
+    /** 关键字 */
+    keyword?: string;
+    /** 延迟 */
+    latency?: string;
+    /** 请求方法 */
+    method?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+    /** 请求路径 */
+    path?: string;
+    /** 响应Body */
+    resp?: string;
+    /** 请求状态 */
+    status?: number;
+    updateTime?: string;
+    /** 用户id */
+    user_id?: number;
+  };
+
+  type HuaWeiObs = {
+    'access-key'?: string;
+    bucket?: string;
+    endpoint?: string;
+    path?: string;
+    'secret-key'?: string;
+  };
+
+  type IdsReq = {
+    ids?: number[];
+  };
+
+  type InitDB = {
+    /** 数据库名 */
+    dbName: string;
+    /** 数据库类型 */
+    dbType?: string;
+    /** 服务器地址 */
+    host?: string;
+    /** DB initial langauge // added by mohamed hassan to support multilanguage */
+    language?: string;
+    /** 数据库密码 */
+    password?: string;
+    /** 数据库连接端口 */
+    port?: string;
+    /** 数据库用户名 */
+    userName: string;
+  };
+
+  type JWT = {
+    /** 缓冲时间 */
+    'buffer-time'?: string;
+    /** 过期时间 */
+    'expires-time'?: string;
+    /** 签发者 */
+    issuer?: string;
+    /** jwt签名 */
+    'signing-key'?: string;
+  };
+
+  type Language = {
+    dir?: string;
+    language?: string;
+  };
+
+  type Local = {
+    /** 本地文件访问路径 */
+    path?: string;
+    /** 本地文件存储路径 */
+    'store-path'?: string;
+  };
+
+  type Login = {
+    captcha?: string;
+    captchaId?: string;
+    password?: string;
+    username?: string;
+  };
+
+  type LoginResponse = {
+    expiresAt?: number;
+    token?: string;
+    user?: User;
+  };
+
+  type Menu = {
+    children?: Menu[];
+    component?: string;
+    createTime?: string;
+    externalLink?: string;
+    hidden?: boolean;
+    icon?: string;
+    id?: number;
+    key?: string;
+    /** 路由name */
+    name?: string;
+    parentId?: number;
+    path?: string;
+    permission?: string;
+    /** 备注 */
+    remark?: string;
+    sort?: number;
+    title?: string;
+    /** 菜单类型(M目录 C菜单 F按钮) */
+    type?: string;
+    updateTime?: string;
+  };
+
+  type Mssql = {
+    /** 高级配置 */
+    config?: string;
+    /** 数据库名 */
+    'db-name'?: string;
+    /** 数据库引擎,默认InnoDB */
+    engine?: string;
+    /** 是否开启Gorm全局日志 */
+    'log-mode'?: string;
+    /** 是否通过zap写入日志文件 */
+    'log-zap'?: boolean;
+    /** 空闲中的最大连接数 */
+    'max-idle-conns'?: number;
+    /** 打开到数据库的最大连接数 */
+    'max-open-conns'?: number;
+    /** 数据库密码 */
+    password?: string;
+    /** 服务器地址:端口 */
+    path?: string;
+    /** :端口 */
+    port?: string;
+    /** 全局表前缀,单独定义TableName则不生效 */
+    prefix?: string;
+    /** 是否开启全局禁用复数,true表示开启 */
+    singular?: boolean;
+    /** 数据库用户名 */
+    username?: string;
+  };
+
+  type Mysql = {
+    /** 高级配置 */
+    config?: string;
+    /** 数据库名 */
+    'db-name'?: string;
+    /** 数据库引擎,默认InnoDB */
+    engine?: string;
+    /** 是否开启Gorm全局日志 */
+    'log-mode'?: string;
+    /** 是否通过zap写入日志文件 */
+    'log-zap'?: boolean;
+    /** 空闲中的最大连接数 */
+    'max-idle-conns'?: number;
+    /** 打开到数据库的最大连接数 */
+    'max-open-conns'?: number;
+    /** 数据库密码 */
+    password?: string;
+    /** 服务器地址:端口 */
+    path?: string;
+    /** :端口 */
+    port?: string;
+    /** 全局表前缀,单独定义TableName则不生效 */
+    prefix?: string;
+    /** 是否开启全局禁用复数,true表示开启 */
+    singular?: boolean;
+    /** 数据库用户名 */
+    username?: string;
+  };
+
+  type NamesResult = {
+    list?: any;
+  };
+
+  type OperationRecord = {
+    /** 代理 */
+    agent?: string;
+    /** 请求Body */
+    body?: string;
+    createTime?: string;
+    /** 错误信息 */
+    error_message?: string;
+    id?: number;
+    /** 请求ip */
+    ip?: string;
+    /** 延迟 */
+    latency?: string;
+    /** 请求方法 */
+    method?: string;
+    /** 请求路径 */
+    path?: string;
+    /** 响应Body */
+    resp?: string;
+    /** 请求状态 */
+    status?: number;
+    updateTime?: string;
+    /** 用户id */
+    user_id?: number;
+  };
+
+  type Oracle = {
+    /** 高级配置 */
+    config?: string;
+    /** 数据库名 */
+    'db-name'?: string;
+    /** 数据库引擎,默认InnoDB */
+    engine?: string;
+    /** 是否开启Gorm全局日志 */
+    'log-mode'?: string;
+    /** 是否通过zap写入日志文件 */
+    'log-zap'?: boolean;
+    /** 空闲中的最大连接数 */
+    'max-idle-conns'?: number;
+    /** 打开到数据库的最大连接数 */
+    'max-open-conns'?: number;
+    /** 数据库密码 */
+    password?: string;
+    /** 服务器地址:端口 */
+    path?: string;
+    /** :端口 */
+    port?: string;
+    /** 全局表前缀,单独定义TableName则不生效 */
+    prefix?: string;
+    /** 是否开启全局禁用复数,true表示开启 */
+    singular?: boolean;
+    /** 数据库用户名 */
+    username?: string;
+  };
+
+  type PageInfo = {
+    /** 关键字 */
+    keyword?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+  };
+
+  type PageResult = {
+    list?: any;
+    page?: number;
+    pageSize?: number;
+    total?: number;
+  };
+
+  type Pgsql = {
+    /** 高级配置 */
+    config?: string;
+    /** 数据库名 */
+    'db-name'?: string;
+    /** 数据库引擎,默认InnoDB */
+    engine?: string;
+    /** 是否开启Gorm全局日志 */
+    'log-mode'?: string;
+    /** 是否通过zap写入日志文件 */
+    'log-zap'?: boolean;
+    /** 空闲中的最大连接数 */
+    'max-idle-conns'?: number;
+    /** 打开到数据库的最大连接数 */
+    'max-open-conns'?: number;
+    /** 数据库密码 */
+    password?: string;
+    /** 服务器地址:端口 */
+    path?: string;
+    /** :端口 */
+    port?: string;
+    /** 全局表前缀,单独定义TableName则不生效 */
+    prefix?: string;
+    /** 是否开启全局禁用复数,true表示开启 */
+    singular?: boolean;
+    /** 数据库用户名 */
+    username?: string;
+  };
+
+  type PolicyPathResponse = {
+    paths?: CasbinInfo[];
+  };
+
+  type Post = {
+    code?: string;
+    createTime?: string;
+    id?: number;
+    name?: string;
+    remark?: string;
+    sort?: number;
+    /** 状态 */
+    status?: boolean;
+    updateTime?: string;
+  };
+
+  type PostResponse = {
+    post?: Post;
+  };
+
+  type Qiniu = {
+    /** 秘钥AK */
+    'access-key'?: string;
+    /** 空间名称 */
+    bucket?: string;
+    /** CDN加速域名 */
+    'img-path'?: string;
+    /** 秘钥SK */
+    'secret-key'?: string;
+    /** 上传是否使用CDN上传加速 */
+    'use-cdn-domains'?: boolean;
+    /** 是否使用https */
+    'use-https'?: boolean;
+    /** 存储区域 */
+    zone?: string;
+  };
+
+  type Redis = {
+    /** 服务器地址:端口 */
+    addr?: string;
+    /** redis的哪个数据库 */
+    db?: number;
+    /** 密码 */
+    password?: string;
+  };
+
+  type Register = {
+    avatarId?: number;
+    deptId?: number;
+    email?: string;
+    enable?: boolean;
+    nickName?: string;
+    passWord?: string;
+    phone?: string;
+    postId?: number;
+    /** 多岗位 */
+    postIds?: string;
+    roleId?: number;
+    /** 多角色 */
+    roleIds?: string;
+    userName?: string;
+  };
+
+  type Response = {
+    code?: number;
+    data?: any;
+    msg?: string;
+    success?: boolean;
+  };
+
+  type Role = {
+    apiIds?: string;
+    code?: string;
+    createTime?: string;
+    dataScope?: string;
+    deptIds?: string;
+    id?: number;
+    menuIds?: string;
+    name?: string;
+    remark?: string;
+    sort?: number;
+    /** 状态 */
+    status?: boolean;
+    updateTime?: string;
+  };
+
+  type RolePermissionResponse = {
+    apiIds?: number[];
+    dataScope?: string;
+    deptIds?: number[];
+    menuIds?: number[];
+    roleId?: number;
+  };
+
+  type RoleResponse = {
+    role?: Role;
+  };
+
+  type RoleSelectResponse = {
+    label?: string;
+    value?: number;
+  };
+
+  type Route = {
+    access?: string;
+    component?: string;
+    icon?: string;
+    key?: string;
+    name?: string;
+    path?: string;
+    routes?: Route[];
+  };
+
+  type RoutesResponse = {
+    routes?: Route[];
+  };
+
+  type SearchApiParams = {
+    /** api组 */
+    apiGroup?: string;
+    createTime?: string;
+    /** 排序方式:升序false(默认)|降序true */
+    desc?: boolean;
+    /** api中文描述 */
+    description?: string;
+    id?: number;
+    /** 关键字 */
+    keyword?: string;
+    /** 方法:创建POST(默认)|查看GET|更新PUT|删除DELETE */
+    method?: string;
+    /** 排序 */
+    orderKey?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+    /** api路径 */
+    path?: string;
+    updateTime?: string;
+  };
+
+  type SearchPostParams = {
+    code?: string;
+    createTime?: string;
+    /** 排序方式:升序false(默认)|降序true */
+    desc?: boolean;
+    id?: number;
+    /** 关键字 */
+    keyword?: string;
+    name?: string;
+    /** 排序 */
+    orderKey?: string;
+    /** 页码 */
+    page?: number;
+    /** 每页大小 */
+    pageSize?: number;
+    remark?: string;
+    sort?: number;
+    /** 状态 */
+    status?: boolean;
+    updateTime?: string;
+  };
+
+  type Server = {
+    'aliyun-oss'?: AliyunOSS;
+    /** auto */
+    autocode?: Autocode;
+    'aws-s3'?: AwsS3;
+    captcha?: Captcha;
+    /** 跨域配置 */
+    cors?: CORS;
+    'db-list'?: SpecializedDB[];
+    email?: Email;
+    excel?: Excel;
+    'hua-wei-obs'?: HuaWeiObs;
+    jwt?: JWT;
+    language?: Language;
+    /** oss */
+    local?: Local;
+    mssql?: Mssql;
+    /** gorm */
+    mysql?: Mysql;
+    oracle?: Oracle;
+    pgsql?: Pgsql;
+    qiniu?: Qiniu;
+    redis?: Redis;
+    sqlite?: Sqlite;
+    system?: System;
+    'tencent-cos'?: TencentCOS;
+    timer?: Timer;
+    zap?: Zap;
+  };
+
+  type SetUserRole = {
+    /** 角色ID */
+    roleId?: number;
+  };
+
+  type SetUserRoles = {
+    id?: number;
+    /** 角色ID */
+    roleIds?: number[];
+  };
+
+  type SpecializedDB = {
+    'alias-name'?: string;
+    /** 高级配置 */
+    config?: string;
+    /** 数据库名 */
+    'db-name'?: string;
+    disable?: boolean;
+    /** 数据库引擎,默认InnoDB */
+    engine?: string;
+    /** 是否开启Gorm全局日志 */
+    'log-mode'?: string;
+    /** 是否通过zap写入日志文件 */
+    'log-zap'?: boolean;
+    /** 空闲中的最大连接数 */
+    'max-idle-conns'?: number;
+    /** 打开到数据库的最大连接数 */
+    'max-open-conns'?: number;
+    /** 数据库密码 */
+    password?: string;
+    /** 服务器地址:端口 */
+    path?: string;
+    /** :端口 */
+    port?: string;
+    /** 全局表前缀,单独定义TableName则不生效 */
+    prefix?: string;
+    /** 是否开启全局禁用复数,true表示开启 */
+    singular?: boolean;
+    type?: string;
+    /** 数据库用户名 */
+    username?: string;
+  };
+
+  type Sqlite = {
+    /** 高级配置 */
+    config?: string;
+    /** 数据库名 */
+    'db-name'?: string;
+    /** 数据库引擎,默认InnoDB */
+    engine?: string;
+    /** 是否开启Gorm全局日志 */
+    'log-mode'?: string;
+    /** 是否通过zap写入日志文件 */
+    'log-zap'?: boolean;
+    /** 空闲中的最大连接数 */
+    'max-idle-conns'?: number;
+    /** 打开到数据库的最大连接数 */
+    'max-open-conns'?: number;
+    /** 数据库密码 */
+    password?: string;
+    /** 服务器地址:端口 */
+    path?: string;
+    /** :端口 */
+    port?: string;
+    /** 全局表前缀,单独定义TableName则不生效 */
+    prefix?: string;
+    /** 是否开启全局禁用复数,true表示开启 */
+    singular?: boolean;
+    /** 数据库用户名 */
+    username?: string;
+  };
+
+  type SysAPIByGroupResponse = {
+    apis?: ApiGroup[];
+  };
+
+  type SysAPIListResponse = {
+    apis?: Api[];
+  };
+
+  type SysAPIResponse = {
+    api?: Api;
+  };
+
+  type SysCaptchaResponse = {
+    captchaId?: string;
+    captchaLength?: number;
+    openCaptcha?: boolean;
+    picPath?: string;
+  };
+
+  type SysConfigResponse = {
+    config?: Server;
+  };
+
+  type System = {
+    /** 端口值 */
+    addr?: number;
+    /** 数据库类型:mysql(默认)|sqlite|sqlserver|postgresql */
+    'db-type'?: string;
+    /** 环境值 */
+    env?: string;
+    'iplimit-count'?: number;
+    'iplimit-time'?: number;
+    /** Oss类型 */
+    'oss-type'?: string;
+    'router-prefix'?: string;
+    /** 多点登录拦截 */
+    'use-multipoint'?: boolean;
+    /** 使用redis */
+    'use-redis'?: boolean;
+  };
+
+  type System = {
+    config?: Server;
+  };
+
+  type TencentCOS = {
+    'base-url'?: string;
+    bucket?: string;
+    'path-prefix'?: string;
+    region?: string;
+    'secret-id'?: string;
+    'secret-key'?: string;
+  };
+
+  type Timer = {
+    detail?: Detail[];
+    /** CRON表达式 */
+    spec?: string;
+    /** 是否启用 */
+    start?: boolean;
+    /** 是否精确到秒 */
+    with_seconds?: boolean;
+  };
+
+  type Tree = {
+    children?: Tree[];
+    key?: number;
+    title?: string;
+  };
+
+  type TreeResponse = {
+    tree?: Tree[];
+  };
+
+  type UpdateRolePermissionParams = {
+    apiIds?: number[];
+    dataScope?: string;
+    deptIds?: number[];
+    menuIds?: number[];
+    roleId?: number;
+  };
+
+  type User = {
+    avatarId?: number;
+    createTime?: string;
+    deptId?: number;
+    /** 用户邮箱 */
+    email?: string;
+    /** 状态 */
+    enable?: boolean;
+    id?: number;
+    lastLoginTime?: string;
+    nickName?: string;
+    /** 用户手机号 */
+    phone?: string;
+    postId?: number;
+    /** 多岗位 */
+    postIds?: string;
+    remark?: string;
+    roleId?: number;
+    /** 多角色 */
+    roleIds?: string;
+    updateTime?: string;
+    /** 用户登录名 */
+    userName?: string;
+  };
+
+  type UserResponse = {
+    user?: User;
+  };
+
+  type UserView = {
+    avatarId?: number;
+    avatarUrl?: string;
+    createTime?: string;
+    deptId?: number;
+    /** 用户邮箱 */
+    email?: string;
+    /** 状态 */
+    enable?: boolean;
+    id?: number;
+    lastLoginTime?: string;
+    nickName?: string;
+    /** 用户手机号 */
+    phone?: string;
+    postId?: number;
+    /** 多岗位 */
+    postIds?: string;
+    remark?: string;
+    roleId?: number;
+    /** 多角色 */
+    roleIds?: string;
+    roles?: RoleSelectResponse[];
+    updateTime?: string;
+    /** 用户登录名 */
+    userName?: string;
+  };
+
+  type Zap = {
+    /** 日志文件夹 */
+    director?: string;
+    /** 编码级 */
+    'encode-level'?: string;
+    /** 输出 */
+    format?: string;
+    /** 级别 */
+    level?: string;
+    /** 输出控制台 */
+    'log-in-console'?: boolean;
+    /** 日志留存时间 */
+    'max-age'?: number;
+    /** 日志前缀 */
+    prefix?: string;
+    /** 显示行 */
+    'show-line'?: boolean;
+    /** 栈名 */
+    'stacktrace-key'?: string;
+  };
+}
diff --git a/src/styles/color/bezierEasing.less b/src/styles/color/bezierEasing.less
new file mode 100644
index 0000000..f53ffb3
--- /dev/null
+++ b/src/styles/color/bezierEasing.less
@@ -0,0 +1,110 @@
+/* stylelint-disable */
+.bezierEasingMixin() {
+@functions: ~`(function() {
+  var NEWTON_ITERATIONS = 4;
+  var NEWTON_MIN_SLOPE = 0.001;
+  var SUBDIVISION_PRECISION = 0.0000001;
+  var SUBDIVISION_MAX_ITERATIONS = 10;
+
+  var kSplineTableSize = 11;
+  var kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);
+
+  var float32ArraySupported = typeof Float32Array === 'function';
+
+  function A (aA1, aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }
+  function B (aA1, aA2) { return 3.0 * aA2 - 6.0 * aA1; }
+  function C (aA1)      { return 3.0 * aA1; }
+
+  // Returns x(t) given t, x1, and x2, or y(t) given t, y1, and y2.
+  function calcBezier (aT, aA1, aA2) { return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; }
+
+  // Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.
+  function getSlope (aT, aA1, aA2) { return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); }
+
+  function binarySubdivide (aX, aA, aB, mX1, mX2) {
+    var currentX, currentT, i = 0;
+    do {
+      currentT = aA + (aB - aA) / 2.0;
+      currentX = calcBezier(currentT, mX1, mX2) - aX;
+      if (currentX > 0.0) {
+        aB = currentT;
+      } else {
+        aA = currentT;
+      }
+    } while (Math.abs(currentX) > SUBDIVISION_PRECISION && ++i < SUBDIVISION_MAX_ITERATIONS);
+    return currentT;
+  }
+
+  function newtonRaphsonIterate (aX, aGuessT, mX1, mX2) {
+   for (var i = 0; i < NEWTON_ITERATIONS; ++i) {
+     var currentSlope = getSlope(aGuessT, mX1, mX2);
+     if (currentSlope === 0.0) {
+       return aGuessT;
+     }
+     var currentX = calcBezier(aGuessT, mX1, mX2) - aX;
+     aGuessT -= currentX / currentSlope;
+   }
+   return aGuessT;
+  }
+
+  var BezierEasing = function (mX1, mY1, mX2, mY2) {
+    if (!(0 <= mX1 && mX1 <= 1 && 0 <= mX2 && mX2 <= 1)) {
+      throw new Error('bezier x values must be in [0, 1] range');
+    }
+
+    // Precompute samples table
+    var sampleValues = float32ArraySupported ? new Float32Array(kSplineTableSize) : new Array(kSplineTableSize);
+    if (mX1 !== mY1 || mX2 !== mY2) {
+      for (var i = 0; i < kSplineTableSize; ++i) {
+        sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);
+      }
+    }
+
+    function getTForX (aX) {
+      var intervalStart = 0.0;
+      var currentSample = 1;
+      var lastSample = kSplineTableSize - 1;
+
+      for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {
+        intervalStart += kSampleStepSize;
+      }
+      --currentSample;
+
+      // Interpolate to provide an initial guess for t
+      var dist = (aX - sampleValues[currentSample]) / (sampleValues[currentSample + 1] - sampleValues[currentSample]);
+      var guessForT = intervalStart + dist * kSampleStepSize;
+
+      var initialSlope = getSlope(guessForT, mX1, mX2);
+      if (initialSlope >= NEWTON_MIN_SLOPE) {
+        return newtonRaphsonIterate(aX, guessForT, mX1, mX2);
+      } else if (initialSlope === 0.0) {
+        return guessForT;
+      } else {
+        return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);
+      }
+    }
+
+    return function BezierEasing (x) {
+      if (mX1 === mY1 && mX2 === mY2) {
+        return x; // linear
+      }
+      // Because JavaScript number are imprecise, we should guarantee the extremes are right.
+      if (x === 0) {
+        return 0;
+      }
+      if (x === 1) {
+        return 1;
+      }
+      return calcBezier(getTForX(x), mY1, mY2);
+    };
+  };
+
+  this.colorEasing = BezierEasing(0.26, 0.09, 0.37, 0.18);
+  // less 3 requires a return
+  return '';
+})()`;
+}
+// It is hacky way to make this function will be compiled preferentially by less
+// resolve error: `ReferenceError: colorPalette is not defined`
+// https://github.com/ant-design/ant-motion/issues/44
+.bezierEasingMixin();
diff --git a/src/styles/color/colorPalette.less b/src/styles/color/colorPalette.less
new file mode 100644
index 0000000..e662c07
--- /dev/null
+++ b/src/styles/color/colorPalette.less
@@ -0,0 +1,85 @@
+/* stylelint-disable no-duplicate-selectors */
+@import "bezierEasing";
+@import "tinyColor";
+
+// We create a very complex algorithm which take the place of original tint/shade color system
+// to make sure no one can understand it 👻
+// and create an entire color palette magicly by inputing just a single primary color.
+// We are using bezier-curve easing function and some color manipulations like tint/shade/darken/spin
+.colorPaletteMixin() {
+@functions: ~`(function() {
+  var hueStep = 2;
+  var saturationStep = 0.16;
+  var saturationStep2 = 0.05;
+  var brightnessStep1 = 0.05;
+  var brightnessStep2 = 0.15;
+  var lightColorCount = 5;
+  var darkColorCount = 4;
+
+  var getHue = function(hsv, i, isLight) {
+    var hue;
+    if (hsv.h >= 60 && hsv.h <= 240) {
+      hue = isLight ? hsv.h - hueStep * i : hsv.h + hueStep * i;
+    } else {
+      hue = isLight ? hsv.h + hueStep * i : hsv.h - hueStep * i;
+    }
+    if (hue < 0) {
+      hue += 360;
+    } else if (hue >= 360) {
+      hue -= 360;
+    }
+    return Math.round(hue);
+  };
+  var getSaturation = function(hsv, i, isLight) {
+    // grey color don't change saturation
+    if (hsv.h === 0 && hsv.s === 0) {
+      return hsv.s;
+    }
+    var saturation;
+    if (isLight) {
+      saturation = hsv.s - saturationStep * i;
+    } else if (i === darkColorCount) {
+      saturation = hsv.s + saturationStep;
+    } else {
+      saturation = hsv.s + saturationStep2 * i;
+    }
+    if (saturation > 1) {
+      saturation = 1;
+    }
+    if (isLight && i === lightColorCount && saturation > 0.1) {
+      saturation = 0.1;
+    }
+    if (saturation < 0.06) {
+      saturation = 0.06;
+    }
+    return Number(saturation.toFixed(2));
+  };
+  var getValue = function(hsv, i, isLight) {
+    var value;
+    if (isLight) {
+      value = hsv.v + brightnessStep1 * i;
+    }else{
+      value = hsv.v - brightnessStep2 * i
+    }
+    if (value > 1) {
+      value = 1;
+    }
+    return Number(value.toFixed(2))
+  };
+
+  this.colorPalette = function(color, index) {
+    var isLight = index <= 6;
+    var hsv = tinycolor(color).toHsv();
+    var i = isLight ? lightColorCount + 1 - index : index - lightColorCount - 1;
+    return tinycolor({
+      h: getHue(hsv, i, isLight),
+      s: getSaturation(hsv, i, isLight),
+      v: getValue(hsv, i, isLight),
+    }).toHexString();
+  };
+})()`;
+}
+// It is hacky way to make this function will be compiled preferentially by less
+// resolve error: `ReferenceError: colorPalette is not defined`
+// https://github.com/ant-design/ant-motion/issues/44
+.colorPaletteMixin();
diff --git a/src/styles/color/colors.less b/src/styles/color/colors.less
new file mode 100644
index 0000000..51540bf
--- /dev/null
+++ b/src/styles/color/colors.less
@@ -0,0 +1,162 @@
+@import 'colorPalette';
+
+// color palettes
+@blue-base: #1890ff;
+@blue-1: color(~`colorPalette('@{blue-6}', 1) `);
+@blue-2: color(~`colorPalette('@{blue-6}', 2) `);
+@blue-3: color(~`colorPalette('@{blue-6}', 3) `);
+@blue-4: color(~`colorPalette('@{blue-6}', 4) `);
+@blue-5: color(~`colorPalette('@{blue-6}', 5) `);
+@blue-6: @blue-base;
+@blue-7: color(~`colorPalette('@{blue-6}', 7) `);
+@blue-8: color(~`colorPalette('@{blue-6}', 8) `);
+@blue-9: color(~`colorPalette('@{blue-6}', 9) `);
+@blue-10: color(~`colorPalette('@{blue-6}', 10) `);
+
+@purple-base: #722ed1;
+@purple-1: color(~`colorPalette('@{purple-6}', 1) `);
+@purple-2: color(~`colorPalette('@{purple-6}', 2) `);
+@purple-3: color(~`colorPalette('@{purple-6}', 3) `);
+@purple-4: color(~`colorPalette('@{purple-6}', 4) `);
+@purple-5: color(~`colorPalette('@{purple-6}', 5) `);
+@purple-6: @purple-base;
+@purple-7: color(~`colorPalette('@{purple-6}', 7) `);
+@purple-8: color(~`colorPalette('@{purple-6}', 8) `);
+@purple-9: color(~`colorPalette('@{purple-6}', 9) `);
+@purple-10: color(~`colorPalette('@{purple-6}', 10) `);
+
+@cyan-base: #13c2c2;
+@cyan-1: color(~`colorPalette('@{cyan-6}', 1) `);
+@cyan-2: color(~`colorPalette('@{cyan-6}', 2) `);
+@cyan-3: color(~`colorPalette('@{cyan-6}', 3) `);
+@cyan-4: color(~`colorPalette('@{cyan-6}', 4) `);
+@cyan-5: color(~`colorPalette('@{cyan-6}', 5) `);
+@cyan-6: @cyan-base;
+@cyan-7: color(~`colorPalette('@{cyan-6}', 7) `);
+@cyan-8: color(~`colorPalette('@{cyan-6}', 8) `);
+@cyan-9: color(~`colorPalette('@{cyan-6}', 9) `);
+@cyan-10: color(~`colorPalette('@{cyan-6}', 10) `);
+
+@green-base: #52c41a;
+@green-1: color(~`colorPalette('@{green-6}', 1) `);
+@green-2: color(~`colorPalette('@{green-6}', 2) `);
+@green-3: color(~`colorPalette('@{green-6}', 3) `);
+@green-4: color(~`colorPalette('@{green-6}', 4) `);
+@green-5: color(~`colorPalette('@{green-6}', 5) `);
+@green-6: @green-base;
+@green-7: color(~`colorPalette('@{green-6}', 7) `);
+@green-8: color(~`colorPalette('@{green-6}', 8) `);
+@green-9: color(~`colorPalette('@{green-6}', 9) `);
+@green-10: color(~`colorPalette('@{green-6}', 10) `);
+
+@magenta-base: #eb2f96;
+@magenta-1: color(~`colorPalette('@{magenta-6}', 1) `);
+@magenta-2: color(~`colorPalette('@{magenta-6}', 2) `);
+@magenta-3: color(~`colorPalette('@{magenta-6}', 3) `);
+@magenta-4: color(~`colorPalette('@{magenta-6}', 4) `);
+@magenta-5: color(~`colorPalette('@{magenta-6}', 5) `);
+@magenta-6: @magenta-base;
+@magenta-7: color(~`colorPalette('@{magenta-6}', 7) `);
+@magenta-8: color(~`colorPalette('@{magenta-6}', 8) `);
+@magenta-9: color(~`colorPalette('@{magenta-6}', 9) `);
+@magenta-10: color(~`colorPalette('@{magenta-6}', 10) `);
+
+// alias of magenta
+@pink-base: #eb2f96;
+@pink-1: color(~`colorPalette('@{pink-6}', 1) `);
+@pink-2: color(~`colorPalette('@{pink-6}', 2) `);
+@pink-3: color(~`colorPalette('@{pink-6}', 3) `);
+@pink-4: color(~`colorPalette('@{pink-6}', 4) `);
+@pink-5: color(~`colorPalette('@{pink-6}', 5) `);
+@pink-6: @pink-base;
+@pink-7: color(~`colorPalette('@{pink-6}', 7) `);
+@pink-8: color(~`colorPalette('@{pink-6}', 8) `);
+@pink-9: color(~`colorPalette('@{pink-6}', 9) `);
+@pink-10: color(~`colorPalette('@{pink-6}', 10) `);
+
+@red-base: #f5222d;
+@red-1: color(~`colorPalette('@{red-6}', 1) `);
+@red-2: color(~`colorPalette('@{red-6}', 2) `);
+@red-3: color(~`colorPalette('@{red-6}', 3) `);
+@red-4: color(~`colorPalette('@{red-6}', 4) `);
+@red-5: color(~`colorPalette('@{red-6}', 5) `);
+@red-6: @red-base;
+@red-7: color(~`colorPalette('@{red-6}', 7) `);
+@red-8: color(~`colorPalette('@{red-6}', 8) `);
+@red-9: color(~`colorPalette('@{red-6}', 9) `);
+@red-10: color(~`colorPalette('@{red-6}', 10) `);
+
+@orange-base: #fa8c16;
+@orange-1: color(~`colorPalette('@{orange-6}', 1) `);
+@orange-2: color(~`colorPalette('@{orange-6}', 2) `);
+@orange-3: color(~`colorPalette('@{orange-6}', 3) `);
+@orange-4: color(~`colorPalette('@{orange-6}', 4) `);
+@orange-5: color(~`colorPalette('@{orange-6}', 5) `);
+@orange-6: @orange-base;
+@orange-7: color(~`colorPalette('@{orange-6}', 7) `);
+@orange-8: color(~`colorPalette('@{orange-6}', 8) `);
+@orange-9: color(~`colorPalette('@{orange-6}', 9) `);
+@orange-10: color(~`colorPalette('@{orange-6}', 10) `);
+
+@yellow-base: #fadb14;
+@yellow-1: color(~`colorPalette('@{yellow-6}', 1) `);
+@yellow-2: color(~`colorPalette('@{yellow-6}', 2) `);
+@yellow-3: color(~`colorPalette('@{yellow-6}', 3) `);
+@yellow-4: color(~`colorPalette('@{yellow-6}', 4) `);
+@yellow-5: color(~`colorPalette('@{yellow-6}', 5) `);
+@yellow-6: @yellow-base;
+@yellow-7: color(~`colorPalette('@{yellow-6}', 7) `);
+@yellow-8: color(~`colorPalette('@{yellow-6}', 8) `);
+@yellow-9: color(~`colorPalette('@{yellow-6}', 9) `);
+@yellow-10: color(~`colorPalette('@{yellow-6}', 10) `);
+
+@volcano-base: #fa541c;
+@volcano-1: color(~`colorPalette('@{volcano-6}', 1) `);
+@volcano-2: color(~`colorPalette('@{volcano-6}', 2) `);
+@volcano-3: color(~`colorPalette('@{volcano-6}', 3) `);
+@volcano-4: color(~`colorPalette('@{volcano-6}', 4) `);
+@volcano-5: color(~`colorPalette('@{volcano-6}', 5) `);
+@volcano-6: @volcano-base;
+@volcano-7: color(~`colorPalette('@{volcano-6}', 7) `);
+@volcano-8: color(~`colorPalette('@{volcano-6}', 8) `);
+@volcano-9: color(~`colorPalette('@{volcano-6}', 9) `);
+@volcano-10: color(~`colorPalette('@{volcano-6}', 10) `);
+
+@geekblue-base: #2f54eb;
+@geekblue-1: color(~`colorPalette('@{geekblue-6}', 1) `);
+@geekblue-2: color(~`colorPalette('@{geekblue-6}', 2) `);
+@geekblue-3: color(~`colorPalette('@{geekblue-6}', 3) `);
+@geekblue-4: color(~`colorPalette('@{geekblue-6}', 4) `);
+@geekblue-5: color(~`colorPalette('@{geekblue-6}', 5) `);
+@geekblue-6: @geekblue-base;
+@geekblue-7: color(~`colorPalette('@{geekblue-6}', 7) `);
+@geekblue-8: color(~`colorPalette('@{geekblue-6}', 8) `);
+@geekblue-9: color(~`colorPalette('@{geekblue-6}', 9) `);
+@geekblue-10: color(~`colorPalette('@{geekblue-6}', 10) `);
+
+@lime-base: #a0d911;
+@lime-1: color(~`colorPalette('@{lime-6}', 1) `);
+@lime-2: color(~`colorPalette('@{lime-6}', 2) `);
+@lime-3: color(~`colorPalette('@{lime-6}', 3) `);
+@lime-4: color(~`colorPalette('@{lime-6}', 4) `);
+@lime-5: color(~`colorPalette('@{lime-6}', 5) `);
+@lime-6: @lime-base;
+@lime-7: color(~`colorPalette('@{lime-6}', 7) `);
+@lime-8: color(~`colorPalette('@{lime-6}', 8) `);
+@lime-9: color(~`colorPalette('@{lime-6}', 9) `);
+@lime-10: color(~`colorPalette('@{lime-6}', 10) `);
+
+@gold-base: #faad14;
+@gold-1: color(~`colorPalette('@{gold-6}', 1) `);
+@gold-2: color(~`colorPalette('@{gold-6}', 2) `);
+@gold-3: color(~`colorPalette('@{gold-6}', 3) `);
+@gold-4: color(~`colorPalette('@{gold-6}', 4) `);
+@gold-5: color(~`colorPalette('@{gold-6}', 5) `);
+@gold-6: @gold-base;
+@gold-7: color(~`colorPalette('@{gold-6}', 7) `);
+@gold-8: color(~`colorPalette('@{gold-6}', 8) `);
+@gold-9: color(~`colorPalette('@{gold-6}', 9) `);
+@gold-10: color(~`colorPalette('@{gold-6}', 10) `);
+
+@preset-colors: pink, magenta, red, volcano, orange, yellow, gold, cyan, lime, green, blue, geekblue,
+  purple;
diff --git a/src/styles/color/tinyColor.less b/src/styles/color/tinyColor.less
new file mode 100644
index 0000000..e576c78
--- /dev/null
+++ b/src/styles/color/tinyColor.less
@@ -0,0 +1,1184 @@
+/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */
+.tinyColorMixin() {
+@functions: ~`(function() {
+// TinyColor v1.4.1
+// https://github.com/bgrins/TinyColor
+// 2016-07-07, Brian Grinstead, MIT License
+var trimLeft = /^\s+/,
+    trimRight = /\s+$/,
+    tinyCounter = 0,
+    mathRound = Math.round,
+    mathMin = Math.min,
+    mathMax = Math.max,
+    mathRandom = Math.random;
+
+function tinycolor (color, opts) {
+
+    color = (color) ? color : '';
+    opts = opts || { };
+
+    // If input is already a tinycolor, return itself
+    if (color instanceof tinycolor) {
+       return color;
+    }
+    // If we are called as a function, call using new instead
+    if (!(this instanceof tinycolor)) {
+        return new tinycolor(color, opts);
+    }
+
+    var rgb = inputToRGB(color);
+    this._originalInput = color,
+    this._r = rgb.r,
+    this._g = rgb.g,
+    this._b = rgb.b,
+    this._a = rgb.a,
+    this._roundA = mathRound(100*this._a) / 100,
+    this._format = opts.format || rgb.format;
+    this._gradientType = opts.gradientType;
+
+    // Don't let the range of [0,255] come back in [0,1].
+    // Potentially lose a little bit of precision here, but will fix issues where
+    // .5 gets interpreted as half of the total, instead of half of 1
+    // If it was supposed to be 128, this was already taken care of by inputToRgb
+    if (this._r < 1) { this._r = mathRound(this._r); }
+    if (this._g < 1) { this._g = mathRound(this._g); }
+    if (this._b < 1) { this._b = mathRound(this._b); }
+
+    this._ok = rgb.ok;
+    this._tc_id = tinyCounter++;
+}
+
+tinycolor.prototype = {
+    isDark: function() {
+        return this.getBrightness() < 128;
+    },
+    isLight: function() {
+        return !this.isDark();
+    },
+    isValid: function() {
+        return this._ok;
+    },
+    getOriginalInput: function() {
+      return this._originalInput;
+    },
+    getFormat: function() {
+        return this._format;
+    },
+    getAlpha: function() {
+        return this._a;
+    },
+    getBrightness: function() {
+        //http://www.w3.org/TR/AERT#color-contrast
+        var rgb = this.toRgb();
+        return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;
+    },
+    getLuminance: function() {
+        //http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef
+        var rgb = this.toRgb();
+        var RsRGB, GsRGB, BsRGB, R, G, B;
+        RsRGB = rgb.r/255;
+        GsRGB = rgb.g/255;
+        BsRGB = rgb.b/255;
+
+        if (RsRGB <= 0.03928) {R = RsRGB / 12.92;} else {R = Math.pow(((RsRGB + 0.055) / 1.055), 2.4);}
+        if (GsRGB <= 0.03928) {G = GsRGB / 12.92;} else {G = Math.pow(((GsRGB + 0.055) / 1.055), 2.4);}
+        if (BsRGB <= 0.03928) {B = BsRGB / 12.92;} else {B = Math.pow(((BsRGB + 0.055) / 1.055), 2.4);}
+        return (0.2126 * R) + (0.7152 * G) + (0.0722 * B);
+    },
+    setAlpha: function(value) {
+        this._a = boundAlpha(value);
+        this._roundA = mathRound(100*this._a) / 100;
+        return this;
+    },
+    toHsv: function() {
+        var hsv = rgbToHsv(this._r, this._g, this._b);
+        return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this._a };
+    },
+    toHsvString: function() {
+        var hsv = rgbToHsv(this._r, this._g, this._b);
+        var h = mathRound(hsv.h * 360), s = mathRound(hsv.s * 100), v = mathRound(hsv.v * 100);
+        return (this._a == 1) ?
+          "hsv("  + h + ", " + s + "%, " + v + "%)" :
+          "hsva(" + h + ", " + s + "%, " + v + "%, "+ this._roundA + ")";
+    },
+    toHsl: function() {
+        var hsl = rgbToHsl(this._r, this._g, this._b);
+        return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this._a };
+    },
+    toHslString: function() {
+        var hsl = rgbToHsl(this._r, this._g, this._b);
+        var h = mathRound(hsl.h * 360), s = mathRound(hsl.s * 100), l = mathRound(hsl.l * 100);
+        return (this._a == 1) ?
+          "hsl("  + h + ", " + s + "%, " + l + "%)" :
+          "hsla(" + h + ", " + s + "%, " + l + "%, "+ this._roundA + ")";
+    },
+    toHex: function(allow3Char) {
+        return rgbToHex(this._r, this._g, this._b, allow3Char);
+    },
+    toHexString: function(allow3Char) {
+        return '#' + this.toHex(allow3Char);
+    },
+    toHex8: function(allow4Char) {
+        return rgbaToHex(this._r, this._g, this._b, this._a, allow4Char);
+    },
+    toHex8String: function(allow4Char) {
+        return '#' + this.toHex8(allow4Char);
+    },
+    toRgb: function() {
+        return { r: mathRound(this._r), g: mathRound(this._g), b: mathRound(this._b), a: this._a };
+    },
+    toRgbString: function() {
+        return (this._a == 1) ?
+          "rgb("  + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ")" :
+          "rgba(" + mathRound(this._r) + ", " + mathRound(this._g) + ", " + mathRound(this._b) + ", " + this._roundA + ")";
+    },
+    toPercentageRgb: function() {
+        return { r: mathRound(bound01(this._r, 255) * 100) + "%", g: mathRound(bound01(this._g, 255) * 100) + "%", b: mathRound(bound01(this._b, 255) * 100) + "%", a: this._a };
+    },
+    toPercentageRgbString: function() {
+        return (this._a == 1) ?
+          "rgb("  + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%)" :
+          "rgba(" + mathRound(bound01(this._r, 255) * 100) + "%, " + mathRound(bound01(this._g, 255) * 100) + "%, " + mathRound(bound01(this._b, 255) * 100) + "%, " + this._roundA + ")";
+    },
+    toName: function() {
+        if (this._a === 0) {
+            return "transparent";
+        }
+
+        if (this._a < 1) {
+            return false;
+        }
+
+        return hexNames[rgbToHex(this._r, this._g, this._b, true)] || false;
+    },
+    toFilter: function(secondColor) {
+        var hex8String = '#' + rgbaToArgbHex(this._r, this._g, this._b, this._a);
+        var secondHex8String = hex8String;
+        var gradientType = this._gradientType ? "GradientType = 1, " : "";
+
+        if (secondColor) {
+            var s = tinycolor(secondColor);
+            secondHex8String = '#' + rgbaToArgbHex(s._r, s._g, s._b, s._a);
+        }
+
+        return "progid:DXImageTransform.Microsoft.gradient("+gradientType+"startColorstr="+hex8String+",endColorstr="+secondHex8String+")";
+    },
+    toString: function(format) {
+        var formatSet = !!format;
+        format = format || this._format;
+
+        var formattedString = false;
+        var hasAlpha = this._a < 1 && this._a >= 0;
+        var needsAlphaFormat = !formatSet && hasAlpha && (format === "hex" || format === "hex6" || format === "hex3" || format === "hex4" || format === "hex8" || format === "name");
+
+        if (needsAlphaFormat) {
+            // Special case for "transparent", all other non-alpha formats
+            // will return rgba when there is transparency.
+            if (format === "name" && this._a === 0) {
+                return this.toName();
+            }
+            return this.toRgbString();
+        }
+        if (format === "rgb") {
+            formattedString = this.toRgbString();
+        }
+        if (format === "prgb") {
+            formattedString = this.toPercentageRgbString();
+        }
+        if (format === "hex" || format === "hex6") {
+            formattedString = this.toHexString();
+        }
+        if (format === "hex3") {
+            formattedString = this.toHexString(true);
+        }
+        if (format === "hex4") {
+            formattedString = this.toHex8String(true);
+        }
+        if (format === "hex8") {
+            formattedString = this.toHex8String();
+        }
+        if (format === "name") {
+            formattedString = this.toName();
+        }
+        if (format === "hsl") {
+            formattedString = this.toHslString();
+        }
+        if (format === "hsv") {
+            formattedString = this.toHsvString();
+        }
+
+        return formattedString || this.toHexString();
+    },
+    clone: function() {
+        return tinycolor(this.toString());
+    },
+
+    _applyModification: function(fn, args) {
+        var color = fn.apply(null, [this].concat([].slice.call(args)));
+        this._r = color._r;
+        this._g = color._g;
+        this._b = color._b;
+        this.setAlpha(color._a);
+        return this;
+    },
+    lighten: function() {
+        return this._applyModification(lighten, arguments);
+    },
+    brighten: function() {
+        return this._applyModification(brighten, arguments);
+    },
+    darken: function() {
+        return this._applyModification(darken, arguments);
+    },
+    desaturate: function() {
+        return this._applyModification(desaturate, arguments);
+    },
+    saturate: function() {
+        return this._applyModification(saturate, arguments);
+    },
+    greyscale: function() {
+        return this._applyModification(greyscale, arguments);
+    },
+    spin: function() {
+        return this._applyModification(spin, arguments);
+    },
+
+    _applyCombination: function(fn, args) {
+        return fn.apply(null, [this].concat([].slice.call(args)));
+    },
+    analogous: function() {
+        return this._applyCombination(analogous, arguments);
+    },
+    complement: function() {
+        return this._applyCombination(complement, arguments);
+    },
+    monochromatic: function() {
+        return this._applyCombination(monochromatic, arguments);
+    },
+    splitcomplement: function() {
+        return this._applyCombination(splitcomplement, arguments);
+    },
+    triad: function() {
+        return this._applyCombination(triad, arguments);
+    },
+    tetrad: function() {
+        return this._applyCombination(tetrad, arguments);
+    }
+};
+
+// If input is an object, force 1 into "1.0" to handle ratios properly
+// String input requires "1.0" as input, so 1 will be treated as 1
+tinycolor.fromRatio = function(color, opts) {
+    if (typeof color == "object") {
+        var newColor = {};
+        for (var i in color) {
+            if (color.hasOwnProperty(i)) {
+                if (i === "a") {
+                    newColor[i] = color[i];
+                }
+                else {
+                    newColor[i] = convertToPercentage(color[i]);
+                }
+            }
+        }
+        color = newColor;
+    }
+
+    return tinycolor(color, opts);
+};
+
+// Given a string or object, convert that input to RGB
+// Possible string inputs:
+//
+//     "red"
+//     "#f00" or "f00"
+//     "#ff0000" or "ff0000"
+//     "#ff000000" or "ff000000"
+//     "rgb 255 0 0" or "rgb (255, 0, 0)"
+//     "rgb 1.0 0 0" or "rgb (1, 0, 0)"
+//     "rgba (255, 0, 0, 1)" or "rgba 255, 0, 0, 1"
+//     "rgba (1.0, 0, 0, 1)" or "rgba 1.0, 0, 0, 1"
+//     "hsl(0, 100%, 50%)" or "hsl 0 100% 50%"
+//     "hsla(0, 100%, 50%, 1)" or "hsla 0 100% 50%, 1"
+//     "hsv(0, 100%, 100%)" or "hsv 0 100% 100%"
+//
+function inputToRGB(color) {
+
+    var rgb = { r: 0, g: 0, b: 0 };
+    var a = 1;
+    var s = null;
+    var v = null;
+    var l = null;
+    var ok = false;
+    var format = false;
+
+    if (typeof color == "string") {
+        color = stringInputToObject(color);
+    }
+
+    if (typeof color == "object") {
+        if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {
+            rgb = rgbToRgb(color.r, color.g, color.b);
+            ok = true;
+            format = String(color.r).substr(-1) === "%" ? "prgb" : "rgb";
+        }
+        else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {
+            s = convertToPercentage(color.s);
+            v = convertToPercentage(color.v);
+            rgb = hsvToRgb(color.h, s, v);
+            ok = true;
+            format = "hsv";
+        }
+        else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {
+            s = convertToPercentage(color.s);
+            l = convertToPercentage(color.l);
+            rgb = hslToRgb(color.h, s, l);
+            ok = true;
+            format = "hsl";
+        }
+
+        if (color.hasOwnProperty("a")) {
+            a = color.a;
+        }
+    }
+
+    a = boundAlpha(a);
+
+    return {
+        ok: ok,
+        format: color.format || format,
+        r: mathMin(255, mathMax(rgb.r, 0)),
+        g: mathMin(255, mathMax(rgb.g, 0)),
+        b: mathMin(255, mathMax(rgb.b, 0)),
+        a: a
+    };
+}
+
+// Conversion Functions
+// --------------------
+
+// rgbToHsl, rgbToHsv, hslToRgb, hsvToRgb modified from:
+// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>
+
+// rgbToRgb
+// Handle bounds / percentage checking to conform to CSS color spec
+// <http://www.w3.org/TR/css3-color/>
+// *Assumes:* r, g, b in [0, 255] or [0, 1]
+// *Returns:* { r, g, b } in [0, 255]
+function rgbToRgb(r, g, b){
+    return {
+        r: bound01(r, 255) * 255,
+        g: bound01(g, 255) * 255,
+        b: bound01(b, 255) * 255
+    };
+}
+
+// rgbToHsl
+// Converts an RGB color value to HSL.
+// *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]
+// *Returns:* { h, s, l } in [0,1]
+function rgbToHsl(r, g, b) {
+
+    r = bound01(r, 255);
+    g = bound01(g, 255);
+    b = bound01(b, 255);
+
+    var max = mathMax(r, g, b), min = mathMin(r, g, b);
+    var h, s, l = (max + min) / 2;
+
+    if(max == min) {
+        h = s = 0; // achromatic
+    }
+    else {
+        var d = max - min;
+        s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
+        switch(max) {
+            case r: h = (g - b) / d + (g < b ? 6 : 0); break;
+            case g: h = (b - r) / d + 2; break;
+            case b: h = (r - g) / d + 4; break;
+        }
+
+        h /= 6;
+    }
+
+    return { h: h, s: s, l: l };
+}
+
+// hslToRgb
+// Converts an HSL color value to RGB.
+// *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]
+// *Returns:* { r, g, b } in the set [0, 255]
+function hslToRgb(h, s, l) {
+    var r, g, b;
+
+    h = bound01(h, 360);
+    s = bound01(s, 100);
+    l = bound01(l, 100);
+
+    function hue2rgb(p, q, t) {
+        if(t < 0) t += 1;
+        if(t > 1) t -= 1;
+        if(t < 1/6) return p + (q - p) * 6 * t;
+        if(t < 1/2) return q;
+        if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
+        return p;
+    }
+
+    if(s === 0) {
+        r = g = b = l; // achromatic
+    }
+    else {
+        var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
+        var p = 2 * l - q;
+        r = hue2rgb(p, q, h + 1/3);
+        g = hue2rgb(p, q, h);
+        b = hue2rgb(p, q, h - 1/3);
+    }
+
+    return { r: r * 255, g: g * 255, b: b * 255 };
+}
+
+// rgbToHsv
+// Converts an RGB color value to HSV
+// *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]
+// *Returns:* { h, s, v } in [0,1]
+function rgbToHsv(r, g, b) {
+
+    r = bound01(r, 255);
+    g = bound01(g, 255);
+    b = bound01(b, 255);
+
+    var max = mathMax(r, g, b), min = mathMin(r, g, b);
+    var h, s, v = max;
+
+    var d = max - min;
+    s = max === 0 ? 0 : d / max;
+
+    if(max == min) {
+        h = 0; // achromatic
+    }
+    else {
+        switch(max) {
+            case r: h = (g - b) / d + (g < b ? 6 : 0); break;
+            case g: h = (b - r) / d + 2; break;
+            case b: h = (r - g) / d + 4; break;
+        }
+        h /= 6;
+    }
+    return { h: h, s: s, v: v };
+}
+
+// hsvToRgb
+// Converts an HSV color value to RGB.
+// *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]
+// *Returns:* { r, g, b } in the set [0, 255]
+ function hsvToRgb(h, s, v) {
+
+    h = bound01(h, 360) * 6;
+    s = bound01(s, 100);
+    v = bound01(v, 100);
+
+    var i = Math.floor(h),
+        f = h - i,
+        p = v * (1 - s),
+        q = v * (1 - f * s),
+        t = v * (1 - (1 - f) * s),
+        mod = i % 6,
+        r = [v, q, p, p, t, v][mod],
+        g = [t, v, v, q, p, p][mod],
+        b = [p, p, t, v, v, q][mod];
+
+    return { r: r * 255, g: g * 255, b: b * 255 };
+}
+
+// rgbToHex
+// Converts an RGB color to hex
+// Assumes r, g, and b are contained in the set [0, 255]
+// Returns a 3 or 6 character hex
+function rgbToHex(r, g, b, allow3Char) {
+
+    var hex = [
+        pad2(mathRound(r).toString(16)),
+        pad2(mathRound(g).toString(16)),
+        pad2(mathRound(b).toString(16))
+    ];
+
+    // Return a 3 character hex if possible
+    if (allow3Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1)) {
+        return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);
+    }
+
+    return hex.join("");
+}
+
+// rgbaToHex
+// Converts an RGBA color plus alpha transparency to hex
+// Assumes r, g, b are contained in the set [0, 255] and
+// a in [0, 1]. Returns a 4 or 8 character rgba hex
+function rgbaToHex(r, g, b, a, allow4Char) {
+
+    var hex = [
+        pad2(mathRound(r).toString(16)),
+        pad2(mathRound(g).toString(16)),
+        pad2(mathRound(b).toString(16)),
+        pad2(convertDecimalToHex(a))
+    ];
+
+    // Return a 4 character hex if possible
+    if (allow4Char && hex[0].charAt(0) == hex[0].charAt(1) && hex[1].charAt(0) == hex[1].charAt(1) && hex[2].charAt(0) == hex[2].charAt(1) && hex[3].charAt(0) == hex[3].charAt(1)) {
+        return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);
+    }
+
+    return hex.join("");
+}
+
+// rgbaToArgbHex
+// Converts an RGBA color to an ARGB Hex8 string
+// Rarely used, but required for "toFilter()"
+function rgbaToArgbHex(r, g, b, a) {
+
+    var hex = [
+        pad2(convertDecimalToHex(a)),
+        pad2(mathRound(r).toString(16)),
+        pad2(mathRound(g).toString(16)),
+        pad2(mathRound(b).toString(16))
+    ];
+
+    return hex.join("");
+}
+
+// equals
+// Can be called with any tinycolor input
+tinycolor.equals = function (color1, color2) {
+    if (!color1 || !color2) { return false; }
+    return tinycolor(color1).toRgbString() == tinycolor(color2).toRgbString();
+};
+
+tinycolor.random = function() {
+    return tinycolor.fromRatio({
+        r: mathRandom(),
+        g: mathRandom(),
+        b: mathRandom()
+    });
+};
+
+// Modification Functions
+// ----------------------
+// Thanks to less.js for some of the basics here
+// <https://github.com/cloudhead/less.js/blob/master/lib/less/functions.js>
+
+function desaturate(color, amount) {
+    amount = (amount === 0) ? 0 : (amount || 10);
+    var hsl = tinycolor(color).toHsl();
+    hsl.s -= amount / 100;
+    hsl.s = clamp01(hsl.s);
+    return tinycolor(hsl);
+}
+
+function saturate(color, amount) {
+    amount = (amount === 0) ? 0 : (amount || 10);
+    var hsl = tinycolor(color).toHsl();
+    hsl.s += amount / 100;
+    hsl.s = clamp01(hsl.s);
+    return tinycolor(hsl);
+}
+
+function greyscale(color) {
+    return tinycolor(color).desaturate(100);
+}
+
+function lighten (color, amount) {
+    amount = (amount === 0) ? 0 : (amount || 10);
+    var hsl = tinycolor(color).toHsl();
+    hsl.l += amount / 100;
+    hsl.l = clamp01(hsl.l);
+    return tinycolor(hsl);
+}
+
+function brighten(color, amount) {
+    amount = (amount === 0) ? 0 : (amount || 10);
+    var rgb = tinycolor(color).toRgb();
+    rgb.r = mathMax(0, mathMin(255, rgb.r - mathRound(255 * - (amount / 100))));
+    rgb.g = mathMax(0, mathMin(255, rgb.g - mathRound(255 * - (amount / 100))));
+    rgb.b = mathMax(0, mathMin(255, rgb.b - mathRound(255 * - (amount / 100))));
+    return tinycolor(rgb);
+}
+
+function darken (color, amount) {
+    amount = (amount === 0) ? 0 : (amount || 10);
+    var hsl = tinycolor(color).toHsl();
+    hsl.l -= amount / 100;
+    hsl.l = clamp01(hsl.l);
+    return tinycolor(hsl);
+}
+
+// Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.
+// Values outside of this range will be wrapped into this range.
+function spin(color, amount) {
+    var hsl = tinycolor(color).toHsl();
+    var hue = (hsl.h + amount) % 360;
+    hsl.h = hue < 0 ? 360 + hue : hue;
+    return tinycolor(hsl);
+}
+
+// Combination Functions
+// ---------------------
+// Thanks to jQuery xColor for some of the ideas behind these
+// <https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js>
+
+function complement(color) {
+    var hsl = tinycolor(color).toHsl();
+    hsl.h = (hsl.h + 180) % 360;
+    return tinycolor(hsl);
+}
+
+function triad(color) {
+    var hsl = tinycolor(color).toHsl();
+    var h = hsl.h;
+    return [
+        tinycolor(color),
+        tinycolor({ h: (h + 120) % 360, s: hsl.s, l: hsl.l }),
+        tinycolor({ h: (h + 240) % 360, s: hsl.s, l: hsl.l })
+    ];
+}
+
+function tetrad(color) {
+    var hsl = tinycolor(color).toHsl();
+    var h = hsl.h;
+    return [
+        tinycolor(color),
+        tinycolor({ h: (h + 90) % 360, s: hsl.s, l: hsl.l }),
+        tinycolor({ h: (h + 180) % 360, s: hsl.s, l: hsl.l }),
+        tinycolor({ h: (h + 270) % 360, s: hsl.s, l: hsl.l })
+    ];
+}
+
+function splitcomplement(color) {
+    var hsl = tinycolor(color).toHsl();
+    var h = hsl.h;
+    return [
+        tinycolor(color),
+        tinycolor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l}),
+        tinycolor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l})
+    ];
+}
+
+function analogous(color, results, slices) {
+    results = results || 6;
+    slices = slices || 30;
+
+    var hsl = tinycolor(color).toHsl();
+    var part = 360 / slices;
+    var ret = [tinycolor(color)];
+
+    for (hsl.h = ((hsl.h - (part * results >> 1)) + 720) % 360; --results; ) {
+        hsl.h = (hsl.h + part) % 360;
+        ret.push(tinycolor(hsl));
+    }
+    return ret;
+}
+
+function monochromatic(color, results) {
+    results = results || 6;
+    var hsv = tinycolor(color).toHsv();
+    var h = hsv.h, s = hsv.s, v = hsv.v;
+    var ret = [];
+    var modification = 1 / results;
+
+    while (results--) {
+        ret.push(tinycolor({ h: h, s: s, v: v}));
+        v = (v + modification) % 1;
+    }
+
+    return ret;
+}
+
+// Utility Functions
+// ---------------------
+
+tinycolor.mix = function(color1, color2, amount) {
+    amount = (amount === 0) ? 0 : (amount || 50);
+
+    var rgb1 = tinycolor(color1).toRgb();
+    var rgb2 = tinycolor(color2).toRgb();
+
+    var p = amount / 100;
+
+    var rgba = {
+        r: ((rgb2.r - rgb1.r) * p) + rgb1.r,
+        g: ((rgb2.g - rgb1.g) * p) + rgb1.g,
+        b: ((rgb2.b - rgb1.b) * p) + rgb1.b,
+        a: ((rgb2.a - rgb1.a) * p) + rgb1.a
+    };
+
+    return tinycolor(rgba);
+};
+
+// Readability Functions
+// ---------------------
+// <http://www.w3.org/TR/2008/REC-WCAG20-20081211/#contrast-ratiodef (WCAG Version 2)
+
+// contrast
+// Analyze the 2 colors and returns the color contrast defined by (WCAG Version 2)
+tinycolor.readability = function(color1, color2) {
+    var c1 = tinycolor(color1);
+    var c2 = tinycolor(color2);
+    return (Math.max(c1.getLuminance(),c2.getLuminance())+0.05) / (Math.min(c1.getLuminance(),c2.getLuminance())+0.05);
+};
+
+// isReadable
+// Ensure that foreground and background color combinations meet WCAG2 guidelines.
+// The third argument is an optional Object.
+//      the 'level' property states 'AA' or 'AAA' - if missing or invalid, it defaults to 'AA';
+//      the 'size' property states 'large' or 'small' - if missing or invalid, it defaults to 'small'.
+// If the entire object is absent, isReadable defaults to {level:"AA",size:"small"}.
+
+// *Example*
+//    tinycolor.isReadable("#000", "#111") => false
+//    tinycolor.isReadable("#000", "#111",{level:"AA",size:"large"}) => false
+tinycolor.isReadable = function(color1, color2, wcag2) {
+    var readability = tinycolor.readability(color1, color2);
+    var wcag2Parms, out;
+
+    out = false;
+
+    wcag2Parms = validateWCAG2Parms(wcag2);
+    switch (wcag2Parms.level + wcag2Parms.size) {
+        case "AAsmall":
+        case "AAAlarge":
+            out = readability >= 4.5;
+            break;
+        case "AAlarge":
+            out = readability >= 3;
+            break;
+        case "AAAsmall":
+            out = readability >= 7;
+            break;
+    }
+    return out;
+
+};
+
+// mostReadable
+// Given a base color and a list of possible foreground or background
+// colors for that base, returns the most readable color.
+// Optionally returns Black or White if the most readable color is unreadable.
+// *Example*
+//    tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:false}).toHexString(); // "#112255"
+//    tinycolor.mostReadable(tinycolor.mostReadable("#123", ["#124", "#125"],{includeFallbackColors:true}).toHexString();  // "#ffffff"
+//    tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"large"}).toHexString(); // "#faf3f3"
+//    tinycolor.mostReadable("#a8015a", ["#faf3f3"],{includeFallbackColors:true,level:"AAA",size:"small"}).toHexString(); // "#ffffff"
+tinycolor.mostReadable = function(baseColor, colorList, args) {
+    var bestColor = null;
+    var bestScore = 0;
+    var readability;
+    var includeFallbackColors, level, size ;
+    args = args || {};
+    includeFallbackColors = args.includeFallbackColors ;
+    level = args.level;
+    size = args.size;
+
+    for (var i= 0; i < colorList.length ; i++) {
+        readability = tinycolor.readability(baseColor, colorList[i]);
+        if (readability > bestScore) {
+            bestScore = readability;
+            bestColor = tinycolor(colorList[i]);
+        }
+    }
+
+    if (tinycolor.isReadable(baseColor, bestColor, {"level":level,"size":size}) || !includeFallbackColors) {
+        return bestColor;
+    }
+    else {
+        args.includeFallbackColors=false;
+        return tinycolor.mostReadable(baseColor,["#fff", "#000"],args);
+    }
+};
+
+// Big List of Colors
+// ------------------
+// <http://www.w3.org/TR/css3-color/#svg-color>
+var names = tinycolor.names = {
+    aliceblue: "f0f8ff",
+    antiquewhite: "faebd7",
+    aqua: "0ff",
+    aquamarine: "7fffd4",
+    azure: "f0ffff",
+    beige: "f5f5dc",
+    bisque: "ffe4c4",
+    black: "000",
+    blanchedalmond: "ffebcd",
+    blue: "00f",
+    blueviolet: "8a2be2",
+    brown: "a52a2a",
+    burlywood: "deb887",
+    burntsienna: "ea7e5d",
+    cadetblue: "5f9ea0",
+    chartreuse: "7fff00",
+    chocolate: "d2691e",
+    coral: "ff7f50",
+    cornflowerblue: "6495ed",
+    cornsilk: "fff8dc",
+    crimson: "dc143c",
+    cyan: "0ff",
+    darkblue: "00008b",
+    darkcyan: "008b8b",
+    darkgoldenrod: "b8860b",
+    darkgray: "a9a9a9",
+    darkgreen: "006400",
+    darkgrey: "a9a9a9",
+    darkkhaki: "bdb76b",
+    darkmagenta: "8b008b",
+    darkolivegreen: "556b2f",
+    darkorange: "ff8c00",
+    darkorchid: "9932cc",
+    darkred: "8b0000",
+    darksalmon: "e9967a",
+    darkseagreen: "8fbc8f",
+    darkslateblue: "483d8b",
+    darkslategray: "2f4f4f",
+    darkslategrey: "2f4f4f",
+    darkturquoise: "00ced1",
+    darkviolet: "9400d3",
+    deeppink: "ff1493",
+    deepskyblue: "00bfff",
+    dimgray: "696969",
+    dimgrey: "696969",
+    dodgerblue: "1e90ff",
+    firebrick: "b22222",
+    floralwhite: "fffaf0",
+    forestgreen: "228b22",
+    fuchsia: "f0f",
+    gainsboro: "dcdcdc",
+    ghostwhite: "f8f8ff",
+    gold: "ffd700",
+    goldenrod: "daa520",
+    gray: "808080",
+    green: "008000",
+    greenyellow: "adff2f",
+    grey: "808080",
+    honeydew: "f0fff0",
+    hotpink: "ff69b4",
+    indianred: "cd5c5c",
+    indigo: "4b0082",
+    ivory: "fffff0",
+    khaki: "f0e68c",
+    lavender: "e6e6fa",
+    lavenderblush: "fff0f5",
+    lawngreen: "7cfc00",
+    lemonchiffon: "fffacd",
+    lightblue: "add8e6",
+    lightcoral: "f08080",
+    lightcyan: "e0ffff",
+    lightgoldenrodyellow: "fafad2",
+    lightgray: "d3d3d3",
+    lightgreen: "90ee90",
+    lightgrey: "d3d3d3",
+    lightpink: "ffb6c1",
+    lightsalmon: "ffa07a",
+    lightseagreen: "20b2aa",
+    lightskyblue: "87cefa",
+    lightslategray: "789",
+    lightslategrey: "789",
+    lightsteelblue: "b0c4de",
+    lightyellow: "ffffe0",
+    lime: "0f0",
+    limegreen: "32cd32",
+    linen: "faf0e6",
+    magenta: "f0f",
+    maroon: "800000",
+    mediumaquamarine: "66cdaa",
+    mediumblue: "0000cd",
+    mediumorchid: "ba55d3",
+    mediumpurple: "9370db",
+    mediumseagreen: "3cb371",
+    mediumslateblue: "7b68ee",
+    mediumspringgreen: "00fa9a",
+    mediumturquoise: "48d1cc",
+    mediumvioletred: "c71585",
+    midnightblue: "191970",
+    mintcream: "f5fffa",
+    mistyrose: "ffe4e1",
+    moccasin: "ffe4b5",
+    navajowhite: "ffdead",
+    navy: "000080",
+    oldlace: "fdf5e6",
+    olive: "808000",
+    olivedrab: "6b8e23",
+    orange: "ffa500",
+    orangered: "ff4500",
+    orchid: "da70d6",
+    palegoldenrod: "eee8aa",
+    palegreen: "98fb98",
+    paleturquoise: "afeeee",
+    palevioletred: "db7093",
+    papayawhip: "ffefd5",
+    peachpuff: "ffdab9",
+    peru: "cd853f",
+    pink: "ffc0cb",
+    plum: "dda0dd",
+    powderblue: "b0e0e6",
+    purple: "800080",
+    rebeccapurple: "663399",
+    red: "f00",
+    rosybrown: "bc8f8f",
+    royalblue: "4169e1",
+    saddlebrown: "8b4513",
+    salmon: "fa8072",
+    sandybrown: "f4a460",
+    seagreen: "2e8b57",
+    seashell: "fff5ee",
+    sienna: "a0522d",
+    silver: "c0c0c0",
+    skyblue: "87ceeb",
+    slateblue: "6a5acd",
+    slategray: "708090",
+    slategrey: "708090",
+    snow: "fffafa",
+    springgreen: "00ff7f",
+    steelblue: "4682b4",
+    tan: "d2b48c",
+    teal: "008080",
+    thistle: "d8bfd8",
+    tomato: "ff6347",
+    turquoise: "40e0d0",
+    violet: "ee82ee",
+    wheat: "f5deb3",
+    white: "fff",
+    whitesmoke: "f5f5f5",
+    yellow: "ff0",
+    yellowgreen: "9acd32"
+};
+
+// Make it easy to access colors via hexNames[hex]
+var hexNames = tinycolor.hexNames = flip(names);
+
+// Utilities
+// ---------
+
+// { 'name1': 'val1' } becomes { 'val1': 'name1' }
+function flip(o) {
+    var flipped = { };
+    for (var i in o) {
+        if (o.hasOwnProperty(i)) {
+            flipped[o[i]] = i;
+        }
+    }
+    return flipped;
+}
+
+// Return a valid alpha value [0,1] with all invalid values being set to 1
+function boundAlpha(a) {
+    a = parseFloat(a);
+
+    if (isNaN(a) || a < 0 || a > 1) {
+        a = 1;
+    }
+
+    return a;
+}
+
+// Take input from [0, n] and return it as [0, 1]
+function bound01(n, max) {
+    if (isOnePointZero(n)) { n = "100%"; }
+
+    var processPercent = isPercentage(n);
+    n = mathMin(max, mathMax(0, parseFloat(n)));
+
+    // Automatically convert percentage into number
+    if (processPercent) {
+        n = parseInt(n * max, 10) / 100;
+    }
+
+    // Handle floating point rounding errors
+    if ((Math.abs(n - max) < 0.000001)) {
+        return 1;
+    }
+
+    // Convert into [0, 1] range if it isn't already
+    return (n % max) / parseFloat(max);
+}
+
+// Force a number between 0 and 1
+function clamp01(val) {
+    return mathMin(1, mathMax(0, val));
+}
+
+// Parse a base-16 hex value into a base-10 integer
+function parseIntFromHex(val) {
+    return parseInt(val, 16);
+}
+
+// Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1
+// <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>
+function isOnePointZero(n) {
+    return typeof n == "string" && n.indexOf('.') != -1 && parseFloat(n) === 1;
+}
+
+// Check to see if string passed in is a percentage
+function isPercentage(n) {
+    return typeof n === "string" && n.indexOf('%') != -1;
+}
+
+// Force a hex value to have 2 characters
+function pad2(c) {
+    return c.length == 1 ? '0' + c : '' + c;
+}
+
+// Replace a decimal with it's percentage value
+function convertToPercentage(n) {
+    if (n <= 1) {
+        n = (n * 100) + "%";
+    }
+
+    return n;
+}
+
+// Converts a decimal to a hex value
+function convertDecimalToHex(d) {
+    return Math.round(parseFloat(d) * 255).toString(16);
+}
+// Converts a hex value to a decimal
+function convertHexToDecimal(h) {
+    return (parseIntFromHex(h) / 255);
+}
+
+var matchers = (function() {
+
+    // <http://www.w3.org/TR/css3-values/#integers>
+    var CSS_INTEGER = "[-\\+]?\\d+%?";
+
+    // <http://www.w3.org/TR/css3-values/#number-value>
+    var CSS_NUMBER = "[-\\+]?\\d*\\.\\d+%?";
+
+    // Allow positive/negative integer/number.  Don't capture the either/or, just the entire outcome.
+    var CSS_UNIT = "(?:" + CSS_NUMBER + ")|(?:" + CSS_INTEGER + ")";
+
+    // Actual matching.
+    // Parentheses and commas are optional, but not required.
+    // Whitespace can take the place of commas or opening paren
+    var PERMISSIVE_MATCH3 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
+    var PERMISSIVE_MATCH4 = "[\\s|\\(]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")[,|\\s]+(" + CSS_UNIT + ")\\s*\\)?";
+
+    return {
+        CSS_UNIT: new RegExp(CSS_UNIT),
+        rgb: new RegExp("rgb" + PERMISSIVE_MATCH3),
+        rgba: new RegExp("rgba" + PERMISSIVE_MATCH4),
+        hsl: new RegExp("hsl" + PERMISSIVE_MATCH3),
+        hsla: new RegExp("hsla" + PERMISSIVE_MATCH4),
+        hsv: new RegExp("hsv" + PERMISSIVE_MATCH3),
+        hsva: new RegExp("hsva" + PERMISSIVE_MATCH4),
+        hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
+        hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,
+        hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,
+        hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/
+    };
+})();
+
+// isValidCSSUnit
+// Take in a single string / number and check to see if it looks like a CSS unit
+// (see matchers above for definition).
+function isValidCSSUnit(color) {
+    return !!matchers.CSS_UNIT.exec(color);
+}
+
+// stringInputToObject
+// Permissive string parsing.  Take in a number of formats, and output an object
+// based on detected format.  Returns { r, g, b } or { h, s, l } or { h, s, v}
+function stringInputToObject(color) {
+
+    color = color.replace(trimLeft, '').replace(trimRight, '').toLowerCase();
+    var named = false;
+    if (names[color]) {
+        color = names[color];
+        named = true;
+    }
+    else if (color == 'transparent') {
+        return { r: 0, g: 0, b: 0, a: 0, format: "name" };
+    }
+
+    // Try to match string input using regular expressions.
+    // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]
+    // Just return an object and let the conversion functions handle that.
+    // This way the result will be the same whether the tinycolor is initialized with string or object.
+    var match;
+    if ((match = matchers.rgb.exec(color))) {
+        return { r: match[1], g: match[2], b: match[3] };
+    }
+    if ((match = matchers.rgba.exec(color))) {
+        return { r: match[1], g: match[2], b: match[3], a: match[4] };
+    }
+    if ((match = matchers.hsl.exec(color))) {
+        return { h: match[1], s: match[2], l: match[3] };
+    }
+    if ((match = matchers.hsla.exec(color))) {
+        return { h: match[1], s: match[2], l: match[3], a: match[4] };
+    }
+    if ((match = matchers.hsv.exec(color))) {
+        return { h: match[1], s: match[2], v: match[3] };
+    }
+    if ((match = matchers.hsva.exec(color))) {
+        return { h: match[1], s: match[2], v: match[3], a: match[4] };
+    }
+    if ((match = matchers.hex8.exec(color))) {
+        return {
+            r: parseIntFromHex(match[1]),
+            g: parseIntFromHex(match[2]),
+            b: parseIntFromHex(match[3]),
+            a: convertHexToDecimal(match[4]),
+            format: named ? "name" : "hex8"
+        };
+    }
+    if ((match = matchers.hex6.exec(color))) {
+        return {
+            r: parseIntFromHex(match[1]),
+            g: parseIntFromHex(match[2]),
+            b: parseIntFromHex(match[3]),
+            format: named ? "name" : "hex"
+        };
+    }
+    if ((match = matchers.hex4.exec(color))) {
+        return {
+            r: parseIntFromHex(match[1] + '' + match[1]),
+            g: parseIntFromHex(match[2] + '' + match[2]),
+            b: parseIntFromHex(match[3] + '' + match[3]),
+            a: convertHexToDecimal(match[4] + '' + match[4]),
+            format: named ? "name" : "hex8"
+        };
+    }
+    if ((match = matchers.hex3.exec(color))) {
+        return {
+            r: parseIntFromHex(match[1] + '' + match[1]),
+            g: parseIntFromHex(match[2] + '' + match[2]),
+            b: parseIntFromHex(match[3] + '' + match[3]),
+            format: named ? "name" : "hex"
+        };
+    }
+
+    return false;
+}
+
+function validateWCAG2Parms(parms) {
+    // return valid WCAG2 parms for isReadable.
+    // If input parms are invalid, return {"level":"AA", "size":"small"}
+    var level, size;
+    parms = parms || {"level":"AA", "size":"small"};
+    level = (parms.level || "AA").toUpperCase();
+    size = (parms.size || "small").toLowerCase();
+    if (level !== "AA" && level !== "AAA") {
+        level = "AA";
+    }
+    if (size !== "small" && size !== "large") {
+        size = "small";
+    }
+    return {"level":level, "size":size};
+}
+
+this.tinycolor = tinycolor;
+
+})()`;
+}
+// It is hacky way to make this function will be compiled preferentially by less
+// resolve error: `ReferenceError: colorPalette is not defined`
+// https://github.com/ant-design/ant-motion/issues/44
+.tinyColorMixin();
diff --git a/src/styles/compact.less b/src/styles/compact.less
new file mode 100644
index 0000000..ef0008b
--- /dev/null
+++ b/src/styles/compact.less
@@ -0,0 +1,4 @@
+@root-entry-name: default;
+
+@import './themes/compact.less';
+@import './core/index';
diff --git a/src/styles/core/base.less b/src/styles/core/base.less
new file mode 100644
index 0000000..a704c55
--- /dev/null
+++ b/src/styles/core/base.less
@@ -0,0 +1,10 @@
+// Config global less under antd
+[class^=~'@{ant-prefix}-'],
+[class*=~' @{ant-prefix}-'] {
+  // remove the clear button of a text input control in IE10+
+  &::-ms-clear,
+  input::-ms-clear,
+  input::-ms-reveal {
+    display: none;
+  }
+}
diff --git a/src/styles/core/global.less b/src/styles/core/global.less
new file mode 100644
index 0000000..cb26cce
--- /dev/null
+++ b/src/styles/core/global.less
@@ -0,0 +1,491 @@
+/* stylelint-disable property-no-vendor-prefix, at-rule-no-vendor-prefix */
+
+// Reboot
+//
+// Normalization of HTML elements, manually forked from Normalize.css to remove
+// styles targeting irrelevant browsers while applying new styles.
+//
+// Normalize is licensed MIT. https://github.com/necolas/normalize.css
+
+// HTML & Body reset
+@{html-selector},
+body {
+  .square(100%);
+}
+
+// remove the clear button of a text input control in IE10+
+input::-ms-clear,
+input::-ms-reveal {
+  display: none;
+}
+
+// Document
+//
+// 1. Change from `box-sizing: content-box` so that `width` is not affected by `padding` or `border`.
+// 2. Change the default font family in all browsers.
+// 3. Correct the line height in all browsers.
+// 4. Prevent adjustments of font size after orientation changes in IE on Windows Phone and in iOS.
+// 5. Setting @viewport causes scrollbars to overlap content in IE11 and Edge, so
+//    we force a non-overlapping, non-auto-hiding scrollbar to counteract.
+// 6. Change the default tap highlight to be completely transparent in iOS.
+
+*,
+*::before,
+*::after {
+  box-sizing: border-box; // 1
+}
+
+@{html-selector} {
+  font-family: sans-serif; // 2
+  line-height: 1.15; // 3
+  -webkit-text-size-adjust: 100%; // 4
+  -ms-text-size-adjust: 100%; // 4
+  -ms-overflow-style: scrollbar; // 5
+  -webkit-tap-highlight-color: fade(@black, 0%); // 6
+}
+
+// IE10+ doesn't honor `<meta name="viewport">` in some cases.
+@-ms-viewport {
+  width: device-width;
+}
+
+// Body
+//
+// 1. remove the margin in all browsers.
+// 2. As a best practice, apply a default `body-background`.
+
+body {
+  margin: 0; // 1
+  color: @text-color;
+  font-size: @font-size-base;
+  font-family: @font-family;
+  font-variant: @font-variant-base;
+  line-height: @line-height-base;
+  background-color: @body-background; // 2
+  font-feature-settings: @font-feature-settings-base;
+}
+
+// Suppress the focus outline on elements that cannot be accessed via keyboard.
+// This prevents an unwanted focus outline from appearing around elements that
+// might still respond to pointer events.
+//
+// Credit: https://github.com/suitcss/base
+[tabindex='-1']:focus {
+  outline: none !important;
+}
+
+// Content grouping
+//
+// 1. Add the correct box sizing in Firefox.
+// 2. Show the overflow in Edge and IE.
+
+hr {
+  box-sizing: content-box; // 1
+  height: 0; // 1
+  overflow: visible; // 2
+}
+
+//
+// Typography
+//
+
+// remove top margins from headings
+//
+// By default, `<h1>`-`<h6>` all receive top and bottom margins. We nuke the top
+// margin for easier control within type scales as it avoids margin collapsing.
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin-top: 0;
+  margin-bottom: 0.5em;
+  color: @heading-color;
+  font-weight: 500;
+}
+
+// Reset margins on paragraphs
+//
+// Similarly, the top margin on `<p>`s get reset. However, we also reset the
+// bottom margin to use `em` units instead of `em`.
+p {
+  margin-top: 0;
+  margin-bottom: 1em;
+}
+
+// Abbreviations
+//
+// 1. remove the bottom border in Firefox 39-.
+// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.
+// 3. Add explicit cursor to indicate changed behavior.
+// 4. Duplicate behavior to the data-* attribute for our tooltip plugin
+
+abbr[title],
+abbr[data-original-title] {
+  // 4
+  text-decoration: underline; // 2
+  text-decoration: underline dotted; // 2
+  border-bottom: 0; // 1
+  cursor: help; // 3
+}
+
+address {
+  margin-bottom: 1em;
+  font-style: normal;
+  line-height: inherit;
+}
+
+input[type='text'],
+input[type='password'],
+input[type='number'],
+textarea {
+  -webkit-appearance: none;
+}
+
+ol,
+ul,
+dl {
+  margin-top: 0;
+  margin-bottom: 1em;
+}
+
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+  margin-bottom: 0;
+}
+
+dt {
+  font-weight: 500;
+}
+
+dd {
+  margin-bottom: 0.5em;
+  margin-left: 0; // Undo browser default
+}
+
+blockquote {
+  margin: 0 0 1em;
+}
+
+dfn {
+  font-style: italic; // Add the correct font style in Android 4.3-
+}
+
+b,
+strong {
+  font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari
+}
+
+small {
+  font-size: 80%; // Add the correct font size in all browsers
+}
+
+//
+// Prevent `sub` and `sup` elements from affecting the line height in
+// all browsers.
+//
+
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+
+sub {
+  bottom: -0.25em;
+}
+
+sup {
+  top: -0.5em;
+}
+
+//
+// Links
+//
+
+a {
+  color: @link-color;
+  text-decoration: @link-decoration;
+  background-color: transparent; // remove the gray background on active links in IE 10.
+  outline: none;
+  cursor: pointer;
+  transition: color 0.3s;
+  -webkit-text-decoration-skip: objects; // remove gaps in links underline in iOS 8+ and Safari 8+.
+
+  &:hover {
+    color: @link-hover-color;
+  }
+
+  &:active {
+    color: @link-active-color;
+  }
+
+  &:active,
+  &:hover {
+    text-decoration: @link-hover-decoration;
+    outline: 0;
+  }
+
+  // https://github.com/ant-design/ant-design/issues/22503
+  &:focus {
+    text-decoration: @link-focus-decoration;
+    outline: @link-focus-outline;
+  }
+
+  &[disabled] {
+    color: @disabled-color;
+    cursor: not-allowed;
+  }
+}
+
+//
+// Code
+//
+
+pre,
+code,
+kbd,
+samp {
+  font-size: 1em; // Correct the odd `em` font sizing in all browsers.
+  font-family: @code-family;
+}
+
+pre {
+  // remove browser default top margin
+  margin-top: 0;
+  // Reset browser default of `1em` to use `em`s
+  margin-bottom: 1em;
+  // Don't allow content to break outside
+  overflow: auto;
+}
+
+//
+// Figures
+//
+figure {
+  // Apply a consistent margin strategy (matches our type styles).
+  margin: 0 0 1em;
+}
+
+//
+// Images and content
+//
+
+img {
+  vertical-align: middle;
+  border-style: none; // remove the border on images inside links in IE 10-.
+}
+
+// Avoid 300ms click delay on touch devices that support the `touch-action` CSS property.
+//
+// In particular, unlike most other browsers, IE11+Edge on Windows 10 on touch devices and IE Mobile 10-11
+// DON'T remove the click delay when `<meta name="viewport" content="width=device-width">` is present.
+// However, they DO support emoving the click delay via `touch-action: manipulation`.
+// See:
+// * https://getbootstrap.com/docs/4.0/content/reboot/#click-delay-optimization-for-touch
+// * http://caniuse.com/#feat=css-touch-action
+// * https://patrickhlauke.github.io/touch/tests/results/#suppressing-300ms-delay
+
+a,
+area,
+button,
+[role='button'],
+input:not([type='range']),
+label,
+select,
+summary,
+textarea {
+  touch-action: manipulation;
+}
+
+//
+// Tables
+//
+
+table {
+  border-collapse: collapse; // Prevent double borders
+}
+
+caption {
+  padding-top: 0.75em;
+  padding-bottom: 0.3em;
+  color: @text-color-secondary;
+  text-align: left;
+  caption-side: bottom;
+}
+
+//
+// Forms
+//
+
+input,
+button,
+select,
+optgroup,
+textarea {
+  margin: 0; // remove the margin in Firefox and Safari
+  color: inherit;
+  font-size: inherit;
+  font-family: inherit;
+  line-height: inherit;
+}
+
+button,
+input {
+  overflow: visible; // Show the overflow in Edge
+}
+
+button,
+select {
+  text-transform: none; // remove the inheritance of text transform in Firefox
+}
+
+// 1. Prevent a WebKit bug where (2) destroys native `audio` and `video`
+//    controls in Android 4.
+// 2. Correct the inability to style clickable types in iOS and Safari.
+button,
+@{html-selector} [type="button"], /* 1 */
+[type="reset"],
+[type="submit"] {
+  -webkit-appearance: button; // 2
+}
+
+// remove inner border and padding from Firefox, but don't restore the outline like Normalize.
+button::-moz-focus-inner,
+[type='button']::-moz-focus-inner,
+[type='reset']::-moz-focus-inner,
+[type='submit']::-moz-focus-inner {
+  padding: 0;
+  border-style: none;
+}
+
+input[type='radio'],
+input[type='checkbox'] {
+  box-sizing: border-box; // 1. Add the correct box sizing in IE 10-
+  padding: 0; // 2. remove the padding in IE 10-
+}
+
+input[type='date'],
+input[type='time'],
+input[type='datetime-local'],
+input[type='month'] {
+  // remove the default appearance of temporal inputs to avoid a Mobile Safari
+  // bug where setting a custom line-height prevents text from being vertically
+  // centered within the input.
+  // See https://bugs.webkit.org/show_bug.cgi?id=139848
+  // and https://github.com/twbs/bootstrap/issues/11266
+  -webkit-appearance: listbox;
+}
+
+textarea {
+  overflow: auto; // remove the default vertical scrollbar in IE.
+  // Textareas should really only resize vertically so they don't break their (horizontal) containers.
+  resize: vertical;
+}
+
+fieldset {
+  // Browsers set a default `min-width: min-content;` on fieldsets,
+  // unlike e.g. `<div>`s, which have `min-width: 0;` by default.
+  // So we reset that to ensure fieldsets behave more like a standard block element.
+  // See https://github.com/twbs/bootstrap/issues/12359
+  // and https://html.spec.whatwg.org/multipage/#the-fieldset-and-legend-elements
+  min-width: 0;
+  margin: 0;
+  // Reset the default outline behavior of fieldsets so they don't affect page layout.
+  padding: 0;
+  border: 0;
+}
+
+// 1. Correct the text wrapping in Edge and IE.
+// 2. Correct the color inheritance from `fieldset` elements in IE.
+legend {
+  display: block;
+  width: 100%;
+  max-width: 100%; // 1
+  margin-bottom: 0.5em;
+  padding: 0;
+  color: inherit; // 2
+  font-size: 1.5em;
+  line-height: inherit;
+  white-space: normal; // 1
+}
+
+progress {
+  vertical-align: baseline; // Add the correct vertical alignment in Chrome, Firefox, and Opera.
+}
+
+// Correct the cursor style of incement and decement buttons in Chrome.
+[type='number']::-webkit-inner-spin-button,
+[type='number']::-webkit-outer-spin-button {
+  height: auto;
+}
+
+[type='search'] {
+  // This overrides the extra rounded corners on search inputs in iOS so that our
+  // `.form-control` class can properly style them. Note that this cannot simply
+  // be added to `.form-control` as it's not specific enough. For details, see
+  // https://github.com/twbs/bootstrap/issues/11586.
+  outline-offset: -2px; // 2. Correct the outline style in Safari.
+  -webkit-appearance: none;
+}
+
+//
+// remove the inner padding and cancel buttons in Chrome and Safari on macOS.
+//
+
+[type='search']::-webkit-search-cancel-button,
+[type='search']::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+
+//
+// 1. Correct the inability to style clickable types in iOS and Safari.
+// 2. Change font properties to `inherit` in Safari.
+//
+
+::-webkit-file-upload-button {
+  font: inherit; // 2
+  -webkit-appearance: button; // 1
+}
+
+//
+// Correct element displays
+//
+
+output {
+  display: inline-block;
+}
+
+summary {
+  display: list-item; // Add the correct display in all browsers
+}
+
+template {
+  display: none; // Add the correct display in IE
+}
+
+// Always hide an element with the `hidden` HTML attribute (from PureCSS).
+// Needed for proper display in IE 10-.
+[hidden] {
+  display: none !important;
+}
+
+mark {
+  padding: 0.2em;
+  background-color: @yellow-1;
+}
+
+::selection {
+  color: @text-color-inverse;
+  background: @text-selection-bg;
+}
+
+// Utility classes
+.clearfix {
+  .clearfix();
+}
diff --git a/src/styles/core/iconfont.less b/src/styles/core/iconfont.less
new file mode 100644
index 0000000..597b854
--- /dev/null
+++ b/src/styles/core/iconfont.less
@@ -0,0 +1,22 @@
+@import '../themes/index';
+@import '../mixins/iconfont';
+
+.@{iconfont-css-prefix} {
+  .iconfont-mixin();
+
+  // https://github.com/ant-design/ant-design/issues/33703
+  & > & {
+    line-height: 0;
+    vertical-align: 0;
+  }
+
+  &[tabindex] {
+    cursor: pointer;
+  }
+}
+
+.@{iconfont-css-prefix}-spin,
+.@{iconfont-css-prefix}-spin::before {
+  display: inline-block;
+  animation: loadingCircle 1s infinite linear;
+}
diff --git a/src/styles/core/index.less b/src/styles/core/index.less
new file mode 100644
index 0000000..c493947
--- /dev/null
+++ b/src/styles/core/index.less
@@ -0,0 +1,5 @@
+@import '../mixins/index';
+@import 'base';
+@import 'global';
+@import 'iconfont';
+@import 'motion';
diff --git a/src/styles/core/motion.less b/src/styles/core/motion.less
new file mode 100644
index 0000000..286d50e
--- /dev/null
+++ b/src/styles/core/motion.less
@@ -0,0 +1,22 @@
+// @import '../mixins/motion'; This has moved to theme/xxx inside.
+@import 'motion/fade';
+@import 'motion/move';
+@import 'motion/other';
+@import 'motion/slide';
+@import 'motion/zoom';
+
+// For common/openAnimation
+.ant-motion-collapse-legacy {
+  overflow: hidden;
+
+  &-active {
+    transition: height @animation-duration-base @ease-in-out,
+      opacity @animation-duration-base @ease-in-out !important;
+  }
+}
+
+.ant-motion-collapse {
+  overflow: hidden;
+  transition: height @animation-duration-base @ease-in-out,
+    opacity @animation-duration-base @ease-in-out !important;
+}
diff --git a/src/styles/core/motion/fade.less b/src/styles/core/motion/fade.less
new file mode 100644
index 0000000..f4a9513
--- /dev/null
+++ b/src/styles/core/motion/fade.less
@@ -0,0 +1,34 @@
+.fade-motion(@className, @keyframeName) {
+  @name: ~'@{ant-prefix}-@{className}';
+  .make-motion(@name, @keyframeName);
+  .@{name}-enter,
+  .@{name}-appear {
+    opacity: 0;
+    animation-timing-function: linear;
+  }
+  .@{name}-leave {
+    animation-timing-function: linear;
+  }
+}
+
+.fade-motion(fade, antFade);
+
+@keyframes antFadeIn {
+  0% {
+    opacity: 0;
+  }
+
+  100% {
+    opacity: 1;
+  }
+}
+
+@keyframes antFadeOut {
+  0% {
+    opacity: 1;
+  }
+
+  100% {
+    opacity: 0;
+  }
+}
diff --git a/src/styles/core/motion/move.less b/src/styles/core/motion/move.less
new file mode 100644
index 0000000..733f26d
--- /dev/null
+++ b/src/styles/core/motion/move.less
@@ -0,0 +1,129 @@
+.move-motion(@className, @keyframeName) {
+  @name: ~'@{ant-prefix}-@{className}';
+  .make-motion(@name, @keyframeName);
+  .@{name}-enter,
+  .@{name}-appear {
+    opacity: 0;
+    animation-timing-function: @ease-out-circ;
+  }
+  .@{name}-leave {
+    animation-timing-function: @ease-in-circ;
+  }
+}
+
+.move-motion(move-up, antMoveUp);
+.move-motion(move-down, antMoveDown);
+.move-motion(move-left, antMoveLeft);
+.move-motion(move-right, antMoveRight);
+
+@keyframes antMoveDownIn {
+  0% {
+    transform: translateY(100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+
+  100% {
+    transform: translateY(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+}
+
+@keyframes antMoveDownOut {
+  0% {
+    transform: translateY(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+
+  100% {
+    transform: translateY(100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+}
+
+@keyframes antMoveLeftIn {
+  0% {
+    transform: translateX(-100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+
+  100% {
+    transform: translateX(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+}
+
+@keyframes antMoveLeftOut {
+  0% {
+    transform: translateX(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+
+  100% {
+    transform: translateX(-100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+}
+
+@keyframes antMoveRightIn {
+  0% {
+    transform: translateX(100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+
+  100% {
+    transform: translateX(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+}
+
+@keyframes antMoveRightOut {
+  0% {
+    transform: translateX(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+
+  100% {
+    transform: translateX(100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+}
+
+@keyframes antMoveUpIn {
+  0% {
+    transform: translateY(-100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+
+  100% {
+    transform: translateY(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+}
+
+@keyframes antMoveUpOut {
+  0% {
+    transform: translateY(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+
+  100% {
+    transform: translateY(-100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+}
diff --git a/src/styles/core/motion/other.less b/src/styles/core/motion/other.less
new file mode 100644
index 0000000..d1a2549
--- /dev/null
+++ b/src/styles/core/motion/other.less
@@ -0,0 +1,51 @@
+@keyframes loadingCircle {
+  100% {
+    transform: rotate(360deg);
+  }
+}
+
+@click-animating-true: ~"[@{ant-prefix}-click-animating='true']";
+@click-animating-with-extra-node-true: ~"[@{ant-prefix}-click-animating-without-extra-node='true']";
+
+@{click-animating-true},
+@{click-animating-with-extra-node-true} {
+  position: relative;
+}
+
+html {
+  --antd-wave-shadow-color: @primary-color;
+  --scroll-bar: 0;
+}
+
+@click-animating-with-extra-node-true-after: ~'@{click-animating-with-extra-node-true}::after';
+
+@{click-animating-with-extra-node-true-after},
+.@{ant-prefix}-click-animating-node {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  display: block;
+  border-radius: inherit;
+  box-shadow: 0 0 0 0 @primary-color;
+  box-shadow: 0 0 0 0 var(--antd-wave-shadow-color);
+  opacity: 0.2;
+  animation: fadeEffect 2s @ease-out-circ, waveEffect 0.4s @ease-out-circ;
+  animation-fill-mode: forwards;
+  content: '';
+  pointer-events: none;
+}
+
+@keyframes waveEffect {
+  100% {
+    box-shadow: 0 0 0 @primary-color;
+    box-shadow: 0 0 0 @wave-animation-width var(--antd-wave-shadow-color);
+  }
+}
+
+@keyframes fadeEffect {
+  100% {
+    opacity: 0;
+  }
+}
diff --git a/src/styles/core/motion/slide.less b/src/styles/core/motion/slide.less
new file mode 100644
index 0000000..7831b4b
--- /dev/null
+++ b/src/styles/core/motion/slide.less
@@ -0,0 +1,131 @@
+.slide-motion(@className, @keyframeName) {
+  @name: ~'@{ant-prefix}-@{className}';
+  .make-motion(@name, @keyframeName);
+  .@{name}-enter,
+  .@{name}-appear {
+    transform: scale(0);
+    transform-origin: 0% 0%;
+    opacity: 0;
+    animation-timing-function: @ease-out-quint;
+  }
+  .@{name}-leave {
+    animation-timing-function: @ease-in-quint;
+  }
+}
+
+.slide-motion(slide-up, antSlideUp);
+.slide-motion(slide-down, antSlideDown);
+.slide-motion(slide-left, antSlideLeft);
+.slide-motion(slide-right, antSlideRight);
+
+@keyframes antSlideUpIn {
+  0% {
+    transform: scaleY(0.8);
+    transform-origin: 0% 0%;
+    opacity: 0;
+  }
+
+  100% {
+    transform: scaleY(1);
+    transform-origin: 0% 0%;
+    opacity: 1;
+  }
+}
+
+@keyframes antSlideUpOut {
+  0% {
+    transform: scaleY(1);
+    transform-origin: 0% 0%;
+    opacity: 1;
+  }
+
+  100% {
+    transform: scaleY(0.8);
+    transform-origin: 0% 0%;
+    opacity: 0;
+  }
+}
+
+@keyframes antSlideDownIn {
+  0% {
+    transform: scaleY(0.8);
+    transform-origin: 100% 100%;
+    opacity: 0;
+  }
+
+  100% {
+    transform: scaleY(1);
+    transform-origin: 100% 100%;
+    opacity: 1;
+  }
+}
+
+@keyframes antSlideDownOut {
+  0% {
+    transform: scaleY(1);
+    transform-origin: 100% 100%;
+    opacity: 1;
+  }
+
+  100% {
+    transform: scaleY(0.8);
+    transform-origin: 100% 100%;
+    opacity: 0;
+  }
+}
+
+@keyframes antSlideLeftIn {
+  0% {
+    transform: scaleX(0.8);
+    transform-origin: 0% 0%;
+    opacity: 0;
+  }
+
+  100% {
+    transform: scaleX(1);
+    transform-origin: 0% 0%;
+    opacity: 1;
+  }
+}
+
+@keyframes antSlideLeftOut {
+  0% {
+    transform: scaleX(1);
+    transform-origin: 0% 0%;
+    opacity: 1;
+  }
+
+  100% {
+    transform: scaleX(0.8);
+    transform-origin: 0% 0%;
+    opacity: 0;
+  }
+}
+
+@keyframes antSlideRightIn {
+  0% {
+    transform: scaleX(0.8);
+    transform-origin: 100% 0%;
+    opacity: 0;
+  }
+
+  100% {
+    transform: scaleX(1);
+    transform-origin: 100% 0%;
+    opacity: 1;
+  }
+}
+
+@keyframes antSlideRightOut {
+  0% {
+    transform: scaleX(1);
+    transform-origin: 100% 0%;
+    opacity: 1;
+  }
+
+  100% {
+    transform: scaleX(0.8);
+    transform-origin: 100% 0%;
+    opacity: 0;
+  }
+}
diff --git a/src/styles/core/motion/zoom.less b/src/styles/core/motion/zoom.less
new file mode 100644
index 0000000..72739b7
--- /dev/null
+++ b/src/styles/core/motion/zoom.less
@@ -0,0 +1,179 @@
+.zoom-motion(@className, @keyframeName, @duration: @animation-duration-base) {
+  @name: ~'@{ant-prefix}-@{className}';
+  .make-motion(@name, @keyframeName, @duration);
+  .@{name}-enter,
+  .@{name}-appear {
+    transform: scale(0); // need this by yiminghe
+    opacity: 0;
+    animation-timing-function: @ease-out-circ;
+
+    &-prepare {
+      transform: none;
+    }
+  }
+  .@{name}-leave {
+    animation-timing-function: @ease-in-out-circ;
+  }
+}
+
+// For Modal, Select choosen item
+.zoom-motion(zoom, antZoom);
+// For Popover, Popconfirm, Dropdown
+.zoom-motion(zoom-big, antZoomBig);
+// For Tooltip
+.zoom-motion(zoom-big-fast, antZoomBig, @animation-duration-fast);
+
+.zoom-motion(zoom-up, antZoomUp);
+.zoom-motion(zoom-down, antZoomDown);
+.zoom-motion(zoom-left, antZoomLeft);
+.zoom-motion(zoom-right, antZoomRight);
+
+@keyframes antZoomIn {
+  0% {
+    transform: scale(0.2);
+    opacity: 0;
+  }
+
+  100% {
+    transform: scale(1);
+    opacity: 1;
+  }
+}
+
+@keyframes antZoomOut {
+  0% {
+    transform: scale(1);
+  }
+
+  100% {
+    transform: scale(0.2);
+    opacity: 0;
+  }
+}
+
+@keyframes antZoomBigIn {
+  0% {
+    transform: scale(0.8);
+    opacity: 0;
+  }
+
+  100% {
+    transform: scale(1);
+    opacity: 1;
+  }
+}
+
+@keyframes antZoomBigOut {
+  0% {
+    transform: scale(1);
+  }
+
+  100% {
+    transform: scale(0.8);
+    opacity: 0;
+  }
+}
+
+@keyframes antZoomUpIn {
+  0% {
+    transform: scale(0.8);
+    transform-origin: 50% 0%;
+    opacity: 0;
+  }
+
+  100% {
+    transform: scale(1);
+    transform-origin: 50% 0%;
+  }
+}
+
+@keyframes antZoomUpOut {
+  0% {
+    transform: scale(1);
+    transform-origin: 50% 0%;
+  }
+
+  100% {
+    transform: scale(0.8);
+    transform-origin: 50% 0%;
+    opacity: 0;
+  }
+}
+
+@keyframes antZoomLeftIn {
+  0% {
+    transform: scale(0.8);
+    transform-origin: 0% 50%;
+    opacity: 0;
+  }
+
+  100% {
+    transform: scale(1);
+    transform-origin: 0% 50%;
+  }
+}
+
+@keyframes antZoomLeftOut {
+  0% {
+    transform: scale(1);
+    transform-origin: 0% 50%;
+  }
+
+  100% {
+    transform: scale(0.8);
+    transform-origin: 0% 50%;
+    opacity: 0;
+  }
+}
+
+@keyframes antZoomRightIn {
+  0% {
+    transform: scale(0.8);
+    transform-origin: 100% 50%;
+    opacity: 0;
+  }
+
+  100% {
+    transform: scale(1);
+    transform-origin: 100% 50%;
+  }
+}
+
+@keyframes antZoomRightOut {
+  0% {
+    transform: scale(1);
+    transform-origin: 100% 50%;
+  }
+
+  100% {
+    transform: scale(0.8);
+    transform-origin: 100% 50%;
+    opacity: 0;
+  }
+}
+
+@keyframes antZoomDownIn {
+  0% {
+    transform: scale(0.8);
+    transform-origin: 50% 100%;
+    opacity: 0;
+  }
+
+  100% {
+    transform: scale(1);
+    transform-origin: 50% 100%;
+  }
+}
+
+@keyframes antZoomDownOut {
+  0% {
+    transform: scale(1);
+    transform-origin: 50% 100%;
+  }
+
+  100% {
+    transform: scale(0.8);
+    transform-origin: 50% 100%;
+    opacity: 0;
+  }
+}
diff --git a/src/styles/css.js b/src/styles/css.js
new file mode 100644
index 0000000..b67dcb9
--- /dev/null
+++ b/src/styles/css.js
@@ -0,0 +1 @@
+import './index.css';
\ No newline at end of file
diff --git a/src/styles/dark.less b/src/styles/dark.less
new file mode 100644
index 0000000..12a3731
--- /dev/null
+++ b/src/styles/dark.less
@@ -0,0 +1,4 @@
+@root-entry-name: default;
+
+@import './themes/dark.less';
+@import './core/index';
diff --git a/src/styles/default.css b/src/styles/default.css
new file mode 100644
index 0000000..b363d91
--- /dev/null
+++ b/src/styles/default.css
@@ -0,0 +1,1248 @@
+/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */
+/* stylelint-disable no-duplicate-selectors */
+/* stylelint-disable */
+/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */
+[class^=ant-]::-ms-clear,
+[class*= ant-]::-ms-clear,
+[class^=ant-] input::-ms-clear,
+[class*= ant-] input::-ms-clear,
+[class^=ant-] input::-ms-reveal,
+[class*= ant-] input::-ms-reveal {
+  display: none;
+}
+/* stylelint-disable property-no-vendor-prefix, at-rule-no-vendor-prefix */
+html,
+body {
+  width: 100%;
+  height: 100%;
+}
+input::-ms-clear,
+input::-ms-reveal {
+  display: none;
+}
+*,
+*::before,
+*::after {
+  box-sizing: border-box;
+}
+html {
+  font-family: sans-serif;
+  line-height: 1.15;
+  -webkit-text-size-adjust: 100%;
+  -ms-text-size-adjust: 100%;
+  -ms-overflow-style: scrollbar;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+@-ms-viewport {
+  width: device-width;
+}
+body {
+  margin: 0;
+  color: rgba(0, 0, 0, 0.85);
+  font-size: 14px;
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
+  font-variant: tabular-nums;
+  line-height: 1.5715;
+  background-color: #fff;
+  font-feature-settings: 'tnum';
+}
+[tabindex='-1']:focus {
+  outline: none !important;
+}
+hr {
+  box-sizing: content-box;
+  height: 0;
+  overflow: visible;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin-top: 0;
+  margin-bottom: 0.5em;
+  color: rgba(0, 0, 0, 0.85);
+  font-weight: 500;
+}
+p {
+  margin-top: 0;
+  margin-bottom: 1em;
+}
+abbr[title],
+abbr[data-original-title] {
+  text-decoration: underline;
+  -webkit-text-decoration: underline dotted;
+          text-decoration: underline dotted;
+  border-bottom: 0;
+  cursor: help;
+}
+address {
+  margin-bottom: 1em;
+  font-style: normal;
+  line-height: inherit;
+}
+input[type='text'],
+input[type='password'],
+input[type='number'],
+textarea {
+  -webkit-appearance: none;
+}
+ol,
+ul,
+dl {
+  margin-top: 0;
+  margin-bottom: 1em;
+}
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+  margin-bottom: 0;
+}
+dt {
+  font-weight: 500;
+}
+dd {
+  margin-bottom: 0.5em;
+  margin-left: 0;
+}
+blockquote {
+  margin: 0 0 1em;
+}
+dfn {
+  font-style: italic;
+}
+b,
+strong {
+  font-weight: bolder;
+}
+small {
+  font-size: 80%;
+}
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+sub {
+  bottom: -0.25em;
+}
+sup {
+  top: -0.5em;
+}
+a {
+  color: #1890ff;
+  text-decoration: none;
+  background-color: transparent;
+  outline: none;
+  cursor: pointer;
+  transition: color 0.3s;
+  -webkit-text-decoration-skip: objects;
+}
+a:hover {
+  color: #40a9ff;
+}
+a:active {
+  color: #096dd9;
+}
+a:active,
+a:hover {
+  text-decoration: none;
+  outline: 0;
+}
+a:focus {
+  text-decoration: none;
+  outline: 0;
+}
+a[disabled] {
+  color: rgba(0, 0, 0, 0.25);
+  cursor: not-allowed;
+}
+pre,
+code,
+kbd,
+samp {
+  font-size: 1em;
+  font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
+}
+pre {
+  margin-top: 0;
+  margin-bottom: 1em;
+  overflow: auto;
+}
+figure {
+  margin: 0 0 1em;
+}
+img {
+  vertical-align: middle;
+  border-style: none;
+}
+a,
+area,
+button,
+[role='button'],
+input:not([type='range']),
+label,
+select,
+summary,
+textarea {
+  touch-action: manipulation;
+}
+table {
+  border-collapse: collapse;
+}
+caption {
+  padding-top: 0.75em;
+  padding-bottom: 0.3em;
+  color: rgba(0, 0, 0, 0.45);
+  text-align: left;
+  caption-side: bottom;
+}
+input,
+button,
+select,
+optgroup,
+textarea {
+  margin: 0;
+  color: inherit;
+  font-size: inherit;
+  font-family: inherit;
+  line-height: inherit;
+}
+button,
+input {
+  overflow: visible;
+}
+button,
+select {
+  text-transform: none;
+}
+button,
+html [type="button"],
+[type="reset"],
+[type="submit"] {
+  -webkit-appearance: button;
+}
+button::-moz-focus-inner,
+[type='button']::-moz-focus-inner,
+[type='reset']::-moz-focus-inner,
+[type='submit']::-moz-focus-inner {
+  padding: 0;
+  border-style: none;
+}
+input[type='radio'],
+input[type='checkbox'] {
+  box-sizing: border-box;
+  padding: 0;
+}
+input[type='date'],
+input[type='time'],
+input[type='datetime-local'],
+input[type='month'] {
+  -webkit-appearance: listbox;
+}
+textarea {
+  overflow: auto;
+  resize: vertical;
+}
+fieldset {
+  min-width: 0;
+  margin: 0;
+  padding: 0;
+  border: 0;
+}
+legend {
+  display: block;
+  width: 100%;
+  max-width: 100%;
+  margin-bottom: 0.5em;
+  padding: 0;
+  color: inherit;
+  font-size: 1.5em;
+  line-height: inherit;
+  white-space: normal;
+}
+progress {
+  vertical-align: baseline;
+}
+[type='number']::-webkit-inner-spin-button,
+[type='number']::-webkit-outer-spin-button {
+  height: auto;
+}
+[type='search'] {
+  outline-offset: -2px;
+  -webkit-appearance: none;
+}
+[type='search']::-webkit-search-cancel-button,
+[type='search']::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+::-webkit-file-upload-button {
+  font: inherit;
+  -webkit-appearance: button;
+}
+output {
+  display: inline-block;
+}
+summary {
+  display: list-item;
+}
+template {
+  display: none;
+}
+[hidden] {
+  display: none !important;
+}
+mark {
+  padding: 0.2em;
+  background-color: #feffe6;
+}
+::-moz-selection {
+  color: #fff;
+  background: #1890ff;
+}
+::selection {
+  color: #fff;
+  background: #1890ff;
+}
+.clearfix::before {
+  display: table;
+  content: '';
+}
+.clearfix::after {
+  display: table;
+  clear: both;
+  content: '';
+}
+.anticon {
+  display: inline-flex;
+  align-items: center;
+  color: inherit;
+  font-style: normal;
+  line-height: 0;
+  text-align: center;
+  text-transform: none;
+  vertical-align: -0.125em;
+  text-rendering: optimizelegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.anticon > * {
+  line-height: 1;
+}
+.anticon svg {
+  display: inline-block;
+}
+.anticon::before {
+  display: none;
+}
+.anticon .anticon-icon {
+  display: block;
+}
+.anticon > .anticon {
+  line-height: 0;
+  vertical-align: 0;
+}
+.anticon[tabindex] {
+  cursor: pointer;
+}
+.anticon-spin,
+.anticon-spin::before {
+  display: inline-block;
+  animation: loadingCircle 1s infinite linear;
+}
+.ant-fade-enter,
+.ant-fade-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-fade-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-fade-enter.ant-fade-enter-active,
+.ant-fade-appear.ant-fade-appear-active {
+  animation-name: antFadeIn;
+  animation-play-state: running;
+}
+.ant-fade-leave.ant-fade-leave-active {
+  animation-name: antFadeOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-fade-enter,
+.ant-fade-appear {
+  opacity: 0;
+  animation-timing-function: linear;
+}
+.ant-fade-leave {
+  animation-timing-function: linear;
+}
+@keyframes antFadeIn {
+  0% {
+    opacity: 0;
+  }
+  100% {
+    opacity: 1;
+  }
+}
+@keyframes antFadeOut {
+  0% {
+    opacity: 1;
+  }
+  100% {
+    opacity: 0;
+  }
+}
+.ant-move-up-enter,
+.ant-move-up-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-move-up-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-move-up-enter.ant-move-up-enter-active,
+.ant-move-up-appear.ant-move-up-appear-active {
+  animation-name: antMoveUpIn;
+  animation-play-state: running;
+}
+.ant-move-up-leave.ant-move-up-leave-active {
+  animation-name: antMoveUpOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-move-up-enter,
+.ant-move-up-appear {
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-move-up-leave {
+  animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+.ant-move-down-enter,
+.ant-move-down-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-move-down-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-move-down-enter.ant-move-down-enter-active,
+.ant-move-down-appear.ant-move-down-appear-active {
+  animation-name: antMoveDownIn;
+  animation-play-state: running;
+}
+.ant-move-down-leave.ant-move-down-leave-active {
+  animation-name: antMoveDownOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-move-down-enter,
+.ant-move-down-appear {
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-move-down-leave {
+  animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+.ant-move-left-enter,
+.ant-move-left-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-move-left-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-move-left-enter.ant-move-left-enter-active,
+.ant-move-left-appear.ant-move-left-appear-active {
+  animation-name: antMoveLeftIn;
+  animation-play-state: running;
+}
+.ant-move-left-leave.ant-move-left-leave-active {
+  animation-name: antMoveLeftOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-move-left-enter,
+.ant-move-left-appear {
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-move-left-leave {
+  animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+.ant-move-right-enter,
+.ant-move-right-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-move-right-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-move-right-enter.ant-move-right-enter-active,
+.ant-move-right-appear.ant-move-right-appear-active {
+  animation-name: antMoveRightIn;
+  animation-play-state: running;
+}
+.ant-move-right-leave.ant-move-right-leave-active {
+  animation-name: antMoveRightOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-move-right-enter,
+.ant-move-right-appear {
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-move-right-leave {
+  animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+@keyframes antMoveDownIn {
+  0% {
+    transform: translateY(100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+  100% {
+    transform: translateY(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+}
+@keyframes antMoveDownOut {
+  0% {
+    transform: translateY(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+  100% {
+    transform: translateY(100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+}
+@keyframes antMoveLeftIn {
+  0% {
+    transform: translateX(-100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+  100% {
+    transform: translateX(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+}
+@keyframes antMoveLeftOut {
+  0% {
+    transform: translateX(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+  100% {
+    transform: translateX(-100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+}
+@keyframes antMoveRightIn {
+  0% {
+    transform: translateX(100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+  100% {
+    transform: translateX(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+}
+@keyframes antMoveRightOut {
+  0% {
+    transform: translateX(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+  100% {
+    transform: translateX(100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+}
+@keyframes antMoveUpIn {
+  0% {
+    transform: translateY(-100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+  100% {
+    transform: translateY(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+}
+@keyframes antMoveUpOut {
+  0% {
+    transform: translateY(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+  100% {
+    transform: translateY(-100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+}
+@keyframes loadingCircle {
+  100% {
+    transform: rotate(360deg);
+  }
+}
+[ant-click-animating='true'],
+[ant-click-animating-without-extra-node='true'] {
+  position: relative;
+}
+html {
+  --antd-wave-shadow-color: #1890ff;
+  --scroll-bar: 0;
+}
+[ant-click-animating-without-extra-node='true']::after,
+.ant-click-animating-node {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  display: block;
+  border-radius: inherit;
+  box-shadow: 0 0 0 0 #1890ff;
+  box-shadow: 0 0 0 0 var(--antd-wave-shadow-color);
+  opacity: 0.2;
+  animation: fadeEffect 2s cubic-bezier(0.08, 0.82, 0.17, 1), waveEffect 0.4s cubic-bezier(0.08, 0.82, 0.17, 1);
+  animation-fill-mode: forwards;
+  content: '';
+  pointer-events: none;
+}
+@keyframes waveEffect {
+  100% {
+    box-shadow: 0 0 0 #1890ff;
+    box-shadow: 0 0 0 6px var(--antd-wave-shadow-color);
+  }
+}
+@keyframes fadeEffect {
+  100% {
+    opacity: 0;
+  }
+}
+.ant-slide-up-enter,
+.ant-slide-up-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-slide-up-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-slide-up-enter.ant-slide-up-enter-active,
+.ant-slide-up-appear.ant-slide-up-appear-active {
+  animation-name: antSlideUpIn;
+  animation-play-state: running;
+}
+.ant-slide-up-leave.ant-slide-up-leave-active {
+  animation-name: antSlideUpOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-slide-up-enter,
+.ant-slide-up-appear {
+  transform: scale(0);
+  transform-origin: 0% 0%;
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.ant-slide-up-leave {
+  animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+.ant-slide-down-enter,
+.ant-slide-down-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-slide-down-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-slide-down-enter.ant-slide-down-enter-active,
+.ant-slide-down-appear.ant-slide-down-appear-active {
+  animation-name: antSlideDownIn;
+  animation-play-state: running;
+}
+.ant-slide-down-leave.ant-slide-down-leave-active {
+  animation-name: antSlideDownOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-slide-down-enter,
+.ant-slide-down-appear {
+  transform: scale(0);
+  transform-origin: 0% 0%;
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.ant-slide-down-leave {
+  animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+.ant-slide-left-enter,
+.ant-slide-left-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-slide-left-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-slide-left-enter.ant-slide-left-enter-active,
+.ant-slide-left-appear.ant-slide-left-appear-active {
+  animation-name: antSlideLeftIn;
+  animation-play-state: running;
+}
+.ant-slide-left-leave.ant-slide-left-leave-active {
+  animation-name: antSlideLeftOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-slide-left-enter,
+.ant-slide-left-appear {
+  transform: scale(0);
+  transform-origin: 0% 0%;
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.ant-slide-left-leave {
+  animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+.ant-slide-right-enter,
+.ant-slide-right-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-slide-right-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-slide-right-enter.ant-slide-right-enter-active,
+.ant-slide-right-appear.ant-slide-right-appear-active {
+  animation-name: antSlideRightIn;
+  animation-play-state: running;
+}
+.ant-slide-right-leave.ant-slide-right-leave-active {
+  animation-name: antSlideRightOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-slide-right-enter,
+.ant-slide-right-appear {
+  transform: scale(0);
+  transform-origin: 0% 0%;
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.ant-slide-right-leave {
+  animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+@keyframes antSlideUpIn {
+  0% {
+    transform: scaleY(0.8);
+    transform-origin: 0% 0%;
+    opacity: 0;
+  }
+  100% {
+    transform: scaleY(1);
+    transform-origin: 0% 0%;
+    opacity: 1;
+  }
+}
+@keyframes antSlideUpOut {
+  0% {
+    transform: scaleY(1);
+    transform-origin: 0% 0%;
+    opacity: 1;
+  }
+  100% {
+    transform: scaleY(0.8);
+    transform-origin: 0% 0%;
+    opacity: 0;
+  }
+}
+@keyframes antSlideDownIn {
+  0% {
+    transform: scaleY(0.8);
+    transform-origin: 100% 100%;
+    opacity: 0;
+  }
+  100% {
+    transform: scaleY(1);
+    transform-origin: 100% 100%;
+    opacity: 1;
+  }
+}
+@keyframes antSlideDownOut {
+  0% {
+    transform: scaleY(1);
+    transform-origin: 100% 100%;
+    opacity: 1;
+  }
+  100% {
+    transform: scaleY(0.8);
+    transform-origin: 100% 100%;
+    opacity: 0;
+  }
+}
+@keyframes antSlideLeftIn {
+  0% {
+    transform: scaleX(0.8);
+    transform-origin: 0% 0%;
+    opacity: 0;
+  }
+  100% {
+    transform: scaleX(1);
+    transform-origin: 0% 0%;
+    opacity: 1;
+  }
+}
+@keyframes antSlideLeftOut {
+  0% {
+    transform: scaleX(1);
+    transform-origin: 0% 0%;
+    opacity: 1;
+  }
+  100% {
+    transform: scaleX(0.8);
+    transform-origin: 0% 0%;
+    opacity: 0;
+  }
+}
+@keyframes antSlideRightIn {
+  0% {
+    transform: scaleX(0.8);
+    transform-origin: 100% 0%;
+    opacity: 0;
+  }
+  100% {
+    transform: scaleX(1);
+    transform-origin: 100% 0%;
+    opacity: 1;
+  }
+}
+@keyframes antSlideRightOut {
+  0% {
+    transform: scaleX(1);
+    transform-origin: 100% 0%;
+    opacity: 1;
+  }
+  100% {
+    transform: scaleX(0.8);
+    transform-origin: 100% 0%;
+    opacity: 0;
+  }
+}
+.ant-zoom-enter,
+.ant-zoom-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-enter.ant-zoom-enter-active,
+.ant-zoom-appear.ant-zoom-appear-active {
+  animation-name: antZoomIn;
+  animation-play-state: running;
+}
+.ant-zoom-leave.ant-zoom-leave-active {
+  animation-name: antZoomOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-zoom-enter,
+.ant-zoom-appear {
+  transform: scale(0);
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-enter-prepare,
+.ant-zoom-appear-prepare {
+  transform: none;
+}
+.ant-zoom-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-big-enter,
+.ant-zoom-big-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-big-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-big-enter.ant-zoom-big-enter-active,
+.ant-zoom-big-appear.ant-zoom-big-appear-active {
+  animation-name: antZoomBigIn;
+  animation-play-state: running;
+}
+.ant-zoom-big-leave.ant-zoom-big-leave-active {
+  animation-name: antZoomBigOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-zoom-big-enter,
+.ant-zoom-big-appear {
+  transform: scale(0);
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-big-enter-prepare,
+.ant-zoom-big-appear-prepare {
+  transform: none;
+}
+.ant-zoom-big-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-big-fast-enter,
+.ant-zoom-big-fast-appear {
+  animation-duration: 0.1s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-big-fast-leave {
+  animation-duration: 0.1s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-big-fast-enter.ant-zoom-big-fast-enter-active,
+.ant-zoom-big-fast-appear.ant-zoom-big-fast-appear-active {
+  animation-name: antZoomBigIn;
+  animation-play-state: running;
+}
+.ant-zoom-big-fast-leave.ant-zoom-big-fast-leave-active {
+  animation-name: antZoomBigOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-zoom-big-fast-enter,
+.ant-zoom-big-fast-appear {
+  transform: scale(0);
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-big-fast-enter-prepare,
+.ant-zoom-big-fast-appear-prepare {
+  transform: none;
+}
+.ant-zoom-big-fast-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-up-enter,
+.ant-zoom-up-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-up-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-up-enter.ant-zoom-up-enter-active,
+.ant-zoom-up-appear.ant-zoom-up-appear-active {
+  animation-name: antZoomUpIn;
+  animation-play-state: running;
+}
+.ant-zoom-up-leave.ant-zoom-up-leave-active {
+  animation-name: antZoomUpOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-zoom-up-enter,
+.ant-zoom-up-appear {
+  transform: scale(0);
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-up-enter-prepare,
+.ant-zoom-up-appear-prepare {
+  transform: none;
+}
+.ant-zoom-up-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-down-enter,
+.ant-zoom-down-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-down-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-down-enter.ant-zoom-down-enter-active,
+.ant-zoom-down-appear.ant-zoom-down-appear-active {
+  animation-name: antZoomDownIn;
+  animation-play-state: running;
+}
+.ant-zoom-down-leave.ant-zoom-down-leave-active {
+  animation-name: antZoomDownOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-zoom-down-enter,
+.ant-zoom-down-appear {
+  transform: scale(0);
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-down-enter-prepare,
+.ant-zoom-down-appear-prepare {
+  transform: none;
+}
+.ant-zoom-down-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-left-enter,
+.ant-zoom-left-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-left-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-left-enter.ant-zoom-left-enter-active,
+.ant-zoom-left-appear.ant-zoom-left-appear-active {
+  animation-name: antZoomLeftIn;
+  animation-play-state: running;
+}
+.ant-zoom-left-leave.ant-zoom-left-leave-active {
+  animation-name: antZoomLeftOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-zoom-left-enter,
+.ant-zoom-left-appear {
+  transform: scale(0);
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-left-enter-prepare,
+.ant-zoom-left-appear-prepare {
+  transform: none;
+}
+.ant-zoom-left-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-right-enter,
+.ant-zoom-right-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-right-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-right-enter.ant-zoom-right-enter-active,
+.ant-zoom-right-appear.ant-zoom-right-appear-active {
+  animation-name: antZoomRightIn;
+  animation-play-state: running;
+}
+.ant-zoom-right-leave.ant-zoom-right-leave-active {
+  animation-name: antZoomRightOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-zoom-right-enter,
+.ant-zoom-right-appear {
+  transform: scale(0);
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-right-enter-prepare,
+.ant-zoom-right-appear-prepare {
+  transform: none;
+}
+.ant-zoom-right-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+@keyframes antZoomIn {
+  0% {
+    transform: scale(0.2);
+    opacity: 0;
+  }
+  100% {
+    transform: scale(1);
+    opacity: 1;
+  }
+}
+@keyframes antZoomOut {
+  0% {
+    transform: scale(1);
+  }
+  100% {
+    transform: scale(0.2);
+    opacity: 0;
+  }
+}
+@keyframes antZoomBigIn {
+  0% {
+    transform: scale(0.8);
+    opacity: 0;
+  }
+  100% {
+    transform: scale(1);
+    opacity: 1;
+  }
+}
+@keyframes antZoomBigOut {
+  0% {
+    transform: scale(1);
+  }
+  100% {
+    transform: scale(0.8);
+    opacity: 0;
+  }
+}
+@keyframes antZoomUpIn {
+  0% {
+    transform: scale(0.8);
+    transform-origin: 50% 0%;
+    opacity: 0;
+  }
+  100% {
+    transform: scale(1);
+    transform-origin: 50% 0%;
+  }
+}
+@keyframes antZoomUpOut {
+  0% {
+    transform: scale(1);
+    transform-origin: 50% 0%;
+  }
+  100% {
+    transform: scale(0.8);
+    transform-origin: 50% 0%;
+    opacity: 0;
+  }
+}
+@keyframes antZoomLeftIn {
+  0% {
+    transform: scale(0.8);
+    transform-origin: 0% 50%;
+    opacity: 0;
+  }
+  100% {
+    transform: scale(1);
+    transform-origin: 0% 50%;
+  }
+}
+@keyframes antZoomLeftOut {
+  0% {
+    transform: scale(1);
+    transform-origin: 0% 50%;
+  }
+  100% {
+    transform: scale(0.8);
+    transform-origin: 0% 50%;
+    opacity: 0;
+  }
+}
+@keyframes antZoomRightIn {
+  0% {
+    transform: scale(0.8);
+    transform-origin: 100% 50%;
+    opacity: 0;
+  }
+  100% {
+    transform: scale(1);
+    transform-origin: 100% 50%;
+  }
+}
+@keyframes antZoomRightOut {
+  0% {
+    transform: scale(1);
+    transform-origin: 100% 50%;
+  }
+  100% {
+    transform: scale(0.8);
+    transform-origin: 100% 50%;
+    opacity: 0;
+  }
+}
+@keyframes antZoomDownIn {
+  0% {
+    transform: scale(0.8);
+    transform-origin: 50% 100%;
+    opacity: 0;
+  }
+  100% {
+    transform: scale(1);
+    transform-origin: 50% 100%;
+  }
+}
+@keyframes antZoomDownOut {
+  0% {
+    transform: scale(1);
+    transform-origin: 50% 100%;
+  }
+  100% {
+    transform: scale(0.8);
+    transform-origin: 50% 100%;
+    opacity: 0;
+  }
+}
+.ant-motion-collapse-legacy {
+  overflow: hidden;
+}
+.ant-motion-collapse-legacy-active {
+  transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
+}
+.ant-motion-collapse {
+  overflow: hidden;
+  transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
+}
diff --git a/src/styles/default.less b/src/styles/default.less
new file mode 100644
index 0000000..ecec084
--- /dev/null
+++ b/src/styles/default.less
@@ -0,0 +1,4 @@
+// This is same as `index.less` but given `root-entry-name` for `dist/antd.less` usage
+@root-entry-name: default;
+
+@import './index';
diff --git a/src/styles/index-pure.less b/src/styles/index-pure.less
new file mode 100644
index 0000000..04efa3b
--- /dev/null
+++ b/src/styles/index-pure.less
@@ -0,0 +1,2 @@
+@import './themes/index';
+@import './core/index';
diff --git a/src/styles/index.css b/src/styles/index.css
new file mode 100644
index 0000000..b363d91
--- /dev/null
+++ b/src/styles/index.css
@@ -0,0 +1,1248 @@
+/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */
+/* stylelint-disable no-duplicate-selectors */
+/* stylelint-disable */
+/* stylelint-disable declaration-bang-space-before,no-duplicate-selectors,string-no-newline */
+[class^=ant-]::-ms-clear,
+[class*= ant-]::-ms-clear,
+[class^=ant-] input::-ms-clear,
+[class*= ant-] input::-ms-clear,
+[class^=ant-] input::-ms-reveal,
+[class*= ant-] input::-ms-reveal {
+  display: none;
+}
+/* stylelint-disable property-no-vendor-prefix, at-rule-no-vendor-prefix */
+html,
+body {
+  width: 100%;
+  height: 100%;
+}
+input::-ms-clear,
+input::-ms-reveal {
+  display: none;
+}
+*,
+*::before,
+*::after {
+  box-sizing: border-box;
+}
+html {
+  font-family: sans-serif;
+  line-height: 1.15;
+  -webkit-text-size-adjust: 100%;
+  -ms-text-size-adjust: 100%;
+  -ms-overflow-style: scrollbar;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+@-ms-viewport {
+  width: device-width;
+}
+body {
+  margin: 0;
+  color: rgba(0, 0, 0, 0.85);
+  font-size: 14px;
+  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', 'Noto Color Emoji';
+  font-variant: tabular-nums;
+  line-height: 1.5715;
+  background-color: #fff;
+  font-feature-settings: 'tnum';
+}
+[tabindex='-1']:focus {
+  outline: none !important;
+}
+hr {
+  box-sizing: content-box;
+  height: 0;
+  overflow: visible;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin-top: 0;
+  margin-bottom: 0.5em;
+  color: rgba(0, 0, 0, 0.85);
+  font-weight: 500;
+}
+p {
+  margin-top: 0;
+  margin-bottom: 1em;
+}
+abbr[title],
+abbr[data-original-title] {
+  text-decoration: underline;
+  -webkit-text-decoration: underline dotted;
+          text-decoration: underline dotted;
+  border-bottom: 0;
+  cursor: help;
+}
+address {
+  margin-bottom: 1em;
+  font-style: normal;
+  line-height: inherit;
+}
+input[type='text'],
+input[type='password'],
+input[type='number'],
+textarea {
+  -webkit-appearance: none;
+}
+ol,
+ul,
+dl {
+  margin-top: 0;
+  margin-bottom: 1em;
+}
+ol ol,
+ul ul,
+ol ul,
+ul ol {
+  margin-bottom: 0;
+}
+dt {
+  font-weight: 500;
+}
+dd {
+  margin-bottom: 0.5em;
+  margin-left: 0;
+}
+blockquote {
+  margin: 0 0 1em;
+}
+dfn {
+  font-style: italic;
+}
+b,
+strong {
+  font-weight: bolder;
+}
+small {
+  font-size: 80%;
+}
+sub,
+sup {
+  position: relative;
+  font-size: 75%;
+  line-height: 0;
+  vertical-align: baseline;
+}
+sub {
+  bottom: -0.25em;
+}
+sup {
+  top: -0.5em;
+}
+a {
+  color: #1890ff;
+  text-decoration: none;
+  background-color: transparent;
+  outline: none;
+  cursor: pointer;
+  transition: color 0.3s;
+  -webkit-text-decoration-skip: objects;
+}
+a:hover {
+  color: #40a9ff;
+}
+a:active {
+  color: #096dd9;
+}
+a:active,
+a:hover {
+  text-decoration: none;
+  outline: 0;
+}
+a:focus {
+  text-decoration: none;
+  outline: 0;
+}
+a[disabled] {
+  color: rgba(0, 0, 0, 0.25);
+  cursor: not-allowed;
+}
+pre,
+code,
+kbd,
+samp {
+  font-size: 1em;
+  font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
+}
+pre {
+  margin-top: 0;
+  margin-bottom: 1em;
+  overflow: auto;
+}
+figure {
+  margin: 0 0 1em;
+}
+img {
+  vertical-align: middle;
+  border-style: none;
+}
+a,
+area,
+button,
+[role='button'],
+input:not([type='range']),
+label,
+select,
+summary,
+textarea {
+  touch-action: manipulation;
+}
+table {
+  border-collapse: collapse;
+}
+caption {
+  padding-top: 0.75em;
+  padding-bottom: 0.3em;
+  color: rgba(0, 0, 0, 0.45);
+  text-align: left;
+  caption-side: bottom;
+}
+input,
+button,
+select,
+optgroup,
+textarea {
+  margin: 0;
+  color: inherit;
+  font-size: inherit;
+  font-family: inherit;
+  line-height: inherit;
+}
+button,
+input {
+  overflow: visible;
+}
+button,
+select {
+  text-transform: none;
+}
+button,
+html [type="button"],
+[type="reset"],
+[type="submit"] {
+  -webkit-appearance: button;
+}
+button::-moz-focus-inner,
+[type='button']::-moz-focus-inner,
+[type='reset']::-moz-focus-inner,
+[type='submit']::-moz-focus-inner {
+  padding: 0;
+  border-style: none;
+}
+input[type='radio'],
+input[type='checkbox'] {
+  box-sizing: border-box;
+  padding: 0;
+}
+input[type='date'],
+input[type='time'],
+input[type='datetime-local'],
+input[type='month'] {
+  -webkit-appearance: listbox;
+}
+textarea {
+  overflow: auto;
+  resize: vertical;
+}
+fieldset {
+  min-width: 0;
+  margin: 0;
+  padding: 0;
+  border: 0;
+}
+legend {
+  display: block;
+  width: 100%;
+  max-width: 100%;
+  margin-bottom: 0.5em;
+  padding: 0;
+  color: inherit;
+  font-size: 1.5em;
+  line-height: inherit;
+  white-space: normal;
+}
+progress {
+  vertical-align: baseline;
+}
+[type='number']::-webkit-inner-spin-button,
+[type='number']::-webkit-outer-spin-button {
+  height: auto;
+}
+[type='search'] {
+  outline-offset: -2px;
+  -webkit-appearance: none;
+}
+[type='search']::-webkit-search-cancel-button,
+[type='search']::-webkit-search-decoration {
+  -webkit-appearance: none;
+}
+::-webkit-file-upload-button {
+  font: inherit;
+  -webkit-appearance: button;
+}
+output {
+  display: inline-block;
+}
+summary {
+  display: list-item;
+}
+template {
+  display: none;
+}
+[hidden] {
+  display: none !important;
+}
+mark {
+  padding: 0.2em;
+  background-color: #feffe6;
+}
+::-moz-selection {
+  color: #fff;
+  background: #1890ff;
+}
+::selection {
+  color: #fff;
+  background: #1890ff;
+}
+.clearfix::before {
+  display: table;
+  content: '';
+}
+.clearfix::after {
+  display: table;
+  clear: both;
+  content: '';
+}
+.anticon {
+  display: inline-flex;
+  align-items: center;
+  color: inherit;
+  font-style: normal;
+  line-height: 0;
+  text-align: center;
+  text-transform: none;
+  vertical-align: -0.125em;
+  text-rendering: optimizelegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+}
+.anticon > * {
+  line-height: 1;
+}
+.anticon svg {
+  display: inline-block;
+}
+.anticon::before {
+  display: none;
+}
+.anticon .anticon-icon {
+  display: block;
+}
+.anticon > .anticon {
+  line-height: 0;
+  vertical-align: 0;
+}
+.anticon[tabindex] {
+  cursor: pointer;
+}
+.anticon-spin,
+.anticon-spin::before {
+  display: inline-block;
+  animation: loadingCircle 1s infinite linear;
+}
+.ant-fade-enter,
+.ant-fade-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-fade-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-fade-enter.ant-fade-enter-active,
+.ant-fade-appear.ant-fade-appear-active {
+  animation-name: antFadeIn;
+  animation-play-state: running;
+}
+.ant-fade-leave.ant-fade-leave-active {
+  animation-name: antFadeOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-fade-enter,
+.ant-fade-appear {
+  opacity: 0;
+  animation-timing-function: linear;
+}
+.ant-fade-leave {
+  animation-timing-function: linear;
+}
+@keyframes antFadeIn {
+  0% {
+    opacity: 0;
+  }
+  100% {
+    opacity: 1;
+  }
+}
+@keyframes antFadeOut {
+  0% {
+    opacity: 1;
+  }
+  100% {
+    opacity: 0;
+  }
+}
+.ant-move-up-enter,
+.ant-move-up-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-move-up-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-move-up-enter.ant-move-up-enter-active,
+.ant-move-up-appear.ant-move-up-appear-active {
+  animation-name: antMoveUpIn;
+  animation-play-state: running;
+}
+.ant-move-up-leave.ant-move-up-leave-active {
+  animation-name: antMoveUpOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-move-up-enter,
+.ant-move-up-appear {
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-move-up-leave {
+  animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+.ant-move-down-enter,
+.ant-move-down-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-move-down-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-move-down-enter.ant-move-down-enter-active,
+.ant-move-down-appear.ant-move-down-appear-active {
+  animation-name: antMoveDownIn;
+  animation-play-state: running;
+}
+.ant-move-down-leave.ant-move-down-leave-active {
+  animation-name: antMoveDownOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-move-down-enter,
+.ant-move-down-appear {
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-move-down-leave {
+  animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+.ant-move-left-enter,
+.ant-move-left-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-move-left-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-move-left-enter.ant-move-left-enter-active,
+.ant-move-left-appear.ant-move-left-appear-active {
+  animation-name: antMoveLeftIn;
+  animation-play-state: running;
+}
+.ant-move-left-leave.ant-move-left-leave-active {
+  animation-name: antMoveLeftOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-move-left-enter,
+.ant-move-left-appear {
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-move-left-leave {
+  animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+.ant-move-right-enter,
+.ant-move-right-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-move-right-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-move-right-enter.ant-move-right-enter-active,
+.ant-move-right-appear.ant-move-right-appear-active {
+  animation-name: antMoveRightIn;
+  animation-play-state: running;
+}
+.ant-move-right-leave.ant-move-right-leave-active {
+  animation-name: antMoveRightOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-move-right-enter,
+.ant-move-right-appear {
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-move-right-leave {
+  animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+}
+@keyframes antMoveDownIn {
+  0% {
+    transform: translateY(100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+  100% {
+    transform: translateY(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+}
+@keyframes antMoveDownOut {
+  0% {
+    transform: translateY(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+  100% {
+    transform: translateY(100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+}
+@keyframes antMoveLeftIn {
+  0% {
+    transform: translateX(-100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+  100% {
+    transform: translateX(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+}
+@keyframes antMoveLeftOut {
+  0% {
+    transform: translateX(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+  100% {
+    transform: translateX(-100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+}
+@keyframes antMoveRightIn {
+  0% {
+    transform: translateX(100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+  100% {
+    transform: translateX(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+}
+@keyframes antMoveRightOut {
+  0% {
+    transform: translateX(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+  100% {
+    transform: translateX(100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+}
+@keyframes antMoveUpIn {
+  0% {
+    transform: translateY(-100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+  100% {
+    transform: translateY(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+}
+@keyframes antMoveUpOut {
+  0% {
+    transform: translateY(0%);
+    transform-origin: 0 0;
+    opacity: 1;
+  }
+  100% {
+    transform: translateY(-100%);
+    transform-origin: 0 0;
+    opacity: 0;
+  }
+}
+@keyframes loadingCircle {
+  100% {
+    transform: rotate(360deg);
+  }
+}
+[ant-click-animating='true'],
+[ant-click-animating-without-extra-node='true'] {
+  position: relative;
+}
+html {
+  --antd-wave-shadow-color: #1890ff;
+  --scroll-bar: 0;
+}
+[ant-click-animating-without-extra-node='true']::after,
+.ant-click-animating-node {
+  position: absolute;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+  display: block;
+  border-radius: inherit;
+  box-shadow: 0 0 0 0 #1890ff;
+  box-shadow: 0 0 0 0 var(--antd-wave-shadow-color);
+  opacity: 0.2;
+  animation: fadeEffect 2s cubic-bezier(0.08, 0.82, 0.17, 1), waveEffect 0.4s cubic-bezier(0.08, 0.82, 0.17, 1);
+  animation-fill-mode: forwards;
+  content: '';
+  pointer-events: none;
+}
+@keyframes waveEffect {
+  100% {
+    box-shadow: 0 0 0 #1890ff;
+    box-shadow: 0 0 0 6px var(--antd-wave-shadow-color);
+  }
+}
+@keyframes fadeEffect {
+  100% {
+    opacity: 0;
+  }
+}
+.ant-slide-up-enter,
+.ant-slide-up-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-slide-up-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-slide-up-enter.ant-slide-up-enter-active,
+.ant-slide-up-appear.ant-slide-up-appear-active {
+  animation-name: antSlideUpIn;
+  animation-play-state: running;
+}
+.ant-slide-up-leave.ant-slide-up-leave-active {
+  animation-name: antSlideUpOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-slide-up-enter,
+.ant-slide-up-appear {
+  transform: scale(0);
+  transform-origin: 0% 0%;
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.ant-slide-up-leave {
+  animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+.ant-slide-down-enter,
+.ant-slide-down-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-slide-down-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-slide-down-enter.ant-slide-down-enter-active,
+.ant-slide-down-appear.ant-slide-down-appear-active {
+  animation-name: antSlideDownIn;
+  animation-play-state: running;
+}
+.ant-slide-down-leave.ant-slide-down-leave-active {
+  animation-name: antSlideDownOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-slide-down-enter,
+.ant-slide-down-appear {
+  transform: scale(0);
+  transform-origin: 0% 0%;
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.ant-slide-down-leave {
+  animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+.ant-slide-left-enter,
+.ant-slide-left-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-slide-left-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-slide-left-enter.ant-slide-left-enter-active,
+.ant-slide-left-appear.ant-slide-left-appear-active {
+  animation-name: antSlideLeftIn;
+  animation-play-state: running;
+}
+.ant-slide-left-leave.ant-slide-left-leave-active {
+  animation-name: antSlideLeftOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-slide-left-enter,
+.ant-slide-left-appear {
+  transform: scale(0);
+  transform-origin: 0% 0%;
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.ant-slide-left-leave {
+  animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+.ant-slide-right-enter,
+.ant-slide-right-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-slide-right-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-slide-right-enter.ant-slide-right-enter-active,
+.ant-slide-right-appear.ant-slide-right-appear-active {
+  animation-name: antSlideRightIn;
+  animation-play-state: running;
+}
+.ant-slide-right-leave.ant-slide-right-leave-active {
+  animation-name: antSlideRightOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-slide-right-enter,
+.ant-slide-right-appear {
+  transform: scale(0);
+  transform-origin: 0% 0%;
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.23, 1, 0.32, 1);
+}
+.ant-slide-right-leave {
+  animation-timing-function: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+}
+@keyframes antSlideUpIn {
+  0% {
+    transform: scaleY(0.8);
+    transform-origin: 0% 0%;
+    opacity: 0;
+  }
+  100% {
+    transform: scaleY(1);
+    transform-origin: 0% 0%;
+    opacity: 1;
+  }
+}
+@keyframes antSlideUpOut {
+  0% {
+    transform: scaleY(1);
+    transform-origin: 0% 0%;
+    opacity: 1;
+  }
+  100% {
+    transform: scaleY(0.8);
+    transform-origin: 0% 0%;
+    opacity: 0;
+  }
+}
+@keyframes antSlideDownIn {
+  0% {
+    transform: scaleY(0.8);
+    transform-origin: 100% 100%;
+    opacity: 0;
+  }
+  100% {
+    transform: scaleY(1);
+    transform-origin: 100% 100%;
+    opacity: 1;
+  }
+}
+@keyframes antSlideDownOut {
+  0% {
+    transform: scaleY(1);
+    transform-origin: 100% 100%;
+    opacity: 1;
+  }
+  100% {
+    transform: scaleY(0.8);
+    transform-origin: 100% 100%;
+    opacity: 0;
+  }
+}
+@keyframes antSlideLeftIn {
+  0% {
+    transform: scaleX(0.8);
+    transform-origin: 0% 0%;
+    opacity: 0;
+  }
+  100% {
+    transform: scaleX(1);
+    transform-origin: 0% 0%;
+    opacity: 1;
+  }
+}
+@keyframes antSlideLeftOut {
+  0% {
+    transform: scaleX(1);
+    transform-origin: 0% 0%;
+    opacity: 1;
+  }
+  100% {
+    transform: scaleX(0.8);
+    transform-origin: 0% 0%;
+    opacity: 0;
+  }
+}
+@keyframes antSlideRightIn {
+  0% {
+    transform: scaleX(0.8);
+    transform-origin: 100% 0%;
+    opacity: 0;
+  }
+  100% {
+    transform: scaleX(1);
+    transform-origin: 100% 0%;
+    opacity: 1;
+  }
+}
+@keyframes antSlideRightOut {
+  0% {
+    transform: scaleX(1);
+    transform-origin: 100% 0%;
+    opacity: 1;
+  }
+  100% {
+    transform: scaleX(0.8);
+    transform-origin: 100% 0%;
+    opacity: 0;
+  }
+}
+.ant-zoom-enter,
+.ant-zoom-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-enter.ant-zoom-enter-active,
+.ant-zoom-appear.ant-zoom-appear-active {
+  animation-name: antZoomIn;
+  animation-play-state: running;
+}
+.ant-zoom-leave.ant-zoom-leave-active {
+  animation-name: antZoomOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-zoom-enter,
+.ant-zoom-appear {
+  transform: scale(0);
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-enter-prepare,
+.ant-zoom-appear-prepare {
+  transform: none;
+}
+.ant-zoom-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-big-enter,
+.ant-zoom-big-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-big-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-big-enter.ant-zoom-big-enter-active,
+.ant-zoom-big-appear.ant-zoom-big-appear-active {
+  animation-name: antZoomBigIn;
+  animation-play-state: running;
+}
+.ant-zoom-big-leave.ant-zoom-big-leave-active {
+  animation-name: antZoomBigOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-zoom-big-enter,
+.ant-zoom-big-appear {
+  transform: scale(0);
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-big-enter-prepare,
+.ant-zoom-big-appear-prepare {
+  transform: none;
+}
+.ant-zoom-big-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-big-fast-enter,
+.ant-zoom-big-fast-appear {
+  animation-duration: 0.1s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-big-fast-leave {
+  animation-duration: 0.1s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-big-fast-enter.ant-zoom-big-fast-enter-active,
+.ant-zoom-big-fast-appear.ant-zoom-big-fast-appear-active {
+  animation-name: antZoomBigIn;
+  animation-play-state: running;
+}
+.ant-zoom-big-fast-leave.ant-zoom-big-fast-leave-active {
+  animation-name: antZoomBigOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-zoom-big-fast-enter,
+.ant-zoom-big-fast-appear {
+  transform: scale(0);
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-big-fast-enter-prepare,
+.ant-zoom-big-fast-appear-prepare {
+  transform: none;
+}
+.ant-zoom-big-fast-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-up-enter,
+.ant-zoom-up-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-up-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-up-enter.ant-zoom-up-enter-active,
+.ant-zoom-up-appear.ant-zoom-up-appear-active {
+  animation-name: antZoomUpIn;
+  animation-play-state: running;
+}
+.ant-zoom-up-leave.ant-zoom-up-leave-active {
+  animation-name: antZoomUpOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-zoom-up-enter,
+.ant-zoom-up-appear {
+  transform: scale(0);
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-up-enter-prepare,
+.ant-zoom-up-appear-prepare {
+  transform: none;
+}
+.ant-zoom-up-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-down-enter,
+.ant-zoom-down-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-down-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-down-enter.ant-zoom-down-enter-active,
+.ant-zoom-down-appear.ant-zoom-down-appear-active {
+  animation-name: antZoomDownIn;
+  animation-play-state: running;
+}
+.ant-zoom-down-leave.ant-zoom-down-leave-active {
+  animation-name: antZoomDownOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-zoom-down-enter,
+.ant-zoom-down-appear {
+  transform: scale(0);
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-down-enter-prepare,
+.ant-zoom-down-appear-prepare {
+  transform: none;
+}
+.ant-zoom-down-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-left-enter,
+.ant-zoom-left-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-left-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-left-enter.ant-zoom-left-enter-active,
+.ant-zoom-left-appear.ant-zoom-left-appear-active {
+  animation-name: antZoomLeftIn;
+  animation-play-state: running;
+}
+.ant-zoom-left-leave.ant-zoom-left-leave-active {
+  animation-name: antZoomLeftOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-zoom-left-enter,
+.ant-zoom-left-appear {
+  transform: scale(0);
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-left-enter-prepare,
+.ant-zoom-left-appear-prepare {
+  transform: none;
+}
+.ant-zoom-left-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+.ant-zoom-right-enter,
+.ant-zoom-right-appear {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-right-leave {
+  animation-duration: 0.2s;
+  animation-fill-mode: both;
+  animation-play-state: paused;
+}
+.ant-zoom-right-enter.ant-zoom-right-enter-active,
+.ant-zoom-right-appear.ant-zoom-right-appear-active {
+  animation-name: antZoomRightIn;
+  animation-play-state: running;
+}
+.ant-zoom-right-leave.ant-zoom-right-leave-active {
+  animation-name: antZoomRightOut;
+  animation-play-state: running;
+  pointer-events: none;
+}
+.ant-zoom-right-enter,
+.ant-zoom-right-appear {
+  transform: scale(0);
+  opacity: 0;
+  animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
+}
+.ant-zoom-right-enter-prepare,
+.ant-zoom-right-appear-prepare {
+  transform: none;
+}
+.ant-zoom-right-leave {
+  animation-timing-function: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+}
+@keyframes antZoomIn {
+  0% {
+    transform: scale(0.2);
+    opacity: 0;
+  }
+  100% {
+    transform: scale(1);
+    opacity: 1;
+  }
+}
+@keyframes antZoomOut {
+  0% {
+    transform: scale(1);
+  }
+  100% {
+    transform: scale(0.2);
+    opacity: 0;
+  }
+}
+@keyframes antZoomBigIn {
+  0% {
+    transform: scale(0.8);
+    opacity: 0;
+  }
+  100% {
+    transform: scale(1);
+    opacity: 1;
+  }
+}
+@keyframes antZoomBigOut {
+  0% {
+    transform: scale(1);
+  }
+  100% {
+    transform: scale(0.8);
+    opacity: 0;
+  }
+}
+@keyframes antZoomUpIn {
+  0% {
+    transform: scale(0.8);
+    transform-origin: 50% 0%;
+    opacity: 0;
+  }
+  100% {
+    transform: scale(1);
+    transform-origin: 50% 0%;
+  }
+}
+@keyframes antZoomUpOut {
+  0% {
+    transform: scale(1);
+    transform-origin: 50% 0%;
+  }
+  100% {
+    transform: scale(0.8);
+    transform-origin: 50% 0%;
+    opacity: 0;
+  }
+}
+@keyframes antZoomLeftIn {
+  0% {
+    transform: scale(0.8);
+    transform-origin: 0% 50%;
+    opacity: 0;
+  }
+  100% {
+    transform: scale(1);
+    transform-origin: 0% 50%;
+  }
+}
+@keyframes antZoomLeftOut {
+  0% {
+    transform: scale(1);
+    transform-origin: 0% 50%;
+  }
+  100% {
+    transform: scale(0.8);
+    transform-origin: 0% 50%;
+    opacity: 0;
+  }
+}
+@keyframes antZoomRightIn {
+  0% {
+    transform: scale(0.8);
+    transform-origin: 100% 50%;
+    opacity: 0;
+  }
+  100% {
+    transform: scale(1);
+    transform-origin: 100% 50%;
+  }
+}
+@keyframes antZoomRightOut {
+  0% {
+    transform: scale(1);
+    transform-origin: 100% 50%;
+  }
+  100% {
+    transform: scale(0.8);
+    transform-origin: 100% 50%;
+    opacity: 0;
+  }
+}
+@keyframes antZoomDownIn {
+  0% {
+    transform: scale(0.8);
+    transform-origin: 50% 100%;
+    opacity: 0;
+  }
+  100% {
+    transform: scale(1);
+    transform-origin: 50% 100%;
+  }
+}
+@keyframes antZoomDownOut {
+  0% {
+    transform: scale(1);
+    transform-origin: 50% 100%;
+  }
+  100% {
+    transform: scale(0.8);
+    transform-origin: 50% 100%;
+    opacity: 0;
+  }
+}
+.ant-motion-collapse-legacy {
+  overflow: hidden;
+}
+.ant-motion-collapse-legacy-active {
+  transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
+}
+.ant-motion-collapse {
+  overflow: hidden;
+  transition: height 0.2s cubic-bezier(0.645, 0.045, 0.355, 1), opacity 0.2s cubic-bezier(0.645, 0.045, 0.355, 1) !important;
+}
diff --git a/src/styles/index.d.ts b/src/styles/index.d.ts
new file mode 100644
index 0000000..d74e52e
--- /dev/null
+++ b/src/styles/index.d.ts
@@ -0,0 +1 @@
+import './index.less';
diff --git a/src/styles/index.js b/src/styles/index.js
new file mode 100644
index 0000000..17665f8
--- /dev/null
+++ b/src/styles/index.js
@@ -0,0 +1 @@
+import './index.less';
\ No newline at end of file
diff --git a/src/styles/index.less b/src/styles/index.less
new file mode 100644
index 0000000..7882cea
--- /dev/null
+++ b/src/styles/index.less
@@ -0,0 +1,3 @@
+@root-entry-name: default;
+
+@import './index-pure.less';
\ No newline at end of file
diff --git a/src/styles/mixins/box.less b/src/styles/mixins/box.less
new file mode 100644
index 0000000..4bd3ffa
--- /dev/null
+++ b/src/styles/mixins/box.less
@@ -0,0 +1,7 @@
+.box(@position: absolute) {
+  position: @position;
+  top: 0;
+  right: 0;
+  bottom: 0;
+  left: 0;
+}
diff --git a/src/styles/mixins/clearfix.less b/src/styles/mixins/clearfix.less
new file mode 100644
index 0000000..07e89f8
--- /dev/null
+++ b/src/styles/mixins/clearfix.less
@@ -0,0 +1,16 @@
+// mixins for clearfix
+// ------------------------
+.clearfix() {
+  // https://github.com/ant-design/ant-design/issues/21301#issuecomment-583955229
+  &::before {
+    display: table;
+    content: '';
+  }
+
+  &::after {
+    // https://github.com/ant-design/ant-design/issues/21864
+    display: table;
+    clear: both;
+    content: '';
+  }
+}
diff --git a/src/styles/mixins/compact-item-vertical.less b/src/styles/mixins/compact-item-vertical.less
new file mode 100644
index 0000000..503b1f0
--- /dev/null
+++ b/src/styles/mixins/compact-item-vertical.less
@@ -0,0 +1,41 @@
+.compact-item-vertical-border-radius(@prefix-cls) {
+  &-item:not(&-first-item):not(&-last-item) {
+    border-radius: 0;
+  }
+
+  &-item&-first-item:not(&-last-item) {
+    border-bottom-right-radius: 0;
+    border-bottom-left-radius: 0;
+  }
+
+  &-item&-last-item:not(&-first-item) {
+    border-top-left-radius: 0;
+    border-top-right-radius: 0;
+  }
+}
+
+.compact-item-vertical-border(@prefix-cls) {
+  // border collapse
+  &-item:not(&-last-item) {
+    margin-bottom: -@border-width-base;
+  }
+
+  &-item {
+    &:hover,
+    &:focus,
+    &:active {
+      z-index: 2;
+    }
+
+    &[disabled] {
+      z-index: 0;
+    }
+  }
+}
+
+.compact-item-vertical(@prefix-cls) {
+  &-compact-vertical {
+    .compact-item-vertical-border(@prefix-cls);
+    .compact-item-vertical-border-radius(@prefix-cls);
+  }
+}
diff --git a/src/styles/mixins/compact-item.less b/src/styles/mixins/compact-item.less
new file mode 100644
index 0000000..cb49027
--- /dev/null
+++ b/src/styles/mixins/compact-item.less
@@ -0,0 +1,133 @@
+.compact-item-border-radius(@prefix-cls, @bordered-item-cls: null) {
+  & when (@bordered-item-cls = null) {
+    // border-radius
+    &-item:not(&-first-item):not(&-last-item).@{prefix-cls} {
+      border-radius: 0;
+    }
+
+    &-item.@{prefix-cls}&-first-item:not(&-last-item):not(&-item-rtl) {
+      border-top-right-radius: 0;
+      border-bottom-right-radius: 0;
+    }
+
+    &-item.@{prefix-cls}&-last-item:not(&-first-item):not(&-item-rtl) {
+      border-top-left-radius: 0;
+      border-bottom-left-radius: 0;
+    }
+
+    // ----------rtl for first item----------
+    &-item.@{prefix-cls}&-item-rtl&-first-item:not(&-last-item) {
+      border-top-left-radius: 0;
+      border-bottom-left-radius: 0;
+    }
+
+    // ----------rtl for last item----------
+    &-item.@{prefix-cls}&-item-rtl&-last-item:not(&-first-item) {
+      border-top-right-radius: 0;
+      border-bottom-right-radius: 0;
+    }
+  }
+
+  & when (not (@bordered-item-cls = null)) {
+    // border-radius
+    &-item:not(&-first-item):not(&-last-item).@{prefix-cls} > .@{bordered-item-cls} {
+      border-radius: 0;
+    }
+
+    &-item&-first-item.@{prefix-cls}:not(&-last-item):not(&-item-rtl) > .@{bordered-item-cls} {
+      border-top-right-radius: 0;
+      border-bottom-right-radius: 0;
+    }
+
+    &-item&-last-item.@{prefix-cls}:not(&-first-item):not(&-item-rtl) > .@{bordered-item-cls} {
+      border-top-left-radius: 0;
+      border-bottom-left-radius: 0;
+    }
+
+    // ----------rtl for first item----------
+    &-item.@{prefix-cls}&-first-item&-item-rtl:not(&-last-item) > .@{bordered-item-cls} {
+      border-top-left-radius: 0;
+      border-bottom-left-radius: 0;
+    }
+
+    // ----------rtl for last item----------
+    &-item.@{prefix-cls}&-last-item&-item-rtl:not(&-first-item) > .@{bordered-item-cls} {
+      border-top-right-radius: 0;
+      border-bottom-right-radius: 0;
+    }
+  }
+}
+
+.compact-item-border(@prefix-cls, @bordered-item-cls: null, @special-open-cls) {
+  & when (@bordered-item-cls = null) {
+    // border collapse
+    &-item:not(&-last-item):not(&-item-rtl) {
+      margin-right: -@border-width-base;
+    }
+
+    // rtl border collapse
+    &-item:not(&-last-item)&-item-rtl {
+      margin-left: -@border-width-base;
+    }
+
+    &-item {
+      &:hover,
+      &:focus,
+      &:active {
+        z-index: 2;
+      }
+
+      // Select has an extra focus className
+      & when (not (@special-item-cls = null)) {
+        &.@{special-item-cls} {
+          z-index: 2;
+        }
+      }
+
+      &[disabled] {
+        z-index: 0;
+      }
+    }
+  }
+
+  & when (not (@bordered-item-cls = null)) {
+    // border collapse
+    &-item:not(&-last-item) {
+      margin-right: -@border-width-base;
+
+      &.@{prefix-cls}-compact-item-rtl {
+        margin-right: 0;
+        margin-left: -@border-width-base;
+      }
+    }
+
+    &-item {
+      &:hover,
+      &:focus,
+      &:active {
+        > * {
+          z-index: 2;
+        }
+      }
+
+      // Select has an special focus-item
+      & when (not (@special-item-cls = null)) {
+        &.@{special-item-cls} > * {
+          z-index: 2;
+        }
+      }
+
+      &[disabled] > * {
+        z-index: 0;
+      }
+    }
+  }
+}
+
+.compact-item(@prefix-cls, @bordered-item-cls: null, @special-item-cls: null) {
+  &-compact {
+    .compact-item-border(@prefix-cls, @bordered-item-cls, @special-item-cls);
+
+    .compact-item-border-radius(@prefix-cls, @bordered-item-cls);
+  }
+}
diff --git a/src/styles/mixins/compatibility.less b/src/styles/mixins/compatibility.less
new file mode 100644
index 0000000..9464a75
--- /dev/null
+++ b/src/styles/mixins/compatibility.less
@@ -0,0 +1,13 @@
+// Compatibility for browsers.
+
+// Placeholder text
+.placeholder(@color: @input-placeholder-color) {
+  &::placeholder {
+    color: @color;
+    user-select: none; // https://github.com/ant-design/ant-design/pull/32639
+  }
+
+  &:placeholder-shown {
+    text-overflow: ellipsis;
+  }
+}
diff --git a/src/styles/mixins/customize.less b/src/styles/mixins/customize.less
new file mode 100644
index 0000000..6f6fc18
--- /dev/null
+++ b/src/styles/mixins/customize.less
@@ -0,0 +1,181 @@
+// customize dark components background in popover containers(like Modal, Drawer, Card, Popover, Popconfirm, Notification, ...)
+// for dark theme
+.popover-customize-bg(@containerClass, @background: @popover-background, @prefix: @ant-prefix)
+  when
+  (@theme = dark) {
+  @picker-prefix-cls: ~'@{prefix}-picker';
+  @slider-prefix-cls: ~'@{prefix}-slider';
+  @anchor-prefix-cls: ~'@{prefix}-anchor';
+  @collapse-prefix-cls: ~'@{prefix}-collapse';
+  @tab-prefix-cls: ~'@{prefix}-tabs';
+  @timeline-prefix-cls: ~'@{prefix}-timeline';
+  @tree-prefix-cls: ~'@{prefix}-tree';
+  @card-prefix-cls: ~'@{prefix}-card';
+  @badge-prefix-cls: ~'@{prefix}-badge';
+  @transfer-prefix-cls: ~'@{prefix}-transfer';
+  @calendar-prefix-cls: ~'@{prefix}-picker-calendar';
+  @calendar-picker-prefix-cls: ~'@{prefix}-picker';
+  @table-prefix-cls: ~'@{prefix}-table';
+
+  @popover-border: @border-width-base @border-style-base @popover-customize-border-color;
+
+  .@{containerClass} {
+    .@{picker-prefix-cls}-clear,
+    .@{slider-prefix-cls}-handle,
+    .@{anchor-prefix-cls}-wrapper,
+    .@{collapse-prefix-cls}-content,
+    .@{timeline-prefix-cls}-item-head,
+    .@{card-prefix-cls} {
+      background-color: @background;
+    }
+
+    .@{transfer-prefix-cls} {
+      &-list {
+        &-header {
+          background: @background;
+          border-bottom: @popover-border;
+        }
+        &-content-item:not(.@{transfer-prefix-cls}-list-content-item-disabled):hover {
+          background-color: @item-hover-bg;
+        }
+      }
+    }
+
+    tr.@{table-prefix-cls}-expanded-row {
+      &,
+      &:hover {
+        > td {
+          background: #272727;
+        }
+      }
+    }
+    .@{table-prefix-cls}.@{table-prefix-cls}-small {
+      thead {
+        > tr {
+          > th {
+            background-color: @background;
+            border-bottom: @popover-border;
+          }
+        }
+      }
+    }
+    .@{table-prefix-cls} {
+      background-color: @background;
+      .@{table-prefix-cls}-row-expand-icon {
+        border: @popover-border;
+      }
+
+      tfoot {
+        > tr {
+          > th,
+          > td {
+            border-bottom: @popover-border;
+          }
+        }
+      }
+
+      thead {
+        > tr {
+          > th {
+            background-color: #272727;
+            border-bottom: @popover-border;
+          }
+        }
+      }
+
+      tbody {
+        > tr {
+          > td {
+            border-bottom: @popover-border;
+            &.@{table-prefix-cls}-cell-fix-left,
+            &.@{table-prefix-cls}-cell-fix-right {
+              background-color: @background;
+            }
+          }
+          &.@{table-prefix-cls}-row:hover {
+            > td {
+              background: @table-header-sort-active-bg;
+            }
+          }
+        }
+      }
+      &.@{table-prefix-cls}-bordered {
+        .@{table-prefix-cls}-title {
+          border: @popover-border;
+        }
+
+        // ============================= Cell =============================
+        thead > tr > th,
+        tbody > tr > td,
+        tfoot > tr > th,
+        tfoot > tr > td {
+          border-right: @popover-border;
+        }
+
+        // Fixed right should provides additional border
+        .@{table-prefix-cls}-cell-fix-right-first::after {
+          border-right: @popover-border;
+        }
+
+        // ============================ Header ============================
+        table > {
+          thead {
+            > tr:not(:last-child) > th {
+              border-bottom: @border-width-base @border-style-base @border-color-split;
+            }
+          }
+        }
+
+        // =========================== Content ============================
+        .@{table-prefix-cls}-container {
+          border: @popover-border;
+        }
+
+        // ========================== Expandable ==========================
+        .@{table-prefix-cls}-expanded-row-fixed {
+          &::after {
+            border-right: @popover-border;
+          }
+        }
+
+        .@{table-prefix-cls}-footer {
+          border: @popover-border;
+        }
+      }
+      .@{table-prefix-cls}-filter-trigger-container-open {
+        background-color: #525252;
+      }
+    }
+
+    .@{calendar-prefix-cls}-full {
+      background-color: @background;
+      .@{calendar-picker-prefix-cls}-panel {
+        background-color: @background;
+        .@{calendar-prefix-cls}-date {
+          border-top: 2px solid @popover-customize-border-color;
+        }
+      }
+    }
+
+    .@{tab-prefix-cls} {
+      &.@{tab-prefix-cls}-card .@{tab-prefix-cls}-card-bar .@{tab-prefix-cls}-tab-active {
+        background-color: @background;
+        border-bottom: @border-width-base solid @background;
+      }
+    }
+
+    .@{badge-prefix-cls} {
+      &-count {
+        box-shadow: 0 0 0 1px @background;
+      }
+    }
+
+    .@{tree-prefix-cls} {
+      &-show-line {
+        .@{tree-prefix-cls}-switcher {
+          background: @background;
+        }
+      }
+    }
+  }
+}
diff --git a/src/styles/mixins/iconfont.less b/src/styles/mixins/iconfont.less
new file mode 100644
index 0000000..aeb4e96
--- /dev/null
+++ b/src/styles/mixins/iconfont.less
@@ -0,0 +1,29 @@
+.iconfont-mixin() {
+  display: inline-flex;
+  align-items: center;
+  color: @icon-color;
+  font-style: normal;
+  line-height: 0;
+  text-align: center;
+  text-transform: none;
+  vertical-align: -0.125em; // for SVG icon, see https://blog.prototypr.io/align-svg-icons-to-text-and-say-goodbye-to-font-icons-d44b3d7b26b4
+  text-rendering: optimizelegibility;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+
+  > * {
+    line-height: 1;
+  }
+
+  svg {
+    display: inline-block;
+  }
+
+  &::before {
+    display: none; // dont display old icon.
+  }
+
+  & &-icon {
+    display: block;
+  }
+}
diff --git a/src/styles/mixins/index.less b/src/styles/mixins/index.less
new file mode 100644
index 0000000..5438846
--- /dev/null
+++ b/src/styles/mixins/index.less
@@ -0,0 +1,16 @@
+// Mixins
+// --------------------------------------------------
+@import 'size';
+@import 'compatibility';
+@import 'clearfix';
+@import 'iconfont';
+@import 'typography';
+@import 'customize';
+@import 'box';
+@import 'modal-mask';
+@import 'motion';
+@import 'reset';
+@import 'operation-unit';
+@import 'rounded-arrow';
+@import 'compact-item';
+@import 'compact-item-vertical';
diff --git a/src/styles/mixins/modal-mask.less b/src/styles/mixins/modal-mask.less
new file mode 100644
index 0000000..b406bc1
--- /dev/null
+++ b/src/styles/mixins/modal-mask.less
@@ -0,0 +1,30 @@
+@import 'box';
+
+.modal-mask() {
+  pointer-events: none;
+
+  &.@{ant-prefix}-zoom-enter,
+  &.@{ant-prefix}-zoom-appear {
+    transform: none; // reset scale avoid mousePosition bug
+    opacity: 0;
+    animation-duration: @animation-duration-slow;
+    user-select: none; // https://github.com/ant-design/ant-design/issues/11777
+  }
+
+  &-mask {
+    .box(fixed);
+    z-index: @zindex-modal-mask;
+    height: 100%;
+    background-color: @modal-mask-bg;
+
+    &-hidden {
+      display: none;
+    }
+  }
+
+  &-wrap {
+    .box(fixed);
+    overflow: auto;
+    outline: 0;
+  }
+}
diff --git a/src/styles/mixins/motion.less b/src/styles/mixins/motion.less
new file mode 100644
index 0000000..1e15350
--- /dev/null
+++ b/src/styles/mixins/motion.less
@@ -0,0 +1,33 @@
+.motion-common(@duration: @animation-duration-base) {
+  animation-duration: @duration;
+  animation-fill-mode: both;
+}
+
+.motion-common-leave(@duration: @animation-duration-base) {
+  animation-duration: @duration;
+  animation-fill-mode: both;
+}
+
+.make-motion(@className, @keyframeName, @duration: @animation-duration-base) {
+  .@{className}-enter,
+  .@{className}-appear {
+    .motion-common(@duration);
+
+    animation-play-state: paused;
+  }
+  .@{className}-leave {
+    .motion-common-leave(@duration);
+
+    animation-play-state: paused;
+  }
+  .@{className}-enter.@{className}-enter-active,
+  .@{className}-appear.@{className}-appear-active {
+    animation-name: ~'@{keyframeName}In';
+    animation-play-state: running;
+  }
+  .@{className}-leave.@{className}-leave-active {
+    animation-name: ~'@{keyframeName}Out';
+    animation-play-state: running;
+    pointer-events: none;
+  }
+}
diff --git a/src/styles/mixins/operation-unit.less b/src/styles/mixins/operation-unit.less
new file mode 100644
index 0000000..b695171
--- /dev/null
+++ b/src/styles/mixins/operation-unit.less
@@ -0,0 +1,15 @@
+.operation-unit() {
+  color: @link-color;
+  outline: none;
+  cursor: pointer;
+  transition: color 0.3s;
+
+  &:focus-visible,
+  &:hover {
+    color: @link-hover-color;
+  }
+
+  &:active {
+    color: @link-active-color;
+  }
+}
diff --git a/src/styles/mixins/reset.less b/src/styles/mixins/reset.less
new file mode 100644
index 0000000..905c16e
--- /dev/null
+++ b/src/styles/mixins/reset.less
@@ -0,0 +1,11 @@
+.reset-component() {
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0;
+  color: @text-color;
+  font-size: @font-size-base;
+  font-variant: @font-variant-base;
+  line-height: @line-height-base;
+  list-style: none;
+  font-feature-settings: @font-feature-settings-base;
+}
diff --git a/src/styles/mixins/rounded-arrow.less b/src/styles/mixins/rounded-arrow.less
new file mode 100644
index 0000000..1c82643
--- /dev/null
+++ b/src/styles/mixins/rounded-arrow.less
@@ -0,0 +1,44 @@
+.roundedArrow(@width, @outer-radius, @bg-color: var(--antd-arrow-background-color)) {
+  @corner-height: unit(((@outer-radius) * (1 - 1 / sqrt(2))));
+
+  @width-without-unit: unit(@width);
+  @outer-radius-without-unit: unit(@outer-radius);
+  @inner-radius-without-unit: unit(@arrow-border-radius);
+
+  @a-x: @width-without-unit - @corner-height;
+  @a-y: 2 * @width-without-unit + @corner-height;
+  @b-x: @a-x + @outer-radius-without-unit * (1 / sqrt(2));
+  @b-y: 2 * @width-without-unit;
+  @c-x: 2 * @width-without-unit - @inner-radius-without-unit;
+  @c-y: 2 * @width-without-unit;
+  @d-x: 2 * @width-without-unit;
+  @d-y: 2 * @width-without-unit - @inner-radius-without-unit;
+  @e-x: 2 * @width-without-unit;
+  @e-y: @f-y + @outer-radius-without-unit * (1 / sqrt(2));
+  @f-x: 2 * @width-without-unit + @corner-height;
+  @f-y: @width-without-unit - @corner-height;
+  @g-x: @f-x - 1;
+  @g-y: @f-y;
+  @h-x: @a-x;
+  @h-y: @a-y - 1;
+
+  border-radius: 0 0 @arrow-border-radius;
+  pointer-events: none;
+
+  &::before {
+    position: absolute;
+    top: -@width;
+    left: -@width;
+    width: @width * 3;
+    height: @width * 3;
+    background: @bg-color;
+    // Hack firefox: https://github.com/ant-design/ant-design/pull/33710#issuecomment-1015287825
+    background-repeat: no-repeat;
+    background-position: ceil(-@width + 1px) ceil(-@width + 1px);
+    content: '';
+    clip-path: inset(33% 33%); // For browsers that do not support path()
+    clip-path: path(
+      'M @{a-x} @{a-y} A @{outer-radius-without-unit} @{outer-radius-without-unit} 0 0 1 @{b-x} @{b-y} L @{c-x} @{c-y} A @{inner-radius-without-unit} @{inner-radius-without-unit} 0 0 0 @{d-x} @{d-y} L @{e-x} @{e-y} A @{outer-radius-without-unit} @{outer-radius-without-unit} 0 0 1 @{f-x} @{f-y} L @{g-x} @{g-y} L @{h-x} @{h-y} Z'
+    );
+  }
+}
diff --git a/src/styles/mixins/size.less b/src/styles/mixins/size.less
new file mode 100644
index 0000000..a8be650
--- /dev/null
+++ b/src/styles/mixins/size.less
@@ -0,0 +1,10 @@
+// Sizing shortcuts
+
+.size(@width; @height) {
+  width: @width;
+  height: @height;
+}
+
+.square(@size) {
+  .size(@size; @size);
+}
diff --git a/src/styles/mixins/typography.less b/src/styles/mixins/typography.less
new file mode 100644
index 0000000..71a4d39
--- /dev/null
+++ b/src/styles/mixins/typography.less
@@ -0,0 +1,58 @@
+// =============== Common ===============
+.typography-paragraph() {
+  margin-bottom: 1em;
+}
+
+.typography-title(@fontSize; @fontWeight; @lineHeight; @headingColor; @headingMarginBottom;) {
+  margin-bottom: @headingMarginBottom;
+  color: @headingColor;
+  font-weight: @fontWeight;
+  font-size: @fontSize;
+  line-height: @lineHeight;
+}
+
+.typography-title-1() {
+  .typography-title(
+    @heading-1-size,
+    @typography-title-font-weight,
+    1.23,
+    @heading-color,
+    @typography-title-margin-bottom
+  );
+}
+.typography-title-2() {
+  .typography-title(
+    @heading-2-size,
+    @typography-title-font-weight,
+    1.35,
+    @heading-color,
+    @typography-title-margin-bottom
+  );
+}
+.typography-title-3() {
+  .typography-title(
+    @heading-3-size,
+    @typography-title-font-weight,
+    1.35,
+    @heading-color,
+    @typography-title-margin-bottom
+  );
+}
+.typography-title-4() {
+  .typography-title(
+    @heading-4-size,
+    @typography-title-font-weight,
+    1.4,
+    @heading-color,
+    @typography-title-margin-bottom
+  );
+}
+.typography-title-5() {
+  .typography-title(
+    @heading-5-size,
+    @typography-title-font-weight,
+    1.5,
+    @heading-color,
+    @typography-title-margin-bottom
+  );
+}
diff --git a/src/styles/themes/compact.less b/src/styles/themes/compact.less
new file mode 100644
index 0000000..bd0b01d
--- /dev/null
+++ b/src/styles/themes/compact.less
@@ -0,0 +1,295 @@
+@import './default.less';
+
+@line-height-base: 1.66667;
+@mode: compact;
+@font-size-base: 12px;
+@font-size-lg: @font-size-base + 2px;
+
+// default paddings
+@default-padding-lg: 24px; // containers
+@default-padding-md: 16px; // small containers and buttons
+@default-padding-sm: 12px; // Form controls and items
+@default-padding-xs: 8px; // small items
+@default-padding-xss: 4px; // more small
+
+// vertical paddings
+@padding-lg: 16px; // containers
+@padding-md: 8px; // small containers and buttons
+@padding-sm: 8px; // Form controls and items
+@padding-xs: 4px; // small items
+@padding-xss: 0px; // more small
+
+// vertical padding for all form controls
+@control-padding-horizontal: @padding-sm;
+@control-padding-horizontal-sm: @default-padding-xs;
+
+// vertical margins
+@margin-lg: 16px; // containers
+@margin-md: 8px; // small containers and buttons
+@margin-sm: 8px; // Form controls and items
+@margin-xs: 4px; // small items
+@margin-xss: 0px; // more small
+
+// height rules
+@height-base: 28px;
+@height-lg: 32px;
+@height-sm: 22px;
+
+// Button
+// ---
+@btn-padding-horizontal-base: @default-padding-sm - 1px;
+@btn-padding-horizontal-lg: @btn-padding-horizontal-base;
+@btn-padding-horizontal-sm: @default-padding-xs - 1px;
+@btn-square-only-icon-size-lg: 16px;
+@btn-square-only-icon-size: 14px;
+@btn-square-only-icon-size-sm: 12px;
+
+// Breadcrumb
+// ---
+@breadcrumb-font-size: @font-size-base;
+@breadcrumb-icon-font-size: @font-size-base;
+
+//Dropdown
+@dropdown-line-height: 18px;
+
+// Menu
+@menu-item-padding-horizontal: 12px;
+@menu-horizontal-line-height: 38px;
+@menu-inline-toplevel-item-height: 32px;
+@menu-item-height: 32px;
+@menu-item-vertical-margin: 0px;
+@menu-item-boundary-margin: 0px;
+@menu-icon-margin-right: 8px;
+
+// Checkbox
+@checkbox-size: 14px;
+@checkbox-group-item-margin-right: 6px;
+
+// picker
+@picker-panel-cell-height: 22px;
+@picker-panel-cell-width: 32px;
+@picker-text-height: 32px;
+@picker-time-panel-cell-height: 24px;
+@picker-panel-without-time-cell-height: 48px;
+
+// Form
+// ---
+@form-item-margin-bottom: 16px;
+@form-vertical-label-padding: 0 0 4px;
+
+// Rate
+// ---
+@rate-star-size: 16px;
+
+// Radio
+// ---
+@radio-size: 14px;
+@radio-wrapper-margin-right: 6px;
+
+// Switch
+// ---
+@switch-height: 20px;
+@switch-sm-height: 14px;
+@switch-min-width: 40px;
+@switch-sm-min-width: 24px;
+@switch-inner-margin-min: 4px;
+@switch-inner-margin-max: 22px;
+
+// Slider
+// ---
+@slider-handle-size: 12px;
+@slider-handle-margin-top: -4px;
+
+// Input
+// ---
+@input-padding-vertical-base: round(
+  max(
+    (round(((@input-height-base - @font-size-base * @line-height-base) / 2) * 10) / 10) -
+      @border-width-base,
+    2px
+  )
+);
+@input-padding-horizontal-lg: 11px;
+
+// PageHeader
+// ---
+@page-header-padding: 16px;
+@page-header-padding-vertical: 8px;
+@page-header-heading-title: 16px;
+@page-header-heading-sub-title: 12px;
+@page-header-tabs-tab-font-size: 14px;
+
+// Pagination
+// ---
+@pagination-mini-options-size-changer-top: 1px;
+@pagination-item-size-sm: 22px;
+
+// Cascader
+// ----
+@cascader-dropdown-line-height: @dropdown-line-height;
+
+// Select
+// ---
+@select-dropdown-height: @height-base;
+@select-single-item-height-lg: 32px;
+@select-multiple-item-height: @input-height-base - max(@input-padding-vertical-base, 4) * 2; // Normal 24px
+@select-multiple-item-height-lg: 24px;
+@select-multiple-item-spacing-half: 3px;
+
+// Tree
+// ---
+@tree-title-height: 20px;
+
+// Transfer
+// ---
+@transfer-item-padding-vertical: 3px;
+@transfer-list-search-icon-top: 8px;
+@transfer-header-height: 36px;
+
+// Comment
+// ---
+@comment-actions-margin-bottom: 0px;
+@comment-actions-margin-top: @margin-xs;
+@comment-content-detail-p-margin-bottom: 0px;
+
+// Steps
+// ---
+@steps-icon-size: 24px;
+@steps-icon-custom-size: 20px;
+@steps-icon-custom-font-size: 20px;
+@steps-icon-custom-top: 2px;
+@steps-icon-margin: 2px 8px 2px 0;
+@steps-icon-font-size: @font-size-base;
+@steps-dot-top: 4px;
+@steps-icon-top: 0px;
+@steps-small-icon-size: 20px;
+@steps-vertical-icon-width: 12px;
+@steps-vertical-tail-width: 12px;
+@steps-vertical-tail-width-sm: 10px;
+// Collapse
+// ---
+//@collapse-header-padding-extra: 32px;
+@collapse-content-padding: @padding-md @padding-lg;
+
+// List
+// ---
+@list-item-meta-description-font-size: @font-size-sm;
+@list-item-padding-sm: 4px 12px;
+@list-item-padding-lg: 12px 16px;
+
+// Drawer
+// ---
+@drawer-header-padding: 11px @padding-lg;
+@drawer-footer-padding-vertical: @padding-sm;
+@drawer-footer-padding-horizontal: @padding-sm;
+@drawer-header-close-size: 44px;
+
+// Modal
+// --
+@modal-header-padding-vertical: 11px;
+@modal-header-padding: @modal-header-padding-vertical @modal-header-padding-horizontal;
+@modal-footer-padding-vertical: @padding-sm;
+@modal-header-close-size: @modal-header-title-line-height + 2 * @modal-header-padding-vertical;
+@modal-confirm-body-padding: 24px 24px 16px;
+
+// Message
+// ---
+@message-notice-content-padding: 8px 16px;
+
+// popover
+// --
+@popover-min-height: 28px;
+@popover-padding-horizontal: @default-padding-sm;
+
+// Card
+// ---
+@card-head-height: 36px;
+@card-head-font-size: @card-head-font-size-sm;
+@card-head-padding: 8.5px;
+@card-padding-base: 12px;
+@card-padding-base-sm: @card-padding-base;
+@card-head-height-sm: 30px;
+@card-head-padding-sm: 6px;
+@card-actions-li-margin: 4px 0;
+@card-head-tabs-margin-bottom: -9px;
+
+// Table
+// ---
+@table-padding-vertical: 12px;
+@table-padding-horizontal: 8px;
+@table-padding-vertical-md: 8px;
+@table-padding-horizontal-md: 8px;
+@table-padding-vertical-sm: 4px;
+@table-padding-horizontal-sm: 4px;
+@table-selection-column-width: 32px;
+
+// Statistic
+// ---
+@statistic-content-font-size: 20px;
+
+// Alert
+// ---
+@alert-with-description-no-icon-padding-vertical: 7px;
+@alert-with-description-padding-vertical: 11px;
+@alert-icon-top: 7px + @font-size-base * (@line-height-base / 2) - (@font-size-base / 2);
+@alert-with-description-icon-size: 20px;
+
+// Skeleton
+// ---
+@skeleton-paragraph-margin-top: 20px;
+@skeleton-paragraph-li-margin-top: 12px;
+@skeleton-paragraph-li-height: 14px;
+@skeleton-title-height: 14px;
+@skeleton-title-paragraph-margin-top: 20px;
+
+// Descriptions
+@descriptions-title-margin-bottom: 8px;
+@descriptions-default-padding: 12px @padding-lg;
+@descriptions-item-padding-bottom: @padding-xs;
+
+// Avatar
+// ---
+@avatar-size-base: 28px;
+@avatar-size-lg: 32px;
+@avatar-size-sm: 22px;
+@avatar-font-size-base: 16px;
+@avatar-font-size-lg: 20px;
+@avatar-font-size-sm: 12px;
+
+// Badge
+// ---
+@badge-height: 18px;
+
+// Tag
+// ---
+@tag-line-height: 18px;
+
+// Notification
+// ---
+@notification-padding-vertical: 12px;
+@notification-padding-horizontal: 16px;
+
+// Result
+// ---
+@result-title-font-size: 20px;
+@result-icon-font-size: 64px;
+@result-extra-margin: 24px 0 0 0;
+
+// Anchor
+// ---
+@anchor-link-top: 4px;
+@anchor-link-left: 16px;
+@anchor-link-padding: @anchor-link-top 0 @anchor-link-top @anchor-link-left;
+
+// Tabs
+// ---
+@tabs-card-horizontal-padding: 4px @padding-md;
+
+// Progress
+// ---
+@progress-circle-text-font-size: 0.833333em;
+
+// Image
+// ---
+@image-size-base: 48px;
+@image-font-size-base: 24px;
diff --git a/src/styles/themes/dark.less b/src/styles/themes/dark.less
new file mode 100644
index 0000000..4cfda90
--- /dev/null
+++ b/src/styles/themes/dark.less
@@ -0,0 +1,457 @@
+@import './default.less';
+
+@theme: dark;
+// color palettes
+@blue-1: mix(color(~`colorPalette('@{blue-base}', 8) `), @component-background, 15%);
+@blue-2: mix(color(~`colorPalette('@{blue-base}', 7) `), @component-background, 25%);
+@blue-3: mix(@blue-base, @component-background, 30%);
+@blue-4: mix(@blue-base, @component-background, 45%);
+@blue-5: mix(@blue-base, @component-background, 65%);
+@blue-6: mix(@blue-base, @component-background, 85%);
+@blue-7: mix(color(~`colorPalette('@{blue-base}', 5) `), @component-background, 90%);
+@blue-8: mix(color(~`colorPalette('@{blue-base}', 4) `), @component-background, 95%);
+@blue-9: mix(color(~`colorPalette('@{blue-base}', 3) `), @component-background, 97%);
+@blue-10: mix(color(~`colorPalette('@{blue-base}', 2) `), @component-background, 98%);
+
+@purple-1: mix(color(~`colorPalette('@{purple-base}', 8) `), @component-background, 15%);
+@purple-2: mix(color(~`colorPalette('@{purple-base}', 7) `), @component-background, 25%);
+@purple-3: mix(@purple-base, @component-background, 30%);
+@purple-4: mix(@purple-base, @component-background, 45%);
+@purple-5: mix(@purple-base, @component-background, 65%);
+@purple-6: mix(@purple-base, @component-background, 85%);
+@purple-7: mix(color(~`colorPalette('@{purple-base}', 5) `), @component-background, 90%);
+@purple-8: mix(color(~`colorPalette('@{purple-base}', 4) `), @component-background, 95%);
+@purple-9: mix(color(~`colorPalette('@{purple-base}', 3) `), @component-background, 97%);
+@purple-10: mix(color(~`colorPalette('@{purple-base}', 2) `), @component-background, 98%);
+
+@cyan-1: mix(color(~`colorPalette('@{cyan-base}', 8) `), @component-background, 15%);
+@cyan-2: mix(color(~`colorPalette('@{cyan-base}', 7) `), @component-background, 25%);
+@cyan-3: mix(@cyan-base, @component-background, 30%);
+@cyan-4: mix(@cyan-base, @component-background, 45%);
+@cyan-5: mix(@cyan-base, @component-background, 65%);
+@cyan-6: mix(@cyan-base, @component-background, 85%);
+@cyan-7: mix(color(~`colorPalette('@{cyan-base}', 5) `), @component-background, 90%);
+@cyan-8: mix(color(~`colorPalette('@{cyan-base}', 4) `), @component-background, 95%);
+@cyan-9: mix(color(~`colorPalette('@{cyan-base}', 3) `), @component-background, 97%);
+@cyan-10: mix(color(~`colorPalette('@{cyan-base}', 2) `), @component-background, 98%);
+
+@green-1: mix(color(~`colorPalette('@{green-base}', 8) `), @component-background, 15%);
+@green-2: mix(color(~`colorPalette('@{green-base}', 7) `), @component-background, 25%);
+@green-3: mix(@green-base, @component-background, 30%);
+@green-4: mix(@green-base, @component-background, 45%);
+@green-5: mix(@green-base, @component-background, 65%);
+@green-6: mix(@green-base, @component-background, 85%);
+@green-7: mix(color(~`colorPalette('@{green-base}', 5) `), @component-background, 90%);
+@green-8: mix(color(~`colorPalette('@{green-base}', 4) `), @component-background, 95%);
+@green-9: mix(color(~`colorPalette('@{green-base}', 3) `), @component-background, 97%);
+@green-10: mix(color(~`colorPalette('@{green-base}', 2) `), @component-background, 98%);
+
+@magenta-1: mix(color(~`colorPalette('@{magenta-base}', 8) `), @component-background, 15%);
+@magenta-2: mix(color(~`colorPalette('@{magenta-base}', 7) `), @component-background, 25%);
+@magenta-3: mix(@magenta-base, @component-background, 30%);
+@magenta-4: mix(@magenta-base, @component-background, 45%);
+@magenta-5: mix(@magenta-base, @component-background, 65%);
+@magenta-6: mix(@magenta-base, @component-background, 85%);
+@magenta-7: mix(color(~`colorPalette('@{magenta-base}', 5) `), @component-background, 90%);
+@magenta-8: mix(color(~`colorPalette('@{magenta-base}', 4) `), @component-background, 95%);
+@magenta-9: mix(color(~`colorPalette('@{magenta-base}', 3) `), @component-background, 97%);
+@magenta-10: mix(color(~`colorPalette('@{magenta-base}', 2) `), @component-background, 98%);
+
+@pink-1: mix(color(~`colorPalette('@{pink-base}', 8) `), @component-background, 15%);
+@pink-2: mix(color(~`colorPalette('@{pink-base}', 7) `), @component-background, 25%);
+@pink-3: mix(@pink-base, @component-background, 30%);
+@pink-4: mix(@pink-base, @component-background, 45%);
+@pink-5: mix(@pink-base, @component-background, 65%);
+@pink-6: mix(@pink-base, @component-background, 85%);
+@pink-7: mix(color(~`colorPalette('@{pink-base}', 5) `), @component-background, 90%);
+@pink-8: mix(color(~`colorPalette('@{pink-base}', 4) `), @component-background, 95%);
+@pink-9: mix(color(~`colorPalette('@{pink-base}', 3) `), @component-background, 97%);
+@pink-10: mix(color(~`colorPalette('@{pink-base}', 2) `), @component-background, 98%);
+
+@red-1: mix(color(~`colorPalette('@{red-base}', 8) `), @component-background, 15%);
+@red-2: mix(color(~`colorPalette('@{red-base}', 7) `), @component-background, 25%);
+@red-3: mix(@red-base, @component-background, 30%);
+@red-4: mix(@red-base, @component-background, 45%);
+@red-5: mix(@red-base, @component-background, 65%);
+@red-6: mix(@red-base, @component-background, 85%);
+@red-7: mix(color(~`colorPalette('@{red-base}', 5) `), @component-background, 90%);
+@red-8: mix(color(~`colorPalette('@{red-base}', 4) `), @component-background, 95%);
+@red-9: mix(color(~`colorPalette('@{red-base}', 3) `), @component-background, 97%);
+@red-10: mix(color(~`colorPalette('@{red-base}', 2) `), @component-background, 98%);
+
+@orange-1: mix(color(~`colorPalette('@{orange-base}', 8) `), @component-background, 15%);
+@orange-2: mix(color(~`colorPalette('@{orange-base}', 7) `), @component-background, 25%);
+@orange-3: mix(@orange-base, @component-background, 30%);
+@orange-4: mix(@orange-base, @component-background, 45%);
+@orange-5: mix(@orange-base, @component-background, 65%);
+@orange-6: mix(@orange-base, @component-background, 85%);
+@orange-7: mix(color(~`colorPalette('@{orange-base}', 5) `), @component-background, 90%);
+@orange-8: mix(color(~`colorPalette('@{orange-base}', 4) `), @component-background, 95%);
+@orange-9: mix(color(~`colorPalette('@{orange-base}', 3) `), @component-background, 97%);
+@orange-10: mix(color(~`colorPalette('@{orange-base}', 2) `), @component-background, 98%);
+
+@yellow-1: mix(color(~`colorPalette('@{yellow-base}', 8) `), @component-background, 15%);
+@yellow-2: mix(color(~`colorPalette('@{yellow-base}', 7) `), @component-background, 25%);
+@yellow-3: mix(@yellow-base, @component-background, 30%);
+@yellow-4: mix(@yellow-base, @component-background, 45%);
+@yellow-5: mix(@yellow-base, @component-background, 65%);
+@yellow-6: mix(@yellow-base, @component-background, 85%);
+@yellow-7: mix(color(~`colorPalette('@{yellow-base}', 5) `), @component-background, 90%);
+@yellow-8: mix(color(~`colorPalette('@{yellow-base}', 4) `), @component-background, 95%);
+@yellow-9: mix(color(~`colorPalette('@{yellow-base}', 3) `), @component-background, 97%);
+@yellow-10: mix(color(~`colorPalette('@{yellow-base}', 2) `), @component-background, 98%);
+
+@volcano-1: mix(color(~`colorPalette('@{volcano-base}', 8) `), @component-background, 15%);
+@volcano-2: mix(color(~`colorPalette('@{volcano-base}', 7) `), @component-background, 25%);
+@volcano-3: mix(@volcano-base, @component-background, 30%);
+@volcano-4: mix(@volcano-base, @component-background, 45%);
+@volcano-5: mix(@volcano-base, @component-background, 65%);
+@volcano-6: mix(@volcano-base, @component-background, 85%);
+@volcano-7: mix(color(~`colorPalette('@{volcano-base}', 5) `), @component-background, 90%);
+@volcano-8: mix(color(~`colorPalette('@{volcano-base}', 4) `), @component-background, 95%);
+@volcano-9: mix(color(~`colorPalette('@{volcano-base}', 3) `), @component-background, 97%);
+@volcano-10: mix(color(~`colorPalette('@{volcano-base}', 2) `), @component-background, 98%);
+
+@geekblue-1: mix(color(~`colorPalette('@{geekblue-base}', 8) `), @component-background, 15%);
+@geekblue-2: mix(color(~`colorPalette('@{geekblue-base}', 7) `), @component-background, 25%);
+@geekblue-3: mix(@geekblue-base, @component-background, 30%);
+@geekblue-4: mix(@geekblue-base, @component-background, 45%);
+@geekblue-5: mix(@geekblue-base, @component-background, 65%);
+@geekblue-6: mix(@geekblue-base, @component-background, 85%);
+@geekblue-7: mix(color(~`colorPalette('@{geekblue-base}', 5) `), @component-background, 90%);
+@geekblue-8: mix(color(~`colorPalette('@{geekblue-base}', 4) `), @component-background, 95%);
+@geekblue-9: mix(color(~`colorPalette('@{geekblue-base}', 3) `), @component-background, 97%);
+@geekblue-10: mix(color(~`colorPalette('@{geekblue-base}', 2) `), @component-background, 98%);
+
+@lime-1: mix(color(~`colorPalette('@{lime-base}', 8) `), @component-background, 15%);
+@lime-2: mix(color(~`colorPalette('@{lime-base}', 7) `), @component-background, 25%);
+@lime-3: mix(@lime-base, @component-background, 30%);
+@lime-4: mix(@lime-base, @component-background, 45%);
+@lime-5: mix(@lime-base, @component-background, 65%);
+@lime-6: mix(@lime-base, @component-background, 85%);
+@lime-7: mix(color(~`colorPalette('@{lime-base}', 5) `), @component-background, 90%);
+@lime-8: mix(color(~`colorPalette('@{lime-base}', 4) `), @component-background, 95%);
+@lime-9: mix(color(~`colorPalette('@{lime-base}', 3) `), @component-background, 97%);
+@lime-10: mix(color(~`colorPalette('@{lime-base}', 2) `), @component-background, 98%);
+
+@gold-1: mix(color(~`colorPalette('@{gold-base}', 8) `), @component-background, 15%);
+@gold-2: mix(color(~`colorPalette('@{gold-base}', 7) `), @component-background, 25%);
+@gold-3: mix(@gold-base, @component-background, 30%);
+@gold-4: mix(@gold-base, @component-background, 45%);
+@gold-5: mix(@gold-base, @component-background, 65%);
+@gold-6: mix(@gold-base, @component-background, 85%);
+@gold-7: mix(color(~`colorPalette('@{gold-base}', 5) `), @component-background, 90%);
+@gold-8: mix(color(~`colorPalette('@{gold-base}', 4) `), @component-background, 95%);
+@gold-9: mix(color(~`colorPalette('@{gold-base}', 3) `), @component-background, 97%);
+@gold-10: mix(color(~`colorPalette('@{gold-base}', 2) `), @component-background, 98%);
+
+// Color used by default to control hover and active backgrounds and for
+// alert info backgrounds.
+@primary-1: mix(color(~`colorPalette('@{primary-color}', 8) `), @component-background, 15%);
+@primary-2: mix(color(~`colorPalette('@{primary-color}', 7) `), @component-background, 25%);
+@primary-3: mix(@primary-color, @component-background, 30%);
+@primary-4: mix(@primary-color, @component-background, 45%);
+@primary-5: mix(@primary-color, @component-background, 65%);
+@primary-6: @primary-color;
+@primary-7: mix(color(~`colorPalette('@{primary-color}', 5) `), @component-background, 90%);
+@primary-8: mix(color(~`colorPalette('@{primary-color}', 4) `), @component-background, 95%);
+@primary-9: mix(color(~`colorPalette('@{primary-color}', 3) `), @component-background, 97%);
+@primary-10: mix(color(~`colorPalette('@{primary-color}', 2) `), @component-background, 98%);
+
+// Layer background
+@popover-background: #1f1f1f;
+@popover-customize-border-color: #3a3a3a;
+@body-background: @black;
+@component-background: #141414;
+
+@text-color: fade(@white, 85%);
+@text-color-secondary: fade(@white, 45%);
+@text-color-inverse: @white;
+@icon-color-hover: fade(@white, 75%);
+@heading-color: fade(@white, 85%);
+
+// The background colors for active and hover states for things like
+// list items or table cells.
+@item-active-bg: @primary-1;
+@item-hover-bg: fade(@white, 8%);
+
+// Border color
+@border-color-base: #434343; // base border outline a component
+@border-color-split: #303030; // split border inside a component
+
+@background-color-light: fade(@white, 4%); // background of header and selected item
+@background-color-base: fade(@white, 8%); // Default grey background color
+
+// Disabled states
+@disabled-color: fade(@white, 30%);
+@disabled-bg: @background-color-base;
+@disabled-color-dark: fade(@white, 30%);
+
+// Tree
+// ---
+@tree-bg: transparent;
+
+// List
+// ---
+@list-customize-card-bg: transparent;
+
+// Shadow
+// ---
+@shadow-color: rgba(0, 0, 0, 0.45);
+@shadow-color-inverse: @component-background;
+@box-shadow-base: @shadow-2;
+@shadow-1-up: 0 -6px 16px -8px rgba(0, 0, 0, 0.32), 0 -9px 28px 0 rgba(0, 0, 0, 0.2),
+  0 -12px 48px 16px rgba(0, 0, 0, 0.12);
+@shadow-1-down: 0 6px 16px -8px rgba(0, 0, 0, 0.32), 0 9px 28px 0 rgba(0, 0, 0, 0.2),
+  0 12px 48px 16px rgba(0, 0, 0, 0.12);
+@shadow-1-right: 6px 0 16px -8px rgba(0, 0, 0, 0.32), 9px 0 28px 0 rgba(0, 0, 0, 0.2),
+  12px 0 48px 16px rgba(0, 0, 0, 0.12);
+@shadow-2: 0 3px 6px -4px rgba(0, 0, 0, 0.48), 0 6px 16px 0 rgba(0, 0, 0, 0.32),
+  0 9px 28px 8px rgba(0, 0, 0, 0.2);
+
+// Buttons
+// ---
+@btn-shadow: 0 2px 0 rgba(0, 0, 0, 0.015);
+@btn-primary-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);
+@btn-text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);
+
+@btn-default-bg: transparent;
+
+@btn-default-ghost-color: @text-color;
+@btn-default-ghost-border: fade(@white, 25%);
+
+@btn-text-hover-bg: rgba(255, 255, 255, 0.03);
+
+// Checkbox
+// ---
+@checkbox-check-bg: transparent;
+
+// Descriptions
+// ---
+@descriptions-bg: @background-color-light;
+
+// Divider
+// ---
+@divider-color: rgba(255, 255, 255, 12%);
+
+// Modal
+// ---
+@modal-header-bg: @popover-background;
+@modal-header-border-color-split: @border-color-split;
+@modal-content-bg: @popover-background;
+@modal-footer-border-color-split: @border-color-split;
+
+// Radio
+// ---
+@radio-solid-checked-color: @white;
+@radio-dot-disabled-color: fade(@white, 20%);
+
+// Radio buttons
+// ---
+@radio-disabled-button-checked-bg: fade(@white, 20%);
+@radio-disabled-button-checked-color: @disabled-color;
+
+// Layout
+// ---
+@layout-body-background: @body-background;
+@layout-header-background: @popover-background;
+@layout-trigger-background: #262626;
+
+// Input
+// ---
+@input-bg: transparent;
+@input-placeholder-color: fade(@white, 30%);
+@input-icon-color: fade(@white, 30%);
+@input-number-handler-active-bg: @item-hover-bg;
+@input-icon-hover-color: fade(@white, 85%);
+
+// Select
+// ---
+@select-background: transparent;
+@select-dropdown-bg: @popover-background;
+@select-clear-background: @component-background;
+@select-selection-item-bg: fade(@white, 8);
+@select-selection-item-border-color: @border-color-split;
+@select-multiple-disabled-background: @component-background;
+@select-multiple-item-disabled-color: #595959;
+@select-multiple-item-disabled-border-color: @popover-background;
+
+// Cascader
+// ---
+@cascader-bg: transparent;
+@cascader-menu-bg: @popover-background;
+@cascader-menu-border-color-split: @border-color-split;
+
+// Tooltip
+// ---
+// Tooltip background color
+@tooltip-bg: #434343;
+
+// Menu
+// ---
+// dark theme
+@menu-dark-inline-submenu-bg: @component-background;
+@menu-dark-bg: @popover-background;
+@menu-popup-bg: @popover-background;
+
+// Message
+// ---
+@message-notice-content-bg: @popover-background;
+
+// Notification
+@notification-bg: @popover-background;
+
+// LINK
+@link-hover-color: @primary-5;
+@link-active-color: @primary-7;
+
+// Table
+// --
+@table-header-bg: #1d1d1d;
+@table-body-sort-bg: fade(@white, 1%);
+@table-row-hover-bg: #262626;
+@table-header-cell-split-color: fade(@white, 8%);
+@table-header-sort-bg: #262626;
+@table-header-filter-active-bg: #434343;
+@table-header-sort-active-bg: #303030;
+@table-fixed-header-sort-active-bg: #222;
+@table-filter-btns-bg: @popover-background;
+@table-expanded-row-bg: @table-header-bg;
+@table-filter-dropdown-bg: @popover-background;
+@table-expand-icon-bg: transparent;
+
+// Tag
+// ---
+@info-color-deprecated-bg: @primary-1;
+@info-color-deprecated-border: @primary-3;
+@success-color-deprecated-bg: @green-1;
+@success-color-deprecated-border: @green-3;
+@warning-color-deprecated-bg: @orange-1;
+@warning-color-deprecated-border: @orange-3;
+@error-color-deprecated-bg: @red-1;
+@error-color-deprecated-border: @red-3;
+
+// TimePicker
+// ---
+@picker-basic-cell-hover-with-range-color: darken(@primary-color, 35%);
+@picker-basic-cell-disabled-bg: #303030;
+@picker-border-color: @border-color-split;
+@picker-bg: transparent;
+@picker-date-hover-range-border-color: darken(@primary-color, 20%);
+
+// Dropdown
+// ---
+@dropdown-menu-bg: @popover-background;
+@dropdown-menu-submenu-disabled-bg: transparent;
+
+// Steps
+// ---
+@steps-nav-arrow-color: fade(@white, 20%);
+@steps-background: transparent;
+
+// Avatar
+// ---
+@avatar-bg: fade(@white, 30%);
+
+// Progress
+// ---
+@progress-steps-item-bg: fade(@white, 8%);
+
+// Calendar
+// ---
+@calendar-bg: @popover-background;
+@calendar-input-bg: @calendar-bg;
+@calendar-border-color: transparent;
+@calendar-full-bg: @component-background;
+
+// Badge
+// ---
+@badge-text-color: @white;
+
+// Popover
+@popover-bg: @popover-background;
+
+// Drawer
+@drawer-bg: @popover-background;
+
+// Card
+// ---
+@card-actions-background: @component-background;
+@card-skeleton-bg: #303030;
+@card-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.64), 0 3px 6px 0 rgba(0, 0, 0, 0.48),
+  0 5px 12px 4px rgba(0, 0, 0, 0.36);
+
+// Transfer
+// ---
+@transfer-item-hover-bg: #262626;
+
+// Comment
+// ---
+@comment-bg: transparent;
+@comment-author-time-color: fade(@white, 30%);
+@comment-action-hover-color: fade(@white, 65%);
+
+// Rate
+// ---
+@rate-star-bg: fade(@white, 12%);
+
+// Switch
+// ---
+@switch-bg: @white;
+
+// Pagination
+// ---
+@pagination-item-bg: transparent;
+@pagination-item-bg-active: transparent;
+@pagination-item-link-bg: transparent;
+@pagination-item-disabled-bg-active: fade(@white, 25%);
+@pagination-item-disabled-color-active: @black;
+@pagination-item-input-bg: @pagination-item-bg;
+
+// PageHeader
+// ---
+@page-header-back-color: @icon-color;
+@page-header-ghost-bg: transparent;
+
+// Slider
+// ---
+@slider-rail-background-color: #262626;
+@slider-rail-background-color-hover: @border-color-base;
+@slider-dot-border-color: @border-color-split;
+@slider-dot-border-color-active: @primary-4;
+
+// Skeleton
+// ---
+@skeleton-to-color: fade(@white, 16%);
+
+// Alert
+// ---
+@alert-success-border-color: @green-3;
+@alert-success-bg-color: @green-1;
+@alert-success-icon-color: @success-color;
+@alert-info-border-color: @primary-3;
+@alert-info-bg-color: @primary-1;
+@alert-info-icon-color: @info-color;
+@alert-warning-border-color: @gold-3;
+@alert-warning-bg-color: @gold-1;
+@alert-warning-icon-color: @warning-color;
+@alert-error-border-color: @red-3;
+@alert-error-bg-color: @red-1;
+@alert-error-icon-color: @error-color;
+
+// Timeline
+// ---
+@timeline-color: @border-color-split;
+@timeline-dot-color: @primary-color;
+
+// Mentions
+// ---
+@mentions-dropdown-bg: @popover-background;
+
+// Segmented
+// ---
+@segmented-bg: fade(@black, 25%);
+@segmented-hover-bg: fade(@black, 45%);
+@segmented-selected-bg: #333333;
+@segmented-label-color: fade(@white, 65%);
+@segmented-label-hover-color: fade(@white, 85%);
diff --git a/src/styles/themes/default.less b/src/styles/themes/default.less
new file mode 100644
index 0000000..5c5b47f
--- /dev/null
+++ b/src/styles/themes/default.less
@@ -0,0 +1,1084 @@
+/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */
+@import '../color/colors';
+
+@theme: default;
+
+// The prefix to use on all css classes from ant.
+@ant-prefix: ant;
+
+// An override for the html selector for theme prefixes
+@html-selector: html;
+
+// [CSS-VARIABLE-REPLACE-BEGIN: html-variables]
+// [CSS-VARIABLE-REPLACE-END: html-variables]
+
+// -------- Colors -----------
+// >>> Primary
+@primary-color: @blue-6;
+@primary-color-hover: color(~`colorPalette('@{primary-color}', 5) `);
+@primary-color-active: color(~`colorPalette('@{primary-color}', 7) `);
+@primary-color-outline: fade(@primary-color, @outline-fade);
+
+@processing-color: @blue-6;
+
+// >>> Info
+@info-color: @primary-color;
+@info-color-deprecated-bg: color(~`colorPalette('@{info-color}', 1) `);
+@info-color-deprecated-border: color(~`colorPalette('@{info-color}', 3) `);
+
+// >>> Success
+@success-color: @green-6;
+@success-color-hover: color(~`colorPalette('@{success-color}', 5) `);
+@success-color-active: color(~`colorPalette('@{success-color}', 7) `);
+@success-color-outline: fade(@success-color, @outline-fade);
+@success-color-deprecated-bg: color(~`colorPalette('@{success-color}', 1) `);
+@success-color-deprecated-border: color(~`colorPalette('@{success-color}', 3) `);
+
+// >>> Warning
+@warning-color: @gold-6;
+@warning-color-hover: color(~`colorPalette('@{warning-color}', 5) `);
+@warning-color-active: color(~`colorPalette('@{warning-color}', 7) `);
+@warning-color-outline: fade(@warning-color, @outline-fade);
+@warning-color-deprecated-bg: color(~`colorPalette('@{warning-color}', 1) `);
+@warning-color-deprecated-border: color(~`colorPalette('@{warning-color}', 3) `);
+
+// >>> Error
+@error-color: @red-5;
+@error-color-hover: color(~`colorPalette('@{error-color}', 5) `);
+@error-color-active: color(~`colorPalette('@{error-color}', 7) `);
+@error-color-outline: fade(@error-color, @outline-fade);
+@error-color-deprecated-bg: color(~`colorPalette('@{error-color}', 1) `);
+@error-color-deprecated-border: color(~`colorPalette('@{error-color}', 3) `);
+
+@highlight-color: @red-5;
+@normal-color: #d9d9d9;
+@white: #fff;
+@black: #000;
+
+// Color used by default to control hover and active backgrounds and for
+// alert info backgrounds.
+@primary-1: color(~`colorPalette('@{primary-color}', 1) `); // replace tint(@primary-color, 90%)
+@primary-2: color(~`colorPalette('@{primary-color}', 2) `); // replace tint(@primary-color, 80%)
+@primary-3: color(~`colorPalette('@{primary-color}', 3) `); // unused
+@primary-4: color(~`colorPalette('@{primary-color}', 4) `); // unused
+@primary-5: color(
+  ~`colorPalette('@{primary-color}', 5) `
+); // color used to control the text color in many active and hover states, replace tint(@primary-color, 20%)
+@primary-6: @primary-color; // color used to control the text color of active buttons, don't use, use @primary-color
+@primary-7: color(~`colorPalette('@{primary-color}', 7) `); // replace shade(@primary-color, 5%)
+@primary-8: color(~`colorPalette('@{primary-color}', 8) `); // unused
+@primary-9: color(~`colorPalette('@{primary-color}', 9) `); // unused
+@primary-10: color(~`colorPalette('@{primary-color}', 10) `); // unused
+
+// Base Scaffolding Variables
+// ---
+
+// Background color for `<body>`
+@body-background: #fff;
+// Base background color for most components
+@component-background: #fff;
+// Popover background color
+@popover-background: @component-background;
+@popover-customize-border-color: @border-color-split;
+@font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,
+  'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
+  'Noto Color Emoji';
+@code-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
+@text-color: fade(@black, 85%);
+@text-color-secondary: fade(@black, 45%);
+@text-color-inverse: @white;
+@icon-color: inherit;
+@icon-color-hover: fade(@black, 75%);
+@heading-color: fade(@black, 85%);
+@text-color-dark: fade(@white, 85%);
+@text-color-secondary-dark: fade(@white, 65%);
+@text-selection-bg: @primary-color;
+@font-variant-base: tabular-nums;
+@font-feature-settings-base: 'tnum';
+@font-size-base: 14px;
+@font-size-lg: @font-size-base + 2px;
+@font-size-sm: 12px;
+@heading-1-size: ceil(@font-size-base * 2.71);
+@heading-2-size: ceil(@font-size-base * 2.14);
+@heading-3-size: ceil(@font-size-base * 1.71);
+@heading-4-size: ceil(@font-size-base * 1.42);
+@heading-5-size: ceil(@font-size-base * 1.14);
+// https://github.com/ant-design/ant-design/issues/20210
+@line-height-base: 1.5715;
+@border-radius-base: 2px;
+@border-radius-sm: 2px;
+
+// control border
+@control-border-radius: @border-radius-base;
+
+// arrow border
+@arrow-border-radius: 2px;
+
+// vertical paddings
+@padding-lg: 24px; // containers
+@padding-md: 16px; // small containers and buttons
+@padding-sm: 12px; // Form controls and items
+@padding-xs: 8px; // small items
+@padding-xss: 4px; // more small
+
+// vertical padding for all form controls
+@control-padding-horizontal: @padding-sm;
+@control-padding-horizontal-sm: @padding-xs;
+
+// vertical margins
+@margin-lg: 24px; // containers
+@margin-md: 16px; // small containers and buttons
+@margin-sm: 12px; // Form controls and items
+@margin-xs: 8px; // small items
+@margin-xss: 4px; // more small
+
+// height rules
+@height-base: 32px;
+@height-lg: 40px;
+@height-sm: 24px;
+
+// The background colors for active and hover states for things like
+// list items or table cells.
+@item-active-bg: @primary-1;
+@item-hover-bg: #f5f5f5;
+
+// ICONFONT
+@iconfont-css-prefix: anticon;
+
+// LINK
+@link-color: @primary-color;
+@link-hover-color: color(~`colorPalette('@{link-color}', 5) `);
+@link-active-color: color(~`colorPalette('@{link-color}', 7) `);
+@link-decoration: none;
+@link-hover-decoration: none;
+@link-focus-decoration: none;
+@link-focus-outline: 0;
+
+// Animation
+@ease-base-out: cubic-bezier(0.7, 0.3, 0.1, 1);
+@ease-base-in: cubic-bezier(0.9, 0, 0.3, 0.7);
+@ease-out: cubic-bezier(0.215, 0.61, 0.355, 1);
+@ease-in: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+@ease-in-out: cubic-bezier(0.645, 0.045, 0.355, 1);
+@ease-out-back: cubic-bezier(0.12, 0.4, 0.29, 1.46);
+@ease-in-back: cubic-bezier(0.71, -0.46, 0.88, 0.6);
+@ease-in-out-back: cubic-bezier(0.71, -0.46, 0.29, 1.46);
+@ease-out-circ: cubic-bezier(0.08, 0.82, 0.17, 1);
+@ease-in-circ: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+@ease-in-out-circ: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+@ease-out-quint: cubic-bezier(0.23, 1, 0.32, 1);
+@ease-in-quint: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+@ease-in-out-quint: cubic-bezier(0.86, 0, 0.07, 1);
+
+// Border color
+@border-color-base: hsv(0, 0, 85%); // base border outline a component
+@border-color-split: hsv(0, 0, 94%); // split border inside a component
+@border-color-inverse: @white;
+@border-width-base: 1px; // width of the border for a component
+@border-style-base: solid; // style of a components border
+
+// Outline
+@outline-blur-size: 0;
+@outline-width: 2px;
+@outline-color: @primary-color; // No use anymore
+@outline-fade: 20%;
+
+@background-color-light: hsv(0, 0, 98%); // background of header and selected item
+@background-color-base: hsv(0, 0, 96%); // Default grey background color
+
+// Disabled states
+@disabled-color: fade(#000, 25%);
+@disabled-bg: @background-color-base;
+@disabled-active-bg: tint(@black, 90%);
+@disabled-color-dark: fade(#fff, 35%);
+
+// Shadow
+@shadow-color: rgba(0, 0, 0, 0.15);
+@shadow-color-inverse: @component-background;
+@box-shadow-base: @shadow-2;
+@shadow-1-up: 0 -6px 16px -8px rgba(0, 0, 0, 0.08), 0 -9px 28px 0 rgba(0, 0, 0, 0.05),
+  0 -12px 48px 16px rgba(0, 0, 0, 0.03);
+@shadow-1-down: 0 6px 16px -8px rgba(0, 0, 0, 0.08), 0 9px 28px 0 rgba(0, 0, 0, 0.05),
+  0 12px 48px 16px rgba(0, 0, 0, 0.03);
+@shadow-1-left: -6px 0 16px -8px rgba(0, 0, 0, 0.08), -9px 0 28px 0 rgba(0, 0, 0, 0.05),
+  -12px 0 48px 16px rgba(0, 0, 0, 0.03);
+@shadow-1-right: 6px 0 16px -8px rgba(0, 0, 0, 0.08), 9px 0 28px 0 rgba(0, 0, 0, 0.05),
+  12px 0 48px 16px rgba(0, 0, 0, 0.03);
+@shadow-2: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08),
+  0 9px 28px 8px rgba(0, 0, 0, 0.05);
+
+// Buttons
+@btn-font-weight: 400;
+@btn-border-radius-base: @border-radius-base;
+@btn-border-radius-sm: @border-radius-base;
+@btn-border-width: @border-width-base;
+@btn-border-style: @border-style-base;
+@btn-shadow: 0 2px 0 rgba(0, 0, 0, 0.015);
+@btn-primary-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);
+@btn-text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);
+
+@btn-primary-color: #fff;
+@btn-primary-bg: @primary-color;
+
+@btn-default-color: @text-color;
+@btn-default-bg: @component-background;
+@btn-default-border: @border-color-base;
+
+@btn-danger-color: #fff;
+@btn-danger-bg: @error-color;
+@btn-danger-border: @error-color;
+
+@btn-disable-color: @disabled-color;
+@btn-disable-bg: @disabled-bg;
+@btn-disable-border: @border-color-base;
+
+@btn-default-ghost-color: @component-background;
+@btn-default-ghost-bg: transparent;
+@btn-default-ghost-border: @component-background;
+
+@btn-font-size-lg: @font-size-lg;
+@btn-font-size-sm: @font-size-base;
+@btn-padding-horizontal-base: @padding-md - 1px;
+@btn-padding-horizontal-lg: @btn-padding-horizontal-base;
+@btn-padding-horizontal-sm: @padding-xs - 1px;
+
+@btn-height-base: @height-base;
+@btn-height-lg: @height-lg;
+@btn-height-sm: @height-sm;
+
+@btn-line-height: @line-height-base;
+
+@btn-circle-size: @btn-height-base;
+@btn-circle-size-lg: @btn-height-lg;
+@btn-circle-size-sm: @btn-height-sm;
+
+@btn-square-size: @btn-height-base;
+@btn-square-size-lg: @btn-height-lg;
+@btn-square-size-sm: @btn-height-sm;
+@btn-square-only-icon-size: @font-size-base + 2px;
+@btn-square-only-icon-size-sm: @font-size-base;
+@btn-square-only-icon-size-lg: @btn-font-size-lg + 2px;
+
+@btn-group-border: @primary-5;
+
+@btn-link-hover-bg: transparent;
+@btn-text-hover-bg: rgba(0, 0, 0, 0.018);
+
+// Checkbox
+@checkbox-size: 16px;
+@checkbox-color: @primary-color;
+@checkbox-check-color: #fff;
+@checkbox-check-bg: @checkbox-check-color;
+@checkbox-border-width: @border-width-base;
+@checkbox-border-radius: @border-radius-sm;
+@checkbox-group-item-margin-right: 8px;
+
+// Descriptions
+@descriptions-bg: #fafafa;
+@descriptions-title-margin-bottom: 20px;
+@descriptions-default-padding: @padding-md @padding-lg;
+@descriptions-middle-padding: @padding-sm @padding-lg;
+@descriptions-small-padding: @padding-xs @padding-md;
+@descriptions-item-padding-bottom: @padding-md;
+@descriptions-item-trailing-colon: true;
+@descriptions-item-label-colon-margin-right: 8px;
+@descriptions-item-label-colon-margin-left: 2px;
+@descriptions-extra-color: @text-color;
+
+// Divider
+@divider-text-padding: 1em;
+@divider-orientation-margin: 5%;
+@divider-color: rgba(0, 0, 0, 6%);
+@divider-vertical-gutter: 8px;
+
+// Dropdown
+@dropdown-selected-color: @primary-color;
+@dropdown-menu-submenu-disabled-bg: @component-background;
+@dropdown-selected-bg: @item-active-bg;
+
+// Empty
+@empty-font-size: @font-size-base;
+
+// Radio
+@radio-size: 16px;
+@radio-top: 0.2em;
+@radio-border-width: 1px;
+@radio-dot-size: @radio-size - 8px;
+@radio-dot-color: @primary-color;
+@radio-dot-disabled-color: fade(@black, 20%);
+@radio-solid-checked-color: @component-background;
+
+// Radio buttons
+@radio-button-bg: @btn-default-bg;
+@radio-button-checked-bg: @btn-default-bg;
+@radio-button-color: @btn-default-color;
+@radio-button-hover-color: @primary-5;
+@radio-button-active-color: @primary-7;
+@radio-button-padding-horizontal: @padding-md - 1px;
+@radio-disabled-button-checked-bg: @disabled-active-bg;
+@radio-disabled-button-checked-color: @disabled-color;
+@radio-wrapper-margin-right: 8px;
+
+// Media queries breakpoints
+// @screen-xs and @screen-xs-min is not used in Grid
+// smallest break point is @screen-md
+@screen-xs: 480px;
+@screen-xs-min: @screen-xs;
+// 👆 Extra small screen / phone
+
+// 👇 Small screen / tablet
+@screen-sm: 576px;
+@screen-sm-min: @screen-sm;
+
+// Medium screen / desktop
+@screen-md: 768px;
+@screen-md-min: @screen-md;
+
+// Large screen / wide desktop
+@screen-lg: 992px;
+@screen-lg-min: @screen-lg;
+
+// Extra large screen / full hd
+@screen-xl: 1200px;
+@screen-xl-min: @screen-xl;
+
+// Extra extra large screen / large desktop
+@screen-xxl: 1600px;
+@screen-xxl-min: @screen-xxl;
+
+// provide a maximum
+@screen-xs-max: (@screen-sm-min - 1px);
+@screen-sm-max: (@screen-md-min - 1px);
+@screen-md-max: (@screen-lg-min - 1px);
+@screen-lg-max: (@screen-xl-min - 1px);
+@screen-xl-max: (@screen-xxl-min - 1px);
+
+// Grid system
+@grid-columns: 24;
+
+// Layout
+@layout-body-background: #f0f2f5;
+@layout-header-background: #001529;
+@layout-header-height: 64px;
+@layout-header-padding: 0 50px;
+@layout-header-color: @text-color;
+@layout-footer-padding: 24px 50px;
+@layout-footer-background: @layout-body-background;
+@layout-sider-background: @layout-header-background;
+@layout-trigger-height: 48px;
+@layout-trigger-background: #002140;
+@layout-trigger-color: #fff;
+@layout-zero-trigger-width: 36px;
+@layout-zero-trigger-height: 42px;
+// Layout light theme
+@layout-sider-background-light: #fff;
+@layout-trigger-background-light: #fff;
+@layout-trigger-color-light: @text-color;
+
+// z-index list, order by `z-index`
+@zindex-badge: auto;
+@zindex-table-fixed: 2;
+@zindex-affix: 10;
+@zindex-back-top: 10;
+@zindex-picker-panel: 10;
+@zindex-popup-close: 10;
+@zindex-modal: 1000;
+@zindex-modal-mask: 1000;
+@zindex-message: 1010;
+@zindex-notification: 1010;
+@zindex-popover: 1030;
+@zindex-dropdown: 1050;
+@zindex-picker: 1050;
+@zindex-popoconfirm: 1060;
+@zindex-tooltip: 1070;
+@zindex-image: 1080;
+
+// Animation
+@animation-duration-slow: 0.3s; // Modal
+@animation-duration-base: 0.2s;
+@animation-duration-fast: 0.1s; // Tooltip
+
+//CollapsePanel
+@collapse-panel-border-radius: @border-radius-base;
+
+//Dropdown
+@dropdown-menu-bg: @component-background;
+@dropdown-vertical-padding: 5px;
+@dropdown-edge-child-vertical-padding: 4px;
+@dropdown-font-size: @font-size-base;
+@dropdown-line-height: 22px;
+
+// Form
+// ---
+@label-required-color: @highlight-color;
+@label-color: @heading-color;
+@form-warning-input-bg: @input-bg;
+@form-item-margin-bottom: 24px;
+@form-item-trailing-colon: true;
+@form-vertical-label-padding: 0 0 8px;
+@form-vertical-label-margin: 0;
+@form-item-label-font-size: @font-size-base;
+@form-item-label-height: @input-height-base;
+@form-item-label-colon-margin-right: 8px;
+@form-item-label-colon-margin-left: 2px;
+@form-error-input-bg: @input-bg;
+
+// Input
+// ---
+@input-height-base: @height-base;
+@input-height-lg: @height-lg;
+@input-height-sm: @height-sm;
+@input-padding-horizontal: @control-padding-horizontal - 1px;
+@input-padding-horizontal-base: @input-padding-horizontal;
+@input-padding-horizontal-sm: @control-padding-horizontal-sm - 1px;
+@input-padding-horizontal-lg: @input-padding-horizontal;
+@input-padding-vertical-base: max(
+  (round(((@input-height-base - @font-size-base * @line-height-base) / 2) * 10) / 10) -
+    @border-width-base,
+  3px
+);
+@input-padding-vertical-sm: max(
+  (round(((@input-height-sm - @font-size-base * @line-height-base) / 2) * 10) / 10) -
+    @border-width-base,
+  0
+);
+@input-padding-vertical-lg: (
+    ceil(((@input-height-lg - @font-size-lg * @line-height-base) / 2) * 10) / 10
+  ) - @border-width-base;
+@input-placeholder-color: hsv(0, 0, 75%);
+@input-color: @text-color;
+@input-icon-color: @input-color;
+@input-border-color: @border-color-base;
+@input-bg: @component-background;
+@input-number-hover-border-color: @input-hover-border-color;
+@input-number-handler-active-bg: #f4f4f4;
+@input-number-handler-hover-bg: @primary-5;
+@input-number-handler-bg: @component-background;
+@input-number-handler-border-color: @border-color-base;
+@input-addon-bg: @background-color-light;
+@input-hover-border-color: @primary-5;
+@input-disabled-bg: @disabled-bg;
+@input-outline-offset: 0 0;
+@input-icon-hover-color: fade(@black, 85%);
+@input-disabled-color: @disabled-color;
+
+// Mentions
+// ---
+@mentions-dropdown-bg: @component-background;
+@mentions-dropdown-menu-item-hover-bg: @mentions-dropdown-bg;
+
+// Select
+// ---
+@select-border-color: @border-color-base;
+@select-item-selected-color: @text-color;
+@select-item-selected-font-weight: 600;
+@select-dropdown-bg: @component-background;
+@select-item-selected-bg: @primary-1;
+@select-item-active-bg: @item-hover-bg;
+@select-dropdown-vertical-padding: @dropdown-vertical-padding;
+@select-dropdown-font-size: @dropdown-font-size;
+@select-dropdown-line-height: @dropdown-line-height;
+@select-dropdown-height: 32px;
+@select-background: @component-background;
+@select-clear-background: @select-background;
+@select-selection-item-bg: @background-color-base;
+@select-selection-item-border-color: @border-color-split;
+@select-single-item-height-lg: 40px;
+@select-multiple-item-height: @input-height-base - @input-padding-vertical-base * 2; // Normal 24px
+@select-multiple-item-height-lg: 32px;
+@select-multiple-item-spacing-half: ceil((@input-padding-vertical-base / 2));
+@select-multiple-disabled-background: @input-disabled-bg;
+@select-multiple-item-disabled-color: #bfbfbf;
+@select-multiple-item-disabled-border-color: @select-border-color;
+
+// Cascader
+// ---
+@cascader-bg: @component-background;
+@cascader-item-selected-bg: @primary-1;
+@cascader-menu-bg: @component-background;
+@cascader-menu-border-color-split: @border-color-split;
+
+// Cascader
+// ----
+@cascader-dropdown-vertical-padding: @dropdown-vertical-padding;
+@cascader-dropdown-edge-child-vertical-padding: @dropdown-edge-child-vertical-padding;
+@cascader-dropdown-font-size: @dropdown-font-size;
+@cascader-dropdown-line-height: @dropdown-line-height;
+
+// Anchor
+// ---
+@anchor-bg: transparent;
+@anchor-border-color: @border-color-split;
+@anchor-link-top: 4px;
+@anchor-link-left: 16px;
+@anchor-link-padding: @anchor-link-top 0 @anchor-link-top @anchor-link-left;
+
+// Tooltip
+// ---
+// Tooltip max width
+@tooltip-max-width: 250px;
+// Tooltip text color
+@tooltip-color: #fff;
+// Tooltip background color
+@tooltip-bg: rgba(0, 0, 0, 0.75);
+// Tooltip arrow width
+@tooltip-arrow-width: 8px * sqrt(2);
+// Tooltip distance with trigger
+@tooltip-distance: @tooltip-arrow-width - 1px + 4px;
+// Tooltip arrow color
+@tooltip-arrow-color: @tooltip-bg;
+@tooltip-border-radius: @border-radius-base;
+
+// Popover
+// ---
+// Popover body background color
+@popover-bg: @component-background;
+// Popover text color
+@popover-color: @text-color;
+// Popover maximum width
+@popover-min-width: 177px;
+@popover-min-height: 32px;
+// Popover arrow width
+@popover-arrow-width: @tooltip-arrow-width;
+// Popover arrow color
+@popover-arrow-color: @popover-bg;
+// Popover outer arrow width
+// Popover outer arrow color
+@popover-arrow-outer-color: @popover-bg;
+// Popover distance with trigger
+@popover-distance: @popover-arrow-width + 4px;
+@popover-padding-horizontal: @padding-md;
+
+// Modal
+// --
+@modal-header-padding-vertical: @padding-md;
+@modal-header-padding-horizontal: @padding-lg;
+@modal-body-padding: @padding-lg;
+@modal-header-bg: @component-background;
+@modal-header-padding: @modal-header-padding-vertical @modal-header-padding-horizontal;
+@modal-header-border-width: @border-width-base;
+@modal-header-border-style: @border-style-base;
+@modal-header-title-line-height: 22px;
+@modal-header-title-font-size: @font-size-lg;
+@modal-header-border-color-split: @border-color-split;
+@modal-header-close-size: @modal-header-title-line-height + 2 * @modal-header-padding-vertical;
+@modal-content-bg: @component-background;
+@modal-heading-color: @heading-color;
+@modal-close-color: @text-color-secondary;
+@modal-footer-bg: transparent;
+@modal-footer-border-color-split: @border-color-split;
+@modal-footer-border-style: @border-style-base;
+@modal-footer-padding-vertical: 10px;
+@modal-footer-padding-horizontal: 16px;
+@modal-footer-border-width: @border-width-base;
+@modal-mask-bg: fade(@black, 45%);
+@modal-confirm-body-padding: 32px 32px 24px;
+@modal-confirm-title-font-size: @font-size-lg;
+@modal-border-radius: @border-radius-base;
+
+// Progress
+// --
+@progress-default-color: @processing-color;
+@progress-remaining-color: @background-color-base;
+@progress-info-text-color: @progress-text-color;
+@progress-radius: 100px;
+@progress-steps-item-bg: #f3f3f3;
+@progress-text-font-size: 1em;
+@progress-text-color: @text-color; // This is for circle text color, should be renamed better
+@progress-circle-text-font-size: 1em;
+// Menu
+// ---
+@menu-inline-toplevel-item-height: 40px;
+@menu-item-height: 40px;
+@menu-item-group-height: @line-height-base;
+@menu-collapsed-width: 80px;
+@menu-bg: @component-background;
+@menu-popup-bg: @component-background;
+@menu-item-color: @text-color;
+@menu-inline-submenu-bg: @background-color-light;
+@menu-highlight-color: @primary-color;
+@menu-highlight-danger-color: @error-color;
+@menu-item-active-bg: @primary-1;
+@menu-item-active-danger-bg: @red-1;
+@menu-item-active-border-width: 3px;
+@menu-item-group-title-color: @text-color-secondary;
+@menu-item-vertical-margin: 4px;
+@menu-item-font-size: @font-size-base;
+@menu-item-boundary-margin: 8px;
+@menu-item-padding-horizontal: 20px;
+@menu-item-padding: 0 @menu-item-padding-horizontal;
+@menu-horizontal-line-height: 46px;
+@menu-icon-margin-right: 10px;
+@menu-icon-size: @menu-item-font-size;
+@menu-icon-size-lg: @font-size-lg;
+@menu-item-group-title-font-size: @menu-item-font-size;
+
+// dark theme
+@menu-dark-color: @text-color-secondary-dark;
+@menu-dark-danger-color: @error-color;
+@menu-dark-bg: @layout-header-background;
+@menu-dark-arrow-color: #fff;
+@menu-dark-inline-submenu-bg: #000c17;
+@menu-dark-highlight-color: #fff;
+@menu-dark-item-active-bg: @primary-color;
+@menu-dark-item-active-danger-bg: @error-color;
+@menu-dark-selected-item-icon-color: @white;
+@menu-dark-selected-item-text-color: @white;
+@menu-dark-item-hover-bg: transparent;
+// Spin
+// ---
+@spin-dot-size-sm: 14px;
+@spin-dot-size: 20px;
+@spin-dot-size-lg: 32px;
+
+// Table
+// --
+@table-bg: @component-background;
+@table-header-bg: @background-color-light;
+@table-header-color: @heading-color;
+@table-header-sort-bg: @background-color-base;
+@table-body-sort-bg: #fafafa;
+@table-row-hover-bg: @background-color-light;
+@table-selected-row-color: inherit;
+@table-selected-row-bg: @primary-1;
+@table-body-selected-sort-bg: @table-selected-row-bg;
+@table-selected-row-hover-bg: darken(@table-selected-row-bg, 2%);
+@table-expanded-row-bg: #fbfbfb;
+@table-padding-vertical: 16px;
+@table-padding-horizontal: 16px;
+@table-padding-vertical-md: (@table-padding-vertical * 3 / 4);
+@table-padding-horizontal-md: (@table-padding-horizontal / 2);
+@table-padding-vertical-sm: (@table-padding-vertical / 2);
+@table-padding-horizontal-sm: (@table-padding-horizontal / 2);
+@table-border-color: @border-color-split;
+@table-border-radius-base: @border-radius-base;
+@table-footer-bg: @background-color-light;
+@table-footer-color: @heading-color;
+@table-header-bg-sm: @table-header-bg;
+@table-font-size: @font-size-base;
+@table-font-size-md: @table-font-size;
+@table-font-size-sm: @table-font-size;
+@table-header-cell-split-color: rgba(0, 0, 0, 0.06);
+// Sorter
+// Legacy: `table-header-sort-active-bg` is used for hover not real active
+@table-header-sort-active-bg: rgba(0, 0, 0, 0.04);
+@table-fixed-header-sort-active-bg: hsv(0, 0, 96%);
+
+// Filter
+@table-header-filter-active-bg: rgba(0, 0, 0, 0.04);
+@table-filter-btns-bg: inherit;
+@table-filter-dropdown-bg: @component-background;
+@table-expand-icon-bg: @component-background;
+@table-selection-column-width: 32px;
+// Sticky
+@table-sticky-scroll-bar-bg: fade(#000, 35%);
+@table-sticky-scroll-bar-radius: 4px;
+
+// Tag
+// --
+@tag-border-radius: @border-radius-base;
+@tag-default-bg: @background-color-light;
+@tag-default-color: @text-color;
+@tag-font-size: @font-size-sm;
+@tag-line-height: 20px;
+
+// TimePicker
+// ---
+@picker-bg: @component-background;
+@picker-basic-cell-hover-color: @item-hover-bg;
+@picker-basic-cell-active-with-range-color: @primary-1;
+@picker-basic-cell-hover-with-range-color: lighten(@primary-color, 35%);
+@picker-basic-cell-disabled-bg: rgba(0, 0, 0, 0.04);
+@picker-border-color: @border-color-split;
+@picker-date-hover-range-border-color: lighten(@primary-color, 20%);
+@picker-date-hover-range-color: @picker-basic-cell-hover-with-range-color;
+@picker-time-panel-column-width: 56px;
+@picker-time-panel-column-height: 224px;
+@picker-time-panel-cell-height: 28px;
+@picker-panel-cell-height: 24px;
+@picker-panel-cell-width: 36px;
+@picker-text-height: 40px;
+@picker-panel-without-time-cell-height: 66px;
+
+// Calendar
+// ---
+@calendar-bg: @component-background;
+@calendar-input-bg: @input-bg;
+@calendar-border-color: @border-color-inverse;
+@calendar-item-active-bg: @item-active-bg;
+@calendar-column-active-bg: fade(@calendar-item-active-bg, 20%);
+@calendar-full-bg: @calendar-bg;
+@calendar-full-panel-bg: @calendar-full-bg;
+
+// Carousel
+// ---
+@carousel-dot-width: 16px;
+@carousel-dot-height: 3px;
+@carousel-dot-active-width: 24px;
+
+// Badge
+// ---
+@badge-height: 20px;
+@badge-height-sm: 14px;
+@badge-dot-size: 6px;
+@badge-font-size: @font-size-sm;
+@badge-font-size-sm: @font-size-sm;
+@badge-font-weight: normal;
+@badge-status-size: 6px;
+@badge-text-color: @component-background;
+@badge-color: @highlight-color;
+
+// Rate
+// ---
+@rate-star-color: @yellow-6;
+@rate-star-bg: @border-color-split;
+@rate-star-size: 20px;
+@rate-star-hover-scale: scale(1.1);
+
+// Card
+// ---
+@card-head-color: @heading-color;
+@card-head-background: transparent;
+@card-head-font-size: @font-size-lg;
+@card-head-font-size-sm: @font-size-base;
+@card-head-padding: 16px;
+@card-head-padding-sm: (@card-head-padding / 2);
+@card-head-height: 48px;
+@card-head-height-sm: 36px;
+@card-inner-head-padding: 12px;
+@card-padding-base: 24px;
+@card-padding-base-sm: (@card-padding-base / 2);
+@card-actions-background: @component-background;
+@card-actions-li-margin: 12px 0;
+@card-skeleton-bg: #cfd8dc;
+@card-background: @component-background;
+@card-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12),
+  0 5px 12px 4px rgba(0, 0, 0, 0.09);
+@card-radius: @border-radius-base;
+@card-head-tabs-margin-bottom: -17px;
+@card-head-extra-color: @text-color;
+
+// Comment
+// ---
+@comment-bg: inherit;
+@comment-padding-base: @padding-md 0;
+@comment-nest-indent: 44px;
+@comment-font-size-base: @font-size-base;
+@comment-font-size-sm: @font-size-sm;
+@comment-author-name-color: @text-color-secondary;
+@comment-author-time-color: #ccc;
+@comment-action-color: @text-color-secondary;
+@comment-action-hover-color: #595959;
+@comment-actions-margin-bottom: inherit;
+@comment-actions-margin-top: @margin-sm;
+@comment-content-detail-p-margin-bottom: inherit;
+
+// Tabs
+// ---
+@tabs-card-head-background: @background-color-light;
+@tabs-card-height: 40px;
+@tabs-card-active-color: @primary-color;
+@tabs-card-horizontal-padding: (
+    (@tabs-card-height - floor(@font-size-base * @line-height-base)) / 2
+  ) - @border-width-base @padding-md;
+@tabs-card-horizontal-padding-sm: 6px @padding-md;
+@tabs-card-horizontal-padding-lg: 7px @padding-md 6px;
+@tabs-title-font-size: @font-size-base;
+@tabs-title-font-size-lg: @font-size-lg;
+@tabs-title-font-size-sm: @font-size-base;
+@tabs-ink-bar-color: @primary-color;
+@tabs-bar-margin: 0 0 @margin-md 0;
+@tabs-horizontal-gutter: 32px;
+@tabs-horizontal-margin: 0 0 0 @tabs-horizontal-gutter;
+@tabs-horizontal-margin-rtl: 0 0 0 32px;
+@tabs-horizontal-padding: @padding-sm 0;
+@tabs-horizontal-padding-lg: @padding-md 0;
+@tabs-horizontal-padding-sm: @padding-xs 0;
+@tabs-vertical-padding: @padding-xs @padding-lg;
+@tabs-vertical-margin: @margin-md 0 0 0;
+@tabs-scrolling-size: 32px;
+@tabs-highlight-color: @primary-color;
+@tabs-hover-color: @primary-5;
+@tabs-active-color: @primary-7;
+@tabs-card-gutter: 2px;
+@tabs-card-tab-active-border-top: 2px solid transparent;
+
+// BackTop
+// ---
+@back-top-color: #fff;
+@back-top-bg: @text-color-secondary;
+@back-top-hover-bg: @text-color;
+
+// Avatar
+// ---
+@avatar-size-base: 32px;
+@avatar-size-lg: 40px;
+@avatar-size-sm: 24px;
+@avatar-font-size-base: 18px;
+@avatar-font-size-lg: 24px;
+@avatar-font-size-sm: 14px;
+@avatar-bg: #ccc;
+@avatar-color: #fff;
+@avatar-border-radius: @border-radius-base;
+@avatar-group-overlapping: -8px;
+@avatar-group-space: 3px;
+@avatar-group-border-color: #fff;
+
+// Switch
+// ---
+@switch-height: 22px;
+@switch-sm-height: 16px;
+@switch-min-width: 44px;
+@switch-sm-min-width: 28px;
+@switch-disabled-opacity: 0.4;
+@switch-color: @primary-color;
+@switch-bg: @component-background;
+@switch-shadow-color: fade(#00230b, 20%);
+@switch-padding: 2px;
+@switch-inner-margin-min: ceil(@switch-height * 0.3);
+@switch-inner-margin-max: ceil(@switch-height * 1.1);
+@switch-sm-inner-margin-min: ceil(@switch-sm-height * 0.3);
+@switch-sm-inner-margin-max: ceil(@switch-sm-height * 1.1);
+
+// Pagination
+// ---
+@pagination-item-bg: @component-background;
+@pagination-item-size: @height-base;
+@pagination-item-size-sm: 24px;
+@pagination-font-family: @font-family;
+@pagination-font-weight-active: 500;
+@pagination-item-bg-active: @component-background;
+@pagination-item-link-bg: @component-background;
+@pagination-item-disabled-color-active: @disabled-color;
+@pagination-item-disabled-bg-active: @disabled-active-bg;
+@pagination-item-input-bg: @component-background;
+@pagination-mini-options-size-changer-top: 0px;
+
+// PageHeader
+// ---
+@page-header-padding: @padding-lg;
+@page-header-padding-vertical: @padding-md;
+@page-header-padding-breadcrumb: @padding-sm;
+@page-header-content-padding-vertical: @padding-sm;
+@page-header-back-color: #000;
+@page-header-ghost-bg: inherit;
+@page-header-heading-title: @heading-4-size;
+@page-header-heading-sub-title: 14px;
+@page-header-tabs-tab-font-size: 16px;
+
+// Breadcrumb
+// ---
+@breadcrumb-base-color: @text-color-secondary;
+@breadcrumb-last-item-color: @text-color;
+@breadcrumb-font-size: @font-size-base;
+@breadcrumb-icon-font-size: @font-size-base;
+@breadcrumb-link-color: @text-color-secondary;
+@breadcrumb-link-color-hover: @text-color;
+@breadcrumb-separator-color: @text-color-secondary;
+@breadcrumb-separator-margin: 0 @padding-xs;
+
+// Slider
+// ---
+@slider-margin: 10px 6px 10px;
+@slider-rail-background-color: @background-color-base;
+@slider-rail-background-color-hover: #e1e1e1;
+@slider-track-background-color: @primary-3;
+@slider-track-background-color-hover: @primary-4;
+@slider-handle-border-width: 2px;
+@slider-handle-background-color: @component-background;
+@slider-handle-color: @primary-3;
+@slider-handle-color-hover: @primary-4;
+@slider-handle-color-focus: tint(@primary-color, 20%);
+@slider-handle-color-focus-shadow: fade(@primary-color, 12%);
+@slider-handle-color-tooltip-open: @primary-color;
+@slider-handle-size: 14px;
+@slider-handle-margin-top: -5px;
+@slider-handle-margin-left: -5px;
+@slider-handle-shadow: 0;
+@slider-dot-border-color: @border-color-split;
+@slider-dot-border-color-active: tint(@primary-color, 50%);
+@slider-disabled-color: @disabled-color;
+@slider-disabled-background-color: @component-background;
+
+// Tree
+// ---
+@tree-bg: @component-background;
+@tree-title-height: 24px;
+@tree-child-padding: 18px;
+@tree-directory-selected-color: #fff;
+@tree-directory-selected-bg: @primary-color;
+@tree-node-hover-bg: @item-hover-bg;
+@tree-node-selected-bg: @primary-2;
+
+// Collapse
+// ---
+@collapse-header-padding: @padding-sm @padding-md;
+@collapse-header-padding-extra: 40px;
+@collapse-header-bg: @background-color-light;
+@collapse-content-padding: @padding-md;
+@collapse-content-bg: @component-background;
+@collapse-header-arrow-left: 16px;
+
+// Skeleton
+// ---
+@skeleton-color: rgba(190, 190, 190, 0.2);
+@skeleton-to-color: shade(@skeleton-color, 5%);
+@skeleton-paragraph-margin-top: 28px;
+@skeleton-paragraph-li-margin-top: @margin-md;
+@skeleton-paragraph-li-height: 16px;
+@skeleton-title-height: 16px;
+@skeleton-title-paragraph-margin-top: @margin-lg;
+
+// Transfer
+// ---
+@transfer-header-height: 40px;
+@transfer-item-height: @height-base;
+@transfer-disabled-bg: @disabled-bg;
+@transfer-list-height: 200px;
+@transfer-item-hover-bg: @item-hover-bg;
+@transfer-item-selected-hover-bg: darken(@item-active-bg, 2%);
+@transfer-item-padding-vertical: 6px;
+@transfer-list-search-icon-top: 12px;
+
+// Message
+// ---
+@message-notice-content-padding: 10px 16px;
+@message-notice-content-bg: @component-background;
+// Motion
+// ---
+@wave-animation-width: 6px;
+
+// Alert
+// ---
+@alert-success-border-color: ~`colorPalette('@{success-color}', 3) `;
+@alert-success-bg-color: ~`colorPalette('@{success-color}', 1) `;
+@alert-success-icon-color: @success-color;
+@alert-info-border-color: ~`colorPalette('@{info-color}', 3) `;
+@alert-info-bg-color: ~`colorPalette('@{info-color}', 1) `;
+@alert-info-icon-color: @info-color;
+@alert-warning-border-color: ~`colorPalette('@{warning-color}', 3) `;
+@alert-warning-bg-color: ~`colorPalette('@{warning-color}', 1) `;
+@alert-warning-icon-color: @warning-color;
+@alert-error-border-color: ~`colorPalette('@{error-color}', 3) `;
+@alert-error-bg-color: ~`colorPalette('@{error-color}', 1) `;
+@alert-error-icon-color: @error-color;
+@alert-message-color: @heading-color;
+@alert-text-color: @text-color;
+@alert-close-color: @text-color-secondary;
+@alert-close-hover-color: @icon-color-hover;
+@alert-padding-vertical: @padding-xs;
+@alert-padding-horizontal: @padding-md - 1px;
+@alert-no-icon-padding-vertical: @padding-xs;
+@alert-with-description-no-icon-padding-vertical: @padding-md - 1px;
+@alert-with-description-padding-vertical: @padding-md - 1px;
+@alert-with-description-padding: @alert-with-description-padding-vertical 15px
+  @alert-with-description-no-icon-padding-vertical @alert-with-description-icon-size;
+@alert-icon-top: 8px + @font-size-base * (@line-height-base / 2) - (@font-size-base / 2);
+@alert-with-description-icon-size: 24px;
+
+// List
+// ---
+@list-header-background: transparent;
+@list-footer-background: transparent;
+@list-empty-text-padding: @padding-md;
+@list-item-padding: @padding-sm 0;
+@list-item-padding-sm: @padding-xs @padding-md;
+@list-item-padding-lg: 16px 24px;
+@list-item-meta-margin-bottom: @padding-md;
+@list-item-meta-avatar-margin-right: @padding-md;
+@list-item-meta-title-margin-bottom: @padding-sm;
+@list-customize-card-bg: @component-background;
+@list-item-meta-description-font-size: @font-size-base;
+
+// Statistic
+// ---
+@statistic-title-font-size: @font-size-base;
+@statistic-content-font-size: 24px;
+@statistic-unit-font-size: 24px;
+@statistic-font-family: @font-family;
+
+// Drawer
+// ---
+@drawer-header-padding: @padding-md @padding-lg;
+@drawer-body-padding: @padding-lg;
+@drawer-bg: @component-background;
+@drawer-footer-padding-vertical: @modal-footer-padding-vertical;
+@drawer-footer-padding-horizontal: @modal-footer-padding-horizontal;
+@drawer-header-close-size: 56px;
+@drawer-title-font-size: @font-size-lg;
+@drawer-title-line-height: 22px;
+
+// Timeline
+// ---
+@timeline-width: 2px;
+@timeline-color: @border-color-split;
+@timeline-dot-border-width: 2px;
+@timeline-dot-color: @primary-color;
+@timeline-dot-bg: @component-background;
+@timeline-item-padding-bottom: 20px;
+
+// Typography
+// ---
+@typography-title-font-weight: 600;
+@typography-title-margin-top: 1.2em;
+@typography-title-margin-bottom: 0.5em;
+
+// Upload
+// ---
+@upload-actions-color: @text-color-secondary;
+
+// Steps
+// ---
+@process-tail-color: @border-color-split;
+@steps-nav-arrow-color: fade(@black, 25%);
+@steps-background: @component-background;
+@steps-icon-size: 32px;
+@steps-icon-custom-size: @steps-icon-size;
+@steps-icon-custom-top: 0px;
+@steps-icon-custom-font-size: 24px;
+@steps-icon-top: -0.5px;
+@steps-icon-font-size: @font-size-lg;
+@steps-icon-margin: 0 8px 0 0;
+@steps-title-line-height: @height-base;
+@steps-small-icon-size: 24px;
+@steps-small-icon-margin: 0 8px 0 0;
+@steps-dot-size: 8px;
+@steps-dot-top: 2px;
+@steps-current-dot-size: 10px;
+@steps-description-max-width: 140px;
+@steps-nav-content-max-width: auto;
+@steps-vertical-icon-width: 16px;
+@steps-vertical-tail-width: 16px;
+@steps-vertical-tail-width-sm: 12px;
+
+// Notification
+// ---
+@notification-bg: @component-background;
+@notification-padding-vertical: 16px;
+@notification-padding-horizontal: 24px;
+
+// Result
+// ---
+@result-title-font-size: 24px;
+@result-subtitle-font-size: @font-size-base;
+@result-icon-font-size: 72px;
+@result-extra-margin: 24px 0 0 0;
+
+// Image
+// ---
+@image-size-base: 48px;
+@image-font-size-base: 24px;
+@image-bg: #f5f5f5;
+@image-color: #fff;
+@image-mask-font-size: 16px;
+@image-preview-operation-size: 18px;
+@image-preview-operation-color: @text-color-dark;
+@image-preview-operation-disabled-color: fade(@image-preview-operation-color, 25%);
+
+// Segmented
+// ---
+@segmented-bg: fade(@black, 4%);
+@segmented-hover-bg: fade(@black, 6%);
+@segmented-selected-bg: @white;
+@segmented-label-color: fade(@black, 65%);
+@segmented-label-hover-color: #262626;
diff --git a/src/styles/themes/index.less b/src/styles/themes/index.less
new file mode 100644
index 0000000..fd29f58
--- /dev/null
+++ b/src/styles/themes/index.less
@@ -0,0 +1,7 @@
+// Default using variable as entry to support site variable version
+// This will be replaced in webpack bundle
+// @root-entry-name: variable;
+
+// @import './default.less';
+// @import './variable.less';
+@import './@{root-entry-name}.less';
diff --git a/src/styles/themes/variable.less b/src/styles/themes/variable.less
new file mode 100644
index 0000000..3a8e45e
--- /dev/null
+++ b/src/styles/themes/variable.less
@@ -0,0 +1,1139 @@
+/* stylelint-disable at-rule-empty-line-before,at-rule-name-space-after,at-rule-no-unknown */
+@import '../color/colors';
+
+@theme: variable;
+
+// The prefix to use on all css classes from ant.
+@ant-prefix: ant;
+
+// An override for the html selector for theme prefixes
+@html-selector: html;
+
+@{html-selector} {
+  @base-primary: @blue-6;
+
+  // ========= Primary Color =========
+  --@{ant-prefix}-primary-color: @base-primary;
+  --@{ant-prefix}-primary-color-hover: color(~`colorPalette('@{base-primary}', 5) `);
+  --@{ant-prefix}-primary-color-active: color(~`colorPalette('@{base-primary}', 7) `);
+  --@{ant-prefix}-primary-color-outline: fade(@base-primary, @outline-fade);
+
+  // Legacy
+  @legacy-primary-1: color(~`colorPalette('@{base-primary}', 1) `);
+
+  --@{ant-prefix}-primary-1: @legacy-primary-1;
+  --@{ant-prefix}-primary-2: color(~`colorPalette('@{base-primary}', 2) `);
+  --@{ant-prefix}-primary-3: color(~`colorPalette('@{base-primary}', 3) `);
+  --@{ant-prefix}-primary-4: color(~`colorPalette('@{base-primary}', 4) `);
+  --@{ant-prefix}-primary-5: color(~`colorPalette('@{base-primary}', 5) `);
+  --@{ant-prefix}-primary-6: @base-primary;
+  --@{ant-prefix}-primary-7: color(~`colorPalette('@{base-primary}', 7) `);
+
+  // Deprecated
+  --@{ant-prefix}-primary-color-deprecated-pure: ~'';
+  --@{ant-prefix}-primary-color-deprecated-l-35: lighten(@base-primary, 35%);
+  --@{ant-prefix}-primary-color-deprecated-l-20: lighten(@base-primary, 20%);
+  --@{ant-prefix}-primary-color-deprecated-t-20: tint(@base-primary, 20%);
+  --@{ant-prefix}-primary-color-deprecated-t-50: tint(@base-primary, 50%);
+  --@{ant-prefix}-primary-color-deprecated-f-12: fade(@base-primary, 12%);
+  --@{ant-prefix}-primary-color-active-deprecated-f-30: fade(@legacy-primary-1, 30%);
+  --@{ant-prefix}-primary-color-active-deprecated-d-02: darken(@legacy-primary-1, 2%);
+
+  // ========= Success Color =========
+  --@{ant-prefix}-success-color: @green-6;
+  --@{ant-prefix}-success-color-hover: color(~`colorPalette('@{green-6}', 5) `);
+  --@{ant-prefix}-success-color-active: color(~`colorPalette('@{green-6}', 7) `);
+  --@{ant-prefix}-success-color-outline: fade(@green-6, @outline-fade);
+  --@{ant-prefix}-success-color-deprecated-bg: ~`colorPalette('@{green-6}', 1) `;
+  --@{ant-prefix}-success-color-deprecated-border: ~`colorPalette('@{green-6}', 3) `;
+
+  // ========== Error Color ==========
+  --@{ant-prefix}-error-color: @red-5;
+  --@{ant-prefix}-error-color-hover: color(~`colorPalette('@{red-5}', 5) `);
+  --@{ant-prefix}-error-color-active: color(~`colorPalette('@{red-5}', 7) `);
+  --@{ant-prefix}-error-color-outline: fade(@red-5, @outline-fade);
+  --@{ant-prefix}-error-color-deprecated-bg: ~`colorPalette('@{red-5}', 1) `;
+  --@{ant-prefix}-error-color-deprecated-border: ~`colorPalette('@{red-5}', 3) `;
+
+  // ========= Warning Color =========
+  --@{ant-prefix}-warning-color: @gold-6;
+  --@{ant-prefix}-warning-color-hover: color(~`colorPalette('@{gold-6}', 5) `);
+  --@{ant-prefix}-warning-color-active: color(~`colorPalette('@{gold-6}', 7) `);
+  --@{ant-prefix}-warning-color-outline: fade(@gold-6, @outline-fade);
+  --@{ant-prefix}-warning-color-deprecated-bg: ~`colorPalette('@{gold-6}', 1) `;
+  --@{ant-prefix}-warning-color-deprecated-border: ~`colorPalette('@{gold-6}', 3) `;
+
+  // ========== Info Color ===========
+  --@{ant-prefix}-info-color: @base-primary;
+  --@{ant-prefix}-info-color-deprecated-bg: ~`colorPalette('@{base-primary}', 1) `;
+  --@{ant-prefix}-info-color-deprecated-border: ~`colorPalette('@{base-primary}', 3) `;
+}
+
+// -------- Colors -----------
+// >>> Primary
+@primary-color: ~'var(--@{ant-prefix}-primary-color)';
+@primary-color-hover: ~'var(--@{ant-prefix}-primary-color-hover)';
+@primary-color-active: ~'var(--@{ant-prefix}-primary-color-active)';
+@primary-color-outline: ~'var(--@{ant-prefix}-primary-color-outline)';
+
+@processing-color: @primary-color;
+
+// >>> Info
+@info-color: ~'var(--@{ant-prefix}-info-color)';
+@info-color-deprecated-bg: ~'var(--@{ant-prefix}-info-color-deprecated-bg)';
+@info-color-deprecated-border: ~'var(--@{ant-prefix}-info-color-deprecated-border)';
+
+// >>> Success
+@success-color: ~'var(--@{ant-prefix}-success-color)';
+@success-color-hover: ~'var(--@{ant-prefix}-success-color-hover)';
+@success-color-active: ~'var(--@{ant-prefix}-success-color-active)';
+@success-color-outline: ~'var(--@{ant-prefix}-success-color-outline)';
+@success-color-deprecated-bg: ~'var(--@{ant-prefix}-success-color-deprecated-bg)';
+@success-color-deprecated-border: ~'var(--@{ant-prefix}-success-color-deprecated-border)';
+
+// >>> Warning
+@warning-color: ~'var(--@{ant-prefix}-warning-color)';
+@warning-color-hover: ~'var(--@{ant-prefix}-warning-color-hover)';
+@warning-color-active: ~'var(--@{ant-prefix}-warning-color-active)';
+@warning-color-outline: ~'var(--@{ant-prefix}-warning-color-outline)';
+@warning-color-deprecated-bg: ~'var(--@{ant-prefix}-warning-color-deprecated-bg)';
+@warning-color-deprecated-border: ~'var(--@{ant-prefix}-warning-color-deprecated-border)';
+
+// >>> Error
+@error-color: ~'var(--@{ant-prefix}-error-color)';
+@error-color-hover: ~'var(--@{ant-prefix}-error-color-hover)';
+@error-color-active: ~'var(--@{ant-prefix}-error-color-active)';
+@error-color-outline: ~'var(--@{ant-prefix}-error-color-outline)';
+@error-color-deprecated-bg: ~'var(--@{ant-prefix}-error-color-deprecated-bg)';
+@error-color-deprecated-border: ~'var(--@{ant-prefix}-error-color-deprecated-border)';
+
+@highlight-color: @red-5;
+@normal-color: #d9d9d9;
+@white: #fff;
+@black: #000;
+
+// Color used by default to control hover and active backgrounds and for
+// alert info backgrounds.
+@primary-1: ~'var(--@{ant-prefix}-primary-1)'; // replace tint(@primary-color, 90%)
+@primary-2: ~'var(--@{ant-prefix}-primary-2)'; // replace tint(@primary-color, 80%)
+@primary-3: ~'var(--@{ant-prefix}-primary-3)'; // unused
+@primary-4: ~'var(--@{ant-prefix}-primary-4)'; // unused
+@primary-5: ~'var(--@{ant-prefix}-primary-5)'; // color used to control the text color in many active and hover states, replace tint(@primary-color, 20%)
+@primary-6: ~'var(--@{ant-prefix}-primary-6)'; // color used to control the text color of active buttons, don't use, use @primary-color
+@primary-7: ~'var(--@{ant-prefix}-primary-7)'; // replace shade(@primary-color, 5%)
+@primary-8: color(~`colorPalette('@{primary-color}', 8) `); // unused
+@primary-9: color(~`colorPalette('@{primary-color}', 9) `); // unused
+@primary-10: color(~`colorPalette('@{primary-color}', 10) `); // unused
+
+// Base Scaffolding Variables
+// ---
+
+// Background color for `<body>`
+@body-background: #fff;
+// Base background color for most components
+@component-background: #fff;
+// Popover background color
+@popover-background: @component-background;
+@popover-customize-border-color: @border-color-split;
+@font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial,
+  'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol',
+  'Noto Color Emoji';
+@code-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
+@text-color: fade(@black, 85%);
+@text-color-secondary: fade(@black, 45%);
+@text-color-inverse: @white;
+@icon-color: inherit;
+@icon-color-hover: fade(@black, 75%);
+@heading-color: fade(@black, 85%);
+@text-color-dark: fade(@white, 85%);
+@text-color-secondary-dark: fade(@white, 65%);
+@text-selection-bg: @primary-color;
+@font-variant-base: tabular-nums;
+@font-feature-settings-base: 'tnum';
+@font-size-base: 14px;
+@font-size-lg: @font-size-base + 2px;
+@font-size-sm: 12px;
+@heading-1-size: ceil(@font-size-base * 2.71);
+@heading-2-size: ceil(@font-size-base * 2.14);
+@heading-3-size: ceil(@font-size-base * 1.71);
+@heading-4-size: ceil(@font-size-base * 1.42);
+@heading-5-size: ceil(@font-size-base * 1.14);
+// https://github.com/ant-design/ant-design/issues/20210
+@line-height-base: 1.5715;
+@border-radius-base: 2px;
+@border-radius-sm: 2px;
+
+// control border
+@control-border-radius: @border-radius-base;
+
+// arrow border
+@arrow-border-radius: @border-radius-sm;
+
+// vertical paddings
+@padding-lg: 24px; // containers
+@padding-md: 16px; // small containers and buttons
+@padding-sm: 12px; // Form controls and items
+@padding-xs: 8px; // small items
+@padding-xss: 4px; // more small
+
+// vertical padding for all form controls
+@control-padding-horizontal: @padding-sm;
+@control-padding-horizontal-sm: @padding-xs;
+
+// vertical margins
+@margin-lg: 24px; // containers
+@margin-md: 16px; // small containers and buttons
+@margin-sm: 12px; // Form controls and items
+@margin-xs: 8px; // small items
+@margin-xss: 4px; // more small
+
+// height rules
+@height-base: 32px;
+@height-lg: 40px;
+@height-sm: 24px;
+
+// The background colors for active and hover states for things like
+// list items or table cells.
+@item-active-bg: @primary-1;
+@item-hover-bg: #f5f5f5;
+
+// ICONFONT
+@iconfont-css-prefix: anticon;
+
+// LINK
+@link-color: @primary-color;
+@link-hover-color: @primary-color-hover;
+@link-active-color: @primary-color-active;
+@link-decoration: none;
+@link-hover-decoration: none;
+@link-focus-decoration: none;
+@link-focus-outline: 0;
+
+// Animation
+@ease-base-out: cubic-bezier(0.7, 0.3, 0.1, 1);
+@ease-base-in: cubic-bezier(0.9, 0, 0.3, 0.7);
+@ease-out: cubic-bezier(0.215, 0.61, 0.355, 1);
+@ease-in: cubic-bezier(0.55, 0.055, 0.675, 0.19);
+@ease-in-out: cubic-bezier(0.645, 0.045, 0.355, 1);
+@ease-out-back: cubic-bezier(0.12, 0.4, 0.29, 1.46);
+@ease-in-back: cubic-bezier(0.71, -0.46, 0.88, 0.6);
+@ease-in-out-back: cubic-bezier(0.71, -0.46, 0.29, 1.46);
+@ease-out-circ: cubic-bezier(0.08, 0.82, 0.17, 1);
+@ease-in-circ: cubic-bezier(0.6, 0.04, 0.98, 0.34);
+@ease-in-out-circ: cubic-bezier(0.78, 0.14, 0.15, 0.86);
+@ease-out-quint: cubic-bezier(0.23, 1, 0.32, 1);
+@ease-in-quint: cubic-bezier(0.755, 0.05, 0.855, 0.06);
+@ease-in-out-quint: cubic-bezier(0.86, 0, 0.07, 1);
+
+// Border color
+@border-color-base: hsv(0, 0, 85%); // base border outline a component
+@border-color-split: rgba(0, 0, 0, 0.06); // split border inside a component
+@border-color-inverse: @white;
+@border-width-base: 1px; // width of the border for a component
+@border-style-base: solid; // style of a components border
+
+// Outline
+@outline-blur-size: 0;
+@outline-width: 2px;
+@outline-color: @primary-color; // No use anymore
+@outline-fade: 20%;
+
+@background-color-light: hsv(0, 0, 98%); // background of header and selected item
+@background-color-base: hsv(0, 0, 96%); // Default grey background color
+
+// Disabled states
+@disabled-color: fade(#000, 25%);
+@disabled-bg: @background-color-base;
+@disabled-active-bg: tint(@black, 90%);
+@disabled-color-dark: fade(#fff, 35%);
+
+// Shadow
+@shadow-color: rgba(0, 0, 0, 0.15);
+@shadow-color-inverse: @component-background;
+@box-shadow-base: @shadow-2;
+@shadow-1-up: 0 -6px 16px -8px rgba(0, 0, 0, 0.08), 0 -9px 28px 0 rgba(0, 0, 0, 0.05),
+  0 -12px 48px 16px rgba(0, 0, 0, 0.03);
+@shadow-1-down: 0 6px 16px -8px rgba(0, 0, 0, 0.08), 0 9px 28px 0 rgba(0, 0, 0, 0.05),
+  0 12px 48px 16px rgba(0, 0, 0, 0.03);
+@shadow-1-left: -6px 0 16px -8px rgba(0, 0, 0, 0.08), -9px 0 28px 0 rgba(0, 0, 0, 0.05),
+  -12px 0 48px 16px rgba(0, 0, 0, 0.03);
+@shadow-1-right: 6px 0 16px -8px rgba(0, 0, 0, 0.08), 9px 0 28px 0 rgba(0, 0, 0, 0.05),
+  12px 0 48px 16px rgba(0, 0, 0, 0.03);
+@shadow-2: 0 3px 6px -4px rgba(0, 0, 0, 0.12), 0 6px 16px 0 rgba(0, 0, 0, 0.08),
+  0 9px 28px 8px rgba(0, 0, 0, 0.05);
+
+// Buttons
+@btn-font-weight: 400;
+@btn-border-radius-base: @border-radius-base;
+@btn-border-radius-sm: @border-radius-base;
+@btn-border-width: @border-width-base;
+@btn-border-style: @border-style-base;
+@btn-shadow: 0 2px 0 rgba(0, 0, 0, 0.015);
+@btn-primary-shadow: 0 2px 0 rgba(0, 0, 0, 0.045);
+@btn-text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.12);
+
+@btn-primary-color: #fff;
+@btn-primary-bg: @primary-color;
+
+@btn-default-color: @text-color;
+@btn-default-bg: @component-background;
+@btn-default-border: @border-color-base;
+
+@btn-danger-color: #fff;
+@btn-danger-bg: @error-color;
+@btn-danger-border: @error-color;
+
+@btn-disable-color: @disabled-color;
+@btn-disable-bg: @disabled-bg;
+@btn-disable-border: @border-color-base;
+
+@btn-default-ghost-color: @component-background;
+@btn-default-ghost-bg: transparent;
+@btn-default-ghost-border: @component-background;
+
+@btn-font-size-lg: @font-size-lg;
+@btn-font-size-sm: @font-size-base;
+@btn-padding-horizontal-base: @padding-md - 1px;
+@btn-padding-horizontal-lg: @btn-padding-horizontal-base;
+@btn-padding-horizontal-sm: @padding-xs - 1px;
+
+@btn-height-base: @height-base;
+@btn-height-lg: @height-lg;
+@btn-height-sm: @height-sm;
+
+@btn-line-height: @line-height-base;
+
+@btn-circle-size: @btn-height-base;
+@btn-circle-size-lg: @btn-height-lg;
+@btn-circle-size-sm: @btn-height-sm;
+
+@btn-square-size: @btn-height-base;
+@btn-square-size-lg: @btn-height-lg;
+@btn-square-size-sm: @btn-height-sm;
+@btn-square-only-icon-size: @font-size-base + 2px;
+@btn-square-only-icon-size-sm: @font-size-base;
+@btn-square-only-icon-size-lg: @btn-font-size-lg + 2px;
+
+@btn-group-border: @primary-5;
+
+@btn-link-hover-bg: transparent;
+@btn-text-hover-bg: rgba(0, 0, 0, 0.018);
+
+// Checkbox
+@checkbox-size: 16px;
+@checkbox-color: @primary-color;
+@checkbox-check-color: #fff;
+@checkbox-check-bg: @checkbox-check-color;
+@checkbox-border-width: @border-width-base;
+@checkbox-border-radius: @border-radius-sm;
+@checkbox-group-item-margin-right: 8px;
+
+// Descriptions
+@descriptions-bg: #fafafa;
+@descriptions-title-margin-bottom: 20px;
+@descriptions-default-padding: @padding-md @padding-lg;
+@descriptions-middle-padding: @padding-sm @padding-lg;
+@descriptions-small-padding: @padding-xs @padding-md;
+@descriptions-item-padding-bottom: @padding-md;
+@descriptions-item-trailing-colon: true;
+@descriptions-item-label-colon-margin-right: 8px;
+@descriptions-item-label-colon-margin-left: 2px;
+@descriptions-extra-color: @text-color;
+
+// Divider
+@divider-text-padding: 1em;
+@divider-orientation-margin: 5%;
+@divider-color: rgba(0, 0, 0, 6%);
+@divider-vertical-gutter: 8px;
+
+// Dropdown
+@dropdown-selected-color: @primary-color;
+@dropdown-menu-submenu-disabled-bg: @component-background;
+@dropdown-selected-bg: @item-active-bg;
+
+// Empty
+@empty-font-size: @font-size-base;
+
+// Radio
+@radio-size: 16px;
+@radio-top: 0.2em;
+@radio-border-width: 1px;
+@radio-dot-size: @radio-size - 8px;
+@radio-dot-color: @primary-color;
+@radio-dot-disabled-color: fade(@black, 20%);
+@radio-solid-checked-color: @component-background;
+
+// Radio buttons
+@radio-button-bg: @btn-default-bg;
+@radio-button-checked-bg: @btn-default-bg;
+@radio-button-color: @btn-default-color;
+@radio-button-hover-color: @primary-5;
+@radio-button-active-color: @primary-7;
+@radio-button-padding-horizontal: @padding-md - 1px;
+@radio-disabled-button-checked-bg: @disabled-active-bg;
+@radio-disabled-button-checked-color: @disabled-color;
+@radio-wrapper-margin-right: 8px;
+
+// Media queries breakpoints
+// @screen-xs and @screen-xs-min is not used in Grid
+// smallest break point is @screen-md
+@screen-xs: 480px;
+@screen-xs-min: @screen-xs;
+// 👆 Extra small screen / phone
+
+// 👇 Small screen / tablet
+@screen-sm: 576px;
+@screen-sm-min: @screen-sm;
+
+// Medium screen / desktop
+@screen-md: 768px;
+@screen-md-min: @screen-md;
+
+// Large screen / wide desktop
+@screen-lg: 992px;
+@screen-lg-min: @screen-lg;
+
+// Extra large screen / full hd
+@screen-xl: 1200px;
+@screen-xl-min: @screen-xl;
+
+// Extra extra large screen / large desktop
+@screen-xxl: 1600px;
+@screen-xxl-min: @screen-xxl;
+
+// provide a maximum
+@screen-xs-max: (@screen-sm-min - 1px);
+@screen-sm-max: (@screen-md-min - 1px);
+@screen-md-max: (@screen-lg-min - 1px);
+@screen-lg-max: (@screen-xl-min - 1px);
+@screen-xl-max: (@screen-xxl-min - 1px);
+
+// Grid system
+@grid-columns: 24;
+
+// Layout
+@layout-body-background: #f0f2f5;
+@layout-header-background: #001529;
+@layout-header-height: 64px;
+@layout-header-padding: 0 50px;
+@layout-header-color: @text-color;
+@layout-footer-padding: 24px 50px;
+@layout-footer-background: @layout-body-background;
+@layout-sider-background: @layout-header-background;
+@layout-trigger-height: 48px;
+@layout-trigger-background: #002140;
+@layout-trigger-color: #fff;
+@layout-zero-trigger-width: 36px;
+@layout-zero-trigger-height: 42px;
+// Layout light theme
+@layout-sider-background-light: #fff;
+@layout-trigger-background-light: #fff;
+@layout-trigger-color-light: @text-color;
+
+// z-index list, order by `z-index`
+@zindex-badge: auto;
+@zindex-table-fixed: 2;
+@zindex-affix: 10;
+@zindex-back-top: 10;
+@zindex-picker-panel: 10;
+@zindex-popup-close: 10;
+@zindex-modal: 1000;
+@zindex-modal-mask: 1000;
+@zindex-message: 1010;
+@zindex-notification: 1010;
+@zindex-popover: 1030;
+@zindex-dropdown: 1050;
+@zindex-picker: 1050;
+@zindex-popoconfirm: 1060;
+@zindex-tooltip: 1070;
+@zindex-image: 1080;
+
+// Animation
+@animation-duration-slow: 0.3s; // Modal
+@animation-duration-base: 0.2s;
+@animation-duration-fast: 0.1s; // Tooltip
+
+//CollapsePanel
+@collapse-panel-border-radius: @border-radius-base;
+
+//Dropdown
+@dropdown-menu-bg: @component-background;
+@dropdown-vertical-padding: 5px;
+@dropdown-edge-child-vertical-padding: 4px;
+@dropdown-font-size: @font-size-base;
+@dropdown-line-height: 22px;
+
+// Form
+// ---
+@label-required-color: @highlight-color;
+@label-color: @heading-color;
+@form-warning-input-bg: @input-bg;
+@form-item-margin-bottom: 24px;
+@form-item-trailing-colon: true;
+@form-vertical-label-padding: 0 0 8px;
+@form-vertical-label-margin: 0;
+@form-item-label-font-size: @font-size-base;
+@form-item-label-height: @input-height-base;
+@form-item-label-colon-margin-right: 8px;
+@form-item-label-colon-margin-left: 2px;
+@form-error-input-bg: @input-bg;
+
+// Input
+// ---
+@input-height-base: @height-base;
+@input-height-lg: @height-lg;
+@input-height-sm: @height-sm;
+@input-padding-horizontal: @control-padding-horizontal - 1px;
+@input-padding-horizontal-base: @input-padding-horizontal;
+@input-padding-horizontal-sm: @control-padding-horizontal-sm - 1px;
+@input-padding-horizontal-lg: @input-padding-horizontal;
+@input-padding-vertical-base: max(
+  (round(((@input-height-base - @font-size-base * @line-height-base) / 2) * 10) / 10) -
+    @border-width-base,
+  3px
+);
+@input-padding-vertical-sm: max(
+  (round(((@input-height-sm - @font-size-base * @line-height-base) / 2) * 10) / 10) -
+    @border-width-base,
+  0
+);
+@input-padding-vertical-lg: (
+    ceil(((@input-height-lg - @font-size-lg * @line-height-base) / 2) * 10) / 10
+  ) - @border-width-base;
+@input-placeholder-color: hsv(0, 0, 75%);
+@input-color: @text-color;
+@input-icon-color: @input-color;
+@input-border-color: @border-color-base;
+@input-bg: @component-background;
+@input-number-hover-border-color: @input-hover-border-color;
+@input-number-handler-active-bg: #f4f4f4;
+@input-number-handler-hover-bg: @primary-5;
+@input-number-handler-bg: @component-background;
+@input-number-handler-border-color: @border-color-base;
+@input-addon-bg: @background-color-light;
+@input-hover-border-color: @primary-5;
+@input-disabled-bg: @disabled-bg;
+@input-outline-offset: 0 0;
+@input-icon-hover-color: fade(@black, 85%);
+@input-disabled-color: @disabled-color;
+
+// Mentions
+// ---
+@mentions-dropdown-bg: @component-background;
+@mentions-dropdown-menu-item-hover-bg: @mentions-dropdown-bg;
+
+// Select
+// ---
+@select-border-color: @border-color-base;
+@select-item-selected-color: @text-color;
+@select-item-selected-font-weight: 600;
+@select-dropdown-bg: @component-background;
+@select-item-selected-bg: @primary-1;
+@select-item-active-bg: @item-hover-bg;
+@select-dropdown-vertical-padding: @dropdown-vertical-padding;
+@select-dropdown-font-size: @dropdown-font-size;
+@select-dropdown-line-height: @dropdown-line-height;
+@select-dropdown-height: 32px;
+@select-background: @component-background;
+@select-clear-background: @select-background;
+@select-selection-item-bg: @background-color-base;
+@select-selection-item-border-color: @border-color-split;
+@select-single-item-height-lg: 40px;
+@select-multiple-item-height: @input-height-base - @input-padding-vertical-base * 2; // Normal 24px
+@select-multiple-item-height-lg: 32px;
+@select-multiple-item-spacing-half: ceil((@input-padding-vertical-base / 2));
+@select-multiple-disabled-background: @input-disabled-bg;
+@select-multiple-item-disabled-color: #bfbfbf;
+@select-multiple-item-disabled-border-color: @select-border-color;
+
+// Cascader
+// ---
+@cascader-bg: @component-background;
+@cascader-item-selected-bg: @primary-1;
+@cascader-menu-bg: @component-background;
+@cascader-menu-border-color-split: @border-color-split;
+
+// Cascader
+// ----
+@cascader-dropdown-vertical-padding: @dropdown-vertical-padding;
+@cascader-dropdown-edge-child-vertical-padding: @dropdown-edge-child-vertical-padding;
+@cascader-dropdown-font-size: @dropdown-font-size;
+@cascader-dropdown-line-height: @dropdown-line-height;
+
+// Anchor
+// ---
+@anchor-bg: transparent;
+@anchor-border-color: @border-color-split;
+@anchor-link-top: 4px;
+@anchor-link-left: 16px;
+@anchor-link-padding: @anchor-link-top 0 @anchor-link-top @anchor-link-left;
+
+// Tooltip
+// ---
+// Tooltip max width
+@tooltip-max-width: 250px;
+// Tooltip text color
+@tooltip-color: #fff;
+// Tooltip background color
+@tooltip-bg: rgba(0, 0, 0, 0.75);
+// Tooltip arrow width
+@tooltip-arrow-width: 8px * sqrt(2);
+// Tooltip distance with trigger
+@tooltip-distance: @tooltip-arrow-width - 1px + 4px;
+// Tooltip arrow color
+@tooltip-arrow-color: @tooltip-bg;
+@tooltip-border-radius: @border-radius-base;
+
+// Popover
+// ---
+// Popover body background color
+@popover-bg: @component-background;
+// Popover text color
+@popover-color: @text-color;
+// Popover maximum width
+@popover-min-width: 177px;
+@popover-min-height: 32px;
+// Popover arrow width
+@popover-arrow-width: @tooltip-arrow-width;
+// Popover arrow color
+@popover-arrow-color: @popover-bg;
+// Popover outer arrow width
+// Popover outer arrow color
+@popover-arrow-outer-color: @popover-bg;
+// Popover distance with trigger
+@popover-distance: @popover-arrow-width + 4px;
+@popover-padding-horizontal: @padding-md;
+
+// Modal
+// --
+@modal-header-padding-vertical: @padding-md;
+@modal-header-padding-horizontal: @padding-lg;
+@modal-body-padding: @padding-lg;
+@modal-header-bg: @component-background;
+@modal-header-padding: @modal-header-padding-vertical @modal-header-padding-horizontal;
+@modal-header-border-width: @border-width-base;
+@modal-header-border-style: @border-style-base;
+@modal-header-title-line-height: 22px;
+@modal-header-title-font-size: @font-size-lg;
+@modal-header-border-color-split: @border-color-split;
+@modal-header-close-size: @modal-header-title-line-height + 2 * @modal-header-padding-vertical;
+@modal-content-bg: @component-background;
+@modal-heading-color: @heading-color;
+@modal-close-color: @text-color-secondary;
+@modal-footer-bg: transparent;
+@modal-footer-border-color-split: @border-color-split;
+@modal-footer-border-style: @border-style-base;
+@modal-footer-padding-vertical: 10px;
+@modal-footer-padding-horizontal: 16px;
+@modal-footer-border-width: @border-width-base;
+@modal-mask-bg: fade(@black, 45%);
+@modal-confirm-body-padding: 32px 32px 24px;
+@modal-confirm-title-font-size: @font-size-lg;
+@modal-border-radius: @border-radius-base;
+
+// Progress
+// --
+@progress-default-color: @processing-color;
+@progress-remaining-color: rgba(0, 0, 0, 0.04);
+@progress-info-text-color: @progress-text-color;
+@progress-radius: 100px;
+@progress-steps-item-bg: #f3f3f3;
+@progress-text-font-size: 1em;
+@progress-text-color: @text-color; // This is for circle text color, should be renamed better
+@progress-circle-text-font-size: 1em;
+// Menu
+// ---
+@menu-inline-toplevel-item-height: 40px;
+@menu-item-height: 40px;
+@menu-item-group-height: @line-height-base;
+@menu-collapsed-width: 80px;
+@menu-bg: @component-background;
+@menu-popup-bg: @component-background;
+@menu-item-color: @text-color;
+@menu-inline-submenu-bg: @background-color-light;
+@menu-highlight-color: @primary-color;
+@menu-highlight-danger-color: @error-color;
+@menu-item-active-bg: @primary-1;
+@menu-item-active-danger-bg: @red-1;
+@menu-item-active-border-width: 3px;
+@menu-item-group-title-color: @text-color-secondary;
+@menu-item-vertical-margin: 4px;
+@menu-item-font-size: @font-size-base;
+@menu-item-boundary-margin: 8px;
+@menu-item-padding-horizontal: 20px;
+@menu-item-padding: 0 @menu-item-padding-horizontal;
+@menu-horizontal-line-height: 46px;
+@menu-icon-margin-right: 10px;
+@menu-icon-size: @menu-item-font-size;
+@menu-icon-size-lg: @font-size-lg;
+@menu-item-group-title-font-size: @menu-item-font-size;
+
+// dark theme
+@menu-dark-color: @text-color-secondary-dark;
+@menu-dark-danger-color: @error-color;
+@menu-dark-bg: @layout-header-background;
+@menu-dark-arrow-color: #fff;
+@menu-dark-inline-submenu-bg: #000c17;
+@menu-dark-highlight-color: #fff;
+@menu-dark-item-active-bg: @primary-color;
+@menu-dark-item-active-danger-bg: @error-color;
+@menu-dark-selected-item-icon-color: @white;
+@menu-dark-selected-item-text-color: @white;
+@menu-dark-item-hover-bg: transparent;
+// Spin
+// ---
+@spin-dot-size-sm: 14px;
+@spin-dot-size: 20px;
+@spin-dot-size-lg: 32px;
+
+// Table
+// --
+@table-bg: @component-background;
+@table-header-bg: @background-color-light;
+@table-header-color: @heading-color;
+@table-header-sort-bg: @background-color-base;
+@table-body-sort-bg: #fafafa;
+@table-row-hover-bg: @background-color-light;
+@table-selected-row-color: inherit;
+@table-selected-row-bg: @primary-1;
+@table-body-selected-sort-bg: @table-selected-row-bg;
+@table-selected-row-hover-bg: ~'var(--@{ant-prefix}-primary-color-active-deprecated-d-02)';
+@table-expanded-row-bg: #fbfbfb;
+@table-padding-vertical: 16px;
+@table-padding-horizontal: 16px;
+@table-padding-vertical-md: (@table-padding-vertical * 3 / 4);
+@table-padding-horizontal-md: (@table-padding-horizontal / 2);
+@table-padding-vertical-sm: (@table-padding-vertical / 2);
+@table-padding-horizontal-sm: (@table-padding-horizontal / 2);
+@table-border-color: @border-color-split;
+@table-border-radius-base: @border-radius-base;
+@table-footer-bg: @background-color-light;
+@table-footer-color: @heading-color;
+@table-header-bg-sm: @table-header-bg;
+@table-font-size: @font-size-base;
+@table-font-size-md: @table-font-size;
+@table-font-size-sm: @table-font-size;
+@table-header-cell-split-color: rgba(0, 0, 0, 0.06);
+// Sorter
+// Legacy: `table-header-sort-active-bg` is used for hover not real active
+@table-header-sort-active-bg: rgba(0, 0, 0, 0.04);
+@table-fixed-header-sort-active-bg: hsv(0, 0, 96%);
+
+// Filter
+@table-header-filter-active-bg: rgba(0, 0, 0, 0.04);
+@table-filter-btns-bg: inherit;
+@table-filter-dropdown-bg: @component-background;
+@table-expand-icon-bg: @component-background;
+@table-selection-column-width: 32px;
+// Sticky
+@table-sticky-scroll-bar-bg: fade(#000, 35%);
+@table-sticky-scroll-bar-radius: 4px;
+
+// Tag
+// --
+@tag-border-radius: @border-radius-base;
+@tag-default-bg: @background-color-light;
+@tag-default-color: @text-color;
+@tag-font-size: @font-size-sm;
+@tag-line-height: 20px;
+
+// TimePicker
+// ---
+@picker-bg: @component-background;
+@picker-basic-cell-hover-color: @item-hover-bg;
+@picker-basic-cell-active-with-range-color: @primary-1;
+@picker-basic-cell-hover-with-range-color: ~'var(--@{ant-prefix}-primary-color-deprecated-l-35)';
+@picker-basic-cell-disabled-bg: rgba(0, 0, 0, 0.04);
+@picker-border-color: @border-color-split;
+@picker-date-hover-range-border-color: ~'var(--@{ant-prefix}-primary-color-deprecated-l-20)';
+@picker-date-hover-range-color: @picker-basic-cell-hover-with-range-color;
+@picker-time-panel-column-width: 56px;
+@picker-time-panel-column-height: 224px;
+@picker-time-panel-cell-height: 28px;
+@picker-panel-cell-height: 24px;
+@picker-panel-cell-width: 36px;
+@picker-text-height: 40px;
+@picker-panel-without-time-cell-height: 66px;
+
+// Calendar
+// ---
+@calendar-bg: @component-background;
+@calendar-input-bg: @input-bg;
+@calendar-border-color: @border-color-inverse;
+@calendar-item-active-bg: @item-active-bg;
+@calendar-column-active-bg: ~'var(--@{ant-prefix}-primary-color-active-deprecated-f-30)';
+@calendar-full-bg: @calendar-bg;
+@calendar-full-panel-bg: @calendar-full-bg;
+
+// Carousel
+// ---
+@carousel-dot-width: 16px;
+@carousel-dot-height: 3px;
+@carousel-dot-active-width: 24px;
+
+// Badge
+// ---
+@badge-height: 20px;
+@badge-height-sm: 14px;
+@badge-dot-size: 6px;
+@badge-font-size: @font-size-sm;
+@badge-font-size-sm: @font-size-sm;
+@badge-font-weight: normal;
+@badge-status-size: 6px;
+@badge-text-color: @component-background;
+@badge-color: @highlight-color;
+
+// Rate
+// ---
+@rate-star-color: @yellow-6;
+@rate-star-bg: @border-color-split;
+@rate-star-size: 20px;
+@rate-star-hover-scale: scale(1.1);
+
+// Card
+// ---
+@card-head-color: @heading-color;
+@card-head-background: transparent;
+@card-head-font-size: @font-size-lg;
+@card-head-font-size-sm: @font-size-base;
+@card-head-padding: 16px;
+@card-head-padding-sm: (@card-head-padding / 2);
+@card-head-height: 48px;
+@card-head-height-sm: 36px;
+@card-inner-head-padding: 12px;
+@card-padding-base: 24px;
+@card-padding-base-sm: (@card-padding-base / 2);
+@card-actions-background: @component-background;
+@card-actions-li-margin: 12px 0;
+@card-skeleton-bg: #cfd8dc;
+@card-background: @component-background;
+@card-shadow: 0 1px 2px -2px rgba(0, 0, 0, 0.16), 0 3px 6px 0 rgba(0, 0, 0, 0.12),
+  0 5px 12px 4px rgba(0, 0, 0, 0.09);
+@card-radius: @border-radius-base;
+@card-head-tabs-margin-bottom: -17px;
+@card-head-extra-color: @text-color;
+
+// Comment
+// ---
+@comment-bg: inherit;
+@comment-padding-base: @padding-md 0;
+@comment-nest-indent: 44px;
+@comment-font-size-base: @font-size-base;
+@comment-font-size-sm: @font-size-sm;
+@comment-author-name-color: @text-color-secondary;
+@comment-author-time-color: #ccc;
+@comment-action-color: @text-color-secondary;
+@comment-action-hover-color: #595959;
+@comment-actions-margin-bottom: inherit;
+@comment-actions-margin-top: @margin-sm;
+@comment-content-detail-p-margin-bottom: inherit;
+
+// Tabs
+// ---
+@tabs-card-head-background: @background-color-light;
+@tabs-card-height: 40px;
+@tabs-card-active-color: @primary-color;
+@tabs-card-horizontal-padding: (
+    (@tabs-card-height - floor(@font-size-base * @line-height-base)) / 2
+  ) - @border-width-base @padding-md;
+@tabs-card-horizontal-padding-sm: 6px @padding-md;
+@tabs-card-horizontal-padding-lg: 7px @padding-md 6px;
+@tabs-title-font-size: @font-size-base;
+@tabs-title-font-size-lg: @font-size-lg;
+@tabs-title-font-size-sm: @font-size-base;
+@tabs-ink-bar-color: @primary-color;
+@tabs-bar-margin: 0 0 @margin-md 0;
+@tabs-horizontal-gutter: 32px;
+@tabs-horizontal-margin: 0 0 0 @tabs-horizontal-gutter;
+@tabs-horizontal-margin-rtl: 0 0 0 32px;
+@tabs-horizontal-padding: @padding-sm 0;
+@tabs-horizontal-padding-lg: @padding-md 0;
+@tabs-horizontal-padding-sm: @padding-xs 0;
+@tabs-vertical-padding: @padding-xs @padding-lg;
+@tabs-vertical-margin: @margin-md 0 0 0;
+@tabs-scrolling-size: 32px;
+@tabs-highlight-color: @primary-color;
+@tabs-hover-color: @primary-5;
+@tabs-active-color: @primary-7;
+@tabs-card-gutter: 2px;
+@tabs-card-tab-active-border-top: 2px solid transparent;
+
+// BackTop
+// ---
+@back-top-color: #fff;
+@back-top-bg: @text-color-secondary;
+@back-top-hover-bg: @text-color;
+
+// Avatar
+// ---
+@avatar-size-base: 32px;
+@avatar-size-lg: 40px;
+@avatar-size-sm: 24px;
+@avatar-font-size-base: 18px;
+@avatar-font-size-lg: 24px;
+@avatar-font-size-sm: 14px;
+@avatar-bg: #ccc;
+@avatar-color: #fff;
+@avatar-border-radius: @border-radius-base;
+@avatar-group-overlapping: -8px;
+@avatar-group-space: 3px;
+@avatar-group-border-color: #fff;
+
+// Switch
+// ---
+@switch-height: 22px;
+@switch-sm-height: 16px;
+@switch-min-width: 44px;
+@switch-sm-min-width: 28px;
+@switch-disabled-opacity: 0.4;
+@switch-color: @primary-color;
+@switch-bg: @component-background;
+@switch-shadow-color: fade(#00230b, 20%);
+@switch-padding: 2px;
+@switch-inner-margin-min: ceil(@switch-height * 0.3);
+@switch-inner-margin-max: ceil(@switch-height * 1.1);
+@switch-sm-inner-margin-min: ceil(@switch-sm-height * 0.3);
+@switch-sm-inner-margin-max: ceil(@switch-sm-height * 1.1);
+
+// Pagination
+// ---
+@pagination-item-bg: @component-background;
+@pagination-item-size: @height-base;
+@pagination-item-size-sm: 24px;
+@pagination-font-family: @font-family;
+@pagination-font-weight-active: 500;
+@pagination-item-bg-active: @component-background;
+@pagination-item-link-bg: @component-background;
+@pagination-item-disabled-color-active: @disabled-color;
+@pagination-item-disabled-bg-active: @disabled-active-bg;
+@pagination-item-input-bg: @component-background;
+@pagination-mini-options-size-changer-top: 0px;
+
+// PageHeader
+// ---
+@page-header-padding: @padding-lg;
+@page-header-padding-vertical: @padding-md;
+@page-header-padding-breadcrumb: @padding-sm;
+@page-header-content-padding-vertical: @padding-sm;
+@page-header-back-color: #000;
+@page-header-ghost-bg: inherit;
+@page-header-heading-title: @heading-4-size;
+@page-header-heading-sub-title: 14px;
+@page-header-tabs-tab-font-size: 16px;
+
+// Breadcrumb
+// ---
+@breadcrumb-base-color: @text-color-secondary;
+@breadcrumb-last-item-color: @text-color;
+@breadcrumb-font-size: @font-size-base;
+@breadcrumb-icon-font-size: @font-size-base;
+@breadcrumb-link-color: @text-color-secondary;
+@breadcrumb-link-color-hover: @text-color;
+@breadcrumb-separator-color: @text-color-secondary;
+@breadcrumb-separator-margin: 0 @padding-xs;
+
+// Slider
+// ---
+@slider-margin: 10px 6px 10px;
+@slider-rail-background-color: @background-color-base;
+@slider-rail-background-color-hover: #e1e1e1;
+@slider-track-background-color: @primary-3;
+@slider-track-background-color-hover: @primary-4;
+@slider-handle-border-width: 2px;
+@slider-handle-background-color: @component-background;
+@slider-handle-color: @primary-3;
+@slider-handle-color-hover: @primary-4;
+@slider-handle-color-focus: ~'var(--@{ant-prefix}-primary-color-deprecated-t-20)';
+@slider-handle-color-focus-shadow: ~'var(--@{ant-prefix}-primary-color-deprecated-f-12)';
+@slider-handle-color-tooltip-open: @primary-color;
+@slider-handle-size: 14px;
+@slider-handle-margin-top: -5px;
+@slider-handle-margin-left: -5px;
+@slider-handle-shadow: 0;
+@slider-dot-border-color: @border-color-split;
+@slider-dot-border-color-active: ~'var(--@{ant-prefix}-primary-color-deprecated-t-50)';
+@slider-disabled-color: @disabled-color;
+@slider-disabled-background-color: @component-background;
+
+// Tree
+// ---
+@tree-bg: @component-background;
+@tree-title-height: 24px;
+@tree-child-padding: 18px;
+@tree-directory-selected-color: #fff;
+@tree-directory-selected-bg: @primary-color;
+@tree-node-hover-bg: @item-hover-bg;
+@tree-node-selected-bg: @primary-2;
+
+// Collapse
+// ---
+@collapse-header-padding: @padding-sm @padding-md;
+@collapse-header-padding-extra: 40px;
+@collapse-header-bg: @background-color-light;
+@collapse-content-padding: @padding-md;
+@collapse-content-bg: @component-background;
+@collapse-header-arrow-left: 16px;
+
+// Skeleton
+// ---
+@skeleton-color: rgba(190, 190, 190, 0.2);
+@skeleton-to-color: shade(@skeleton-color, 5%);
+@skeleton-paragraph-margin-top: 28px;
+@skeleton-paragraph-li-margin-top: @margin-md;
+@skeleton-paragraph-li-height: 16px;
+@skeleton-title-height: 16px;
+@skeleton-title-paragraph-margin-top: @margin-lg;
+
+// Transfer
+// ---
+@transfer-header-height: 40px;
+@transfer-item-height: @height-base;
+@transfer-disabled-bg: @disabled-bg;
+@transfer-list-height: 200px;
+@transfer-item-hover-bg: @item-hover-bg;
+@transfer-item-selected-hover-bg: ~'var(--@{ant-prefix}-primary-color-active-deprecated-d-02)';
+@transfer-item-padding-vertical: 6px;
+@transfer-list-search-icon-top: 12px;
+
+// Message
+// ---
+@message-notice-content-padding: 10px 16px;
+@message-notice-content-bg: @component-background;
+// Motion
+// ---
+@wave-animation-width: 6px;
+
+// Alert
+// ---
+@alert-success-border-color: @success-color-deprecated-border;
+@alert-success-bg-color: @success-color-deprecated-bg;
+@alert-success-icon-color: @success-color;
+@alert-info-border-color: @info-color-deprecated-border;
+@alert-info-bg-color: @info-color-deprecated-bg;
+@alert-info-icon-color: @info-color;
+@alert-warning-border-color: @warning-color-deprecated-border;
+@alert-warning-bg-color: @warning-color-deprecated-bg;
+@alert-warning-icon-color: @warning-color;
+@alert-error-border-color: @error-color-deprecated-border;
+@alert-error-bg-color: @error-color-deprecated-bg;
+@alert-error-icon-color: @error-color;
+@alert-message-color: @heading-color;
+@alert-text-color: @text-color;
+@alert-close-color: @text-color-secondary;
+@alert-close-hover-color: @icon-color-hover;
+@alert-padding-vertical: @padding-xs;
+@alert-padding-horizontal: @padding-md - 1px;
+@alert-no-icon-padding-vertical: @padding-xs;
+@alert-with-description-no-icon-padding-vertical: @padding-md - 1px;
+@alert-with-description-padding-vertical: @padding-md - 1px;
+@alert-with-description-padding: @alert-with-description-padding-vertical 15px
+  @alert-with-description-no-icon-padding-vertical @alert-with-description-icon-size;
+@alert-icon-top: 8px + @font-size-base * (@line-height-base / 2) - (@font-size-base / 2);
+@alert-with-description-icon-size: 24px;
+
+// List
+// ---
+@list-header-background: transparent;
+@list-footer-background: transparent;
+@list-empty-text-padding: @padding-md;
+@list-item-padding: @padding-sm 0;
+@list-item-padding-sm: @padding-xs @padding-md;
+@list-item-padding-lg: 16px 24px;
+@list-item-meta-margin-bottom: @padding-md;
+@list-item-meta-avatar-margin-right: @padding-md;
+@list-item-meta-title-margin-bottom: @padding-sm;
+@list-customize-card-bg: @component-background;
+@list-item-meta-description-font-size: @font-size-base;
+
+// Statistic
+// ---
+@statistic-title-font-size: @font-size-base;
+@statistic-content-font-size: 24px;
+@statistic-unit-font-size: 24px;
+@statistic-font-family: @font-family;
+
+// Drawer
+// ---
+@drawer-header-padding: @padding-md @padding-lg;
+@drawer-body-padding: @padding-lg;
+@drawer-bg: @component-background;
+@drawer-footer-padding-vertical: @modal-footer-padding-vertical;
+@drawer-footer-padding-horizontal: @modal-footer-padding-horizontal;
+@drawer-header-close-size: 56px;
+@drawer-title-font-size: @font-size-lg;
+@drawer-title-line-height: 22px;
+
+// Timeline
+// ---
+@timeline-width: 2px;
+@timeline-color: @border-color-split;
+@timeline-dot-border-width: 2px;
+@timeline-dot-color: @primary-color;
+@timeline-dot-bg: @component-background;
+@timeline-item-padding-bottom: 20px;
+
+// Typography
+// ---
+@typography-title-font-weight: 600;
+@typography-title-margin-top: 1.2em;
+@typography-title-margin-bottom: 0.5em;
+
+// Upload
+// ---
+@upload-actions-color: @text-color-secondary;
+
+// Steps
+// ---
+@process-tail-color: @border-color-split;
+@steps-nav-arrow-color: fade(@black, 25%);
+@steps-background: @component-background;
+@steps-icon-size: 32px;
+@steps-icon-custom-size: @steps-icon-size;
+@steps-icon-custom-top: 0px;
+@steps-icon-custom-font-size: 24px;
+@steps-icon-top: -0.5px;
+@steps-icon-font-size: @font-size-lg;
+@steps-icon-margin: 0 8px 0 0;
+@steps-title-line-height: @height-base;
+@steps-small-icon-size: 24px;
+@steps-small-icon-margin: 0 8px 0 0;
+@steps-dot-size: 8px;
+@steps-dot-top: 2px;
+@steps-current-dot-size: 10px;
+@steps-description-max-width: 140px;
+@steps-nav-content-max-width: auto;
+@steps-vertical-icon-width: 16px;
+@steps-vertical-tail-width: 16px;
+@steps-vertical-tail-width-sm: 12px;
+
+// Notification
+// ---
+@notification-bg: @component-background;
+@notification-padding-vertical: 16px;
+@notification-padding-horizontal: 24px;
+
+// Result
+// ---
+@result-title-font-size: 24px;
+@result-subtitle-font-size: @font-size-base;
+@result-icon-font-size: 72px;
+@result-extra-margin: 24px 0 0 0;
+
+// Image
+// ---
+@image-size-base: 48px;
+@image-font-size-base: 24px;
+@image-bg: #f5f5f5;
+@image-color: #fff;
+@image-mask-font-size: 16px;
+@image-preview-operation-size: 18px;
+@image-preview-operation-color: @text-color-dark;
+@image-preview-operation-disabled-color: fade(@image-preview-operation-color, 25%);
+
+// Segmented
+// ---
+@segmented-bg: fade(@black, 4%);
+@segmented-hover-bg: fade(@black, 6%);
+@segmented-selected-bg: @white;
+@segmented-label-color: fade(@black, 65%);
+@segmented-label-hover-color: #262626;
diff --git a/src/styles/variable.less b/src/styles/variable.less
new file mode 100644
index 0000000..6c70293
--- /dev/null
+++ b/src/styles/variable.less
@@ -0,0 +1,4 @@
+@root-entry-name: variable;
+
+@import './themes/variable.less';
+@import './core/index';
diff --git a/src/testData/02.json b/src/testData/02.json
new file mode 100644
index 0000000..67d59f1
--- /dev/null
+++ b/src/testData/02.json
@@ -0,0 +1,147 @@
+{
+	"objects": [
+		{
+			"type": "rect",
+			"version": "4.6.0",
+			"originX": "left",
+			"originY": "top",
+			"left": 796.72,
+			"top": 455.28,
+			"width": 400,
+			"height": 400,
+			"fill": "#F57274",
+			"stroke": null,
+			"strokeWidth": 1,
+			"strokeDashArray": null,
+			"strokeLineCap": "butt",
+			"strokeDashOffset": 0,
+			"strokeLineJoin": "miter",
+			"strokeUniform": false,
+			"strokeMiterLimit": 4,
+			"scaleX": 1,
+			"scaleY": 1,
+			"angle": 0,
+			"flipX": false,
+			"flipY": false,
+			"opacity": 1,
+			"shadow": "",
+			"visible": true,
+			"backgroundColor": "",
+			"fillRule": "nonzero",
+			"paintFirst": "fill",
+			"globalCompositeOperation": "source-over",
+			"skewX": 0,
+			"skewY": 0,
+			"rx": 0,
+			"ry": 0,
+			"id": "21fe0d8f-70b8-4e35-a716-8f93e0f58d73",
+			"link": {
+				"enabled": false,
+				"type": "resource",
+				"state": "new",
+				"dashboard": {}
+			},
+			"tooltip": {
+				"enabled": true,
+				"type": "resource",
+				"template": "<div>{{message.name}}</div>"
+			},
+			"animation": {
+				"type": "flash",
+				"loop": true,
+				"autoplay": true,
+				"duration": 1000,
+				"delay": 0,
+				"fill": "rgba(139,87,42,1)",
+				"stroke": null
+			},
+			"userProperty": {},
+			"trigger": {
+				"enabled": false,
+				"type": "alarm",
+				"script": "return message.value > 0;",
+				"effect": "style"
+			},
+			"editable": true
+		},
+		{
+			"type": "textbox",
+			"version": "4.6.0",
+			"originX": "left",
+			"originY": "top",
+			"left": 834.88,
+			"top": 610.08,
+			"width": 330.98,
+			"height": 195.26,
+			"fill": "rgba(77,148,132,1)",
+			"strokeWidth": 1,
+			"strokeDashArray": null,
+			"strokeLineCap": "butt",
+			"strokeDashOffset": 0,
+			"strokeLineJoin": "miter",
+			"strokeUniform": false,
+			"strokeMiterLimit": 4,
+			"scaleX": 1,
+			"scaleY": 1,
+			"angle": 0,
+			"flipX": false,
+			"flipY": false,
+			"opacity": 1,
+			"shadow": "",
+			"visible": true,
+			"backgroundColor": "",
+			"fillRule": "nonzero",
+			"paintFirst": "fill",
+			"globalCompositeOperation": "source-over",
+			"skewX": 0,
+			"skewY": 0,
+			"fontFamily": "arial",
+			"fontWeight": "normal",
+			"fontSize": 80,
+			"text": "诸事顺11遂",
+			"underline": false,
+			"overline": false,
+			"linethrough": false,
+			"textAlign": "left",
+			"fontStyle": "normal",
+			"lineHeight": 1.16,
+			"textBackgroundColor": "",
+			"charSpacing": 0,
+			"styles": [],
+			"direction": "ltr",
+			"path": null,
+			"pathStartOffset": 0,
+			"pathSide": "left",
+			"minWidth": 20,
+			"splitByGrapheme": true,
+			"id": "37cad86f-f251-49a1-abe5-fbc838c2e20c",
+			"link": {
+				"enabled": false,
+				"type": "resource",
+				"state": "new",
+				"dashboard": {}
+			},
+			"tooltip": {
+				"enabled": true,
+				"type": "resource",
+				"template": "<div>{{message.name}}</div>"
+			},
+			"animation": {
+				"type": "flash",
+				"loop": true,
+				"autoplay": true,
+				"duration": 1000,
+				"delay": 0,
+				"fill": "rgba(74,74,74,1)"
+			},
+			"userProperty": {},
+			"trigger": {
+				"enabled": false,
+				"type": "alarm",
+				"script": "return message.value > 0;",
+				"effect": "style"
+			},
+			"editable": true
+		}
+	]
+}
\ No newline at end of file
diff --git a/src/testData/SettingAIgorithm.tsx b/src/testData/SettingAIgorithm.tsx
new file mode 100644
index 0000000..54c91c3
--- /dev/null
+++ b/src/testData/SettingAIgorithm.tsx
@@ -0,0 +1,41 @@
+/*
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-07 10:57:28
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-07 10:57:32
+ * @FilePath: \general-ai-platform-web\src\testData\SettingAIgorithm.ts
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+const data = [
+    '苏胜天人物识别算法',
+    '苏胜天交警识别识别',
+    '苏胜天车牌识别算法',
+    '苏胜天语音识别算法',
+    '苏胜天轨迹识别算法',
+  ].map((item) => ({
+    title: '苏胜天算法模型',
+    subTitle: <Tag color="#5BD8A6">经典算法</Tag>,
+    actions: [<a key="run">模型版本选择</a>],
+    avatar: 'https://gw.alipayobjects.com/zos/antfincdn/UCSiy1j6jx/xingzhuang.svg',
+    content: (
+      <div
+        style={{
+          display: 'flex',
+          flexDirection: 'column',
+          alignItems: 'center',
+          width: '100%',
+        }}
+      >
+        <div style={{ fontSize: '24px', fontWeight: 'bold' }}>{item}</div>
+        <div>
+          <img src="/images/model.png" alt="" style={{ width: '160px' }} />
+        </div>
+        <div>
+          版本:<span style={{ fontSize: 18, fontWeight: 'bold' }}>V1.2.4</span>
+        </div>
+        <div>
+          更新时间:<span style={{ fontSize: 18, fontWeight: 'bold' }}>2022-12-12</span>
+        </div>
+      </div>
+    ),
+  }));
\ No newline at end of file
diff --git a/src/testData/fabricGroup1.ts b/src/testData/fabricGroup1.ts
new file mode 100644
index 0000000..dec8eca
--- /dev/null
+++ b/src/testData/fabricGroup1.ts
@@ -0,0 +1,617 @@
+const currJson0: Record<string, any> = {
+  version: '5.3.0',
+  objects: [
+    {
+      type: 'group',
+      version: '5.3.0',
+      originX: 'left',
+      originY: 'top',
+      left: 778.0535,
+      top: 172.6152,
+      width: 48.205,
+      height: 48.205,
+      fill: 'rgb(0,0,0)',
+      stroke: null,
+      strokeWidth: 0,
+      strokeDashArray: null,
+      strokeLineCap: 'butt',
+      strokeDashOffset: 0,
+      strokeLineJoin: 'miter',
+      strokeUniform: false,
+      strokeMiterLimit: 4,
+      scaleX: 1,
+      scaleY: 1,
+      angle: 0,
+      flipX: false,
+      flipY: false,
+      opacity: 1,
+      shadow: null,
+      visible: true,
+      backgroundColor: '',
+      fillRule: 'nonzero',
+      paintFirst: 'fill',
+      globalCompositeOperation: 'source-over',
+      skewX: 0,
+      skewY: 0,
+      id: 'f772494d-01de-4a9e-b21d-67faed778e60',
+      selectable: true,
+      hasControls: true,
+      userProperty: {
+        modelId: '121',
+        status: '0',
+        id: '2',
+        label: '正常',
+        des: '卧室B',
+      },
+      objects: [
+        {
+          type: 'circle',
+          version: '5.3.0',
+          originX: 'left',
+          originY: 'top',
+          left: -24.1025,
+          top: -24.1025,
+          width: 300,
+          height: 300,
+          fill: 'rgba(44,246,72,0.99)',
+          stroke: 'rgba(45,240,230,1)',
+          strokeWidth: 10,
+          strokeDashArray: null,
+          strokeLineCap: 'butt',
+          strokeDashOffset: 0,
+          strokeLineJoin: 'miter',
+          strokeUniform: false,
+          strokeMiterLimit: 4,
+          scaleX: 0.1555,
+          scaleY: 0.1555,
+          angle: 0,
+          flipX: false,
+          flipY: false,
+          opacity: 1,
+          shadow: '',
+          visible: true,
+          backgroundColor: '',
+          fillRule: 'nonzero',
+          paintFirst: 'fill',
+          globalCompositeOperation: 'source-over',
+          skewX: 0,
+          skewY: 0,
+          radius: 150,
+          startAngle: 0,
+          endAngle: 360,
+          selectable: true,
+          hasControls: true,
+        },
+        {
+          type: 'i-text',
+          version: '5.3.0',
+          originX: 'left',
+          originY: 'top',
+          left: -16.7824,
+          top: -8.9323,
+          width: 160,
+          height: 90.4,
+          fill: 'rgba(255,255,255,1)',
+          stroke: null,
+          strokeWidth: 1,
+          strokeDashArray: null,
+          strokeLineCap: 'butt',
+          strokeDashOffset: 0,
+          strokeLineJoin: 'miter',
+          strokeUniform: false,
+          strokeMiterLimit: 4,
+          scaleX: 0.1954,
+          scaleY: 0.1954,
+          angle: 0,
+          flipX: false,
+          flipY: false,
+          opacity: 1,
+          shadow: '',
+          visible: true,
+          backgroundColor: '',
+          fillRule: 'nonzero',
+          paintFirst: 'fill',
+          globalCompositeOperation: 'source-over',
+          skewX: 0,
+          skewY: 0,
+          fontFamily: 'arial',
+          fontWeight: 'normal',
+          fontSize: 80,
+          text: '正常',
+          underline: false,
+          overline: false,
+          linethrough: false,
+          textAlign: 'left',
+          fontStyle: 'normal',
+          lineHeight: 1.16,
+          textBackgroundColor: '',
+          charSpacing: 0,
+          styles: [],
+          direction: 'ltr',
+          path: null,
+          pathStartOffset: 0,
+          pathSide: 'left',
+          pathAlign: 'baseline',
+          selectable: true,
+          hasControls: true,
+        },
+      ],
+    },
+    {
+      type: 'group',
+      version: '5.3.0',
+      originX: 'left',
+      originY: 'top',
+      left: 384.136,
+      top: 153.6373,
+      width: 48.205,
+      height: 48.205,
+      fill: 'rgb(0,0,0)',
+      stroke: null,
+      strokeWidth: 0,
+      strokeDashArray: null,
+      strokeLineCap: 'butt',
+      strokeDashOffset: 0,
+      strokeLineJoin: 'miter',
+      strokeUniform: false,
+      strokeMiterLimit: 4,
+      scaleX: 1,
+      scaleY: 1,
+      angle: 0,
+      flipX: false,
+      flipY: false,
+      opacity: 1,
+      shadow: null,
+      visible: true,
+      backgroundColor: '',
+      fillRule: 'nonzero',
+      paintFirst: 'fill',
+      globalCompositeOperation: 'source-over',
+      skewX: 0,
+      skewY: 0,
+      id: '3fea9335-b7a3-4b01-bf7b-7d15b4ca6b62',
+      selectable: true,
+      hasControls: true,
+      userProperty: {
+        modelId: '120',
+        status: '1',
+        id: '1',
+        label: '异常',
+        des: '卧室A',
+      },
+      objects: [
+        {
+          type: 'circle',
+          version: '5.3.0',
+          originX: 'left',
+          originY: 'top',
+          left: -24.1025,
+          top: -24.1025,
+          width: 300,
+          height: 300,
+          fill: 'rgba(248,9,3,0.94)',
+          stroke: 'rgba(255,243,47,1)',
+          strokeWidth: 10,
+          strokeDashArray: null,
+          strokeLineCap: 'butt',
+          strokeDashOffset: 0,
+          strokeLineJoin: 'miter',
+          strokeUniform: false,
+          strokeMiterLimit: 4,
+          scaleX: 0.1555,
+          scaleY: 0.1555,
+          angle: 0,
+          flipX: false,
+          flipY: false,
+          opacity: 1,
+          shadow: '',
+          visible: true,
+          backgroundColor: '',
+          fillRule: 'nonzero',
+          paintFirst: 'fill',
+          globalCompositeOperation: 'source-over',
+          skewX: 0,
+          skewY: 0,
+          radius: 150,
+          startAngle: 0,
+          endAngle: 360,
+          selectable: true,
+          hasControls: true,
+        },
+        {
+          type: 'i-text',
+          version: '5.3.0',
+          originX: 'left',
+          originY: 'top',
+          left: -15.8708,
+          top: -8.9298,
+          width: 160,
+          height: 90.4,
+          fill: 'rgba(255,255,255,1)',
+          stroke: null,
+          strokeWidth: 1,
+          strokeDashArray: null,
+          strokeLineCap: 'butt',
+          strokeDashOffset: 0,
+          strokeLineJoin: 'miter',
+          strokeUniform: false,
+          strokeMiterLimit: 4,
+          scaleX: 0.1954,
+          scaleY: 0.1954,
+          angle: 0,
+          flipX: false,
+          flipY: false,
+          opacity: 1,
+          shadow: '',
+          visible: true,
+          backgroundColor: '',
+          fillRule: 'nonzero',
+          paintFirst: 'fill',
+          globalCompositeOperation: 'source-over',
+          skewX: 0,
+          skewY: 0,
+          fontFamily: 'arial',
+          fontWeight: 'normal',
+          fontSize: 80,
+          text: '警告',
+          underline: false,
+          overline: false,
+          linethrough: false,
+          textAlign: 'left',
+          fontStyle: 'normal',
+          lineHeight: 1.16,
+          textBackgroundColor: '',
+          charSpacing: 0,
+          styles: [],
+          direction: 'ltr',
+          path: null,
+          pathStartOffset: 0,
+          pathSide: 'left',
+          pathAlign: 'baseline',
+          selectable: true,
+          hasControls: true,
+        },
+      ],
+    },
+    {
+      type: 'group',
+      version: '5.3.0',
+      originX: 'left',
+      originY: 'top',
+      left: 409.6953,
+      top: 437.8391,
+      width: 48.205,
+      height: 48.205,
+      fill: 'rgb(0,0,0)',
+      stroke: null,
+      strokeWidth: 0,
+      strokeDashArray: null,
+      strokeLineCap: 'butt',
+      strokeDashOffset: 0,
+      strokeLineJoin: 'miter',
+      strokeUniform: false,
+      strokeMiterLimit: 4,
+      scaleX: 1,
+      scaleY: 1,
+      angle: 0,
+      flipX: false,
+      flipY: false,
+      opacity: 1,
+      shadow: null,
+      visible: true,
+      backgroundColor: '',
+      fillRule: 'nonzero',
+      paintFirst: 'fill',
+      globalCompositeOperation: 'source-over',
+      skewX: 0,
+      skewY: 0,
+      id: '16c614ab-6172-4d06-b787-75e8ddc33c68',
+      selectable: true,
+      hasControls: true,
+      userProperty: {
+        modelId: '122',
+        status: '0',
+        id: '3',
+        label: '正常',
+        des: '客厅1',
+      },
+      objects: [
+        {
+          type: 'circle',
+          version: '5.3.0',
+          originX: 'left',
+          originY: 'top',
+          left: -24.1025,
+          top: -24.1025,
+          width: 300,
+          height: 300,
+          fill: 'rgba(44,246,72,0.99)',
+          stroke: 'rgba(45,240,230,1)',
+          strokeWidth: 10,
+          strokeDashArray: null,
+          strokeLineCap: 'butt',
+          strokeDashOffset: 0,
+          strokeLineJoin: 'miter',
+          strokeUniform: false,
+          strokeMiterLimit: 4,
+          scaleX: 0.1555,
+          scaleY: 0.1555,
+          angle: 0,
+          flipX: false,
+          flipY: false,
+          opacity: 1,
+          shadow: '',
+          visible: true,
+          backgroundColor: '',
+          fillRule: 'nonzero',
+          paintFirst: 'fill',
+          globalCompositeOperation: 'source-over',
+          skewX: 0,
+          skewY: 0,
+          radius: 150,
+          startAngle: 0,
+          endAngle: 360,
+          selectable: true,
+          hasControls: true,
+        },
+        {
+          type: 'i-text',
+          version: '5.3.0',
+          originX: 'left',
+          originY: 'top',
+          left: -16.7824,
+          top: -8.9323,
+          width: 160,
+          height: 90.4,
+          fill: 'rgba(255,255,255,1)',
+          stroke: null,
+          strokeWidth: 1,
+          strokeDashArray: null,
+          strokeLineCap: 'butt',
+          strokeDashOffset: 0,
+          strokeLineJoin: 'miter',
+          strokeUniform: false,
+          strokeMiterLimit: 4,
+          scaleX: 0.1954,
+          scaleY: 0.1954,
+          angle: 0,
+          flipX: false,
+          flipY: false,
+          opacity: 1,
+          shadow: '',
+          visible: true,
+          backgroundColor: '',
+          fillRule: 'nonzero',
+          paintFirst: 'fill',
+          globalCompositeOperation: 'source-over',
+          skewX: 0,
+          skewY: 0,
+          fontFamily: 'arial',
+          fontWeight: 'normal',
+          fontSize: 80,
+          text: '正常',
+          underline: false,
+          overline: false,
+          linethrough: false,
+          textAlign: 'left',
+          fontStyle: 'normal',
+          lineHeight: 1.16,
+          textBackgroundColor: '',
+          charSpacing: 0,
+          styles: [],
+          direction: 'ltr',
+          path: null,
+          pathStartOffset: 0,
+          pathSide: 'left',
+          pathAlign: 'baseline',
+          selectable: true,
+          hasControls: true,
+        },
+      ],
+    },
+    {
+      type: 'group',
+      version: '5.3.0',
+      originX: 'left',
+      originY: 'top',
+      left: 384.136,
+      top: 706.1746,
+      width: 48.205,
+      height: 48.205,
+      fill: 'rgb(0,0,0)',
+      stroke: null,
+      strokeWidth: 0,
+      strokeDashArray: null,
+      strokeLineCap: 'butt',
+      strokeDashOffset: 0,
+      strokeLineJoin: 'miter',
+      strokeUniform: false,
+      strokeMiterLimit: 4,
+      scaleX: 1,
+      scaleY: 1,
+      angle: 0,
+      flipX: false,
+      flipY: false,
+      opacity: 1,
+      shadow: null,
+      visible: true,
+      backgroundColor: '',
+      fillRule: 'nonzero',
+      paintFirst: 'fill',
+      globalCompositeOperation: 'source-over',
+      skewX: 0,
+      skewY: 0,
+      id: '6217576c-4b4a-4916-948a-e99fe9f03bbc',
+      selectable: true,
+      hasControls: true,
+      userProperty: {
+        modelId: '124',
+        status: '1',
+        id: '4',
+        label: '异常',
+        des: '卧室C',
+      },
+      objects: [
+        {
+          type: 'circle',
+          version: '5.3.0',
+          originX: 'left',
+          originY: 'top',
+          left: -24.1025,
+          top: -24.1025,
+          width: 300,
+          height: 300,
+          fill: 'rgba(248,9,3,0.94)',
+          stroke: 'rgba(255,243,47,1)',
+          strokeWidth: 10,
+          strokeDashArray: null,
+          strokeLineCap: 'butt',
+          strokeDashOffset: 0,
+          strokeLineJoin: 'miter',
+          strokeUniform: false,
+          strokeMiterLimit: 4,
+          scaleX: 0.1555,
+          scaleY: 0.1555,
+          angle: 0,
+          flipX: false,
+          flipY: false,
+          opacity: 1,
+          shadow: '',
+          visible: true,
+          backgroundColor: '',
+          fillRule: 'nonzero',
+          paintFirst: 'fill',
+          globalCompositeOperation: 'source-over',
+          skewX: 0,
+          skewY: 0,
+          radius: 150,
+          startAngle: 0,
+          endAngle: 360,
+          selectable: true,
+          hasControls: true,
+        },
+        {
+          type: 'i-text',
+          version: '5.3.0',
+          originX: 'left',
+          originY: 'top',
+          left: -15.8708,
+          top: -8.9298,
+          width: 160,
+          height: 90.4,
+          fill: 'rgba(255,255,255,1)',
+          stroke: null,
+          strokeWidth: 1,
+          strokeDashArray: null,
+          strokeLineCap: 'butt',
+          strokeDashOffset: 0,
+          strokeLineJoin: 'miter',
+          strokeUniform: false,
+          strokeMiterLimit: 4,
+          scaleX: 0.1954,
+          scaleY: 0.1954,
+          angle: 0,
+          flipX: false,
+          flipY: false,
+          opacity: 1,
+          shadow: '',
+          visible: true,
+          backgroundColor: '',
+          fillRule: 'nonzero',
+          paintFirst: 'fill',
+          globalCompositeOperation: 'source-over',
+          skewX: 0,
+          skewY: 0,
+          fontFamily: 'arial',
+          fontWeight: 'normal',
+          fontSize: 80,
+          text: '警告',
+          underline: false,
+          overline: false,
+          linethrough: false,
+          textAlign: 'left',
+          fontStyle: 'normal',
+          lineHeight: 1.16,
+          textBackgroundColor: '',
+          charSpacing: 0,
+          styles: [],
+          direction: 'ltr',
+          path: null,
+          pathStartOffset: 0,
+          pathSide: 'left',
+          pathAlign: 'baseline',
+          selectable: true,
+          hasControls: true,
+        },
+      ],
+    },
+  ],
+  clipPath: {
+    type: 'rect',
+    version: '5.3.0',
+    originX: 'left',
+    originY: 'top',
+    left: 0,
+    top: 0,
+    width: 1200,
+    height: 900,
+    fill: 'rgba(255,255,255,1)',
+    stroke: null,
+    strokeWidth: 0,
+    strokeDashArray: null,
+    strokeLineCap: 'butt',
+    strokeDashOffset: 0,
+    strokeLineJoin: 'miter',
+    strokeUniform: false,
+    strokeMiterLimit: 4,
+    scaleX: 1,
+    scaleY: 1,
+    angle: 0,
+    flipX: false,
+    flipY: false,
+    opacity: 1,
+    shadow: null,
+    visible: true,
+    backgroundColor: '',
+    fillRule: 'nonzero',
+    paintFirst: 'fill',
+    globalCompositeOperation: 'source-over',
+    skewX: 0,
+    skewY: 0,
+    rx: 0,
+    ry: 0,
+    selectable: true,
+    hasControls: true,
+  },
+};
+let currJson00: Record<string, any> = {
+  ...currJson0,
+  // objects: [],
+};
+
+// 生成100到1100之间的随机整数
+// function generateRandomNumber(minNum, maxNum) {
+//   // 生成0到1之间的随机小数
+//   const randomFraction = Math.random();
+  
+//   // 将随机小数映射到100到1100之间的范围
+//   const randomNumber = Math.floor(randomFraction * (maxNum - minNum + 1) + minNum);
+  
+//   return randomNumber;
+// }
+// let startTime = new Date().getTime()
+// let endTime = new Date().getTime()
+
+// for (let i = 0; i < 2; i++) {
+//   let currObjects = JSON.parse(JSON.stringify(currJson0.objects))
+//   currObjects = currObjects.map(item=>{
+//     item.left = generateRandomNumber(100, 1100)
+//     item.top = generateRandomNumber(100, 800)
+//     return item
+//   })
+//   currJson00.objects = currJson00.objects.concat(currObjects)
+// }
+// endTime = new Date().getTime()
+// console.log(currJson00,'currJson00', endTime-startTime)
+
+export const currJson1 = currJson00;
diff --git a/src/testData/shapeWithText.json b/src/testData/shapeWithText.json
new file mode 100644
index 0000000..3f82b84
--- /dev/null
+++ b/src/testData/shapeWithText.json
@@ -0,0 +1,253 @@
+{
+	"objects": [
+		{
+			"type": "image",
+			"version": "4.6.0",
+			"originX": "left",
+			"originY": "top",
+			"left": 660,
+			"top": 376.66,
+			"width": 600,
+			"height": 400,
+			"fill": "rgb(0,0,0)",
+			"stroke": null,
+			"strokeWidth": 0,
+			"strokeDashArray": null,
+			"strokeLineCap": "butt",
+			"strokeDashOffset": 0,
+			"strokeLineJoin": "miter",
+			"strokeUniform": false,
+			"strokeMiterLimit": 4,
+			"scaleX": 1,
+			"scaleY": 1,
+			"angle": 0,
+			"flipX": false,
+			"flipY": false,
+			"opacity": 1,
+			"shadow": null,
+			"visible": true,
+			"backgroundColor": "#fff",
+			"fillRule": "nonzero",
+			"paintFirst": "fill",
+			"globalCompositeOperation": "source-over",
+			"skewX": 0,
+			"skewY": 0,
+			"cropX": 0,
+			"cropY": 0,
+			"id": "workarea",
+			"name": "",
+			"link": {},
+			"tooltip": {
+				"enabled": false
+			},
+			"layout": "fixed",
+			"workareaWidth": 600,
+			"workareaHeight": 400,
+			"src": "",
+			"crossOrigin": null,
+			"filters": []
+		},
+		{
+			"type": "rect",
+			"version": "4.6.0",
+			"originX": "left",
+			"originY": "top",
+			"left": -34,
+			"top": -4,
+			"width": 900,
+			"height": 1200,
+			"fill": "rgba(255,255,255,1)",
+			"stroke": null,
+			"strokeWidth": 0,
+			"strokeDashArray": null,
+			"strokeLineCap": "butt",
+			"strokeDashOffset": 0,
+			"strokeLineJoin": "miter",
+			"strokeUniform": false,
+			"strokeMiterLimit": 4,
+			"scaleX": 1,
+			"scaleY": 1,
+			"angle": 0,
+			"flipX": false,
+			"flipY": false,
+			"opacity": 1,
+			"shadow": null,
+			"visible": true,
+			"backgroundColor": "",
+			"fillRule": "nonzero",
+			"paintFirst": "fill",
+			"globalCompositeOperation": "source-over",
+			"skewX": 0,
+			"skewY": 0,
+			"rx": 0,
+			"ry": 0,
+			"id": "workspace",
+			"link": {
+				"enabled": false,
+				"type": "resource",
+				"state": "new",
+				"dashboard": {}
+			},
+			"tooltip": {
+				"enabled": true,
+				"type": "resource",
+				"template": "<div>{{message.name}}</div>"
+			},
+			"animation": {
+				"type": "none",
+				"loop": true,
+				"autoplay": true,
+				"duration": 1000
+			},
+			"userProperty": {},
+			"trigger": {
+				"enabled": false,
+				"type": "alarm",
+				"script": "return message.value > 0;",
+				"effect": "style"
+			},
+			"editable": true
+		},
+		{
+			"type": "rect",
+			"version": "4.6.0",
+			"originX": "left",
+			"originY": "top",
+			"left": 237.13,
+			"top": 377.89,
+			"width": 400,
+			"height": 400,
+			"fill": "rgba(243,113,115,1)",
+			"strokeWidth": 1,
+			"strokeDashArray": null,
+			"strokeLineCap": "butt",
+			"strokeDashOffset": 0,
+			"strokeLineJoin": "miter",
+			"strokeUniform": false,
+			"strokeMiterLimit": 4,
+			"scaleX": 0.71,
+			"scaleY": 0.71,
+			"angle": 0,
+			"flipX": false,
+			"flipY": false,
+			"opacity": 1,
+			"shadow": "",
+			"visible": true,
+			"backgroundColor": "",
+			"fillRule": "nonzero",
+			"paintFirst": "fill",
+			"globalCompositeOperation": "source-over",
+			"skewX": 0,
+			"skewY": 0,
+			"rx": 0,
+			"ry": 0,
+			"id": "21fe0d8f-70b8-4e35-a716-8f93e0f58d73",
+			"link": {
+				"enabled": false,
+				"type": "resource",
+				"state": "new",
+				"dashboard": {}
+			},
+			"tooltip": {
+				"enabled": true,
+				"type": "resource",
+				"template": "<div>{{message.name}}</div>"
+			},
+			"animation": {
+				"type": "flash",
+				"loop": true,
+				"autoplay": true,
+				"duration": 1000,
+				"delay": 0,
+				"fill": "rgba(0,0,0,1)",
+				"stroke": null
+			},
+			"userProperty": {},
+			"trigger": {
+				"enabled": false,
+				"type": "alarm",
+				"script": "return message.value > 0;",
+				"effect": "style"
+			},
+			"editable": true
+		},
+		{
+			"type": "textbox",
+			"version": "4.6.0",
+			"originX": "left",
+			"originY": "top",
+			"left": 281.03,
+			"top": 482.85,
+			"width": 330.98,
+			"height": 90.4,
+			"fill": "rgba(246,237,237,1)",
+			"stroke": null,
+			"strokeWidth": 1,
+			"strokeDashArray": null,
+			"strokeLineCap": "butt",
+			"strokeDashOffset": 0,
+			"strokeLineJoin": "miter",
+			"strokeUniform": false,
+			"strokeMiterLimit": 4,
+			"scaleX": 0.65,
+			"scaleY": 0.65,
+			"angle": 0,
+			"flipX": false,
+			"flipY": false,
+			"opacity": 1,
+			"shadow": "",
+			"visible": true,
+			"backgroundColor": "",
+			"fillRule": "nonzero",
+			"paintFirst": "fill",
+			"globalCompositeOperation": "source-over",
+			"skewX": 0,
+			"skewY": 0,
+			"fontFamily": "arial",
+			"fontWeight": "normal",
+			"fontSize": 80,
+			"text": "诸事顺遂",
+			"underline": false,
+			"overline": false,
+			"linethrough": false,
+			"textAlign": "left",
+			"fontStyle": "normal",
+			"lineHeight": 1.16,
+			"textBackgroundColor": "",
+			"charSpacing": 0,
+			"styles": [],
+			"direction": "ltr",
+			"path": null,
+			"pathStartOffset": 0,
+			"pathSide": "left",
+			"minWidth": 20,
+			"splitByGrapheme": true,
+			"id": "37cad86f-f251-49a1-abe5-fbc838c2e20c",
+			"link": {
+				"enabled": false,
+				"type": "resource",
+				"state": "new",
+				"dashboard": {}
+			},
+			"tooltip": {
+				"enabled": true,
+				"type": "resource",
+				"template": "<div>{{message.name}}</div>"
+			},
+			"animation": {
+				"type": "none",
+				"loop": true,
+				"autoplay": true,
+				"duration": 1000
+			},
+			"userProperty": {},
+			"trigger": {
+				"enabled": false,
+				"type": "alarm",
+				"script": "return message.value > 0;",
+				"effect": "style"
+			},
+			"editable": true
+		}
+	]
+}
\ No newline at end of file
diff --git a/src/testData/testData.md b/src/testData/testData.md
new file mode 100644
index 0000000..3684c11
--- /dev/null
+++ b/src/testData/testData.md
@@ -0,0 +1,11 @@
+<!--
+ * @Author: zhoux zhouxia@supervision.ltd
+ * @Date: 2023-11-07 10:55:31
+ * @LastEditors: zhoux zhouxia@supervision.ltd
+ * @LastEditTime: 2023-11-07 10:55:42
+ * @FilePath: \general-ai-platform-web\src\testData\testData.md
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+-->
+### 测试数据
+
+
diff --git a/src/testData/testSvg.ts b/src/testData/testSvg.ts
new file mode 100644
index 0000000..c2c5a8e
--- /dev/null
+++ b/src/testData/testSvg.ts
@@ -0,0 +1,40 @@
+export const bgImageData = {
+    type: 'image',
+    version: '5.3.0',
+    originX: 'left',
+    originY: 'top',
+    left: 0.7463,
+    top: 0,
+    width: 1200,
+    height: 900,
+    fill: 'rgb(0,0,0)',
+    stroke: null,
+    strokeWidth: 0,
+    strokeDashArray: null,
+    strokeLineCap: 'butt',
+    strokeDashOffset: 0,
+    strokeLineJoin: 'miter',
+    strokeUniform: false,
+    strokeMiterLimit: 4,
+    scaleX: 1,
+    scaleY: 1,
+    angle: 0,
+    flipX: false,
+    flipY: false,
+    opacity: 1,
+    shadow: null,
+    visible: true,
+    backgroundColor: '',
+    fillRule: 'nonzero',
+    paintFirst: 'fill',
+    globalCompositeOperation: 'source-over',
+    skewX: 0,
+    skewY: 0,
+    cropX: 0,
+    cropY: 0,
+    selectable: false,
+    hasControls: true,
+    src: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABLAAAAOECAIAAAA+D1+tAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFyGlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuMTY0NzUzLCAyMDIxLzAyLzE1LTExOjUyOjEzICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdEV2dD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlRXZlbnQjIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iIHhtbG5zOnBob3Rvc2hvcD0iaHR0cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoV2luZG93cykiIHhtcDpDcmVhdGVEYXRlPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAyMy0xMS0yOVQxNjowNjozNSswODowMCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpjMWE2ZTE4MC1iMTc1LTQ2NGMtYjBlZS0zYjgxYTcwNjY4MTMiIHhtcE1NOkRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDo4YjQzZmIyYy1hYmVmLWYzNGItODVlZC1kYmNkZjA3MTNhYTIiIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDplZWViNjVhMy1iNTM1LTNmNGEtOTM4YS02Y2FjMDg0OWJlMmIiIGRjOmZvcm1hdD0iaW1hZ2UvcG5nIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDplZWViNjVhMy1iNTM1LTNmNGEtOTM4YS02Y2FjMDg0OWJlMmIiIHN0RXZ0OndoZW49IjIwMjMtMTEtMjlUMTY6MDY6MzUrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyMi4zIChXaW5kb3dzKSIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6YzFhNmUxODAtYjE3NS00NjRjLWIwZWUtM2I4MWE3MDY2ODEzIiBzdEV2dDp3aGVuPSIyMDIzLTExLTI5VDE2OjA2OjM1KzA4OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgMjIuMyAoV2luZG93cykiIHN0RXZ0OmNoYW5nZWQ9Ii8iLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+ZRXnmQABfNhJREFUeJzsvXd8HNW9939mtu9Kq14syZJly733hm2Mwaa4gXGhp1FSuCmXJ7m5IbnJk3LvLwlJLhAglISEEEwxBhuMDcbgjm2wjS33bslFVq/bd35/fF86z9HM7Gq1arurz/sPvUazZ86c6edzvuVIiqIwAAAAAAAAAAB9D7m3GwAAAAAAAAAAoHeAIAQAAAAAAACAPgoEIQAAAAAAAAD0USAIAQAAAAAAAKCPAkEIAAAAAAAAAH0UCEIAAAAAAAAA6KNAEAIAAAAAAABAHwWCEAAAAAAAAAD6KBCEAAAAAAAAANBHgSAEAAAAAAAAgD4KBCEAAAAAAAAA9FEgCAEAAAAAAACgjwJBCAAAAAAAAAB9FAhCAAAAAAAAAOijQBACAAAAAAAAQB8FghAAAAAAAAAA+igQhAAAAAAAAADQR4EgBAAAAAAAAIA+CgQhAAAAAAAAAPRRIAgBAAAAAAAAoI8CQQgAAAAAAAAAfRQIQgAAAAAAAADoo0AQAgAAAAAAAEAfBYIQAAAAAAAAAPooEIQAAAAAAAAA0EeBIAQAAAAAAACAPgoEIQAAAAAAAAD0USAIAQAAAAAAAKCPAkEIAAAAAAAAAH0UCEIAAAAAAAAA6KNAEAIAAAAAAABAHwWCEAAAAAAAAAD6KBCEAAAAAAAAANBHgSAEAAAAAAAAgD4KBCEAAAAAAAAA9FEgCAEAAAAAAACgjwJBCAAAAAAAAAB9FAhCAAAAAAAAAOijQBACAAAAAAAAQB8FghAAAAAAAAAA+igQhAAAAAAAAADQR4EgBAAAAAAAAIA+CgQhAAAAAAAAAPRRIAgBAAAAAAAAoI8CQQgAAAAAAAAAfRQIQgAAAAAAAADoo0AQAgAAAAAAAEAfBYIQAAAAAAAAAPooEIQAAAAAAAAA0EeBIAQAAAAAAACAPgoEIQAAAAAAAAD0USAIAQAAAAAAAKCPAkEIAAAAAAAAAH0UCEIAAAAAAAAA6KNAEAIAAAAAAABAHwWCEAAAAAAAAAD6KBCEAAAAAAAAANBHgSAEAAAAAAAAgD4KBCEAAAAAAAAA9FEgCAEAAAAAAACgjwJBCAAAAAAAAAB9FAhCAAAAAAAAAOijQBACAAAAAAAAQB8FghAAAAAAAAAA+igQhAAAAAAAAADQR4EgBAAAAAAAAIA+CgQhAAAAAAAAAPRRIAgBAAAAAAAAoI8CQQgAAAAAAAAAfRQIQgAAAAAAAADoo0AQAgAAAAAAAEAfBYIQAAAAAAAAAPooxt5uAAAAAAAAADGEoii93YTuRZKk3m4CiCEgCAHoBcJ8afCOBgAAAHqA8KoPn2PQd4AgBKB34F8aRVHEZdUCAKC70e324RkEIIHhT30o1Yc3AOhTQBAC0KOI3xiVFKRlKiBJkuprhKFKALoEbT+voz0/PIwAxDuqbzFrfa5Vy3jYQR8BghCAnkb1gRH/1X6QOBitBKALCWWiVy3rPnd4GAGIa+gxDy/2RE2oVYwJALQuEIEgBKAXoG+M+L1RLYfpjAIAokPsz6kerjDmegBAohLGNsg0ChAvBJDAQBAC0Mtw+Uf/an1He7NxACQcuvZA0WIg/o3EZwzdRADiiFBPdJj1eMZBwgNBCEAPIX5RVL4o/G90rint9lmhLRMD1YWOtfgW8U5WrdQtGb6eyHfKhB5bhPkhVC1kGvkXym1bt/6YugoAgMjR+oWK60P9C0DiAUEIQM/RrmxT+Y6qfhXr0Tq8hfpJVQYftngklM9Sb41bhw+ui6SR4Vve0ePqpE+XdoAmvE1A+zDChgCASCQfO91/dceVoqPzVYkvNHw6QWIDQQhAt6PNLKoNUqKVsWbzASAh0TqL6prrQ22uO2qj64kKQN9Ea5MXP3YsYpWl+kR2dORFd4iKtX1aVc3g32KmcSVIsHEfvKaACAQhAD1B+OCEUHkO+Zpubx8AMUOoqFpdOupfGl0fSDWmE6ZmPK0AhEc7QqpaH0rFcTr0cujQU6/r3846KGIBiEcSarQDgNhE+1nS2glV1olebS8AfYhQ4hNPIgB9BN3QfbwWQJ8CFkIAegfVIKj2IwRAXyAWBiV1nz48iQDEAj32itDuSFcKxsIrq0vAKw6IQBAC0EOo4o5ULijkOBoIBILBYO+2EyQeMTVxgjgYL8uywWCIkX5JMBj0+/264UNxRIeanTBdW5CoGAwGWZZZTz2P2kh+rUkwTt8MAIQHLqMAdDuhnEW1Yfe90ToAADzBAAD/D5UyVMV0JEbPGW88IAILIQA9hJi6UPzLhM7oQw89dOHChZycHIvFYjKZLBaL0Wi0Wq1Go9FkMhmNRoPBYDKZGGOyLNO4Kf1Vwc2MKnsjzI9xiniV+bJ4A6j+himvIvytov1Vd0EsTHY2+uv3+wOBgN/v93q99Nfj8ciy3NTU1NLS4nQ6H3zwwREjRjQ2Nno8Hm4n5zY61TJVzp8acVlEURQ6Ur4gyzIt82dQkiRZloPBINkf/H5/v379mpubf/Ob31y6dMloNFosFnr6zGaz2Ww2Go30DMqyTMu0IJ5b3XOuQrW+M/9GUn8ktPtOiOSlgRcL0EX1ZuAwxvwCPp9PfEvQv01NTbIs/8d//Mfw4cOvXLmiKIrf72eMSZIUDAZDvSK0URgc2lC3nfSTwWDw+/2ZmZmFhYXhR2xVJsROniUAYoEEGecAIJbR5oxRjTJSb/Wjjz6aP39+7zYVgB5m/fr1Xq+3rq6O+mqBQCAQCCiKQn0+gjqRXBOy1g5cqKF6rgDFZRKBkiSRCKQF+uvxeG677bb777//008/7dGDBwC0x8aNG+vq6gKBQFNTE70QaMiJ3gn8RUFruOrTvhlENSiOK9G/Ho+noKDg008/3b9//65duzIzMwOBAB9hCW8bhKkNJACwEALQQ+iOL4qRhPRlSktLc7vdrHXsU3dzAOIC3UF6WpBl2el0Xr16deHChapNeN9LlHzi6L5YQFU/78DpPju0ITcVcsu82+22Wq0vvPDC4MGD+/XrV1dXxzQGB21tAIDOo3rExKEcxlhLS8uCBQsCgYDBYFBtyH0ExNdFqGp1ETfx+/1Wq/XWW2/9zne+4/F4qAG6DzveACAhgSAEoCcQ01SolvnXZcCAAYyxhoaGQCDQW+0EoHcRvalVySS0PcIoPCR1fbatVitjrKSkhDHW1NTkcrmibT4AoCtJTk5mjHm9XpvNpvpJNN8xvfdDu4ibGI1GxlhhYeH48eO1UyOqRGCo9QDELxCEAHQ7oea01f3G4AMD+hTBYLChoaG5uZn7gGnDCFmIGMJQdZINkC+rRKAKWZY9Hs+gQYPef/99hoggAGKJlpYW1iOfRa/XazabGxoaKisrVT4FfJkXxmcaJB4QhAD0HFzy6XY6zWYzw5cG9DE+/fRTt9tdW1tLc64oisLDCClYiAcI8aeGRwppHxbuESqme+HCj8cN0gItG41Gj8djNBo3btzIGIN9HoDYgZ7HxsbGpqYmSj3FPcn5m4GvFGMIGWOSJNHmulpOlmXyBcjKysrKyqLvL2WQ0nU9wIgtSGwgCAHoIULZCflKclkBoI9AfbUbbrihpaWFPx1a86Co/cSunq6FUBtDqEoxKuYa5clmPB5Pamrqo48++vTTT6PDB0BMcejQocrKSlmW6+vrZVlWJZ1SZZ+iNwNPFUOjSyaTiX95A4EAPfsGg8HlcsmyfO7cuQkTJqxYsYK1TQZOaJfF7DJ4XYCEAR1QAHoUrXmQf1EgCEGfgis6m83Wu/0qCk8aMmQIiyouEQDQfYwZM+bs2bMWi8Xn8zHGJEnyer2sdR4Lbi1kenNOiANJooeOJEl+v1+SJKfT+Y9//OPtt98mQahF6zKqikAGIDFABxSAnkZMbyiCnijoU6hyQvQ6NMsZYggBiB1SUlIYY/3796cJeLuDBx988MUXX6RlbW7hGHk7AdDdQBAC0GuofE4o4xn6o6CPQILw/fff93q9TU1NbrebT2rPowcpsJB7hTEhgDB8zTyMkAcQ8hhCk8nE0xLSnISMsTFjxrzyyisMc6wDEEuQVbCb1CDNN1NZWckjh0MNyybkdxlaF4hAEAIQK8BlFPQpqDsyderU6upqr9fL08ZoJ6ZnjIkBQix0DCETUoyKU9LTJuL09LSG8sr4/f7CwsKpU6c+/fTTUSSvBwB0Ey0tLRUVFRUVFSaTqa6ujscQEjRgRG8DekXQVnzwiLW+OoxGYzAYNJlMXq+3sbFxxIgRo0ePpvlm6urq+IbkRyo2QCsFoaNAQoIOKAC9g/YzA5dR0AfJzMzMzMzs7VYwxti9995733334TEEIKa4ePHi+fPnJUlyuVxcB/KkxNyhQJZl0nUqJwKy/pGSTElJaWxs3LJlS2pq6o9+9KOxY8cyxkwmk+qpD28PTBhrIZQtEIEgBKAX0H0RR9gTlWXZZrMZjcZI3uZ448cvkXQ7VGVU/wYCAZfLFd4HknwmudEsijaE30r09uSQG6fFYqFJxmIKi8XCnbfFqQt5AYoBFo+L+51GB68N3qoAaJk8efLkyZO7sMLHHnvs5Zdfrq6upn/FCWzowyo+zmJ6cAASGAhCAGKFSPqUNAja3NzcA+0BiQEfONeFxtp7sj2c2tpaxtj58+erq6tdLhc1Q+UJRh5c3Ju0XX9RppmVXnQclSTJ4XBYLBbGGDmpUkp6n883cuTIl156iTFWWVkZ+SEYjUa/30/ZaLoE0qJdqAzDd2TDDBj1vKcc8vh3Bm0yzHYJNSNul+yl8wpKbJ7f7++SkAqfz0dTUJhMJv7eE73EaToKuImCPggEIQCxQiRfUIPBIM7QDUB4KEwujMAoKCj43//937y8vObmZrfb7XK5vF6v3+8X/xI84wst8HQvPOkL6Sv66/P53G53cnLymTNntm3bZrFYxo0b19DQ4PF46Kfm5uaWlpZly5adPHnS7Xa3tLSIcUGs1bQozjbGdaA4oi8eGg2p8HQyXBlKrciybLFYtm3bVl9fv3LlSsYYTXVtMBhOnjw5ZMiQgoKCS5cuORyOpKQki8UiSZLJZDKbzbIsOxwOg8FgsVjMZnNBQcG5c+c+/vhjkoLz5s0bNWpUXV1dY2OjyWTSFXViZCP/12w22+32Cxcu7Ny5s7i4+Isvvug+ca6aOU2bTTEMJKe7deBAkiSK8oKZNDroNqb4ugg3ieI7wu/tdrc1GAw2m02WZa/Xy6eLoAfZYDCYzWZFUbxeL80KKJri+aNqNps9Ho/H42GM0VSlPCZQaZ2eVBHmKRVfC0x4APkLISsri5LTXLlyxePx0MAQr7ALz1K8AJULRCAIAegFdMfCI7QQ0sKXX345cOBA6kV1RwtB/EL5Oc+dOzdmzBjW3n21c+fOwsLCnmpaTFBfX9/Y2Hj77bfzNRSDZDKZxJXt4vf7X3755ZtuuqmoqKir2hami8ZNnVxSiqlTA4GA2WxWdalp6u2amhrGmKIodrvd4/FwXZeRkeHz+bxeL8/pGkqM9YBIozZ0914SmJ45gZEPCgQCgaamJt2fVEb1UHrM7XbTwj/+8Y/6+nqfz+fxeGi8SbxjuWeBNhcxNSMpKamiouLEiRNPP/30uHHjWGvQoK61k3slRHiYACQM6EoC0At0/nuTk5OTnJzcJY0BCUlOTk74AjRgP3bs2MrKypaWlpaWFrfbTd0sJhjoaAhfNN1wCx4TpAKfIZpKGgyGoqKia9euPf/884qiPPnkk36/3+PxiOF2NJxhNpuZ5onojlF5vosBAwY0NDSofiLHWjJZ8L2LiU/p6IxGo9PpbGxsPHfuXHFx8fLly+vr6ysqKiwWS3JycktLC5VkrVY1MR5JFVrJWjvxaWlppaWlo0aN6qYDX7p06bvvvivL8pw5c44ePXrhwoUhQ4acOHGiy3cEQDdBlvxAIEBCjgyDfFxVayHkJke/35+UlOR2u//zP//z7NmzJAh1nUI5UIOgbwJBCEAv0PloGXy0QJfgdrsPHjxYUFBgs9lSU1MDgYDX6yUvU+pOiR6bTNBIXNKw1jBF7u2ZnJwcDAbPnDnzyiuv7Nq1a/To0eQkZrVatebKUL6LXZ7LgQ6EvEapGfygyMjGGKM09OE5derU1atXR40aZbFYrl69arFYUlNTt2/fPmTIkKhtrbt3737jjTd++tOfmkympqam5uZm0ZWO0HZ2+b/8XNGFoLkWyWePMfbee+8xxrKyssaPH19fX3/hwoWMjAzW2slu1zFB9A/spteONudQd+wlsRHPYSxcJm6si7oxdD8bjUZ6ZqOrhLBarePGjaOXG41Ahd9vZ/YFQJwCQQhAL6D7jeyQXxaS44PwRHiH/OEPf5g0aZK4xuFwdEkDXC7Xf/7nf+bk5GzZssXv94ea30/7LHQovC1CyJ5A+2psbGxsbGSCsgrf0+UWCUmSampqdu3addNNN6WlpQWDwePHj48bN85isQwbNuzIkSPp6elJSUlMb8RHt3PMVzY3N//yl7/ct2/fv//7v2dnZ5tMJu4Lp7qOokrkuWFpgR+gzWZTFMXlclVVVT355JNUT3Z2NgVAGgyGK1euMMYsFkswGMSbBMQy4QP8ItmWng6j0ZiUlNSuGgSgzwJBCECs0KHPnqp7jUFNwNrqjQiDSymfe3V1dVlZWX5+flZWFhNmgQ9Vv1azUXna6bFjxz7++OOpU6dS5TU1NdXV1Xl5edq9i6Yn3Xs41PpICGWa4GF4qjaIa1T7pfJ+v//jjz+eNWsWHYvH41EUhVL+FhQUuN3uLVu2zJs3z+Fw0OZc73GpJtYv7nH69OmnT5/2+/0+n2/YsGGdDwz2+XxNTU0ZGRmvvfZaWVnZzp07a2trk5OTqW26wWZ4h4AEg/xL6Vlzu93RZUWCvRr0ESAIAYhj0IcDIu3qKxEqQ5NxZWRkpKSknDt37sqVK3l5eZmZmTzMRtd1kxum+E80QlFfX79p0yaLxbJy5UrSlowxyjGobWSHjigKQjnRqVJZigfIl7niVRSFDq2mpmbr1q0jRowYOHAgrz8QCHBxVVJSYjabSTGmpaVxTcjrFHekCJMcMsauXLkyefJkWZbPnTu3a9eu/Pz8QYMGdegMKK2pFBljjY2NZ86cyc3NpUtAmRVra2vLy8srKir8fr8qhJLbP5nGksm1sWpNJE0CoKvo6HtAe4uqhoF0y3TJruMIPMhABIIQgF5A138MSfZAz0Peg4wxo9E4YMCAS5cunT17tq6urqSkRCsFVWYuVWjZuXPnjh07lpycPGPGjJSUFPrJ7/c3NjaKN7xKrIb/tzuQNNMYintU7Z3UYGNj45YtW/r37z9y5EjGGHlaUjZCMjvQPGmFhYXNzc3btm2bMWNGVlaW1HamB753pnGEq6+vd7vddrs9Pz+/ubn54MGDDQ0NY8aMMRgMPFuG7pnRrqyqqjp9+rTBYMjMzKQ158+fZ4w1NzdXVlbS3I+Uyl/VJBWiStQNZQSgJ9EdpIh8eCLqCVdxw4M+AoIHAOgFePdO5XTXi00CfROlNYsmY8xkMg0YMGDSpEmXLl3aunUrpX0XJYdqgQsVxtjWrVvXrl1bVFR0yy23pKSk8AQzRqORJ95stxniglaKdBUqb1iu2UT9JppAXS7X2rVrBwwYMHXqVNb2OaWJGXm1jLHhw4fn5eV98skn5EoqtZ08TWyG2AaPx0OmWrPZPGrUqBtvvPHs2bMbNmygQSKes0fSwI2Q1NRjx47t3r07Ly9v8uTJdOYZYyQCDQaD0WgkZ9QwehiABIa/uHq7IQDEHLAQAtALhMkw0SEweAk6CZ/si9+TND/BxYsX33rrrcGDB0+dOlWVk5OLELKeHT169L333hs6dOi//du/cb0h5j7Rjs2rhvbD38bt2gFC/arSliK6PUJRlPI66+rq3n777fHjx48fP55pxCQXhHS8ZDmcPHmywWD4+9///s1vflPUbCrRqxoMolNHlsaUlJRly5bt2bPn6aefvv7668eNGydOdq+yFtLVaWpqev/99zMzM2+55RaqSqXDLRZLQUFBeno608wmJzq1RnhRAOhJtDbqjg4YGY3GUHmtAAAMghCA2IGsAeiHgZ6EAvxEdyz6t7CwcOHChaWlpe+///7YsWMLCgooQwNNBUYixO127969++LFi/PmzRs/fjwPKRR1BQvhCx3JfR65YuzQepWxTvSMldomg6mtrV2/fv3gwYNJDWpzw4haV2md9UGW5QkTJly5cmX9+vWLFi2ildrDEdvg8/nEBtDC1KlT8/LyDh8+XFZWNmXKlJycHD6btjiiFAwGDxw4cPny5TFjxgwbNkxUd3RF6uvrGWMtLS1vv/32qVOnWAg9jDcPSGAURQllGISFHAAGl1EAepHOu4wqAOgR+S3EM76IKo5qSE1Nve6669LT0z/77LMjR46wtsa6ixcvvv/++xUVFXPmzJk4cSKfMFp7i/Kp3jvUsO5DlVSGaTLKkOJtaGhYt25dv379Zs2axVqn41OpJnEWe4L7iN52220+n+/DDz9krdkOtYfPa+OTTLC2crF///7XXXed2+1+//33y8rKeP3cUEkhi2fOnBk5cuTw4cOltplsVFk04CkH+g7aBzNUyfBDIdG9VwGIO2AhBKAX0P0CIakM6HlUdx1XI+RwKMvy9OnTy8vLV69effTo0eXLl5M74vbt299///1Zs2YtW7aMNiTLodI2lyZVqFJNvdKvCuVTqvLk5Ms+n+/ZZ5+dPXv29OnTWauUUumrQCAgTtrOf+WyedGiRe+99x63E/L6tb7ioizn60n1OZ3O5cuXnzp16vXXX588efKcOXO459vFixc3btw4YMCAFStWiJuo6jcYDIFAID8//4EHHvjwww937drF/YR5AyI5hwDEL2FGQyIJciYS7EmBUwAQgSAEIFbwer293QTQ59Bm3lOE+EBygCwoKHjsscco08zBgwdTU1PHjRv3y1/+kuYzIBFCsz+rPCr5LsS99HovROW6yTUhdRnpwNesWZOamjphwgQWQmUxjcsor5ObQ81m82233fbpp5+uWbNm2bJlUogEqqSZRddTlSyUZXnw4MFf+9rXPvroo9dee+2uu+5ijH322WelpaXz5s2jCSq41BQFOVVFNV+6dGnv3r3Hjh1TqUEA+ji9/kYCIBaAIASgRwnjNka2mg6NQeJLBjoJH4ZQ2s6Mp7SGApIgYYzl5+e/9NJL//Vf/zV58uTnn39eVIMqX1Mm3Jm9622ldfJkgsuooplej+x47777bmNj47333muxWPh50K1K6zIq2kgVRbFYLHPmzFm/fv2mTZtuuukmHk+oKizWo42cpGLp6ekrV67cvn37n//855aWlmHDht1///1ms5m1ika+U1XWGc6FCxfghgCA1DqVC/2bYHY/AKIDMYQA9DRSW/j6TsYQdmkbQfwR3c0Qam4uMaCOMeb1er/88suZM2du3Ljx8ccfv3btWlVVFWuNjuMSS3tXM01mzp5Ed7/iSuoaKkIKlnfffbe2tnbZsmUOh4Np3EpF6FRrH1uVX6jVal2+fPm1a9fee+891nrGdKvS3QVrmw9j0KBBFRUVhw4d6tevH6lBJgRqai2E4pGaTCaLxSLWDAAAADBYCAHoMXTDqMS+KZ9zrPP1AxAhuiYjlUYqLS194403JkyYsHTpUirwxRdf/Pa3vx06dOjXv/51KkOztGtj5KgqlVmsOw9IH1WTxMkDg8Egzf/OGHvzzTcbGhpuv/12mp6B6+FQIYhhhJwozCRJuv3221evXr1u3brFixdrNaHf7xclHP8rXgWXy/XKK6/4fL7/+3//L2Ns8+bN/9//9//dddddhYWFBoOBTjI57jK9uToURamtreX+on6/n2y8AAAAAAQhAD1Hu9nMeqwlABBcGol2MC5CmpqatmzZUldXt2rVqmHDhjHGAoGAwWCYOHFifn7+tm3bnnrqqRkzZkycONFoNIoKRAylUykT0SW1d+95ahup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hg0bfvnLX65Zs2bJkiUOh2NwcPDRRx8dGRn56Ec/2traWlNTQ8dTVCFtT58+/brrrtu7d++GDRtuv/32j370o01NTYyxoaGhJ554gjF29tlnt7a2kgkxHo97PB6v1zsyMmJy1BgMBumZkdpuOz5pkPrOjBua35HX66UfAj9mfCsFwJgjWQjVUzMAAJA7EITAKoj6AaSFRglchPj9/oULF86YMWPDhg133HGH0+mMx+Nut/uUU05ZsWIFncL1CR83UxBgRUXFeeedd9JJJ/3jH//46U9/Wl5eHo/Hg8Hg+vXrly1bxs+ljfLyctr42c9+VldXd+zYsRkzZkydOnX//v3t7e2BQCAUCtHBXq+XxGF2flMm3YZ9Ph+XBHQ3jh07ZrfbSVY5HA7RfGfgNaoZOMeO14SMsWPHju3bt2/KlClTpkxJJBLPPfecx+NpbW3lmlAsn4QoN5mmUqnS0tIFCxYsWLDghRdeePbZZx955JFAIBCNRltaWq655prS0lLxdClPaUlJyZIlS+bPn79jx44nnngiEokkEomKiooVK1a0traSjGdC8K3P50srCPk3ReugMJVPJtP5SRYkcFQzc09JSQk/YJyrBMA4oGchBACAPAJBCKyC9KozyAkB2PGrn1PGRbvdHggEzj777AcffPC3v/0tY+yRRx7hapAyzTidTjqeTE82m40vdldXV3fNNddceeWV999/f1lZ2d///neuBhOJBPfD7OnpoZ1z5swJBAK1tbW9vb2vvvrqokWLli1bduDAgbKyMrqc2+2WrIVZN5M3QdygYh0OR01NzZNPPqk+/sknn7zgggsM3Aj1ssjwnep/V65cmUgk7rzzzquuumrlypXxePypp54677zz5syZw6UvvyJfFZOgFR1I461du3ZoaOhjH/sYY+zyyy//7ne/y4+hHDNs9LbTfnKFpdykixcv3rx583XXXccY+/73v3/iiSfyc8VGkSeqsRclHexyufhqhJIMVps9C4WeLrVC3QAYOzR9v/HYAwDyCwQhAEVJKBRio0kvuVT717/+1d3d/b3vfe/OO+9kjL388ss/+MEPli9fvnbtWqfTSYfFYrFYLMYFIemTzs7OBx98MBqN3njjjX/961+Hhob+/ve///jHP161atWaNWtIn5BI2LRp07nnnnvttddefvnl3d3dZWVlV1555SOPPPLd73730ksvLdz9OI7t27cvXLhw/fr1Ka0lCtUYjK64IiK9Z7fbTz/99P7+/r/+9a8f//jHV69e7ff7n3zyyYsuumjWrFl2uz2RSHCTIP07ODhIJfD9L7/88ksvvbRkyRKqz/vvv3/zzTfPnTv3rLPOqqqqomNSqVQ8HqdvmTFG5rtIJPLUU08NDAwsW7aMzt2zZ8/f//53xti6desotwpPZWFehLvdbjISSjdENMqlrJFllB3/ZVGgLG0XvGIA5Bd61MVUSXjIQR7BtAIQgSAEoMigTpzUBWm83t7eTZs2dXZ2BgKBM888s7GxkY487bTTGGP79u2744475syZs2rVqrKystLS0mnTppEdjzF26NChDRs27Nu3r7m5+ZRTTpk7dy5jrKys7KKLLnr77bffeeedjRs3nnbaacuWLSPpGAqFpk2bdt5557HRpKbf/OY3H3nkkcsuu+xnP/vZI488Qh6nZtJ7mHwb8cNI54jrCtAlkslkIBBYtGjR0NDQ0aNHA4EAhdVpXijTVyCPPKRFJkgTnn/++U8++eQDDzzwiU984qSTTnK5XI8++ujll18+depUWgqSziVzX2NjI110aGjorbfeamtri0QiH/rQh1atWkWHLV68mDG2a9eue++9t6mp6YwzzqipqbHZbLNmzeKJXo4dO7Z169adO3f6/f4lS5YsXbqU9s+ePTuVSu3atev555+vq6tbvHhxIBCgOpM+NHmHQ6GQtDqFpoleUxOO56hCfWnxeUBSGTDxsFruXADAhASCEFgFxBBmBAlCj8czNDT0yiuvRCKRNWvWUDrKZDJJksztdp955plnnHHG008//c477/j9/tNPP91ms1VXV9MwOhQKPfnkk8PDw2vXrj355JMZY6lUitbHq6qqWrdu3amnnvrwww+/8sorNptt+fLljLGamprDhw8PDw+XlpZGIhGv17tixYra2lrKVipm+BhnuNcoUV9ff/fddzOd2DMzj5k6hpDkByXXueiii5544om77rrrC1/4wqJFi0Kh0D333PPpT3+6ublZPGvatGnV1dW0/e677z7//POnnHLK+eefT9lfYrFYMpn0eDyLFy9evHjxhg0b/vnPfzqdzrVr15aUlPh8Pu5x+sorr3R2di5btuz000+nPaTfXC7XnDlz5syZs3fv3s2bNyeTyZUrV1J6GBKEZjRSZWVlVVUVN05q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BBZCPc67+uqrKa4sLb/61a9OPPFEKaxL7bVo0nqjlgQ0fCehdcYZZ7z00ktPPvnkvHnzYrGYx+PhdjlKDFNSUjJ79uxUKrV3795QKFRSUjJ9+vSmpqYDBw4kEgluYiotLU0mk3v27KHgQ72gtVQqtW/fvm3btp166qls1JWUDlYUhZr8yCOPfOYzn7n++ut/8IMfUD0N2kttMSlCDKDUPuIePZXCFRetGEk7H3jggSlTppx55pldXV1UGSnUk6ckZYwlk0m6z4cPH3766ac7OjpWr17d19eXEpL9kL+oGIoplkbLTrz33nu7d+/mpmap7dI8ggF6iW2NTxefK24hdLvdov+qSdJWMuskqJNHbk2elgIAAAAGQBACqyBZ5PjQubS0NBKJ8CSNokskneLz+cLh8B//+McvfelLjLHf/va3Z5999qxZs9QSy3ygl2bkocfjicfjHo/H7Xafc845GzduPHDggNvtdjgcZKYjQZJMJgcGBsrLy20228DAgKIow8PDZWVlFAZJRrxYLOZyubxebzKZDAaDdCIbHcSTpOHbpD0+9rGPzZkzhzFGXrJUJTrmG9/4xsMPP3z++ec/+OCDBw4cuOeee3hlpGbydCnSuh3qxhrfGYLW29A7TDM1i91upyUZq6qqvv/970cike3bt5MepohEWrSDakgpW5PJJH3vJSUl0Wj00KFDHR0dR44cOXbsWH9/P7/nbDS00m63u1wuOosS/NAGYywajdbW1t52223Dw8NdXV1qX1/z0FUyPUv6OkhRu91uydSckbVWjxxXxZgkZBT2CQAAAExIIAiB1YnH4yQhRESZQWKATEw7duz44he/+PnPf/7nP/85CQwz+UXVyTA1jyftx0YF1bJly4aGhijhDV2FakLbsVjMZrNNmzbN6XSSLOEOk/wSJCPFNTPUkpUsiqRC6ZhEIsHTkNhstkgkctttt917771XX311f3//9OnTb7jhhltuuUVqhe34lQxId2nG0ZmHWwgNPHLV1+X/nn766YlEIhwOizk/1V67dInU6CINU6dOdTqdc+bMmTlzJgUWsuOfB82i2KjF2Ofz2e32d999t6+vL1NBKBZIQi6j0yW4y6iYPpd/lGPJbFQQIpGmMZCCAAAAAAQhsBbqxJhqNShBxp/58+dv3br1yJEjP/3pT4PB4Je//OWbbrqppqbGwNgijZWN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',
+    crossOrigin: null,
+    filters: [],
+  }
\ No newline at end of file
diff --git a/src/typings.d.ts b/src/typings.d.ts
new file mode 100644
index 0000000..8208ef8
--- /dev/null
+++ b/src/typings.d.ts
@@ -0,0 +1,25 @@
+declare module 'slash2';
+declare module '*.css';
+declare module '*.less';
+declare module '*.scss';
+declare module '*.sass';
+declare module '*.svg';
+declare module '*.png';
+declare module '*.jpg';
+declare module '*.jpeg';
+declare module '*.gif';
+declare module '*.bmp';
+declare module '*.tiff';
+declare module 'omit.js';
+declare module 'numeral';
+declare module '@antv/data-set';
+declare module 'mockjs';
+declare module 'react-fittext';
+declare module 'bizcharts-plugin-slider';
+declare module 'uuid'
+
+declare const REACT_APP_ENV: 'test' | 'dev' | 'pre' | false;
+declare const SERVER_HOST:string;
+
+declare const FILE_SERVER_HOST:string;
+declare const WEBRTC_SERVER_HOST:string;
diff --git a/src/utils/FixMenuItemIcon.tsx b/src/utils/FixMenuItemIcon.tsx
new file mode 100644
index 0000000..1cadf80
--- /dev/null
+++ b/src/utils/FixMenuItemIcon.tsx
@@ -0,0 +1,53 @@
+import React from 'react';
+import { MenuDataItem } from '@ant-design/pro-layout';
+import {CarOutlined, UserOutlined, TableOutlined,
+  DollarCircleOutlined, ShopOutlined, UserSwitchOutlined,
+  HomeOutlined, SettingOutlined, TeamOutlined, DotChartOutlined,
+  BlockOutlined, DesktopOutlined, DatabaseOutlined,
+  WarningOutlined, CalendarOutlined, ExperimentOutlined,
+  ThunderboltOutlined, BugOutlined, AreaChartOutlined,
+} from '@ant-design/icons';
+
+const iconMap:any = {
+  'CarOutlined': <CarOutlined/>,
+  'UserOutlined': <UserOutlined/>,
+  'TableOutlined': <TableOutlined/>,
+  'DollarCircleOutlined': <DollarCircleOutlined/>,
+  'ShopOutlined': <ShopOutlined/>,
+  'UserSwitchOutlined': <UserSwitchOutlined/>,
+  'HomeOutlined': <HomeOutlined/>,
+  'SettingOutlined': <SettingOutlined/>,
+  'TeamOutlined': <TeamOutlined/>,
+  'DotChartOutlined': <DotChartOutlined/>,
+  'BlockOutlined': <BlockOutlined/>,
+  'DesktopOutlined': <DesktopOutlined/>,
+  'DatabaseOutlined': <DatabaseOutlined/>,
+  'WarningOutlined': <WarningOutlined/>,
+  'CalendarOutlined': <CalendarOutlined/>,
+  'ExperimentOutlined': <ExperimentOutlined/>,
+  'ThunderboltOutlined': <ThunderboltOutlined/>,
+  'BugOutlined': <BugOutlined/>,
+  'AreaChartOutlined': <AreaChartOutlined/>,
+}
+// FIX从接口获取菜单时icon为string类型
+const fixMenuItemIcon = (menus: MenuDataItem[], iconType = 'Outlined'): MenuDataItem[] => {
+  menus.forEach((item) => {
+    const { icon, children } = item;
+    if (typeof icon === 'string') {
+      console.log(22, icon)
+      if (icon in iconMap) {
+        item.icon = iconMap[icon];
+      } else {
+        item.icon = iconMap['TableOutlined'];
+      }
+      // let fixIconName = icon.slice(0, 1).toLocaleUpperCase() + icon.slice(1) + iconType;
+      // // @ts-ignore
+      // item.icon = React.createElement(allIcons[fixIconName] || allIcons[icon]);
+    }
+    // eslint-disable-next-line @typescript-eslint/no-unused-expressions
+    children && children.length > 0 ? (item.children = fixMenuItemIcon(children)) : null;
+  });
+  return menus;
+};
+
+export default fixMenuItemIcon;
diff --git a/src/utils/IconUtil.ts b/src/utils/IconUtil.ts
new file mode 100644
index 0000000..19446c4
--- /dev/null
+++ b/src/utils/IconUtil.ts
@@ -0,0 +1,24 @@
+import * as AntdIcons from '@ant-design/icons';
+import React from 'react';
+
+const allIcons: Record<string, any> = AntdIcons;
+
+export function getIcon(name: string): React.ReactNode | string {
+  const icon = allIcons[name];
+  return icon || '';
+}
+
+export function createIcon(icon?: string | any): React.ReactNode | string {
+  if(!icon){
+    return ''
+  }
+  console.log(icon,'createIcon_icon')
+  if (typeof icon === 'object') {
+    return icon;
+  }
+  const ele = allIcons[icon];
+  if (ele) {
+    return React.createElement(allIcons[icon]);
+  }
+  return '';
+}
diff --git a/src/utils/common.ts b/src/utils/common.ts
new file mode 100644
index 0000000..8e31cc0
--- /dev/null
+++ b/src/utils/common.ts
@@ -0,0 +1,123 @@
+import {RcFile} from "antd/es/upload/interface";
+import {message} from "antd";
+
+const file_type_list = [
+  'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', //xlsx
+  'application/vnd.ms-excel', //xls
+  'application/vnd.openxmlformats-officedocument.wordprocessingml.document', //docx
+  'text/plain', //text
+  'application/pdf', //pdf
+  'application/json', //json
+  'application/msword', //doc
+]
+export const parseIds = (data: string | undefined)=>{
+  console.log(555, data)
+  if (data === undefined || data === '') {
+    console.log(88888, data)
+    return []
+  } else {
+    return data.split(",").map((item)=>{return parseInt(item)})
+  }
+}
+
+export const handleOneFile: any = (values: any, name: string)=>{
+  if (values[name] && values[name].length) {
+    // 有文件
+    if(values[name][0].status === 'error'){
+      // 第一个文件 上传失败
+      delete values[name]
+    } else {
+      if (values[name][0]?.response && values[name][0]?.response?.data?.path) {
+        values[name] = values[name][0]?.response?.data?.path
+      } else {
+        delete values[name]
+      }
+    }
+  } else {
+    delete values[name]
+  }
+  return values
+}
+
+export const beforeUploadImage = (file: RcFile) => {
+  const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png';
+  console.log(file.type)
+  if (!isJpgOrPng) {
+    message.error('不是图片类型');
+  }
+  const isLt2M = file.size / 1024 / 1024 < 2;
+  if (!isLt2M) {
+    message.error('大小超过2M');
+  }
+  return isJpgOrPng && isLt2M;
+};
+
+export const beforeUploadFile = (file: RcFile) => {
+  const isLt50M = file.size / 1024 / 1024 < 50;
+  if (!isLt50M) {
+    message.error('大小超过50M');
+  }
+  return isLt50M;
+};
+
+export const imageInit = (host: string, data: any)=>{
+  if (data) {
+    return [{uid: '-1', name: 'image.png', status: 'done', url: host+data,}]
+  } else {
+    return []
+  }
+}
+
+export const getEnum = (intl: any, data: Array<string>)=>{
+  let temp = {}
+  data.forEach((v)=>{
+    let name = v.split('.enum.')[1]
+    // @ts-ignore
+    temp[name] = intl.formatMessage({id: `${v}`, defaultMessage: '$$$',})
+  })
+  return temp
+}
+
+export function addObjectByCode(obj: any, code: any, data:any) {
+  if (obj.code === code) {
+    if (!obj.children) {
+      obj.children = [];
+    }
+    obj.children.push(data);
+    return true;
+  } else if (obj.children) {
+    for (let i = 0; i < obj.children.length; i++) {
+      const added = addObjectByCode(obj.children[i], code, data);
+      if (added) {
+        return true;
+      }
+    }
+  }
+  return false;
+}
+
+export function floatFormat(num: number, precision = 12) {
+  return +parseFloat(num.toPrecision(precision));
+}
+
+export function getAllRouteNameTile(routes: any[], parent_name: string) {
+  let temp: any[] = []
+  routes.forEach((v)=>{
+    temp.push({name: `${parent_name}.${v.name}`, title: v.title})
+    let new_parent_name = `${parent_name}.${v.name}`
+    if (v.routes.length) {
+      temp = temp.concat(getAllRouteNameTile(v.routes, new_parent_name))
+    }
+  })
+  return temp
+}
+
+export function dateFormat(date: string) : string{
+
+
+  const datetime = new Date(date);
+  const year = datetime.getFullYear();
+  const month = (datetime.getMonth() + 1).toString().padStart(2, '0');
+  const day = datetime.getDate().toString().padStart(2, '0');
+  return `${year}-${month}-${day}`
+}
diff --git a/src/utils/downloadfile.ts b/src/utils/downloadfile.ts
new file mode 100644
index 0000000..5d56cda
--- /dev/null
+++ b/src/utils/downloadfile.ts
@@ -0,0 +1,63 @@
+import { request } from '@umijs/max';
+
+const mimeMap = {
+  xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+  zip: 'application/zip',
+};
+
+/**
+ * 解析blob响应内容并下载
+ * @param {*} res blob响应内容
+ * @param {String} mimeType MIME类型
+ */
+export function resolveBlob(res: any, mimeType: string) {
+  const aLink = document.createElement('a');
+  const blob = new Blob([res.data], { type: mimeType });
+  // //从response的headers中获取filename, 后端response.setHeader("Content-disposition", "attachment; filename=xxxx.docx") 设置的文件名;
+  const patt = new RegExp('filename=([^;]+\\.[^\\.;]+);*');
+  // console.log(res);
+  const contentDisposition = decodeURI(res.headers['content-disposition']);
+  const result = patt.exec(contentDisposition);
+  let fileName = result ? result[1] : 'file';
+  fileName = fileName.replace(/"/g, '');
+  aLink.style.display = 'none';
+  aLink.href = URL.createObjectURL(blob);
+  aLink.setAttribute('download', fileName); // 设置下载文件名称
+  document.body.appendChild(aLink);
+  aLink.click();
+  URL.revokeObjectURL(aLink.href); // 清除引用
+  document.body.removeChild(aLink);
+}
+
+export function downLoadZip(url: string) {
+  request(url, {
+    method: 'GET',
+    responseType: 'blob',
+    getResponse: true,
+  }).then((res) => {
+    resolveBlob(res, mimeMap.zip);
+  });
+}
+
+export async function downLoadXlsx(url: string, params: any, fileName: string) {
+  return request(url, {
+    ...params,
+    method: 'POST',
+    responseType: 'blob',
+  }).then((data) => {
+    const aLink = document.createElement('a');
+    const blob = data as any; // new Blob([data], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' });
+    aLink.style.display = 'none';
+    aLink.href = URL.createObjectURL(blob);
+    aLink.setAttribute('download', fileName); // 设置下载文件名称
+    document.body.appendChild(aLink);
+    aLink.click();
+    URL.revokeObjectURL(aLink.href); // 清除引用
+    document.body.removeChild(aLink);
+  });
+}
+
+
+export function download(fileName: string) {
+  window.location.href = `/api/common/download?fileName=${encodeURI(fileName)}&delete=${true}`;
+}
diff --git a/src/utils/options.ts b/src/utils/options.ts
new file mode 100644
index 0000000..79ee803
--- /dev/null
+++ b/src/utils/options.ts
@@ -0,0 +1,12 @@
+import { DictValueEnumObj } from "@/components/DictTag";
+import { ProSchemaValueEnumObj, ProSchemaValueEnumType } from "@ant-design/pro-components";
+
+export function getValueEnumLabel(options: DictValueEnumObj | ProSchemaValueEnumObj, val: string | number | undefined, defaultValue?: string) {
+    if (val !== undefined) {
+       const data = options[val] as ProSchemaValueEnumType;
+       if(data) {
+        return data.text;
+       }
+    }
+    return defaultValue?defaultValue:val;
+}
diff --git a/src/utils/permission.ts b/src/utils/permission.ts
new file mode 100644
index 0000000..e7c8a28
--- /dev/null
+++ b/src/utils/permission.ts
@@ -0,0 +1,64 @@
+// /**
+//  * 字符权限校验
+//  * @param {Array} value 校验值
+//  * @returns {Boolean}
+//  */
+export function matchPerms(permissions: string[], value: string[]) {
+  if (value && value instanceof Array && value.length > 0) {
+    const permissionDatas = value;
+    const all_permission = '*:*:*';
+    const hasPermission = permissions.some((permission) => {
+      return all_permission === permission || permissionDatas.includes(permission);
+    });
+    if (!hasPermission) {
+      return false;
+    }
+    return true;
+  }
+  console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`);
+  return false;
+}
+
+export function matchPerm(permissions: string[], value: string) {
+  if (value && value.length > 0) {
+    const permissionDatas = value;
+    const all_permission = '*:*:*';
+    const hasPermission = permissions.some((permission) => {
+      return all_permission === permission || permissionDatas === permission;
+    });
+    if (!hasPermission) {
+      return false;
+    }
+    return true;
+  }
+  console.error(`need roles! Like checkPermi="['system:user:add','system:user:edit']"`);
+  return false;
+}
+
+export function matchPermission(permissions: string[] | undefined, value: any): boolean {
+  if (permissions === undefined) return false;
+  const type = typeof value;
+  if (type === 'string') {
+    return matchPerm(permissions, value);
+  }
+  return matchPerms(permissions, value);
+}
+
+/**
+ * 角色权限校验
+ * @param {Array} value 校验值
+ * @returns {Boolean}
+ */
+export function checkRole(roles: API.System.Role[] | undefined, value: string[]) {
+  if (roles && value && value.length > 0) {
+    for (let i = 0; i < roles?.length; i++) {
+      for (let j = 0; j < value?.length; j++) {
+        if (value[j] === roles[i].roleKey) {
+          return true;
+        }
+      }
+    }
+  }
+  console.error(`need roles! Like checkRole="['admin','editor']"`);
+  return false;
+}
diff --git a/src/utils/player.tsx b/src/utils/player.tsx
new file mode 100644
index 0000000..ee20481
--- /dev/null
+++ b/src/utils/player.tsx
@@ -0,0 +1,9 @@
+import React from 'react'
+import { VideoPlayer } from '@videojs-player/react'
+import 'video.js/dist/video-js.css'
+
+export const MyComponent: React.FC = () => {
+    return (
+        <div></div>
+    )
+}
diff --git a/src/utils/tree.ts b/src/utils/tree.ts
new file mode 100644
index 0000000..d75395e
--- /dev/null
+++ b/src/utils/tree.ts
@@ -0,0 +1,93 @@
+import { DataNode } from 'antd/es/tree';
+import { parse } from 'querystring';
+
+/**
+ * 构造树型结构数据
+ * @param {*} data 数据源
+ * @param {*} id id字段 默认 'id'
+ * @param {*} parentId 父节点字段 默认 'parentId'
+ * @param {*} children 孩子节点字段 默认 'children'
+ */
+export function buildTreeData(
+  data: any[],
+  id: string,
+  name: string,
+  parentId: string,
+  parentName: string,
+  children: string,
+) {
+  const config = {
+    id: id || 'id',
+    name: name || 'name',
+    parentId: parentId || 'parentId',
+    parentName: parentName || 'parentName',
+    childrenList: children || 'children',
+  };
+
+  const childrenListMap: any[] = [];
+  const nodeIds: any[] = [];
+  const tree: any[] = [];
+  data.forEach((item) => {
+    const d = item;
+    const pId = d[config.parentId];
+    if (!childrenListMap[pId]) {
+      childrenListMap[pId] = [];
+    }
+    d.key = d[config.id];
+    d.title = d[config.name];
+    d.value = d[config.id];
+    d[config.childrenList] = null;
+    nodeIds[d[config.id]] = d;
+    childrenListMap[pId].push(d);
+  });
+
+  data.forEach((item: any) => {
+    const d = item;
+    const pId = d[config.parentId];
+    if (!nodeIds[pId]) {
+      d[config.parentName] = '';
+      tree.push(d);
+    }
+  });
+
+  function adaptToChildrenList(item: any) {
+    const o = item;
+    if (childrenListMap[o[config.id]]) {
+      if (!o[config.childrenList]) {
+        o[config.childrenList] = [];
+      }
+      o[config.childrenList] = childrenListMap[o[config.id]];
+    }
+    if (o[config.childrenList]) {
+      o[config.childrenList].forEach((child: any) => {
+        const c = child;
+        c[config.parentName] = o[config.name];
+        adaptToChildrenList(c);
+      });
+    }
+  }
+
+  tree.forEach((t: any) => {
+    adaptToChildrenList(t);
+  });
+
+  return tree;
+}
+
+export const getPageQuery = () => parse(window.location.href.split('?')[1]);
+
+export function formatTreeData(arrayList: any): DataNode[] {
+  const treeSelectData: DataNode[] = arrayList.map((item: any) => {
+    const node: DataNode = {
+      id: item.id,
+      title: item.label,
+      key: `${item.id}`,
+      value: item.id,
+    } as DataNode;
+    if (item.children) {
+      node.children = formatTreeData(item.children);
+    }
+    return node;
+  });
+  return treeSelectData;
+}
diff --git a/tests/setupTests.jsx b/tests/setupTests.jsx
new file mode 100644
index 0000000..952561d
--- /dev/null
+++ b/tests/setupTests.jsx
@@ -0,0 +1,64 @@
+const localStorageMock = {
+  getItem: jest.fn(),
+  setItem: jest.fn(),
+  removeItem: jest.fn(),
+  clear: jest.fn(),
+};
+
+global.localStorage = localStorageMock;
+
+Object.defineProperty(URL, 'createObjectURL', {
+  writable: true,
+  value: jest.fn(),
+});
+
+class Worker {
+  constructor(stringUrl) {
+    this.url = stringUrl;
+    this.onmessage = () => {};
+  }
+
+  postMessage(msg) {
+    this.onmessage(msg);
+  }
+}
+window.Worker = Worker;
+
+/* eslint-disable global-require */
+if (typeof window !== 'undefined') {
+  // ref: https://github.com/ant-design/ant-design/issues/18774
+  if (!window.matchMedia) {
+    Object.defineProperty(global.window, 'matchMedia', {
+      writable: true,
+      configurable: true,
+      value: jest.fn(() => ({
+        matches: false,
+        addListener: jest.fn(),
+        removeListener: jest.fn(),
+      })),
+    });
+  }
+  if (!window.matchMedia) {
+    Object.defineProperty(global.window, 'matchMedia', {
+      writable: true,
+      configurable: true,
+      value: jest.fn((query) => ({
+        matches: query.includes('max-width'),
+        addListener: jest.fn(),
+        removeListener: jest.fn(),
+      })),
+    });
+  }
+}
+const errorLog = console.error;
+Object.defineProperty(global.window.console, 'error', {
+  writable: true,
+  configurable: true,
+  value: (...rest) => {
+    const logStr = rest.join('');
+    if (logStr.includes('Warning: An update to %s inside a test was not wrapped in act(...)')) {
+      return;
+    }
+    errorLog(...rest);
+  },
+});
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..9c05082
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,25 @@
+{
+  "compilerOptions": {
+    "forceConsistentCasingInFileNames": false,
+
+    "target": "esnext",
+    "module": "esnext",
+    "moduleResolution": "node",
+    "importHelpers": true,
+    "jsx": "preserve",
+    "esModuleInterop": true,
+    "sourceMap": true,
+    "baseUrl": "./",
+    "skipLibCheck": true,
+    "experimentalDecorators": true,
+    "strict": true,
+    "resolveJsonModule": true,
+    "allowSyntheticDefaultImports": true,
+    "paths": {
+      "@/*": ["./src/*"],
+      "@@/*": ["./src/.umi/*"],
+      "@@test/*": ["./src/.umi-test/*"]
+    }
+  },
+  "include": ["./**/*.d.ts", "./**/*.ts", "./**/*.tsx"]
+}
diff --git a/types/cache/cache.json b/types/cache/cache.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/types/cache/cache.json
@@ -0,0 +1 @@
+{}
diff --git a/types/cache/login.cache.json b/types/cache/login.cache.json
new file mode 100644
index 0000000..81109b4
--- /dev/null
+++ b/types/cache/login.cache.json
@@ -0,0 +1,386 @@
+{
+  "GET /api/currentUser": {
+    "res": {
+      "data": {
+        "name": "Serati Ma",
+        "avatar": "https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png",
+        "userid": "00000001",
+        "email": "antdesign@alipay.com",
+        "signature": "海纳百川,有容乃大",
+        "title": "交互专家",
+        "group": "蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED",
+        "tags": [
+          {
+            "key": "0",
+            "label": "很有想法的"
+          },
+          {
+            "key": "1",
+            "label": "专注设计"
+          },
+          {
+            "key": "2",
+            "label": "辣~"
+          },
+          {
+            "key": "3",
+            "label": "大长腿"
+          },
+          {
+            "key": "4",
+            "label": "川妹子"
+          },
+          {
+            "key": "5",
+            "label": "海纳百川"
+          }
+        ],
+        "notifyCount": 12,
+        "unreadCount": 11,
+        "country": "China",
+        "geographic": {
+          "province": {
+            "label": "浙江省",
+            "key": "330000"
+          },
+          "city": {
+            "label": "杭州市",
+            "key": "330100"
+          }
+        },
+        "address": "西湖区工专路 77 号",
+        "phone": "0752-268888888"
+      }
+    },
+    "query": {
+      "token ": " 123"
+    },
+    "payload": {},
+    "types": "/** GET /api/currentUser */\nexport type GET_API_CURRENT_USER_QUERY = {\n  /** example:  123 */\n        token : string\n}\n  \n\nexport type GET_API_CURRENT_USER_PAYLOAD = {\n  \n}\n  \n\nexport type GET_API_CURRENT_USER_RES = {\n  /** example: {\"name\": \"Serati Ma\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png\", \"userid\": \"00000001\", \"email\": \"antdesign@alipay.com\", \"signature\": \"海纳百川,有容乃大\", \"title\": \"交互专家\", \"group\": \"蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED\", \"tags\": [{\"key\": \"0\", \"label\": \"很有想法的\"}, {\"key\": \"1\", \"label\": \"专注设计\"}, {\"key\": \"2\", \"label\": \"辣~\"}, {\"key\": \"3\", \"label\": \"大长腿\"}, {\"key\": \"4\", \"label\": \"川妹子\"}, {\"key\": \"5\", \"label\": \"海纳百川\"}], \"notifyCount\": 12, \"unreadCount\": 11, \"country\": \"China\", \"geographic\": {\"province\": {\"label\": \"浙江省\", \"key\": \"330000\"}, \"city\": {\"label\": \"杭州市\", \"key\": \"330100\"}}, \"address\": \"西湖区工专路 77 号\", \"phone\": \"0752-268888888\"} */\n        data: {\n      name: string,\navatar: string,\nuserid: string,\nemail: string,\nsignature: string,\ntitle: string,\ngroup: string,\ntags: {\n      key: string,\nlabel: string\n      }[],\nnotifyCount: number,\nunreadCount: number,\ncountry: string,\ngeographic: {\n      province: {\n      label: string,\nkey: string\n      },\ncity: {\n      label: string,\nkey: string\n      }\n      },\naddress: string,\nphone: string\n      }\n}\n  "
+  },
+  "GET /api/rule": {
+    "res": {
+      "data": [
+        {
+          "key": 99,
+          "disabled": false,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png",
+          "name": "TradeCode 99",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 503,
+          "status": "0",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 81
+        },
+        {
+          "key": 98,
+          "disabled": false,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png",
+          "name": "TradeCode 98",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 164,
+          "status": "0",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 12
+        },
+        {
+          "key": 97,
+          "disabled": false,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png",
+          "name": "TradeCode 97",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 174,
+          "status": "1",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 81
+        },
+        {
+          "key": 96,
+          "disabled": true,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png",
+          "name": "TradeCode 96",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 914,
+          "status": "0",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 7
+        },
+        {
+          "key": 95,
+          "disabled": false,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png",
+          "name": "TradeCode 95",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 698,
+          "status": "2",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 82
+        },
+        {
+          "key": 94,
+          "disabled": false,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png",
+          "name": "TradeCode 94",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 488,
+          "status": "1",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 14
+        },
+        {
+          "key": 93,
+          "disabled": false,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png",
+          "name": "TradeCode 93",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 580,
+          "status": "2",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 77
+        },
+        {
+          "key": 92,
+          "disabled": false,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png",
+          "name": "TradeCode 92",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 244,
+          "status": "3",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 58
+        },
+        {
+          "key": 91,
+          "disabled": false,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png",
+          "name": "TradeCode 91",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 959,
+          "status": "0",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 66
+        },
+        {
+          "key": 90,
+          "disabled": true,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png",
+          "name": "TradeCode 90",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 958,
+          "status": "0",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 72
+        },
+        {
+          "key": 89,
+          "disabled": false,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png",
+          "name": "TradeCode 89",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 301,
+          "status": "2",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 2
+        },
+        {
+          "key": 88,
+          "disabled": false,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png",
+          "name": "TradeCode 88",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 277,
+          "status": "1",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 12
+        },
+        {
+          "key": 87,
+          "disabled": false,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png",
+          "name": "TradeCode 87",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 810,
+          "status": "1",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 82
+        },
+        {
+          "key": 86,
+          "disabled": false,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png",
+          "name": "TradeCode 86",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 780,
+          "status": "3",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 22
+        },
+        {
+          "key": 85,
+          "disabled": false,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png",
+          "name": "TradeCode 85",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 705,
+          "status": "3",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 12
+        },
+        {
+          "key": 84,
+          "disabled": true,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png",
+          "name": "TradeCode 84",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 203,
+          "status": "0",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 79
+        },
+        {
+          "key": 83,
+          "disabled": false,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png",
+          "name": "TradeCode 83",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 491,
+          "status": "2",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 59
+        },
+        {
+          "key": 82,
+          "disabled": false,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png",
+          "name": "TradeCode 82",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 73,
+          "status": "0",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 100
+        },
+        {
+          "key": 81,
+          "disabled": false,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png",
+          "name": "TradeCode 81",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 406,
+          "status": "3",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 61
+        },
+        {
+          "key": 80,
+          "disabled": false,
+          "href": "https://ant.design",
+          "avatar": "https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png",
+          "name": "TradeCode 80",
+          "owner": "曲丽丽",
+          "desc": "这是一段描述",
+          "callNo": 112,
+          "status": "2",
+          "updatedAt": "2022-12-06T05:00:57.040Z",
+          "createdAt": "2022-12-06T05:00:57.040Z",
+          "progress": 20
+        }
+      ],
+      "total": 100,
+      "success": true,
+      "pageSize": 20,
+      "current": 1
+    },
+    "query": {
+      "token ": " 123",
+      "current": "1",
+      "pageSize": "20"
+    },
+    "payload": {},
+    "types": "/** GET /api/rule */\nexport type GET_API_RULE_QUERY = {\n  /** example:  123 */\n        token : string;\n  /** example: 1 */\n        current: string;\n  /** example: 20 */\n        pageSize: string\n}\n  \n\nexport type GET_API_RULE_PAYLOAD = {\n  \n}\n  \n\nexport type GET_API_RULE_RES = {\n  /** example: [{\"key\": 99, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 99\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 503, \"status\": \"0\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 81}, {\"key\": 98, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 98\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 164, \"status\": \"0\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 12}, {\"key\": 97, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 97\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 174, \"status\": \"1\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 81}, {\"key\": 96, \"disabled\": true, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 96\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 914, \"status\": \"0\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 7}, {\"key\": 95, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 95\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 698, \"status\": \"2\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 82}, {\"key\": 94, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 94\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 488, \"status\": \"1\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 14}, {\"key\": 93, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 93\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 580, \"status\": \"2\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 77}, {\"key\": 92, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 92\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 244, \"status\": \"3\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 58}, {\"key\": 91, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 91\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 959, \"status\": \"0\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 66}, {\"key\": 90, \"disabled\": true, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 90\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 958, \"status\": \"0\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 72}, {\"key\": 89, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 89\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 301, \"status\": \"2\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 2}, {\"key\": 88, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 88\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 277, \"status\": \"1\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 12}, {\"key\": 87, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 87\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 810, \"status\": \"1\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 82}, {\"key\": 86, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 86\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 780, \"status\": \"3\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 22}, {\"key\": 85, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 85\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 705, \"status\": \"3\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 12}, {\"key\": 84, \"disabled\": true, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 84\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 203, \"status\": \"0\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 79}, {\"key\": 83, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 83\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 491, \"status\": \"2\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 59}, {\"key\": 82, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 82\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 73, \"status\": \"0\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 100}, {\"key\": 81, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png\", \"name\": \"TradeCode 81\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 406, \"status\": \"3\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 61}, {\"key\": 80, \"disabled\": false, \"href\": \"https: //ant.design\", \"avatar\": \"https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png\", \"name\": \"TradeCode 80\", \"owner\": \"曲丽丽\", \"desc\": \"这是一段描述\", \"callNo\": 112, \"status\": \"2\", \"updatedAt\": \"2022-12-06T05: 00: 57.040Z\", \"createdAt\": \"2022-12-06T05: 00: 57.040Z\", \"progress\": 20}] */\n        data: {\n      key: number,\ndisabled: boolean,\nhref: string,\navatar: string,\nname: string,\nowner: string,\ndesc: string,\ncallNo: number,\nstatus: string,\nupdatedAt: string,\ncreatedAt: string,\nprogress: number\n      }[];\n  /** example: 100 */\n        total: number;\n  /** example: true */\n        success: boolean;\n  /** example: 20 */\n        pageSize: number;\n  /** example: 1 */\n        current: number\n}\n  "
+  },
+  "POST /api/login/outLogin": {
+    "res": {
+      "data": {},
+      "success": true
+    },
+    "query": {
+      "token ": " 123"
+    },
+    "payload": {},
+    "types": "/** POST /api/login/outLogin */\nexport type POST_API_LOGIN_OUT_LOGIN_QUERY = {\n  /** example:  123 */\n        token : string\n}\n  \n\nexport type POST_API_LOGIN_OUT_LOGIN_PAYLOAD = {\n  \n}\n  \n\nexport type POST_API_LOGIN_OUT_LOGIN_RES = {\n  /** example: {} */\n        data: {\n      \n      };\n  /** example: true */\n        success: boolean\n}\n  "
+  },
+  "POST /api/login/account": {
+    "res": {
+      "status": "ok",
+      "type": "account",
+      "currentAuthority": "admin"
+    },
+    "query": {
+      "token ": " 123"
+    },
+    "payload": {
+      "username": "admin",
+      "password": "ant.design",
+      "autoLogin": true,
+      "type": "account"
+    },
+    "types": "/** POST /api/login/account */\nexport type POST_API_LOGIN_ACCOUNT_QUERY = {\n  /** example:  123 */\n        token : string\n}\n  \n\nexport type POST_API_LOGIN_ACCOUNT_PAYLOAD = {\n  /** example: admin */\n        username: string;\n  /** example: ant.design */\n        password: string;\n  /** example: true */\n        autoLogin: boolean;\n  /** example: account */\n        type: string\n}\n  \n\nexport type POST_API_LOGIN_ACCOUNT_RES = {\n  /** example: ok */\n        status: string;\n  /** example: account */\n        type: string;\n  /** example: admin */\n        currentAuthority: string\n}\n  "
+  }
+}
diff --git a/types/cache/mock/login.mock.cache.js b/types/cache/mock/login.mock.cache.js
new file mode 100644
index 0000000..6c59e19
--- /dev/null
+++ b/types/cache/mock/login.mock.cache.js
@@ -0,0 +1,324 @@
+module.exports = {
+  'GET /api/currentUser': {
+    data: {
+      name: 'Serati Ma',
+      avatar: 'https://gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png',
+      userid: '00000001',
+      email: 'antdesign@alipay.com',
+      signature: '海纳百川,有容乃大',
+      title: '交互专家',
+      group: '蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED',
+      tags: [
+        { key: '0', label: '很有想法的' },
+        { key: '1', label: '专注设计' },
+        { key: '2', label: '辣~' },
+        { key: '3', label: '大长腿' },
+        { key: '4', label: '川妹子' },
+        { key: '5', label: '海纳百川' },
+      ],
+      notifyCount: 12,
+      unreadCount: 11,
+      country: 'China',
+      geographic: {
+        province: { label: '浙江省', key: '330000' },
+        city: { label: '杭州市', key: '330100' },
+      },
+      address: '西湖区工专路 77 号',
+      phone: '0752-268888888',
+    },
+  },
+  'GET /api/rule': {
+    data: [
+      {
+        key: 99,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 99',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 503,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 81,
+      },
+      {
+        key: 98,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 98',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 164,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 12,
+      },
+      {
+        key: 97,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 97',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 174,
+        status: '1',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 81,
+      },
+      {
+        key: 96,
+        disabled: true,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 96',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 914,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 7,
+      },
+      {
+        key: 95,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 95',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 698,
+        status: '2',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 82,
+      },
+      {
+        key: 94,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 94',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 488,
+        status: '1',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 14,
+      },
+      {
+        key: 93,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 93',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 580,
+        status: '2',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 77,
+      },
+      {
+        key: 92,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 92',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 244,
+        status: '3',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 58,
+      },
+      {
+        key: 91,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 91',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 959,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 66,
+      },
+      {
+        key: 90,
+        disabled: true,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 90',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 958,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 72,
+      },
+      {
+        key: 89,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 89',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 301,
+        status: '2',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 2,
+      },
+      {
+        key: 88,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 88',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 277,
+        status: '1',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 12,
+      },
+      {
+        key: 87,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 87',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 810,
+        status: '1',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 82,
+      },
+      {
+        key: 86,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 86',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 780,
+        status: '3',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 22,
+      },
+      {
+        key: 85,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 85',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 705,
+        status: '3',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 12,
+      },
+      {
+        key: 84,
+        disabled: true,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 84',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 203,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 79,
+      },
+      {
+        key: 83,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 83',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 491,
+        status: '2',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 59,
+      },
+      {
+        key: 82,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 82',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 73,
+        status: '0',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 100,
+      },
+      {
+        key: 81,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png',
+        name: 'TradeCode 81',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 406,
+        status: '3',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 61,
+      },
+      {
+        key: 80,
+        disabled: false,
+        href: 'https://ant.design',
+        avatar: 'https://gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png',
+        name: 'TradeCode 80',
+        owner: '曲丽丽',
+        desc: '这是一段描述',
+        callNo: 112,
+        status: '2',
+        updatedAt: '2022-12-06T05:00:57.040Z',
+        createdAt: '2022-12-06T05:00:57.040Z',
+        progress: 20,
+      },
+    ],
+    total: 100,
+    success: true,
+    pageSize: 20,
+    current: 1,
+  },
+  'POST /api/login/outLogin': { data: {}, success: true },
+  'POST /api/login/account': {
+    status: 'ok',
+    type: 'account',
+    currentAuthority: 'admin',
+  },
+};
diff --git a/types/cache/mock/mock.cache.js b/types/cache/mock/mock.cache.js
new file mode 100644
index 0000000..e69de29
diff --git a/types/index.d.ts b/types/index.d.ts
new file mode 100644
index 0000000..2c2805a
--- /dev/null
+++ b/types/index.d.ts
@@ -0,0 +1,120 @@
+export namespace API {
+  /** GET /api/currentUser */
+  export type GET_API_CURRENT_USER_QUERY = {
+    /** example:  123 */
+    token: string;
+  };
+
+  export type GET_API_CURRENT_USER_PAYLOAD = Record<string, any>;
+
+  export type GET_API_CURRENT_USER_RES = {
+    /** example: {"name": "Serati Ma", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/BiazfanxmamNRoxxVxka.png", "userid": "00000001", "email": "antdesign@alipay.com", "signature": "海纳百川,有容乃大", "title": "交互专家", "group": "蚂蚁金服-某某某事业群-某某平台部-某某技术部-UED", "tags": [{"key": "0", "label": "很有想法的"}, {"key": "1", "label": "专注设计"}, {"key": "2", "label": "辣~"}, {"key": "3", "label": "大长腿"}, {"key": "4", "label": "川妹子"}, {"key": "5", "label": "海纳百川"}], "notifyCount": 12, "unreadCount": 11, "country": "China", "geographic": {"province": {"label": "浙江省", "key": "330000"}, "city": {"label": "杭州市", "key": "330100"}}, "address": "西湖区工专路 77 号", "phone": "0752-268888888"} */
+    data: {
+      name: string;
+      avatar: string;
+      userid: string;
+      email: string;
+      signature: string;
+      title: string;
+      group: string;
+      tags: {
+        key: string;
+        label: string;
+      }[];
+      notifyCount: number;
+      unreadCount: number;
+      country: string;
+      geographic: {
+        province: {
+          label: string;
+          key: string;
+        };
+        city: {
+          label: string;
+          key: string;
+        };
+      };
+      address: string;
+      phone: string;
+    };
+  };
+
+  /** GET /api/rule */
+  export type GET_API_RULE_QUERY = {
+    /** example:  123 */
+    token: string;
+    /** example: 1 */
+    current: string;
+    /** example: 20 */
+    pageSize: string;
+  };
+
+  export type GET_API_RULE_PAYLOAD = Record<string, any>;
+
+  export type GET_API_RULE_RES = {
+    /** example: [{"key": 99, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 99", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 503, "status": "0", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 81}, {"key": 98, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 98", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 164, "status": "0", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 12}, {"key": 97, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 97", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 174, "status": "1", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 81}, {"key": 96, "disabled": true, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 96", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 914, "status": "0", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 7}, {"key": 95, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 95", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 698, "status": "2", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 82}, {"key": 94, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 94", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 488, "status": "1", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 14}, {"key": 93, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 93", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 580, "status": "2", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 77}, {"key": 92, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 92", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 244, "status": "3", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 58}, {"key": 91, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 91", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 959, "status": "0", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 66}, {"key": 90, "disabled": true, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 90", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 958, "status": "0", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 72}, {"key": 89, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 89", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 301, "status": "2", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 2}, {"key": 88, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 88", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 277, "status": "1", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 12}, {"key": 87, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 87", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 810, "status": "1", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 82}, {"key": 86, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 86", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 780, "status": "3", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 22}, {"key": 85, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 85", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 705, "status": "3", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 12}, {"key": 84, "disabled": true, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 84", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 203, "status": "0", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 79}, {"key": 83, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 83", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 491, "status": "2", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 59}, {"key": 82, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 82", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 73, "status": "0", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 100}, {"key": 81, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/udxAbMEhpwthVVcjLXik.png", "name": "TradeCode 81", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 406, "status": "3", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 61}, {"key": 80, "disabled": false, "href": "https: //ant.design", "avatar": "https: //gw.alipayobjects.com/zos/rmsportal/eeHMaZBwmTvLdIwMfBpg.png", "name": "TradeCode 80", "owner": "曲丽丽", "desc": "这是一段描述", "callNo": 112, "status": "2", "updatedAt": "2022-12-06T05: 00: 57.040Z", "createdAt": "2022-12-06T05: 00: 57.040Z", "progress": 20}] */
+    data: {
+      key: number;
+      disabled: boolean;
+      href: string;
+      avatar: string;
+      name: string;
+      owner: string;
+      desc: string;
+      callNo: number;
+      status: string;
+      updatedAt: string;
+      createdAt: string;
+      progress: number;
+    }[];
+    /** example: 100 */
+    total: number;
+    /** example: true */
+    success: boolean;
+    /** example: 20 */
+    pageSize: number;
+    /** example: 1 */
+    current: number;
+  };
+
+  /** POST /api/login/outLogin */
+  export type POST_API_LOGIN_OUT_LOGIN_QUERY = {
+    /** example:  123 */
+    token: string;
+  };
+
+  export type POST_API_LOGIN_OUT_LOGIN_PAYLOAD = Record<string, any>;
+
+  export type POST_API_LOGIN_OUT_LOGIN_RES = {
+    /** example: {} */
+    data: Record<string, any>;
+    /** example: true */
+    success: boolean;
+  };
+
+  /** POST /api/login/account */
+  export type POST_API_LOGIN_ACCOUNT_QUERY = {
+    /** example:  123 */
+    token: string;
+  };
+
+  export type POST_API_LOGIN_ACCOUNT_PAYLOAD = {
+    /** example: admin */
+    username: string;
+    /** example: ant.design */
+    password: string;
+    /** example: true */
+    autoLogin: boolean;
+    /** example: account */
+    type: string;
+  };
+
+  export type POST_API_LOGIN_ACCOUNT_RES = {
+    /** example: ok */
+    status: string;
+    /** example: account */
+    type: string;
+    /** example: admin */
+    currentAuthority: string;
+  };
+}