Prechádzať zdrojové kódy

增加后台管理,支持docker部署

ageer 1 rok pred
rodič
commit
7fe89a931b
59 zmenil súbory, kde vykonal 3886 pridanie a 1502 odobranie
  1. 41 38
      README.md
  2. BIN
      image/25.png
  3. BIN
      img.png
  4. 10 1
      ruoyi-admin/Dockerfile
  5. 0 1
      ruoyi-admin/src/main/java/com/xmzs/controller/IndexController.java
  6. 15 5
      ruoyi-admin/src/main/java/com/xmzs/controller/WeChatController.java
  7. 6 5
      ruoyi-admin/src/main/resources/application-dev.yml
  8. 25 28
      ruoyi-admin/src/main/resources/application.yml
  9. 0 0
      ruoyi-admin/src/main/resources/static/assets/css/iconfont.css
  10. 8 0
      ruoyi-admin/src/main/resources/static/assets/css/onlinewebfonts.css
  11. 0 0
      ruoyi-admin/src/main/resources/static/assets/css/vno.css
  12. BIN
      ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.eot
  13. 963 0
      ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.svg
  14. BIN
      ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.ttf
  15. BIN
      ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.woff
  16. BIN
      ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.woff2
  17. BIN
      ruoyi-admin/src/main/resources/static/assets/img/logo.jpg
  18. BIN
      ruoyi-admin/src/main/resources/static/assets/img/logo1.jpg
  19. BIN
      ruoyi-admin/src/main/resources/static/assets/img/logo2.jpg
  20. BIN
      ruoyi-admin/src/main/resources/static/assets/img/logo3.jpg
  21. 38 0
      ruoyi-admin/src/main/resources/static/assets/js/bing.js
  22. 104 0
      ruoyi-admin/src/main/resources/static/assets/js/main.js
  23. 1 0
      ruoyi-admin/src/main/resources/static/assets/json/images.json
  24. 1 0
      ruoyi-admin/src/main/resources/static/assets/svg/favicon.svg
  25. 95 746
      ruoyi-admin/src/main/resources/static/index.html
  26. 4 2
      ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/utils/TikTokensUtil.java
  27. 3 0
      ruoyi-common/ruoyi-common-pay/src/main/java/com/xmzs/common/service/impl/PayServiceImpl.java
  28. 6 6
      ruoyi-common/ruoyi-common-web/src/main/java/com/xmzs/common/web/interceptor/PlusWebInvokeTimeInterceptor.java
  29. 1 6
      ruoyi-common/ruoyi-common-wechat/src/main/java/com/xmzs/common/wechat/Wechat.java
  30. 66 67
      ruoyi-common/ruoyi-common-wechat/src/main/java/com/xmzs/common/wechat/controller/LoginController.java
  31. 14 68
      ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/controller/FaceController.java
  32. 89 297
      ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/controller/SubmitController.java
  33. 20 63
      ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/controller/TaskController.java
  34. 56 0
      ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/domain/MjPriceConfig.java
  35. 0 3
      ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/dto/SubmitActionDTO.java
  36. 19 0
      ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/dto/SubmitModalDTO.java
  37. 17 0
      ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/dto/SubmitShortenDTO.java
  38. 32 0
      ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/enums/ActionType.java
  39. 3 3
      ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/enums/BlendDimensions.java
  40. 65 0
      ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/util/MjOkHttpUtil.java
  41. 114 0
      ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/controller/system/SysModelController.java
  42. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/domain/PaymentOrders.java
  43. 68 0
      ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/domain/SysModel.java
  44. 73 0
      ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/domain/bo/SysModelBo.java
  45. 76 0
      ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/domain/vo/SysModelVo.java
  46. 20 17
      ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/listener/SSEEventSourceListener.java
  47. 15 0
      ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/mapper/SysModelMapper.java
  48. 37 0
      ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/service/IChatCostService.java
  49. 48 0
      ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/service/ISysModelService.java
  50. 160 0
      ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/service/impl/ChatCostServiceImpl.java
  51. 63 29
      ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/service/impl/SseServiceImpl.java
  52. 1 1
      ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/service/impl/SysDictTypeServiceImpl.java
  53. 110 0
      ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/service/impl/SysModelServiceImpl.java
  54. 3 2
      ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/service/impl/SysUserServiceImpl.java
  55. 7 0
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysModelMapper.xml
  56. 1 1
      ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
  57. 5 0
      script/docker/.env
  58. 53 112
      script/docker/docker-compose.yml
  59. 1329 0
      script/docker/ry-vue.sql

+ 41 - 38
README.md

@@ -1,30 +1,23 @@
 ## 平台简介
-[![License](https://img.shields.io/badge/License-MIT-blue.svg)](https://gitee.com/ageerle/ruoyi-ai/blob/master/LICENSE)
-[![使用IntelliJ IDEA开发维护](https://img.shields.io/badge/IntelliJ%20IDEA-提供支持-blue.svg)](https://www.jetbrains.com/?from=ruoyi-chatgpt)
-<br>
-[![RuoYi-Vue-Plus](https://img.shields.io/badge/RuoYi_Vue_Plus-5.0.0-success.svg)](https://gitee.com/dromara/RuoYi-Vue-Plus)
-[![Spring Boot](https://img.shields.io/badge/Spring%20Boot-3.0-blue.svg)]()
-[![JDK-17](https://img.shields.io/badge/JDK-17-green.svg)]()
 
 > 基于ruoyi-plus实现AI聊天和绘画功能-后端
-后台管理界面使用elementUI 服务端使用Java17+SpringBoot3.X
 
-> 项目文档:https://1m29197bp6.k.topthink.com/@ruoyi-ai/xiangmuchushihua.html
+> 本项目完全开源免费!
+后台管理界面使用elementUI服务端使用Java17+SpringBoot3.X
+
+> Docker部署文档:https://easydoc.net/s/80136029
 
 实现功能
-1. 支持ChatGPT4,Dall-E-3,ChatGPT-4-All(文件对话,图文对话)模型
-2. 支持GPTS 可以使用Openai的所有的GPTs
-3. 支持语音克隆
-4. 支持文生图模型 MidJourney(mj换脸,混图,重绘,角色一致性)
+1. 支持ChatGPT4,Dall-E-3,ChatGPT-4-All模型
+2. 支持语音克隆(只需5分钟素材,即可克隆任意音色,基于GPT-SoVITS实现)
+3. 支持GPTS 可以使用Openai的所有的GPTs
+4. 支持文生图模型 MidJourney
 5. 支持微信小程序
 6. 支持个人二维码实时到账(易支付)
-7. 支持suno-v3(文生音乐)
+7. 支持斗鱼、B站等直播间弹幕监听和AI自动回复
 8. 支持个人微信接入ChatGPT
-9. 支持stable-diffusion(对话式)
-10. 支持私有知识库
-
->测试功能: 微信机器人
->
+>测试功能: 私有知识库
+> 
 >项目地址
 <ul>
 <li>小程序端: https://github.com/ageerle/ruoyi-uniapp</li>
@@ -33,6 +26,7 @@
 <li>演示地址: https://web.pandarobot.chat</li>
 </ul>
 
+
 ## 小程序演示
 <div>
   <img style="margin:10px" src="./image/03.png" alt="drawing" width="300px" height="400px"/>
@@ -49,38 +43,41 @@
 <div>
   <img style="margin-top:10px" src="./image/07.png" alt="drawing" width="550px" height="300px"/>
   <img style="margin-top:10px" src="./image/08.png" alt="drawing" width="550px" height="300px"/>
-  <img style="margin-top:10px" src="./image/13.png" alt="drawing" width="550px" height="300px"/>
-  <img style="margin-top:10px" src="./image/14.png" alt="drawing" width="550px" height="300px"/>
 </div>
 
-## 绘图(mj换脸、mj混图、mj角色一致(英文)、sd绘图)
+## MJ绘图
 <div>
   <img style="margin-top:10px" src="./image/10.png" alt="drawing" width="550px" height="300px"/>
   <img style="margin-top:10px" src="./image/11.png" alt="drawing" width="550px" height="300px"/>
-  <img style="margin-top:10px" src="./image/15.png" alt="drawing" width="550px" height="300px"/>
-  <img style="margin-top:10px" src="./image/16.png" alt="drawing" width="550px" height="300px"/>
 </div>
 
-## 语音克隆
+## 微信智能助手
 <div>
-  <img style="margin-top:10px" src="./image/17.png" alt="drawing" width="550px" height="300px"/>
-  <img style="margin-top:10px" src="./image/18.png" alt="drawing" width="550px" height="300px"/>
+  <img style="margin-top:10px" src="./image/09.png" alt="drawing" width="550px" height="300px"/>
 </div>
 
-## 知识库
-<div>
-  <img style="margin:10px" src="./image/12.png" alt="drawing" width="550px" height="400px"/>
-  <img style="margin:10px" src="./image/私有知识库业务架构图.drawio.png" alt="drawing" width="550px" height="400px"/>
-  <img style="margin-top:10px" src="./image/19.png" alt="drawing" width="550px" height="300px"/>
-  <img style="margin-top:10px" src="./image/20.png" alt="drawing" width="550px" height="300px"/>
-  <img style="margin-top:10px" src="./image/21.png" alt="drawing" width="550px" height="300px"/>
-  <img style="margin-top:10px" src="./image/22.png" alt="drawing" width="550px" height="300px"/>
-</div>
+## 语音克隆
+
+
+https://github.com/ageerle/ruoyi-ai/assets/32251822/c3dd75eb-c5bd-4ab0-93bf-9221f4888827
+
 
-## 后台管理
+
+## 弹幕助手
+
+
+https://github.com/ageerle/ruoyi-ai/assets/32251822/2d809d94-6cfb-41b1-9dc0-a72ccfc63ba2
+
+
+
+## 私有知识库管理
 <div>
-    <img style="margin-top:10px" src="./image/23.png" alt="drawing" width="550px" height="300px"/>
-  <img style="margin-top:10px" src="./image/24.png" alt="drawing" width="550px" height="300px"/>
+  <img style="margin-top:10px;width:50%" src="./image/12.png" alt="drawing" width="550px" height="300px"/>
+  <img style="margin-top:10px;width:50%" src="./image/私有知识库业务架构图.drawio.png" alt="drawing" width="550px" height="300px"/>
+  <img style="margin-top:10px;width:50%" src="https://github.com/ageerle/ruoyi-ai/assets/32251822/6d44ebcc-1ec4-43e0-b164-cac150e8a044" alt="drawing" width="550px" height="300px"/>
+  <img style="margin-top:10px;width:50%" src="https://github.com/ageerle/ruoyi-ai/assets/32251822/fbd50daf-19d9-4e0f-8e5e-8603af5fb520" alt="drawing" width="550px" height="300px"/>
+  <img style="margin-top:10px;width:50%" src="https://github.com/ageerle/ruoyi-ai/assets/32251822/b14dffe7-2ae1-4fa3-8bb0-bf0b44d7ebd9" alt="drawing" width="550px" height="300px"/>
+  <img style="margin-top:10px;width:50%" src="https://github.com/ageerle/ruoyi-ai/assets/32251822/4ae97a41-f1d2-4bb2-966f-83211193a115" alt="drawing" width="550px" height="300px"/>
 </div>
 
 ## 进群学习
@@ -88,6 +85,12 @@
   <img src="./image/01.png" alt="drawing" width="300px" height="300px"/>
 </div>
 
+## 支持一下
+
+<div>
+  <img src="./image/25.png" alt="drawing" width="300px" height="300px"/>
+</div>
+
 ## 参考项目
 <ol>
 <li>https://github.com/Grt1228/chatgpt-java</li>

BIN
image/25.png


BIN
img.png


+ 10 - 1
ruoyi-admin/Dockerfile

@@ -1,6 +1,12 @@
 #基础镜像
 FROM findepi/graalvm:java17-native
 
+# 设置环境变量
+ENV LANG C.UTF-8
+ENV LANGUAGE C.UTF-8
+ENV LC_ALL C.UTF-8
+ENV SERVER_PORT=6039
+
 MAINTAINER ageerle
 
 RUN mkdir -p /ruoyi/server/logs \
@@ -11,12 +17,13 @@ RUN mkdir -p /ruoyi/server/logs \
 #工作空间
 WORKDIR /ruoyi/server
 
-ENV SERVER_PORT=6039
+
 
 EXPOSE ${SERVER_PORT}
 
 ADD ./target/ruoyi-admin.jar ./app.jar
 
+
 ENTRYPOINT ["java", \
             "-Djava.security.egd=file:/dev/./urandom", \
             "-Dserver.port=${SERVER_PORT}", \
@@ -24,3 +31,5 @@ ENTRYPOINT ["java", \
 #            "-Dskywalking.agent.service_name=ruoyi-server", \
 #            "-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar", \
             "-jar", "app.jar"]
+
+

+ 0 - 1
ruoyi-admin/src/main/java/com/xmzs/controller/IndexController.java

@@ -15,7 +15,6 @@ import org.springframework.web.bind.annotation.GetMapping;
 @Controller
 public class IndexController {
 
-
     /**
      * 访问首页,提示语
      */

+ 15 - 5
ruoyi-admin/src/main/java/com/xmzs/controller/WeChatController.java

@@ -1,9 +1,11 @@
 package com.xmzs.controller;
 
 import cn.dev33.satoken.annotation.SaIgnore;
+import com.xmzs.common.core.domain.R;
 import com.xmzs.common.wechat.Wechat;
+import com.xmzs.common.wechat.controller.LoginController;
+import com.xmzs.common.wechat.core.MsgCenter;
 import com.xmzs.system.cofing.KeywordConfig;
-import com.xmzs.system.cofing.QqConfig;
 import com.xmzs.system.cofing.WechatConfig;
 import com.xmzs.system.handler.WechatMessageHandler;
 import com.xmzs.system.service.ISseService;
@@ -11,7 +13,7 @@ import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 /**
@@ -39,13 +41,21 @@ public class WeChatController {
      * 获取微信登录二维码
      *
      */
-    @PostMapping("/getQr")
-    public void getQr() {
+    @GetMapping("/getQr")
+    public R<String> getQr() {
         //微信
         if (wechatConfig.getEnable()){
             log.info("正在登录微信,请按提示操作:");
-            wechatBot = new Wechat(new WechatMessageHandler(sseService, keywordConfig), wechatConfig.getQrPath());
+            wechatBot = new Wechat(new WechatMessageHandler(sseService, keywordConfig));
+            // 登陆
+            LoginController login = new LoginController();
+            String qrCode = login.login_1();
+            new Thread(login::login_2).start();
             wechatBot.start();
+            return R.ok(qrCode);
+        }else {
+            return R.fail();
         }
     }
+
 }

+ 6 - 5
ruoyi-admin/src/main/resources/application-dev.yml

@@ -49,9 +49,10 @@ spring:
           driverClassName: com.mysql.cj.jdbc.Driver
           # jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
           # rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
-          url: jdbc:mysql://127.0.0.1:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
-          username: ry-vue
-          password: ry-vue
+          url: ${DB_URL}
+          username: ${DB_USERNAME}
+          password: ${DB_PASSWORD}
+
 
         # 从库数据源
       #        slave:
@@ -103,9 +104,9 @@ spring:
 spring.data:
   redis:
     # 地址
-    host: localhost
+    host: ${REDIS_HOST}
     # 端口,默认为6379
-    port: 6379
+    port: ${REDIS_PORT}
     # 数据库索引
     database: 0
     # 密码(如没有密码请注释掉)

+ 25 - 28
ruoyi-admin/src/main/resources/application.yml

@@ -48,7 +48,7 @@ server:
 # 日志配置
 logging:
   level:
-    com.xmzs: @logging.level@
+    com.xmzs: '@logging.level@'
     org.springframework: warn
   config: classpath:logback-plus.xml
 
@@ -69,7 +69,7 @@ spring:
     # 国际化资源文件路径
     basename: i18n/messages
   profiles:
-    active: @profiles.active@
+    active: '@profiles.active@'
   # 文件上传
   servlet:
     multipart:
@@ -332,26 +332,24 @@ keyword:
   #  ai语音指令(TTS模型 https://platform.openai.com/docs/api-reference/audio)
   audio: "ai语音"
 
+#绘画价格配置(元)
 mj:
-  api-secret: 'sk-xx'
-  task-store:
-    type: in_memory
-    timeout: 30d
-  translate-way: gpt
-  #  proxy:
-  #    host: 127.0.0.1
-  #    port: 10809
-  ng-discord:
-    server: 'https://xxx.pandarobot.chat/'
-    cdn: 'https://xxx.pandarobot.chat/'
-    wss: 'https://xxx.pandarobot.chat/'
-  openai:
-    gpt-api-url: 'https://api.pandarobot.chat/'
-    gpt-api-key: 'sk-xx'
-  accounts:
-    - guild-id: 'xx'
-      channel-id: 'xx'
-      user-token: 'xx'
+  # 放大
+  upsample: 0.1
+  # 变化
+  change: 0.3
+  # 图生图
+  blend: 0.3
+  # 图生文
+  describe: 0.1
+  # 文生图
+  imagine: 0.3
+  # 局部重绘
+  inpaint: 0.3
+  # 提示词分析
+  shorten: 0.1
+  # 换脸
+  faceSwapping: 0.3
 
 --- # mail 邮件发送
 mail:
@@ -365,7 +363,7 @@ mail:
   # 用户名(注意:如果使用foxmail邮箱,此处user为qq号)
   user: ageerle@163.com
   # 密码(填写授权码)
-  pass: xx
+  pass: ${MAIL_PASS}
   # 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。
   starttlsEnable: true
   # 使用SSL安全连接
@@ -375,15 +373,14 @@ mail:
   # Socket连接超时值,单位毫秒,缺省值不超时
   connectionTimeout: 0
 
-# chatgpt配置信息
+# chatgpt和mj共用一个key
 chat:
-  apiKey: 'sk-xxx'
-  apiHost: 'https://api.pandarobot.chat/'
-
+  apiKey: ${CHAT_API_KEY}
+  apiHost: ${CHAT_API_HOST}
 # 支付配置信息
 pay:
-  pid: 'xxx'
-  key: 'xxx'
+  pid: ${PAY_PID}
+  key: ${PAY_KEY}
   payUrl: 'https://pay.pandarobot.chat/mapi.php'
   notify_url: 'https://www.pandarobot.chat/pay/returnUrl'
   return_url: 'https://www.pandarobot.chat/pay/notifyUrl'

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
ruoyi-admin/src/main/resources/static/assets/css/iconfont.css


+ 8 - 0
ruoyi-admin/src/main/resources/static/assets/css/onlinewebfonts.css

@@ -0,0 +1,8 @@
+@font-face {font-family: "Engravers' Old English BT";
+    src: url("https://unpkg.com/dmego-home-page@latest/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.eot"); /* IE9*/
+    src: url("https://unpkg.com/dmego-home-page@latest/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.eot?#iefix") format("embedded-opentype"), /* IE6-IE8 */
+    url("https://unpkg.com/dmego-home-page@latest/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.woff2") format("woff2"), /* chrome firefox */
+    url("https://unpkg.com/dmego-home-page@latest/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.woff") format("woff"), /* chrome firefox */
+    url("https://unpkg.com/dmego-home-page@latest/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.ttf") format("truetype"), /* chrome firefox opera Safari, Android, iOS 4.2+*/
+    url("https://unpkg.com/dmego-home-page@latest/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.svg#Engravers' Old English BT") format("svg"); /* iOS 4.1- */
+}

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
ruoyi-admin/src/main/resources/static/assets/css/vno.css


BIN
ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.eot


+ 963 - 0
ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.svg

@@ -0,0 +1,963 @@
+<?xml version="1.0" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
+<svg>
+<metadata>
+Created by FontForge 20120731 at Wed Jul 10 02:09:32 2019
+ By www
+Copyright 1990-2003 Bitstream Inc. All rights reserved.
+</metadata>
+<defs>
+<font id="EngraversOldEnglishBTW03-Rg" horiz-adv-x="934" >
+  <font-face 
+    font-family="EngraversOldEnglishBTW03-Rg"
+    font-weight="400"
+    font-stretch="normal"
+    units-per-em="2048"
+    panose-1="3 4 7 2 4 6 8 3 6 3"
+    ascent="1556"
+    descent="-492"
+    x-height="991"
+    cap-height="1442"
+    bbox="-342 -483 2247 1898"
+    underline-thickness="50"
+    underline-position="-206"
+    unicode-range="U+0020-F002"
+  />
+<missing-glyph horiz-adv-x="1229" 
+d="M102 -362v1806h1024v-1806h-1024zM217 -248h795v1577h-795v-1577z" />
+    <glyph glyph-name=".notdef" horiz-adv-x="1229" 
+d="M102 -362v1806h1024v-1806h-1024zM217 -248h795v1577h-795v-1577z" />
+    <glyph glyph-name="glyph1" horiz-adv-x="0" 
+ />
+    <glyph glyph-name="glyph2" horiz-adv-x="467" 
+ />
+    <glyph glyph-name="space" unicode=" " horiz-adv-x="467" 
+ />
+    <glyph glyph-name="exclam" unicode="!" horiz-adv-x="555" 
+d="M266 -4q-35 40 -71.5 76t-75.5 69q40 37 76.5 76t70.5 82q30 -31 68 -66.5t88 -78.5q-39 -31 -78 -70t-78 -88zM262 391l-98 797q-27 21 -44.5 37.5t-29.5 34.5q55 39 101.5 86.5t80.5 99.5q28 -80 79 -125t126 -55q-26 -25 -57 -46t-68 -38z" />
+    <glyph glyph-name="quotedbl" unicode="&#x22;" horiz-adv-x="686" 
+d="M526 860h-34l-70 459q-1 7 -1.5 14.5t-0.5 22.5q0 51 22.5 78.5t65.5 27.5q42 0 66 -27t24 -75q0 -16 -0.5 -24.5t-1.5 -16.5zM195 860h-35l-70 459q-2 17 -3 26t-1 15q0 48 24 75t66 27q44 0 67 -27.5t23 -78.5q0 -16 -0.5 -23.5t-1.5 -14.5z" />
+    <glyph glyph-name="numbersign" unicode="#" horiz-adv-x="1575" 
+d="M702 864l-98 -276h283l96 276h-281zM760 1458h155l-161 -454h276l162 454h156l-162 -454h301l-49 -140h-301l-97 -276h320l-49 -139h-320l-162 -453h-155l162 453h-279l-162 -453h-153l159 453h-313l51 139h312l98 276h-336l51 140h334z" />
+    <glyph glyph-name="dollar" unicode="$" 
+d="M472 1214v-460l123 166q8 10 23 30q131 174 155 264q-40 -51 -78.5 -74.5t-81.5 -23.5q-44 0 -77.5 23.5t-63.5 74.5zM437 713v501l-123 -36v-498h101zM472 217l33 -41l121 29v508h-144l-10 -17v-479zM75 178q56 55 109 81t108 26q35 0 69 -11t76 -36v434
+q-33 -51 -167.5 -208.5t-194.5 -285.5zM12 4q3 198 256 505q30 36 46 56h-212q1 5 5 16q33 86 33 150v332q0 39 -10.5 71t-35.5 72q17 -3 37 -4.5t58 -1.5q74 0 136 12t112 35v223h35v-206q30 14 62.5 37t68.5 57q41 -53 67.5 -71.5t53.5 -18.5q33 0 58.5 26t28.5 64h28
+q-10 -106 -58.5 -210t-201.5 -308h256q-16 -28 -23.5 -60t-7.5 -67v-426q0 -28 10 -64t33 -86q-48 18 -90.5 26.5t-85.5 8.5q-52 0 -101 -12.5t-98 -38.5v-279h-35v258q-31 -23 -57.5 -49.5t-50.5 -56.5q-65 86 -103 114.5t-77 28.5q-45 0 -73.5 -34.5t-37.5 -98.5h-26z" />
+    <glyph glyph-name="percent" unicode="%" horiz-adv-x="1636" 
+d="M1163 1362h47l-796 -1399h-49zM922 51q6 44 26.5 76.5t57.5 56.5v400q0 45 -8 78.5t-25 66.5h5q40 -4 58 -4q100 0 190.5 34t168.5 101q22 -61 50 -89t68 -28q3 0 10.5 1.5t20.5 4.5q-9 -27 -23.5 -48t-35.5 -38v-419q0 -35 7.5 -75t22.5 -83q-30 5 -52 7.5t-42 2.5
+q-83 0 -156.5 -32.5t-146.5 -102.5q-32 46 -71 71t-76 25q-9 0 -22 -1.5t-27 -4.5zM1143 195q39 -16 67.5 -42t46.5 -65q28 10 50.5 17t42.5 12v516q-34 11 -59.5 34t-51.5 66q-30 -11 -53 -18t-43 -10v-510zM244 709q39 -16 67.5 -42t46.5 -65q24 8 48 15.5t46 13.5l1 516
+q-35 11 -61.5 35t-51.5 65q-30 -11 -53 -18t-43 -10v-510zM25 566q6 43 26.5 75.5t57.5 56.5v400q0 45 -8 78.5t-25 66.5h5q40 -4 58 -4q100 0 190.5 34t168.5 101q22 -61 50 -89t68 -28q8 0 15.5 1.5t15.5 3.5q-9 -27 -23 -47t-36 -37v-422q0 -35 7.5 -74t22.5 -82
+q-31 6 -52.5 8t-41.5 2q-83 0 -156.5 -32.5t-146.5 -102.5q-32 46 -71 71t-76 25q-9 0 -22 -1.5t-27 -3.5z" />
+    <glyph glyph-name="ampersand" unicode="&#x26;" horiz-adv-x="1255" 
+d="M586 864l139 131l-213 314l-158 -133q80 -82 137 -159t95 -153zM444 131l172 201q-17 41 -72 160.5t-89 197.5l-262 -280q69 -62 132 -131.5t119 -147.5zM332 -45q-112 143 -179 216.5t-114 107.5l399 440q-62 127 -129.5 214t-132.5 126l459 399q73 -126 129.5 -207
+t120.5 -155l-283 -262q42 -81 79.5 -166t72.5 -176l272 337q12 -58 35.5 -88t56.5 -30q27 0 48 15t40 48q-17 -106 -85.5 -182t-139.5 -76q-34 0 -60 20t-42 60l-111 -135q83 -176 148 -245t143 -69q49 0 90.5 24t71.5 69q-9 -118 -88.5 -201.5t-176.5 -83.5
+q-90 0 -163 76.5t-160 269.5z" />
+    <glyph glyph-name="quotesingle" unicode="'" horiz-adv-x="352" 
+d="M195 860h-35l-70 459q0 2 -1 8q-3 20 -3 29q0 50 23.5 78t66.5 28q42 0 66 -27t24 -75q0 -7 -0.5 -15t-3.5 -27z" />
+    <glyph glyph-name="parenleft" unicode="(" horiz-adv-x="639" 
+d="M432 -274l-31 14l17 33q-130 131 -200.5 309.5t-70.5 376.5q0 280 121.5 552.5t321.5 436.5v-43q-158 -169 -245 -374.5t-87 -409.5q0 -175 64 -337t200 -331l21 33l26 -17z" />
+    <glyph glyph-name="parenright" unicode=")" horiz-adv-x="639" 
+d="M223 1448l29 -14l-16 -33q129 -131 199.5 -310t70.5 -376q0 -280 -121 -552.5t-322 -436.5v43q159 167 246.5 374.5t87.5 411.5q0 173 -64 334t-202 332l-20 -33l-27 16z" />
+    <glyph glyph-name="asterisk" unicode="*" horiz-adv-x="1024" 
+d="M510 961l-164 -347l-168 125l279 260l-379 56l65 196l334 -186l-61 381h192l-63 -381l336 186l65 -196l-381 -56l281 -260l-168 -125z" />
+    <glyph glyph-name="plus" unicode="+" horiz-adv-x="1706" 
+d="M782 1221h142v-541h528v-139h-528v-541h-142v541h-528v139h528v541z" />
+    <glyph glyph-name="comma" unicode="," horiz-adv-x="467" 
+d="M96 72l164 184q65 -90 88 -149t23 -125q0 -78 -43 -146t-125 -119q9 28 13.5 54.5t4.5 54.5q0 77 -28 132.5t-97 113.5z" />
+    <glyph glyph-name="hyphen" unicode="-" horiz-adv-x="797" 
+d="M96 383l105 212q8 -25 20.5 -34.5t44.5 -9.5h47h240q39 0 75 10.5t72 32.5l-88 -191q-18 17 -38 24t-56 7h-37h-241q-25 0 -54.5 -10t-89.5 -41z" />
+    <glyph glyph-name="period" unicode="." horiz-adv-x="467" 
+d="M51 74l146 174q45 -66 81.5 -93.5t75.5 -27.5q10 0 24.5 4t37.5 12q-45 -92 -90.5 -132t-104.5 -40q-49 0 -93 26.5t-77 76.5z" />
+    <glyph glyph-name="slash" unicode="/" horiz-adv-x="635" 
+d="M-29 -190l533 1636h80l-533 -1636h-80z" />
+    <glyph glyph-name="zero" unicode="0" 
+d="M350 229q42 -12 78 -42.5t64 -75.5q19 6 43 12.5t75 19.5v953q-42 14 -75.5 41.5t-68.5 76.5q-26 -10 -56 -18t-59 -12zM49 66q8 48 34.5 85t76.5 68v819q0 55 -10.5 94t-34.5 74h6q55 -4 78 -4q134 0 256.5 40t226.5 118q26 -67 65.5 -102t88.5 -35q9 0 20 1.5t24 3.5
+q-11 -30 -30 -53.5t-49 -44.5v-841q0 -39 10.5 -83.5t32.5 -99.5q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5z" />
+    <glyph glyph-name="one" unicode="1" 
+d="M168 39q30 70 79 114.5t136 79.5v713q0 128 -38.5 173.5t-145.5 60.5v34q61 12 118.5 46t133.5 104q64 -47 93 -111t29 -161v-863q35 -12 63.5 -25t55.5 -28l41 41l27 -24q-69 -68 -119.5 -127.5t-77.5 -104.5q-76 55 -148 85t-126 30q-30 0 -60 -9t-61 -28z" />
+    <glyph glyph-name="two" unicode="2" 
+d="M772 754v-19q0 -53 10.5 -94t30.5 -68q-48 18 -90.5 26.5t-85.5 8.5q-212 0 -336.5 -101.5t-124.5 -275.5l1 -26q60 9 126 13.5t143 4.5q104 0 186 -9.5t142 -29.5l43 54l19 -27q-49 -61 -84.5 -113.5t-59.5 -97.5q-61 23 -132.5 35t-145.5 12q-61 0 -127.5 -4.5
+t-143.5 -13.5q-4 34 -6 68.5t-2 68.5q0 202 70.5 313t230.5 166q21 7 54 17q100 32 100 151v348l-33 13q-63 -57 -117 -84t-104 -27q-79 0 -137.5 51t-77.5 139q21 -13 39.5 -18.5t38.5 -5.5q43 0 96 27.5t104 76.5q79 -80 158 -121t156 -41q18 0 44 3.5t62 9.5
+q-25 -36 -36 -71.5t-11 -100.5v-258z" />
+    <glyph glyph-name="three" unicode="3" 
+d="M348 -39q-31 52 -99 85.5t-145 33.5q-14 0 -29.5 -2t-41.5 -8q52 78 121 119.5t147 41.5q75 0 145 -38t117 -105l47 12v492q-44 10 -81 25t-70 36q-26 -18 -46 -41.5t-40 -58.5v149q12 -9 22.5 -13.5t18.5 -4.5q19 0 79.5 32t110.5 46v438l-51 12q-40 -88 -95.5 -130
+t-131.5 -42q-74 0 -131 41t-97 121q21 -13 40 -19.5t38 -6.5q43 0 86 33.5t103 117.5q81 -57 197 -87t259 -30h15q-19 -27 -30 -72t-11 -96v-137q0 -35 8 -75.5t26 -93.5q-33 2 -62.5 3.5t-55.5 1.5q-57 0 -113.5 -15.5t-112.5 -47.5q45 -32 100 -47t128 -15q32 0 64 2t67 7
+q-20 -20 -30.5 -63.5t-10.5 -104.5v-219q0 -53 14 -96t39 -70q-43 4 -71 6t-50 2q-106 0 -200.5 -29t-186.5 -90z" />
+    <glyph glyph-name="four" unicode="4" 
+d="M508 410v675l-35 25q-71 -103 -131.5 -187t-116.5 -155v-358h283zM350 -8q11 66 51 114.5t107 77.5v152h-264q-55 0 -104 -4.5t-87 -12.5q1 5 1 15q3 58 3 78q0 103 -1 143t-5 69q106 114 248 304.5t299 431.5q38 -81 75.5 -123.5t71.5 -42.5q7 0 13.5 2.5t17.5 9.5
+q-8 -43 -27 -76.5t-53 -60.5v-659h29q52 0 87 20t58 63q1 -6 1.5 -14t0.5 -20q0 -14 -4 -39t-4 -37q0 -11 3 -40t3 -48v-23q-23 36 -51.5 52t-68.5 16q-17 0 -29 -1t-25 -3l1 -146q28 -7 55.5 -19.5t54.5 -31.5l49 39l21 -33q-41 -24 -96.5 -73t-121.5 -119
+q-57 43 -108.5 65.5t-95.5 22.5q-27 0 -52.5 -12t-52.5 -37z" />
+    <glyph glyph-name="five" unicode="5" 
+d="M63 2q6 116 75.5 189t170.5 73q63 0 119 -28.5t113 -90.5l51 13v504q-43 20 -81 48t-73 64q-45 -23 -97.5 -45t-117.5 -45l4 -8q6 -15 6 -19q0 -24 -17.5 -46.5t-37.5 -22.5q-16 0 -26.5 12.5t-10.5 32.5q0 23 11 38t38 27v613h662q-34 -126 -75.5 -168.5t-153.5 -42.5
+h-404v-393q159 63 241 113.5t144 115.5q49 -60 104 -96.5t95 -36.5q22 0 43.5 9.5t46.5 31.5q-10 -64 -35 -103t-74 -65v-420q0 -46 11.5 -80t35.5 -61q-39 11 -63.5 15.5t-44.5 4.5q-122 0 -208 -41.5t-142 -128.5q-31 56 -82.5 89.5t-104.5 33.5q-42 0 -71.5 -20.5
+t-51.5 -65.5z" />
+    <glyph glyph-name="six" unicode="6" 
+d="M621 129v514q-36 20 -62.5 42.5t-46.5 47.5l-168 -82v-409q71 -21 120 -53.5t89 -84.5zM39 51q11 56 37.5 92t77.5 64v805q0 92 -11.5 130t-37.5 62q12 -1 24.5 -1.5t32.5 -0.5q111 0 237.5 41.5t241.5 116.5q28 -61 59.5 -91t67.5 -30q20 0 39 9.5t47 33.5
+q-31 -91 -93 -141.5t-140 -50.5q-64 0 -111.5 32t-83.5 99l-82 -23v-512q130 58 218 110.5t136 100.5q35 -65 74 -95t88 -30q14 0 27 5.5t30 18.5q-10 -50 -35.5 -83.5t-72.5 -59.5v-422q0 -39 10.5 -71t34.5 -64q-19 2 -41.5 3t-64.5 1q-118 0 -221 -35.5t-167 -97.5
+q-55 58 -116 92.5t-105 34.5q-30 0 -53.5 -10t-46.5 -33z" />
+    <glyph glyph-name="seven" unicode="7" 
+d="M467 -18q-126 29 -189 106t-63 203q0 115 62 241t202 291q47 55 169 183.5t173 205.5q-112 -80 -222 -124t-200 -44q-60 0 -116 19.5t-111 58.5l-47 -47l-21 23q56 49 103 109.5t88 133.5q30 -52 106 -81t185 -29q99 0 174 19.5t131 60.5q-18 -65 -65.5 -147.5
+t-174.5 -254.5q-115 -156 -167 -280t-52 -238q0 -81 34.5 -132.5t84.5 -51.5q13 0 24.5 7t26.5 24l25 -21q-48 -58 -87 -116t-73 -119z" />
+    <glyph glyph-name="eight" unicode="8" 
+d="M475 690l135 70v330q-39 14 -75 42.5t-78 79.5l-123 -32v-344q0 -39 14 -63t49 -42zM535 100l86 17v366q0 63 -11.5 85t-48.5 40l-82 41l-145 -71v-367q79 -32 127 -58.5t74 -52.5zM317 -47q-59 55 -110.5 82.5t-93.5 27.5q-23 0 -45.5 -8t-47.5 -26q17 56 45.5 93.5
+t75.5 63.5v322q0 29 -11 53.5t-36 54.5q40 -8 68.5 -12t52.5 -4q52 0 112 18t113 50q-57 31 -113 47t-106 16q-32 0 -60.5 -3.5t-55.5 -10.5q27 30 39 60.5t12 90.5v13v192q0 34 -14 67.5t-40 61.5q8 -1 22 -3q48 -7 75 -7q111 0 233.5 44.5t229.5 125.5q37 -69 74.5 -102
+t76.5 -33q19 0 37 8.5t41 28.5q-8 -56 -30.5 -91.5t-65.5 -62.5v-250q0 -38 12 -75.5t35 -67.5q-44 11 -72.5 15.5t-48.5 4.5q-32 0 -64.5 -8t-93.5 -35l-51 -22q65 -36 116.5 -52t102.5 -16q28 0 57 4t60 13q-19 -29 -28 -54t-9 -59v-10v-289q0 -39 11.5 -69t35.5 -56l-7 1
+q-91 7 -128 7q-116 0 -221 -36t-185 -103z" />
+    <glyph glyph-name="nine" unicode="9" 
+d="M633 641v453q-51 24 -84.5 51.5t-59.5 66.5l-137 -36v-519q37 -9 69.5 -32t70.5 -66zM53 4q27 115 108 180.5t193 65.5q71 0 132.5 -31.5t105.5 -91.5l41 16v461q-55 -24 -121 -70.5t-160 -125.5q-58 59 -111 89.5t-98 30.5q-23 0 -45.5 -7t-46.5 -23q14 49 40.5 81
+t72.5 54v436q0 39 -9.5 67t-31.5 62q16 -2 34 -3t54 -1q130 0 253.5 42t233.5 124q45 -79 85.5 -114.5t86.5 -35.5q22 0 39 7.5t31 23.5q-8 -58 -34.5 -92t-82.5 -57v-816q0 -77 8.5 -113t26.5 -67q-30 12 -55 17.5t-49 5.5q-98 0 -186.5 -39.5t-155.5 -112.5
+q-51 52 -101 77.5t-104 25.5q-44 0 -82.5 -16.5t-71.5 -49.5z" />
+    <glyph glyph-name="colon" unicode=":" horiz-adv-x="627" 
+d="M127 711l143 174q45 -65 82.5 -93t77.5 -28q10 0 24.5 4t37.5 12q-45 -92 -90.5 -132t-104.5 -40q-49 0 -93 26.5t-77 76.5zM127 74l143 174q45 -65 82.5 -93t77.5 -28q10 0 24.5 4t37.5 12q-45 -92 -90.5 -132t-104.5 -40q-49 0 -93 26.5t-77 76.5z" />
+    <glyph glyph-name="semicolon" unicode=";" horiz-adv-x="627" 
+d="M127 711l143 174q45 -65 82.5 -93t77.5 -28q10 0 24.5 4t37.5 12q-45 -92 -90.5 -132t-104.5 -40q-49 0 -93 26.5t-77 76.5zM156 72l163 184q66 -90 88.5 -149t22.5 -125q0 -78 -43 -146t-125 -119q9 28 14 55t5 54q0 77 -28.5 132.5t-96.5 113.5z" />
+    <glyph glyph-name="less" unicode="&#x3c;" horiz-adv-x="1706" 
+d="M1442 1159v-153l-969 -396l969 -393v-154l-1178 484v129z" />
+    <glyph glyph-name="equal" unicode="=" horiz-adv-x="1706" 
+d="M254 481h1198v-139h-1198v139zM254 879h1198v-140h-1198v140z" />
+    <glyph glyph-name="greater" unicode="&#x3e;" horiz-adv-x="1706" 
+d="M264 1159l1178 -483v-129l-1178 -484v154l971 393l-971 396v153z" />
+    <glyph glyph-name="question" unicode="?" 
+d="M753 907q0 -41 8 -84t24 -86h-32q-193 0 -270 -71t-103 -270q-11 57 -17 114.5t-6 116.5q0 123 44 177.5t159 76.5v436l-51 12q-41 -88 -96 -130t-129 -42t-131 41t-96 120q21 -13 40 -19.5t37 -6.5q42 0 83 33t104 121q82 -58 198.5 -88.5t257.5 -30.5h15
+q-19 -26 -29 -69.5t-10 -98.5v-252zM388 -8q-32 40 -69 77t-80 72q46 44 82.5 81t66.5 73q40 -38 79 -73.5t79 -69.5q-49 -33 -88.5 -73t-69.5 -87z" />
+    <glyph glyph-name="at" unicode="@" horiz-adv-x="2019" 
+d="M1186 332q-62 -105 -138 -156t-169 -51q-129 0 -206 92t-77 246q0 109 49.5 216t140.5 195q68 65 146 99.5t155 34.5q90 0 146 -48.5t76 -142.5l51 174h158l-172 -612l-4 -12q-15 -56 -15 -86q0 -51 23.5 -79t66.5 -28q33 0 80.5 20t89.5 52q119 90 179.5 228.5
+t60.5 318.5q0 133 -52.5 245t-156.5 201q-90 77 -214 118.5t-267 41.5q-180 0 -335.5 -61.5t-275.5 -180.5q-126 -124 -190 -287t-64 -358q0 -182 57 -313t179 -234q109 -92 254 -141t307 -49q170 0 327 51.5t300 155.5l33 -41q-147 -110 -312.5 -166t-345.5 -56
+q-189 0 -345.5 45.5t-274.5 135.5q-151 113 -230.5 276.5t-79.5 360.5q0 203 86.5 380.5t251.5 313.5q134 111 294.5 167t342.5 56q346 0 555 -188.5t209 -499.5q0 -159 -58.5 -298t-166.5 -237q-59 -52 -126 -80t-134 -28q-96 0 -149 53t-60 156zM1104 961
+q-54 0 -98.5 -30.5t-90.5 -99.5q-71 -107 -113 -233.5t-42 -228.5q0 -86 39.5 -138.5t101.5 -52.5q65 0 122.5 43.5t111.5 132.5q55 93 88.5 204t33.5 198q0 92 -42 148.5t-111 56.5z" />
+    <glyph glyph-name="A" unicode="A" horiz-adv-x="1370" 
+d="M467 647h344l-176 459zM-41 -45q34 114 114 180.5t201 81.5l230 621q-18 34 -51 53.5t-74 19.5q-43 0 -74.5 -22t-50.5 -65q-2 24 -3 39.5t-1 27.5q0 85 61 151t140 66q51 0 84 -9.5t57 -31.5l28 77q-4 45 -51 75t-110 30q-59 0 -103 -20.5t-77 -63.5q10 118 94.5 197.5
+t195.5 79.5q49 0 92.5 -14.5t79.5 -43.5l394 -1028q32 -88 70 -125.5t91 -37.5q26 0 45.5 3.5t36.5 12.5q-75 -92 -115.5 -153t-60.5 -111q-70 6 -117 50.5t-81 139.5l-127 338h-476l-94 -250q14 0 33 2h6q64 0 116 -14.5t103 -46.5l31 35l18 -19q-68 -77 -108 -131
+t-68 -106q-51 37 -123 58.5t-149 21.5q-62 0 -114 -17t-93 -51z" />
+    <glyph glyph-name="B" unicode="B" horiz-adv-x="1298" 
+d="M829 180q24 -13 45 -29t41 -34l56 18v221q-18 9 -37.5 14t-38.5 5q-15 0 -60 -13l-5 -1zM830 389q27 6 43.5 8t27.5 2q12 0 29 -2.5t41 -6.5v161q-16 -4 -31.5 -6t-40.5 -2q-7 0 -26.5 2t-42.5 6v-162zM829 582q24 -7 42.5 -10t33.5 -3q17 0 33 3.5t33 11.5v80
+q0 48 -14.5 68t-47.5 20q-12 0 -19 -1.5t-12 -3.5l-49 -45v-120zM483 285q34 35 49 67.5t15 69.5v541q0 97 33 159t135 131l195 136l3 2q81 55 99 55q52 0 101.5 -69.5t49.5 -164.5q0 -125 -58 -228t-185 -201q156 -2 198.5 -30.5t42.5 -121.5v-434q0 -41 5.5 -62t16.5 -36
+q-29 4 -58.5 7t-55.5 3q-112 0 -188.5 -40t-128.5 -126q-63 52 -135.5 76t-167.5 24q-76 0 -142.5 -21.5t-140.5 -70.5q78 125 199.5 198.5t246.5 73.5q58 0 102.5 -7.5t86.5 -25.5v664h28v-111q79 67 116.5 144t37.5 172q0 92 -27.5 155.5t-85.5 104.5l-57 -35
+q-43 -27 -63.5 -67t-20.5 -101v-520q0 -140 -55 -208t-191 -103zM20 1208q26 110 101.5 174t179.5 64q55 0 158.5 -30t156.5 -30q45 0 79.5 11.5t68.5 36.5q-49 -106 -133.5 -163t-192.5 -57q-50 0 -139.5 26t-132.5 26q-46 0 -81 -14t-65 -44zM225 143q23 35 33 71.5
+t10 88.5v299q-4 1 -9 1q-21 3 -32 3q-35 0 -55 -17t-27 -52q-16 24 -23 51t-7 65q0 65 30 104.5t78 39.5q15 0 23 -1t16 -3v32q0 125 59 201.5t191 120.5q-34 -41 -47.5 -81t-13.5 -101v-533q0 -89 -54.5 -158.5t-171.5 -130.5z" />
+    <glyph glyph-name="C" unicode="C" horiz-adv-x="1280" 
+d="M557 264q29 28 41 64t12 127v698l-147 -78l-10 25q199 106 325.5 187.5t214.5 158.5q20 -61 53 -92t78 -31q25 0 47.5 10t42.5 31q-10 -70 -54.5 -119t-112.5 -67v-1002q54 21 112.5 66.5t124.5 117.5q-91 -205 -241.5 -310t-356.5 -105q-260 0 -425 190t-165 488
+q0 250 132 462.5t358 323.5q-146 -131 -217.5 -294t-71.5 -365q0 -306 137 -462.5t406 -156.5q48 0 91.5 8.5t88.5 26.5v1007q-5 -1 -10 -1.5t-15 -0.5q-54 0 -93 31t-62 92l-39 -24v-674q0 -144 -56.5 -220t-187.5 -112z" />
+    <glyph glyph-name="D" unicode="D" horiz-adv-x="1186" 
+d="M170 195q30 37 42.5 85t12.5 128v200h-59q-40 0 -57 -15.5t-17 -51.5q-19 20 -29 48.5t-10 61.5q0 89 32.5 123.5t115.5 34.5h24v94q0 119 54.5 175.5t191.5 84.5q-29 -38 -41 -73.5t-12 -100.5v-506q0 -111 -54 -173.5t-194 -114.5zM561 924q31 -13 65.5 -19t78.5 -6
+q42 0 78 8.5t69 26.5v166q0 60 -25.5 85t-107.5 25h-158v-286zM561 547q27 11 61 15.5t85 4.5q45 0 79.5 -5.5t65.5 -16.5v352q-43 -16 -79.5 -23.5t-74.5 -7.5q-36 0 -70 6.5t-67 18.5v-344zM561 223q62 0 121.5 -22.5t120.5 -69.5l49 27v356q-31 13 -63 19t-74 6
+q-52 0 -88.5 -6t-65.5 -19v-291zM68 -49q56 120 177 191t287 81v987h-260q-119 0 -171 55.5t-52 180.5q20 -11 42.5 -16t62.5 -5h614q159 0 217.5 -61.5t58.5 -210.5v-864q0 -56 10 -90.5t31 -67.5q-17 0 -37 2h-6q-89 0 -186.5 -47.5t-198.5 -140.5q-75 39 -158.5 59.5
+t-168.5 20.5q-67 0 -130.5 -18t-131.5 -56z" />
+    <glyph glyph-name="E" unicode="E" horiz-adv-x="1255" 
+d="M211 -53q59 92 153 161t220 113v785q0 207 96.5 324.5t265.5 117.5q48 0 95.5 -13t101.5 -40l20 22l25 -14q-44 -58 -79.5 -120.5t-57.5 -121.5q-45 53 -103.5 80t-128.5 27q-101 0 -154 -69.5t-53 -203.5v-293q48 84 111 124t145 40q51 0 98 -14t91 -43l26 29l25 -19
+q-46 -56 -85 -118t-71 -130q-25 57 -78 89t-118 32q-43 0 -77 -14t-67 -45v-406q55 14 101 20.5t88 6.5q97 0 181.5 -25t162.5 -77l43 63l24 -18q-47 -69 -85 -130.5t-68 -117.5q-72 50 -166 74t-217 24q-127 0 -236.5 -23.5t-228.5 -76.5zM55 1188q14 114 88 184t181 70
+q47 0 124.5 -21.5t112.5 -21.5q27 0 49.5 7t42.5 21q-41 -110 -96 -159t-135 -49q-50 0 -132 21.5t-112 21.5q-39 0 -64.5 -15.5t-58.5 -58.5zM229 127q30 37 43 81.5t13 143.5v258q-15 0 -35.5 1t-26.5 1q-49 0 -73 -20t-27 -63q-16 24 -23.5 56t-7.5 77q0 72 29.5 108.5
+t87.5 36.5q19 0 37.5 -1.5t37.5 -4.5l1 96q0 104 51.5 162t195.5 112q-35 -40 -50 -82.5t-15 -103.5v-541q0 -118 -50 -177t-188 -140z" />
+    <glyph glyph-name="F" unicode="F" horiz-adv-x="1239" 
+d="M86 1200q6 103 70 172.5t149 69.5q53 0 152.5 -30t156.5 -30q50 0 93 12.5t86 39.5q-57 -104 -148 -171t-170 -67q-54 0 -148.5 33t-131.5 33q-36 0 -60 -14t-49 -48zM346 219q22 34 31.5 69t9.5 91v14v250h-45q-63 0 -91.5 -20t-41.5 -72q-14 30 -20.5 55t-6.5 49
+q0 100 39 143.5t127 43.5q15 0 23 -0.5t16 -1.5v34v39q0 128 237 259l6 3q-29 -38 -42 -79.5t-13 -118.5v-465q0 -107 -50.5 -166.5t-178.5 -126.5zM889 829h190v350q-43 2 -82.5 25.5t-70.5 67.5q-19 -14 -28 -32.5t-9 -41.5v-369zM-74 -16q49 108 116 167.5t142 59.5
+q60 0 183.5 -85t175.5 -85q72 0 111.5 48t39.5 136v867q0 44 12 71.5t42 48.5q14 11 56 37q161 97 275 197q49 -55 75.5 -70.5t57.5 -15.5q22 0 43.5 7.5t42.5 23.5q-18 -82 -64.5 -133.5t-125.5 -77.5v-1037h-29v500h-190v-342q0 -75 -14 -106.5t-50 -61.5
+q-99 -84 -225.5 -136t-230.5 -52q-82 0 -185.5 39t-138.5 39q-30 0 -59.5 -10t-59.5 -29z" />
+    <glyph glyph-name="G" unicode="G" horiz-adv-x="1360" 
+d="M729 659l381 621q-70 -60 -110.5 -81t-77.5 -21q-42 0 -70.5 20.5t-50.5 67.5l-72 -52v-555zM840 25q77 26 126 75.5t72 124.5q-27 13 -51 19t-49 6q-28 0 -51.5 -5.5t-46.5 -17.5v-202zM840 262q28 8 54 12.5t50 4.5q43 0 91 -18q7 -2 9 -3q9 36 13 70t4 65
+q0 25 -2.5 53.5t-7.5 60.5q-23 -16 -49.5 -24t-57.5 -8t-55 5.5t-49 17.5v-236zM840 526q29 -12 55.5 -18t50.5 -6q28 0 53 8t48 25q-21 96 -75 154.5t-132 70.5v-234zM498 162q19 30 28 59t9 70v10v795l-86 -47v34q126 59 256 149t266 214q20 -48 49 -72t65 -24
+q19 0 43.5 13.5t57.5 41.5l22 -14l-360 -594q6 0 17.5 1t17.5 1q176 0 288.5 -105.5t112.5 -265.5q0 -191 -172.5 -334t-409.5 -143q-270 0 -460.5 195t-190.5 475q0 231 148.5 449t375.5 321q-154 -140 -229.5 -324.5t-75.5 -425.5q0 -289 121 -467t311 -178q27 0 54 4.5
+t57 14.5v730l-84 -137v-69q0 -189 -52.5 -261.5t-178.5 -115.5z" />
+    <glyph glyph-name="H" unicode="H" horiz-adv-x="1298" 
+d="M818 377q19 7 37.5 10.5t38.5 3.5q18 0 69 -14h3v196q-16 -6 -30.5 -9t-29.5 -3q-22 0 -44.5 3t-43.5 9v-196zM818 809v-206q22 -8 42 -11.5t40 -3.5q18 0 34 3.5t32 11.5l-1 147q-37 11 -64.5 29.5t-49.5 45.5zM499 264q25 29 36 65.5t11 106.5v561q0 112 21 163t75 106
+q83 83 171 127.5t169 44.5q73 0 123.5 -24.5t97.5 -82.5l27 12l12 -24q-52 -25 -107.5 -67.5t-117.5 -106.5q-15 80 -62.5 129t-109.5 49q-65 0 -91 -38.5t-26 -162.5v-329l59 28v150h31v-129q79 49 136.5 92t86.5 74q27 -51 62.5 -78t77.5 -27q11 0 40 9q7 2 11 3
+q-2 -40 -19.5 -70.5t-52.5 -53.5v-568q0 -44 6.5 -79.5t20.5 -71.5q-35 13 -59 18.5t-46 5.5q-63 0 -110 -31.5t-47 -70.5q0 -30 70.5 -94.5t70.5 -143.5q0 -64 -36.5 -104.5t-90.5 -40.5q-9 0 -18 0.5t-19 1.5q31 26 46.5 60t15.5 77q0 51 -38 120t-38 99q0 48 39 98.5
+t39 61.5v39v180q-18 8 -35 12.5t-33 4.5q-16 -1 -36 -4.5t-42 -10.5l-2 -164l41 -26l43 39l19 -19q-56 -57 -100 -116t-81 -127q-61 44 -125 66t-133 22q-63 0 -122.5 -20t-118.5 -60q54 127 167 203.5t244 76.5q33 0 64 -5.5t71 -18.5v592l-59 -31v-168q0 -131 -53 -207
+t-176 -123zM57 1211q31 107 95 167t148 60q42 0 122.5 -19.5t125.5 -19.5q25 0 47.5 5.5t50.5 18.5q-46 -102 -102 -148t-131 -46q-36 0 -110.5 19.5t-115.5 19.5q-52 0 -128 -56zM179 70q43 51 61.5 111t18.5 181v33v256q-7 1 -14 1.5t-17 0.5q-54 0 -83 -19t-37 -61
+q-18 21 -25.5 43.5t-7.5 55.5q0 81 44 129.5t120 48.5h20q-2 16 -2 45q0 96 51 158t195 131q-28 -38 -39.5 -85t-11.5 -157v-500q0 -136 -61 -217t-212 -155z" />
+    <glyph glyph-name="I" unicode="I" horiz-adv-x="1090" 
+d="M136 1209q33 107 107 170t167 63q46 0 138.5 -21.5t141.5 -21.5q31 0 57 5.5t54 18.5q-51 -100 -114.5 -146t-149.5 -46q-40 0 -123.5 15.5t-130.5 15.5q-63 0 -145 -52zM657 590v-4q0 -183 -55 -258.5t-188 -102.5q32 29 45.5 76t13.5 145v199q-6 1 -13.5 1.5t-21.5 0.5
+q-53 0 -82.5 -19.5t-38.5 -59.5q-17 20 -24.5 42.5t-7.5 55.5q0 83 42 131.5t115 48.5q4 0 12.5 -1t12.5 -1v45q0 97 51 159t193 130q-27 -36 -40.5 -96t-13.5 -146v-346zM-37 -43q10 102 88.5 180t163.5 78q87 0 191 -104q23 -23 36 -35q40 -36 77 -54t73 -18
+q90 0 133 67.5t43 209.5v757q0 147 56.5 217.5t195.5 147.5q-37 -37 -52.5 -77t-15.5 -118v-26v-848q0 -188 -128 -284.5t-378 -96.5q-85 0 -175 45t-124 45q-43 0 -90.5 -22t-93.5 -64z" />
+    <glyph glyph-name="J" unicode="J" horiz-adv-x="1090" 
+d="M136 1209q33 107 107 170t167 63q46 0 138.5 -21.5t141.5 -21.5q31 0 57 5.5t54 18.5q-51 -100 -114.5 -146t-149.5 -46q-40 0 -123.5 15.5t-130.5 15.5q-63 0 -145 -52zM668 379q0 -133 -63.5 -211.5t-182.5 -95.5q32 28 45.5 74.5t13.5 138.5v360q-9 1 -18.5 1.5
+t-24.5 0.5q-54 0 -83 -19t-38 -61q-17 21 -24.5 43.5t-7.5 55.5q0 86 43.5 133t124.5 47q3 0 13 -1t15 -1q-1 10 -1.5 21.5t-0.5 33.5q0 90 49 153t172 128q-16 -41 -24 -86t-8 -95v-620zM961 455q0 -12 1 -46t1 -57q0 -197 -120.5 -303t-342.5 -106q-191 0 -299.5 72
+t-108.5 198q0 80 43 131t109 51q52 0 88.5 -36.5t36.5 -90.5q0 -49 -29 -80.5t-74 -31.5q-18 0 -37 9.5t-46 32.5q-2 -6 -2.5 -13t-0.5 -17q0 -80 81.5 -129t219.5 -49q156 0 222.5 75t66.5 259q0 7 -1 38t-1 54v616q0 145 51 215t195 156q-29 -38 -41 -85.5t-12 -139.5
+v-723z" />
+    <glyph glyph-name="K" unicode="K" horiz-adv-x="1327" 
+d="M33 1214q32 110 96.5 172t146.5 62q42 0 123 -21.5t125 -21.5q25 0 47.5 5.5t50.5 18.5q-46 -101 -101.5 -147.5t-131.5 -46.5q-36 0 -110 16.5t-115 16.5q-53 0 -126 -50zM453 559q0 -137 -60.5 -218t-210.5 -155q44 49 62 114t18 196v134q-8 2 -14.5 2.5t-16.5 0.5
+q-54 0 -83 -19.5t-37 -60.5q-18 20 -25.5 43t-7.5 55q0 84 42.5 132t117.5 48q4 0 12 -1t12 -1q0 8 -1 23t-1 22q0 97 51 159.5t193 129.5q-28 -37 -39.5 -87.5t-11.5 -143.5v-373zM104 -51q62 128 194 210.5t273 82.5q79 0 149 -24.5t124 -70.5l30 33l19 -20
+q-58 -65 -107 -123.5t-81 -104.5q-50 47 -121 71t-158 24q-95 0 -171 -18.5t-151 -59.5zM485 305q36 34 52 80t16 115v49v495q0 140 61 223t197 130q-39 -46 -55.5 -98.5t-16.5 -155.5v-33v-375l342 711q34 -45 57 -60.5t52 -15.5q30 0 56 13.5t54 43.5
+q-7 -113 -70.5 -192.5t-142.5 -79.5q-21 0 -44.5 7t-51.5 22l-155 -316q51 -24 94.5 -94t85.5 -195q11 -32 31 -92q105 -315 192 -315q18 0 38.5 4.5t55.5 16.5q-54 -58 -96.5 -122.5t-75.5 -140.5q-69 8 -117.5 46t-74.5 104q-28 70 -91.5 288.5t-138.5 323.5v-24
+q0 -167 -54.5 -243.5t-199.5 -119.5z" />
+    <glyph glyph-name="L" unicode="L" horiz-adv-x="1280" 
+d="M451 512q0 -137 -60 -217t-211 -154q45 50 63.5 117.5t18.5 198.5q0 22 -1 73.5t-1 81.5q-16 3 -21.5 3.5t-9.5 0.5q-53 0 -82 -19.5t-39 -61.5q-17 20 -24.5 43.5t-7.5 56.5q0 84 42.5 132t117.5 48q4 0 12 -1t12 -1q0 7 -1 21.5t-1 21.5q0 97 51 159t193 130
+q-28 -38 -39.5 -88t-11.5 -144v-401zM53 1184q32 110 97 172.5t147 62.5q41 0 122 -22.5t126 -22.5q24 0 46.5 5.5t51.5 19.5q-46 -101 -101.5 -147t-131.5 -46q-36 0 -110.5 16.5t-115.5 16.5q-50 0 -120 -48q-7 -5 -11 -7zM506 287q31 33 44 75.5t13 139.5v483
+q0 113 32 178t107 133q79 73 157 111.5t147 38.5q53 0 96.5 -19t87.5 -61l39 35l18 -19q-45 -40 -84.5 -87.5t-95.5 -133.5q-98 96 -141 124t-78 28q-54 0 -76 -32.5t-22 -113.5v-538q0 -162 -55.5 -237t-188.5 -105zM180 -63q76 136 254 224.5t383 88.5q63 0 125 -9
+t125 -28v481q-14 6 -21.5 18t-7.5 27q0 23 13 38.5t30 15.5q21 0 33 -14t12 -38q0 -15 -6.5 -25t-21.5 -20v-493l80 -35l36 41l23 -19q-49 -61 -91 -123t-79 -128q-111 54 -225.5 82t-227.5 28q-111 0 -217.5 -27.5t-216.5 -84.5z" />
+    <glyph glyph-name="M" unicode="M" horiz-adv-x="1630" 
+d="M1077 136l9 5q99 67 153 95v391h-162v-491zM1077 813h162v375q-39 16 -65.5 34.5t-47.5 43.5l-49 -33v-420zM936 213q46 -26 73.5 -44t41.5 -32v1080q-32 -18 -60 -30.5t-55 -21.5v-952zM586 813h159v371q-35 7 -64 36t-46 72l-49 -22v-457zM174 258q37 21 54.5 65
+t17.5 119v185q-5 0 -15 -1t-16 -1q-42 0 -66 -23t-27 -65q-31 16 -47 45.5t-16 72.5q0 77 39.5 118.5t110.5 41.5q15 0 23 -0.5t13 -1.5l1 139q0 78 9.5 110t33.5 60q42 51 198 130q71 36 109 57l246 137q45 -94 91.5 -133t110.5 -39h7v172h26v-164q45 8 111.5 49.5
+t150.5 114.5q33 -73 68 -105t80 -32q14 0 29.5 5t35.5 17q-19 -47 -51 -82.5t-69 -52.5v-838q0 -102 33 -137t122 -35q-5 -7 -17 -24q-97 -136 -130 -211q-78 17 -129.5 81t-71.5 171q-115 -68 -192.5 -127t-139.5 -125q-65 63 -112.5 91t-89.5 28q-18 0 -36 -5t-36 -13
+q15 56 42 91t70 58v426h-159v-224q0 -204 -65.5 -326t-168.5 -122q-42 0 -129 31.5t-129 31.5q-32 0 -54 -13.5t-38 -42.5q3 98 63.5 167.5t143.5 69.5q43 0 115 -24.5t100 -24.5q72 0 100.5 60t28.5 265v780q-64 -26 -88.5 -61.5t-24.5 -103.5v-517q0 -165 -61.5 -237
+t-204.5 -78z" />
+    <glyph glyph-name="N" unicode="N" horiz-adv-x="1219" 
+d="M1055 260v592q-34 -16 -73.5 -24.5t-82.5 -8.5q-36 0 -63.5 5t-53.5 16l14 -37q167 -453 259 -543zM313 518q53 23 100.5 34t90.5 11q40 0 87.5 -10t106.5 -31l-32 82q-223 566 -353 627v-713zM12 -51q34 119 100 186t173 88v379l-6 2q-23 6 -33 6q-36 0 -58 -20.5
+t-22 -54.5q0 -1 -2 -2.5t-2 -2.5q-21 24 -30 53t-9 70q0 69 31 109.5t82 40.5q8 0 18.5 -1t29.5 -3l1 440q-12 4 -22.5 6t-22.5 2q-65 0 -114.5 -49.5t-49.5 -120.5q-14 32 -20.5 61.5t-6.5 57.5q0 111 71 181.5t183 70.5q130 0 233 -123.5t234 -450.5q38 -12 73 -18t66 -6
+q39 0 75 9.5t71 29.5v287h-8q-53 0 -104.5 16.5t-111.5 52.5l-51 -43l-16 19q73 65 125.5 122.5t79.5 102.5q50 -39 91 -55.5t83 -16.5q44 0 81.5 15.5t71.5 48.5q0 -88 -57.5 -158.5t-155.5 -101.5v-1241q-80 10 -166 135.5t-204 408.5q-50 25 -99.5 36t-103.5 11
+q-59 0 -107 -11t-90 -34v-256h45q65 0 133 -22t119 -60l27 29l22 -18q-64 -68 -106 -121t-68 -98q-55 44 -114.5 67t-120.5 23q-55 0 -113 -19t-125 -59z" />
+    <glyph glyph-name="O" unicode="O" horiz-adv-x="1421" 
+d="M870 940q29 -13 58.5 -19t66.5 -6q38 0 69.5 6.5t59.5 20.5q-25 112 -79 208.5t-134 174.5l-41 -27v-358zM870 905v-465q30 9 59.5 13t61.5 4q37 0 71 -7.5t66 -21.5q14 63 20.5 129.5t6.5 140.5q0 64 -6 115.5t-19 95.5q-32 -12 -64.5 -18t-66.5 -6q-36 0 -67.5 5
+t-61.5 15zM870 410v-375q97 41 158 130t94 236q-35 14 -68.5 20.5t-68.5 6.5q-30 0 -58.5 -4.5t-56.5 -13.5zM487 174q26 31 38 70t12 90v788l-91 -39v31q154 70 251.5 120t144.5 83v129l28 4v-115q36 19 78 47t90 66q158 -92 239 -248.5t81 -370.5q0 -147 -36.5 -287
+t-102.5 -251q-103 -169 -235 -250.5t-304 -81.5q-119 0 -222.5 43.5t-189.5 128.5q-108 108 -163.5 242.5t-55.5 288.5q0 245 125 464t322 318q-117 -128 -169.5 -306t-52.5 -456q0 -347 104.5 -515.5t317.5 -168.5q33 0 69.5 7t76.5 22v1253l-115 -59v-783
+q0 -125 -52.5 -180t-187.5 -84z" />
+    <glyph glyph-name="P" unicode="P" horiz-adv-x="1233" 
+d="M614 932q32 -11 66.5 -17t71.5 -6q29 0 59.5 5.5t65.5 17.5v235q-32 19 -56.5 40t-46.5 48l-160 -108v-215zM614 467q34 9 64.5 13.5t58.5 4.5q40 0 74 -4.5t66 -13.5v434q-25 -10 -54 -14t-75 -4q-47 0 -76 4.5t-57 15.5zM614 264q68 -21 124 -57t106 -88l33 18v297
+q-38 11 -69 16t-60 5q-36 0 -69.5 -5.5t-64.5 -15.5v-170zM586 -356v1484l-99 -61v-1126q0 -135 23 -193.5t76 -103.5zM270 -410q12 73 18.5 138t6.5 112v235q-58 -1 -99.5 -39t-58.5 -106q-15 33 -21.5 61.5t-6.5 55.5q0 92 49 154t137 82v327q-10 1 -21 1.5t-28 0.5
+q-52 0 -74 -22t-22 -74q-22 29 -31.5 58.5t-9.5 64.5q0 79 37.5 117.5t113.5 38.5q14 0 21 -0.5t14 -1.5v284q0 85 -18.5 117.5t-65.5 32.5q-43 0 -71.5 -28.5t-53.5 -98.5q-17 32 -24 52.5t-7 37.5q0 114 64 183t170 69q96 0 148 -74.5t52 -212.5q0 -12 -0.5 -24.5
+t-1.5 -26.5l99 57v285h28v-262q107 70 188.5 133.5t147.5 128.5q39 -53 78 -79t82 -26q23 0 41.5 8t34.5 23v-4q0 -51 -29 -97.5t-86 -86.5v-881q0 -67 9.5 -113t29.5 -88q-17 1 -33 1.5t-30 0.5q-126 0 -210 -39.5t-147 -127.5l-76 61v-403q-33 6 -78 36.5t-114 94.5
+q-30 -41 -67 -74t-85 -62z" />
+    <glyph glyph-name="Q" unicode="Q" horiz-adv-x="1421" 
+d="M868 940q28 -13 59 -19t68 -6q38 0 69.5 6.5t59.5 20.5q-25 112 -79 208.5t-134 174.5l-43 -27v-358zM868 905v-465q29 9 58.5 13t64.5 4t68 -7t69 -22q14 63 20.5 129.5t6.5 140.5q0 64 -6 115.5t-19 95.5q-32 -12 -64.5 -18t-66.5 -6q-35 0 -67.5 5t-63.5 15zM869 410
+l-1 -375q98 40 159.5 129t94.5 237q-33 14 -66.5 20.5t-70.5 6.5q-29 0 -58 -4.5t-58 -13.5zM487 174q25 33 36.5 67t13.5 89v792l-91 -39l1 31l20 9q269 120 373 194v129l28 4v-115q45 23 87 51t83 62q158 -92 239 -248.5t81 -370.5q0 -316 -149.5 -556t-374.5 -293
+q19 -32 50 -88q82 -148 160 -148q3 0 10 1t11 1q-31 -36 -67 -53t-80 -17q-91 0 -153 64t-118 219q-265 27 -431.5 220.5t-166.5 473.5q0 252 124.5 472t322.5 319q-117 -128 -169.5 -306t-52.5 -456q0 -320 86.5 -485.5t270.5 -198.5q-7 23 -26 41.5t-58 40.5q19 4 36 6
+t31 2q56 0 106 -20.5t81 -55.5l39 15v1253l-113 -59v-775q0 -135 -52.5 -189.5t-187.5 -82.5z" />
+    <glyph glyph-name="R" unicode="R" horiz-adv-x="1305" 
+d="M754 680q115 63 165 139.5t50 188.5q0 115 -44 211t-73 96q-46 0 -72 -56t-26 -157v-422zM139 -55q77 147 189 221t260 74q91 0 168.5 -23.5t138.5 -69.5l51 52q-24 184 -61 311t-78 168l-53 -25q1 -3 1.5 -6.5t0.5 -9.5t-1 -12.5l-1 -6.5q0 -151 -54 -217t-206 -108
+q43 35 60 80t17 159v510q0 91 25 134.5t98 91.5q101 65 198 119.5t103 54.5q50 0 99 -82t49 -189q0 -137 -70.5 -256.5t-195.5 -191.5q100 -15 152 -80.5t75 -208.5q24 -148 56.5 -207t86.5 -59q5 0 12.5 1.5t16.5 4.5q-41 -68 -66.5 -126t-33.5 -105q-90 10 -147.5 69.5
+t-76.5 159.5q-54 -48 -185 -225l-3 -4q-64 52 -144.5 79t-175.5 27q-71 0 -148.5 -26.5t-156.5 -77.5zM88 1190q16 108 89.5 182t160.5 74q37 0 98 -32t103 -32q36 0 66.5 13.5t66.5 46.5q-21 -94 -97.5 -167t-148.5 -73q-28 0 -97 21.5t-108 21.5q-32 0 -64.5 -13.5
+t-68.5 -41.5zM461 498q0 -118 -49.5 -175.5t-186.5 -138.5q28 37 41 77.5t13 107.5v41l-1 225q-15 1 -29.5 1.5t-31.5 0.5q-50 0 -72.5 -19t-26.5 -62q-16 25 -24 57.5t-8 74.5q0 79 33.5 112.5t120.5 33.5q8 0 18 -1t21 -2v62q0 101 49.5 158t197.5 120q-38 -49 -51.5 -91
+t-13.5 -97v-485z" />
+    <glyph glyph-name="S" unicode="S" horiz-adv-x="1374" 
+d="M807 1028l63 90q-41 120 -115.5 186t-166.5 66q-95 0 -159 -49.5t-64 -118.5q0 -76 107.5 -118.5t334.5 -55.5zM16 0q78 128 231.5 206.5t325.5 78.5q100 0 182.5 -26.5t149.5 -80.5q173 186 219.5 264.5t46.5 149.5q0 113 -100 167.5t-360 78.5l-52 -88
+q221 -12 306.5 -58t85.5 -145q0 -62 -29 -113t-84 -88q5 19 7.5 34t2.5 28q0 68 -81 101.5t-316 53.5q-65 -126 -130 -188t-132 -62q-51 0 -85 34.5t-34 84.5q0 47 26.5 77t67.5 30q35 0 57.5 -26t22.5 -67q0 -20 -7.5 -39.5t-23.5 -39.5q3 -1 7 -1.5t8 -0.5q43 0 92 52
+t98 150q-215 17 -303 69.5t-88 160.5q0 48 17.5 89.5t54.5 82.5v-8q0 -92 92.5 -137.5t339.5 -67.5l47 88q-231 16 -327.5 71.5t-96.5 167.5q0 152 129 259.5t322 107.5q125 0 216 -36.5t140 -104.5l59 39l13 -29q-86 -59 -160 -132.5t-133 -160.5q252 -13 362.5 -84
+t110.5 -219q0 -86 -44 -171.5t-167 -221.5q-24 -27 -76 -83q-164 -178 -244 -294q-101 84 -201.5 121t-230.5 37q-82 0 -164 -27t-170 -84z" />
+    <glyph glyph-name="T" unicode="T" horiz-adv-x="1186" 
+d="M543 258q24 25 35.5 66t11.5 100v524l-72 -39v41q64 32 130 73.5t136 92.5v-536q0 -120 -52 -190t-189 -132zM90 1147q20 157 100 227t244 70q107 0 301 -26.5t281 -26.5q72 0 120 7.5t87 24.5q-31 -71 -82.5 -123.5t-122.5 -82.5v-910q31 30 64 68t65 82
+q-44 -235 -190 -372.5t-349 -137.5q-224 0 -368 151.5t-144 390.5q0 205 85 375.5t241 280.5q-81 -127 -116.5 -242t-35.5 -241q0 -223 103 -357.5t270 -134.5q81 0 169 29.5t175 85.5v923q-42 -11 -77 -16.5t-64 -5.5q-50 0 -237.5 21.5t-321.5 21.5q-78 0 -125 -19.5
+t-72 -62.5z" />
+    <glyph glyph-name="U" unicode="U" horiz-adv-x="1233" 
+d="M647 932q21 -13 43 -19t49 -6q25 0 47.5 4t44.5 13v256q-20 6 -38 22.5t-41 50.5l-105 -77v-244zM647 612q27 7 50.5 10t45.5 3q25 0 46.5 -4t41.5 -13v283q-19 -8 -38 -11t-48 -3q-28 0 -51.5 3.5t-46.5 12.5v-281zM666 133l165 109v333q-18 11 -39.5 16t-50.5 5
+q-26 0 -49 -4.5t-45 -13.5v-426zM72 10q26 91 85 149t150 83v405q-12 7 -24 10.5t-23 4.5q-46 0 -68 -20t-32 -73q-17 27 -25 57t-8 68q0 81 38.5 121.5t115.5 40.5q3 0 12 -1t14 -1v221q0 84 -33.5 123t-105.5 39q-56 0 -98.5 -32t-71.5 -97q0 4 -1 13q-3 39 -3 55
+q0 120 72.5 197t185.5 77q122 0 184 -79t62 -234v-906q25 -6 53.5 -19.5t66.5 -37.5v1272h29v-234l289 238q27 -67 61.5 -103t71.5 -36q18 0 37 7.5t41 24.5q-11 -61 -44 -104.5t-81 -58.5v-828q0 -89 26 -132.5t80 -43.5q14 0 31 3t37 9q-51 -59 -92.5 -120.5t-77.5 -128.5
+q-77 22 -124 86t-71 178q-123 -78 -199 -137t-134 -121q-50 54 -122 84t-151 30q-40 0 -76.5 -11.5t-76.5 -37.5z" />
+    <glyph glyph-name="V" unicode="V" horiz-adv-x="1186" 
+d="M608 954q26 -21 54 -30t71 -9q32 0 59.5 8.5t51.5 24.5v236q-25 8 -49.5 24.5t-51.5 42.5l-135 -73v-224zM608 537q27 15 53.5 22.5t55.5 7.5q27 0 57 -7t70 -23v378q-32 -15 -62 -22.5t-61 -7.5q-27 0 -54.5 8.5t-58.5 26.5v-383zM608 141l68 -18q39 13 80 23.5t88 19.5
+v338q-30 17 -61 25t-68 8q-33 0 -58.5 -8.5t-48.5 -26.5v-361zM471 213l109 -53v997l-109 -55v-889zM80 29q26 68 75 115t124 75v842q0 110 -33.5 150t-108.5 40q-47 0 -91 -30.5t-79 -87.5q-3 14 -4.5 27.5t-1.5 21.5q0 109 77.5 188.5t186.5 79.5q107 0 176.5 -80
+t69.5 -209v-18l109 53v252h28v-236q78 37 165 98.5t171 139.5q31 -76 69.5 -114t84.5 -38q15 0 33 6.5t42 20.5q-11 -50 -43.5 -82t-99.5 -57v-871q0 -60 11 -107t32 -79q-34 6 -68 9t-69 3q-131 0 -256 -51.5t-223 -146.5q-44 55 -106.5 85.5t-133.5 30.5q-30 0 -63 -7
+t-74 -23z" />
+    <glyph glyph-name="W" unicode="W" horiz-adv-x="1612" 
+d="M1102 934q23 -13 42 -19t40 -6q23 0 42 4t36 13v243q-35 20 -64 46.5t-49 58.5l-47 -29v-311zM1102 559q22 8 42 12t38 4q23 0 42 -3.5t38 -12.5v338q-19 -7 -36.5 -10.5t-35.5 -3.5q-24 0 -45 4.5t-43 15.5v-344zM1102 139q42 24 81 42t79 32v317q-21 9 -38 13t-34 4
+q-19 0 -41 -4.5t-47 -14.5v-389zM1073 141v1092l-115 -51v-987zM606 934q23 -12 44.5 -18.5t41.5 -6.5q22 0 41 4t37 13v243q-32 17 -62 44t-53 61l-49 -29v-311zM606 559q25 8 45.5 12t36.5 4q20 0 40 -4t42 -12v338q-24 -8 -40.5 -11t-31.5 -3q-25 0 -48 5t-44 15v-344z
+M606 139q41 23 81.5 41t82.5 33v317q-20 9 -38 13t-36 4q-16 0 -35.5 -4t-54.5 -15v-389zM578 141v1092l-111 -51v-987zM70 16q32 76 83.5 124t125.5 71v412q-21 8 -38 12t-32 4q-36 0 -59.5 -18t-40.5 -60q-13 30 -19 56t-6 51q0 69 36.5 114t92.5 45q12 0 28.5 -2t37.5 -6
+v252q0 92 -29.5 135t-91.5 43q-48 0 -82 -32.5t-56 -98.5v13q-4 44 -4 59q0 114 65 186t167 72q97 0 153.5 -61t65.5 -174l111 53v188h28v-172q78 36 228 150q20 14 30 22q25 -86 75.5 -132t121.5 -46h12v178h29v-168q51 21 109 58.5t145 109.5q36 -76 69.5 -108.5
+t73.5 -32.5q14 0 29 7t34 23q-3 -46 -27.5 -80.5t-76.5 -64.5v-915q0 -44 9.5 -84.5t29.5 -79.5l-6 1q-96 11 -141 11q-106 0 -202 -43t-206 -139q-66 95 -122.5 137.5t-114.5 42.5q-57 0 -123.5 -44.5t-147.5 -135.5q-68 54 -125.5 80t-107.5 26q-33 0 -65.5 -9.5
+t-65.5 -29.5z" />
+    <glyph glyph-name="X" unicode="X" horiz-adv-x="1233" 
+d="M-10 -61v20q0 120 76 200.5t188 80.5q22 0 46.5 -7.5t51.5 -21.5l199 473h-152q-38 0 -80.5 -5.5t-113.5 -21.5q34 39 56.5 89t31.5 106q18 -15 37 -22t49 -7h12h121q-88 224 -158 311t-155 87q-51 0 -86 -30t-58 -93q-9 30 -13.5 55t-4.5 47q0 108 65.5 177t169.5 69
+q112 0 203.5 -108t196.5 -369l200 477q33 -34 73.5 -52t84.5 -18q35 0 68 17t69 53q-16 -137 -81.5 -213t-165.5 -76q-25 0 -49.5 5t-51.5 16l-119 -281l27 -74h225q23 0 51.5 5t59.5 14q-47 -49 -73.5 -92t-41.5 -93q-14 14 -33.5 20.5t-50.5 6.5h-89l5 -14
+q199 -502 336 -502q26 0 95 18h1v-1q-135 -187 -157 -246h-2q-132 0 -220 115t-241 581l-297 -701q-33 42 -69 59t-95 17q-41 0 -70.5 -14t-70.5 -57z" />
+    <glyph glyph-name="Y" unicode="Y" horiz-adv-x="1186" 
+d="M586 883q31 -21 60.5 -30t62.5 -9q28 0 55 9t53 28v272q-40 15 -68.5 37.5t-54.5 58.5l-108 -90v-276zM586 475q35 12 62.5 18.5t47.5 6.5q28 0 58.5 -7t62.5 -20v373q-33 -16 -60 -23.5t-50 -7.5q-22 0 -48 7t-73 28v-375zM586 25q13 -3 24.5 -5t20.5 -2
+q91 0 138.5 50.5t47.5 146.5v221q-32 18 -61.5 26.5t-59.5 8.5t-57.5 -8.5t-52.5 -26.5v-411zM557 35v1102l-115 -76v-746q0 -134 26 -191t89 -89zM752 -385l6 26q14 -5 26 -7.5t23 -2.5q46 0 80.5 31t34.5 70q0 24 -18.5 39.5t-49.5 15.5q-25 0 -70 -22.5t-90 -59.5l-6 -5
+q-121 -99 -203 -99q-80 0 -131 52.5t-51 133.5q0 70 46.5 115t158.5 82q-147 21 -201.5 78.5t-54.5 240.5v362q-14 3 -24.5 4t-20.5 1q-43 0 -68 -21.5t-39 -70.5q-15 33 -21.5 62t-6.5 58q0 82 35.5 124t105.5 42q12 0 21 -0.5t18 -0.5v237q0 74 -23.5 111.5t-70.5 37.5
+q-37 0 -64 -31t-39 -88q-8 36 -11 55.5t-3 35.5q0 94 60 159.5t151 65.5q98 0 144 -76.5t46 -239.5v-32l115 76v272h29v-250q67 53 135.5 116.5t136.5 137.5q25 -74 62.5 -110.5t89.5 -36.5q28 0 50.5 10t43.5 33v-11q0 -45 -24 -85t-74 -79v-911q0 -127 -64.5 -185.5
+t-265.5 -92.5q-191 -33 -257.5 -67.5t-66.5 -90.5q0 -29 22 -48.5t56 -19.5q42 0 165 85t202 85q68 0 117 -49t49 -119q0 -65 -45.5 -111t-110.5 -46q-15 0 -44 10q-8 3 -11 4z" />
+    <glyph glyph-name="Z" unicode="Z" horiz-adv-x="1042" 
+d="M825 807q26 0 55.5 5t63.5 15q-45 -46 -71 -89.5t-42 -94.5q-14 15 -36.5 22t-63.5 7h-92q-72 -181 -210.5 -344t-381.5 -346q19 10 55 30q372 205 553 205q62 0 128 -15t137 -44l41 45l26 -23q-60 -61 -108.5 -122.5t-79.5 -116.5q-73 42 -164.5 64t-198.5 22
+q-95 0 -204 -21.5t-228 -62.5l-12 24q118 65 343 543q49 105 77 162h-105q-45 0 -142 -20l-5 -1q32 38 53 83.5t31 96.5q30 -12 56 -18t46 -6h131q99 259 425 539l42 36q-47 -24 -134 -74q-282 -161 -460 -161q-60 0 -113.5 17t-111.5 55l-43 -45l-21 22q70 76 117 139
+t74 117q35 -61 122.5 -93t221.5 -32q124 0 225.5 29.5t190.5 91.5l16 -27q-142 -110 -332 -609l-1 -5h130z" />
+    <glyph glyph-name="bracketleft" unicode="[" horiz-adv-x="639" 
+d="M596 -233v-41h-403v1720h403v-45h-264v-1634h264z" />
+    <glyph glyph-name="backslash" unicode="\" horiz-adv-x="635" 
+d="M561 -190l-530 1636h80l530 -1636h-80z" />
+    <glyph glyph-name="bracketright" unicode="]" horiz-adv-x="639" 
+d="M449 -274h-404v41h262v1634h-262v45h404v-1720z" />
+    <glyph glyph-name="asciicircum" unicode="^" horiz-adv-x="2048" 
+d="M926 1462h194l512 -565h-98l-512 420l-514 -420h-96z" />
+    <glyph glyph-name="underscore" unicode="_" horiz-adv-x="1024" 
+d="M0 -340h1024v-143h-1024v143z" />
+    <glyph glyph-name="grave" unicode="`" horiz-adv-x="1024" 
+d="M324 1350q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
+    <glyph glyph-name="a" unicode="a" horiz-adv-x="868" 
+d="M528 188v541q-26 13 -45.5 33t-38.5 53q-48 -23 -89 -35t-74 -12q-30 0 -60 10t-67 33l299 -381l-27 -20l-123 157q-33 -47 -48 -91.5t-15 -94.5q0 -95 59 -160t166 -86zM537 154l-197 -183q-127 42 -199.5 123.5t-72.5 179.5q0 95 56.5 179.5t158.5 140.5l-213 270h4
+q48 0 101.5 34.5t111.5 102.5q23 -82 55 -123.5t74 -41.5q45 0 95.5 40.5t112.5 128.5q4 -59 35.5 -95t79.5 -36q9 0 24.5 4t32.5 11q-6 -29 -26.5 -54.5t-60.5 -54.5v-465q0 -84 29 -121.5t93 -37.5h21l-152 -189q-67 30 -105.5 73t-57.5 114z" />
+    <glyph glyph-name="b" unicode="b" 
+d="M342 231q52 -19 88.5 -49t61.5 -73q33 10 65 19t61 15v600q-46 17 -77.5 39t-55.5 56q-39 -28 -138 -66l-5 -2v-539zM49 66q8 48 34.5 85t76.5 68v897q0 85 -14 125t-47 73q6 0 13.5 -0.5t16.5 -0.5q38 0 122 37.5t150 93.5q-31 -64 -45 -129.5t-14 -186.5v-325
+q75 31 160.5 82.5t179.5 122.5q26 -67 65.5 -102.5t88.5 -35.5q9 0 34 6q7 2 11 3q-12 -31 -31.5 -55t-48.5 -46v-475q0 -50 10 -96t33 -101q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5z" />
+    <glyph glyph-name="c" unicode="c" horiz-adv-x="735" 
+d="M338 222q76 -5 145 -29t117 -62l57 47l21 -24l-223 -199q-80 60 -150 88.5t-139 28.5q-29 0 -57 -6t-58 -19q0 52 26 90.5t77 63.5v491q0 65 -12.5 101t-40.5 69q13 -1 27.5 -1.5t41.5 -0.5q98 0 201.5 38.5t160.5 96.5q32 -52 72.5 -80t83.5 -28q13 0 39 3q4 1 6 1
+q-42 -65 -91.5 -98t-102.5 -33q-59 0 -101 28.5t-57 79.5l-43 -14v-632z" />
+    <glyph glyph-name="d" unicode="d" 
+d="M347 211q51 -15 88.5 -41t59.5 -59q24 10 52.5 18t63.5 14v607l-116 122q-40 -29 -78 -48t-70 -25v-588zM61 58q5 39 29.5 70t78.5 65v446q0 77 -12.5 108.5t-42.5 57.5q15 -1 29 -1.5t30 -0.5q97 0 166.5 21.5t136.5 70.5l-203 227q-53 60 -103 104t-99 74
+q98 4 167 28.5t109 70.5v-29q0 -32 16.5 -63t65.5 -84l312 -335q2 -2 8 -9q42 -47 88 -58q-24 -28 -34.5 -58.5t-10.5 -74.5v-428q0 -58 9 -90.5t29 -65.5q-4 1 -12 2q-73 11 -102 11q-123 0 -219 -38t-162 -112q-55 56 -103 83.5t-92 27.5q-16 0 -35 -5t-44 -15z" />
+    <glyph glyph-name="e" unicode="e" horiz-adv-x="786" 
+d="M401 872l-61 -16v-461l244 164zM55 49q0 55 26.5 94t78.5 60v487q0 56 -14 97t-44 75h70q112 0 223.5 40.5t175.5 103.5q30 -98 82 -189t121 -166l-434 -295v-134q81 -10 147.5 -33t114.5 -58l57 45l19 -24l-223 -197q-63 55 -139.5 85t-155.5 30q-28 0 -53.5 -5
+t-51.5 -16z" />
+    <glyph glyph-name="f" unicode="f" horiz-adv-x="664" 
+d="M92 53q12 37 39.5 72t77.5 78v614h-152v90h152v51q0 59 -14 105t-39 74h16q105 0 209.5 56.5t200.5 166.5q37 -71 65 -99t60 -28q20 0 39 7.5t45 25.5q-24 -75 -80.5 -121.5t-122.5 -46.5q-45 0 -85.5 21.5t-74.5 62.5l-39 -23v-252q7 0 26.5 1t33.5 1q45 0 80 3t65 10
+l-27 -107q-14 2 -31.5 3t-56.5 1q-35 0 -54 -0.5t-36 -1.5v-602q29 -8 58.5 -26.5t76.5 -59.5l64 37l16 -25q-51 -27 -102 -66.5t-125 -111.5q-55 57 -106.5 86t-96.5 29q-20 0 -40 -6t-42 -19z" />
+    <glyph glyph-name="g" unicode="g" 
+d="M606 262v483q-46 12 -82 40t-69 77q-38 -14 -68.5 -22t-56.5 -11v-557q41 -19 73 -46.5t58 -65.5q13 9 61.5 45.5t83.5 56.5zM786 203q52 -27 77.5 -63t25.5 -83q0 -51 -33 -97t-141 -126l-252 -186q-36 43 -85 64.5t-114 21.5q-25 0 -56 -5.5t-71 -17.5q65 91 128 129.5
+t145 38.5q54 0 102.5 -18t93.5 -56q66 36 96.5 73t30.5 81q0 71 -88 133q-9 6 -13 9q-13 9 -19.5 32t-6.5 66v22q-83 -57 -159.5 -114.5t-143.5 -112.5q-47 56 -98.5 85.5t-104.5 29.5q-9 0 -22.5 -2l-40.5 -6q8 49 34.5 86.5t75.5 68.5v426q0 59 -10.5 96.5t-33.5 75.5
+q15 -1 33.5 -1.5t51.5 -0.5q135 0 257 39.5t225 116.5q25 -67 65 -102.5t88 -35.5q10 0 34 6q8 2 11 3q-12 -33 -32 -57.5t-50 -43.5v-575z" />
+    <glyph glyph-name="h" unicode="h" horiz-adv-x="948" 
+d="M51 70q5 48 33 81.5t81 57.5v917q0 79 -13.5 115.5t-46.5 69.5q79 24 148.5 63t142.5 101q-30 -84 -43.5 -177t-13.5 -239v-307l303 252q37 -65 76 -96t84 -31q19 0 37 6t40 20q-5 -44 -25 -76.5t-60 -62.5v-526q0 -59 8.5 -97t27.5 -75q-30 8 -56.5 12t-51.5 4
+q-53 0 -92 -27t-39 -61q0 -29 59.5 -98.5t59.5 -135.5q0 -67 -42 -112t-107 -49q29 25 44 60.5t15 82.5q0 66 -29 148.5t-29 97.5q0 29 27.5 68t27.5 79v600q-31 8 -59 29.5t-67 71.5l-152 -125v-502q40 -17 77 -40t70 -52q-67 -32 -119 -68.5t-92 -79.5q-28 52 -76 83.5
+t-96 31.5q-8 0 -20 -3t-32 -11z" />
+    <glyph glyph-name="i" unicode="i" horiz-adv-x="508" 
+d="M131 1163l-41 -26l-14 24q92 66 125 94.5t49 51.5q21 -51 48.5 -73t70.5 -22q4 0 12 1t12 1q-16 -53 -57.5 -85.5t-91.5 -32.5q-28 0 -57 17t-56 50zM317 -20q-90 24 -126.5 97t-36.5 253v413q-25 13 -44 28.5t-36 37.5l-51 -31l-15 23q66 41 128 89.5t116 102.5
+q22 -49 55.5 -75.5t73.5 -26.5q7 0 18.5 4t38.5 16q-2 -49 -27.5 -85.5t-76.5 -63.5v-424q0 -103 32 -139t115 -39q-56 -47 -97.5 -92.5t-66.5 -87.5z" />
+    <glyph glyph-name="j" unicode="j" horiz-adv-x="508" 
+d="M156 743q-24 11 -43.5 26.5t-38.5 39.5l-51 -31l-15 23q66 41 128 89.5t116 102.5q22 -49 55.5 -75.5t73.5 -26.5q7 0 18.5 4t38.5 16q-1 -48 -27.5 -85.5t-78.5 -63.5v-586q62 -51 93.5 -107.5t31.5 -115.5q0 -104 -161 -207q-31 -20 -47 -31q-47 -32 -69 -63t-27 -69
+q-9 12 -13.5 23.5t-4.5 22.5q0 42 74 132.5t74 150.5q0 61 -81 137q-14 13 -20 19q-14 14 -20 30.5t-6 46.5v15v583zM131 1163l-41 -26l-14 24q92 66 125 94.5t49 51.5q21 -51 48.5 -73t70.5 -22q4 0 12 1t12 1q-24 -58 -60.5 -88t-82.5 -30q-30 0 -58.5 16t-60.5 51z" />
+    <glyph glyph-name="k" unicode="k" horiz-adv-x="899" 
+d="M349 758l305 229q27 -87 65 -156t81 -108l-211 -160q37 -30 61.5 -75t44.5 -130q28 -112 66 -167.5t86 -55.5q10 0 21 4.5t23 13.5l17 -22q-64 -46 -112.5 -94.5t-73.5 -91.5q-66 19 -104 79.5t-64 190.5q-20 100 -43.5 155t-58.5 85l-103 -84v-183q38 -16 68 -37.5
+t55 -50.5q-47 -23 -91.5 -56t-96.5 -83q-57 61 -100.5 84t-94.5 23q-11 0 -17 -0.5t-11 -1.5q10 40 37 70.5t71 51.5v942q0 73 -14 111.5t-47 73.5q6 -1 13.5 -1.5t16.5 -0.5q38 0 121 37.5t150 93.5q-30 -64 -45 -127t-15 -125v-434zM349 414l289 225q-32 50 -60 103
+t-51 108l-178 -129v-307z" />
+    <glyph glyph-name="l" unicode="l" horiz-adv-x="502" 
+d="M47 51q11 44 39.5 75.5t75.5 51.5v924q0 80 -15.5 118.5t-54.5 73.5q83 9 156.5 46t152.5 112l15 -14q-41 -46 -57.5 -105t-16.5 -211v-901q44 -16 74.5 -40t54.5 -60l51 37l17 -27q-79 -57 -135 -107t-74 -79q-26 52 -79.5 85t-111.5 33q-19 0 -43 -3t-49 -9z" />
+    <glyph glyph-name="m" unicode="m" horiz-adv-x="1327" 
+d="M268 -37q-40 65 -94.5 96.5t-138.5 38.5q12 28 39 50t82 49v462q0 77 -28 104.5t-112 35.5q68 41 118 90t85 108q62 -31 89.5 -95t27.5 -185l321 280q53 -33 79 -95t26 -154v-31l319 280q14 -61 48.5 -95t84.5 -34q13 0 24.5 2t22.5 6q-17 -42 -38.5 -70.5t-51.5 -49.5
+v-465q0 -67 38 -101.5t111 -36.5q-54 -45 -95.5 -92t-71.5 -98q-92 25 -127 84t-35 246v430q-27 13 -51 29.5t-45 38.5l-133 -109v-483q37 -13 67 -35.5t60 -61.5q-54 -26 -101.5 -63.5t-89.5 -85.5q-29 65 -84 101.5t-139 43.5q16 27 41 50t66 47v458q0 64 -18.5 103.5
+t-57.5 62.5l-170 -137v-481q20 -9 43 -22t55 -34q-46 -35 -89.5 -83t-76.5 -99z" />
+    <glyph glyph-name="n" unicode="n" horiz-adv-x="948" 
+d="M297 -31q-40 64 -100.5 100.5t-124.5 36.5h-20t-15 -1q20 34 50 60t73 46v442q0 88 -28 116.5t-112 37.5q73 46 121 94t82 109q63 -36 90 -103t27 -192v-19l367 305q23 -64 56.5 -94t80.5 -30q5 0 12 1t20 4q-11 -33 -31.5 -58.5t-53.5 -47.5v-465q0 -79 35 -114.5
+t114 -38.5q-47 -41 -89 -88.5t-79 -100.5q-91 24 -126.5 79t-35.5 194v501q-22 13 -42 31t-40 41l-188 -162v-440q55 -18 86 -39.5t53 -54.5q-57 -26 -101 -62.5t-81 -87.5z" />
+    <glyph glyph-name="o" unicode="o" 
+d="M342 233q52 -19 88.5 -49t61.5 -73q21 7 49.5 14t78.5 18l1 602q-45 10 -81 37.5t-73 79.5q-12 -3 -35 -10q-60 -17 -90 -23v-596zM49 66q8 48 34.5 85t76.5 68v467q0 51 -10.5 89.5t-34.5 78.5q15 -1 33.5 -1.5t50.5 -0.5q135 0 257.5 39.5t225.5 116.5
+q26 -67 65.5 -102.5t88.5 -35.5q9 0 34 6q7 2 11 3q-13 -33 -32 -57t-48 -44v-446q0 -68 10 -121t33 -105q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5z" />
+    <glyph glyph-name="p" unicode="p" horiz-adv-x="948" 
+d="M182 659q0 68 -32.5 101t-108.5 43q79 55 126 102.5t79 102.5q58 -39 86 -102.5t28 -155.5v-29l347 289q24 -63 64 -98t87 -35q10 0 34 5q8 2 11 3q-12 -32 -31 -56.5t-49 -44.5v-440q0 -64 10.5 -120.5t32.5 -110.5l-48 3t-27 1q-83 0 -184.5 -37.5t-151.5 -89.5
+q-19 27 -41.5 45t-53.5 28v-188q0 -68 8.5 -111t26.5 -65q-71 -10 -157 -54t-113 -48q29 38 43 96.5t14 140.5v281h-22q-44 0 -80 -28.5t-64 -83.5q-1 4 -1.5 8.5t-0.5 15.5q0 64 47.5 126t120.5 93v413zM360 260q73 -17 128.5 -56t91.5 -98l61 25v614q-24 12 -46 31.5
+t-48 50.5l-187 -151v-416z" />
+    <glyph glyph-name="q" unicode="q" 
+d="M623 219v526q-46 12 -82 40t-70 77q-25 -8 -55 -16t-70 -17v-587q49 -20 79.5 -46.5t49.5 -64.5zM305 -33q-38 55 -88 84t-106 29q-22 0 -33.5 -0.5t-23.5 -1.5l-1 4q0 44 30.5 82t82.5 59v457q0 54 -11 93.5t-36 80.5q16 -1 34.5 -1.5t49.5 -0.5q135 0 257.5 39.5
+t225.5 116.5q26 -67 65 -102.5t87 -35.5q9 0 34 6q7 2 11 3q-13 -34 -32 -58t-48 -43v-942q0 -67 15 -127.5t44 -111.5q-35 12 -97 40q-115 52 -175 52h-15q27 23 37.5 77.5t10.5 196.5v215q-93 -48 -170.5 -99.5t-147.5 -111.5z" />
+    <glyph glyph-name="r" unicode="r" horiz-adv-x="664" 
+d="M296 -31q-40 64 -100.5 100.5t-124.5 36.5h-20t-15 -1q20 34 50 60t73 46v440q0 90 -27.5 119t-111.5 37q64 37 114.5 87.5t87.5 115.5q61 -39 89 -97.5t28 -150.5l184 248q24 -64 47 -89.5t56 -25.5q15 0 30.5 6t32.5 19q-8 -80 -50.5 -130.5t-96.5 -50.5
+q-37 0 -69.5 18.5t-59.5 55.5l-74 -100v-500q41 -14 70 -30t49 -36l37 27l20 -20q-76 -50 -131 -96t-88 -89z" />
+    <glyph glyph-name="s" unicode="s" horiz-adv-x="887" 
+d="M385 487q53 59 146 155q169 174 186 239q-40 -45 -80.5 -67.5t-79.5 -22.5q-40 0 -74.5 24t-58.5 70l-88 -23v-375h49zM123 145q43 32 95.5 51t94.5 19q48 0 90 -24t86 -76l84 18v379h-100q-72 -81 -197.5 -199.5t-152.5 -167.5zM65 -31h-24q0 4 1 13t1 14q0 71 56.5 160
+t203.5 239h-186q21 33 30 65t9 79v245q0 27 -10.5 52t-30.5 47q10 -1 44.5 -3.5t55.5 -2.5q103 0 192 30.5t166 91.5q28 -35 56 -52t57 -17q30 0 47 17.5t21 51.5h32q-12 -86 -54.5 -166t-170.5 -229h227q-17 -15 -25.5 -48t-8.5 -87v-233q0 -59 8.5 -93t28.5 -67
+q-39 12 -77.5 18t-78.5 6q-95 0 -170.5 -33t-138.5 -102q-52 62 -88 86.5t-74 24.5q-41 0 -67.5 -28.5t-31.5 -78.5z" />
+    <glyph glyph-name="t" unicode="t" horiz-adv-x="616" 
+d="M98 51q11 43 38.5 73.5t76.5 53.5v649h-18q-49 0 -84.5 -8t-59.5 -24q2 13 4 34q4 32 4 41q0 13 -1.5 30t-5.5 54q27 -12 59.5 -18t70.5 -6h31v37q0 69 -15.5 109.5t-54.5 74.5q82 8 155 45.5t155 114.5l14 -15q-41 -45 -57.5 -108t-16.5 -195v-63h31q38 0 70.5 6
+t58.5 18q-1 -4 -2 -12q-6 -48 -6 -68q0 -18 5 -58l3 -21q-25 16 -60.5 24t-82.5 8h-17v-606q41 -13 72 -37t57 -63l51 37l17 -27q-79 -57 -135 -107t-74 -79q-26 52 -79 85t-112 33q-19 0 -43 -3t-49 -9z" />
+    <glyph glyph-name="u" unicode="u" horiz-adv-x="948" 
+d="M678 1006q32 -59 95 -96.5t130 -37.5h10q-22 -37 -51 -62.5t-71 -45.5v-459q0 -72 27.5 -99.5t111.5 -35.5q-70 -41 -119.5 -90.5t-83.5 -112.5q-61 37 -88 100t-29 176l-293 -263q-27 56 -78 92.5t-102 36.5q-11 0 -24.5 -3t-38.5 -12q10 34 31 59.5t55 47.5v452
+q0 91 -33.5 126.5t-116.5 39.5q61 51 104 99.5t64 91.5q92 -24 127 -85t35 -241v-451q25 -13 50 -36.5t56 -61.5l164 139v488q-40 15 -59.5 25t-32.5 22l-39 -29l-14 25q76 50 127 98.5t86 102.5z" />
+    <glyph glyph-name="v" unicode="v" horiz-adv-x="907" 
+d="M319 -31q-77 41 -107 93t-30 174v382q0 96 -20.5 148.5t-63.5 64.5l-67 -45l-15 25l9 6q164 109 237 174q53 -38 76.5 -108.5t23.5 -190.5v-366q0 -120 25 -159.5t89 -59.5q7 2 25 8q66 22 95 30v598q-24 17 -44.5 38t-37.5 48l-65 -49l-17 29q85 62 140.5 104t99.5 78
+q26 -72 68 -113.5t87 -41.5q10 0 22 3t30 11q-18 -43 -42 -70.5t-61 -46.5v-440q0 -51 10 -94.5t31 -83.5q-27 4 -55.5 6t-56.5 2q-102 0 -202.5 -40t-183.5 -114z" />
+    <glyph glyph-name="w" unicode="w" horiz-adv-x="1305" 
+d="M722 -14q-70 35 -102.5 83t-32.5 117v21l-248 -227q-28 56 -79 92.5t-101 36.5q-11 0 -25 -3t-39 -12q11 36 32 61.5t56 45.5v434q0 96 -20.5 148.5t-63.5 64.5l-67 -47l-14 27l8 5q164 109 237 177q53 -40 77 -111.5t24 -191.5v-474q21 -12 45 -34t59 -64l117 103v397
+q0 94 -21.5 147.5t-64.5 65.5l-68 -47l-12 26l8 6q164 109 238 177q52 -40 76 -111.5t24 -191.5v-377q0 -110 24 -148t87 -59q29 10 59.5 19t60.5 18v600q-25 17 -45 37.5t-37 46.5l-65 -49l-14 28q85 62 140.5 104.5t98.5 78.5q27 -73 68 -114.5t86 -41.5q10 0 21.5 3
+t29.5 11q-17 -42 -40.5 -68.5t-61.5 -45.5v-441q0 -51 10 -95.5t30 -83.5q-35 4 -61.5 6.5t-48.5 2.5q-102 0 -202 -40t-183 -113z" />
+    <glyph glyph-name="x" unicode="x" horiz-adv-x="854" 
+d="M10 -10q30 119 85 186.5t122 67.5q20 0 41.5 -9.5t46.5 -29.5l78 205l-18 45h-58q-41 0 -72.5 -2.5t-58.5 -7.5q9 24 13.5 47t5.5 47v14q13 -2 27.5 -3t43.5 -1q26 0 38.5 0.5t22.5 1.5q-59 163 -122 223.5t-170 69.5q103 63 144.5 97.5t66.5 70.5q56 -31 107.5 -112
+t119.5 -251l145 373q33 -60 52 -76t47 -16q27 0 47.5 20.5t34.5 63.5v-25q0 -114 -37 -181t-98 -67q-25 0 -50 11.5t-51 33.5l-71 -182l20 -49h82q33 0 66.5 5t68.5 15q-13 -33 -22 -61t-15 -55h-139q54 -144 104 -203t115 -59q12 0 26 3t40 11q-45 -60 -78 -117.5
+t-55 -113.5q-96 14 -159 87t-147 293l-153 -387q-24 50 -48.5 70t-58.5 20q-33 0 -64.5 -17.5t-64.5 -55.5z" />
+    <glyph glyph-name="y" unicode="y" horiz-adv-x="948" 
+d="M677 1006q32 -59 95 -96.5t130 -37.5h10q-20 -35 -49 -61t-71 -47v-633q16 -35 23 -67t7 -66q0 -160 -129 -270.5t-317 -110.5q-94 0 -175 56.5t-98 56.5q-28 0 -47 -16.5t-34 -55.5q-3 26 -4 38t-1 21q0 66 42 113t100 47q40 0 75 -23.5t80 -82.5q46 -63 81 -85t81 -22
+q79 0 138 57t59 136q0 34 -31 121.5t-31 181.5v84l-295 -264q-27 56 -78 92.5t-102 36.5q-11 0 -24.5 -3t-38.5 -12q11 35 32 60t56 47v452q0 88 -35 125.5t-116 41.5l7 6q104 91 160 184q91 -24 127.5 -84t36.5 -197v-496q23 -13 47 -35t57 -63l166 139v488q-44 16 -63 26
+t-31 21l-39 -29l-14 25q76 50 127 98.5t86 102.5z" />
+    <glyph glyph-name="z" unicode="z" horiz-adv-x="807" 
+d="M41 -27l-31 4q75 119 153 233t161 224h-101q-25 0 -53.5 -3t-56.5 -9q24 34 40 66.5t24 62.5h233l237 328q-95 -67 -175 -98t-157 -31q-74 0 -138.5 22.5t-117.5 67.5q61 37 115.5 83t104.5 101q16 -66 66.5 -100.5t129.5 -34.5q98 0 178.5 36.5t100.5 88.5l22 -15
+q-69 -112 -144.5 -224t-158.5 -226h123q29 0 46.5 4.5t35.5 13.5q-22 -33 -42 -67t-40 -70h-205l-239 -317q89 61 173.5 89.5t176.5 28.5q66 0 121 -15.5t106 -49.5l43 53l27 -26q-50 -52 -94 -108t-82 -118q-66 54 -147 80.5t-177 26.5q-98 0 -157 -23t-101 -78z" />
+    <glyph glyph-name="braceleft" unicode="{" horiz-adv-x="1024" 
+d="M848 1516v-53q-136 -2 -186 -55t-50 -210v-141q0 -227 -59 -308.5t-217 -113.5q159 -32 217.5 -113.5t58.5 -308.5v-141q0 -157 49.5 -209t186.5 -54v-53h-10q-219 0 -301 74t-82 272v207q0 161 -59 221.5t-218 73.5v64q161 13 219 73.5t58 221.5v206q0 199 82 273
+t301 74h10z" />
+    <glyph glyph-name="bar" unicode="|" horiz-adv-x="1024" 
+d="M438 1565h150v-2048h-150v2048z" />
+    <glyph glyph-name="braceright" unicode="}" horiz-adv-x="1024" 
+d="M176 1516h10q220 0 302.5 -74t82.5 -273v-206q0 -161 58 -221.5t219 -73.5v-64q-161 -13 -219 -73.5t-58 -221.5v-207q0 -198 -82.5 -272t-302.5 -74h-10v53q137 2 186.5 54.5t49.5 208.5v141q0 227 58.5 308.5t217.5 113.5q-158 32 -217 113.5t-59 308.5v141
+q0 157 -50 210t-186 55v53z" />
+    <glyph glyph-name="asciitilde" unicode="~" horiz-adv-x="1706" 
+d="M1530 770v-156q-104 -72 -199 -106.5t-190 -34.5q-93 0 -256 58q-22 8 -34 12l-15 5q-176 60 -273 60q-84 0 -175 -37t-210 -120v155q106 72 202 108t185 36q62 0 127.5 -13.5t163.5 -48.5q16 -5 47 -17q159 -57 240 -57q88 0 179.5 37t207.5 119z" />
+    <glyph glyph-name="uni0080" 
+d="M442 602v143h-176v-34q0 -20 1 -43t4 -66h171zM918 1284q-8 -89 -52 -140.5t-112 -51.5q-37 0 -67 32.5t-50 94.5l-29 -23v-399h215l-14 -52h-201v-143h146l-15 -51h-130q-8 -105 -57.5 -170.5t-148.5 -99.5q22 26 30.5 60t8.5 118v92h-166q23 -198 103 -301t213 -103
+q106 0 174.5 41t140.5 160q-34 -194 -126.5 -290.5t-243.5 -96.5q-198 0 -315.5 169t-117.5 421h-102l16 51h86q0 33 2.5 68t8.5 75h-113l14 52h109q35 172 124.5 309.5t219.5 218.5q-92 -103 -141.5 -234t-59.5 -294h174v274l-86 -57l-6 24q150 100 243.5 175.5
+t158.5 146.5q14 -54 40.5 -84.5t57.5 -30.5q18 0 34 9.5t34 29.5z" />
+    <glyph glyph-name="uni0080" unicode="&#x20ac;" 
+d="M442 602v143h-176v-34q0 -20 1 -43t4 -66h171zM918 1284q-8 -89 -52 -140.5t-112 -51.5q-37 0 -67 32.5t-50 94.5l-29 -23v-399h215l-14 -52h-201v-143h146l-15 -51h-130q-8 -105 -57.5 -170.5t-148.5 -99.5q22 26 30.5 60t8.5 118v92h-166q23 -198 103 -301t213 -103
+q106 0 174.5 41t140.5 160q-34 -194 -126.5 -290.5t-243.5 -96.5q-198 0 -315.5 169t-117.5 421h-102l16 51h86q0 33 2.5 68t8.5 75h-113l14 52h109q35 172 124.5 309.5t219.5 218.5q-92 -103 -141.5 -234t-59.5 -294h174v274l-86 -57l-6 24q150 100 243.5 175.5
+t158.5 146.5q14 -54 40.5 -84.5t57.5 -30.5q18 0 34 9.5t34 29.5z" />
+    <glyph glyph-name="uni00A0" unicode="&#xa0;" 
+ />
+    <glyph glyph-name="exclamdown" unicode="&#xa1;" horiz-adv-x="555" 
+d="M291 1051l98 -797q22 -15 40 -33.5t34 -40.5q-56 -40 -102.5 -87t-79.5 -97q-28 80 -79 124.5t-126 55.5q23 24 54 44.5t71 39.5zM287 1446q35 -40 71.5 -76t75.5 -70q-32 -29 -66.5 -66.5t-78.5 -90.5q-43 42 -81 77.5t-77 67.5q38 29 75.5 66.5t80.5 91.5z" />
+    <glyph glyph-name="cent" unicode="&#xa2;" 
+d="M398 426q28 -2 52.5 -4.5t50.5 -7.5v586q-12 11 -22.5 27.5t-21.5 45.5l-60 -18zM762 358l-227 -198v-185h-33v205q-60 46 -129.5 71t-136.5 25q-30 0 -58.5 -5.5t-58.5 -18.5q0 52 26 90.5t78 63.5v489q0 70 -13 104.5t-42 67.5q17 -1 30.5 -1.5t26.5 -0.5
+q66 0 139 16.5t138 46.5v234h33v-217q17 5 37 19t42 36q33 -52 74.5 -80t85.5 -28q12 0 38 3q5 0 9 1q-42 -65 -93 -98t-107 -33q-21 0 -43.5 4.5t-42.5 13.5v-578q44 -11 80.5 -28t66.5 -41l61 47z" />
+    <glyph glyph-name="sterling" unicode="&#xa3;" 
+d="M68 0q67 134 202.5 211.5t304.5 77.5q63 0 126 -17.5t143 -58.5l28 39l17 -19q-39 -58 -71.5 -115.5t-59.5 -115.5q-82 49 -173.5 75.5t-178.5 26.5q-86 0 -169 -25.5t-169 -78.5zM375 500q0 -128 -54.5 -194.5t-179.5 -94.5q31 31 43.5 70.5t12.5 130.5v241h-172v80h172
+v166q0 114 30.5 175.5t104.5 125.5q78 67 152 102t139 35q49 0 92 -17.5t86 -55.5l35 32l20 -18q-48 -43 -89 -91.5t-83 -111.5q-99 91 -139 115t-74 24q-52 0 -74 -31.5t-22 -109.5v-340h358v-80h-358v-153z" />
+    <glyph glyph-name="currency" unicode="&#xa4;" 
+d="M442 602v143h-176v-34q0 -20 1 -43t4 -66h171zM918 1284q-8 -89 -52 -140.5t-112 -51.5q-37 0 -67 32.5t-50 94.5l-29 -23v-399h215l-14 -52h-201v-143h146l-15 -51h-130q-8 -105 -57.5 -170.5t-148.5 -99.5q22 26 30.5 60t8.5 118v92h-166q23 -198 103 -301t213 -103
+q106 0 174.5 41t140.5 160q-34 -194 -126.5 -290.5t-243.5 -96.5q-198 0 -315.5 169t-117.5 421h-102l16 51h86q0 33 2.5 68t8.5 75h-113l14 52h109q35 172 124.5 309.5t219.5 218.5q-92 -103 -141.5 -234t-59.5 -294h174v274l-86 -57l-6 24q150 100 243.5 175.5
+t158.5 146.5q14 -54 40.5 -84.5t57.5 -30.5q18 0 34 9.5t34 29.5z" />
+    <glyph glyph-name="yen" unicode="&#xa5;" horiz-adv-x="995" 
+d="M657 621v73h-268v-116q23 -15 46.5 -38t53.5 -61zM389 745h268v168h-268v-168zM721 1352q32 -59 95 -96t130 -37h10q-21 -37 -49.5 -63t-68.5 -46v-145h186v-52h-186v-168h186v-51h-186v-219q15 -36 22.5 -69t7.5 -66q0 -159 -128.5 -269t-317.5 -110q-94 0 -176 56.5
+t-99 56.5q-28 0 -45.5 -16t-33.5 -56q-1 5 -4 26.5t-3 32.5q0 66 42 113t100 47q41 0 77.5 -24t79.5 -80q49 -66 82.5 -87.5t77.5 -21.5q79 0 138 57.5t59 137.5q0 44 -31 124t-31 128q0 6 1 22.5t1 26.5v84l-297 -264q-27 57 -77.5 93t-102.5 36q-13 0 -28.5 -3t-34.5 -10
+q11 34 32.5 58.5t59.5 46.5v149h-189v51h189v168h-189v52h189v32q0 83 -38 123.5t-117 43.5q3 3 12 10q103 89 157 180q89 -21 127.5 -86t38.5 -195v-108h268v143q-34 10 -57 21.5t-39 25.5l-37 -29l-16 23q74 49 125.5 98t87.5 105z" />
+    <glyph glyph-name="brokenbar" unicode="&#xa6;" horiz-adv-x="1024" 
+d="M438 408h150v-758h-150v758zM438 1432h150v-758h-150v758z" />
+    <glyph glyph-name="section" unicode="&#xa7;" horiz-adv-x="1024" 
+d="M672 330v383q0 84 -11 114t-38 41l-45 19l-193 -80v-424q0 -41 14 -67.5t43 -41.5l76 -38zM369 -303q-60 61 -105 87t-90 26q-28 0 -51.5 -8t-46.5 -25q31 92 92.5 136t161.5 44q60 0 118 -25.5t130 -83.5l94 19v164q0 65 -18 88.5t-66 48.5q-130 67 -200 87.5t-140 20.5
+q-22 0 -73 -6q-9 -1 -13 -2v24q4 189 4 273q0 86 -1 143t-3 113q28 -5 42 -6.5t25 -1.5q68 0 150.5 23.5t163.5 66.5q-86 46 -152.5 67t-126.5 21q-24 0 -49 -3t-53 -9q19 38 28 74t9 73q0 54 -11 87.5t-34 68.5l7 -1q61 -7 89 -7q102 0 224 43.5t243 124.5q36 -73 69 -103
+t74 -30q24 0 46.5 11t41.5 32q-23 -89 -79 -133.5t-144 -44.5q-66 0 -113 27t-98 95l-129 -36v-152q0 -91 94 -136l6 -3l127 -60q46 -22 87 -31.5t89 -9.5q29 0 52 2.5t45 7.5q-3 -82 -4.5 -151.5t-1.5 -126.5t1.5 -126.5t4.5 -149.5q-112 -7 -191.5 -33t-136.5 -74
+q64 -34 119 -49.5t106 -15.5q23 0 51.5 4t63.5 12q-16 -26 -24.5 -60t-8.5 -71q0 -81 13 -123t42 -86q-34 5 -71.5 7.5t-81.5 2.5q-112 0 -216.5 -37t-180.5 -104z" />
+    <glyph glyph-name="dieresis" unicode="&#xa8;" horiz-adv-x="1024" 
+d="M557 1184l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM195 1184l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
+    <glyph glyph-name="copyright" unicode="&#xa9;" horiz-adv-x="1683" 
+d="M1122 1098h37l2 -316h-43q-32 135 -103 204t-177 69q-119 0 -179.5 -93.5t-60.5 -277.5q0 -187 66.5 -284t193.5 -97q84 0 153.5 44t127.5 132l39 -26q-61 -105 -148 -158t-199 -53q-173 0 -292 124t-119 304q0 183 118.5 307.5t290.5 124.5q75 0 149.5 -33t80.5 -33
+q27 0 42 14.5t21 47.5zM844 1305q-123 0 -238 -49t-203 -138q-88 -90 -134 -202.5t-46 -237.5q0 -127 46.5 -239t136.5 -201q91 -90 201.5 -136.5t234.5 -46.5q126 0 237 46.5t199 136.5q89 90 136.5 204t47.5 236q0 123 -48 241t-134 203q-86 86 -201 134.5t-235 48.5z
+M844 1391q138 0 269 -54.5t230 -152.5q100 -99 154.5 -232t54.5 -274q0 -140 -53.5 -269.5t-155.5 -232.5q-99 -101 -228 -155t-273 -54q-142 0 -270 53.5t-232 155.5q-103 102 -156 229t-53 273q0 141 53.5 270t155.5 232q100 101 230.5 156t273.5 55z" />
+    <glyph glyph-name="ordfeminine" unicode="&#xaa;" horiz-adv-x="651" 
+d="M84 608h520v-96h-520v96zM330 1292q-30 -16 -57 -23t-54 -7q-22 0 -44 4t-44 12l211 -248l-25 -22l-88 106q-20 -28 -29.5 -55.5t-9.5 -59.5q0 -70 40 -114t116 -58l41 29v383q-16 6 -30 19t-27 34zM473 1456q2 -49 23.5 -76.5t58.5 -27.5q12 0 26 3.5t31 10.5
+q-7 -29 -23.5 -49.5t-47.5 -40.5v-322q0 -58 21 -83t69 -25q4 0 12 1t12 1l-127 -150q-54 21 -85 51t-46 76l-139 -123q-102 32 -159.5 91.5t-57.5 132.5q0 67 42 127t116 98l-164 192h8q41 0 83.5 26t92.5 81q19 -64 42.5 -94.5t53.5 -30.5q31 0 70 32.5t88 98.5z" />
+    <glyph glyph-name="guillemotleft" unicode="&#xab;" horiz-adv-x="905" 
+d="M729 68q-85 147 -165 250.5t-163 175.5q94 74 175 177t153 238q-3 -101 -41 -211t-104 -206q64 -102 100.5 -209t44.5 -215zM440 68q-85 147 -165 250.5t-162 175.5q93 74 174.5 177t152.5 238q-3 -100 -41.5 -210t-105.5 -207q65 -104 102.5 -211t44.5 -213z" />
+    <glyph glyph-name="logicalnot" unicode="&#xac;" horiz-adv-x="1706" 
+d="M254 860h1198v-502h-137v363h-1061v139z" />
+    <glyph glyph-name="uni00AD" unicode="&#xad;" horiz-adv-x="797" 
+d="M96 383l105 212q8 -25 20.5 -34.5t44.5 -9.5h47h240q39 0 75 10.5t72 32.5l-88 -191q-18 17 -38 24t-56 7h-37h-241q-25 0 -54.5 -10t-89.5 -41z" />
+    <glyph glyph-name="registered" unicode="&#xae;" horiz-adv-x="1683" 
+d="M738 721q13 -1 28 -1.5t35 -0.5q105 0 163 45t58 127q0 72 -50 116t-134 44q-51 0 -76 -17.5t-25 -52.5zM467 1094h397q144 0 231 -54t87 -141q0 -83 -66 -131.5t-219 -75.5q95 -28 145 -76.5t68 -130.5q1 -9 3 -28q11 -125 67 -125q31 0 47 33.5t16 97.5h45v-19
+q0 -84 -41 -129t-119 -45q-49 0 -84 16t-51 46q-20 37 -22 110t-8 97q-19 71 -66.5 105t-130.5 34h-29v-246q0 -51 25.5 -72t93.5 -27v-44h-389v44q69 4 95 25.5t26 73.5v516q0 53 -26 74.5t-95 26.5v45zM844 1305q-123 0 -238 -49t-203 -138q-88 -90 -134 -202.5
+t-46 -237.5q0 -127 46.5 -239t136.5 -201q89 -90 199.5 -136.5t236.5 -46.5q125 0 237 47t199 136q88 90 135 203t47 237q0 125 -47.5 242t-132.5 202q-86 86 -201 134.5t-235 48.5zM844 1391q140 0 273 -56t233 -157q97 -99 149.5 -230.5t52.5 -275.5q0 -139 -56 -270
+t-161 -234q-100 -99 -228 -150t-276 -51q-134 0 -261.5 54.5t-229.5 154.5q-102 101 -155.5 229t-53.5 273q0 142 53 270.5t154 231.5q100 101 231.5 156t274.5 55z" />
+    <glyph glyph-name="macron" unicode="&#xaf;" horiz-adv-x="1024" 
+d="M219 1174v104h586v-104h-586z" />
+    <glyph glyph-name="degree" unicode="&#xb0;" horiz-adv-x="674" 
+d="M338 1362q-81 0 -138 -56t-57 -137t57 -138.5t138 -57.5t136.5 57.5t55.5 138.5t-55.5 137t-136.5 56zM338 1456q118 0 202.5 -84.5t84.5 -204.5q0 -119 -84 -202.5t-205 -83.5t-204 83t-83 203t85 204.5t204 84.5z" />
+    <glyph glyph-name="plusminus" unicode="&#xb1;" horiz-adv-x="1706" 
+d="M254 170h1198v-141h-1198v141zM782 1192h142v-340h528v-139h-528v-340h-142v340h-528v139h528v340z" />
+    <glyph glyph-name="uni00B2" unicode="&#xb2;" horiz-adv-x="616" 
+d="M510 981v-12q0 -33 6.5 -57t19.5 -39q-28 10 -56.5 15t-59.5 5q-140 0 -221.5 -60.5t-81.5 -164.5v-16q38 4 82 7t96 3q72 -1 125 -6.5t90 -16.5l29 33l12 -17q-30 -33 -53.5 -65.5t-40.5 -61.5q-40 14 -88 21.5t-97 7.5q-35 0 -75.5 -2.5t-101.5 -9.5q-3 16 -4 34t-1 50
+q0 121 46.5 187.5t152.5 98.5q13 5 35 11q65 18 65 90v209l-20 8q-44 -35 -79.5 -51.5t-68.5 -16.5q-51 0 -89.5 31t-51.5 84q14 -8 25.5 -11t25.5 -3q28 0 63.5 16.5t69.5 46.5q52 -49 104 -73.5t103 -24.5q14 0 31.5 2t38.5 6q-17 -22 -24 -43t-7 -61v-154z" />
+    <glyph glyph-name="uni00B3" unicode="&#xb3;" horiz-adv-x="616" 
+d="M229 506q-20 31 -64.5 50t-94.5 19q-13 0 -23.5 -1t-23.5 -4q34 47 79 72.5t97 25.5q49 0 95 -23t79 -63l30 6v295q-32 7 -56 16t-44 21q-17 -10 -30.5 -24t-26.5 -36v90q8 -6 14.5 -9t11.5 -3q14 0 54 19.5t73 27.5v264l-34 6q-27 -52 -63.5 -77t-86.5 -25
+q-49 0 -86.5 24t-62.5 72q15 -8 27.5 -12t23.5 -4q28 0 56 20.5t67 71.5q53 -34 129.5 -52t173.5 -18h8q-12 -17 -19.5 -44.5t-7.5 -57.5v-82q0 -18 4.5 -39.5t18.5 -62.5q-15 2 -31.5 3t-46.5 1q-37 0 -74 -9t-76 -28q29 -19 65 -28t87 -9q31 0 49.5 1t36.5 3
+q-13 -12 -20 -37t-7 -63v-131q0 -33 9.5 -59t25.5 -41q-30 2 -47.5 2.5t-32.5 0.5q-70 0 -132.5 -17t-123.5 -52z" />
+    <glyph glyph-name="acute" unicode="&#xb4;" horiz-adv-x="1024" 
+d="M698 1350q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
+    <glyph glyph-name="uni00B5" unicode="&#xb5;" horiz-adv-x="1169" 
+d="M166 195q-33 -143 -64 -355q-37 -260 -116 -260q-43 0 -65.5 24.5t-22.5 69.5q0 44 70 277t110 422l108 512h168l-100 -475q-9 -40 -13.5 -74.5t-4.5 -59.5q0 -70 41.5 -108.5t119.5 -38.5q97 0 154 54.5t82 172.5l112 529h173l-115 -532q-9 -43 -14 -75.5t-5 -52.5
+q0 -48 26.5 -74t76.5 -26q44 0 81 25t58 69q13 27 27 73q17 56 39 56q9 0 15.5 -8t6.5 -21q0 -34 -13.5 -88t-35.5 -100q-39 -78 -92.5 -117t-122.5 -39q-81 0 -125.5 55t-44.5 154v13q-52 -115 -123 -168.5t-172 -53.5q-95 0 -151 56t-68 164z" />
+    <glyph glyph-name="paragraph" unicode="&#xb6;" horiz-adv-x="1024" 
+d="M958 1479v-86h-120v-1393h-111v1393h-176v-1393h-113v782q-170 8 -271 102.5t-101 245.5q0 157 107.5 253t285.5 96h499z" />
+    <glyph glyph-name="periodcentered" unicode="&#xb7;" horiz-adv-x="467" 
+d="M123 659q0 48 32 80.5t78 32.5q48 0 81.5 -33t33.5 -80q0 -45 -34 -78.5t-81 -33.5q-45 0 -77.5 33t-32.5 79z" />
+    <glyph glyph-name="cedilla" unicode="&#xb8;" horiz-adv-x="1024" 
+d="M336 -408l-19 5q6 52 44 85t92 33q28 0 51 -12t47 -39l45 8v168h-123v250h49v-196h164v-154q0 -44 6 -64t20 -34q-18 7 -37.5 10.5t-39.5 3.5q-57 0 -97.5 -17t-68.5 -53q-22 30 -41 44t-39 14q-21 0 -35 -13.5t-18 -38.5z" />
+    <glyph glyph-name="uni00B9" unicode="&#xb9;" horiz-adv-x="616" 
+d="M111 551q20 43 52 70t89 47v428q0 77 -25 104t-96 37v20q40 7 78 27.5t88 63.5q43 -30 62.5 -68.5t19.5 -95.5v-518q20 -7 39.5 -15t38.5 -16l26 24l19 -16q-45 -39 -79 -74.5t-52 -62.5q-49 32 -96.5 49.5t-84.5 17.5q-21 0 -41 -5.5t-38 -16.5z" />
+    <glyph glyph-name="ordmasculine" unicode="&#xba;" horiz-adv-x="700" 
+d="M455 1249q-41 11 -69.5 33.5t-39.5 50.5q-22 -7 -42.5 -12t-36.5 -6l-1 -414q45 -18 71 -39.5t36 -48.5q20 5 40 9.5t42 8.5v418zM74 608h549v-96h-549v96zM516 1450q23 -53 50 -76.5t65 -23.5q7 0 28 4q11 3 16 4q-13 -31 -28.5 -50.5t-36.5 -33.5v-307q0 -55 8.5 -91.5
+t26.5 -76.5q-23 4 -49.5 6t-56.5 2q-87 0 -160 -27t-148 -86q-34 40 -72.5 61t-74.5 21q-12 0 -46 -6q-8 -1 -13 -2q6 40 26 68.5t60 52.5v323q0 40 -9.5 69t-29.5 58q6 0 20 -1q43 -3 58 -3q101 0 192.5 28.5t173.5 86.5z" />
+    <glyph glyph-name="guillemotright" unicode="&#xbb;" horiz-adv-x="905" 
+d="M176 68q8 108 44.5 215t101.5 209q-66 96 -104.5 206t-41.5 211q70 -133 152 -237t176 -178q-83 -72 -163 -175.5t-165 -250.5zM465 68q8 106 45 213t102 211q-67 97 -105.5 207t-41.5 210q72 -135 153 -238t175 -177q-83 -72 -163 -175.5t-165 -250.5z" />
+    <glyph glyph-name="onequarter" unicode="&#xbc;" horiz-adv-x="1520" 
+d="M1249 229v379l-20 15q-45 -58 -83 -105t-75 -88v-201h178zM1151 -4q6 36 31 63.5t67 42.5v86h-166q-39 0 -70 -2.5t-50 -7.5v6q4 35 4 47q0 56 -1 79t-3 40q67 64 156 170.5t188 241.5q25 -47 48 -70.5t44 -23.5q5 0 15 5q3 2 5 2q-4 -23 -16.5 -42.5t-34.5 -34.5v-369
+h18q33 0 55 11.5t38 35.5v-20q0 -7 -2 -21t-2 -20q0 -7 2 -23t2 -26v-14q-16 20 -34 29t-42 9q-11 0 -19 -0.5t-16 -1.5v-82q18 -4 35 -11t35 -17l30 22l15 -18q-29 -16 -64 -44t-73 -65q-37 25 -69.5 37.5t-59.5 12.5q-18 0 -34.5 -7t-31.5 -20zM1200 1360h70l-955 -1399
+h-69zM106 604q19 39 50 64t86 45v399q0 70 -24.5 95.5t-92.5 35.5v19q37 6 73.5 25t86.5 59q40 -26 57.5 -62t17.5 -92v-481q17 -6 35.5 -13.5t40.5 -17.5l25 22l18 -12q-43 -38 -75.5 -71.5t-49.5 -59.5q-48 31 -93 48.5t-79 17.5q-18 0 -36 -5t-40 -16z" />
+    <glyph glyph-name="onehalf" unicode="&#xbd;" horiz-adv-x="1520" 
+d="M1417 422v-10q0 -31 6.5 -54t18.5 -36q-29 9 -56 13.5t-55 4.5q-134 0 -212.5 -56.5t-78.5 -154.5l1 -14q38 5 79 7.5t90 2.5q70 0 120.5 -5.5t87.5 -16.5l26 30l12 -14q-34 -40 -56 -68.5t-34 -50.5q-40 13 -85.5 20t-90.5 7q-40 0 -82.5 -2.5t-87.5 -7.5q-2 14 -3 30.5
+t-1 44.5q0 115 44 176.5t145 92.5q13 4 34 10q61 17 61 84v196l-20 6q-37 -31 -71.5 -46t-67.5 -15q-50 0 -87 29t-48 77q12 -7 23.5 -10.5t25.5 -3.5q27 0 60.5 15.5t66.5 44.5q50 -47 99.5 -70t96.5 -23q15 0 32 2.5t36 6.5q-15 -21 -22 -41t-7 -56v-145zM1200 1360h70
+l-955 -1399h-69zM106 604q19 39 50 64t86 45v399q0 70 -24.5 95.5t-92.5 35.5v19q37 6 73.5 25t86.5 59q40 -26 57.5 -62t17.5 -92v-481q17 -6 35.5 -13.5t40.5 -17.5l25 22l18 -12q-43 -38 -75.5 -71.5t-49.5 -59.5q-48 31 -93 48.5t-79 17.5q-18 0 -36 -5t-40 -16z" />
+    <glyph glyph-name="threequarters" unicode="&#xbe;" horiz-adv-x="1520" 
+d="M1248 229v379l-20 15q-45 -58 -83 -105t-75 -88v-201h178zM1150 -4q6 36 31 63.5t67 42.5v86h-166q-39 0 -70 -2.5t-50 -7.5v6q4 35 4 47q0 56 -1 79t-3 40q67 64 156 170.5t188 241.5q25 -47 48 -70.5t44 -23.5q5 0 15 5q3 2 5 2q-4 -23 -16.5 -42.5t-34.5 -34.5v-369
+h18q33 0 55 11.5t38 35.5v-20q0 -7 -2 -21t-2 -20q0 -7 2 -23t2 -26v-14q-16 20 -34 29t-42 9q-11 0 -19 -0.5t-16 -1.5v-82q18 -4 35 -11t35 -17l30 22l15 -18q-29 -16 -64 -44t-73 -65q-37 25 -69.5 37.5t-59.5 12.5q-18 0 -34.5 -7t-31.5 -20zM1199 1360h70l-955 -1399
+h-69zM218 559q-18 30 -61.5 49t-91.5 19q-10 0 -21 -1.5t-24 -4.5q33 44 76 67t93 23q48 0 92 -21.5t72 -58.5l31 6v276q-27 5 -50.5 13.5t-45.5 21.5q-19 -13 -31.5 -26.5t-21.5 -30.5v84l1 -1q16 -9 23 -9q13 0 51 17.5t70 25.5v245l-33 9q-25 -51 -60 -75t-83 -24
+q-45 0 -81.5 23.5t-62.5 68.5q15 -8 27.5 -12t22.5 -4q27 0 54 19t64 67q52 -32 125.5 -48.5t163.5 -16.5h8q-12 -16 -19 -41.5t-7 -53.5v-75q0 -20 4.5 -41t17.5 -56q-4 1 -12 1q-43 3 -61 3q-36 0 -71.5 -9t-72.5 -27q28 -17 63 -25t81 -8q31 0 48.5 1t34.5 3
+q-12 -10 -19 -34t-7 -60v-123q0 -30 8.5 -54t23.5 -38q-28 2 -45 3t-30 1q-66 0 -126 -16.5t-118 -51.5z" />
+    <glyph glyph-name="questiondown" unicode="&#xbf;" 
+d="M209 530q0 42 -8 84t-25 86h33q192 0 268.5 70.5t104.5 271.5q11 -64 16.5 -122.5t5.5 -108.5q0 -125 -44.5 -179t-158.5 -75v-436l50 -12q40 87 96 129.5t131 42.5q73 0 130.5 -41t96.5 -121q-20 13 -39 19.5t-39 6.5q-42 0 -84.5 -33.5t-103.5 -119.5
+q-82 58 -197.5 88.5t-257.5 30.5h-14q19 26 29 69.5t10 98.5v251zM573 1446q33 -40 70 -77t80 -73q-39 -36 -76 -74t-74 -79q-14 13 -43 40q-72 67 -114 103q48 33 87.5 73t69.5 87z" />
+    <glyph glyph-name="Agrave" unicode="&#xc0;" horiz-adv-x="1370" 
+d="M467 647h344l-176 459zM-41 -45q34 114 114 180.5t201 81.5l230 621q-18 34 -51 53.5t-74 19.5q-43 0 -74.5 -22t-50.5 -65q-2 24 -3 39.5t-1 27.5q0 85 61 151t140 66q51 0 84 -9.5t57 -31.5l28 77q-4 45 -51 75t-110 30q-59 0 -103 -20.5t-77 -63.5q10 118 94.5 197.5
+t195.5 79.5q49 0 92.5 -14.5t79.5 -43.5l394 -1028q32 -88 70 -125.5t91 -37.5q26 0 45.5 3.5t36.5 12.5q-75 -92 -115.5 -153t-60.5 -111q-70 6 -117 50.5t-81 139.5l-127 338h-476l-94 -250q14 0 33 2h6q64 0 116 -14.5t103 -46.5l31 35l18 -19q-68 -77 -108 -131
+t-68 -106q-51 37 -123 58.5t-149 21.5q-62 0 -114 -17t-93 -51zM457 1844q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
+    <glyph glyph-name="Aacute" unicode="&#xc1;" horiz-adv-x="1370" 
+d="M467 647h344l-176 459zM-41 -45q34 114 114 180.5t201 81.5l230 621q-18 34 -51 53.5t-74 19.5q-43 0 -74.5 -22t-50.5 -65q-2 24 -3 39.5t-1 27.5q0 85 61 151t140 66q51 0 84 -9.5t57 -31.5l28 77q-4 45 -51 75t-110 30q-59 0 -103 -20.5t-77 -63.5q10 118 94.5 197.5
+t195.5 79.5q49 0 92.5 -14.5t79.5 -43.5l394 -1028q32 -88 70 -125.5t91 -37.5q26 0 45.5 3.5t36.5 12.5q-75 -92 -115.5 -153t-60.5 -111q-70 6 -117 50.5t-81 139.5l-127 338h-476l-94 -250q14 0 33 2h6q64 0 116 -14.5t103 -46.5l31 35l18 -19q-68 -77 -108 -131
+t-68 -106q-51 37 -123 58.5t-149 21.5q-62 0 -114 -17t-93 -51zM831 1844q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
+    <glyph glyph-name="Acircumflex" unicode="&#xc2;" horiz-adv-x="1370" 
+d="M467 647h344l-176 459zM-41 -45q34 114 114 180.5t201 81.5l230 621q-18 34 -51 53.5t-74 19.5q-43 0 -74.5 -22t-50.5 -65q-2 24 -3 39.5t-1 27.5q0 85 61 151t140 66q51 0 84 -9.5t57 -31.5l28 77q-4 45 -51 75t-110 30q-59 0 -103 -20.5t-77 -63.5q10 118 94.5 197.5
+t195.5 79.5q49 0 92.5 -14.5t79.5 -43.5l394 -1028q32 -88 70 -125.5t91 -37.5q26 0 45.5 3.5t36.5 12.5q-75 -92 -115.5 -153t-60.5 -111q-70 6 -117 50.5t-81 139.5l-127 338h-476l-94 -250q14 0 33 2h6q64 0 116 -14.5t103 -46.5l31 35l18 -19q-68 -77 -108 -131
+t-68 -106q-51 37 -123 58.5t-149 21.5q-62 0 -114 -17t-93 -51zM326 1563q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
+    <glyph glyph-name="Atilde" unicode="&#xc3;" horiz-adv-x="1370" 
+d="M467 647h344l-176 459zM-41 -45q34 114 114 180.5t201 81.5l230 621q-18 34 -51 53.5t-74 19.5q-43 0 -74.5 -22t-50.5 -65q-2 24 -3 39.5t-1 27.5q0 85 61 151t140 66q51 0 84 -9.5t57 -31.5l28 77q-4 45 -51 75t-110 30q-59 0 -103 -20.5t-77 -63.5q10 118 94.5 197.5
+t195.5 79.5q49 0 92.5 -14.5t79.5 -43.5l394 -1028q32 -88 70 -125.5t91 -37.5q26 0 45.5 3.5t36.5 12.5q-75 -92 -115.5 -153t-60.5 -111q-70 6 -117 50.5t-81 139.5l-127 338h-476l-94 -250q14 0 33 2h6q64 0 116 -14.5t103 -46.5l31 35l18 -19q-68 -77 -108 -131
+t-68 -106q-51 37 -123 58.5t-149 21.5q-62 0 -114 -17t-93 -51zM348 1604q19 79 80 126.5t143 47.5q41 0 126 -20.5t132 -20.5q35 0 62 8t51 25q-37 -76 -107 -119t-155 -43q-41 0 -111.5 20.5t-103.5 20.5q-37 0 -64 -10.5t-53 -34.5z" />
+    <glyph glyph-name="Adieresis" unicode="&#xc4;" horiz-adv-x="1370" 
+d="M467 647h344l-176 459zM-41 -45q34 114 114 180.5t201 81.5l230 621q-18 34 -51 53.5t-74 19.5q-43 0 -74.5 -22t-50.5 -65q-2 24 -3 39.5t-1 27.5q0 85 61 151t140 66q51 0 84 -9.5t57 -31.5l28 77q-4 45 -51 75t-110 30q-59 0 -103 -20.5t-77 -63.5q10 118 94.5 197.5
+t195.5 79.5q49 0 92.5 -14.5t79.5 -43.5l394 -1028q32 -88 70 -125.5t91 -37.5q26 0 45.5 3.5t36.5 12.5q-75 -92 -115.5 -153t-60.5 -111q-70 6 -117 50.5t-81 139.5l-127 338h-476l-94 -250q14 0 33 2h6q64 0 116 -14.5t103 -46.5l31 35l18 -19q-68 -77 -108 -131
+t-68 -106q-51 37 -123 58.5t-149 21.5q-62 0 -114 -17t-93 -51zM690 1678l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM328 1678l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94
+t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
+    <glyph glyph-name="Aring" unicode="&#xc5;" horiz-adv-x="1370" 
+d="M506 1706q0 -50 35.5 -86.5t85.5 -36.5q51 0 88 36.5t37 86.5t-37 86.5t-88 36.5q-50 0 -85.5 -36.5t-35.5 -86.5zM-41 -45q34 114 114 180.5t201 81.5l230 621q-18 34 -51 53.5t-74 19.5q-43 0 -74.5 -22t-50.5 -65q-2 24 -3 39.5t-1 27.5q0 85 61 151t140 66
+q51 0 84 -9.5t57 -31.5l28 77q-4 45 -51 75t-110 30q-59 0 -103 -20.5t-77 -63.5q10 118 94.5 197.5t195.5 79.5q49 0 92.5 -14.5t79.5 -43.5l394 -1028q32 -88 70 -125.5t91 -37.5q26 0 45.5 3.5t36.5 12.5q-75 -92 -115.5 -153t-60.5 -111q-70 6 -117 50.5t-81 139.5
+l-127 338h-476l-94 -250q14 0 33 2h6q64 0 116 -14.5t103 -46.5l31 35l18 -19q-68 -77 -108 -131t-68 -106q-51 37 -123 58.5t-149 21.5q-62 0 -114 -17t-93 -51zM467 647h344l-176 459zM436 1706q0 80 56.5 136t136.5 56t136 -56t56 -136t-56 -136.5t-136 -56.5
+q-79 0 -136 57t-57 136z" />
+    <glyph glyph-name="AE" unicode="&#xc6;" horiz-adv-x="1847" 
+d="M801 -53q57 89 151.5 158.5t221.5 115.5v838q0 160 104.5 274.5t259.5 114.5q48 0 95.5 -13t101.5 -40l18 22l27 -14q-44 -58 -79.5 -120.5t-58.5 -121.5q-44 53 -103.5 80t-129.5 27q-100 0 -153.5 -70.5t-53.5 -202.5v-293q56 88 116.5 126t141.5 38q52 0 98.5 -14.5
+t90.5 -44.5l26 31l25 -19q-43 -50 -81.5 -111.5t-74.5 -136.5q-25 56 -79 88.5t-119 32.5q-42 0 -75.5 -13.5t-68.5 -45.5v-406q55 14 102.5 20.5t90.5 6.5q95 0 179.5 -25t162.5 -77l43 63l24 -18q-41 -59 -79.5 -121t-73.5 -127q-73 50 -166.5 74t-216.5 24
+q-128 0 -238.5 -24t-228.5 -76zM-41 -45q34 114 114 180.5t201 81.5l334 672q-39 12 -74.5 18t-64.5 6q-50 0 -82 -21t-53 -68q-2 24 -3 39.5t-1 27.5q0 97 65 158t174 61q32 0 66 -6.5t72 -20.5l53 109q-61 14 -113.5 21.5t-93.5 7.5q-69 0 -119.5 -22.5t-73.5 -63.5
+q16 143 94.5 220t211.5 77q25 0 150.5 -21.5t223.5 -21.5q73 0 121 7.5t86 24.5q-54 -118 -148.5 -177.5t-228.5 -59.5q-20 0 -37.5 0.5t-35.5 1.5l-275 -539h355v252q0 105 51 160.5t194 109.5q-35 -41 -50 -82.5t-15 -101.5v-541q0 -121 -51 -180t-187 -139q31 39 44.5 84
+t13.5 139v125h-445l-125 -250q14 0 33 2h6q64 0 116 -14.5t103 -46.5l31 35l18 -19q-69 -78 -110.5 -134t-65.5 -103q-51 37 -123 58.5t-149 21.5q-62 0 -114 -17t-93 -51z" />
+    <glyph glyph-name="Ccedilla" unicode="&#xc7;" horiz-adv-x="1280" 
+d="M557 264q29 28 41 64t12 127v698l-147 -78l-10 25q199 106 325.5 187.5t214.5 158.5q20 -61 53 -92t78 -31q25 0 47.5 10t42.5 31q-10 -70 -54.5 -119t-112.5 -67v-1002q54 21 112.5 66.5t124.5 117.5q-91 -205 -241.5 -310t-356.5 -105q-260 0 -425 190t-165 488
+q0 250 132 462.5t358 323.5q-146 -131 -217.5 -294t-71.5 -365q0 -306 137 -462.5t406 -156.5q48 0 91.5 8.5t88.5 26.5v1007q-5 -1 -10 -1.5t-15 -0.5q-54 0 -93 31t-62 92l-39 -24v-674q0 -144 -56.5 -220t-187.5 -112zM512 -408l-19 5q6 52 44 85t92 33q28 0 51 -12
+t47 -39l45 8v168h-123v250h49v-196h164v-154q0 -44 6 -64t20 -34q-18 7 -37.5 10.5t-39.5 3.5q-57 0 -97.5 -17t-68.5 -53q-22 30 -41 44t-39 14q-21 0 -35 -13.5t-18 -38.5z" />
+    <glyph glyph-name="Egrave" unicode="&#xc8;" horiz-adv-x="1255" 
+d="M211 -53q59 92 153 161t220 113v785q0 207 96.5 324.5t265.5 117.5q48 0 95.5 -13t101.5 -40l20 22l25 -14q-44 -58 -79.5 -120.5t-57.5 -121.5q-45 53 -103.5 80t-128.5 27q-101 0 -154 -69.5t-53 -203.5v-293q48 84 111 124t145 40q51 0 98 -14t91 -43l26 29l25 -19
+q-46 -56 -85 -118t-71 -130q-25 57 -78 89t-118 32q-43 0 -77 -14t-67 -45v-406q55 14 101 20.5t88 6.5q97 0 181.5 -25t162.5 -77l43 63l24 -18q-47 -69 -85 -130.5t-68 -117.5q-72 50 -166 74t-217 24q-127 0 -236.5 -23.5t-228.5 -76.5zM55 1188q14 114 88 184t181 70
+q47 0 124.5 -21.5t112.5 -21.5q27 0 49.5 7t42.5 21q-41 -110 -96 -159t-135 -49q-50 0 -132 21.5t-112 21.5q-39 0 -64.5 -15.5t-58.5 -58.5zM229 127q30 37 43 81.5t13 143.5v258q-15 0 -35.5 1t-26.5 1q-49 0 -73 -20t-27 -63q-16 24 -23.5 56t-7.5 77q0 72 29.5 108.5
+t87.5 36.5q19 0 37.5 -1.5t37.5 -4.5l1 96q0 104 51.5 162t195.5 112q-35 -40 -50 -82.5t-15 -103.5v-541q0 -118 -50 -177t-188 -140zM500 1844q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43
+t52 31z" />
+    <glyph glyph-name="Eacute" unicode="&#xc9;" horiz-adv-x="1255" 
+d="M211 -53q59 92 153 161t220 113v785q0 207 96.5 324.5t265.5 117.5q48 0 95.5 -13t101.5 -40l20 22l25 -14q-44 -58 -79.5 -120.5t-57.5 -121.5q-45 53 -103.5 80t-128.5 27q-101 0 -154 -69.5t-53 -203.5v-293q48 84 111 124t145 40q51 0 98 -14t91 -43l26 29l25 -19
+q-46 -56 -85 -118t-71 -130q-25 57 -78 89t-118 32q-43 0 -77 -14t-67 -45v-406q55 14 101 20.5t88 6.5q97 0 181.5 -25t162.5 -77l43 63l24 -18q-47 -69 -85 -130.5t-68 -117.5q-72 50 -166 74t-217 24q-127 0 -236.5 -23.5t-228.5 -76.5zM55 1188q14 114 88 184t181 70
+q47 0 124.5 -21.5t112.5 -21.5q27 0 49.5 7t42.5 21q-41 -110 -96 -159t-135 -49q-50 0 -132 21.5t-112 21.5q-39 0 -64.5 -15.5t-58.5 -58.5zM229 127q30 37 43 81.5t13 143.5v258q-15 0 -35.5 1t-26.5 1q-49 0 -73 -20t-27 -63q-16 24 -23.5 56t-7.5 77q0 72 29.5 108.5
+t87.5 36.5q19 0 37.5 -1.5t37.5 -4.5l1 96q0 104 51.5 162t195.5 112q-35 -40 -50 -82.5t-15 -103.5v-541q0 -118 -50 -177t-188 -140zM874 1844q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
+    <glyph glyph-name="Ecircumflex" unicode="&#xca;" horiz-adv-x="1255" 
+d="M211 -53q59 92 153 161t220 113v785q0 207 96.5 324.5t265.5 117.5q48 0 95.5 -13t101.5 -40l20 22l25 -14q-44 -58 -79.5 -120.5t-57.5 -121.5q-45 53 -103.5 80t-128.5 27q-101 0 -154 -69.5t-53 -203.5v-293q48 84 111 124t145 40q51 0 98 -14t91 -43l26 29l25 -19
+q-46 -56 -85 -118t-71 -130q-25 57 -78 89t-118 32q-43 0 -77 -14t-67 -45v-406q55 14 101 20.5t88 6.5q97 0 181.5 -25t162.5 -77l43 63l24 -18q-47 -69 -85 -130.5t-68 -117.5q-72 50 -166 74t-217 24q-127 0 -236.5 -23.5t-228.5 -76.5zM55 1188q14 114 88 184t181 70
+q47 0 124.5 -21.5t112.5 -21.5q27 0 49.5 7t42.5 21q-41 -110 -96 -159t-135 -49q-50 0 -132 21.5t-112 21.5q-39 0 -64.5 -15.5t-58.5 -58.5zM229 127q30 37 43 81.5t13 143.5v258q-15 0 -35.5 1t-26.5 1q-49 0 -73 -20t-27 -63q-16 24 -23.5 56t-7.5 77q0 72 29.5 108.5
+t87.5 36.5q19 0 37.5 -1.5t37.5 -4.5l1 96q0 104 51.5 162t195.5 112q-35 -40 -50 -82.5t-15 -103.5v-541q0 -118 -50 -177t-188 -140zM369 1563q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z
+" />
+    <glyph glyph-name="Edieresis" unicode="&#xcb;" horiz-adv-x="1255" 
+d="M211 -53q59 92 153 161t220 113v785q0 207 96.5 324.5t265.5 117.5q48 0 95.5 -13t101.5 -40l20 22l25 -14q-44 -58 -79.5 -120.5t-57.5 -121.5q-45 53 -103.5 80t-128.5 27q-101 0 -154 -69.5t-53 -203.5v-293q48 84 111 124t145 40q51 0 98 -14t91 -43l26 29l25 -19
+q-46 -56 -85 -118t-71 -130q-25 57 -78 89t-118 32q-43 0 -77 -14t-67 -45v-406q55 14 101 20.5t88 6.5q97 0 181.5 -25t162.5 -77l43 63l24 -18q-47 -69 -85 -130.5t-68 -117.5q-72 50 -166 74t-217 24q-127 0 -236.5 -23.5t-228.5 -76.5zM55 1188q14 114 88 184t181 70
+q47 0 124.5 -21.5t112.5 -21.5q27 0 49.5 7t42.5 21q-41 -110 -96 -159t-135 -49q-50 0 -132 21.5t-112 21.5q-39 0 -64.5 -15.5t-58.5 -58.5zM229 127q30 37 43 81.5t13 143.5v258q-15 0 -35.5 1t-26.5 1q-49 0 -73 -20t-27 -63q-16 24 -23.5 56t-7.5 77q0 72 29.5 108.5
+t87.5 36.5q19 0 37.5 -1.5t37.5 -4.5l1 96q0 104 51.5 162t195.5 112q-35 -40 -50 -82.5t-15 -103.5v-541q0 -118 -50 -177t-188 -140zM733 1678l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM371 1678
+l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
+    <glyph glyph-name="Igrave" unicode="&#xcc;" horiz-adv-x="1090" 
+d="M136 1209q33 107 107 170t167 63q46 0 138.5 -21.5t141.5 -21.5q31 0 57 5.5t54 18.5q-51 -100 -114.5 -146t-149.5 -46q-40 0 -123.5 15.5t-130.5 15.5q-63 0 -145 -52zM657 590v-4q0 -183 -55 -258.5t-188 -102.5q32 29 45.5 76t13.5 145v199q-6 1 -13.5 1.5t-21.5 0.5
+q-53 0 -82.5 -19.5t-38.5 -59.5q-17 20 -24.5 42.5t-7.5 55.5q0 83 42 131.5t115 48.5q4 0 12.5 -1t12.5 -1v45q0 97 51 159t193 130q-27 -36 -40.5 -96t-13.5 -146v-346zM-37 -43q10 102 88.5 180t163.5 78q87 0 191 -104q23 -23 36 -35q40 -36 77 -54t73 -18
+q90 0 133 67.5t43 209.5v757q0 147 56.5 217.5t195.5 147.5q-37 -37 -52.5 -77t-15.5 -118v-26v-848q0 -188 -128 -284.5t-378 -96.5q-85 0 -175 45t-124 45q-43 0 -90.5 -22t-93.5 -64zM478 1844q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12
+q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
+    <glyph glyph-name="Iacute" unicode="&#xcd;" horiz-adv-x="1090" 
+d="M136 1209q33 107 107 170t167 63q46 0 138.5 -21.5t141.5 -21.5q31 0 57 5.5t54 18.5q-51 -100 -114.5 -146t-149.5 -46q-40 0 -123.5 15.5t-130.5 15.5q-63 0 -145 -52zM657 590v-4q0 -183 -55 -258.5t-188 -102.5q32 29 45.5 76t13.5 145v199q-6 1 -13.5 1.5t-21.5 0.5
+q-53 0 -82.5 -19.5t-38.5 -59.5q-17 20 -24.5 42.5t-7.5 55.5q0 83 42 131.5t115 48.5q4 0 12.5 -1t12.5 -1v45q0 97 51 159t193 130q-27 -36 -40.5 -96t-13.5 -146v-346zM-37 -43q10 102 88.5 180t163.5 78q87 0 191 -104q23 -23 36 -35q40 -36 77 -54t73 -18
+q90 0 133 67.5t43 209.5v757q0 147 56.5 217.5t195.5 147.5q-37 -37 -52.5 -77t-15.5 -118v-26v-848q0 -188 -128 -284.5t-378 -96.5q-85 0 -175 45t-124 45q-43 0 -90.5 -22t-93.5 -64zM852 1844q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5
+q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
+    <glyph glyph-name="Icircumflex" unicode="&#xce;" horiz-adv-x="1090" 
+d="M136 1209q33 107 107 170t167 63q46 0 138.5 -21.5t141.5 -21.5q31 0 57 5.5t54 18.5q-51 -100 -114.5 -146t-149.5 -46q-40 0 -123.5 15.5t-130.5 15.5q-63 0 -145 -52zM657 590v-4q0 -183 -55 -258.5t-188 -102.5q32 29 45.5 76t13.5 145v199q-6 1 -13.5 1.5t-21.5 0.5
+q-53 0 -82.5 -19.5t-38.5 -59.5q-17 20 -24.5 42.5t-7.5 55.5q0 83 42 131.5t115 48.5q4 0 12.5 -1t12.5 -1v45q0 97 51 159t193 130q-27 -36 -40.5 -96t-13.5 -146v-346zM-37 -43q10 102 88.5 180t163.5 78q87 0 191 -104q23 -23 36 -35q40 -36 77 -54t73 -18
+q90 0 133 67.5t43 209.5v757q0 147 56.5 217.5t195.5 147.5q-37 -37 -52.5 -77t-15.5 -118v-26v-848q0 -188 -128 -284.5t-378 -96.5q-85 0 -175 45t-124 45q-43 0 -90.5 -22t-93.5 -64zM347 1563q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145
+q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
+    <glyph glyph-name="Idieresis" unicode="&#xcf;" horiz-adv-x="1090" 
+d="M136 1209q33 107 107 170t167 63q46 0 138.5 -21.5t141.5 -21.5q31 0 57 5.5t54 18.5q-51 -100 -114.5 -146t-149.5 -46q-40 0 -123.5 15.5t-130.5 15.5q-63 0 -145 -52zM657 590v-4q0 -183 -55 -258.5t-188 -102.5q32 29 45.5 76t13.5 145v199q-6 1 -13.5 1.5t-21.5 0.5
+q-53 0 -82.5 -19.5t-38.5 -59.5q-17 20 -24.5 42.5t-7.5 55.5q0 83 42 131.5t115 48.5q4 0 12.5 -1t12.5 -1v45q0 97 51 159t193 130q-27 -36 -40.5 -96t-13.5 -146v-346zM-37 -43q10 102 88.5 180t163.5 78q87 0 191 -104q23 -23 36 -35q40 -36 77 -54t73 -18
+q90 0 133 67.5t43 209.5v757q0 147 56.5 217.5t195.5 147.5q-37 -37 -52.5 -77t-15.5 -118v-26v-848q0 -188 -128 -284.5t-378 -96.5q-85 0 -175 45t-124 45q-43 0 -90.5 -22t-93.5 -64zM711 1678l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94
+t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM349 1678l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
+    <glyph glyph-name="Eth" unicode="&#xd0;" horiz-adv-x="1200" 
+d="M575 608v-385q62 0 121.5 -22.5t120.5 -69.5l49 27v942q0 60 -25.5 85t-107.5 25h-158v-401q8 0 20.5 -1t16.5 -1q53 0 75 16t22 54q23 -23 34 -53t11 -68q0 -78 -37 -113t-119 -35h-23zM82 -49q56 121 178.5 192.5t286.5 77.5v387h-115v-125q0 -111 -54 -173.5
+t-194 -114.5q30 37 43 85t13 128v200h-68q-45 0 -63.5 -15t-18.5 -52q-23 23 -34 52.5t-11 68.5q0 80 37 114.5t123 34.5q6 0 17 -1t18 -1q-1 2 -1 6q-3 46 -3 70q0 128 55.5 189t193.5 89q-28 -38 -40.5 -73.5t-12.5 -100.5v-180h115v401h-260q-119 0 -171.5 55.5
+t-51.5 180.5q19 -11 41.5 -16t60.5 -5h616q159 0 218 -61.5t59 -210.5v-864q0 -56 9.5 -90.5t31.5 -67.5q-17 0 -38 2h-5q-90 0 -187.5 -47.5t-197.5 -140.5q-75 39 -159 59.5t-169 20.5q-67 0 -130.5 -18t-131.5 -56z" />
+    <glyph glyph-name="Ntilde" unicode="&#xd1;" horiz-adv-x="1219" 
+d="M1055 260v592q-34 -16 -73.5 -24.5t-82.5 -8.5q-36 0 -63.5 5t-53.5 16l14 -37q167 -453 259 -543zM313 518q53 23 100.5 34t90.5 11q40 0 87.5 -10t106.5 -31l-32 82q-223 566 -353 627v-713zM12 -51q34 119 100 186t173 88v379l-6 2q-23 6 -33 6q-36 0 -58 -20.5
+t-22 -54.5q0 -1 -2 -2.5t-2 -2.5q-21 24 -30 53t-9 70q0 69 31 109.5t82 40.5q8 0 18.5 -1t29.5 -3l1 440q-12 4 -22.5 6t-22.5 2q-65 0 -114.5 -49.5t-49.5 -120.5q-14 32 -20.5 61.5t-6.5 57.5q0 111 71 181.5t183 70.5q130 0 233 -123.5t234 -450.5q38 -12 73 -18t66 -6
+q39 0 75 9.5t71 29.5v287h-8q-53 0 -104.5 16.5t-111.5 52.5l-51 -43l-16 19q73 65 125.5 122.5t79.5 102.5q50 -39 91 -55.5t83 -16.5q44 0 81.5 15.5t71.5 48.5q0 -88 -57.5 -158.5t-155.5 -101.5v-1241q-80 10 -166 135.5t-204 408.5q-50 25 -99.5 36t-103.5 11
+q-59 0 -107 -11t-90 -34v-256h45q65 0 133 -22t119 -60l27 29l22 -18q-64 -68 -106 -121t-68 -98q-55 44 -114.5 67t-120.5 23q-55 0 -113 -19t-125 -59zM405 1604q19 79 80 126.5t143 47.5q41 0 126 -20.5t132 -20.5q35 0 62 8t51 25q-37 -76 -107 -119t-155 -43
+q-41 0 -111.5 20.5t-103.5 20.5q-37 0 -64 -10.5t-53 -34.5z" />
+    <glyph glyph-name="Ograve" unicode="&#xd2;" horiz-adv-x="1421" 
+d="M870 940q29 -13 58.5 -19t66.5 -6q38 0 69.5 6.5t59.5 20.5q-25 112 -79 208.5t-134 174.5l-41 -27v-358zM870 905v-465q30 9 59.5 13t61.5 4q37 0 71 -7.5t66 -21.5q14 63 20.5 129.5t6.5 140.5q0 64 -6 115.5t-19 95.5q-32 -12 -64.5 -18t-66.5 -6q-36 0 -67.5 5
+t-61.5 15zM870 410v-375q97 41 158 130t94 236q-35 14 -68.5 20.5t-68.5 6.5q-30 0 -58.5 -4.5t-56.5 -13.5zM487 174q26 31 38 70t12 90v788l-91 -39v31q154 70 251.5 120t144.5 83v129l28 4v-115q36 19 78 47t90 66q158 -92 239 -248.5t81 -370.5q0 -147 -36.5 -287
+t-102.5 -251q-103 -169 -235 -250.5t-304 -81.5q-119 0 -222.5 43.5t-189.5 128.5q-108 108 -163.5 242.5t-55.5 288.5q0 245 125 464t322 318q-117 -128 -169.5 -306t-52.5 -456q0 -347 104.5 -515.5t317.5 -168.5q33 0 69.5 7t76.5 22v1253l-115 -59v-783
+q0 -125 -52.5 -180t-187.5 -84zM562 1844q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
+    <glyph glyph-name="Oacute" unicode="&#xd3;" horiz-adv-x="1421" 
+d="M870 940q29 -13 58.5 -19t66.5 -6q38 0 69.5 6.5t59.5 20.5q-25 112 -79 208.5t-134 174.5l-41 -27v-358zM870 905v-465q30 9 59.5 13t61.5 4q37 0 71 -7.5t66 -21.5q14 63 20.5 129.5t6.5 140.5q0 64 -6 115.5t-19 95.5q-32 -12 -64.5 -18t-66.5 -6q-36 0 -67.5 5
+t-61.5 15zM870 410v-375q97 41 158 130t94 236q-35 14 -68.5 20.5t-68.5 6.5q-30 0 -58.5 -4.5t-56.5 -13.5zM487 174q26 31 38 70t12 90v788l-91 -39v31q154 70 251.5 120t144.5 83v129l28 4v-115q36 19 78 47t90 66q158 -92 239 -248.5t81 -370.5q0 -147 -36.5 -287
+t-102.5 -251q-103 -169 -235 -250.5t-304 -81.5q-119 0 -222.5 43.5t-189.5 128.5q-108 108 -163.5 242.5t-55.5 288.5q0 245 125 464t322 318q-117 -128 -169.5 -306t-52.5 -456q0 -347 104.5 -515.5t317.5 -168.5q33 0 69.5 7t76.5 22v1253l-115 -59v-783
+q0 -125 -52.5 -180t-187.5 -84zM936 1844q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
+    <glyph glyph-name="Ocircumflex" unicode="&#xd4;" horiz-adv-x="1421" 
+d="M870 940q29 -13 58.5 -19t66.5 -6q38 0 69.5 6.5t59.5 20.5q-25 112 -79 208.5t-134 174.5l-41 -27v-358zM870 905v-465q30 9 59.5 13t61.5 4q37 0 71 -7.5t66 -21.5q14 63 20.5 129.5t6.5 140.5q0 64 -6 115.5t-19 95.5q-32 -12 -64.5 -18t-66.5 -6q-36 0 -67.5 5
+t-61.5 15zM870 410v-375q97 41 158 130t94 236q-35 14 -68.5 20.5t-68.5 6.5q-30 0 -58.5 -4.5t-56.5 -13.5zM487 174q26 31 38 70t12 90v788l-91 -39v31q154 70 251.5 120t144.5 83v129l28 4v-115q36 19 78 47t90 66q158 -92 239 -248.5t81 -370.5q0 -147 -36.5 -287
+t-102.5 -251q-103 -169 -235 -250.5t-304 -81.5q-119 0 -222.5 43.5t-189.5 128.5q-108 108 -163.5 242.5t-55.5 288.5q0 245 125 464t322 318q-117 -128 -169.5 -306t-52.5 -456q0 -347 104.5 -515.5t317.5 -168.5q33 0 69.5 7t76.5 22v1253l-115 -59v-783
+q0 -125 -52.5 -180t-187.5 -84zM431 1563q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
+    <glyph glyph-name="Otilde" unicode="&#xd5;" horiz-adv-x="1421" 
+d="M870 940q29 -13 58.5 -19t66.5 -6q38 0 69.5 6.5t59.5 20.5q-25 112 -79 208.5t-134 174.5l-41 -27v-358zM870 905v-465q30 9 59.5 13t61.5 4q37 0 71 -7.5t66 -21.5q14 63 20.5 129.5t6.5 140.5q0 64 -6 115.5t-19 95.5q-32 -12 -64.5 -18t-66.5 -6q-36 0 -67.5 5
+t-61.5 15zM870 410v-375q97 41 158 130t94 236q-35 14 -68.5 20.5t-68.5 6.5q-30 0 -58.5 -4.5t-56.5 -13.5zM487 174q26 31 38 70t12 90v788l-91 -39v31q154 70 251.5 120t144.5 83v129l28 4v-115q36 19 78 47t90 66q158 -92 239 -248.5t81 -370.5q0 -147 -36.5 -287
+t-102.5 -251q-103 -169 -235 -250.5t-304 -81.5q-119 0 -222.5 43.5t-189.5 128.5q-108 108 -163.5 242.5t-55.5 288.5q0 245 125 464t322 318q-117 -128 -169.5 -306t-52.5 -456q0 -347 104.5 -515.5t317.5 -168.5q33 0 69.5 7t76.5 22v1253l-115 -59v-783
+q0 -125 -52.5 -180t-187.5 -84zM453 1604q19 79 80 126.5t143 47.5q41 0 126 -20.5t132 -20.5q35 0 62 8t51 25q-37 -76 -107 -119t-155 -43q-41 0 -111.5 20.5t-103.5 20.5q-37 0 -64 -10.5t-53 -34.5z" />
+    <glyph glyph-name="Odieresis" unicode="&#xd6;" horiz-adv-x="1421" 
+d="M870 940q29 -13 58.5 -19t66.5 -6q38 0 69.5 6.5t59.5 20.5q-25 112 -79 208.5t-134 174.5l-41 -27v-358zM870 905v-465q30 9 59.5 13t61.5 4q37 0 71 -7.5t66 -21.5q14 63 20.5 129.5t6.5 140.5q0 64 -6 115.5t-19 95.5q-32 -12 -64.5 -18t-66.5 -6q-36 0 -67.5 5
+t-61.5 15zM870 410v-375q97 41 158 130t94 236q-35 14 -68.5 20.5t-68.5 6.5q-30 0 -58.5 -4.5t-56.5 -13.5zM487 174q26 31 38 70t12 90v788l-91 -39v31q154 70 251.5 120t144.5 83v129l28 4v-115q36 19 78 47t90 66q158 -92 239 -248.5t81 -370.5q0 -147 -36.5 -287
+t-102.5 -251q-103 -169 -235 -250.5t-304 -81.5q-119 0 -222.5 43.5t-189.5 128.5q-108 108 -163.5 242.5t-55.5 288.5q0 245 125 464t322 318q-117 -128 -169.5 -306t-52.5 -456q0 -347 104.5 -515.5t317.5 -168.5q33 0 69.5 7t76.5 22v1253l-115 -59v-783
+q0 -125 -52.5 -180t-187.5 -84zM795 1678l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM433 1678l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5
+t-56.5 56.5z" />
+    <glyph glyph-name="multiply" unicode="&#xd7;" horiz-adv-x="1706" 
+d="M391 1178l469 -469l469 469l98 -99l-469 -469l469 -469l-98 -96l-469 467l-469 -467l-98 96l469 469l-469 469z" />
+    <glyph glyph-name="Oslash" unicode="&#xd8;" horiz-adv-x="1421" 
+d="M240 -96l100 164q-139 108 -215 262.5t-76 328.5q0 248 125 467.5t322 317.5q-117 -128 -169.5 -305t-52.5 -455q0 -191 27 -316t86 -218l150 266v706l-91 -39v31q186 85 330 166.5t262 167.5l60 -41l80 137l24 -12l-84 -143q114 -83 177 -229t63 -331
+q0 -368 -191.5 -619t-470.5 -251q-93 0 -178.5 23.5t-152.5 68.5l-99 -164zM1012 1204l-144 -262q26 -14 55 -20.5t72 -6.5q39 0 71.5 7t57.5 21q-14 73 -41.5 137t-70.5 124zM487 174q26 34 38 75t12 93v14l-131 -229q53 -62 128 -95.5t162 -33.5q166 0 278 106t148 299
+q-51 15 -108 22t-125 7q-44 0 -83.5 -4.5t-78.5 -14.5v-18q0 -89 -60 -144t-180 -77zM727 440q45 12 93 17.5t104 5.5q64 0 114.5 -8.5t89.5 -26.5q14 61 20.5 126.5t6.5 143.5q0 64 -5.5 117t-17.5 98q-29 -14 -63 -21t-70 -7q-46 0 -81.5 6.5t-67.5 21.5l-123 -219v-254z
+M727 750l266 477q-17 30 -37.5 54.5t-44.5 43.5l-184 -104v-471z" />
+    <glyph glyph-name="Ugrave" unicode="&#xd9;" horiz-adv-x="1233" 
+d="M647 932q21 -13 43 -19t49 -6q25 0 47.5 4t44.5 13v256q-20 6 -38 22.5t-41 50.5l-105 -77v-244zM647 612q27 7 50.5 10t45.5 3q25 0 46.5 -4t41.5 -13v283q-19 -8 -38 -11t-48 -3q-28 0 -51.5 3.5t-46.5 12.5v-281zM666 133l165 109v333q-18 11 -39.5 16t-50.5 5
+q-26 0 -49 -4.5t-45 -13.5v-426zM72 10q26 91 85 149t150 83v405q-12 7 -24 10.5t-23 4.5q-46 0 -68 -20t-32 -73q-17 27 -25 57t-8 68q0 81 38.5 121.5t115.5 40.5q3 0 12 -1t14 -1v221q0 84 -33.5 123t-105.5 39q-56 0 -98.5 -32t-71.5 -97q0 4 -1 13q-3 39 -3 55
+q0 120 72.5 197t185.5 77q122 0 184 -79t62 -234v-906q25 -6 53.5 -19.5t66.5 -37.5v1272h29v-234l289 238q27 -67 61.5 -103t71.5 -36q18 0 37 7.5t41 24.5q-11 -61 -44 -104.5t-81 -58.5v-828q0 -89 26 -132.5t80 -43.5q14 0 31 3t37 9q-51 -59 -92.5 -120.5t-77.5 -128.5
+q-77 22 -124 86t-71 178q-123 -78 -199 -137t-134 -121q-50 54 -122 84t-151 30q-40 0 -76.5 -11.5t-76.5 -37.5zM449 1844q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
+    <glyph glyph-name="Uacute" unicode="&#xda;" horiz-adv-x="1233" 
+d="M647 932q21 -13 43 -19t49 -6q25 0 47.5 4t44.5 13v256q-20 6 -38 22.5t-41 50.5l-105 -77v-244zM647 612q27 7 50.5 10t45.5 3q25 0 46.5 -4t41.5 -13v283q-19 -8 -38 -11t-48 -3q-28 0 -51.5 3.5t-46.5 12.5v-281zM666 133l165 109v333q-18 11 -39.5 16t-50.5 5
+q-26 0 -49 -4.5t-45 -13.5v-426zM72 10q26 91 85 149t150 83v405q-12 7 -24 10.5t-23 4.5q-46 0 -68 -20t-32 -73q-17 27 -25 57t-8 68q0 81 38.5 121.5t115.5 40.5q3 0 12 -1t14 -1v221q0 84 -33.5 123t-105.5 39q-56 0 -98.5 -32t-71.5 -97q0 4 -1 13q-3 39 -3 55
+q0 120 72.5 197t185.5 77q122 0 184 -79t62 -234v-906q25 -6 53.5 -19.5t66.5 -37.5v1272h29v-234l289 238q27 -67 61.5 -103t71.5 -36q18 0 37 7.5t41 24.5q-11 -61 -44 -104.5t-81 -58.5v-828q0 -89 26 -132.5t80 -43.5q14 0 31 3t37 9q-51 -59 -92.5 -120.5t-77.5 -128.5
+q-77 22 -124 86t-71 178q-123 -78 -199 -137t-134 -121q-50 54 -122 84t-151 30q-40 0 -76.5 -11.5t-76.5 -37.5zM823 1844q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
+    <glyph glyph-name="Ucircumflex" unicode="&#xdb;" horiz-adv-x="1233" 
+d="M647 932q21 -13 43 -19t49 -6q25 0 47.5 4t44.5 13v256q-20 6 -38 22.5t-41 50.5l-105 -77v-244zM647 612q27 7 50.5 10t45.5 3q25 0 46.5 -4t41.5 -13v283q-19 -8 -38 -11t-48 -3q-28 0 -51.5 3.5t-46.5 12.5v-281zM666 133l165 109v333q-18 11 -39.5 16t-50.5 5
+q-26 0 -49 -4.5t-45 -13.5v-426zM72 10q26 91 85 149t150 83v405q-12 7 -24 10.5t-23 4.5q-46 0 -68 -20t-32 -73q-17 27 -25 57t-8 68q0 81 38.5 121.5t115.5 40.5q3 0 12 -1t14 -1v221q0 84 -33.5 123t-105.5 39q-56 0 -98.5 -32t-71.5 -97q0 4 -1 13q-3 39 -3 55
+q0 120 72.5 197t185.5 77q122 0 184 -79t62 -234v-906q25 -6 53.5 -19.5t66.5 -37.5v1272h29v-234l289 238q27 -67 61.5 -103t71.5 -36q18 0 37 7.5t41 24.5q-11 -61 -44 -104.5t-81 -58.5v-828q0 -89 26 -132.5t80 -43.5q14 0 31 3t37 9q-51 -59 -92.5 -120.5t-77.5 -128.5
+q-77 22 -124 86t-71 178q-123 -78 -199 -137t-134 -121q-50 54 -122 84t-151 30q-40 0 -76.5 -11.5t-76.5 -37.5zM318 1563q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
+    <glyph glyph-name="Udieresis" unicode="&#xdc;" horiz-adv-x="1233" 
+d="M647 932q21 -13 43 -19t49 -6q25 0 47.5 4t44.5 13v256q-20 6 -38 22.5t-41 50.5l-105 -77v-244zM647 612q27 7 50.5 10t45.5 3q25 0 46.5 -4t41.5 -13v283q-19 -8 -38 -11t-48 -3q-28 0 -51.5 3.5t-46.5 12.5v-281zM666 133l165 109v333q-18 11 -39.5 16t-50.5 5
+q-26 0 -49 -4.5t-45 -13.5v-426zM72 10q26 91 85 149t150 83v405q-12 7 -24 10.5t-23 4.5q-46 0 -68 -20t-32 -73q-17 27 -25 57t-8 68q0 81 38.5 121.5t115.5 40.5q3 0 12 -1t14 -1v221q0 84 -33.5 123t-105.5 39q-56 0 -98.5 -32t-71.5 -97q0 4 -1 13q-3 39 -3 55
+q0 120 72.5 197t185.5 77q122 0 184 -79t62 -234v-906q25 -6 53.5 -19.5t66.5 -37.5v1272h29v-234l289 238q27 -67 61.5 -103t71.5 -36q18 0 37 7.5t41 24.5q-11 -61 -44 -104.5t-81 -58.5v-828q0 -89 26 -132.5t80 -43.5q14 0 31 3t37 9q-51 -59 -92.5 -120.5t-77.5 -128.5
+q-77 22 -124 86t-71 178q-123 -78 -199 -137t-134 -121q-50 54 -122 84t-151 30q-40 0 -76.5 -11.5t-76.5 -37.5zM682 1678l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM320 1678l106 127q43 -58 65.5 -73
+t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
+    <glyph glyph-name="Yacute" unicode="&#xdd;" horiz-adv-x="1186" 
+d="M586 883q31 -21 60.5 -30t62.5 -9q28 0 55 9t53 28v272q-40 15 -68.5 37.5t-54.5 58.5l-108 -90v-276zM586 475q35 12 62.5 18.5t47.5 6.5q28 0 58.5 -7t62.5 -20v373q-33 -16 -60 -23.5t-50 -7.5q-22 0 -48 7t-73 28v-375zM586 25q13 -3 24.5 -5t20.5 -2
+q91 0 138.5 50.5t47.5 146.5v221q-32 18 -61.5 26.5t-59.5 8.5t-57.5 -8.5t-52.5 -26.5v-411zM557 35v1102l-115 -76v-746q0 -134 26 -191t89 -89zM752 -385l6 26q14 -5 26 -7.5t23 -2.5q46 0 80.5 31t34.5 70q0 24 -18.5 39.5t-49.5 15.5q-25 0 -70 -22.5t-90 -59.5l-6 -5
+q-121 -99 -203 -99q-80 0 -131 52.5t-51 133.5q0 70 46.5 115t158.5 82q-147 21 -201.5 78.5t-54.5 240.5v362q-14 3 -24.5 4t-20.5 1q-43 0 -68 -21.5t-39 -70.5q-15 33 -21.5 62t-6.5 58q0 82 35.5 124t105.5 42q12 0 21 -0.5t18 -0.5v237q0 74 -23.5 111.5t-70.5 37.5
+q-37 0 -64 -31t-39 -88q-8 36 -11 55.5t-3 35.5q0 94 60 159.5t151 65.5q98 0 144 -76.5t46 -239.5v-32l115 76v272h29v-250q67 53 135.5 116.5t136.5 137.5q25 -74 62.5 -110.5t89.5 -36.5q28 0 50.5 10t43.5 33v-11q0 -45 -24 -85t-74 -79v-911q0 -127 -64.5 -185.5
+t-265.5 -92.5q-191 -33 -257.5 -67.5t-66.5 -90.5q0 -29 22 -48.5t56 -19.5q42 0 165 85t202 85q68 0 117 -49t49 -119q0 -65 -45.5 -111t-110.5 -46q-15 0 -44 10q-8 3 -11 4zM901 1844q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12
+t-81.5 37h22q130 0 222 53t161 167z" />
+    <glyph glyph-name="Thorn" unicode="&#xde;" horiz-adv-x="1233" 
+d="M877 784v224q-29 15 -54 36.5t-49 51.5l-160 -107l1 -205q31 -11 64.5 -16.5t72.5 -5.5q29 0 59.5 5.5t65.5 16.5zM614 756v-289q34 9 64.5 13.5t58.5 4.5q41 0 75 -4.5t64 -13.5l1 287q-28 -11 -57 -16t-72 -5q-38 0 -70.5 5.5t-63.5 17.5zM614 434v-170q68 -21 124 -57
+t106 -88l33 18v297q-32 11 -66 16t-76 5q-29 0 -59.5 -5.5t-61.5 -15.5zM487 909v-968q0 -135 23 -193.5t76 -103.5v1325zM295 75q-58 -1 -99.5 -39t-58.5 -106q-15 33 -21.5 61.5t-6.5 55.5q0 92 49 154t137 82v327q-12 1 -24 1.5t-25 0.5q-52 0 -74 -22t-22 -74
+q-22 29 -31.5 58.5t-9.5 64.5q0 79 37.5 117.5t113.5 38.5q14 0 21 -0.5t14 -1.5v284q0 85 -18.5 117.5t-65.5 32.5q-43 0 -71.5 -28.5t-53.5 -98.5q-15 26 -23 48.5t-8 41.5q0 113 64.5 182.5t169.5 69.5q100 0 149 -74.5t49 -228.5v-195l99 60v442h28v-422
+q108 71 189.5 135t146.5 129q38 -53 77 -78.5t83 -25.5q25 0 44 7t32 21v-6q0 -49 -29 -94.5t-86 -87.5v-721q0 -67 9.5 -113t29.5 -88q-17 1 -33 1.5t-30 0.5q-127 0 -211.5 -39.5t-145.5 -127.5l-76 61v-404q-35 9 -81 40t-111 92q-30 -41 -67 -74t-85 -62q12 81 18.5 147
+t6.5 103v235z" />
+    <glyph glyph-name="germandbls" unicode="&#xdf;" horiz-adv-x="952" 
+d="M326 -35q-39 50 -91 77.5t-106 27.5q-14 0 -44 -7q-6 -1 -9 -2q21 48 53 81.5t80 60.5v678h-166v104h166q0 104 -17.5 161.5t-58.5 106.5q16 -1 29 -1.5t24 -0.5q81 0 184.5 39.5t219.5 114.5q81 -51 124.5 -120.5t43.5 -149.5q0 -74 -37.5 -127t-106.5 -80
+q130 -24 182 -101t52 -256v-446q0 -68 8.5 -111t26.5 -65q-72 -11 -157.5 -54.5t-112.5 -47.5q28 38 42.5 96.5t14.5 140.5v416q0 203 -53 289.5t-178 95.5q73 57 110 112.5t37 110.5q0 52 -27 99.5t-84 97.5l-86 -41v-1071q28 -17 49 -38t39 -51q-34 -25 -70 -58.5
+t-81 -80.5z" />
+    <glyph glyph-name="agrave" unicode="&#xe0;" horiz-adv-x="868" 
+d="M528 188v541q-26 13 -45.5 33t-38.5 53q-48 -23 -89 -35t-74 -12q-30 0 -60 10t-67 33l299 -381l-27 -20l-123 157q-33 -47 -48 -91.5t-15 -94.5q0 -95 59 -160t166 -86zM537 154l-197 -183q-127 42 -199.5 123.5t-72.5 179.5q0 95 56.5 179.5t158.5 140.5l-213 270h4
+q48 0 101.5 34.5t111.5 102.5q23 -82 55 -123.5t74 -41.5q45 0 95.5 40.5t112.5 128.5q4 -59 35.5 -95t79.5 -36q9 0 24.5 4t32.5 11q-6 -29 -26.5 -54.5t-60.5 -54.5v-465q0 -84 29 -121.5t93 -37.5h21l-152 -189q-67 30 -105.5 73t-57.5 114zM296 1350
+q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
+    <glyph glyph-name="aacute" unicode="&#xe1;" horiz-adv-x="868" 
+d="M528 188v541q-26 13 -45.5 33t-38.5 53q-48 -23 -89 -35t-74 -12q-30 0 -60 10t-67 33l299 -381l-27 -20l-123 157q-33 -47 -48 -91.5t-15 -94.5q0 -95 59 -160t166 -86zM537 154l-197 -183q-127 42 -199.5 123.5t-72.5 179.5q0 95 56.5 179.5t158.5 140.5l-213 270h4
+q48 0 101.5 34.5t111.5 102.5q23 -82 55 -123.5t74 -41.5q45 0 95.5 40.5t112.5 128.5q4 -59 35.5 -95t79.5 -36q9 0 24.5 4t32.5 11q-6 -29 -26.5 -54.5t-60.5 -54.5v-465q0 -84 29 -121.5t93 -37.5h21l-152 -189q-67 30 -105.5 73t-57.5 114zM670 1350q22 -15 52 -31
+t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
+    <glyph glyph-name="acircumflex" unicode="&#xe2;" horiz-adv-x="868" 
+d="M528 188v541q-26 13 -45.5 33t-38.5 53q-48 -23 -89 -35t-74 -12q-30 0 -60 10t-67 33l299 -381l-27 -20l-123 157q-33 -47 -48 -91.5t-15 -94.5q0 -95 59 -160t166 -86zM537 154l-197 -183q-127 42 -199.5 123.5t-72.5 179.5q0 95 56.5 179.5t158.5 140.5l-213 270h4
+q48 0 101.5 34.5t111.5 102.5q23 -82 55 -123.5t74 -41.5q45 0 95.5 40.5t112.5 128.5q4 -59 35.5 -95t79.5 -36q9 0 24.5 4t32.5 11q-6 -29 -26.5 -54.5t-60.5 -54.5v-465q0 -84 29 -121.5t93 -37.5h21l-152 -189q-67 30 -105.5 73t-57.5 114zM165 1069q116 85 194.5 161.5
+t128.5 153.5q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
+    <glyph glyph-name="atilde" unicode="&#xe3;" horiz-adv-x="868" 
+d="M528 188v541q-26 13 -45.5 33t-38.5 53q-48 -23 -89 -35t-74 -12q-30 0 -60 10t-67 33l299 -381l-27 -20l-123 157q-33 -47 -48 -91.5t-15 -94.5q0 -95 59 -160t166 -86zM537 154l-197 -183q-127 42 -199.5 123.5t-72.5 179.5q0 95 56.5 179.5t158.5 140.5l-213 270h4
+q48 0 101.5 34.5t111.5 102.5q23 -82 55 -123.5t74 -41.5q45 0 95.5 40.5t112.5 128.5q4 -59 35.5 -95t79.5 -36q9 0 24.5 4t32.5 11q-6 -29 -26.5 -54.5t-60.5 -54.5v-465q0 -84 29 -121.5t93 -37.5h21l-152 -189q-67 30 -105.5 73t-57.5 114zM187 1110q19 79 80 126.5
+t143 47.5q41 0 126 -20.5t132 -20.5q35 0 62 8t51 25q-37 -76 -107 -119t-155 -43q-41 0 -111.5 20.5t-103.5 20.5q-37 0 -64 -10.5t-53 -34.5z" />
+    <glyph glyph-name="adieresis" unicode="&#xe4;" horiz-adv-x="868" 
+d="M528 188v541q-26 13 -45.5 33t-38.5 53q-48 -23 -89 -35t-74 -12q-30 0 -60 10t-67 33l299 -381l-27 -20l-123 157q-33 -47 -48 -91.5t-15 -94.5q0 -95 59 -160t166 -86zM537 154l-197 -183q-127 42 -199.5 123.5t-72.5 179.5q0 95 56.5 179.5t158.5 140.5l-213 270h4
+q48 0 101.5 34.5t111.5 102.5q23 -82 55 -123.5t74 -41.5q45 0 95.5 40.5t112.5 128.5q4 -59 35.5 -95t79.5 -36q9 0 24.5 4t32.5 11q-6 -29 -26.5 -54.5t-60.5 -54.5v-465q0 -84 29 -121.5t93 -37.5h21l-152 -189q-67 30 -105.5 73t-57.5 114zM529 1184l106 126l3 -2
+q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM167 1184l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
+    <glyph glyph-name="aring" unicode="&#xe5;" horiz-adv-x="868" 
+d="M340 1245q0 -49 33.5 -83t81.5 -34q49 0 82.5 34t33.5 83q0 48 -34 81.5t-82 33.5q-49 0 -82 -33t-33 -82zM270 1246q0 74 54.5 129t130.5 55q75 0 130.5 -55t55.5 -130q0 -76 -55 -131t-131 -55q-75 0 -129 54.5t-56 132.5zM528 188v541q-26 13 -45.5 33t-38.5 53
+q-48 -23 -89 -35t-74 -12q-30 0 -60 10t-67 33l299 -381l-27 -20l-123 157q-33 -47 -48 -91.5t-15 -94.5q0 -95 59 -160t166 -86zM537 154l-197 -183q-127 42 -199.5 123.5t-72.5 179.5q0 95 56.5 179.5t158.5 140.5l-213 270h4q48 0 101.5 34.5t111.5 102.5
+q23 -82 55 -123.5t74 -41.5q45 0 95.5 40.5t112.5 128.5q4 -59 35.5 -95t79.5 -36q9 0 24.5 4t32.5 11q-6 -29 -26.5 -54.5t-60.5 -54.5v-465q0 -84 29 -121.5t93 -37.5h21l-152 -189q-67 30 -105.5 73t-57.5 114z" />
+    <glyph glyph-name="ae" unicode="&#xe6;" horiz-adv-x="1151" 
+d="M530 188v541q-26 11 -46.5 31.5t-39.5 54.5q-48 -23 -89 -35t-74 -12q-30 0 -60 10t-67 33l299 -381l-27 -20l-123 157q-33 -47 -48 -91.5t-15 -94.5q0 -95 59 -160t166 -86zM596 983q26 -47 54.5 -67.5t66.5 -20.5q40 0 106.5 30.5t120.5 78.5q33 -101 83.5 -188.5
+t119.5 -164.5l-436 -295v-135q67 -6 134.5 -29t129.5 -61l57 43l19 -24l-222 -195q-78 71 -161 115t-162 57l-166 -156q-127 42 -199.5 123.5t-72.5 179.5q0 95 56.5 179.5t158.5 140.5l-213 270h4q48 0 101.5 34.5t111.5 102.5q26 -88 56.5 -126.5t72.5 -38.5
+q29 0 63.5 26.5t116.5 120.5zM711 393l233 164l-178 315l-55 -6v-473z" />
+    <glyph glyph-name="ccedilla" unicode="&#xe7;" horiz-adv-x="735" 
+d="M338 222q76 -5 145 -29t117 -62l57 47l21 -24l-223 -199q-80 60 -150 88.5t-139 28.5q-29 0 -57 -6t-58 -19q0 52 26 90.5t77 63.5v491q0 65 -12.5 101t-40.5 69q13 -1 27.5 -1.5t41.5 -0.5q98 0 201.5 38.5t160.5 96.5q32 -52 72.5 -80t83.5 -28q13 0 39 3q4 1 6 1
+q-42 -65 -91.5 -98t-102.5 -33q-59 0 -101 28.5t-57 79.5l-43 -14v-632zM194 -408l-19 5q6 52 44 85t92 33q28 0 51 -12t47 -39l45 8v168h-123v250h49v-196h164v-154q0 -44 6 -64t20 -34q-18 7 -37.5 10.5t-39.5 3.5q-57 0 -97.5 -17t-68.5 -53q-22 30 -41 44t-39 14
+q-21 0 -35 -13.5t-18 -38.5z" />
+    <glyph glyph-name="egrave" unicode="&#xe8;" horiz-adv-x="786" 
+d="M401 872l-61 -16v-461l244 164zM55 49q0 55 26.5 94t78.5 60v487q0 56 -14 97t-44 75h70q112 0 223.5 40.5t175.5 103.5q30 -98 82 -189t121 -166l-434 -295v-134q81 -10 147.5 -33t114.5 -58l57 45l19 -24l-223 -197q-63 55 -139.5 85t-155.5 30q-28 0 -53.5 -5
+t-51.5 -16zM206 1350q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
+    <glyph glyph-name="eacute" unicode="&#xe9;" horiz-adv-x="786" 
+d="M401 872l-61 -16v-461l244 164zM55 49q0 55 26.5 94t78.5 60v487q0 56 -14 97t-44 75h70q112 0 223.5 40.5t175.5 103.5q30 -98 82 -189t121 -166l-434 -295v-134q81 -10 147.5 -33t114.5 -58l57 45l19 -24l-223 -197q-63 55 -139.5 85t-155.5 30q-28 0 -53.5 -5
+t-51.5 -16zM580 1350q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
+    <glyph glyph-name="ecircumflex" unicode="&#xea;" horiz-adv-x="786" 
+d="M401 872l-61 -16v-461l244 164zM55 49q0 55 26.5 94t78.5 60v487q0 56 -14 97t-44 75h70q112 0 223.5 40.5t175.5 103.5q30 -98 82 -189t121 -166l-434 -295v-134q81 -10 147.5 -33t114.5 -58l57 45l19 -24l-223 -197q-63 55 -139.5 85t-155.5 30q-28 0 -53.5 -5
+t-51.5 -16zM75 1069q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
+    <glyph glyph-name="edieresis" unicode="&#xeb;" horiz-adv-x="786" 
+d="M401 872l-61 -16v-461l244 164zM55 49q0 55 26.5 94t78.5 60v487q0 56 -14 97t-44 75h70q112 0 223.5 40.5t175.5 103.5q30 -98 82 -189t121 -166l-434 -295v-134q81 -10 147.5 -33t114.5 -58l57 45l19 -24l-223 -197q-63 55 -139.5 85t-155.5 30q-28 0 -53.5 -5
+t-51.5 -16zM439 1184l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM77 1184l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
+    <glyph glyph-name="igrave" unicode="&#xec;" horiz-adv-x="508" 
+d="M317 -20q-90 24 -126.5 97t-36.5 253v413q-25 13 -44 28.5t-36 37.5l-51 -31l-15 23q66 41 128 89.5t116 102.5q22 -49 55.5 -75.5t73.5 -26.5q7 0 18.5 4t38.5 16q-2 -49 -27.5 -85.5t-76.5 -63.5v-424q0 -103 32 -139t115 -39q-56 -47 -97.5 -92.5t-66.5 -87.5z
+M67 1350q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
+    <glyph glyph-name="iacute" unicode="&#xed;" horiz-adv-x="508" 
+d="M317 -20q-90 24 -126.5 97t-36.5 253v413q-25 13 -44 28.5t-36 37.5l-51 -31l-15 23q66 41 128 89.5t116 102.5q22 -49 55.5 -75.5t73.5 -26.5q7 0 18.5 4t38.5 16q-2 -49 -27.5 -85.5t-76.5 -63.5v-424q0 -103 32 -139t115 -39q-56 -47 -97.5 -92.5t-66.5 -87.5z
+M441 1350q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
+    <glyph glyph-name="icircumflex" unicode="&#xee;" horiz-adv-x="508" 
+d="M317 -20q-90 24 -126.5 97t-36.5 253v413q-25 13 -44 28.5t-36 37.5l-51 -31l-15 23q66 41 128 89.5t116 102.5q22 -49 55.5 -75.5t73.5 -26.5q7 0 18.5 4t38.5 16q-2 -49 -27.5 -85.5t-76.5 -63.5v-424q0 -103 32 -139t115 -39q-56 -47 -97.5 -92.5t-66.5 -87.5z
+M-64 1069q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
+    <glyph glyph-name="idieresis" unicode="&#xef;" horiz-adv-x="508" 
+d="M317 -20q-90 24 -126.5 97t-36.5 253v413q-25 13 -44 28.5t-36 37.5l-51 -31l-15 23q66 41 128 89.5t116 102.5q22 -49 55.5 -75.5t73.5 -26.5q7 0 18.5 4t38.5 16q-2 -49 -27.5 -85.5t-76.5 -63.5v-424q0 -103 32 -139t115 -39q-56 -47 -97.5 -92.5t-66.5 -87.5z
+M300 1184l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM-62 1184l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
+    <glyph glyph-name="eth" unicode="&#xf0;" 
+d="M342 236q51 -19 87 -49t63 -74q21 7 50 14.5t78 17.5l1 590q0 52 -7.5 95t-21.5 79q-56 -27 -119 -47t-131 -33v-593zM311 -37q-43 53 -94.5 82t-103.5 29q-15 0 -56 -7q-5 -1 -8 -1q8 48 35.5 86t77.5 69v465q0 49 -10.5 88t-34.5 80q15 -1 32.5 -1.5t49.5 -0.5
+q105 0 200.5 21.5t178.5 64.5q-25 52 -59.5 96t-78.5 82l-264 -117l-41 43l262 117q-52 40 -103.5 75t-105.5 66l156 60q41 -21 96.5 -57t116.5 -82l219 90l43 -43l-215 -88q102 -93 149.5 -204t47.5 -257v-387q0 -66 10 -118t32 -105q-36 5 -67 7.5t-57 2.5
+q-114 0 -211.5 -37t-196.5 -119z" />
+    <glyph glyph-name="ntilde" unicode="&#xf1;" horiz-adv-x="948" 
+d="M297 -31q-40 64 -100.5 100.5t-124.5 36.5h-20t-15 -1q20 34 50 60t73 46v442q0 88 -28 116.5t-112 37.5q73 46 121 94t82 109q63 -36 90 -103t27 -192v-19l367 305q23 -64 56.5 -94t80.5 -30q5 0 12 1t20 4q-11 -33 -31.5 -58.5t-53.5 -47.5v-465q0 -79 35 -114.5
+t114 -38.5q-47 -41 -89 -88.5t-79 -100.5q-91 24 -126.5 79t-35.5 194v501q-22 13 -42 31t-40 41l-188 -162v-440q55 -18 86 -39.5t53 -54.5q-57 -26 -101 -62.5t-81 -87.5zM198 1110q19 79 80 126.5t143 47.5q41 0 126 -20.5t132 -20.5q35 0 62 8t51 25q-37 -76 -107 -119
+t-155 -43q-41 0 -111.5 20.5t-103.5 20.5q-37 0 -64 -10.5t-53 -34.5z" />
+    <glyph glyph-name="ograve" unicode="&#xf2;" 
+d="M342 233q52 -19 88.5 -49t61.5 -73q21 7 49.5 14t78.5 18l1 602q-45 10 -81 37.5t-73 79.5q-12 -3 -35 -10q-60 -17 -90 -23v-596zM49 66q8 48 34.5 85t76.5 68v467q0 51 -10.5 89.5t-34.5 78.5q15 -1 33.5 -1.5t50.5 -0.5q135 0 257.5 39.5t225.5 116.5
+q26 -67 65.5 -102.5t88.5 -35.5q9 0 34 6q7 2 11 3q-13 -33 -32 -57t-48 -44v-446q0 -68 10 -121t33 -105q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5zM307 1350q68 -113 161.5 -166.5t223.5 -53.5h22
+q-38 -25 -81.5 -37t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
+    <glyph glyph-name="oacute" unicode="&#xf3;" 
+d="M342 233q52 -19 88.5 -49t61.5 -73q21 7 49.5 14t78.5 18l1 602q-45 10 -81 37.5t-73 79.5q-12 -3 -35 -10q-60 -17 -90 -23v-596zM49 66q8 48 34.5 85t76.5 68v467q0 51 -10.5 89.5t-34.5 78.5q15 -1 33.5 -1.5t50.5 -0.5q135 0 257.5 39.5t225.5 116.5
+q26 -67 65.5 -102.5t88.5 -35.5q9 0 34 6q7 2 11 3q-13 -33 -32 -57t-48 -44v-446q0 -68 10 -121t33 -105q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5zM681 1350q22 -15 52 -31t86 -43l-5 -16l-28 12
+q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
+    <glyph glyph-name="ocircumflex" unicode="&#xf4;" 
+d="M342 233q52 -19 88.5 -49t61.5 -73q21 7 49.5 14t78.5 18l1 602q-45 10 -81 37.5t-73 79.5q-12 -3 -35 -10q-60 -17 -90 -23v-596zM49 66q8 48 34.5 85t76.5 68v467q0 51 -10.5 89.5t-34.5 78.5q15 -1 33.5 -1.5t50.5 -0.5q135 0 257.5 39.5t225.5 116.5
+q26 -67 65.5 -102.5t88.5 -35.5q9 0 34 6q7 2 11 3q-13 -33 -32 -57t-48 -44v-446q0 -68 10 -121t33 -105q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5zM176 1069q116 85 194.5 161.5t128.5 153.5
+q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
+    <glyph glyph-name="otilde" unicode="&#xf5;" 
+d="M342 233q52 -19 88.5 -49t61.5 -73q21 7 49.5 14t78.5 18l1 602q-45 10 -81 37.5t-73 79.5q-12 -3 -35 -10q-60 -17 -90 -23v-596zM49 66q8 48 34.5 85t76.5 68v467q0 51 -10.5 89.5t-34.5 78.5q15 -1 33.5 -1.5t50.5 -0.5q135 0 257.5 39.5t225.5 116.5
+q26 -67 65.5 -102.5t88.5 -35.5q9 0 34 6q7 2 11 3q-13 -33 -32 -57t-48 -44v-446q0 -68 10 -121t33 -105q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5zM198 1110q19 79 80 126.5t143 47.5q41 0 126 -20.5
+t132 -20.5q35 0 62 8t51 25q-37 -76 -107 -119t-155 -43q-41 0 -111.5 20.5t-103.5 20.5q-37 0 -64 -10.5t-53 -34.5z" />
+    <glyph glyph-name="odieresis" unicode="&#xf6;" 
+d="M342 233q52 -19 88.5 -49t61.5 -73q21 7 49.5 14t78.5 18l1 602q-45 10 -81 37.5t-73 79.5q-12 -3 -35 -10q-60 -17 -90 -23v-596zM49 66q8 48 34.5 85t76.5 68v467q0 51 -10.5 89.5t-34.5 78.5q15 -1 33.5 -1.5t50.5 -0.5q135 0 257.5 39.5t225.5 116.5
+q26 -67 65.5 -102.5t88.5 -35.5q9 0 34 6q7 2 11 3q-13 -33 -32 -57t-48 -44v-446q0 -68 10 -121t33 -105q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5zM540 1184l106 126l3 -2q66 -85 114 -85q11 0 22 2.5
+t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM178 1184l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
+    <glyph glyph-name="divide" unicode="&#xf7;" horiz-adv-x="1706" 
+d="M854 367q51 0 88 -37t37 -88q0 -52 -36.5 -88.5t-88.5 -36.5q-53 0 -89 36t-36 89q0 51 37 88t88 37zM254 680h1198v-139h-1198v139zM854 1106q51 0 88 -37.5t37 -89.5q0 -51 -36.5 -88t-88.5 -37t-88.5 36.5t-36.5 88.5t37 89.5t88 37.5z" />
+    <glyph glyph-name="oslash" unicode="&#xf8;" 
+d="M342 305l272 440q-44 13 -78 40t-69 77q-31 -9 -61.5 -17t-63.5 -16v-524zM342 233q52 -19 88.5 -49t61.5 -73q20 6 46.5 13t82.5 19v553l-279 -442v-21zM49 66q8 48 35.5 86t77.5 67v459q0 55 -11 95t-36 81q15 -1 33.5 -1.5t50.5 -0.5q135 0 257.5 39.5t224.5 115.5
+q3 -4 7 -13q20 -44 33 -68l115 182l26 -14l-117 -187q25 -19 46 -28t43 -9q7 0 17 2t29 6q-12 -32 -31 -56t-48 -44v-452q0 -67 10 -117.5t33 -102.5q-53 8 -79 10.5t-46 2.5q-114 0 -212 -38t-198 -120q-22 27 -46 47t-52 35l-125 -201l-27 23l123 194q-3 1 -11 3
+q-41 10 -60 10q-14 0 -29 -1.5t-33 -4.5z" />
+    <glyph glyph-name="ugrave" unicode="&#xf9;" horiz-adv-x="948" 
+d="M678 1006q32 -59 95 -96.5t130 -37.5h10q-22 -37 -51 -62.5t-71 -45.5v-459q0 -72 27.5 -99.5t111.5 -35.5q-70 -41 -119.5 -90.5t-83.5 -112.5q-61 37 -88 100t-29 176l-293 -263q-27 56 -78 92.5t-102 36.5q-11 0 -24.5 -3t-38.5 -12q10 34 31 59.5t55 47.5v452
+q0 91 -33.5 126.5t-116.5 39.5q61 51 104 99.5t64 91.5q92 -24 127 -85t35 -241v-451q25 -13 50 -36.5t56 -61.5l164 139v488q-40 15 -59.5 25t-32.5 22l-39 -29l-14 25q76 50 127 98.5t86 102.5zM319 1350q68 -113 161.5 -166.5t223.5 -53.5h22q-38 -25 -81.5 -37
+t-96.5 -12q-105 0 -191 49.5t-141 141.5l-28 -12l-7 16q56 27 86 43t52 31z" />
+    <glyph glyph-name="uacute" unicode="&#xfa;" horiz-adv-x="948" 
+d="M678 1006q32 -59 95 -96.5t130 -37.5h10q-22 -37 -51 -62.5t-71 -45.5v-459q0 -72 27.5 -99.5t111.5 -35.5q-70 -41 -119.5 -90.5t-83.5 -112.5q-61 37 -88 100t-29 176l-293 -263q-27 56 -78 92.5t-102 36.5q-11 0 -24.5 -3t-38.5 -12q10 34 31 59.5t55 47.5v452
+q0 91 -33.5 126.5t-116.5 39.5q61 51 104 99.5t64 91.5q92 -24 127 -85t35 -241v-451q25 -13 50 -36.5t56 -61.5l164 139v488q-40 15 -59.5 25t-32.5 22l-39 -29l-14 25q76 50 127 98.5t86 102.5zM693 1350q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5
+t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
+    <glyph glyph-name="ucircumflex" unicode="&#xfb;" horiz-adv-x="948" 
+d="M678 1006q32 -59 95 -96.5t130 -37.5h10q-22 -37 -51 -62.5t-71 -45.5v-459q0 -72 27.5 -99.5t111.5 -35.5q-70 -41 -119.5 -90.5t-83.5 -112.5q-61 37 -88 100t-29 176l-293 -263q-27 56 -78 92.5t-102 36.5q-11 0 -24.5 -3t-38.5 -12q10 34 31 59.5t55 47.5v452
+q0 91 -33.5 126.5t-116.5 39.5q61 51 104 99.5t64 91.5q92 -24 127 -85t35 -241v-451q25 -13 50 -36.5t56 -61.5l164 139v488q-40 15 -59.5 25t-32.5 22l-39 -29l-14 25q76 50 127 98.5t86 102.5zM188 1069q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145
+q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
+    <glyph glyph-name="udieresis" unicode="&#xfc;" horiz-adv-x="948" 
+d="M678 1006q32 -59 95 -96.5t130 -37.5h10q-22 -37 -51 -62.5t-71 -45.5v-459q0 -72 27.5 -99.5t111.5 -35.5q-70 -41 -119.5 -90.5t-83.5 -112.5q-61 37 -88 100t-29 176l-293 -263q-27 56 -78 92.5t-102 36.5q-11 0 -24.5 -3t-38.5 -12q10 34 31 59.5t55 47.5v452
+q0 91 -33.5 126.5t-116.5 39.5q61 51 104 99.5t64 91.5q92 -24 127 -85t35 -241v-451q25 -13 50 -36.5t56 -61.5l164 139v488q-40 15 -59.5 25t-32.5 22l-39 -29l-14 25q76 50 127 98.5t86 102.5zM552 1184l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5
+q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM190 1184l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
+    <glyph glyph-name="yacute" unicode="&#xfd;" horiz-adv-x="948" 
+d="M678 1006q32 -59 95 -96.5t130 -37.5h10q-20 -35 -49 -61t-71 -47v-633q16 -35 23 -67t7 -66q0 -160 -129 -270.5t-317 -110.5q-94 0 -175 56.5t-98 56.5q-28 0 -47 -16.5t-34 -55.5q-3 26 -4 38t-1 21q0 66 42 113t100 47q40 0 75 -23.5t80 -82.5q46 -63 81 -85t81 -22
+q79 0 138 57t59 136q0 34 -31 121.5t-31 181.5v84l-295 -264q-27 56 -78 92.5t-102 36.5q-11 0 -24.5 -3t-38.5 -12q11 35 32 60t56 47v452q0 88 -35 125.5t-116 41.5l7 6q104 91 160 184q91 -24 127.5 -84t36.5 -197v-496q23 -13 47 -35t57 -63l166 139v488q-44 16 -63 26
+t-31 21l-39 -29l-14 25q76 50 127 98.5t86 102.5zM662 1350q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
+    <glyph glyph-name="thorn" unicode="&#xfe;" horiz-adv-x="901" 
+d="M313 676v-416q71 -16 127 -55.5t92 -98.5l62 25v614q-26 14 -49.5 34.5t-44.5 47.5zM135 -166v1268q0 84 -14.5 121t-52.5 71q80 9 153.5 47t151.5 111l14 -14q-40 -46 -57 -105t-17 -211v-401l346 289q23 -62 63.5 -97.5t88.5 -35.5q10 0 34 5q7 2 11 3
+q-12 -33 -32.5 -57.5t-49.5 -43.5v-440q0 -61 11 -118t34 -113q-7 0 -22 1q-40 3 -54 3q-82 0 -183.5 -37.5t-151.5 -89.5q-19 27 -41.5 45t-53.5 28v-188q0 -68 8.5 -111t26.5 -65q-70 -9 -156.5 -53.5t-113.5 -48.5q29 38 43 96.5t14 140.5z" />
+    <glyph glyph-name="ydieresis" unicode="&#xff;" horiz-adv-x="948" 
+d="M678 1006q32 -59 95 -96.5t130 -37.5h10q-20 -35 -49 -61t-71 -47v-633q16 -35 23 -67t7 -66q0 -160 -129 -270.5t-317 -110.5q-94 0 -175 56.5t-98 56.5q-28 0 -47 -16.5t-34 -55.5q-3 26 -4 38t-1 21q0 66 42 113t100 47q40 0 75 -23.5t80 -82.5q46 -63 81 -85t81 -22
+q79 0 138 57t59 136q0 34 -31 121.5t-31 181.5v84l-295 -264q-27 56 -78 92.5t-102 36.5q-11 0 -24.5 -3t-38.5 -12q11 35 32 60t56 47v452q0 88 -35 125.5t-116 41.5l7 6q104 91 160 184q91 -24 127.5 -84t36.5 -197v-496q23 -13 47 -35t57 -63l166 139v488q-44 16 -63 26
+t-31 21l-39 -29l-14 25q76 50 127 98.5t86 102.5zM521 1184l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30q-36 0 -68.5 19.5t-56.5 56.5zM159 1184l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30
+q-35 0 -67.5 19.5t-56.5 56.5z" />
+    <glyph glyph-name="Cacute" unicode="&#x106;" horiz-adv-x="1280" 
+d="M557 264q29 28 41 64t12 127v698l-147 -78l-10 25q199 106 325.5 187.5t214.5 158.5q20 -61 53 -92t78 -31q25 0 47.5 10t42.5 31q-10 -70 -54.5 -119t-112.5 -67v-1002q54 21 112.5 66.5t124.5 117.5q-91 -205 -241.5 -310t-356.5 -105q-260 0 -425 190t-165 488
+q0 250 132 462.5t358 323.5q-146 -131 -217.5 -294t-71.5 -365q0 -306 137 -462.5t406 -156.5q48 0 91.5 8.5t88.5 26.5v1007q-5 -1 -10 -1.5t-15 -0.5q-54 0 -93 31t-62 92l-39 -24v-674q0 -144 -56.5 -220t-187.5 -112zM960 1844q22 -15 52 -31t86 -43l-5 -16l-28 12
+q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
+    <glyph glyph-name="cacute" unicode="&#x107;" horiz-adv-x="735" 
+d="M338 222q76 -5 145 -29t117 -62l57 47l21 -24l-223 -199q-80 60 -150 88.5t-139 28.5q-29 0 -57 -6t-58 -19q0 52 26 90.5t77 63.5v491q0 65 -12.5 101t-40.5 69q13 -1 27.5 -1.5t41.5 -0.5q98 0 201.5 38.5t160.5 96.5q32 -52 72.5 -80t83.5 -28q13 0 39 3q4 1 6 1
+q-42 -65 -91.5 -98t-102.5 -33q-59 0 -101 28.5t-57 79.5l-43 -14v-632zM609 1350q22 -15 52 -31t86 -43l-5 -16l-28 12q-55 -92 -141 -141.5t-191 -49.5q-53 0 -96.5 12t-81.5 37h22q130 0 222 53t161 167z" />
+    <glyph glyph-name="Ccaron" unicode="&#x10c;" horiz-adv-x="1280" 
+d="M557 264q29 28 41 64t12 127v698l-147 -78l-10 25q199 106 325.5 187.5t214.5 158.5q20 -61 53 -92t78 -31q25 0 47.5 10t42.5 31q-10 -70 -54.5 -119t-112.5 -67v-1002q54 21 112.5 66.5t124.5 117.5q-91 -205 -241.5 -310t-356.5 -105q-260 0 -425 190t-165 488
+q0 250 132 462.5t358 323.5q-146 -131 -217.5 -294t-71.5 -365q0 -306 137 -462.5t406 -156.5q48 0 91.5 8.5t88.5 26.5v1007q-5 -1 -10 -1.5t-15 -0.5q-54 0 -93 31t-62 92l-39 -24v-674q0 -144 -56.5 -220t-187.5 -112zM1093 1878q-116 -84 -194.5 -161t-128.5 -154
+q-60 93 -136.5 170t-178.5 145q87 -4 166.5 -32.5t148.5 -79.5q75 49 157.5 77.5t165.5 34.5z" />
+    <glyph glyph-name="ccaron" unicode="&#x10d;" horiz-adv-x="735" 
+d="M338 222q76 -5 145 -29t117 -62l57 47l21 -24l-223 -199q-80 60 -150 88.5t-139 28.5q-29 0 -57 -6t-58 -19q0 52 26 90.5t77 63.5v491q0 65 -12.5 101t-40.5 69q13 -1 27.5 -1.5t41.5 -0.5q98 0 201.5 38.5t160.5 96.5q32 -52 72.5 -80t83.5 -28q13 0 39 3q4 1 6 1
+q-42 -65 -91.5 -98t-102.5 -33q-59 0 -101 28.5t-57 79.5l-43 -14v-632zM742 1384q-116 -84 -194.5 -161t-128.5 -154q-60 93 -136.5 170t-178.5 145q87 -4 166.5 -32.5t148.5 -79.5q75 49 157.5 77.5t165.5 34.5z" />
+    <glyph glyph-name="dcroat" unicode="&#x111;" 
+d="M348 211q51 -15 88.5 -41t59.5 -59q24 10 52.5 18t63.5 14v607l-116 122q-40 -29 -78 -48t-70 -25v-588zM62 58q5 39 29.5 70t78.5 65v446q0 77 -12.5 108.5t-42.5 57.5q15 -1 29 -1.5t30 -0.5q97 0 166.5 21.5t136.5 70.5l-104 119h-324v69h260l-35 39
+q-69 75 -112.5 112t-89.5 66q98 4 167 28.5t109 70.5v-29q0 -32 15.5 -62t66.5 -85l127 -140h317v-69h-253l120 -125q5 -5 14 -15q39 -43 83 -53q-24 -28 -34.5 -58.5t-10.5 -74.5v-428q0 -58 9 -90.5t29 -65.5q-4 1 -12 2q-73 11 -102 11q-123 0 -219 -38t-162 -112
+q-55 56 -103 83.5t-92 27.5q-16 0 -35 -5t-44 -15z" />
+    <glyph glyph-name="Gbreve" unicode="&#x11e;" horiz-adv-x="1360" 
+d="M729 659l381 621q-70 -60 -110.5 -81t-77.5 -21q-42 0 -70.5 20.5t-50.5 67.5l-72 -52v-555zM840 25q77 26 126 75.5t72 124.5q-27 13 -51 19t-49 6q-28 0 -51.5 -5.5t-46.5 -17.5v-202zM840 262q28 8 54 12.5t50 4.5q43 0 91 -18q7 -2 9 -3q9 36 13 70t4 65
+q0 25 -2.5 53.5t-7.5 60.5q-23 -16 -49.5 -24t-57.5 -8t-55 5.5t-49 17.5v-236zM840 526q29 -12 55.5 -18t50.5 -6q28 0 53 8t48 25q-21 96 -75 154.5t-132 70.5v-234zM498 162q19 30 28 59t9 70v10v795l-86 -47v34q126 59 256 149t266 214q20 -48 49 -72t65 -24
+q19 0 43.5 13.5t57.5 41.5l22 -14l-360 -594q6 0 17.5 1t17.5 1q176 0 288.5 -105.5t112.5 -265.5q0 -191 -172.5 -334t-409.5 -143q-270 0 -460.5 195t-190.5 475q0 231 148.5 449t375.5 321q-154 -140 -229.5 -324.5t-75.5 -425.5q0 -289 121 -467t311 -178q27 0 54 4.5
+t57 14.5v730l-84 -137v-69q0 -189 -52.5 -261.5t-178.5 -115.5zM512 1827h51q15 -63 73 -93t165 -30q105 0 162.5 30.5t73.5 92.5h53q-20 -120 -94 -184t-195 -64q-120 0 -193.5 63.5t-95.5 184.5z" />
+    <glyph glyph-name="gbreve" unicode="&#x11f;" 
+d="M606 262v483q-46 12 -82 40t-69 77q-38 -14 -68.5 -22t-56.5 -11v-557q41 -19 73 -46.5t58 -65.5q13 9 61.5 45.5t83.5 56.5zM786 203q52 -27 77.5 -63t25.5 -83q0 -51 -33 -97t-141 -126l-252 -186q-36 43 -85 64.5t-114 21.5q-25 0 -56 -5.5t-71 -17.5q65 91 128 129.5
+t145 38.5q54 0 102.5 -18t93.5 -56q66 36 96.5 73t30.5 81q0 71 -88 133q-9 6 -13 9q-13 9 -19.5 32t-6.5 66v22q-83 -57 -159.5 -114.5t-143.5 -112.5q-47 56 -98.5 85.5t-104.5 29.5q-9 0 -22.5 -2l-40.5 -6q8 49 34.5 86.5t75.5 68.5v426q0 59 -10.5 96.5t-33.5 75.5
+q15 -1 33.5 -1.5t51.5 -0.5q135 0 257 39.5t225 116.5q25 -67 65 -102.5t88 -35.5q10 0 34 6q8 2 11 3q-12 -33 -32 -57.5t-50 -43.5v-575zM179 1333h51q15 -63 73 -93t165 -30q105 0 162.5 30.5t73.5 92.5h53q-20 -120 -94 -184t-195 -64q-120 0 -193.5 63.5t-95.5 184.5z
+" />
+    <glyph glyph-name="Idotaccent" unicode="&#x130;" horiz-adv-x="1090" 
+d="M136 1209q33 107 107 170t167 63q46 0 138.5 -21.5t141.5 -21.5q31 0 57 5.5t54 18.5q-51 -100 -114.5 -146t-149.5 -46q-40 0 -123.5 15.5t-130.5 15.5q-63 0 -145 -52zM657 590v-4q0 -183 -55 -258.5t-188 -102.5q32 29 45.5 76t13.5 145v199q-6 1 -13.5 1.5t-21.5 0.5
+q-53 0 -82.5 -19.5t-38.5 -59.5q-17 20 -24.5 42.5t-7.5 55.5q0 83 42 131.5t115 48.5q4 0 12.5 -1t12.5 -1v45q0 97 51 159t193 130q-27 -36 -40.5 -96t-13.5 -146v-346zM-37 -43q10 102 88.5 180t163.5 78q87 0 191 -104q23 -23 36 -35q40 -36 77 -54t73 -18
+q90 0 133 67.5t43 209.5v757q0 147 56.5 217.5t195.5 147.5q-37 -37 -52.5 -77t-15.5 -118v-26v-848q0 -188 -128 -284.5t-378 -96.5q-85 0 -175 45t-124 45q-43 0 -90.5 -22t-93.5 -64zM514 1659l119 144q40 -57 69 -79t62 -22q11 0 23.5 3t28.5 10q-39 -78 -75.5 -110
+t-84.5 -32q-40 0 -77.5 23t-64.5 63z" />
+    <glyph glyph-name="dotlessi" unicode="&#x131;" horiz-adv-x="508" 
+d="M317 -20q-90 24 -126.5 97t-36.5 253v413q-25 13 -44 28.5t-36 37.5l-51 -31l-15 23q66 41 128 89.5t116 102.5q22 -49 55.5 -75.5t73.5 -26.5q7 0 18.5 4t38.5 16q-2 -49 -27.5 -85.5t-76.5 -63.5v-424q0 -103 32 -139t115 -39q-56 -47 -97.5 -92.5t-66.5 -87.5z" />
+    <glyph glyph-name="Lslash" unicode="&#x141;" horiz-adv-x="1280" 
+d="M53 1184q32 109 97 171t147 62q41 0 122 -21.5t126 -21.5q24 0 46.5 5.5t51.5 19.5q-46 -101 -101.5 -147t-131.5 -46q-36 0 -110.5 16.5t-115.5 16.5q-50 0 -120 -48q-7 -5 -11 -7zM506 287q31 33 44 75.5t13 139.5v151l-112 -69v-72q0 -137 -60 -217t-211 -154
+q44 52 62 109t18 172v41l-227 -139v106l227 141v271q0 113 47 172.5t195 130.5q-28 -38 -39.5 -88t-11.5 -144v-223l112 70v225q0 113 32 178t107 133q79 73 157 111.5t147 38.5q53 0 96.5 -19t87.5 -61l39 35l18 -19q-45 -40 -84.5 -87.5t-95.5 -133.5q-98 96 -141 124
+t-78 28q-54 0 -76 -32.5t-22 -113.5v-288l272 168v-109l-272 -170v-139q0 -162 -55.5 -237t-188.5 -105zM180 -63q76 136 254 224.5t383 88.5q63 0 125 -9t125 -28v481q-14 6 -21.5 18t-7.5 27q0 23 13 38.5t30 15.5q21 0 33 -14t12 -38q0 -15 -6.5 -25t-21.5 -20v-493
+l80 -35l36 41l23 -19q-49 -61 -91 -123t-79 -128q-111 54 -225.5 82t-227.5 28q-111 0 -217.5 -27.5t-216.5 -84.5z" />
+    <glyph glyph-name="lslash" unicode="&#x142;" horiz-adv-x="516" 
+d="M55 51q11 44 39 75.5t74 51.5v424l-166 -117v88l166 117v416q0 79 -15 116.5t-53 71.5q83 9 156.5 46t153.5 112l12 -14q-39 -45 -55.5 -102.5t-16.5 -192.5v-21v-331l166 116v-88l-166 -117v-481q43 -16 73 -40t54 -60l51 37l19 -27q-81 -58 -137.5 -108.5t-73.5 -77.5
+q-26 52 -79 85t-112 33q-18 0 -41 -3t-49 -9z" />
+    <glyph glyph-name="OE" unicode="&#x152;" horiz-adv-x="1847" 
+d="M616 389q25 8 55 12.5t66 4.5t70 -7.5t67 -21.5v481q-31 -12 -66 -18t-71 -6q-33 0 -62.5 5t-58.5 15v-465zM588 1176v10q0 96 69 167.5t164 71.5q67 0 169.5 -20.5t139.5 -20.5q25 0 48 7.5t43 21.5q-40 -114 -94 -161.5t-142 -47.5q-58 0 -151.5 23.5t-126.5 23.5
+q-50 0 -76.5 -17t-42.5 -58zM1651 -51q-74 51 -175.5 74.5t-256.5 23.5q-104 0 -282.5 -40t-260.5 -40q-241 0 -409.5 194.5t-168.5 479.5q0 251 133.5 477t339.5 324q-123 -116 -188.5 -319.5t-65.5 -475.5q0 -258 72.5 -423.5t198.5 -198.5v1007h28v-143q27 -13 57.5 -19
+t67.5 -6t69 6.5t64 20.5q-1 8 -1.5 15.5t-0.5 19.5q0 79 56 136t194 114q-37 -49 -52 -92t-15 -97v-547q0 -115 -49.5 -172t-186.5 -139q30 38 42.5 82.5t12.5 114.5v22q-38 14 -74.5 21.5t-70.5 7.5q-28 0 -56 -4.5t-57 -14.5l1 -340q25 -3 45 -4.5t36 -1.5q90 0 244 91
+t234 120v783q0 207 97 324.5t265 117.5q48 0 95.5 -13t101.5 -40l18 22l27 -14q-44 -58 -79.5 -120.5t-58.5 -121.5q-44 53 -103.5 80t-129.5 27q-101 0 -153 -68.5t-52 -202.5v-292q48 82 110.5 121.5t145.5 39.5q51 0 97.5 -14t91.5 -43l26 29l25 -17q-43 -52 -82 -114
+t-74 -136q-25 57 -78.5 89t-119.5 32q-44 0 -77 -13.5t-65 -43.5v-406q50 13 96.5 19t92.5 6q99 0 183.5 -25t160.5 -77l43 65l24 -20q-64 -96 -98.5 -152t-54.5 -96z" />
+    <glyph glyph-name="oe" unicode="&#x153;" horiz-adv-x="1249" 
+d="M860 872l-59 -8v-469l241 164zM340 233q57 -19 95.5 -51.5t58.5 -77.5q35 14 65 23t57 14v604q-44 14 -79.5 41t-69.5 76q-33 -12 -65 -20t-62 -13v-596zM49 66q8 48 34.5 85t76.5 68v467q0 52 -11 90t-34 78q16 -1 34.5 -1.5t49.5 -0.5q143 0 259 39.5t197 116.5
+q36 -62 71 -87.5t83 -25.5q41 0 89 24.5t122 86.5q57 -124 111 -212.5t106 -142.5l-436 -295v-135q78 -9 146 -33t116 -59l57 45l21 -22l-226 -197q-49 50 -287 147l-11 4q-79 -13 -157.5 -50t-150.5 -95q-43 53 -94.5 82t-103.5 29q-14 0 -29 -1.5t-33 -4.5z" />
+    <glyph glyph-name="Scedilla" unicode="&#x15e;" horiz-adv-x="1374" 
+d="M807 1028l63 90q-41 120 -115.5 186t-166.5 66q-95 0 -159 -49.5t-64 -118.5q0 -76 107.5 -118.5t334.5 -55.5zM16 0q78 128 231.5 206.5t325.5 78.5q100 0 182.5 -26.5t149.5 -80.5q173 186 219.5 264.5t46.5 149.5q0 113 -100 167.5t-360 78.5l-52 -88
+q221 -12 306.5 -58t85.5 -145q0 -62 -29 -113t-84 -88q5 19 7.5 34t2.5 28q0 68 -81 101.5t-316 53.5q-65 -126 -130 -188t-132 -62q-51 0 -85 34.5t-34 84.5q0 47 26.5 77t67.5 30q35 0 57.5 -26t22.5 -67q0 -20 -7.5 -39.5t-23.5 -39.5q3 -1 7 -1.5t8 -0.5q43 0 92 52
+t98 150q-215 17 -303 69.5t-88 160.5q0 48 17.5 89.5t54.5 82.5v-8q0 -92 92.5 -137.5t339.5 -67.5l47 88q-231 16 -327.5 71.5t-96.5 167.5q0 152 129 259.5t322 107.5q125 0 216 -36.5t140 -104.5l59 39l13 -29q-86 -59 -160 -132.5t-133 -160.5q252 -13 362.5 -84
+t110.5 -219q0 -86 -44 -171.5t-167 -221.5q-24 -27 -76 -83q-164 -178 -244 -294q-101 84 -201.5 121t-230.5 37q-82 0 -164 -27t-170 -84zM494 -408l-19 5q6 52 44 85t92 33q28 0 51 -12t47 -39l45 8v168h-123v250h49v-196h164v-154q0 -44 6 -64t20 -34q-18 7 -37.5 10.5
+t-39.5 3.5q-57 0 -97.5 -17t-68.5 -53q-22 30 -41 44t-39 14q-21 0 -35 -13.5t-18 -38.5z" />
+    <glyph glyph-name="scedilla" unicode="&#x15f;" horiz-adv-x="887" 
+d="M385 487q53 59 146 155q169 174 186 239q-40 -45 -80.5 -67.5t-79.5 -22.5q-40 0 -74.5 24t-58.5 70l-88 -23v-375h49zM123 145q43 32 95.5 51t94.5 19q48 0 90 -24t86 -76l84 18v379h-100q-72 -81 -197.5 -199.5t-152.5 -167.5zM65 -31h-24q0 4 1 13t1 14q0 71 56.5 160
+t203.5 239h-186q21 33 30 65t9 79v245q0 27 -10.5 52t-30.5 47q10 -1 44.5 -3.5t55.5 -2.5q103 0 192 30.5t166 91.5q28 -35 56 -52t57 -17q30 0 47 17.5t21 51.5h32q-12 -86 -54.5 -166t-170.5 -229h227q-17 -15 -25.5 -48t-8.5 -87v-233q0 -59 8.5 -93t28.5 -67
+q-39 12 -77.5 18t-78.5 6q-95 0 -170.5 -33t-138.5 -102q-52 62 -88 86.5t-74 24.5q-41 0 -67.5 -28.5t-31.5 -78.5zM269 -408l-19 5q6 52 44 85t92 33q28 0 51 -12t47 -39l45 8v168h-123v250h49v-196h164v-154q0 -44 6 -64t20 -34q-18 7 -37.5 10.5t-39.5 3.5
+q-57 0 -97.5 -17t-68.5 -53q-22 30 -41 44t-39 14q-21 0 -35 -13.5t-18 -38.5z" />
+    <glyph glyph-name="Scaron" unicode="&#x160;" horiz-adv-x="1374" 
+d="M807 1028l63 90q-41 120 -115.5 186t-166.5 66q-95 0 -159 -49.5t-64 -118.5q0 -76 107.5 -118.5t334.5 -55.5zM16 0q78 128 231.5 206.5t325.5 78.5q100 0 182.5 -26.5t149.5 -80.5q173 186 219.5 264.5t46.5 149.5q0 113 -100 167.5t-360 78.5l-52 -88
+q221 -12 306.5 -58t85.5 -145q0 -62 -29 -113t-84 -88q5 19 7.5 34t2.5 28q0 68 -81 101.5t-316 53.5q-65 -126 -130 -188t-132 -62q-51 0 -85 34.5t-34 84.5q0 47 26.5 77t67.5 30q35 0 57.5 -26t22.5 -67q0 -20 -7.5 -39.5t-23.5 -39.5q3 -1 7 -1.5t8 -0.5q43 0 92 52
+t98 150q-215 17 -303 69.5t-88 160.5q0 48 17.5 89.5t54.5 82.5v-8q0 -92 92.5 -137.5t339.5 -67.5l47 88q-231 16 -327.5 71.5t-96.5 167.5q0 152 129 259.5t322 107.5q125 0 216 -36.5t140 -104.5l59 39l13 -29q-86 -59 -160 -132.5t-133 -160.5q252 -13 362.5 -84
+t110.5 -219q0 -86 -44 -171.5t-167 -221.5q-24 -27 -76 -83q-164 -178 -244 -294q-101 84 -201.5 121t-230.5 37q-82 0 -164 -27t-170 -84zM1128 1878q-116 -84 -194.5 -161t-128.5 -154q-60 93 -136.5 170t-178.5 145q87 -4 166.5 -32.5t148.5 -79.5q75 49 157.5 77.5
+t165.5 34.5z" />
+    <glyph glyph-name="scaron" unicode="&#x161;" horiz-adv-x="887" 
+d="M385 487q53 59 146 155q169 174 186 239q-40 -45 -80.5 -67.5t-79.5 -22.5q-40 0 -74.5 24t-58.5 70l-88 -23v-375h49zM123 145q43 32 95.5 51t94.5 19q48 0 90 -24t86 -76l84 18v379h-100q-72 -81 -197.5 -199.5t-152.5 -167.5zM65 -31h-24q0 4 1 13t1 14q0 71 56.5 160
+t203.5 239h-186q21 33 30 65t9 79v245q0 27 -10.5 52t-30.5 47q10 -1 44.5 -3.5t55.5 -2.5q103 0 192 30.5t166 91.5q28 -35 56 -52t57 -17q30 0 47 17.5t21 51.5h32q-12 -86 -54.5 -166t-170.5 -229h227q-17 -15 -25.5 -48t-8.5 -87v-233q0 -59 8.5 -93t28.5 -67
+q-39 12 -77.5 18t-78.5 6q-95 0 -170.5 -33t-138.5 -102q-52 62 -88 86.5t-74 24.5q-41 0 -67.5 -28.5t-31.5 -78.5zM764 1384q-116 -84 -194.5 -161t-128.5 -154q-60 93 -136.5 170t-178.5 145q87 -4 166.5 -32.5t148.5 -79.5q75 49 157.5 77.5t165.5 34.5z" />
+    <glyph glyph-name="Ydieresis" unicode="&#x178;" horiz-adv-x="1186" 
+d="M586 883q31 -21 60.5 -30t62.5 -9q28 0 55 9t53 28v272q-40 15 -68.5 37.5t-54.5 58.5l-108 -90v-276zM586 475q35 12 62.5 18.5t47.5 6.5q28 0 58.5 -7t62.5 -20v373q-33 -16 -60 -23.5t-50 -7.5q-22 0 -48 7t-73 28v-375zM586 25q13 -3 24.5 -5t20.5 -2
+q91 0 138.5 50.5t47.5 146.5v221q-32 18 -61.5 26.5t-59.5 8.5t-57.5 -8.5t-52.5 -26.5v-411zM557 35v1102l-115 -76v-746q0 -134 26 -191t89 -89zM752 -385l6 26q14 -5 26 -7.5t23 -2.5q46 0 80.5 31t34.5 70q0 24 -18.5 39.5t-49.5 15.5q-25 0 -70 -22.5t-90 -59.5l-6 -5
+q-121 -99 -203 -99q-80 0 -131 52.5t-51 133.5q0 70 46.5 115t158.5 82q-147 21 -201.5 78.5t-54.5 240.5v362q-14 3 -24.5 4t-20.5 1q-43 0 -68 -21.5t-39 -70.5q-15 33 -21.5 62t-6.5 58q0 82 35.5 124t105.5 42q12 0 21 -0.5t18 -0.5v237q0 74 -23.5 111.5t-70.5 37.5
+q-37 0 -64 -31t-39 -88q-8 36 -11 55.5t-3 35.5q0 94 60 159.5t151 65.5q98 0 144 -76.5t46 -239.5v-32l115 76v272h29v-250q67 53 135.5 116.5t136.5 137.5q25 -74 62.5 -110.5t89.5 -36.5q28 0 50.5 10t43.5 33v-11q0 -45 -24 -85t-74 -79v-911q0 -127 -64.5 -185.5
+t-265.5 -92.5q-191 -33 -257.5 -67.5t-66.5 -90.5q0 -29 22 -48.5t56 -19.5q42 0 165 85t202 85q68 0 117 -49t49 -119q0 -65 -45.5 -111t-110.5 -46q-15 0 -44 10q-8 3 -11 4zM760 1678l106 126l3 -2q66 -85 114 -85q11 0 22 2.5t23 6.5q-30 -64 -64.5 -94t-78.5 -30
+q-36 0 -68.5 19.5t-56.5 56.5zM398 1678l106 127q43 -58 65.5 -73t51.5 -15q10 0 21 2.5t23 6.5q-29 -64 -63.5 -94t-79.5 -30q-35 0 -67.5 19.5t-56.5 56.5z" />
+    <glyph glyph-name="Zcaron" unicode="&#x17d;" horiz-adv-x="1042" 
+d="M825 807q26 0 55.5 5t63.5 15q-45 -46 -71 -89.5t-42 -94.5q-14 15 -36.5 22t-63.5 7h-92q-72 -181 -210.5 -344t-381.5 -346q19 10 55 30q372 205 553 205q62 0 128 -15t137 -44l41 45l26 -23q-60 -61 -108.5 -122.5t-79.5 -116.5q-73 42 -164.5 64t-198.5 22
+q-95 0 -204 -21.5t-228 -62.5l-12 24q118 65 343 543q49 105 77 162h-105q-45 0 -142 -20l-5 -1q32 38 53 83.5t31 96.5q30 -12 56 -18t46 -6h131q99 259 425 539l42 36q-47 -24 -134 -74q-282 -161 -460 -161q-60 0 -113.5 17t-111.5 55l-43 -45l-21 22q70 76 117 139
+t74 117q35 -61 122.5 -93t221.5 -32q124 0 225.5 29.5t190.5 91.5l16 -27q-142 -110 -332 -609l-1 -5h130zM962 1878q-116 -84 -194.5 -161t-128.5 -154q-60 93 -136.5 170t-178.5 145q87 -4 166.5 -32.5t148.5 -79.5q75 49 157.5 77.5t165.5 34.5z" />
+    <glyph glyph-name="zcaron" unicode="&#x17e;" horiz-adv-x="807" 
+d="M41 -27l-31 4q75 119 153 233t161 224h-101q-25 0 -53.5 -3t-56.5 -9q24 34 40 66.5t24 62.5h233l237 328q-95 -67 -175 -98t-157 -31q-74 0 -138.5 22.5t-117.5 67.5q61 37 115.5 83t104.5 101q16 -66 66.5 -100.5t129.5 -34.5q98 0 178.5 36.5t100.5 88.5l22 -15
+q-69 -112 -144.5 -224t-158.5 -226h123q29 0 46.5 4.5t35.5 13.5q-22 -33 -42 -67t-40 -70h-205l-239 -317q89 61 173.5 89.5t176.5 28.5q66 0 121 -15.5t106 -49.5l43 53l27 -26q-50 -52 -94 -108t-82 -118q-66 54 -147 80.5t-177 26.5q-98 0 -157 -23t-101 -78zM723 1384
+q-116 -84 -194.5 -161t-128.5 -154q-60 93 -136.5 170t-178.5 145q87 -4 166.5 -32.5t148.5 -79.5q75 49 157.5 77.5t165.5 34.5z" />
+    <glyph glyph-name="florin" unicode="&#x192;" 
+d="M467 -68q33 -11 66.5 -32.5t66.5 -53.5l64 37l16 -24q-55 -34 -112 -77.5t-115 -96.5q-59 55 -107.5 81.5t-91.5 26.5q-22 0 -45 -5.5t-49 -16.5q13 39 41.5 75.5t74.5 73.5v899h-155v90h155v21q0 78 -13 127t-42 80h23q106 0 212 57t201 166q37 -71 65.5 -99t59.5 -28
+q20 0 39.5 7t46.5 26q-25 -76 -82 -122t-122 -46q-45 0 -86 21.5t-74 62.5l-37 -23v-249q16 -2 34.5 -2.5t53.5 -0.5q53 0 94 3.5t74 10.5v-585q14 -10 20.5 -20t6.5 -25q0 -22 -13.5 -36.5t-34.5 -14.5q-16 0 -27 14t-11 37q0 16 6 26.5t20 18.5v483h-223v-887z" />
+    <glyph glyph-name="circumflex" unicode="&#x2c6;" horiz-adv-x="1024" 
+d="M193 1069q116 85 194.5 161.5t128.5 153.5q60 -93 136.5 -170t178.5 -145q-89 5 -169 33.5t-148 79.5q-75 -50 -157 -78.5t-164 -34.5z" />
+    <glyph glyph-name="caron" unicode="&#x2c7;" horiz-adv-x="1024" 
+d="M831 1384q-116 -84 -194.5 -161t-128.5 -154q-60 93 -136.5 170t-178.5 145q87 -4 166.5 -32.5t148.5 -79.5q75 49 157.5 77.5t165.5 34.5z" />
+    <glyph glyph-name="breve" unicode="&#x2d8;" horiz-adv-x="1024" 
+d="M223 1333h51q15 -63 73 -93t165 -30q105 0 162.5 30.5t73.5 92.5h53q-20 -120 -94 -184t-195 -64q-120 0 -193.5 63.5t-95.5 184.5z" />
+    <glyph glyph-name="dotaccent" unicode="&#x2d9;" horiz-adv-x="1024" 
+d="M360 1165l119 144q40 -57 69 -79t62 -22q11 0 23.5 3t28.5 10q-39 -78 -75.5 -110t-84.5 -32q-40 0 -77.5 23t-64.5 63z" />
+    <glyph glyph-name="ring" unicode="&#x2da;" horiz-adv-x="1024" 
+d="M395 1245q0 -48 34.5 -82.5t82.5 -34.5q49 0 82 34t33 83q0 48 -33.5 81.5t-81.5 33.5q-49 0 -83 -33.5t-34 -81.5zM326 1245q0 75 55 130t131 55q75 0 129.5 -55t54.5 -130q0 -76 -54 -131t-130 -55q-75 0 -129 54.5t-57 131.5z" />
+    <glyph glyph-name="ogonek" unicode="&#x2db;" horiz-adv-x="1024" 
+d="M578 0q-54 -70 -79.5 -126t-25.5 -101q0 -40 22 -64t56 -24q24 0 47 8.5t51 30.5q-7 -74 -47.5 -113t-107.5 -39q-62 0 -97 32.5t-35 90.5q0 61 38 132t126 173h52z" />
+    <glyph glyph-name="tilde" unicode="&#x2dc;" horiz-adv-x="1024" 
+d="M215 1110q19 79 80 126.5t143 47.5q41 0 126 -20.5t132 -20.5q35 0 62 8t51 25q-37 -76 -107 -119t-155 -43q-41 0 -111.5 20.5t-103.5 20.5q-37 0 -64 -10.5t-53 -34.5z" />
+    <glyph glyph-name="hungarumlaut" unicode="&#x2dd;" horiz-adv-x="1024" 
+d="M483 1356q28 -12 62 -22.5t86 -24.5v-17l-31 6q-43 -112 -117 -166t-190 -59q83 54 125.5 117.5t64.5 165.5zM725 1356q26 -11 59 -21.5t90 -25.5v-17l-30 6q-43 -113 -117.5 -167t-189.5 -58q81 54 123.5 117t64.5 166z" />
+    <glyph glyph-name="Omega" unicode="&#x3a9;" horiz-adv-x="1569" 
+d="M1112 231v-26h311l60 184h61l-117 -389h-505q120 216 181.5 435t61.5 427q0 277 -95.5 418t-283.5 141q-189 0 -284.5 -140t-95.5 -419q0 -209 61 -426t182 -436h-506l-116 389h61l59 -184h312v26q-165 183 -237 335t-72 311q0 267 183 443.5t453 176.5t452.5 -177
+t182.5 -443q0 -158 -71.5 -309t-237.5 -337z" />
+    <glyph glyph-name="pi" unicode="&#x3c0;" horiz-adv-x="1389" 
+d="M1370 885l-43 -199h-340q-33 -137 -37 -401q-1 -58 -2 -87q-3 -125 -32.5 -183t-90.5 -58q-42 0 -64 28t-22 83q0 58 77 259t114 359h-387q-35 -142 -40 -414q-1 -49 -1 -73q-4 -127 -33 -184.5t-90 -57.5q-42 0 -63 28t-21 83q0 59 76 260t112 358h-188
+q-91 0 -135.5 -41.5t-67.5 -152.5h-57q40 218 124 305.5t251 87.5h960z" />
+    <glyph glyph-name="endash" unicode="&#x2013;" horiz-adv-x="1024" 
+d="M0 440v111h1038v-111h-1038z" />
+    <glyph glyph-name="emdash" unicode="&#x2014;" horiz-adv-x="2048" 
+d="M0 440v111h2048v-111h-2048z" />
+    <glyph glyph-name="quoteleft" unicode="&#x2018;" horiz-adv-x="467" 
+d="M305 1464q-29 -30 -42 -60.5t-13 -66.5t15.5 -68.5t49.5 -66.5l31 23l16 -23l-176 -133q-38 43 -56.5 86t-18.5 86q0 73 57.5 140t136.5 83z" />
+    <glyph glyph-name="quoteright" unicode="&#x2019;" horiz-adv-x="467" 
+d="M168 1049q29 30 42 60.5t13 66.5q0 35 -15 66.5t-50 66.5l-31 -21l-16 23l176 131q38 -43 56.5 -85t18.5 -85q0 -73 -57.5 -140t-136.5 -83z" />
+    <glyph glyph-name="quotesinglbase" unicode="&#x201a;" horiz-adv-x="467" 
+d="M168 -219q29 30 42 60.5t13 66.5t-15.5 68.5t-49.5 66.5l-31 -20l-16 22l176 131q38 -43 56.5 -85t18.5 -85q0 -73 -57.5 -141t-136.5 -84z" />
+    <glyph glyph-name="quotedblleft" unicode="&#x201c;" horiz-adv-x="825" 
+d="M305 1464q-29 -30 -42 -60.5t-13 -66.5t15.5 -68.5t49.5 -66.5l31 23l16 -23l-176 -133q-38 43 -56.5 86t-18.5 86q0 73 57.5 140t136.5 83zM657 1464q-28 -30 -41.5 -60.5t-13.5 -66.5t15.5 -68.5t50.5 -66.5l30 23l17 -23l-176 -133q-38 43 -57 86t-19 86
+q0 73 57.5 140t136.5 83z" />
+    <glyph glyph-name="quotedblright" unicode="&#x201d;" horiz-adv-x="825" 
+d="M520 1049q29 30 42 60.5t13 66.5q0 35 -15 66.5t-50 66.5l-31 -21l-16 23l176 131q37 -42 55.5 -84t18.5 -86q0 -74 -57 -140.5t-136 -82.5zM168 1049q29 30 42 60.5t13 66.5q0 35 -15 66.5t-50 66.5l-31 -21l-16 23l176 131q38 -43 56.5 -85t18.5 -85q0 -73 -57.5 -140
+t-136.5 -83z" />
+    <glyph glyph-name="quotedblbase" unicode="&#x201e;" horiz-adv-x="825" 
+d="M520 -219q29 30 42 60.5t13 66.5t-15.5 68.5t-49.5 66.5l-31 -20l-16 22l176 131q37 -42 55.5 -84t18.5 -86q0 -73 -57 -141t-136 -84zM168 -219q29 30 42 60.5t13 66.5t-15.5 68.5t-49.5 66.5l-31 -20l-16 22l176 131q38 -43 56.5 -85t18.5 -85q0 -73 -57.5 -141
+t-136.5 -84z" />
+    <glyph glyph-name="dagger" unicode="&#x2020;" horiz-adv-x="1024" 
+d="M642 1464l27 -14q-47 -48 -70.5 -160.5t-34.5 -359.5h197q45 0 74.5 6t56.5 18q-3 -22 -4.5 -42t-1.5 -38q0 -16 1.5 -35t4.5 -44q-26 18 -61 26t-93 8h-174l49 -1148l-229 149l29 999h-160q-51 0 -89.5 -8.5t-61.5 -25.5q2 25 4 45.5t2 29.5q0 18 -2 40.5t-4 43.5
+q26 -13 58 -18.5t85 -5.5h168l-6 121q-5 90 -27.5 159t-54.5 95q82 6 154.5 41.5t162.5 117.5z" />
+    <glyph glyph-name="daggerdbl" unicode="&#x2021;" horiz-adv-x="1024" 
+d="M613 -319l-229 149l10 426h-141q-56 0 -92.5 -8t-58.5 -24q2 25 4 45.5t2 29.5q0 17 -2 38.5t-4 43.5q25 -12 53.5 -17.5t70.5 -5.5h19h153l15 469h-160q-56 0 -92.5 -7.5t-58.5 -24.5q2 25 4 45.5t2 29.5q0 18 -2 40.5t-4 43.5q27 -12 57.5 -18t85.5 -6h168l-6 121
+q-5 90 -27.5 159t-54.5 95q82 6 154.5 41.5t162.5 117.5l27 -14q-47 -48 -70.5 -160.5t-34.5 -359.5h197q43 0 73 6t58 18q-3 -22 -4.5 -42t-1.5 -38q0 -16 1.5 -35t4.5 -44q-26 17 -58 24.5t-96 7.5h-174l21 -469h188q40 0 67 5.5t52 16.5q-3 -22 -4.5 -41t-1.5 -36
+q0 -16 1.5 -35t3.5 -44q-25 17 -57 24.5t-96 7.5h-149z" />
+    <glyph glyph-name="bullet" unicode="&#x2022;" horiz-adv-x="1208" 
+d="M307 762q0 123 87 209t210 86q122 0 208.5 -86.5t86.5 -208.5t-87.5 -209.5t-209.5 -87.5q-123 0 -209 87t-86 210z" />
+    <glyph glyph-name="ellipsis" unicode="&#x2026;" horiz-adv-x="2048" 
+d="M160 74l146 174q45 -66 81.5 -93.5t75.5 -27.5q10 0 24.5 4t37.5 12q-45 -92 -90.5 -132t-104.5 -40q-49 0 -93 26.5t-77 76.5zM842 74l146 174q45 -66 81.5 -93.5t75.5 -27.5q10 0 24.5 4t37.5 12q-45 -92 -90.5 -132t-104.5 -40q-49 0 -93 26.5t-77 76.5zM1526 74
+l146 174q45 -66 81.5 -93.5t75.5 -27.5q10 0 24.5 4t37.5 12q-45 -92 -90.5 -132t-104.5 -40q-49 0 -93 26.5t-77 76.5z" />
+    <glyph glyph-name="perthousand" unicode="&#x2030;" horiz-adv-x="2339" 
+d="M1163 1362h47l-796 -1399h-49zM1845 195q40 -16 68 -42t47 -65q28 10 50 17t42 12v516q-33 11 -59 34t-51 66q-31 -11 -54 -18t-43 -10v-510zM1626 52q6 43 27 75.5t57 56.5v400q0 42 -8 76t-27 69h5q40 -4 59 -4q100 0 191.5 34.5t168.5 100.5q22 -61 50.5 -89t68.5 -28
+q2 0 7 1t22 6q-10 -28 -24.5 -49t-34.5 -37l-1 -420q0 -35 8 -75t22 -83q-29 5 -51.5 7.5t-41.5 2.5q-84 0 -157 -32.5t-146 -102.5q-33 46 -72 71t-76 25q-8 0 -20 -1.5t-27 -3.5zM922 51q6 44 26.5 76.5t57.5 56.5v400q0 45 -8 78.5t-25 66.5h5q40 -4 58 -4
+q100 0 190.5 34t168.5 101q22 -61 50 -89t68 -28q3 0 10.5 1.5t20.5 4.5q-9 -27 -23.5 -48t-35.5 -38v-419q0 -35 7.5 -75t22.5 -83q-30 5 -52 7.5t-42 2.5q-83 0 -156.5 -32.5t-146.5 -102.5q-32 46 -71 71t-76 25q-9 0 -22 -1.5t-27 -4.5zM1143 195q39 -16 67.5 -42
+t46.5 -65q28 10 50.5 17t42.5 12v516q-34 11 -59.5 34t-51.5 66q-30 -11 -53 -18t-43 -10v-510zM244 709q39 -16 67.5 -42t46.5 -65q24 8 48 15.5t46 13.5l1 516q-35 11 -61.5 35t-51.5 65q-30 -11 -53 -18t-43 -10v-510zM25 566q6 43 26.5 75.5t57.5 56.5v400q0 45 -8 78.5
+t-25 66.5h5q40 -4 58 -4q100 0 190.5 34t168.5 101q22 -61 50 -89t68 -28q8 0 15.5 1.5t15.5 3.5q-9 -27 -23 -47t-36 -37v-422q0 -35 7.5 -74t22.5 -82q-31 6 -52.5 8t-41.5 2q-83 0 -156.5 -32.5t-146.5 -102.5q-32 46 -71 71t-76 25q-9 0 -22 -1.5t-27 -3.5z" />
+    <glyph glyph-name="guilsinglleft" unicode="&#x2039;" horiz-adv-x="616" 
+d="M440 68q-85 147 -165 250.5t-162 175.5q93 74 174.5 177t152.5 238q-3 -100 -41.5 -210t-105.5 -207q65 -104 102.5 -211t44.5 -213z" />
+    <glyph glyph-name="guilsinglright" unicode="&#x203a;" horiz-adv-x="616" 
+d="M176 68q8 108 44.5 215t101.5 209q-66 96 -104.5 206t-41.5 211q70 -133 152 -237t176 -178q-83 -72 -163 -175.5t-165 -250.5z" />
+    <glyph glyph-name="franc" unicode="&#x20a3;" horiz-adv-x="1903" 
+d="M86 1200q6 103 70 172.5t149 69.5q53 0 152.5 -30t156.5 -30q50 0 93 12.5t86 39.5q-57 -104 -148 -171t-170 -67q-54 0 -148.5 33t-131.5 33q-36 0 -60 -14t-49 -48zM346 219q22 34 31.5 69t9.5 91v14v250h-45q-63 0 -91.5 -20t-41.5 -72q-14 30 -20.5 55t-6.5 49
+q0 100 39 143.5t127 43.5q15 0 23 -0.5t16 -1.5v34v39q0 128 237 259l6 3q-29 -38 -42 -79.5t-13 -118.5v-465q0 -107 -50.5 -166.5t-178.5 -126.5zM889 829h190v350q-43 2 -82.5 25.5t-70.5 67.5q-19 -14 -28 -32.5t-9 -41.5v-369zM-74 -16q49 108 116 167.5t142 59.5
+q60 0 183.5 -85t175.5 -85q72 0 111.5 48t39.5 136v867q0 44 12 71.5t42 48.5q14 11 56 37q161 97 275 197q49 -55 75.5 -70.5t57.5 -15.5q22 0 43.5 7.5t42.5 23.5q-18 -82 -64.5 -133.5t-125.5 -77.5v-1037h-29v500h-190v-342q0 -75 -14 -106.5t-50 -61.5
+q-99 -84 -225.5 -136t-230.5 -52q-82 0 -185.5 39t-138.5 39q-30 0 -59.5 -10t-59.5 -29zM1536 -31q-40 64 -100.5 100.5t-124.5 36.5h-20t-15 -1q20 34 50 60t73 46v440q0 90 -27.5 119t-111.5 37q64 37 114.5 87.5t87.5 115.5q61 -39 89 -97.5t28 -150.5l184 248
+q24 -64 47 -89.5t56 -25.5q15 0 30.5 6t32.5 19q-8 -80 -50.5 -130.5t-96.5 -50.5q-37 0 -69.5 18.5t-59.5 55.5l-74 -100v-500q41 -14 70 -30t49 -36l37 27l20 -20q-76 -50 -131 -96t-88 -89z" />
+    <glyph glyph-name="trademark" unicode="&#x2122;" horiz-adv-x="1683" 
+d="M780 1442h191l137 -391l143 391h181v-25l-30 -2q-21 -2 -31.5 -15t-10.5 -38v-375q0 -25 10.5 -38t31.5 -15l30 -2v-29h-240v29l31 2q21 2 32 15.5t11 37.5v387l-172 -473h-21l-172 475v-389q0 -24 11 -37.5t32 -15.5l33 -2v-29h-197v29l34 2q20 2 31 15.5t11 37.5v371
+q0 24 -11 37.5t-31 15.5l-34 4v27zM250 1442h444l11 -182h-27q-8 78 -40.5 114.5t-94.5 36.5h-17v-424q0 -24 10.5 -37.5t30.5 -15.5l33 -2v-29h-254v29l31 2q21 2 32 15.5t11 37.5v424h-17q-64 0 -96.5 -36t-40.5 -115h-26z" />
+    <glyph glyph-name="partialdiff" unicode="&#x2202;" horiz-adv-x="1059" 
+d="M756 621q15 87 22.5 168.5t7.5 156.5q0 129 -36.5 194.5t-108.5 65.5q-55 0 -127 -58t-108 -58t-60 22t-24 53q0 62 72 111t173 49q180 0 287 -155t107 -418q0 -335 -144.5 -556t-357.5 -221q-152 0 -253.5 108t-101.5 271q0 198 110.5 326.5t272.5 128.5
+q101 0 166 -45.5t103 -142.5zM707 494q0 116 -43.5 178.5t-122.5 62.5q-109 0 -179.5 -129t-70.5 -336q0 -116 43 -177.5t123 -61.5q109 0 179.5 130t70.5 333z" />
+    <glyph glyph-name="uni2206" unicode="&#x2206;" horiz-adv-x="1350" 
+d="M602 1174l-389 -957h768zM666 1497h30l600 -1497h-1243z" />
+    <glyph glyph-name="product" unicode="&#x220f;" horiz-adv-x="1630" 
+d="M53 1473h1522v-74h-191v-1718h191v-74h-596v74h192v1718h-714v-1718h192v-74h-596v74h191v1718h-191v74z" />
+    <glyph glyph-name="summation" unicode="&#x2211;" horiz-adv-x="1462" 
+d="M16 1473h1162l110 -365h-78l-73 227q-11 34 -41.5 49t-98.5 15h-690l809 -832v-37l-825 -735h887q61 0 79 13t29 51l72 229h78l-148 -481h-1272v41l920 815l-920 956v54z" />
+    <glyph glyph-name="minus" unicode="&#x2212;" horiz-adv-x="1706" 
+d="M254 682h1198v-141h-1198v141z" />
+    <glyph glyph-name="uni2215" unicode="&#x2215;" horiz-adv-x="342" 
+d="M612 1360h70l-954 -1399h-70z" />
+    <glyph glyph-name="uni2219" unicode="&#x2219;" horiz-adv-x="467" 
+d="M123 659q0 48 32 80.5t78 32.5q48 0 81.5 -33t33.5 -80q0 -45 -34 -78.5t-81 -33.5q-45 0 -77.5 33t-32.5 79z" />
+    <glyph glyph-name="radical" unicode="&#x221a;" horiz-adv-x="1305" 
+d="M1116 1661h189v-96h-115l-594 -1606h-66l-319 883l-125 -45l-25 80l283 98l256 -709z" />
+    <glyph glyph-name="infinity" unicode="&#x221e;" horiz-adv-x="1706" 
+d="M915 559q50 -89 116.5 -133.5t150.5 -44.5q101 0 165 67.5t64 172.5q0 101 -59 168t-148 67q-81 0 -146.5 -66.5t-142.5 -230.5zM793 666q-49 88 -115.5 132t-151.5 44q-101 0 -165 -66.5t-64 -171.5q0 -101 59 -168t148 -67q81 0 146.5 66t142.5 231zM864 483
+q-71 -136 -148.5 -199t-172.5 -63q-135 0 -228.5 112t-93.5 277q0 175 83.5 283t217.5 108q95 0 170 -61.5t150 -202.5q68 138 147 203.5t176 65.5q133 0 227.5 -113t94.5 -279q0 -174 -83.5 -281.5t-217.5 -107.5q-95 0 -168.5 58.5t-153.5 199.5z" />
+    <glyph glyph-name="integral" unicode="&#x222b;" horiz-adv-x="1067" 
+d="M311 -262q106 0 120 688q2 108 3 165q12 515 107 737t297 222q80 0 130 -42t50 -107q0 -54 -32 -85.5t-87 -31.5q-42 0 -70 19t-40 54q-6 15 -10.5 51t-20.5 36q-107 0 -121 -619q-4 -193 -8 -303q-17 -479 -111.5 -686t-290.5 -207q-79 0 -129.5 41.5t-50.5 106.5
+q0 56 34 87.5t95 31.5q33 0 57 -14.5t39 -42.5q10 -18 15 -59.5t24 -41.5z" />
+    <glyph glyph-name="approxequal" unicode="&#x2248;" horiz-adv-x="1706" 
+d="M1530 586v-156q-105 -73 -199.5 -107t-189.5 -34t-285 67.5t-293 67.5q-82 0 -171.5 -36t-213.5 -122v156q108 73 204 109t183 36q115 0 305 -68.5t273 -68.5q88 0 177 35.5t210 120.5zM1530 954v-155q-105 -73 -199.5 -107.5t-189.5 -34.5t-285 68t-293 68
+q-83 0 -171.5 -36t-213.5 -122v156q106 72 202 107.5t185 35.5q116 0 305.5 -67.5t272.5 -67.5q87 0 175 34.5t212 120.5z" />
+    <glyph glyph-name="notequal" unicode="&#x2260;" horiz-adv-x="1706" 
+d="M1208 1194l105 -82l-187 -235h326v-136h-416l-205 -262h621v-135h-709l-249 -317l-105 84l184 233h-319v135h408l204 262h-612v136h702z" />
+    <glyph glyph-name="lessequal" unicode="&#x2264;" horiz-adv-x="1706" 
+d="M262 162h1184v-139h-1184v139zM1444 1206v-147l-936 -309l936 -306v-149l-1182 395v121z" />
+    <glyph glyph-name="greaterequal" unicode="&#x2265;" horiz-adv-x="1706" 
+d="M262 162h1184v-139h-1184v139zM262 1206l1184 -395v-121l-1184 -395v149l938 306l-938 309v147z" />
+    <glyph glyph-name="lozenge" unicode="&#x25ca;" horiz-adv-x="1012" 
+d="M506 1409l-385 -817l385 -825l385 825zM506 1653l500 -1061l-500 -1069l-500 1069z" />
+    <glyph glyph-name="uniF000" unicode="&#xf000;" horiz-adv-x="1618" 
+d="M836 1216q-1 6 -1.5 14t-0.5 23q0 124 95 229.5t236 131.5q1 -10 1.5 -23t0.5 -39q0 -131 -103.5 -234.5t-203.5 -103.5h-8q-3 0 -7.5 1t-8.5 1zM1505 403q-114 -247 -205 -342.5t-204 -95.5q-50 0 -131.5 33t-122.5 33q-45 0 -131 -33t-127 -33q-64 0 -128.5 44
+t-129.5 132q-102 140 -157.5 295.5t-55.5 300.5q0 219 125 356.5t323 137.5q68 0 155 -34t124 -34q34 0 121.5 35t152.5 35q110 0 198 -40t161 -124q-102 -65 -151.5 -145.5t-49.5 -182.5q0 -113 60 -200t173 -138z" />
+    <glyph glyph-name="uniF001" unicode="&#xf001;" horiz-adv-x="1042" 
+d="M389 819v-604q49 -15 114 -69q15 -12 21 -17l64 37l14 -25q-63 -35 -118.5 -79t-106.5 -99q-48 54 -102 84.5t-101 30.5q-20 0 -39.5 -6t-42.5 -19q13 40 41.5 76.5t75.5 73.5v614h-152v92h152v49q0 58 -14.5 104.5t-40.5 74.5h16q106 0 211 57t201 166q45 -71 87.5 -101
+t94.5 -30q21 0 43.5 8.5t48.5 25.5q-26 -82 -91 -127.5t-157 -45.5q-56 0 -99.5 22t-82.5 70l-37 -23v-250h186q71 0 116.5 20t92.5 64q23 -49 56.5 -75.5t72.5 -26.5q8 0 21.5 4.5t35.5 13.5q-1 -47 -26.5 -83t-77.5 -64v-428q0 -99 32.5 -135t114.5 -40q-35 -27 -77 -73.5
+t-86 -105.5q-91 24 -127.5 97t-36.5 253v450l-41 39h-256z" />
+    <glyph glyph-name="uniF001" unicode="&#xfb01;" horiz-adv-x="1042" 
+d="M389 819v-604q49 -15 114 -69q15 -12 21 -17l64 37l14 -25q-63 -35 -118.5 -79t-106.5 -99q-48 54 -102 84.5t-101 30.5q-20 0 -39.5 -6t-42.5 -19q13 40 41.5 76.5t75.5 73.5v614h-152v92h152v49q0 58 -14.5 104.5t-40.5 74.5h16q106 0 211 57t201 166q45 -71 87.5 -101
+t94.5 -30q21 0 43.5 8.5t48.5 25.5q-26 -82 -91 -127.5t-157 -45.5q-56 0 -99.5 22t-82.5 70l-37 -23v-250h186q71 0 116.5 20t92.5 64q23 -49 56.5 -75.5t72.5 -26.5q8 0 21.5 4.5t35.5 13.5q-1 -47 -26.5 -83t-77.5 -64v-428q0 -99 32.5 -135t114.5 -40q-35 -27 -77 -73.5
+t-86 -105.5q-91 24 -127.5 97t-36.5 253v450l-41 39h-256z" />
+    <glyph glyph-name="uniF002" unicode="&#xf002;" horiz-adv-x="1024" 
+d="M707 1233q45 13 93 43.5t124 97.5l14 -14q-40 -46 -57 -105t-17 -211v-829q29 -8 58.5 -26.5t76.5 -59.5l64 37l16 -25q-53 -28 -110 -71.5t-119 -104.5q-95 81 -160.5 113t-131.5 35q-72 -52 -112.5 -86t-68.5 -64q-59 59 -108.5 87t-94.5 28q-20 0 -40 -6t-42 -19
+q14 42 43.5 79t75.5 71v614h-154v94h154v19q0 77 -13.5 127t-41.5 82h12q115 0 225.5 55.5t210.5 165.5q25 -45 50 -76t53 -51zM680 817h-291v-602q42 -13 82.5 -32.5t85.5 -47.5l123 66v616zM389 911h291v184q-60 2 -119.5 22.5t-128.5 64.5l-43 -21v-250z" />
+    <glyph glyph-name="uniF002" unicode="&#xfb02;" horiz-adv-x="1024" 
+d="M707 1233q45 13 93 43.5t124 97.5l14 -14q-40 -46 -57 -105t-17 -211v-829q29 -8 58.5 -26.5t76.5 -59.5l64 37l16 -25q-53 -28 -110 -71.5t-119 -104.5q-95 81 -160.5 113t-131.5 35q-72 -52 -112.5 -86t-68.5 -64q-59 59 -108.5 87t-94.5 28q-20 0 -40 -6t-42 -19
+q14 42 43.5 79t75.5 71v614h-154v94h154v19q0 77 -13.5 127t-41.5 82h12q115 0 225.5 55.5t210.5 165.5q25 -45 50 -76t53 -51zM680 817h-291v-602q42 -13 82.5 -32.5t85.5 -47.5l123 66v616zM389 911h291v184q-60 2 -119.5 22.5t-128.5 64.5l-43 -21v-250z" />
+  </font>
+</defs></svg>

BIN
ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.ttf


BIN
ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.woff


BIN
ruoyi-admin/src/main/resources/static/assets/fonts/d571b52b60b5617399ce8eab62bf3eb3.woff2


BIN
ruoyi-admin/src/main/resources/static/assets/img/logo.jpg


BIN
ruoyi-admin/src/main/resources/static/assets/img/logo1.jpg


BIN
ruoyi-admin/src/main/resources/static/assets/img/logo2.jpg


BIN
ruoyi-admin/src/main/resources/static/assets/img/logo3.jpg


+ 38 - 0
ruoyi-admin/src/main/resources/static/assets/js/bing.js

@@ -0,0 +1,38 @@
+const https = require('https')
+const fs = require('fs')
+
+const options = {
+  hostname: 'www.bing.com',
+  port: 443,
+  path: '/HPImageArchive.aspx?format=js&idx=0&n=8',
+  method: 'GET'
+}
+
+const req = https.request(options, bing_res => {
+  let bing_body = [], bing_data = {};
+  bing_res.on('data', (chunk) => {
+    bing_body.push(chunk);
+  });
+  bing_res.on('end', () => {
+    bing_body = Buffer.concat(bing_body);
+    bing_data = JSON.parse(bing_body.toString());
+    let img_array = bing_data.images;
+    let img_url = [];
+    img_array.forEach(img => {
+      img_url.push(img.url);
+    });
+    var jsonpStr = "getBingImages(" + JSON.stringify(img_url) + ")";
+    fs.writeFile('./assets/json/images.json', jsonpStr, (err) => {
+      if (err) {
+        throw err;
+      }
+      console.log("JSON data is saved: " + jsonpStr);
+    });
+  });
+})
+
+req.on('error', error => {
+  console.error(error)
+})
+
+req.end()

+ 104 - 0
ruoyi-admin/src/main/resources/static/assets/js/main.js

@@ -0,0 +1,104 @@
+var iUp = (function () {
+	var time = 0,
+		duration = 150,
+		clean = function () {
+			time = 0;
+		},
+		up = function (element) {
+			setTimeout(function () {
+				element.classList.add("up");
+			}, time);
+			time += duration;
+		},
+		down = function (element) {
+			element.classList.remove("up");
+		},
+		toggle = function (element) {
+			setTimeout(function () {
+				element.classList.toggle("up");
+			}, time);
+			time += duration;
+		};
+	return {
+		clean: clean,
+		up: up,
+		down: down,
+		toggle: toggle
+	};
+})();
+
+function getBingImages(imgUrls) {
+	/**
+	 * 获取Bing壁纸
+	 * 先使用 GitHub Action 每天获取 Bing 壁纸 URL 并更新 images.json 文件
+	 * 然后读取 images.json 文件中的数据
+	 */
+	var indexName = "bing-image-index";
+	var index = sessionStorage.getItem(indexName);
+	var panel = document.querySelector('#panel');
+	if (isNaN(index) || index == 7) index = 0;
+	else index++;
+	var imgUrl = imgUrls[index];
+	var url = "https://www.cn.bing.com" + imgUrl;
+	panel.style.background = "url('" + url + "') center center no-repeat #666";
+	panel.style.backgroundSize = "cover";
+	sessionStorage.setItem(indexName, index);
+}
+
+function decryptEmail(encoded) {
+	var address = atob(encoded);
+	window.location.href = "mailto:" + address;
+}
+
+document.addEventListener('DOMContentLoaded', function () {
+	// 获取一言数据
+	var xhr = new XMLHttpRequest();
+	xhr.onreadystatechange = function () {
+		if (this.readyState == 4 && this.status == 200) {
+			var res = JSON.parse(this.responseText);
+			document.getElementById('description').innerHTML = res.hitokoto + "<br/> -「<strong>" + res.from + "</strong>」";
+		}
+	};
+	xhr.open("GET", "https://v1.hitokoto.cn", true);
+	xhr.send();
+
+	var iUpElements = document.querySelectorAll(".iUp");
+	iUpElements.forEach(function (element) {
+		iUp.up(element);
+	});
+
+	var avatarElement = document.querySelector(".js-avatar");
+	avatarElement.addEventListener('load', function () {
+		avatarElement.classList.add("show");
+	});
+});
+
+var btnMobileMenu = document.querySelector('.btn-mobile-menu__icon');
+var navigationWrapper = document.querySelector('.navigation-wrapper');
+
+btnMobileMenu.addEventListener('click', function () {
+	if (navigationWrapper.style.display == "block") {
+		navigationWrapper.addEventListener('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', function () {
+			navigationWrapper.classList.toggle('visible');
+			navigationWrapper.classList.toggle('animated');
+			navigationWrapper.classList.toggle('bounceOutUp');
+			navigationWrapper.removeEventListener('webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend', arguments.callee);
+		});
+		navigationWrapper.classList.toggle('animated');
+		navigationWrapper.classList.toggle('bounceInDown');
+		navigationWrapper.classList.toggle('animated');
+		navigationWrapper.classList.toggle('bounceOutUp');
+	} else {
+		navigationWrapper.classList.toggle('visible');
+		navigationWrapper.classList.toggle('animated');
+		navigationWrapper.classList.toggle('bounceInDown');
+	}
+	btnMobileMenu.classList.toggle('social');
+	btnMobileMenu.classList.toggle('iconfont');
+	btnMobileMenu.classList.toggle('icon-list');
+	btnMobileMenu.classList.toggle('social');
+	btnMobileMenu.classList.toggle('iconfont');
+	btnMobileMenu.classList.toggle('icon-angleup');
+	btnMobileMenu.classList.toggle('animated');
+	btnMobileMenu.classList.toggle('fadeIn');
+});

+ 1 - 0
ruoyi-admin/src/main/resources/static/assets/json/images.json

@@ -0,0 +1 @@
+getBingImages(["/th?id=OHR.TheRoachesPeakDistrict_EN-US9733115206_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp","/th?id=OHR.SanMiguelAllende_EN-US9621237021_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp","/th?id=OHR.JediMonastery_EN-US9398447907_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp","/th?id=OHR.SonoranSpring_EN-US9207877073_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp","/th?id=OHR.CratersOfTheMoon_EN-US6516727783_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp","/th?id=OHR.HawaiianLei_EN-US6290126556_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp","/th?id=OHR.CheetahRain_EN-US6179670004_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp","/th?id=OHR.TulouFujian_EN-US6009679228_1920x1080.jpg&rf=LaDigue_1920x1080.jpg&pid=hp"])

+ 1 - 0
ruoyi-admin/src/main/resources/static/assets/svg/favicon.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1714852590465" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1571" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M263.1 844.8h497.7c22.9 0 41.5 18.6 41.5 41.5s-18.6 41.5-41.5 41.5H263.1c-22.9 0-41.5-18.6-41.5-41.5s18.6-41.5 41.5-41.5zM138.7 98.2h746.6c22.9 0 41.5 18.6 41.5 41.5v580.7c0 11-4.4 21.6-12.1 29.3-7.8 7.8-18.3 12.1-29.3 12.1H138.7c-11 0-21.6-4.4-29.3-12.1-7.8-7.8-12.1-18.3-12.1-29.3V139.7c-0.1-22.9 18.5-41.5 41.4-41.5z m331.8 478.9v60.4h83v-60.3c8.5-5.8 17.4-12.8 26.5-20.5l49.4 49.4 58.7-58.7-49.5-49.4c7.7-9 14.6-18 20.5-26.5h60.3v-83h-60.3c-6.4-9.1-13.3-18-20.5-26.5l49.4-49.4-58.7-58.6-49.4 49.4c-8.5-7.3-17.3-14.1-26.5-20.5v-60.3h-83V283c-8.5 5.8-17.4 12.8-26.5 20.5l-49.4-49.4-58.5 58.6 49.4 49.4c-7.2 8.5-14.1 17.3-20.5 26.5h-60.3v83h60.3c5.8 8.5 12.8 17.4 20.5 26.5L336 547.3l58.7 58.7 49.4-49.4c9.1 7.7 18 14.6 26.4 20.5z m0 0" p-id="1572"></path></svg>

+ 95 - 746
ruoyi-admin/src/main/resources/static/index.html

@@ -1,755 +1,104 @@
-<!doctype html>
+<!DOCTYPE html>
 <html>
+
 <head>
-    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-    <title>开发教程分享</title>
-    <meta name="description" content="搜索">
+    <!-- Meta, title, CSS, favicons, etc. -->
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="description" content="Padna Home">
+    <meta name="keywords" content="Padna,Homepage">
+    <meta name="author" content="Padna">
+    <title>熊猫助手</title>
+    <link rel="stylesheet" type="text/css" href="./assets/css/onlinewebfonts.css"/>
+    <link rel="stylesheet" type="text/css" href="./assets/css/vno.css">
+    <link rel="stylesheet" type="text/css" href="./assets/css/iconfont.css">
+    <link rel="icon" href="./assets/svg/favicon.svg">
 </head>
-<body>
-<!--header start-->
-<div class="header">
-    <div class="h_top">
-        <!--h_nav start-->
-        <div class="h_nav">
-            <ul>
-                <li><a href="#">首页</a></li>
-                <li><a href="#">课程</a></li>
-                <li><a href="#">问答</a></li>
-                <li><a href="#">专栏</a></li>
-                <li><a href="#">论坛</a></li>
-            </ul>
-        </div>
-        <!--end h_nav-->
-
-        <!--h_search start-->
-        <div class="h_search">
-            <input type="text" class="h_text">
-        </div>
-        <!--end h_search-->
-    </div>
-</div>
-<!--end header-->
-
-<!--banner start-->
-<div class="banner">
-    <img src="1.jpg" width="70%;" height="80%;" id="img1">
-</div>
-<!--end banner-->
-
-<!--menu start-->
-<div class="menu">
-    <div class="m_con">
-
-        <div class="m_list">
-            <h2>软件教程</h2>
-            <ul>
-                <li><a href="#">网页制作</a></li>
-                <li><a href="#">Java</a></li>
-                <li><a href="#">微信二次开发</a></li>
-                <li><a href="#">C++</a></li>
-                <li><a href="#">Android</a></li>
-                <li><a href="#">iOS</a></li>
-                <li><a href="#">PHP</a></li>
-                <li><a href="#">游戏开发</a></li>
-            </ul>
-        </div>
-
-        <div class="m_list">
-            <h2>技能学习</h2>
-            <ul>
-                <li><a href="#">网络营销</a></li>
-                <li><a href="#">SEO</a></li>
-                <li><a href="#">淘宝美工</a></li>
-                <li><a href="#">影楼后期</a></li>
-                <li><a href="#">淘宝运营</a></li>
-            </ul>
-        </div>
-        <div class="m_list">
-            <h2>语言学习</h2>
-            <ul>
-                <li><a href="#">韩语</a></li>
-                <li><a href="#">日语</a></li>
-                <li><a href="#">泰语</a></li>
-                <li><a href="#">西班牙语</a></li>
-            </ul>
-        </div>
-
-
-    </div>
-</div>
-<!--footer start-->
-<div class="footer">
-    <div class="f_con">
-        <div class="f_desc">
-            <dl>
-                <dt>关于我们</dt>
-                <dd><a href="#">熊猫问问</a></dd>
-                <dd><a href="#">加入我们</a></dd>
-                <dd><a href="#">联系我们</a></dd>
-            </dl>
-
-            <dl>
-                <dt>学习资讯</dt>
-                <dd><a href="#">学习课程</a></dd>
-                <dd><a href="#">就业指南</a></dd>
-            </dl>
-
-            <dl>
-                <dt>服务中心</dt>
-                <dd><a href="#">安卓APP</a></dd>
-                <dd><a href="#">IOS APP</a></dd>
-            </dl>
-        </div>
 
-        <div class="f_tel">
-            <div class="f_time">
-                <p class="f_phone">400-009-6359</p>
-                <p class="f_price">
-                    <span>周一至周六 9:30-23:00</span>
-                    <span>(仅收市话费)</span>
-                </p>
-                <p class="f_mm">24小时在线客服</p>
+<body>
+    <span class="mobile btn-mobile-menu">
+        <i class="social iconfont icon-list btn-mobile-menu__icon"></i>
+        <i class="social iconfont icon-angleup btn-mobile-close__icon hidden"></i>
+    </span>
+    <header id="panel" class="panel-cover">
+        <div class="panel-main">
+            <div class="panel-main__inner panel-inverted">
+                <div class="panel-main__content">
+                    <div class="ih-item circle effect right_to_left">
+                        <a href="#" title="" class="blog-button">
+                            <div>
+							<img src="./assets/img/logo1.jpg" alt="img" class="js-avatar iUp profilepic"></div>
+                        </a>
+                    </div>
+                    <h1 class="panel-cover__title panel-title iUp">
+                        <a href="#" title="Dmego Home">ageerle</a>
+                    </h1>
+                    <p class="panel-cover__subtitle panel-subtitle iUp">Code Create Life</p>
+                    <hr class="panel-cover__divider iUp" />
+                    <p id="description" class="panel-cover__description iUp">如何得与凉风约, 不共尘沙一并来!
+                        <br/>
+                        <strong>-「中牟道中」</strong>
+                    </p>
+                    <div class="navigation-wrapper iUp">
+                        <div>
+                            <nav class="cover-navigation cover-navigation--primary">
+                                <ul class="navigation">
+                                    <li class="navigation__item">
+                                        <a href="#" class="blog-button">首页</a>
+                                    </li>
+                                    <li class="navigation__item">
+                                        <a href="#" class="blog-button" target="_blank">博客</a>
+                                    </li>
+                                    <li class="navigation__item">
+                                        <a href="#" class="blog-button" target="_blank">简历</a>
+                                    </li>
+                                    <li class="navigation__item">
+                                        <a href="#" class="blog-button" target="_blank">关于</a>
+                                    </li>
+                                </ul>
+                            </nav>
+                        </div>
+                        <div class="iUp">
+                            <nav class="cover-navigation navigation--social">
+                                <ul class="navigation">
+                                    <li class="navigation__item">
+                                        <a href="https://github.com/ageerle/ruoyi-ai" title="github" target="_blank">
+                                            <i class='social iconfont icon-github'></i>
+                                            <span class="label">github</span>
+                                        </a>
+                                    </li>
+                                    <li class="navigation__item">
+                                        <a href="https://blog.csdn.net/weixin_42416319" title="csdn" target="_blank">
+                                            <i class='social iconfont icon-csdn'></i>
+                                            <span class="label">csdn</span>
+                                        </a>
+                                    </li>
+
+                                    <li class="navigation__item">
+                                        <a href="https://gitee.com/ageerle/ruoyi-ai" title="gitee" target="_blank">
+                                            <i class='social iconfont icon-cnblogs'></i>
+                                            <span class="label">gitee</span>
+                                        </a>
+                                    </li>
+
+                                </ul>
+                            </nav>
+                        </div>
+                    </div>
+                </div>
             </div>
+            <div class="panel-cover--overlay cover-slate">
+			</div>
         </div>
-        <div class="clear"></div>
-    </div>
-
-</div>
-<!--end footer-->
-
-<!--copyright start-->
-<div class="copyright">
-    Copyright &copy; 2023-2023  版权所有:xmzs 备案号:<a href="https://beian.miit.gov.cn/">鄂ICP备2023007672号</a>
-</div>
-<!--end copyright-->
 
+        <div class="remark iUp">
+            <p class="power" >
+               Copyright &copy; 2023-2024 版权所有:xmzs 备案号:<a href="https://beian.miit.gov.cn/">鄂ICP备20231008611号</a>
+            </p>
+        </div>
+    </header>
+    <script type="text/javascript" src="./assets/js/main.js"></script>
+    <script type="text/javascript" src="./assets/json/images.json?cb=getBingImages"></script>
 </body>
-
-<style>
-
-    * {
-        margin: 0;
-        padding: 0;
-    }
-
-    p{
-        text-align: center;
-    }
-
-    img{
-        margin-top: 10px;
-        margin-left: 20%;
-        margin-bottom: 10px;
-    }
-
-    body {
-        font-size: 12px;
-        font-family: "微软雅黑";
-        color: #666;
-        background: #eeeff3;
-    }
-
-    /*header start*/
-    .header {
-        width: 100%;
-        height: 70px;
-        background: #15171f;
-    }
-
-    .header .h_top {
-        width: 1180px;
-        height: 70px;
-        margin: 0 auto;
-    }
-
-    .header .h_top .h_logo {
-        width: 220px;
-        padding-top: 16px;
-        float: left;
-    }
-
-    /*h_nav start*/
-    .header .h_top .h_nav {
-        width: 650px;
-        height: 70px;
-        float: left;
-        color: #fff;
-        list-style: none;
-    }
-
-    .header .h_top .h_nav ul li {
-        list-style: none;
-        float: left;
-    }
-
-    .header .h_top .h_nav ul li a {
-        text-decoration: none;
-        display: block;
-        line-height: 70px;
-        padding: 0 20px 0 20px;
-        color: #fff;
-        font-size: 14px;
-        margin: 0 5px 0 5px;
-    }
-
-    .header .h_top .h_nav ul li a:hover {
-        background: #323744;
-    }
-
-    /*end h_nav*/
-
-    /*h_search start*/
-    .header .h_top .h_search {
-        width: 160px;
-        height: 32px;
-        border: 1px solid #323744;
-        background: #323744;
-        float: left;
-        margin-top: 18px;
-    }
-
-    .header .h_top .h_search:hover {
-        border: 1px solid #818997;
-    }
-
-    .header .h_top .h_search .h_text {
-        width: 125px;
-        height: 32px;
-        border: 0;
-        background: #323744;
-        font-size: 14px;
-        font-family: "微软雅黑";
-        color: #fff;
-        line-height: 32px;
-        padding-left: 10px;
-        float: left;
-    }
-
-    .header .h_top .h_search .h_btn {
-        width: 20px;
-        height: 20px;
-        display: block;
-        float: left;
-        margin-top: 5px;
-        background: url("picture/pe_icon.png") no-repeat -368px 0;
-    }
-
-    /*end h_search*/
-
-    /*h_message start*/
-    .header .h_top .h_message {
-        width: 112px;
-        height: 70px;
-        float: left;
-        margin-left: 34px;
-    }
-
-    .header .h_top .h_message .h_info {
-        width: 52px;
-        height: 70px;
-        float: left;
-        position: relative;
-    }
-
-    .header .h_top .h_message .h_info:hover {
-        background: #323744;
-    }
-
-    .header .h_top .h_message .h_info a {
-        width: 22px;
-        height: 16px;
-        display: block;
-        background: url("picture/pe_icon.png") no-repeat -368px -23px;
-        margin: 26px auto;
-    }
-
-    .header .h_top .h_message .h_info i {
-        width: 7px;
-        height: 7px;
-        display: block;
-        background: #eb6b83;
-        border-radius: 4px;
-        border: 1px solid #FFF;
-        position: absolute;
-        top: 17px;
-        left: 34px;
-    }
-
-    .header .h_top .h_message .h_pic a {
-        display: block;
-        width: 30px;
-        height: 30px;
-        margin: 20px auto;
-    }
-
-    .header .h_top .h_message .h_pic a img {
-        border-radius: 15px;
-    }
-
-    /*end h_message*/
-
-    /*banner start*/
-    .banner {
-        width: 100%;
-        height:60%;
-    }
-
-    /*end banner*/
-
-    /*menu start*/
-    .menu {
-        width: 100%;
-        height: 110px;
-        border-bottom: 1px solid #d9dce1;
-        background: #fff;
-    }
-
-    .menu .m_con {
-        width: 1180px;
-        height: 110px;
-        margin: 0 auto;
-    }
-
-    .menu .m_con .m_list {
-        width: 215px;
-        height: 80px;
-        border-right: 1px solid #d9dce1;
-        margin-top: 12px;
-        margin-left: 20px;
-        float: left;
-    }
-
-    .menu .m_con .m_list h2 {
-        font-size: 18px;
-        color: #5580fb;
-        font-weight: 500;
-        line-height: 36px;
-    }
-
-    .menu .m_con .m_list ul li {
-        list-style: none;
-        float: left;
-        margin-right: 10px;
-        line-height: 22px;
-    }
-
-    .menu .m_con .m_list ul li a {
-        color: #333;
-        text-decoration: none;
-    }
-
-    .menu .m_con .m_list ul li a:hover {
-        color: #5580fb;
-    }
-
-    .menu .m_con .m_list_end {
-        border: 0;
-    }
-
-    .course_list .c_course {
-        width: 222px;
-        height: 185px;
-        float: left;
-        margin: 0 7px;
-        margin-bottom: 20px;
-    }
-
-    .course_list .c_course .c_con {
-        width: 222px;
-        height: 185px;
-        position: relative;
-    }
-
-    /*c_first start*/
-    .course_list .c_course .c_first {
-        background: #5580fb;
-        text-align: center;
-        color: #fff;
-        font-size: 14px;
-    }
-
-    .course_list .c_course .c_first h2 {
-        padding-top: 50px;
-        font-weight: 500;
-        font-size: 24px;
-    }
-
-    .course_list .c_course .c_first p {
-        line-height: 36px;
-    }
-
-    .course_list .c_course .c_first a {
-        text-decoration: none;
-        color: #fff;
-    }
-
-    /*end c_first*/
-
-    /*c_list start*/
-    .course_list .c_course .c_list .c_yy {
-        width: 222px;
-        height: 145px;
-        background: #000;
-        position: absolute;
-        top: 0;
-        left: 0;
-        opacity: 0.6;
-        filter: alpha(opacity=60);
-        display: none;
-    }
-
-    .course_list .c_course .c_list .c_desc {
-        width: 222px;
-        height: 145px;
-        position: absolute;
-        top: 0;
-        left: 0;
-        color: #999;
-        display: none;
-    }
-
-    .course_list .c_course .c_list:hover .c_desc {
-        display: block;
-    }
-
-    .course_list .c_course .c_list:hover .c_yy {
-        display: block;
-    }
-
-    .course_list .c_course .c_list .c_desc p {
-        padding-left: 15px;
-        line-height: 24px;
-    }
-
-    .course_list .c_course .c_list .c_desc .c_title {
-        color: #fff;
-        font-size: 14px;
-        padding-top: 15px;
-    }
-
-    .course_list .c_course .c_list .c_tit_main {
-        text-align: center;
-        display: block;
-        line-height: 40px;
-        text-decoration: none;
-        color: #333;
-        font-size: 14px;
-    }
-
-    .course_list .c_course .c_list .c_tit_main:hover {
-        color: #5580fb;
-    }
-
-    .course_list .c_course .c_list .c_desc .c_btn {
-        width: 80px;
-        height: 30px;
-        background: #5580fb;
-        display: block;
-        text-decoration: none;
-        text-align: center;
-        line-height: 30px;
-        margin: 10px auto;
-        color: #fff;
-        font-size: 14px;
-        border-radius: 2px;
-    }
-
-    .clear {
-        clear: both;
-    }
-
-    .course_list .c_course .c_zhiye {
-        background: #7784a9;
-    }
-
-    .course_list .c_course .c_yuyan {
-        background: #3faa77;
-    }
-
-    .course_list .c_course .c_student {
-        background: #6a9a36;
-    }
-
-    /*end c_list*/
-
-    .teams {
-        width: 100%;
-        background: #fff;
-        padding-top: 20px;
-    }
-
-    /*teacher start*/
-    .teacher {
-        width: 1180px;
-        margin: 0 auto;
-        border-bottom: 1px solid #d9dce1;
-    }
-
-    .teacher h2 {
-        font-size: 24px;
-        font-weight: 500;
-    }
-
-    .teacher .t_team {
-        width: 1180px;
-    }
-
-    .teacher .t_team ul li {
-        list-style: none;
-        float: left;
-        width: 216px;
-        height: 66px;
-        margin: 30px 9px;
-    }
-
-    .teacher .t_team ul li:hover {
-        background: #EFEFEF;
-    }
-
-    .teacher .t_team ul li .t_pic {
-        width: 66px;
-        float: left;
-    }
-
-    .teacher .t_team ul li .t_desc {
-        width: 130px;
-        height: 66px;
-        float: right;
-    }
-
-    .teacher .t_team ul li .t_desc p {
-        line-height: 26px;
-    }
-
-    .teacher .t_team ul li .t_desc a {
-        font-size: 14px;
-        color: #5580fb;
-        text-decoration: none;
-    }
-
-    .student h2 {
-        font-weight: 500;
-        font-size: 24px;
-        line-height: 70px;
-    }
-
-    .student .s_box ul li {
-        list-style: none;
-        float: left;
-        width: 216px;
-        height: 280px;
-        margin-right: 22px;
-        position: relative;
-    }
-
-    .student .s_box ul .s_en_li {
-        margin-right: 0;
-    }
-
-    .student .s_box ul li .s_yy {
-        width: 216px;
-        height: 280px;
-        background: #000;
-        position: absolute;
-        top: 0;
-        left: 0;
-        opacity: 0.6;
-        filter: alpha(opacity=60);
-        display: none;
-    }
-
-    .student .s_box ul li .s_desc {
-        width: 216px;
-        height: 280px;
-        position: absolute;
-        top: 0;
-        left: 0;
-        color: #fff;
-        display: none;
-    }
-
-    .student .s_box ul li .s_desc h3 {
-        padding: 15px 0 0 20px;
-        font-weight: 500;
-        font-size: 18px;
-    }
-
-    .student .s_box ul li .s_desc p {
-        padding: 20px;
-        line-height: 26px;
-    }
-
-    .student .s_box ul li .s_desc a {
-        width: 60px;
-        height: 60px;
-        display: block;
-        border-radius: 30px;
-        background: #5580fb;
-        margin: 0 auto;
-        line-height: 60px;
-        text-align: center;
-        font-size: 16px;
-        text-decoration: none;
-        color: #fff;
-    }
-
-    .student .s_box ul li:hover .s_yy {
-        display: block;
-    }
-
-    .student .s_box ul li:hover .s_desc {
-        display: block;
-    }
-
-    .links h2 {
-        font-size: 24px;
-        font-weight: 500;
-        line-height: 70px;
-    }
-
-    .links .l_a {
-        width: 1180px;
-        color: #8e949f;
-    }
-
-    .links .l_a a {
-        padding: 0 10px;
-        line-height: 30px;
-        text-decoration: none;
-        color: #8e949f;
-        font-size: 14px;
-        display: inline-block;
-    }
-
-    .links .l_a a:hover {
-        color: #5580fb;
-    }
-
-    /*end links*/
-
-    /*footer start*/
-    .footer {
-        width: 100%;
-        background: #15171f;
-    }
-
-    .footer .f_con {
-        width: 1180px;
-        margin: 0px auto;
-        color: #51555d;
-        padding: 40px 0 40px 0;
-    }
-
-    .footer .f_con .f_desc dl {
-        float: left;
-        margin-right: 60px;
-    }
-
-    .footer .f_con .f_desc dl dt {
-        font-size: 18px;
-        margin-bottom: 10px;
-    }
-
-    .footer .f_con .f_desc dl dd {
-        line-height: 34px;
-    }
-
-    .footer .f_con .f_desc dl dd a {
-        text-decoration: none;
-        color: #51555d;
-        font-size: 14px;
-    }
-
-    .footer .f_con .f_desc dl dd a:hover {
-        color: #fff;
-    }
-
-    .footer .f_con .f_desc dl dd .share {
-        width: 35px;
-        height: 34px;
-        display: block;
-        float: left;
-        background: url("picture/pe_icon.png") no-repeat;
-        margin-right: 5px;
-    }
-
-    .footer .f_con .f_desc dl dd .f_wb {
-        background-position: -227px -77px;
-    }
-
-    .footer .f_con .f_desc dl dd .f_wb:hover {
-        background-position: -227px -113px;
-    }
-
-    .footer .f_con .f_desc dl dd .f_qq {
-        background-position: -265px -77px;
-    }
-
-    .footer .f_con .f_desc dl dd .f_qq:hover {
-        background-position: -265px -113px;
-    }
-
-    .footer .f_con .f_tel {
-        width: 365px;
-        float: right;
-    }
-
-    .footer .f_con .f_tel .f_qrcode {
-        width: 153px;
-        height: 135px;
-        border-right: 1px solid #202328;
-        float: left;
-    }
-
-    .footer .f_con .f_tel .f_time {
-        float: left;
-        padding-left: 51px;
-    }
-
-    .footer .f_con .f_tel .f_time .f_price {
-        margin: 10px auto;
-    }
-
-    .footer .f_con .f_tel .f_time .f_price span {
-        display: block;
-    }
-
-    .footer .f_con .f_tel .f_time .f_phone {
-        font-size: 24px;
-        color: #fff;
-        margin-bottom: 10px;
-    }
-
-    .footer .f_con .f_tel .f_time .f_price span {
-        line-height: 24px;
-        font-size: 14px;
-    }
-
-    .footer .f_con .f_tel .f_time .f_mm {
-        width: 152px;
-        height: 39px;
-        text-align: center;
-        border: 1px solid #292c35;
-        line-height: 39px;
-        font-size: 14px;
-        border-radius: 19px;
-    }
-
-    /*end footer*/
-
-    /*copyright start*/
-    .copyright {
-        width: 100%;
-        height: 70px;
-        background: #191b24;
-        line-height: 54px;
-        text-align: center;
-        font-size: 18px;
-    }
-
-    /*end copyright*/
-
-</style>
-
 </html>
-

+ 4 - 2
ruoyi-common/ruoyi-common-chat/src/main/java/com/xmzs/common/chat/utils/TikTokensUtil.java

@@ -139,7 +139,7 @@ public class TikTokensUtil {
      * @return Encoding
      */
     public static Encoding getEncoding(@NotNull String modelName) {
-        return modelMap.get(modelName);
+        return modelMap.getOrDefault(modelName, modelMap.get(ChatCompletion.Model.GPT_4_1106_PREVIEW.getName()));
     }
 
     /**
@@ -204,7 +204,9 @@ public class TikTokensUtil {
             tokensPerMessage = 3;
             tokensPerName = 1;
         }else {
-            log.warn("不支持的model {}. See https://github.com/openai/openai-python/blob/main/chatml.md 更多信息.",modelName);
+            log.warn("不支持的model {} 按gpt4计费",modelName);
+            tokensPerMessage = 3;
+            tokensPerName = 1;
         }
         int sum = 0;
         for (Message msg : messages) {

+ 3 - 0
ruoyi-common/ruoyi-common-pay/src/main/java/com/xmzs/common/service/impl/PayServiceImpl.java

@@ -7,6 +7,7 @@ import com.xmzs.common.config.PayConfig;
 import com.xmzs.common.service.PayService;
 import com.xmzs.common.utils.MD5Util;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
 import java.util.HashMap;
@@ -18,6 +19,7 @@ import java.util.Map;
  */
 @Service
 @RequiredArgsConstructor
+@Slf4j
 public class PayServiceImpl implements PayService {
 
     private final PayConfig payConfig;
@@ -42,6 +44,7 @@ public class PayServiceImpl implements PayService {
         map.put("type", payConfig.getType());
         map.put("sign", sign);
         String body = HttpUtil.post(payConfig.getPayUrl(), map);
+        log.info("支付返回信息:{},配置信息: {}",body,payConfig);
         JSONObject jsonObject = new JSONObject(body);
         return (String) jsonObject.get("qrcode");
     }

+ 6 - 6
ruoyi-common/ruoyi-common-web/src/main/java/com/xmzs/common/web/interceptor/PlusWebInvokeTimeInterceptor.java

@@ -69,12 +69,12 @@ public class PlusWebInvokeTimeInterceptor implements HandlerInterceptor {
 
     @Override
     public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
-        if (!prodProfile.equals(SpringUtils.getActiveProfile())) {
-            StopWatch stopWatch = invokeTimeTL.get();
-            stopWatch.stop();
-            log.debug("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime());
-            invokeTimeTL.remove();
-        }
+//        if (!prodProfile.equals(SpringUtils.getActiveProfile())) {
+//            StopWatch stopWatch = invokeTimeTL.get();
+//            stopWatch.stop();
+//            log.debug("[PLUS]结束请求 => URL[{}],耗时:[{}]毫秒", request.getMethod() + " " + request.getRequestURI(), stopWatch.getTime());
+//            invokeTimeTL.remove();
+//        }
     }
 
     /**

+ 1 - 6
ruoyi-common/ruoyi-common-wechat/src/main/java/com/xmzs/common/wechat/Wechat.java

@@ -1,6 +1,5 @@
 package com.xmzs.common.wechat;
 
-import com.xmzs.common.wechat.controller.LoginController;
 import com.xmzs.common.wechat.core.MsgCenter;
 import com.xmzs.common.wechat.face.IMsgHandlerFace;
 import org.slf4j.Logger;
@@ -12,13 +11,9 @@ public class Wechat {
 	private static final Logger LOG = LoggerFactory.getLogger(Wechat.class);
 	private IMsgHandlerFace msgHandler;
 
-	public Wechat(IMsgHandlerFace msgHandler, String qrPath) {
+	public Wechat(IMsgHandlerFace msgHandler) {
 		System.setProperty("jsse.enableSNIExtension", "false"); // 防止SSL错误
 		this.msgHandler = msgHandler;
-
-		// 登陆
-		LoginController login = new LoginController();
-		login.login(qrPath);
 	}
 
 	public void start() {

+ 66 - 67
ruoyi-common/ruoyi-common-wechat/src/main/java/com/xmzs/common/wechat/controller/LoginController.java

@@ -1,7 +1,9 @@
 package com.xmzs.common.wechat.controller;
 
 
+import com.xmzs.common.core.exception.base.BaseException;
 import com.xmzs.common.wechat.utils.SleepUtils;
+import com.xmzs.common.wechat.utils.enums.URLEnum;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -17,74 +19,71 @@ import com.xmzs.common.wechat.utils.tools.CommonTools;
  * 登陆控制器
  *
  * @author https://github.com/yaphone
- * @date 创建时间:2017年5月13日 下午12:56:07
  * @version 1.0
- *
+ * @date 创建时间:2017年5月13日 下午12:56:07
  */
 public class LoginController {
-	private static Logger LOG = LoggerFactory.getLogger(LoginController.class);
-	private ILoginService loginService = new LoginServiceImpl();
-	private static Core core = Core.getInstance();
-
-	public void login(String qrPath) {
-		if (core.isAlive()) { // 已登陆
-			LOG.info("itchat4j已登陆");
-			return;
-		}
-		while (true) {
-			for (int count = 0; count < 10; count++) {
-				LOG.info("获取UUID");
-				while (loginService.getUuid() == null) {
-					LOG.info("1. 获取微信UUID");
-					while (loginService.getUuid() == null) {
-						LOG.warn("1.1. 获取微信UUID失败,两秒后重新获取");
-						SleepUtils.sleep(2000);
-					}
-				}
-				LOG.info("2. 获取登陆二维码图片");
-				if (loginService.getQR(qrPath)) {
-					break;
-				} else if (count == 10) {
-					LOG.error("2.2. 获取登陆二维码图片失败,系统退出");
-					System.exit(0);
-				}
-			}
-			LOG.info("3. 请扫描二维码图片,并在手机上确认");
-			if (!core.isAlive()) {
-				loginService.login();
-				core.setAlive(true);
-				LOG.info(("登陆成功"));
-				break;
-			}
-			LOG.info("4. 登陆超时,请重新扫描二维码图片");
-		}
-
-		LOG.info("5. 登陆成功,微信初始化");
-		if (!loginService.webWxInit()) {
-			LOG.info("6. 微信初始化异常");
-			System.exit(0);
-		}
-
-		LOG.info("6. 开启微信状态通知");
-		loginService.wxStatusNotify();
-
-		LOG.info("7. 清除。。。。");
-		CommonTools.clearScreen();
-		LOG.info(String.format("欢迎回来, %s", core.getNickName()));
-
-		LOG.info("8. 开始接收消息");
-		loginService.startReceiving();
-
-		LOG.info("9. 获取联系人信息");
-		loginService.webWxGetContact();
-
-		LOG.info("10. 获取群好友及群好友列表");
-		loginService.WebWxBatchGetContact();
-
-		LOG.info("11. 缓存本次登陆好友相关消息");
-		WechatTools.setUserInfo(); // 登陆成功后缓存本次登陆好友相关消息(NickName, UserName)
-
-		LOG.info("12.开启微信状态检测线程");
-		new Thread(new CheckLoginStatusThread()).start();
-	}
+    private static Logger LOG = LoggerFactory.getLogger(LoginController.class);
+    private ILoginService loginService = new LoginServiceImpl();
+    private static Core core = Core.getInstance();
+
+
+    /**
+     * 获取二维码地址
+     * 风险:已登录账号不可调用该接口,会移除当前core信息
+     * @return
+     */
+    public String login_1() {
+        if (core.isAlive()) {
+            LOG.warn("微信已登陆");
+            throw new BaseException("微信已登陆");
+        }
+        LOG.info("1.获取微信UUID");
+        while (loginService.getUuid() == null) {
+            LOG.warn("1.1. 获取微信UUID失败,一秒后重新获取");
+            SleepUtils.sleep(1000);
+        }
+        LOG.info("2. 获取登陆二维码图片");
+        return URLEnum.QRCODE_URL.getUrl() + core.getUuid();
+    }
+
+
+    public void login_2() {
+        LOG.info("3. 请扫描二维码图片,并在手机上确认");
+        if (!core.isAlive()) {
+            loginService.login();
+            core.setAlive(true);
+            LOG.info(("登陆成功"));
+        }
+        LOG.info("4. 登陆超时,请重新扫描二维码图片");
+
+
+        LOG.info("5. 登陆成功,微信初始化");
+        if (!loginService.webWxInit()) {
+            LOG.info("6. 微信初始化异常");
+            System.exit(0);
+        }
+
+        LOG.info("6. 开启微信状态通知");
+        loginService.wxStatusNotify();
+
+        LOG.info("7. 清除。。。。");
+        CommonTools.clearScreen();
+        LOG.info(String.format("欢迎回来, %s", core.getNickName()));
+
+        LOG.info("8. 开始接收消息");
+        loginService.startReceiving();
+
+        LOG.info("9. 获取联系人信息");
+        loginService.webWxGetContact();
+
+        LOG.info("10. 获取群好友及群好友列表");
+        loginService.WebWxBatchGetContact();
+
+        LOG.info("11. 缓存本次登陆好友相关消息");
+        WechatTools.setUserInfo(); // 登陆成功后缓存本次登陆好友相关消息(NickName, UserName)
+
+        LOG.info("12.开启微信状态检测线程");
+        new Thread(new CheckLoginStatusThread()).start();
+    }
 }

+ 14 - 68
ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/controller/FaceController.java

@@ -1,36 +1,22 @@
 package com.xmzs.midjourney.controller;
 
 import cn.hutool.json.JSONUtil;
-import com.xmzs.common.chat.constant.OpenAIConst;
-import com.xmzs.common.core.domain.model.LoginUser;
-import com.xmzs.common.core.exception.base.BaseException;
-import com.xmzs.common.satoken.utils.LoginHelper;
 import com.xmzs.midjourney.domain.InsightFace;
-import com.xmzs.system.domain.bo.ChatMessageBo;
-import com.xmzs.system.service.IChatMessageService;
-import com.xmzs.system.service.IChatService;
-import com.xmzs.system.service.ISseService;
+import com.xmzs.midjourney.domain.MjPriceConfig;
+import com.xmzs.midjourney.util.MjOkHttpUtil;
+
+import com.xmzs.system.service.IChatCostService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import okhttp3.MediaType;
-import okhttp3.OkHttpClient;
 import okhttp3.Request;
-import okhttp3.Response;
-import okio.Buffer;
-import okio.BufferedSink;
-import okio.GzipSink;
-import okio.Okio;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
+import org.apache.commons.lang3.math.NumberUtils;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.io.IOException;
-import java.util.concurrent.TimeUnit;
 
 @Api(tags = "任务查询")
 @RestController
@@ -39,62 +25,22 @@ import java.util.concurrent.TimeUnit;
 @Slf4j
 public class FaceController {
 
-    @Value("${chat.apiKey}")
-    private String apiKey;
-    @Value("${chat.apiHost}")
-    private String apiHost;
+    private final IChatCostService chatCostService;
 
-    @Autowired
-    private IChatService chatService;
+    private final MjOkHttpUtil mjOkHttpUtil;
 
-    @Autowired
-    private ISseService sseService;
+    private final MjPriceConfig priceConfig;
 
     @ApiOperation(value = "换脸")
     @PostMapping("/insight-face/swap")
     public String insightFace(@RequestBody InsightFace insightFace) {
-        // 查询是否是付费用户
-        sseService.checkUserGrade();
-        // 扣除接口费用
-        chatService.mjTaskDeduct("换脸", OpenAIConst.MJ_COST_TYPE2);
-        OkHttpClient client = new OkHttpClient.Builder()
-            .connectTimeout(30, TimeUnit.SECONDS) // 连接超时时间
-            .writeTimeout(30, TimeUnit.SECONDS)   // 写入超时时间
-            .readTimeout(30, TimeUnit.SECONDS)    // 读取超时时间
-            .build();
-        // 创建一个Request对象来配置你的请求
+        // 扣除接口费用并且保存消息记录
+        chatCostService.taskDeduct("mj","换脸", NumberUtils.toDouble(priceConfig.getFaceSwapping(), 0.3));
         // 创建请求体(这里使用JSON作为媒体类型)
-        String jsonStr = JSONUtil.toJsonStr(insightFace);
-
-        MediaType JSON = MediaType.get("application/json; charset=utf-8");
-        okhttp3.RequestBody body = okhttp3.RequestBody.create(jsonStr, JSON);
-        Buffer buffer = new Buffer();
-        GzipSink gzipSink = new GzipSink(buffer);
-        BufferedSink gzipBufferedSink = Okio.buffer(gzipSink);
-        try {
-            body.writeTo(gzipBufferedSink);
-            gzipBufferedSink.close();
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-
-        // 创建POST请求
-        Request request = new Request.Builder()
-            .header("mj-api-secret", apiKey)
-            .header("Content-Encoding", "gzip")
-            .url(apiHost + "mj/insight-face/swap") // 替换为你的URL
-            .post(body)
-            .build();
-
-        try (Response response = client.newCall(request).execute()) {
-            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
-            if (response.body() != null) {
-                return response.body().string();
-            }
-        } catch (IOException e) {
-            log.error("换脸失败! {}", e.getMessage());
-        }
-        return null;
+        String insightFaceJson = JSONUtil.toJsonStr(insightFace);
+        String url = "mj/insight-face/swap";
+        Request request = mjOkHttpUtil.createPostRequest(url, insightFaceJson);
+        return mjOkHttpUtil.executeRequest(request);
     }
 
 }

+ 89 - 297
ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/controller/SubmitController.java

@@ -1,61 +1,24 @@
 package com.xmzs.midjourney.controller;
 
-import cn.hutool.core.text.CharSequenceUtil;
-import cn.hutool.core.util.RandomUtil;
 import cn.hutool.json.JSONUtil;
-import com.xmzs.common.chat.constant.OpenAIConst;
-import com.xmzs.common.core.domain.model.LoginUser;
-import com.xmzs.common.core.exception.base.BaseException;
-import com.xmzs.common.satoken.utils.LoginHelper;
-import com.xmzs.midjourney.Constants;
-import com.xmzs.midjourney.ProxyProperties;
-import com.xmzs.midjourney.ReturnCode;
+import com.xmzs.midjourney.domain.MjPriceConfig;
 import com.xmzs.midjourney.dto.*;
-import com.xmzs.midjourney.enums.TaskAction;
-import com.xmzs.midjourney.enums.TaskStatus;
-import com.xmzs.midjourney.enums.TranslateWay;
-import com.xmzs.midjourney.exception.BannedPromptException;
-import com.xmzs.midjourney.result.SubmitResultVO;
-import com.xmzs.midjourney.service.TaskService;
-import com.xmzs.midjourney.service.TaskStoreService;
-import com.xmzs.midjourney.service.TranslateService;
-import com.xmzs.midjourney.support.Task;
-import com.xmzs.midjourney.support.TaskCondition;
-import com.xmzs.midjourney.util.BannedPromptUtils;
-import com.xmzs.midjourney.util.ConvertUtils;
-import com.xmzs.midjourney.util.MimeTypeUtils;
-import com.xmzs.midjourney.util.SnowFlake;
-import com.xmzs.midjourney.util.TaskChangeParams;
-import com.xmzs.system.domain.bo.ChatMessageBo;
-import com.xmzs.system.service.IChatMessageService;
-import com.xmzs.system.service.IChatService;
-import com.xmzs.system.service.ISseService;
-import eu.maxschuster.dataurl.DataUrl;
-import eu.maxschuster.dataurl.DataUrlSerializer;
-import eu.maxschuster.dataurl.IDataUrlSerializer;
+import com.xmzs.midjourney.enums.ActionType;
+import com.xmzs.midjourney.util.*;
+import com.xmzs.system.service.IChatCostService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import okhttp3.OkHttpClient;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
+import okhttp3.Request;
+import org.apache.commons.lang3.math.NumberUtils;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
 
-import okhttp3.*;
+import java.util.Optional;
 
 @Api(tags = "任务提交")
 @RestController
@@ -63,285 +26,114 @@ import okhttp3.*;
 @RequiredArgsConstructor
 @Slf4j
 public class SubmitController {
-    private final TranslateService translateService;
-    private final ProxyProperties properties;
-    private final TaskService taskService;
-    private final TaskStoreService taskStoreService;
-    @Value("${chat.apiKey}")
-    private String apiKey;
-    @Value("${chat.apiHost}")
-    private String apiHost;
-    @Autowired
-    private IChatService chatService;
-    @Autowired
-    private IChatMessageService chatMessageService;
-    @Autowired
-    private ISseService sseService;
 
-    @ApiOperation(value = "提交Imagine任务")
-    @PostMapping("/imagine")
-    public SubmitResultVO imagine(@RequestBody SubmitImagineDTO imagineDTO) {
-        String prompt = imagineDTO.getPrompt();
-        if (CharSequenceUtil.isBlank(prompt)) {
-            return SubmitResultVO.fail(ReturnCode.VALIDATION_ERROR, "prompt不能为空");
-        }
-        prompt = prompt.trim();
-        Task task = newTask(imagineDTO);
-        task.setAction(TaskAction.IMAGINE);
-        task.setPrompt(prompt);
-        String promptEn = translatePrompt(prompt);
-        try {
-            BannedPromptUtils.checkBanned(promptEn);
-        } catch (BannedPromptException e) {
-            return SubmitResultVO.fail(ReturnCode.BANNED_PROMPT, "可能包含敏感词")
-                .setProperty("promptEn", promptEn).setProperty("bannedWord", e.getMessage());
-        }
-        List<String> base64Array = Optional.ofNullable(imagineDTO.getBase64Array()).orElse(new ArrayList<>());
-        if (CharSequenceUtil.isNotBlank(imagineDTO.getBase64())) {
-            base64Array.add(imagineDTO.getBase64());
-        }
-        List<DataUrl> dataUrls;
-        try {
-            dataUrls = ConvertUtils.convertBase64Array(base64Array);
-        } catch (MalformedURLException e) {
-            return SubmitResultVO.fail(ReturnCode.VALIDATION_ERROR, "base64格式错误");
-        }
-        task.setPromptEn(promptEn);
-        task.setDescription("/imagine " + prompt);
-        return this.taskService.submitImagine(task, dataUrls);
-    }
+    private final MjPriceConfig priceConfig;
 
-    @ApiOperation(value = "绘图变化-simple")
-    @PostMapping("/simple-change")
-    public SubmitResultVO simpleChange(@RequestBody SubmitSimpleChangeDTO simpleChangeDTO) {
-        TaskChangeParams changeParams = ConvertUtils.convertChangeParams(simpleChangeDTO.getContent());
-        if (changeParams == null) {
-            return SubmitResultVO.fail(ReturnCode.VALIDATION_ERROR, "content参数错误");
-        }
-        SubmitChangeDTO changeDTO = new SubmitChangeDTO();
-        changeDTO.setAction(changeParams.getAction());
-        changeDTO.setTaskId(changeParams.getId());
-        changeDTO.setIndex(changeParams.getIndex());
-        changeDTO.setState(simpleChangeDTO.getState());
-        changeDTO.setNotifyHook(simpleChangeDTO.getNotifyHook());
-        return change(changeDTO);
-    }
+    private final IChatCostService chatCostService;
+
+    private final MjOkHttpUtil mjOkHttpUtil;
 
     @ApiOperation(value = "绘图变化")
     @PostMapping("/change")
-    public SubmitResultVO change(@RequestBody SubmitChangeDTO changeDTO) {
-        if (CharSequenceUtil.isBlank(changeDTO.getTaskId())) {
-            return SubmitResultVO.fail(ReturnCode.VALIDATION_ERROR, "taskId不能为空");
-        }
-        if (!Set.of(TaskAction.UPSCALE, TaskAction.VARIATION, TaskAction.REROLL).contains(changeDTO.getAction())) {
-            return SubmitResultVO.fail(ReturnCode.VALIDATION_ERROR, "action参数错误");
-        }
-        String description = "/up " + changeDTO.getTaskId();
-        if (TaskAction.REROLL.equals(changeDTO.getAction())) {
-            description += " R";
-        } else {
-            description += " " + changeDTO.getAction().name().charAt(0) + changeDTO.getIndex();
-        }
-        if (TaskAction.UPSCALE.equals(changeDTO.getAction())) {
-            TaskCondition condition = new TaskCondition().setDescription(description);
-            Task existTask = this.taskStoreService.findOne(condition);
-            if (existTask != null) {
-                return SubmitResultVO.of(ReturnCode.EXISTED, "任务已存在", existTask.getId())
-                    .setProperty("status", existTask.getStatus())
-                    .setProperty("imageUrl", existTask.getImageUrl());
-            }
-        }
-        Task targetTask = this.taskStoreService.get(changeDTO.getTaskId());
-        if (targetTask == null) {
-            return SubmitResultVO.fail(ReturnCode.NOT_FOUND, "关联任务不存在或已失效");
-        }
-        if (!TaskStatus.SUCCESS.equals(targetTask.getStatus())) {
-            return SubmitResultVO.fail(ReturnCode.VALIDATION_ERROR, "关联任务状态错误");
-        }
-        if (!Set.of(TaskAction.IMAGINE, TaskAction.VARIATION, TaskAction.REROLL, TaskAction.BLEND).contains(targetTask.getAction())) {
-            return SubmitResultVO.fail(ReturnCode.VALIDATION_ERROR, "关联任务不允许执行变化");
-        }
-        Task task = newTask(changeDTO);
-        task.setAction(changeDTO.getAction());
-        task.setPrompt(targetTask.getPrompt());
-        task.setPromptEn(targetTask.getPromptEn());
-        task.setProperty(Constants.TASK_PROPERTY_FINAL_PROMPT, targetTask.getProperty(Constants.TASK_PROPERTY_FINAL_PROMPT));
-        task.setProperty(Constants.TASK_PROPERTY_PROGRESS_MESSAGE_ID, targetTask.getProperty(Constants.TASK_PROPERTY_MESSAGE_ID));
-        task.setProperty(Constants.TASK_PROPERTY_DISCORD_INSTANCE_ID, targetTask.getProperty(Constants.TASK_PROPERTY_DISCORD_INSTANCE_ID));
-        task.setDescription(description);
-        int messageFlags = targetTask.getPropertyGeneric(Constants.TASK_PROPERTY_FLAGS);
-        String messageId = targetTask.getPropertyGeneric(Constants.TASK_PROPERTY_MESSAGE_ID);
-        String messageHash = targetTask.getPropertyGeneric(Constants.TASK_PROPERTY_MESSAGE_HASH);
-        if (TaskAction.UPSCALE.equals(changeDTO.getAction())) {
-            return this.taskService.submitUpscale(task, messageId, messageHash, changeDTO.getIndex(), messageFlags);
-            } else if (TaskAction.VARIATION.equals(changeDTO.getAction())) {
-            return this.taskService.submitVariation(task, messageId, messageHash, changeDTO.getIndex(), messageFlags);
-        } else {
-            return this.taskService.submitReroll(task, messageId, messageHash, messageFlags);
-        }
+    public String change(@RequestBody SubmitChangeDTO changeDTO) {
+        String jsonStr = JSONUtil.toJsonStr(changeDTO);
+        String url = "mj/submit/change";
+        Request request = mjOkHttpUtil.createPostRequest(url, jsonStr);
+        return mjOkHttpUtil.executeRequest(request);
     }
 
-    @ApiOperation(value = "绘图变化")
+    @ApiOperation(value = "执行动作")
     @PostMapping("/action")
     public String action(@RequestBody SubmitActionDTO changeDTO) {
-        // 查询是否是付费用户
-        sseService.checkUserGrade();
-        // 扣除接口费用
-        if ("upsample".equals(getAction(changeDTO.getCustomId()))) {
-            mjTaskDeduct("放大", OpenAIConst.MJ_COST_TYPE2);
-        } else {
-            // Inpaint: 局部重绘
-            // reroll 重绘
-            // upsample 放大
-            // zoom 变焦
-            // upscale 高清放大
-            // variation 变化
-            if (!"Inpaint".equals(getAction(changeDTO.getCustomId()))) {
-                mjTaskDeduct("变化", OpenAIConst.MJ_COST_TYPE1);
-            }
-        }
-        OkHttpClient client = new OkHttpClient.Builder()
-            .connectTimeout(30, TimeUnit.SECONDS) // 连接超时时间
-            .writeTimeout(30, TimeUnit.SECONDS)   // 写入超时时间
-            .readTimeout(30, TimeUnit.SECONDS)    // 读取超时时间
-            .build();
+        ActionType actionType = ActionType.fromCustomId(getAction(changeDTO.getCustomId()));
+        Optional.ofNullable(actionType).ifPresentOrElse(
+            type -> {
+                switch (type) {
+                    case UP_SAMPLE:
+                        chatCostService.taskDeduct("mj","放大", NumberUtils.toDouble(priceConfig.getUpsample(), 0.1));
+                        break;
+                    case IN_PAINT:
+                        // 局部重绘已经扣费,不执行任何操作
+                        break;
+                    default:
+                        chatCostService.taskDeduct("mj","变化", NumberUtils.toDouble(priceConfig.getChange(), 0.3));
+                        break;
+                }
+            },
+            () -> chatCostService.taskDeduct("mj","变化", NumberUtils.toDouble(priceConfig.getChange(), 0.3))
+        );
 
         String jsonStr = JSONUtil.toJsonStr(changeDTO);
-
-        MediaType mediaType = MediaType.parse("application/json");
-        okhttp3.RequestBody body = okhttp3.RequestBody.create(jsonStr, mediaType);
-        Request request = new Request.Builder()
-            .url(apiHost + "mj/submit/action")
-            .method("POST", body)
-            .header("mj-api-secret", apiKey) // 设置Authorization header
-            .build();
-        try {
-            Response response = client.newCall(request).execute();
-            return response.body().string();
-        } catch (IOException e) {
-            log.error("绘图变化失败:{}", e.getMessage());
-        }
-        return null;
+        String url = "mj/submit/action";
+        Request request = mjOkHttpUtil.createPostRequest(url, jsonStr);
+        return mjOkHttpUtil.executeRequest(request);
     }
 
-    public String getAction(String customId) {
-        // 检查 customId 是否为空
-        if(customId == null || customId.isEmpty()) {
-            return null;
-        }
-        // 使用 "::" 分割字符串
-        String[] parts = customId.split("::");
-        // "MJ", "Inpaint", "1", "4fca7c14-181c-4...", "SOLO"
-        if(customId.endsWith("SOLO")) {
-            return parts[1];
-        }
-        // 返回 "upsample" 值,假设它总是在第三个位置
-        return parts[2];
+    @ApiOperation(value = "绘图变化-simple")
+    @PostMapping("/simple-change")
+    public String simpleChange(@RequestBody SubmitSimpleChangeDTO simpleChangeDTO) {
+        String jsonStr = JSONUtil.toJsonStr(simpleChangeDTO);
+        String url = "mj/submit/simple-change";
+        Request request = mjOkHttpUtil.createPostRequest(url, jsonStr);
+        return mjOkHttpUtil.executeRequest(request);
     }
 
-    public void mjTaskDeduct(String prompt, double cost) {
-        //扣除费用
-        chatService.deductUserBalance(getUserId(), cost);
-        // 保存消息记录
-        ChatMessageBo chatMessageBo = new ChatMessageBo();
-        chatMessageBo.setUserId(getUserId());
-        chatMessageBo.setModelName("mj");
-        chatMessageBo.setContent(prompt);
-        chatMessageBo.setDeductCost(cost);
-        chatMessageBo.setTotalTokens(0);
-        chatMessageService.insertByBo(chatMessageBo);
+    @ApiOperation(value = "提交图生图、混图任务")
+    @PostMapping("/blend")
+    public String blend(@RequestBody SubmitBlendDTO blendDTO) {
+        chatCostService.taskDeduct("mj","图生图", NumberUtils.toDouble(priceConfig.getBlend(), 0.3));
+        String jsonStr = JSONUtil.toJsonStr(blendDTO);
+        String url = "mj/submit/blend";
+        Request request = mjOkHttpUtil.createPostRequest(url, jsonStr);
+        return mjOkHttpUtil.executeRequest(request);
     }
 
-    /**
-     * 获取用户Id
-     *
-     * @return
-     */
-    public Long getUserId() {
-        LoginUser loginUser = LoginHelper.getLoginUser();
-        if (loginUser == null) {
-            throw new BaseException("用户未登录!");
-        }
-        return loginUser.getUserId();
+    @ApiOperation(value = "提交图生文任务")
+    @PostMapping("/describe")
+    public String describe(@RequestBody SubmitDescribeDTO describeDTO) {
+        chatCostService.taskDeduct("mj","图生文", NumberUtils.toDouble(priceConfig.getDescribe(), 0.1));
+        String jsonStr = JSONUtil.toJsonStr(describeDTO);
+        String url = "mj/submit/describe";
+        Request request = mjOkHttpUtil.createPostRequest(url, jsonStr);
+        return mjOkHttpUtil.executeRequest(request);
     }
 
-    @ApiOperation(value = "提交Describe任务")
-    @PostMapping("/describe")
-    public SubmitResultVO describe(@RequestBody SubmitDescribeDTO describeDTO) {
-        if (CharSequenceUtil.isBlank(describeDTO.getBase64())) {
-            return SubmitResultVO.fail(ReturnCode.VALIDATION_ERROR, "base64不能为空");
-        }
-        IDataUrlSerializer serializer = new DataUrlSerializer();
-        DataUrl dataUrl;
-        try {
-            dataUrl = serializer.unserialize(describeDTO.getBase64());
-        } catch (MalformedURLException e) {
-            return SubmitResultVO.fail(ReturnCode.VALIDATION_ERROR, "base64格式错误");
-        }
-        Task task = newTask(describeDTO);
-        task.setAction(TaskAction.DESCRIBE);
-        String taskFileName = task.getId() + "." + MimeTypeUtils.guessFileSuffix(dataUrl.getMimeType());
-        task.setDescription("/describe " + taskFileName);
-        return this.taskService.submitDescribe(task, dataUrl);
+    @ApiOperation(value = "提交文生图任务")
+    @PostMapping("/imagine")
+    public String imagine(@RequestBody SubmitImagineDTO imagineDTO) {
+        chatCostService.taskDeduct("mj",imagineDTO.getPrompt(), NumberUtils.toDouble(priceConfig.getImagine(), 0.3));
+        String jsonStr = JSONUtil.toJsonStr(imagineDTO);
+        String url = "mj/submit/imagine";
+        Request request = mjOkHttpUtil.createPostRequest(url, jsonStr);
+        return mjOkHttpUtil.executeRequest(request);
     }
 
-    @ApiOperation(value = "提交Blend任务")
-    @PostMapping("/blend")
-    public SubmitResultVO blend(@RequestBody SubmitBlendDTO blendDTO) {
-        List<String> base64Array = blendDTO.getBase64Array();
-        if (base64Array == null || base64Array.size() < 2 || base64Array.size() > 5) {
-            return SubmitResultVO.fail(ReturnCode.VALIDATION_ERROR, "base64List参数错误");
-        }
-        if (blendDTO.getDimensions() == null) {
-            return SubmitResultVO.fail(ReturnCode.VALIDATION_ERROR, "dimensions参数错误");
-        }
-        IDataUrlSerializer serializer = new DataUrlSerializer();
-        List<DataUrl> dataUrlList = new ArrayList<>();
-        try {
-            for (String base64 : base64Array) {
-                DataUrl dataUrl = serializer.unserialize(base64);
-                dataUrlList.add(dataUrl);
-            }
-        } catch (MalformedURLException e) {
-            return SubmitResultVO.fail(ReturnCode.VALIDATION_ERROR, "base64格式错误");
-        }
-        Task task = newTask(blendDTO);
-        task.setAction(TaskAction.BLEND);
-        task.setDescription("/blend " + task.getId() + " " + dataUrlList.size());
-        return this.taskService.submitBlend(task, dataUrlList, blendDTO.getDimensions());
+    @ApiOperation(value = "提交局部重绘任务")
+    @PostMapping("/modal")
+    public String modal(@RequestBody SubmitModalDTO submitModalDTO) {
+        chatCostService.taskDeduct("mj","局部重绘", NumberUtils.toDouble(priceConfig.getInpaint(), 0.1));
+        String jsonStr = JSONUtil.toJsonStr(submitModalDTO);
+        String url = "mj/submit/modal";
+        Request request = mjOkHttpUtil.createPostRequest(url, jsonStr);
+        return mjOkHttpUtil.executeRequest(request);
     }
 
-    private Task newTask(BaseSubmitDTO base) {
-        Task task = new Task();
-        task.setId(System.currentTimeMillis() + RandomUtil.randomNumbers(3));
-        task.setSubmitTime(System.currentTimeMillis());
-        task.setState(base.getState());
-        String notifyHook = CharSequenceUtil.isBlank(base.getNotifyHook()) ? this.properties.getNotifyHook() : base.getNotifyHook();
-        task.setProperty(Constants.TASK_PROPERTY_NOTIFY_HOOK, notifyHook);
-        task.setProperty(Constants.TASK_PROPERTY_NONCE, SnowFlake.INSTANCE.nextId());
-        return task;
+    @ApiOperation(value = "提交提示词分析任务")
+    @PostMapping("/shorten")
+    public String shorten(@RequestBody SubmitShortenDTO submitShortenDTO) {
+        chatCostService.taskDeduct("mj","提示词分析", NumberUtils.toDouble(priceConfig.getShorten(), 0.1));
+        String jsonStr = JSONUtil.toJsonStr(submitShortenDTO);
+        String url = "mj/submit/shorten";
+        Request request = mjOkHttpUtil.createPostRequest(url, jsonStr);
+        return mjOkHttpUtil.executeRequest(request);
     }
 
-    private String translatePrompt(String prompt) {
-        if (TranslateWay.NULL.equals(this.properties.getTranslateWay()) || CharSequenceUtil.isBlank(prompt)) {
-            return prompt;
-        }
-        List<String> imageUrls = new ArrayList<>();
-        Matcher imageMatcher = Pattern.compile("https?://[a-z0-9-_:@&?=+,.!/~*'%$]+\\x20+", Pattern.CASE_INSENSITIVE).matcher(prompt);
-        while (imageMatcher.find()) {
-            imageUrls.add(imageMatcher.group(0));
-        }
-        String paramStr = "";
-        Matcher paramMatcher = Pattern.compile("\\x20+-{1,2}[a-z]+.*$", Pattern.CASE_INSENSITIVE).matcher(prompt);
-        if (paramMatcher.find()) {
-            paramStr = paramMatcher.group(0);
-        }
-        String imageStr = CharSequenceUtil.join("", imageUrls);
-        String text = prompt.substring(imageStr.length(), prompt.length() - paramStr.length());
-        if (CharSequenceUtil.isNotBlank(text)) {
-            text = this.translateService.translateToEnglish(text).trim();
+    public String getAction(String customId) {
+        if (customId == null || customId.isEmpty()) {
+            return null;
         }
-        return imageStr + text + paramStr;
+        String[] parts = customId.split("::");
+        return customId.endsWith("SOLO") ? parts[1] : parts[2];
     }
 
 }

+ 20 - 63
ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/controller/TaskController.java

@@ -1,32 +1,15 @@
 package com.xmzs.midjourney.controller;
 
-import cn.hutool.core.comparator.CompareUtil;
 import cn.hutool.json.JSONUtil;
-import com.xmzs.midjourney.dto.SubmitImagineDTO;
+import com.xmzs.midjourney.util.MjOkHttpUtil;
 import com.xmzs.midjourney.dto.TaskConditionDTO;
-import com.xmzs.midjourney.loadbalancer.DiscordLoadBalancer;
-import com.xmzs.midjourney.result.SubmitResultVO;
-import com.xmzs.midjourney.service.TaskStoreService;
-import com.xmzs.midjourney.support.Task;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import okhttp3.*;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Objects;
+import okhttp3.Request;
+import org.springframework.web.bind.annotation.*;
 
 @Api(tags = "任务查询")
 @RestController
@@ -34,58 +17,32 @@ import java.util.Objects;
 @RequiredArgsConstructor
 @Slf4j
 public class TaskController {
-	private final TaskStoreService taskStoreService;
-	private final DiscordLoadBalancer discordLoadBalancer;
 
-    @Value("${chat.apiKey}")
-    private String apiKey;
-    @Value("${chat.apiHost}")
-    private String apiHost;
+    private final MjOkHttpUtil mjOkHttpUtil;
 
 	@ApiOperation(value = "指定ID获取任务")
 	@GetMapping("/{id}/fetch")
     public String fetch(@ApiParam(value = "任务ID") @PathVariable String id) {
-        OkHttpClient client = new OkHttpClient();
-        // 创建一个Request对象来配置你的请求
-        Request request = new Request.Builder()
-            .header("mj-api-secret", apiKey) // 设置Authorization header
-            .url(apiHost+"mj/task/" + id + "/fetch")
-            .build();
-        try (Response response = client.newCall(request).execute()) {
-            if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);
-            if (response.body() != null) {
-                return response.body().string();
-            }
-        } catch (IOException e) {
-            log.error("任务:{}查询失败:{}",id,e.getMessage());
-        }
-        return null;
+        String url = "mj/task/" + id + "/fetch";
+        Request request = mjOkHttpUtil.createGetRequest(url);
+        return mjOkHttpUtil.executeRequest(request);
     }
 
-	@ApiOperation(value = "查询任务队列")
-	@GetMapping("/queue")
-	public List<Task> queue() {
-		return this.discordLoadBalancer.getQueueTaskIds().stream()
-				.map(this.taskStoreService::get).filter(Objects::nonNull)
-				.sorted(Comparator.comparing(Task::getSubmitTime))
-				.toList();
-	}
-
-	@ApiOperation(value = "查询所有任务")
-	@GetMapping("/list")
-	public List<Task> list() {
-		return this.taskStoreService.list().stream()
-				.sorted((t1, t2) -> CompareUtil.compare(t2.getSubmitTime(), t1.getSubmitTime()))
-				.toList();
-	}
-
 	@ApiOperation(value = "根据ID列表查询任务")
 	@PostMapping("/list-by-condition")
-	public List<Task> listByIds(@RequestBody TaskConditionDTO conditionDTO) {
-		if (conditionDTO.getIds() == null) {
-			return Collections.emptyList();
-		}
-		return conditionDTO.getIds().stream().map(this.taskStoreService::get).filter(Objects::nonNull).toList();
+	public String listByIds(@RequestBody TaskConditionDTO conditionDTO) {
+        String url = "mj/task/list-by-condition";
+        String conditionJson = JSONUtil.toJsonStr(conditionDTO);
+        Request request = mjOkHttpUtil.createPostRequest(url,conditionJson);
+        return mjOkHttpUtil.executeRequest(request);
 	}
 
+    @ApiOperation(value = "获取任务图片的seed")
+    @GetMapping("/{id}/image-seed")
+    public String getSeed(@ApiParam(value = "任务ID") @PathVariable String id) {
+        String url = "mj/task/" + id + "/image-seed";
+        Request request = mjOkHttpUtil.createGetRequest(url);
+        return mjOkHttpUtil.executeRequest(request);
+    }
+
 }

+ 56 - 0
ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/domain/MjPriceConfig.java

@@ -0,0 +1,56 @@
+package com.xmzs.midjourney.domain;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 绘画费用信息
+ *
+ * @author Admin
+ */
+@Data
+@Component
+@ConfigurationProperties(prefix = "mj")
+public class MjPriceConfig {
+    /**
+     * 放大图像
+     */
+    private String upsample;
+
+    /**
+     * 变化
+     */
+    private String change;
+
+    /**
+     * 图生图
+     */
+    private String blend;
+
+    /**
+     * 图生文
+     */
+    private String describe;
+
+    /**
+     * 文生图
+     */
+    private String imagine;
+
+    /**
+     * 局部重绘
+     */
+    private String inpaint;
+
+    /**
+     * 提示词分析
+     */
+    private String shorten;
+
+    /**
+     * 换脸
+     */
+    private String faceSwapping;
+
+}

+ 0 - 3
ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/dto/SubmitActionDTO.java

@@ -1,10 +1,7 @@
 package com.xmzs.midjourney.dto;
 
-import com.xmzs.midjourney.enums.TaskAction;
 import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
-import lombok.EqualsAndHashCode;
 
 
 @Data

+ 19 - 0
ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/dto/SubmitModalDTO.java

@@ -0,0 +1,19 @@
+package com.xmzs.midjourney.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("局部重绘提交参数")
+public class SubmitModalDTO extends BaseSubmitDTO{
+
+	private String maskBase64;
+
+	private String taskId;
+
+    private String prompt;
+
+}

+ 17 - 0
ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/dto/SubmitShortenDTO.java

@@ -0,0 +1,17 @@
+package com.xmzs.midjourney.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ApiModel("prompt分析提交参数")
+public class SubmitShortenDTO extends BaseSubmitDTO{
+
+	private String botType;
+
+    private String prompt;
+
+}

+ 32 - 0
ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/enums/ActionType.java

@@ -0,0 +1,32 @@
+package com.xmzs.midjourney.enums;
+
+import lombok.Getter;
+
+/**
+ * @author WangLe
+ */
+@Getter
+public enum ActionType {
+    IN_PAINT("Inpaint"),   // 局部重绘操作
+    RE_ROLL("reroll"),     // 重绘操作
+    UP_SAMPLE("upsample"), // 放大操作
+    ZOOM("zoom"),         // 变焦操作
+    UPSCALE("upscale"),   // 高清放大操作
+    VARIATION("variation"); // 变化操作
+
+    private final String action;
+
+    ActionType(String action) {
+        this.action = action;
+    }
+
+    public static ActionType fromCustomId(String customId) {
+        for (ActionType type : values()) {
+            if (type.getAction().equals(customId)) {
+                return type;
+            }
+        }
+        return null;
+    }
+}
+

+ 3 - 3
ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/enums/BlendDimensions.java

@@ -1,6 +1,9 @@
 package com.xmzs.midjourney.enums;
 
 
+import lombok.Getter;
+
+@Getter
 public enum BlendDimensions {
 
 	PORTRAIT("2:3"),
@@ -15,7 +18,4 @@ public enum BlendDimensions {
 		this.value = value;
 	}
 
-	public String getValue() {
-		return this.value;
-	}
 }

+ 65 - 0
ruoyi-modules/ruoyi-midjourney/src/main/java/com/xmzs/midjourney/util/MjOkHttpUtil.java

@@ -0,0 +1,65 @@
+package com.xmzs.midjourney.util;
+
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author WangLe
+ */
+@RequiredArgsConstructor
+@Component
+@Slf4j
+public class MjOkHttpUtil {
+
+    @Value("${chat.apiKey}")
+    private List<String> apiKey;
+    @Value("${chat.apiHost}")
+    private String apiHost;
+
+    private static final String API_SECRET_HEADER = "mj-api-secret";
+
+    private final OkHttpClient client = new OkHttpClient.Builder()
+        .connectTimeout(300, TimeUnit.SECONDS)
+        .writeTimeout(300, TimeUnit.SECONDS)
+        .readTimeout(300, TimeUnit.SECONDS)
+        .build();
+
+    public String executeRequest(Request request) {
+        try (Response response = client.newCall(request).execute()) {
+            if (!response.isSuccessful()) {
+                throw new IOException("Unexpected code " + response);
+            }
+            return response.body() != null ? response.body().string() : null;
+        } catch (IOException e) {
+            // 这里应根据实际情况使用适当的日志记录方式
+            log.error("请求失败: {}",e.getMessage());
+            return null;
+        }
+    }
+
+    public Request createPostRequest(String url, String json) {
+        MediaType JSON = MediaType.get("application/json; charset=utf-8");
+        RequestBody body = RequestBody.create(json, JSON);
+        return new Request.Builder()
+            .url(apiHost + url)
+            .post(body)
+            .header(API_SECRET_HEADER, apiKey.get(0))
+            .build();
+    }
+
+    public Request createGetRequest(String url) {
+        return new Request.Builder()
+            .url(apiHost + url)
+            .header(API_SECRET_HEADER, apiKey.get(0))
+            .build();
+    }
+
+}
+

+ 114 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/controller/system/SysModelController.java

@@ -0,0 +1,114 @@
+package com.xmzs.system.controller.system;
+
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import com.xmzs.common.core.domain.R;
+import com.xmzs.common.core.validate.AddGroup;
+import com.xmzs.common.core.validate.EditGroup;
+import com.xmzs.common.excel.utils.ExcelUtil;
+import com.xmzs.common.idempotent.annotation.RepeatSubmit;
+import com.xmzs.common.log.annotation.Log;
+import com.xmzs.common.log.enums.BusinessType;
+import com.xmzs.common.mybatis.core.page.PageQuery;
+import com.xmzs.common.mybatis.core.page.TableDataInfo;
+import com.xmzs.common.web.core.BaseController;
+import com.xmzs.system.domain.bo.SysModelBo;
+import com.xmzs.system.domain.vo.SysModelVo;
+import com.xmzs.system.service.ISysModelService;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
+import lombok.RequiredArgsConstructor;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 系统模型
+ *
+ * @author Lion Li
+ * @date 2024-04-04
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/system/model")
+public class SysModelController extends BaseController {
+
+    private final ISysModelService sysModelService;
+
+    /**
+     * 查询系统模型列表
+     */
+    @GetMapping("/list")
+    public TableDataInfo<SysModelVo> list(SysModelBo bo, PageQuery pageQuery) {
+        return sysModelService.queryPageList(bo, pageQuery);
+    }
+
+    /**
+     * 查询系统模型列表
+     */
+    @GetMapping("/modelList")
+    public R<List<SysModelVo>> modelList(SysModelBo bo) {
+        bo.setModelShow("0");
+        return R.ok(sysModelService.queryList(bo));
+    }
+
+    /**
+     * 导出系统模型列表
+     */
+    @SaCheckPermission("system:model:export")
+    @Log(title = "系统模型", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(SysModelBo bo, HttpServletResponse response) {
+        List<SysModelVo> list = sysModelService.queryList(bo);
+        ExcelUtil.exportExcel(list, "系统模型", SysModelVo.class, response);
+    }
+
+    /**
+     * 获取系统模型详细信息
+     *
+     * @param id 主键
+     */
+    @SaCheckPermission("system:model:query")
+    @GetMapping("/{id}")
+    public R<SysModelVo> getInfo(@NotNull(message = "主键不能为空")
+                                     @PathVariable Long id) {
+        return R.ok(sysModelService.queryById(id));
+    }
+
+    /**
+     * 新增系统模型
+     */
+    @SaCheckPermission("system:model:add")
+    @Log(title = "系统模型", businessType = BusinessType.INSERT)
+    @RepeatSubmit()
+    @PostMapping()
+    public R<Void> add(@Validated(AddGroup.class) @RequestBody SysModelBo bo) {
+        return toAjax(sysModelService.insertByBo(bo));
+    }
+
+    /**
+     * 修改系统模型
+     */
+    @SaCheckPermission("system:model:edit")
+    @Log(title = "系统模型", businessType = BusinessType.UPDATE)
+    @RepeatSubmit()
+    @PutMapping()
+    public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysModelBo bo) {
+        return toAjax(sysModelService.updateByBo(bo));
+    }
+
+    /**
+     * 删除系统模型
+     *
+     * @param ids 主键串
+     */
+    @SaCheckPermission("system:model:remove")
+    @Log(title = "系统模型", businessType = BusinessType.DELETE)
+    @DeleteMapping("/{ids}")
+    public R<Void> remove(@NotEmpty(message = "主键不能为空")
+                          @PathVariable Long[] ids) {
+        return toAjax(sysModelService.deleteWithValidByIds(List.of(ids), true));
+    }
+}

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/domain/PaymentOrders.java

@@ -17,7 +17,7 @@ import java.math.BigDecimal;
  */
 @Data
 @EqualsAndHashCode(callSuper = true)
-@TableName("payment_orders")
+@TableName("sys_pay_order")
 public class PaymentOrders extends BaseEntity {
 
     @Serial

+ 68 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/domain/SysModel.java

@@ -0,0 +1,68 @@
+package com.xmzs.system.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.xmzs.common.mybatis.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 系统模型对象 sys_model
+ *
+ * @author Lion Li
+ * @date 2024-04-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_model")
+public class SysModel extends BaseEntity {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id")
+    private Long id;
+
+    /**
+     * 模型名称
+     */
+    private String modelName;
+
+    /**
+     * 模型描述
+     */
+    private String modelDescribe;
+
+    /**
+     * 模型价格
+     */
+    private double modelPrice;
+
+    /**
+     * 计费类型
+     */
+    private String modelType;
+
+    /**
+     * 是否显示
+     */
+    private String modelShow;
+
+
+    /**
+     * 系统提示词
+     */
+    private String systemPrompt;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 73 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/domain/bo/SysModelBo.java

@@ -0,0 +1,73 @@
+package com.xmzs.system.domain.bo;
+
+import com.xmzs.common.core.validate.AddGroup;
+import com.xmzs.common.core.validate.EditGroup;
+import com.xmzs.common.mybatis.core.domain.BaseEntity;
+import com.xmzs.system.domain.SysModel;
+import io.github.linpeilie.annotations.AutoMapper;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 系统模型业务对象 sys_model
+ *
+ * @author Lion Li
+ * @date 2024-04-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysModel.class, reverseConvertGenerate = false)
+public class SysModelBo extends BaseEntity {
+
+    /**
+     * 主键
+     */
+    @NotNull(message = "主键不能为空", groups = { EditGroup.class })
+    private Long id;
+
+    /**
+     * 模型名称
+     */
+    @NotBlank(message = "模型名称不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String modelName;
+
+
+    /**
+     * 模型描述
+     */
+    @NotBlank(message = "模型描述不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String modelDescribe;
+
+    /**
+     * 模型价格
+     */
+    @NotNull(message = "模型价格不能为空", groups = { AddGroup.class, EditGroup.class })
+    private double modelPrice;
+
+    /**
+     * 计费类型 (1 token扣费; 2 次数扣费 )
+     */
+    @NotBlank(message = "计费类型不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String modelType;
+
+    /**
+     * 模型状态  (0 显示; 1 隐藏 )
+     */
+    private String modelShow;
+
+
+    /**
+     * 系统提示词
+     */
+    private String systemPrompt;
+
+    /**
+     * 备注
+     */
+    @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+    private String remark;
+
+
+}

+ 76 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/domain/vo/SysModelVo.java

@@ -0,0 +1,76 @@
+package com.xmzs.system.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.xmzs.system.domain.SysModel;
+import io.github.linpeilie.annotations.AutoMapper;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+
+/**
+ * 系统模型视图对象 sys_model
+ *
+ * @author Lion Li
+ * @date 2024-04-04
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysModel.class)
+public class SysModelVo implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @ExcelProperty(value = "主键")
+    private Long id;
+
+    /**
+     * 模型名称
+     */
+    @ExcelProperty(value = "模型名称")
+    private String modelName;
+
+
+
+    /**
+     * 模型描述
+     */
+    @ExcelProperty(value = "模型描述")
+    private String modelDescribe;
+
+    /**
+     * 模型价格
+     */
+    @ExcelProperty(value = "模型价格")
+    private double modelPrice;
+
+    /**
+     * 计费类型
+     */
+    @ExcelProperty(value = "计费类型")
+    private String modelType;
+
+    /**
+     * 是否显示
+     */
+    private String modelShow;
+
+
+    /**
+     * 系统提示词
+     */
+    private String systemPrompt;
+
+    /**
+     * 备注
+     */
+    @ExcelProperty(value = "备注")
+    private String remark;
+
+}

+ 20 - 17
ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/listener/SSEEventSourceListener.java

@@ -4,14 +4,16 @@ package com.xmzs.system.listener;
 import cn.hutool.core.collection.CollectionUtil;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.xmzs.common.chat.config.LocalCache;
-import com.xmzs.common.chat.entity.chat.ChatCompletion;
 import com.xmzs.common.chat.entity.chat.ChatCompletionResponse;
 import com.xmzs.common.chat.utils.TikTokensUtil;
 import com.xmzs.common.core.utils.SpringUtils;
 import com.xmzs.common.core.utils.StringUtils;
 import com.xmzs.system.domain.bo.ChatMessageBo;
+import com.xmzs.system.domain.bo.SysModelBo;
+import com.xmzs.system.domain.vo.SysModelVo;
 import com.xmzs.system.service.IChatMessageService;
-import com.xmzs.system.service.IChatService;
+import com.xmzs.system.service.IChatCostService;
+import com.xmzs.system.service.ISysModelService;
 import lombok.RequiredArgsConstructor;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
@@ -24,6 +26,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter;
 
+import java.util.List;
 import java.util.Objects;
 
 /**
@@ -45,7 +48,7 @@ public class SSEEventSourceListener extends EventSourceListener {
     public SSEEventSourceListener(ResponseBodyEmitter emitter) {
         this.emitter = emitter;
     }
-
+    private static final ISysModelService sysModelService = SpringUtils.getBean(ISysModelService.class);
     private String modelName;
     /**
      * {@inheritDoc}
@@ -66,34 +69,34 @@ public class SSEEventSourceListener extends EventSourceListener {
                 //成功响应
                 emitter.complete();
                 if(StringUtils.isNotEmpty(modelName)){
-                    IChatService IChatService = SpringUtils.context().getBean(IChatService.class);
+                    IChatCostService IChatCostService = SpringUtils.context().getBean(IChatCostService.class);
                     IChatMessageService chatMessageService = SpringUtils.context().getBean(IChatMessageService.class);
                     ChatMessageBo chatMessageBo = new ChatMessageBo();
                     chatMessageBo.setModelName(modelName);
                     chatMessageBo.setContent(stringBuffer.toString());
                     Long userId = (Long)LocalCache.CACHE.get("userId");
                     chatMessageBo.setUserId(userId);
-                    if(ChatCompletion.Model.GPT_4_ALL.getName().equals(modelName)
-                        || modelName.startsWith(ChatCompletion.Model.GPT_4_GIZMO.getName())
-                        || modelName.startsWith(ChatCompletion.Model.NET.getName())
-                        || ChatCompletion.Model.GPT_4_VISION_PREVIEW.getName().equals(modelName)
-                        || ChatCompletion.Model.CLAUDE_3_SONNET.getName().equals(modelName)
-                        || ChatCompletion.Model.STABLE_DIFFUSION.getName().equals(modelName)
-                        || ChatCompletion.Model.SUNO_V3.getName().equals(modelName)
-                    ){
-                        chatMessageBo.setDeductCost(0.0);
-                        chatMessageBo.setTotalTokens(0);
+
+                    //查询按次数扣费的模型
+                    SysModelBo sysModelBo = new SysModelBo();
+                    sysModelBo.setModelType("2");
+                    sysModelBo.setModelName(modelName);
+                    List<SysModelVo> sysModelList = sysModelService.queryList(sysModelBo);
+                    if (CollectionUtil.isNotEmpty(sysModelList)){
+                        chatMessageBo.setDeductCost(0d);
+                        chatMessageBo.setRemark("提问时扣费");
                         // 保存消息记录
                         chatMessageService.insertByBo(chatMessageBo);
-                    }else {
-                        // 扣除余额
+                    }else{
                         int tokens = TikTokensUtil.tokens(modelName,stringBuffer.toString());
                         chatMessageBo.setTotalTokens(tokens);
-                        IChatService.deductToken(chatMessageBo);
+                        // 按token扣费并且保存消息记录
+                        IChatCostService.deductToken(chatMessageBo);
                     }
                 }
                 return;
             }
+            // 解析返回内容
             ObjectMapper mapper = new ObjectMapper();
             ChatCompletionResponse completionResponse = mapper.readValue(data, ChatCompletionResponse.class);
             if(completionResponse == null || CollectionUtil.isEmpty(completionResponse.getChoices())){

+ 15 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/mapper/SysModelMapper.java

@@ -0,0 +1,15 @@
+package com.xmzs.system.mapper;
+
+import com.xmzs.common.mybatis.core.mapper.BaseMapperPlus;
+import com.xmzs.system.domain.SysModel;
+import com.xmzs.system.domain.vo.SysModelVo;
+
+/**
+ * 系统模型Mapper接口
+ *
+ * @author Lion Li
+ * @date 2024-04-04
+ */
+public interface SysModelMapper extends BaseMapperPlus<SysModel, SysModelVo> {
+
+}

+ 37 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/service/IChatCostService.java

@@ -0,0 +1,37 @@
+package com.xmzs.system.service;
+
+import com.xmzs.system.domain.bo.ChatMessageBo;
+
+public interface IChatCostService {
+
+    /**
+     * 根据消耗的tokens扣除余额
+     *
+     * @param chatMessageBo
+     * @return 结果
+     */
+
+    void deductToken(ChatMessageBo chatMessageBo);
+
+    /**
+     * 扣除用户的余额
+     *
+     */
+    void deductUserBalance(Long userId, Double numberCost);
+
+
+    /**
+     * 扣除任务费用并且保存记录
+     *
+     * @param type 任务类型
+     * @param prompt 任务描述
+     * @param cost 扣除费用
+     */
+    void taskDeduct(String type,String prompt, double cost);
+
+
+    /**
+     * 判断用户是否付费
+     */
+    void checkUserGrade();
+}

+ 48 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/service/ISysModelService.java

@@ -0,0 +1,48 @@
+package com.xmzs.system.service;
+
+import com.xmzs.common.mybatis.core.page.PageQuery;
+import com.xmzs.common.mybatis.core.page.TableDataInfo;
+import com.xmzs.system.domain.bo.SysModelBo;
+import com.xmzs.system.domain.vo.SysModelVo;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 系统模型Service接口
+ *
+ * @author Lion Li
+ * @date 2024-04-04
+ */
+public interface ISysModelService {
+
+    /**
+     * 查询系统模型
+     */
+    SysModelVo queryById(Long id);
+
+    /**
+     * 查询系统模型列表
+     */
+    TableDataInfo<SysModelVo> queryPageList(SysModelBo bo, PageQuery pageQuery);
+
+    /**
+     * 查询系统模型列表
+     */
+    List<SysModelVo> queryList(SysModelBo bo);
+
+    /**
+     * 新增系统模型
+     */
+    Boolean insertByBo(SysModelBo bo);
+
+    /**
+     * 修改系统模型
+     */
+    Boolean updateByBo(SysModelBo bo);
+
+    /**
+     * 校验并批量删除系统模型信息
+     */
+    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
+}

+ 160 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/service/impl/ChatCostServiceImpl.java

@@ -0,0 +1,160 @@
+package com.xmzs.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.xmzs.common.core.domain.model.LoginUser;
+import com.xmzs.common.core.exception.ServiceException;
+import com.xmzs.common.core.exception.base.BaseException;
+import com.xmzs.common.satoken.utils.LoginHelper;
+import com.xmzs.system.domain.ChatToken;
+import com.xmzs.system.domain.SysUser;
+import com.xmzs.system.domain.bo.ChatMessageBo;
+import com.xmzs.system.domain.bo.SysModelBo;
+import com.xmzs.system.domain.vo.SysModelVo;
+import com.xmzs.system.mapper.SysUserMapper;
+import com.xmzs.system.service.IChatCostService;
+import com.xmzs.system.service.IChatMessageService;
+import com.xmzs.system.service.IChatTokenService;
+import com.xmzs.system.service.ISysModelService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author hncboy
+ * @date 2023/3/22 19:41
+ * 聊天相关业务实现类
+ */
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class ChatCostServiceImpl implements IChatCostService {
+
+    private final SysUserMapper sysUserMapper;
+
+    private final IChatMessageService chatMessageService;
+
+    private final IChatTokenService chatTokenService;
+
+    private final ISysModelService sysModelService;
+
+    /**
+     * 根据消耗的tokens扣除余额
+     *
+     * @param chatMessageBo
+     */
+    public void deductToken(ChatMessageBo chatMessageBo) {
+        // 计算总token数
+        ChatToken chatToken = chatTokenService.queryByUserId(chatMessageBo.getUserId(), chatMessageBo.getModelName());
+        if (chatToken == null) {
+            chatToken = new ChatToken();
+            chatToken.setToken(0);
+        }
+        int totalTokens = chatToken.getToken() + chatMessageBo.getTotalTokens();
+        // 如果总token数大于等于1000,进行费用扣除
+        if (totalTokens >= 1000) {
+            // 计算费用
+            int token1 = totalTokens / 1000;
+            int token2 = totalTokens % 1000;
+            if (token2 > 0) {
+                // 保存剩余tokens
+                chatToken.setToken(token2);
+                chatTokenService.editToken(chatToken);
+            } else {
+                chatTokenService.resetToken(chatMessageBo.getUserId(), chatMessageBo.getModelName());
+            }
+            // 扣除用户余额
+
+            SysModelBo sysModelBo = new SysModelBo();
+            sysModelBo.setModelName(chatMessageBo.getModelName());
+            List<SysModelVo> sysModelList = sysModelService.queryList(sysModelBo);
+            double modelPrice = sysModelList.get(0).getModelPrice();
+            Double numberCost = token1 * modelPrice;
+            deductUserBalance(chatMessageBo.getUserId(), numberCost);
+            chatMessageBo.setDeductCost(numberCost);
+        } else {
+            // 扣除用户余额
+            deductUserBalance(chatMessageBo.getUserId(), 0.0);
+            chatMessageBo.setDeductCost(0d);
+            chatMessageBo.setRemark("不满1kToken,计入下一次!");
+            chatToken.setToken(totalTokens);
+            chatToken.setModelName(chatMessageBo.getModelName());
+            chatToken.setUserId(chatMessageBo.getUserId());
+            chatTokenService.editToken(chatToken);
+        }
+        // 保存消息记录
+        chatMessageService.insertByBo(chatMessageBo);
+    }
+
+
+
+    /**
+     * 从用户余额中扣除费用
+     *
+     * @param userId     用户ID
+     * @param numberCost 要扣除的费用
+     */
+    @Override
+    public void deductUserBalance(Long userId, Double numberCost) {
+        SysUser sysUser = sysUserMapper.selectById(userId);
+        if (sysUser == null) {
+            return;
+        }
+
+        Double userBalance = sysUser.getUserBalance();
+        if (userBalance < numberCost || userBalance == 0) {
+            throw new ServiceException("余额不足,请联系管理员充值!");
+        }
+        sysUserMapper.update(null,
+            new LambdaUpdateWrapper<SysUser>()
+                .set(SysUser::getUserBalance, Math.max(userBalance - numberCost, 0))
+                .eq(SysUser::getUserId, userId));
+    }
+
+
+
+    /**
+     * 扣除任务费用
+     *
+     */
+    @Override
+    public void taskDeduct(String type,String prompt, double cost) {
+        // 判断用户是否付费
+        checkUserGrade();
+        // 扣除费用
+        deductUserBalance(getUserId(), cost);
+        // 保存消息记录
+        ChatMessageBo chatMessageBo = new ChatMessageBo();
+        chatMessageBo.setUserId(getUserId());
+        chatMessageBo.setModelName(type);
+        chatMessageBo.setContent(prompt);
+        chatMessageBo.setDeductCost(cost);
+        chatMessageBo.setTotalTokens(0);
+        chatMessageService.insertByBo(chatMessageBo);
+    }
+
+    /**
+     * 判断用户是否付费
+     */
+    @Override
+    public void checkUserGrade() {
+        SysUser sysUser = sysUserMapper.selectById(getUserId());
+        if("0".equals(sysUser.getUserGrade())){
+            throw new BaseException("免费用户暂时不支持此模型,请切换gpt-3.5-turbo模型或者点击《进入市场选购您的商品》充值后使用!");
+        }
+    }
+
+    /**
+     * 获取用户Id
+     *
+     * @return
+     */
+    public Long getUserId() {
+        LoginUser loginUser = LoginHelper.getLoginUser();
+        if (loginUser == null) {
+            throw new BaseException("用户未登录!");
+        }
+        return loginUser.getUserId();
+    }
+}

+ 63 - 29
ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/service/impl/SseServiceImpl.java

@@ -1,5 +1,6 @@
 package com.xmzs.system.service.impl;
 
+import cn.hutool.core.collection.CollectionUtil;
 import com.xmzs.common.chat.config.LocalCache;
 import com.xmzs.common.chat.constant.OpenAIConst;
 import com.xmzs.common.chat.domain.request.ChatRequest;
@@ -15,14 +16,18 @@ import com.xmzs.common.chat.openai.OpenAiStreamClient;
 import com.xmzs.common.chat.utils.TikTokensUtil;
 import com.xmzs.common.core.domain.model.LoginUser;
 import com.xmzs.common.core.exception.base.BaseException;
+import com.xmzs.common.core.utils.StringUtils;
 import com.xmzs.common.satoken.utils.LoginHelper;
 import com.xmzs.system.domain.SysUser;
 import com.xmzs.system.domain.bo.ChatMessageBo;
+import com.xmzs.system.domain.bo.SysModelBo;
+import com.xmzs.system.domain.vo.SysModelVo;
 import com.xmzs.system.listener.SSEEventSourceListener;
 import com.xmzs.system.mapper.SysUserMapper;
+import com.xmzs.system.service.IChatCostService;
 import com.xmzs.system.service.IChatMessageService;
-import com.xmzs.system.service.IChatService;
 import com.xmzs.system.service.ISseService;
+import com.xmzs.system.service.ISysModelService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import okhttp3.ResponseBody;
@@ -58,13 +63,14 @@ public class SseServiceImpl implements ISseService {
 
     private final OpenAiStreamClient openAiStreamClient;
 
-
-    private final IChatService IChatService;
+    private final IChatCostService chatService;
 
     private final SysUserMapper sysUserMapper;
 
     private final IChatMessageService chatMessageService;
 
+    private final ISysModelService sysModelService;
+
     @Value("${chat.apiKey}")
     private String apiKey;
     @Value("${chat.apiHost}")
@@ -91,33 +97,35 @@ public class SseServiceImpl implements ISseService {
                 // 判断用户是否付费
                 checkUserGrade();
             }
-            // 按次数扣费
-            if(ChatCompletion.Model.GPT_4_ALL.getName().equals(chatRequest.getModel())
-                || chatRequest.getModel().startsWith(ChatCompletion.Model.GPT_4_GIZMO.getName())
-                || chatRequest.getModel().startsWith(ChatCompletion.Model.NET.getName())
-                || ChatCompletion.Model.GPT_4_VISION_PREVIEW.getName().equals(chatRequest.getModel())
-                || ChatCompletion.Model.CLAUDE_3_SONNET.getName().equals(chatRequest.getModel())
-                || ChatCompletion.Model.STABLE_DIFFUSION.getName().equals(chatRequest.getModel())
-                || ChatCompletion.Model.SUNO_V3.getName().equals(chatRequest.getModel())
-            ){
-                double cost = OpenAIConst.GPT4_COST;
-                if(ChatCompletion.Model.STABLE_DIFFUSION.getName().equals(chatRequest.getModel())){
-                    cost = 0.1;
+            //根据模型名称查询模型信息
+            SysModelBo sysModelBo = new SysModelBo();
+            sysModelBo.setModelName(chatRequest.getModel());
+            List<SysModelVo> sysModelList = sysModelService.queryList(sysModelBo);
+            if (CollectionUtil.isEmpty(sysModelList)) {
+                // 如果模型不存在默认使用token扣费方式
+                processByToken(chatRequest.getModel(), msgList, chatMessageBo);
+            } else {
+                // 模型设置默认提示词
+                SysModelVo firstModel = sysModelList.get(0);
+                if (StringUtils.isNotEmpty(firstModel.getSystemPrompt())) {
+                    Message sysMessage = Message.builder().content(firstModel.getSystemPrompt()).role(Message.Role.SYSTEM).build();
+                    // 假设 msgList 不为空并且至少有一个元素
+                    if (msgList.get(0).equals(sysMessage)) {
+                        // 如果第一个元素与sysMessage相等,替换第一个元素
+                        msgList.set(0, sysMessage);
+                    } else {
+                        // 如果不相等,将sysMessage插入到列表的第一个位置
+                        msgList.add(0, sysMessage);
+                    }
                 }
-                if(ChatCompletion.Model.SUNO_V3.getName().equals(chatRequest.getModel())){
-                    cost = 0.5;
+                // 计费类型: 1 token扣费 2 次数扣费
+                if ("2".equals(firstModel.getModelType())) {
+                    processByModelPrice(firstModel, chatMessageBo);
+                } else {
+                    processByToken(chatRequest.getModel(), msgList, chatMessageBo);
                 }
-                IChatService.deductUserBalance(getUserId(), cost);
-                chatMessageBo.setDeductCost(cost);
-                // 保存消息记录
-                chatMessageService.insertByBo(chatMessageBo);
-            }else {
-                int tokens = TikTokensUtil.tokens(chatRequest.getModel(), msgList);
-                chatMessageBo.setTotalTokens(tokens);
-                // 按token扣费并且保存消息记录
-                IChatService.deductToken(chatMessageBo);
             }
-        }catch (Exception e){
+        } catch (Exception e) {
             sendErrorEvent(sseEmitter, e.getMessage());
             return sseEmitter;
         }
@@ -147,6 +155,32 @@ public class SseServiceImpl implements ISseService {
         return sseEmitter;
     }
 
+    /**
+     * 根据次数扣除余额
+     *
+     * @param model         模型信息
+     * @param chatMessageBo 对话信息
+     */
+    private void processByModelPrice(SysModelVo model, ChatMessageBo chatMessageBo) {
+        double cost = model.getModelPrice();
+        chatService.deductUserBalance(getUserId(), cost);
+        chatMessageBo.setDeductCost(cost);
+        chatMessageService.insertByBo(chatMessageBo);
+    }
+
+    /**
+     * 根据token扣除余额
+     *
+     * @param modelName     模型名称
+     * @param msgList       消息列表
+     * @param chatMessageBo 消息记录
+     */
+    private void processByToken(String modelName, List<Message> msgList, ChatMessageBo chatMessageBo) {
+        int tokens = TikTokensUtil.tokens(modelName, msgList);
+        chatMessageBo.setTotalTokens(tokens);
+        chatService.deductToken(chatMessageBo);
+    }
+
     /**
      * 文字转语音
      *
@@ -225,9 +259,9 @@ public class SseServiceImpl implements ISseService {
 
         // 扣除费用
         if(Objects.equals(request.getSize(), "1792x1024") || Objects.equals(request.getSize(), "1024x1792")){
-            IChatService.deductUserBalance(getUserId(),OpenAIConst.DALL3_HD_COST);
+            chatService.deductUserBalance(getUserId(),OpenAIConst.DALL3_HD_COST);
         }else {
-            IChatService.deductUserBalance(getUserId(),OpenAIConst.DALL3_COST);
+            chatService.deductUserBalance(getUserId(),OpenAIConst.DALL3_COST);
         }
         // 保存消息记录
         ChatMessageBo chatMessageBo = new ChatMessageBo();

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/service/impl/SysDictTypeServiceImpl.java

@@ -96,7 +96,7 @@ public class SysDictTypeServiceImpl implements ISysDictTypeService, DictService
      * @param dictType 字典类型
      * @return 字典数据集合信息
      */
-    @Cacheable(cacheNames = CacheNames.SYS_DICT, key = "#dictType")
+   // @Cacheable(cacheNames = CacheNames.SYS_DICT, key = "#dictType")
     @Override
     public List<SysDictDataVo> selectDictDataByType(String dictType) {
         List<SysDictDataVo> dictDatas = dictDataMapper.selectDictDataByType(dictType);

+ 110 - 0
ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/service/impl/SysModelServiceImpl.java

@@ -0,0 +1,110 @@
+package com.xmzs.system.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.xmzs.common.core.utils.MapstructUtils;
+import com.xmzs.common.core.utils.StringUtils;
+import com.xmzs.common.mybatis.core.page.PageQuery;
+import com.xmzs.common.mybatis.core.page.TableDataInfo;
+import com.xmzs.system.domain.SysModel;
+import com.xmzs.system.domain.bo.SysModelBo;
+import com.xmzs.system.domain.vo.SysModelVo;
+import com.xmzs.system.mapper.SysModelMapper;
+import com.xmzs.system.service.ISysModelService;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 系统模型Service业务层处理
+ *
+ * @author Lion Li
+ * @date 2024-04-04
+ */
+@RequiredArgsConstructor
+@Service
+public class SysModelServiceImpl implements ISysModelService {
+
+    private final SysModelMapper baseMapper;
+
+    /**
+     * 查询系统模型
+     */
+    @Override
+    public SysModelVo queryById(Long id){
+        return baseMapper.selectVoById(id);
+    }
+
+    /**
+     * 查询系统模型列表
+     */
+    @Override
+    public TableDataInfo<SysModelVo> queryPageList(SysModelBo bo, PageQuery pageQuery) {
+        LambdaQueryWrapper<SysModel> lqw = buildQueryWrapper(bo);
+        Page<SysModelVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+        return TableDataInfo.build(result);
+    }
+
+    /**
+     * 查询系统模型列表
+     */
+    @Override
+    public List<SysModelVo> queryList(SysModelBo bo) {
+        LambdaQueryWrapper<SysModel> lqw = buildQueryWrapper(bo);
+        return baseMapper.selectVoList(lqw);
+    }
+
+    private LambdaQueryWrapper<SysModel> buildQueryWrapper(SysModelBo bo) {
+        LambdaQueryWrapper<SysModel> lqw = Wrappers.lambdaQuery();
+        lqw.like(StringUtils.isNotBlank(bo.getModelName()), SysModel::getModelName, bo.getModelName());
+        lqw.like(StringUtils.isNotBlank(bo.getModelShow()), SysModel::getModelShow, bo.getModelShow());
+        lqw.eq(StringUtils.isNotBlank(bo.getModelDescribe()), SysModel::getModelDescribe, bo.getModelDescribe());
+        lqw.eq(StringUtils.isNotBlank(bo.getModelType()), SysModel::getModelType, bo.getModelType());
+        return lqw;
+    }
+
+    /**
+     * 新增系统模型
+     */
+    @Override
+    public Boolean insertByBo(SysModelBo bo) {
+        SysModel add = MapstructUtils.convert(bo, SysModel.class);
+        validEntityBeforeSave(add);
+        boolean flag = baseMapper.insert(add) > 0;
+        if (flag) {
+            bo.setId(add.getId());
+        }
+        return flag;
+    }
+
+    /**
+     * 修改系统模型
+     */
+    @Override
+    public Boolean updateByBo(SysModelBo bo) {
+        SysModel update = MapstructUtils.convert(bo, SysModel.class);
+        validEntityBeforeSave(update);
+        return baseMapper.updateById(update) > 0;
+    }
+
+    /**
+     * 保存前的数据校验
+     */
+    private void validEntityBeforeSave(SysModel entity){
+        //TODO 做一些数据校验,如唯一约束
+    }
+
+    /**
+     * 批量删除系统模型
+     */
+    @Override
+    public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
+        if(isValid){
+            //TODO 做一些业务上的校验,判断是否需要校验
+        }
+        return baseMapper.deleteBatchIds(ids) > 0;
+    }
+}

+ 3 - 2
ruoyi-modules/ruoyi-system/src/main/java/com/xmzs/system/service/impl/SysUserServiceImpl.java

@@ -78,6 +78,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
         QueryWrapper<SysUser> wrapper = Wrappers.query();
         wrapper.eq("u.del_flag", UserConstants.USER_NORMAL)
             .eq(ObjectUtil.isNotNull(user.getUserId()), "u.user_id", user.getUserId())
+            .eq(ObjectUtil.isNotNull(user.getUserGrade()), "u.user_grade", user.getUserGrade())
             .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName())
             .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus())
             .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber())
@@ -324,9 +325,9 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
     @Transactional(rollbackFor = Exception.class)
     public int updateUser(SysUserBo user) {
         // 新增用户与角色管理
-        insertUserRole(user, true);
+        //insertUserRole(user, true);
         // 新增用户与岗位管理
-        insertUserPost(user, true);
+        //insertUserPost(user, true);
         SysUser sysUser = MapstructUtils.convert(user, SysUser.class);
         // 防止错误更新后导致的数据误删除
         int flag = baseMapper.updateById(sysUser);

+ 7 - 0
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysModelMapper.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.xmzs.system.mapper.SysModelMapper">
+
+</mapper>

+ 1 - 1
ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -70,7 +70,7 @@
     </update>
 
     <select id="selectPageUserList" resultMap="SysUserResult">
-        select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,
+        select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex,u.user_balance,u.user_grade,
             u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader
         from sys_user u
             left join sys_dept d on u.dept_id = d.dept_id

+ 5 - 0
script/docker/.env

@@ -0,0 +1,5 @@
+CHAT_API_KEY= sk-xx
+CHAT_API_HOST=https://api.pandarobot.chat/
+MAIL_PASS=your_mail_pass
+PAY_PID=your_pay_pid
+PAY_KEY=your_pay_key

+ 53 - 112
script/docker/docker-compose.yml

@@ -1,53 +1,30 @@
 version: '3'
 
+networks:
+  mynetwork:
+    driver: bridge
+
 services:
   mysql:
     image: mysql:8.0.33
     container_name: mysql
     environment:
-      # 时区上海
       TZ: Asia/Shanghai
-      # root 密码
       MYSQL_ROOT_PASSWORD: root
-      # 初始化数据库(后续的初始化sql会在这个库执行)
       MYSQL_DATABASE: ry-vue
     ports:
-      - "3306:3306"
+      - "3307:3306"
     volumes:
-      # 数据挂载
-      - /docker/mysql/data/:/var/lib/mysql/
-      # 配置挂载
-      - /docker/mysql/conf/:/etc/mysql/conf.d/
+      - ./ry-vue.sql:/docker-entrypoint-initdb.d/ry-vue.sql
     command:
-      # 将mysql8.0默认密码策略 修改为 原先 策略 (mysql8.0对其默认策略做了更改 会导致密码无法匹配)
       --default-authentication-plugin=mysql_native_password
       --character-set-server=utf8mb4
       --collation-server=utf8mb4_general_ci
       --explicit_defaults_for_timestamp=true
       --lower_case_table_names=1
     privileged: true
-    network_mode: "host"
-
-  nginx-web:
-    image: nginx:1.23.4
-    container_name: nginx-web
-    environment:
-      # 时区上海
-      TZ: Asia/Shanghai
-    ports:
-      - "80:80"
-      - "443:443"
-    volumes:
-      # 证书映射
-      - /docker/nginx/cert:/etc/nginx/cert
-      # 配置文件映射
-      - /docker/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
-      # 页面目录
-      - /docker/nginx/html:/usr/share/nginx/html
-      # 日志目录
-      - /docker/nginx/log:/var/log/nginx
-    privileged: true
-    network_mode: "host"
+    networks:
+      - mynetwork
 
   redis:
     image: redis:6.2.12
@@ -55,100 +32,64 @@ services:
     ports:
       - "6379:6379"
     environment:
-      # 时区上海
       TZ: Asia/Shanghai
     volumes:
-      # 配置文件
       - /docker/redis/conf:/redis/config:rw
-      # 数据文件
       - /docker/redis/data/:/redis/data/:rw
-    command: "redis-server /redis/config/redis.conf"
     privileged: true
-    network_mode: "host"
+    networks:
+      - mynetwork
 
-  minio:
-    image: minio/minio:RELEASE.2023-04-13T03-08-07Z
-    container_name: minio
+  ruoyi-server:
+    image: registry.cn-shanghai.aliyuncs.com/ruoyi-ai/ai:1.2.1
     ports:
-      # api 端口
-      - "9000:9000"
-      # 控制台端口
-      - "9001:9001"
-    environment:
-      # 时区上海
-      TZ: Asia/Shanghai
-      # 管理后台用户名
-      MINIO_ROOT_USER: ruoyi
-      # 管理后台密码,最小8个字符
-      MINIO_ROOT_PASSWORD: ruoyi123
-      # https需要指定域名
-      #MINIO_SERVER_URL: "https://xxx.com:9000"
-      #MINIO_BROWSER_REDIRECT_URL: "https://xxx.com:9001"
-      # 开启压缩 on 开启 off 关闭
-      MINIO_COMPRESS: "off"
-      # 扩展名 .pdf,.doc 为空 所有类型均压缩
-      MINIO_COMPRESS_EXTENSIONS: ""
-      # mime 类型 application/pdf 为空 所有类型均压缩
-      MINIO_COMPRESS_MIME_TYPES: ""
-    volumes:
-      # 映射当前目录下的data目录至容器内/data目录
-      - /docker/minio/data:/data
-      # 映射配置目录
-      - /docker/minio/config:/root/.minio/
-    command: server --address ':9000' --console-address ':9001' /data  # 指定容器中的目录 /data
-    privileged: true
-    network_mode: "host"
-
-  ruoyi-server1:
-    image: ruoyi/ruoyi-server:5.0.0
-    container_name: ruoyi-server1
-    environment:
-      # 时区上海
-      TZ: Asia/Shanghai
-      SERVER_PORT: 8080
-    volumes:
-      # 配置文件
-      - /docker/server1/logs/:/ruoyi/server/logs/
-      # skywalking 探针
-#      - /docker/skywalking/agent/:/ruoyi/skywalking/agent
-    privileged: true
-    network_mode: "host"
-
-  ruoyi-server2:
-    image: ruoyi/ruoyi-server:5.0.0
-    container_name: ruoyi-server2
+      - "6039:6039"
+    container_name: ruoyi-server
     environment:
-      # 时区上海
       TZ: Asia/Shanghai
-      SERVER_PORT: 8081
+      # 运行端口号
+      SERVER_PORT: 6039
+      # 中转key
+      CHAT_API_KEY: ${CHAT_API_KEY}
+      # 中转地址
+      CHAT_API_HOST: ${CHAT_API_HOST}
+      # 邮箱授权码
+      MAIL_PASS: ${MAIL_PASS}
+      # 易支付商户ID
+      PAY_PID: ${PAY_PID}
+      # 易支付商户密钥
+      PAY_KEY: ${PAY_KEY}
+      # 数据库连接地址
+      DB_URL: jdbc:mysql://mysql:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true
+      # 数据库用户名
+      DB_USERNAME: root
+      # 数据库用户密码
+      DB_PASSWORD: root
+      # Redis地址
+      REDIS_HOST: redis
+      # Redis端口
+      REDIS_PORT: 6379
     volumes:
-      # 配置文件
       - /docker/server2/logs/:/ruoyi/server/logs/
-      # skywalking 探针
-#      - /docker/skywalking/agent/:/ruoyi/skywalking/agent
     privileged: true
-    network_mode: "host"
+    networks:
+      - mynetwork
 
-  ruoyi-monitor-admin:
-    image: ruoyi/ruoyi-monitor-admin:5.0.0
-    container_name: ruoyi-monitor-admin
-    environment:
-      # 时区上海
-      TZ: Asia/Shanghai
-    volumes:
-      # 配置文件
-      - /docker/monitor/logs/:/ruoyi/monitor/logs
+  ruoyi-web:
+    image: registry.cn-shanghai.aliyuncs.com/ruoyi-ai/web:1.2.1
+    ports:
+      - "8081:8081"
+    container_name: ruoyi-web
     privileged: true
-    network_mode: "host"
+    networks:
+      - mynetwork
 
-  ruoyi-xxl-job-admin:
-    image: ruoyi/ruoyi-xxl-job-admin:5.0.0
-    container_name: ruoyi-xxl-job-admin
-    environment:
-      # 时区上海
-      TZ: Asia/Shanghai
-    volumes:
-      # 配置文件
-      - /docker/xxljob/logs/:/ruoyi/xxljob/logs
+  ruoyi-admin:
+    image: registry.cn-shanghai.aliyuncs.com/ruoyi-ai/admin:1.2.1
+    ports:
+      - "8082:8082"
+    container_name: ruoyi-admin
     privileged: true
-    network_mode: "host"
+    networks:
+      - mynetwork
+

+ 1329 - 0
script/docker/ry-vue.sql

@@ -0,0 +1,1329 @@
+/*
+ Navicat MySQL Data Transfer
+
+ Source Server         : ruoyi-vue
+ Source Server Type    : MySQL
+ Source Server Version : 50740
+ Source Host           : 127.0.0.1:3306
+ Source Schema         : ruoyi-vue
+
+ Target Server Type    : MySQL
+ Target Server Version : 50740
+ File Encoding         : 65001
+
+ Date: 15/05/2024 10:49:39
+*/
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for chat_message
+-- ----------------------------
+DROP TABLE IF EXISTS `chat_message`;
+CREATE TABLE `chat_message`  (
+                                 `id` bigint(20) NOT NULL COMMENT '主键',
+                                 `user_id` bigint(20) NOT NULL COMMENT '用户id',
+                                 `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '消息内容',
+                                 `deduct_cost` double(20, 10) NULL DEFAULT 0.0000000000 COMMENT '扣除金额\r\n\r\n',
+                                 `total_tokens` int(11) NULL DEFAULT NULL COMMENT '累计 Tokens',
+                                 `model_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模型名称',
+                                 `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                                 `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
+                                 `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                                 `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
+                                 `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                                 `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+                                 PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '聊天消息表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of chat_message
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for chat_token
+-- ----------------------------
+DROP TABLE IF EXISTS `chat_token`;
+CREATE TABLE `chat_token`  (
+                               `id` bigint(20) NOT NULL COMMENT '主键',
+                               `user_id` bigint(20) NOT NULL COMMENT '用户',
+                               `token` int(11) NULL DEFAULT NULL COMMENT '待结算token',
+                               `model_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模型名称',
+                               PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'token信息' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of chat_token
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for gen_table
+-- ----------------------------
+DROP TABLE IF EXISTS `gen_table`;
+CREATE TABLE `gen_table`  (
+                              `table_id` bigint(20) NOT NULL COMMENT '编号',
+                              `table_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '表名称',
+                              `table_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '表描述',
+                              `sub_table_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关联子表的表名',
+                              `sub_table_fk_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '子表关联的外键名',
+                              `class_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '实体类名称',
+                              `tpl_category` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'crud' COMMENT '使用的模板(crud单表操作 tree树表操作)',
+                              `package_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成包路径',
+                              `module_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成模块名',
+                              `business_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成业务名',
+                              `function_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成功能名',
+                              `function_author` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '生成功能作者',
+                              `gen_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '生成代码方式(0zip压缩包 1自定义路径)',
+                              `gen_path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '/' COMMENT '生成路径(不填默认项目路径)',
+                              `options` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '其它生成选项',
+                              `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                              `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
+                              `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                              `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
+                              `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                              `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+                              PRIMARY KEY (`table_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '代码生成业务表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of gen_table
+-- ----------------------------
+INSERT INTO `gen_table` VALUES (1661288222902505474, 'sys_notice', '通知公告表', NULL, NULL, 'SysNotice', 'crud', 'org.dromara.system', 'system', 'notice', '通知公告', 'Lion Li', '0', '/', NULL, 103, 1, '2023-05-20 18:05:11', 1, '2023-05-20 18:05:11', NULL);
+INSERT INTO `gen_table` VALUES (1661288223338713089, 'sys_oper_log', '操作日志记录', NULL, NULL, 'SysOperLog', 'crud', 'org.dromara.system', 'system', 'operLog', '操作日志记录', 'Lion Li', '0', '/', NULL, 103, 1, '2023-05-20 18:05:11', 1, '2023-05-20 18:05:11', NULL);
+INSERT INTO `gen_table` VALUES (1661288223477125122, 'sys_oss', 'OSS对象存储表', NULL, NULL, 'SysOss', 'crud', 'org.dromara.system', 'system', 'oss', 'OSS对象存储', 'Lion Li', '0', '/', NULL, 103, 1, '2023-05-20 18:05:11', 1, '2023-05-20 18:05:11', NULL);
+INSERT INTO `gen_table` VALUES (1661288223586177025, 'sys_oss_config', '对象存储配置表', NULL, NULL, 'SysOssConfig', 'crud', 'org.dromara.system', 'system', 'ossConfig', '对象存储配置', 'Lion Li', '0', '/', NULL, 103, 1, '2023-05-20 18:05:11', 1, '2023-05-20 18:05:11', NULL);
+INSERT INTO `gen_table` VALUES (1661288223728783361, 'sys_post', '岗位信息表', NULL, NULL, 'SysPost', 'crud', 'org.dromara.system', 'system', 'post', '岗位信息', 'Lion Li', '0', '/', NULL, 103, 1, '2023-05-20 18:05:11', 1, '2023-05-20 18:05:11', NULL);
+INSERT INTO `gen_table` VALUES (1661288223821058050, 'sys_role', '角色信息表', NULL, NULL, 'SysRole', 'crud', 'org.dromara.system', 'system', 'role', '角色信息', 'Lion Li', '0', '/', NULL, 103, 1, '2023-05-20 18:05:11', 1, '2023-05-20 18:05:11', NULL);
+INSERT INTO `gen_table` VALUES (1661288223925915650, 'sys_user_post', '用户与岗位关联表', NULL, NULL, 'SysUserPost', 'crud', 'org.dromara.system', 'system', 'userPost', '用户与岗位关联', 'Lion Li', '0', '/', NULL, 103, 1, '2023-05-20 18:05:11', 1, '2023-05-20 18:05:11', NULL);
+INSERT INTO `gen_table` VALUES (1661288223967858689, 'sys_user_role', '用户和角色关联表', NULL, NULL, 'SysUserRole', 'crud', 'org.dromara.system', 'system', 'userRole', '用户和角色关联', 'Lion Li', '0', '/', NULL, 103, 1, '2023-05-20 18:05:11', 1, '2023-05-20 18:05:11', NULL);
+INSERT INTO `gen_table` VALUES (1661288224013996034, 'test_demo', '测试单表', NULL, NULL, 'TestDemo', 'crud', 'org.dromara.system', 'system', 'demo', '测试单', 'Lion Li', '0', '/', NULL, 103, 1, '2023-05-20 18:05:11', 1, '2023-05-20 18:05:11', NULL);
+INSERT INTO `gen_table` VALUES (1661288224185962497, 'test_tree', '测试树表', NULL, NULL, 'TestTree', 'crud', 'org.dromara.system', 'system', 'tree', '测试树', 'Lion Li', '0', '/', NULL, 103, 1, '2023-05-20 18:05:11', 1, '2023-05-20 18:05:11', NULL);
+INSERT INTO `gen_table` VALUES (1661288385096241154, 'sys_config', '参数配置表', NULL, NULL, 'SysConfig', 'crud', 'org.dromara.system', 'system', 'config', '参数配置', 'Lion Li', '0', '/', NULL, 103, 1, '2023-05-20 18:05:10', 1, '2023-05-20 18:05:10', NULL);
+INSERT INTO `gen_table` VALUES (1680196323445579778, 'sys_file_detail', '文件记录表', NULL, NULL, 'SysFileDetail', 'crud', 'com.xmzs.system', 'system', 'fileDetail', '文件记录', 'Lion Li', '0', '/', NULL, 103, 1, '2023-07-15 20:40:00', 1, '2023-07-15 20:40:00', NULL);
+INSERT INTO `gen_table` VALUES (1680196323521077249, 'sys_file_detail', '文件记录表', NULL, NULL, 'SysFileDetail', 'crud', 'com.xmzs.system', 'system', 'fileDetail', '文件记录', 'Lion Li', '0', '/', NULL, 103, 1, '2023-07-15 20:40:00', 1, '2023-07-15 20:40:00', NULL);
+INSERT INTO `gen_table` VALUES (1680199147407806465, 'sys_file_info', '文件记录表', NULL, NULL, 'SysFileInfo', 'crud', 'com.xmzs.system', 'system', 'fileInfo', '文件记录', 'Lion Li', '0', '/', NULL, 103, 1, '2023-07-15 20:53:56', 1, '2023-07-15 20:53:56', NULL);
+INSERT INTO `gen_table` VALUES (1680481752850145282, 'sd_model_param', '模型参数信息表', NULL, NULL, 'SdModelParam', 'crud', 'com.xmzs.system', 'system', 'modelParam', '模型参数信息', 'Lion Li', '0', '/', NULL, 103, 1, '2023-07-16 15:18:34', 1, '2023-07-16 15:18:34', NULL);
+INSERT INTO `gen_table` VALUES (1728684654923988993, 'chat_message', '聊天消息表', NULL, NULL, 'ChatMessage', 'crud', 'com.xmzs.system', 'system', 'message', '聊天消息', 'Lion Li', '0', '/', NULL, 103, 1, '2023-11-26 15:28:10', 1, '2023-11-26 15:28:10', NULL);
+INSERT INTO `gen_table` VALUES (1740573614897897473, 'payment_orders', '支付订单表', NULL, NULL, 'PaymentOrders', 'crud', 'com.xmzs.system', 'system', 'orders', '支付订单', 'Lion Li', '0', '/', NULL, 103, 1, '2023-12-27 23:04:45', 1, '2023-12-27 23:04:45', NULL);
+
+-- ----------------------------
+-- Table structure for gen_table_column
+-- ----------------------------
+DROP TABLE IF EXISTS `gen_table_column`;
+CREATE TABLE `gen_table_column`  (
+                                     `column_id` bigint(20) NOT NULL COMMENT '编号',
+                                     `table_id` bigint(20) NULL DEFAULT NULL COMMENT '归属表编号',
+                                     `column_name` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '列名称',
+                                     `column_comment` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '列描述',
+                                     `column_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '列类型',
+                                     `java_type` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'JAVA类型',
+                                     `java_field` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'JAVA字段名',
+                                     `is_pk` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否主键(1是)',
+                                     `is_increment` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否自增(1是)',
+                                     `is_required` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否必填(1是)',
+                                     `is_insert` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否为插入字段(1是)',
+                                     `is_edit` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否编辑字段(1是)',
+                                     `is_list` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否列表字段(1是)',
+                                     `is_query` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否查询字段(1是)',
+                                     `query_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'EQ' COMMENT '查询方式(等于、不等于、大于、小于、范围)',
+                                     `html_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '显示类型(文本框、文本域、下拉框、复选框、单选框、日期控件)',
+                                     `dict_type` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典类型',
+                                     `sort` int(11) NULL DEFAULT NULL COMMENT '排序',
+                                     `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                                     `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
+                                     `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                                     `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
+                                     `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                                     PRIMARY KEY (`column_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '代码生成业务表字段' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of gen_table_column
+-- ----------------------------
+INSERT INTO `gen_table_column` VALUES (1661288223078666241, 1661288222902505474, 'notice_id', '公告ID', 'bigint(20)', 'Long', 'noticeId', '1', '0', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 1, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223108026369, 1661288222902505474, 'tenant_id', '租户编号', 'varchar(20)', 'String', 'tenantId', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 2, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223108026370, 1661288222902505474, 'notice_title', '公告标题', 'varchar(50)', 'String', 'noticeTitle', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 3, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223108026371, 1661288222902505474, 'notice_type', '公告类型(1通知 2公告)', 'char(1)', 'String', 'noticeType', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'select', '', 4, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223108026372, 1661288222902505474, 'notice_content', '公告内容', 'longblob', 'String', 'noticeContent', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'editor', '', 5, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223120609282, 1661288222902505474, 'status', '公告状态(0正常 1关闭)', 'char(1)', 'String', 'status', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'radio', '', 6, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223120609283, 1661288222902505474, 'create_dept', '创建部门', 'bigint(20)', 'Long', 'createDept', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 7, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223120609284, 1661288222902505474, 'create_by', '创建者', 'bigint(20)', 'Long', 'createBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 8, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223120609285, 1661288222902505474, 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 9, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223120609286, 1661288222902505474, 'update_by', '更新者', 'bigint(20)', 'Long', 'updateBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 10, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223120609287, 1661288222902505474, 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 11, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223120609288, 1661288222902505474, 'remark', '备注', 'varchar(255)', 'String', 'remark', '0', '0', '1', '1', '1', '1', NULL, 'EQ', 'input', '', 12, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223363878913, 1661288223338713089, 'oper_id', '日志主键', 'bigint(20)', 'Long', 'operId', '1', '0', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 1, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223363878914, 1661288223338713089, 'tenant_id', '租户编号', 'varchar(20)', 'String', 'tenantId', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 2, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223363878915, 1661288223338713089, 'title', '模块标题', 'varchar(50)', 'String', 'title', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 3, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223363878916, 1661288223338713089, 'business_type', '业务类型(0其它 1新增 2修改 3删除)', 'int(2)', 'Integer', 'businessType', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'select', '', 4, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223401627649, 1661288223338713089, 'method', '方法名称', 'varchar(100)', 'String', 'method', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 5, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223401627650, 1661288223338713089, 'request_method', '请求方式', 'varchar(10)', 'String', 'requestMethod', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 6, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223401627651, 1661288223338713089, 'operator_type', '操作类别(0其它 1后台用户 2手机端用户)', 'int(1)', 'Integer', 'operatorType', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'select', '', 7, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223401627652, 1661288223338713089, 'oper_name', '操作人员', 'varchar(50)', 'String', 'operName', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 8, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223401627653, 1661288223338713089, 'dept_name', '部门名称', 'varchar(50)', 'String', 'deptName', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 9, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223401627654, 1661288223338713089, 'oper_url', '请求URL', 'varchar(255)', 'String', 'operUrl', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 10, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223401627655, 1661288223338713089, 'oper_ip', '主机地址', 'varchar(128)', 'String', 'operIp', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 11, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223401627656, 1661288223338713089, 'oper_location', '操作地点', 'varchar(255)', 'String', 'operLocation', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 12, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223401627657, 1661288223338713089, 'oper_param', '请求参数', 'varchar(2000)', 'String', 'operParam', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'textarea', '', 13, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223401627658, 1661288223338713089, 'json_result', '返回参数', 'varchar(2000)', 'String', 'jsonResult', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'textarea', '', 14, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223401627659, 1661288223338713089, 'status', '操作状态(0正常 1异常)', 'int(1)', 'Integer', 'status', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'radio', '', 15, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223401627660, 1661288223338713089, 'error_msg', '错误消息', 'varchar(2000)', 'String', 'errorMsg', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'textarea', '', 16, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223401627661, 1661288223338713089, 'oper_time', '操作时间', 'datetime', 'Date', 'operTime', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'datetime', '', 17, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223401627662, 1661288223338713089, 'cost_time', '消耗时间', 'bigint(20)', 'Long', 'costTime', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 18, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223502290946, 1661288223477125122, 'oss_id', '对象存储主键', 'bigint(20)', 'Long', 'ossId', '1', '0', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 1, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223502290947, 1661288223477125122, 'tenant_id', '租户编号', 'varchar(20)', 'String', 'tenantId', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 2, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223502290948, 1661288223477125122, 'file_name', '文件名', 'varchar(255)', 'String', 'fileName', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 3, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223502290949, 1661288223477125122, 'original_name', '原名', 'varchar(255)', 'String', 'originalName', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 4, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223502290950, 1661288223477125122, 'file_suffix', '文件后缀名', 'varchar(10)', 'String', 'fileSuffix', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 5, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223502290951, 1661288223477125122, 'url', 'URL地址', 'varchar(500)', 'String', 'url', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'textarea', '', 6, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223502290952, 1661288223477125122, 'create_dept', '创建部门', 'bigint(20)', 'Long', 'createDept', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 7, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223502290953, 1661288223477125122, 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 8, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223502290954, 1661288223477125122, 'create_by', '上传人', 'bigint(20)', 'Long', 'createBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 9, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223502290955, 1661288223477125122, 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 10, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223502290956, 1661288223477125122, 'update_by', '更新人', 'bigint(20)', 'Long', 'updateBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 11, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223502290957, 1661288223477125122, 'service', '服务商', 'varchar(20)', 'String', 'service', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 12, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223611342850, 1661288223586177025, 'oss_config_id', '主建', 'bigint(20)', 'Long', 'ossConfigId', '1', '0', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 1, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223611342851, 1661288223586177025, 'tenant_id', '租户编号', 'varchar(20)', 'String', 'tenantId', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 2, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223611342852, 1661288223586177025, 'config_key', '配置key', 'varchar(20)', 'String', 'configKey', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 3, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223611342853, 1661288223586177025, 'access_key', 'accessKey', 'varchar(255)', 'String', 'accessKey', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 4, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223611342854, 1661288223586177025, 'secret_key', '秘钥', 'varchar(255)', 'String', 'secretKey', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 5, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223611342855, 1661288223586177025, 'bucket_name', '桶名称', 'varchar(255)', 'String', 'bucketName', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 6, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223611342856, 1661288223586177025, 'prefix', '前缀', 'varchar(255)', 'String', 'prefix', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 7, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223611342857, 1661288223586177025, 'endpoint', '访问站点', 'varchar(255)', 'String', 'endpoint', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 8, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223611342858, 1661288223586177025, 'domain', '自定义域名', 'varchar(255)', 'String', 'domain', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 9, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223611342859, 1661288223586177025, 'is_https', '是否https(Y=是,N=否)', 'char(1)', 'String', 'isHttps', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 10, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223611342860, 1661288223586177025, 'region', '域', 'varchar(255)', 'String', 'region', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 11, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223653285889, 1661288223586177025, 'access_policy', '桶权限类型(0=private 1=public 2=custom)', 'char(1)', 'String', 'accessPolicy', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 12, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223653285890, 1661288223586177025, 'status', '是否默认(0=是,1=否)', 'char(1)', 'String', 'status', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'radio', '', 13, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223653285891, 1661288223586177025, 'ext1', '扩展字段', 'varchar(255)', 'String', 'ext1', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 14, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223653285892, 1661288223586177025, 'create_dept', '创建部门', 'bigint(20)', 'Long', 'createDept', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 15, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223653285893, 1661288223586177025, 'create_by', '创建者', 'bigint(20)', 'Long', 'createBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 16, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223653285894, 1661288223586177025, 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 17, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223653285895, 1661288223586177025, 'update_by', '更新者', 'bigint(20)', 'Long', 'updateBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 18, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223653285896, 1661288223586177025, 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 19, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223653285897, 1661288223586177025, 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', '1', '1', '1', '1', NULL, 'EQ', 'textarea', '', 20, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223749754881, 1661288223728783361, 'post_id', '岗位ID', 'bigint(20)', 'Long', 'postId', '1', '0', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 1, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223749754882, 1661288223728783361, 'tenant_id', '租户编号', 'varchar(20)', 'String', 'tenantId', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 2, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223749754883, 1661288223728783361, 'post_code', '岗位编码', 'varchar(64)', 'String', 'postCode', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 3, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223749754884, 1661288223728783361, 'post_name', '岗位名称', 'varchar(50)', 'String', 'postName', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 4, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223749754885, 1661288223728783361, 'post_sort', '显示顺序', 'int(4)', 'Integer', 'postSort', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 5, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223749754886, 1661288223728783361, 'status', '状态(0正常 1停用)', 'char(1)', 'String', 'status', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'radio', '', 6, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223749754887, 1661288223728783361, 'create_dept', '创建部门', 'bigint(20)', 'Long', 'createDept', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 7, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223749754888, 1661288223728783361, 'create_by', '创建者', 'bigint(20)', 'Long', 'createBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 8, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223749754889, 1661288223728783361, 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 9, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223749754890, 1661288223728783361, 'update_by', '更新者', 'bigint(20)', 'Long', 'updateBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 10, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223749754891, 1661288223728783361, 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 11, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223749754892, 1661288223728783361, 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', '1', '1', '1', '1', NULL, 'EQ', 'textarea', '', 12, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223846223874, 1661288223821058050, 'role_id', '角色ID', 'bigint(20)', 'Long', 'roleId', '1', '0', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 1, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223846223875, 1661288223821058050, 'tenant_id', '租户编号', 'varchar(20)', 'String', 'tenantId', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 2, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223846223876, 1661288223821058050, 'role_name', '角色名称', 'varchar(30)', 'String', 'roleName', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 3, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223846223877, 1661288223821058050, 'role_key', '角色权限字符串', 'varchar(100)', 'String', 'roleKey', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 4, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223846223878, 1661288223821058050, 'role_sort', '显示顺序', 'int(4)', 'Integer', 'roleSort', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 5, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223846223879, 1661288223821058050, 'data_scope', '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)', 'char(1)', 'String', 'dataScope', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 6, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223846223880, 1661288223821058050, 'menu_check_strictly', '菜单树选择项是否关联显示', 'tinyint(1)', 'Integer', 'menuCheckStrictly', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 7, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223846223881, 1661288223821058050, 'dept_check_strictly', '部门树选择项是否关联显示', 'tinyint(1)', 'Integer', 'deptCheckStrictly', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 8, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223846223882, 1661288223821058050, 'status', '角色状态(0正常 1停用)', 'char(1)', 'String', 'status', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'radio', '', 9, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223846223883, 1661288223821058050, 'del_flag', '删除标志(0代表存在 2代表删除)', 'char(1)', 'String', 'delFlag', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 10, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223846223884, 1661288223821058050, 'create_dept', '创建部门', 'bigint(20)', 'Long', 'createDept', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 11, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223846223885, 1661288223821058050, 'create_by', '创建者', 'bigint(20)', 'Long', 'createBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 12, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223846223886, 1661288223821058050, 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 13, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223846223887, 1661288223821058050, 'update_by', '更新者', 'bigint(20)', 'Long', 'updateBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 14, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223846223888, 1661288223821058050, 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 15, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223846223889, 1661288223821058050, 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', '1', '1', '1', '1', NULL, 'EQ', 'textarea', '', 16, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223951081474, 1661288223925915650, 'user_id', '用户ID', 'bigint(20)', 'Long', 'userId', '1', '0', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 1, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223951081475, 1661288223925915650, 'post_id', '岗位ID', 'bigint(20)', 'Long', 'postId', '1', '0', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 2, 103, 1, '2023-05-24 16:29:12', 1, '2023-05-24 16:29:12');
+INSERT INTO `gen_table_column` VALUES (1661288223993024514, 1661288223967858689, 'user_id', '用户ID', 'bigint(20)', 'Long', 'userId', '1', '0', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 1, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288223993024515, 1661288223967858689, 'role_id', '角色ID', 'bigint(20)', 'Long', 'roleId', '1', '0', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 2, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224043356162, 1661288224013996034, 'id', '主键', 'bigint(20)', 'Long', 'id', '1', '0', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 1, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224043356163, 1661288224013996034, 'tenant_id', '租户编号', 'varchar(20)', 'String', 'tenantId', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 2, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224043356164, 1661288224013996034, 'dept_id', '部门id', 'bigint(20)', 'Long', 'deptId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 3, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224043356165, 1661288224013996034, 'user_id', '用户id', 'bigint(20)', 'Long', 'userId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 4, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224043356166, 1661288224013996034, 'order_num', '排序号', 'int(11)', 'Long', 'orderNum', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 5, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224043356167, 1661288224013996034, 'test_key', 'key键', 'varchar(255)', 'String', 'testKey', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 6, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224043356168, 1661288224013996034, 'value', '值', 'varchar(255)', 'String', 'value', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 7, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224043356169, 1661288224013996034, 'version', '版本', 'int(11)', 'Long', 'version', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 8, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224043356170, 1661288224013996034, 'create_dept', '创建部门', 'bigint(20)', 'Long', 'createDept', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 9, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224043356171, 1661288224013996034, 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 10, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224043356172, 1661288224013996034, 'create_by', '创建人', 'bigint(20)', 'Long', 'createBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 11, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224043356173, 1661288224013996034, 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 12, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224118853634, 1661288224013996034, 'update_by', '更新人', 'bigint(20)', 'Long', 'updateBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 13, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224123047938, 1661288224013996034, 'del_flag', '删除标志', 'int(11)', 'Long', 'delFlag', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 14, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224206934017, 1661288224185962497, 'id', '主键', 'bigint(20)', 'Long', 'id', '1', '0', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 1, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224206934018, 1661288224185962497, 'tenant_id', '租户编号', 'varchar(20)', 'String', 'tenantId', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 2, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224206934019, 1661288224185962497, 'parent_id', '父id', 'bigint(20)', 'Long', 'parentId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 3, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224206934020, 1661288224185962497, 'dept_id', '部门id', 'bigint(20)', 'Long', 'deptId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 4, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224206934021, 1661288224185962497, 'user_id', '用户id', 'bigint(20)', 'Long', 'userId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 5, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224223711233, 1661288224185962497, 'tree_name', '值', 'varchar(255)', 'String', 'treeName', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 6, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224223711234, 1661288224185962497, 'version', '版本', 'int(11)', 'Long', 'version', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 7, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224223711235, 1661288224185962497, 'create_dept', '创建部门', 'bigint(20)', 'Long', 'createDept', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 8, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224223711236, 1661288224185962497, 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 9, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224223711237, 1661288224185962497, 'create_by', '创建人', 'bigint(20)', 'Long', 'createBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 10, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224223711238, 1661288224185962497, 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 11, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224223711239, 1661288224185962497, 'update_by', '更新人', 'bigint(20)', 'Long', 'updateBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 12, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288224223711240, 1661288224185962497, 'del_flag', '删除标志', 'int(11)', 'Long', 'delFlag', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 13, 103, 1, '2023-05-24 16:29:13', 1, '2023-05-24 16:29:13');
+INSERT INTO `gen_table_column` VALUES (1661288385121406978, 1661288385096241154, 'config_id', '参数主键', 'bigint(20)', 'Long', 'configId', '1', '0', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 1, 103, 1, '2023-05-24 16:29:51', 1, '2023-05-24 16:29:51');
+INSERT INTO `gen_table_column` VALUES (1661288385121406979, 1661288385096241154, 'tenant_id', '租户编号', 'varchar(20)', 'String', 'tenantId', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 2, 103, 1, '2023-05-24 16:29:51', 1, '2023-05-24 16:29:51');
+INSERT INTO `gen_table_column` VALUES (1661288385121406980, 1661288385096241154, 'config_name', '参数名称', 'varchar(100)', 'String', 'configName', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 3, 103, 1, '2023-05-24 16:29:51', 1, '2023-05-24 16:29:51');
+INSERT INTO `gen_table_column` VALUES (1661288385121406981, 1661288385096241154, 'config_key', '参数键名', 'varchar(100)', 'String', 'configKey', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 4, 103, 1, '2023-05-24 16:29:51', 1, '2023-05-24 16:29:51');
+INSERT INTO `gen_table_column` VALUES (1661288385121406982, 1661288385096241154, 'config_value', '参数键值', 'varchar(500)', 'String', 'configValue', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'textarea', '', 5, 103, 1, '2023-05-24 16:29:51', 1, '2023-05-24 16:29:51');
+INSERT INTO `gen_table_column` VALUES (1661288385121406983, 1661288385096241154, 'config_type', '系统内置(Y是 N否)', 'char(1)', 'String', 'configType', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'select', '', 6, 103, 1, '2023-05-24 16:29:51', 1, '2023-05-24 16:29:51');
+INSERT INTO `gen_table_column` VALUES (1661288385121406984, 1661288385096241154, 'create_dept', '创建部门', 'bigint(20)', 'Long', 'createDept', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 7, 103, 1, '2023-05-24 16:29:51', 1, '2023-05-24 16:29:51');
+INSERT INTO `gen_table_column` VALUES (1661288385142378498, 1661288385096241154, 'create_by', '创建者', 'bigint(20)', 'Long', 'createBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 8, 103, 1, '2023-05-24 16:29:51', 1, '2023-05-24 16:29:51');
+INSERT INTO `gen_table_column` VALUES (1661288385142378499, 1661288385096241154, 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 9, 103, 1, '2023-05-24 16:29:51', 1, '2023-05-24 16:29:51');
+INSERT INTO `gen_table_column` VALUES (1661288385142378500, 1661288385096241154, 'update_by', '更新者', 'bigint(20)', 'Long', 'updateBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 10, 103, 1, '2023-05-24 16:29:51', 1, '2023-05-24 16:29:51');
+INSERT INTO `gen_table_column` VALUES (1661288385142378501, 1661288385096241154, 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 11, 103, 1, '2023-05-24 16:29:51', 1, '2023-05-24 16:29:51');
+INSERT INTO `gen_table_column` VALUES (1661288385142378502, 1661288385096241154, 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', '1', '1', '1', '1', NULL, 'EQ', 'textarea', '', 12, 103, 1, '2023-05-24 16:29:51', 1, '2023-05-24 16:29:51');
+INSERT INTO `gen_table_column` VALUES (1680196323806289921, 1680196323521077249, 'id', '文件id', 'bigint(20) unsigned', 'Long', 'id', '1', '1', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 1, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323806289922, 1680196323521077249, 'url', '文件访问地址', 'varchar(512)', 'String', 'url', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'textarea', '', 2, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323835650050, 1680196323445579778, 'id', '文件id', 'bigint(20) unsigned', 'Long', 'id', '1', '1', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 1, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323835650051, 1680196323445579778, 'url', '文件访问地址', 'varchar(512)', 'String', 'url', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'textarea', '', 2, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323835650052, 1680196323445579778, 'size', '文件大小,单位字节', 'bigint(20)', 'Long', 'size', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 3, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323873398785, 1680196323445579778, 'filename', '文件名称', 'varchar(256)', 'String', 'filename', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 4, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323873398786, 1680196323445579778, 'original_filename', '原始文件名', 'varchar(256)', 'String', 'originalFilename', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 5, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323873398787, 1680196323445579778, 'base_path', '基础存储路径', 'varchar(256)', 'String', 'basePath', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 6, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323873398788, 1680196323445579778, 'path', '存储路径', 'varchar(256)', 'String', 'path', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 7, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323873398789, 1680196323445579778, 'ext', '文件扩展名', 'varchar(32)', 'String', 'ext', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 8, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323873398790, 1680196323445579778, 'object_id', '文件所属对象id', 'varchar(32)', 'String', 'objectId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 9, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323873398791, 1680196323445579778, 'file_type', '文件类型', 'varchar(32)', 'String', 'fileType', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'select', '', 10, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323932119041, 1680196323445579778, 'attr', '附加属性', 'text', 'String', 'attr', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'textarea', '', 11, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323932119042, 1680196323445579778, 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 12, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323940507649, 1680196323445579778, 'create_by', '创建者', 'varchar(64)', 'String', 'createBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 13, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323940507650, 1680196323445579778, 'update_by', '更新者', 'varchar(64)', 'String', 'updateBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 14, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323940507651, 1680196323445579778, 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 15, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323940507652, 1680196323445579778, 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', '1', '1', '1', '1', NULL, 'EQ', 'textarea', '', 16, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323940507653, 1680196323445579778, 'version', '版本', 'int(11)', 'Long', 'version', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 17, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323940507654, 1680196323445579778, 'del_flag', '删除标志(0代表存在 1代表删除)', 'char(1)', 'String', 'delFlag', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 18, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323961479170, 1680196323521077249, 'size', '文件大小,单位字节', 'bigint(20)', 'Long', 'size', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 3, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323961479171, 1680196323521077249, 'filename', '文件名称', 'varchar(256)', 'String', 'filename', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 4, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323961479172, 1680196323521077249, 'original_filename', '原始文件名', 'varchar(256)', 'String', 'originalFilename', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 5, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323961479173, 1680196323521077249, 'base_path', '基础存储路径', 'varchar(256)', 'String', 'basePath', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 6, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323961479174, 1680196323521077249, 'path', '存储路径', 'varchar(256)', 'String', 'path', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 7, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323961479175, 1680196323521077249, 'ext', '文件扩展名', 'varchar(32)', 'String', 'ext', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 8, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323961479176, 1680196323521077249, 'object_id', '文件所属对象id', 'varchar(32)', 'String', 'objectId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 9, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323961479177, 1680196323521077249, 'file_type', '文件类型', 'varchar(32)', 'String', 'fileType', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'select', '', 10, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323961479178, 1680196323521077249, 'attr', '附加属性', 'text', 'String', 'attr', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'textarea', '', 11, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323999227905, 1680196323445579778, 'update_ip', '更新IP', 'varchar(128)', 'String', 'updateIp', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 19, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196323999227906, 1680196323445579778, 'tenant_id', '租户Id', 'bigint(20)', 'Long', 'tenantId', '0', '0', '1', NULL, NULL, NULL, NULL, 'EQ', 'input', '', 20, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196324020199425, 1680196323521077249, 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 12, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196324020199426, 1680196323521077249, 'create_by', '创建者', 'varchar(64)', 'String', 'createBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 13, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196324020199427, 1680196323521077249, 'update_by', '更新者', 'varchar(64)', 'String', 'updateBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 14, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196324020199428, 1680196323521077249, 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 15, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196324020199429, 1680196323521077249, 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', '1', '1', '1', '1', NULL, 'EQ', 'textarea', '', 16, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196324020199430, 1680196323521077249, 'version', '版本', 'int(11)', 'Long', 'version', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 17, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196324020199431, 1680196323521077249, 'del_flag', '删除标志(0代表存在 1代表删除)', 'char(1)', 'String', 'delFlag', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 18, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196324020199432, 1680196323521077249, 'update_ip', '更新IP', 'varchar(128)', 'String', 'updateIp', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 19, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680196324020199433, 1680196323521077249, 'tenant_id', '租户Id', 'bigint(20)', 'Long', 'tenantId', '0', '0', '1', NULL, NULL, NULL, NULL, 'EQ', 'input', '', 20, 103, 1, '2023-07-15 20:43:15', 1, '2023-07-15 20:43:15');
+INSERT INTO `gen_table_column` VALUES (1680199147667853313, 1680199147407806465, 'id', '文件id', 'bigint(20) unsigned', 'Long', 'id', '1', '1', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 1, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147667853314, 1680199147407806465, 'url', '文件访问地址', 'varchar(512)', 'String', 'url', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'textarea', '', 2, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147667853315, 1680199147407806465, 'size', '文件大小,单位字节', 'bigint(20)', 'Long', 'size', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 3, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147667853316, 1680199147407806465, 'filename', '文件名称', 'varchar(256)', 'String', 'filename', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 4, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147667853317, 1680199147407806465, 'original_filename', '原始文件名', 'varchar(256)', 'String', 'originalFilename', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 5, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147667853318, 1680199147407806465, 'base_path', '基础存储路径', 'varchar(256)', 'String', 'basePath', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 6, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147734962178, 1680199147407806465, 'path', '存储路径', 'varchar(256)', 'String', 'path', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 7, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147734962179, 1680199147407806465, 'ext', '文件扩展名', 'varchar(32)', 'String', 'ext', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 8, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147734962180, 1680199147407806465, 'object_id', '文件所属对象id', 'varchar(32)', 'String', 'objectId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 9, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147734962181, 1680199147407806465, 'file_type', '文件类型', 'varchar(32)', 'String', 'fileType', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'select', '', 10, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147734962182, 1680199147407806465, 'attr', '附加属性', 'text', 'String', 'attr', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'textarea', '', 11, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147734962183, 1680199147407806465, 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 12, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147734962184, 1680199147407806465, 'create_by', '创建者', 'varchar(64)', 'String', 'createBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 13, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147734962185, 1680199147407806465, 'update_by', '更新者', 'varchar(64)', 'String', 'updateBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 14, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147734962186, 1680199147407806465, 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 15, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147734962187, 1680199147407806465, 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', '1', '1', '1', '1', NULL, 'EQ', 'textarea', '', 16, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147734962188, 1680199147407806465, 'version', '版本', 'int(11)', 'Long', 'version', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 17, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147734962189, 1680199147407806465, 'del_flag', '删除标志(0代表存在 1代表删除)', 'char(1)', 'String', 'delFlag', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 18, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147734962190, 1680199147407806465, 'update_ip', '更新IP', 'varchar(128)', 'String', 'updateIp', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 19, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680199147734962191, 1680199147407806465, 'tenant_id', '租户Id', 'bigint(20)', 'Long', 'tenantId', '0', '0', '1', NULL, NULL, NULL, NULL, 'EQ', 'input', '', 20, 103, 1, '2023-07-15 20:54:28', 1, '2023-07-15 20:54:28');
+INSERT INTO `gen_table_column` VALUES (1680481753240215553, 1680481752850145282, 'id', 'id', 'bigint(20) unsigned', 'Long', 'id', '1', '1', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 1, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215554, 1680481752850145282, 'prompt', '描述词', 'text', 'String', 'prompt', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'textarea', '', 2, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215555, 1680481752850145282, 'negative_prompt', '负面词', 'text', 'String', 'negativePrompt', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'textarea', '', 3, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215556, 1680481752850145282, 'model_name', '模型名称', 'varchar(256)', 'String', 'modelName', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 4, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215557, 1680481752850145282, 'steps', '迭代步数', 'int(10)', 'Integer', 'steps', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 5, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215558, 1680481752850145282, 'seed', '种子', 'varchar(256)', 'String', 'seed', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 6, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215559, 1680481752850145282, 'width', '图片宽度', 'varchar(256)', 'String', 'width', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 7, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215560, 1680481752850145282, 'height', '图片高度', 'varchar(32)', 'String', 'height', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 8, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215561, 1680481752850145282, 'sampler_name', '采样方法', 'varchar(32)', 'String', 'samplerName', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 9, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215562, 1680481752850145282, 'create_dept', '创建部门', 'bigint(20)', 'Long', 'createDept', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 10, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215563, 1680481752850145282, 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 11, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215564, 1680481752850145282, 'create_by', '创建者', 'varchar(64)', 'String', 'createBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 12, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215565, 1680481752850145282, 'update_by', '更新者', 'varchar(64)', 'String', 'updateBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 13, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215566, 1680481752850145282, 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 14, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215567, 1680481752850145282, 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', '1', '1', '1', '1', NULL, 'EQ', 'textarea', '', 15, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215568, 1680481752850145282, 'version', '版本', 'int(11)', 'Long', 'version', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 16, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215569, 1680481752850145282, 'del_flag', '删除标志(0代表存在 1代表删除)', 'char(1)', 'String', 'delFlag', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 17, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215570, 1680481752850145282, 'update_ip', '更新IP', 'varchar(128)', 'String', 'updateIp', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 18, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1680481753240215571, 1680481752850145282, 'tenant_id', '租户Id', 'bigint(20)', 'Long', 'tenantId', '0', '0', '1', NULL, NULL, NULL, NULL, 'EQ', 'input', '', 19, 103, 1, '2023-07-16 15:37:26', 1, '2023-07-16 15:37:26');
+INSERT INTO `gen_table_column` VALUES (1728684655246950402, 1728684654923988993, 'id', '主键', 'bigint(20)', 'Long', 'id', '1', '0', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 1, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950403, 1728684654923988993, 'message_id', '消息 id', 'varchar(64)', 'String', 'messageId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 2, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950404, 1728684654923988993, 'parent_message_id', '父级消息 id', 'varchar(64)', 'String', 'parentMessageId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 3, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950405, 1728684654923988993, 'parent_answer_message_id', '父级回答消息 id', 'varchar(64)', 'String', 'parentAnswerMessageId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 4, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950406, 1728684654923988993, 'parent_question_message_id', '父级问题消息 id', 'varchar(64)', 'String', 'parentQuestionMessageId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 5, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950407, 1728684654923988993, 'context_count', '上下文数量', 'bigint(20)', 'Long', 'contextCount', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 6, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950408, 1728684654923988993, 'question_context_count', '问题上下文数量', 'bigint(20)', 'Long', 'questionContextCount', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 7, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950409, 1728684654923988993, 'message_type', '消息类型枚举', 'int(11)', 'Long', 'messageType', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'select', '', 8, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950410, 1728684654923988993, 'chat_room_id', '聊天室 id', 'bigint(20)', 'Long', 'chatRoomId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 9, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950411, 1728684654923988993, 'conversation_id', '对话 id', 'varchar(255)', 'String', 'conversationId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 10, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950412, 1728684654923988993, 'api_type', 'API 类型', 'varchar(20)', 'String', 'apiType', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'select', '', 11, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950413, 1728684654923988993, 'api_key', 'ApiKey', 'varchar(255)', 'String', 'apiKey', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 12, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950414, 1728684654923988993, 'content', '消息内容', 'varchar(5000)', 'String', 'content', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'editor', '', 13, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950415, 1728684654923988993, 'original_data', '消息的原始请求或响应数据', 'text', 'String', 'originalData', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'textarea', '', 14, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950416, 1728684654923988993, 'response_error_data', '错误的响应数据', 'text', 'String', 'responseErrorData', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'textarea', '', 15, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950417, 1728684654923988993, 'prompt_tokens', '输入消息的 tokens', 'bigint(20)', 'Long', 'promptTokens', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 16, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950418, 1728684654923988993, 'completion_tokens', '输出消息的 tokens', 'bigint(20)', 'Long', 'completionTokens', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 17, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950419, 1728684654923988993, 'total_tokens', '累计 Tokens', 'bigint(20)', 'Long', 'totalTokens', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 18, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950420, 1728684654923988993, 'model_name', '模型名称', 'varchar(255)', 'String', 'modelName', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 19, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950421, 1728684654923988993, 'status', '聊天记录状态', 'int(11)', 'Long', 'status', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'radio', '', 20, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950422, 1728684654923988993, 'is_hide', '是否隐藏 0 否 1 是', 'tinyint(4)', 'Integer', 'isHide', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 21, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950423, 1728684654923988993, 'create_dept', '创建部门', 'bigint(20)', 'Long', 'createDept', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 22, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950424, 1728684654923988993, 'create_by', '创建者', 'bigint(20)', 'Long', 'createBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 23, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950425, 1728684654923988993, 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 24, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950426, 1728684654923988993, 'update_by', '更新者', 'bigint(20)', 'Long', 'updateBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 25, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950427, 1728684654923988993, 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 26, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1728684655246950428, 1728684654923988993, 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', '1', '1', '1', '1', NULL, 'EQ', 'textarea', '', 27, 103, 1, '2023-11-26 15:58:34', 1, '2023-11-26 15:58:34');
+INSERT INTO `gen_table_column` VALUES (1740573615225053185, 1740573614897897473, 'id', '主键', 'int(11)', 'Long', 'id', '1', '1', '1', NULL, '1', '1', NULL, 'EQ', 'input', '', 1, 103, 1, '2023-12-29 11:21:03', 1, '2023-12-29 11:21:03');
+INSERT INTO `gen_table_column` VALUES (1740573615225053186, 1740573614897897473, 'order_no', '订单编号', 'varchar(20)', 'String', 'orderNo', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 2, 103, 1, '2023-12-29 11:21:03', 1, '2023-12-29 11:21:03');
+INSERT INTO `gen_table_column` VALUES (1740573615225053187, 1740573614897897473, 'order_name', '订单名称', 'varchar(100)', 'String', 'orderName', '0', '0', '1', '1', '1', '1', '1', 'LIKE', 'input', '', 3, 103, 1, '2023-12-29 11:21:03', 1, '2023-12-29 11:21:03');
+INSERT INTO `gen_table_column` VALUES (1740573615225053188, 1740573614897897473, 'amount', '金额', 'decimal(10,2)', 'BigDecimal', 'amount', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 4, 103, 1, '2023-12-29 11:21:03', 1, '2023-12-29 11:21:03');
+INSERT INTO `gen_table_column` VALUES (1740573615225053189, 1740573614897897473, 'payment_status', '支付状态', 'char(1)', 'String', 'paymentStatus', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'radio', '', 5, 103, 1, '2023-12-29 11:21:03', 1, '2023-12-29 11:21:03');
+INSERT INTO `gen_table_column` VALUES (1740573615225053190, 1740573614897897473, 'payment_method', '支付方式', 'char(1)', 'String', 'paymentMethod', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'input', '', 6, 103, 1, '2023-12-29 11:21:03', 1, '2023-12-29 11:21:03');
+INSERT INTO `gen_table_column` VALUES (1740573615225053191, 1740573614897897473, 'user_id', '用户ID', 'timestamp', 'Date', 'userId', '0', '0', '1', '1', '1', '1', '1', 'EQ', 'datetime', '', 7, 103, 1, '2023-12-29 11:21:03', 1, '2023-12-29 11:21:03');
+INSERT INTO `gen_table_column` VALUES (1740573615225053192, 1740573614897897473, 'create_by', '创建者', 'bigint(20)', 'Long', 'createBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 8, 103, 1, '2023-12-29 11:21:03', 1, '2023-12-29 11:21:03');
+INSERT INTO `gen_table_column` VALUES (1740573615225053193, 1740573614897897473, 'create_time', '创建时间', 'datetime', 'Date', 'createTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 9, 103, 1, '2023-12-29 11:21:03', 1, '2023-12-29 11:21:03');
+INSERT INTO `gen_table_column` VALUES (1740573615225053194, 1740573614897897473, 'update_by', '更新者', 'bigint(20)', 'Long', 'updateBy', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'input', '', 10, 103, 1, '2023-12-29 11:21:03', 1, '2023-12-29 11:21:03');
+INSERT INTO `gen_table_column` VALUES (1740573615225053195, 1740573614897897473, 'update_time', '更新时间', 'datetime', 'Date', 'updateTime', '0', '0', NULL, NULL, NULL, NULL, NULL, 'EQ', 'datetime', '', 11, 103, 1, '2023-12-29 11:21:03', 1, '2023-12-29 11:21:03');
+INSERT INTO `gen_table_column` VALUES (1740573615225053196, 1740573614897897473, 'remark', '备注', 'varchar(500)', 'String', 'remark', '0', '0', '1', '1', '1', '1', NULL, 'EQ', 'textarea', '', 12, 103, 1, '2023-12-29 11:21:03', 1, '2023-12-29 11:21:03');
+
+-- ----------------------------
+-- Table structure for sys_config
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_config`;
+CREATE TABLE `sys_config`  (
+                               `config_id` bigint(20) NOT NULL COMMENT '参数主键',
+                               `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+                               `config_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '参数名称',
+                               `config_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '参数键名',
+                               `config_value` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '参数键值',
+                               `config_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'N' COMMENT '系统内置(Y是 N否)',
+                               `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                               `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
+                               `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                               `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
+                               `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                               `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+                               PRIMARY KEY (`config_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '参数配置表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_config
+-- ----------------------------
+INSERT INTO `sys_config` VALUES (1, '000000', '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 103, 1, '2023-05-14 15:19:42', NULL, NULL, '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow');
+INSERT INTO `sys_config` VALUES (2, '000000', '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 103, 1, '2023-05-14 15:19:42', NULL, NULL, '初始化密码 123456');
+INSERT INTO `sys_config` VALUES (3, '000000', '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 103, 1, '2023-05-14 15:19:42', NULL, NULL, '深色主题theme-dark,浅色主题theme-light');
+INSERT INTO `sys_config` VALUES (5, '000000', '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 103, 1, '2023-05-14 15:19:42', NULL, NULL, '是否开启注册用户功能(true开启,false关闭)');
+INSERT INTO `sys_config` VALUES (11, '000000', 'OSS预览列表资源开关', 'sys.oss.previewListResource', 'true', 'Y', 103, 1, '2023-05-14 15:19:42', NULL, NULL, 'true:开启, false:关闭');
+INSERT INTO `sys_config` VALUES (1729685495520854018, '911866', '主框架页-默认皮肤样式名称', 'sys.index.skinName', 'skin-blue', 'Y', 103, 1, '2023-05-14 15:19:42', 1, '2023-05-14 15:19:42', '蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow');
+INSERT INTO `sys_config` VALUES (1729685495520854019, '911866', '用户管理-账号初始密码', 'sys.user.initPassword', '123456', 'Y', 103, 1, '2023-05-14 15:19:42', 1, '2023-05-14 15:19:42', '初始化密码 123456');
+INSERT INTO `sys_config` VALUES (1729685495520854020, '911866', '主框架页-侧边栏主题', 'sys.index.sideTheme', 'theme-dark', 'Y', 103, 1, '2023-05-14 15:19:42', 1, '2023-05-14 15:19:42', '深色主题theme-dark,浅色主题theme-light');
+INSERT INTO `sys_config` VALUES (1729685495583768578, '911866', '账号自助-是否开启用户注册功能', 'sys.account.registerUser', 'false', 'Y', 103, 1, '2023-05-14 15:19:42', 1, '2023-05-14 15:19:42', '是否开启注册用户功能(true开启,false关闭)');
+INSERT INTO `sys_config` VALUES (1729685495583768579, '911866', 'OSS预览列表资源开关', 'sys.oss.previewListResource', 'true', 'Y', 103, 1, '2023-05-14 15:19:42', 1, '2023-05-14 15:19:42', 'true:开启, false:关闭');
+
+-- ----------------------------
+-- Table structure for sys_dept
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_dept`;
+CREATE TABLE `sys_dept`  (
+                             `dept_id` bigint(20) NOT NULL COMMENT '部门id',
+                             `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+                             `parent_id` bigint(20) NULL DEFAULT 0 COMMENT '父部门id',
+                             `ancestors` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '祖级列表',
+                             `dept_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '部门名称',
+                             `order_num` int(4) NULL DEFAULT 0 COMMENT '显示顺序',
+                             `leader` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '负责人',
+                             `phone` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系电话',
+                             `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱',
+                             `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '部门状态(0正常 1停用)',
+                             `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+                             `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                             `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
+                             `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                             `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
+                             `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                             PRIMARY KEY (`dept_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部门表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_dept
+-- ----------------------------
+INSERT INTO `sys_dept` VALUES (100, '000000', 0, '0', '熊猫科技', 0, 'ageerle', '15888888888', 'ageerle@163.com', '0', '0', 103, 1, '2023-05-14 15:19:39', 1, '2023-12-29 11:18:24');
+INSERT INTO `sys_dept` VALUES (101, '000000', 100, '0,100', '深圳总公司', 1, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2023-05-14 15:19:39', NULL, NULL);
+INSERT INTO `sys_dept` VALUES (102, '000000', 100, '0,100', '长沙分公司', 2, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2023-05-14 15:19:39', NULL, NULL);
+INSERT INTO `sys_dept` VALUES (103, '000000', 101, '0,100,101', '研发部门', 1, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2023-05-14 15:19:39', NULL, NULL);
+INSERT INTO `sys_dept` VALUES (104, '000000', 101, '0,100,101', '市场部门', 2, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2023-05-14 15:19:39', NULL, NULL);
+INSERT INTO `sys_dept` VALUES (105, '000000', 101, '0,100,101', '测试部门', 3, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2023-05-14 15:19:39', NULL, NULL);
+INSERT INTO `sys_dept` VALUES (106, '000000', 101, '0,100,101', '财务部门', 4, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2023-05-14 15:19:39', NULL, NULL);
+INSERT INTO `sys_dept` VALUES (107, '000000', 101, '0,100,101', '运维部门', 5, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2023-05-14 15:19:39', NULL, NULL);
+INSERT INTO `sys_dept` VALUES (108, '000000', 102, '0,100,102', '市场部门', 1, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2023-05-14 15:19:39', NULL, NULL);
+INSERT INTO `sys_dept` VALUES (109, '000000', 102, '0,100,102', '财务部门', 2, '疯狂的狮子Li', '15888888888', 'xxx@qq.com', '0', '0', 103, 1, '2023-05-14 15:19:39', NULL, NULL);
+
+-- ----------------------------
+-- Table structure for sys_dict_data
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_dict_data`;
+CREATE TABLE `sys_dict_data`  (
+                                  `dict_code` bigint(20) NOT NULL COMMENT '字典编码',
+                                  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+                                  `dict_sort` int(4) NULL DEFAULT 0 COMMENT '字典排序',
+                                  `dict_label` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典标签',
+                                  `dict_value` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典键值',
+                                  `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典类型',
+                                  `css_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '样式属性(其他样式扩展)',
+                                  `list_class` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '表格回显样式',
+                                  `is_default` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'N' COMMENT '是否默认(Y是 N否)',
+                                  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)',
+                                  `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                                  `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
+                                  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                                  `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
+                                  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                                  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+                                  PRIMARY KEY (`dict_code`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典数据表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_dict_data
+-- ----------------------------
+INSERT INTO `sys_dict_data` VALUES (1, '000000', 1, '男', '0', 'sys_user_sex', '', '', 'Y', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '性别男');
+INSERT INTO `sys_dict_data` VALUES (2, '000000', 2, '女', '1', 'sys_user_sex', '', '', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '性别女');
+INSERT INTO `sys_dict_data` VALUES (3, '000000', 3, '未知', '2', 'sys_user_sex', '', '', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '性别未知');
+INSERT INTO `sys_dict_data` VALUES (4, '000000', 1, '显示', '0', 'sys_show_hide', '', 'primary', 'Y', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '显示菜单');
+INSERT INTO `sys_dict_data` VALUES (5, '000000', 2, '隐藏', '1', 'sys_show_hide', '', 'danger', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '隐藏菜单');
+INSERT INTO `sys_dict_data` VALUES (6, '000000', 1, '正常', '0', 'sys_normal_disable', '', 'primary', 'Y', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '正常状态');
+INSERT INTO `sys_dict_data` VALUES (7, '000000', 2, '停用', '1', 'sys_normal_disable', '', 'danger', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '停用状态');
+INSERT INTO `sys_dict_data` VALUES (12, '000000', 1, '是', 'Y', 'sys_yes_no', '', 'primary', 'Y', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '系统默认是');
+INSERT INTO `sys_dict_data` VALUES (13, '000000', 2, '否', 'N', 'sys_yes_no', '', 'danger', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '系统默认否');
+INSERT INTO `sys_dict_data` VALUES (14, '000000', 1, '通知', '1', 'sys_notice_type', '', 'warning', 'Y', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '通知');
+INSERT INTO `sys_dict_data` VALUES (15, '000000', 2, '公告', '2', 'sys_notice_type', '', 'success', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '公告');
+INSERT INTO `sys_dict_data` VALUES (16, '000000', 1, '正常', '0', 'sys_notice_status', '', 'primary', 'Y', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '正常状态');
+INSERT INTO `sys_dict_data` VALUES (17, '000000', 2, '关闭', '1', 'sys_notice_status', '', 'danger', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '关闭状态');
+INSERT INTO `sys_dict_data` VALUES (18, '000000', 1, '新增', '1', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '新增操作');
+INSERT INTO `sys_dict_data` VALUES (19, '000000', 2, '修改', '2', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '修改操作');
+INSERT INTO `sys_dict_data` VALUES (20, '000000', 3, '删除', '3', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '删除操作');
+INSERT INTO `sys_dict_data` VALUES (21, '000000', 4, '授权', '4', 'sys_oper_type', '', 'primary', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '授权操作');
+INSERT INTO `sys_dict_data` VALUES (22, '000000', 5, '导出', '5', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '导出操作');
+INSERT INTO `sys_dict_data` VALUES (23, '000000', 6, '导入', '6', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '导入操作');
+INSERT INTO `sys_dict_data` VALUES (24, '000000', 7, '强退', '7', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '强退操作');
+INSERT INTO `sys_dict_data` VALUES (25, '000000', 8, '生成代码', '8', 'sys_oper_type', '', 'warning', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '生成操作');
+INSERT INTO `sys_dict_data` VALUES (26, '000000', 9, '清空数据', '9', 'sys_oper_type', '', 'danger', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '清空操作');
+INSERT INTO `sys_dict_data` VALUES (27, '000000', 1, '成功', '0', 'sys_common_status', '', 'primary', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '正常状态');
+INSERT INTO `sys_dict_data` VALUES (28, '000000', 2, '失败', '1', 'sys_common_status', '', 'danger', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '停用状态');
+INSERT INTO `sys_dict_data` VALUES (29, '000000', 99, '其他', '0', 'sys_oper_type', '', 'info', 'N', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '其他操作');
+INSERT INTO `sys_dict_data` VALUES (1775756996568993793, '000000', 1, '免费用户', '0', 'sys_user_grade', '', 'info', 'N', '0', 103, 1, '2024-04-04 13:27:15', 1, '2024-04-04 13:30:09', '');
+INSERT INTO `sys_dict_data` VALUES (1775757116970684418, '000000', 2, '高级会员', '1', 'sys_user_grade', '', 'success', 'N', '0', 103, 1, '2024-04-04 13:27:43', 1, '2024-04-04 13:30:15', '');
+INSERT INTO `sys_dict_data` VALUES (1776109770934677506, '000000', 0, 'token计费', '1', 'sys_model_billing', '', 'primary', 'N', '0', 103, 1, '2024-04-05 12:49:03', 1, '2024-04-21 00:05:41', '');
+INSERT INTO `sys_dict_data` VALUES (1776109853377916929, '000000', 0, '次数计费', '2', 'sys_model_billing', '', 'success', 'N', '0', 103, 1, '2024-04-05 12:49:22', 1, '2024-04-05 12:49:22', '');
+INSERT INTO `sys_dict_data` VALUES (1780264338471858177, '000000', 0, '未支付', '1', 'pay_state', '', 'info', 'N', '0', 103, 1, '2024-04-16 23:57:49', 1, '2024-04-16 23:58:29', '');
+INSERT INTO `sys_dict_data` VALUES (1780264431589601282, '000000', 2, '已支付', '2', 'pay_state', '', 'success', 'N', '0', 103, 1, '2024-04-16 23:58:11', 1, '2024-04-16 23:58:21', '');
+
+-- ----------------------------
+-- Table structure for sys_dict_type
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_dict_type`;
+CREATE TABLE `sys_dict_type`  (
+                                  `dict_id` bigint(20) NOT NULL COMMENT '字典主键',
+                                  `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+                                  `dict_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典名称',
+                                  `dict_type` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '字典类型',
+                                  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)',
+                                  `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                                  `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
+                                  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                                  `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
+                                  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                                  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+                                  PRIMARY KEY (`dict_id`) USING BTREE,
+                                  UNIQUE INDEX `tenant_id`(`tenant_id`, `dict_type`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典类型表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_dict_type
+-- ----------------------------
+INSERT INTO `sys_dict_type` VALUES (1, '000000', '用户性别', 'sys_user_sex', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '用户性别列表');
+INSERT INTO `sys_dict_type` VALUES (2, '000000', '菜单状态', 'sys_show_hide', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '菜单状态列表');
+INSERT INTO `sys_dict_type` VALUES (3, '000000', '系统开关', 'sys_normal_disable', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '系统开关列表');
+INSERT INTO `sys_dict_type` VALUES (6, '000000', '系统是否', 'sys_yes_no', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '系统是否列表');
+INSERT INTO `sys_dict_type` VALUES (7, '000000', '通知类型', 'sys_notice_type', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '通知类型列表');
+INSERT INTO `sys_dict_type` VALUES (8, '000000', '通知状态', 'sys_notice_status', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '通知状态列表');
+INSERT INTO `sys_dict_type` VALUES (9, '000000', '操作类型', 'sys_oper_type', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '操作类型列表');
+INSERT INTO `sys_dict_type` VALUES (10, '000000', '系统状态', 'sys_common_status', '0', 103, 1, '2023-05-14 15:19:41', NULL, NULL, '登录状态列表');
+INSERT INTO `sys_dict_type` VALUES (1729685494468083714, '911866', '用户性别', 'sys_user_sex', '0', 103, 1, '2023-05-14 15:19:41', 1, '2023-05-14 15:19:41', '用户性别列表');
+INSERT INTO `sys_dict_type` VALUES (1729685494468083715, '911866', '菜单状态', 'sys_show_hide', '0', 103, 1, '2023-05-14 15:19:41', 1, '2023-05-14 15:19:41', '菜单状态列表');
+INSERT INTO `sys_dict_type` VALUES (1729685494468083716, '911866', '系统开关', 'sys_normal_disable', '0', 103, 1, '2023-05-14 15:19:41', 1, '2023-05-14 15:19:41', '系统开关列表');
+INSERT INTO `sys_dict_type` VALUES (1729685494468083717, '911866', '系统是否', 'sys_yes_no', '0', 103, 1, '2023-05-14 15:19:41', 1, '2023-05-14 15:19:41', '系统是否列表');
+INSERT INTO `sys_dict_type` VALUES (1729685494468083718, '911866', '通知类型', 'sys_notice_type', '0', 103, 1, '2023-05-14 15:19:41', 1, '2023-05-14 15:19:41', '通知类型列表');
+INSERT INTO `sys_dict_type` VALUES (1729685494468083719, '911866', '通知状态', 'sys_notice_status', '0', 103, 1, '2023-05-14 15:19:41', 1, '2023-05-14 15:19:41', '通知状态列表');
+INSERT INTO `sys_dict_type` VALUES (1729685494468083720, '911866', '操作类型', 'sys_oper_type', '0', 103, 1, '2023-05-14 15:19:41', 1, '2023-05-14 15:19:41', '操作类型列表');
+INSERT INTO `sys_dict_type` VALUES (1729685494468083721, '911866', '系统状态', 'sys_common_status', '0', 103, 1, '2023-05-14 15:19:41', 1, '2023-05-14 15:19:41', '登录状态列表');
+INSERT INTO `sys_dict_type` VALUES (1775756736895438849, '000000', '用户等级', 'sys_user_grade', '0', 103, 1, '2024-04-04 13:26:13', 1, '2024-04-23 19:25:25', '用户等级');
+INSERT INTO `sys_dict_type` VALUES (1776109665045278721, '000000', '模型计费方式', 'sys_model_billing', '0', 103, 1, '2024-04-05 12:48:37', 1, '2024-04-08 11:22:18', '模型计费方式');
+INSERT INTO `sys_dict_type` VALUES (1780263881368219649, '000000', '支付状态', 'pay_state', '0', 103, 1, '2024-04-16 23:56:00', 1, '2024-04-16 23:56:00', '支付状态');
+
+-- ----------------------------
+-- Table structure for sys_file_info
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_file_info`;
+CREATE TABLE `sys_file_info`  (
+                                  `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '文件id',
+                                  `url` varchar(512) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '文件访问地址',
+                                  `size` bigint(20) NULL DEFAULT NULL COMMENT '文件大小,单位字节',
+                                  `filename` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件名称',
+                                  `original_filename` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '原始文件名',
+                                  `base_path` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '基础存储路径',
+                                  `path` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '存储路径',
+                                  `ext` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件扩展名',
+                                  `user_id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件所属用户',
+                                  `file_type` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '文件类型',
+                                  `attr` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '附加属性',
+                                  `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                                  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                                  `create_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '创建者',
+                                  `update_by` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '更新者',
+                                  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                                  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+                                  `version` int(11) NULL DEFAULT NULL COMMENT '版本',
+                                  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 1代表删除)',
+                                  `update_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '更新IP',
+                                  `tenant_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '租户Id',
+                                  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '文件记录表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_file_info
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for sys_logininfor
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_logininfor`;
+CREATE TABLE `sys_logininfor`  (
+                                   `info_id` bigint(20) NOT NULL COMMENT '访问ID',
+                                   `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+                                   `user_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户账号',
+                                   `ipaddr` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '登录IP地址',
+                                   `login_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '登录地点',
+                                   `browser` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '浏览器类型',
+                                   `os` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作系统',
+                                   `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '登录状态(0成功 1失败)',
+                                   `msg` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '提示消息',
+                                   `login_time` datetime NULL DEFAULT NULL COMMENT '访问时间',
+                                   PRIMARY KEY (`info_id`) USING BTREE,
+                                   INDEX `idx_sys_logininfor_s`(`status`) USING BTREE,
+                                   INDEX `idx_sys_logininfor_lt`(`login_time`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统访问记录' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_logininfor
+-- ----------------------------
+INSERT INTO `sys_logininfor` VALUES (1789929320503357442, '00000', 'pandarobot@163.com', '127.0.0.1', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-05-13 16:03:00');
+INSERT INTO `sys_logininfor` VALUES (1789958553149739010, '00000', 'admin', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-05-13 17:59:10');
+INSERT INTO `sys_logininfor` VALUES (1789985977795125250, '00000', 'admin', '0:0:0:0:0:0:0:1', '内网IP', 'Chrome', 'Windows 10 or Windows Server 2016', '0', '登录成功', '2024-05-13 19:48:08');
+
+-- ----------------------------
+-- Table structure for sys_menu
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_menu`;
+CREATE TABLE `sys_menu`  (
+                             `menu_id` bigint(20) NOT NULL COMMENT '菜单ID',
+                             `menu_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单名称',
+                             `parent_id` bigint(20) NULL DEFAULT 0 COMMENT '父菜单ID',
+                             `order_num` int(11) NULL DEFAULT 0 COMMENT '显示顺序',
+                             `path` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '路由地址',
+                             `component` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '组件路径',
+                             `query_param` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '路由参数',
+                             `is_frame` int(11) NULL DEFAULT 1 COMMENT '是否为外链(0是 1否)',
+                             `is_cache` int(11) NULL DEFAULT 0 COMMENT '是否缓存(0缓存 1不缓存)',
+                             `menu_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '菜单类型(M目录 C菜单 F按钮)',
+                             `visible` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '显示状态(0显示 1隐藏)',
+                             `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '菜单状态(0正常 1停用)',
+                             `perms` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限标识',
+                             `icon` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '#' COMMENT '菜单图标',
+                             `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                             `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
+                             `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                             `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
+                             `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                             `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '备注',
+                             PRIMARY KEY (`menu_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单权限表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_menu
+-- ----------------------------
+INSERT INTO `sys_menu` VALUES (1, '系统管理', 0, 1, 'system', NULL, '', 1, 0, 'M', '0', '0', '', 'system', 103, 1, '2023-05-14 15:19:39', NULL, NULL, '系统管理目录');
+INSERT INTO `sys_menu` VALUES (2, '系统监控', 0, 3, 'monitor', NULL, '', 1, 0, 'M', '0', '0', '', 'monitor', 103, 1, '2023-05-14 15:19:39', NULL, NULL, '系统监控目录');
+INSERT INTO `sys_menu` VALUES (6, '租户管理', 0, 2, 'tenant', NULL, '', 1, 0, 'M', '1', '1', '', 'chart', 103, 1, '2023-05-14 15:19:39', 1, '2024-04-04 22:35:33', '租户管理目录');
+INSERT INTO `sys_menu` VALUES (100, '用户管理', 1775500307898949634, 1, 'user', 'system/user/index', '', 1, 0, 'C', '0', '0', 'system:user:list', 'user', 103, 1, '2023-05-14 15:19:39', 1, '2024-04-03 20:27:27', '用户管理菜单');
+INSERT INTO `sys_menu` VALUES (101, '角色管理', 1, 2, 'role', 'system/role/index', '', 1, 0, 'C', '0', '0', 'system:role:list', 'peoples', 103, 1, '2023-05-14 15:19:39', 1, '2024-05-12 01:11:47', '角色管理菜单');
+INSERT INTO `sys_menu` VALUES (102, '菜单管理', 1, 3, 'menu', 'system/menu/index', '', 1, 0, 'C', '0', '0', 'system:menu:list', 'tree-table', 103, 1, '2023-05-14 15:19:39', NULL, NULL, '菜单管理菜单');
+INSERT INTO `sys_menu` VALUES (103, '部门管理', 1, 4, 'dept', 'system/dept/index', '', 1, 0, 'C', '0', '0', 'system:dept:list', 'tree', 103, 1, '2023-05-14 15:19:39', 1, '2024-05-12 01:10:23', '部门管理菜单');
+INSERT INTO `sys_menu` VALUES (104, '岗位管理', 1, 5, 'post', 'system/post/index', '', 1, 0, 'C', '1', '1', 'system:post:list', 'post', 103, 1, '2023-05-14 15:19:39', 1, '2024-04-04 22:36:15', '岗位管理菜单');
+INSERT INTO `sys_menu` VALUES (105, '字典管理', 1, 6, 'dict', 'system/dict/index', '', 1, 0, 'C', '0', '0', 'system:dict:list', 'dict', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '字典管理菜单');
+INSERT INTO `sys_menu` VALUES (106, '系统参数', 1, 10, 'config', 'system/config/index', '', 1, 0, 'C', '0', '0', 'system:config:list', 'edit', 103, 1, '2023-05-14 15:19:40', 1, '2024-05-13 18:07:44', '参数设置菜单');
+INSERT INTO `sys_menu` VALUES (107, '通知公告', 1775500307898949634, 14, 'notice', 'system/notice/index', '', 1, 0, 'C', '1', '0', 'system:notice:list', 'message', 103, 1, '2023-05-14 15:19:40', 1, '2024-05-13 18:07:50', '通知公告菜单');
+INSERT INTO `sys_menu` VALUES (108, '日志管理', 1, 9, 'log', '', '', 1, 0, 'M', '0', '0', '', 'log', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '日志管理菜单');
+INSERT INTO `sys_menu` VALUES (109, '在线用户', 2, 1, 'online', 'monitor/online/index', '', 1, 0, 'C', '0', '0', 'monitor:online:list', 'online', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '在线用户菜单');
+INSERT INTO `sys_menu` VALUES (113, '缓存监控', 2, 5, 'cache', 'monitor/cache/index', '', 1, 0, 'C', '0', '0', 'monitor:cache:list', 'redis', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '缓存监控菜单');
+INSERT INTO `sys_menu` VALUES (115, '代码生成', 1, 2, 'gen', 'tool/gen/index', '', 1, 0, 'C', '0', '0', 'tool:gen:list', 'code', 103, 1, '2023-05-14 15:19:40', 1, '2023-12-29 11:33:01', '代码生成菜单');
+INSERT INTO `sys_menu` VALUES (118, '存储管理', 1775500307898949634, 10, 'oss', 'system/oss/config', '', 1, 0, 'C', '0', '0', 'system:oss:list', 'redis', 103, 1, '2023-05-14 15:19:40', 1, '2024-04-07 19:56:55', '文件管理菜单');
+INSERT INTO `sys_menu` VALUES (121, '租户管理', 6, 1, 'tenant', 'system/tenant/index', '', 1, 0, 'C', '0', '0', 'system:tenant:list', 'list', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '租户管理菜单');
+INSERT INTO `sys_menu` VALUES (122, '租户套餐管理', 6, 2, 'tenantPackage', 'system/tenantPackage/index', '', 1, 0, 'C', '0', '0', 'system:tenantPackage:list', 'form', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '租户套餐管理菜单');
+INSERT INTO `sys_menu` VALUES (500, '操作日志', 108, 1, 'operlog', 'monitor/operlog/index', '', 1, 0, 'C', '0', '0', 'monitor:operlog:list', 'form', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '操作日志菜单');
+INSERT INTO `sys_menu` VALUES (501, '登录日志', 108, 2, 'logininfor', 'monitor/logininfor/index', '', 1, 0, 'C', '0', '0', 'monitor:logininfor:list', 'logininfor', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '登录日志菜单');
+INSERT INTO `sys_menu` VALUES (1001, '用户查询', 100, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:user:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1002, '用户新增', 100, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:user:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1003, '用户修改', 100, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:user:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1004, '用户删除', 100, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:user:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1005, '用户导出', 100, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:user:export', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1006, '用户导入', 100, 6, '', '', '', 1, 0, 'F', '0', '0', 'system:user:import', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1007, '重置密码', 100, 7, '', '', '', 1, 0, 'F', '0', '0', 'system:user:resetPwd', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1008, '角色查询', 101, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:role:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1009, '角色新增', 101, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:role:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1010, '角色修改', 101, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:role:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1011, '角色删除', 101, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:role:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1012, '角色导出', 101, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:role:export', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1013, '菜单查询', 102, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1014, '菜单新增', 102, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1015, '菜单修改', 102, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1016, '菜单删除', 102, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:menu:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1017, '部门查询', 103, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1018, '部门新增', 103, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1019, '部门修改', 103, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1020, '部门删除', 103, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:dept:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1021, '岗位查询', 104, 1, '', '', '', 1, 0, 'F', '0', '0', 'system:post:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1022, '岗位新增', 104, 2, '', '', '', 1, 0, 'F', '0', '0', 'system:post:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1023, '岗位修改', 104, 3, '', '', '', 1, 0, 'F', '0', '0', 'system:post:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1024, '岗位删除', 104, 4, '', '', '', 1, 0, 'F', '0', '0', 'system:post:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1025, '岗位导出', 104, 5, '', '', '', 1, 0, 'F', '0', '0', 'system:post:export', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1026, '字典查询', 105, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1027, '字典新增', 105, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1028, '字典修改', 105, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1029, '字典删除', 105, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1030, '字典导出', 105, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:dict:export', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1031, '参数查询', 106, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1032, '参数新增', 106, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1033, '参数修改', 106, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1034, '参数删除', 106, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1035, '参数导出', 106, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:config:export', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1036, '公告查询', 107, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1037, '公告新增', 107, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1038, '公告修改', 107, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1039, '公告删除', 107, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:notice:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1040, '操作查询', 500, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1041, '操作删除', 500, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1042, '日志导出', 500, 4, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:operlog:export', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1043, '登录查询', 501, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1044, '登录删除', 501, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1045, '日志导出', 501, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:export', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1046, '在线查询', 109, 1, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1047, '批量强退', 109, 2, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:batchLogout', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1048, '单条强退', 109, 3, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:online:forceLogout', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1050, '账户解锁', 501, 4, '#', '', '', 1, 0, 'F', '0', '0', 'monitor:logininfor:unlock', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1055, '生成查询', 115, 1, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1056, '生成修改', 115, 2, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1057, '生成删除', 115, 3, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1058, '导入代码', 115, 2, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:import', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1059, '预览代码', 115, 4, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:preview', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1060, '生成代码', 115, 5, '#', '', '', 1, 0, 'F', '0', '0', 'tool:gen:code', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1600, '文件查询', 118, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1601, '文件上传', 118, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:upload', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1602, '文件下载', 118, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:download', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1603, '文件删除', 118, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1605, '配置编辑', 118, 6, '#', '', '', 1, 0, 'F', '0', '0', 'system:oss:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1606, '租户查询', 121, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1607, '租户新增', 121, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1608, '租户修改', 121, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1609, '租户删除', 121, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1610, '租户导出', 121, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenant:export', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1611, '租户套餐查询', 122, 1, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:query', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1612, '租户套餐新增', 122, 2, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:add', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1613, '租户套餐修改', 122, 3, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:edit', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1614, '租户套餐删除', 122, 4, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:remove', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1615, '租户套餐导出', 122, 5, '#', '', '', 1, 0, 'F', '0', '0', 'system:tenantPackage:export', '#', 103, 1, '2023-05-14 15:19:40', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1775500307898949634, '运营管理', 0, 0, 'operate', NULL, NULL, 1, 0, 'M', '0', '0', NULL, 'peoples', 103, 1, '2024-04-03 20:27:15', 1, '2024-04-03 20:27:15', '');
+INSERT INTO `sys_menu` VALUES (1775895273104068610, '系统模型', 1775500307898949634, 2, 'model', 'system/model/index', NULL, 1, 0, 'C', '0', '0', 'system:model:list', 'example', 103, 1, '2024-04-05 12:00:38', 1, '2024-04-05 12:14:02', '系统模型菜单');
+INSERT INTO `sys_menu` VALUES (1775895273104068611, '系统模型查询', 1775895273104068610, 1, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:model:query', '#', 103, 1, '2024-04-05 12:00:38', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1775895273104068612, '系统模型新增', 1775895273104068610, 2, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:model:add', '#', 103, 1, '2024-04-05 12:00:38', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1775895273104068613, '系统模型修改', 1775895273104068610, 3, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:model:edit', '#', 103, 1, '2024-04-05 12:00:38', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1775895273104068614, '系统模型删除', 1775895273104068610, 4, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:model:remove', '#', 103, 1, '2024-04-05 12:00:38', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1775895273104068615, '系统模型导出', 1775895273104068610, 5, '#', '', NULL, 1, 0, 'F', '0', '0', 'system:model:export', '#', 103, 1, '2024-04-05 12:00:38', NULL, NULL, '');
+INSERT INTO `sys_menu` VALUES (1789974539726790658, '机器管理', 1775500307898949634, 9, 'bot', 'system/bot/index', NULL, 1, 0, 'C', '0', '0', NULL, 'people', 103, 1, '2024-05-13 19:02:41', 1, '2024-05-13 19:06:53', '');
+
+-- ----------------------------
+-- Table structure for sys_model
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_model`;
+CREATE TABLE `sys_model`  (
+                              `id` bigint(20) NOT NULL COMMENT '主键',
+                              `model_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模型名称',
+                              `model_describe` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '模型描述',
+                              `model_price` double NULL DEFAULT NULL COMMENT '模型价格',
+                              `model_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '计费类型',
+                              `model_show` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '是否显示',
+                              `system_prompt` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '系统提示词',
+                              `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                              `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
+                              `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                              `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
+                              `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                              `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+                              PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统模型' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_model
+-- ----------------------------
+INSERT INTO `sys_model` VALUES (1776114028757180417, 'gpt-3.5-turbo', 'gpt-3.5-turbo', 0.05, '1', '0', NULL, 103, 1, '2024-04-20 23:40:31', 1, '2024-04-23 21:45:19', 'GPT3.5最新模型,用于文本生成、对话系统、内容摘要等');
+INSERT INTO `sys_model` VALUES (1781709495515783171, 'gpt-4-all', 'gpt-4-all', 0.2, '2', '0', NULL, 103, 1, '2024-04-20 23:40:41', 1, '2024-04-23 21:45:23', '同时拥有联网查询,高级数据分析,画图 DALL.E功能,GPT 会自动识别并调取相关能力工具');
+INSERT INTO `sys_model` VALUES (1781709617662304258, 'gpt-4-turbo-2024-04-09', 'gpt-4-turbo-2024-04-09', 0.2, '1', '0', '使用中文回复', 103, 1, '2024-04-20 23:40:50', 1, '2024-04-23 21:45:28', '最新版GPT-4,相对GPT-3.5更先进、拥有更多的参数和更强大的语言处理能力');
+INSERT INTO `sys_model` VALUES (1781715781896646657, 'suno-v3', 'suno-v3', 0.5, '2', '0', NULL, 103, 1, '2024-04-21 00:05:20', 1, '2024-04-23 19:34:36', 'SunoAI 推出的文生歌模型,支持灵感模式、歌词模式,也支持生成纯音乐');
+INSERT INTO `sys_model` VALUES (1781728235120791553, 'stable-diffusion', 'stable-diffusion', 0.1, '2', '0', NULL, 103, 1, '2024-04-21 00:54:49', 1, '2024-04-23 19:34:40', '高级图像生成和处理模型,擅长创建逼真的视觉效果');
+INSERT INTO `sys_model` VALUES (1781728766161620993, 'claude-3-opus-20240229', 'claude-3-opus-20240229', 0.2, '1', '0', NULL, 103, 1, '2024-04-21 00:56:55', 1, '2024-04-23 19:34:43', 'Claude模型的最新版本,具有最先进的语言处理技术');
+INSERT INTO `sys_model` VALUES (1782734319650418690, 'gpt-4-1106-vision-preview', 'gpt-4-1106-vision-preview', 0.2, '2', '1', '', 103, 1, '2024-04-23 19:32:38', 1, '2024-04-23 19:38:38', 'GPT-4 的一个包含视觉处理能力的预览版本,结合了视觉信息处理的能力');
+INSERT INTO `sys_model` VALUES (1782736322308943873, 'dall-e-3', 'dall-e-3', 0.3, '2', '1', '', 103, 1, '2024-04-23 19:40:36', 1, '2024-04-23 21:45:40', 'DALL·E 是一个专注于图像生成的模型');
+INSERT INTO `sys_model` VALUES (1782736729471004673, 'gpt-4-gizmo', 'gpt-4-gizmo', 0.2, '2', '1', NULL, 103, 1, '2024-04-23 19:42:13', 1, '2024-04-23 19:42:13', 'gpts商店中的模型,使用方式:gpt-4-gizmo-g-xxx');
+INSERT INTO `sys_model` VALUES (1790237707719991298, 'gpt-4o-2024-05-13', 'gpt-4o-2024-05-13', 0.2, '1', '0', NULL, 103, 1, '2024-05-14 12:28:25', 1, '2024-05-14 12:28:25', ' OpenAI 最先进的多模式模型,比 GPT-4 Turbo 更快、更便宜,具有更强的视觉功能');
+
+-- ----------------------------
+-- Table structure for sys_notice
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_notice`;
+CREATE TABLE `sys_notice`  (
+                               `notice_id` bigint(20) NOT NULL COMMENT '公告ID',
+                               `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+                               `notice_title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '公告标题',
+                               `notice_type` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '公告类型(1通知 2公告)',
+                               `notice_content` longblob NULL COMMENT '公告内容',
+                               `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '公告状态(0正常 1关闭)',
+                               `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                               `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
+                               `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                               `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
+                               `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                               `remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+                               PRIMARY KEY (`notice_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '通知公告表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_notice
+-- ----------------------------
+INSERT INTO `sys_notice` VALUES (1, '000000', '温馨提醒:2018-07-01 新版本发布啦', '2', 0xE696B0E78988E69CACE58685E5AEB9, '0', 103, 1, '2023-05-14 15:19:42', NULL, NULL, '管理员');
+INSERT INTO `sys_notice` VALUES (2, '000000', '维护通知:2018-07-01 系统凌晨维护', '1', 0xE7BBB4E68AA4E58685E5AEB9, '0', 103, 1, '2023-05-14 15:19:42', NULL, NULL, '管理员');
+
+-- ----------------------------
+-- Table structure for sys_oper_log
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_oper_log`;
+CREATE TABLE `sys_oper_log`  (
+                                 `oper_id` bigint(20) NOT NULL COMMENT '日志主键',
+                                 `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+                                 `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '模块标题',
+                                 `business_type` int(11) NULL DEFAULT 0 COMMENT '业务类型(0其它 1新增 2修改 3删除)',
+                                 `method` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '方法名称',
+                                 `request_method` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '请求方式',
+                                 `operator_type` int(11) NULL DEFAULT 0 COMMENT '操作类别(0其它 1后台用户 2手机端用户)',
+                                 `oper_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作人员',
+                                 `dept_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '部门名称',
+                                 `oper_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '请求URL',
+                                 `oper_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '主机地址',
+                                 `oper_location` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '操作地点',
+                                 `oper_param` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '请求参数',
+                                 `json_result` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '返回参数',
+                                 `status` int(11) NULL DEFAULT 0 COMMENT '操作状态(0正常 1异常)',
+                                 `error_msg` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '错误消息',
+                                 `oper_time` datetime NULL DEFAULT NULL COMMENT '操作时间',
+                                 `cost_time` bigint(20) NULL DEFAULT 0 COMMENT '消耗时间',
+                                 PRIMARY KEY (`oper_id`) USING BTREE,
+                                 INDEX `idx_sys_oper_log_bt`(`business_type`) USING BTREE,
+                                 INDEX `idx_sys_oper_log_s`(`status`) USING BTREE,
+                                 INDEX `idx_sys_oper_log_ot`(`oper_time`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '操作日志记录' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_oper_log
+-- ----------------------------
+INSERT INTO `sys_oper_log` VALUES (1789958779478577153, '00000', '菜单管理', 2, 'com.xmzs.system.controller.system.SysMenuController.edit()', 'PUT', 1, 'admin', '', '/system/menu', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":103,\"createBy\":null,\"createTime\":\"2023-05-14 15:19:39\",\"updateBy\":null,\"updateTime\":null,\"menuId\":6,\"parentId\":0,\"menuName\":\"租户管理\",\"orderNum\":2,\"path\":\"tenant\",\"component\":null,\"queryParam\":\"\",\"isFrame\":\"1\",\"isCache\":\"0\",\"menuType\":\"M\",\"visible\":\"1\",\"status\":\"0\",\"perms\":\"\",\"icon\":\"chart\",\"remark\":\"租户管理目录\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2024-05-13 18:00:04', 164);
+INSERT INTO `sys_oper_log` VALUES (1789959085327224833, '00000', '菜单管理', 2, 'com.xmzs.system.controller.system.SysMenuController.edit()', 'PUT', 1, 'admin', '', '/system/menu', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":103,\"createBy\":null,\"createTime\":\"2023-05-14 15:19:39\",\"updateBy\":null,\"updateTime\":null,\"menuId\":6,\"parentId\":0,\"menuName\":\"租户管理\",\"orderNum\":2,\"path\":\"tenant\",\"component\":null,\"queryParam\":\"\",\"isFrame\":\"1\",\"isCache\":\"0\",\"menuType\":\"M\",\"visible\":\"1\",\"status\":\"1\",\"perms\":\"\",\"icon\":\"chart\",\"remark\":\"租户管理目录\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2024-05-13 18:01:16', 137);
+INSERT INTO `sys_oper_log` VALUES (1789959387665240065, '00000', '菜单管理', 2, 'com.xmzs.system.controller.system.SysMenuController.edit()', 'PUT', 1, 'admin', '', '/system/menu', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":103,\"createBy\":null,\"createTime\":\"2023-05-14 15:19:39\",\"updateBy\":null,\"updateTime\":null,\"menuId\":101,\"parentId\":1,\"menuName\":\"角色管理\",\"orderNum\":2,\"path\":\"role\",\"component\":\"system/role/index\",\"queryParam\":\"\",\"isFrame\":\"1\",\"isCache\":\"0\",\"menuType\":\"C\",\"visible\":\"1\",\"status\":\"0\",\"perms\":\"system:role:list\",\"icon\":\"peoples\",\"remark\":\"角色管理菜单\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2024-05-13 18:02:29', 143);
+INSERT INTO `sys_oper_log` VALUES (1789959414731083778, '00000', '菜单管理', 2, 'com.xmzs.system.controller.system.SysMenuController.edit()', 'PUT', 1, 'admin', '', '/system/menu', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":103,\"createBy\":null,\"createTime\":\"2023-05-14 15:19:39\",\"updateBy\":null,\"updateTime\":null,\"menuId\":103,\"parentId\":1,\"menuName\":\"部门管理\",\"orderNum\":4,\"path\":\"dept\",\"component\":\"system/dept/index\",\"queryParam\":\"\",\"isFrame\":\"1\",\"isCache\":\"0\",\"menuType\":\"C\",\"visible\":\"1\",\"status\":\"0\",\"perms\":\"system:dept:list\",\"icon\":\"tree\",\"remark\":\"部门管理菜单\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2024-05-13 18:02:35', 136);
+INSERT INTO `sys_oper_log` VALUES (1789959430166122498, '00000', '菜单管理', 2, 'com.xmzs.system.controller.system.SysMenuController.edit()', 'PUT', 1, 'admin', '', '/system/menu', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":103,\"createBy\":null,\"createTime\":\"2023-05-14 15:19:39\",\"updateBy\":null,\"updateTime\":null,\"menuId\":104,\"parentId\":1,\"menuName\":\"岗位管理\",\"orderNum\":5,\"path\":\"post\",\"component\":\"system/post/index\",\"queryParam\":\"\",\"isFrame\":\"1\",\"isCache\":\"0\",\"menuType\":\"C\",\"visible\":\"1\",\"status\":\"0\",\"perms\":\"system:post:list\",\"icon\":\"post\",\"remark\":\"岗位管理菜单\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2024-05-13 18:02:39', 139);
+INSERT INTO `sys_oper_log` VALUES (1789959465704460290, '00000', '菜单管理', 2, 'com.xmzs.system.controller.system.SysMenuController.edit()', 'PUT', 1, 'admin', '', '/system/menu', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":103,\"createBy\":null,\"createTime\":\"2023-05-14 15:19:40\",\"updateBy\":null,\"updateTime\":null,\"menuId\":107,\"parentId\":1,\"menuName\":\"通知公告\",\"orderNum\":8,\"path\":\"notice\",\"component\":\"system/notice/index\",\"queryParam\":\"\",\"isFrame\":\"1\",\"isCache\":\"0\",\"menuType\":\"C\",\"visible\":\"1\",\"status\":\"0\",\"perms\":\"system:notice:list\",\"icon\":\"message\",\"remark\":\"通知公告菜单\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2024-05-13 18:02:47', 144);
+INSERT INTO `sys_oper_log` VALUES (1789959516686225410, '00000', '菜单管理', 2, 'com.xmzs.system.controller.system.SysMenuController.edit()', 'PUT', 1, 'admin', '', '/system/menu', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":103,\"createBy\":null,\"createTime\":\"2023-05-14 15:19:40\",\"updateBy\":null,\"updateTime\":null,\"menuId\":118,\"parentId\":1,\"menuName\":\"文件管理\",\"orderNum\":10,\"path\":\"oss\",\"component\":\"system/oss/index\",\"queryParam\":\"\",\"isFrame\":\"1\",\"isCache\":\"0\",\"menuType\":\"C\",\"visible\":\"1\",\"status\":\"0\",\"perms\":\"system:oss:list\",\"icon\":\"upload\",\"remark\":\"文件管理菜单\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2024-05-13 18:02:59', 134);
+INSERT INTO `sys_oper_log` VALUES (1789959599150436353, '00000', '菜单管理', 2, 'com.xmzs.system.controller.system.SysMenuController.edit()', 'PUT', 1, 'admin', '', '/system/menu', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":103,\"createBy\":null,\"createTime\":\"2023-05-14 15:19:40\",\"updateBy\":null,\"updateTime\":null,\"menuId\":106,\"parentId\":1,\"menuName\":\"参数设置\",\"orderNum\":7,\"path\":\"config\",\"component\":\"system/config/index\",\"queryParam\":\"\",\"isFrame\":\"1\",\"isCache\":\"0\",\"menuType\":\"C\",\"visible\":\"1\",\"status\":\"0\",\"perms\":\"system:config:list\",\"icon\":\"edit\",\"remark\":\"参数设置菜单\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2024-05-13 18:03:19', 146);
+INSERT INTO `sys_oper_log` VALUES (1789960080274853890, '00000', '菜单管理', 3, 'com.xmzs.system.controller.system.SysMenuController.remove()', 'DELETE', 1, 'admin', '', '/system/menu/1780240077690507266', '0:0:0:0:0:0:0:1', '内网IP', '{}', '{\"code\":601,\"msg\":\"存在子菜单,不允许删除\",\"data\":null}', 0, '', '2024-05-13 18:05:14', 65);
+INSERT INTO `sys_oper_log` VALUES (1789960711316279297, '00000', '菜单管理', 2, 'com.xmzs.system.controller.system.SysMenuController.edit()', 'PUT', 1, 'admin', '', '/system/menu', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":103,\"createBy\":null,\"createTime\":\"2023-05-14 15:19:40\",\"updateBy\":null,\"updateTime\":null,\"menuId\":106,\"parentId\":1,\"menuName\":\"系统参数\",\"orderNum\":10,\"path\":\"config\",\"component\":\"system/config/index\",\"queryParam\":\"\",\"isFrame\":\"1\",\"isCache\":\"0\",\"menuType\":\"C\",\"visible\":\"0\",\"status\":\"0\",\"perms\":\"system:config:list\",\"icon\":\"edit\",\"remark\":\"参数设置菜单\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2024-05-13 18:07:44', 123);
+INSERT INTO `sys_oper_log` VALUES (1789960734875684866, '00000', '菜单管理', 2, 'com.xmzs.system.controller.system.SysMenuController.edit()', 'PUT', 1, 'admin', '', '/system/menu', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":103,\"createBy\":null,\"createTime\":\"2023-05-14 15:19:40\",\"updateBy\":null,\"updateTime\":null,\"menuId\":107,\"parentId\":\"1775500307898949634\",\"menuName\":\"通知公告\",\"orderNum\":14,\"path\":\"notice\",\"component\":\"system/notice/index\",\"queryParam\":\"\",\"isFrame\":\"1\",\"isCache\":\"0\",\"menuType\":\"C\",\"visible\":\"1\",\"status\":\"0\",\"perms\":\"system:notice:list\",\"icon\":\"message\",\"remark\":\"通知公告菜单\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2024-05-13 18:07:50', 121);
+INSERT INTO `sys_oper_log` VALUES (1789974540146221057, '00000', '菜单管理', 1, 'com.xmzs.system.controller.system.SysMenuController.add()', 'POST', 1, 'admin', '', '/system/menu', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"menuId\":null,\"parentId\":\"1775500307898949634\",\"menuName\":\"机器管理\",\"orderNum\":10,\"path\":\"bot\",\"component\":null,\"queryParam\":null,\"isFrame\":\"1\",\"isCache\":\"0\",\"menuType\":\"M\",\"visible\":\"0\",\"status\":\"0\",\"icon\":\"people\",\"remark\":null}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2024-05-13 19:02:41', 174);
+INSERT INTO `sys_oper_log` VALUES (1789975595391164417, '00000', '菜单管理', 2, 'com.xmzs.system.controller.system.SysMenuController.edit()', 'PUT', 1, 'admin', '', '/system/menu', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":103,\"createBy\":null,\"createTime\":\"2024-05-13 19:02:41\",\"updateBy\":null,\"updateTime\":null,\"menuId\":\"1789974539726790658\",\"parentId\":\"1775500307898949634\",\"menuName\":\"机器管理\",\"orderNum\":9,\"path\":\"bot\",\"component\":\"system/bot/index\",\"queryParam\":null,\"isFrame\":\"1\",\"isCache\":\"0\",\"menuType\":\"C\",\"visible\":\"0\",\"status\":\"0\",\"icon\":\"people\",\"remark\":\"\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2024-05-13 19:06:53', 140);
+INSERT INTO `sys_oper_log` VALUES (1790237708319776770, '00000', '系统模型', 1, 'com.xmzs.system.controller.system.SysModelController.add()', 'POST', 1, 'admin', '', '/system/model', '0:0:0:0:0:0:0:1', '内网IP', '{\"createDept\":null,\"createBy\":null,\"createTime\":null,\"updateBy\":null,\"updateTime\":null,\"id\":\"1790237707719991298\",\"modelName\":\"gpt-4o-2024-05-13\",\"modelDescribe\":\"gpt-4o-2024-05-13\",\"modelPrice\":0.2,\"modelType\":\"1\",\"modelShow\":\"0\",\"systemPrompt\":null,\"remark\":\" OpenAI 最先进的多模式模型,比 GPT-4 Turbo 更快、更便宜,具有更强的视觉功能\"}', '{\"code\":200,\"msg\":\"操作成功\",\"data\":null}', 0, '', '2024-05-14 12:28:25', 146);
+
+-- ----------------------------
+-- Table structure for sys_oss
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_oss`;
+CREATE TABLE `sys_oss`  (
+                            `oss_id` bigint(20) NOT NULL COMMENT '对象存储主键',
+                            `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+                            `file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '文件名',
+                            `original_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '原名',
+                            `file_suffix` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '文件后缀名',
+                            `url` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'URL地址',
+                            `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                            `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                            `create_by` bigint(20) NULL DEFAULT NULL COMMENT '上传人',
+                            `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                            `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新人',
+                            `service` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT 'minio' COMMENT '服务商',
+                            PRIMARY KEY (`oss_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = 'OSS对象存储表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_oss
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for sys_oss_config
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_oss_config`;
+CREATE TABLE `sys_oss_config`  (
+                                   `oss_config_id` bigint(20) NOT NULL COMMENT '主建',
+                                   `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+                                   `config_key` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '配置key',
+                                   `access_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT 'accessKey',
+                                   `secret_key` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '秘钥',
+                                   `bucket_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '桶名称',
+                                   `prefix` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '前缀',
+                                   `endpoint` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '访问站点',
+                                   `domain` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '自定义域名',
+                                   `is_https` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'N' COMMENT '是否https(Y=是,N=否)',
+                                   `region` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '域',
+                                   `access_policy` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '1' COMMENT '桶权限类型(0=private 1=public 2=custom)',
+                                   `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '是否默认(0=是,1=否)',
+                                   `ext1` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '扩展字段',
+                                   `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                                   `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
+                                   `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                                   `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
+                                   `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                                   `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+                                   PRIMARY KEY (`oss_config_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '对象存储配置表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_oss_config
+-- ----------------------------
+INSERT INTO `sys_oss_config` VALUES (1, '000000', 'minio', 'ruoyi', 'ruoyi123', 'ruoyi', '', '127.0.0.1:9000', '', 'N', '', '1', '1', '', 103, 1, '2023-05-14 15:19:42', 1, '2023-07-13 23:28:18', NULL);
+INSERT INTO `sys_oss_config` VALUES (2, '000000', 'qiniu', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 's3-cn-north-1.qiniucs.com', '', 'N', '', '1', '1', '', 103, 1, '2023-05-14 15:19:42', 1, '2023-05-14 15:19:42', NULL);
+INSERT INTO `sys_oss_config` VALUES (3, '000000', 'aliyun', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', '', 'oss-cn-beijing.aliyuncs.com', '', 'N', '', '1', '1', '', 103, 1, '2023-05-14 15:19:42', 1, '2023-07-13 23:35:23', NULL);
+INSERT INTO `sys_oss_config` VALUES (4, '000000', 'qcloud', 'XXXXXXXXXXXXXXX', 'XXXXXXXXXXXXXXX', 'ruoyi', 'image', '127.0.0.1:9000', '', 'N', '', '1', '0', '', 103, 1, '2023-05-14 15:19:42', 1, '2023-11-13 23:58:09', '');
+INSERT INTO `sys_oss_config` VALUES (5, '000000', 'image', 'ruoyi', 'ruoyi123', 'ruoyi', 'image', '127.0.0.1:9000', '', 'N', '', '1', '1', '', 103, 1, '2023-05-14 15:19:42', 1, '2023-05-14 15:19:42', NULL);
+
+-- ----------------------------
+-- Table structure for sys_pay_order
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_pay_order`;
+CREATE TABLE `sys_pay_order`  (
+                                  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
+                                  `order_no` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '订单编号',
+                                  `order_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '订单名称',
+                                  `amount` decimal(10, 2) NOT NULL COMMENT '金额',
+                                  `payment_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '支付状态',
+                                  `payment_method` char(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '支付方式',
+                                  `user_id` bigint(20) NULL DEFAULT NULL COMMENT '用户ID',
+                                  `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
+                                  `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                                  `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
+                                  `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                                  `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+                                  `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                                  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '支付订单表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_pay_order
+-- ----------------------------
+
+-- ----------------------------
+-- Table structure for sys_post
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_post`;
+CREATE TABLE `sys_post`  (
+                             `post_id` bigint(20) NOT NULL COMMENT '岗位ID',
+                             `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+                             `post_code` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位编码',
+                             `post_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位名称',
+                             `post_sort` int(11) NOT NULL COMMENT '显示顺序',
+                             `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '状态(0正常 1停用)',
+                             `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                             `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
+                             `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                             `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
+                             `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                             `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+                             PRIMARY KEY (`post_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '岗位信息表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_post
+-- ----------------------------
+INSERT INTO `sys_post` VALUES (1, '000000', 'ceo', '董事长', 1, '0', 103, 1, '2023-05-14 15:19:39', NULL, NULL, '');
+INSERT INTO `sys_post` VALUES (2, '000000', 'se', '项目经理', 2, '0', 103, 1, '2023-05-14 15:19:39', NULL, NULL, '');
+INSERT INTO `sys_post` VALUES (3, '000000', 'hr', '人力资源', 3, '0', 103, 1, '2023-05-14 15:19:39', NULL, NULL, '');
+INSERT INTO `sys_post` VALUES (4, '000000', 'user', '普通员工', 4, '0', 103, 1, '2023-05-14 15:19:39', NULL, NULL, '');
+
+-- ----------------------------
+-- Table structure for sys_role
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_role`;
+CREATE TABLE `sys_role`  (
+                             `role_id` bigint(20) NOT NULL COMMENT '角色ID',
+                             `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+                             `role_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色名称',
+                             `role_key` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色权限字符串',
+                             `role_sort` int(11) NOT NULL COMMENT '显示顺序',
+                             `data_scope` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '1' COMMENT '数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限)',
+                             `menu_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '菜单树选择项是否关联显示',
+                             `dept_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '部门树选择项是否关联显示',
+                             `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色状态(0正常 1停用)',
+                             `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+                             `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                             `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
+                             `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                             `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
+                             `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                             `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+                             PRIMARY KEY (`role_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色信息表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_role
+-- ----------------------------
+INSERT INTO `sys_role` VALUES (1, '000000', '超级管理员', 'superadmin', 1, '1', 1, 1, '0', '0', 103, 1, '2023-05-14 15:19:39', NULL, NULL, '超级管理员');
+INSERT INTO `sys_role` VALUES (2, '000000', '普通角色', 'common', 2, '2', 1, 1, '0', '0', 103, 1, '2023-05-14 15:19:39', NULL, NULL, '普通角色');
+INSERT INTO `sys_role` VALUES (3, '000000', '本部门及以下', 'test1', 3, '4', 1, 1, '0', '0', 103, 1, '2023-05-14 15:20:00', 1, '2023-06-04 10:20:43', NULL);
+INSERT INTO `sys_role` VALUES (4, '000000', '仅本人', 'test2', 4, '5', 1, 1, '0', '0', 103, 1, '2023-05-14 15:20:00', 1, '2023-06-04 10:21:01', NULL);
+INSERT INTO `sys_role` VALUES (1661661183933177857, '000000', '小程序管理员', 'xcxadmin', 1, '1', 1, 1, '0', '0', 103, 1, '2023-05-25 17:11:13', 1, '2023-05-25 17:11:13', '');
+INSERT INTO `sys_role` VALUES (1729685491108446210, '911866', '管理员', 'admin', 1, '1', 1, 1, '0', '0', 103, 1, '2023-11-29 10:15:32', 1, '2023-11-29 10:15:32', NULL);
+
+-- ----------------------------
+-- Table structure for sys_role_dept
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_role_dept`;
+CREATE TABLE `sys_role_dept`  (
+                                  `role_id` bigint(20) NOT NULL COMMENT '角色ID',
+                                  `dept_id` bigint(20) NOT NULL COMMENT '部门ID',
+                                  PRIMARY KEY (`role_id`, `dept_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色和部门关联表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_role_dept
+-- ----------------------------
+INSERT INTO `sys_role_dept` VALUES (2, 100);
+INSERT INTO `sys_role_dept` VALUES (2, 101);
+INSERT INTO `sys_role_dept` VALUES (2, 105);
+INSERT INTO `sys_role_dept` VALUES (1729685491108446210, 1729685491964084226);
+
+-- ----------------------------
+-- Table structure for sys_role_menu
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_role_menu`;
+CREATE TABLE `sys_role_menu`  (
+                                  `role_id` bigint(20) NOT NULL COMMENT '角色ID',
+                                  `menu_id` bigint(20) NOT NULL COMMENT '菜单ID',
+                                  PRIMARY KEY (`role_id`, `menu_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色和菜单关联表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_role_menu
+-- ----------------------------
+INSERT INTO `sys_role_menu` VALUES (2, 1);
+INSERT INTO `sys_role_menu` VALUES (2, 2);
+INSERT INTO `sys_role_menu` VALUES (2, 3);
+INSERT INTO `sys_role_menu` VALUES (2, 4);
+INSERT INTO `sys_role_menu` VALUES (2, 100);
+INSERT INTO `sys_role_menu` VALUES (2, 101);
+INSERT INTO `sys_role_menu` VALUES (2, 102);
+INSERT INTO `sys_role_menu` VALUES (2, 103);
+INSERT INTO `sys_role_menu` VALUES (2, 104);
+INSERT INTO `sys_role_menu` VALUES (2, 105);
+INSERT INTO `sys_role_menu` VALUES (2, 106);
+INSERT INTO `sys_role_menu` VALUES (2, 107);
+INSERT INTO `sys_role_menu` VALUES (2, 108);
+INSERT INTO `sys_role_menu` VALUES (2, 109);
+INSERT INTO `sys_role_menu` VALUES (2, 110);
+INSERT INTO `sys_role_menu` VALUES (2, 111);
+INSERT INTO `sys_role_menu` VALUES (2, 112);
+INSERT INTO `sys_role_menu` VALUES (2, 113);
+INSERT INTO `sys_role_menu` VALUES (2, 114);
+INSERT INTO `sys_role_menu` VALUES (2, 115);
+INSERT INTO `sys_role_menu` VALUES (2, 116);
+INSERT INTO `sys_role_menu` VALUES (2, 500);
+INSERT INTO `sys_role_menu` VALUES (2, 501);
+INSERT INTO `sys_role_menu` VALUES (2, 1000);
+INSERT INTO `sys_role_menu` VALUES (2, 1001);
+INSERT INTO `sys_role_menu` VALUES (2, 1002);
+INSERT INTO `sys_role_menu` VALUES (2, 1003);
+INSERT INTO `sys_role_menu` VALUES (2, 1004);
+INSERT INTO `sys_role_menu` VALUES (2, 1005);
+INSERT INTO `sys_role_menu` VALUES (2, 1006);
+INSERT INTO `sys_role_menu` VALUES (2, 1007);
+INSERT INTO `sys_role_menu` VALUES (2, 1008);
+INSERT INTO `sys_role_menu` VALUES (2, 1009);
+INSERT INTO `sys_role_menu` VALUES (2, 1010);
+INSERT INTO `sys_role_menu` VALUES (2, 1011);
+INSERT INTO `sys_role_menu` VALUES (2, 1012);
+INSERT INTO `sys_role_menu` VALUES (2, 1013);
+INSERT INTO `sys_role_menu` VALUES (2, 1014);
+INSERT INTO `sys_role_menu` VALUES (2, 1015);
+INSERT INTO `sys_role_menu` VALUES (2, 1016);
+INSERT INTO `sys_role_menu` VALUES (2, 1017);
+INSERT INTO `sys_role_menu` VALUES (2, 1018);
+INSERT INTO `sys_role_menu` VALUES (2, 1019);
+INSERT INTO `sys_role_menu` VALUES (2, 1020);
+INSERT INTO `sys_role_menu` VALUES (2, 1021);
+INSERT INTO `sys_role_menu` VALUES (2, 1022);
+INSERT INTO `sys_role_menu` VALUES (2, 1023);
+INSERT INTO `sys_role_menu` VALUES (2, 1024);
+INSERT INTO `sys_role_menu` VALUES (2, 1025);
+INSERT INTO `sys_role_menu` VALUES (2, 1026);
+INSERT INTO `sys_role_menu` VALUES (2, 1027);
+INSERT INTO `sys_role_menu` VALUES (2, 1028);
+INSERT INTO `sys_role_menu` VALUES (2, 1029);
+INSERT INTO `sys_role_menu` VALUES (2, 1030);
+INSERT INTO `sys_role_menu` VALUES (2, 1031);
+INSERT INTO `sys_role_menu` VALUES (2, 1032);
+INSERT INTO `sys_role_menu` VALUES (2, 1033);
+INSERT INTO `sys_role_menu` VALUES (2, 1034);
+INSERT INTO `sys_role_menu` VALUES (2, 1035);
+INSERT INTO `sys_role_menu` VALUES (2, 1036);
+INSERT INTO `sys_role_menu` VALUES (2, 1037);
+INSERT INTO `sys_role_menu` VALUES (2, 1038);
+INSERT INTO `sys_role_menu` VALUES (2, 1039);
+INSERT INTO `sys_role_menu` VALUES (2, 1040);
+INSERT INTO `sys_role_menu` VALUES (2, 1041);
+INSERT INTO `sys_role_menu` VALUES (2, 1042);
+INSERT INTO `sys_role_menu` VALUES (2, 1043);
+INSERT INTO `sys_role_menu` VALUES (2, 1044);
+INSERT INTO `sys_role_menu` VALUES (2, 1045);
+INSERT INTO `sys_role_menu` VALUES (2, 1046);
+INSERT INTO `sys_role_menu` VALUES (2, 1047);
+INSERT INTO `sys_role_menu` VALUES (2, 1048);
+INSERT INTO `sys_role_menu` VALUES (2, 1050);
+INSERT INTO `sys_role_menu` VALUES (2, 1055);
+INSERT INTO `sys_role_menu` VALUES (2, 1056);
+INSERT INTO `sys_role_menu` VALUES (2, 1057);
+INSERT INTO `sys_role_menu` VALUES (2, 1058);
+INSERT INTO `sys_role_menu` VALUES (2, 1059);
+INSERT INTO `sys_role_menu` VALUES (2, 1060);
+INSERT INTO `sys_role_menu` VALUES (3, 1);
+INSERT INTO `sys_role_menu` VALUES (3, 100);
+INSERT INTO `sys_role_menu` VALUES (3, 101);
+INSERT INTO `sys_role_menu` VALUES (3, 102);
+INSERT INTO `sys_role_menu` VALUES (3, 103);
+INSERT INTO `sys_role_menu` VALUES (3, 104);
+INSERT INTO `sys_role_menu` VALUES (3, 105);
+INSERT INTO `sys_role_menu` VALUES (3, 106);
+INSERT INTO `sys_role_menu` VALUES (3, 107);
+INSERT INTO `sys_role_menu` VALUES (3, 108);
+INSERT INTO `sys_role_menu` VALUES (3, 500);
+INSERT INTO `sys_role_menu` VALUES (3, 501);
+INSERT INTO `sys_role_menu` VALUES (3, 1001);
+INSERT INTO `sys_role_menu` VALUES (3, 1002);
+INSERT INTO `sys_role_menu` VALUES (3, 1003);
+INSERT INTO `sys_role_menu` VALUES (3, 1004);
+INSERT INTO `sys_role_menu` VALUES (3, 1005);
+INSERT INTO `sys_role_menu` VALUES (3, 1006);
+INSERT INTO `sys_role_menu` VALUES (3, 1007);
+INSERT INTO `sys_role_menu` VALUES (3, 1008);
+INSERT INTO `sys_role_menu` VALUES (3, 1009);
+INSERT INTO `sys_role_menu` VALUES (3, 1010);
+INSERT INTO `sys_role_menu` VALUES (3, 1011);
+INSERT INTO `sys_role_menu` VALUES (3, 1012);
+INSERT INTO `sys_role_menu` VALUES (3, 1013);
+INSERT INTO `sys_role_menu` VALUES (3, 1014);
+INSERT INTO `sys_role_menu` VALUES (3, 1015);
+INSERT INTO `sys_role_menu` VALUES (3, 1016);
+INSERT INTO `sys_role_menu` VALUES (3, 1017);
+INSERT INTO `sys_role_menu` VALUES (3, 1018);
+INSERT INTO `sys_role_menu` VALUES (3, 1019);
+INSERT INTO `sys_role_menu` VALUES (3, 1020);
+INSERT INTO `sys_role_menu` VALUES (3, 1021);
+INSERT INTO `sys_role_menu` VALUES (3, 1022);
+INSERT INTO `sys_role_menu` VALUES (3, 1023);
+INSERT INTO `sys_role_menu` VALUES (3, 1024);
+INSERT INTO `sys_role_menu` VALUES (3, 1025);
+INSERT INTO `sys_role_menu` VALUES (3, 1026);
+INSERT INTO `sys_role_menu` VALUES (3, 1027);
+INSERT INTO `sys_role_menu` VALUES (3, 1028);
+INSERT INTO `sys_role_menu` VALUES (3, 1029);
+INSERT INTO `sys_role_menu` VALUES (3, 1030);
+INSERT INTO `sys_role_menu` VALUES (3, 1031);
+INSERT INTO `sys_role_menu` VALUES (3, 1032);
+INSERT INTO `sys_role_menu` VALUES (3, 1033);
+INSERT INTO `sys_role_menu` VALUES (3, 1034);
+INSERT INTO `sys_role_menu` VALUES (3, 1035);
+INSERT INTO `sys_role_menu` VALUES (3, 1036);
+INSERT INTO `sys_role_menu` VALUES (3, 1037);
+INSERT INTO `sys_role_menu` VALUES (3, 1038);
+INSERT INTO `sys_role_menu` VALUES (3, 1039);
+INSERT INTO `sys_role_menu` VALUES (3, 1040);
+INSERT INTO `sys_role_menu` VALUES (3, 1041);
+INSERT INTO `sys_role_menu` VALUES (3, 1042);
+INSERT INTO `sys_role_menu` VALUES (3, 1043);
+INSERT INTO `sys_role_menu` VALUES (3, 1044);
+INSERT INTO `sys_role_menu` VALUES (3, 1045);
+INSERT INTO `sys_role_menu` VALUES (1661661183933177857, 1);
+INSERT INTO `sys_role_menu` VALUES (1661661183933177857, 100);
+INSERT INTO `sys_role_menu` VALUES (1661661183933177857, 107);
+INSERT INTO `sys_role_menu` VALUES (1661661183933177857, 1001);
+INSERT INTO `sys_role_menu` VALUES (1661661183933177857, 1002);
+INSERT INTO `sys_role_menu` VALUES (1661661183933177857, 1003);
+INSERT INTO `sys_role_menu` VALUES (1661661183933177857, 1004);
+INSERT INTO `sys_role_menu` VALUES (1661661183933177857, 1005);
+INSERT INTO `sys_role_menu` VALUES (1661661183933177857, 1006);
+INSERT INTO `sys_role_menu` VALUES (1661661183933177857, 1007);
+INSERT INTO `sys_role_menu` VALUES (1661661183933177857, 1036);
+INSERT INTO `sys_role_menu` VALUES (1661661183933177857, 1037);
+INSERT INTO `sys_role_menu` VALUES (1661661183933177857, 1038);
+INSERT INTO `sys_role_menu` VALUES (1661661183933177857, 1039);
+INSERT INTO `sys_role_menu` VALUES (1729685491108446210, 1689201668374556674);
+INSERT INTO `sys_role_menu` VALUES (1729685491108446210, 1689205943360188417);
+INSERT INTO `sys_role_menu` VALUES (1729685491108446210, 1689243465037561858);
+INSERT INTO `sys_role_menu` VALUES (1729685491108446210, 1689243466220355585);
+
+-- ----------------------------
+-- Table structure for sys_tenant
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_tenant`;
+CREATE TABLE `sys_tenant`  (
+                               `id` bigint(20) NOT NULL COMMENT 'id',
+                               `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '租户编号',
+                               `contact_user_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系人',
+                               `contact_phone` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '联系电话',
+                               `company_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '企业名称',
+                               `license_number` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '统一社会信用代码',
+                               `address` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地址',
+                               `intro` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '企业简介',
+                               `domain` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '域名',
+                               `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+                               `package_id` bigint(20) NULL DEFAULT NULL COMMENT '租户套餐编号',
+                               `expire_time` datetime NULL DEFAULT NULL COMMENT '过期时间',
+                               `account_count` int(11) NULL DEFAULT -1 COMMENT '用户数量(-1不限制)',
+                               `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '租户状态(0正常 1停用)',
+                               `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+                               `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                               `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
+                               `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                               `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
+                               `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                               PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '租户表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_tenant
+-- ----------------------------
+INSERT INTO `sys_tenant` VALUES (1, '000000', '管理组', '15888888888', 'XXX有限公司', NULL, NULL, '多租户通用后台管理管理系统', NULL, NULL, NULL, NULL, -1, '0', '0', 103, 1, '2023-05-14 15:19:39', NULL, NULL);
+
+-- ----------------------------
+-- Table structure for sys_tenant_package
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_tenant_package`;
+CREATE TABLE `sys_tenant_package`  (
+                                       `package_id` bigint(20) NOT NULL COMMENT '租户套餐id',
+                                       `package_name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '套餐名称',
+                                       `menu_ids` varchar(3000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '关联菜单id',
+                                       `remark` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+                                       `menu_check_strictly` tinyint(1) NULL DEFAULT 1 COMMENT '菜单树选择项是否关联显示',
+                                       `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '状态(0正常 1停用)',
+                                       `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+                                       `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                                       `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
+                                       `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                                       `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
+                                       `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                                       PRIMARY KEY (`package_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '租户套餐表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_tenant_package
+-- ----------------------------
+INSERT INTO `sys_tenant_package` VALUES (1729685389795033090, '绘画', '1689205943360188417, 1689243466220355585, 1689201668374556674, 1689243465037561858', '', 1, '0', '2', 103, 1, '2023-11-29 10:15:08', 1, '2023-11-29 10:15:08');
+
+-- ----------------------------
+-- Table structure for sys_user
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_user`;
+CREATE TABLE `sys_user`  (
+                             `user_id` bigint(20) NOT NULL COMMENT '用户ID',
+                             `open_id` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信用户标识',
+                             `user_grade` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '用户等级',
+                             `user_balance` double(20, 2) NULL DEFAULT 0.00 COMMENT '账户余额',
+                             `tenant_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '000000' COMMENT '租户编号',
+                             `dept_id` bigint(20) NULL DEFAULT NULL COMMENT '部门ID',
+                             `user_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户账号',
+                             `nick_name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户昵称',
+                             `user_type` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT 'sys_user' COMMENT '用户类型(sys_user系统用户)',
+                             `email` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '用户邮箱',
+                             `phonenumber` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '手机号码',
+                             `sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '用户性别(0男 1女 2未知)',
+                             `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像地址',
+                             `wx_avatar` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '微信头像地址',
+                             `password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '密码',
+                             `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '帐号状态(0正常 1停用)',
+                             `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)',
+                             `login_ip` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '最后登录IP',
+                             `login_date` datetime NULL DEFAULT NULL COMMENT '最后登录时间',
+                             `create_dept` bigint(20) NULL DEFAULT NULL COMMENT '创建部门',
+                             `create_by` bigint(20) NULL DEFAULT NULL COMMENT '创建者',
+                             `create_time` datetime NULL DEFAULT NULL COMMENT '创建时间',
+                             `update_by` bigint(20) NULL DEFAULT NULL COMMENT '更新者',
+                             `update_time` datetime NULL DEFAULT NULL COMMENT '更新时间',
+                             `remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注',
+                             PRIMARY KEY (`user_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户信息表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_user
+-- ----------------------------
+INSERT INTO `sys_user` VALUES (1, NULL, '0', 99.00, '00000', 103, 'admin', '熊猫助手', 'sys_user', 'crazyLionLi@163.com', '15888888888', '1', NULL, NULL, '$2a$10$7JB720yubVSZvUI0rEqK/.VqGOZTH.ulu33dHOiBE8ByOhJIrdAu2', '0', '0', '0:0:0:0:0:0:0:1', '2024-05-13 19:48:08', 103, 1, '2023-05-14 15:19:39', 1, '2024-05-13 19:48:08', '管理员');
+INSERT INTO `sys_user` VALUES (1714176194496339970, NULL, '1', 115.55, '00000', NULL, 'pandarobot@163.com', '问答助手', 'sys_user', '', '', '0', 'http://panda-1253683406.cos.ap-guangzhou.myqcloud.com/panda/2024/04/02/ce28414c5eda47c793730a3ea3f006ac.jpg', NULL, '$2a$10$vUINJgUxBFt7L9OdNjxg0.TEGx4r1243rptfXDekLTeiNtlXU0GEK', '0', '0', '127.0.0.1', '2024-05-13 16:03:00', 103, 1713440206715650049, '2023-10-17 15:07:07', 1714176194496339970, '2024-05-13 16:03:00', NULL);
+
+-- ----------------------------
+-- Table structure for sys_user_post
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_user_post`;
+CREATE TABLE `sys_user_post`  (
+                                  `user_id` bigint(20) NOT NULL COMMENT '用户ID',
+                                  `post_id` bigint(20) NOT NULL COMMENT '岗位ID',
+                                  PRIMARY KEY (`user_id`, `post_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户与岗位关联表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_user_post
+-- ----------------------------
+INSERT INTO `sys_user_post` VALUES (1, 1);
+
+-- ----------------------------
+-- Table structure for sys_user_role
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_user_role`;
+CREATE TABLE `sys_user_role`  (
+                                  `user_id` bigint(20) NOT NULL COMMENT '用户ID',
+                                  `role_id` bigint(20) NOT NULL COMMENT '角色ID',
+                                  PRIMARY KEY (`user_id`, `role_id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户和角色关联表' ROW_FORMAT = Dynamic;
+
+-- ----------------------------
+-- Records of sys_user_role
+-- ----------------------------
+INSERT INTO `sys_user_role` VALUES (1, 1);
+
+SET FOREIGN_KEY_CHECKS = 1;

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov