root 1 рік тому
батько
коміт
5098c14bb0
100 змінених файлів з 6824 додано та 19563 видалено
  1. 2 2
      package.json
  2. 2 2
      src/main/main.js
  3. 1 1
      src/renderer/cocoblockly-x/ardublockly_lang.js
  4. 453 166
      src/renderer/cocoblockly-x/blockly/blocks/python/ai.js
  5. 293 297
      src/renderer/cocoblockly-x/blockly/blocks/python/esp32.js
  6. 144 218
      src/renderer/cocoblockly-x/blockly/blocks/python/extension_module.js
  7. 1 1
      src/renderer/cocoblockly-x/blockly/generators/arduino/screen.js
  8. 1 0
      src/renderer/cocoblockly-x/blockly/generators/python.js
  9. 2 2
      src/renderer/cocoblockly-x/blockly/generators/python/screen.js
  10. BIN
      src/renderer/cocoblockly-x/blockly/media/cocorobo.png
  11. 153 130
      src/renderer/cocoblockly-x/blockly/msg/js/en.js
  12. 30 6
      src/renderer/cocoblockly-x/blockly/msg/js/zh-hans.js
  13. 32 9
      src/renderer/cocoblockly-x/blockly/msg/js/zh-hant.js
  14. 2 1
      src/renderer/cocoblockly-x/cocoblockly.css
  15. 5 5
      src/renderer/cocoblockly-x/data.json
  16. 1 0
      src/renderer/cocoblockly-x/index.css
  17. 62 36
      src/renderer/cocoblockly-x/index.html
  18. 378 211
      src/renderer/cocoblockly-x/index.js
  19. 523 0
      src/renderer/cocoblockly-x/libs/codemirror/showhint.js
  20. 67 47
      src/renderer/cocoblockly-x/msg/en.js
  21. 24 6
      src/renderer/cocoblockly-x/msg/zh-hans.js
  22. 26 7
      src/renderer/cocoblockly-x/msg/zh-hant.js
  23. 27 12
      src/renderer/cocoblockly-x/src/blockly/account.js
  24. 4 1
      src/renderer/cocoblockly-x/src/blockly/ardublockly_blockly.js
  25. 2 2
      src/renderer/cocoblockly-x/src/blockly/cocoblockly.js
  26. 7 3
      src/renderer/cocoblockly-x/src/blockpy.css
  27. 320 90
      src/renderer/cocoblockly-x/src/editor.js
  28. 314 317
      src/renderer/cocoblockly-x/src/python/AI/人脸识别.xml
  29. 413 302
      src/renderer/cocoblockly-x/src/python/AI/人脸采集.xml
  30. 1 91
      src/renderer/cocoblockly-x/src/python/AI/自学习.xml
  31. 183 0
      src/renderer/cocoblockly-x/src/python/AI/自学习识别.xml
  32. 10 14
      src/renderer/cocoblockly-x/src/python/AI/语音录制识别.xml
  33. 229 0
      src/renderer/cocoblockly-x/src/python/AI/车牌识别.xml
  34. 117 7
      src/renderer/cocoblockly-x/src/python/bofangyinpin.xml
  35. 37 7
      src/renderer/cocoblockly-x/src/python/video/play_vidoe.xml
  36. 37 7
      src/renderer/cocoblockly-x/src/python/video/视频播放.xml
  37. 129 104
      src/renderer/cocoblockly-x/src/python/web/同步网络时间.xml
  38. 110 105
      src/renderer/cocoblockly-x/src/python/web/获取网络天气.xml
  39. 14 40
      src/renderer/cocoblockly-x/src/python/串口/uart_receive.xml
  40. 172 0
      src/renderer/cocoblockly-x/src/python/图像处理/二维码识别.xml
  41. 182 0
      src/renderer/cocoblockly-x/src/python/图像处理/寻找红色并追踪.xml
  42. 182 0
      src/renderer/cocoblockly-x/src/python/图像处理/寻找绿色并追踪.xml
  43. 182 0
      src/renderer/cocoblockly-x/src/python/图像处理/寻找色块.xml
  44. 182 0
      src/renderer/cocoblockly-x/src/python/图像处理/寻找蓝色并追踪.xml
  45. 2 2
      src/renderer/cocoblockly-x/src/python/图像处理/循线-单.xml
  46. 172 0
      src/renderer/cocoblockly-x/src/python/图像处理/条形码识别.xml
  47. 783 0
      src/renderer/cocoblockly-x/src/python/屏幕/小游戏:漫步者.xml
  48. 8 124
      src/renderer/cocoblockly-x/src/python/屏幕/按键切换背景色.xml
  49. 126 0
      src/renderer/cocoblockly-x/src/python/扩展/LED灯带.xml
  50. 221 0
      src/renderer/cocoblockly-x/src/python/扩展/呼吸灯.xml
  51. 44 0
      src/renderer/cocoblockly-x/src/python/扩展/蜂鸣器.xml
  52. 118 149
      src/renderer/cocoblockly-x/src/python/讯飞/情绪识别.xml
  53. 24 8
      src/renderer/cocoblockly-x/train_cocopi.html
  54. 23 2
      src/renderer/cocoblockly-x/train_cocopi.js
  55. 180 2
      src/renderer/cocoblockly-x/update.json
  56. 67 60
      src/renderer/cocoblockly-x/web.html
  57. 0 20
      src/renderer/cocoblockly-x/ya-webadb/apps/book/.gitignore
  58. 0 33
      src/renderer/cocoblockly-x/ya-webadb/apps/book/README.md
  59. 0 3
      src/renderer/cocoblockly-x/ya-webadb/apps/book/babel.config.js
  60. 0 146
      src/renderer/cocoblockly-x/ya-webadb/apps/book/docs/basics/architecture.md
  61. 0 7
      src/renderer/cocoblockly-x/ya-webadb/apps/book/docs/basics/authentication.md
  62. 0 113
      src/renderer/cocoblockly-x/ya-webadb/apps/book/docs/basics/connection.md
  63. 0 14
      src/renderer/cocoblockly-x/ya-webadb/apps/book/docs/basics/intro.md
  64. 0 39
      src/renderer/cocoblockly-x/ya-webadb/apps/book/docs/basics/packet.md
  65. 0 5
      src/renderer/cocoblockly-x/ya-webadb/apps/book/docs/basics/stream.md
  66. 0 13
      src/renderer/cocoblockly-x/ya-webadb/apps/book/docs/commands/shell.md
  67. 0 63
      src/renderer/cocoblockly-x/ya-webadb/apps/book/docusaurus.config.js
  68. 0 46
      src/renderer/cocoblockly-x/ya-webadb/apps/book/package.json
  69. 0 36
      src/renderer/cocoblockly-x/ya-webadb/apps/book/scripts/plantuml.js
  70. 0 27
      src/renderer/cocoblockly-x/ya-webadb/apps/book/sidebars.js
  71. 0 29
      src/renderer/cocoblockly-x/ya-webadb/apps/book/src/css/custom.css
  72. 0 0
      src/renderer/cocoblockly-x/ya-webadb/apps/book/static/.nojekyll
  73. BIN
      src/renderer/cocoblockly-x/ya-webadb/apps/book/static/img/favicon.ico
  74. 0 0
      src/renderer/cocoblockly-x/ya-webadb/apps/book/static/img/logo.svg
  75. 0 10
      src/renderer/cocoblockly-x/ya-webadb/common/changes/@yume-chan/scrcpy/main_2022-10-18-10-09.json
  76. 0 22
      src/renderer/cocoblockly-x/ya-webadb/common/config/rush/.npmrc
  77. 0 21
      src/renderer/cocoblockly-x/ya-webadb/common/config/rush/.npmrc-publish
  78. 0 38
      src/renderer/cocoblockly-x/ya-webadb/common/config/rush/.pnpmfile.cjs
  79. 0 85
      src/renderer/cocoblockly-x/ya-webadb/common/config/rush/artifactory.json
  80. 0 84
      src/renderer/cocoblockly-x/ya-webadb/common/config/rush/build-cache.json
  81. 0 330
      src/renderer/cocoblockly-x/ya-webadb/common/config/rush/command-line.json
  82. 0 62
      src/renderer/cocoblockly-x/ya-webadb/common/config/rush/common-versions.json
  83. 0 32
      src/renderer/cocoblockly-x/ya-webadb/common/config/rush/experiments.json
  84. 0 7
      src/renderer/cocoblockly-x/ya-webadb/common/config/rush/pnpm-config.json
  85. 0 14571
      src/renderer/cocoblockly-x/ya-webadb/common/config/rush/pnpm-lock.yaml
  86. 0 5
      src/renderer/cocoblockly-x/ya-webadb/common/config/rush/repo-state.json
  87. 0 95
      src/renderer/cocoblockly-x/ya-webadb/common/config/rush/version-policies.json
  88. 0 25
      src/renderer/cocoblockly-x/ya-webadb/common/git-hooks/commit-msg.sample
  89. 0 116
      src/renderer/cocoblockly-x/ya-webadb/common/scripts/install-run-rush.js
  90. 0 18
      src/renderer/cocoblockly-x/ya-webadb/common/scripts/install-run-rushx.js
  91. 0 500
      src/renderer/cocoblockly-x/ya-webadb/common/scripts/install-run.js
  92. 0 14
      src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-direct-sockets/.npmignore
  93. 0 5
      src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-direct-sockets/README.md
  94. 0 42
      src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-direct-sockets/package.json
  95. 0 70
      src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-direct-sockets/src/index.ts
  96. 0 17
      src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-direct-sockets/tsconfig.json
  97. 0 14
      src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-webusb/.npmignore
  98. 0 106
      src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-webusb/CHANGELOG.json
  99. 0 63
      src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-webusb/CHANGELOG.md
  100. 0 21
      src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-webusb/LICENSE

+ 2 - 2
package.json

@@ -1,6 +1,6 @@
 {
   "name": "CocoRoboVDeskTop",
-  "version": "1.0.0",
+  "version": "1.0.1",
   "description": "cocorobo",
   "repository": "https://github.com/CocoRoboLabs/CocoBlockly-desktop.git",
   "scripts": {
@@ -78,4 +78,4 @@
     "bufferutil": "^4.0.1",
     "utf-8-validate": "^5.0.2"
   }
-}
+}

+ 2 - 2
src/main/main.js

@@ -216,8 +216,8 @@ function createMainWindow() {
 
 	window.on('closed', () => { app.quit() });
 
-	// window.webContents.on('devtools-opened', () => window.focus());
-	// window.webContents.openDevTools({ mode: 'undocked' });
+	//window.webContents.on('devtools-opened', () => window.focus());
+	//window.webContents.openDevTools({ mode: 'undocked' });
 	return window;
 }
 

+ 1 - 1
src/renderer/cocoblockly-x/ardublockly_lang.js

@@ -151,7 +151,7 @@ Ardublockly.changeLanguage = function () {
 Ardublockly.getLocalStr = function (stringId) {
   var text = Ardublockly.LOCALISED_TEXT[stringId];
   if (!text) {
-    console.log('Localised text string ID "' + stringId + '" does not exists!');
+    // console.log('Localised text string ID "' + stringId + '" does not exists!');
   }
   return text || Ardublockly.DEFAULT_LANG_TEXT[stringId] || '';
 };

Різницю між файлами не показано, бо вона завелика
+ 453 - 166
src/renderer/cocoblockly-x/blockly/blocks/python/ai.js


+ 293 - 297
src/renderer/cocoblockly-x/blockly/blocks/python/esp32.js

@@ -191,19 +191,18 @@ Blockly.Blocks['esp32_main_controller_io_from_digital_pin'] = {
         this.appendDummyInput()
             .appendField(Blockly.Msg.digital_get)
             .appendField(new Blockly.FieldDropdown([
-                ["1", "1"],
-                ["2", "2"],
-                ["3", "3"],
-                ["4", "4"],
-                ["5", "5"],
-                ["6", "6"],
-                ["7", "7"],
-                ["8", "8"],
-                ["9", "9"],
-                ["10", "10"],
-                ["11", "11"],
-                ["12", "12"],
-                ["13", "13"]
+                ["S1", "1"],
+                ["S2", "2"],
+                ["3", "7"],
+                ["4", "8"],
+                ["5", "13"]
+                // ["6", "14"]
+                // ["7", "7"],
+                // ["8", "8"],
+                // ["9", "9"],
+                // ["10", "10"],
+                // ["11", "11"],
+                // ["12", "12"]
             ]), "analog_pin");
         this.appendDummyInput()
             .appendField(Blockly.Msg.digital_get_value);
@@ -223,10 +222,19 @@ Blockly.Python['esp32_main_controller_io_from_digital_pin'] = function (block) {
     Blockly.Python.definitions_['v831_import_time'] = `import time`
     Blockly.Python.definitions_['v831_import_sys'] = `import sys
 sys.path.append("/root/")`
-    Blockly.Python.definitions_['v831_import_CocoPi_stm8s']  = `from CocoPi import multiFuncGpio`;
-    Blockly.Python.addVariable('_Math_gpio_' + value_name, `_Math_gpio_${value_name} = multiFuncGpio(${value_name-1},2)`, true);
+var code = ""
+    if(value_name ==2 || value_name == 1){
+        Blockly.Python.definitions_['v831_import_CocoPi_multiFuncGpio']  = `from CocoPi import multiFuncGpio`;
+        Blockly.Python.addVariable('_Math_gpio_' + value_name, `_Math_gpio_${value_name} = multiFuncGpio(${value_name-1},2)`, true);
+        code = `_Math_gpio_${value_name}.digitalRead()`;
+    }else{
+        Blockly.Python.definitions_['v831_import_CocoPi_BUTTON']  = `from CocoPi import BUTTON `;
+        Blockly.Python.addVariable('_Math_gpio_' + value_name, `_Math_gpio_${value_name} = BUTTON(${value_name})`, true);
+        code = `_Math_gpio_${value_name}.is_pressed()`;
+    }
+    
 
-    var code = `_Math_gpio_${value_name}.digitalRead()`;
+    
 
     // TODO: Change ORDER_NONE to the correct strength.
     return [code, Blockly.Python.ORDER_CONDITIONAL];
@@ -383,19 +391,12 @@ Blockly.Blocks['esp32_main_controller_io_set_digital_pin'] = {
         this.appendDummyInput()
             .appendField("")
             .appendField(new Blockly.FieldDropdown([
-                ["1", "1"],
-                ["2", "2"],
-                ["3", "3"],
-                ["4", "4"],
-                ["5", "5"],
-                ["6", "6"],
-                ["7", "7"],
-                ["8", "8"],
-                ["9", "9"],
-                ["10", "10"],
-                ["11", "11"],
-                ["12", "12"],
-                ["13", "13"]
+                ["S1", "1"],
+                ["S2", "2"]
+                // ["3", "231"],
+                // ["4", "232"],
+                // ["5", "237"],
+                // ["6", "238"]
             ]), "digital_set_type_gpio").appendField("");
         this.appendDummyInput()
             .appendField(Blockly.Msg.digital_set_as);
@@ -428,11 +429,20 @@ Blockly.Python['esp32_main_controller_io_set_digital_pin'] = function (block) {
     Blockly.Python.definitions_['v831_import_time'] = `import time`
     Blockly.Python.definitions_['v831_import_sys'] = `import sys
 sys.path.append("/root/")`
-    Blockly.Python.definitions_['v831_import_CocoPi_stm8s']  = `from CocoPi import multiFuncGpio`;
-    Blockly.Python.addVariable('MATHOUT' + value_name, `MATHOUT${value_name} = multiFuncGpio(${value_name-1},3)`, true);
+    var code = ''
+    if(value_name ==2 || value_name ==1){
+        Blockly.Python.definitions_['v831_import_CocoPi_multiFuncGpio']  = `from CocoPi import multiFuncGpio`;
+        Blockly.Python.addVariable('MATHOUT' + value_name, `MATHOUT${value_name} = multiFuncGpio(${value_name-1},3)`, true);
+        code = `MATHOUT${value_name}.digitalWrite(${high_low})
+`
+    }else{
+        Blockly.Python.definitions_['v831_import_CocoPi_LED']  = `from CocoPi import LED`;
+        Blockly.Python.addVariable('MATHOUT' + value_name, `MATHOUT${value_name} = LED(${value_name})`, true);
+        code = `MATHOUT${value_name}.out(${high_low})
+`
+    }
+    
 
-    var code = `MATHOUT${value_name}.digitalWrite(${high_low})
-`;
 
     return code;
 };
@@ -519,28 +529,23 @@ Blockly.Python['esp32_main_controller_io_out_pwm'] = function (block) {
     }
     return code;
 }
-
-var iot_analog_pin = [
-    '34', '35', '36']
-
 Blockly.Blocks['esp32_main_controller_io_from_analog_pin'] = {
     init: function () {
         this.appendDummyInput()
             .appendField(Blockly.Msg.analog_get)
             .appendField(new Blockly.FieldDropdown([
-                ["1", "1"],
-                ["2", "2"],
-                ["3", "3"],
-                ["4", "4"],
-                ["5", "5"],
-                ["6", "6"],
-                ["7", "7"],
-                ["8", "8"],
-                ["9", "9"],
-                ["10", "10"],
-                ["11", "11"],
-                ["12", "12"],
-                ["13", "13"]
+                ["S1", "1"],
+                ["S2", "2"]
+                // ["3", "3"],
+                // ["4", "4"],
+                // ["5", "5"],
+                // ["6", "6"],
+                // ["7", "7"],
+                // ["8", "8"],
+                // ["9", "9"],
+                // ["10", "10"],
+                // ["11", "11"],
+                // ["12", "12"]
             ]), "gpio");
         this.appendDummyInput()
             .appendField(Blockly.Msg.analog_get_value);
@@ -563,10 +568,16 @@ Blockly.Python['esp32_main_controller_io_from_analog_pin'] = function (block) {
     Blockly.Python.definitions_['v831_import_time'] = `import time`
     Blockly.Python.definitions_['v831_import_sys'] = `import sys
 sys.path.append("/root/")`
-    Blockly.Python.definitions_['v831_import_CocoPi_stm8s']  = `from CocoPi import multiFuncGpio`;
-    Blockly.Python.addVariable('_PWN_gpio_' + value_gpio, `_PWN_gpio_${value_gpio} = multiFuncGpio(${value_gpio-1},4)`, true);
+    Blockly.Python.definitions_['v831_import_CocoPi_multiFuncGpio']  = `from CocoPi import multiFuncGpio`;
+    if(value_gpio == 1||value_gpio==2){
+        Blockly.Python.addVariable('_PWN_gpio_' + value_gpio, `_PWN_gpio_${value_gpio} = multiFuncGpio(${value_gpio-1},4)`, true); 
+    }else{
+        Blockly.Python.addVariable('_PWN_gpio_' + value_gpio, `_PWN_gpio_${value_gpio} = multiFuncGpio(${value_gpio-1},4)`, true); 
+    }
+    
 
     var code = `_PWN_gpio_${value_gpio}.analogRead()`;
+    
 
     // TODO: Change ORDER_NONE to the correct strength.
     return [code, Blockly.Python.ORDER_CONDITIONAL];
@@ -579,20 +590,19 @@ Blockly.Blocks['esp32_main_controller_io_set_analog_pin'] = {
         this.appendDummyInput()
             .appendField(Blockly.Msg.digital_set)
             .appendField(new Blockly.FieldDropdown([
-                ["1", "1"],
-                ["2", "2"],
-                ["3", "3"],
-                ["4", "4"],
-                ["5", "5"],
-                ["6", "6"],
-                ["7", "7"],
-                ["8", "8"],
-                ["9", "9"],
-                ["10", "10"],
-                ["11", "11"],
-                ["12", "12"],
-                ["13", "13"]
-            ]), "gpio");
+                ["S1", "1"],
+                ["S2", "2"]
+                // ["3", "3"],
+                // ["4", "4"],
+                // ["5", "5"],
+                // ["6", "6"],
+                // ["7", "7"],
+                // ["8", "8"],
+                // ["9", "9"],
+                // ["10", "10"],
+                // ["11", "11"],
+                // ["12", "12"]
+            ]), "gpio"); 
         this.appendValueInput("pwm")
             .appendField(Blockly.Msg.set_pwm)
             .setCheck(null);
@@ -620,7 +630,7 @@ Blockly.Python['esp32_main_controller_io_set_analog_pin'] = function (block) {
     Blockly.Python.definitions_['v831_import_time'] = `import time`
     Blockly.Python.definitions_['v831_import_sys'] = `import sys
 sys.path.append("/root/")`
-    Blockly.Python.definitions_['v831_import_CocoPi_stm8s']  = `from CocoPi import multiFuncGpio`;
+    Blockly.Python.definitions_['v831_import_CocoPi_multiFuncGpio']  = `from CocoPi import multiFuncGpio`;
     Blockly.Python.addVariable('PWNOUT_' + value_name1, `PWNOUT_${value_name1} = multiFuncGpio(${value_name1-1},5)`, true);
 
     var code = `PWNOUT_${value_name1}.analogWrite(${value_name2})`;
@@ -1334,6 +1344,39 @@ BUZZER
 
 
 
+Blockly.Blocks['esp32_main_controller_set_buzzer_init'] = {
+    init: function () {
+        // this.appendDummyInput()
+        //     .appendField(new Blockly.FieldImage("blockly/media/buzzer.png", 38, 38, { alt: "*", flipRtl: "FALSE" }));
+        this.appendDummyInput()
+            .appendField( /*Blockly.Msg.ESP32TURNOBAF*/);
+        //.appendField(new Blockly.FieldNumber(31, 31, 65535, 1), "buzzer_frequency");
+        this.appendDummyInput()
+            .appendField(Blockly.Msg.basic_buzzer_set_init)
+            .appendField(new Blockly.FieldDropdown([
+                ["S1", "0"],
+                ["S2", "1"]
+            ]), "notes")
+        this.setInputsInline(true);
+        this.setPreviousStatement(true);
+        this.setNextStatement(true);
+        // this.setPreviousStatement(true, null);
+        // this.setNextStatement(true, null);
+        this.setColour("#d42b03");
+        this.setTooltip(Blockly.Msg.Esp32_Main_Controller_Set_Buzzer_TOOLTIP);
+        this.setHelpUrl("");
+    }
+};
+
+Blockly.Python['esp32_main_controller_set_buzzer_init'] = function (block) {
+    var notes = block.getFieldValue('notes');
+    Blockly.Python.definitions_['v831_import_sys'] = `import sys
+sys.path.append("/root/")`
+    Blockly.Python.definitions_['v831_import_CocoPi_multiFuncGpio']  = `from CocoPi import multiFuncGpio`;
+    Blockly.Python.addVariable('BUZZER' + notes, `BUZZER${notes} = multiFuncGpio(${notes},5)`, true);
+    var code = '';
+    return code;
+};
 
 Blockly.Blocks['esp32_main_controller_set_buzzer'] = {
     init: function () {
@@ -1342,9 +1385,12 @@ Blockly.Blocks['esp32_main_controller_set_buzzer'] = {
         this.appendDummyInput()
             .appendField( /*Blockly.Msg.ESP32TURNOBAF*/);
         //.appendField(new Blockly.FieldNumber(31, 31, 65535, 1), "buzzer_frequency");
-        this.appendDummyInput()
+        this.appendDummyInput().appendField(new Blockly.FieldDropdown([
+            ["S1", "0"],
+            ["S2", "1"]
+        ]), "notes")
         .appendField(Blockly.Msg.basic_buzzer_set)
-        .appendField(new Blockly.FieldNumber(31,20, 20000),'esp32_var_num');
+        .appendField(new Blockly.FieldNumber(31,20, 12000),'esp32_var_num');
         this.setInputsInline(true);
         this.setPreviousStatement(true);
         this.setNextStatement(true);
@@ -1357,23 +1403,19 @@ Blockly.Blocks['esp32_main_controller_set_buzzer'] = {
 };
 
 Blockly.Python['esp32_main_controller_set_buzzer'] = function (block) {
-    Blockly.Python.definitions_['import_PWM'] = 'from machine import PWM';
-    Blockly.Python.definitions_['import_Pin'] = 'from machine import Pin';
-    var _type = block.getFieldValue("esp32_var_num")
-
-    Blockly.Python.definitions_['buzzer_operation'] = '' +
-        'beeper = PWM(Pin(26, Pin.OUT), freq=440, duty=512)\n' +
-        'beeper.deinit()\n' +
-        '\n';
-
-    var code = 'beeper.init()\nbeeper.freq(' + _type + ')\n';
+    var esp32_var_num = block.getFieldValue("esp32_var_num");
+    var notes = block.getFieldValue('notes');
+    var code = `BUZZER${notes}.beep(${esp32_var_num})
+`;
     return code;
 };
 
 Blockly.Blocks['esp32_main_controller_turn_off_buzzer'] = {
     init: function () {
-        this.appendDummyInput()
-            .appendField(Blockly.Msg.ESP32TURNOB);
+        this.appendDummyInput().appendField(new Blockly.FieldDropdown([
+            ["S1", "0"],
+            ["S2", "1"]
+        ]), "notes").appendField(Blockly.Msg.ESP32TURNOB);
         this.setPreviousStatement(true, null);
         this.setNextStatement(true, null);
         this.setColour("#d42b03");
@@ -1384,30 +1426,135 @@ Blockly.Blocks['esp32_main_controller_turn_off_buzzer'] = {
 
 
 Blockly.Python['esp32_main_controller_turn_off_buzzer'] = function (block) {
-    Blockly.Python.definitions_['import_PWM'] = 'from machine import PWM';
-
-    Blockly.Python.definitions_['buzzer_operation'] = '' +
-        'beeper = PWM(Pin(26, Pin.OUT), freq=440, duty=512)\n' +
-        'beeper.deinit()\n' +
-        /*
-        'def _beeper_control(state, freq=31):\n' +
-        '    if freq <= 31: freq = 31\n' +
-        '    elif freq >= 67108863: freq = 67108863\n' +
-        '    if state == True:\n' +
-        '        beeper.init()\n' +
-        '        beeper.freq(freq)\n' +
-        '        time.sleep_ms(20)\n' +
-        '    elif state == False:\n' +
-        '        beeper.deinit()\n' +
-        '        time.sleep_ms(20)\n' +
-        */
-        '\n';
-
-    var code = 'beeper.deinit()\n';
+    var notes = block.getFieldValue('notes');
+    var code = `BUZZER${notes}.beep(0)
+`
     return code;
     //return [code, Blockly.Python.ORDER_FUNCTION_CALL];
 };
 
+Blockly.Blocks['esp32_main_controller_turn_off_buzzer_music'] = {
+    init: function () {
+        this.appendDummyInput().appendField(new Blockly.FieldDropdown([
+            ["S1", "0"],
+            ["S2", "1"]
+        ]), "type")
+            .appendField(Blockly.Msg.esp32_main_controller_turn_off_buzzer_music_lite)
+            .appendField(new Blockly.FieldDropdown([
+                ["C2", "65"],
+                ["D2", "73"],
+                ["E2", "82"],
+                ["F2", "87"],
+                ["G2", "98"],
+                ["A2", "110"],
+                ["B2", "123"],
+                ["C3", "130"],
+                ["D3", "146"],
+                ["E3", "164"],
+                ["F3", "174"],
+                ["G3", "196"],
+                ["A3", "220"],
+                ["B3", "246"],
+                ["C4", "261"],
+                ["D4", "293"],
+                ["E4", "329"],
+                ["F4", "349"],
+                ["G4", "392"],
+                ["A4", "440"],
+                ["B4", "493"],
+                ["C5", "523"],
+                ["D5", "587"],
+                ["E5", "659"],
+                ["F5", "698"],
+                ["G5", "784"],
+                ["A5", "880"],
+                ["B5", "987"],
+                ["C6", "1046"],
+                ["D6", "1174"],
+                ["E6", "1318"],
+                ["F6", "1396"],
+                ["G6", "1568"],
+                ["A6", "1760"],
+                ["B6", "1975"],
+                ["C7", "2093"],
+                ["D7", "2349"],
+                ["E7", "2637"],
+                ["F7", "2793"],
+                ["G7", "3136"],
+                ["A7", "3520"],
+                ["B7", "3951"],
+                ["C8", "4186"],
+                ["D8", "4698"],
+                ["E8", "5274"],
+                ["F8", "5587"],
+                ["G8", "6272"],
+                ["A8", "7040"],
+                ["B8", "7902"]
+            ]), "notes")
+            .appendField(Blockly.Msg.esp32_main_controller_turn_off_buzzer_music_lite_2);
+        this.appendValueInput("beat")
+            .setCheck(null);
+        this.appendDummyInput()
+            .appendField(Blockly.Msg.esp32_main_controller_turn_off_buzzer_music_lite_3);
+        this.setInputsInline(true);
+        this.setPreviousStatement(true, null);
+        this.setNextStatement(true, null);
+        this.setColour("#d42b03");
+        this.setTooltip(Blockly.Msg.esp32_main_controller_turn_off_buzzer_music_lite_TOOLTIP);
+        this.setHelpUrl("");
+    }
+};
+
+Blockly.Python['esp32_main_controller_turn_off_buzzer_music'] = function (block) {
+    Blockly.Python.definitions_['v831_import_time'] = `import time`
+    var beat = Blockly.Python.valueToCode(block, 'beat', Blockly.Python.ORDER_ATOMIC).replace("(", "").replace(")", "");
+
+    var type = block.getFieldValue('type');
+    var notes = block.getFieldValue('notes');
+    // TODO: Assemble Python into code variable.
+    // TODO: Assemble Python into code variable.
+    var code = `BUZZER${type}.beep(${notes})
+time.sleep(${beat})
+`
+    return code;
+};
+
+Blockly.Blocks['esp32_main_controller_buzzer_set_beat_lite'] = {
+    init: function () {
+        this.appendDummyInput()
+            .appendField(new Blockly.FieldDropdown([
+                ["1/2", "0.5"],
+                ["1", "1"],
+                ["1/4", "0.25"],
+                ["1/8", "0.125"],
+                ["1/16", "0.063"]
+            ]), "beat");
+        this.setInputsInline(true);
+        this.setOutput(true, null);
+        this.setColour("#d42b03");
+        this.setHelpUrl("");
+        var thisBlock = this;
+        this.setTooltip(function () {
+            var mode = thisBlock.getFieldValue('beat');
+            var TOOLTIPS = {
+                "1": "%1".replace("%1", "1"),
+                "0.5": "%1".replace("%1", "1/2"),
+                "0.25": "%1".replace("%1", "1/4"),
+                "0.125": "%1".replace("%1", "1/8"),
+                "0.063": "%1".replace("%1", "1/16")
+            };
+            return TOOLTIPS[mode];
+        });
+    }
+};
+
+Blockly.Python['esp32_main_controller_buzzer_set_beat_lite'] = function (block) {
+    var value_name1 = block.getFieldValue('beat');
+    var code = value_name1;
+
+    return [code, Blockly.Python.ORDER_NONE];
+};
+
 
 /*
 TOUCH AREA
@@ -2234,20 +2381,8 @@ Blockly.Python['esp32_main_controller_time_timer_clear'] = function (block) {
 
 Blockly.Blocks['esp32_main_controller_time_period_timer'] = {
     init: function () {
-        let types = getLocalStorage("type")
-        types == 1 ? this.appendDummyInput()
-            .appendField("")
-            .appendField(new Blockly.FieldDropdown([
-                [Blockly.Msg.time_ai_module, "on_ai"],
-                [Blockly.Msg.time_iot_module, "on_esp32"]
-            ]), "type")
-            .appendField(Blockly.Msg.time_timer_periodically) :
-            this.appendDummyInput()
-                .appendField("")
-                .appendField(new Blockly.FieldDropdown([
-                    [Blockly.Msg.time_iot_module, "on_esp32"],
-                    [Blockly.Msg.time_ai_module, "on_ai"]
-                ]), "type")
+        
+        this.appendDummyInput()
                 .appendField(Blockly.Msg.time_timer_periodically);
         this.appendDummyInput()
             .appendField(Blockly.Msg.time_timer_every)
@@ -2259,201 +2394,60 @@ Blockly.Blocks['esp32_main_controller_time_period_timer'] = {
         this.setPreviousStatement(true, null);
         this.setNextStatement(true, null);
         this.setColour(ESP32_TIME_COLOR);
-        var thisBlock = this;
-        this.setTooltip(function () {
-            var mode = thisBlock.getFieldValue('type');
-            var TOOLTIPS = {
-                'on_esp32': Blockly.Msg.Esp32_Main_Controller_Time_Period_Timer_TOOLTIP.replace('%1', Blockly.Msg.time_iot_module),
-                'on_ai': Blockly.Msg.Esp32_Main_Controller_Time_Period_Timer_TOOLTIP.replace('%1', Blockly.Msg.time_ai_module)
-            };
-            return TOOLTIPS[mode];
-        });
+        this.setTooltip(Blockly.Msg.Esp32_Main_Controller_Time_Period_Timer_TOOLTIP.replace('%1', "CocoPi"));
         this.setHelpUrl("");
     }
 };
 
 Blockly.Python['esp32_main_controller_time_period_timer'] = function (block) {
-    var timer_type = block.getFieldValue('type');
-    var text_period_timer_count = block.getFieldValue('period_timer_count');
+    var text_period_timer_count = block.getFieldValue('period_timer_count')*0.001;
     var statements_name = Blockly.Python.statementToCode(block, 'exec_period_timer');
-
-    if (timer_type == "on_esp32") {
-        let allBlocks = block.workspace.getAllBlocks();
-        let isVariablesSet = allBlocks.findIndex(item => {
-            return item.type == "variables_set";
-        });
-        let isVariablesSetDisabled = allBlocks.findIndex(item => {
-            return item.type == "variables_set" && item.disabled == true;
-        });
-        let isMathChange = allBlocks.findIndex(item => {
-            return item.type == "math_change";
-        });
-        let isMathChangeDisabled = allBlocks.findIndex(item => {
-            return item.type == "math_change" && item.disabled == true;
-        });
-        if ((isVariablesSet == -1 && isMathChange == -1) || (isVariablesSet != -1 && isVariablesSetDisabled != -1 && isMathChange == -1) || (isVariablesSet == -1 && isMathChange != -1 && isMathChangeDisabled != -1) || (isVariablesSet != -1 && isMathChange != -1 && (isVariablesSetDisabled != -1 && isMathChangeDisabled != -1))) {
-            Blockly.Python.definitions_['import_defs'] = '' +
-                'from machine import Timer\n' +
-                '\n' +
-                'def _PRD_EXEC_tick(_):\n' +
-                '    global _ControlTopic, _ReportTopic\n' +
-                statements_name +
-                '\n' +
-                '_PRD_EXEC_TIMER = Timer(0)\n' +
-                '_PRD_EXEC_TIMER.deinit()\n' +
-                '_PRD_EXEC_TIMER.init(period=' + text_period_timer_count + ', mode=Timer.PERIODIC, callback=_PRD_EXEC_tick)\n' +
-                '';
-        }
-        else {
-            var global = "";
-            if (isVariablesSet != -1) {
-                for (var i = 0; i < allBlocks[isVariablesSet].workspace.variableList.length; i++) {
-                    if (i != allBlocks[isVariablesSet].workspace.variableList.length - 1) {
-                        global += allBlocks[isVariablesSet].workspace.variableList[i] + ", ";
-                    }
-                    else {
-                        global += allBlocks[isVariablesSet].workspace.variableList[i];
-                    }
-                }
-            }
-            else if (isMathChange != -1) {
-                for (var i = 0; i < allBlocks[isMathChange].workspace.variableList.length; i++) {
-                    if (i != allBlocks[isMathChange].workspace.variableList.length - 1) {
-                        global += allBlocks[isMathChange].workspace.variableList[i] + ",";
-                    }
-                    else {
-                        global += allBlocks[isMathChange].workspace.variableList[i];
-                    }
-                }
-            }
-            Blockly.Python.definitions_['import_defs'] = '' +
-                'from machine import Timer\n' +
-                '\n' +
-                'def _PRD_EXEC_tick(_):\n' +
-                '    global _ControlTopic, _ReportTopic, ' + global + '\n' +
-                statements_name +
-                '\n' +
-                '_PRD_EXEC_TIMER = Timer(0)\n' +
-                '_PRD_EXEC_TIMER.deinit()\n' +
-                '_PRD_EXEC_TIMER.init(period=' + text_period_timer_count + ', mode=Timer.PERIODIC, callback=_PRD_EXEC_tick)\n' +
-                '';
-        }
-    } else if (timer_type == "on_ai") {
-        let allBlocks = block.workspace.getAllBlocks();
-        let isVariablesSet = allBlocks.findIndex(item => {
-            return item.type == "variables_set";
-        });
-        let isVariablesSetDisabled = allBlocks.findIndex(item => {
-            return item.type == "variables_set" && item.disabled == true;
-        });
-        let isMathChange = allBlocks.findIndex(item => {
-            return item.type == "math_change";
-        });
-        let isMathChangeDisabled = allBlocks.findIndex(item => {
-            return item.type == "math_change" && item.disabled == true;
-        });
-        //let data = blockpy.components.editor.codeMirror.getValue()
-        if ((isVariablesSet == -1 && isMathChange == -1) || (isVariablesSet != -1 && isVariablesSetDisabled != -1 && isMathChange == -1) || (isVariablesSet == -1 && isMathChange != -1 && isMathChangeDisabled != -1) || (isVariablesSet != -1 && isMathChange != -1 && (isVariablesSetDisabled != -1 && isMathChangeDisabled != -1))) {
-            Blockly.Python.definitions_['v831_import_time'] = `import time`
-            Blockly.Python.definitions_['import_def'] = '' +
-                'from machine import Timer\n' +
-                '\n' +
-                '';
-            Blockly.Python.definitions_['import_def_s'] = '' +
-                'def _on_timer(timer):\n' +
-                statements_name +
-                '\n' +
-                //'from machine import Timer\n' +
-                '_periodic_tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PERIODIC, period=' + text_period_timer_count + ', callback=_on_timer, arg=_on_timer)\n\n' +
-                '_periodic_tim.start()\n' +
-                '';
-        }
-        else {
-            var global = "";
-            if (isVariablesSet != -1) {
-                global = "    global ";
-                for (var i = 0; i < allBlocks[isVariablesSet].workspace.variableList.length; i++) {
-                    if (i != allBlocks[isVariablesSet].workspace.variableList.length - 1) {
-                        global += allBlocks[isVariablesSet].workspace.variableList[i] + ", ";
-                    }
-                    else {
-                        global += allBlocks[isVariablesSet].workspace.variableList[i];
-                    }
-                }
-            }
-            else if (isMathChange != -1) {
-                global = "    global ";
-                for (var i = 0; i < allBlocks[isMathChange].workspace.variableList.length; i++) {
-                    if (i != allBlocks[isMathChange].workspace.variableList.length - 1) {
-                        global += allBlocks[isMathChange].workspace.variableList[i] + ",";
-                    }
-                    else {
-                        global += allBlocks[isMathChange].workspace.variableList[i];
-                    }
-                }
-            }
-            Blockly.Python.definitions_['v831_import_time'] = `import time`
-            Blockly.Python.definitions_['import_def'] = '' +
-                'from machine import Timer\n' +
-                '\n' +
-                '';
-            Blockly.Python.definitions_['import_def_s'] = '' +
-                'def _on_timer(timer):\n' +
-                global + '\n' +
-                statements_name +
-                '\n' +
-                //'from machine import Timer\n' +
-                '_periodic_tim = Timer(Timer.TIMER0, Timer.CHANNEL0, mode=Timer.MODE_PERIODIC, period=' + text_period_timer_count + ', callback=_on_timer, arg=_on_timer)\n\n' +
-                '_periodic_tim.start()\n' +
-                '';
-        }
-    }
-    // TODO: Assemble Python into code variable.
-    var code = '';
+    Blockly.Python.addVariable("STOPTHREAD","STOPTHREAD = False",true)
+    Blockly.Python.definitions_['v831_import_threading'] = `import threading`
+    Blockly.Python.definitions_['v831_import_time'] = `import time`
+    let allBlocks = block.workspace.getAllBlocks();
+    let global = ""
+    // console.log('allBlocks',allBlocks)
+    try{
+        global = allBlocks[0].workspace.variableList.toString()
+    }
+    catch(e){
+        console.log(e)
+    }
+    Blockly.Python.definitions_['v831_import_thread_calsss'] = `def period_timer_count(n: int):
+    global STOPTHREAD
+    while True:
+        if STOPTHREAD:
+            break
+        time.sleep(${text_period_timer_count})
+        thread_calsss_fun_timer()
+`
+    Blockly.Python.definitions_['v831_import_thread_calsss_fun'] = `def thread_calsss_fun_timer():
+    global ${global}
+${statements_name}
+`
+    var code = `CocoPiThread = threading.Thread(target=period_timer_count, args=(1,))
+CocoPiThread.start()
+`
     return code;
 };
 
 Blockly.Blocks['esp32_main_controller_time_period_timer_clear'] = {
     init: function () {
-        let types = getLocalStorage("type")
-        types == 1 ? this.appendDummyInput()
-            .appendField("")
-            .appendField(new Blockly.FieldDropdown([
-                [Blockly.Msg.time_ai_module, "on_ai"],
-                [Blockly.Msg.time_iot_module, "on_esp32"]
-            ]), "type")
-            .appendField(Blockly.Msg.time_timer_periodically_clear) :
-            this.appendDummyInput()
-                .appendField("")
-                .appendField(new Blockly.FieldDropdown([
-                    [Blockly.Msg.time_iot_module, "on_esp32"],
-                    [Blockly.Msg.time_ai_module, "on_ai"]
-                ]), "type")
+        this.appendDummyInput()
                 .appendField(Blockly.Msg.time_timer_periodically_clear);
         this.setPreviousStatement(true, null);
         this.setNextStatement(true, null);
         this.setColour(ESP32_TIME_COLOR);
         var thisBlock = this;
-        this.setTooltip(function () {
-            var mode = thisBlock.getFieldValue('type');
-            var TOOLTIPS = {
-                'on_esp32': Blockly.Msg.Esp32_Main_Controller_Time_Period_Timer_Clear_TOOLTIP.replace('%1', Blockly.Msg.time_iot_module),
-                'on_ai': Blockly.Msg.Esp32_Main_Controller_Time_Period_Timer_Clear_TOOLTIP.replace('%1', Blockly.Msg.time_ai_module)
-            };
-            return TOOLTIPS[mode];
-        });
+        this.setTooltip(Blockly.Msg.Esp32_Main_Controller_Time_Period_Timer_Clear_TOOLTIP.replace('%1', "CocoPi"));
         this.setHelpUrl("");
     }
 };
 
 Blockly.Python['esp32_main_controller_time_period_timer_clear'] = function (block) {
-    var timer_type = block.getFieldValue('type');
-    // TODO: Assemble Python into code variable.
-    if (timer_type == "on_esp32") {
-        var code = '_PRD_EXEC_TIMER.deinit()\n';
-    } else if (timer_type == "on_ai") {
-        var code = '_periodic_tim.stop()\n';
-    }
+    var code = `STOPTHREAD = True
+`
     return code;
 };
 
@@ -5865,19 +5859,20 @@ Blockly.Python['esp32_network_http_post'] = function (block) {
 
     Blockly.Python.addVariable('_SEND_HTTP_POST_ENDPOINT', '', true);
     Blockly.Python.addVariable('_SEND_HTTP_REQUEST', '', true);
-
+    Blockly.Python.definitions_['831_import_requests'] = `import requests`
+    Blockly.Python.definitions_['831_import_json'] = `import json`
     Blockly.Python.definitions_['import_urequests'] = '' +
-        'import requests\n' +
-        'import json\n' +
-        '\n' +
         '_SEND_HTTP_POST_ENDPOINT = ' + url + '\n' +
         '';
     // TODO: Assemble Python into code variable.
 
-    var code = '' +
-        '_SEND_HTTP_POST_DATA = \'' + data + '\'\n' +
-        '_SEND_HTTP_REQUEST = requests.post(_SEND_HTTP_POST_ENDPOINT, data = _SEND_HTTP_POST_DATA , headers = { "Content-type": "application/json" })\n' +
-        '';
+    // var code = '' +
+    //     '_SEND_HTTP_POST_DATA = \'' + data + '\'\n' +
+    //     '_SEND_HTTP_REQUEST = requests.post(_SEND_HTTP_POST_ENDPOINT, data = _SEND_HTTP_POST_DATA , headers = { "Content-type": "application/json" })\n' +
+    //     '';
+    var code = `_SEND_HTTP_POST_DATA = ${data}
+_SEND_HTTP_REQUEST = requests.post(_SEND_HTTP_POST_ENDPOINT, json = _SEND_HTTP_POST_DATA , headers = { "Content-type": "application/json" })
+`
     return code;
 };
 
@@ -7034,3 +7029,4 @@ Blockly.Python['turtle_clear'] = function (block) {
     var code = 'turtle.clear()\n';
     return code;
 };
+

+ 144 - 218
src/renderer/cocoblockly-x/blockly/blocks/python/extension_module.js

@@ -1,29 +1,84 @@
 // Serial
 
 
+
+Blockly.Blocks['serial_write_data_create_with_container'] = {
+    init: function () {
+        this.setColour("#22b845");
+        this.appendDummyInput()
+            .appendField(Blockly.Msg.serialcomm_write_item);
+        this.appendStatementInput('STACK');
+        this.setTooltip('');
+        this.contextMenu = false;
+    }
+};
+
+Blockly.Blocks['serial_write_data_create_with_item'] = {
+    init: function () {
+        this.setColour("#22b845");
+        this.appendDummyInput()
+            .appendField(Blockly.Msg.serialcomm_write_data);
+        this.setPreviousStatement(true);
+        this.setNextStatement(true);
+        this.setTooltip('');
+        this.contextMenu = false;
+    }
+};
+
 Blockly.Blocks['serial_write_data'] = {
     init: function () {
-        let types = getLocalStorage("type")
         this.appendDummyInput()
             .appendField(new Blockly.FieldImage("blockly/media/uart_serial_send_header.png", 110, 35, { alt: "*", flipRtl: "FALSE" }));
-        // types == 1 ? this.appendDummyInput()
-        //     .appendField(Blockly.Msg.serialcomm_write_on)
-        //     .appendField(new Blockly.FieldDropdown([
-        //         [Blockly.Msg.serialcomm_write_on_ai, "ai"],
-        //         [Blockly.Msg.serialcomm_write_on_iot, "iot"]
-        //     ]), "type") :
-        //     this.appendDummyInput()
-        //         .appendField(Blockly.Msg.serialcomm_write_on)
-        //         .appendField(new Blockly.FieldDropdown([
-        //             [Blockly.Msg.serialcomm_write_on_iot, "iot"],
-        //             [Blockly.Msg.serialcomm_write_on_ai, "ai"]
-        //         ]), "type");
         this.appendDummyInput()
             .appendField(Blockly.Msg.serialcomm_write_title_text);
         this.appendDummyInput()
             .appendField(Blockly.Msg.serialcomm_write_data_bps_title)
             .appendField(new Blockly.FieldNumber(115200, 0, 500000, 1), "uart_bps")
             .appendField(Blockly.Msg.serialcomm_write_data_bps_attrib);
+        this.appendValueInput("ADD1")
+            .setCheck(null)
+        // .appendField("Field 0");
+        this.itemCount_ = 1;
+        this.setColour("#22b845");
+        this.setPreviousStatement(true, null);
+        this.setNextStatement(true, null);
+        var thisBlock = this;
+        this.setTooltip(function () {
+            var mode = thisBlock.getFieldValue('type');
+            var TOOLTIPS = {
+                'iot': Blockly.Msg.Serial_Write_Data_TOOLTIP.replace('%1', Blockly.Msg.serialcomm_write_on_iot),
+                'ai': Blockly.Msg.Serial_Write_Data_TOOLTIP.replace('%1', Blockly.Msg.serialcomm_write_on_ai)
+            };
+            return TOOLTIPS[mode];
+        });
+        this.setHelpUrl("");
+    },
+};
+Blockly.Python['serial_write_data'] = function (block) {
+    // var api = block.getFieldValue('t_api');
+    var number_uart_bps = block.getFieldValue('uart_bps');
+    var ai_uart_data = Blockly.Python.valueToCode(this, "ADD1", Blockly.Python.ORDER_NONE);
+    Blockly.Python.definitions_['v831_import_serial'] = `import serial
+SERIAL = serial.Serial("/dev/ttyS1",${number_uart_bps})
+    `
+
+    var code = `uart_data = bytes(str(${ai_uart_data})+"\\n","utf-8")
+SERIAL.write(uart_data)
+`
+    return code;
+};
+
+Blockly.Blocks['serial_write_data_coco'] = {
+    init: function () {
+        this.appendDummyInput()
+            .appendField(new Blockly.FieldImage("blockly/media/cocorobo.png", 65, 65, { alt: "*", flipRtl: "FALSE" }));
+        // this.appendDummyInput()
+        //     .appendField(Blockly.Msg.serialcomm_write_title_text_coco);
+        this.appendDummyInput()
+            .appendField(Blockly.Msg.serialcomm_write_data_bps_title)
+            .appendField(new Blockly.FieldNumber(115200, 0, 500000, 1), "uart_bps");
+        this.appendDummyInput()
+            .appendField(Blockly.Msg.serial_send_data_on_send_data_cocorobo);
         /*this.appendValueInput("first_input")
             .setCheck(null)
             .appendField("Field 0");*/
@@ -116,30 +171,7 @@ Blockly.Blocks['serial_write_data'] = {
     },
 };
 
-Blockly.Blocks['serial_write_data_create_with_container'] = {
-    init: function () {
-        this.setColour("#22b845");
-        this.appendDummyInput()
-            .appendField(Blockly.Msg.serialcomm_write_item);
-        this.appendStatementInput('STACK');
-        this.setTooltip('');
-        this.contextMenu = false;
-    }
-};
-
-Blockly.Blocks['serial_write_data_create_with_item'] = {
-    init: function () {
-        this.setColour("#22b845");
-        this.appendDummyInput()
-            .appendField(Blockly.Msg.serialcomm_write_data);
-        this.setPreviousStatement(true);
-        this.setNextStatement(true);
-        this.setTooltip('');
-        this.contextMenu = false;
-    }
-};
-
-Blockly.Python['serial_write_data'] = function (block) {
+Blockly.Python['serial_write_data_coco'] = function (block) {
     // var api = block.getFieldValue('t_api');
     var number_uart_bps = block.getFieldValue('uart_bps');
     var item_value = '';
@@ -153,7 +185,7 @@ Blockly.Python['serial_write_data'] = function (block) {
 SERIAL = serial.Serial("/dev/ttyS1",${number_uart_bps})
     `
 
-    var code = `uart_data = bytes(${ai_uart_data_final.slice(0, -8)}+"\\n","utf-8")
+    var code = `uart_data = bytes("SOF|"+${ai_uart_data_final.slice(0, -8)}+"|\\r\\n","utf-8")
 SERIAL.write(uart_data)
 `
     return code;
@@ -192,17 +224,17 @@ Blockly.Python['serial_read_data_setup'] = function (block) {
     Blockly.Python.definitions_['v831_import_serial'] = `import serial
 SERIAL = serial.Serial("/dev/ttyS1",${number_uart_bps})
 `;
-//     Blockly.Python.definitions_['_read_serial_data']= `def _read_serial_data(read_data,split, index):
-//     if read_data != None:
-//         read_str = ""
-//         try:
-//             read_str = str(read_data.decode("utf-8")).split(split)[index]
-//         except:
-//             read_str = str(read_data).split(split)[index]
-//         return read_str
-// `
+    Blockly.Python.definitions_['_read_serial_data'] = `def _read_serial_data(read_data,split, index):
+    if read_data != None:
+        read_str = ""
+        try:
+            read_str = str(read_data.decode("utf-8")).split(split)[index]
+        except:
+            read_str = str(read_data).split(split)[index]
+        return read_str
+`
     var code = "";
-    
+
     return code;
 
 };
@@ -211,9 +243,9 @@ Blockly.Blocks['serial_read_data_all'] = {
     init: function () {
         this.appendDummyInput()
             .appendField(Blockly.Msg.Serial_Read_Data_all)
-            // .appendField(new Blockly.FieldDropdown([
-            //     ["serial_data", "serial_data"]
-            // ]), "TYPE");
+        // .appendField(new Blockly.FieldDropdown([
+        //     ["serial_data", "serial_data"]
+        // ]), "TYPE");
         this.setOutput(true, null);
         this.setColour("#22b845");
         this.setTooltip(Blockly.Msg.Serial_Read_Data_all);
@@ -223,17 +255,13 @@ Blockly.Blocks['serial_read_data_all'] = {
 
 Blockly.Python['serial_read_data_all'] = function (block) {
     var type = block.getFieldValue("TYPE")
-    var code = `SERIAL.readline().decode('UTF-8','ignore')`;
+    var code = `SERIAL.readline().decode("UTF-8","ignore").strip()`;
     return [code, Blockly.Python.ORDER_NONE];
 };
 
 Blockly.Blocks['serial_read_data'] = {
     init: function () {
         this.appendDummyInput()
-            .appendField(Blockly.Msg.serial_read_data)
-            .appendField(new Blockly.FieldDropdown([
-                ["serial_data", "serial_data"]
-            ]), "TYPE_1")
             .appendField(Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_GET_TEXT)
             .appendField(new Blockly.FieldDropdown([
                 ["0", "0"],
@@ -250,11 +278,11 @@ Blockly.Blocks['serial_read_data'] = {
                 ["11", "11"],
             ]), "INDEX")
             .appendField(Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_TYPE_TEXT)
-            // .appendField(new Blockly.FieldDropdown([
-            //     [Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_TYPE_STRING, "0"],
-            //     [Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_TYPE_INTEGER, "1"],
-            //     [Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_TYPE_FLOAT, "2"],
-            // ]), "TYPE");
+        // .appendField(new Blockly.FieldDropdown([
+        //     [Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_TYPE_STRING, "0"],
+        //     [Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_TYPE_INTEGER, "1"],
+        //     [Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_TYPE_FLOAT, "2"],
+        // ]), "TYPE");
         this.setOutput(true, null);
         this.setColour("#22b845");
         this.setTooltip(Blockly.Msg.Serial_Read_Data_TOOLTIP);
@@ -265,9 +293,18 @@ Blockly.Blocks['serial_read_data'] = {
 Blockly.Python['serial_read_data'] = function (block) {
     var index = parseInt(block.getFieldValue("INDEX")) + 1;
     // var type = block.getFieldValue("TYPE")
-    var type_1 = block.getFieldValue("TYPE_1")
-    var code = `_read_serial_data(${type_1},"|",${index})`;
-    
+    // var type_1 = block.getFieldValue("TYPE_1")
+    Blockly.Python.definitions_['_read_serial_data'] = `def _read_serial_data(read_data,split, index):
+    if read_data != None:
+        read_str = ""
+        try:
+            read_str = str(read_data.decode("utf-8")).split(split)[index]
+        except:
+            read_str = str(read_data).split(split)[index]
+        return read_str
+`
+    var code = `_read_serial_data(SERIAL.readline().decode("UTF-8","ignore").strip(),"|",${index})`;
+
     return [code, Blockly.Python.ORDER_NONE];
 }
 
@@ -280,14 +317,13 @@ Blockly.Blocks['serial_send_data_to_microbit'] = {
             .appendField("115200")
             .appendField(Blockly.Msg.serialcomm_write_data_bps_attrib);
         this.appendValueInput("NAME")
-                // .appendField(Blockly.Msg.serial_send_data_on)
-                .appendField(Blockly.Msg.serial_send_data_on_send_data);
+            // .appendField(Blockly.Msg.serial_send_data_on)
+            .appendField(Blockly.Msg.serial_send_data_on_send_data);
         this.setInputsInline(false);
         this.setColour("#22b845");
         this.setPreviousStatement(true, null);
         this.setNextStatement(true, null);
         this.setHelpUrl("");
-        var thisBlock = this;
         this.setTooltip(Blockly.Msg.serial_send_data_on_send_data);
     }
 };
@@ -295,7 +331,7 @@ Blockly.Blocks['serial_send_data_to_microbit'] = {
 Blockly.Python['serial_send_data_to_microbit'] = function (block) {
     var value_name = Blockly.Python.valueToCode(block, 'NAME', Blockly.Python.ORDER_ATOMIC) || "";
     // TODO: Assemble Python into code variable.
-    
+
     Blockly.Python.definitions_["831_import_serial"] = `import serial
 SERIAL = serial.Serial("/dev/ttyS1",115200)`
     var code = `uart_data = bytes(${value_name}+"\\n","utf-8")
@@ -360,7 +396,7 @@ Blockly.Python['extension_servo_setup_on_ai'] = function (block) {
     Blockly.Python.definitions_['v831_import_time'] = `import time`
     Blockly.Python.definitions_['v831_import_sys'] = `import sys
 sys.path.append("/root/")`
-    Blockly.Python.definitions_['v831_import_CocoPi_stm8s']  = `from CocoPi import multiFuncGpio`;
+    Blockly.Python.definitions_['v831_import_CocoPi_multiFuncGpio'] = `from CocoPi import multiFuncGpio`;
     Blockly.Python.definitions_["v831_servo_init"] = `S1= multiFuncGpio(0,1)
 S2= multiFuncGpio(1,1)`
     var code = '\n';
@@ -598,11 +634,11 @@ Blockly.Python['ai_motor_setup'] = function (block) {
     Blockly.Python.definitions_['v831_import_time'] = `import time`
     Blockly.Python.definitions_['v831_import_sys'] = `import sys
 sys.path.append("/root/")`
-    Blockly.Python.definitions_['v831_import_CocoPi_stm8s_init']  = `from CocoPi import stm8s
+    Blockly.Python.definitions_['v831_import_CocoPi_stm8s_init'] = `from CocoPi import stm8s
 iic_slaver=stm8s()
 iic_slaver.clear()
 del iic_slaver`;
-    Blockly.Python.definitions_['v831_import_CocoPi_stm8s']  = `from CocoPi import dcMotor`;
+    Blockly.Python.definitions_['v831_import_CocoPi_stm8s'] = `from CocoPi import dcMotor`;
     Blockly.Python.definitions_["v831_motor_init"] = `M1=dcMotor(1)
 M2=dcMotor(2)`
 
@@ -643,12 +679,14 @@ Blockly.Python['ai_motor_run'] = function (block) {
     var value_speed = Blockly.Python.valueToCode(block, 'speed', Blockly.Python.ORDER_ATOMIC);
     var dropdown_direction = block.getFieldValue('direction');
     var code = ''
-    if(dropdown_direction == 'pos'){
+    let xml = Blockly.Xml.workspaceToDom(blockpy.components.editor.blockly)
+    console.log(Blockly.Xml.domToText(xml))
+
+    if (dropdown_direction == 'pos') {
         code = `${dropdown_motor_type}.dcMotorCtrl(1,${value_speed})
 `
     }
-    else
-    {
+    else {
         code = `${dropdown_motor_type}.dcMotorCtrl(0,${value_speed})
 `
     }
@@ -1570,76 +1608,42 @@ var ESP32_LED_STRIP_COLOR = AILEDCOLOR;
 
 Blockly.Blocks['esp32_main_controller_led_strip_setup'] = {
     init: function () {
-        let types = getLocalStorage("type")
         this.appendDummyInput()
             .appendField(new Blockly.FieldImage("blockly/media/led_strip_setup.png", 45, 45, { alt: "*", flipRtl: "FALSE" }));
         this.appendDummyInput()
-                .appendField(Blockly.Msg.ledstrip_setup_text)
-                .appendField(new Blockly.FieldVariable("STRIP"), "varitem")
-                .appendField(Blockly.Msg.ledstrip_setup);
-        this.appendValueInput("io")
-            .setCheck(null)
-            .appendField(Blockly.Msg.ledstrip_set_gpio);
+            .appendField(Blockly.Msg.ledstrip_setup_text)
+            .appendField(new Blockly.FieldVariable("STRIP"), "varitem")
+            .appendField(Blockly.Msg.ledstrip_setup);
+        this.appendDummyInput()
+            .appendField(Blockly.Msg.ledstrip_set_gpio)
+            .appendField(new Blockly.FieldDropdown([
+                ["S1", "1"],
+                ["S2", "2"]
+            ]), "value_io");
         this.appendValueInput("count")
             .setCheck(null)
             .appendField(Blockly.Msg.ledstrip_set_total_led);
-        this.appendValueInput("brightness")
-            .setCheck(null)
-            .appendField(Blockly.Msg.ledstrip_set_brightness_setup);
         this.setInputsInline(false);
         this.setPreviousStatement(true, null);
         this.setNextStatement(true, null);
         this.setColour(ESP32_LED_STRIP_COLOR);
         this.setHelpUrl("");
-        var thisBlock = this;
-        this.setTooltip(function () {
-            var mode = thisBlock.getFieldValue('type');
-            var TOOLTIPS = {
-                'ai': Blockly.Msg.Esp32_Main_Controller_Led_Strip_Setup_TOOLTIP.replace('%1', Blockly.Msg.ledstrip_setup_text_ai),
-                'iot': Blockly.Msg.Esp32_Main_Controller_Led_Strip_Setup_TOOLTIP.replace('%1', Blockly.Msg.ledstrip_setup_text_iot)
-            };
-            return TOOLTIPS[mode];
-        });
+        this.setTooltip();
     }
 };
 
 Blockly.Python['esp32_main_controller_led_strip_setup'] = function (block) {
-    var dropdown_type = block.getFieldValue('type');
     var variable_name = Blockly.Python.variableDB_.getName(block.getFieldValue('varitem'), Blockly.Variables.NAME_TYPE);
-    var value_io = Blockly.Python.valueToCode(block, 'io', Blockly.Python.ORDER_ATOMIC);
+    var value_io = block.getFieldValue('value_io');
     var value_count = Blockly.Python.valueToCode(block, 'count', Blockly.Python.ORDER_ATOMIC);
-    var value_brightness = Blockly.Python.valueToCode(block, 'brightness', Blockly.Python.ORDER_ATOMIC);
-
-    Blockly.Python.definitions_['esp32_main_controller_led_strip_setup_def'] = '' +
-        '_ai_brightness = ' + value_brightness + '\n' +
-        '\n' +
-        'def rgba_to_rgb_conversion(red, green, blue):\n' +
-        '    if _ai_brightness <= 255:\n' +
-        '        alpha = _ai_brightness / 255\n' +
-        '    elif _ai_brightness > 255:\n' +
-        '        alpha = 255 / 255\n' +
-        '    elif _ai_brightness < 0:\n' +
-        '        alpha = 0 / 255\n' +
-        '    final_red = int((1 - alpha) * 0 + alpha * red)\n' +
-        '    final_green = int((1 - alpha) * 0 + alpha * green)\n' +
-        '    final_blue = int((1 - alpha) * 0 + alpha * blue)\n' +
-        '    final = (final_red, final_green, final_blue)\n' +
-        '    return final\n' +
-        '';
 
-    if (dropdown_type == "iot") {
-        Blockly.Python.definitions_['led_strip_definition'] = 'import machine, neopixel\n';
-        Blockly.Python.addVariable(variable_name, variable_name + ' = neopixel.NeoPixel(machine.Pin(' + value_io + '), ' + value_count + ')', true);
+    Blockly.Python.definitions_['v831_import_time'] = `import time`;
 
-        var code = '\n';
-    } else if (dropdown_type == "ai") {
-        Blockly.Python.definitions_['led_strip_definition'] = 'from modules import ws2812\n';
-        Blockly.Python.addVariable(variable_name, '' +
-            variable_name + ' = ws2812(' + value_io + ',' + value_count + ')\n' +
-            '\n', true);
-
-        var code = '\n';
-    }
+    Blockly.Python.definitions_['v831_import_sys'] = `import sys
+sys.path.append("/root/")`
+    Blockly.Python.definitions_['v831_import_CocoPi_multiFuncGpio'] = `from CocoPi import multiFuncGpio`;
+    Blockly.Python.addVariable(variable_name, `${variable_name} = multiFuncGpio(${value_io - 1},7)`, true);
+    var code = ""
     return code;
 };
 
@@ -1668,90 +1672,37 @@ Blockly.Python['esp32_main_controller_led_strip_set_bright'] = function (block)
 
 Blockly.Blocks['esp32_main_controller_led_strip_set'] = {
     init: function () {
-        let types = getLocalStorage("type")
-        types == 1 ? this.appendDummyInput()
-            .appendField(new Blockly.FieldDropdown([
-                [Blockly.Msg.ledstrip_setup_text_ai, "ai"],
-                [Blockly.Msg.ledstrip_setup_text_iot, "iot"]
-            ]), "type")
+        this.appendDummyInput()
             .appendField(Blockly.Msg.ledstrip_set_light_up)
-            .appendField(new Blockly.FieldVariable("STRIP"), "varitem") :
-            this.appendDummyInput()
-                .appendField(new Blockly.FieldDropdown([
-                    [Blockly.Msg.ledstrip_setup_text_iot, "iot"],
-                    [Blockly.Msg.ledstrip_setup_text_ai, "ai"]
-                ]), "type")
-                .appendField(Blockly.Msg.ledstrip_set_light_up)
-                .appendField(new Blockly.FieldVariable("STRIP"), "varitem");
+            .appendField(new Blockly.FieldVariable("STRIP"), "varitem");
         this.appendValueInput("location")
             .setCheck(null)
             .appendField(Blockly.Msg.ledstrip_set_no);
         this.appendValueInput("color")
             .setCheck(null)
             .appendField(Blockly.Msg.ledstrip_set_color);
+        this.appendValueInput("brightness")
+            .setCheck(null)
+            .appendField(Blockly.Msg.ledstrip_set_brightness_setup);
         this.setInputsInline(false);
         this.setPreviousStatement(true, null);
         this.setNextStatement(true, null);
         this.setColour(ESP32_LED_STRIP_COLOR);
         this.setHelpUrl("");
-        var thisBlock = this;
-        this.setTooltip(function () {
-            var mode = thisBlock.getFieldValue('type');
-            var TOOLTIPS = {
-                'iot': Blockly.Msg.Esp32_Main_Controller_Led_Strip_Set_TOOLTIP.replace('%1', Blockly.Msg.ledstrip_setup_text_iot),
-                'ai': Blockly.Msg.Esp32_Main_Controller_Led_Strip_Set_TOOLTIP.replace('%1', Blockly.Msg.ledstrip_setup_text_ai)
-            };
-            return TOOLTIPS[mode];
-        });
+        this.setTooltip(Blockly.Msg.Esp32_Main_Controller_Led_Strip_Set_TOOLTIP.replace('%1', "CocoPi"));
     }
 };
 
 Blockly.Python['esp32_main_controller_led_strip_set'] = function (block) {
-    var dropdown_type = block.getFieldValue('type');
     var variable_name = Blockly.Python.variableDB_.getName(block.getFieldValue('varitem'), Blockly.Variables.NAME_TYPE);
     var value_location = Blockly.Python.valueToCode(block, 'location', Blockly.Python.ORDER_ATOMIC);
     var value_color = Blockly.Python.valueToCode(block, 'color', Blockly.Python.ORDER_ATOMIC);
+    var value_brightness = Blockly.Python.valueToCode(block, 'brightness', Blockly.Python.ORDER_ATOMIC);
     // TODO: Assemble Python into code variable.
 
-    if (dropdown_type == "iot") {
-        if (value_color.charAt(0) != '#') {
-            var code = '' +
-                variable_name + '[' + value_location + '-1] = rgba_to_rgb_conversion' + value_color + '\n';
-        } else if (value_color.charAt(0) == '#') {
-            var d = 0,
-                e = 0,
-                f = 0;
-            try {
-                7 == color.length && (d = parseInt(color.substring(1, 3), 16),
-                    e = parseInt(color.substring(3, 5), 16),
-                    f = parseInt(color.substring(5, 7), 16))
-            } catch (g) { }
-
-            var code = '' +
-                variable_name + '[' + value_location + '-1] = rgba_to_rgb_conversion(' + d + ',' + e + ',' + f + ')\n';
-        }
-    } else if (dropdown_type == "ai") {
-        if (value_color.charAt(0) != '#') {
-            var code = '' +
-                '_a = ' + variable_name + '.set_led(' + value_location + '-1, rgba_to_rgb_conversion' + value_color + ')\n';
-        } else if (value_color.charAt(0) == '#') {
-            var d = 0,
-                e = 0,
-                f = 0;
-            try {
-                7 == color.length && (d = parseInt(color.substring(1, 3), 16),
-                    e = parseInt(color.substring(3, 5), 16),
-                    f = parseInt(color.substring(5, 7), 16))
-            } catch (g) { }
-
-            var code = '' +
-                '_a = ' + variable_name + '.set_led(' + value_location + '-1,rgba_to_rgb_conversion(' + d + ',' + e + ',' + f + '))\n';
-
-
-        }
-
-    }
-
+    var code = `${variable_name}.setBrightness(${value_brightness})
+${variable_name}.setPixelColor(${value_location}-1 ,${value_color.slice(1, value_color.length - 1)})
+`
 
     return code;
 };
@@ -1759,49 +1710,24 @@ Blockly.Python['esp32_main_controller_led_strip_set'] = function (block) {
 
 Blockly.Blocks['led_strip_show_above'] = {
     init: function () {
-        let types = getLocalStorage("type")
-        types == 1 ? this.appendDummyInput()
-            .appendField(new Blockly.FieldDropdown([
-                [Blockly.Msg.ledstrip_setup_text_ai, "ai"],
-                [Blockly.Msg.ledstrip_setup_text_iot, "iot"]
-            ]), "type")
+        this.appendDummyInput()
             .appendField(Blockly.Msg.ledstrip_setup_text_show_above_set)
             .appendField(new Blockly.FieldVariable("STRIP"), "varitem")
-            .appendField(Blockly.Msg.ledstrip_setup_text_show_above) :
-            this.appendDummyInput()
-                .appendField(new Blockly.FieldDropdown([
-                    [Blockly.Msg.ledstrip_setup_text_iot, "iot"],
-                    [Blockly.Msg.ledstrip_setup_text_ai, "ai"]
-                ]), "type")
-                .appendField(Blockly.Msg.ledstrip_setup_text_show_above_set)
-                .appendField(new Blockly.FieldVariable("STRIP"), "varitem")
-                .appendField(Blockly.Msg.ledstrip_setup_text_show_above);
+            .appendField(Blockly.Msg.ledstrip_setup_text_show_above);
         this.setInputsInline(false);
         this.setPreviousStatement(true, null);
         this.setNextStatement(true, null);
         this.setColour(AILEDCOLOR);
         this.setHelpUrl("");
-        var thisBlock = this;
-        this.setTooltip(function () {
-            var mode = thisBlock.getFieldValue('type');
-            var TOOLTIPS = {
-                'iot': Blockly.Msg.Led_Strip_Show_Above_TOOLTIP.replace('%1', Blockly.Msg.ledstrip_setup_text_iot),
-                'ai': Blockly.Msg.Led_Strip_Show_Above_TOOLTIP.replace('%1', Blockly.Msg.ledstrip_setup_text_ai)
-            };
-            return TOOLTIPS[mode];
-        });
+        this.setTooltip(Blockly.Msg.Led_Strip_Show_Above_TOOLTIP.replace('%1', "CocoPi"));
     }
 };
 
 Blockly.Python['led_strip_show_above'] = function (block) {
-    var dropdown_type = block.getFieldValue('type');
     var variable_name = Blockly.Python.variableDB_.getName(block.getFieldValue('varitem'), Blockly.Variables.NAME_TYPE);
     // TODO: Assemble Python into code variable.
-    if (dropdown_type == "ai") {
-        var code = variable_name + '.display()\n';
-    } else if (dropdown_type == "iot") {
-        var code = variable_name + '.write()\n';
-    }
+    var code = `${variable_name}.pixelShow()
+`
     return code;
 };
 

+ 1 - 1
src/renderer/cocoblockly-x/blockly/generators/arduino/screen.js

@@ -137,7 +137,7 @@ Blockly.Python['lcd_set_colorRGB'] = function (block) {
  *   convert position from origin(x,y) to (x,128-y)
  */
 function posConvert(x, y) {
-    var reg = /^?[0-9]\d*$/;
+    // var reg = /^?[0-9]\d*$/;
     // if (reg.test(y)) y = 128 - parseInt(y, 10) 
     // else y = "128 - " + y;
     return x + ", 128 - " + y;

+ 1 - 0
src/renderer/cocoblockly-x/blockly/generators/python.js

@@ -464,6 +464,7 @@ Blockly.Python.finish = function (code) {
   return allDefs.replace(/\n\n+/g, '\n\n') + setup.replace(/\n\n+/g, '\n\n') + loop.replace(/\n\n+/g, '\n\n');
 };
 
+
 /**
  * Adds a string of "include" code to be added to the sketch.
  * Once a include is added it will not get overwritten with new code.

+ 2 - 2
src/renderer/cocoblockly-x/blockly/generators/python/screen.js

@@ -222,8 +222,8 @@ Blockly.Python['lcd_set_colorRGB'] = function (block) {
 /** add on 14:25-09/01/2019 by QR
  *   convert position from origin(x,y) to (x,128-y)
  */
-window.posConvert = function(x, y) {
-    var reg = /^?[0-9]\d*$/;
+function posConvert(x, y) {
+    // var reg = /^?[0-9]\d*$/;
     // if (reg.test(y)) y = 128 - parseInt(y, 10) 
     // else y = "128 - " + y;
     return x + ", 128 - " + y;

BIN
src/renderer/cocoblockly-x/blockly/media/cocorobo.png


+ 153 - 130
src/renderer/cocoblockly-x/blockly/msg/js/en.js

@@ -35,15 +35,15 @@ Blockly.Msg.ARD_PULSEON = "Pulse on pin #";
 Blockly.Msg.ARD_PULSEREAD = "Read";
 Blockly.Msg.ARD_PULSETIMEOUT = "Timeout after";
 Blockly.Msg.ARD_PULSETIMEOUT_MS = "";
-Blockly.Msg.ARD_PULSETIMEOUT_TIP = "Measures the duration of a pulse on the selected pin, if it is within the timeout.";
+Blockly.Msg.ARD_PULSETIMEOUT_TIP = "Measure the duration of the selected interface pulse and check if it falls within the timeout period.";
 Blockly.Msg.ARD_PULSE_TIP = "Measures the duration of a pulse on the selected pin.";
 Blockly.Msg.ARD_PWMWRITE = "Set pwm pin#";
 Blockly.Msg.ARD_SERIAL_AVAILABLE = "Avalible";
 Blockly.Msg.ARD_SERIAL_BPS = "Bps";
 Blockly.Msg.ARD_SERIAL_PRINT = "Print";
 Blockly.Msg.ARD_SERIAL_PRINT_NEWLINE = "Add new line";
-Blockly.Msg.ARD_SERIAL_PRINT_TIP = "Prints data to the console/serial port as human-readable ASCII text.";
-Blockly.Msg.ARD_SERIAL_PRINT_WARN = "A setup block for serial must be added to the workspace to use this block!";
+Blockly.Msg.ARD_SERIAL_PRINT_TIP = "Print the data in readable ASCII text format to the console or serial port.";
+Blockly.Msg.ARD_SERIAL_PRINT_WARN = "Serial-related initialization blocks need to be added.";
 Blockly.Msg.ARD_SERIAL_READ = "Read";
 Blockly.Msg.ARD_SERIAL_SETUP = "Setup";
 Blockly.Msg.ARD_SERIAL_SETUP_TIP = "Selects the speed for a specific Serial peripheral";
@@ -82,7 +82,7 @@ Blockly.Msg.ARD_STEPPER_PIN1 = "Pin1#";
 Blockly.Msg.ARD_STEPPER_PIN2 = "Pin2#";
 Blockly.Msg.ARD_STEPPER_REVOLVS = "How many steps per revolution";
 Blockly.Msg.ARD_STEPPER_SETUP = "Setup stepper motor";
-Blockly.Msg.ARD_STEPPER_SETUP_TIP = "Configures a stepper motor pinout and other settings.";
+Blockly.Msg.ARD_STEPPER_SETUP_TIP = "Configuring stepper motor interface alignment and other settings.";
 Blockly.Msg.ARD_STEPPER_SPEED = "Set speed (rpm) to";
 Blockly.Msg.ARD_STEPPER_STEP = "Move stepper";
 Blockly.Msg.ARD_STEPPER_STEPS = "Steps";
@@ -94,9 +94,9 @@ Blockly.Msg.ARD_TIME_CHRONO_RESET = "Reset Stopwatch";
 Blockly.Msg.ARD_TIME_CHRONO_SETUP = "Stopwatch Setup";
 Blockly.Msg.ARD_TIME_DELAY = "Wait";
 Blockly.Msg.ARD_TIME_DELAY_MICROS = "Microseconds";
-Blockly.Msg.ARD_TIME_DELAY_MICRO_TIP = "Wait specific time in microseconds";
-Blockly.Msg.ARD_TIME_DELAY_TIP = "Wait specific time in milliseconds";
-Blockly.Msg.ARD_TIME_DELAY_seconds_TIP = "Wait specific time in seconds";
+Blockly.Msg.ARD_TIME_DELAY_MICRO_TIP = "Wait for a certain amount of time (in microseconds)";
+Blockly.Msg.ARD_TIME_DELAY_TIP = "Wait for a certain amount of time (in milliseconds)";
+Blockly.Msg.ARD_TIME_DELAY_seconds_TIP = "Wait for a certain amount of time (in seconds)";
 Blockly.Msg.ARD_TIME_DELAY_seconds = "Seconds";
 Blockly.Msg.ARD_TIME_DO = "Do";
 Blockly.Msg.ARD_TIME_DO_MS = "Do";
@@ -105,9 +105,9 @@ Blockly.Msg.ARD_TIME_EVERY_MS = "Every";
 Blockly.Msg.ARD_TIME_INF = "Wait forever (end program)";
 Blockly.Msg.ARD_TIME_INF_TIP = "Wait indefinitely, stopping the program.";
 Blockly.Msg.ARD_TIME_MICROS = "Current elapsed Time (microseconds)";
-Blockly.Msg.ARD_TIME_MICROS_TIP = "Returns the number of microseconds since the Arduino board began running the current program. Has to be stored in a positive long integer";
+Blockly.Msg.ARD_TIME_MICROS_TIP = "Retrieve the number of microseconds since the beginning of the program's execution on the Arduino board. It must be stored as a long integer data type.";
 Blockly.Msg.ARD_TIME_MILLIS = "Current elapsed Time (milliseconds)";
-Blockly.Msg.ARD_TIME_MILLIS_TIP = "Returns the number of milliseconds since the Arduino board began running the current program. Has to be stored in a positive long integer";
+Blockly.Msg.ARD_TIME_MILLIS_TIP = "Return the number of milliseconds since the Arduino board started executing the current program, stored as a long integer.";
 Blockly.Msg.ARD_TIME_MS = "Milliseconds";
 Blockly.Msg.ARD_TIME_SECOND = "Second(s)";
 Blockly.Msg.ARD_TIME_SECOND_MS = "Millisecond(s)";
@@ -128,7 +128,7 @@ Blockly.Msg.ARD_TYPE_UNDEF = "Undefined";
 Blockly.Msg.ARD_VAR_AS = "As";
 Blockly.Msg.ARD_VAR_AS_TIP = "Sets a value to a specific type";
 Blockly.Msg.ARD_WRITE_TO = "To";
-Blockly.Msg.AUTH = "Please authorize this app to enable your work to be saved and to allow it to be shared by you.";
+Blockly.Msg.AUTH = "Please authorize this application to save your work and share it.";
 Blockly.Msg.BASIC_AS = "As";
 Blockly.Msg.BASIC_BLACK_OUT = "Black out";
 Blockly.Msg.BASIC_BRTN = "Brightness";
@@ -160,29 +160,29 @@ Blockly.Msg.BASIC_TO = "To";
 Blockly.Msg.BASIC_TONE_TIP = "Sets tone on pin to specified frequency within range 31 - 65535";
 Blockly.Msg.BASIC_TONE_WARNING = "Frequency must be in range 31 - 65535";
 Blockly.Msg.BLUE = "Blue";
-Blockly.Msg.BLUETOOTH_INTERACTION_SET_CONTENT = "Set Serial Comm. Baud Rate:";
+Blockly.Msg.BLUETOOTH_INTERACTION_SET_CONTENT = "Set the serial port baud rate to:";
 Blockly.Msg.BLUETOOTH_INTERACTION_TITLE = "Bluetooth Module Enter AT Mode";
 Blockly.Msg.BLUETOOTH_INTERCOMMS_DATA = "Data";
 Blockly.Msg.BLUETOOTH_INTERCOMMS_RECEIVEMSG = "Receive data";
 Blockly.Msg.BLUETOOTH_INTERCOMMS_RECEIVEMSG_ISSUCCESS = "Receive data successfully";
 Blockly.Msg.BLUETOOTH_INTERCOMMS_RECEIVE_GET_LINE2 = "Get data at ";
-Blockly.Msg.BLUETOOTH_INTERCOMMS_RECEIVE_GET_LINE2_2 = "";
+Blockly.Msg.BLUETOOTH_INTERCOMMS_RECEIVE_GET_LINE2_2 = "bit data";
 Blockly.Msg.BLUETOOTH_INTERCOMMS_RECEIVE_GET_LINE3 = "As Type";
 Blockly.Msg.BLUETOOTH_INTERCOMMS_RECEIVE_GET_LINE4 = "";
 Blockly.Msg.BLUETOOTH_INTERCOMMS_RECEIVE_LINE3 = "With length of ";
 Blockly.Msg.BLUETOOTH_INTERCOMMS_SENDMSG = "Send data ";
-Blockly.Msg.BLUETOOTH_INTERCOMMS_SETUP = "Bluetooth Intercommunication";
-Blockly.Msg.BLUETOOTH_INTERCOMMS_SETUP1 = "Intercommunication";
-Blockly.Msg.BLUETOOTH_INTERCOMMS_SETUP2 = "";
+Blockly.Msg.BLUETOOTH_INTERCOMMS_SETUP = "Bluetooth to Bluetooth communication.";
+Blockly.Msg.BLUETOOTH_INTERCOMMS_SETUP1 = "For Bluetooth communication";
+Blockly.Msg.BLUETOOTH_INTERCOMMS_SETUP2 = "Initialization";
 Blockly.Msg.BLUETOOTH_LIST_RECEIVED = "From";
 Blockly.Msg.BLUETOOTH_LIST_RECEIVED1 = "Get value at index";
-Blockly.Msg.BLUETOOTH_LIST_RECEIVED2 = "";
+Blockly.Msg.BLUETOOTH_LIST_RECEIVED2 = "value of the bit.";
 Blockly.Msg.BLUETOOTH_NUMBER_RECEIVED = "Received number";
-Blockly.Msg.BLUETOOTH_PAIRING_BIND_ADDR = "Bind Slave Device Address:";
-Blockly.Msg.BLUETOOTH_PAIRING_MASTER = "Bluetooth Pairing: Set as Master Device";
+Blockly.Msg.BLUETOOTH_PAIRING_BIND_ADDR = "Assign subordinate device address:";
+Blockly.Msg.BLUETOOTH_PAIRING_MASTER = "Bluetooth pairing: Host device setup";
 Blockly.Msg.BLUETOOTH_PAIRING_SETTING_BAUDRATE = "Set Baud Rate:";
 Blockly.Msg.BLUETOOTH_PAIRING_SETTING_TIMEOUT = "Set Timeout:";
-Blockly.Msg.BLUETOOTH_PAIRING_SLAVE = "Bluetooth Pairing: Set as Slave Device";
+Blockly.Msg.BLUETOOTH_PAIRING_SLAVE = "Bluetooth pairing: Slave device configuration";
 Blockly.Msg.BLUETOOTH_SETUP = "When Bluetooth received";
 Blockly.Msg.BLUETOOTH_SETUP_DATA_SET = "Set";
 Blockly.Msg.BLUETOOTH_SETUP_DO = "And Do";
@@ -199,13 +199,13 @@ Blockly.Msg.BLYNK_CREATE_WITH_CONTAINER_TITLE_ADD = "Data";
 Blockly.Msg.BLYNK_CREATE_WITH_ITEM_TITLE = "Item";
 Blockly.Msg.BLYNK_DATA = "Data";
 Blockly.Msg.BLYNK_GET_DATANAME = "Get data from";
-Blockly.Msg.BLYNK_GET_DATANAME1 = "";
-Blockly.Msg.BLYNK_GET_DATANAME2 = "";
+Blockly.Msg.BLYNK_GET_DATANAME1 = "Obtain";
+Blockly.Msg.BLYNK_GET_DATANAME2 = "Data";
 Blockly.Msg.BLYNK_GET_INDEX = "At index";
-Blockly.Msg.BLYNK_GET_INDEX1 = "";
-Blockly.Msg.BLYNK_GET_OF = "";
-Blockly.Msg.BLYNK_GET_OF1 = "Of";
-Blockly.Msg.BLYNK_GET_OF2 = "";
+Blockly.Msg.BLYNK_GET_INDEX1 = "value of the bit";
+Blockly.Msg.BLYNK_GET_OF = "Obtain Data";
+Blockly.Msg.BLYNK_GET_OF1 = "Obtain";
+Blockly.Msg.BLYNK_GET_OF2 = "Data";
 Blockly.Msg.BLYNK_GPS_ALTITUDE = "Altitude";
 Blockly.Msg.BLYNK_GPS_LATITUDE = "Latitude";
 Blockly.Msg.BLYNK_GPS_LONGITUDE = "Longitude";
@@ -213,7 +213,7 @@ Blockly.Msg.BLYNK_GPS_SPEED = "Speed";
 Blockly.Msg.BLYNK_LOG = "BLYNK_LOG";
 Blockly.Msg.BLYNK_PW = "WiFi PW: ";
 Blockly.Msg.BLYNK_READ = "When Blynk request data via";
-Blockly.Msg.BLYNK_READ1 = "";
+Blockly.Msg.BLYNK_READ1 = "Data";
 Blockly.Msg.BLYNK_SELECT = "Select";
 Blockly.Msg.BLYNK_SETUP = "BLYNK SETUP";
 Blockly.Msg.BLYNK_SSID = "WiFi SSID: ";
@@ -224,20 +224,20 @@ Blockly.Msg.BLYNK_VIRTUALWRITE = "Send data to Blynk via";
 Blockly.Msg.BLYNK_VIRTUALWRITE_DATA = "Data:";
 Blockly.Msg.BLYNK_WIFI = "Connect to Network";
 Blockly.Msg.BLYNK_WRITE = "Get data from";
-Blockly.Msg.BLYNK_WRITE1 = "";
+Blockly.Msg.BLYNK_WRITE1 = "obtain data";
 Blockly.Msg.BLYNK_WRITE_VARIABLE = "Store into";
 Blockly.Msg.BLYNK_WRITE_VARLENGTH = "Length";
 Blockly.Msg.CHANGE_VALUE_TITLE = "Change value:";
-Blockly.Msg.CHAT = "Chat with your collaborator by typing in this box!";
+Blockly.Msg.CHAT = "Communicate with your collaborator by entering text in this box!";
 Blockly.Msg.CLEAN_UP = "Clean up Blocks";
 Blockly.Msg.CLOUDDATA_CREATE_WITH_CONTAINER_TITLE_ADD = "Key[]";
 Blockly.Msg.CLOUDDATA_CREATE_WITH_INPUT_WITH = "Add";
 Blockly.Msg.CLOUDDATA_CREATE_WITH_ITEM_TITLE = "Value";
 Blockly.Msg.CLOUDDATA_GENERATOR_DATA = "Generate data";
 Blockly.Msg.CLOUDDATA_PARSE_JSON = "From";
-Blockly.Msg.CLOUDDATA_PARSE_KEY = "Parse data of";
+Blockly.Msg.CLOUDDATA_PARSE_KEY = "Parse to obtain the variable named";
 Blockly.Msg.CLOUDDATA_PARSE_PRETTYPRINT_DISPLAY = "Get generated data";
-Blockly.Msg.CLOUDDATA_PARSE_SETUP_INIT = "Initial parser";
+Blockly.Msg.CLOUDDATA_PARSE_SETUP_INIT = "data parsing initialized.";
 Blockly.Msg.CLOUDDATA_PARSE_SETUP_PAYLOAD = "Parse content";
 Blockly.Msg.CLOUDDATA_PARSE_TYPE = "As";
 Blockly.Msg.CO2SENSOR_GET_CO2 = "Get CO2 Value (ppm)";
@@ -248,8 +248,8 @@ Blockly.Msg.CO2SENSOR_SETUP_SDA = "SDA Pin:";
 Blockly.Msg.COCOCLOUD_CREATE_WITH_CONTAINER_TITLE_ADD = "LIST";
 Blockly.Msg.COCOCLOUD_CREATE_WITH_ITEM_TITLE = "Event";
 Blockly.Msg.COCOCLOUD_GET = "Get Data from Event ";
-Blockly.Msg.COCOCLOUD_GET1 = "";
-Blockly.Msg.COCOCLOUD_GETPAYLOAD = "Data got from Event";
+Blockly.Msg.COCOCLOUD_GET1 = "Obtain Data";
+Blockly.Msg.COCOCLOUD_GETPAYLOAD = "Data obtained from Event";
 Blockly.Msg.COCOCLOUD_POST = "Send to Event ";
 Blockly.Msg.COCOCLOUD_POST_DATA = "Data";
 Blockly.Msg.COCOCLOUD_TIME_DAY = "Day";
@@ -276,29 +276,29 @@ Blockly.Msg.COLOUR_PICKER_HELPURL = "https://en.wikipedia.org/wiki/Color";
 Blockly.Msg.COLOUR_PICKER_TOOLTIP = "Choose a colour from the palette.";
 Blockly.Msg.COLOUR_RANDOM_HELPURL = "http://randomcolour.com";
 Blockly.Msg.COLOUR_RANDOM_TITLE = "Random colour";
-Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Choose a colour at random.";
+Blockly.Msg.COLOUR_RANDOM_TOOLTIP = "Randomly select a colour.";
 Blockly.Msg.COLOUR_RGB_BLUE = "Blue";
 Blockly.Msg.COLOUR_RGB_GREEN = "Green";
 Blockly.Msg.COLOUR_RGB_HELPURL = "http://www.december.com/html/spec/colorper.html";
 Blockly.Msg.COLOUR_RGB_RED = "Red";
 Blockly.Msg.COLOUR_RGB_TITLE = "Colour with";
-Blockly.Msg.COLOUR_RGB_TOOLTIP = "Create a colour with the specified amount of red, green, and blue. All values must be between 0 and 100.";
+Blockly.Msg.COLOUR_RGB_TOOLTIP = "Create a colour by specifying quantities of red, green, and blue. All values must be between 0 and 100.";
 Blockly.Msg.CONTROLS_FLOW_STATEMENTS_HELPURL = "https://github.com/google/blockly/wiki/Loops#loop-termination-blocks";
-Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "Break out of loop";
+Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_BREAK = "break the loop";
 Blockly.Msg.CONTROLS_FLOW_STATEMENTS_OPERATOR_CONTINUE = "Continue with next iteration of loop";
 Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_BREAK = "Break out of the containing loop.";
-Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Skip the rest of this loop, and continue with the next iteration.";
+Blockly.Msg.CONTROLS_FLOW_STATEMENTS_TOOLTIP_CONTINUE = "Skip the remaining part of this loop and continue with the next iteration.";
 Blockly.Msg.CONTROLS_FLOW_STATEMENTS_WARNING = "Warning: This block may only be used within a loop.";
 Blockly.Msg.CONTROLS_FOREACH_HELPURL = "https://github.com/google/blockly/wiki/Loops#for-each";
 Blockly.Msg.CONTROLS_FOREACH_TITLE = "For each item %1 in list %2";
 Blockly.Msg.CONTROLS_FOREACH_TOOLTIP = "For each item in a list, set the variable '%1' to the item, and then do some statements.";
 Blockly.Msg.CONTROLS_FOR_HELPURL = "https://github.com/google/blockly/wiki/Loops#count-with";
 Blockly.Msg.CONTROLS_FOR_TITLE = "Count with %1 from %2 to %3 by %4";
-Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Have the variable '%1' take on the values from the start number to the end number, counting by the specified interval, and do the specified blocks.";
+Blockly.Msg.CONTROLS_FOR_TOOLTIP = "Retrieve the value of variable '%1' from the starting number to the ending number, and execute the specified block at the specified time interval.";
 Blockly.Msg.CONTROLS_IF_ELSEIF_TOOLTIP = "Add a condition to the if block.";
-Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final, catch-all condition to the if block.";
+Blockly.Msg.CONTROLS_IF_ELSE_TOOLTIP = "Add a final 'case' to the 'if' block that covers all scenarios.";
 Blockly.Msg.CONTROLS_IF_HELPURL = "https://github.com/google/blockly/wiki/IfElse";
-Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Add, remove, or reorder sections to reconfigure this if block.";
+Blockly.Msg.CONTROLS_IF_IF_TOOLTIP = "Add, remove, or rearrange sections to reconfigure the 'if' block.";
 Blockly.Msg.CONTROLS_IF_MSG_ELSE = "Else";
 Blockly.Msg.CONTROLS_IF_MSG_ELSEIF = "Else if";
 Blockly.Msg.CONTROLS_IF_MSG_IF = "If";
@@ -395,7 +395,7 @@ Blockly.Msg.JSONTOOL_PARSE_ARRAY = "(JSON Array)";
 Blockly.Msg.JSONTOOL_PARSE_BY = "Get item of ";
 Blockly.Msg.JSONTOOL_PARSE_EACH = "From JSON Object ";
 Blockly.Msg.JSONTOOL_PARSE_INDEX = "Index of";
-Blockly.Msg.JSONTOOL_PARSE_ISSUCCESS = "Parsed Successfully";
+Blockly.Msg.JSONTOOL_PARSE_ISSUCCESS = "Did the parsing succeed?";
 Blockly.Msg.JSONTOOL_PARSE_ISSUCCESS_NAME = "Is JSON Object";
 Blockly.Msg.JSONTOOL_PARSE_JSONOBJECT = "Object";
 Blockly.Msg.JSONTOOL_PARSE_KEY = "(JSON Object) Key";
@@ -416,7 +416,7 @@ Blockly.Msg.LED_COLOR = "Color";
 
 Blockly.Msg.LED_DRAW = "Draw ";
 Blockly.Msg.LED_FONT = "Font";
-Blockly.Msg.LCD_FONT = "Font";
+Blockly.Msg.LCD_FONT = "Font: ";
 Blockly.Msg.SUPER_LARGE = "Super Large";
 Blockly.Msg.LARGE = "Large";
 Blockly.Msg.MIDDLE = "Medium";
@@ -472,7 +472,7 @@ Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "Get and remove";
 Blockly.Msg.LISTS_GET_INDEX_LAST = "Last";
 Blockly.Msg.LISTS_GET_INDEX_RANDOM = "Random";
 Blockly.Msg.LISTS_GET_INDEX_REMOVE = "Remove";
-Blockly.Msg.LISTS_GET_INDEX_TAIL = "";
+Blockly.Msg.LISTS_GET_INDEX_TAIL = "blank";
 Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list.";
 Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_END = "Returns the item at the specified position in a list. #1 is the last item.";
 Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM_START = "Returns the item at the specified position in a list. #1 is the first item.";
@@ -495,7 +495,7 @@ Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/
 Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "Get sub-list from first";
 Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "Get sub-list from # from end";
 Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "Get sub-list from #";
-Blockly.Msg.LISTS_GET_SUBLIST_TAIL = "";
+Blockly.Msg.LISTS_GET_SUBLIST_TAIL = "blank";
 Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list.";
 Blockly.Msg.LISTS_INDEX_OF_FIRST = "Find first occurrence of item";
 Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list";
@@ -532,9 +532,9 @@ Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "Ascending";
 Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "Descending";
 Blockly.Msg.LISTS_SORT_TITLE = "Sort %1 %2 %3";
 Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list.";
-Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "Alphabetic, ignore case";
-Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "Numeric";
-Blockly.Msg.LISTS_SORT_TYPE_TEXT = "Alphabetic";
+Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "Sort alphabetically, disregarding case.";
+Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "Sort by numbers";
+Blockly.Msg.LISTS_SORT_TYPE_TEXT = "sort alphabetically";
 Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists";
 Blockly.Msg.LISTS_SPLIT_LIST_FROM_TEXT = "Make list from text";
 Blockly.Msg.LISTS_SPLIT_TEXT_FROM_LIST = "Make text from list";
@@ -604,7 +604,7 @@ Blockly.Msg.MATH_CONSTANT_HELPURL = "https://en.wikipedia.org/wiki/Mathematical_
 Blockly.Msg.MATH_CONSTANT_TOOLTIP = "Return one of the common constants: π (3.141…), e (2.718…), φ (1.618…), sqrt(2) (1.414…), sqrt(½) (0.707…), or ∞ (infinity).";
 Blockly.Msg.MATH_CONSTRAIN_HELPURL = "https://en.wikipedia.org/wiki/Clamping_%28graphics%29";
 Blockly.Msg.MATH_CONSTRAIN_TITLE = "Constrain %1 low %2 high %3";
-Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Constrain a number to be between the specified limits (inclusive).";
+Blockly.Msg.MATH_CONSTRAIN_TOOLTIP = "Restrict the number to be between two specified values.";
 Blockly.Msg.MATH_DIVISION_SYMBOL = "÷";
 Blockly.Msg.MATH_IS_DIVISIBLE_BY = "Is divisible by";
 Blockly.Msg.MATH_IS_EVEN = "Is even";
@@ -675,12 +675,12 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian).";
 Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian).";
 Blockly.Msg.ME = "Me";
 Blockly.Msg.MOTION_GETACC = "Get Acceleration Value of";
-Blockly.Msg.MOTION_GETACC1 = "";
+Blockly.Msg.MOTION_GETACC1 = "directional acceleration";
 Blockly.Msg.MOTION_GETRAWDATA = "Get rawdata";
 Blockly.Msg.MOTION_GETYPR = "Get Rotation Value of";
-Blockly.Msg.MOTION_GETYPR1 = "";
+Blockly.Msg.MOTION_GETYPR1 = "rotation angle";
 Blockly.Msg.MOTION_ONDIRECTION = "On Tilt Direction";
-Blockly.Msg.MOTION_ONDIRECTION1 = "";
+Blockly.Msg.MOTION_ONDIRECTION1 = "deflection";
 Blockly.Msg.MOTION_ONDIRECTION_BACK = "Back";
 Blockly.Msg.MOTION_ONDIRECTION_CLOCKWISE = "Clockwise";
 Blockly.Msg.MOTION_ONDIRECTION_COUNTERCLOCKWISE = "Counter-clockwise";
@@ -729,8 +729,8 @@ Blockly.Msg.MUSIC_MP3_PLAYMODE_REPEAT = "Repeat";
 Blockly.Msg.MUSIC_MP3_PLAYONE = "Play music ";
 Blockly.Msg.MUSIC_MP3_PLAYONE_NAME = "Music:";
 Blockly.Msg.MUSIC_MP3_PLAYONE_NORMAL = "once";
-Blockly.Msg.MUSIC_MP3_PLAYONE_REPEAT = "repeatedly";
-Blockly.Msg.MUSIC_MP3_PLAYSETTING = "MP3 Music Operation:";
+Blockly.Msg.MUSIC_MP3_PLAYONE_REPEAT = "repeat";
+Blockly.Msg.MUSIC_MP3_PLAYSETTING = "play setting";
 Blockly.Msg.MUSIC_MP3_PLAYSETTING_NEXTSONG = "Next song";
 Blockly.Msg.MUSIC_MP3_PLAYSETTING_PAUSE = "Pause";
 Blockly.Msg.MUSIC_MP3_PLAYSETTING_PLAYALL = "Play all Song";
@@ -826,17 +826,17 @@ Blockly.Msg.OLCD_TEXTNEWLINE = "New Line";
 Blockly.Msg.OLCD_TRIANGLE = "Triangle";
 Blockly.Msg.OLCD_TRUE = "True";
 Blockly.Msg.OLCD_WIDTH = "Width";
-Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "";
+Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "blank";
 Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "Allow statements";
 Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "With:";
 Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29";
 Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'.";
 Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29";
-Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output.";
+Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Execute the user-defined function '%1' and utilize its output value.";
 Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "With:";
 Blockly.Msg.PROCEDURES_CREATE_DO = "Create '%1'";
 Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function...";
-Blockly.Msg.PROCEDURES_DEFNORETURN_DO = "";
+Blockly.Msg.PROCEDURES_DEFNORETURN_DO = "Do";
 Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29";
 Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "Func1";
 Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "To";
@@ -873,7 +873,7 @@ Blockly.Msg.REQUEST_DATA_CLOUD = "Cloud Data";
 Blockly.Msg.REQUEST_DATA_STRING = "String";
 Blockly.Msg.RFID_READID = "Read Card ID";
 Blockly.Msg.RFID_SETUP = "RFID Setup";
-Blockly.Msg.ROBOT_SETMOVE_MOVEMENT = "Set biped";
+Blockly.Msg.ROBOT_SETMOVE_MOVEMENT = "Configure the motion of the biped";
 Blockly.Msg.ROBOT_SETMOVE_MOVEMENT_BACKYARD = "Walk Backward";
 Blockly.Msg.ROBOT_SETMOVE_MOVEMENT_GOINGUP = "Going Up";
 Blockly.Msg.ROBOT_SETMOVE_MOVEMENT_KICKLEFT = "Kick Left";
@@ -886,7 +886,7 @@ Blockly.Msg.ROBOT_SETMOVE_MOVEMENT_TURNLEFT = "Turn Left";
 Blockly.Msg.ROBOT_SETMOVE_MOVEMENT_TURNRIGHT = "Turn Right";
 Blockly.Msg.ROBOT_SETMOVE_MOVEMENT_WALK = "Walk Forward";
 Blockly.Msg.ROBOT_SETMOVE_TEMPO = "With tempo in";
-Blockly.Msg.ROBOT_SETUP = "Bipedal Walking Robot Setup";
+Blockly.Msg.ROBOT_SETUP = "Configuring a bipedal walking robot.";
 Blockly.Msg.ROBOT_SETUP_SETRLPIN = "And Left Foot pin#";
 Blockly.Msg.ROBOT_SETUP_SETRRPIN = "Set Right Foot pin#";
 Blockly.Msg.ROBOT_SETUP_SETYLPIN = "And Left Hip pin#";
@@ -962,7 +962,7 @@ Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#
 Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "In text";
 Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "Find first occurrence of text";
 Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "Find last occurrence of text";
-Blockly.Msg.TEXT_INDEXOF_TAIL = "";
+Blockly.Msg.TEXT_INDEXOF_TAIL = "blank";
 Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns 0 if text is not found.";
 Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text";
 Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty";
@@ -1045,7 +1045,7 @@ Blockly.Msg.WIFICLIENT_HTTP_SETUP = "Client Setup";
 Blockly.Msg.WIFICLIENT_RECEIVE_GET = "From";
 Blockly.Msg.WIFICLIENT_RECEIVE_GET_LINE2 = "Get data of index";
 Blockly.Msg.WIFICLIENT_RECEIVE_GET_LINE3 = "As type";
-Blockly.Msg.WIFIEASYMODE_COCOCLOUD_END = "";
+Blockly.Msg.WIFIEASYMODE_COCOCLOUD_END = "value";
 Blockly.Msg.WIFIEASYMODE_COCOCLOUD_GETDATA = "Get Data and Store it to ";
 Blockly.Msg.WIFIEASYMODE_COCOCLOUD_KEY = "From";
 Blockly.Msg.WIFIEASYMODE_COCOCLOUD_KEY1 = "Get the value with property";
@@ -1057,9 +1057,9 @@ Blockly.Msg.WIFIEASYMODE_COCOCLOUD_TYPE = "As type";
 Blockly.Msg.WIFIEASYMODE_COCOClOUD_DATA_NAME = "Name:";
 Blockly.Msg.WIFIEASYMODE_COCOClOUD_EVENT = "Cloud Event API Key:";
 Blockly.Msg.WIFIEASYMODE_IFTTT_EVENT = "IFTTT Event Name:";
-Blockly.Msg.WIFIEASYMODE_IFTTT_FETCH = "Fecth data";
+Blockly.Msg.WIFIEASYMODE_IFTTT_FETCH = "Fecth data";
 Blockly.Msg.WIFIEASYMODE_IFTTT_KEY = "IFTTT Key:";
-Blockly.Msg.WIFIEASYMODE_IFTTT_POST = "Post data";
+Blockly.Msg.WIFIEASYMODE_IFTTT_POST = "Post data";
 Blockly.Msg.WIFIEASYMODE_IFTTT_SENDDATA = "Send Data";
 Blockly.Msg.WIFIEASYMODE_IFTTT_TYPE = "Webhook Type:";
 Blockly.Msg.WIFIEASYMODE_NETWORK_PW = "WiFi Password";
@@ -1088,7 +1088,7 @@ Blockly.Msg.WIFINETWORK_GETLOCALIP = "Get local IP";
 Blockly.Msg.WIFINETWORK_GETMACADDR = "Get MAC address";
 Blockly.Msg.WIFINETWORK_GETSTATIONNUM = "Get client number";
 Blockly.Msg.WIFINETWORK_ISCONNECTED = "isConnected";
-Blockly.Msg.WIFINETWORK_PW_WARN = "PASSWORD should be set as more than eight digits";
+Blockly.Msg.WIFINETWORK_PW_WARN = "The password should be more than 8 characters long.";
 Blockly.Msg.WIFISERVER_HANDLECLIENT = "Handleclient";
 Blockly.Msg.WIFISERVER_LIST = "Create List";
 Blockly.Msg.WIFISERVER_RECEIVE = "Server receive data";
@@ -1270,7 +1270,7 @@ Blockly.Msg.LISTS_GET_INDEX_GET_REMOVE = "Get and remove";
 Blockly.Msg.LISTS_GET_INDEX_LAST = "Last";
 Blockly.Msg.LISTS_GET_INDEX_RANDOM = "Random";
 Blockly.Msg.LISTS_GET_INDEX_REMOVE = "Remove";
-Blockly.Msg.LISTS_GET_INDEX_TAIL = "";
+Blockly.Msg.LISTS_GET_INDEX_TAIL = "blank";
 Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FIRST = "Returns the first item in a list.";
 Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_FROM = "Returns the item at the specified position in a list.";
 Blockly.Msg.LISTS_GET_INDEX_TOOLTIP_GET_LAST = "Returns the last item in a list.";
@@ -1290,14 +1290,14 @@ Blockly.Msg.LISTS_GET_SUBLIST_HELPURL = "https://github.com/google/blockly/wiki/
 Blockly.Msg.LISTS_GET_SUBLIST_START_FIRST = "Get sub-list from first";
 Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_END = "Get sub-list from # from end";
 Blockly.Msg.LISTS_GET_SUBLIST_START_FROM_START = "Get sub-list from #";
-Blockly.Msg.LISTS_GET_SUBLIST_TAIL = "";
+Blockly.Msg.LISTS_GET_SUBLIST_TAIL = "blank";
 Blockly.Msg.LISTS_GET_SUBLIST_TOOLTIP = "Creates a copy of the specified portion of a list.";
 Blockly.Msg.LISTS_INDEX_FROM_END_TOOLTIP = "%1 is the last item.";
 Blockly.Msg.LISTS_INDEX_FROM_START_TOOLTIP = "%1 is the first item.";
 Blockly.Msg.LISTS_INDEX_OF_FIRST = "Find first occurrence of item";
 Blockly.Msg.LISTS_INDEX_OF_HELPURL = "https://github.com/google/blockly/wiki/Lists#getting-items-from-a-list";
 Blockly.Msg.LISTS_INDEX_OF_LAST = "Find last occurrence of item";
-Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Returns the index of the first/last occurrence of the item in the list. Returns %1 if item is not found.";
+Blockly.Msg.LISTS_INDEX_OF_TOOLTIP = "Return the index value of the first/last matching item in the list. If the item is not found, return %1.";
 Blockly.Msg.LISTS_INLIST = "In list";
 Blockly.Msg.LISTS_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Lists#is-empty";
 Blockly.Msg.LISTS_ISEMPTY_TITLE = "%1 is empty";
@@ -1325,7 +1325,7 @@ Blockly.Msg.LISTS_SORT_ORDER_ASCENDING = "Ascending";
 Blockly.Msg.LISTS_SORT_ORDER_DESCENDING = "Descending";
 Blockly.Msg.LISTS_SORT_TITLE = "Sort %1 %2 %3";
 Blockly.Msg.LISTS_SORT_TOOLTIP = "Sort a copy of a list.";
-Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "Alphabetic, ignore case";
+Blockly.Msg.LISTS_SORT_TYPE_IGNORECASE = "Sort alphabetically, disregarding case.";
 Blockly.Msg.LISTS_SORT_TYPE_NUMERIC = "Numeric";
 Blockly.Msg.LISTS_SORT_TYPE_TEXT = "Alphabetic";
 Blockly.Msg.LISTS_SPLIT_HELPURL = "https://github.com/google/blockly/wiki/Lists#splitting-strings-and-joining-lists";
@@ -1455,7 +1455,7 @@ Blockly.Msg.MATH_TRIG_TOOLTIP_SIN = "Return the sine of a degree (not radian).";
 Blockly.Msg.MATH_TRIG_TOOLTIP_TAN = "Return the tangent of a degree (not radian).";
 Blockly.Msg.NEW_VARIABLE = "Create property...";
 Blockly.Msg.NEW_VARIABLE_TITLE = "New property name:";
-Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "";
+Blockly.Msg.ORDINAL_NUMBER_SUFFIX = "blank";
 Blockly.Msg.PLATFORM_IMPORT = "Import platform";
 Blockly.Msg.PROCEDURES_ALLOW_STATEMENTS = "Allow statements";
 Blockly.Msg.PROCEDURES_BEFORE_PARAMS = "with:";
@@ -1463,10 +1463,10 @@ Blockly.Msg.PROCEDURES_CALLNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Pro
 Blockly.Msg.PROCEDURES_CALLNORETURN_TOOLTIP = "Run the user-defined function '%1'.";
 Blockly.Msg.PROCEDURES_CALLRETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29";
 Blockly.Msg.PROCEDURES_CALLRETURN_TOOLTIP = "Run the user-defined function '%1' and use its output.";
-Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "";
+Blockly.Msg.PROCEDURES_CALL_BEFORE_PARAMS = "with: ";
 Blockly.Msg.PROCEDURES_CREATE_DO = "Create '%1'";
 Blockly.Msg.PROCEDURES_DEFNORETURN_COMMENT = "Describe this function...";
-Blockly.Msg.PROCEDURES_DEFNORETURN_DO = "";
+Blockly.Msg.PROCEDURES_DEFNORETURN_DO = "do";
 Blockly.Msg.PROCEDURES_DEFNORETURN_HELPURL = "https://en.wikipedia.org/wiki/Procedure_%28computer_science%29";
 Blockly.Msg.PROCEDURES_DEFNORETURN_PROCEDURE = "Function_name";
 Blockly.Msg.PROCEDURES_DEFNORETURN_TITLE = "Define";
@@ -1529,7 +1529,7 @@ Blockly.Msg.TEXT_INDEXOF_HELPURL = "https://github.com/google/blockly/wiki/Text#
 Blockly.Msg.TEXT_INDEXOF_INPUT_INTEXT = "In text";
 Blockly.Msg.TEXT_INDEXOF_OPERATOR_FIRST = "Find first occurrence of text";
 Blockly.Msg.TEXT_INDEXOF_OPERATOR_LAST = "Find last occurrence of text";
-Blockly.Msg.TEXT_INDEXOF_TAIL = "";
+Blockly.Msg.TEXT_INDEXOF_TAIL = "blank";
 Blockly.Msg.TEXT_INDEXOF_TOOLTIP = "Returns the index of the first/last occurrence of the first text in the second text. Returns %1 if text is not found.";
 Blockly.Msg.TEXT_ISEMPTY_HELPURL = "https://github.com/google/blockly/wiki/Text#checking-for-empty-text";
 Blockly.Msg.TEXT_ISEMPTY_TITLE = "%1 is empty";
@@ -1544,7 +1544,7 @@ Blockly.Msg.TEXT_LOWER = "Set lower case";
 Blockly.Msg.TEXT_PRINT_HELPURL = "https://github.com/google/blockly/wiki/Text#printing-text";
 Blockly.Msg.TEXT_PRINT_TITLE = "Print %1";
 Blockly.Msg.TEXT_PRINT_TITLE_PRINT = "Print";
-Blockly.Msg.TEXT_PRINT_TOOLTIP = "";
+Blockly.Msg.TEXT_PRINT_TOOLTIP = "Print the specified text, number, or other value.";
 Blockly.Msg.TEXT_PROMPT_HELPURL = "https://github.com/google/blockly/wiki/Text#getting-input-from-the-user";
 Blockly.Msg.TEXT_PROMPT_TOOLTIP_NUMBER = "Prompt for user for a number.";
 Blockly.Msg.TEXT_PROMPT_TOOLTIP_TEXT = "Prompt for user for some text.";
@@ -2309,7 +2309,7 @@ Blockly.Msg.ARDUINO_VISION_SENSOR7 = "%1 %2 Vision Sensor get color value"
 Blockly.Msg.BUZZER_TONE_LOW = "Low"
 Blockly.Msg.BUZZER_TONE_MIDDLE = "Middle"
 Blockly.Msg.BUZZER_TONE_HIGH = "High"
-Blockly.Msg.BUZZER_SELECTED_PREFIX = ""
+Blockly.Msg.BUZZER_SELECTED_PREFIX = "selected:"
 Blockly.Msg.ARDUINO_LED_STRIP1 = "%1 %2 RGB LED Strip PIN %3 show R %4 G %5 B %6 Number %7"
 Blockly.Msg.ARDUINO_LED_STRIP2 = "%1 %2 RGB LED Strip PIN %3 show R %4 G %5 B %6"
 Blockly.Msg.ARDUINO_VISION_SENSOR8 = "%1 %2  Vision Sensor ball get value %3"
@@ -2334,7 +2334,7 @@ Blockly.Msg.MAIXDUINO_CAMERA_DETECTION_RECTANGLE_VALUE = "detected rectangle inf
 Blockly.Msg.MAIXDUINO_CAMERA_GET_BALL_AVERAGE_COLOR = "%1 %2 Circle region: X %3 Y %4 R %5 average RGB value"
 Blockly.Msg.MAIXDUINO_CAMERA_GET_RECTANGLE_AVERAGE_COLOR = "%1 %2 Rectangular region: Xmin %3 Xmax %4 Ymin %5 Ymax %6 average RGB value"
 Blockly.Msg.MAIXDUINO_CAMERA_INTEREST_AREA_COLOR = "%1 %2 Region of interest %3 detected color is %4"
-Blockly.Msg.MAIXDUINO_CAMERA_INTEREST_AREA_AVERAGE_COLOR = "%1 %2 Region of interest %3 average RGB value"
+Blockly.Msg.MAIXDUINO_CAMERA_INTEREST_AREA_AVERAGE_COLOR = "%1 %2 Interest area %3 average color RGB value"
 Blockly.Msg.MAIXDUINO_SENSING_HOME_ANIMAL_DETECTION = "recognized domestic animal result probability > %1 %"
 Blockly.Msg.MAIXDUINO_SENSING_HOME_ANIMAL_SEL_DETECTION = "recognized domestic animal is %1 probability > %2 %"
 Blockly.Msg.MAIXDUINO_SENSING_ZOO_ANIMAL_DETECTION = "recognized zoo animal result probability > %1 %"
@@ -2552,29 +2552,29 @@ Blockly.Msg.ARDUINO_VISION_SENSOR_OPT5 = "P"
 Blockly.Msg.ARDUINO_MARK_ROBOT_RUN = "%1 %2 M.A.R.K go %3 at %4 speed"
 Blockly.Msg.ARDUINO_MARK_ROBOT_MOTOR_RUN = "%1 %2 M.A.R.K run motor %3 at %4"
 Blockly.Msg.ARDUINO_MARK_ROBOT_SERVO_RUN = "%1 %2 M.A.R.K Servo %3 move to %4 degree"
-Blockly.Msg.ARDUINO_NETWORK_SETWIFI = "%1 %2 开始连接无线网络 %3 密码 %4"
-Blockly.Msg.ARDUINO_NETWORK_STATE = "%1 %2 网络已连接?"
-Blockly.Msg.ARDUINO_SPEECH_RECOGNITION_REC = "%1 %2 识别 %3 语音 %4 秒钟"
-Blockly.Msg.ARDUINO_SPEECH_RECOGNITION_OPT01 = "汉语"
-Blockly.Msg.ARDUINO_SPEECH_RECOGNITION_OPT02 = "英语"
-Blockly.Msg.ARDUINO_SPEECH_RECOGNITION_RECTEXT = "%1 %2 语音识别出的文字"
-Blockly.Msg.ARDUINO_SPEECH_RECOGNITION_TTS = "%1 %2  %3"
-Blockly.Msg.ARDUINO_AUDIO_RECORD = "%1 %2 录音 %3 %4"
-Blockly.Msg.ARDUINO_AUDIO_STORAGE_OPT01 = "文件"
+Blockly.Msg.ARDUINO_NETWORK_SETWIFI = "%1 %2 start connecting to the wireless network %3 password %4"
+Blockly.Msg.ARDUINO_NETWORK_STATE = "%1 %2 Is the network connected?"
+Blockly.Msg.ARDUINO_SPEECH_RECOGNITION_REC = "%1 %2 Identify %3 speech %4 seconds"
+Blockly.Msg.ARDUINO_SPEECH_RECOGNITION_OPT01 = "Mandarin"
+Blockly.Msg.ARDUINO_SPEECH_RECOGNITION_OPT02 = "English"
+Blockly.Msg.ARDUINO_SPEECH_RECOGNITION_RECTEXT = "%1 %2 text recognized by speech recognition"
+Blockly.Msg.ARDUINO_SPEECH_RECOGNITION_TTS = "%1 %2 speak %3"
+Blockly.Msg.ARDUINO_AUDIO_RECORD = "%1 %2 audio record %3 %4"
+Blockly.Msg.ARDUINO_AUDIO_STORAGE_OPT01 = "file"
 Blockly.Msg.ARDUINO_AUDIO_STORAGE_OPT02 = "Micro SD"
 Blockly.Msg.ARDUINO_AUDIO_STORAGE_OPT03 = "USB"
-Blockly.Msg.ARDUINO_AUDIO_STORAGE_OPT04 = "暂存"
-Blockly.Msg.ARDUINO_AUDIO_STOP_RECORD = "%1 %2 录音停止"
-Blockly.Msg.ARDUINO_AUDIO_PLAY = "%1 %2 播放音频 %3 %4"
-Blockly.Msg.ARDUINO_AUDIO_PLAY_SOMEONE = "%1 %2 播放第 %3 首曲目"
-Blockly.Msg.ARDUINO_AUDIO_PLAY_PREORNEXT = "%1 %2 播放 %3 曲目"
-Blockly.Msg.ARDUINO_AUDIO_PLAY_OPT1 = "上一首"
-Blockly.Msg.ARDUINO_AUDIO_PLAY_OPT2 = "下一首"
-Blockly.Msg.ARDUINO_AUDIO_PLAY_ATMODE = "%1 %2 %3 播放曲目"
-Blockly.Msg.ARDUINO_AUDIO_PLAY_MODE_OPT1 = "循环"
-Blockly.Msg.ARDUINO_AUDIO_PLAY_MODE_OPT2 = "暂停"
-Blockly.Msg.ARDUINO_AUDIO_PLAY_MODE_OPT3 = "停止"
-Blockly.Msg.ARDUINO_AUDIO_SETVOL = "%1 %2 设置扬声器音量 %3"
+Blockly.Msg.ARDUINO_AUDIO_STORAGE_OPT04 = "buffer"
+Blockly.Msg.ARDUINO_AUDIO_STOP_RECORD = "%1 %2 recording stop"
+Blockly.Msg.ARDUINO_AUDIO_PLAY = "%1 %2 audio play %3 %4"
+Blockly.Msg.ARDUINO_AUDIO_PLAY_SOMEONE = "%1 %2 play track %3"
+Blockly.Msg.ARDUINO_AUDIO_PLAY_PREORNEXT = "%1 %2 play %3 track"
+Blockly.Msg.ARDUINO_AUDIO_PLAY_OPT1 = "Previous track"
+Blockly.Msg.ARDUINO_AUDIO_PLAY_OPT2 = "next track"
+Blockly.Msg.ARDUINO_AUDIO_PLAY_ATMODE = "%1 %2 %3 Play Track"
+Blockly.Msg.ARDUINO_AUDIO_PLAY_MODE_OPT1 = "Loop"
+Blockly.Msg.ARDUINO_AUDIO_PLAY_MODE_OPT2 = "Pulse"
+Blockly.Msg.ARDUINO_AUDIO_PLAY_MODE_OPT3 = "Stop"
+Blockly.Msg.ARDUINO_AUDIO_SETVOL = "%1 %2 Set speaker volume %3"
 Blockly.Msg.ELFBOT_MAINBOARD_START = "%1 %2 when Elfbot starts up"
 Blockly.Msg.ELFBOT_WHEN_BUTTON_S_PRESSED = "%1 %2 when button S is pressed"
 Blockly.Msg.ELFBOT_WHEN_LIGHTINTENSITY_LESSTHAN = "%1 %2 when light intensity %3 %4"
@@ -2585,7 +2585,7 @@ Blockly.Msg.ELFBOT_ULTRASONIC_DISTANCE_FROMOBJ = "%1 %2 Elfbot distance of obsta
 Blockly.Msg.ELFBOT_ULTRASONIC_ISDETECTED_OBJECT = "%1 %2 Elfbot obstacles ahead?"
 Blockly.Msg.ELFBOT_ULTRASONIC_LED_SHOW_COLOR = "%1 %2 Elfbot set the ultrasonic LED with color %3"
 Blockly.Msg.ELFBOT_ULTRASONIC_LED_CRUSHOUT = "%1 %2 Elfbot ultrasonic LED lights off"
-Blockly.Msg.ELFBOT_ULTRASONIC_WHENDETECTEDOBJECT = "%1 %2 当检测到前方物体"
+Blockly.Msg.ELFBOT_ULTRASONIC_WHENDETECTEDOBJECT = "%1 %2 when detecting an object ahead"
 Blockly.Msg.ELFBOT_LEDMATRIX_PLOT = "%1 %2 Elfbot plot x: %3 y: %4"
 Blockly.Msg.ELFBOT_LEDMATRIX_UNPLOT = "%1 %2 Elfbot unplot x: %3 y: %4"
 Blockly.Msg.ELFBOT_LEDMATRIX_PLOT_OR_UNPLOT = "%1 %2 Elfbot switch between plot and unplot x: %3 y: %4"
@@ -2662,10 +2662,10 @@ Blockly.Msg.ELFBOT_RGBLED_COLOR_VALUE_OPTION5 = "purple"
 Blockly.Msg.ELFBOT_RGBLED_COLOR_VALUE_OPTION6 = "black"
 Blockly.Msg.ELFBOT_RGBLED_COLOR_VALUE_OPTION7 = "white"
 Blockly.Msg.ELFBOT_RGBLED_CRUSHOUT = "%1 %2 Elfbot RGB LED lights off"
-Blockly.Msg.ELFBOT_INFRARED_WHENOVERHEAD = "%1 %2 当检测到前方悬空"
+Blockly.Msg.ELFBOT_INFRARED_WHENOVERHEAD = "%1 %2 when detected ahead overhang"
 Blockly.Msg.ELFBOT_INFRARED_LIGHTINTENSITY_VALUE = "%1 %2 Elfbot reflected infrared light intensity"
 Blockly.Msg.ELFBOT_INFRARED_DETECTED_ISHEAD = "%1 %2 Elfbot cliff ahead?"
-Blockly.Msg.ELFBOT_LINEPATROL_WHENDETECTEDCOLORD = "%1 %2 当检测到的颜色是 %3"
+Blockly.Msg.ELFBOT_LINEPATROL_WHENDETECTEDCOLORD = "%1 %2 when the detected colour is %3"
 Blockly.Msg.ELFBOT_LINEPATROL_COLOR_VALUE_OPTION0 = "red"
 Blockly.Msg.ELFBOT_LINEPATROL_COLOR_VALUE_OPTION1 = "green"
 Blockly.Msg.ELFBOT_LINEPATROL_COLOR_VALUE_OPTION2 = "blue"
@@ -3207,7 +3207,7 @@ Blockly.Msg.GROVE_JOINT_INPUT_HUMITURE_OPT01 = "temperature"
 Blockly.Msg.GROVE_JOINT_INPUT_HUMITURE_OPT02 = "humidity"
 Blockly.Msg.GROVE_JOINT_INPUT_LEVEL_HIGH = "ON"
 Blockly.Msg.GROVE_JOINT_INPUT_LEVEL_LOW = "OFF"
-Blockly.Msg.ELFBOT_LINEPATROL_WHENETECTEDCOLORD = "%1 %2 当检测到的颜色是 %3"
+Blockly.Msg.ELFBOT_LINEPATROL_WHENETECTEDCOLORD = "%1 %2 when the detected colour is %3"
 Blockly.Categories = {};
 Blockly.Categories.motion = "motion"
 Blockly.Categories.looks = "looks"
@@ -3233,7 +3233,7 @@ Blockly.Msg.ESP32DIALSWITCH = "When Dialer";
 Blockly.Msg.ESP32TURN = "Set ";
 Blockly.Msg.ESP32LED = "Light ";
 Blockly.Msg.ESP32LED_MONO_TEXT_NO = "LED #";
-Blockly.Msg.ESP32LED_MONO_TEXT_AFTER = "";
+Blockly.Msg.ESP32LED_MONO_TEXT_AFTER = "A single LED light";
 Blockly.Msg.ESP32LED_BLUE = "Blue LED";
 Blockly.Msg.ESP32LED_RED = "Red LED";
 Blockly.Msg.ESP32LED_TURNON = "Up";
@@ -3254,6 +3254,9 @@ Blockly.Msg.ESP32_UNTOUCHED = "is Not Touched";
 Blockly.Msg.ESP32_READ = "Get Touch Area";
 Blockly.Msg.ESP32_READ_VALUE = "'s Capacitative Variable";
 Blockly.Msg.ESP32_ENV_GET_TEXT = "Get";
+Blockly.Msg.esp32_main_controller_turn_off_buzzer_music_lite = "The buzzer plays notes";
+Blockly.Msg.esp32_main_controller_turn_off_buzzer_music_lite_2 = "Continue";
+Blockly.Msg.esp32_main_controller_turn_off_buzzer_music_lite_3 = "beat";
 
 
 Blockly.Msg.LCDINIT = "LCD Display Initalization"
@@ -3613,7 +3616,7 @@ Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_TYPE_FLOAT = "Float";
 Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_TYPE_INTEGER = "Number";
 Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_TYPE_STRING = "String";
 Blockly.Msg.serialcomm_write_item_first = "Data ";
-Blockly.Msg.serialcomm_write_item_last = "";
+Blockly.Msg.serialcomm_write_item_last = "bit of data";
 Blockly.Msg.serialcomm_write_item = "Item";
 Blockly.Msg.serialcomm_write_data = "Data";
 Blockly.Msg.serialcomm_write_data_bps_title = "Set Baud Rate:";
@@ -3622,6 +3625,7 @@ Blockly.Msg.serialcomm_write_on = "On";
 Blockly.Msg.serialcomm_write_on_ai = "AI Module ";
 Blockly.Msg.serialcomm_write_on_iot = "IoT Module";
 Blockly.Msg.serial_send_data_on = "On";
+Blockly.Msg.serial_send_data_on_send_data_cocorobo = "CocoPi Send data to generation 1 and generation 2   "
 Blockly.Msg.serial_send_data_on_send_data = "CocoPi Send Data to Micro:bit"
 Blockly.Msg.serial_send_data_on_send_data_control_panel = "CocoPi Send Data to Control panel"
 
@@ -3637,8 +3641,9 @@ Blockly.Msg.serial_send_data_on_send_data_control_panel = "CocoPi Send Data to C
 
 
 Blockly.Msg.basic_button_read_value = "Read the Status of Button ";
-Blockly.Msg.basic_button_read_value_after = "";
+Blockly.Msg.basic_button_read_value_after = "the voltage level state";
 
+Blockly.Msg.basic_buzzer_set_init = "The buzzer is initialized and the pins are set as follows";
 Blockly.Msg.basic_buzzer_set = "Set Buzzer frequency (Hz)";
 Blockly.Msg.basic_temperature = "Temperature";
 Blockly.Msg.basic_humidity = "Humidity";
@@ -3668,7 +3673,7 @@ Blockly.Msg.basic_when_tilting_get_left_and_backward = "tilt to the backward lef
 Blockly.Msg.basic_when_tilting_get_right_and_forward = "tilt to the forward right";
 Blockly.Msg.basic_when_tilting_get_right_and_backward = "tilt to the backward right";
 Blockly.Msg.basic_when_tilting_not_tilting = "not tilting";
-Blockly.Msg.basic_when_tilting_get_when = "";
+Blockly.Msg.basic_when_tilting_get_when = "When in a wobbly state.";
 Blockly.Msg.basic_motion_get = "Get";
 Blockly.Msg.basic_motion_accel = " axis acceleration";
 Blockly.Msg.basic_motion_rotation_measurement = " axis rotation measurement";
@@ -3878,7 +3883,7 @@ Blockly.Msg.beijing = "Beijing ";
 Blockly.Msg.shanghai = "Shanghai ";
 Blockly.Msg.guangzhou = "Guangzhou ";
 Blockly.Msg.shenzhen = "Shenzhen ";
-Blockly.Msg.tianjin= "Tianjin ";
+Blockly.Msg.tianjin = "Tianjin ";
 Blockly.Msg.HongKong = "Hong Kong"
 /*
   ___    _____   ____                  _          
@@ -3943,14 +3948,14 @@ Blockly.Msg.iotservice_cococloud_get_data = "from CocoCloud";
 
 
 Blockly.Msg.system_code_path = "File Path:";
-Blockly.Msg.system_get_size = "Get the Remaining Space from Module (in MegaBytes";
+Blockly.Msg.system_get_size = "Get the Remaining Space from Module (in MegaBytes)";
 Blockly.Msg.system_get_mac = "Get Module's MAC address";
 Blockly.Msg.system_get_cocorobo_cid = "Get the Device ID of Current IoT Module";
 Blockly.Msg.iot_system_get_cocorobo_firmware_version = "Get the Current firmware version number of Current IoT Module";
 Blockly.Msg.iot_system_delete = "Delete file";
 Blockly.Msg.ai_system_get_cocorobo_firmware_version = "Get the Current firmware version number of Current AI Module";
-Blockly.Msg.ai_system_get_size = "Get the Remaining Space in Memory (in MegaBytes";
-Blockly.Msg.ai_system_sd_get_size = "Get the Remaining Space in SD card (in MegaBytes";
+Blockly.Msg.ai_system_get_size = "Get the Remaining Space in Memory (in MegaBytes)";
+Blockly.Msg.ai_system_sd_get_size = "Get the Remaining Space in SD card (in MegaBytes)";
 Blockly.Msg.ai_system_thread = "Enable multithreading";
 
 Blockly.Msg.SYSTEM = "Restart System";
@@ -4055,7 +4060,7 @@ Blockly.Msg.x_motor_set_motor_speed = "'s Speed to";
 Blockly.Msg.x_motor_exec = "(-255~255) Rotating";
 Blockly.Msg.x_motor_cw = "Clockwise";
 Blockly.Msg.x_motor_acw = "Anti-Clockwise";
-Blockly.Msg.x_motor_set_motor_turns = "";
+Blockly.Msg.x_motor_set_motor_turns = "turns";
 
 Blockly.Msg.x_motor_set_motor_ai = "Motor Driver Setup";
 Blockly.Msg.x_motor_set_motor_turn_ai = "Set Motor";
@@ -4063,7 +4068,7 @@ Blockly.Msg.x_motor_set_motor_speed_ai = "'s Speed to";
 Blockly.Msg.x_motor_exec_ai = "(0~255) Rotating";
 Blockly.Msg.x_motor_cw_ai = "Clockwise";
 Blockly.Msg.x_motor_acw_ai = "Anti-Clockwise";
-Blockly.Msg.x_motor_set_motor_turns_ai = "";
+Blockly.Msg.x_motor_set_motor_turns_ai = "turns";
 
 
 
@@ -4076,7 +4081,7 @@ Blockly.Msg.x_motor_set_motor_turns_ai = "";
 
 */
 
-Blockly.Msg.x_led_matrix_setup_ai = "AI Module LED Matrix (6×6) Setup";
+Blockly.Msg.x_led_matrix_setup_ai = "AI Module LED Matrix (6x6) Setup";
 Blockly.Msg.x_led_matrix_setup_ai_set_bright_1 = "Set Brigntness:";
 Blockly.Msg.x_led_matrix_setup_ai_set_bright_range = "(Range: 0~255)";
 Blockly.Msg.x_led_matrix_width_ai_set_brightness_1 = "Set Brightness to";
@@ -4098,7 +4103,7 @@ Blockly.Msg.x_led_matrix_parameter_size_ai = "Size:";
 Blockly.Msg.x_led_matrix_show_above_ai = "Show Above";
 Blockly.Msg.x_led_matrix_clear_all_ai = "Clear Screen";
 
-Blockly.Msg.x_led_matrix_setup_iot = "IoT Module LED Matrix (6×6) Setup";
+Blockly.Msg.x_led_matrix_setup_iot = "IoT Module LED Matrix (6x6) Setup";
 Blockly.Msg.x_led_matrix_width_iot_x = "Column:";
 Blockly.Msg.x_led_matrix_width_iot_y = "Row:";
 Blockly.Msg.x_led_matrix_width_iot = "Width:";
@@ -4138,7 +4143,7 @@ Blockly.Msg.x_gamepad_read_button_first_text_iot = "When Game Pad Button";
 Blockly.Msg.x_gamepad_read_button_first_text_pressed_iot = " is Pressed";
 Blockly.Msg.x_gamepad_read_button_first_text_released_iot = " is Released";
 Blockly.Msg.x_gamepad_read_button_status_first_text_iot = "Read the status of Game Pad Button ";
-Blockly.Msg.x_gamepad_read_button_status_after_text_iot = "";
+Blockly.Msg.x_gamepad_read_button_status_after_text_iot = "the voltage level";
 Blockly.Msg.x_gamepad_read_joystick_read_iot = "Read the ";
 Blockly.Msg.x_gamepad_read_joystick_read_iot_x = "X-axis";
 Blockly.Msg.x_gamepad_read_joystick_read_iot_y = "Y-axis";
@@ -4155,7 +4160,7 @@ Blockly.Msg.x_gamepad_read_button_first_text_ai = "When Game Pad Button";
 Blockly.Msg.x_gamepad_read_button_first_text_pressed_ai = " is Pressed";
 Blockly.Msg.x_gamepad_read_button_first_text_released_ai = " is Released";
 Blockly.Msg.x_gamepad_read_button_status_first_text_ai = "Read the status of Game Pad Button ";
-Blockly.Msg.x_gamepad_read_button_status_after_text_ai = "";
+Blockly.Msg.x_gamepad_read_button_status_after_text_ai = "the voltage level";
 Blockly.Msg.x_gamepad_read_joystick_read_ai = "Read the ";
 Blockly.Msg.x_gamepad_read_joystick_read_ai_x = "X-axis";
 Blockly.Msg.x_gamepad_read_joystick_read_ai_y = "Y-axis";
@@ -4338,7 +4343,7 @@ Blockly.Msg.image_process_lcd_show_text_color_yellow = "Yellow";
 Blockly.Msg.image_process_lcd_show_text_color_black = "Black";
 Blockly.Msg.image_process_lcd_show_text_color_white = "White";
 Blockly.Msg.image_process_get_statistics_to_canvas = "Get the Analyzed Result of Color Channel from Canvas:";
-Blockly.Msg.image_process_get_statistics_get_analysis = "";
+Blockly.Msg.image_process_get_statistics_get_analysis = "The result of analyzing color channel information";
 Blockly.Msg.image_process_get_statistics_start_coord = "Set the Start Coordinate of Analyzing Region:";
 Blockly.Msg.image_process_get_statistics_size = "Set the Size of Analyzing Region:";
 Blockly.Msg.image_process_get_statistics_boxes = "Set the Bin Count of the Histogram Channel:";
@@ -4425,6 +4430,8 @@ Blockly.Msg.ai_vision_color_analyze_get_result = "Get the Color Analyze Result f
 Blockly.Msg.ai_vision_color_analyze_start_coord = "Set the start coordinate of the analyze region:";
 Blockly.Msg.ai_vision_color_analyze_size = "Set the size of the analyze region:";
 Blockly.Msg.ai_vision_find_blobs_color_region = "Find Desginated Color Range";
+Blockly.Msg.ai_vision_find_lines_color_region = "Looks for the specified color line";
+Blockly.Msg.ai_vision_find_lines_color_region_result = "Gets the result of finding a line";
 Blockly.Msg.ai_vision_find_blobs_color_threshold = "Set the color threshold for tracking:";
 Blockly.Msg.ai_vision_find_blobs_start_coord = "Set the start coordinate of the analyze region:";
 Blockly.Msg.ai_vision_find_blobs_size = "Set the size of the analyze region:";
@@ -4467,6 +4474,7 @@ Blockly.Msg.ai_vision_pattern_detection_x = "X-axis coordinates of the starting
 Blockly.Msg.ai_vision_pattern_detection_y = "Y axis coordinates of the starting point of the detection box";
 Blockly.Msg.ai_vision_pattern_detection_w = "X-axis coordinates of terminal point of detection frame";
 Blockly.Msg.ai_vision_pattern_detection_h = "Y-axis coordinates of terminal point of detection frame";
+Blockly.Msg.ai_vision_pattern_distance = "Distance";
 Blockly.Msg.ai_vision_pattern_detection_type_id = "Numeric ID";
 Blockly.Msg.ai_vision_pattern_detection_type_family = "Numeric Family";
 Blockly.Msg.ai_vision_pattern_detection_rows = "Row Counts";
@@ -4544,7 +4552,7 @@ Blockly.Msg.ai_vision_lane_tracking_run = "Run Lane Detection Process";
 Blockly.Msg.ai_vision_lane_tracking_run_get = "From Lane Detection Result Get ";
 Blockly.Msg.ai_vision_lane_tracking_run_ld = "Left Area Detection";
 Blockly.Msg.ai_vision_lane_tracking_run_lv = "Left Area Offset Value";
-Blockly.Msg.ai_vision_lane_tracking_run_rd= "Right Area Detection";
+Blockly.Msg.ai_vision_lane_tracking_run_rd = "Right Area Detection";
 Blockly.Msg.ai_vision_lane_tracking_run_rv = "Right Area Offset Value";
 
 
@@ -4614,7 +4622,7 @@ Blockly.Msg.ai_speech_recognition_start_recognizing = "Speech Recognition: Start
 Blockly.Msg.ai_speech_recognition_any_result_text = "When Speech Recognition Has Any Result";
 Blockly.Msg.ai_speech_recognition_any_result_text_do = "Do";
 Blockly.Msg.ai_speech_recognition_get_result = "Speech Recognition Result is Clip #";
-Blockly.Msg.ai_speech_recognition_get_result_after = "";
+Blockly.Msg.ai_speech_recognition_get_result_after = "code snippet";
 Blockly.Msg.ai_speech_recognition_phonetic_to_pinyin_setup = "Phonetic to Pinyin initialization";
 Blockly.Msg.ai_speech_recognition_setup_pinyin = "Set pinyin";
 Blockly.Msg.ai_speech_recognition_phonetic_to_pinyin_get_result = "Get the result of speech to pinyin";
@@ -4647,7 +4655,7 @@ Blockly.Msg.ai_video_start_recording_file_path = "Set video file saved path:";
 Blockly.Msg.ai_video_start_recording_width = "Set Video Width (in px):";
 Blockly.Msg.ai_video_start_recording_height = "Set Video Height (in px):";
 Blockly.Msg.ai_video_to_canvas = "Start Recording on Canvas";
-Blockly.Msg.ai_video_record = "";
+Blockly.Msg.ai_video_record = "recording";
 Blockly.Msg.ai_video_stop_recording = "Stop Video Recording";
 Blockly.Msg.ai_video_play_video = "Play Video File";
 Blockly.Msg.ai_video_play_video_2 = "Note: Only Support 320*240 Resolution";
@@ -4656,6 +4664,8 @@ Blockly.Msg.ai_video_stop_video_playing = "Stop Playing Video";
 Blockly.Msg.ai_video_get_video_playing_status = "Get Current Playing Status";
 Blockly.Msg.ai_video_recording_and_save = "Record video file and save ";
 Blockly.Msg.ai_video_set_play = "Video file playing";
+Blockly.Msg.ai_video_set_play_stats = "Video Properties";
+Blockly.Msg.ai_video_set_play_init = "Video initialization";
 
 /*
      _    ___   __  __           _      _     
@@ -4705,10 +4715,13 @@ Blockly.Msg.ai_models_face_model_x = "X-axis coordinates of the starting point o
 Blockly.Msg.ai_models_face_model_y = "Y axis coordinates of the starting point of the detection box";
 Blockly.Msg.ai_models_face_model_w = "X-axis coordinates of terminal point of detection frame";
 Blockly.Msg.ai_models_face_model_h = "Y-axis coordinates of terminal point of detection frame";
+Blockly.Msg.ai_models_face_model_ws = "Width of the bounding box";
+Blockly.Msg.ai_models_face_model_hs = "Height of the bounding box";
 Blockly.Msg.ai_models_face_model_rect = "the bounding box";
 Blockly.Msg.ai_models_face_model_count = "Total Number";
 Blockly.Msg.ai_models_face_model_index = "Index";
 Blockly.Msg.ai_models_face_model_confidence = "Confidence Rate";
+Blockly.Msg.ai_models_face_model_confidence_1 = "Confidence (face detection)";
 Blockly.Msg.ai_model_human_attribute = "Human Body Attribute ";
 Blockly.Msg.ai_models_human_model_if = "Human body detected ";
 Blockly.Msg.ai_models_human_model_get = "Obtain detected human body ";
@@ -4720,6 +4733,12 @@ Blockly.Msg.ai_models_customized_init_setup_path = "Load model file from path";
 Blockly.Msg.ai_models_customized_init_setup_source = "Recognize from:";
 Blockly.Msg.v831_transmission_init_setup_source = "Set the image source to be transferred to:";
 Blockly.Msg.v831_transmission_setup_show = "The captured camera image is transferred to the computer and displayed";
+Blockly.Msg.v831_internet_transmission_setup_show = "Display the captured camera images on the web";
+Blockly.Msg.ai_models_init_card_model = "License plate recognition model";
+Blockly.Msg.ai_models_init_card_result = "License plate result";
+Blockly.Msg.ai_models_card_if_true = "License plate detected";
+Blockly.Msg.ai_models_card_attribute = "Detected license plate attribute";
+Blockly.Msg.ai_models_card_model_get = "Get the detection of the license plate";
 
 Blockly.Msg.ai_models_customized_init_type_set = "Set Recognition Mode:";
 Blockly.Msg.ai_models_customized_init_type_set_fast = "Single Face (Fast)";
@@ -4763,11 +4782,12 @@ Blockly.Msg.v831_face_recognition_load = "Load face recognition model, ";
 Blockly.Msg.v831_face_recognition_load_title = "Load the face model and set the image source to be detected ";
 Blockly.Msg.v831_setting_face_data_save = "Sets face data to save: ";
 Blockly.Msg.v831_setting_face_data_save_title = "Set face data to save ";
-Blockly.Msg.v831_setting_face_data_remove = "Delete last saved face data: ";
+Blockly.Msg.v831_setting_face_data_remove = "Delete last saved face data";
 Blockly.Msg.v831_setting_face_data_remove_title = "Delete last saved face data ";
 Blockly.Msg.v831_face_recognition_result = "Image source recognition result: ";
 Blockly.Msg.v831_face_recognition_result_title = "Image source recognition Result ";
 Blockly.Msg.v831_model_face_name = "Name of face";
+Blockly.Msg.v831_models_face_model_confidence = "Confidence (face recognition)";
 
 Blockly.Msg.ai_model_class_setup = "Customized Object Recognition";
 Blockly.Msg.ai_class_model = "Initialize custom object feature extraction model";
@@ -4809,6 +4829,7 @@ Blockly.Msg.ai_models_get_edge_detection_result = "Get the edge detection model
 
 Blockly.Msg.ai_model_self_learning_init = "Initializing self-learning classification model";
 Blockly.Msg.ai_model_self_learning_load = "Load self-learning classification model";
+Blockly.Msg.ai_model_self_learning_recognize_load = "Load the self-learning classification recognition model";
 Blockly.Msg.ai_model_self_learning_add_class_category = "Add Category category";
 Blockly.Msg.ai_model_self_learning_make_data_set = "Data set for making model training";
 Blockly.Msg.ai_model_self_learning_picture = "picture self-learning";
@@ -4877,7 +4898,7 @@ Blockly.Msg.third_party_hcsr04_setup_title = "Setup HCSR-04 Ultrasonic Sensor";
 Blockly.Msg.third_party_hcsr04_trig_pin = "Set Trig Pin: GPIO #";
 Blockly.Msg.third_party_hcsr04_echo_pin = ", Set Echo Pin: GPIO #";
 Blockly.Msg.third_party_hcsr04_read_text = "Read Distance (Unit: CM) from Ultrasonic Sensor";
-Blockly.Msg.third_party_hcsr04_read_text_after = "";
+Blockly.Msg.third_party_hcsr04_read_text_after = "Distance Detection Value (Unit: centimetres)";
 Blockly.Msg.Set_Auto_Wrap = "Set Auto Wrap";
 
 
@@ -4907,7 +4928,7 @@ Blockly.Msg.esp32_ble_set_name_limit = " (Must be shorter than 9 characters)";
 
 Blockly.Msg.text_additional_delimiter_string = "Split string to a list";
 Blockly.Msg.text_additional_delimiter_deli = "by delimiter:";
-Blockly.Msg.text_additional_delimiter_end = "";
+Blockly.Msg.text_additional_delimiter_end = "Split and generate a list";
 
 
 /* mlx90614 */
@@ -5016,7 +5037,7 @@ Blockly.Msg.robot_dog_servo_movement_rotate_still1 = "axis rotation to";
 Blockly.Msg.robot_dog_servo_movement_rotate_still2 = "(-128~127)";
 Blockly.Msg.robot_dog_servo_movement_distance_still_cycle = "Set the robot dog to cycle";
 Blockly.Msg.robot_dog_servo_movement_distance_still_cycle_1 = "s (1.5s~8s) translation to";
-Blockly.Msg.robot_dog_servo_movement_distance_still_cycle_2 = "";
+Blockly.Msg.robot_dog_servo_movement_distance_still_cycle_2 = "Bi-directional translation";
 Blockly.Msg.robot_dog_servo_movement_rotate_still_cycle = "s (1.5s~8s) around";
 Blockly.Msg.robot_dog_servo_movement_rotate_still_cycle_1 = "axis rotation";
 Blockly.Msg.robot_dog_servo_movement_distance_still_cycle_stop = "Stop the cycle translation of the robot dog towards";
@@ -5143,7 +5164,7 @@ Blockly.Msg.WeTech_controll_action_0 = "Off";
 Blockly.Msg.WeTech_controll_action_1 = "On";
 Blockly.Msg.WeTech_controll_action_2 = "Stop";
 Blockly.Msg.wifiServices_WeTech_get_gateway_device_id_list_title = "get the device Id of a specific gateway id";
-Blockly.Msg.WIFIEASYMODE_WeTech_KEY4 = "";
+Blockly.Msg.WIFIEASYMODE_WeTech_KEY4 = "device ID";
 Blockly.Msg.WIFIEASYMODE_WeTech_KEY5 = "named ";
 Blockly.Msg.WIFIEASYMODE_WeTech_KEY6 = "Controlled Three Way Lamp Surface System Id";
 Blockly.Msg.WIFIEASYMODE_WeTech_KEY7 = "Gateway Id";
@@ -5202,15 +5223,15 @@ Blockly.Msg.iot_service_tuya_controll_light_belt_color_value_title = "Control th
 Blockly.Msg.iot_service_tuya_controll_light_belt_color_value_title1 = "Color to";
 
 // turtle 
-Blockly.Msg.TURTLE_CREATE_NE_TURTLE="create new turtle";
-Blockly.Msg.TURTLE_MAKE_TURTLE_MOVE_FORWARD_BY="make turtle move forward by";
-Blockly.Msg.TURTLE_MAKE_TURTLE_MOVE_BACKWARD_BY="make turtle move backward by";
-Blockly.Msg.TURTLE_MAKE_TURN_LEFT_BY="make turtle turn left by";
-Blockly.Msg.TURTLE_DEGREE="degree";
-Blockly.Msg.TURTLE_MAKE_TURN_RIGHT_BY="make turtle turn right by";
-Blockly.Msg.TURTLE_MAKE_TURRLE_COLOR="make turtle color";
-Blockly.Msg.TURTLE_MAKE_TURRLE_PEN="make turtle pen";
-Blockly.Msg.TURTLE_MAKE_TURTLE_GOTO_LOCATION_X="make turtle goto location X:";
+Blockly.Msg.TURTLE_CREATE_NE_TURTLE = "create new turtle";
+Blockly.Msg.TURTLE_MAKE_TURTLE_MOVE_FORWARD_BY = "make turtle move forward by";
+Blockly.Msg.TURTLE_MAKE_TURTLE_MOVE_BACKWARD_BY = "make turtle move backward by";
+Blockly.Msg.TURTLE_MAKE_TURN_LEFT_BY = "make turtle turn left by";
+Blockly.Msg.TURTLE_DEGREE = "degree";
+Blockly.Msg.TURTLE_MAKE_TURN_RIGHT_BY = "make turtle turn right by";
+Blockly.Msg.TURTLE_MAKE_TURRLE_COLOR = "make turtle color";
+Blockly.Msg.TURTLE_MAKE_TURRLE_PEN = "make turtle pen";
+Blockly.Msg.TURTLE_MAKE_TURTLE_GOTO_LOCATION_X = "make turtle goto location X:";
 Blockly.Msg.TURTLE_MAKE_TURTLE_SET_POSITION = "Set the position of the turtle brush to X:";
 Blockly.Msg.TURTLE_MAKE_SET_HEADING = "Let the turtle spin to";
 Blockly.Msg.TURTLE_RESET = "Reset the position of the brush";
@@ -5292,6 +5313,8 @@ Blockly.Msg.gesture_init = "Gesture recognition initialization ";
 Blockly.Msg.emotion_result = "emotion recognition result ";
 Blockly.Msg.emotion_load = "Emotional recognition load ";
 Blockly.Msg.emotion_init = "Emotion recognition initialization ";
+Blockly.Msg.set_dictionary = "Set dictionary";
+Blockly.Msg.dictionary_contain = "Dictionary contains()age、emotion、gender、expression)";
 Blockly.Msg.emotion_result_age = "Age ";
 Blockly.Msg.emotion_result_emotion = "Emotion ";
 Blockly.Msg.emotion_result_gender = "Gender ";

+ 30 - 6
src/renderer/cocoblockly-x/blockly/msg/js/zh-hans.js

@@ -3244,6 +3244,9 @@ Blockly.Msg.ESP32_READ = "获取触摸区域";
 Blockly.Msg.ESP32_READ_VALUE = "的电容变化数值";
 Blockly.Msg.ESP32_ENV_GET_TEXT = "获取";
 
+Blockly.Msg.esp32_main_controller_turn_off_buzzer_music_lite = "蜂鸣器播放音符";
+Blockly.Msg.esp32_main_controller_turn_off_buzzer_music_lite_2 = "持续";
+Blockly.Msg.esp32_main_controller_turn_off_buzzer_music_lite_3 = "拍";
 
 Blockly.Msg.LCDINIT = "LCD初始化"
 Blockly.Msg.LCDINIT_R = "设置屏幕旋转"
@@ -3597,7 +3600,7 @@ Blockly.Msg.serialcomm_read_setup_title_text = "通过串口获取数据";
 Blockly.Msg.serialcomm_read_setup_title_text_1 = "初始化";
 Blockly.Msg.serial_read_data = "从";
 Blockly.Msg.Serial_Read_Data_all = "获取到的串口数据";
-Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_GET_TEXT = "获取接收串口数据中第";
+Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_GET_TEXT = "获取接收一代和二代串口数据中第";
 Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_TYPE_TEXT = "位的数据";
 Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_TYPE_FLOAT = "浮点数";
 Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_TYPE_INTEGER = "Number";  // untranslated
@@ -3612,6 +3615,7 @@ Blockly.Msg.serialcomm_write_on = "使用";
 Blockly.Msg.serialcomm_write_on_ai = "AI 模块 ";
 Blockly.Msg.serialcomm_write_on_iot = "IoT 模块";
 Blockly.Msg.serial_send_data_on = "在";
+Blockly.Msg.serial_send_data_on_send_data_cocorobo = "CocoPi 发送数据至一代和二代"
 Blockly.Msg.serial_send_data_on_send_data = "CocoPi 发送数据至 Micro:bit"
 Blockly.Msg.serial_send_data_on_send_data_control_panel = "CocoPi 发送数据至掌控板"
 
@@ -3631,6 +3635,7 @@ Blockly.Msg.serial_send_data_on_send_data_control_panel = "CocoPi 发送数据
 Blockly.Msg.basic_button_read_value = "读取按钮";
 Blockly.Msg.basic_button_read_value_after = "的电平状态";
 
+Blockly.Msg.basic_buzzer_set_init = "蜂鸣器初始化,并设置引脚为:";
 Blockly.Msg.basic_buzzer_set = "蜂鸣器设置音调频率为 (Hz):";
 Blockly.Msg.basic_temperature = "温度";
 Blockly.Msg.basic_humidity = "湿度";
@@ -4380,6 +4385,8 @@ Blockly.Msg.ai_vision_color_analyze_get_result = "中指定区域的颜色分析
 Blockly.Msg.ai_vision_color_analyze_start_coord = "设置分析区域的起始坐标:";
 Blockly.Msg.ai_vision_color_analyze_size = "设置分析区域的尺寸:";
 Blockly.Msg.ai_vision_find_blobs_color_region = "寻找指定的颜色色块";
+Blockly.Msg.ai_vision_find_lines_color_region = "寻找指定的颜色线";
+Blockly.Msg.ai_vision_find_lines_color_region_result = "获取寻找到线的结果";
 Blockly.Msg.ai_vision_find_blobs_color_threshold = "设置要追踪的颜色阈值:";
 Blockly.Msg.ai_vision_find_blobs_start_coord = "设置检测区域的起始坐标:";
 Blockly.Msg.ai_vision_find_blobs_size = "设置检测区域的尺寸:";
@@ -4389,8 +4396,8 @@ Blockly.Msg.ai_vision_find_blobs_filtered_region = "是否合并所有没有被
 Blockly.Msg.ai_vision_get_blobs_result = "获取追踪指定颜色的识别结果";
 Blockly.Msg.ai_vision_detection_box_x = "检测框起点 X 轴坐标";
 Blockly.Msg.ai_vision_detection_box_y = "检测框起点 Y 轴坐标";
-Blockly.Msg.ai_vision_detection_box_width = "检测框终点 X 轴坐标";
-Blockly.Msg.ai_vision_detection_box_height = "检测框终点 Y 轴坐标";
+Blockly.Msg.ai_vision_detection_box_width = "检测框宽度";
+Blockly.Msg.ai_vision_detection_box_height = "检测框高度";
 Blockly.Msg.ai_vision_detection_box_pixels = "属于色块一部分的像素数量";
 Blockly.Msg.ai_vision_detection_box_cx = "检测框的中心点 X 轴坐标";
 Blockly.Msg.ai_vision_detection_box_cy = "检测框的中心点 Y 轴坐标";
@@ -4421,6 +4428,7 @@ Blockly.Msg.ai_vision_pattern_detection_x = "边界框的 X 轴坐标";
 Blockly.Msg.ai_vision_pattern_detection_y = "边界框的 Y 轴坐标";
 Blockly.Msg.ai_vision_pattern_detection_w = "边界框的宽度";
 Blockly.Msg.ai_vision_pattern_detection_h = "边界框的高度";
+Blockly.Msg.ai_vision_pattern_distance = "距离";
 Blockly.Msg.ai_vision_pattern_detection_type_id = "数字 ID";
 Blockly.Msg.ai_vision_pattern_detection_type_family = "数字家庭";
 Blockly.Msg.ai_vision_pattern_detection_rows = "行数";
@@ -4607,6 +4615,8 @@ Blockly.Msg.ai_video_stop_video_playing = "结束视频文件播放";
 Blockly.Msg.ai_video_get_video_playing_status = "获取视频播放的状态";
 Blockly.Msg.ai_video_recording_and_save = "录制视频文件并保存";
 Blockly.Msg.ai_video_set_play = "视频文件播放";
+Blockly.Msg.ai_video_set_play_stats = "视频属性";
+Blockly.Msg.ai_video_set_play_init = "视频初始化";
 
 
 /*
@@ -4657,14 +4667,22 @@ Blockly.Msg.ai_models_face_model_x = "检测框起点 X轴坐标";
 Blockly.Msg.ai_models_face_model_y = "检测框起点 Y轴坐标";
 Blockly.Msg.ai_models_face_model_w = "检测框终点 X轴坐标";
 Blockly.Msg.ai_models_face_model_h = "检测框终点 Y轴坐标";
+Blockly.Msg.ai_models_face_model_ws = "检测框的宽度";
+Blockly.Msg.ai_models_face_model_hs = "检测框的高度";
 Blockly.Msg.ai_models_face_model_rect = "检测框";
 Blockly.Msg.ai_models_face_model_count = "数量";
 Blockly.Msg.ai_models_face_model_index = "出现顺序";
 Blockly.Msg.ai_models_face_model_confidence = "置信度";
+Blockly.Msg.ai_models_face_model_confidence_1 = "置信度(人脸检测)";
 Blockly.Msg.ai_model_human_attribute = "人体属性";
 Blockly.Msg.ai_models_human_model_if = "检测到人体";
 Blockly.Msg.ai_models_human_model_get = "获取检测到的人体的";
 Blockly.Msg.ai_models_init_humane_model = "人体检测模型";
+Blockly.Msg.ai_models_init_card_model = "车牌识别模型";
+Blockly.Msg.ai_models_init_card_result = "车牌结果";
+Blockly.Msg.ai_models_card_if_true = "检测到车牌";
+Blockly.Msg.ai_models_card_attribute = "检测到的车牌属性";
+Blockly.Msg.ai_models_card_model_get = "获取检测到车牌的";
 
 Blockly.Msg.ai_model_customized_init_setup_definition = "加载自定义模型前的设置";
 Blockly.Msg.ai_models_customized_init_setup_title = "自定义模型 (TinyYOLOv2)";
@@ -4673,6 +4691,8 @@ Blockly.Msg.ai_models_customized_init_setup_path = "模型文件路径:";
 Blockly.Msg.ai_models_customized_init_setup_source = "设置要识别的图像源为:";
 Blockly.Msg.v831_transmission_init_setup_source = "设置要传输的图像源为:";
 Blockly.Msg.v831_transmission_setup_show = "将捕捉的相机图像传输到电脑并显示";
+Blockly.Msg.v831_internet_transmission_setup_show = "将捕捉的相机图像在网页显示";
+
 
 Blockly.Msg.ai_models_customized_init_type_set = "设置识别模式:";
 Blockly.Msg.ai_models_customized_init_type_set_fast = "识别单张人脸(速度快)";
@@ -4717,11 +4737,12 @@ Blockly.Msg.v831_face_recognition_load = "加载人脸识别模型,";
 Blockly.Msg.v831_face_recognition_load_title = "加载人脸模型,并设置要检测的图像源";
 Blockly.Msg.v831_setting_face_data_save = "设置要保存的人脸数据:";
 Blockly.Msg.v831_setting_face_data_save_title = "设置要保存的人脸数据";
-Blockly.Msg.v831_setting_face_data_remove = "删除最后一次保存的人脸数据";
+Blockly.Msg.v831_setting_face_data_remove = "删除最后一次保存的人脸数据";
 Blockly.Msg.v831_setting_face_data_remove_title = "删除最后一次保存的人脸数据";
 Blockly.Msg.v831_face_recognition_result = "图像源识别结果:";
 Blockly.Msg.v831_face_recognition_result_title = "图像源识别结果";
 Blockly.Msg.v831_model_face_name = "人脸的名称";
+Blockly.Msg.v831_models_face_model_confidence = "置信度(人脸识别)";
 
 Blockly.Msg.ai_model_class_setup = "自定义物体识别";
 Blockly.Msg.ai_class_model = "初始化自定义物体特征提取模型";
@@ -4741,8 +4762,8 @@ Blockly.Msg.ai_model_class_name = "设置模型识别物体的名称";
 Blockly.Msg.ai_model_getface = "识别到了人脸模型的对象";
 Blockly.Msg.ai_model_getclass = "识别到了物体模型的对象";
 Blockly.Msg.face_information = "人脸信息";
-Blockly.Msg.ai_models_object_model_x_center = "检测框中心点的 X 轴坐标";
-Blockly.Msg.ai_models_object_model_y_center = "检测框中心点的 Y 轴坐标";
+Blockly.Msg.ai_models_object_model_x_center = "检测框中心点的X轴坐标";
+Blockly.Msg.ai_models_object_model_y_center = "检测框中心点的Y轴坐标";
 Blockly.Msg.ai_models_face_model_x_center = "检测框中心点的 X 轴坐标";
 Blockly.Msg.ai_models_face_model_y_center = "检测框中心点的 Y 轴坐标";
 Blockly.Msg.ai_models_customized_get_result_x_center = "检测框中心点的 X 轴坐标";
@@ -4754,6 +4775,7 @@ Blockly.Msg.ai_models_get_edge_detection_result = "获取边缘检测模型结
 
 Blockly.Msg.ai_model_self_learning_init = "初始化自学习分类模型";
 Blockly.Msg.ai_model_self_learning_load = "加载自学习分类模型";
+Blockly.Msg.ai_model_self_learning_recognize_load = "加载自学习分类识别模型";
 Blockly.Msg.ai_model_self_learning_add_class_category = "添加分类类别";
 Blockly.Msg.ai_model_self_learning_make_data_set = "制作模型训练的数据集";
 Blockly.Msg.ai_model_self_learning_picture = "进行图片自学习";
@@ -5241,6 +5263,8 @@ Blockly.Msg.gesture_init = "手势识别初始化";
 Blockly.Msg.emotion_result = "情绪识别结果";
 Blockly.Msg.emotion_load = "情绪识别加载";
 Blockly.Msg.emotion_init = "情绪识别初始化";
+Blockly.Msg.set_dictionary = "设定字典";
+Blockly.Msg.dictionary_contain = "字典包含(age、emotion、gender、expression)";
 Blockly.Msg.emotion_result_age = "年龄";
 Blockly.Msg.emotion_result_emotion = "情绪";
 Blockly.Msg.emotion_result_gender = "性别";

+ 32 - 9
src/renderer/cocoblockly-x/blockly/msg/js/zh-hant.js

@@ -3730,6 +3730,9 @@ Blockly.Msg.ESP32_UNTOUCHED = "未被觸摸時";
 Blockly.Msg.ESP32_READ = "獲取觸摸區域";
 Blockly.Msg.ESP32_READ_VALUE = "的電容變化數值";
 Blockly.Msg.ESP32_ENV_GET_TEXT = "獲取";
+Blockly.Msg.esp32_main_controller_turn_off_buzzer_music_lite = "蜂鳴器播放音符";
+Blockly.Msg.esp32_main_controller_turn_off_buzzer_music_lite_2 = "持續";
+Blockly.Msg.esp32_main_controller_turn_off_buzzer_music_lite_3 = "拍";
 
 
 
@@ -4069,7 +4072,7 @@ Blockly.Msg.serialcomm_read_setup_title_text = "透過序列埠獲取數據";
 Blockly.Msg.serialcomm_read_setup_title_text_1 = "初始化";
 Blockly.Msg.serial_read_data = "從";
 Blockly.Msg.Serial_Read_Data_all = "獲取到的串口數據";
-Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_GET_TEXT = "獲取接收到串列埠數據中第";
+Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_GET_TEXT = "獲取接收到一代和二代串列埠數據中第";
 Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_TYPE_TEXT = "位的數據";
 Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_TYPE_FLOAT = "浮點數";
 Blockly.Msg.ARD_SERIAL_RECEIVE_DATASET_TYPE_INTEGER = "Number";  // untranslated
@@ -4084,8 +4087,9 @@ Blockly.Msg.serialcomm_write_on = "使用";
 Blockly.Msg.serialcomm_write_on_ai = "AI 模組 ";
 Blockly.Msg.serialcomm_write_on_iot = "IoT 模組";
 Blockly.Msg.serial_send_data_on = "在";
-Blockly.Msg.serial_send_data_on_send_data = "CocoPi 上載數據至 Micro:bit"
-Blockly.Msg.serial_send_data_on_send_data_control_panel = "CocoPi 发送数据至掌控板"
+Blockly.Msg.serial_send_data_on_send_data_cocorobo = "CocoPi 發送數據至一代和二代"
+Blockly.Msg.serial_send_data_on_send_data = "CocoPi 載送數據至 Micro:bit"
+Blockly.Msg.serial_send_data_on_send_data_control_panel = "CocoPi 發送數據至掌控版"
 
 
 /*
@@ -4100,6 +4104,7 @@ Blockly.Msg.serial_send_data_on_send_data_control_panel = "CocoPi 发送数据
 Blockly.Msg.basic_button_read_value = "讀取按鈕";
 Blockly.Msg.basic_button_read_value_after = "的電平狀態";
 
+Blockly.Msg.basic_buzzer_set_init = "蜂鳴器初始化,並設置引腳爲:";
 Blockly.Msg.basic_buzzer_set = "蜂鳴器設定音調頻率爲 (Hz):";
 Blockly.Msg.basic_temperature = "溫度";
 Blockly.Msg.basic_humidity = "濕度";
@@ -4848,6 +4853,8 @@ Blockly.Msg.ai_vision_color_analyze_get_result = "中指定區域的顏色分析
 Blockly.Msg.ai_vision_color_analyze_start_coord = "設定分析區域的起始座標:";
 Blockly.Msg.ai_vision_color_analyze_size = "設定分析區域的尺寸:";
 Blockly.Msg.ai_vision_find_blobs_color_region = "尋找指定的顏色色塊";
+Blockly.Msg.ai_vision_find_lines_color_region = "尋找指定的顏色綫";
+Blockly.Msg.ai_vision_find_lines_color_region_result = "獲取尋找綫的結果";
 Blockly.Msg.ai_vision_find_blobs_color_threshold = "設定要追蹤的顏色閾值:";
 Blockly.Msg.ai_vision_find_blobs_start_coord = "設定檢測區域的起始座標:";
 Blockly.Msg.ai_vision_find_blobs_size = "設定檢測區域的尺寸:";
@@ -4857,8 +4864,8 @@ Blockly.Msg.ai_vision_find_blobs_filtered_region = "是否合併所有沒有被
 Blockly.Msg.ai_vision_get_blobs_result = "獲取追蹤指定顏色的識別結果";
 Blockly.Msg.ai_vision_detection_box_x = "檢測框起點 X 軸座標";
 Blockly.Msg.ai_vision_detection_box_y = "檢測框起點 Y 軸座標";
-Blockly.Msg.ai_vision_detection_box_width = "檢測框終點 X 軸座標";
-Blockly.Msg.ai_vision_detection_box_height = "檢測框終點 Y 軸座標";
+Blockly.Msg.ai_vision_detection_box_width = "檢測框寬度";
+Blockly.Msg.ai_vision_detection_box_height = "檢測框高度";
 Blockly.Msg.ai_vision_detection_box_pixels = "屬於色塊一部分的畫素數量";
 Blockly.Msg.ai_vision_detection_box_cx = "檢測框的中心點 X 軸座標";
 Blockly.Msg.ai_vision_detection_box_cy = "檢測框的中心點 Y 軸座標";
@@ -4889,6 +4896,7 @@ Blockly.Msg.ai_vision_pattern_detection_x = "邊界框的 X 軸座標";
 Blockly.Msg.ai_vision_pattern_detection_y = "邊界框的 Y 軸座標";
 Blockly.Msg.ai_vision_pattern_detection_w = "邊界框的寬度";
 Blockly.Msg.ai_vision_pattern_detection_h = "邊界框的高度";
+Blockly.Msg.ai_vision_pattern_distance = "距離";
 Blockly.Msg.ai_vision_pattern_detection_type_id = "數字 ID";
 Blockly.Msg.ai_vision_pattern_detection_type_family = "數字家庭";
 Blockly.Msg.ai_vision_pattern_detection_rows = "欄數";
@@ -5076,6 +5084,8 @@ Blockly.Msg.ai_video_stop_video_playing = "結束影片檔案播放";
 Blockly.Msg.ai_video_get_video_playing_status = "獲取影片播放的狀態";
 Blockly.Msg.ai_video_recording_and_save = "錄製影片檔案並保存";
 Blockly.Msg.ai_video_set_play = "影片檔案播放";
+Blockly.Msg.ai_video_set_play_stats = "視頻屬性";
+Blockly.Msg.ai_video_set_play_init = "視頻初始化";
 
 /*
      _    ___   __  __           _      _     
@@ -5125,14 +5135,22 @@ Blockly.Msg.ai_models_face_model_x = "檢測框起點 X 軸座標";
 Blockly.Msg.ai_models_face_model_y = "檢測框起點 Y 軸座標";
 Blockly.Msg.ai_models_face_model_w = "檢測框終點 X 軸座標";
 Blockly.Msg.ai_models_face_model_h = "檢測框終點 Y 軸座標";
+Blockly.Msg.ai_models_face_model_ws = "檢測框的寬度";
+Blockly.Msg.ai_models_face_model_hs = "檢測框的高度";
 Blockly.Msg.ai_models_face_model_rect = "檢測框";
 Blockly.Msg.ai_models_face_model_count = "數量";
 Blockly.Msg.ai_models_face_model_index = "出現順序";
 Blockly.Msg.ai_models_face_model_confidence = "可信度";
+Blockly.Msg.ai_models_face_model_confidence_1 = "可信度(人臉檢測)";
 Blockly.Msg.ai_model_human_attribute = "人體屬性";
 Blockly.Msg.ai_models_human_model_if = "檢測到人體";
 Blockly.Msg.ai_models_human_model_get = "獲取檢測到的人體的";
 Blockly.Msg.ai_models_init_humane_model = "人體檢測模型";
+Blockly.Msg.ai_models_init_card_model = "車牌識別模型";
+Blockly.Msg.ai_models_init_card_result = "車牌結果";
+Blockly.Msg.ai_models_card_if_true = "檢測到車牌";
+Blockly.Msg.ai_models_card_attribute = "檢測到的車牌屬性";
+Blockly.Msg.ai_models_card_model_get = "獲取檢測到車牌的";
 
 Blockly.Msg.ai_model_customized_init_setup_definition = "加載自定義模型前的設定";
 Blockly.Msg.ai_models_customized_init_setup_title = "客製化模型 (TinyYOLOv2)";
@@ -5141,6 +5159,7 @@ Blockly.Msg.ai_models_customized_init_setup_path = "模型文件路徑:";
 Blockly.Msg.ai_models_customized_init_setup_source = "設定要識別的圖像源爲:";
 Blockly.Msg.v831_transmission_init_setup_source = "設置要傳輸的圖像源爲:";
 Blockly.Msg.v831_transmission_setup_show = "將捕捉的相機圖像傳輸到電腦並顯示";
+Blockly.Msg.v831_internet_transmission_setup_show = "將捕捉的相機圖像在網頁顯示";
 
 Blockly.Msg.ai_models_customized_init_type_set = "設定識別模式:";
 Blockly.Msg.ai_models_customized_init_type_set_fast = "識別單張人臉(速度快)";
@@ -5148,7 +5167,7 @@ Blockly.Msg.ai_models_customized_init_type_set_slow = "識別多張人臉(速
 
 Blockly.Msg.ai_models_customized_init_setup_name = "設定模型識別物體的名稱:";
 Blockly.Msg.ai_models_customized_if_got = "識別到了客製化模型的物件";
-Blockly.Msg.ai_model_customized_attribute = "自定義模型對象屬性";
+Blockly.Msg.ai_model_customized_attribute = "客製化模型對象屬性";
 Blockly.Msg.ai_models_customized_get_result_any = "獲取識別到客製化模型結果的";
 Blockly.Msg.ai_models_customized_get_result_name = "名稱";
 Blockly.Msg.ai_models_customized_get_result_x = "檢測框起點 X 軸座標";
@@ -5186,11 +5205,12 @@ Blockly.Msg.v831_face_recognition_load = "加載人臉識別模型,";
 Blockly.Msg.v831_face_recognition_load_title = "加載人臉模型,並設置要檢測的圖像源";
 Blockly.Msg.v831_setting_face_data_save = "設置要保存的人臉數據:";
 Blockly.Msg.v831_setting_face_data_save_title = "設置要保存的人臉數據";
-Blockly.Msg.v831_setting_face_data_remove = "刪除最後一次保存的人臉數據";
+Blockly.Msg.v831_setting_face_data_remove = "刪除最後一次保存的人臉數據";
 Blockly.Msg.v831_setting_face_data_remove_title = "刪除最後一次保存的人臉數據";
 Blockly.Msg.v831_face_recognition_result = "圖像源識別結果:";
 Blockly.Msg.v831_face_recognition_result_title = "圖像源識別結果";
 Blockly.Msg.v831_model_face_name = "人臉的名稱";
+Blockly.Msg.v831_models_face_model_confidence = "可信度(人臉識別)";
 
 Blockly.Msg.ai_model_class_setup = "自定義物體識別";
 Blockly.Msg.ai_class_model = "初始化自定義物體特徵提取模型";
@@ -5211,8 +5231,8 @@ Blockly.Msg.ai_model_getface = "識別到了人臉模型的對象";
 Blockly.Msg.ai_model_getclass = "識別到了物体模型的對象";
 Blockly.Msg.face_information = "人臉信息";
 
-Blockly.Msg.ai_models_object_model_x_center = "檢測框中心點的 X 軸座標";
-Blockly.Msg.ai_models_object_model_y_center = "檢測框中心點的 Y 軸座標";
+Blockly.Msg.ai_models_object_model_x_center = "檢測框中心點的X軸座標";
+Blockly.Msg.ai_models_object_model_y_center = "檢測框中心點的Y軸座標";
 Blockly.Msg.ai_models_face_model_x_center = "檢測框中心點的 X 軸座標";
 Blockly.Msg.ai_models_face_model_y_center = "檢測框中心點的 Y 軸座標";
 Blockly.Msg.ai_models_customized_get_result_x_center = "檢測框中心點的 X 軸座標";
@@ -5224,6 +5244,7 @@ Blockly.Msg.ai_models_get_edge_detection_result = "獲取邊緣檢測模型結
 
 Blockly.Msg.ai_model_self_learning_init = "初始化自我學習分類模型";
 Blockly.Msg.ai_model_self_learning_load = "加載自我學習分類模型";
+Blockly.Msg.ai_model_self_learning_recognize_load = "加載自我學習分類識別模型";
 Blockly.Msg.ai_model_self_learning_add_class_category = "添加分類類別";
 Blockly.Msg.ai_model_self_learning_make_data_set = "製作模型訓練的數據集";
 Blockly.Msg.ai_model_self_learning_picture = "進行圖片自我學習";
@@ -5706,6 +5727,8 @@ Blockly.Msg.gesture_init = "手勢識別初始化";
 Blockly.Msg.emotion_result = "情緒識別結果";
 Blockly.Msg.emotion_load = "情緒識別加載";
 Blockly.Msg.emotion_init = "情緒識別初始化";
+Blockly.Msg.set_dictionary = "設定字典";
+Blockly.Msg.dictionary_contain = "字典包含(age、emotion、gender、expression)";
 Blockly.Msg.emotion_result_age = "年齡";
 Blockly.Msg.emotion_result_emotion = "情緒";
 Blockly.Msg.emotion_result_gender = "性別";

+ 2 - 1
src/renderer/cocoblockly-x/cocoblockly.css

@@ -673,7 +673,8 @@ footer.page-footer {
     margin-bottom: 4px;
     overflow: hidden;
     text-overflow: ellipsis;
-    white-space: nowrap"
+    white-space: nowrap;
+    width: 100px;
 
 }
 

+ 5 - 5
src/renderer/cocoblockly-x/data.json

@@ -50,7 +50,7 @@
             "upload_instruction_tooltip": "Instruction for download and install Uploader",
             "icon_tool_1": "Arduino Code Area & Upload Area",
             "icon_tool_2": "Serial Monitor Area",
-            "icon_tool_3": "Full Screen Mode",
+            "icon_tool_3": "Python Mode",
             "icon_tool_4": "Language",
             "icon_tool_5": "CocoBlockly V Labs",
             "icon_tool_6": "Storage",
@@ -153,8 +153,8 @@
             "reset_main_UI": "Reset Main UI",
             "run_code": "Run",
             "select_device": "Select a device",
-            "select_connected_Wired": "Wired upload",
-            "select_connected_Wireless": "Wireless upload",
+            "select_connected_Wired": "Wired Upload",
+            "select_connected_Wireless": "Wireless Upload",
             "ipAddress": "Please enter IP address",
             "select_Basics": "Basics",
             "select_BCL": "Button-Controlled LED",
@@ -250,7 +250,7 @@
             "upload_instruction_tooltip": "上載軟件的下載和安裝指導",
             "icon_tool_1": "Arduino 代碼區域 & 上載區域",
             "icon_tool_2": "序列埠監控視窗區域",
-            "icon_tool_3": "全屏模式",
+            "icon_tool_3": "Python 模式",
             "icon_tool_4": "語言選擇",
             "icon_tool_5": "CocoBlockly V 實驗室",
             "icon_tool_6": "存儲",
@@ -432,7 +432,7 @@
             "upload_instruction_tooltip": "上传软件的下载和安装指导",
             "icon_tool_1": "Arduino 代码区域 & 上传区域",
             "icon_tool_2": "串口调试窗口区域",
-            "icon_tool_3": "全屏模式",
+            "icon_tool_3": "Python 模式",
             "icon_tool_4": "语言选择",
             "icon_tool_5": "CocoBlockly V 实验室",
             "icon_tool_6": "存储",

+ 1 - 0
src/renderer/cocoblockly-x/index.css

@@ -248,6 +248,7 @@ body>.shadowbox {
     padding-left: 0px;
     border-left: 8px solid rgb(126, 60, 202);
     color: #fff;
+    background-color: rgb(49, 99, 237);
 }
 
 .blocklyTreeRow {

+ 62 - 36
src/renderer/cocoblockly-x/index.html

@@ -25,7 +25,7 @@
 
     <script type="text/javascript" src="uform.js"></script>
     <script type="text/javascript" src="js_libs/jquery-2.1.3.min.js"></script>
-    <script type="text/javascript" src="js_libs/qrcode.min.js"></script>
+    <!-- <script type="text/javascript" src="js_libs/qrcode.min.js"></script> -->
     <script type="text/javascript" src="libs/jquery-ui.min.js"></script>
     <script type="text/javascript" src="libs/jquery.hotkeys.js"></script>
     <script type="text/javascript" src="libs/jquery.multi-select.js"></script>
@@ -90,8 +90,8 @@
     <script type="text/javascript" src="src/blockly/load.js"></script>
     <script type="text/javascript" src="src/blockly/Devices.js"></script>
     <!-- Skulpt -->
-    <script type="text/javascript" src="skulpt/dist/skulpt.min.js"></script>
-    <script type="text/javascript" src="skulpt/dist/skulpt-stdlib.js"></script>
+    <!-- <script type="text/javascript" src="skulpt/dist/skulpt.min.js"></script>
+    <script type="text/javascript" src="skulpt/dist/skulpt-stdlib.js"></script> -->
     <!-- Source Code -->
     <script type="text/javascript" src="src/utilities.js"></script>
     <script type="text/javascript" src="src/python_errors.js"></script>
@@ -124,9 +124,9 @@
     <!-- Lazyload JS -->
     <script src="src/lazysize/lazysizes.min.js"></script>
     <!-- Socket.io -->
-    <script src="src/socket.io-client/dist/socket.io.js"></script>
+    <!-- <script src="src/socket.io-client/dist/socket.io.js"></script> -->
     <!-- clipboard -->
-    <script src="src/clipboard/dist/clipboard.js"></script>
+    <!-- <script src="src/clipboard/dist/clipboard.js"></script> -->
     <!-- Event Proxy -->
     <script type="text/javascript" src="src/blockly/eventproxy.js"></script>
     <!-- jQuery and Materialize JS -->
@@ -153,7 +153,6 @@
     <script src="src/blockly/machine.js"></script>
     <script type="text/javascript" src="./libs/clipboard.min.js"></script>
     <script type="text/javascript" src="./index.js"></script>
-    <script src="./webadb.js"></script>
 </head>
 
 <body>
@@ -723,8 +722,7 @@
                             <img class="left nav-icon" src="./icons/local_storage.png">
                         </a>
                         <ul id='local_saveOrOpen' class='dropdown-content' style="top:62px">
-                            <li id="button_cloud" class='modal-trigger' href="#cloud_storage_modal"
-                                style="display:none">
+                            <li style="display: none;" id="button_cloud" class='modal-trigger' href="#cloud_storage_modal">
                                 <span class="translatable_cloud_storage">Cloud</span>
                             </li>
                             <li class="divider"></li>
@@ -756,7 +754,7 @@
                             <img class="left nav-icon" src="./icons/language2.png">
                         </a>
                         <ul id='languages' class='dropdown-content active'>
-                            <li style="display: none;" onclick="changeLanguage('en')">
+                            <li onclick="changeLanguage('en')">
                                 <a>English</a>
                             </li>
                             <li class="divider"></li>
@@ -901,7 +899,7 @@
                                         <div style="width: 100%;height: calc(100% - 30px);display: none;overflow-y: auto;background: rgb(255, 255, 255);position: relative;"
                                             id="image_transmission">
                                             <!-- <img id="image_transmission_canvas" style="width:100%;"> -->
-                                            <canvas id="image_transmission_canvas" style="width:100%;height:100%">
+                                            <canvas id="image_transmission_canvas" style="width:100%;aspect-ratio: 4 / 3;">
                                         </div>
                                     </div>
                                 </div>
@@ -975,6 +973,8 @@
                                             <span id="status_bar">
                                                 <span id="status_txt"
                                                     class="translatable_statusNotConn">模块已断开,请重新连接。</span>
+                                                <!-- <span id="operation_status"
+                                                    class="">执行成功</span> -->
                                             </span>
                                         </div>
                                     </div>
@@ -1204,7 +1204,7 @@
                                                     waves-effect waves-green btn-flat">Close</a> </div>
                 </div>
             </div>
-            <ul id="icon-tool" class="card-icon-area">
+            <ul id="icon-tool" class="card-icon-area" style="display: none;">
                 <li style=" display:none" class="card-icon active hidden" onclick="changeSideCard('code')">
                     <i class="material-icons media">build</i>
                 </li>
@@ -1299,9 +1299,8 @@
                             style="margin-left:5px;cursor: pointer;position: relative;top: 7px;">message</i>
                     </span>
                     <span>
-                        <a id="help" target="_blank" href="./CocoPi.docx" style="position:relative"
-                            download="CocoPi 帮助文档">
-
+                        <a id="help" target="_blank" href="./CocoPi.docx" style="position:relative"  download="CocoPi 帮助文档">
+                            
                             <span class="translatable_help_board" style="color: #fff;">Help</span>
                             <!-- <img class="left nav-icon" src="./icons/nav_help.png" style="height: 20px;margin-top: 3px;"> -->
                         </a>
@@ -3214,7 +3213,7 @@
                                     <li class="container-top-noactive translatable_ExtendedFunction">媒体处理</li>
                                     <li class="container-top-noactive translatable_AI">AI 智能</li>
                                     <li class="container-top-noactive translatable_catIoTService">物联网</li>
-                                    <li class="container-top-noactive translatable_basis_system">系统</li>
+                                    <li class="container-top-noactive translatable_Expand">扩展</li>
                                 </ul>
                             </div>
                         </div>
@@ -3228,6 +3227,7 @@
                                     <li class="container-top-noactive arrow translatable_catCamera">摄像头</li>
                                     <li class="container-top-noactive arrow translatable_catSensor">传感器</li>
                                     <li class="container-top-noactive arrow translatable_serialcomm_print">串口打印</li>
+                                    <li class="container-top-noactive arrow translatable_catComms">串口通讯</li>
                                     <li class="container-top-noactive arrow translatable_basic_power">动力</li>
                                 </ul>
                             </div>
@@ -3254,7 +3254,7 @@
                             </div>
                             <div class="con" style="display: none; position: relative;">
                                 <ul style="display: flex;flex-direction: column;">
-                                    <li class="container-top-active translatable_System">系统</li>
+                                    <li class="container-top-active translatable_extended_use">系统</li>
                                 </ul>
                             </div>
                         </div>
@@ -3294,6 +3294,9 @@
                                 <li class="container-top-noactive" onclick="clickLoadingExample('屏幕/旋转指定角度.xml')">
                                     <div class="translatable_Angular_rotation">旋转指定角度</div>
                                 </li>
+                                <li class="container-top-noactive" onclick="clickLoadingExample('屏幕/小游戏:漫步者.xml')">
+                                    <div class="translatable_Rambler">小游戏:漫步者</div>
+                                </li>
                             </ul>
                         </div>
                         <div class="con" style="display: none; position: relative;">
@@ -3330,11 +3333,15 @@
                                 <li class="container-top-noactive" onclick="clickLoadingExample('输出Hello_world.xml')">
                                     <div class="translatable_print_hello_world">输出hello World</div>
                                 </li>
+                            </ul>
+                        </div>
+                        <div class="con" style="display: none; position: relative;">
+                            <ul style="display: flex;flex-direction: column;">
                                 <li class="container-top-noactive" onclick="clickLoadingExample('串口/串口发送数据至其他设备.xml')">
                                     <div class="translatable_serial_comm_fa">串口通信(发)</div>
                                 </li>
                                 <li class="container-top-noactive" onclick="clickLoadingExample('串口/uart_receive.xml')">
-                                    <div class="translatable_serial_comm">串口通信()</div>
+                                    <div class="translatable_serial_comm">串口通信()</div>
                                 </li>
                             </ul>
                         </div>
@@ -3354,11 +3361,21 @@
                                 <li class="container-top-noactive" onclick="clickLoadingExample('图像处理/区域颜色分析.xml')">
                                     <div class="translatable_area_color_analysis">区域颜色分析</div>
                                 </li>
-                                <ul style="display: flex;flex-direction: column;">
-                                    <li class="container-top-noactive" onclick="clickLoadingExample('图像处理/循线-单.xml')">
-                                        <div class="translatable_ai_tpl2">循线(单线)</div>
-                                    </li>
-                                </ul>
+                                <li class="container-top-noactive" onclick="clickLoadingExample('图像处理/循线-单.xml')">
+                                    <div class="translatable_ai_tpl2">循线(单线)</div>
+                                </li>
+                                <li class="container-top-noactive" onclick="clickLoadingExample('图像处理/二维码识别.xml')">
+                                    <div class="translatable_QR_code_recognition">二维码识别</div>
+                                </li>
+                                <li class="container-top-noactive" onclick="clickLoadingExample('图像处理/条形码识别.xml')">
+                                    <div class="translatable_bar_code">条形码识别</div>
+                                </li>
+                                <li class="container-top-noactive" onclick="clickLoadingExample('图像处理/寻找色块.xml')">
+                                    <div class="translatable_select_LFGC">寻找蓝色</div>
+                                </li>
+                                <li class="container-top-noactive" onclick="clickLoadingExample('图像处理/寻找蓝色并追踪.xml')">
+                                    <div class="translatable_select_FGAAT">寻找蓝色并追踪</div>
+                                </li>
                         </div>
                         <div class="con" style="display: none;position: relative;">
                             <ul style="display: flex;flex-direction: column;">
@@ -3410,6 +3427,9 @@
                                 <li class="container-top-noactive" onclick="clickLoadingExample('AI/自学习.xml')">
                                     <div class="translatable_self_learning">自学习分类</div>
                                 </li>
+                                <li class="container-top-noactive" onclick="clickLoadingExample('AI/自学习识别.xml')">
+                                    <div class="translatable_self_learning_recognize">自学习分类识别</div>
+                                </li>
                                 <li class="container-top-noactive" onclick="clickLoadingExample('AI/自定义训练识别.xml')">
                                     <div class="translatable_custom_training">自定义训练识别</div>
                                 </li>
@@ -3419,6 +3439,9 @@
                                 <li class="container-top-noactive" onclick="clickLoadingExample('AI/语音录制(识别).xml')">
                                     <div class="translatable_AI_speech_1">语音录制识别</div>
                                 </li>
+                                <li class="container-top-noactive" onclick="clickLoadingExample('AI/车牌识别.xml')">
+                                    <div class="translatable_basis_card_recognition">车牌识别</div>
+                                </li>
                             </ul>
                         </div>
                         <div class="con" style="display: none; position: relative;">
@@ -3474,12 +3497,15 @@
                         </div>
                         <div class="con" style="display: none; position: relative;">
                             <ul style="display: flex;flex-direction: column;">
-                                <!-- <li class="container-top-noactive" onclick="clickLoadingExample('讯飞/机器翻译.xml')">
-                                    <div class="translatable_machine_translation">机器翻译</div>
-                                </li>
-                                <li class="container-top-noactive" onclick="clickLoadingExample('讯飞/在线物体识别.xml')">
-                                    <div class="translatable_online_object_indetify">物体识别</div> -->
+                               <li class="container-top-noactive" onclick="clickLoadingExample('扩展/LED灯带.xml')">
+                                    <div class="translatable_catLEDStrip">LED灯带</div>
                                 </li>
+                                <li class="container-top-noactive" onclick="clickLoadingExample('扩展/呼吸灯.xml')">
+                                   <div class="translatable_BreathingLamp">呼吸灯</div>
+                               </li>
+                                 <!-- <li class="container-top-noactive" onclick="clickLoadingExample('讯飞/在线物体识别.xml')">
+                                    <div class="translatable_online_object_indetify">物体识别</div>
+                                </li> -->
                             </ul>
                         </div>
                     </div>
@@ -3802,9 +3828,8 @@
     </div>
     <div id="loadModal" class="modal loadModals_Example_modal modal_closes">
         <div class="modal-content update-new" style="display: block;height: 100%;">
-            <h4 class="select_load_title translatable_LoadingH4">最新更新及注意事项
-                <span class="updateTime"></span>
-            </h4>
+            <h4 style="display: inline-block;" class="select_load_title translatable_LoadingH4">最新更新及注意事项</h4>
+            <span class="updateTime" style="font-size: 2rem;font-weight: bold;">11</span>
             <span class="modal_close" style="padding: 5px;right: 15px;top: 10px;">
                 <i class="small material-icons" style="font-size: 1.5rem;"
                     onclick="$('#loadModal').modal('close')">close</i>
@@ -3815,11 +3840,12 @@
                     <h6 class="UpdateContent translatable_UpdateContent">更新内容</h6>
                     <ul class="updateConten">
                         <li>
-                            积木
+                            <span class="translatable_updateblock">积木</span>
                             <ul id="blockLis" class="updateContent">
                             </ul>
                         </li>
-                        <li>样例
+                        <li>
+                            <span class="translatable_updateexample">样例</span>
                             <ul id="exampleLis" class="updateContent">
                             </ul>
                         </li>
@@ -3834,13 +3860,13 @@
                 </div>
             </div>
             <div style="padding:1% 0;text-align: right;">
-                <span class="btn blue" onclick="switchUpdate('2')">历史更新</span>
+                <span class="btn blue translatable_HistoricalUpdate" onclick="switchUpdate('2')">历史更新</span>
             </div>
         </div>
         <div class="modal-content update-old" style="display: none;height: 100%;">
-            <h4 class="select_load_title translatable_LoadingH4">历史更新记录
-                <span class="updateTime"></span>
+            <h4 class="select_load_title translatable_LoadingH4history">历史更新记录
             </h4>
+            <span class="updateTime"></span>
             <span class="modal_close" style="padding: 5px;right: 15px;top: 10px;">
                 <i class="small material-icons" style="font-size: 1.5rem;"
                     onclick="$('#loadModal').modal('close')">close</i>
@@ -3861,7 +3887,7 @@
                 </div>
             </div>
             <div style="padding:1% 0;text-align: right;">
-                <span class="btn blue" onclick="switchUpdate('1')">最新更新</span>
+                <span class="btn blue translatable_LatestUpdate" onclick="switchUpdate('1')">最新更新</span>
             </div>
         </div>
     </div>

+ 378 - 211
src/renderer/cocoblockly-x/index.js

@@ -275,56 +275,81 @@ window.onload = async function () {
     )
   );
   // uploadpy
-  document.getElementById('uploadpy').onclick = function () {
-    window.file_manger_modal = false
-    $("#runCode").addClass('disabled')
-    $("#uploadpy").addClass('disabled')
-    $("#resetDevice").addClass('disabled')
-    $("#poweroff").addClass('disabled')
-    $("#backHome").addClass('disabled')
-    // 上传
-    $('.progress > .determinate').css('width', 10);
-    // 这么写是因为文件转换是异步任务
-    transToFile = async (blob, fileName, fileType) => {
-      return new window.File([blob], fileName, { type: fileType })
-    }
-
-    let text = pythonnewcode || Blockly.Python.workspaceToCode(blockpy.components.editor.blockly) || blockpy.components.editor.codeMirror.getValue()
-    // console.log(text)
-    // 开始上传
-    // function test(){
-    let blob = new Blob([text], { type: "text/plain;charset=utf-8" })
-
-    let textContain = transToFile(blob, "user_latest_code.py", "text/plain")
-    if (isWifiContent) {
-      sendWebsocket(text, 'upload')
-    } else {
-      // 转换完成后可以将file对象传给接口
-      textContain.then((res) => {
-        let file = res;
-        // window.stateapi.upload(file,"/root/")
-        $('.progress > .determinate').css('width', '50%');
-        setTimeout(() => {
-          if (file) {
-            $('.progress > .determinate').css('width', '100%');
-            document.getElementById('webadb_iframe').contentWindow.upload(file, "/root/")
-          } else {
-            $('.progress > .determinate').css('width', 0);
-          }
-          window.file_manger_modal = true
-          $("#runCode").removeClass('disabled')
-          $("#uploadpy").removeClass('disabled')
-          $("#resetDevice").removeClass('disabled')
-          $("#poweroff").removeClass('disabled')
-        }, 500)
-      })
-    }
-
-    // }
+  document.getElementById('uploadpy').onclick = async function () {
+    $('.progress > .determinate').css('width', 0);
+    setTimeout(() => {
+      window.file_manger_modal = false
+      $("#runCode").addClass('disabled')
+      $("#uploadpy").addClass('disabled')
+      $("#resetDevice").addClass('disabled')
+      $("#poweroff").addClass('disabled')
+      $("#backHome").addClass('disabled')
+      // 上传
+      let text = pythonnewcode || Blockly.Python.workspaceToCode(blockpy.components.editor.blockly) || blockpy.components.editor.codeMirror.getValue()
+      // 开始上传
+      let textContain = fileBlobLoad(text, "user_latest_code.py", "text/plain")
+      if (isWifiContent) {
+        sendWebsocket(text, 'upload')
+      } else {
+        // 转换完成后可以将file对象传给接口
+        textContain.then((res) => {
+          let file = res;
+          // window.stateapi.upload(file,"/root/")
+          $('.progress > .determinate').css('width', '50%');
+          $("#status_txt")[0].innerHTML = Ardublockly.LOCALISED_TEXT.InExecution + "50%"
+          setTimeout(() => {
+            if (file) {
+              document.getElementById('webadb_iframe').contentWindow.getdevice().device.subprocess.shell(`echo "" > /root/fileCfgTest`).then(r => {
+                setTimeout(function () {
+                  r.stdout.reader.read().then(m => {
+                    var str = Uint8ArrayToString(m.value);
+                    if (str.indexOf("Read-only file system") > -1) {
+                      document.getElementById('webadb_iframe').contentWindow.getdevice().device.subprocess.shell(`rm /root/user_latest_code.py`).then(s => {
+
+                        //错误处理
+                        document.getElementById('webadb_iframe').contentWindow.getdevice().device.subprocess.shell(`mount -o remount -rw /dev/mmcblk0p4`).then(r => {
+                          document.getElementById('webadb_iframe').contentWindow.upload(file, "/root/").then(s => {
+                            $('.progress > .determinate').css('width', '100%');
+                            $("#status_txt")[0].innerHTML = Ardublockly.LOCALISED_TEXT.ExecutedSuccessfully + "100%"
+                          })
+                        }).catch(err => {
+                          $('.progress > .determinate').css('width', 0);
+                          $("#status_txt")[0].innerHTML = Ardublockly.LOCALISED_TEXT.ExecutedFail
+                        })
+                      })
+                    }
+                    else {
+                      // 没有错误处理
+                      document.getElementById('webadb_iframe').contentWindow.upload(file, "/root/").then(s => {
+                        $('.progress > .determinate').css('width', '100%');
+                        $("#status_txt")[0].innerHTML = Ardublockly.LOCALISED_TEXT.ExecutedSuccessfully + "100%"
+                      })
+                    }
+                  }).catch(n => {
+                    console.log(n)
+                  })
+                }, 100)
+              }).catch(err => {
+                console.log(err)
+              })
+            } else {
+              $('.progress > .determinate').css('width', 0);
+              $("#status_txt")[0].innerHTML = Ardublockly.LOCALISED_TEXT.ExecutedFail
+            }
+            window.file_manger_modal = true
+            $("#runCode").removeClass('disabled')
+            $("#uploadpy").removeClass('disabled')
+            $("#resetDevice").removeClass('disabled')
+            $("#poweroff").removeClass('disabled')
+          }, 500)
+        })
+      }
+    }, 1000)
   }
   // runCode
   document.getElementById('runCode').onclick = async function () {
     window.file_manger_modal = false
+    autoContent = false
     $("#runCode").addClass('disabled')
     $("#uploadpy").addClass('disabled')
     $("#resetDevice").addClass('disabled')
@@ -332,44 +357,104 @@ window.onload = async function () {
     $("#backHome").addClass('disabled')
     $('.progress > .determinate').css('width', 0);
     $("#error-btn").css("display", "none")
-    transToFile = async (blob, fileName, fileType) => {
-      return new window.File([blob], fileName, { type: fileType })
-    }
     let text = pythonnewcode || Blockly.Python.workspaceToCode(blockpy.components.editor.blockly) || blockpy.components.editor.codeMirror.getValue()
-    let blob = new Blob([text], { type: "text/plain;charset=utf-8" })
+    let strText = `import os
+import sys
+import traceback
+import logging
 
-    //let textContain = 
-    let file = await transToFile(blob, "user_latest_code.py", "text/plain")
+logger = logging.getLogger()
+logger.setLevel(logging.INFO)
 
+file_handler = logging.FileHandler('/root/output.log')
+file_handler.setLevel(logging.INFO)
+
+formatter = logging.Formatter('%(message)s')
+file_handler.setFormatter(formatter)
+
+logger.addHandler(file_handler)
+
+def log_output(*args, **kwargs):
+    output = ' '.join(map(str, args))
+    logger.info(output.strip(), **kwargs)
+
+sys.stderr.write = sys.stdout.write = log_output
+
+os.close(1)
+os.close(2)
+
+try:
+    source_code = r'''${text}
+'''
+    exec(source_code)
+except Exception as e:
+    error_info = traceback.format_exc()
+    print(error_info)
+`;
+    //let textContain = 
+    let file = await fileBlobLoad(strText, "event", "text/plain")
+
+    let out = `import asyncio
+import subprocess
+import linecache
+async def tailf(filename):
+    command = "python -u /tmp/event"
+    process = subprocess.Popen(command, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
+    print("")
+    while True:
+        await asyncio.sleep(0.03)
+        try:
+            linecache.clearcache()
+            logarr = linecache.getlines(filename)[-20:]
+            if len(logarr) == 0:
+                if process.poll() is None:
+                    continue
+                else:
+                    return
+            open(filename, 'w').close()
+            print("".join(logarr).strip())
+        except asyncio.TimeoutError:
+            pass
+
+filename = "/root/output.log"
+loop = asyncio.get_event_loop()
+loop.run_until_complete(tailf(filename))
+loop.close()
+`
+    let fileOut = await fileBlobLoad(out, "out.py", "text/plain")
     if (isWifiContent) {
       // 无线连接
       sendWebsocket(text, 'run')
       $('.progress > .determinate').css('width', '50%');
+      // $("#status_txt")[0].innerHTML = Ardublockly.LOCALISED_TEXT.InExecution + "50%"
     } else {
-      await document.getElementById('webadb_iframe').contentWindow.upload(file, "/root/");
-      $('.progress > .determinate').css('width', '50%');
-      clearInterval(RunInterval);
-      if (isRunCodeData) {
-        isRunCodeData.kill().then(() => {
-          run_user_lastet_code()
-        })
-      }
-      else {
-        run_user_lastet_code()
-      }
-      setTimeout(function () {
-        $('.progress > .determinate').css('width', '100%');
-        window.file_manger_modal = true
-        $("#runCode").removeClass('disabled')
-        $("#uploadpy").removeClass('disabled')
-        $("#resetDevice").removeClass('disabled')
-        $("#poweroff").removeClass('disabled')
-
-      }, 2000);
+      // console.log(document.getElementById('webadb_iframe').contentWindow.getdevice().device.subprocess.shell(`echo "" > /root/fileCfgTest`))
+      document.getElementById('webadb_iframe').contentWindow.getdevice().device.subprocess.shell(`echo "" > /root/fileCfgTest`).then(r => {
+        setTimeout(function () {
+          window.file_manger_modal = true
+          r.stdout.reader.read().then(m => {
+            var str = Uint8ArrayToString(m.value);
+            if (str.indexOf("Read-only file system") > -1) {
+              //错误处理
+              document.getElementById('webadb_iframe').contentWindow.getdevice().device.subprocess.shell(`mount -o remount -rw /dev/mmcblk0p4`).then(r => {
+                uploadFilesCocoPi(file, fileOut)
+              }).catch(err => {
+                $('.progress > .determinate').css('width', 0);
+                $("#status_txt")[0].innerHTML = Ardublockly.LOCALISED_TEXT.ExecutedFail
+              })
+            }
+            else {
+              // 没有错误处理
+              uploadFilesCocoPi(file, fileOut)
+            }
+          }).catch(n => {
+            console.log(n)
+          })
+        }, 100)
+      }).catch(err => {
+        console.log(err)
+      })
     }
-
-    //})
-
   }
   const uploadXmlButton = $('#pyFileImport > input');
   uploadXmlButton.change(function () {
@@ -395,24 +480,6 @@ window.onload = async function () {
   selectOnload();
   styled()
 
-
-  // let iframe = document.createElement("iframe")
-  // iframe.src = window.location.host.indexOf("beta") > -1 ? "//beta.project-x.cocorobo.cn/" : '//project-x.cocorobo.cn/';
-  // iframe.style.width = "100%";
-  // iframe.style.height = "99%";
-  // iframe.style.border = "none";
-  // document.getElementById('iframe').appendChild(iframe)
-  //   $('#select_mode')[0].onchange = function(e){
-  //       var e = e.target;
-  //       selectmode(e.selectedIndex);
-  //       var _index = e.selectedIndex;
-  //         localStorage.setItem("ModeIndex",_index); 
-  //    
-  //   }
-  //   var _index = localStorage.getItem("ModeIndex") != "undefined" ? localStorage.getItem("ModeIndex") : 0;
-  //   selectmode(parseInt(_index));
-  //   $('#select_mode')[0].selectedIndex = parseInt(_index);
-
   $('#toggle-button').click(() => {
     if ($('#toggle-button')[0].checked) {
       $('#edit')[0].style.display = 'none';
@@ -466,14 +533,6 @@ window.onload = async function () {
   const copyCodeClipboard = new ClipboardJS(".copy_code", {
     text: function () {
       return blockpy.components.editor.codeMirror.getValue();
-      // const codes = $(".CodeMirror-code pre");
-      // let target = "";
-      // for (let i = 0; i < codes.length; i++) {
-      //   let line = codes[i].textContent;
-      //   !(line.length === 1 && line.charCodeAt(0) === 8203) ? target += line : "";
-      //   i !== codes.length - 1 ? target += "\n" : "";
-      // }
-      // return target;
     }
   });
   copyCodeClipboard.on("success", () => copyCodeToast(2000));
@@ -529,29 +588,9 @@ window.onload = async function () {
     // $("#IP")[0].style.display = "block"
     // isWifiContent = true
   }
-  // 提示全屏
-  //   setTimeout(() => {
-  //     // if (document.body.clientWidth < 1265) {
-  //     //   alert(CCB.str_group.alert)
-  //     // }
-  //     myChart = echarts.init(document.getElementById('echartsMain'));
-  //     window.onresize = function () {
-  //       myChart.resize();
-  //     }
-  //   }, 1000)
-
-
-  // 加载echarts
-  //   myChart = myChart = echarts.init(document.getElementById('echartsMain'));
-  //   window.onresize = function () {
-  //     myChart.resize();
-  //   }
-
-
 
   // 点击复制分享链接
   copyShare()
-  let autoContent = 0
   window.file_manger_modal = true
   document.getElementById("webadb_iframe").onload = function () {
     setInterval(function () {
@@ -589,18 +628,6 @@ window.onload = async function () {
           $('#cnt_icon').css('display', 'none')
           $('#discnt_icon').css('display', 'inline-block')
           $('#select-connected').attr("disabled", false)
-          // if(autoContent<5){
-          //   setTimeout(()=>{
-          //     serialSwich('Serial_Interaction')
-          //     document.getElementById("webadb_iframe").contentWindow.document.getElementById("usbconnect").click()
-          //     $('#webadb_connect')[0].innerHTML = Ardublockly.LOCALISED_TEXT.disConnect
-          //     autoContent++
-          //   },2000)
-          // }else{
-          //   console.log('111111')
-          //   // alert('你的板子已在其他页面连接成功')
-          // }
-
         }
         else if (isDevice.device != undefined && isDevice.selectdevice != undefined) {
           $("#webadb_add")[0].disabled = true;
@@ -609,13 +636,16 @@ window.onload = async function () {
             $('#cnt_icon').css('display', 'inline-block')
             $('#discnt_icon').css('display', 'none')
             $('#webadb_connect')[0].innerHTML = Ardublockly.LOCALISED_TEXT.disConnect
-            $("#status_txt")[0].innerHTML = Ardublockly.LOCALISED_TEXT.statusbar
+
             $("#webadb_connect")[0].disabled = false;
             $('#message_file').css({ display: 'inline-block' })
             $("#runCode").removeClass('disabled')
             $("#uploadpy").removeClass('disabled')
             $("#resetDevice").removeClass('disabled')
             $("#poweroff").removeClass('disabled')
+            if (autoContent) {
+              $("#status_txt")[0].innerHTML = Ardublockly.LOCALISED_TEXT.statusbar
+            }
           } else {
             $('#webadb_connect')[0].innerHTML = Ardublockly.LOCALISED_TEXT.connectBtn;
             $("#webadb_connect")[0].disabled = true;
@@ -628,7 +658,6 @@ window.onload = async function () {
   }
 
   // 加载更新提示框
-
   let updateData = await getJsonData('./update.json');
   // 最新更新你内容
   let updateNew = _lang == "zh-hans" ? updateData.updateNew.zhHans : _lang == "zh-hant" ? updateData.updateNew.zhHant : updateData.updateNew.en;
@@ -652,7 +681,7 @@ window.onload = async function () {
     noteLis = noteLis + noteLi
   }
   $('#noteLis').append(noteLis)
-  $('.updateTime')[0].innerHTML = updateData.updateNew.time
+  $(".updateTime")[0].innerHTML = updateData.updateNew.time
   // 历史更新
   let updateDataOld = updateData.updateOld
   let leftStr = ''
@@ -676,19 +705,12 @@ window.onload = async function () {
       let noteLi = `<li>${updateData.note[i]}</li>`
       noteLisOld = noteLisOld + noteLi
     }
-    leftStr = leftStr + `${time}<li>积木<ul class="updateContent">${blocklLisOld}</ul></li><li>样例<ul class="updateContent">${exampleLisOld}</ul></li>`
+    leftStr = leftStr + `${time}<li><span>${Ardublockly.LOCALISED_TEXT.updateblock}<ul class="updateContent">${blocklLisOld}</ul></li><li>${Ardublockly.LOCALISED_TEXT.updateexample}<ul class="updateContent">${exampleLisOld}</ul></li>`
     noteStr = noteStr + `${time}${noteLisOld}`
   }
   $('#leftUpdateOld').append(leftStr)
   $('#noteLisOld').append(noteStr)
   // $("#root").modal("open");
-  setTimeout(() => {
-    //     // if (isUpdate < 2) {
-    //         $("#select_Example_modal").modal("close");
-    //         $("#loadModal").modal("open");
-    //         localStorage.setItem('isUpdate', Number(isUpdate) + 1)
-    //     // }
-  }, 3000);
 }
 
 function styled() {
@@ -1083,37 +1105,37 @@ function selectOnload() {
         for (var k = 0, len = exampleList.length; k < len; k++) {
           exampleList[k].style.display = "none";
         }
-        exampleList[6].style.display = "block";
+        exampleList[7].style.display = "block";
       }
       else if (this.id == 2) {
         for (var k = 0, len = exampleList.length; k < len; k++) {
           exampleList[k].style.display = "none";
         }
-        exampleList[9].style.display = "block";
+        exampleList[10].style.display = "block";
       }
       else if (this.id == 3) {
         for (var k = 0, len = exampleList.length; k < len; k++) {
           exampleList[k].style.display = "none";
         }
-        exampleList[11].style.display = "block";
+        exampleList[12].style.display = "block";
       }
       else if (this.id == 4) {
         for (var k = 0, len = exampleList.length; k < len; k++) {
           exampleList[k].style.display = "none";
         }
-        exampleList[13].style.display = "block";
+        exampleList[14].style.display = "block";
       }
       else if (this.id == 5) {
         for (var k = 0, len = exampleList.length; k < len; k++) {
           exampleList[k].style.display = "none";
         }
-        exampleList[20].style.display = "block";
+        exampleList[21].style.display = "block";
       }
       else if (this.id == 6) {
         for (var k = 0, len = exampleList.length; k < len; k++) {
           exampleList[k].style.display = "none";
         }
-        exampleList[25].style.display = "block";
+        exampleList[26].style.display = "block";
       }
       else {
         for (var k = 0, len = exampleList.length; k < len; k++) {
@@ -1764,22 +1786,31 @@ function addWebadb() {
   } else {
     document.getElementById("webadb_iframe").contentWindow.document.getElementById("usbadd").click();
   }
-
-  // $("#webadb_connect")[0].disabled = false;
-  // isDevice = document.getElementById("webadb_iframe").contentWindow.getdevice().device;
 }
 
+window.addEventListener('storage', function (e) {
+  if (e.key === 'ctc-msg' && !!isConnect) {
+    console.log("断开当前页面连接")
+    document.getElementById("webadb_iframe").contentWindow.document.getElementById("usbdisconnect").click()
+    $('#webadb_connect')[0].innerHTML = Ardublockly.LOCALISED_TEXT.connectBtn
+  }
+});
+
+let autoContent = true
+function addWebadbCorsPage() {
+  let dat = new Date()
+  window.localStorage.setItem("ctc-msg", JSON.stringify(dat))
+}
 // webadb 连接
-function webadbConnect() {
+async function webadbConnect() {
   if (isWifiContent) {
     if ($('#webadb_connect')[0].innerHTML == Ardublockly.LOCALISED_TEXT.connectBtn) {
       connectWebsocket()
     } else {
       ws.close()
     }
-
-
   } else {
+    await addWebadbCorsPage()
     if (!!isConnect) {
       document.getElementById("webadb_iframe").contentWindow.document.getElementById("usbdisconnect").click()
       $('#webadb_connect')[0].innerHTML = Ardublockly.LOCALISED_TEXT.connectBtn
@@ -1787,13 +1818,11 @@ function webadbConnect() {
       serialSwich('Serial_Interaction')
       document.getElementById("webadb_iframe").contentWindow.document.getElementById("usbconnect").click()
       $('#webadb_connect')[0].innerHTML = Ardublockly.LOCALISED_TEXT.disConnect
+      autoContent = true
     }
   }
 }
 
-function ac() {
-}
-
 function systemCommand(com) {
   if (isWifiContent) {
     sendWebsocket(`import os
@@ -1809,7 +1838,6 @@ os.system("${com}")`, 'run')
     }).catch(err => {
     })
   }
-
 }
 
 function backHome() {
@@ -1858,19 +1886,54 @@ function Uint8ArrayToString(fileData) {
 
 }
 
+async function fileBlobLoad(text, name, type) {
+  // 这么写是因为文件转换是异步任务
+  transToFile = async (blob, fileName, fileType) => {
+    return new window.File([blob], fileName, { type: fileType })
+  }
+
+  let outBlob = new Blob([text], { type: "text/plain;charset=utf-8" })
+  const data = await transToFile(outBlob, name, type);
+  return data
+}
+
+function uploadFilesCocoPi(file, fileOut) {
+  document.getElementById('webadb_iframe').contentWindow.upload(file, "/tmp/").then(s => {
+    document.getElementById('webadb_iframe').contentWindow.upload(fileOut, "/root/").then(res => {
+      $('.progress > .determinate').css('width', '50%');
+      $("#status_txt")[0].innerHTML = Ardublockly.LOCALISED_TEXT.InExecution + "50%"
+      clearInterval(RunInterval);
+      if (isRunCodeData) {
+        isRunCodeData.kill().then(() => {
+          run_user_lastet_code()
+        })
+      }
+      else {
+        run_user_lastet_code()
+      }
+    })
+  })
+}
 function run_user_lastet_code() {
   canvasImg = $("#image_transmission_canvas")[0].getContext("2d")
   canImage = new Image()
-  document.getElementById('webadb_iframe').contentWindow.getdevice().device.subprocess.shell(`ln -sf /root/user_latest_code.py /tmp/event && touch /tmp/disable && python -u /tmp/event`).then(function (e) {
+  document.getElementById('webadb_iframe').contentWindow.getdevice().device.subprocess.shell(`(echo '' > /root/output.log ; touch /tmp/disable) & python -u /root/out.py`).then(function (e) {
     isRunCodeData = e;
     _data = "";
     _ti = "";
     serverPrint(e)
     RunInterval = setInterval(() => {
       serverPrint(e)
-    }, 10);
+    }, 50);
+    setTimeout(function () {
+      $("#status_txt")[0].innerHTML = Ardublockly.LOCALISED_TEXT.ExecutedSuccessfully + "100%"
+      $('.progress > .determinate').css('width', '100%');
+      $("#runCode").removeClass('disabled')
+      $("#uploadpy").removeClass('disabled')
+      $("#resetDevice").removeClass('disabled')
+      $("#poweroff").removeClass('disabled')
+    }, 2000);
   })
-
 }
 
 var _data = "";
@@ -1878,19 +1941,10 @@ var _ti;
 var canvasImg = "";
 var canImage = "";
 function serverPrint(e) {
-  if (e.stdout.readable._state != 'readable') {
-    $('#backHome').addClass('disabled')
-    clearInterval(RunInterval)
-    backHome()
-  }
-  else {
-    $('#backHome').removeClass('disabled')
-  }
   e.stdout.reader.read().then(function (e) {
     if (e.value) {
       clearTimeout(_ti);
       _data += Uint8ArrayToString(e.value);
-      //showServal(_data)
       _ti = setTimeout(function () {
         showServal(_data)
         _data = "";
@@ -1898,50 +1952,119 @@ function serverPrint(e) {
     }
   }).catch(err => {
     $('.progress > .determinate').css('width', 0);
+    $("#status_txt")[0].innerHTML = Ardublockly.LOCALISED_TEXT.ExecutedFail
   })
+  if (isRunCodeData) {
+    if (isRunCodeData.stdout.readable._state != 'readable') {
+      $('#backHome').addClass('disabled')
+      clearInterval(RunInterval)
+      backHome()
+    }
+    else {
+      $('#backHome').removeClass('disabled')
+    }
+  }
+
 }
 
 function showServal(_data) {
-  try {
-    canImage.src = _data;
-    canImage.onload = () => {
-      canvasImg.drawImage(canImage, 0, 0, 300, 150)
+  if (_data.indexOf('data:image/jpg;base64') > -1) {
+    try {
+      canImage.src = _data;
+      canImage.onload = () => {
+        canvasImg.drawImage(canImage, 0, 0, 300, 150)
+      }
     }
-  }
-  catch (e) {
-  }
-  // }
-  if (_data.indexOf(`File "/tmp/event", line`) > -1) {
-    setTimeout(() => {
-      $("#error-btn").css("display", "block")
-      $('.card-reveal').css({ 'display': 'block', 'transform': 'translateY(-100%)', 'padding': '8px 13px' });
-    }, 500)
-    let errMsg = _data.slice(_data.indexOf(`File "/tmp/event", line`)).split('\r\n')
-    $("#err-msg").text(`${errMsg[0]}\n${errMsg[1]}\n${errMsg[2]}\n${CCB.str_group.errSol}\n${Ardublockly.LOCALISED_TEXT.error_pv}`)
-  } else if (_data.indexOf("IndentationError") > -1 || _data.indexOf("SyntaxError") > -1) {
-    setTimeout(() => {
-      $("#error-btn").css("display", "block")
-      $('.card-reveal').css({ 'display': 'block', 'transform': 'translateY(-100%)', 'padding': '8px 13px' });
-    }, 500)
-    $("#err-msg").text(`_data\n${CCB.str_group.errSol}\n${Ardublockly.LOCALISED_TEXT.error_unindent}`)
-  } else if (_data.indexOf("fopen") > -1) {
-    setTimeout(() => {
-      $("#error-btn").css("display", "block")
-      $('.card-reveal').css({ 'display': 'block', 'transform': 'translateY(-100%)', 'padding': '8px 13px' });
-    }, 500)
-    $("#err-msg").text(`${_data.slice(_data.indexOf("fopen"), _data.indexOf("failed"))}\n${Ardublockly.LOCALISED_TEXT.ENOEN}`)
-  }
-  let c = ''
-  let m = _data.indexOf("DEBUG") > -1 || _data.indexOf("debug") > -1 || _data.indexOf("modName") > -1 || _data.indexOf("tag") > -1 || _data.indexOf("branch") > -1 || _data.indexOf("commit") > -1 || _data.indexOf("author") > -1 || _data.indexOf("WARNING") > -1
-  if (!m) {
-    let b = _data.split('\r\n')
-    for (let i = 0; i <= b.length - 1; i++) {
-      c += `<div>${b[i]}</div>`
+    catch (e) {
+    }
+  } else {
+    let errMsg = ""
+    let errData = ""
+    let c = ''
+    if (_data.indexOf(`File "/tmp/event"`) == -1) {
+      if (_data.indexOf(`camera`) == -1) {
+        let b = _data.split('\r\n')
+        for (let i = 0; i <= b.length - 1; i++) {
+          c += `<div>${b[i]}</div>`
+        }
+        $('#repl_box_content').append(c);
+        repl_box_contentheight = $("#repl_box_content")[0].scrollHeight;
+        $("#repl_box_content").scrollTop(repl_box_contentheight);
+      }
+
+    }
+    else if (_data.indexOf(`NameError`) > -1) {
+      setTimeout(() => {
+        $("#error-btn").css("display", "block")
+        $('.card-reveal').css({ 'display': 'block', 'transform': 'translateY(-100%)', 'padding': '8px 13px' });
+      }, 500)
+      errMsg = _data.split('\r\n')
+      for (let i = 0; i <= errMsg.length - 1; i++) {
+        errData += `${errMsg[i]}\n`
+      }
+      $("#err-msg").text(`${errData}\n${CCB.str_group.errSol}\n${Ardublockly.LOCALISED_TEXT.error_pv}`)
+    } else if (_data.indexOf("IndentationError") > -1 || _data.indexOf("SyntaxError") > -1) {
+      setTimeout(() => {
+        $("#error-btn").css("display", "block")
+        $('.card-reveal').css({ 'display': 'block', 'transform': 'translateY(-100%)', 'padding': '8px 13px' });
+      }, 500)
+      errMsg = _data.split('\r\n')
+      for (let i = 0; i <= errMsg.length - 1; i++) {
+        errData += `${errMsg[i]}\n`
+      }
+      $("#err-msg").text(`${errData}\n${CCB.str_group.errSol}\n${Ardublockly.LOCALISED_TEXT.error_unindent}`)
+    } else if (_data.indexOf("IndexError") > -1) {
+      setTimeout(() => {
+        $("#error-btn").css("display", "block")
+        $('.card-reveal').css({ 'display': 'block', 'transform': 'translateY(-100%)', 'padding': '8px 13px' });
+      }, 500)
+      errMsg = _data.split('\r\n')
+      for (let i = 0; i <= errMsg.length - 1; i++) {
+        errData += `${errMsg[i]}\n`
+      }
+      $("#err-msg").text(`${errData}\n${CCB.str_group.errSol}\n${Ardublockly.LOCALISED_TEXT.IndexError}`)
+    } else if (_data.indexOf("AttributeError") > -1) {
+      setTimeout(() => {
+        $("#error-btn").css("display", "block")
+        $('.card-reveal').css({ 'display': 'block', 'transform': 'translateY(-100%)', 'padding': '8px 13px' });
+      }, 500)
+      errMsg = _data.split('\r\n')
+      for (let i = 0; i <= errMsg.length - 1; i++) {
+        errData += `${errMsg[i]}\n`
+      }
+      $("#err-msg").text(`${errData}\n${CCB.str_group.errSol}\n${Ardublockly.LOCALISED_TEXT.AttributeError}`)
+    } else if (_data.indexOf("TypeError") > -1) {
+      setTimeout(() => {
+        $("#error-btn").css("display", "block")
+        $('.card-reveal').css({ 'display': 'block', 'transform': 'translateY(-100%)', 'padding': '8px 13px' });
+      }, 500)
+      errMsg = _data.split('\r\n')
+      for (let i = 0; i <= errMsg.length - 1; i++) {
+        errData += `${errMsg[i]}\n`
+      }
+      $("#err-msg").text(`${errData}\n${CCB.str_group.errSol}\n${Ardublockly.LOCALISED_TEXT.error_unindent}`)
+    } else if (_data.indexOf("KeyError") > -1) {
+      setTimeout(() => {
+        $("#error-btn").css("display", "block")
+        $('.card-reveal').css({ 'display': 'block', 'transform': 'translateY(-100%)', 'padding': '8px 13px' });
+      }, 500)
+      errMsg = _data.split('\r\n')
+      for (let i = 0; i <= errMsg.length - 1; i++) {
+        errData += `${errMsg[i]}\n`
+      }
+      $("#err-msg").text(`${errData}\n${CCB.str_group.errSol}\n${Ardublockly.LOCALISED_TEXT.KeyError}`)
+    } else if (_data.indexOf(`File "/tmp/event"`) > -1) {
+      setTimeout(() => {
+        $("#error-btn").css("display", "block")
+        $('.card-reveal').css({ 'display': 'block', 'transform': 'translateY(-100%)', 'padding': '8px 13px' });
+      }, 500)
+      errMsg = _data.split('\r\n')
+      for (let i = 0; i <= errMsg.length - 1; i++) {
+        errData += `${errMsg[i]}\n`
+      }
+      $("#err-msg").text(`${errData}\n${CCB.str_group.errSol}\n${Ardublockly.LOCALISED_TEXT.KeyError}`)
     }
   }
-  $('#repl_box_content').append(c);
-  repl_box_contentheight=$("#repl_box_content")[0].scrollHeight;
-  $("#repl_box_content").scrollTop(repl_box_contentheight);
 }
 var repl_box_contentheight = 0
 function getQrCode() {
@@ -2006,7 +2129,7 @@ function connectWebsocket(type) {
   // 监听服务端消息(接收消息)
   ws.onmessage = (msg) => {
     $('#repl_box_content').append(`<div>${msg.data}</div>`);
-    repl_box_contentheight=$("#repl_box_content")[0].scrollHeight;
+    repl_box_contentheight = $("#repl_box_content")[0].scrollHeight;
     $("#repl_box_content").scrollTop(repl_box_contentheight);
   };
 
@@ -2037,6 +2160,7 @@ function connectWebsocket(type) {
       $('#message_file').css({ display: 'none' })
       $('#webadb_connect')[0].innerHTML = Ardublockly.LOCALISED_TEXT.connectBtn;
       $('.progress > .determinate').css('width', 0);
+      $("status_txt")[0].innerHTML = Ardublockly.LOCALISED_TEXT.ExecutedFail
     }, 500)
   };
 };
@@ -2063,11 +2187,54 @@ function sendWebsocket(file, type) {
       catch (e) {
       }
     } else {
+      if (_data.indexOf(`NameError`) > -1) {
+        setTimeout(() => {
+          $("#error-btn").css("display", "block")
+          $('.card-reveal').css({ 'display': 'block', 'transform': 'translateY(-100%)', 'padding': '8px 13px' });
+        }, 500)
+        let errMsg = _data.slice(_data.indexOf(`File "/tmp/event", line`)).split('\r\n')
+        $("#err-msg").text(`${errMsg[0]}\n${errMsg[1]}\n${errMsg[2]}\n${CCB.str_group.errSol}\n${Ardublockly.LOCALISED_TEXT.error_pv}`)
+      } else if (_data.indexOf("IndentationError") > -1 || _data.indexOf("SyntaxError") > -1) {
+        setTimeout(() => {
+          $("#error-btn").css("display", "block")
+          $('.card-reveal').css({ 'display': 'block', 'transform': 'translateY(-100%)', 'padding': '8px 13px' });
+        }, 500)
+        let errMsg = _data.slice(_data.indexOf(`File "/tmp/event", line`)).split('\r\n')
+        $("#err-msg").text(`${errMsg[0]}\n${errMsg[1]}\n${errMsg[2]}\n${CCB.str_group.errSol}\n${Ardublockly.LOCALISED_TEXT.error_unindent}`)
+      } else if (_data.indexOf("IndexError") > -1) {
+        setTimeout(() => {
+          $("#error-btn").css("display", "block")
+          $('.card-reveal').css({ 'display': 'block', 'transform': 'translateY(-100%)', 'padding': '8px 13px' });
+        }, 500)
+        let errMsg = _data.slice(_data.indexOf(`File "/tmp/event", line`)).split('\r\n')
+        $("#err-msg").text(`${errMsg[0]}\n${errMsg[1]}\n${errMsg[2]}\n${CCB.str_group.errSol}\n${Ardublockly.LOCALISED_TEXT.IndexError}`)
+      } else if (_data.indexOf("AttributeError") > -1) {
+        setTimeout(() => {
+          $("#error-btn").css("display", "block")
+          $('.card-reveal').css({ 'display': 'block', 'transform': 'translateY(-100%)', 'padding': '8px 13px' });
+        }, 500)
+        let errMsg = _data.slice(_data.indexOf(`File "/tmp/event", line`)).split('\r\n')
+        $("#err-msg").text(`${errMsg[0]}\n${errMsg[1]}\n${errMsg[2]}\n${CCB.str_group.errSol}\n${Ardublockly.LOCALISED_TEXT.AttributeError}`)
+      } else if (_data.indexOf("TypeError") > -1) {
+        setTimeout(() => {
+          $("#error-btn").css("display", "block")
+          $('.card-reveal').css({ 'display': 'block', 'transform': 'translateY(-100%)', 'padding': '8px 13px' });
+        }, 500)
+        let errMsg = _data.slice(_data.indexOf(`File "/tmp/event", line`)).split('\r\n')
+        $("#err-msg").text(`${errMsg[0]}\n${errMsg[1]}\n${errMsg[2]}\n${errMsg[1]}\n${CCB.str_group.errSol}\n${Ardublockly.LOCALISED_TEXT.TypeError}`)
+      } else if (_data.indexOf("KeyError") > -1) {
+        setTimeout(() => {
+          $("#error-btn").css("display", "block")
+          $('.card-reveal').css({ 'display': 'block', 'transform': 'translateY(-100%)', 'padding': '8px 13px' });
+        }, 500)
+        let errMsg = _data.slice(_data.indexOf(`File "/tmp/event", line`)).split('\r\n')
+        $("#err-msg").text(`${errMsg[0]}\n${errMsg[1]}\n${errMsg[2]}\n${CCB.str_group.errSol}\n${Ardublockly.LOCALISED_TEXT.KeyError}`)
+      }
       // modName ,tag,branch,commit,author
       let a = msg.data.indexOf("DEBUG") > -1 || msg.data.indexOf("debug") > -1 || msg.data.indexOf("modName") > -1 || msg.data.indexOf("tag") > -1 || msg.data.indexOf("branch") > -1 || msg.data.indexOf("commit") > -1 || msg.data.indexOf("author") > -1
       if (!a) {
         $('#repl_box_content').append(`<div>${msg.data}</div>`);
-        repl_box_contentheight=$("#repl_box_content")[0].scrollHeight;
+        repl_box_contentheight = $("#repl_box_content")[0].scrollHeight;
         $("#repl_box_content").scrollTop(repl_box_contentheight);
       }
       // $('.progress > .determinate').css('width', '100%');

+ 523 - 0
src/renderer/cocoblockly-x/libs/codemirror/showhint.js

@@ -0,0 +1,523 @@
+// CodeMirror, copyright (c) by Marijn Haverbeke and others
+// Distributed under an MIT license: https://codemirror.net/5/LICENSE
+
+// declare global: DOMRect
+
+(function(mod) {
+  if (typeof exports == "object" && typeof module == "object") // CommonJS
+    mod(require("../../lib/codemirror"));
+  else if (typeof define == "function" && define.amd) // AMD
+    define(["../../lib/codemirror"], mod);
+  else // Plain browser env
+    mod(CodeMirror);
+})(function(CodeMirror) {
+  "use strict";
+
+  var HINT_ELEMENT_CLASS        = "CodeMirror-hint";
+  var ACTIVE_HINT_ELEMENT_CLASS = "CodeMirror-hint-active";
+
+  // This is the old interface, kept around for now to stay
+  // backwards-compatible.
+  CodeMirror.showHint = function(cm, getHints, options) {
+    if (!getHints) return cm.showHint(options);
+    if (options && options.async) getHints.async = true;
+    var newOpts = {hint: getHints};
+    if (options) for (var prop in options) newOpts[prop] = options[prop];
+    return cm.showHint(newOpts);
+  };
+
+  CodeMirror.defineExtension("showHint", function(options) {
+    options = parseOptions(this, this.getCursor("start"), options);
+    var selections = this.listSelections()
+    if (selections.length > 1) return;
+    // By default, don't allow completion when something is selected.
+    // A hint function can have a `supportsSelection` property to
+    // indicate that it can handle selections.
+    if (this.somethingSelected()) {
+      if (!options.hint.supportsSelection) return;
+      // Don't try with cross-line selections
+      for (var i = 0; i < selections.length; i++)
+        if (selections[i].head.line != selections[i].anchor.line) return;
+    }
+
+    if (this.state.completionActive) this.state.completionActive.close();
+    var completion = this.state.completionActive = new Completion(this, options);
+    if (!completion.options.hint) return;
+
+    CodeMirror.signal(this, "startCompletion", this);
+    completion.update(true);
+  });
+
+  CodeMirror.defineExtension("closeHint", function() {
+    if (this.state.completionActive) this.state.completionActive.close()
+  })
+
+  function Completion(cm, options) {
+    this.cm = cm;
+    this.options = options;
+    this.widget = null;
+    this.debounce = 0;
+    this.tick = 0;
+    this.startPos = this.cm.getCursor("start");
+    this.startLen = this.cm.getLine(this.startPos.line).length - this.cm.getSelection().length;
+
+    if (this.options.updateOnCursorActivity) {
+      var self = this;
+      cm.on("cursorActivity", this.activityFunc = function() { self.cursorActivity(); });
+    }
+  }
+
+  var requestAnimationFrame = window.requestAnimationFrame || function(fn) {
+    return setTimeout(fn, 1000/60);
+  };
+  var cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout;
+
+  Completion.prototype = {
+    close: function() {
+      if (!this.active()) return;
+      this.cm.state.completionActive = null;
+      this.tick = null;
+      if (this.options.updateOnCursorActivity) {
+        this.cm.off("cursorActivity", this.activityFunc);
+      }
+
+      if (this.widget && this.data) CodeMirror.signal(this.data, "close");
+      if (this.widget) this.widget.close();
+      CodeMirror.signal(this.cm, "endCompletion", this.cm);
+    },
+
+    active: function() {
+      return this.cm.state.completionActive == this;
+    },
+
+    pick: function(data, i) {
+      var completion = data.list[i], self = this;
+      this.cm.operation(function() {
+        if (completion.hint)
+          completion.hint(self.cm, data, completion);
+        else
+          self.cm.replaceRange(getText(completion), completion.from || data.from,
+                               completion.to || data.to, "complete");
+        CodeMirror.signal(data, "pick", completion);
+        self.cm.scrollIntoView();
+      });
+      if (this.options.closeOnPick) {
+        this.close();
+      }
+    },
+
+    cursorActivity: function() {
+      if (this.debounce) {
+        cancelAnimationFrame(this.debounce);
+        this.debounce = 0;
+      }
+
+      var identStart = this.startPos;
+      if(this.data) {
+        identStart = this.data.from;
+      }
+
+      var pos = this.cm.getCursor(), line = this.cm.getLine(pos.line);
+      if (pos.line != this.startPos.line || line.length - pos.ch != this.startLen - this.startPos.ch ||
+          pos.ch < identStart.ch || this.cm.somethingSelected() ||
+          (!pos.ch || this.options.closeCharacters.test(line.charAt(pos.ch - 1)))) {
+        this.close();
+      } else {
+        var self = this;
+        this.debounce = requestAnimationFrame(function() {self.update();});
+        if (this.widget) this.widget.disable();
+      }
+    },
+
+    update: function(first) {
+      if (this.tick == null) return
+      var self = this, myTick = ++this.tick
+      fetchHints(this.options.hint, this.cm, this.options, function(data) {
+        if (self.tick == myTick) self.finishUpdate(data, first)
+      })
+    },
+
+    finishUpdate: function(data, first) {
+      if (this.data) CodeMirror.signal(this.data, "update");
+
+      var picked = (this.widget && this.widget.picked) || (first && this.options.completeSingle);
+      if (this.widget) this.widget.close();
+
+      this.data = data;
+
+      if (data && data.list.length) {
+        if (picked && data.list.length == 1) {
+          this.pick(data, 0);
+        } else {
+          this.widget = new Widget(this, data);
+          CodeMirror.signal(data, "shown");
+        }
+      }
+    }
+  };
+
+  function parseOptions(cm, pos, options) {
+    var editor = cm.options.hintOptions;
+    var out = {};
+    for (var prop in defaultOptions) out[prop] = defaultOptions[prop];
+    if (editor) for (var prop in editor)
+      if (editor[prop] !== undefined) out[prop] = editor[prop];
+    if (options) for (var prop in options)
+      if (options[prop] !== undefined) out[prop] = options[prop];
+    if (out.hint.resolve) out.hint = out.hint.resolve(cm, pos)
+    return out;
+  }
+
+  function getText(completion) {
+    if (typeof completion == "string") return completion;
+    else return completion.text;
+  }
+
+  function buildKeyMap(completion, handle) {
+    var baseMap = {
+      Up: function() {handle.moveFocus(-1);},
+      Down: function() {handle.moveFocus(1);},
+      PageUp: function() {handle.moveFocus(-handle.menuSize() + 1, true);},
+      PageDown: function() {handle.moveFocus(handle.menuSize() - 1, true);},
+      Home: function() {handle.setFocus(0);},
+      End: function() {handle.setFocus(handle.length - 1);},
+      Enter: handle.pick,
+      Tab: handle.pick,
+      Esc: handle.close
+    };
+
+    var mac = /Mac/.test(navigator.platform);
+
+    if (mac) {
+      baseMap["Ctrl-P"] = function() {handle.moveFocus(-1);};
+      baseMap["Ctrl-N"] = function() {handle.moveFocus(1);};
+    }
+
+    var custom = completion.options.customKeys;
+    var ourMap = custom ? {} : baseMap;
+    function addBinding(key, val) {
+      var bound;
+      if (typeof val != "string")
+        bound = function(cm) { return val(cm, handle); };
+      // This mechanism is deprecated
+      else if (baseMap.hasOwnProperty(val))
+        bound = baseMap[val];
+      else
+        bound = val;
+      ourMap[key] = bound;
+    }
+    if (custom)
+      for (var key in custom) if (custom.hasOwnProperty(key))
+        addBinding(key, custom[key]);
+    var extra = completion.options.extraKeys;
+    if (extra)
+      for (var key in extra) if (extra.hasOwnProperty(key))
+        addBinding(key, extra[key]);
+    return ourMap;
+  }
+
+  function getHintElement(hintsElement, el) {
+    while (el && el != hintsElement) {
+      if (el.nodeName.toUpperCase() === "LI" && el.parentNode == hintsElement) return el;
+      el = el.parentNode;
+    }
+  }
+
+  function Widget(completion, data) {
+    this.id = "cm-complete-" + Math.floor(Math.random(1e6))
+    this.completion = completion;
+    this.data = data;
+    this.picked = false;
+    var widget = this, cm = completion.cm;
+    var ownerDocument = cm.getInputField().ownerDocument;
+    var parentWindow = ownerDocument.defaultView || ownerDocument.parentWindow;
+
+    var hints = this.hints = ownerDocument.createElement("ul");
+    hints.setAttribute("role", "listbox")
+    hints.setAttribute("aria-expanded", "true")
+    hints.id = this.id
+    var theme = completion.cm.options.theme;
+    hints.className = "CodeMirror-hints " + theme;
+    this.selectedHint = data.selectedHint || 0;
+
+    var completions = data.list;
+    for (var i = 0; i < completions.length; ++i) {
+      var elt = hints.appendChild(ownerDocument.createElement("li")), cur = completions[i];
+      var className = HINT_ELEMENT_CLASS + (i != this.selectedHint ? "" : " " + ACTIVE_HINT_ELEMENT_CLASS);
+      if (cur.className != null) className = cur.className + " " + className;
+      elt.className = className;
+      if (i == this.selectedHint) elt.setAttribute("aria-selected", "true")
+      elt.id = this.id + "-" + i
+      elt.setAttribute("role", "option")
+      if (cur.render) cur.render(elt, data, cur);
+      else elt.appendChild(ownerDocument.createTextNode(cur.displayText || getText(cur)));
+      elt.hintId = i;
+    }
+
+    var container = completion.options.container || ownerDocument.body;
+    var pos = cm.cursorCoords(completion.options.alignWithWord ? data.from : null);
+    var left = pos.left, top = pos.bottom, below = true;
+    var offsetLeft = 0, offsetTop = 0;
+    if (container !== ownerDocument.body) {
+      // We offset the cursor position because left and top are relative to the offsetParent's top left corner.
+      var isContainerPositioned = ['absolute', 'relative', 'fixed'].indexOf(parentWindow.getComputedStyle(container).position) !== -1;
+      var offsetParent = isContainerPositioned ? container : container.offsetParent;
+      var offsetParentPosition = offsetParent.getBoundingClientRect();
+      var bodyPosition = ownerDocument.body.getBoundingClientRect();
+      offsetLeft = (offsetParentPosition.left - bodyPosition.left - offsetParent.scrollLeft);
+      offsetTop = (offsetParentPosition.top - bodyPosition.top - offsetParent.scrollTop);
+    }
+    hints.style.left = (left - offsetLeft) + "px";
+    hints.style.top = (top - offsetTop) + "px";
+
+    // If we're at the edge of the screen, then we want the menu to appear on the left of the cursor.
+    var winW = parentWindow.innerWidth || Math.max(ownerDocument.body.offsetWidth, ownerDocument.documentElement.offsetWidth);
+    var winH = parentWindow.innerHeight || Math.max(ownerDocument.body.offsetHeight, ownerDocument.documentElement.offsetHeight);
+    container.appendChild(hints);
+    cm.getInputField().setAttribute("aria-autocomplete", "list")
+    cm.getInputField().setAttribute("aria-owns", this.id)
+    cm.getInputField().setAttribute("aria-activedescendant", this.id + "-" + this.selectedHint)
+
+    var box = completion.options.moveOnOverlap ? hints.getBoundingClientRect() : new DOMRect();
+    var scrolls = completion.options.paddingForScrollbar ? hints.scrollHeight > hints.clientHeight + 1 : false;
+
+    // Compute in the timeout to avoid reflow on init
+    var startScroll;
+    setTimeout(function() { startScroll = cm.getScrollInfo(); });
+
+    var overlapY = box.bottom - winH;
+    if (overlapY > 0) { // Does not fit below
+      var height = box.bottom - box.top, spaceAbove = box.top - (pos.bottom - pos.top) - 2
+      if (winH - box.top < spaceAbove) { // More room at the top
+        if (height > spaceAbove) hints.style.height = (height = spaceAbove) + "px";
+        hints.style.top = ((top = pos.top - height) + offsetTop) + "px";
+        below = false;
+      } else {
+        hints.style.height = (winH - box.top - 2) + "px";
+      }
+    }
+    var overlapX = box.right - winW;
+    if (scrolls) overlapX += cm.display.nativeBarWidth;
+    if (overlapX > 0) {
+      if (box.right - box.left > winW) {
+        hints.style.width = (winW - 5) + "px";
+        overlapX -= (box.right - box.left) - winW;
+      }
+      hints.style.left = (left = Math.max(pos.left - overlapX - offsetLeft, 0)) + "px";
+    }
+    if (scrolls) for (var node = hints.firstChild; node; node = node.nextSibling)
+      node.style.paddingRight = cm.display.nativeBarWidth + "px"
+
+    cm.addKeyMap(this.keyMap = buildKeyMap(completion, {
+      moveFocus: function(n, avoidWrap) { widget.changeActive(widget.selectedHint + n, avoidWrap); },
+      setFocus: function(n) { widget.changeActive(n); },
+      menuSize: function() { return widget.screenAmount(); },
+      length: completions.length,
+      close: function() { completion.close(); },
+      pick: function() { widget.pick(); },
+      data: data
+    }));
+
+    if (completion.options.closeOnUnfocus) {
+      var closingOnBlur;
+      cm.on("blur", this.onBlur = function() { closingOnBlur = setTimeout(function() { completion.close(); }, 100); });
+      cm.on("focus", this.onFocus = function() { clearTimeout(closingOnBlur); });
+    }
+
+    cm.on("scroll", this.onScroll = function() {
+      var curScroll = cm.getScrollInfo(), editor = cm.getWrapperElement().getBoundingClientRect();
+      if (!startScroll) startScroll = cm.getScrollInfo();
+      var newTop = top + startScroll.top - curScroll.top;
+      var point = newTop - (parentWindow.pageYOffset || (ownerDocument.documentElement || ownerDocument.body).scrollTop);
+      if (!below) point += hints.offsetHeight;
+      if (point <= editor.top || point >= editor.bottom) return completion.close();
+      hints.style.top = newTop + "px";
+      hints.style.left = (left + startScroll.left - curScroll.left) + "px";
+    });
+
+    CodeMirror.on(hints, "dblclick", function(e) {
+      var t = getHintElement(hints, e.target || e.srcElement);
+      if (t && t.hintId != null) {widget.changeActive(t.hintId); widget.pick();}
+    });
+
+    CodeMirror.on(hints, "click", function(e) {
+      var t = getHintElement(hints, e.target || e.srcElement);
+      if (t && t.hintId != null) {
+        widget.changeActive(t.hintId);
+        if (completion.options.completeOnSingleClick) widget.pick();
+      }
+    });
+
+    CodeMirror.on(hints, "mousedown", function() {
+      setTimeout(function(){cm.focus();}, 20);
+    });
+
+    // The first hint doesn't need to be scrolled to on init
+    var selectedHintRange = this.getSelectedHintRange();
+    if (selectedHintRange.from !== 0 || selectedHintRange.to !== 0) {
+      this.scrollToActive();
+    }
+
+    CodeMirror.signal(data, "select", completions[this.selectedHint], hints.childNodes[this.selectedHint]);
+    return true;
+  }
+
+  Widget.prototype = {
+    close: function() {
+      if (this.completion.widget != this) return;
+      this.completion.widget = null;
+      if (this.hints.parentNode) this.hints.parentNode.removeChild(this.hints);
+      this.completion.cm.removeKeyMap(this.keyMap);
+      var input = this.completion.cm.getInputField()
+      input.removeAttribute("aria-activedescendant")
+      input.removeAttribute("aria-owns")
+
+      var cm = this.completion.cm;
+      if (this.completion.options.closeOnUnfocus) {
+        cm.off("blur", this.onBlur);
+        cm.off("focus", this.onFocus);
+      }
+      cm.off("scroll", this.onScroll);
+    },
+
+    disable: function() {
+      this.completion.cm.removeKeyMap(this.keyMap);
+      var widget = this;
+      this.keyMap = {Enter: function() { widget.picked = true; }};
+      this.completion.cm.addKeyMap(this.keyMap);
+    },
+
+    pick: function() {
+      this.completion.pick(this.data, this.selectedHint);
+    },
+
+    changeActive: function(i, avoidWrap) {
+      if (i >= this.data.list.length)
+        i = avoidWrap ? this.data.list.length - 1 : 0;
+      else if (i < 0)
+        i = avoidWrap ? 0  : this.data.list.length - 1;
+      if (this.selectedHint == i) return;
+      var node = this.hints.childNodes[this.selectedHint];
+      if (node) {
+        node.className = node.className.replace(" " + ACTIVE_HINT_ELEMENT_CLASS, "");
+        node.removeAttribute("aria-selected")
+      }
+      node = this.hints.childNodes[this.selectedHint = i];
+      node.className += " " + ACTIVE_HINT_ELEMENT_CLASS;
+      node.setAttribute("aria-selected", "true")
+      this.completion.cm.getInputField().setAttribute("aria-activedescendant", node.id)
+      this.scrollToActive()
+      CodeMirror.signal(this.data, "select", this.data.list[this.selectedHint], node);
+    },
+
+    scrollToActive: function() {
+      var selectedHintRange = this.getSelectedHintRange();
+      var node1 = this.hints.childNodes[selectedHintRange.from];
+      var node2 = this.hints.childNodes[selectedHintRange.to];
+      var firstNode = this.hints.firstChild;
+      if (node1.offsetTop < this.hints.scrollTop)
+        this.hints.scrollTop = node1.offsetTop - firstNode.offsetTop;
+      else if (node2.offsetTop + node2.offsetHeight > this.hints.scrollTop + this.hints.clientHeight)
+        this.hints.scrollTop = node2.offsetTop + node2.offsetHeight - this.hints.clientHeight + firstNode.offsetTop;
+    },
+
+    screenAmount: function() {
+      return Math.floor(this.hints.clientHeight / this.hints.firstChild.offsetHeight) || 1;
+    },
+
+    getSelectedHintRange: function() {
+      var margin = this.completion.options.scrollMargin || 0;
+      return {
+        from: Math.max(0, this.selectedHint - margin),
+        to: Math.min(this.data.list.length - 1, this.selectedHint + margin),
+      };
+    }
+  };
+
+  function applicableHelpers(cm, helpers) {
+    if (!cm.somethingSelected()) return helpers
+    var result = []
+    for (var i = 0; i < helpers.length; i++)
+      if (helpers[i].supportsSelection) result.push(helpers[i])
+    return result
+  }
+
+  function fetchHints(hint, cm, options, callback) {
+    if (hint.async) {
+      hint(cm, callback, options)
+    } else {
+      var result = hint(cm, options)
+      if (result && result.then) result.then(callback)
+      else callback(result)
+    }
+  }
+
+  function resolveAutoHints(cm, pos) {
+    var helpers = cm.getHelpers(pos, "hint"), words
+    if (helpers.length) {
+      var resolved = function(cm, callback, options) {
+        var app = applicableHelpers(cm, helpers);
+        function run(i) {
+          if (i == app.length) return callback(null)
+          fetchHints(app[i], cm, options, function(result) {
+            if (result && result.list.length > 0) callback(result)
+            else run(i + 1)
+          })
+        }
+        run(0)
+      }
+      resolved.async = true
+      resolved.supportsSelection = true
+      return resolved
+    } else if (words = cm.getHelper(cm.getCursor(), "hintWords")) {
+      return function(cm) { return CodeMirror.hint.fromList(cm, {words: words}) }
+    } else if (CodeMirror.hint.anyword) {
+      return function(cm, options) { return CodeMirror.hint.anyword(cm, options) }
+    } else {
+      return function() {}
+    }
+  }
+
+  CodeMirror.registerHelper("hint", "auto", {
+    resolve: resolveAutoHints
+  });
+
+  CodeMirror.registerHelper("hint", "fromList", function(cm, options) {
+    var cur = cm.getCursor(), token = cm.getTokenAt(cur)
+    var term, from = CodeMirror.Pos(cur.line, token.start), to = cur
+    if (token.start < cur.ch && /\w/.test(token.string.charAt(cur.ch - token.start - 1))) {
+      term = token.string.substr(0, cur.ch - token.start)
+    } else {
+      term = ""
+      from = cur
+    }
+    var found = [];
+    for (var i = 0; i < options.words.length; i++) {
+      var word = options.words[i];
+      if (word.slice(0, term.length) == term)
+        found.push(word);
+    }
+
+    if (found.length) return {list: found, from: from, to: to};
+  });
+
+  CodeMirror.commands.autocomplete = CodeMirror.showHint;
+
+  var defaultOptions = {
+    hint: CodeMirror.hint.auto,
+    completeSingle: true,
+    alignWithWord: true,
+    closeCharacters: /[\s()\[\]{};:>,]/,
+    closeOnPick: true,
+    closeOnUnfocus: true,
+    updateOnCursorActivity: true,
+    completeOnSingleClick: true,
+    container: null,
+    customKeys: null,
+    extraKeys: null,
+    paddingForScrollbar: true,
+    moveOnOverlap: true,
+  };
+
+  CodeMirror.defineOption("hintOptions", null);
+});

+ 67 - 47
src/renderer/cocoblockly-x/msg/en.js

@@ -4,9 +4,9 @@ Ardublockly.LOCALISED_TEXT = {
     translationLanguage: "English",
     title: "CocoBlockly V",
     blocks: "Blocks",
-    hardware_mode: "Building blocks",
+    hardware_mode: "Block Mode",
     console_mode:"Console",
-    code_mode: "Code Mode",
+    code_mode: "Coding Mode",
     mcu_module: "IoT Module",
     ai_module: "A.I. Module",
     ai_module_1: "A.I.",
@@ -29,16 +29,16 @@ Ardublockly.LOCALISED_TEXT = {
     feedback: "Feedback Form",
     devices: "Devices",
     language: "Language",
-    editing: "Enable Editing",
+    editing: "Enable Editing Mode",
     close_editing: "Whether to enable edit mode",
     AI_experience: "AI",
     AI_emotion: "Emotion Recognotion",
     AI_speech: "Speech Recognotion",
     AI_speech_1: "Speech recording and recognition",
-    AI_speech_2: "Phonetic Pinyin recognition",
+    AI_speech_2: "Speech Pinyin Recognition",
     storage: "Storage",
     cloud_storage: "Cloud",
-    cloudFileTooltip: "Click「 + 」button to save your file as new one",
+    cloudFileTooltip: "Click「 + 」to store the file in the cloud",
     cloudopen: "Cloud Open",
     cloudclose: "Cloud Close",
     local_storage: "Files",
@@ -96,7 +96,7 @@ Ardublockly.LOCALISED_TEXT = {
     user_school: "Your School: ",
     Event: "Cloud Event: ",
 
-    login_wrongNOP: "Wrong Email or Password!",
+    login_wrongNOP: "Incorrect password or username!",
     login_ForgetRecap: "Please verify reCaptcha !",
     port: "Port:",
     no_line_ending: "No line ending",
@@ -159,7 +159,7 @@ Ardublockly.LOCALISED_TEXT = {
     autoScroll: "Autoscroll",
     sendMsg: "Sending Messages",
     sendBtn: "SEND",
-    serial_plotter: "The data to print",
+    serial_plotter: "Serial Data Display",
     serial_visualization: "File viewing",
     send_module: "Send Module",
     send_cloud: "Send Cloud",
@@ -167,6 +167,9 @@ Ardublockly.LOCALISED_TEXT = {
     disConnect:"DISCONNECT",
     addDevice:"ADD Device",
     disconnectBtn: "DISCONNECT Device",
+    InExecution:"performing sth....",
+    ExecutedSuccessfully:"Successful implementation!",
+    ExecutedFail:"Failed to run!",
     update_file: "Update file or folder",
     choose_file: "Select file or folder",
     download_file: "Download",
@@ -174,7 +177,7 @@ Ardublockly.LOCALISED_TEXT = {
     operation: "Operation",
     comms_clear: "CLEAR",
     comms_export: "EXPORT",
-    modal_export_title: "choose the file type you want to save as",
+    modal_export_title: "choose the file type you want to save",
     modal_export_comfirm: "comfirm",
 
     /* Toolbox Categories */
@@ -199,8 +202,8 @@ Ardublockly.LOCALISED_TEXT = {
     catVision: "Image Process",
     catIV: "Video Process",
     catAudio: "Audio Process",
-    catModels: "Artificial intelligence model",
-    catAI: "Basic hardware",
+    catModels: "AI",
+    catAI: "Basic Hardware",
     catAIScreen: "Screen",
     catIOTScreen: "Screen",
     catFiles: "Files",
@@ -209,7 +212,7 @@ Ardublockly.LOCALISED_TEXT = {
     catFunctions: "Functions",
     catOutput: "Input / Output",
     catTime: "Time",
-    catComms: "Serial Comm.",
+    catComms: "Serial Communication",
     catBasics: "Basics",
     catIoTService:"Internet of things",
     catSensor:"Sensor",
@@ -249,7 +252,7 @@ Ardublockly.LOCALISED_TEXT = {
     catEasyMode: "EasyMode",
     catBlynk: "Blynk",
     /* ExtendedFunction*/
-    ExtendedFunction: "Media processing",
+    ExtendedFunction: "Media Processing",
     UAV:"UAV",
     IOT: "IoT",
     System:"System",
@@ -284,28 +287,29 @@ Ardublockly.LOCALISED_TEXT = {
     basis_audio: "Speaker",
     basis_speech_recognition: "Speech Recording Recognition",
     basis_speech_pinyin_recognition: "Speech Phonetic Recognition",
-    basis_number_recognition: "Hand-written Digit Recognition",
-    Guesswork_recognition: "Guesswork recognition",
+    basis_number_recognition: "Handwritten Digit Recognition",
+    Guesswork_recognition: "Guesswork Recognition",
     basis_object_recognition: "Object Detection",
     area_color_analysis: "Area color analysis",
-    edge_detection:"Real-time edge detection",
-    image_edge_detection: "Image edge detection",
-    digital_recognition: "Digital recognition",
-    self_learning: "Self-learning",
+    edge_detection:"Realtime Edge Detection",
+    image_edge_detection: "Image Edge Detection",
+    digital_recognition: "Digital Recognition",
+    self_learning: "Self-learning acquisition",
+    self_learning_recognize: "Self-learning recognition",
     custom_training: "Custom training road sign recognition",
-    online_face_recognition: "On-line face detection",
-    online_text_to_voice: "Online Text To Voice",
+    online_face_recognition: "Online Face Detection",
+    online_text_to_voice: "Online Text Voice",
     online_speech_recognition: "Online Speech Recognition",
     online_license_plate_recognition: "Online License Plate Recognition",
-    machine_translation: "Machine translation",
-    handwritten_text: "Handwritten text",
-    formula:"Formula recognition",
+    machine_translation: "Machine Translation",
+    handwritten_text: "Handwritten Text",
+    formula:"Formula Recognition",
     basis_face_recognition: "Face Detection",
     human_detection: "Human Detection",
-    basis_face_recognition_1: "Face recognition",
+    basis_face_recognition_1: "Face Recognition",
     basis_face_Intelligent: "Intelligent gate for face recognition",
     basis_model_recognition: "Custom Model Recognition",
-    basis_card_recognition: "License plate recognition",
+    basis_card_recognition: "License Plate Recognition",
     basis_touch: "Touch",
     basis_buzzer: "Buzzer",
     basis_environmental: "Temperature And Humidity Sensor",
@@ -317,6 +321,7 @@ Ardublockly.LOCALISED_TEXT = {
     basis_ws: "WebSocket",
     basis_service_cococloud: "CocoCloud",
     basis_ifttt: "IFTTT",
+    Get_weather: "Get weather",
     basis_service_thingspeak: "ThingSpeak",
     basis_service_KUJU: "KUJU",
     basis_service_WeTech: "WeTech",
@@ -328,13 +333,13 @@ Ardublockly.LOCALISED_TEXT = {
 
     basis_function: "Basic Functions",
     advanced_function: "Advanced Functions",
-    graphics_decoding: "Barcode Recognition",
+    graphics_decoding: "Graphic Decoding",
     looking_graphic: "Shape Recognition",
     Custom_face_recognition: "Custom Face Recognition",
     Custom_model_class_recognition: "Custom object recognition",
     experimental_features: "Experimental Features",
 
-    Record_audio: "Record Audio",
+    Record_audio: "Audio Recording",
 
     basis_robot_command: "Basic Instruction",
     speech_control: "Speech Control",
@@ -360,6 +365,14 @@ Ardublockly.LOCALISED_TEXT = {
     compile: "COMPILE",
     lib: "LINRARY",
     errmsg: "Error Message",
+    UpdateContent:"Update content",
+    updateblock:"Building blocks",
+    updateexample:"Example",
+    LoadingH4:"Latest Updates and Notes",
+    LoadingH4history:"History update record",
+    attentionContent:"Precautions",
+    LatestUpdate:"LatestUpdate",
+    HistoricalUpdate:"History Update",
 
     /* examples */
     basicMarquee: "Marquee",
@@ -571,13 +584,15 @@ Ardublockly.LOCALISED_TEXT = {
     switch_pictures:"Automatic picture switching",
     switch_background:"Press the button to change the background color",
     Angular_rotation:"Angular rotation",
+    Rambler:"Mini-game: Rambler",
+    BreathingLamp:"Breathing lamp",
     select_line: "button control screen linewise",
     select_LF: "LED Lamp flicker",
     select_DCLS: "Dial control LED switch",
     select_BCL: "Button-Controlled LED",
     select_LGD: "LCD graphic drawing animation",
     select_FTCLS: "Four Touch control LED switch",
-    select_DOLD: "LCD wiggle detector",
+    select_DOLD: "LCD Vibration Monitor",
     select_TCSOL: "Touch-controlled square on LCD",
     select_SER: "LCD display environment data",
     select_NW: "IoT module networking case",
@@ -588,6 +603,7 @@ Ardublockly.LOCALISED_TEXT = {
     select_CV: "AI module vision case",
     select_CAOSR: "LCD button control color switch",
     select_QCR: "QR Code Recogntion",
+    bar_code: "Bar code Recogntion",
     line_tracking: "Line Tracking (Black Line)",
     select_LR: "Line Recogntion",
     select_AI: "AI module machine learning case",
@@ -773,18 +789,18 @@ Ardublockly.LOCALISED_TEXT = {
 
 
     uploadFiles: "Upload",
-    catSerialComm: "Serial Comm.",
+    catSerialComm: "Serial communication",
 
     select_CSDAOD: "Connection hotspot and HTTP client",
     select_ISED: "IFTTT sending environment data",
     select_ITE: "IFTTT trigger event",
     select_MSD: "Thingspeak sends data and gets the latest data",
     select_SBS: "Area color analysis",
-    select_LFGC: "Looking for green circles",
+    select_LFGC: "Looking for blue",
     select_MC: "Camera",
     img_transmission_show:"Image transfer display computer",
     select_ARATOOC: "LCD drawing graphic animation",
-    select_FGAAT: "Find green areas and track",
+    select_FGAAT: "Find blue areas and track",
     select_RCI: "Record camera image ",
     select_MAOSS: "Microphone analysis of sound spectrum",
     select_PAF: "Play audio file",
@@ -938,13 +954,17 @@ Ardublockly.LOCALISED_TEXT = {
     a_csm: "Change Startup Mode",
     a_butvmi: "Boot Up the Visual Menu InterFace",
     a_buartlp: "Boot Up and Run the Last Program",
-    Serial_Interaction: "Terminal interaction window",
-    image_transmission:"Image transmission",
+    Serial_Interaction: "Terminal Interaction Window",
+    image_transmission:"Image Transmission",
     error_pv: "Problem: variable not defined, code error, please check the building block",
     error_unindent: "Problem: code format problem, check the code or contact our staff ",
     error_pp: "Permission problem, please re open the software, or the third-party software occupies the port",
     error_tc: "The code is wrong or the third-party library is not introduced. There is a problem with the firmware version",
     error_tp: "The program has timed out. Please run it again",
+    TypeError:"Problem: Type error",
+    KeyError:"Problem: Dictionary key error",
+    AttributeError:"Problem: Attribute error",
+    IndexError:"Problem: List Index Error",
     "EPERM": "Operation not permitted",
     "ENOEN": "No such file or directory",
     "ESRCH": "No such process",
@@ -985,21 +1005,21 @@ Ardublockly.LOCALISED_TEXT = {
     "EINPROGRE": "Operation now in progress",
 
     
-    OnlineIdentify:"Online artificial intelligence",
-    xunfeiIndetify:"Online artificial intelligence",
-    FaceIndetify:"On-line face detection",
-    VoiceIndetify:"Online speech recognition",
-    textConVoice:"Online text to speech",
-    card_indetify:"Online license plate recognition ",
-    machine_translation:"Online machine translation ",
+    OnlineIdentify:"Online Artificial Intelligence",
+    xunfeiIndetify:"Online Artificial Intelligence",
+    FaceIndetify:"Online Face Detection",
+    VoiceIndetify:"Online Speech Recognition",
+    textConVoice:"Online Text Speech",
+    card_indetify:"Online License Plate Recognition ",
+    machine_translation:"Online Machine Translation ",
     set_Wifi:"Connect to the Internet via Wi-Fi",
     online_object_indetify:"Online Object Recognition",
-    update_logs:"Update log",
-    Handwritten_texts:"Handwritten character recognition",
+    update_logs:"Update Log",
+    Handwritten_texts:"Handwritten Character Recognition",
     auxiliary: "auxiliary tools",
     system_SDFormatterv4:" This is a memory formattable software, by this software, you can format the memory card, you can make the memory card installed 831 mirror system ",
-    system_PhoenixCard:" This is a piece of software that burns the image system file to the memory card ",
-    system_file:" This is the file in our mirror system. After the system image is burned, we need to unzip the package and put it into the system file.",
+    system_PhoenixCard:" This is an application that writes system image files to an memory card.",
+    system_file:" This is a file within our disk image. After flashing the disk image, you'll need to decompress this archive and incorporate it into the system files.",
     android_zip:" This is a Google Chrome installation package for Android phones. Android allows you to experience our platform on your phone." ,
     light_value:" light value display ",
     temperature_and_humidity:" Temperature and humidity screen displays",
@@ -1013,11 +1033,11 @@ Ardublockly.LOCALISED_TEXT = {
     SSIDPWD:"Please enter the name and password",
     SSID:"WiFi Name",
     PWD:"WiFi Password",
-    CocoPi_note:"Open the code scanning networking example on CocoPi, scan the two-dimensional code on the screen, and connect to the Internet",
+    CocoPi_note:"Launch the QR code networking example on CocoPi, scan the on-screen QR code, and connect to the internet.",
     wifiProblem:"wifiProblem with your wireless connection",
     problem1:"1. Connect the modules and platform under the same network first;" ,
     problem2:"2. Fill in the IP address successfully obtained for networking ",
-    problem3:"3. It needs your consent to problem3",
-    problem4:"4. Click the button below and the page will jump",
+    problem3:"3. This method requires your permission for access",
+    problem4:"4. Click the button below, the page will redirect",
     screenshot: "Capture"
 }

+ 24 - 6
src/renderer/cocoblockly-x/msg/zh-hans.js

@@ -164,6 +164,9 @@ Ardublockly.LOCALISED_TEXT = {
     disConnect:"断开连接",
     addDevice:"添加设备",
     disconnectBtn: "断开设备",
+    InExecution:"执行中...",
+    ExecutedSuccessfully:"执行成功!",
+    ExecutedFail:"执行失败",
     update_file: "更新文件或文件夹",
     choose_file: "选择文件或文件夹",
     file_name: "文件名",
@@ -260,7 +263,8 @@ Ardublockly.LOCALISED_TEXT = {
     edge_detection:"实时边缘检测",
     image_edge_detection: "图片边缘检测",
     digital_recognition: "数字识别",
-    self_learning: "自我学习",
+    self_learning: "自学习采集",
+    self_learning_recognize: "自学习识别",
     custom_training: "自定义训练路标识别",
     online_face_recognition: "在线人脸检测",
     online_text_to_voice: "在线文本转语音",
@@ -286,6 +290,7 @@ Ardublockly.LOCALISED_TEXT = {
     basis_ws: "WebSocket",
     basis_service_cococloud: "CocoCloud",
     basis_ifttt: "IFTTT",
+    Get_weather: "获取天气",
     basis_service_thingspeak: "ThingSpeak",
     basis_service_KUJU: "KUJU",
     basis_service_WeTech: "WeTech",
@@ -319,7 +324,14 @@ Ardublockly.LOCALISED_TEXT = {
     compile: "编译",
     lib: "库文件",
     errmsg: "错误信息",
-
+    UpdateContent:"更新内容",
+    updateblock:"积木",
+    updateexample:"样例",
+    LoadingH4:"最新更新及注意事项",
+    LoadingH4history:"历史更新记录",
+    attentionContent:"注意事项",
+    LatestUpdate:"最新更新",
+    HistoricalUpdate:"历史更新",
     //new added categories
     catBasic: "教学板",
     catCocoMod: "模块",
@@ -620,6 +632,8 @@ Ardublockly.LOCALISED_TEXT = {
     switch_pictures:"自动切换图片",
     switch_background:"按键切换背景色",
     Angular_rotation:"旋转指定角度",
+    Rambler:"小游戏:漫步者",
+    BreathingLamp:"呼吸灯",
     select_line: "按键控制屏幕直线转动",
     select_LF: "LED 灯闪烁",
     select_DCLS: "拨盘控制LED灯开关",
@@ -637,6 +651,7 @@ Ardublockly.LOCALISED_TEXT = {
     select_CV: "AI 模块视觉案例",
     select_CAOSR: "LCD按钮控制颜色切换",
     select_QCR: "二维码识别",
+    bar_code: "条形码识别",
     line_tracking: "视觉循迹(黑线)",
     select_LR: "直线识别",
     select_AI: "AI模块机器学习案例",
@@ -703,7 +718,7 @@ Ardublockly.LOCALISED_TEXT = {
     ai_gc: "垃圾分类",
     ai_wsb: "垃圾分类回收箱",
 
-    serial_comm: "串口通讯()",
+    serial_comm: "串口通讯()",
     serial_comm_fa: "串口通讯(发)",
     serial_comm_iot_send: "发送光线强度值至云端",
     serial_comm_ai_get: "AI屏幕显示串口光线强度值(配合1使用)",
@@ -829,11 +844,11 @@ Ardublockly.LOCALISED_TEXT = {
     select_ITE: "IFTTT触发事件",
     select_MSD: "ThingSpeak发送数据及获取最新数据",
     select_SBS: "区域颜色分析",
-    select_LFGC: "寻找绿色的圆形",
+    select_LFGC: "寻找蓝色",
     select_MC: "照相机",
     img_transmission_show:"图像传输显示电脑",
     select_ARATOOC: "LCD绘制图形动画",
-    select_FGAAT: "寻找绿色区域并追踪",
+    select_FGAAT: "寻找色区域并追踪",
     select_RCI: "录制摄像头画面",
     select_MAOSS: "麦克风分析声音频谱",
     select_PAF: "播放音频文件",
@@ -994,7 +1009,10 @@ Ardublockly.LOCALISED_TEXT = {
     error_pp: "权限问题,请重新打开软件,或者第三方软件占用了端口",
     error_tc: "代码错误或者未引入第三方库固件版本有问题",
     error_tp: "程序运行超时,请重新运行",
-
+    TypeError:"问题:类型错误",
+    KeyError:"问题:字典键错误",
+    AttributeError:"问题:属性错误",
+    IndexError:"问题:数组索引错误",
     "EPERM": "不允许操作",
     "ENOEN": "没有这样的文件或目录",
     "ESRCH": "没有这样的过程",

+ 26 - 7
src/renderer/cocoblockly-x/msg/zh-hant.js

@@ -163,6 +163,9 @@ Ardublockly.LOCALISED_TEXT = {
     disConnect:"斷開連接",
     addDevice:"添加設備",
     disconnectBtn: "斷開設備",
+    InExecution:"執行中...",
+    ExecutedSuccessfully:"執行成功!",
+    ExecutedFail:"執行失敗!",
     update_file: "更新文件或資料夾",
     choose_file: "選擇文件或資料夾",
     file_name: "文件名",
@@ -261,7 +264,8 @@ Ardublockly.LOCALISED_TEXT = {
     edge_detection:"實時邊緣檢測",
     image_edge_detection: "圖片邊緣檢測",
     digital_recognition: "數字識別",
-    self_learning: "自我學習",
+    self_learning: "自學習采集",
+    self_learning_recognize: "自學習識別",
     custom_training: "自定義訓練路標識別",
     online_face_recognition: "在線人臉檢測",
     online_text_to_voice: "在線文本轉語音",
@@ -274,7 +278,7 @@ Ardublockly.LOCALISED_TEXT = {
     human_detection: "人體檢測",
     basis_face_recognition_1: "人臉辨識",
     basis_face_Intelligent: "人臉辨識智慧門",
-    basis_model_recognition: "自定義模型識別",
+    basis_model_recognition: "客製化模型",
     basis_card_recognition: "車牌識別",
     basis_touch: "觸摸",
     basis_buzzer: "蜂鳴器",
@@ -287,6 +291,7 @@ Ardublockly.LOCALISED_TEXT = {
     basis_ws: "WebSocket",
     basis_service_cococloud: "CocoCloud",
     basis_ifttt: "IFTTT",
+    Get_weather: "獲取天氣",
     basis_service_thingspeak: "ThingSpeak",
     basis_service_KUJU: "KUJU",
     basis_service_WeTech: "WeTech",
@@ -320,7 +325,15 @@ Ardublockly.LOCALISED_TEXT = {
     compile: "編譯",
     lib: "庫檔案",
     errmsg: "錯誤訊息",
-
+    
+    UpdateContent:"更新內容",
+    updateblock:"積木",
+    updateexample:"樣例",
+    LoadingH4:"最新更新及注意事項",
+    LoadingH4history:"歷史更新記錄",
+    attentionContent:"注意事項",
+    LatestUpdate:"最新更新",
+    HistoricalUpdate:"歷史更新",
     //new added categories
     catBasic: "教學板",
     catCocoMod: "模組",
@@ -622,6 +635,8 @@ Ardublockly.LOCALISED_TEXT = {
     switch_pictures:"自動切換圖片",
     switch_background:"按鍵切換背景色",
     Angular_rotation:"旋轉指定角度",
+    Rambler:"小游戲:漫步者",
+    BreathingLamp:"呼吸燈",
     select_line: "按鍵控制螢幕直線轉動",
     select_LF: "LED 燈閃爍",
     select_DCLS: "撥盤控制 LED 燈開關",
@@ -639,6 +654,7 @@ Ardublockly.LOCALISED_TEXT = {
     select_CV: "AI 模組視覺案例",
     select_CAOSR: "LCD 按鈕控制顏色切換",
     select_QCR: "二維碼識別",
+    bar_code: "條形碼識別",
     line_tracking: "視覺尋跡(黑線)",
     select_LR: "直線識別",
     select_AI: "AI 模組機器學習案例",
@@ -692,7 +708,7 @@ Ardublockly.LOCALISED_TEXT = {
     ai_tpl2: "循線(單線)",
     ai_tph: "自動駕駛(香港標識)",
 
-    serial_comm: "串口通訊()",
+    serial_comm: "串口通訊()",
     serial_comm_fa: "串口通訊(發)",
     serial_comm_iot_send: "發送光線強度值至雲端",
     serial_comm_ai_get: "AI螢幕顯示串口光線強度值(配合1使用)",
@@ -893,10 +909,10 @@ Ardublockly.LOCALISED_TEXT = {
     select_ITE: "IFTTT觸發事件",
     select_MSD: "ThingSpeak 發送數據及獲取最新數據",
     select_SBS: "區域顏色分析",
-    select_LFGC: "尋找綠色的圓形",
+    select_LFGC: "尋找藍色",
     select_MC: "照相機",
     select_ARATOOC: "LCD 繪製圖形動畫",
-    select_FGAAT: "尋找色區域並追跡",
+    select_FGAAT: "尋找色區域並追跡",
     select_RCI: "錄制攝像頭畫面",
     select_MAOSS: "麥克風分析聲音頻譜",
     select_PAF: "播放音訊檔案",
@@ -972,7 +988,10 @@ Ardublockly.LOCALISED_TEXT = {
     error_pp: "許可權問題,請重新打開軟件,或者協力廠商軟件佔用了埠",
     error_tc: "程式碼錯誤或者未引入協力廠商庫固件版本有問題",
     error_tp: "程式運行超時,請重新運行",
-
+    TypeError:"問題:類型錯誤",
+    KeyError:"問題:字典鍵錯誤",
+    AttributeError:"問題:屬性錯誤",
+    IndexError:"問題:數組索引錯誤",
     "EPERM": "不允許操作",
     "ENOEN": "沒有這樣的文件或目錄",
     "ESRCH": "沒有這樣的過程",

+ 27 - 12
src/renderer/cocoblockly-x/src/blockly/account.js

@@ -76,7 +76,7 @@ function getCloudFileList() {
       withCredentials: true
     },
     success: fileList => {
-      console.log(fileList, 'getCloudFileList')
+      // console.log(fileList, 'getCloudFileList')
       updateCloudFileList(fileList);
       updateCloudFilePanel();
       // openCloudFile(CCB.cloudFileList[i].filename); 打开文件
@@ -252,6 +252,7 @@ function renameCloudFile(newName, oldName) {
 
       let i = indexGet(oldName, CCB.cloudFileList);
       CCB.cloudFileList[i].filename = newName;
+      CCB.cloudFileList[i].filenameId = CCB.cloudFileList[i].filenameId.split("_")[0]+"_"+newName
       if (CCB.selectCloudFile == oldName) {
         CCB.selectCloudFile = newName;
       }
@@ -488,14 +489,14 @@ function updateCloudFilePanel() {
         "</div>";
     } else {
       renderContent = '<div id="' + CCB.cloudFileList[i].filenameId +
-        '" class="card ">' +
+        '" class="card "  onclick="fileOpen(' + i + ')">' +
         // * *
         '  <ul class="cloud-btnPanel">' +
-        '    <li class="cloudBtn-open"><img src="./images/cloudfileopen.png" class="material-icons" style="width:22px;margin-right:6px;top:-1px;position:relative;cursor:pointer" onclick="fileOpen(' + i + ')"></li>' +
-        '    <li class="cloudBtn-share"><i class="material-icons" href="#share" onclick="fileShare(' + i + ')" >share</i></li>' +
+        '    <li style="float:left;" class="cloudBtn-share"><i class="material-icons" href="#share" onclick="fileShare(' + i + ')" >share</i></li>' +
+        // '    <li class="cloudBtn-open"><img src="./images/cloudfileopen.png" class="material-icons" style="width:22px;margin-right:6px;top:-1px;position:relative;cursor:pointer"></li>' +
         // '    <li style="float:left;" class="unblock cloudBtn-update"><i class="material-icons" onclick="fileUpdate(' + i + ')">save</i></li>' +
-        '    <li style="float:left;" class="cloudBtn-update"><i class="material-icons" onclick="fileUpdate(' + i + ')">save</i></li>' +
-        '    <li class="cloudBtn-rename"><i class="material-icons" onclick="fileRename(' + i + ')">edit</i></li>' +
+        '    <li class="cloudBtn-update"><i class="material-icons" onclick="fileUpdate(' + i + ')">save</i></li>' +
+        // '    <li class="cloudBtn-rename"><i class="material-icons" onclick="fileRename(' + i + ')">edit</i></li>' +
         '    <li class="cloudBtn-delete"><i class="material-icons" onclick="fileDelete(' + i + ')">delete</i></li>' +
         "  </ul>" +
         //icon option:  remove_red_eye , place , personal_video , nature, edit_location ,bookmark
@@ -505,7 +506,7 @@ function updateCloudFilePanel() {
         "  </div>" +
         '  <div class="card-content">' +
         '    <div id="cloud_info_panel' + i + '"class="cloudInfoPanel">' +
-        '      <span id="cloud_name' + i + '" class="ac-card-title card-title grey-text text-darken-4 " title="' + CCB.cloudFileList[i].filename + (CCB.cloudFileList[i].type ? "." + CCB.cloudFileList[i].type : '.xml') + '">' + CCB.cloudFileList[i].filename + (CCB.cloudFileList[i].type ? "." + CCB.cloudFileList[i].type : '.xml') + "</span>" +
+        '      <span style="display:inline-block" id="cloud_name' + i + '" class="ac-card-title card-title grey-text text-darken-4 " title="' + CCB.cloudFileList[i].filename + (CCB.cloudFileList[i].type ? "." + CCB.cloudFileList[i].type : '.xml') + '">' + CCB.cloudFileList[i].filename + (CCB.cloudFileList[i].type ? "." + CCB.cloudFileList[i].type : '.xml') + "</span><i style='position: relative;top: -8px;' class='material-icons' onclick='fileRename(" + i + ")'>edit</i>" +
         "      <p>" + lastModified + '<span id="cloud_time' + i + '"> ' + CCB.cloudFileList[i].time + " </span>" +
         "      </p>" +
         "    </div>" +
@@ -556,9 +557,6 @@ function updateCloudFilePanel() {
 function fileOpen(i) {
   $("#cloud_modal_preload").css("display", "block")
   openCloudFile(CCB.cloudFileList[i].filenameId);
-
-
-
 }
 
 
@@ -566,6 +564,7 @@ function fileShare(i) {
   let url = window.location.href + '&Qd=' + CCB.cloudFileList[i].filenameId;
   let flag = copyText(url);
   flag ? Materialize.toast(CCB.str_group.share_success, 3000, "shareUrl") : Materialize.toast(CCB.str_group.share_fail, 3000, "shareUrl")
+  stopPropagation()
 }
 
 /**
@@ -599,6 +598,7 @@ function copyText(text) {
 function fileUpdate(i) {
   $("#cloud_modal_preload").css("display", "block")
   updateCloudFile(CCB.cloudFileList[i].filename, CCB.cloudFileList[i].type);
+  stopPropagation()
 }
 
 /**
@@ -607,6 +607,7 @@ function fileUpdate(i) {
  */
 function fileDelete(i) {
   cloudFileState("delete", i);
+  stopPropagation()
 }
 
 /**
@@ -617,6 +618,16 @@ function fileDelete(i) {
 function fileRename(i) {
   renameBoxSet(i);
   cloudFileState("rename", i);
+  stopPropagation()
+}
+
+function stopPropagation(e) {
+  e = e || window.event;
+  if (e.stopPropagation) { //W3C阻止冒泡方法  
+    e.stopPropagation();
+  } else {
+    e.cancelBubble = true; //IE阻止冒泡方法  
+  }
 }
 
 /**
@@ -640,6 +651,7 @@ function confirmRename(i) {
  */
 function cancelRename(i) {
   cloudFileState("over", i);
+  stopPropagation()
 }
 
 /**
@@ -648,6 +660,7 @@ function cancelRename(i) {
  */
 function confirmDelete(i) {
   deleteCloudFile(CCB.cloudFileList[i].filename);
+  stopPropagation()
 }
 
 /**
@@ -656,6 +669,7 @@ function confirmDelete(i) {
  */
 function cancelDelete(i) {
   cloudFileState("over", i);
+  stopPropagation()
 }
 
 /**
@@ -673,7 +687,6 @@ function confirmCreateNew() {
   filename = filename.replace(/(\s*$)/g, "");
   if (checkFileName(filename) && filename !== '') {
     createCloudFile(filename);
-
   }
 }
 
@@ -724,7 +737,9 @@ function cloudFileState(status, i) {
 function renameBoxSet(i) {
   var sketchOldName = $("#cloud_name" + i).html().replace(".xml", "");
   var sketchNameInput = $("#cloud_sketch_rename" + i);
-
+  document.getElementById("cloud_sketch_rename" + i).addEventListener("click",function(){
+    stopPropagation()
+  },true)
   sketchNameInput.val(sketchOldName);
   sketchNameInput.attr("size", sketchOldName.length);
   sketchNameInput.keydown();

+ 4 - 1
src/renderer/cocoblockly-x/src/blockly/ardublockly_blockly.js

@@ -387,6 +387,8 @@ Ardublockly.workspace_capture = async function (name) {
     // if (bbox.y < 0) { bbox.y = 0 }
     canvas.appendChild(ws);
     let ctx = canvas.getContext("2d");
+    ctx.fillStyle = "#fff";
+    ctx.fillRect(0,0,canvas.width,canvas.height)
     let xml = new XMLSerializer().serializeToString(ws);
     let test = /xlink:href="[a-zA-z]+:\/\/[^\s]*"/g;
     let test1 = /xlink:href="blockly\/([^\s]*)"/g;
@@ -426,7 +428,8 @@ Ardublockly.workspace_capture = async function (name) {
     var img = new Image();
     img.setAttribute("src", 'data:image/svg+xml;base64,' + btoa(unescape(encodeURIComponent(xml))));
     img.onload = function () {
-        ctx.drawImage(img, 5, 5);
+        ctx.drawImage(img, 15, 15);
+        // ctx.fillStyle = "rgba(255,255,255,0)";
         var canvasdata = canvas.toDataURL("image/png", 1);
         var a = document.createElement("a");
         a.download = name + ".png";

+ 2 - 2
src/renderer/cocoblockly-x/src/blockly/cocoblockly.js

@@ -128,7 +128,7 @@ function getJsonData(filepath) {
 function redirect_based_lang(lang) {
     console.log('System language is: ' + window.navigator.language.toLowerCase());
     if (window.location !== window.parent.location) {
-        console.log("In an iframe.");
+        // console.log("In an iframe.");
         if (document.location.search.indexOf('lang') < 0) {
             if (lang === 'zh-cn' || lang === 'zh')
                 changeLanguage('zh-hans');
@@ -138,7 +138,7 @@ function redirect_based_lang(lang) {
                 changeLanguage('en');
         }
     } else {
-        console.log("Not in an iframe.");
+        // console.log("Not in an iframe.");
         if (document.location.search.indexOf('lang') < 0) {
             if (lang === 'zh-cn' || lang === 'zh')
                 changeLanguage('zh-hans');

+ 7 - 3
src/renderer/cocoblockly-x/src/blockpy.css

@@ -17,8 +17,7 @@
   font-style: normal;
   font-weight: 400;
   src: url(MaterialIcons-Regular.eot);
-  src: local('Material Icons'), local('MaterialIcons-Regular'), url(../fonts/material-design-icons/MaterialIcons-Regular.woff2) format('woff2'),
-    url(../fonts/material-design-icons/MaterialIcons-Regular.woff) format('woff'),
+  src: local('Material Icons'), local('MaterialIcons-Regular'),
     url(../fonts/material-design-icons/MaterialIcons-Regular.ttf) format('truetype');
 }
 
@@ -390,6 +389,11 @@ img.fullscreenIcon {
   font-size: 1rem;
   line-height: 40px;
   font-weight: 200;
+  max-width: 120px;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  -o-text-overflow: ellipsis;
 }
 
 .card-content {
@@ -668,7 +672,7 @@ img.fullscreenIcon {
   font-weight: 400;
   src: url(MaterialIcons-Regular.eot);
   /* For IE6-8 */
-  src: local('Material Icons'), local('MaterialIcons-Regular'), url(./font/material-design-icons/MaterialIcons-Regular.woff2) format('woff2'), url(./font/material-design-icons/MaterialIcons-Regular.woff) format('woff'), url(./font/material-design-icons/MaterialIcons-Regular.ttf) format('truetype');
+  src: local('Material Icons'), local('MaterialIcons-Regular'), url(../font/material-design-icons/MaterialIcons-Regular.ttf) format('truetype');
 }
 
 .material-icons {

+ 320 - 90
src/renderer/cocoblockly-x/src/editor.js

@@ -1554,8 +1554,8 @@ BlockPyEditor.CATEGORY_MAP = {
         '    <block type="esp32_main_controller_time_timer_init"></block>' +
         '    <block type="esp32_main_controller_time_timer_get_current"></block>' +
         '    <block type="esp32_main_controller_time_timer_clear"></block>' +
-        // '    <block type="esp32_main_controller_time_period_timer"></block>' +
-        // '    <block type="esp32_main_controller_time_period_timer_clear"></block>' +
+        '    <block type="esp32_main_controller_time_period_timer"></block>' +
+        '    <block type="esp32_main_controller_time_period_timer_clear"></block>' +
         '</category>',
 
     'Serial Comm.': '<category id="catSerialComm" name="SerialComm" colour="#22b845">' +
@@ -1566,13 +1566,20 @@ BlockPyEditor.CATEGORY_MAP = {
         '            </shadow>' +
         '          </value>' +
         '</block>' +
-        '<block type="serial_write_data">' +
+        '<block type="serial_write_data_coco">' +
         '          <value name="ADD0">' +
         '            <shadow type="text">' +
         '              <field name="TEXT">Data</field>' +
         '            </shadow>' +
         '          </value>' +
         '</block>' +
+        '<block type="serial_write_data">' +
+        '          <value name="ADD1">' +
+        '            <shadow type="text">' +
+        '              <field name="TEXT">Data</field>' +
+        '            </shadow>' +
+        '          </value>' +
+        '</block>' +
         '<block type="serial_read_data_setup"></block>' +
         '<block type="serial_read_data_all"></block>' +
         // '<block type="serial_read_data"></block>' +
@@ -1714,14 +1721,6 @@ BlockPyEditor.CATEGORY_MAP = {
         '<block type="esp32_main_controller_get_light"></block>' +
         '<label id="basis_environmental" text="温湿度传感器" web-class="myLabelStyle" style="font-size:20px;"></label>' +
         '<block type="esp32_main_controller_get_environmental_value"></block>' +
-        // '<label id="basis_buzzer" text="蜂鸣器" web-class="myLabelStyle" style="font-size:20px;"></label>' +
-        // '<block type="esp32_main_controller_set_buzzer"></block>' +
-        // '<block type="esp32_main_controller_turn_off_buzzer"></block>' +
-        // '<block type="esp32_main_controller_turn_off_buzzer"></block>' +
-        // '<label id="" text="MPU6050" web-class="myLabelStyle" style="font-size:20px;"></label>' +
-        // '<block type="esp32_main_controller_motion_acceleration"></block>' +
-        // '<block type="esp32_main_controller_motion_rotation_measurement"></block>' +
-        // '<block type="esp32_main_controller_motion_tilt_angle"></block>' +
         '</category>' +
 
         // 传感器
@@ -1784,18 +1783,18 @@ BlockPyEditor.CATEGORY_MAP = {
         '               </shadow>' +
         '           </value>' +
         '</block>' +
-        '<block type="ai_lcd_WH">' +
-        '           <value name="A">' +
-        '               <shadow type="math_number">' +
-        '                   <field name="NUM">0</field>' +
-        '               </shadow>' +
-        '           </value>' +
-        '           <value name="B">' +
-        '               <shadow type="math_number">' +
-        '                   <field name="NUM">0</field>' +
-        '               </shadow>' +
-        '           </value>' +
-        '</block>' +
+        '        <block type="lcd_set_width_height">' +
+        '      <value name="WIDTH">' +
+        '        <shadow type="math_number">' +
+        '          <field name="NUM">320</field>' +
+        '        </shadow>' +
+        '      </value>' +
+        '      <value name="HEIGHT">' +
+        '        <shadow type="math_number">' +
+        '          <field name="NUM">240</field>' +
+        '        </shadow>' +
+        '      </value>' +
+        '        </block>' +
         '<block type="ai_lcd_font">' +
         '        <value name="save_path">' +
         '              <shadow type="text">' +
@@ -1911,8 +1910,6 @@ BlockPyEditor.CATEGORY_MAP = {
         '            </shadow>' +
         '          </value>' +
         '    </block>' +
-
-
         '    <block type="ai_lcd_ractanglecarvas">' +
         '      <value name="POSA">' +
         '        <block type="lcd_set_position">' +
@@ -1954,6 +1951,47 @@ BlockPyEditor.CATEGORY_MAP = {
         '    </block>' +
 
 
+        '    <block type="ai_lcd_draw_rectangle">' +
+        '      <value name="POSA">' +
+        '        <block type="lcd_set_position">' +
+        '          <value name="POSX">' +
+        '            <shadow type="math_number">' +
+        '              <field name="NUM">0</field>' +
+        '            </shadow>' +
+        '          </value>' +
+        '          <value name="POSY">' +
+        '            <shadow type="math_number">' +
+        '              <field name="NUM">0</field>' +
+        '            </shadow>' +
+        '          </value>' +
+        '        </block>' +
+        '      </value>' +
+        '      <value name="POSB">' +
+        '        <block type="lcd_set_width_height">' +
+        '      <value name="WIDTH">' +
+        '        <shadow type="math_number">' +
+        '          <field name="NUM">320</field>' +
+        '        </shadow>' +
+        '      </value>' +
+        '      <value name="HEIGHT">' +
+        '        <shadow type="math_number">' +
+        '          <field name="NUM">240</field>' +
+        '        </shadow>' +
+        '      </value>' +
+        '        </block>' +
+        '      </value>' +
+        '      <value name="COLOR">' +
+        '        <block type="lcd_set_color">' +
+        '        </block>' +
+        '      </value>' +
+        '          <value name="Scale">' +
+        '            <shadow type="math_number">' +
+        '              <field name="NUM">1</field>' +
+        '            </shadow>' +
+        '          </value>' +
+        '    </block>' +
+
+
         '    <block type="ai_lcd_drawcirclecarvas">' +
         '      <value name="POSA">' +
         '        <block type="lcd_set_position">' +
@@ -2031,6 +2069,8 @@ BlockPyEditor.CATEGORY_MAP = {
         '<block type="ai_camera_snapshot"></block>' +
         '<block type="v831_camera_graph_transmission">' +
         '</block>' +
+        '<block type="v831_camera_internet_transmission">' +
+        '</block>' +
 
         // '<block type="ai_camera_image_property_change"></block>' +
 
@@ -2075,6 +2115,8 @@ BlockPyEditor.CATEGORY_MAP = {
         '          </value>' +
         '</block>' +
         '<block type="ai_audio_play_start"></block>' +
+        '<block type="ai_audio_play_finish"></block>' +
+        '<block type="ai_audio_get_play_status"></block>' +
         '</category>' +
 
         '<category id="catSystem" name="系統" colour="#22398e">' +
@@ -2196,7 +2238,41 @@ BlockPyEditor.CATEGORY_MAP = {
        '       </block>' +
        '   </value>' +
        '</block>' +
-       '<block type="ai_vision_find_rects">' +
+    //    '<block type="ai_vision_find_rects">' +
+    //    '   <value name="xy">' +
+    //    '       <block type="ai_lcd_XY_vision">' +
+    //    '           <value name="A">' +
+    //    '               <shadow type="math_number">' +
+    //    '                   <field name="NUM">0</field>' +
+    //    '               </shadow>' +
+    //    '           </value>' +
+    //    '           <value name="B">' +
+    //    '               <shadow type="math_number">' +
+    //    '                   <field name="NUM">0</field>' +
+    //    '               </shadow>' +
+    //    '           </value>' +
+    //    '       </block>' +
+    //    '   </value>' +
+    //    '   <value name="wh">' +
+    //    '       <block type="ai_lcd_WH_vision">' +
+    //    '           <value name="A">' +
+    //    '               <shadow type="math_number">' +
+    //    '                   <field name="NUM">0</field>' +
+    //    '               </shadow>' +
+    //    '           </value>' +
+    //    '           <value name="B">' +
+    //    '               <shadow type="math_number">' +
+    //    '                   <field name="NUM">0</field>' +
+    //    '               </shadow>' +
+    //    '           </value>' +
+    //    '      </block>' +
+    //    '   </value>' +
+    //    '</block>' +
+       '<block type="ai_vision_find_lines">' +       
+       '   <value name="color">' +
+       '       <block type="ai_vision_get_threshold_default">' +
+       '       </block>' +
+       '   </value>' +
        '   <value name="xy">' +
        '       <block type="ai_lcd_XY_vision">' +
        '           <value name="A">' +
@@ -2225,7 +2301,23 @@ BlockPyEditor.CATEGORY_MAP = {
        '           </value>' +
        '      </block>' +
        '   </value>' +
+       '           <value name="area_threshold">' +
+       '               <shadow type="math_number">' +
+       '                   <field name="NUM">10</field>' +
+       '               </shadow>' +
+       '           </value>' +
+       '           <value name="pixels_threshold">' +
+       '               <shadow type="math_number">' +
+       '                   <field name="NUM">10</field>' +
+       '               </shadow>' +
+       '           </value>' +
+       '           <value name="margin">' +
+       '               <shadow type="math_number">' +
+       '                   <field name="NUM">10</field>' +
+       '               </shadow>' +
+       '           </value>' +
        '</block>' +
+       '<block type="ai_vision_get_blobs"></block>'+
        '<block type="ai_vision_find_blobs">' +       
        '   <value name="color">' +
        '       <block type="ai_vision_get_threshold_default">' +
@@ -2275,6 +2367,7 @@ BlockPyEditor.CATEGORY_MAP = {
        '               </shadow>' +
        '           </value>' +
        '</block>' +
+       '<block type="ai_vision_find_blobs_result"></block>'+
        '<block type="ai_lane_tracking_setup">' +
        '   <value name="color">' +
        '       <block type="ai_vision_get_threshold_default">' +
@@ -2378,6 +2471,16 @@ BlockPyEditor.CATEGORY_MAP = {
        '      </block>' +
        '   </value>' +
        '</block>' +
+    
+       '<label id="graphics_decoding" text="Graphics decoding" web-class="myLabelStyle" style="font-size:20px;"></label>' +
+       '<block type="ai_vision_find_qrcode"></block>' +
+       '<block type="ai_vision_qrcode_get_info"></block>' +
+       '<block type="ai_vision_find_apriltag"></block>' +
+       '<block type="ai_vision_apriltag_get_info"></block>' +
+       // '<block type="ai_vision_find_datamatrices"></block>' +
+       // '<block type="ai_vision_datamatrices_get_info"></block>' +
+       '<block type="ai_vision_find_barcodes"></block>' +
+       '<block type="ai_vision_barcodes_get_info"></block>' +
        '</category>' +
 
 
@@ -2391,6 +2494,7 @@ BlockPyEditor.CATEGORY_MAP = {
 
 
        '<category id="catIV" name="Video" colour="#4d9994">' +
+       '<block type="ai_video_set_init"></block>' +
        '<block type="ai_video_set">' +
        '          <value name="path">' +
        '            <shadow type="text">' +
@@ -2399,6 +2503,8 @@ BlockPyEditor.CATEGORY_MAP = {
        '          </value>' +
        '</block>' +
        '<block type="ai_video_set_play"></block>' +
+       '<block type="ai_video_set_stats"></block>' +
+       '<block type="ai_video_stop_play"></block>' +
        '<block type="ai_video_record_init">' +
        '          <value name="save_path">' +
        '            <shadow type="text">' +
@@ -2459,12 +2565,19 @@ BlockPyEditor.CATEGORY_MAP = {
         '<block type="ai_model_xy"></block>' +
         '<block type="ai_model_face"></block>' +
         '<block type="ai_model_face_attribute"></block>' +
-        // '<label id="human_detection" text="人体检测" web-class="myLabelStyle" style="font-size:20px;"></label>' +
-        // '<block type="ai_model_human_recognition_init"></block>' +
-        // '<block type="ai_model_human_recognition_load"></block>' +
-        // '<block type="ai_model_human_xy"></block>' +
-        // '<block type="ai_model_human"></block>' +
-        // '<block type="ai_model_human_attribute"></block>' +
+        // 车牌识别
+        '<label id="basis_card_recognition" text="车牌识别" web-class="myLabelStyle" style="font-size:20px;"></label>' +
+        '<block type="ai_model_card_recognition_init"></block>' +
+        '<block type="ai_model_card_recognition_load"></block>' +
+        '<block type="ai_model_card_get"></block>' +
+        '<block type="ai_model_card_xy"></block>' +
+        '<block type="ai_model_card_result"></block>' +
+        // '<label id="" text="手势识别" web-class="myLabelStyle" style="font-size:20px;"></label>' +
+        // '<block type="ai_model_gesture_recognition_init"></block>' +
+        // '<block type="ai_model_gesture_recognition_load"></block>' +
+        // '<block type="ai_model_gesture_xy"></block>' +
+        // '<block type="ai_model_gesture"></block>' +
+        // '<block type="ai_model_gesture_attribute"></block>' +
         '<label id="basis_face_recognition_1" text="人脸识别" web-class="myLabelStyle" style="font-size:20px;"></label>' +
         '<block type="face_recognition_init">' +
         '   <value name="class_input">' +
@@ -2485,13 +2598,17 @@ BlockPyEditor.CATEGORY_MAP = {
         '<block type="face_recognition_detection_rectangle"></block>' +
         '<block type="face_recognition_if_face"></block>' +
         '<block type="face_recognition_face_result"></block>' +
-        '<block type="face_recognition_add"></block>' +
-        '<block type="face_recognition_remove"></block>' +
-        '<block type="face_recognition_data_save_path">' +
+        '<block type="face_recognition_add">' +
         '   <value name="class_input">' +
         '      <block type="text"><field name="TEXT">/root/user/model/recorded_face_features.py</field></block>' +
         '   </value>' +
         '</block>' +
+        '<block type="face_recognition_remove"></block>' +
+        // '<block type="face_recognition_data_save_path">' +
+        // '   <value name="class_input">' +
+        // '      <block type="text"><field name="TEXT">/root/user/model/recorded_face_features.py</field></block>' +
+        // '   </value>' +
+        // '</block>' +
         // '<block type="face_recognition_data_save_path">'+
         // '   <value name="class_input">' +
         // '      <block type="text"><field name="TEXT">recorded_face_features</field></block>' +
@@ -2503,7 +2620,7 @@ BlockPyEditor.CATEGORY_MAP = {
         '      <block type="text"><field name="TEXT">/root/user/model/recorded_face_features.py</field></block>' +
         '   </value>' +
         '</block>' +
-        '<block type="face_recognition_data_results"></block>' +
+        // '<block type="face_recognition_data_results"></block>' +
         // '<block type="ai_model_self_learning_result"></block>' +
         '<label id="self_learning" text="自我学习" web-class="myLabelStyle" style="font-size:20px;"></label>' +
         '<block type="ai_model_self_learning_init">' +
@@ -2522,20 +2639,15 @@ BlockPyEditor.CATEGORY_MAP = {
         '   </value>' +
         '</block>' +
         '<block type="ai_model_self_learning_load"></block>' +
+        '<block type="ai_model_self_learning_recognize_load"></block>' +
         '<block type="ai_model_self_learning_add_class"></block>' +
         '<block type="ai_model_self_learning_make_data_set"></block>' +
         '<block type="ai_model_self_learning_picture"></block>' +
         '<block type="ai_model_self_learning_save_modal"></block>' +
         '<block type="ai_model_self_learning_class_verification"></block>' +
         '<block type="ai_model_self_learning_result"></block>' +
-        // 车牌识别
-        // '<label id="basis_card_recognition" text="车牌识别" web-class="myLabelStyle" style="font-size:20px;"></label>' +
-        // '<block type="ai_model_card_recognition_init"></block>' +
-        // '<block type="ai_model_card_recognition_load"></block>' +
-        // '<block type="ai_model_card_xy"></block>' +
-        // '<block type="ai_model_card_result"></block>' +
         
-        // '<block type="ai_model_face_attribute_new"></block>' +
+        // '<block type="ai_model_card_attribute_new"></block>' +
         '<label id="basis_model_recognition" text="Basis model recognition" web-class="myLabelStyle" style="font-size:20px;"></label>' +
         // '<block type="ai_model_customized_init_setup_definition"></block>' +
         '<block type="ai_model_customized_init_setup">' +
@@ -2572,7 +2684,7 @@ BlockPyEditor.CATEGORY_MAP = {
         '<block type="speech_recognition_new_start_recognition"></block>' +
         '<block type="speech_recognition_new_recognition_get_any_result"></block>' +
         '<block type="speech_recognition_new_recognition_get_result"></block>' +
-        '<block type="speech_recognition_clear"></block>' +
+        // '<block type="speech_recognition_clear"></block>' +
         // '<label id="Custom_face_recognition" text="Custom face recognition" web-class="myLabelStyle" style="font-size:20px;"></label>' +
         // '<block type="ai_model_index_custom_initialization_init_1"></block>' +
         // '<block type="ai_model_face_model"></block>' +
@@ -2697,12 +2809,12 @@ BlockPyEditor.CATEGORY_MAP = {
         '<block type="ai_online_ident_init">' +
         '          <value name="A">' +
         '            <shadow type="text">' +
-        '              <field name="TEXT">0cc32695</field>' +
+        '              <field name="TEXT">2a588b52</field>' +
         '            </shadow>' +
         '          </value>' +
         '          <value name="B">' +
         '            <shadow type="text">' +
-        '              <field name="TEXT">MDAwNGZiZTk0OTYyZjU5NzMzN2VlYWVi</field>' +
+        '              <field name="TEXT">MzQyZDE3MmQ1ZThhNjBiODI3ZDEzY2Nk</field>' +
         '            </shadow>' +
         '          </value>' +
         '          <value name="C">' +
@@ -2724,12 +2836,12 @@ BlockPyEditor.CATEGORY_MAP = {
         '<block type="ai_audio_init">' +
         '          <value name="A">' +
         '            <shadow type="text">' +
-        '              <field name="TEXT">0cc32695</field>' +
+        '              <field name="TEXT">2a588b52</field>' +
         '            </shadow>' +
         '          </value>' +
         '          <value name="B">' +
         '            <shadow type="text">' +
-        '              <field name="TEXT">MDAwNGZiZTk0OTYyZjU5NzMzN2VlYWVi</field>' +
+        '              <field name="TEXT">MzQyZDE3MmQ1ZThhNjBiODI3ZDEzY2Nk</field>' +
         '            </shadow>' +
         '          </value>' +
         '          <value name="C">' +
@@ -2754,12 +2866,12 @@ BlockPyEditor.CATEGORY_MAP = {
         '<block type="ai_online_voice_init">' +
         '          <value name="A">' +
         '            <shadow type="text">' +
-        '              <field name="TEXT">0cc32695</field>' +
+        '              <field name="TEXT">2a588b52</field>' +
         '            </shadow>' +
         '          </value>' +
         '          <value name="B">' +
         '            <shadow type="text">' +
-        '              <field name="TEXT">MDAwNGZiZTk0OTYyZjU5NzMzN2VlYWVi</field>' +
+        '              <field name="TEXT">MzQyZDE3MmQ1ZThhNjBiODI3ZDEzY2Nk</field>' +
         '            </shadow>' +
         '          </value>' +
         '          <value name="C">' +
@@ -2780,12 +2892,12 @@ BlockPyEditor.CATEGORY_MAP = {
         // '<block type="ai_online_object_init">' +
         // '          <value name="A">' +
         // '            <shadow type="text">' +
-        // '              <field name="TEXT">0cc32695</field>' +
+        // '              <field name="TEXT">2a588b52</field>' +
         // '            </shadow>' +
         // '          </value>' +
         // // '          <value name="B">' +
         // // '            <shadow type="text">' +
-        // // '              <field name="TEXT">MDAwNGZiZTk0OTYyZjU5NzMzN2VlYWVi</field>' +
+        // // '              <field name="TEXT">MzQyZDE3MmQ1ZThhNjBiODI3ZDEzY2Nk</field>' +
         // // '            </shadow>' +
         // // '          </value>' +
         // '          <value name="C">' +
@@ -2806,12 +2918,12 @@ BlockPyEditor.CATEGORY_MAP = {
         '<block type="ai_online_card_init">' +
         '          <value name="A">' +
         '            <shadow type="text">' +
-        '              <field name="TEXT">0cc32695</field>' +
+        '              <field name="TEXT">2a588b52</field>' +
         '            </shadow>' +
         '          </value>' +
         '          <value name="B">' +
         '            <shadow type="text">' +
-        '              <field name="TEXT">MDAwNGZiZTk0OTYyZjU5NzMzN2VlYWVi</field>' +
+        '              <field name="TEXT">MzQyZDE3MmQ1ZThhNjBiODI3ZDEzY2Nk</field>' +
         '            </shadow>' +
         '          </value>' +
         '          <value name="C">' +
@@ -2832,12 +2944,12 @@ BlockPyEditor.CATEGORY_MAP = {
         '<block type="ai_online_machine_translation_init">' +
         '          <value name="A">' +
         '            <shadow type="text">' +
-        '              <field name="TEXT">0cc32695</field>' +
+        '              <field name="TEXT">2a588b52</field>' +
         '            </shadow>' +
         '          </value>' +
         '          <value name="B">' +
         '            <shadow type="text">' +
-        '              <field name="TEXT">MDAwNGZiZTk0OTYyZjU5NzMzN2VlYWVi</field>' +
+        '              <field name="TEXT">MzQyZDE3MmQ1ZThhNjBiODI3ZDEzY2Nk</field>' +
         '            </shadow>' +
         '          </value>' +
         '          <value name="C">' +
@@ -2858,12 +2970,12 @@ BlockPyEditor.CATEGORY_MAP = {
         '<block type="ai_online_handwritten_text_init">' +
         '          <value name="A">' +
         '            <shadow type="text">' +
-        '              <field name="TEXT">0cc32695</field>' +
+        '              <field name="TEXT">2a588b52</field>' +
         '            </shadow>' +
         '          </value>' +
         // '          <value name="B">' +
         // '            <shadow type="text">' +
-        // '              <field name="TEXT">MDAwNGZiZTk0OTYyZjU5NzMzN2VlYWVi</field>' +
+        // '              <field name="TEXT">MzQyZDE3MmQ1ZThhNjBiODI3ZDEzY2Nk</field>' +
         // '            </shadow>' +
         // '          </value>' +
         '          <value name="C">' +
@@ -2884,12 +2996,12 @@ BlockPyEditor.CATEGORY_MAP = {
         '<block type="ai_online_formula_init">' +
         '          <value name="A">' +
         '            <shadow type="text">' +
-        '              <field name="TEXT">0cc32695</field>' +
+        '              <field name="TEXT">2a588b52</field>' +
         '            </shadow>' +
         '          </value>' +
         '          <value name="B">' +
         '            <shadow type="text">' +
-        '              <field name="TEXT">MDAwNGZiZTk0OTYyZjU5NzMzN2VlYWVi</field>' +
+        '              <field name="TEXT">MzQyZDE3MmQ1ZThhNjBiODI3ZDEzY2Nk</field>' +
         '            </shadow>' +
         '          </value>' +
         '          <value name="C">' +
@@ -2910,12 +3022,12 @@ BlockPyEditor.CATEGORY_MAP = {
         // '<block type="ai_online_ID_card_init">' +
         // '          <value name="A">' +
         // '            <shadow type="text">' +
-        // '              <field name="TEXT">0cc32695</field>' +
+        // '              <field name="TEXT">2a588b52</field>' +
         // '            </shadow>' +
         // '          </value>' +
         // '          <value name="B">' +
         // '            <shadow type="text">' +
-        // '              <field name="TEXT">MDAwNGZiZTk0OTYyZjU5NzMzN2VlYWVi</field>' +
+        // '              <field name="TEXT">MzQyZDE3MmQ1ZThhNjBiODI3ZDEzY2Nk</field>' +
         // '            </shadow>' +
         // '          </value>' +
         // '          <value name="C">' +
@@ -2934,6 +3046,35 @@ BlockPyEditor.CATEGORY_MAP = {
         // '<block type="ai_online_ID_card_result"></block>' +
         '<label id="AI_emotion" text="情绪识别" web-class="myLabelStyle" style="font-size:20px;"></label>' +
         '<block type="ai_online_emotion_init">' +
+        '<value name="path">'+
+        '<block type="dict_create_with_items_insert">' +
+        '  <mutation items="4"></mutation>' +
+        '  <field name="KEY0">age</field>' +
+        '  <field name="KEY1">emotion</field>' +
+        '  <field name="KEY2">gender</field>' +
+        '  <field name="KEY3">expression</field>' +
+        '  <value name="ADD0">' +
+        '    <block type="text" id="lZ1isUT{k!SydZO09dL)">' +
+        '      <field name="TEXT"></field>' +
+        '    </block>' +
+        '  </value>' +
+        '  <value name="ADD1">' +
+        '    <block type="text" >' +
+        '      <field name="TEXT"></field>' +
+        '    </block>' +
+        '  </value>' +
+         ' <value name="ADD2">' +
+        '    <block type="text">' +
+        '      <field name="TEXT"></field>' +
+        '    </block>' +
+        '  </value>' +
+        '  <value name="ADD3">' +
+        '    <block type="text" >' +
+        '      <field name="TEXT"></field>' +
+        '    </block>' +
+         ' </value>' +
+        ' </block>' +
+       '</value>' +
         '</block>' +
         '<block type="ai_online_emotion_loading">' +
         '          <value name="path">' +
@@ -2978,7 +3119,7 @@ BlockPyEditor.CATEGORY_MAP = {
         '<block type="esp32_main_controller_wifi_ntptime"></block>' +
         '</category>' +
         '<category id="" name="Web" colour="#3062c1">' +
-        '<label id="" text="获取天气信息" web-class="myLabelStyle" style="font-size:20px;"></label>' +
+        '<label id="Get_weather" text="获取天气信息" web-class="myLabelStyle" style="font-size:20px;"></label>' +
         '<block type="v831_get_weather_init"></block>' +
         '<block type="v831_set_city_and_time"></block>' +
         
@@ -3001,6 +3142,49 @@ BlockPyEditor.CATEGORY_MAP = {
         '          </value>' +
         '</block>' +
         '<block type="esp32_main_controller_ifttt_touched"></block>' +
+        '<label id="basis_service_thingspeak" text="Basis service thingspeak" web-class="myLabelStyle" style="font-size:20px;"></label>' +
+        '<block type="iot_service_thingspeak">' +
+        '          <value name="ADD0">' +
+        '            <shadow type="math_number">' +
+        '              <field name="NUM">0</field>' +
+        '            </shadow>' +
+        '          </value>' +
+        '</block>' +
+        '<block type="iot_service_thingspeak_read"></block>' +
+        '<block type="iot_service_thingspeak_read_total"></block>' +
+        '<block type="iot_service_thingspeak_read_specific">' +
+        '          <value name="entry">' +
+        '            <shadow type="math_number">' +
+        '              <field name="NUM">1</field>' +
+        '            </shadow>' +
+        '          </value>' +
+        '          <value name="field">' +
+        '            <shadow type="math_number">' +
+        '              <field name="NUM">1</field>' +
+        '            </shadow>' +
+        '          </value>' +
+        '</block>' +
+        '<label id="basis_http" text="Basis http" web-class="myLabelStyle" style="font-size:20px;"></label>' +
+        '<block type="esp32_network_http_get">' +
+        '      <value name="http_get_url">' +
+        '       <shadow type="text">' +
+        '           <field name="TEXT">HTTP://ENTER_AN_URL</field>' +
+        '       </shadow>' +
+        '      </value>' +
+        '</block>' +
+        '<block type="esp32_network_http_post">' +
+        '      <value name="http_post_url">' +
+        '       <shadow type="text">' +
+        '           <field name="TEXT">HTTP://ENTER_AN_URL</field>' +
+        '       </shadow>' +
+        '      </value>' +
+        '      <value name="data">' +
+        '           <block type="dict_create_with_items_insert"></block>' +
+        '      </value>' +
+        '</block>' +
+        '<block type="CocoRobo_get"></block>' +
+        '<block type="esp32_network_http_get_data_from_local_server"></block>' +
+
         '</category>' +
         '<category id="catCloudData" name="云端" colour="#3062c1">' +
         '<label id="basis_service_cococloud" text="Basis service cococloud" web-class="myLabelStyle" style="font-size:20px;"></label>' +
@@ -3034,33 +3218,79 @@ BlockPyEditor.CATEGORY_MAP = {
         '</category>' +
         '</category>',
 
-    // 'ExtendedFunction':
-    //     '<category id="extension_module" name="extension_module" colour="#3163ed">' +
-    //     '<category id="LEDstrip" name="LED strip" colour="#e8795b">' +
-    //     '<block type="esp32_main_controller_led_strip_setup">' +
-    //     '      <value name="io">' +
-    //     '           <shadow type="math_number">' +
-    //     '               <field name="NUM">4</field>' +
-    //     '           </shadow>' +
-    //     '      </value>' +
-    //     '      <value name="led_w">' +
-    //     '            <shadow type="math_number">' +
-    //     '              <field name="NUM">6</field>' +
-    //     '            </shadow>' +
-    //     '      </value>' +
-    //     '      <value name="led_h">' +
-    //     '            <shadow type="math_number">' +
-    //     '              <field name="NUM">6</field>' +
-    //     '            </shadow>' +
-    //     '      </value>' +
-    //     '      <value name="brightness">' +
-    //     '           <shadow type="math_number">' +
-    //     '               <field name="NUM">50</field>' +
-    //     '           </shadow>' +
-    //     '      </value>' +
-    //     '</block>' +
-    //     '</category>' +
-    //     '</category>',
+    'ExtendedFunction':
+        '<category id="extension_module" name="extension_module" colour="#3163ed">' +
+        '<category id="LEDstrip" name="LED strip" colour="#e8795b">' +
+        '<block type="esp32_main_controller_led_strip_setup">' +
+        '      <value name="io">' +
+        '           <shadow type="math_number">' +
+        '               <field name="NUM">1</field>' +
+        '           </shadow>' +
+        '      </value>' +
+        '      <value name="count">' +
+        '            <shadow type="math_number">' +
+        '              <field name="NUM">16</field>' +
+        '            </shadow>' +
+        '      </value>' +
+        '</block>' +
+        '<block type="iot_led_matrix_color_picker"></block>' +
+        '<block type="led_strip_color_rgb">' +
+        '           <value name="rgb_value_r">' +
+        '               <shadow type="math_number">' +
+        '                   <field name="NUM">0</field>' +
+        '               </shadow>' +
+        '           </value>' +
+        '           <value name="rgb_value_g">' +
+        '               <shadow type="math_number">' +
+        '                   <field name="NUM">0</field>' +
+        '               </shadow>' +
+        '           </value>' +
+        '           <value name="rgb_value_b">' +
+        '               <shadow type="math_number">' +
+        '                   <field name="NUM">0</field>' +
+        '               </shadow>' +
+        '           </value>' +
+        '</block>' +
+        '<block type="esp32_main_controller_led_strip_set">' +
+        '      <value name="location">' +
+        '           <shadow type="math_number">' +
+        '               <field name="NUM">1</field>' +
+        '           </shadow>' +
+        '      </value>' +
+        '      <value name="color">' +
+        '           <block type="iot_led_matrix_color_picker"></block>' +
+        '      </value>' +
+        '      <value name="brightness">' +
+        '           <shadow type="math_number">' +
+        '               <field name="NUM">50</field>' +
+        '           </shadow>' +
+        '      </value>' +
+        '</block>' +
+        '<block type="led_strip_show_above"></block>' +
+        '</category>' +
+        '<category id="basis_buzzer" name="蜂鸣器" colour="#d42b03">' +
+        // '<label id="basis_buzzer" text="蜂鸣器" web-class="myLabelStyle" style="font-size:20px;"></label>' +
+        '<block type="esp32_main_controller_set_buzzer_init"></block>' +
+        '<block type="esp32_main_controller_set_buzzer">' +
+        '          <value name="esp32_var_num">' +
+        '            <shadow type="math_number">' +
+        '              <field name="NUM">31</field>' +
+        '            </shadow>' +
+        '          </value>' +
+        '</block>' +
+        '<block type="esp32_main_controller_turn_off_buzzer"></block>' +
+        '<block type="esp32_main_controller_turn_off_buzzer_music">' +
+        '     <value name="beat">' +
+        '         <shadow type="esp32_main_controller_buzzer_set_beat_lite">' +
+        '         </shadow>' +
+        '     </value>' +
+        '</block>' +
+        // '<label id="" text="MPU6050" web-class="myLabelStyle" style="font-size:20px;"></label>' +
+        // '<block type="esp32_main_controller_motion_acceleration"></block>' +
+        // '<block type="esp32_main_controller_motion_rotation_measurement"></block>' +
+        // '<block type="esp32_main_controller_motion_tilt_angle"></block>' +
+        '</category>' +
+        '</category>',
 
     // 'Third_party_Sensor':  // 第三方
     //     '<category id="Third_party_Sensor" name="Third_party_Sensor" colour="#e8795b">' +

+ 314 - 317
src/renderer/cocoblockly-x/src/python/AI/人脸识别.xml

@@ -1,11 +1,11 @@
 <xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
-  <block type="ai_camera_init" id="|^PasLLU=~mr^ft?uXF[" inline="true" x="269" y="-381">
+  <block type="ai_camera_init" id="|^PasLLU=~mr^ft?uXF[" inline="true" x="130" y="-403">
     <next>
       <block type="ai_lcd_screeninit" id="X3a?`8XYpSZ^-n13IVpR" inline="true">
         <field name="isScreen">False</field>
         <next>
           <block type="ai_lcd_createnonecarvas" id="5G%fY@B9TaJx#0-!;v_a">
-            <field name="varitem">canvas</field>
+            <field name="varitem">img_recognized_face</field>
             <value name="wh">
               <block type="lcd_set_width_height" id="8ttwQoZ1G7N_)e65}Jk;">
                 <value name="WIDTH">
@@ -22,6 +22,7 @@
             </value>
             <next>
               <block type="face_recognition_init" id="ym:QNlsxoc(7+~i({*gh">
+                <field name="varitem">people_name_list</field>
                 <value name="class_input">
                   <block type="lists_create_with" id="#IXWcVA`hrN!y0Xoe9`C">
                     <mutation items="3"></mutation>
@@ -44,7 +45,7 @@
                 </value>
                 <next>
                   <block type="variables_set" id="rgc1nUE(iaOwukZyV{:p">
-                    <field name="VAR">NAMEFACERECGNIZER</field>
+                    <field name="VAR">name_of_recognized_face</field>
                     <value name="VALUE">
                       <shadow type="math_number" id="=JXU{]lKKsgz6Obo0W!z">
                         <field name="NUM">0</field>
@@ -55,360 +56,356 @@
                     </value>
                     <next>
                       <block type="variables_set" id="atNuyh93Sex9@6Kcwc2:">
-                        <field name="VAR">SCOREFACERECGNIZER</field>
+                        <field name="VAR">score_of_recognized_face</field>
                         <value name="VALUE">
                           <shadow type="math_number" id=")*Zlih{rX7n{]^s,Fgh*">
                             <field name="NUM">0</field>
                           </shadow>
                         </value>
                         <next>
-                          <block type="variables_set" id="7*/?l#v9syy24akv[.-5">
-                            <field name="VAR">person_nums</field>
+                          <block type="variables_set" id="~Pm5#{Xzo+{{#WlM@*Fd">
+                            <field name="VAR">color</field>
                             <value name="VALUE">
-                              <shadow type="math_number" id=")_a[lsGgRa?/P/Mu+6}4">
+                              <shadow type="math_number" id="Uy7MuH5^;S21`G+C;4Z]">
                                 <field name="NUM">0</field>
                               </shadow>
-                            </value>
-                            <next>
-                              <block type="variables_set" id="~Pm5#{Xzo+{{#WlM@*Fd">
-                                <field name="VAR">color</field>
-                                <value name="VALUE">
-                                  <shadow type="math_number" id="Uy7MuH5^;S21`G+C;4Z]">
+                              <block type="ai_lcd_rgb_value_input" id="Vc-4`2}U7i~0SuNX{=@R">
+                                <value name="rgb_value_r">
+                                  <shadow type="math_number" id="q.^%0,=(9;#wxefn3DQc">
                                     <field name="NUM">0</field>
                                   </shadow>
-                                  <block type="ai_lcd_rgb_value_input" id="Vc-4`2}U7i~0SuNX{=@R">
-                                    <value name="rgb_value_r">
-                                      <shadow type="math_number" id="q.^%0,=(9;#wxefn3DQc">
-                                        <field name="NUM">0</field>
-                                      </shadow>
-                                    </value>
-                                    <value name="rgb_value_g">
-                                      <shadow type="math_number" id="zIZ6Z$4oA)07lq#$Q$zZ">
+                                </value>
+                                <value name="rgb_value_g">
+                                  <shadow type="math_number" id="zIZ6Z$4oA)07lq#$Q$zZ">
+                                    <field name="NUM">0</field>
+                                  </shadow>
+                                </value>
+                                <value name="rgb_value_b">
+                                  <shadow type="math_number" id="FETsELbQ,o,7e~WFha^*">
+                                    <field name="NUM">255</field>
+                                  </shadow>
+                                </value>
+                              </block>
+                            </value>
+                            <next>
+                              <block type="controls_repeat_forever" id="b8is7QZy=:Z.so9DN#l0">
+                                <statement name="DO">
+                                  <block type="variables_set" id="AFce:dz8%[9H@R2Ue9fo">
+                                    <field name="VAR">img_recognized_face</field>
+                                    <value name="VALUE">
+                                      <shadow type="math_number" id="fzQa,^FS/fRr/wqYE!y^">
                                         <field name="NUM">0</field>
                                       </shadow>
+                                      <block type="ai_camera_snapshot" id="0@si./b:FSm;6FD(YuaB"></block>
                                     </value>
-                                    <value name="rgb_value_b">
-                                      <shadow type="math_number" id="FETsELbQ,o,7e~WFha^*">
-                                        <field name="NUM">255</field>
-                                      </shadow>
-                                    </value>
-                                  </block>
-                                </value>
-                                <next>
-                                  <block type="controls_repeat_forever" id="b8is7QZy=:Z.so9DN#l0">
-                                    <statement name="DO">
-                                      <block type="variables_set" id="AFce:dz8%[9H@R2Ue9fo">
-                                        <field name="VAR">img_face_Recognizer</field>
+                                    <next>
+                                      <block type="variables_set" id="/6E1bnwJi:^Gr#[*@!hU">
+                                        <field name="VAR">img_recognized_face</field>
                                         <value name="VALUE">
                                           <shadow type="math_number" id="fzQa,^FS/fRr/wqYE!y^">
                                             <field name="NUM">0</field>
                                           </shadow>
-                                          <block type="ai_camera_snapshot" id="0@si./b:FSm;6FD(YuaB"></block>
-                                        </value>
-                                        <next>
-                                          <block type="variables_set" id="/6E1bnwJi:^Gr#[*@!hU">
-                                            <field name="VAR">img_face_Recognizer</field>
-                                            <value name="VALUE">
-                                              <shadow type="math_number" id="fzQa,^FS/fRr/wqYE!y^">
-                                                <field name="NUM">0</field>
-                                              </shadow>
-                                              <block type="v831_lcd_img_cut" id="6=~Z||TZA!C%BGHKQ@Y]">
-                                                <field name="varitem">img_face_Recognizer</field>
-                                                <value name="xy">
-                                                  <block type="ai_lcd_XY_vision" id="dnPc6E@^ByyqY4S*5nW*">
-                                                    <value name="A">
-                                                      <shadow type="math_number" id="Y91UP6uzuoW:D[Mb|akq">
-                                                        <field name="NUM">0</field>
-                                                      </shadow>
-                                                    </value>
-                                                    <value name="B">
-                                                      <shadow type="math_number" id="r0/ttGag+#-:Z4Z{?)!R">
-                                                        <field name="NUM">0</field>
-                                                      </shadow>
-                                                    </value>
-                                                  </block>
+                                          <block type="v831_lcd_img_cut" id="6=~Z||TZA!C%BGHKQ@Y]">
+                                            <field name="varitem">img_recognized_face</field>
+                                            <value name="xy">
+                                              <block type="ai_lcd_XY_vision" id="dnPc6E@^ByyqY4S*5nW*">
+                                                <value name="A">
+                                                  <shadow type="math_number" id="Y91UP6uzuoW:D[Mb|akq">
+                                                    <field name="NUM">0</field>
+                                                  </shadow>
                                                 </value>
-                                                <value name="wh">
-                                                  <block type="ai_lcd_WH_vision" id="fAuwYkqM1sxX+=Ka=_c.">
-                                                    <value name="A">
-                                                      <shadow type="math_number" id="6,MWAGE]ViTS,c@GpZnn">
-                                                        <field name="NUM">224</field>
-                                                      </shadow>
-                                                    </value>
-                                                    <value name="B">
-                                                      <shadow type="math_number" id=";^ei)-m)a0Un/L+bSE{H">
-                                                        <field name="NUM">224</field>
-                                                      </shadow>
-                                                    </value>
-                                                  </block>
+                                                <value name="B">
+                                                  <shadow type="math_number" id="r0/ttGag+#-:Z4Z{?)!R">
+                                                    <field name="NUM">0</field>
+                                                  </shadow>
+                                                </value>
+                                              </block>
+                                            </value>
+                                            <value name="wh">
+                                              <block type="ai_lcd_WH_vision" id="fAuwYkqM1sxX+=Ka=_c.">
+                                                <value name="A">
+                                                  <shadow type="math_number" id="6,MWAGE]ViTS,c@GpZnn">
+                                                    <field name="NUM">224</field>
+                                                  </shadow>
+                                                </value>
+                                                <value name="B">
+                                                  <shadow type="math_number" id=";^ei)-m)a0Un/L+bSE{H">
+                                                    <field name="NUM">224</field>
+                                                  </shadow>
                                                 </value>
                                               </block>
                                             </value>
+                                          </block>
+                                        </value>
+                                        <next>
+                                          <block type="face_recognition_load" id="jgz389h=^Sti}6|qC-gk">
+                                            <field name="varitem">img_recognized_face</field>
                                             <next>
-                                              <block type="face_recognition_load" id="jgz389h=^Sti}6|qC-gk">
-                                                <field name="varitem">img_face_Recognizer</field>
+                                              <block type="face_recognition_data_load" id="vnUM-82ht{_NullBfmT`">
+                                                <value name="class_input">
+                                                  <block type="text" id="C.3B7)B%{HNx6T12FVS5">
+                                                    <field name="TEXT">/root/user/model/recorded_face_features.py</field>
+                                                  </block>
+                                                </value>
                                                 <next>
-                                                  <block type="face_recognition_data_load" id="vnUM-82ht{_NullBfmT`">
-                                                    <value name="class_input">
-                                                      <block type="text" id="C.3B7)B%{HNx6T12FVS5">
-                                                        <field name="TEXT">/root/user/model/recorded_face_features.py</field>
-                                                      </block>
+                                                  <block type="controls_if" id="ftS+{m|hIvFz}4$W@6_D">
+                                                    <value name="IF0">
+                                                      <block type="face_recognition_if_face" id="LZDduN29qf^Oj7Y3b;*}"></block>
                                                     </value>
-                                                    <next>
-                                                      <block type="controls_if" id="ftS+{m|hIvFz}4$W@6_D">
-                                                        <value name="IF0">
-                                                          <block type="face_recognition_if_face" id="LZDduN29qf^Oj7Y3b;*}"></block>
+                                                    <statement name="DO0">
+                                                      <block type="controls_forEach" id="8H~Q!I2(09Z/^WG95/-L">
+                                                        <field name="VAR">i</field>
+                                                        <value name="LIST">
+                                                          <block type="face_recognition_face_result" id="Pk{Ps~!Mw/5GjW^N8)/n"></block>
                                                         </value>
-                                                        <statement name="DO0">
-                                                          <block type="controls_forEach" id="8H~Q!I2(09Z/^WG95/-L">
-                                                            <field name="VAR">i</field>
-                                                            <value name="LIST">
-                                                              <block type="face_recognition_face_result" id="Pk{Ps~!Mw/5GjW^N8)/n"></block>
+                                                        <statement name="DO">
+                                                          <block type="variables_set" id="2bPSI2j/U.69}vHl|HG*">
+                                                            <field name="VAR">name_of_recognized_face</field>
+                                                            <value name="VALUE">
+                                                              <shadow type="math_number" id="M.K#]NKJfa;_1MH1K3@{">
+                                                                <field name="NUM">0</field>
+                                                              </shadow>
+                                                              <block type="face_recognition_detection_rectangle" id="5#rXlKJ3X:N*i4%IRFs!">
+                                                                <field name="varitem">i</field>
+                                                                <field name="TYPE">0</field>
+                                                              </block>
                                                             </value>
-                                                            <statement name="DO">
-                                                              <block type="ai_lcd_ractanglecarvas" id="K}lSf/r6mJbqE/tDZ0r5">
-                                                                <field name="varitem">img_face_Recognizer</field>
-                                                                <field name="rect_type">rect</field>
-                                                                <value name="POSA">
-                                                                  <block type="lcd_set_position" id="Ct(v6h%WsLIaU.i5DxEp" inline="false">
-                                                                    <value name="POSX">
-                                                                      <shadow type="math_number" id="OrQMKBYw)@;=/U5^TIb$">
-                                                                        <field name="NUM">0</field>
-                                                                      </shadow>
-                                                                      <block type="face_recognition_detection_rectangle" id="]zmZVN%fd2j`3pqrBV15">
-                                                                        <field name="varitem">i</field>
-                                                                        <field name="TYPE">X</field>
-                                                                      </block>
-                                                                    </value>
-                                                                    <value name="POSY">
-                                                                      <shadow type="math_number" id="I*zaoGuZ}|qgLrSx%rn3">
-                                                                        <field name="NUM">0</field>
-                                                                      </shadow>
-                                                                      <block type="face_recognition_detection_rectangle" id="yn*+g~0QJ-EdiLUS$fMl">
-                                                                        <field name="varitem">i</field>
-                                                                        <field name="TYPE">Y</field>
-                                                                      </block>
-                                                                    </value>
-                                                                  </block>
-                                                                </value>
-                                                                <value name="POSB">
-                                                                  <block type="lcd_set_position" id="eRJo,o}G2PcuvI.[Xlo=" inline="false">
-                                                                    <value name="POSX">
-                                                                      <shadow type="math_number" id="rDL8P!@`ldT4GFImcgK)">
-                                                                        <field name="NUM">0</field>
-                                                                      </shadow>
-                                                                      <block type="face_recognition_detection_rectangle" id="j~{m!S7717XcQ3*N#:~$">
-                                                                        <field name="varitem">i</field>
-                                                                        <field name="TYPE">W</field>
-                                                                      </block>
-                                                                    </value>
-                                                                    <value name="POSY">
-                                                                      <shadow type="math_number" id="wJmYV9tkv_370P%T[a0z">
-                                                                        <field name="NUM">0</field>
-                                                                      </shadow>
-                                                                      <block type="face_recognition_detection_rectangle" id=")+tvy|t?+kkv]Xmlw-c(">
-                                                                        <field name="varitem">i</field>
-                                                                        <field name="TYPE">H</field>
-                                                                      </block>
-                                                                    </value>
-                                                                  </block>
-                                                                </value>
-                                                                <value name="COLOR">
-                                                                  <block type="variables_get" id="-?Ux/FIc;-?`YkUOtn^x">
-                                                                    <field name="VAR">color</field>
+                                                            <next>
+                                                              <block type="variables_set" id="Wux0rdHl{;MKCV7,@fwm">
+                                                                <field name="VAR">score_of_recognized_face</field>
+                                                                <value name="VALUE">
+                                                                  <shadow type="math_number" id="$maqJUqT@0g{_AjY`Dv@">
+                                                                    <field name="NUM">0</field>
+                                                                  </shadow>
+                                                                  <block type="face_recognition_detection_rectangle" id="+40$1qu^Lsm[]YAXmyH6">
+                                                                    <field name="varitem">i</field>
+                                                                    <field name="TYPE">1</field>
                                                                   </block>
                                                                 </value>
                                                                 <next>
-                                                                  <block type="variables_set" id="-33wZ5R:K79jk1YO2w?!">
-                                                                    <field name="VAR">faceData</field>
-                                                                    <value name="VALUE">
-                                                                      <shadow type="math_number" id="fVv_WA]x{8hcn9P`_d4j">
-                                                                        <field name="NUM">0</field>
-                                                                      </shadow>
-                                                                      <block type="face_recognition_detection_rectangle" id="jko:L+7S3o%ZuC=w9@B8">
-                                                                        <field name="varitem">i</field>
-                                                                        <field name="TYPE">rect</field>
+                                                                  <block type="controls_if" id="=heHV9%hnVE$/IH!#tqQ">
+                                                                    <mutation else="1"></mutation>
+                                                                    <value name="IF0">
+                                                                      <block type="logic_compare" id="}Q1e[L`tqQb_mWkTOa%x">
+                                                                        <field name="OP">GT</field>
+                                                                        <value name="A">
+                                                                          <block type="variables_get" id=",64P[E!AHLvgm/=-C)0#">
+                                                                            <field name="VAR">score_of_recognized_face</field>
+                                                                          </block>
+                                                                        </value>
+                                                                        <value name="B">
+                                                                          <block type="math_number" id="{$W},U)OOdXt@6xtfi2;">
+                                                                            <field name="NUM">70</field>
+                                                                          </block>
+                                                                        </value>
                                                                       </block>
                                                                     </value>
-                                                                    <next>
-                                                                      <block type="variables_set" id="2bPSI2j/U.69}vHl|HG*">
-                                                                        <field name="VAR">NAMEFACERECGNIZER</field>
+                                                                    <statement name="DO0">
+                                                                      <block type="variables_set" id="6?kns6r{@Vk)--Byi,nD">
+                                                                        <field name="VAR">color</field>
                                                                         <value name="VALUE">
-                                                                          <shadow type="math_number" id="M.K#]NKJfa;_1MH1K3@{">
+                                                                          <shadow type="math_number" id="Uy7MuH5^;S21`G+C;4Z]">
                                                                             <field name="NUM">0</field>
                                                                           </shadow>
-                                                                          <block type="face_recognition_data_results" id="{Src%E2.5r2HXY2,vLBK">
-                                                                            <field name="varitem">faceData</field>
-                                                                            <field name="TYPE">0</field>
+                                                                          <block type="ai_lcd_rgb_value_input" id="q^k0hmzt#*49f:|}tK2Q">
+                                                                            <value name="rgb_value_r">
+                                                                              <shadow type="math_number" id="`i]Y*jIwG,=8f7Fp^pl6">
+                                                                                <field name="NUM">0</field>
+                                                                              </shadow>
+                                                                            </value>
+                                                                            <value name="rgb_value_g">
+                                                                              <shadow type="math_number" id=".]g[;u*!U6(?biaWZq1i">
+                                                                                <field name="NUM">200</field>
+                                                                              </shadow>
+                                                                            </value>
+                                                                            <value name="rgb_value_b">
+                                                                              <shadow type="math_number" id="XTuQu=%6K3SXmH?Dp`PD">
+                                                                                <field name="NUM">0</field>
+                                                                              </shadow>
+                                                                            </value>
                                                                           </block>
                                                                         </value>
-                                                                        <next>
-                                                                          <block type="variables_set" id="Wux0rdHl{;MKCV7,@fwm">
-                                                                            <field name="VAR">SCOREFACERECGNIZER</field>
-                                                                            <value name="VALUE">
-                                                                              <shadow type="math_number" id="M.K#]NKJfa;_1MH1K3@{">
+                                                                      </block>
+                                                                    </statement>
+                                                                    <statement name="ELSE">
+                                                                      <block type="variables_set" id="]))aJ~!sq*K}E(fhxGFQ">
+                                                                        <field name="VAR">color</field>
+                                                                        <value name="VALUE">
+                                                                          <shadow type="math_number" id="Uy7MuH5^;S21`G+C;4Z]">
+                                                                            <field name="NUM">0</field>
+                                                                          </shadow>
+                                                                          <block type="ai_lcd_rgb_value_input" id="uzF(B$F[,0KDD~#uWE+o">
+                                                                            <value name="rgb_value_r">
+                                                                              <shadow type="math_number" id="@V!u8ksD+9IY9mNpYkP_">
+                                                                                <field name="NUM">255</field>
+                                                                              </shadow>
+                                                                            </value>
+                                                                            <value name="rgb_value_g">
+                                                                              <shadow type="math_number" id="SPctR-2{3s,^A0Cp%LO%">
+                                                                                <field name="NUM">0</field>
+                                                                              </shadow>
+                                                                            </value>
+                                                                            <value name="rgb_value_b">
+                                                                              <shadow type="math_number" id="sypL$d9%ihu2oJ`jl,vF">
                                                                                 <field name="NUM">0</field>
                                                                               </shadow>
-                                                                              <block type="face_recognition_data_results" id="+pt!JA`$t5umL1JEPf+U">
-                                                                                <field name="varitem">faceData</field>
-                                                                                <field name="TYPE">1</field>
+                                                                            </value>
+                                                                          </block>
+                                                                        </value>
+                                                                      </block>
+                                                                    </statement>
+                                                                    <next>
+                                                                      <block type="ai_lcd_ractanglecarvas" id="IOWo8*%_vW;(DTYX!{gg">
+                                                                        <field name="varitem">img_recognized_face</field>
+                                                                        <field name="rect_type">fillrect</field>
+                                                                        <value name="POSA">
+                                                                          <block type="lcd_set_position" id="muC17j_.G1eLP`12bpGa">
+                                                                            <value name="POSX">
+                                                                              <shadow type="math_number" id="::04,xW:.:WK1H#M3pz%">
+                                                                                <field name="NUM">0</field>
+                                                                              </shadow>
+                                                                            </value>
+                                                                            <value name="POSY">
+                                                                              <shadow type="math_number" id="Lft;y6_ujUvc)n%9,jfk">
+                                                                                <field name="NUM">0</field>
+                                                                              </shadow>
+                                                                            </value>
+                                                                          </block>
+                                                                        </value>
+                                                                        <value name="POSB">
+                                                                          <block type="lcd_set_position" id="U1r3i9cu`^~#3j$YpV/W">
+                                                                            <value name="POSX">
+                                                                              <shadow type="math_number" id="9~AhF;+~0]Joi:~%IZ|d">
+                                                                                <field name="NUM">320</field>
+                                                                              </shadow>
+                                                                            </value>
+                                                                            <value name="POSY">
+                                                                              <shadow type="math_number" id="2_XquhJj9!q+d!Oh@+t6">
+                                                                                <field name="NUM">20</field>
+                                                                              </shadow>
+                                                                            </value>
+                                                                          </block>
+                                                                        </value>
+                                                                        <value name="COLOR">
+                                                                          <block type="lcd_set_color" id="p(.e91|ApI^;r.]!Z5W6">
+                                                                            <field name="COLOR">#000000</field>
+                                                                          </block>
+                                                                        </value>
+                                                                        <next>
+                                                                          <block type="ai_lcd_textcarvas" id="Yg{LD4v9P*}08r~RdojQ">
+                                                                            <field name="varitem">img_recognized_face</field>
+                                                                            <value name="POSA">
+                                                                              <block type="lcd_set_position" id="LPlT$dUA(1x)``kKM/Uz">
+                                                                                <value name="POSX">
+                                                                                  <shadow type="math_number" id="Fdr}7U`TTwbw+Y~p{|jW">
+                                                                                    <field name="NUM">40</field>
+                                                                                  </shadow>
+                                                                                </value>
+                                                                                <value name="POSY">
+                                                                                  <shadow type="math_number" id="Q)![)yX*qw3dJDvjNK(`">
+                                                                                    <field name="NUM">0</field>
+                                                                                  </shadow>
+                                                                                </value>
+                                                                              </block>
+                                                                            </value>
+                                                                            <value name="CONTENT">
+                                                                              <shadow type="text" id="9u]b*4uMFsb]{zt_o0-h">
+                                                                                <field name="TEXT"></field>
+                                                                              </shadow>
+                                                                              <block type="text_join" id="X%sX04w$ee|_uk`Jx;l0">
+                                                                                <mutation items="3"></mutation>
+                                                                                <value name="ADD0">
+                                                                                  <block type="variables_get" id="|5uC,V%%E`w?Cex-a6e3">
+                                                                                    <field name="VAR">name_of_recognized_face</field>
+                                                                                  </block>
+                                                                                </value>
+                                                                                <value name="ADD1">
+                                                                                  <block type="text" id="lpXm{]Wop8.gq8H-Ps}{">
+                                                                                    <field name="TEXT"> : </field>
+                                                                                  </block>
+                                                                                </value>
+                                                                                <value name="ADD2">
+                                                                                  <block type="math_keep_decimal" id="^e4_!zD+]MQ|(x9IFr1j">
+                                                                                    <value name="NUM">
+                                                                                      <shadow type="math_number" id="MkDC]hiFpjZK:`Gk%LgV">
+                                                                                        <field name="NUM">3.1415926</field>
+                                                                                      </shadow>
+                                                                                      <block type="variables_get" id="nv_NS##XE693{RClnt)k">
+                                                                                        <field name="VAR">score_of_recognized_face</field>
+                                                                                      </block>
+                                                                                    </value>
+                                                                                    <value name="PLACE">
+                                                                                      <shadow type="math_number" id="5.b|EieLi+b[P}|7jU$#">
+                                                                                        <field name="NUM">2</field>
+                                                                                      </shadow>
+                                                                                    </value>
+                                                                                  </block>
+                                                                                </value>
                                                                               </block>
                                                                             </value>
+                                                                            <value name="COLOR">
+                                                                              <block type="variables_get" id="%gI:2_L7W1=mMV*NYajY">
+                                                                                <field name="VAR">color</field>
+                                                                              </block>
+                                                                            </value>
+                                                                            <value name="Scale">
+                                                                              <shadow type="math_number" id="dI,3mCWvpT+v8w/HDVd4">
+                                                                                <field name="NUM">1</field>
+                                                                              </shadow>
+                                                                            </value>
                                                                             <next>
-                                                                              <block type="controls_if" id=",z.IC^3,oKpi.@v]!QvM">
-                                                                                <value name="IF0">
-                                                                                  <block type="variables_get" id="P,:*C=Vm3!,j8|;^BgEg">
-                                                                                    <field name="VAR">NAMEFACERECGNIZER</field>
+                                                                              <block type="ai_lcd_ractanglecarvas" id="K}lSf/r6mJbqE/tDZ0r5">
+                                                                                <field name="varitem">img_recognized_face</field>
+                                                                                <field name="rect_type">rect</field>
+                                                                                <value name="POSA">
+                                                                                  <block type="lcd_set_position" id="Ct(v6h%WsLIaU.i5DxEp" inline="false">
+                                                                                    <value name="POSX">
+                                                                                      <shadow type="math_number" id="OrQMKBYw)@;=/U5^TIb$">
+                                                                                        <field name="NUM">0</field>
+                                                                                      </shadow>
+                                                                                      <block type="face_recognition_detection_rectangle" id="]zmZVN%fd2j`3pqrBV15">
+                                                                                        <field name="varitem">i</field>
+                                                                                        <field name="TYPE">X</field>
+                                                                                      </block>
+                                                                                    </value>
+                                                                                    <value name="POSY">
+                                                                                      <shadow type="math_number" id="I*zaoGuZ}|qgLrSx%rn3">
+                                                                                        <field name="NUM">0</field>
+                                                                                      </shadow>
+                                                                                      <block type="face_recognition_detection_rectangle" id="yn*+g~0QJ-EdiLUS$fMl">
+                                                                                        <field name="varitem">i</field>
+                                                                                        <field name="TYPE">Y</field>
+                                                                                      </block>
+                                                                                    </value>
                                                                                   </block>
                                                                                 </value>
-                                                                                <statement name="DO0">
-                                                                                  <block type="controls_if" id="=heHV9%hnVE$/IH!#tqQ">
-                                                                                    <mutation else="1"></mutation>
-                                                                                    <value name="IF0">
-                                                                                      <block type="logic_compare" id="}Q1e[L`tqQb_mWkTOa%x">
-                                                                                        <field name="OP">GT</field>
-                                                                                        <value name="A">
-                                                                                          <block type="variables_get" id=",64P[E!AHLvgm/=-C)0#">
-                                                                                            <field name="VAR">SCOREFACERECGNIZER</field>
-                                                                                          </block>
-                                                                                        </value>
-                                                                                        <value name="B">
-                                                                                          <block type="math_number" id="{$W},U)OOdXt@6xtfi2;">
-                                                                                            <field name="NUM">70</field>
-                                                                                          </block>
-                                                                                        </value>
+                                                                                <value name="POSB">
+                                                                                  <block type="lcd_set_position" id="eRJo,o}G2PcuvI.[Xlo=" inline="false">
+                                                                                    <value name="POSX">
+                                                                                      <shadow type="math_number" id="rDL8P!@`ldT4GFImcgK)">
+                                                                                        <field name="NUM">0</field>
+                                                                                      </shadow>
+                                                                                      <block type="face_recognition_detection_rectangle" id="j~{m!S7717XcQ3*N#:~$">
+                                                                                        <field name="varitem">i</field>
+                                                                                        <field name="TYPE">W</field>
                                                                                       </block>
                                                                                     </value>
-                                                                                    <statement name="DO0">
-                                                                                      <block type="variables_set" id="6?kns6r{@Vk)--Byi,nD">
-                                                                                        <field name="VAR">color</field>
-                                                                                        <value name="VALUE">
-                                                                                          <shadow type="math_number" id="Uy7MuH5^;S21`G+C;4Z]">
-                                                                                            <field name="NUM">0</field>
-                                                                                          </shadow>
-                                                                                          <block type="ai_lcd_rgb_value_input" id="q^k0hmzt#*49f:|}tK2Q">
-                                                                                            <value name="rgb_value_r">
-                                                                                              <shadow type="math_number" id="`i]Y*jIwG,=8f7Fp^pl6">
-                                                                                                <field name="NUM">0</field>
-                                                                                              </shadow>
-                                                                                            </value>
-                                                                                            <value name="rgb_value_g">
-                                                                                              <shadow type="math_number" id=".]g[;u*!U6(?biaWZq1i">
-                                                                                                <field name="NUM">200</field>
-                                                                                              </shadow>
-                                                                                            </value>
-                                                                                            <value name="rgb_value_b">
-                                                                                              <shadow type="math_number" id="XTuQu=%6K3SXmH?Dp`PD">
-                                                                                                <field name="NUM">0</field>
-                                                                                              </shadow>
-                                                                                            </value>
-                                                                                          </block>
-                                                                                        </value>
-                                                                                        <next>
-                                                                                          <block type="ai_lcd_textcarvas" id="|VsLfPb2z7(U3/*G~[Te">
-                                                                                            <field name="varitem">img_face_Recognizer</field>
-                                                                                            <value name="POSA">
-                                                                                              <block type="lcd_set_position" id="|pl#nqE6z-posU_Vh:qC">
-                                                                                                <value name="POSX">
-                                                                                                  <shadow type="math_number" id="~B2N@tcQ(=tByO?!;6-d">
-                                                                                                    <field name="NUM">0</field>
-                                                                                                  </shadow>
-                                                                                                </value>
-                                                                                                <value name="POSY">
-                                                                                                  <shadow type="math_number" id="F`0ouUZjyT#?)crNgsA`">
-                                                                                                    <field name="NUM">0</field>
-                                                                                                  </shadow>
-                                                                                                </value>
-                                                                                              </block>
-                                                                                            </value>
-                                                                                            <value name="CONTENT">
-                                                                                              <shadow type="text" id="9u]b*4uMFsb]{zt_o0-h">
-                                                                                                <field name="TEXT"></field>
-                                                                                              </shadow>
-                                                                                              <block type="variables_get" id="8aszsGA%2[wzF5+%Z9V0">
-                                                                                                <field name="VAR">NAMEFACERECGNIZER</field>
-                                                                                              </block>
-                                                                                            </value>
-                                                                                            <value name="COLOR">
-                                                                                              <block type="lcd_set_color" id="%^0jnC?W-VH%0e0PW;UA">
-                                                                                                <field name="COLOR">#009900</field>
-                                                                                              </block>
-                                                                                            </value>
-                                                                                            <value name="Scale">
-                                                                                              <shadow type="math_number" id="v_)rvz1:kZb{-K[)]Cc3">
-                                                                                                <field name="NUM">1</field>
-                                                                                              </shadow>
-                                                                                            </value>
-                                                                                          </block>
-                                                                                        </next>
-                                                                                      </block>
-                                                                                    </statement>
-                                                                                    <statement name="ELSE">
-                                                                                      <block type="variables_set" id="]))aJ~!sq*K}E(fhxGFQ">
-                                                                                        <field name="VAR">color</field>
-                                                                                        <value name="VALUE">
-                                                                                          <shadow type="math_number" id="Uy7MuH5^;S21`G+C;4Z]">
-                                                                                            <field name="NUM">0</field>
-                                                                                          </shadow>
-                                                                                          <block type="ai_lcd_rgb_value_input" id="uzF(B$F[,0KDD~#uWE+o">
-                                                                                            <value name="rgb_value_r">
-                                                                                              <shadow type="math_number" id="@V!u8ksD+9IY9mNpYkP_">
-                                                                                                <field name="NUM">255</field>
-                                                                                              </shadow>
-                                                                                            </value>
-                                                                                            <value name="rgb_value_g">
-                                                                                              <shadow type="math_number" id="SPctR-2{3s,^A0Cp%LO%">
-                                                                                                <field name="NUM">0</field>
-                                                                                              </shadow>
-                                                                                            </value>
-                                                                                            <value name="rgb_value_b">
-                                                                                              <shadow type="math_number" id="sypL$d9%ihu2oJ`jl,vF">
-                                                                                                <field name="NUM">0</field>
-                                                                                              </shadow>
-                                                                                            </value>
-                                                                                          </block>
-                                                                                        </value>
-                                                                                        <next>
-                                                                                          <block type="ai_lcd_textcarvas" id="Yg{LD4v9P*}08r~RdojQ">
-                                                                                            <field name="varitem">img_face_Recognizer</field>
-                                                                                            <value name="POSA">
-                                                                                              <block type="lcd_set_position" id="LPlT$dUA(1x)``kKM/Uz">
-                                                                                                <value name="POSX">
-                                                                                                  <shadow type="math_number" id="Fdr}7U`TTwbw+Y~p{|jW">
-                                                                                                    <field name="NUM">0</field>
-                                                                                                  </shadow>
-                                                                                                </value>
-                                                                                                <value name="POSY">
-                                                                                                  <shadow type="math_number" id="Q)![)yX*qw3dJDvjNK(`">
-                                                                                                    <field name="NUM">0</field>
-                                                                                                  </shadow>
-                                                                                                </value>
-                                                                                              </block>
-                                                                                            </value>
-                                                                                            <value name="CONTENT">
-                                                                                              <shadow type="text" id="9u]b*4uMFsb]{zt_o0-h">
-                                                                                                <field name="TEXT"></field>
-                                                                                              </shadow>
-                                                                                              <block type="variables_get" id="LQ@cX84Q4mz$9exEsdM`">
-                                                                                                <field name="VAR">NAMEFACERECGNIZER</field>
-                                                                                              </block>
-                                                                                            </value>
-                                                                                            <value name="COLOR">
-                                                                                              <block type="lcd_set_color" id=")li[q@~;[C(j_k%8Pif(">
-                                                                                                <field name="COLOR">#cc0000</field>
-                                                                                              </block>
-                                                                                            </value>
-                                                                                            <value name="Scale">
-                                                                                              <shadow type="math_number" id="dI,3mCWvpT+v8w/HDVd4">
-                                                                                                <field name="NUM">1</field>
-                                                                                              </shadow>
-                                                                                            </value>
-                                                                                          </block>
-                                                                                        </next>
+                                                                                    <value name="POSY">
+                                                                                      <shadow type="math_number" id="wJmYV9tkv_370P%T[a0z">
+                                                                                        <field name="NUM">0</field>
+                                                                                      </shadow>
+                                                                                      <block type="face_recognition_detection_rectangle" id=")+tvy|t?+kkv]Xmlw-c(">
+                                                                                        <field name="varitem">i</field>
+                                                                                        <field name="TYPE">H</field>
                                                                                       </block>
-                                                                                    </statement>
+                                                                                    </value>
+                                                                                  </block>
+                                                                                </value>
+                                                                                <value name="COLOR">
+                                                                                  <block type="variables_get" id="-?Ux/FIc;-?`YkUOtn^x">
+                                                                                    <field name="VAR">color</field>
                                                                                   </block>
-                                                                                </statement>
+                                                                                </value>
                                                                               </block>
                                                                             </next>
                                                                           </block>
@@ -418,14 +415,14 @@
                                                                   </block>
                                                                 </next>
                                                               </block>
-                                                            </statement>
+                                                            </next>
                                                           </block>
                                                         </statement>
-                                                        <next>
-                                                          <block type="ai_lcd_showcarvas_set_display" id="2o0*CA~OIp2MDQ?N~Ny*">
-                                                            <field name="varitem">img_face_Recognizer</field>
-                                                          </block>
-                                                        </next>
+                                                      </block>
+                                                    </statement>
+                                                    <next>
+                                                      <block type="ai_lcd_showcarvas_set_display" id="2o0*CA~OIp2MDQ?N~Ny*">
+                                                        <field name="varitem">img_recognized_face</field>
                                                       </block>
                                                     </next>
                                                   </block>
@@ -435,9 +432,9 @@
                                           </block>
                                         </next>
                                       </block>
-                                    </statement>
+                                    </next>
                                   </block>
-                                </next>
+                                </statement>
                               </block>
                             </next>
                           </block>

+ 413 - 302
src/renderer/cocoblockly-x/src/python/AI/人脸采集.xml

@@ -1,11 +1,11 @@
 <xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
-  <block type="ai_camera_init" id="|^PasLLU=~mr^ft?uXF[" inline="true" x="269" y="-381">
+  <block type="ai_camera_init" id="|^PasLLU=~mr^ft?uXF[" inline="true" x="105" y="-749">
     <next>
       <block type="ai_lcd_screeninit" id="X3a?`8XYpSZ^-n13IVpR" inline="true">
         <field name="isScreen">False</field>
         <next>
           <block type="ai_lcd_createnonecarvas" id="5G%fY@B9TaJx#0-!;v_a">
-            <field name="varitem">canvas</field>
+            <field name="varitem">img_recognized_face</field>
             <value name="wh">
               <block type="lcd_set_width_height" id="8ttwQoZ1G7N_)e65}Jk;">
                 <value name="WIDTH">
@@ -22,21 +22,22 @@
             </value>
             <next>
               <block type="face_recognition_init" id="ym:QNlsxoc(7+~i({*gh">
+                <field name="varitem">people_name_list</field>
                 <value name="class_input">
-                  <block type="lists_create_with" id="#IXWcVA`hrN!y0Xoe9`C">
+                  <block type="lists_create_with" id="*GX/.YmXS6?_v#N`2YWT">
                     <mutation items="3"></mutation>
                     <value name="ADD0">
-                      <block type="text" id="D!WP~c4g}L?g|%_`=rlF">
+                      <block type="text" id="PjMzy?YS4JV~~:ap[3*K">
                         <field name="TEXT">Name1</field>
                       </block>
                     </value>
                     <value name="ADD1">
-                      <block type="text" id="be7`G+M*d,Hyv86y_sTA">
+                      <block type="text" id="chZ`I-kI-Hr~dde==m!4">
                         <field name="TEXT">Name2</field>
                       </block>
                     </value>
                     <value name="ADD2">
-                      <block type="text" id="Nsz0yT~n]gHWSN@W-h?}">
+                      <block type="text" id="O^J^~qmN3QG9+7em|`oj">
                         <field name="TEXT">Name3</field>
                       </block>
                     </value>
@@ -44,7 +45,7 @@
                 </value>
                 <next>
                   <block type="variables_set" id="rgc1nUE(iaOwukZyV{:p">
-                    <field name="VAR">NAMEFACERECGNIZER</field>
+                    <field name="VAR">name_of_recognized_face</field>
                     <value name="VALUE">
                       <shadow type="math_number" id="=JXU{]lKKsgz6Obo0W!z">
                         <field name="NUM">0</field>
@@ -55,7 +56,7 @@
                     </value>
                     <next>
                       <block type="variables_set" id="atNuyh93Sex9@6Kcwc2:">
-                        <field name="VAR">SCOREFACERECGNIZER</field>
+                        <field name="VAR">score_of_recognized_face</field>
                         <value name="VALUE">
                           <shadow type="math_number" id=")*Zlih{rX7n{]^s,Fgh*">
                             <field name="NUM">0</field>
@@ -63,7 +64,7 @@
                         </value>
                         <next>
                           <block type="variables_set" id="7*/?l#v9syy24akv[.-5">
-                            <field name="VAR">person_nums</field>
+                            <field name="VAR">number_of_person</field>
                             <value name="VALUE">
                               <shadow type="math_number" id=")_a[lsGgRa?/P/Mu+6}4">
                                 <field name="NUM">0</field>
@@ -98,7 +99,7 @@
                                   <block type="controls_repeat_forever" id="b8is7QZy=:Z.so9DN#l0">
                                     <statement name="DO">
                                       <block type="variables_set" id="AFce:dz8%[9H@R2Ue9fo">
-                                        <field name="VAR">img_face_Recognizer</field>
+                                        <field name="VAR">img_recognized_face</field>
                                         <value name="VALUE">
                                           <shadow type="math_number" id="fzQa,^FS/fRr/wqYE!y^">
                                             <field name="NUM">0</field>
@@ -107,13 +108,13 @@
                                         </value>
                                         <next>
                                           <block type="variables_set" id="/6E1bnwJi:^Gr#[*@!hU">
-                                            <field name="VAR">img_face_Recognizer</field>
+                                            <field name="VAR">img_recognized_face</field>
                                             <value name="VALUE">
                                               <shadow type="math_number" id="fzQa,^FS/fRr/wqYE!y^">
                                                 <field name="NUM">0</field>
                                               </shadow>
                                               <block type="v831_lcd_img_cut" id="6=~Z||TZA!C%BGHKQ@Y]">
-                                                <field name="varitem">img_face_Recognizer</field>
+                                                <field name="varitem">img_recognized_face</field>
                                                 <value name="xy">
                                                   <block type="ai_lcd_XY_vision" id="dnPc6E@^ByyqY4S*5nW*">
                                                     <value name="A">
@@ -146,7 +147,7 @@
                                             </value>
                                             <next>
                                               <block type="face_recognition_load" id="jgz389h=^Sti}6|qC-gk">
-                                                <field name="varitem">img_face_Recognizer</field>
+                                                <field name="varitem">img_recognized_face</field>
                                                 <next>
                                                   <block type="controls_if" id="ftS+{m|hIvFz}4$W@6_D">
                                                     <value name="IF0">
@@ -160,7 +161,7 @@
                                                         </value>
                                                         <statement name="DO">
                                                           <block type="ai_lcd_ractanglecarvas" id="K}lSf/r6mJbqE/tDZ0r5">
-                                                            <field name="varitem">img_face_Recognizer</field>
+                                                            <field name="varitem">img_recognized_face</field>
                                                             <field name="rect_type">rect</field>
                                                             <value name="POSA">
                                                               <block type="lcd_set_position" id="Ct(v6h%WsLIaU.i5DxEp" inline="false">
@@ -212,340 +213,423 @@
                                                               </block>
                                                             </value>
                                                             <next>
-                                                              <block type="variables_set" id="-33wZ5R:K79jk1YO2w?!">
-                                                                <field name="VAR">faceData</field>
-                                                                <value name="VALUE">
-                                                                  <shadow type="math_number" id="fVv_WA]x{8hcn9P`_d4j">
-                                                                    <field name="NUM">0</field>
-                                                                  </shadow>
-                                                                  <block type="face_recognition_detection_rectangle" id="jko:L+7S3o%ZuC=w9@B8">
-                                                                    <field name="varitem">i</field>
-                                                                    <field name="TYPE">rect</field>
-                                                                  </block>
-                                                                </value>
-                                                                <next>
-                                                                  <block type="controls_if" id="FYto3?x7I#CVaFD^CeO1">
-                                                                    <mutation elseif="1"></mutation>
-                                                                    <value name="IF0">
-                                                                      <block type="logic_operation" id="j%37]8e[V?]h$%yl?pe4">
-                                                                        <field name="OP">AND</field>
+                                                              <block type="controls_if" id="FYto3?x7I#CVaFD^CeO1">
+                                                                <value name="IF0">
+                                                                  <block type="logic_operation" id="j%37]8e[V?]h$%yl?pe4">
+                                                                    <field name="OP">AND</field>
+                                                                    <value name="A">
+                                                                      <block type="ai_v831_button_read_pressed" id="4YHqET~pnp3pluY.a/eC">
+                                                                        <field name="button_type">C</field>
+                                                                      </block>
+                                                                    </value>
+                                                                    <value name="B">
+                                                                      <block type="logic_compare" id=":4Hyz)v8#AgKizkxB=Bj">
+                                                                        <field name="OP">LT</field>
                                                                         <value name="A">
-                                                                          <block type="ai_v831_button_read_pressed" id="4YHqET~pnp3pluY.a/eC">
-                                                                            <field name="button_type">C</field>
+                                                                          <block type="variables_get" id="{=64{5bdkAT39nJN-X!8">
+                                                                            <field name="VAR">number_of_person</field>
                                                                           </block>
                                                                         </value>
                                                                         <value name="B">
-                                                                          <block type="logic_compare" id=":4Hyz)v8#AgKizkxB=Bj">
-                                                                            <field name="OP">LT</field>
-                                                                            <value name="A">
-                                                                              <block type="variables_get" id="{=64{5bdkAT39nJN-X!8">
-                                                                                <field name="VAR">person_nums</field>
-                                                                              </block>
-                                                                            </value>
-                                                                            <value name="B">
-                                                                              <block type="math_number" id="IpO;g9C^)!ba:[35VTn%">
-                                                                                <field name="NUM">3</field>
+                                                                          <block type="lists_length" id=".)=AG7+L(rQ5mGYurqlD">
+                                                                            <value name="VALUE">
+                                                                              <block type="variables_get" id="Dfo]x?_VSnt$NDvqv}F.">
+                                                                                <field name="VAR">people_name_list</field>
                                                                               </block>
                                                                             </value>
                                                                           </block>
                                                                         </value>
                                                                       </block>
                                                                     </value>
-                                                                    <statement name="DO0">
-                                                                      <block type="controls_whileUntil" id="dDihRNozGP0#Y2I!5qtk">
-                                                                        <field name="MODE">UNTIL</field>
-                                                                        <value name="BOOL">
-                                                                          <block type="ai_v831_button_read_released" id="8U|(^|=+JNc-1YTJOc7d">
-                                                                            <field name="button_type_released">C</field>
+                                                                  </block>
+                                                                </value>
+                                                                <statement name="DO0">
+                                                                  <block type="controls_whileUntil" id="dDihRNozGP0#Y2I!5qtk">
+                                                                    <field name="MODE">UNTIL</field>
+                                                                    <value name="BOOL">
+                                                                      <block type="ai_v831_button_read_released" id="8U|(^|=+JNc-1YTJOc7d">
+                                                                        <field name="button_type_released">C</field>
+                                                                      </block>
+                                                                    </value>
+                                                                    <statement name="DO">
+                                                                      <block type="time_delay" id=",;al:I~Qva#2(fb56PKQ">
+                                                                        <value name="DELAY_TIME_MILI">
+                                                                          <block type="math_number" id="zLysp[qGG#]QXE%_diIu">
+                                                                            <field name="NUM">10</field>
                                                                           </block>
                                                                         </value>
-                                                                        <statement name="DO">
-                                                                          <block type="time_delay" id=",;al:I~Qva#2(fb56PKQ">
-                                                                            <value name="DELAY_TIME_MILI">
-                                                                              <block type="math_number" id="zLysp[qGG#]QXE%_diIu">
-                                                                                <field name="NUM">10</field>
-                                                                              </block>
-                                                                            </value>
+                                                                      </block>
+                                                                    </statement>
+                                                                    <next>
+                                                                      <block type="face_recognition_add" id="=aRCH/nEA2bWm1IP6,Kt">
+                                                                        <field name="varitem">i</field>
+                                                                        <value name="class_input">
+                                                                          <block type="text" id="yI/UP6vi^s(t07FRw0v$">
+                                                                            <field name="TEXT">/root/user/model/recorded_face_features.py</field>
                                                                           </block>
-                                                                        </statement>
+                                                                        </value>
                                                                         <next>
-                                                                          <block type="face_recognition_add" id="=aRCH/nEA2bWm1IP6,Kt">
-                                                                            <field name="varitem">faceData</field>
+                                                                          <block type="math_change" id="HZ[RWLe--D{[C$9::{a|">
+                                                                            <field name="VAR">number_of_person</field>
+                                                                            <value name="DELTA">
+                                                                              <shadow type="math_number" id="q69CkHM|otsFE,/xIjL@">
+                                                                                <field name="NUM">1</field>
+                                                                              </shadow>
+                                                                            </value>
                                                                             <next>
-                                                                              <block type="math_change" id="HZ[RWLe--D{[C$9::{a|">
-                                                                                <field name="VAR">person_nums</field>
-                                                                                <value name="DELTA">
-                                                                                  <shadow type="math_number" id="q69CkHM|otsFE,/xIjL@">
-                                                                                    <field name="NUM">1</field>
+                                                                              <block type="variables_set" id="2bPSI2j/U.69}vHl|HG*">
+                                                                                <field name="VAR">name_of_recognized_face</field>
+                                                                                <value name="VALUE">
+                                                                                  <shadow type="math_number" id="M.K#]NKJfa;_1MH1K3@{">
+                                                                                    <field name="NUM">0</field>
                                                                                   </shadow>
+                                                                                  <block type="face_recognition_detection_rectangle" id="uP;ldiik=w5upsDwwO8F">
+                                                                                    <field name="varitem">i</field>
+                                                                                    <field name="TYPE">0</field>
+                                                                                  </block>
                                                                                 </value>
+                                                                                <next>
+                                                                                  <block type="ai_lcd_ractanglecarvas" id="vsZ`W*!/Sgvy:[W3~ded">
+                                                                                    <field name="varitem">img_recognized_face</field>
+                                                                                    <field name="rect_type">fillrect</field>
+                                                                                    <value name="POSA">
+                                                                                      <block type="lcd_set_position" id="OM+g4$(fzy1-di1myF}W">
+                                                                                        <value name="POSX">
+                                                                                          <shadow type="math_number" id=",Py9QvK{6rd*Akl|}Kd2">
+                                                                                            <field name="NUM">0</field>
+                                                                                          </shadow>
+                                                                                        </value>
+                                                                                        <value name="POSY">
+                                                                                          <shadow type="math_number" id="*t!n9K[:?zDAq;;io81.">
+                                                                                            <field name="NUM">0</field>
+                                                                                          </shadow>
+                                                                                        </value>
+                                                                                      </block>
+                                                                                    </value>
+                                                                                    <value name="POSB">
+                                                                                      <block type="lcd_set_position" id="e!0]h`N0wpA}d$./h#_.">
+                                                                                        <value name="POSX">
+                                                                                          <shadow type="math_number" id="NU(r|u6c~RZzpgAaOw5w">
+                                                                                            <field name="NUM">320</field>
+                                                                                          </shadow>
+                                                                                        </value>
+                                                                                        <value name="POSY">
+                                                                                          <shadow type="math_number" id="UCtg=WrGZt`I|dCmBJ,P">
+                                                                                            <field name="NUM">20</field>
+                                                                                          </shadow>
+                                                                                        </value>
+                                                                                      </block>
+                                                                                    </value>
+                                                                                    <value name="COLOR">
+                                                                                      <block type="lcd_set_color" id="f7T7SUqbEcVdf?61;#2w">
+                                                                                        <field name="COLOR">#000000</field>
+                                                                                      </block>
+                                                                                    </value>
+                                                                                    <next>
+                                                                                      <block type="ai_lcd_textcarvas" id="9FA?i.??CkVuxS2Kp*qG">
+                                                                                        <field name="varitem">img_recognized_face</field>
+                                                                                        <value name="POSA">
+                                                                                          <block type="lcd_set_position" id="s=zOQT5Z76rnMqm.lYX,">
+                                                                                            <value name="POSX">
+                                                                                              <shadow type="math_number" id="=tX()*3R]!!4-tW5BCMJ">
+                                                                                                <field name="NUM">40</field>
+                                                                                              </shadow>
+                                                                                            </value>
+                                                                                            <value name="POSY">
+                                                                                              <shadow type="math_number" id="bx@EzvZ5-WO,bqxKQExe">
+                                                                                                <field name="NUM">0</field>
+                                                                                              </shadow>
+                                                                                            </value>
+                                                                                          </block>
+                                                                                        </value>
+                                                                                        <value name="CONTENT">
+                                                                                          <shadow type="text" id="7*)6Y|LAa}).=T^=8r.~">
+                                                                                            <field name="TEXT"></field>
+                                                                                          </shadow>
+                                                                                          <block type="text_join" id="Qr|S/y.aruJnqHR3AhH]">
+                                                                                            <mutation items="3"></mutation>
+                                                                                            <value name="ADD0">
+                                                                                              <block type="text" id="Lh|{bKQZO~W(YppXP$Pm">
+                                                                                                <field name="TEXT">保存</field>
+                                                                                              </block>
+                                                                                            </value>
+                                                                                            <value name="ADD1">
+                                                                                              <block type="variables_get" id="5/~s8a)ZdZoHrH.?M)Iq">
+                                                                                                <field name="VAR">name_of_recognized_face</field>
+                                                                                              </block>
+                                                                                            </value>
+                                                                                            <value name="ADD2">
+                                                                                              <block type="text" id="kleK1JIgq_xAz]wJ5(G,">
+                                                                                                <field name="TEXT">的人臉數據</field>
+                                                                                              </block>
+                                                                                            </value>
+                                                                                          </block>
+                                                                                        </value>
+                                                                                        <value name="COLOR">
+                                                                                          <block type="ai_lcd_rgb_value_input" id="FiS99G([A]liLIZ`h(eC">
+                                                                                            <value name="rgb_value_r">
+                                                                                              <shadow type="math_number" id="v9r!4mWyqt1rT4bYzMWk">
+                                                                                                <field name="NUM">0</field>
+                                                                                              </shadow>
+                                                                                            </value>
+                                                                                            <value name="rgb_value_g">
+                                                                                              <shadow type="math_number" id=";gd|$)|zEjCuLT,Pp5%h">
+                                                                                                <field name="NUM">255</field>
+                                                                                              </shadow>
+                                                                                            </value>
+                                                                                            <value name="rgb_value_b">
+                                                                                              <shadow type="math_number" id="_(2OrNnX0;=S/!da`K(b">
+                                                                                                <field name="NUM">0</field>
+                                                                                              </shadow>
+                                                                                            </value>
+                                                                                          </block>
+                                                                                        </value>
+                                                                                        <value name="Scale">
+                                                                                          <shadow type="math_number" id="t[;(sMj2,-3P^p;ICduN">
+                                                                                            <field name="NUM">1</field>
+                                                                                          </shadow>
+                                                                                        </value>
+                                                                                        <next>
+                                                                                          <block type="ai_lcd_showcarvas_set_display" id="..BXM=^Q9YJu8xym)9P[">
+                                                                                            <field name="varitem">img_recognized_face</field>
+                                                                                            <next>
+                                                                                              <block type="time_delay" id="z%qml}yhcnnq~BFDHJ7d">
+                                                                                                <value name="DELAY_TIME_MILI">
+                                                                                                  <block type="math_number" id="cBl0;Ig6`jvSVIq9~p42">
+                                                                                                    <field name="NUM">1000</field>
+                                                                                                  </block>
+                                                                                                </value>
+                                                                                              </block>
+                                                                                            </next>
+                                                                                          </block>
+                                                                                        </next>
+                                                                                      </block>
+                                                                                    </next>
+                                                                                  </block>
+                                                                                </next>
                                                                               </block>
                                                                             </next>
                                                                           </block>
                                                                         </next>
                                                                       </block>
-                                                                    </statement>
-                                                                    <value name="IF1">
-                                                                      <block type="logic_operation" id="+e,ZrU_C$+NZe04fT)5p">
-                                                                        <field name="OP">AND</field>
-                                                                        <value name="A">
-                                                                          <block type="ai_v831_button_read_pressed" id="Z/`dN?uVMLOylBSPGB[/">
-                                                                            <field name="button_type">D</field>
+                                                                    </next>
+                                                                  </block>
+                                                                </statement>
+                                                              </block>
+                                                            </next>
+                                                          </block>
+                                                        </statement>
+                                                      </block>
+                                                    </statement>
+                                                    <next>
+                                                      <block type="controls_if" id="Ks2(03SAX.qaAZ[3]Dp{">
+                                                        <value name="IF0">
+                                                          <block type="logic_operation" id=";|n(jf,PO`kCVqgzG60b">
+                                                            <field name="OP">AND</field>
+                                                            <value name="A">
+                                                              <block type="ai_v831_button_read_pressed" id="zc8`O`|c(/I-J_|/yA^1">
+                                                                <field name="button_type">D</field>
+                                                              </block>
+                                                            </value>
+                                                            <value name="B">
+                                                              <block type="logic_compare" id=",Fl!:iRaJaZ3n$zJf0c_">
+                                                                <field name="OP">GT</field>
+                                                                <value name="A">
+                                                                  <block type="variables_get" id="#QK!t[.atmHPhKu]T{Lc">
+                                                                    <field name="VAR">number_of_person</field>
+                                                                  </block>
+                                                                </value>
+                                                                <value name="B">
+                                                                  <block type="math_number" id=";3;W4q)s8%!mHCT~=WH7">
+                                                                    <field name="NUM">0</field>
+                                                                  </block>
+                                                                </value>
+                                                              </block>
+                                                            </value>
+                                                          </block>
+                                                        </value>
+                                                        <statement name="DO0">
+                                                          <block type="controls_whileUntil" id="^o{~q+bWbA{RN7ZtmWTm">
+                                                            <field name="MODE">UNTIL</field>
+                                                            <value name="BOOL">
+                                                              <block type="ai_v831_button_read_released" id="srUSCCj,8KZcqt9cq.IC">
+                                                                <field name="button_type_released">D</field>
+                                                              </block>
+                                                            </value>
+                                                            <statement name="DO">
+                                                              <block type="time_delay" id="Y@f5Gxa[)}c2t3s,COj1">
+                                                                <value name="DELAY_TIME_MILI">
+                                                                  <block type="math_number" id="Qo$~T@x6B1R(+p4Dgw.J">
+                                                                    <field name="NUM">10</field>
+                                                                  </block>
+                                                                </value>
+                                                              </block>
+                                                            </statement>
+                                                            <next>
+                                                              <block type="face_recognition_remove" id="Q3ocE6RaXSi12EE1iP}6">
+                                                                <next>
+                                                                  <block type="variables_set" id="BW6bf/p3fjwJFMN##)%!">
+                                                                    <field name="VAR">name_of_recognized_face</field>
+                                                                    <value name="VALUE">
+                                                                      <shadow type="math_number" id="M.K#]NKJfa;_1MH1K3@{">
+                                                                        <field name="NUM">0</field>
+                                                                      </shadow>
+                                                                      <block type="list_order_item" id="P1q#f3Y4_/{x#2W#2ZL4">
+                                                                        <field name="list_order">[</field>
+                                                                        <value name="list_name">
+                                                                          <shadow type="text_list" id="hIq[A[Mx|1xm?=MgwS+K">
+                                                                            <field name="TEXT"></field>
+                                                                          </shadow>
+                                                                          <block type="variables_get" id="AR?_3nn44mr;:|I)~X64">
+                                                                            <field name="VAR">people_name_list</field>
                                                                           </block>
                                                                         </value>
-                                                                        <value name="B">
-                                                                          <block type="logic_compare" id="xW8cRUb3O=jr`2U$qfj~">
-                                                                            <field name="OP">GT</field>
+                                                                        <value name="list_order_item">
+                                                                          <shadow type="math_number" id="Rfm$EDPY1{dIWx3A*Db1">
+                                                                            <field name="NUM">0</field>
+                                                                          </shadow>
+                                                                          <block type="math_arithmetic" id="Z4M|#g[)tc8$a/cm,I}W">
+                                                                            <field name="OP">MINUS</field>
                                                                             <value name="A">
-                                                                              <block type="variables_get" id="mUt3@KDO-4[L/2L@gv[}">
-                                                                                <field name="VAR">person_nums</field>
+                                                                              <shadow type="math_number" id="t?YBXiwY,pZR;/ELH$hT">
+                                                                                <field name="NUM">1</field>
+                                                                              </shadow>
+                                                                              <block type="variables_get" id="LZpQolLr/T[QT#hqA|hL">
+                                                                                <field name="VAR">number_of_person</field>
                                                                               </block>
                                                                             </value>
                                                                             <value name="B">
-                                                                              <block type="math_number" id=")x!!SK~lHGx81N){?0JD">
-                                                                                <field name="NUM">0</field>
-                                                                              </block>
+                                                                              <shadow type="math_number" id="6.NdLM0$fv9OI27Yy:](">
+                                                                                <field name="NUM">1</field>
+                                                                              </shadow>
                                                                             </value>
                                                                           </block>
                                                                         </value>
                                                                       </block>
                                                                     </value>
-                                                                    <statement name="DO1">
-                                                                      <block type="controls_whileUntil" id="^o{~q+bWbA{RN7ZtmWTm">
-                                                                        <field name="MODE">UNTIL</field>
-                                                                        <value name="BOOL">
-                                                                          <block type="ai_v831_button_read_released" id="srUSCCj,8KZcqt9cq.IC">
-                                                                            <field name="button_type_released">D</field>
-                                                                          </block>
-                                                                        </value>
-                                                                        <statement name="DO">
-                                                                          <block type="time_delay" id="Y@f5Gxa[)}c2t3s,COj1">
-                                                                            <value name="DELAY_TIME_MILI">
-                                                                              <block type="math_number" id="Qo$~T@x6B1R(+p4Dgw.J">
-                                                                                <field name="NUM">10</field>
+                                                                    <next>
+                                                                      <block type="variables_set" id="cbR!O5rv`9B}{h@wnsQ,">
+                                                                        <field name="VAR">number_of_person</field>
+                                                                        <value name="VALUE">
+                                                                          <shadow type="math_number" id="%@]@mE?lf4;20A:mB(Aq">
+                                                                            <field name="NUM">0</field>
+                                                                          </shadow>
+                                                                          <block type="math_arithmetic" id="^(#XPkWDgQ7o9q6A5R8X">
+                                                                            <field name="OP">MINUS</field>
+                                                                            <value name="A">
+                                                                              <shadow type="math_number" id="#gf-!gGN_3Cl6Hs~LDA]">
+                                                                                <field name="NUM">1</field>
+                                                                              </shadow>
+                                                                              <block type="variables_get" id="o.cSpp(nY%@0)e$bGeBF">
+                                                                                <field name="VAR">number_of_person</field>
                                                                               </block>
                                                                             </value>
+                                                                            <value name="B">
+                                                                              <shadow type="math_number" id="_2!UT]l70:O#{0J:Bewu">
+                                                                                <field name="NUM">1</field>
+                                                                              </shadow>
+                                                                            </value>
                                                                           </block>
-                                                                        </statement>
+                                                                        </value>
                                                                         <next>
-                                                                          <block type="face_recognition_remove" id="Q3ocE6RaXSi12EE1iP}6">
-                                                                            <field name="varitem">faceData</field>
-                                                                            <next>
-                                                                              <block type="variables_set" id="cbR!O5rv`9B}{h@wnsQ,">
-                                                                                <field name="VAR">person_nums</field>
-                                                                                <value name="VALUE">
-                                                                                  <shadow type="math_number" id="%@]@mE?lf4;20A:mB(Aq">
+                                                                          <block type="ai_lcd_ractanglecarvas" id="V9EM!d@uKm)qV@VeR,}g">
+                                                                            <field name="varitem">img_recognized_face</field>
+                                                                            <field name="rect_type">fillrect</field>
+                                                                            <value name="POSA">
+                                                                              <block type="lcd_set_position" id="N)$HACQmRe(1,$1G]0LI">
+                                                                                <value name="POSX">
+                                                                                  <shadow type="math_number" id="$kidNEdkGkIDwj!_Be_s">
+                                                                                    <field name="NUM">0</field>
+                                                                                  </shadow>
+                                                                                </value>
+                                                                                <value name="POSY">
+                                                                                  <shadow type="math_number" id="@up]hA+eUa2D#WAE;:v%">
                                                                                     <field name="NUM">0</field>
                                                                                   </shadow>
-                                                                                  <block type="math_arithmetic" id="^(#XPkWDgQ7o9q6A5R8X">
-                                                                                    <field name="OP">MINUS</field>
-                                                                                    <value name="A">
-                                                                                      <shadow type="math_number" id="#gf-!gGN_3Cl6Hs~LDA]">
-                                                                                        <field name="NUM">1</field>
-                                                                                      </shadow>
-                                                                                      <block type="variables_get" id="o.cSpp(nY%@0)e$bGeBF">
-                                                                                        <field name="VAR">person_nums</field>
-                                                                                      </block>
-                                                                                    </value>
-                                                                                    <value name="B">
-                                                                                      <shadow type="math_number" id="_2!UT]l70:O#{0J:Bewu">
-                                                                                        <field name="NUM">1</field>
-                                                                                      </shadow>
-                                                                                    </value>
-                                                                                  </block>
                                                                                 </value>
                                                                               </block>
-                                                                            </next>
-                                                                          </block>
-                                                                        </next>
-                                                                      </block>
-                                                                    </statement>
-                                                                    <next>
-                                                                      <block type="variables_set" id="2bPSI2j/U.69}vHl|HG*">
-                                                                        <field name="VAR">NAMEFACERECGNIZER</field>
-                                                                        <value name="VALUE">
-                                                                          <shadow type="math_number" id="M.K#]NKJfa;_1MH1K3@{">
-                                                                            <field name="NUM">0</field>
-                                                                          </shadow>
-                                                                          <block type="face_recognition_data_results" id="{Src%E2.5r2HXY2,vLBK">
-                                                                            <field name="varitem">faceData</field>
-                                                                            <field name="TYPE">0</field>
-                                                                          </block>
-                                                                        </value>
-                                                                        <next>
-                                                                          <block type="variables_set" id="Wux0rdHl{;MKCV7,@fwm">
-                                                                            <field name="VAR">SCOREFACERECGNIZER</field>
-                                                                            <value name="VALUE">
-                                                                              <shadow type="math_number" id="M.K#]NKJfa;_1MH1K3@{">
-                                                                                <field name="NUM">0</field>
-                                                                              </shadow>
-                                                                              <block type="face_recognition_data_results" id="+pt!JA`$t5umL1JEPf+U">
-                                                                                <field name="varitem">faceData</field>
-                                                                                <field name="TYPE">1</field>
+                                                                            </value>
+                                                                            <value name="POSB">
+                                                                              <block type="lcd_set_position" id="sX,iie4km{H}M%]yDej^">
+                                                                                <value name="POSX">
+                                                                                  <shadow type="math_number" id="`{|P0~pgup6~OXc0Ablp">
+                                                                                    <field name="NUM">320</field>
+                                                                                  </shadow>
+                                                                                </value>
+                                                                                <value name="POSY">
+                                                                                  <shadow type="math_number" id="`Q1-)T}kfp?M-1B;2W/Y">
+                                                                                    <field name="NUM">20</field>
+                                                                                  </shadow>
+                                                                                </value>
+                                                                              </block>
+                                                                            </value>
+                                                                            <value name="COLOR">
+                                                                              <block type="lcd_set_color" id=":HJ;iOUy,6NGjA8!$q;;">
+                                                                                <field name="COLOR">#000000</field>
                                                                               </block>
                                                                             </value>
                                                                             <next>
-                                                                              <block type="face_recognition_data_save_path" id="RD*z|gk0zuTOs6lWHY/[">
-                                                                                <value name="class_input">
-                                                                                  <block type="text" id="yI/UP6vi^s(t07FRw0v$">
-                                                                                    <field name="TEXT">/root/user/model/recorded_face_features.py</field>
+                                                                              <block type="ai_lcd_textcarvas" id="vFQLvIlT*oYk()-jYHol">
+                                                                                <field name="varitem">img_recognized_face</field>
+                                                                                <value name="POSA">
+                                                                                  <block type="lcd_set_position" id="uBFoIN9:8`F`4?P`]DdB">
+                                                                                    <value name="POSX">
+                                                                                      <shadow type="math_number" id="QHMsrZ.V3b-`7mYLTn85">
+                                                                                        <field name="NUM">40</field>
+                                                                                      </shadow>
+                                                                                    </value>
+                                                                                    <value name="POSY">
+                                                                                      <shadow type="math_number" id="CCXm=vxo/S`M`859P?S|">
+                                                                                        <field name="NUM">0</field>
+                                                                                      </shadow>
+                                                                                    </value>
                                                                                   </block>
                                                                                 </value>
-                                                                                <next>
-                                                                                  <block type="controls_if" id=",z.IC^3,oKpi.@v]!QvM">
-                                                                                    <value name="IF0">
-                                                                                      <block type="variables_get" id="P,:*C=Vm3!,j8|;^BgEg">
-                                                                                        <field name="VAR">NAMEFACERECGNIZER</field>
+                                                                                <value name="CONTENT">
+                                                                                  <shadow type="text" id="7*)6Y|LAa}).=T^=8r.~">
+                                                                                    <field name="TEXT"></field>
+                                                                                  </shadow>
+                                                                                  <block type="text_join" id="2JygYk2QcGRO-R{s:/J8">
+                                                                                    <mutation items="3"></mutation>
+                                                                                    <value name="ADD0">
+                                                                                      <block type="text" id="A]s!OFxT5q_Y8$[=4W%f">
+                                                                                        <field name="TEXT">刪除</field>
                                                                                       </block>
                                                                                     </value>
-                                                                                    <statement name="DO0">
-                                                                                      <block type="controls_if" id="=heHV9%hnVE$/IH!#tqQ">
-                                                                                        <mutation else="1"></mutation>
-                                                                                        <value name="IF0">
-                                                                                          <block type="logic_compare" id="}Q1e[L`tqQb_mWkTOa%x">
-                                                                                            <field name="OP">GT</field>
-                                                                                            <value name="A">
-                                                                                              <block type="variables_get" id=",64P[E!AHLvgm/=-C)0#">
-                                                                                                <field name="VAR">SCOREFACERECGNIZER</field>
-                                                                                              </block>
-                                                                                            </value>
-                                                                                            <value name="B">
-                                                                                              <block type="math_number" id="{$W},U)OOdXt@6xtfi2;">
-                                                                                                <field name="NUM">70</field>
-                                                                                              </block>
-                                                                                            </value>
+                                                                                    <value name="ADD1">
+                                                                                      <block type="variables_get" id="ixIh)1DMdOAdWH;LIJ|)">
+                                                                                        <field name="VAR">name_of_recognized_face</field>
+                                                                                      </block>
+                                                                                    </value>
+                                                                                    <value name="ADD2">
+                                                                                      <block type="text" id="mn9=d!ou[.wUpV93u{.U">
+                                                                                        <field name="TEXT">的人臉數據</field>
+                                                                                      </block>
+                                                                                    </value>
+                                                                                  </block>
+                                                                                </value>
+                                                                                <value name="COLOR">
+                                                                                  <block type="lcd_set_color" id="75;2ZO6WXPWCjjei`J5Z">
+                                                                                    <field name="COLOR">#ffffff</field>
+                                                                                  </block>
+                                                                                </value>
+                                                                                <value name="Scale">
+                                                                                  <shadow type="math_number" id="B7+ar)/,4Z%9O@k1of*Q">
+                                                                                    <field name="NUM">1</field>
+                                                                                  </shadow>
+                                                                                </value>
+                                                                                <next>
+                                                                                  <block type="ai_lcd_showcarvas_set_display" id=":=vC/HBjF$TBD:/fe@.v">
+                                                                                    <field name="varitem">img_recognized_face</field>
+                                                                                    <next>
+                                                                                      <block type="time_delay" id="THh9}lNn9M2l)uXjUWZm">
+                                                                                        <value name="DELAY_TIME_MILI">
+                                                                                          <block type="math_number" id="#5Cp,pH4Wr?QEsmQ]zb*">
+                                                                                            <field name="NUM">1000</field>
                                                                                           </block>
                                                                                         </value>
-                                                                                        <statement name="DO0">
-                                                                                          <block type="variables_set" id="6?kns6r{@Vk)--Byi,nD">
-                                                                                            <field name="VAR">color</field>
-                                                                                            <value name="VALUE">
-                                                                                              <shadow type="math_number" id="Uy7MuH5^;S21`G+C;4Z]">
-                                                                                                <field name="NUM">0</field>
-                                                                                              </shadow>
-                                                                                              <block type="ai_lcd_rgb_value_input" id="q^k0hmzt#*49f:|}tK2Q">
-                                                                                                <value name="rgb_value_r">
-                                                                                                  <shadow type="math_number" id="`i]Y*jIwG,=8f7Fp^pl6">
-                                                                                                    <field name="NUM">0</field>
-                                                                                                  </shadow>
-                                                                                                </value>
-                                                                                                <value name="rgb_value_g">
-                                                                                                  <shadow type="math_number" id=".]g[;u*!U6(?biaWZq1i">
-                                                                                                    <field name="NUM">200</field>
-                                                                                                  </shadow>
-                                                                                                </value>
-                                                                                                <value name="rgb_value_b">
-                                                                                                  <shadow type="math_number" id="XTuQu=%6K3SXmH?Dp`PD">
-                                                                                                    <field name="NUM">0</field>
-                                                                                                  </shadow>
-                                                                                                </value>
-                                                                                              </block>
-                                                                                            </value>
-                                                                                            <next>
-                                                                                              <block type="ai_lcd_textcarvas" id="|VsLfPb2z7(U3/*G~[Te">
-                                                                                                <field name="varitem">img_face_Recognizer</field>
-                                                                                                <value name="POSA">
-                                                                                                  <block type="lcd_set_position" id="|pl#nqE6z-posU_Vh:qC">
-                                                                                                    <value name="POSX">
-                                                                                                      <shadow type="math_number" id="~B2N@tcQ(=tByO?!;6-d">
-                                                                                                        <field name="NUM">0</field>
-                                                                                                      </shadow>
-                                                                                                    </value>
-                                                                                                    <value name="POSY">
-                                                                                                      <shadow type="math_number" id="F`0ouUZjyT#?)crNgsA`">
-                                                                                                        <field name="NUM">0</field>
-                                                                                                      </shadow>
-                                                                                                    </value>
-                                                                                                  </block>
-                                                                                                </value>
-                                                                                                <value name="CONTENT">
-                                                                                                  <shadow type="text" id="9u]b*4uMFsb]{zt_o0-h">
-                                                                                                    <field name="TEXT"></field>
-                                                                                                  </shadow>
-                                                                                                  <block type="variables_get" id="8aszsGA%2[wzF5+%Z9V0">
-                                                                                                    <field name="VAR">NAMEFACERECGNIZER</field>
-                                                                                                  </block>
-                                                                                                </value>
-                                                                                                <value name="COLOR">
-                                                                                                  <block type="lcd_set_color" id="%^0jnC?W-VH%0e0PW;UA">
-                                                                                                    <field name="COLOR">#009900</field>
-                                                                                                  </block>
-                                                                                                </value>
-                                                                                                <value name="Scale">
-                                                                                                  <shadow type="math_number" id="v_)rvz1:kZb{-K[)]Cc3">
-                                                                                                    <field name="NUM">1</field>
-                                                                                                  </shadow>
-                                                                                                </value>
-                                                                                              </block>
-                                                                                            </next>
-                                                                                          </block>
-                                                                                        </statement>
-                                                                                        <statement name="ELSE">
-                                                                                          <block type="variables_set" id="]))aJ~!sq*K}E(fhxGFQ">
-                                                                                            <field name="VAR">color</field>
-                                                                                            <value name="VALUE">
-                                                                                              <shadow type="math_number" id="Uy7MuH5^;S21`G+C;4Z]">
-                                                                                                <field name="NUM">0</field>
-                                                                                              </shadow>
-                                                                                              <block type="ai_lcd_rgb_value_input" id="uzF(B$F[,0KDD~#uWE+o">
-                                                                                                <value name="rgb_value_r">
-                                                                                                  <shadow type="math_number" id="@V!u8ksD+9IY9mNpYkP_">
-                                                                                                    <field name="NUM">255</field>
-                                                                                                  </shadow>
-                                                                                                </value>
-                                                                                                <value name="rgb_value_g">
-                                                                                                  <shadow type="math_number" id="SPctR-2{3s,^A0Cp%LO%">
-                                                                                                    <field name="NUM">0</field>
-                                                                                                  </shadow>
-                                                                                                </value>
-                                                                                                <value name="rgb_value_b">
-                                                                                                  <shadow type="math_number" id="sypL$d9%ihu2oJ`jl,vF">
-                                                                                                    <field name="NUM">0</field>
-                                                                                                  </shadow>
-                                                                                                </value>
-                                                                                              </block>
-                                                                                            </value>
-                                                                                            <next>
-                                                                                              <block type="ai_lcd_textcarvas" id="Yg{LD4v9P*}08r~RdojQ">
-                                                                                                <field name="varitem">img_face_Recognizer</field>
-                                                                                                <value name="POSA">
-                                                                                                  <block type="lcd_set_position" id="LPlT$dUA(1x)``kKM/Uz">
-                                                                                                    <value name="POSX">
-                                                                                                      <shadow type="math_number" id="Fdr}7U`TTwbw+Y~p{|jW">
-                                                                                                        <field name="NUM">0</field>
-                                                                                                      </shadow>
-                                                                                                    </value>
-                                                                                                    <value name="POSY">
-                                                                                                      <shadow type="math_number" id="Q)![)yX*qw3dJDvjNK(`">
-                                                                                                        <field name="NUM">0</field>
-                                                                                                      </shadow>
-                                                                                                    </value>
-                                                                                                  </block>
-                                                                                                </value>
-                                                                                                <value name="CONTENT">
-                                                                                                  <shadow type="text" id="9u]b*4uMFsb]{zt_o0-h">
-                                                                                                    <field name="TEXT"></field>
-                                                                                                  </shadow>
-                                                                                                  <block type="variables_get" id="LQ@cX84Q4mz$9exEsdM`">
-                                                                                                    <field name="VAR">NAMEFACERECGNIZER</field>
-                                                                                                  </block>
-                                                                                                </value>
-                                                                                                <value name="COLOR">
-                                                                                                  <block type="lcd_set_color" id=")li[q@~;[C(j_k%8Pif(">
-                                                                                                    <field name="COLOR">#cc0000</field>
-                                                                                                  </block>
-                                                                                                </value>
-                                                                                                <value name="Scale">
-                                                                                                  <shadow type="math_number" id="dI,3mCWvpT+v8w/HDVd4">
-                                                                                                    <field name="NUM">1</field>
-                                                                                                  </shadow>
-                                                                                                </value>
-                                                                                              </block>
-                                                                                            </next>
-                                                                                          </block>
-                                                                                        </statement>
                                                                                       </block>
-                                                                                    </statement>
+                                                                                    </next>
                                                                                   </block>
                                                                                 </next>
                                                                               </block>
@@ -560,11 +644,38 @@
                                                             </next>
                                                           </block>
                                                         </statement>
-                                                      </block>
-                                                    </statement>
-                                                    <next>
-                                                      <block type="ai_lcd_showcarvas_set_display" id="2o0*CA~OIp2MDQ?N~Ny*">
-                                                        <field name="varitem">img_face_Recognizer</field>
+                                                        <next>
+                                                          <block type="variables_set" id="S@j,p-(W`sws,9(ToKlC">
+                                                            <field name="VAR">color</field>
+                                                            <value name="VALUE">
+                                                              <shadow type="math_number" id="Uy7MuH5^;S21`G+C;4Z]">
+                                                                <field name="NUM">0</field>
+                                                              </shadow>
+                                                              <block type="ai_lcd_rgb_value_input" id="D1~mXKk.[?_Hpp@f6c)q">
+                                                                <value name="rgb_value_r">
+                                                                  <shadow type="math_number" id="ci6pZE;od8aZ~1#.}U~S">
+                                                                    <field name="NUM">0</field>
+                                                                  </shadow>
+                                                                </value>
+                                                                <value name="rgb_value_g">
+                                                                  <shadow type="math_number" id="t!qnM/?yqOdk2im`(%rk">
+                                                                    <field name="NUM">0</field>
+                                                                  </shadow>
+                                                                </value>
+                                                                <value name="rgb_value_b">
+                                                                  <shadow type="math_number" id="tn@G5]`yqhasM$+kIDB~">
+                                                                    <field name="NUM">255</field>
+                                                                  </shadow>
+                                                                </value>
+                                                              </block>
+                                                            </value>
+                                                            <next>
+                                                              <block type="ai_lcd_showcarvas_set_display" id="2o0*CA~OIp2MDQ?N~Ny*">
+                                                                <field name="varitem">img_recognized_face</field>
+                                                              </block>
+                                                            </next>
+                                                          </block>
+                                                        </next>
                                                       </block>
                                                     </next>
                                                   </block>

+ 1 - 91
src/renderer/cocoblockly-x/src/python/AI/自学习.xml

@@ -127,7 +127,7 @@
                                             </value>
                                             <next>
                                               <block type="controls_if" id="cLm(o/Y_m4frEyfReH^:">
-                                                <mutation elseif="2"></mutation>
+                                                <mutation elseif="1"></mutation>
                                                 <value name="IF0">
                                                   <block type="ai_v831_button_read_pressed" id="b|?|:4.?$IHG;9OdXA^r">
                                                     <field name="button_type">C</field>
@@ -298,96 +298,6 @@
                                                     </next>
                                                   </block>
                                                 </statement>
-                                                <value name="IF2">
-                                                  <block type="logic_compare" id="+23c_a!lIbZS*Ir~N-N=">
-                                                    <field name="OP">EQ</field>
-                                                    <value name="A">
-                                                      <block type="variables_get" id="S@T(s%wBPTTF/]hVGZEX">
-                                                        <field name="VAR">is_train</field>
-                                                      </block>
-                                                    </value>
-                                                    <value name="B">
-                                                      <block type="math_number" id="b3dq6LH-1CxBm7654/K:">
-                                                        <field name="NUM">1</field>
-                                                      </block>
-                                                    </value>
-                                                  </block>
-                                                </value>
-                                                <statement name="DO2">
-                                                  <block type="ai_model_self_learning_class_verification" id="AihW1:gB/^[:BwlE~045">
-                                                    <field name="varitem">learing_img</field>
-                                                    <next>
-                                                      <block type="variables_set" id="hjyjYHsqprbG(K*R%~3c">
-                                                        <field name="VAR">str_display</field>
-                                                        <value name="VALUE">
-                                                          <shadow type="math_number" id="WaDfG{ZD:tS`7k63T?eb">
-                                                            <field name="NUM">0</field>
-                                                          </shadow>
-                                                          <block type="text_join" id="*q@)3$tjD4%8#qKQSCX%">
-                                                            <mutation items="2"></mutation>
-                                                            <value name="ADD0">
-                                                              <block type="text" id="1CA.M7M,ACS`R?Cu{tK0">
-                                                                <field name="TEXT">识别名称:</field>
-                                                              </block>
-                                                            </value>
-                                                            <value name="ADD1">
-                                                              <block type="ai_model_self_learning_result" id="E]o?W*!?,~B6}]mB!7jc">
-                                                                <field name="TYPE">X</field>
-                                                              </block>
-                                                            </value>
-                                                          </block>
-                                                        </value>
-                                                        <next>
-                                                          <block type="ai_lcd_textcarvas" id="|Cpa_SPKfI]a:FEa?KJl">
-                                                            <field name="varitem">learing_img</field>
-                                                            <value name="POSA">
-                                                              <block type="lcd_set_position" id="e6:g9BjP|`V0Va_@WI^^">
-                                                                <value name="POSX">
-                                                                  <shadow type="math_number" id=")V~Y7BWL`z%-OpH.=,nt">
-                                                                    <field name="NUM">0</field>
-                                                                  </shadow>
-                                                                </value>
-                                                                <value name="POSY">
-                                                                  <shadow type="math_number" id="dP|J5*~;)$0_Gp#LE/rQ">
-                                                                    <field name="NUM">50</field>
-                                                                  </shadow>
-                                                                </value>
-                                                              </block>
-                                                            </value>
-                                                            <value name="CONTENT">
-                                                              <shadow type="text" id="KT6[TPX=8Gm+aGq}68qS">
-                                                                <field name="TEXT"></field>
-                                                              </shadow>
-                                                              <block type="text_join" id="7:UUa{kU0#UxO+s:J:C%">
-                                                                <mutation items="2"></mutation>
-                                                                <value name="ADD0">
-                                                                  <block type="text" id="ig4Oof~))fz^6iWD#*U3">
-                                                                    <field name="TEXT">置信度:</field>
-                                                                  </block>
-                                                                </value>
-                                                                <value name="ADD1">
-                                                                  <block type="ai_model_self_learning_result" id="J,#+S4NVSoqieX+e]cX`">
-                                                                    <field name="TYPE">Y</field>
-                                                                  </block>
-                                                                </value>
-                                                              </block>
-                                                            </value>
-                                                            <value name="COLOR">
-                                                              <block type="lcd_set_color" id=")5YK*))7;:(-GmbR+@xE">
-                                                                <field name="COLOR">#ff0000</field>
-                                                              </block>
-                                                            </value>
-                                                            <value name="Scale">
-                                                              <shadow type="math_number" id="Z_`dX$F5tIar[$[LoDPq">
-                                                                <field name="NUM">1</field>
-                                                              </shadow>
-                                                            </value>
-                                                          </block>
-                                                        </next>
-                                                      </block>
-                                                    </next>
-                                                  </block>
-                                                </statement>
                                                 <next>
                                                   <block type="ai_lcd_showcarvas_set_display" id="5+sZf|C)aD8uoLh*z-CU">
                                                     <field name="varitem">learing_img</field>

+ 183 - 0
src/renderer/cocoblockly-x/src/python/AI/自学习识别.xml

@@ -0,0 +1,183 @@
+<xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
+  <block type="ai_lcd_screeninit" id="(+t*3DmBMDfUBiZng,C=" inline="true" x="309" y="-67">
+    <field name="isScreen">False</field>
+    <next>
+      <block type="ai_camera_init" id="#6Xr`tVfUux,qKWi?h4?" inline="true">
+        <next>
+          <block type="ai_model_self_learning_init" id="A0=w)4T*+zt9U+D-o@.j">
+            <value name="class_input">
+              <block type="lists_create_with" id="i(}%3vO0o0s/)vZ7yR:^">
+                <mutation items="3"></mutation>
+                <value name="ADD0">
+                  <block type="text" id="{6nw7msz:=?w1A;4clhB">
+                    <field name="TEXT">class1</field>
+                  </block>
+                </value>
+                <value name="ADD1">
+                  <block type="text" id="g.nlwIW:vrcIkWXyhT).">
+                    <field name="TEXT">class2</field>
+                  </block>
+                </value>
+                <value name="ADD2">
+                  <block type="text" id=")pJ;a5,i#)LdbTJA0=aI">
+                    <field name="TEXT">class3</field>
+                  </block>
+                </value>
+              </block>
+            </value>
+            <next>
+              <block type="ai_model_self_learning_recognize_load" id="``Fc:|?.j%(|iqkR5L!Y">
+                <next>
+                  <block type="controls_repeat_forever" id="9xpTB^B:iy+%6]+.c.q0">
+                    <statement name="DO">
+                      <block type="variables_set" id="X6ddV`)PvMYv@L.YRzxP">
+                        <field name="VAR">canvas</field>
+                        <value name="VALUE">
+                          <shadow type="math_number" id="zavlqX}+f](?=IqU.`~V">
+                            <field name="NUM">0</field>
+                          </shadow>
+                          <block type="ai_camera_snapshot" id="zi:;+IUvE_dS:{=IAsf}"></block>
+                        </value>
+                        <next>
+                          <block type="variables_set" id="_PY$k/Mc=VzS0^L=atI(">
+                            <field name="VAR">learing_img</field>
+                            <value name="VALUE">
+                              <shadow type="math_number" id="zavlqX}+f](?=IqU.`~V">
+                                <field name="NUM">0</field>
+                              </shadow>
+                              <block type="v831_lcd_resizecanvas" id="rf)*yIN%pLDs0#~qE1V!">
+                                <field name="varitem">canvas</field>
+                                <value name="wh">
+                                  <block type="ai_lcd_WH_vision" id="yxD5P%Jx$?E_]-C8$FGs">
+                                    <value name="A">
+                                      <shadow type="math_number" id="X*BP2yCp+`lBX%Hx670|">
+                                        <field name="NUM">224</field>
+                                      </shadow>
+                                    </value>
+                                    <value name="B">
+                                      <shadow type="math_number" id="gnU9A[NX*rxdzqhhQTa3">
+                                        <field name="NUM">224</field>
+                                      </shadow>
+                                    </value>
+                                  </block>
+                                </value>
+                              </block>
+                            </value>
+                            <next>
+                              <block type="ai_model_self_learning_class_verification" id="AihW1:gB/^[:BwlE~045">
+                                <field name="varitem">learing_img</field>
+                                <next>
+                                  <block type="ai_lcd_textcarvas" id="3*k1H#[8AQDn;$?yhE$^">
+                                    <field name="varitem">learing_img</field>
+                                    <value name="POSA">
+                                      <block type="lcd_set_position" id="]OM$,XXbSEBIQakLD!c8">
+                                        <value name="POSX">
+                                          <shadow type="math_number" id="@*j);_R8+3Cos#/Zm:AV">
+                                            <field name="NUM">0</field>
+                                          </shadow>
+                                        </value>
+                                        <value name="POSY">
+                                          <shadow type="math_number" id="un|4caegvgDUv$2xQt6j">
+                                            <field name="NUM">0</field>
+                                          </shadow>
+                                        </value>
+                                      </block>
+                                    </value>
+                                    <value name="CONTENT">
+                                      <shadow type="text" id="KT6[TPX=8Gm+aGq}68qS">
+                                        <field name="TEXT"></field>
+                                      </shadow>
+                                      <block type="text_join" id="*q@)3$tjD4%8#qKQSCX%">
+                                        <mutation items="2"></mutation>
+                                        <value name="ADD0">
+                                          <block type="text" id="1CA.M7M,ACS`R?Cu{tK0">
+                                            <field name="TEXT">识别名称:</field>
+                                          </block>
+                                        </value>
+                                        <value name="ADD1">
+                                          <block type="ai_model_self_learning_result" id="E]o?W*!?,~B6}]mB!7jc">
+                                            <field name="TYPE">X</field>
+                                          </block>
+                                        </value>
+                                      </block>
+                                    </value>
+                                    <value name="COLOR">
+                                      <block type="lcd_set_color" id="PxiF+JU.q-Hw!$M;nCo|">
+                                        <field name="COLOR">#ff0000</field>
+                                      </block>
+                                    </value>
+                                    <value name="Scale">
+                                      <shadow type="math_number" id="z15zT_X2j3-MNA_;nG(n">
+                                        <field name="NUM">1</field>
+                                      </shadow>
+                                    </value>
+                                    <next>
+                                      <block type="ai_lcd_textcarvas" id="|Cpa_SPKfI]a:FEa?KJl">
+                                        <field name="varitem">learing_img</field>
+                                        <value name="POSA">
+                                          <block type="lcd_set_position" id="e6:g9BjP|`V0Va_@WI^^">
+                                            <value name="POSX">
+                                              <shadow type="math_number" id=")V~Y7BWL`z%-OpH.=,nt">
+                                                <field name="NUM">0</field>
+                                              </shadow>
+                                            </value>
+                                            <value name="POSY">
+                                              <shadow type="math_number" id="dP|J5*~;)$0_Gp#LE/rQ">
+                                                <field name="NUM">50</field>
+                                              </shadow>
+                                            </value>
+                                          </block>
+                                        </value>
+                                        <value name="CONTENT">
+                                          <shadow type="text" id="KT6[TPX=8Gm+aGq}68qS">
+                                            <field name="TEXT"></field>
+                                          </shadow>
+                                          <block type="text_join" id="7:UUa{kU0#UxO+s:J:C%">
+                                            <mutation items="2"></mutation>
+                                            <value name="ADD0">
+                                              <block type="text" id="ig4Oof~))fz^6iWD#*U3">
+                                                <field name="TEXT">置信度:</field>
+                                              </block>
+                                            </value>
+                                            <value name="ADD1">
+                                              <block type="ai_model_self_learning_result" id="J,#+S4NVSoqieX+e]cX`">
+                                                <field name="TYPE">Y</field>
+                                              </block>
+                                            </value>
+                                          </block>
+                                        </value>
+                                        <value name="COLOR">
+                                          <block type="lcd_set_color" id=")5YK*))7;:(-GmbR+@xE">
+                                            <field name="COLOR">#ff0000</field>
+                                          </block>
+                                        </value>
+                                        <value name="Scale">
+                                          <shadow type="math_number" id="Z_`dX$F5tIar[$[LoDPq">
+                                            <field name="NUM">1</field>
+                                          </shadow>
+                                        </value>
+                                        <next>
+                                          <block type="ai_lcd_showcarvas_set_display" id="5+sZf|C)aD8uoLh*z-CU">
+                                            <field name="varitem">learing_img</field>
+                                          </block>
+                                        </next>
+                                      </block>
+                                    </next>
+                                  </block>
+                                </next>
+                              </block>
+                            </next>
+                          </block>
+                        </next>
+                      </block>
+                    </statement>
+                  </block>
+                </next>
+              </block>
+            </next>
+          </block>
+        </next>
+      </block>
+    </next>
+  </block>
+</xml>

+ 10 - 14
src/renderer/cocoblockly-x/src/python/AI/语音录制识别.xml

@@ -21,27 +21,23 @@
               </block>
             </value>
             <next>
-              <block type="speech_recognition_clear" id="Akg$Yc{=i+PEl%0+!EbT">
-                <next>
-                  <block type="controls_repeat_forever" id=",m!+a+([9T?7N}Sr.8y(">
-                    <statement name="DO">
-                      <block type="ai_lcd_clearcanvas" id="`K%47wAIfO~4)(u0f*eP">
+              <block type="controls_repeat_forever" id=",m!+a+([9T?7N}Sr.8y(">
+                <statement name="DO">
+                  <block type="ai_lcd_clearcanvas" id="`K%47wAIfO~4)(u0f*eP">
+                    <field name="varitem">canvas</field>
+                    <next>
+                      <block type="speech_recognition_record_start_result" id="xWK]IP!:F[1b4(0Qg3~S">
+                        <field name="clip">2</field>
                         <field name="varitem">canvas</field>
                         <next>
-                          <block type="speech_recognition_record_start_result" id="xWK]IP!:F[1b4(0Qg3~S">
-                            <field name="clip">2</field>
+                          <block type="ai_lcd_showcarvas_set_display" id="2r0?mSc%^Umq{@?u*U;?">
                             <field name="varitem">canvas</field>
-                            <next>
-                              <block type="ai_lcd_showcarvas_set_display" id="2r0?mSc%^Umq{@?u*U;?">
-                                <field name="varitem">canvas</field>
-                              </block>
-                            </next>
                           </block>
                         </next>
                       </block>
-                    </statement>
+                    </next>
                   </block>
-                </next>
+                </statement>
               </block>
             </next>
           </block>

+ 229 - 0
src/renderer/cocoblockly-x/src/python/AI/车牌识别.xml

@@ -0,0 +1,229 @@
+<xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
+  <block type="ai_camera_init" id="R,JiO#+11s.,PkHq3uN~" x="-202" y="-295">
+    <next>
+      <block type="ai_lcd_screeninit" id="VD]SmZiAWxaq#r]A896V">
+        <field name="isScreen">False</field>
+        <next>
+          <block type="ai_lcd_createnonecarvas" id="QQb*c1^^^M[8JCJz.8IB">
+            <field name="varitem">img_card_recognition</field>
+            <value name="wh">
+              <block type="lcd_set_width_height" id="vQxRw4[QmiI_3.K]ODS~">
+                <value name="WIDTH">
+                  <shadow type="math_number" id="!sPv{zAMc~@@csMJr`kR">
+                    <field name="NUM">320</field>
+                  </shadow>
+                </value>
+                <value name="HEIGHT">
+                  <shadow type="math_number" id="ns$(YvKZS6Rb7[1OoSe.">
+                    <field name="NUM">240</field>
+                  </shadow>
+                </value>
+              </block>
+            </value>
+            <next>
+              <block type="ai_model_card_recognition_init" id="Vto]hS|`yci-y28Pi,c,">
+                <next>
+                  <block type="variables_set" id="A!^t9-wEq;:m-Yga`vb4">
+                    <field name="VAR">num_of_people</field>
+                    <value name="VALUE">
+                      <shadow type="math_number" id="_~$,M|^qH]gp85aqUPEQ">
+                        <field name="NUM">0</field>
+                      </shadow>
+                    </value>
+                    <next>
+                      <block type="controls_repeat_forever" id="ELs)W_Hx[X)_F~lsO7IR">
+                        <statement name="DO">
+                          <block type="variables_set" id="40A!g7H?2-H:xajp[w$P">
+                            <field name="VAR">img_card_recognition</field>
+                            <value name="VALUE">
+                              <shadow type="math_number" id="Cv7+5N7;nX]i+$Ve7[3,">
+                                <field name="NUM">0</field>
+                              </shadow>
+                              <block type="ai_camera_snapshot" id="hjD-]!i^vFD4rFEKjnuh"></block>
+                            </value>
+                            <next>
+                              <block type="variables_set" id="bpx8qdGBUiKR}%f5^UF]">
+                                <field name="VAR">img_card_recognition</field>
+                                <value name="VALUE">
+                                  <shadow type="math_number" id="`(h]5lP10}Hw5`6@HuIz">
+                                    <field name="NUM">0</field>
+                                  </shadow>
+                                  <block type="v831_lcd_img_cut" id="K~n6v+Rx8$#cXe?deFk#">
+                                    <field name="varitem">img_card_recognition</field>
+                                    <value name="xy">
+                                      <block type="ai_lcd_XY_vision" id="0gra8E?Zcx7R9uh;AwJe">
+                                        <value name="A">
+                                          <shadow type="math_number" id="r%q,B;J3Oc/U$w/*2x2C">
+                                            <field name="NUM">0</field>
+                                          </shadow>
+                                        </value>
+                                        <value name="B">
+                                          <shadow type="math_number" id=".,A+n.T,u$F?wF=Fc8X=">
+                                            <field name="NUM">0</field>
+                                          </shadow>
+                                        </value>
+                                      </block>
+                                    </value>
+                                    <value name="wh">
+                                      <block type="ai_lcd_WH_vision" id="IP`.TIt7(u+Op6gA|eOW">
+                                        <value name="A">
+                                          <shadow type="math_number" id="7?p:0oS[i^pBCNMfyp9{">
+                                            <field name="NUM">224</field>
+                                          </shadow>
+                                        </value>
+                                        <value name="B">
+                                          <shadow type="math_number" id="q_Hpaj#_Z#dJil|X;MW(">
+                                            <field name="NUM">224</field>
+                                          </shadow>
+                                        </value>
+                                      </block>
+                                    </value>
+                                  </block>
+                                </value>
+                                <next>
+                                  <block type="ai_model_card_recognition_load" id="T=bN7};!kZbFP}/wIY_A">
+                                    <field name="varitem">img_card_recognition</field>
+                                    <next>
+                                      <block type="controls_if" id="SIRFjb0PF{rP#8{$]h($">
+                                        <value name="IF0">
+                                          <block type="ai_model_card_xy" id=")^,75Q@L5oy~;:,`Q.D+"></block>
+                                        </value>
+                                        <statement name="DO0">
+                                          <block type="controls_forEach" id="Z]}P@qJv}q6iDHusa2qP">
+                                            <field name="VAR">i</field>
+                                            <value name="LIST">
+                                              <block type="ai_model_card_result" id=",Le_zPm+]/C{[3jxxLcw"></block>
+                                            </value>
+                                            <statement name="DO">
+                                              <block type="ai_lcd_ractanglecarvas" id="k17o^y6Z)UGf5BDvX|4@">
+                                                <field name="varitem">img_card_recognition</field>
+                                                <field name="rect_type">rect</field>
+                                                <value name="POSA">
+                                                  <block type="lcd_set_position" id="pD_WC:k)?uU).#`9VN~}">
+                                                    <value name="POSX">
+                                                      <shadow type="math_number" id="fFgjm8!2gG16,:XSR]a0">
+                                                        <field name="NUM">0</field>
+                                                      </shadow>
+                                                      <block type="ai_model_card_get" id="hd*wU~p0~:j%A+MYQTgO">
+                                                        <field name="varitem">i</field>
+                                                        <field name="TYPE">X</field>
+                                                      </block>
+                                                    </value>
+                                                    <value name="POSY">
+                                                      <shadow type="math_number" id="3}O[c$jDPgF/{yXh.?Kc">
+                                                        <field name="NUM">0</field>
+                                                      </shadow>
+                                                      <block type="ai_model_card_get" id="k.bF8[T?Zvc;`uo2O@pF">
+                                                        <field name="varitem">i</field>
+                                                        <field name="TYPE">Y</field>
+                                                      </block>
+                                                    </value>
+                                                  </block>
+                                                </value>
+                                                <value name="POSB">
+                                                  <block type="lcd_set_position" id="e*OMOihGnUm+W[{x7QG@">
+                                                    <value name="POSX">
+                                                      <shadow type="math_number" id="aS8+I?43,VbCR0Mgp(rt">
+                                                        <field name="NUM">0</field>
+                                                      </shadow>
+                                                      <block type="ai_model_card_get" id="ag+?C:MYK{*rf{I;4f,b">
+                                                        <field name="varitem">i</field>
+                                                        <field name="TYPE">W</field>
+                                                      </block>
+                                                    </value>
+                                                    <value name="POSY">
+                                                      <shadow type="math_number" id="`{=)ZksSG?DlRGf@_5L$">
+                                                        <field name="NUM">0</field>
+                                                      </shadow>
+                                                      <block type="ai_model_card_get" id="0QqnyG}^:Rnqn:NXQXDv">
+                                                        <field name="varitem">i</field>
+                                                        <field name="TYPE">H</field>
+                                                      </block>
+                                                    </value>
+                                                  </block>
+                                                </value>
+                                                <value name="COLOR">
+                                                  <block type="lcd_set_color" id="dX:wY2C?080TOLH|K4Wp">
+                                                    <field name="COLOR">#ff0000</field>
+                                                  </block>
+                                                </value>
+                                                <next>
+                                                  <block type="ai_lcd_textcarvas" id="%yXQJC0@Pei2^qhA]NEj">
+                                                    <field name="varitem">img_card_recognition</field>
+                                                    <value name="POSA">
+                                                      <block type="lcd_set_position" id="}Kx:v]r.~]23k(L=15Ed">
+                                                        <value name="POSX">
+                                                          <shadow type="math_number" id="fFgjm8!2gG16,:XSR]a0">
+                                                            <field name="NUM">0</field>
+                                                          </shadow>
+                                                          <block type="ai_model_card_get" id=":J5(=|~sphJWG9-U{_*T">
+                                                            <field name="varitem">i</field>
+                                                            <field name="TYPE">X</field>
+                                                          </block>
+                                                        </value>
+                                                        <value name="POSY">
+                                                          <shadow type="math_number" id="3}O[c$jDPgF/{yXh.?Kc">
+                                                            <field name="NUM">0</field>
+                                                          </shadow>
+                                                          <block type="ai_model_card_get" id="Cvx%S2yX1V}|:9xQs*%.">
+                                                            <field name="varitem">i</field>
+                                                            <field name="TYPE">Y</field>
+                                                          </block>
+                                                        </value>
+                                                      </block>
+                                                    </value>
+                                                    <value name="CONTENT">
+                                                      <shadow type="text" id="K?Las_n6^8X}oZ3*7}fj">
+                                                        <field name="TEXT"></field>
+                                                      </shadow>
+                                                      <block type="text_join" id="UX,m2O2@QToK1PChzj0X">
+                                                        <mutation items="1"></mutation>
+                                                        <value name="ADD0">
+                                                          <block type="ai_model_card_get" id="`}n#m_HKV#|Li=`Z1P2L">
+                                                            <field name="varitem">i</field>
+                                                            <field name="TYPE">Object</field>
+                                                          </block>
+                                                        </value>
+                                                      </block>
+                                                    </value>
+                                                    <value name="COLOR">
+                                                      <block type="lcd_set_color" id="^2@@e}x@:sMaK%;3b3y5">
+                                                        <field name="COLOR">#ffffff</field>
+                                                      </block>
+                                                    </value>
+                                                    <value name="Scale">
+                                                      <shadow type="math_number" id="],aZ]ur}ek{6K4*OFx{I">
+                                                        <field name="NUM">1</field>
+                                                      </shadow>
+                                                    </value>
+                                                  </block>
+                                                </next>
+                                              </block>
+                                            </statement>
+                                          </block>
+                                        </statement>
+                                        <next>
+                                          <block type="ai_lcd_showcarvas_set_display" id="JX:Wp@oAZ+Ib41=Dzk|7">
+                                            <field name="varitem">img_card_recognition</field>
+                                          </block>
+                                        </next>
+                                      </block>
+                                    </next>
+                                  </block>
+                                </next>
+                              </block>
+                            </next>
+                          </block>
+                        </statement>
+                      </block>
+                    </next>
+                  </block>
+                </next>
+              </block>
+            </next>
+          </block>
+        </next>
+      </block>
+    </next>
+  </block>
+</xml>

+ 117 - 7
src/renderer/cocoblockly-x/src/python/bofangyinpin.xml

@@ -1,17 +1,127 @@
 <xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
-  <block type="ai_audio_play_init" id="?:[!@(MSfj%ICC=P6%+%" x="-141" y="199">
+  <block type="ai_audio_play_init" id="?:[!@(MSfj%ICC=P6%+%" x="239" y="123">
     <next>
       <block type="ai_audio_play_volume" id="XpW(?E0~N]3Yaa%p!WH;">
-        <field name="play_vol">25</field>
+        <field name="play_vol">50</field>
         <next>
-          <block type="ai_audio_play_song" id="XT!wMw=E)N!%/Y/g!0To">
-            <value name="path">
-              <shadow type="text" id="01%z$y*pPZki3{#^p,u:">
-                <field name="TEXT">/root/preset/audio/luckystar.wav</field>
+          <block type="variables_set" id="s|WOd2axO1ByK_,V`T~,">
+            <field name="VAR">state</field>
+            <value name="VALUE">
+              <shadow type="math_number" id="Y()ry+G$Pk(FHv`mt^h-">
+                <field name="NUM">0</field>
               </shadow>
             </value>
             <next>
-              <block type="ai_audio_play_start" id="hY~,Bu]_FXKGv}0y]t2/"></block>
+              <block type="controls_repeat_forever" id="L~W*fxR!Z:=wCDI;Z|;_">
+                <statement name="DO">
+                  <block type="ai_audio_play_song" id="XT!wMw=E)N!%/Y/g!0To">
+                    <value name="path">
+                      <shadow type="text" id="01%z$y*pPZki3{#^p,u:">
+                        <field name="TEXT">/root/preset/audio/luckystar.wav</field>
+                      </shadow>
+                    </value>
+                    <next>
+                      <block type="controls_if" id="2W(V}|3:0XMDa(BNdrbK">
+                        <mutation elseif="1"></mutation>
+                        <value name="IF0">
+                          <block type="ai_v831_button_read_pressed" id="hl[2OX9BBD.chM94WCIH">
+                            <field name="button_type">C</field>
+                          </block>
+                        </value>
+                        <statement name="DO0">
+                          <block type="controls_whileUntil" id="TA-yRGtWDhK|B-]WFz9_">
+                            <field name="MODE">UNTIL</field>
+                            <value name="BOOL">
+                              <block type="ai_v831_button_read_released" id="t_0)76dYJ/ZCl[Qme+I!">
+                                <field name="button_type_released">C</field>
+                              </block>
+                            </value>
+                            <statement name="DO">
+                              <block type="time_delay" id="QW]sPZ=8^1e?N(cD1|Wx">
+                                <value name="DELAY_TIME_MILI">
+                                  <block type="math_number" id="[3nK}Xb5NcwtClXYLB;e">
+                                    <field name="NUM">10</field>
+                                  </block>
+                                </value>
+                              </block>
+                            </statement>
+                            <next>
+                              <block type="variables_set" id="()F*!d;%v0v5/E|zr,!y">
+                                <field name="VAR">state</field>
+                                <value name="VALUE">
+                                  <shadow type="math_number" id="|Ne+5D3yXHfo|EGLg}v8">
+                                    <field name="NUM">1</field>
+                                  </shadow>
+                                </value>
+                              </block>
+                            </next>
+                          </block>
+                        </statement>
+                        <value name="IF1">
+                          <block type="ai_v831_button_read_pressed" id="!O,/U8-b^W)t[1XPZQ$1">
+                            <field name="button_type">D</field>
+                          </block>
+                        </value>
+                        <statement name="DO1">
+                          <block type="controls_whileUntil" id="-Lcf.Vl^*~J8nuf47,8c">
+                            <field name="MODE">UNTIL</field>
+                            <value name="BOOL">
+                              <block type="ai_v831_button_read_released" id="jo)O@i,+mt|-;QbvA/%x">
+                                <field name="button_type_released">D</field>
+                              </block>
+                            </value>
+                            <statement name="DO">
+                              <block type="time_delay" id="274ZakDxsCRKLJt=4:[A">
+                                <value name="DELAY_TIME_MILI">
+                                  <block type="math_number" id="5$}G#ui7%$O*DTWuA.U(">
+                                    <field name="NUM">10</field>
+                                  </block>
+                                </value>
+                              </block>
+                            </statement>
+                            <next>
+                              <block type="variables_set" id="HyMh{A7+BjlV6I{Y[^IZ">
+                                <field name="VAR">state</field>
+                                <value name="VALUE">
+                                  <shadow type="math_number" id="dyjKUB4SH%zKb^48R-`0">
+                                    <field name="NUM">0</field>
+                                  </shadow>
+                                </value>
+                              </block>
+                            </next>
+                          </block>
+                        </statement>
+                        <next>
+                          <block type="controls_if" id="Oz7Yd`9fTlEKCkag,ZTm">
+                            <mutation else="1"></mutation>
+                            <value name="IF0">
+                              <block type="logic_compare" id="G=#hk[`q7g%yl08.0d@n">
+                                <field name="OP">EQ</field>
+                                <value name="A">
+                                  <block type="variables_get" id="CJm{EGboo$q{7VD9sR=Z">
+                                    <field name="VAR">state</field>
+                                  </block>
+                                </value>
+                                <value name="B">
+                                  <block type="math_number" id="k+8[EmTCRDPK~REfYwnc">
+                                    <field name="NUM">0</field>
+                                  </block>
+                                </value>
+                              </block>
+                            </value>
+                            <statement name="DO0">
+                              <block type="ai_audio_play_finish" id="[TA0xh}9eF]jo[R~-]?+"></block>
+                            </statement>
+                            <statement name="ELSE">
+                              <block type="ai_audio_play_start" id="k)hc]XTZz*/!mKD1ylX!"></block>
+                            </statement>
+                          </block>
+                        </next>
+                      </block>
+                    </next>
+                  </block>
+                </statement>
+              </block>
             </next>
           </block>
         </next>

+ 37 - 7
src/renderer/cocoblockly-x/src/python/video/play_vidoe.xml

@@ -1,12 +1,42 @@
 <xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
-  <block type="ai_video_set" id="cS2580d%CtrNyjemq.d1" x="-226" y="78">
-    <value name="path">
-      <shadow type="text" id="IHi3|yLaaW`i]q=~=MwM">
-        <field name="TEXT">/root/preset/video/world.mp4</field>
-      </shadow>
-    </value>
+  <block type="ai_video_set_init" id="s)iT]W_MIi^-OsA@9wsy" x="230" y="140">
     <next>
-      <block type="ai_video_set_play" id="]q7MQ:XK;x]kZ,f;}-pj"></block>
+      <block type="controls_repeat_forever" id="Y2HxoM|F816klda];L_J">
+        <statement name="DO">
+          <block type="ai_video_set" id="n(I|j8=hj1EZdRYZg.;D">
+            <value name="path">
+              <shadow type="text" id="OymB=!5;Rgl$)^fiUe5E">
+                <field name="TEXT">/root/preset/video/output_240_240.mp4</field>
+              </shadow>
+            </value>
+            <next>
+              <block type="controls_forEach" id="xwO7XC6WCon;-@AiW5Tq">
+                <field name="VAR">i</field>
+                <value name="LIST">
+                  <block type="ai_video_set_stats" id="U.UmMvlIig$;4r1GXTuE"></block>
+                </value>
+                <statement name="DO">
+                  <block type="controls_if" id="?~Fh01G/_bL:hQ60I*Sx">
+                    <value name="IF0">
+                      <block type="ai_v831_button_read_pressed" id="x0MZmu*4bbTnsh+!3O!z">
+                        <field name="button_type">C</field>
+                      </block>
+                    </value>
+                    <statement name="DO0">
+                      <block type="ai_video_stop_play" id="#5,QjWSS+?){2._6e$@]"></block>
+                    </statement>
+                    <next>
+                      <block type="ai_video_set_play" id="3AgsrkDB^NVNa*oY9m%z">
+                        <field name="varitem">i</field>
+                      </block>
+                    </next>
+                  </block>
+                </statement>
+              </block>
+            </next>
+          </block>
+        </statement>
+      </block>
     </next>
   </block>
 </xml>

+ 37 - 7
src/renderer/cocoblockly-x/src/python/video/视频播放.xml

@@ -1,12 +1,42 @@
 <xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
-  <block type="ai_video_set" id="5|+z[DeajCK=tKe0OuYW" x="352" y="105">
-    <value name="path">
-      <shadow type="text" id="dS.g;bM3rU??]W*76e39">
-        <field name="TEXT">/root/user/video/coco2.mp4</field>
-      </shadow>
-    </value>
+  <block type="ai_video_set_init" id="s)iT]W_MIi^-OsA@9wsy" x="283" y="55">
     <next>
-      <block type="ai_video_set_play" id="dSF|AdJpX0nBP1C[$^)N"></block>
+      <block type="controls_repeat_forever" id="%:9Rv@N|dqAPU].S!N^{">
+        <statement name="DO">
+          <block type="ai_video_set" id="n(I|j8=hj1EZdRYZg.;D">
+            <value name="path">
+              <shadow type="text" id="OymB=!5;Rgl$)^fiUe5E">
+                <field name="TEXT">/root/preset/video/output_240_240.mp4</field>
+              </shadow>
+            </value>
+            <next>
+              <block type="controls_forEach" id="xwO7XC6WCon;-@AiW5Tq">
+                <field name="VAR">i</field>
+                <value name="LIST">
+                  <block type="ai_video_set_stats" id="U.UmMvlIig$;4r1GXTuE"></block>
+                </value>
+                <statement name="DO">
+                  <block type="controls_if" id="j+=t3%uNe=M9m`yGHCVy">
+                    <value name="IF0">
+                      <block type="ai_v831_button_read_pressed" id="(ac(yohOC)ATe?gHwF(5">
+                        <field name="button_type">C</field>
+                      </block>
+                    </value>
+                    <statement name="DO0">
+                      <block type="ai_video_stop_play" id="eU:}3:MR/xrw`vM|n{P."></block>
+                    </statement>
+                    <next>
+                      <block type="ai_video_set_play" id="3AgsrkDB^NVNa*oY9m%z">
+                        <field name="varitem">i</field>
+                      </block>
+                    </next>
+                  </block>
+                </statement>
+              </block>
+            </next>
+          </block>
+        </statement>
+      </block>
     </next>
   </block>
 </xml>

+ 129 - 104
src/renderer/cocoblockly-x/src/python/web/同步网络时间.xml

@@ -1,13 +1,13 @@
 <xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
-  <block type="esp32_main_controller_wifi_connect_internet" id="RZe6*}mwSMk:.A%eB(MM" x="-225" y="-382">
+  <block type="esp32_main_controller_wifi_connect_internet" id="}YF_#KIgowo$6;:yZJYq" x="0" y="0">
     <value name="ssid">
-      <shadow type="text" id="+wu$euPv%n~0mbeIXZ1x">
-        <field name="TEXT">ENTER_YOUR_SSID</field>
+      <shadow type="text" id="D(K)Rw?SYse}O+p8ofDM">
+        <field name="TEXT">CocoRobo_SZ</field>
       </shadow>
     </value>
     <value name="password">
-      <shadow type="text" id="Rx+Y3RRdw,k]sP7]blfN">
-        <field name="TEXT">ENTER_YOUR_PASSWORD</field>
+      <shadow type="text" id="VcE@G~APC+v0mPv}97qY">
+        <field name="TEXT">cocorobo2019</field>
       </shadow>
     </value>
     <next>
@@ -17,77 +17,70 @@
           <block type="esp32_main_controller_get_wifi_connection_status" id="V%X54C6(sQ`Fm6Iu7,Hm"></block>
         </value>
         <statement name="DO">
-          <block type="ai_v831_led_light_up" id="hE6;nken5?9auZ[VG?c6">
+          <block type="ai_v831_led_light_off" id="t6lsPhpx02$giQQ$:(r9">
             <field name="type">blue</field>
           </block>
         </statement>
         <next>
-          <block type="ai_lcd_screeninit" id="ko/t,4l8^:_r`c?*km-N">
-            <field name="isScreen">False</field>
+          <block type="ai_v831_led_light_up" id="hE6;nken5?9auZ[VG?c6">
+            <field name="type">blue</field>
             <next>
-              <block type="ai_lcd_createnonecarvas" id="?pCW#uJ11d3}wSk{%rmS">
-                <field name="varitem">canvas</field>
-                <value name="wh">
-                  <block type="lcd_set_width_height" id="vvKHF:fR{gFT7l=@7xQ2">
-                    <value name="WIDTH">
-                      <shadow type="math_number" id="6?EA/%GT?SXo.-)Kv59g">
-                        <field name="NUM">320</field>
-                      </shadow>
-                    </value>
-                    <value name="HEIGHT">
-                      <shadow type="math_number" id=";vT9xZA;d:[ZNyh/:h|;">
-                        <field name="NUM">240</field>
-                      </shadow>
-                    </value>
-                  </block>
-                </value>
+              <block type="ai_lcd_screeninit" id="ko/t,4l8^:_r`c?*km-N">
+                <field name="isScreen">False</field>
                 <next>
-                  <block type="esp32_main_controller_wifi_ntptime" id="f?TdIfH1V^h*F;*hW`yZ">
+                  <block type="ai_lcd_createnonecarvas" id="?pCW#uJ11d3}wSk{%rmS">
+                    <field name="varitem">canvas</field>
+                    <value name="wh">
+                      <block type="lcd_set_width_height" id="vvKHF:fR{gFT7l=@7xQ2">
+                        <value name="WIDTH">
+                          <shadow type="math_number" id="6?EA/%GT?SXo.-)Kv59g">
+                            <field name="NUM">320</field>
+                          </shadow>
+                        </value>
+                        <value name="HEIGHT">
+                          <shadow type="math_number" id=";vT9xZA;d:[ZNyh/:h|;">
+                            <field name="NUM">240</field>
+                          </shadow>
+                        </value>
+                      </block>
+                    </value>
                     <next>
-                      <block type="controls_repeat_forever" id="R[Mo.Z$xl!maNC-!#aD4">
-                        <statement name="DO">
-                          <block type="time_delayseconds" id="0W+X]yFf,:oC/E(4fE;/">
-                            <value name="DELAY_TIME_MICRO">
-                              <block type="math_number" id="B=7)H:?fKgq^4~UV8eyI">
-                                <field name="NUM">1</field>
-                              </block>
-                            </value>
-                            <next>
-                              <block type="ai_lcd_clearcanvas" id="gK{`a}NV~8RaD!}ECYqz">
-                                <field name="varitem">canvas</field>
+                      <block type="esp32_main_controller_wifi_ntptime" id="f?TdIfH1V^h*F;*hW`yZ">
+                        <next>
+                          <block type="controls_repeat_forever" id="R[Mo.Z$xl!maNC-!#aD4">
+                            <statement name="DO">
+                              <block type="time_delayseconds" id="0W+X]yFf,:oC/E(4fE;/">
+                                <value name="DELAY_TIME_MICRO">
+                                  <block type="math_number" id="B=7)H:?fKgq^4~UV8eyI">
+                                    <field name="NUM">1</field>
+                                  </block>
+                                </value>
                                 <next>
-                                  <block type="ai_lcd_textcarvas" id="@(LE|06%tHOJ5#9XcBXz">
+                                  <block type="ai_lcd_clearcanvas" id="gK{`a}NV~8RaD!}ECYqz">
                                     <field name="varitem">canvas</field>
-                                    <value name="POSA">
-                                      <block type="lcd_set_position" id="7J4QW)^RZ*bW^vo4{EGb">
-                                        <value name="POSX">
-                                          <shadow type="math_number" id="JRA[MJ-wuL*@p~gC|KB!">
-                                            <field name="NUM">0</field>
-                                          </shadow>
-                                        </value>
-                                        <value name="POSY">
-                                          <shadow type="math_number" id="%za`}nbZd9+udTog/Xn^">
-                                            <field name="NUM">0</field>
-                                          </shadow>
-                                        </value>
-                                      </block>
-                                    </value>
-                                    <value name="CONTENT">
-                                      <shadow type="text" id="92oXJ*zl^VCkT,WU6!Zn">
-                                        <field name="TEXT"></field>
-                                      </shadow>
-                                      <block type="text_append_text" id="g6AlhA2ZBxl`:qH$6P|o">
-                                        <value name="text_abc">
-                                          <shadow type="text" id="XVp]F4t;vWc(JQ,8-^8d">
-                                            <field name="TEXT">当前时间:</field>
-                                          </shadow>
+                                    <next>
+                                      <block type="ai_lcd_textcarvas" id="@(LE|06%tHOJ5#9XcBXz">
+                                        <field name="varitem">canvas</field>
+                                        <value name="POSA">
+                                          <block type="lcd_set_position" id="7J4QW)^RZ*bW^vo4{EGb">
+                                            <value name="POSX">
+                                              <shadow type="math_number" id="JRA[MJ-wuL*@p~gC|KB!">
+                                                <field name="NUM">0</field>
+                                              </shadow>
+                                            </value>
+                                            <value name="POSY">
+                                              <shadow type="math_number" id="%za`}nbZd9+udTog/Xn^">
+                                                <field name="NUM">40</field>
+                                              </shadow>
+                                            </value>
+                                          </block>
                                         </value>
-                                        <value name="append_text">
-                                          <shadow type="text" id="wNgrH]-:uFCNk}+=*y}T">
-                                            <field name="TEXT">def</field>
+                                        <value name="CONTENT">
+                                          <shadow type="text" id="92oXJ*zl^VCkT,WU6!Zn">
+                                            <field name="TEXT"></field>
                                           </shadow>
                                           <block type="text_join" id="K:Sn@[?PMy7hE/{JTrgW">
-                                            <mutation items="11"></mutation>
+                                            <mutation items="5"></mutation>
                                             <value name="ADD0">
                                               <block type="esp32_get_current_date" id="6Y^HX8{5tV%+_;9%L9d^">
                                                 <field name="type">Y</field>
@@ -113,61 +106,93 @@
                                                 <field name="type">d</field>
                                               </block>
                                             </value>
-                                            <value name="ADD5">
-                                              <block type="text" id="s)lEx@6P8x}-RRYxG(H1">
-                                                <field name="TEXT"> </field>
-                                              </block>
-                                            </value>
-                                            <value name="ADD6">
-                                              <block type="esp32_get_current_date" id="IN(O%!fQ~Jhw|Xlae?ZD">
-                                                <field name="type">H</field>
+                                          </block>
+                                        </value>
+                                        <value name="COLOR">
+                                          <block type="lcd_set_color" id="~:E1agy8kK*]c/L~.g!m">
+                                            <field name="COLOR">#ffffff</field>
+                                          </block>
+                                        </value>
+                                        <value name="Scale">
+                                          <shadow type="math_number" id="8qut0q3OKh?u@byO^f,:">
+                                            <field name="NUM">4.5</field>
+                                          </shadow>
+                                        </value>
+                                        <next>
+                                          <block type="ai_lcd_textcarvas" id="c2,!BeW;a)tMS1(!ZFWQ">
+                                            <field name="varitem">canvas</field>
+                                            <value name="POSA">
+                                              <block type="lcd_set_position" id="CjJVf-!Q_ry/G_(U@ofw">
+                                                <value name="POSX">
+                                                  <shadow type="math_number" id="nY5HS?WG2LJ*rS:Q48F.">
+                                                    <field name="NUM">0</field>
+                                                  </shadow>
+                                                </value>
+                                                <value name="POSY">
+                                                  <shadow type="math_number" id="}Ai?c3G-a;[-+Ft)MY%c">
+                                                    <field name="NUM">120</field>
+                                                  </shadow>
+                                                </value>
                                               </block>
                                             </value>
-                                            <value name="ADD7">
-                                              <block type="text" id="%W`uUe,6gl}]=XCJ$,J3">
-                                                <field name="TEXT">:</field>
+                                            <value name="CONTENT">
+                                              <shadow type="text" id="92oXJ*zl^VCkT,WU6!Zn">
+                                                <field name="TEXT"></field>
+                                              </shadow>
+                                              <block type="text_join" id="+uw@-2!+O~4GqF5yp^t$">
+                                                <mutation items="5"></mutation>
+                                                <value name="ADD0">
+                                                  <block type="esp32_get_current_date" id="g1Z4[7.FXt=f`K;MUUFq">
+                                                    <field name="type">H</field>
+                                                  </block>
+                                                </value>
+                                                <value name="ADD1">
+                                                  <block type="text" id="eH`M^lM%zuInNOODd0aG">
+                                                    <field name="TEXT">:</field>
+                                                  </block>
+                                                </value>
+                                                <value name="ADD2">
+                                                  <block type="esp32_get_current_date" id="fiwftX:Y^*VRB)cDv$BR">
+                                                    <field name="type">M</field>
+                                                  </block>
+                                                </value>
+                                                <value name="ADD3">
+                                                  <block type="text" id="3Ty$[*emW-mbwgML5|tB">
+                                                    <field name="TEXT">:</field>
+                                                  </block>
+                                                </value>
+                                                <value name="ADD4">
+                                                  <block type="esp32_get_current_date" id="7l(Q-P/l2J/M]tREC9Qa">
+                                                    <field name="type">S</field>
+                                                  </block>
+                                                </value>
                                               </block>
                                             </value>
-                                            <value name="ADD8">
-                                              <block type="esp32_get_current_date" id=",kMsRo7%h;l-)7T3*x@G">
-                                                <field name="type">M</field>
+                                            <value name="COLOR">
+                                              <block type="lcd_set_color" id="!{_1,=rx-)`de9I7~5if">
+                                                <field name="COLOR">#ffffff</field>
                                               </block>
                                             </value>
-                                            <value name="ADD9">
-                                              <block type="text" id="$[mW/N9??cM-jpc4f3|!">
-                                                <field name="TEXT">:</field>
-                                              </block>
+                                            <value name="Scale">
+                                              <shadow type="math_number" id="$gP.%T/BZi!4k.w{;NY:">
+                                                <field name="NUM">4.5</field>
+                                              </shadow>
                                             </value>
-                                            <value name="ADD10">
-                                              <block type="esp32_get_current_date" id="KN{GfxV:Avd4h@YDDR|e">
-                                                <field name="type">S</field>
+                                            <next>
+                                              <block type="ai_lcd_showcarvas_set_display" id="Q0jagp6}zk!l.(zgD@cP">
+                                                <field name="varitem">canvas</field>
                                               </block>
-                                            </value>
+                                            </next>
                                           </block>
-                                        </value>
-                                      </block>
-                                    </value>
-                                    <value name="COLOR">
-                                      <block type="lcd_set_color" id="~:E1agy8kK*]c/L~.g!m">
-                                        <field name="COLOR">#ffffff</field>
-                                      </block>
-                                    </value>
-                                    <value name="Scale">
-                                      <shadow type="math_number" id="8qut0q3OKh?u@byO^f,:">
-                                        <field name="NUM">1</field>
-                                      </shadow>
-                                    </value>
-                                    <next>
-                                      <block type="ai_lcd_showcarvas_set_display" id="Q0jagp6}zk!l.(zgD@cP">
-                                        <field name="varitem">canvas</field>
+                                        </next>
                                       </block>
                                     </next>
                                   </block>
                                 </next>
                               </block>
-                            </next>
+                            </statement>
                           </block>
-                        </statement>
+                        </next>
                       </block>
                     </next>
                   </block>

+ 110 - 105
src/renderer/cocoblockly-x/src/python/web/获取网络天气.xml

@@ -1,13 +1,13 @@
 <xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
-  <block type="esp32_main_controller_wifi_connect_internet" id="oZm{x|0Fnl3)]gzzCk*g" x="385" y="-169">
+  <block type="esp32_main_controller_wifi_connect_internet" id="}YF_#KIgowo$6;:yZJYq" x="8" y="208">
     <value name="ssid">
-      <shadow type="text" id="JofMeII{2f2P)R]f~Tf$">
-        <field name="TEXT">ENTER_YOUR_SSID</field>
+      <shadow type="text" id="D(K)Rw?SYse}O+p8ofDM">
+        <field name="TEXT">CocoRobo_SZ</field>
       </shadow>
     </value>
     <value name="password">
-      <shadow type="text" id="{=7$taQtCltCN23Zr0Ij">
-        <field name="TEXT">ENTER_YOUR_PASSWORD</field>
+      <shadow type="text" id="VcE@G~APC+v0mPv}97qY">
+        <field name="TEXT">cocorobo2019</field>
       </shadow>
     </value>
     <next>
@@ -17,114 +17,64 @@
           <block type="esp32_main_controller_get_wifi_connection_status" id="V%X54C6(sQ`Fm6Iu7,Hm"></block>
         </value>
         <statement name="DO">
-          <block type="ai_v831_led_light_up" id="hE6;nken5?9auZ[VG?c6">
+          <block type="ai_v831_led_light_off" id="@4/E=b(`XJ{qHozB?]GB">
             <field name="type">blue</field>
           </block>
         </statement>
         <next>
-          <block type="ai_lcd_screeninit" id="7k$y]W0*Dr|+fZ#zqghY">
-            <field name="isScreen">False</field>
+          <block type="ai_v831_led_light_up" id="hE6;nken5?9auZ[VG?c6">
+            <field name="type">blue</field>
             <next>
-              <block type="ai_lcd_createnonecarvas" id="YQ%5QW.QXngI`^^PDqyX">
-                <field name="varitem">canvas</field>
-                <value name="wh">
-                  <block type="lcd_set_width_height" id="BGl/MyG}]+CT#ypo%eh}">
-                    <value name="WIDTH">
-                      <shadow type="math_number" id="222+#@V5k(;m,S@Uoiv_">
-                        <field name="NUM">320</field>
-                      </shadow>
-                    </value>
-                    <value name="HEIGHT">
-                      <shadow type="math_number" id="f-WB+jg~EUOcg]$h}]Gc">
-                        <field name="NUM">240</field>
-                      </shadow>
-                    </value>
-                  </block>
-                </value>
+              <block type="ai_lcd_screeninit" id="7k$y]W0*Dr|+fZ#zqghY">
+                <field name="isScreen">False</field>
                 <next>
-                  <block type="v831_get_weather_init" id="Jc3xJr=S0$jUao_YH/d+">
-                    <next>
-                      <block type="variables_set" id="W$IvdR{%Y_4?b6tW4]|j">
-                        <field name="VAR">weather_all</field>
-                        <value name="VALUE">
-                          <shadow type="math_number" id="rj$%Mfh8k|Zq/@Y/O,]x">
-                            <field name="NUM">0</field>
+                  <block type="ai_lcd_createnonecarvas" id="YQ%5QW.QXngI`^^PDqyX">
+                    <field name="varitem">canvas</field>
+                    <value name="wh">
+                      <block type="lcd_set_width_height" id="BGl/MyG}]+CT#ypo%eh}">
+                        <value name="WIDTH">
+                          <shadow type="math_number" id="222+#@V5k(;m,S@Uoiv_">
+                            <field name="NUM">320</field>
+                          </shadow>
+                        </value>
+                        <value name="HEIGHT">
+                          <shadow type="math_number" id="f-WB+jg~EUOcg]$h}]Gc">
+                            <field name="NUM">240</field>
                           </shadow>
-                          <block type="v831_set_city_and_time" id="tHmK0|8,ZFX@]9aNi.*z">
-                            <field name="get_city">101280601</field>
-                          </block>
                         </value>
+                      </block>
+                    </value>
+                    <next>
+                      <block type="v831_get_weather_init" id="Jc3xJr=S0$jUao_YH/d+">
                         <next>
-                          <block type="controls_repeat_forever" id="%HEC{NvOqSRZd;)3H;$|">
-                            <statement name="DO">
-                              <block type="ai_lcd_clearcanvas" id="AI/.rvq@v8ji]}bB*M,T">
-                                <field name="varitem">canvas</field>
-                                <next>
-                                  <block type="ai_lcd_textcarvas" id="vo0oXI*u$X}r_jqbcerf">
+                          <block type="variables_set" id="W$IvdR{%Y_4?b6tW4]|j">
+                            <field name="VAR">weather_all</field>
+                            <value name="VALUE">
+                              <shadow type="math_number" id="rj$%Mfh8k|Zq/@Y/O,]x">
+                                <field name="NUM">0</field>
+                              </shadow>
+                              <block type="v831_set_city_and_time" id="tHmK0|8,ZFX@]9aNi.*z">
+                                <field name="get_city">101280601</field>
+                              </block>
+                            </value>
+                            <next>
+                              <block type="controls_repeat_forever" id="%HEC{NvOqSRZd;)3H;$|">
+                                <statement name="DO">
+                                  <block type="ai_lcd_clearcanvas" id="AI/.rvq@v8ji]}bB*M,T">
                                     <field name="varitem">canvas</field>
-                                    <value name="POSA">
-                                      <block type="lcd_set_position" id=".=h^x#={wJEZC6!zy%^|">
-                                        <value name="POSX">
-                                          <shadow type="math_number" id="hbmR4!7KL$IV)*uWwixy">
-                                            <field name="NUM">0</field>
-                                          </shadow>
-                                        </value>
-                                        <value name="POSY">
-                                          <shadow type="math_number" id="7iH~,m-JWt9o-C}gdJ3w">
-                                            <field name="NUM">0</field>
-                                          </shadow>
-                                        </value>
-                                      </block>
-                                    </value>
-                                    <value name="CONTENT">
-                                      <shadow type="text" id="L(3kvLo|uZSx%wKfdfCL">
-                                        <field name="TEXT"></field>
-                                      </shadow>
-                                      <block type="text_join" id="RR(=8u7V$54,ucb?e[sg">
-                                        <mutation items="1"></mutation>
-                                        <value name="ADD0">
-                                          <block type="list_order_item" id="4SoTt(tfOUF~j51E0,/Z">
-                                            <field name="list_order">[</field>
-                                            <value name="list_name">
-                                              <shadow type="text_list" id="h`GtmEB,bM@gO3`yWczu">
-                                                <field name="TEXT"></field>
-                                              </shadow>
-                                              <block type="variables_get" id="X?*qGzOcdx_lL9EM12Gb">
-                                                <field name="VAR">weather_all</field>
-                                              </block>
-                                            </value>
-                                            <value name="list_order_item">
-                                              <shadow type="math_number" id="/W~V8K4j%TWTofEUW.!D">
-                                                <field name="NUM">0</field>
-                                              </shadow>
-                                            </value>
-                                          </block>
-                                        </value>
-                                      </block>
-                                    </value>
-                                    <value name="COLOR">
-                                      <block type="lcd_set_color" id="RZ0]PI,/RQ~ZlpDp[I=h">
-                                        <field name="COLOR">#ffffff</field>
-                                      </block>
-                                    </value>
-                                    <value name="Scale">
-                                      <shadow type="math_number" id="EIk5lqm[eg/cS393B(s2">
-                                        <field name="NUM">1</field>
-                                      </shadow>
-                                    </value>
                                     <next>
-                                      <block type="ai_lcd_textcarvas" id="v,4/JF3oEq[x1lK`9N{R">
+                                      <block type="ai_lcd_textcarvas" id="vo0oXI*u$X}r_jqbcerf">
                                         <field name="varitem">canvas</field>
                                         <value name="POSA">
-                                          <block type="lcd_set_position" id=",K4+IUkz;-F//d4n1Xtk">
+                                          <block type="lcd_set_position" id=".=h^x#={wJEZC6!zy%^|">
                                             <value name="POSX">
-                                              <shadow type="math_number" id=":jj8YrDi@P9qNh^~-jox">
+                                              <shadow type="math_number" id="hbmR4!7KL$IV)*uWwixy">
                                                 <field name="NUM">0</field>
                                               </shadow>
                                             </value>
                                             <value name="POSY">
-                                              <shadow type="math_number" id="2v{v!g~#QC`+ZmRHCZ8i">
-                                                <field name="NUM">30</field>
+                                              <shadow type="math_number" id="7iH~,m-JWt9o-C}gdJ3w">
+                                                <field name="NUM">0</field>
                                               </shadow>
                                             </value>
                                           </block>
@@ -133,22 +83,22 @@
                                           <shadow type="text" id="L(3kvLo|uZSx%wKfdfCL">
                                             <field name="TEXT"></field>
                                           </shadow>
-                                          <block type="text_join" id="IaErl/c$j?41z}ZODh7%">
+                                          <block type="text_join" id="RR(=8u7V$54,ucb?e[sg">
                                             <mutation items="1"></mutation>
                                             <value name="ADD0">
-                                              <block type="list_order_item" id="L_;n$vx)#4$@!n7Ch-Jh">
+                                              <block type="list_order_item" id="4SoTt(tfOUF~j51E0,/Z">
                                                 <field name="list_order">[</field>
                                                 <value name="list_name">
                                                   <shadow type="text_list" id="h`GtmEB,bM@gO3`yWczu">
                                                     <field name="TEXT"></field>
                                                   </shadow>
-                                                  <block type="variables_get" id="8,M+tbmhFTyV,T]/@EW(">
+                                                  <block type="variables_get" id="X?*qGzOcdx_lL9EM12Gb">
                                                     <field name="VAR">weather_all</field>
                                                   </block>
                                                 </value>
                                                 <value name="list_order_item">
-                                                  <shadow type="math_number" id="X@h!x5E}o?3C|u.2nHm$">
-                                                    <field name="NUM">1</field>
+                                                  <shadow type="math_number" id="/W~V8K4j%TWTofEUW.!D">
+                                                    <field name="NUM">0</field>
                                                   </shadow>
                                                 </value>
                                               </block>
@@ -156,26 +106,81 @@
                                           </block>
                                         </value>
                                         <value name="COLOR">
-                                          <block type="lcd_set_color" id="UvrMzGh:ow!g|UwJ/~[u">
+                                          <block type="lcd_set_color" id="RZ0]PI,/RQ~ZlpDp[I=h">
                                             <field name="COLOR">#ffffff</field>
                                           </block>
                                         </value>
                                         <value name="Scale">
-                                          <shadow type="math_number" id="Q$:Uw0!(+yhPDX{0z^^Y">
+                                          <shadow type="math_number" id="EIk5lqm[eg/cS393B(s2">
                                             <field name="NUM">1</field>
                                           </shadow>
                                         </value>
                                         <next>
-                                          <block type="ai_lcd_showcarvas_set_display" id="qf36:S0:}Qx8,:IjV8r)">
+                                          <block type="ai_lcd_textcarvas" id="v,4/JF3oEq[x1lK`9N{R">
                                             <field name="varitem">canvas</field>
+                                            <value name="POSA">
+                                              <block type="lcd_set_position" id=",K4+IUkz;-F//d4n1Xtk">
+                                                <value name="POSX">
+                                                  <shadow type="math_number" id=":jj8YrDi@P9qNh^~-jox">
+                                                    <field name="NUM">0</field>
+                                                  </shadow>
+                                                </value>
+                                                <value name="POSY">
+                                                  <shadow type="math_number" id="2v{v!g~#QC`+ZmRHCZ8i">
+                                                    <field name="NUM">30</field>
+                                                  </shadow>
+                                                </value>
+                                              </block>
+                                            </value>
+                                            <value name="CONTENT">
+                                              <shadow type="text" id="L(3kvLo|uZSx%wKfdfCL">
+                                                <field name="TEXT"></field>
+                                              </shadow>
+                                              <block type="text_join" id="IaErl/c$j?41z}ZODh7%">
+                                                <mutation items="1"></mutation>
+                                                <value name="ADD0">
+                                                  <block type="list_order_item" id="L_;n$vx)#4$@!n7Ch-Jh">
+                                                    <field name="list_order">[</field>
+                                                    <value name="list_name">
+                                                      <shadow type="text_list" id="h`GtmEB,bM@gO3`yWczu">
+                                                        <field name="TEXT"></field>
+                                                      </shadow>
+                                                      <block type="variables_get" id="8,M+tbmhFTyV,T]/@EW(">
+                                                        <field name="VAR">weather_all</field>
+                                                      </block>
+                                                    </value>
+                                                    <value name="list_order_item">
+                                                      <shadow type="math_number" id="X@h!x5E}o?3C|u.2nHm$">
+                                                        <field name="NUM">1</field>
+                                                      </shadow>
+                                                    </value>
+                                                  </block>
+                                                </value>
+                                              </block>
+                                            </value>
+                                            <value name="COLOR">
+                                              <block type="lcd_set_color" id="UvrMzGh:ow!g|UwJ/~[u">
+                                                <field name="COLOR">#ffffff</field>
+                                              </block>
+                                            </value>
+                                            <value name="Scale">
+                                              <shadow type="math_number" id="Q$:Uw0!(+yhPDX{0z^^Y">
+                                                <field name="NUM">1</field>
+                                              </shadow>
+                                            </value>
+                                            <next>
+                                              <block type="ai_lcd_showcarvas_set_display" id="qf36:S0:}Qx8,:IjV8r)">
+                                                <field name="varitem">canvas</field>
+                                              </block>
+                                            </next>
                                           </block>
                                         </next>
                                       </block>
                                     </next>
                                   </block>
-                                </next>
+                                </statement>
                               </block>
-                            </statement>
+                            </next>
                           </block>
                         </next>
                       </block>

+ 14 - 40
src/renderer/cocoblockly-x/src/python/串口/uart_receive.xml

@@ -1,55 +1,29 @@
 <xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
-  <block type="serial_read_data_setup" id="@AM1E~W93M+VKLW}A/-Z" x="114" y="-24">
-    <field name="uart_bps">9600</field>
+  <block type="serial_read_data_setup" id="c{coC}A8xaT2,9%V/oN7" x="-156" y="26">
+    <field name="uart_bps">115200</field>
     <next>
-      <block type="controls_repeat_forever" id="s#W|;B1dknjHxuyF^X6%">
+      <block type="controls_repeat_forever" id="f6DnnY5|#fkEx-jsU%vE">
         <statement name="DO">
-          <block type="CocoRobo_try_except" id="sfUAt6Lp-0F}8B:Owqeo">
+          <block type="CocoRobo_try_except" id="S)dfN|Kd^[v]G~}^/%KI">
             <statement name="TRY">
-              <block type="serial_read_data_all" id="-xEm20%{t~yI6S-NqWlx">
-                <field name="TYPE">serial_data</field>
-              </block>
-            </statement>
-            <next>
-              <block type="controls_if" id="#kc`(NaYU~n^C-ifcQL:">
-                <value name="IF0">
-                  <block type="logic_compare" id=".,jh;TJt=;n1B3UUdUnj">
-                    <field name="OP">NEQ</field>
-                    <value name="A">
-                      <block type="variables_get" id=";6;OZ(yi!8U}^:iqKwN}">
-                        <field name="VAR">serial_data</field>
-                      </block>
-                    </value>
-                    <value name="B">
-                      <block type="logic_null" id="tHh#rvP*,4Anz.XeopT%"></block>
-                    </value>
+              <block type="time_delay" id="Lf:2;1k-RNpMwO!}13q,">
+                <value name="DELAY_TIME_MILI">
+                  <block type="math_number" id="?m0%?e}xe0/b]F/CM3vY">
+                    <field name="NUM">1000</field>
                   </block>
                 </value>
-                <statement name="DO0">
-                  <block type="serial_comm_print" id="cYT4f,A/8|}_lkgTZ[Xc">
+                <next>
+                  <block type="serial_comm_print" id="ubZj@7kB(^4a)4;4[t7,">
                     <value name="serial_comm_input">
-                      <shadow type="text" id="/;T:yC2)Zr,dQw]uh$=R">
+                      <shadow type="text" id="weF)y.yQ,/)W]6d1+h|=">
                         <field name="TEXT">Hello World!</field>
                       </shadow>
-                      <block type="variables_get" id="aw:$cM*H+3O)wCo3%$g#">
-                        <field name="VAR">serial_data</field>
-                      </block>
+                      <block type="serial_read_data_all" id="=d;#pH%wa+Y_tasp-Tj-"></block>
                     </value>
-                    <next>
-                      <block type="variables_set" id="zD%A?FM*bPU1CDa^t/?C">
-                        <field name="VAR">serial_data</field>
-                        <value name="VALUE">
-                          <shadow type="math_number" id="}$r%w6mU#$|OYFz[?}_5">
-                            <field name="NUM">0</field>
-                          </shadow>
-                          <block type="logic_null" id="5)fK/.7;Jblg~G9c-~u2"></block>
-                        </value>
-                      </block>
-                    </next>
                   </block>
-                </statement>
+                </next>
               </block>
-            </next>
+            </statement>
           </block>
         </statement>
       </block>

+ 172 - 0
src/renderer/cocoblockly-x/src/python/图像处理/二维码识别.xml

@@ -0,0 +1,172 @@
+<xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
+  <block type="ai_camera_init" id="?UBfXqNx`~}$,@7bLaJq" x="39" y="3">
+    <next>
+      <block type="ai_lcd_screeninit" id="O^h{|IkO1v~X8`x5Mw9*">
+        <field name="isScreen">False</field>
+        <next>
+          <block type="ai_lcd_createnonecarvas" id=",`J?vXg;/K|O6K]:^H3Y">
+            <field name="varitem">canvas</field>
+            <value name="wh">
+              <block type="lcd_set_width_height" id="p7#%;AeG*oY{s/{@f?*j">
+                <value name="WIDTH">
+                  <shadow type="math_number" id="b@wb@qN~[q,d8d#(fThH">
+                    <field name="NUM">320</field>
+                  </shadow>
+                </value>
+                <value name="HEIGHT">
+                  <shadow type="math_number" id="7T=LO(ddQlYmFK8%F0r|">
+                    <field name="NUM">240</field>
+                  </shadow>
+                </value>
+              </block>
+            </value>
+            <next>
+              <block type="controls_repeat_forever" id="RXrT=-eQ2pG$e|yM,2{[">
+                <statement name="DO">
+                  <block type="variables_set" id=")-P2M_M#jM)IY00fSi0R">
+                    <field name="VAR">canvas</field>
+                    <value name="VALUE">
+                      <shadow type="math_number" id="ymMA[a~?0W9-vqU[`H3_">
+                        <field name="NUM">0</field>
+                      </shadow>
+                      <block type="ai_camera_snapshot" id="TKV`q8X3)%#|ejH7lD-)"></block>
+                    </value>
+                    <next>
+                      <block type="variables_set" id="eyGx^`M!x~.HB|5zo..V">
+                        <field name="VAR">qrCode</field>
+                        <value name="VALUE">
+                          <shadow type="math_number" id="ymMA[a~?0W9-vqU[`H3_">
+                            <field name="NUM">0</field>
+                          </shadow>
+                          <block type="ai_vision_find_qrcode" id="[0l4o(F^C{#FS=|Mq6c9">
+                            <field name="varitem">canvas</field>
+                          </block>
+                        </value>
+                        <next>
+                          <block type="controls_forEach" id="#g)91]#X7hFEEobXENtK">
+                            <field name="VAR">i</field>
+                            <value name="LIST">
+                              <block type="variables_get" id="TH:1cSR].Weoq7x`xV3X">
+                                <field name="VAR">qrCode</field>
+                              </block>
+                            </value>
+                            <statement name="DO">
+                              <block type="ai_lcd_textcarvas" id="j8#FYkDSm83QN@aBQRag">
+                                <field name="varitem">canvas</field>
+                                <value name="POSA">
+                                  <block type="lcd_set_position" id=",u,62:*G]6iBGaK3uZ/3">
+                                    <value name="POSX">
+                                      <shadow type="math_number" id=":{s,U4pDy7MmNdkzh[db">
+                                        <field name="NUM">0</field>
+                                      </shadow>
+                                      <block type="ai_vision_qrcode_get_info" id="dF5{bHk]e)0w_E)_1%V$">
+                                        <field name="varitem">i</field>
+                                        <field name="get_info">x</field>
+                                      </block>
+                                    </value>
+                                    <value name="POSY">
+                                      <shadow type="math_number" id="{4h;Hl}{5HM,4vA;q#K#">
+                                        <field name="NUM">0</field>
+                                      </shadow>
+                                      <block type="ai_vision_qrcode_get_info" id="5tIYh9L3iHm5D*|yW@3}">
+                                        <field name="varitem">i</field>
+                                        <field name="get_info">y</field>
+                                      </block>
+                                    </value>
+                                  </block>
+                                </value>
+                                <value name="CONTENT">
+                                  <shadow type="text" id="!4*_1/3)tAg3ygOM.|YW">
+                                    <field name="TEXT"></field>
+                                  </shadow>
+                                  <block type="ai_vision_qrcode_get_info" id="P5JRf^Xu6cdZSf-epZZd">
+                                    <field name="varitem">i</field>
+                                    <field name="get_info">payload</field>
+                                  </block>
+                                </value>
+                                <value name="COLOR">
+                                  <block type="lcd_set_color" id="k9L/2JvE7|(Xl@0^8)x[">
+                                    <field name="COLOR">#ff0000</field>
+                                  </block>
+                                </value>
+                                <value name="Scale">
+                                  <shadow type="math_number" id="[}E0F%^LWN[,3~[+`W$)">
+                                    <field name="NUM">1</field>
+                                  </shadow>
+                                </value>
+                                <next>
+                                  <block type="ai_lcd_ractanglecarvas" id="9[ZCway)bL?f7?k8DiZ{">
+                                    <field name="varitem">canvas</field>
+                                    <field name="rect_type">rect</field>
+                                    <value name="POSA">
+                                      <block type="lcd_set_position" id="Dh=]VynT,e+%c%G%Xz8V">
+                                        <value name="POSX">
+                                          <shadow type="math_number" id=":{s,U4pDy7MmNdkzh[db">
+                                            <field name="NUM">0</field>
+                                          </shadow>
+                                          <block type="ai_vision_qrcode_get_info" id="Y|f%wh/psY!#OS/-$}Js">
+                                            <field name="varitem">i</field>
+                                            <field name="get_info">x</field>
+                                          </block>
+                                        </value>
+                                        <value name="POSY">
+                                          <shadow type="math_number" id="{4h;Hl}{5HM,4vA;q#K#">
+                                            <field name="NUM">0</field>
+                                          </shadow>
+                                          <block type="ai_vision_qrcode_get_info" id="Y?Tu)@*BJuxh4dj8Ny+h">
+                                            <field name="varitem">i</field>
+                                            <field name="get_info">y</field>
+                                          </block>
+                                        </value>
+                                      </block>
+                                    </value>
+                                    <value name="POSB">
+                                      <block type="lcd_set_position" id="E=]{pAH1AIKCL!V^wt1l">
+                                        <value name="POSX">
+                                          <shadow type="math_number" id="|SU,asdH!M,;!d$BFm`9">
+                                            <field name="NUM">0</field>
+                                          </shadow>
+                                          <block type="ai_vision_qrcode_get_info" id="](=E5ZDC|%`Of|~Ctcn2">
+                                            <field name="varitem">i</field>
+                                            <field name="get_info">w</field>
+                                          </block>
+                                        </value>
+                                        <value name="POSY">
+                                          <shadow type="math_number" id="bZ_=tnxG?fq/7@s`%pP[">
+                                            <field name="NUM">0</field>
+                                          </shadow>
+                                          <block type="ai_vision_qrcode_get_info" id="-WR*n7l?d!DyPbQT-1D0">
+                                            <field name="varitem">i</field>
+                                            <field name="get_info">h</field>
+                                          </block>
+                                        </value>
+                                      </block>
+                                    </value>
+                                    <value name="COLOR">
+                                      <block type="lcd_set_color" id="SsRs]cuNLHn7QlLnO!mY">
+                                        <field name="COLOR">#ff0000</field>
+                                      </block>
+                                    </value>
+                                  </block>
+                                </next>
+                              </block>
+                            </statement>
+                            <next>
+                              <block type="ai_lcd_showcarvas_set_display" id="6Af3VHIh=JOf)iZ::m$=">
+                                <field name="varitem">canvas</field>
+                              </block>
+                            </next>
+                          </block>
+                        </next>
+                      </block>
+                    </next>
+                  </block>
+                </statement>
+              </block>
+            </next>
+          </block>
+        </next>
+      </block>
+    </next>
+  </block>
+</xml>

+ 182 - 0
src/renderer/cocoblockly-x/src/python/图像处理/寻找红色并追踪.xml

@@ -0,0 +1,182 @@
+<xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
+  <block type="ai_camera_init" id="fpiu`mXy+VPRp$%_?nh?" x="646" y="-94">
+    <next>
+      <block type="ai_lcd_screeninit" id="]IKTZ4N3-$bt`);0,_Of">
+        <field name="isScreen">False</field>
+        <next>
+          <block type="ai_lcd_createnonecarvas" id="mWuq+N++8K;29BsL1n.q">
+            <field name="varitem">canvas</field>
+            <value name="wh">
+              <block type="lcd_set_width_height" id=":V~.)L|faiwTF:r3XOHS">
+                <value name="WIDTH">
+                  <shadow type="math_number" id="(ECu+*AY#UwUJ[Zd8.@1">
+                    <field name="NUM">320</field>
+                  </shadow>
+                </value>
+                <value name="HEIGHT">
+                  <shadow type="math_number" id="nN~,15+W01b5yU+y+~fL">
+                    <field name="NUM">240</field>
+                  </shadow>
+                </value>
+              </block>
+            </value>
+            <next>
+              <block type="CocoRobo_return_list" id="P`(OGxj{C.hgN3(D$c3F">
+                <value name="list_name">
+                  <block type="variables_get" id="J!NFjNYk_1+ee,/xVTel">
+                    <field name="VAR">my_list</field>
+                  </block>
+                </value>
+                <value name="list_items">
+                  <shadow type="text_list" id="|_!BmX6|dd}{cqQydWkR">
+                    <field name="TEXT">(0, 46, 22, 61, -45, 74)</field>
+                  </shadow>
+                </value>
+                <next>
+                  <block type="controls_repeat_forever" id="PG.b9?agjAbFGi)W$h8Q">
+                    <statement name="DO">
+                      <block type="variables_set" id="U[qT/|r8}7``,N`vk6?J">
+                        <field name="VAR">canvas</field>
+                        <value name="VALUE">
+                          <shadow type="math_number" id="%CW!*Owz+{eafwR7.CU_">
+                            <field name="NUM">0</field>
+                          </shadow>
+                          <block type="ai_camera_snapshot" id="-JAPBQuzh[!ohjs10zcD"></block>
+                        </value>
+                        <next>
+                          <block type="variables_set" id="Be6jL@[${6n^r-+UBgTH">
+                            <field name="VAR">lane_trackingline</field>
+                            <value name="VALUE">
+                              <shadow type="math_number" id="MK*,d~E#uM99E`Ns.R[+">
+                                <field name="NUM">0</field>
+                              </shadow>
+                              <block type="ai_vision_find_lines" id="L,`DvE]*E{k|(@*N0UuU">
+                                <field name="varitem">canvas</field>
+                                <value name="color">
+                                  <block type="variables_get" id="WOfho],O:s?[BGl~b[++">
+                                    <field name="VAR">my_list</field>
+                                  </block>
+                                </value>
+                                <value name="xy">
+                                  <block type="ai_lcd_XY_vision" id="qp`6Ag}S(o^Na-9Jys2[">
+                                    <value name="A">
+                                      <shadow type="math_number" id=":qwlhg/wIfpQa(Rw$69n">
+                                        <field name="NUM">0</field>
+                                      </shadow>
+                                    </value>
+                                    <value name="B">
+                                      <shadow type="math_number" id="TaS=ObGC*%iTDauv+H#/">
+                                        <field name="NUM">0</field>
+                                      </shadow>
+                                    </value>
+                                  </block>
+                                </value>
+                                <value name="wh">
+                                  <block type="ai_lcd_WH_vision" id="W#Q4.3R4CODi?k~Ss$lG">
+                                    <value name="A">
+                                      <shadow type="math_number" id="sfLV)y[gG^^-Mu$yWxB@">
+                                        <field name="NUM">320</field>
+                                      </shadow>
+                                    </value>
+                                    <value name="B">
+                                      <shadow type="math_number" id="aW[D}k?%fDYg[~Izr8#J">
+                                        <field name="NUM">240</field>
+                                      </shadow>
+                                    </value>
+                                  </block>
+                                </value>
+                              </block>
+                            </value>
+                            <next>
+                              <block type="controls_if" id="lq$n#IfH1/4pvWv-wL-,">
+                                <value name="IF0">
+                                  <block type="variables_get" id="ehLTH8xuzAOt}]va=.IX">
+                                    <field name="VAR">lane_trackingline</field>
+                                  </block>
+                                </value>
+                                <statement name="DO0">
+                                  <block type="controls_forEach" id=":3wy$Xc`Sv32@xSFxBx-">
+                                    <field name="VAR">i</field>
+                                    <value name="LIST">
+                                      <block type="variables_get" id="b=*R+[9wjMM4N,t~6!nJ">
+                                        <field name="VAR">lane_trackingline</field>
+                                      </block>
+                                    </value>
+                                    <statement name="DO">
+                                      <block type="ai_lcd_draw_rectangle" id="eBgtX|r@luiM?GG*%Xn!">
+                                        <field name="varitem">canvas</field>
+                                        <field name="rect_type">rect</field>
+                                        <value name="POSA">
+                                          <block type="lcd_set_position" id="J=o`rve`5M%Id-26ax0_">
+                                            <value name="POSX">
+                                              <shadow type="math_number" id="#hIXYdf]gbH3rz3Ie@4R">
+                                                <field name="NUM">0</field>
+                                              </shadow>
+                                              <block type="ai_vision_get_blobs" id=":BS86o$a1_kmKJ:$!^DY">
+                                                <field name="varitem">i</field>
+                                                <field name="blob_type">x</field>
+                                              </block>
+                                            </value>
+                                            <value name="POSY">
+                                              <shadow type="math_number" id="L{sWd7QkA(G7a^){-;@L">
+                                                <field name="NUM">0</field>
+                                              </shadow>
+                                              <block type="ai_vision_get_blobs" id="/NYSB-IHEQ~VnGCjB^cp">
+                                                <field name="varitem">i</field>
+                                                <field name="blob_type">y</field>
+                                              </block>
+                                            </value>
+                                          </block>
+                                        </value>
+                                        <value name="POSB">
+                                          <block type="lcd_set_width_height" id="YJpfL3[cLT11Ay28C!A)">
+                                            <value name="WIDTH">
+                                              <shadow type="math_number" id="Oahwz7^;Zoh?S7#`}B83">
+                                                <field name="NUM">320</field>
+                                              </shadow>
+                                              <block type="ai_vision_get_blobs" id="|)R?.xxj$C7HQWoumb2!">
+                                                <field name="varitem">i</field>
+                                                <field name="blob_type">w</field>
+                                              </block>
+                                            </value>
+                                            <value name="HEIGHT">
+                                              <shadow type="math_number" id="qg!GHG7SOc8!M[}bgEus">
+                                                <field name="NUM">240</field>
+                                              </shadow>
+                                              <block type="ai_vision_get_blobs" id="kjAzTu6?1%^MUkw?@6zO">
+                                                <field name="varitem">i</field>
+                                                <field name="blob_type">h</field>
+                                              </block>
+                                            </value>
+                                          </block>
+                                        </value>
+                                        <value name="COLOR">
+                                          <block type="lcd_set_color" id="nO8r=r!1Z*kGVe?]XKch">
+                                            <field name="COLOR">#ff0000</field>
+                                          </block>
+                                        </value>
+                                      </block>
+                                    </statement>
+                                  </block>
+                                </statement>
+                                <next>
+                                  <block type="ai_lcd_showcarvas_set_display" id="j*eVEQ!e+ZHeIuY)*{Hk">
+                                    <field name="varitem">canvas</field>
+                                  </block>
+                                </next>
+                              </block>
+                            </next>
+                          </block>
+                        </next>
+                      </block>
+                    </statement>
+                  </block>
+                </next>
+              </block>
+            </next>
+          </block>
+        </next>
+      </block>
+    </next>
+  </block>
+</xml>

+ 182 - 0
src/renderer/cocoblockly-x/src/python/图像处理/寻找绿色并追踪.xml

@@ -0,0 +1,182 @@
+<xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
+  <block type="ai_camera_init" id="fpiu`mXy+VPRp$%_?nh?" x="646" y="-94">
+    <next>
+      <block type="ai_lcd_screeninit" id="]IKTZ4N3-$bt`);0,_Of">
+        <field name="isScreen">False</field>
+        <next>
+          <block type="ai_lcd_createnonecarvas" id="mWuq+N++8K;29BsL1n.q">
+            <field name="varitem">canvas</field>
+            <value name="wh">
+              <block type="lcd_set_width_height" id=":V~.)L|faiwTF:r3XOHS">
+                <value name="WIDTH">
+                  <shadow type="math_number" id="(ECu+*AY#UwUJ[Zd8.@1">
+                    <field name="NUM">320</field>
+                  </shadow>
+                </value>
+                <value name="HEIGHT">
+                  <shadow type="math_number" id="nN~,15+W01b5yU+y+~fL">
+                    <field name="NUM">240</field>
+                  </shadow>
+                </value>
+              </block>
+            </value>
+            <next>
+              <block type="CocoRobo_return_list" id="P`(OGxj{C.hgN3(D$c3F">
+                <value name="list_name">
+                  <block type="variables_get" id="J!NFjNYk_1+ee,/xVTel">
+                    <field name="VAR">my_list</field>
+                  </block>
+                </value>
+                <value name="list_items">
+                  <shadow type="text_list" id="|_!BmX6|dd}{cqQydWkR">
+                    <field name="TEXT">(45, 65, -50, -30, 0, 40)</field>
+                  </shadow>
+                </value>
+                <next>
+                  <block type="controls_repeat_forever" id="PG.b9?agjAbFGi)W$h8Q">
+                    <statement name="DO">
+                      <block type="variables_set" id="U[qT/|r8}7``,N`vk6?J">
+                        <field name="VAR">canvas</field>
+                        <value name="VALUE">
+                          <shadow type="math_number" id="%CW!*Owz+{eafwR7.CU_">
+                            <field name="NUM">0</field>
+                          </shadow>
+                          <block type="ai_camera_snapshot" id="-JAPBQuzh[!ohjs10zcD"></block>
+                        </value>
+                        <next>
+                          <block type="variables_set" id="Be6jL@[${6n^r-+UBgTH">
+                            <field name="VAR">lane_trackingline</field>
+                            <value name="VALUE">
+                              <shadow type="math_number" id="MK*,d~E#uM99E`Ns.R[+">
+                                <field name="NUM">0</field>
+                              </shadow>
+                              <block type="ai_vision_find_lines" id="L,`DvE]*E{k|(@*N0UuU">
+                                <field name="varitem">canvas</field>
+                                <value name="color">
+                                  <block type="variables_get" id="WOfho],O:s?[BGl~b[++">
+                                    <field name="VAR">my_list</field>
+                                  </block>
+                                </value>
+                                <value name="xy">
+                                  <block type="ai_lcd_XY_vision" id="qp`6Ag}S(o^Na-9Jys2[">
+                                    <value name="A">
+                                      <shadow type="math_number" id=":qwlhg/wIfpQa(Rw$69n">
+                                        <field name="NUM">0</field>
+                                      </shadow>
+                                    </value>
+                                    <value name="B">
+                                      <shadow type="math_number" id="TaS=ObGC*%iTDauv+H#/">
+                                        <field name="NUM">0</field>
+                                      </shadow>
+                                    </value>
+                                  </block>
+                                </value>
+                                <value name="wh">
+                                  <block type="ai_lcd_WH_vision" id="W#Q4.3R4CODi?k~Ss$lG">
+                                    <value name="A">
+                                      <shadow type="math_number" id="sfLV)y[gG^^-Mu$yWxB@">
+                                        <field name="NUM">320</field>
+                                      </shadow>
+                                    </value>
+                                    <value name="B">
+                                      <shadow type="math_number" id="aW[D}k?%fDYg[~Izr8#J">
+                                        <field name="NUM">240</field>
+                                      </shadow>
+                                    </value>
+                                  </block>
+                                </value>
+                              </block>
+                            </value>
+                            <next>
+                              <block type="controls_if" id="lq$n#IfH1/4pvWv-wL-,">
+                                <value name="IF0">
+                                  <block type="variables_get" id="ehLTH8xuzAOt}]va=.IX">
+                                    <field name="VAR">lane_trackingline</field>
+                                  </block>
+                                </value>
+                                <statement name="DO0">
+                                  <block type="controls_forEach" id=":3wy$Xc`Sv32@xSFxBx-">
+                                    <field name="VAR">i</field>
+                                    <value name="LIST">
+                                      <block type="variables_get" id="b=*R+[9wjMM4N,t~6!nJ">
+                                        <field name="VAR">lane_trackingline</field>
+                                      </block>
+                                    </value>
+                                    <statement name="DO">
+                                      <block type="ai_lcd_draw_rectangle" id="eBgtX|r@luiM?GG*%Xn!">
+                                        <field name="varitem">canvas</field>
+                                        <field name="rect_type">rect</field>
+                                        <value name="POSA">
+                                          <block type="lcd_set_position" id="J=o`rve`5M%Id-26ax0_">
+                                            <value name="POSX">
+                                              <shadow type="math_number" id="#hIXYdf]gbH3rz3Ie@4R">
+                                                <field name="NUM">0</field>
+                                              </shadow>
+                                              <block type="ai_vision_get_blobs" id=":BS86o$a1_kmKJ:$!^DY">
+                                                <field name="varitem">i</field>
+                                                <field name="blob_type">x</field>
+                                              </block>
+                                            </value>
+                                            <value name="POSY">
+                                              <shadow type="math_number" id="L{sWd7QkA(G7a^){-;@L">
+                                                <field name="NUM">0</field>
+                                              </shadow>
+                                              <block type="ai_vision_get_blobs" id="/NYSB-IHEQ~VnGCjB^cp">
+                                                <field name="varitem">i</field>
+                                                <field name="blob_type">y</field>
+                                              </block>
+                                            </value>
+                                          </block>
+                                        </value>
+                                        <value name="POSB">
+                                          <block type="lcd_set_width_height" id="YJpfL3[cLT11Ay28C!A)">
+                                            <value name="WIDTH">
+                                              <shadow type="math_number" id="Oahwz7^;Zoh?S7#`}B83">
+                                                <field name="NUM">320</field>
+                                              </shadow>
+                                              <block type="ai_vision_get_blobs" id="|)R?.xxj$C7HQWoumb2!">
+                                                <field name="varitem">i</field>
+                                                <field name="blob_type">w</field>
+                                              </block>
+                                            </value>
+                                            <value name="HEIGHT">
+                                              <shadow type="math_number" id="qg!GHG7SOc8!M[}bgEus">
+                                                <field name="NUM">240</field>
+                                              </shadow>
+                                              <block type="ai_vision_get_blobs" id="kjAzTu6?1%^MUkw?@6zO">
+                                                <field name="varitem">i</field>
+                                                <field name="blob_type">h</field>
+                                              </block>
+                                            </value>
+                                          </block>
+                                        </value>
+                                        <value name="COLOR">
+                                          <block type="lcd_set_color" id="nO8r=r!1Z*kGVe?]XKch">
+                                            <field name="COLOR">#ff0000</field>
+                                          </block>
+                                        </value>
+                                      </block>
+                                    </statement>
+                                  </block>
+                                </statement>
+                                <next>
+                                  <block type="ai_lcd_showcarvas_set_display" id="j*eVEQ!e+ZHeIuY)*{Hk">
+                                    <field name="varitem">canvas</field>
+                                  </block>
+                                </next>
+                              </block>
+                            </next>
+                          </block>
+                        </next>
+                      </block>
+                    </statement>
+                  </block>
+                </next>
+              </block>
+            </next>
+          </block>
+        </next>
+      </block>
+    </next>
+  </block>
+</xml>

+ 182 - 0
src/renderer/cocoblockly-x/src/python/图像处理/寻找色块.xml

@@ -0,0 +1,182 @@
+<xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
+  <block type="ai_camera_init" id="fpiu`mXy+VPRp$%_?nh?" x="646" y="-94">
+    <next>
+      <block type="ai_lcd_screeninit" id="]IKTZ4N3-$bt`);0,_Of">
+        <field name="isScreen">False</field>
+        <next>
+          <block type="ai_lcd_createnonecarvas" id="mWuq+N++8K;29BsL1n.q">
+            <field name="varitem">canvas</field>
+            <value name="wh">
+              <block type="lcd_set_width_height" id=":V~.)L|faiwTF:r3XOHS">
+                <value name="WIDTH">
+                  <shadow type="math_number" id="(ECu+*AY#UwUJ[Zd8.@1">
+                    <field name="NUM">320</field>
+                  </shadow>
+                </value>
+                <value name="HEIGHT">
+                  <shadow type="math_number" id="nN~,15+W01b5yU+y+~fL">
+                    <field name="NUM">240</field>
+                  </shadow>
+                </value>
+              </block>
+            </value>
+            <next>
+              <block type="CocoRobo_return_list" id="P`(OGxj{C.hgN3(D$c3F">
+                <value name="list_name">
+                  <block type="variables_get" id="J!NFjNYk_1+ee,/xVTel">
+                    <field name="VAR">my_list</field>
+                  </block>
+                </value>
+                <value name="list_items">
+                  <shadow type="text_list" id="|_!BmX6|dd}{cqQydWkR">
+                    <field name="TEXT">(34, 100, -38, 3, -128, -28)</field>
+                  </shadow>
+                </value>
+                <next>
+                  <block type="controls_repeat_forever" id="PG.b9?agjAbFGi)W$h8Q">
+                    <statement name="DO">
+                      <block type="variables_set" id="U[qT/|r8}7``,N`vk6?J">
+                        <field name="VAR">canvas</field>
+                        <value name="VALUE">
+                          <shadow type="math_number" id="%CW!*Owz+{eafwR7.CU_">
+                            <field name="NUM">0</field>
+                          </shadow>
+                          <block type="ai_camera_snapshot" id="-JAPBQuzh[!ohjs10zcD"></block>
+                        </value>
+                        <next>
+                          <block type="variables_set" id="Be6jL@[${6n^r-+UBgTH">
+                            <field name="VAR">lane_trackingline</field>
+                            <value name="VALUE">
+                              <shadow type="math_number" id="MK*,d~E#uM99E`Ns.R[+">
+                                <field name="NUM">0</field>
+                              </shadow>
+                              <block type="ai_vision_find_lines" id="L,`DvE]*E{k|(@*N0UuU">
+                                <field name="varitem">canvas</field>
+                                <value name="color">
+                                  <block type="variables_get" id="WOfho],O:s?[BGl~b[++">
+                                    <field name="VAR">my_list</field>
+                                  </block>
+                                </value>
+                                <value name="xy">
+                                  <block type="ai_lcd_XY_vision" id="qp`6Ag}S(o^Na-9Jys2[">
+                                    <value name="A">
+                                      <shadow type="math_number" id=":qwlhg/wIfpQa(Rw$69n">
+                                        <field name="NUM">0</field>
+                                      </shadow>
+                                    </value>
+                                    <value name="B">
+                                      <shadow type="math_number" id="TaS=ObGC*%iTDauv+H#/">
+                                        <field name="NUM">0</field>
+                                      </shadow>
+                                    </value>
+                                  </block>
+                                </value>
+                                <value name="wh">
+                                  <block type="ai_lcd_WH_vision" id="W#Q4.3R4CODi?k~Ss$lG">
+                                    <value name="A">
+                                      <shadow type="math_number" id="sfLV)y[gG^^-Mu$yWxB@">
+                                        <field name="NUM">320</field>
+                                      </shadow>
+                                    </value>
+                                    <value name="B">
+                                      <shadow type="math_number" id="aW[D}k?%fDYg[~Izr8#J">
+                                        <field name="NUM">240</field>
+                                      </shadow>
+                                    </value>
+                                  </block>
+                                </value>
+                              </block>
+                            </value>
+                            <next>
+                              <block type="controls_if" id="lq$n#IfH1/4pvWv-wL-,">
+                                <value name="IF0">
+                                  <block type="variables_get" id="ehLTH8xuzAOt}]va=.IX">
+                                    <field name="VAR">lane_trackingline</field>
+                                  </block>
+                                </value>
+                                <statement name="DO0">
+                                  <block type="controls_forEach" id=":3wy$Xc`Sv32@xSFxBx-">
+                                    <field name="VAR">i</field>
+                                    <value name="LIST">
+                                      <block type="variables_get" id="b=*R+[9wjMM4N,t~6!nJ">
+                                        <field name="VAR">lane_trackingline</field>
+                                      </block>
+                                    </value>
+                                    <statement name="DO">
+                                      <block type="ai_lcd_draw_rectangle" id="eBgtX|r@luiM?GG*%Xn!">
+                                        <field name="varitem">canvas</field>
+                                        <field name="rect_type">rect</field>
+                                        <value name="POSA">
+                                          <block type="lcd_set_position" id="J=o`rve`5M%Id-26ax0_">
+                                            <value name="POSX">
+                                              <shadow type="math_number" id="#hIXYdf]gbH3rz3Ie@4R">
+                                                <field name="NUM">0</field>
+                                              </shadow>
+                                              <block type="ai_vision_get_blobs" id=":BS86o$a1_kmKJ:$!^DY">
+                                                <field name="varitem">i</field>
+                                                <field name="blob_type">x</field>
+                                              </block>
+                                            </value>
+                                            <value name="POSY">
+                                              <shadow type="math_number" id="L{sWd7QkA(G7a^){-;@L">
+                                                <field name="NUM">0</field>
+                                              </shadow>
+                                              <block type="ai_vision_get_blobs" id="/NYSB-IHEQ~VnGCjB^cp">
+                                                <field name="varitem">i</field>
+                                                <field name="blob_type">y</field>
+                                              </block>
+                                            </value>
+                                          </block>
+                                        </value>
+                                        <value name="POSB">
+                                          <block type="lcd_set_width_height" id="YJpfL3[cLT11Ay28C!A)">
+                                            <value name="WIDTH">
+                                              <shadow type="math_number" id="Oahwz7^;Zoh?S7#`}B83">
+                                                <field name="NUM">320</field>
+                                              </shadow>
+                                              <block type="ai_vision_get_blobs" id="|)R?.xxj$C7HQWoumb2!">
+                                                <field name="varitem">i</field>
+                                                <field name="blob_type">w</field>
+                                              </block>
+                                            </value>
+                                            <value name="HEIGHT">
+                                              <shadow type="math_number" id="qg!GHG7SOc8!M[}bgEus">
+                                                <field name="NUM">240</field>
+                                              </shadow>
+                                              <block type="ai_vision_get_blobs" id="kjAzTu6?1%^MUkw?@6zO">
+                                                <field name="varitem">i</field>
+                                                <field name="blob_type">h</field>
+                                              </block>
+                                            </value>
+                                          </block>
+                                        </value>
+                                        <value name="COLOR">
+                                          <block type="lcd_set_color" id="nO8r=r!1Z*kGVe?]XKch">
+                                            <field name="COLOR">#ff0000</field>
+                                          </block>
+                                        </value>
+                                      </block>
+                                    </statement>
+                                  </block>
+                                </statement>
+                                <next>
+                                  <block type="ai_lcd_showcarvas_set_display" id="j*eVEQ!e+ZHeIuY)*{Hk">
+                                    <field name="varitem">canvas</field>
+                                  </block>
+                                </next>
+                              </block>
+                            </next>
+                          </block>
+                        </next>
+                      </block>
+                    </statement>
+                  </block>
+                </next>
+              </block>
+            </next>
+          </block>
+        </next>
+      </block>
+    </next>
+  </block>
+</xml>

+ 182 - 0
src/renderer/cocoblockly-x/src/python/图像处理/寻找蓝色并追踪.xml

@@ -0,0 +1,182 @@
+<xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
+  <block type="ai_camera_init" id="fpiu`mXy+VPRp$%_?nh?" x="646" y="-94">
+    <next>
+      <block type="ai_lcd_screeninit" id="]IKTZ4N3-$bt`);0,_Of">
+        <field name="isScreen">False</field>
+        <next>
+          <block type="ai_lcd_createnonecarvas" id="mWuq+N++8K;29BsL1n.q">
+            <field name="varitem">canvas</field>
+            <value name="wh">
+              <block type="lcd_set_width_height" id=":V~.)L|faiwTF:r3XOHS">
+                <value name="WIDTH">
+                  <shadow type="math_number" id="(ECu+*AY#UwUJ[Zd8.@1">
+                    <field name="NUM">320</field>
+                  </shadow>
+                </value>
+                <value name="HEIGHT">
+                  <shadow type="math_number" id="nN~,15+W01b5yU+y+~fL">
+                    <field name="NUM">240</field>
+                  </shadow>
+                </value>
+              </block>
+            </value>
+            <next>
+              <block type="CocoRobo_return_list" id="P`(OGxj{C.hgN3(D$c3F">
+                <value name="list_name">
+                  <block type="variables_get" id="J!NFjNYk_1+ee,/xVTel">
+                    <field name="VAR">my_list</field>
+                  </block>
+                </value>
+                <value name="list_items">
+                  <shadow type="text_list" id="|_!BmX6|dd}{cqQydWkR">
+                    <field name="TEXT">(3, 35, 8, 127, -128, -25)</field>
+                  </shadow>
+                </value>
+                <next>
+                  <block type="controls_repeat_forever" id="PG.b9?agjAbFGi)W$h8Q">
+                    <statement name="DO">
+                      <block type="variables_set" id="U[qT/|r8}7``,N`vk6?J">
+                        <field name="VAR">canvas</field>
+                        <value name="VALUE">
+                          <shadow type="math_number" id="%CW!*Owz+{eafwR7.CU_">
+                            <field name="NUM">0</field>
+                          </shadow>
+                          <block type="ai_camera_snapshot" id="-JAPBQuzh[!ohjs10zcD"></block>
+                        </value>
+                        <next>
+                          <block type="variables_set" id="Be6jL@[${6n^r-+UBgTH">
+                            <field name="VAR">lane_trackingline</field>
+                            <value name="VALUE">
+                              <shadow type="math_number" id="MK*,d~E#uM99E`Ns.R[+">
+                                <field name="NUM">0</field>
+                              </shadow>
+                              <block type="ai_vision_find_lines" id="L,`DvE]*E{k|(@*N0UuU">
+                                <field name="varitem">canvas</field>
+                                <value name="color">
+                                  <block type="variables_get" id="WOfho],O:s?[BGl~b[++">
+                                    <field name="VAR">my_list</field>
+                                  </block>
+                                </value>
+                                <value name="xy">
+                                  <block type="ai_lcd_XY_vision" id="qp`6Ag}S(o^Na-9Jys2[">
+                                    <value name="A">
+                                      <shadow type="math_number" id=":qwlhg/wIfpQa(Rw$69n">
+                                        <field name="NUM">0</field>
+                                      </shadow>
+                                    </value>
+                                    <value name="B">
+                                      <shadow type="math_number" id="TaS=ObGC*%iTDauv+H#/">
+                                        <field name="NUM">0</field>
+                                      </shadow>
+                                    </value>
+                                  </block>
+                                </value>
+                                <value name="wh">
+                                  <block type="ai_lcd_WH_vision" id="W#Q4.3R4CODi?k~Ss$lG">
+                                    <value name="A">
+                                      <shadow type="math_number" id="sfLV)y[gG^^-Mu$yWxB@">
+                                        <field name="NUM">320</field>
+                                      </shadow>
+                                    </value>
+                                    <value name="B">
+                                      <shadow type="math_number" id="aW[D}k?%fDYg[~Izr8#J">
+                                        <field name="NUM">240</field>
+                                      </shadow>
+                                    </value>
+                                  </block>
+                                </value>
+                              </block>
+                            </value>
+                            <next>
+                              <block type="controls_if" id="lq$n#IfH1/4pvWv-wL-,">
+                                <value name="IF0">
+                                  <block type="variables_get" id="ehLTH8xuzAOt}]va=.IX">
+                                    <field name="VAR">lane_trackingline</field>
+                                  </block>
+                                </value>
+                                <statement name="DO0">
+                                  <block type="controls_forEach" id=":3wy$Xc`Sv32@xSFxBx-">
+                                    <field name="VAR">i</field>
+                                    <value name="LIST">
+                                      <block type="variables_get" id="b=*R+[9wjMM4N,t~6!nJ">
+                                        <field name="VAR">lane_trackingline</field>
+                                      </block>
+                                    </value>
+                                    <statement name="DO">
+                                      <block type="ai_lcd_draw_rectangle" id="eBgtX|r@luiM?GG*%Xn!">
+                                        <field name="varitem">canvas</field>
+                                        <field name="rect_type">rect</field>
+                                        <value name="POSA">
+                                          <block type="lcd_set_position" id="J=o`rve`5M%Id-26ax0_">
+                                            <value name="POSX">
+                                              <shadow type="math_number" id="#hIXYdf]gbH3rz3Ie@4R">
+                                                <field name="NUM">0</field>
+                                              </shadow>
+                                              <block type="ai_vision_get_blobs" id=":BS86o$a1_kmKJ:$!^DY">
+                                                <field name="varitem">i</field>
+                                                <field name="blob_type">x</field>
+                                              </block>
+                                            </value>
+                                            <value name="POSY">
+                                              <shadow type="math_number" id="L{sWd7QkA(G7a^){-;@L">
+                                                <field name="NUM">0</field>
+                                              </shadow>
+                                              <block type="ai_vision_get_blobs" id="/NYSB-IHEQ~VnGCjB^cp">
+                                                <field name="varitem">i</field>
+                                                <field name="blob_type">y</field>
+                                              </block>
+                                            </value>
+                                          </block>
+                                        </value>
+                                        <value name="POSB">
+                                          <block type="lcd_set_width_height" id="YJpfL3[cLT11Ay28C!A)">
+                                            <value name="WIDTH">
+                                              <shadow type="math_number" id="Oahwz7^;Zoh?S7#`}B83">
+                                                <field name="NUM">320</field>
+                                              </shadow>
+                                              <block type="ai_vision_get_blobs" id="|)R?.xxj$C7HQWoumb2!">
+                                                <field name="varitem">i</field>
+                                                <field name="blob_type">w</field>
+                                              </block>
+                                            </value>
+                                            <value name="HEIGHT">
+                                              <shadow type="math_number" id="qg!GHG7SOc8!M[}bgEus">
+                                                <field name="NUM">240</field>
+                                              </shadow>
+                                              <block type="ai_vision_get_blobs" id="kjAzTu6?1%^MUkw?@6zO">
+                                                <field name="varitem">i</field>
+                                                <field name="blob_type">h</field>
+                                              </block>
+                                            </value>
+                                          </block>
+                                        </value>
+                                        <value name="COLOR">
+                                          <block type="lcd_set_color" id="nO8r=r!1Z*kGVe?]XKch">
+                                            <field name="COLOR">#ff0000</field>
+                                          </block>
+                                        </value>
+                                      </block>
+                                    </statement>
+                                  </block>
+                                </statement>
+                                <next>
+                                  <block type="ai_lcd_showcarvas_set_display" id="j*eVEQ!e+ZHeIuY)*{Hk">
+                                    <field name="varitem">canvas</field>
+                                  </block>
+                                </next>
+                              </block>
+                            </next>
+                          </block>
+                        </next>
+                      </block>
+                    </statement>
+                  </block>
+                </next>
+              </block>
+            </next>
+          </block>
+        </next>
+      </block>
+    </next>
+  </block>
+</xml>

+ 2 - 2
src/renderer/cocoblockly-x/src/python/图像处理/循线-单.xml

@@ -104,7 +104,7 @@
                                     </value>
                                     <value name="B">
                                       <block type="math_number" id="louSfKK%e-`PqWB`+R4x">
-                                        <field name="NUM">70</field>
+                                        <field name="NUM">170</field>
                                       </block>
                                     </value>
                                   </block>
@@ -165,7 +165,7 @@
                                     </value>
                                     <value name="B">
                                       <block type="math_number" id="x;7X*ox0QuDf^36aZd7[">
-                                        <field name="NUM">50</field>
+                                        <field name="NUM">150</field>
                                       </block>
                                     </value>
                                   </block>

+ 172 - 0
src/renderer/cocoblockly-x/src/python/图像处理/条形码识别.xml

@@ -0,0 +1,172 @@
+<xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
+  <block type="ai_camera_init" id="?UBfXqNx`~}$,@7bLaJq" x="39" y="3">
+    <next>
+      <block type="ai_lcd_screeninit" id="O^h{|IkO1v~X8`x5Mw9*">
+        <field name="isScreen">False</field>
+        <next>
+          <block type="ai_lcd_createnonecarvas" id=",`J?vXg;/K|O6K]:^H3Y">
+            <field name="varitem">canvas</field>
+            <value name="wh">
+              <block type="lcd_set_width_height" id="p7#%;AeG*oY{s/{@f?*j">
+                <value name="WIDTH">
+                  <shadow type="math_number" id="b@wb@qN~[q,d8d#(fThH">
+                    <field name="NUM">320</field>
+                  </shadow>
+                </value>
+                <value name="HEIGHT">
+                  <shadow type="math_number" id="7T=LO(ddQlYmFK8%F0r|">
+                    <field name="NUM">240</field>
+                  </shadow>
+                </value>
+              </block>
+            </value>
+            <next>
+              <block type="controls_repeat_forever" id="RXrT=-eQ2pG$e|yM,2{[">
+                <statement name="DO">
+                  <block type="variables_set" id=")-P2M_M#jM)IY00fSi0R">
+                    <field name="VAR">canvas</field>
+                    <value name="VALUE">
+                      <shadow type="math_number" id="ymMA[a~?0W9-vqU[`H3_">
+                        <field name="NUM">0</field>
+                      </shadow>
+                      <block type="ai_camera_snapshot" id="TKV`q8X3)%#|ejH7lD-)"></block>
+                    </value>
+                    <next>
+                      <block type="variables_set" id="eyGx^`M!x~.HB|5zo..V">
+                        <field name="VAR">barCode</field>
+                        <value name="VALUE">
+                          <shadow type="math_number" id="ymMA[a~?0W9-vqU[`H3_">
+                            <field name="NUM">0</field>
+                          </shadow>
+                          <block type="ai_vision_find_barcodes" id="#6pw,ii`M/eC;b1^y%QT">
+                            <field name="varitem">canvas</field>
+                          </block>
+                        </value>
+                        <next>
+                          <block type="controls_forEach" id="#g)91]#X7hFEEobXENtK">
+                            <field name="VAR">i</field>
+                            <value name="LIST">
+                              <block type="variables_get" id="TH:1cSR].Weoq7x`xV3X">
+                                <field name="VAR">barCode</field>
+                              </block>
+                            </value>
+                            <statement name="DO">
+                              <block type="ai_lcd_textcarvas" id="j8#FYkDSm83QN@aBQRag">
+                                <field name="varitem">canvas</field>
+                                <value name="POSA">
+                                  <block type="lcd_set_position" id=",u,62:*G]6iBGaK3uZ/3">
+                                    <value name="POSX">
+                                      <shadow type="math_number" id=":{s,U4pDy7MmNdkzh[db">
+                                        <field name="NUM">0</field>
+                                      </shadow>
+                                      <block type="ai_vision_barcodes_get_info" id="#10$CM%]}53C9)qz9~lX">
+                                        <field name="varitem">i</field>
+                                        <field name="get_info">x</field>
+                                      </block>
+                                    </value>
+                                    <value name="POSY">
+                                      <shadow type="math_number" id="{4h;Hl}{5HM,4vA;q#K#">
+                                        <field name="NUM">0</field>
+                                      </shadow>
+                                      <block type="ai_vision_barcodes_get_info" id="{FB!Xg+j9N@#5o,n(.19">
+                                        <field name="varitem">i</field>
+                                        <field name="get_info">y</field>
+                                      </block>
+                                    </value>
+                                  </block>
+                                </value>
+                                <value name="CONTENT">
+                                  <shadow type="text" id="!4*_1/3)tAg3ygOM.|YW">
+                                    <field name="TEXT"></field>
+                                  </shadow>
+                                  <block type="ai_vision_barcodes_get_info" id=")n$/ybC!VT`vvHkNGfKz">
+                                    <field name="varitem">i</field>
+                                    <field name="get_info">payload</field>
+                                  </block>
+                                </value>
+                                <value name="COLOR">
+                                  <block type="lcd_set_color" id="k9L/2JvE7|(Xl@0^8)x[">
+                                    <field name="COLOR">#ff0000</field>
+                                  </block>
+                                </value>
+                                <value name="Scale">
+                                  <shadow type="math_number" id="[}E0F%^LWN[,3~[+`W$)">
+                                    <field name="NUM">1</field>
+                                  </shadow>
+                                </value>
+                                <next>
+                                  <block type="ai_lcd_draw_rectangle" id="jF@WWq%HrA#-GOmBCL3`">
+                                    <field name="varitem">canvas</field>
+                                    <field name="rect_type">rect</field>
+                                    <value name="POSA">
+                                      <block type="lcd_set_position" id="-]22qpxJ:pA|2q)KhtIi">
+                                        <value name="POSX">
+                                          <shadow type="math_number" id=":{s,U4pDy7MmNdkzh[db">
+                                            <field name="NUM">0</field>
+                                          </shadow>
+                                          <block type="ai_vision_barcodes_get_info" id="id-joL#wMi.pEiF|7v3a">
+                                            <field name="varitem">i</field>
+                                            <field name="get_info">x</field>
+                                          </block>
+                                        </value>
+                                        <value name="POSY">
+                                          <shadow type="math_number" id="{4h;Hl}{5HM,4vA;q#K#">
+                                            <field name="NUM">0</field>
+                                          </shadow>
+                                          <block type="ai_vision_barcodes_get_info" id="OngS/31MRB6?-(X;=msr">
+                                            <field name="varitem">i</field>
+                                            <field name="get_info">y</field>
+                                          </block>
+                                        </value>
+                                      </block>
+                                    </value>
+                                    <value name="POSB">
+                                      <block type="lcd_set_width_height" id="v(UHNp.1%X+6Wz0,9Qd@">
+                                        <value name="WIDTH">
+                                          <shadow type="math_number" id="qvBuHxyte]^/XCCd3^|.">
+                                            <field name="NUM">320</field>
+                                          </shadow>
+                                          <block type="ai_vision_barcodes_get_info" id="ZKK6J(BJ62~$ET6Q0c2?">
+                                            <field name="varitem">i</field>
+                                            <field name="get_info">w</field>
+                                          </block>
+                                        </value>
+                                        <value name="HEIGHT">
+                                          <shadow type="math_number" id="?lv9|CAoEJ_=o8dE3km%">
+                                            <field name="NUM">240</field>
+                                          </shadow>
+                                          <block type="ai_vision_barcodes_get_info" id=")i:$+sk?2jWGRm_-9(~6">
+                                            <field name="varitem">i</field>
+                                            <field name="get_info">h</field>
+                                          </block>
+                                        </value>
+                                      </block>
+                                    </value>
+                                    <value name="COLOR">
+                                      <block type="lcd_set_color" id=",5((j-}UpHdxGgRj/YqY">
+                                        <field name="COLOR">#ff0000</field>
+                                      </block>
+                                    </value>
+                                  </block>
+                                </next>
+                              </block>
+                            </statement>
+                            <next>
+                              <block type="ai_lcd_showcarvas_set_display" id="6Af3VHIh=JOf)iZ::m$=">
+                                <field name="varitem">canvas</field>
+                              </block>
+                            </next>
+                          </block>
+                        </next>
+                      </block>
+                    </next>
+                  </block>
+                </statement>
+              </block>
+            </next>
+          </block>
+        </next>
+      </block>
+    </next>
+  </block>
+</xml>

+ 783 - 0
src/renderer/cocoblockly-x/src/python/屏幕/小游戏:漫步者.xml

@@ -0,0 +1,783 @@
+<xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
+  <block type="procedures_defnoreturn" id="[R7,Jpk)SG@G|sz|7Dv!" x="1376" y="75">
+    <field name="NAME">Key_switch</field>
+    <statement name="STACK">
+      <block type="controls_if" id="~%gamrntvE71szWrIX1w">
+        <mutation elseif="3"></mutation>
+        <value name="IF0">
+          <block type="ai_v831_button_read_pressed" id="axXsW3N15-%(a^iVv!t*">
+            <field name="button_type">A</field>
+          </block>
+        </value>
+        <statement name="DO0">
+          <block type="controls_whileUntil" id="d3jIq8VvmVx/od`ye%H-">
+            <field name="MODE">UNTIL</field>
+            <value name="BOOL">
+              <block type="ai_v831_button_read_released" id="Wj;H6p.?2~b:c]o(va{l">
+                <field name="button_type_released">A</field>
+              </block>
+            </value>
+            <statement name="DO">
+              <block type="time_delay" id="SPZta![lqRW[}]6SQ1Vr">
+                <value name="DELAY_TIME_MILI">
+                  <block type="math_number" id="GzpYP,5W^n]HQo)8AC.0">
+                    <field name="NUM">100</field>
+                  </block>
+                </value>
+              </block>
+            </statement>
+            <next>
+              <block type="variables_set" id="2lzCvJz87krP8jDL3OC+">
+                <field name="VAR">Y</field>
+                <value name="VALUE">
+                  <shadow type="math_number" id="6qZ7lbh+);6gAPGKyPBY">
+                    <field name="NUM">10</field>
+                  </shadow>
+                  <block type="math_arithmetic" id="DYPGZoZC[|(^[3=}KEe%">
+                    <field name="OP">ADD</field>
+                    <value name="A">
+                      <shadow type="math_number" id="15|KdMq5#htF]$?XZ2bk">
+                        <field name="NUM">1</field>
+                      </shadow>
+                      <block type="variables_get" id="/=]Dy~plN~6wPD2=mjfZ">
+                        <field name="VAR">Y</field>
+                      </block>
+                    </value>
+                    <value name="B">
+                      <shadow type="math_number" id="unG.Wh_#q!MmKK#)v2r9">
+                        <field name="NUM">20</field>
+                      </shadow>
+                    </value>
+                  </block>
+                </value>
+              </block>
+            </next>
+          </block>
+        </statement>
+        <value name="IF1">
+          <block type="ai_v831_button_read_pressed" id="IwUSRa0-f,}*e%v?ps4L">
+            <field name="button_type">B</field>
+          </block>
+        </value>
+        <statement name="DO1">
+          <block type="controls_whileUntil" id="Et}fJ2x27G`{AXSZFe-*">
+            <field name="MODE">UNTIL</field>
+            <value name="BOOL">
+              <block type="ai_v831_button_read_released" id="]7D7tdlnG|dh:7mEH^Tg">
+                <field name="button_type_released">B</field>
+              </block>
+            </value>
+            <statement name="DO">
+              <block type="time_delay" id="j};~F|sL?O80$6ukj;Ey">
+                <value name="DELAY_TIME_MILI">
+                  <block type="math_number" id="+R#Z9xmZ/mOTft`X[Sk+">
+                    <field name="NUM">100</field>
+                  </block>
+                </value>
+              </block>
+            </statement>
+            <next>
+              <block type="variables_set" id="[Yy,FaJ,pvqplo1jqh:#">
+                <field name="VAR">Y</field>
+                <value name="VALUE">
+                  <shadow type="math_number" id="6qZ7lbh+);6gAPGKyPBY">
+                    <field name="NUM">10</field>
+                  </shadow>
+                  <block type="math_arithmetic" id="A?|qj.sff3[L{8O3`hYQ">
+                    <field name="OP">MINUS</field>
+                    <value name="A">
+                      <shadow type="math_number" id="15|KdMq5#htF]$?XZ2bk">
+                        <field name="NUM">1</field>
+                      </shadow>
+                      <block type="variables_get" id="Up4,l%y%(1_ku/){d59^">
+                        <field name="VAR">Y</field>
+                      </block>
+                    </value>
+                    <value name="B">
+                      <shadow type="math_number" id="iX]_ZgCpc:5v;qXN.h-6">
+                        <field name="NUM">20</field>
+                      </shadow>
+                    </value>
+                  </block>
+                </value>
+              </block>
+            </next>
+          </block>
+        </statement>
+        <value name="IF2">
+          <block type="ai_v831_button_read_pressed" id="Vbu[E(F=GFMD9]hwCGE)">
+            <field name="button_type">C</field>
+          </block>
+        </value>
+        <statement name="DO2">
+          <block type="controls_whileUntil" id="Tc?!A^s-Q;bTuBtG}68`">
+            <field name="MODE">UNTIL</field>
+            <value name="BOOL">
+              <block type="ai_v831_button_read_released" id=".DPKe_w0b{g9JRosUX3}">
+                <field name="button_type_released">C</field>
+              </block>
+            </value>
+            <statement name="DO">
+              <block type="time_delay" id="Iwf/rHU.4KWK+Wf,Vv?d">
+                <value name="DELAY_TIME_MILI">
+                  <block type="math_number" id=";Ly;F.c{Bi/*U52xqpDT">
+                    <field name="NUM">100</field>
+                  </block>
+                </value>
+              </block>
+            </statement>
+            <next>
+              <block type="variables_set" id="]%#R67^9CR1yj0i$M.Hk">
+                <field name="VAR">X</field>
+                <value name="VALUE">
+                  <shadow type="math_number" id="6qZ7lbh+);6gAPGKyPBY">
+                    <field name="NUM">10</field>
+                  </shadow>
+                  <block type="math_arithmetic" id="6N1aGYlcZ]]SbyPGs3LI">
+                    <field name="OP">ADD</field>
+                    <value name="A">
+                      <shadow type="math_number" id="15|KdMq5#htF]$?XZ2bk">
+                        <field name="NUM">1</field>
+                      </shadow>
+                      <block type="variables_get" id="40Zfe_[*P:O5J}rLo;4A">
+                        <field name="VAR">X</field>
+                      </block>
+                    </value>
+                    <value name="B">
+                      <shadow type="math_number" id="rnkOrP,sb5H6YqBz%O2Q">
+                        <field name="NUM">20</field>
+                      </shadow>
+                    </value>
+                  </block>
+                </value>
+              </block>
+            </next>
+          </block>
+        </statement>
+        <value name="IF3">
+          <block type="ai_v831_button_read_pressed" id="r;LAo},X?dzi1o5~mZ}6">
+            <field name="button_type">D</field>
+          </block>
+        </value>
+        <statement name="DO3">
+          <block type="controls_whileUntil" id="7bGH},+di{E.%g18C:dw">
+            <field name="MODE">UNTIL</field>
+            <value name="BOOL">
+              <block type="ai_v831_button_read_released" id="HaNf(AG1@hRz^U!wPijM">
+                <field name="button_type_released">D</field>
+              </block>
+            </value>
+            <statement name="DO">
+              <block type="time_delay" id="ABx00|pojl{xnyg:Qh`-">
+                <value name="DELAY_TIME_MILI">
+                  <block type="math_number" id="25pDeQx8tlxKwf4cos^r">
+                    <field name="NUM">100</field>
+                  </block>
+                </value>
+              </block>
+            </statement>
+            <next>
+              <block type="variables_set" id="2Vd7e[(;LHhr=0f#I|us">
+                <field name="VAR">X</field>
+                <value name="VALUE">
+                  <shadow type="math_number" id="6qZ7lbh+);6gAPGKyPBY">
+                    <field name="NUM">10</field>
+                  </shadow>
+                  <block type="math_arithmetic" id="h:*ZA~9W.XmU}.P{d7ns">
+                    <field name="OP">MINUS</field>
+                    <value name="A">
+                      <shadow type="math_number" id="15|KdMq5#htF]$?XZ2bk">
+                        <field name="NUM">1</field>
+                      </shadow>
+                      <block type="variables_get" id="Gt%:8F#^B`EsmL-6*PhY">
+                        <field name="VAR">X</field>
+                      </block>
+                    </value>
+                    <value name="B">
+                      <shadow type="math_number" id="Q9eXlEqrfyv/zm`m=-CG">
+                        <field name="NUM">20</field>
+                      </shadow>
+                    </value>
+                  </block>
+                </value>
+              </block>
+            </next>
+          </block>
+        </statement>
+        <next>
+          <block type="controls_if" id="=_,oF8Y,w,14.5SwAC$S">
+            <mutation elseif="3"></mutation>
+            <value name="IF0">
+              <block type="logic_compare" id="!~a5wn{K3](D4(?Iuj~S">
+                <field name="OP">GT</field>
+                <value name="A">
+                  <block type="variables_get" id="z;5n!*[FmOh-{$opo^{z">
+                    <field name="VAR">X</field>
+                  </block>
+                </value>
+                <value name="B">
+                  <block type="math_number" id="]!s/atdVIV.KcXbAt^Oc">
+                    <field name="NUM">310</field>
+                  </block>
+                </value>
+              </block>
+            </value>
+            <statement name="DO0">
+              <block type="variables_set" id="Do5l=c^TdY4+`3^,L[8r">
+                <field name="VAR">X</field>
+                <value name="VALUE">
+                  <shadow type="math_number" id="syL.z~|!I:gwx^zNf2jL">
+                    <field name="NUM">310</field>
+                  </shadow>
+                </value>
+              </block>
+            </statement>
+            <value name="IF1">
+              <block type="logic_compare" id="6bT`STH/~58.HzZ:6cEV">
+                <field name="OP">GT</field>
+                <value name="A">
+                  <block type="variables_get" id="H;g/:xb-!%gbd~|J894[">
+                    <field name="VAR">Y</field>
+                  </block>
+                </value>
+                <value name="B">
+                  <block type="math_number" id="S/r,f*lGoNI%F.AwVHb2">
+                    <field name="NUM">230</field>
+                  </block>
+                </value>
+              </block>
+            </value>
+            <statement name="DO1">
+              <block type="variables_set" id="-aae015$`PD,K18)LuW9">
+                <field name="VAR">Y</field>
+                <value name="VALUE">
+                  <shadow type="math_number" id="HpSK2YtcgKsx=JN8]H)=">
+                    <field name="NUM">230</field>
+                  </shadow>
+                </value>
+              </block>
+            </statement>
+            <value name="IF2">
+              <block type="logic_compare" id="cCkCKeC#O1`d9;eP/`9|">
+                <field name="OP">LTE</field>
+                <value name="A">
+                  <block type="variables_get" id="}Y!(3?r|5tp[u$k1!`N8">
+                    <field name="VAR">Y</field>
+                  </block>
+                </value>
+                <value name="B">
+                  <block type="math_number" id="laz31My,lP!sD2/DPnk{">
+                    <field name="NUM">0</field>
+                  </block>
+                </value>
+              </block>
+            </value>
+            <statement name="DO2">
+              <block type="variables_set" id="5@_`aelp$nqKF`l%3U{X">
+                <field name="VAR">Y</field>
+                <value name="VALUE">
+                  <shadow type="math_number" id=";}|EZsOWXBn5jTd9+kmH">
+                    <field name="NUM">0</field>
+                  </shadow>
+                </value>
+              </block>
+            </statement>
+            <value name="IF3">
+              <block type="logic_compare" id="ElkhO`RHUr`8,v/0gn7F">
+                <field name="OP">LTE</field>
+                <value name="A">
+                  <block type="variables_get" id="@#4oWi]79OoX*Xw2AA7r">
+                    <field name="VAR">X</field>
+                  </block>
+                </value>
+                <value name="B">
+                  <block type="math_number" id="m|z?Vm(!SCdFi$GM=#*S">
+                    <field name="NUM">0</field>
+                  </block>
+                </value>
+              </block>
+            </value>
+            <statement name="DO3">
+              <block type="variables_set" id="{Oe?Y~Vqo.{z2reL(2G)">
+                <field name="VAR">X</field>
+                <value name="VALUE">
+                  <shadow type="math_number" id="TuaXP/Es=uS%X#k`triK">
+                    <field name="NUM">0</field>
+                  </shadow>
+                </value>
+              </block>
+            </statement>
+          </block>
+        </next>
+      </block>
+    </statement>
+  </block>
+  <block type="ai_lcd_screeninit" id="2PHESD`!?Rz;,*CXs|@U" x="353" y="129">
+    <field name="isScreen">False</field>
+    <next>
+      <block type="ai_lcd_createnonecarvas" id="5}~jC.WR-a`=MD^]lhVd">
+        <field name="varitem">canvas</field>
+        <value name="wh">
+          <block type="lcd_set_width_height" id="1c$b!JO@PAzK^t]|q?Jg">
+            <value name="WIDTH">
+              <shadow type="math_number" id="K[JK#U%WH)8snfW*ewUK">
+                <field name="NUM">320</field>
+              </shadow>
+            </value>
+            <value name="HEIGHT">
+              <shadow type="math_number" id="$O/L65$hf*49;hlUy}`R">
+                <field name="NUM">240</field>
+              </shadow>
+            </value>
+          </block>
+        </value>
+        <next>
+          <block type="variables_set" id="iph`X-aUoOi4cPxR_1Pl">
+            <field name="VAR">X</field>
+            <value name="VALUE">
+              <shadow type="math_number" id="#cmw|zY6`x}{y,+VO.Ue">
+                <field name="NUM">140</field>
+              </shadow>
+            </value>
+            <next>
+              <block type="variables_set" id="z]ENDQ-,!U4vV}Dydi`n">
+                <field name="VAR">Y</field>
+                <value name="VALUE">
+                  <shadow type="math_number" id="r+cAPq0`^H5G`TKzMFUH">
+                    <field name="NUM">120</field>
+                  </shadow>
+                </value>
+                <next>
+                  <block type="controls_repeat_forever" id="%^pGg[gavsJ@[AZTJJvC">
+                    <statement name="DO">
+                      <block type="ai_lcd_clearcanvas" id="HsTt+N})TXqh99foO.Y$">
+                        <field name="varitem">canvas</field>
+                        <next>
+                          <block type="procedures_callnoreturn" id="G8y+d;mKh.vB{g3LgraL">
+                            <mutation name="tips"></mutation>
+                            <next>
+                              <block type="procedures_callnoreturn" id="$4MiV3/!jT*E$RV(!qg=">
+                                <mutation name="Key_switch"></mutation>
+                                <next>
+                                  <block type="controls_for" id="nDL%909vg[#*wHycNt.n">
+                                    <field name="VAR">i</field>
+                                    <value name="FROM">
+                                      <shadow type="math_number" id="-Lkwi}jisc9$%}BC`GO7">
+                                        <field name="NUM">0</field>
+                                      </shadow>
+                                    </value>
+                                    <value name="TO">
+                                      <shadow type="math_number" id="[4Ryn~HF4b#BP5%cRjz3">
+                                        <field name="NUM">320</field>
+                                      </shadow>
+                                    </value>
+                                    <value name="BY">
+                                      <shadow type="math_number" id="qk(1d1?{u]$uc=^_2F(q">
+                                        <field name="NUM">20</field>
+                                      </shadow>
+                                    </value>
+                                    <statement name="DO">
+                                      <block type="controls_if" id="5X}4{rAMo%I#J$SIS#_/">
+                                        <value name="IF0">
+                                          <block type="logic_compare" id=":u[|q-;4%N{.,y%Pb@cZ">
+                                            <field name="OP">EQ</field>
+                                            <value name="A">
+                                              <block type="variables_get" id="/-#gsb-5TN)aKxxE]B75">
+                                                <field name="VAR">i</field>
+                                              </block>
+                                            </value>
+                                            <value name="B">
+                                              <block type="math_number" id="ocYvzaBvG_u/bLtb%=Y/">
+                                                <field name="NUM">320</field>
+                                              </block>
+                                            </value>
+                                          </block>
+                                        </value>
+                                        <statement name="DO0">
+                                          <block type="variables_set" id="HmWDL62WDPK6l/ps[A_}">
+                                            <field name="VAR">i</field>
+                                            <value name="VALUE">
+                                              <shadow type="math_number" id="BSVj@l}L,V^NrCGl(5;7">
+                                                <field name="NUM">319</field>
+                                              </shadow>
+                                            </value>
+                                          </block>
+                                        </statement>
+                                        <next>
+                                          <block type="ai_lcd_linecarvas" id="uK$u0$zgz8U^a))XpyvN">
+                                            <field name="varitem">canvas</field>
+                                            <value name="POSA">
+                                              <block type="lcd_set_position" id="K!sh#pP)--GKlj}thork">
+                                                <value name="POSX">
+                                                  <shadow type="math_number" id="_}r+^5%Im4K;$_]WG]3A">
+                                                    <field name="NUM">0</field>
+                                                  </shadow>
+                                                  <block type="variables_get" id="[8c`z0F57Cyjas+?@OLT">
+                                                    <field name="VAR">i</field>
+                                                  </block>
+                                                </value>
+                                                <value name="POSY">
+                                                  <shadow type="math_number" id="]ztegkN?IN9cWm-r;pkr">
+                                                    <field name="NUM">0</field>
+                                                  </shadow>
+                                                </value>
+                                              </block>
+                                            </value>
+                                            <value name="POSB">
+                                              <block type="lcd_set_position" id="G1t{DqVa)!TAU1/B^YIb">
+                                                <value name="POSX">
+                                                  <shadow type="math_number" id="o2?Wdm%@w*:2_XgYf{0|">
+                                                    <field name="NUM">0</field>
+                                                  </shadow>
+                                                  <block type="variables_get" id="F2;X4(%}PR-XJy_dQ:gA">
+                                                    <field name="VAR">i</field>
+                                                  </block>
+                                                </value>
+                                                <value name="POSY">
+                                                  <shadow type="math_number" id="^[]F:0dBe$Vq/n@+YF?;">
+                                                    <field name="NUM">240</field>
+                                                  </shadow>
+                                                </value>
+                                              </block>
+                                            </value>
+                                            <value name="COLOR">
+                                              <block type="lcd_set_color" id="cT(PuSw#uV:v#N0L$/2K">
+                                                <field name="COLOR">#ff0000</field>
+                                              </block>
+                                            </value>
+                                            <value name="Scale">
+                                              <shadow type="math_number" id="K]:ik8mQ3wh)@WZKX;I3">
+                                                <field name="NUM">1</field>
+                                              </shadow>
+                                            </value>
+                                          </block>
+                                        </next>
+                                      </block>
+                                    </statement>
+                                    <next>
+                                      <block type="controls_for" id="yYI/TsJNou`n!r6KBYKL">
+                                        <field name="VAR">i</field>
+                                        <value name="FROM">
+                                          <shadow type="math_number" id="1+6pDK)3?DRnhwA6Phrt">
+                                            <field name="NUM">0</field>
+                                          </shadow>
+                                        </value>
+                                        <value name="TO">
+                                          <shadow type="math_number" id="}SYhqn(3u|^Ef}}=C*z:">
+                                            <field name="NUM">240</field>
+                                          </shadow>
+                                        </value>
+                                        <value name="BY">
+                                          <shadow type="math_number" id=";4*,_rRPR+C`nS7W+i#r">
+                                            <field name="NUM">20</field>
+                                          </shadow>
+                                        </value>
+                                        <statement name="DO">
+                                          <block type="controls_if" id="448[Y_9.u}cYbo[JMLL9">
+                                            <value name="IF0">
+                                              <block type="logic_compare" id="yiY4g?wDFg}^$UsAVwx(">
+                                                <field name="OP">EQ</field>
+                                                <value name="A">
+                                                  <block type="variables_get" id="6l{~M$5@j}wUDfr6kQDd">
+                                                    <field name="VAR">i</field>
+                                                  </block>
+                                                </value>
+                                                <value name="B">
+                                                  <block type="math_number" id="eI:Os_6mS}gOyy-7$c}O">
+                                                    <field name="NUM">240</field>
+                                                  </block>
+                                                </value>
+                                              </block>
+                                            </value>
+                                            <statement name="DO0">
+                                              <block type="variables_set" id="=o[0R/L`W^PhjKCJB`];">
+                                                <field name="VAR">i</field>
+                                                <value name="VALUE">
+                                                  <shadow type="math_number" id="K[_i(_kPO)c+W?T6=ZK^">
+                                                    <field name="NUM">239</field>
+                                                  </shadow>
+                                                </value>
+                                              </block>
+                                            </statement>
+                                            <next>
+                                              <block type="ai_lcd_linecarvas" id="#b0?U(d@P#|6Py6j=AJF">
+                                                <field name="varitem">canvas</field>
+                                                <value name="POSA">
+                                                  <block type="lcd_set_position" id="qs!y86{HcbxRdi,R;n9A">
+                                                    <value name="POSX">
+                                                      <shadow type="math_number" id="_}r+^5%Im4K;$_]WG]3A">
+                                                        <field name="NUM">0</field>
+                                                      </shadow>
+                                                    </value>
+                                                    <value name="POSY">
+                                                      <shadow type="math_number" id="A+Lu$r;-d=A6!fs!bOr!">
+                                                        <field name="NUM">0</field>
+                                                      </shadow>
+                                                      <block type="variables_get" id="Yvn(Hd%K6Y]4+6EK1Z,{">
+                                                        <field name="VAR">i</field>
+                                                      </block>
+                                                    </value>
+                                                  </block>
+                                                </value>
+                                                <value name="POSB">
+                                                  <block type="lcd_set_position" id="O21TV^@Ubmgh-c7slWZK">
+                                                    <value name="POSX">
+                                                      <shadow type="math_number" id="o2?Wdm%@w*:2_XgYf{0|">
+                                                        <field name="NUM">320</field>
+                                                      </shadow>
+                                                    </value>
+                                                    <value name="POSY">
+                                                      <shadow type="math_number" id="/Iyrr2$z.On5N]3abaPe">
+                                                        <field name="NUM">239</field>
+                                                      </shadow>
+                                                      <block type="variables_get" id="(.t3U^~`5-EI,w]Z{ZUI">
+                                                        <field name="VAR">i</field>
+                                                      </block>
+                                                    </value>
+                                                  </block>
+                                                </value>
+                                                <value name="COLOR">
+                                                  <block type="lcd_set_color" id="v=HeQP6Qq8[;br|9LP+r">
+                                                    <field name="COLOR">#ff0000</field>
+                                                  </block>
+                                                </value>
+                                                <value name="Scale">
+                                                  <shadow type="math_number" id="@g+kL,2-obQP7m@8gFlQ">
+                                                    <field name="NUM">1</field>
+                                                  </shadow>
+                                                </value>
+                                              </block>
+                                            </next>
+                                          </block>
+                                        </statement>
+                                        <next>
+                                          <block type="ai_lcd_drawcirclecarvas" id="%~|bx]G8FT+-,(3:c,%y">
+                                            <field name="varitem">canvas</field>
+                                            <field name="rect_type">fillrect</field>
+                                            <value name="POSA">
+                                              <block type="lcd_set_position" id="P([KcY-g7#Z]vnMn15SD">
+                                                <value name="POSX">
+                                                  <shadow type="math_number" id="=`63wy9gh32`/?_f?~o@">
+                                                    <field name="NUM">20</field>
+                                                  </shadow>
+                                                  <block type="math_arithmetic" id="84[Lf=[~YYXa_HuG|k20">
+                                                    <field name="OP">ADD</field>
+                                                    <value name="A">
+                                                      <shadow type="math_number" id="y4hT_]IT?_{isrqdU^{/">
+                                                        <field name="NUM">1</field>
+                                                      </shadow>
+                                                      <block type="variables_get" id="]cxpCqaR-4Q%`Nxir}9R">
+                                                        <field name="VAR">X</field>
+                                                      </block>
+                                                    </value>
+                                                    <value name="B">
+                                                      <shadow type="math_number" id="{9p1-mvg73-~@Y-w,8-Z">
+                                                        <field name="NUM">10</field>
+                                                      </shadow>
+                                                    </value>
+                                                  </block>
+                                                </value>
+                                                <value name="POSY">
+                                                  <shadow type="math_number" id="qAdL:Z,Ri_(QV:4}6^3k">
+                                                    <field name="NUM">20</field>
+                                                  </shadow>
+                                                  <block type="math_arithmetic" id="b{/kPQ}G]KIf/Y6]?Cbw">
+                                                    <field name="OP">ADD</field>
+                                                    <value name="A">
+                                                      <shadow type="math_number" id="y4hT_]IT?_{isrqdU^{/">
+                                                        <field name="NUM">1</field>
+                                                      </shadow>
+                                                      <block type="variables_get" id="9=?5WZ3yD8+JOw`Rmmbr">
+                                                        <field name="VAR">Y</field>
+                                                      </block>
+                                                    </value>
+                                                    <value name="B">
+                                                      <shadow type="math_number" id="g(azYPfg_bJlUm:(:?}q">
+                                                        <field name="NUM">10</field>
+                                                      </shadow>
+                                                    </value>
+                                                  </block>
+                                                </value>
+                                              </block>
+                                            </value>
+                                            <value name="Scale">
+                                              <shadow type="math_number" id="=6wM(Kl92V/n4]LnrJ%e">
+                                                <field name="NUM">5</field>
+                                              </shadow>
+                                            </value>
+                                            <value name="COLOR">
+                                              <block type="lcd_set_color" id="UOV;$ooBCseZBIc$Tsch">
+                                                <field name="COLOR">#ffffff</field>
+                                              </block>
+                                            </value>
+                                            <value name="Scale_0">
+                                              <shadow type="math_number" id="pQR)s_ARHuMO8gl[+Y7u">
+                                                <field name="NUM">2</field>
+                                              </shadow>
+                                            </value>
+                                            <next>
+                                              <block type="ai_lcd_showcarvas_set_display" id="+H@8W[D|6=/2t2*v~}Q}">
+                                                <field name="varitem">canvas</field>
+                                              </block>
+                                            </next>
+                                          </block>
+                                        </next>
+                                      </block>
+                                    </next>
+                                  </block>
+                                </next>
+                              </block>
+                            </next>
+                          </block>
+                        </next>
+                      </block>
+                    </statement>
+                  </block>
+                </next>
+              </block>
+            </next>
+          </block>
+        </next>
+      </block>
+    </next>
+  </block>
+  <block type="procedures_defnoreturn" id="r|wt.j]_3EB~hNDV*m*#" x="857" y="111">
+    <field name="NAME">tips</field>
+    <statement name="STACK">
+      <block type="ai_lcd_textcarvas" id=",.WjL{L#[`Ipeh+ICR-E">
+        <field name="varitem">canvas</field>
+        <value name="POSA">
+          <block type="lcd_set_position" id="7+12F-yizkg]d`HERhB9">
+            <value name="POSX">
+              <shadow type="math_number" id="]#$$VVi!o*n3|I9:X[Wt">
+                <field name="NUM">3</field>
+              </shadow>
+            </value>
+            <value name="POSY">
+              <shadow type="math_number" id="lg|Cg`k+FD2b}P.2{#c;">
+                <field name="NUM">2</field>
+              </shadow>
+            </value>
+          </block>
+        </value>
+        <value name="CONTENT">
+          <shadow type="text" id="wfZK^aGxjI$M=Ry1Do5F">
+            <field name="TEXT">左</field>
+          </shadow>
+        </value>
+        <value name="COLOR">
+          <block type="lcd_set_color" id="qm=wv/BzD//l2FlT?aR^">
+            <field name="COLOR">#ffffff</field>
+          </block>
+        </value>
+        <value name="Scale">
+          <shadow type="math_number" id="R2U1=lx}xBpAS9K9?Vre">
+            <field name="NUM">1</field>
+          </shadow>
+        </value>
+        <next>
+          <block type="ai_lcd_textcarvas" id="e5_p9Tx[hFzSRv2(r*4D">
+            <field name="varitem">canvas</field>
+            <value name="POSA">
+              <block type="lcd_set_position" id="%*xMn4/o.IF_$:2{PyTG">
+                <value name="POSX">
+                  <shadow type="math_number" id="eJrC|]]%xQBUp$4:H^(f">
+                    <field name="NUM">303</field>
+                  </shadow>
+                </value>
+                <value name="POSY">
+                  <shadow type="math_number" id="9%sGzgU[CmE^h!t|n=Yb">
+                    <field name="NUM">2</field>
+                  </shadow>
+                </value>
+              </block>
+            </value>
+            <value name="CONTENT">
+              <shadow type="text" id="q:*vdCHXX,`9V6HMqH?k">
+                <field name="TEXT">右</field>
+              </shadow>
+            </value>
+            <value name="COLOR">
+              <block type="lcd_set_color" id="^6k|CM%Q))jZJYc@w.N=">
+                <field name="COLOR">#ffffff</field>
+              </block>
+            </value>
+            <value name="Scale">
+              <shadow type="math_number" id="B(kiQZBdX:z?eRN0})x4">
+                <field name="NUM">1</field>
+              </shadow>
+            </value>
+            <next>
+              <block type="ai_lcd_textcarvas" id="TXbr`/n)AsfhH+Ib2vG=">
+                <field name="varitem">canvas</field>
+                <value name="POSA">
+                  <block type="lcd_set_position" id="NRO==pJ5~7rpMI5N70+T">
+                    <value name="POSX">
+                      <shadow type="math_number" id="#!);jWgOa;A7(2;f@nFK">
+                        <field name="NUM">3</field>
+                      </shadow>
+                    </value>
+                    <value name="POSY">
+                      <shadow type="math_number" id="|.^UgBW-bJg_+si7~+.d">
+                        <field name="NUM">223</field>
+                      </shadow>
+                    </value>
+                  </block>
+                </value>
+                <value name="CONTENT">
+                  <shadow type="text" id="WntQ8MJ),.rd!Z8UC^SH">
+                    <field name="TEXT">上</field>
+                  </shadow>
+                </value>
+                <value name="COLOR">
+                  <block type="lcd_set_color" id="/=9)lG#[DnCQY0VIO??+">
+                    <field name="COLOR">#ffffff</field>
+                  </block>
+                </value>
+                <value name="Scale">
+                  <shadow type="math_number" id="O_nd,is}Ib8qcR:`l;?c">
+                    <field name="NUM">1</field>
+                  </shadow>
+                </value>
+                <next>
+                  <block type="ai_lcd_textcarvas" id="Z`3xn]wCW_5P.XOr#;8X">
+                    <field name="varitem">canvas</field>
+                    <value name="POSA">
+                      <block type="lcd_set_position" id="i2gsouY5JFyI{uWMg|kH">
+                        <value name="POSX">
+                          <shadow type="math_number" id="KBkwb28XM[Is%3KD|El;">
+                            <field name="NUM">303</field>
+                          </shadow>
+                        </value>
+                        <value name="POSY">
+                          <shadow type="math_number" id="~fSid^UznLHWFl7qdo(J">
+                            <field name="NUM">223</field>
+                          </shadow>
+                        </value>
+                      </block>
+                    </value>
+                    <value name="CONTENT">
+                      <shadow type="text" id="uDJFlG+!u,S34Op#2A-q">
+                        <field name="TEXT">下</field>
+                      </shadow>
+                    </value>
+                    <value name="COLOR">
+                      <block type="lcd_set_color" id="5S_2WHWI[D%CS.1QY34C">
+                        <field name="COLOR">#ffffff</field>
+                      </block>
+                    </value>
+                    <value name="Scale">
+                      <shadow type="math_number" id="Uc3?7!0NPCDc^CMVY7W7">
+                        <field name="NUM">1</field>
+                      </shadow>
+                    </value>
+                  </block>
+                </next>
+              </block>
+            </next>
+          </block>
+        </next>
+      </block>
+    </statement>
+  </block>
+</xml>

+ 8 - 124
src/renderer/cocoblockly-x/src/python/屏幕/按键切换背景色.xml

@@ -32,38 +32,9 @@
                       </block>
                     </value>
                     <statement name="DO0">
-                      <block type="ai_lcd_ractanglecarvas" id="UxMc(rJP5`ICCy4vdtzD">
+                      <block type="ai_lcd_fill_screen_with_rgb" id="EVM?/|53aD5ARRUzfC^6">
                         <field name="varitem">canvas</field>
-                        <field name="rect_type">fillrect</field>
-                        <value name="POSA">
-                          <block type="lcd_set_position" id="?e,K@)DOBHorv%QZO@N3">
-                            <value name="POSX">
-                              <shadow type="math_number" id="^.oKLELEhgpd1ENTvPJB">
-                                <field name="NUM">0</field>
-                              </shadow>
-                            </value>
-                            <value name="POSY">
-                              <shadow type="math_number" id="rr(_$d2iQTuI^pVx:_4f">
-                                <field name="NUM">0</field>
-                              </shadow>
-                            </value>
-                          </block>
-                        </value>
-                        <value name="POSB">
-                          <block type="lcd_set_position" id="z$j%qLmY2UQpH59Hx$u[">
-                            <value name="POSX">
-                              <shadow type="math_number" id="PLE^fGu;4,Moix-bYDF2">
-                                <field name="NUM">320</field>
-                              </shadow>
-                            </value>
-                            <value name="POSY">
-                              <shadow type="math_number" id="~B)g:V2Apo!@dC%O2-;3">
-                                <field name="NUM">240</field>
-                              </shadow>
-                            </value>
-                          </block>
-                        </value>
-                        <value name="COLOR">
+                        <value name="rgb_value">
                           <block type="ai_lcd_rgb_value_input" id="#^ye6G(DuJwTz~_cpJ!m">
                             <value name="rgb_value_r">
                               <shadow type="math_number" id="YY2NXwUtuzDWZF#M-pd%">
@@ -124,38 +95,9 @@
                       </block>
                     </value>
                     <statement name="DO1">
-                      <block type="ai_lcd_ractanglecarvas" id="@k@ACZRAVs,Ga%Q-q++R">
+                      <block type="ai_lcd_fill_screen_with_rgb" id="z8LhLwpX?9qw,77s*e.[">
                         <field name="varitem">canvas</field>
-                        <field name="rect_type">fillrect</field>
-                        <value name="POSA">
-                          <block type="lcd_set_position" id="naxLCu)=)k~h8Gvi`;cV">
-                            <value name="POSX">
-                              <shadow type="math_number" id="ZbxmO0rlQOtyBh`w5%ew">
-                                <field name="NUM">0</field>
-                              </shadow>
-                            </value>
-                            <value name="POSY">
-                              <shadow type="math_number" id="7OeTskva[43.JLWat-7y">
-                                <field name="NUM">0</field>
-                              </shadow>
-                            </value>
-                          </block>
-                        </value>
-                        <value name="POSB">
-                          <block type="lcd_set_position" id=")RFbkIMKYc(/Sh[M^vPX">
-                            <value name="POSX">
-                              <shadow type="math_number" id="WI~X=x;pCBx~58|1k+ek">
-                                <field name="NUM">320</field>
-                              </shadow>
-                            </value>
-                            <value name="POSY">
-                              <shadow type="math_number" id="g2zZ+(APs#X_Isr+[QNd">
-                                <field name="NUM">240</field>
-                              </shadow>
-                            </value>
-                          </block>
-                        </value>
-                        <value name="COLOR">
+                        <value name="rgb_value">
                           <block type="ai_lcd_rgb_value_input" id="12!ZBbo?2U1^wJ,4~t~1">
                             <value name="rgb_value_r">
                               <shadow type="math_number" id="iPK[}Pe}WD4s7HX~0^dR">
@@ -216,38 +158,9 @@
                       </block>
                     </value>
                     <statement name="DO2">
-                      <block type="ai_lcd_ractanglecarvas" id="-Uk]#O3!Ly2R1N8g^:BD">
+                      <block type="ai_lcd_fill_screen_with_rgb" id="o-2:nWr;TpJg`DjEm;CL">
                         <field name="varitem">canvas</field>
-                        <field name="rect_type">fillrect</field>
-                        <value name="POSA">
-                          <block type="lcd_set_position" id="V,m:#+a$n`/aFeWi_H^M">
-                            <value name="POSX">
-                              <shadow type="math_number" id="B)mRHBuqW?G#n@l|*C9z">
-                                <field name="NUM">0</field>
-                              </shadow>
-                            </value>
-                            <value name="POSY">
-                              <shadow type="math_number" id="HRiIZd)^Y8-$gHai@H{h">
-                                <field name="NUM">0</field>
-                              </shadow>
-                            </value>
-                          </block>
-                        </value>
-                        <value name="POSB">
-                          <block type="lcd_set_position" id="}JiZu+jyEZU?^cP_a(H4">
-                            <value name="POSX">
-                              <shadow type="math_number" id="U)!M*2OS9NiA=QL6rv4T">
-                                <field name="NUM">320</field>
-                              </shadow>
-                            </value>
-                            <value name="POSY">
-                              <shadow type="math_number" id="W5`Z^#!0NFvY!R4Grlh1">
-                                <field name="NUM">240</field>
-                              </shadow>
-                            </value>
-                          </block>
-                        </value>
-                        <value name="COLOR">
+                        <value name="rgb_value">
                           <block type="ai_lcd_rgb_value_input" id="xP^aX^Bd~{68s4LtLzUF">
                             <value name="rgb_value_r">
                               <shadow type="math_number" id="[GbDEu+p=wo]$67SvqU}">
@@ -308,38 +221,9 @@
                       </block>
                     </value>
                     <statement name="DO3">
-                      <block type="ai_lcd_ractanglecarvas" id="?Dx.+BSFbvyQ#rL$!+t}">
+                      <block type="ai_lcd_fill_screen_with_rgb" id="W`ZOn8$($k7P79W7r8C`">
                         <field name="varitem">canvas</field>
-                        <field name="rect_type">fillrect</field>
-                        <value name="POSA">
-                          <block type="lcd_set_position" id="1L;8x*qDD;UpNe360O(w">
-                            <value name="POSX">
-                              <shadow type="math_number" id="DpC/b2schr}v=)9Eqw(~">
-                                <field name="NUM">0</field>
-                              </shadow>
-                            </value>
-                            <value name="POSY">
-                              <shadow type="math_number" id="8_rf*Lup3ea.I8hvpK(V">
-                                <field name="NUM">0</field>
-                              </shadow>
-                            </value>
-                          </block>
-                        </value>
-                        <value name="POSB">
-                          <block type="lcd_set_position" id="[_jJ7L(02slmnkgi52=)">
-                            <value name="POSX">
-                              <shadow type="math_number" id="nj*^,(..c3H%43|1!I?^">
-                                <field name="NUM">320</field>
-                              </shadow>
-                            </value>
-                            <value name="POSY">
-                              <shadow type="math_number" id="vunr{Q,WR`MAqA`LRKQh">
-                                <field name="NUM">240</field>
-                              </shadow>
-                            </value>
-                          </block>
-                        </value>
-                        <value name="COLOR">
+                        <value name="rgb_value">
                           <block type="ai_lcd_rgb_value_input" id="r*4cPP?`(@beIXNZg{?l">
                             <value name="rgb_value_r">
                               <shadow type="math_number" id="+Z|ms,8vGfz%T=QBX|U)">

+ 126 - 0
src/renderer/cocoblockly-x/src/python/扩展/LED灯带.xml

@@ -0,0 +1,126 @@
+<xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
+  <block type="esp32_main_controller_led_strip_setup" id="gm~U#S|%MaN9emR,*fW|" x="649" y="-25">
+    <field name="varitem">STRIP</field>
+    <value name="io">
+      <shadow type="math_number" id="%m+AB`wH{F1[rKNHLZQ;">
+        <field name="NUM">1</field>
+      </shadow>
+    </value>
+    <value name="count">
+      <shadow type="math_number" id=")toaG|~]+7/JmCx3kLIc">
+        <field name="NUM">16</field>
+      </shadow>
+    </value>
+    <next>
+      <block type="controls_repeat_forever" id="qlxQn*yB)hl*hqP.DtEA">
+        <statement name="DO">
+          <block type="controls_for" id="s:p8r{rpc{Pj,bkQ|tc}">
+            <field name="VAR">i</field>
+            <value name="FROM">
+              <shadow type="math_number" id="G!FB7vnz#ze}:(4~Kj#J">
+                <field name="NUM">1</field>
+              </shadow>
+            </value>
+            <value name="TO">
+              <shadow type="math_number" id="f|X3EUJuy=rR/Jk.1H)r">
+                <field name="NUM">15</field>
+              </shadow>
+            </value>
+            <value name="BY">
+              <shadow type="math_number" id="jf4BqB`}V{v.o5c^:XO{">
+                <field name="NUM">1</field>
+              </shadow>
+            </value>
+            <statement name="DO">
+              <block type="esp32_main_controller_led_strip_set" id="_}(44TwY+a*,$F7cvb}y">
+                <field name="varitem">STRIP</field>
+                <value name="location">
+                  <shadow type="math_number" id="3C)Ej^/-0`z,H5X?CzD}">
+                    <field name="NUM">1</field>
+                  </shadow>
+                  <block type="variables_get" id="VJ^Ede3~M9}Jx4fbfZtW">
+                    <field name="VAR">i</field>
+                  </block>
+                </value>
+                <value name="color">
+                  <block type="led_strip_color_rgb" id="]3#hvB$!JBZM]`(d*FU4">
+                    <value name="rgb_value_r">
+                      <shadow type="math_number" id="di0_.$,n4@]fPPCddm.b">
+                        <field name="NUM">0</field>
+                      </shadow>
+                      <block type="math_random_int" id="xw@($En.{FhC~^gm[Ia+">
+                        <value name="FROM">
+                          <shadow type="math_number" id="poq2lXN5Ej.OeUtOS[cf">
+                            <field name="NUM">1</field>
+                          </shadow>
+                        </value>
+                        <value name="TO">
+                          <shadow type="math_number" id="vZQW_F[(Z:a4Yf@Wr:rS">
+                            <field name="NUM">100</field>
+                          </shadow>
+                        </value>
+                      </block>
+                    </value>
+                    <value name="rgb_value_g">
+                      <shadow type="math_number" id="SM(x_sDUOAZy?8QObNHB">
+                        <field name="NUM">0</field>
+                      </shadow>
+                      <block type="math_random_int" id="pQs@|z8(ji$5FF4jmw%?">
+                        <value name="FROM">
+                          <shadow type="math_number" id="R7qf_NX0=.4]8(7[%ybf">
+                            <field name="NUM">1</field>
+                          </shadow>
+                        </value>
+                        <value name="TO">
+                          <shadow type="math_number" id="aV5~:,m%B?GxCS@=7_4b">
+                            <field name="NUM">100</field>
+                          </shadow>
+                        </value>
+                      </block>
+                    </value>
+                    <value name="rgb_value_b">
+                      <shadow type="math_number" id="~0eKBf{_fwyi#*H5/-uA">
+                        <field name="NUM">0</field>
+                      </shadow>
+                      <block type="math_random_int" id="=PY3@z=+,si4~~jrY5e?">
+                        <value name="FROM">
+                          <shadow type="math_number" id="iQ8|269Tk(^9]?#,W#]4">
+                            <field name="NUM">1</field>
+                          </shadow>
+                        </value>
+                        <value name="TO">
+                          <shadow type="math_number" id="3RxD2p08?drgev6c(AqS">
+                            <field name="NUM">100</field>
+                          </shadow>
+                        </value>
+                      </block>
+                    </value>
+                  </block>
+                </value>
+                <value name="brightness">
+                  <shadow type="math_number" id="(/aVBle(*f9Xk4zK_LVm">
+                    <field name="NUM">50</field>
+                  </shadow>
+                </value>
+                <next>
+                  <block type="led_strip_show_above" id="snkH+2yoI?7p@~6o!$8h">
+                    <field name="varitem">STRIP</field>
+                    <next>
+                      <block type="time_delay" id="mnv]nM5f2iic?#`B95(v">
+                        <value name="DELAY_TIME_MILI">
+                          <block type="math_number" id="e@I^d%limJk6VSV,WwjZ">
+                            <field name="NUM">100</field>
+                          </block>
+                        </value>
+                      </block>
+                    </next>
+                  </block>
+                </next>
+              </block>
+            </statement>
+          </block>
+        </statement>
+      </block>
+    </next>
+  </block>
+</xml>

+ 221 - 0
src/renderer/cocoblockly-x/src/python/扩展/呼吸灯.xml

@@ -0,0 +1,221 @@
+<xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
+  <block type="esp32_main_controller_led_strip_setup" id="gm~U#S|%MaN9emR,*fW|" x="649" y="-25">
+    <field name="varitem">STRIP</field>
+    <field name="value_io">1</field>
+    <value name="count">
+      <shadow type="math_number" id=")toaG|~]+7/JmCx3kLIc">
+        <field name="NUM">16</field>
+      </shadow>
+    </value>
+    <next>
+      <block type="controls_repeat_forever" id="qlxQn*yB)hl*hqP.DtEA">
+        <statement name="DO">
+          <block type="controls_for" id="taVp:NmpMpC:q4S2hq@v">
+            <field name="VAR">j</field>
+            <value name="FROM">
+              <shadow type="math_number" id="w%*MUuD:,zPGTRRqxIt5">
+                <field name="NUM">1</field>
+              </shadow>
+            </value>
+            <value name="TO">
+              <shadow type="math_number" id="e9*m6%18YO1P:G#b7kYJ">
+                <field name="NUM">100</field>
+              </shadow>
+            </value>
+            <value name="BY">
+              <shadow type="math_number" id="$6}D,,q#9)s.l]B5E)qV">
+                <field name="NUM">10</field>
+              </shadow>
+            </value>
+            <statement name="DO">
+              <block type="time_delay" id="mnv]nM5f2iic?#`B95(v">
+                <value name="DELAY_TIME_MILI">
+                  <block type="math_number" id="e@I^d%limJk6VSV,WwjZ">
+                    <field name="NUM">50</field>
+                  </block>
+                </value>
+                <next>
+                  <block type="controls_for" id="s:p8r{rpc{Pj,bkQ|tc}">
+                    <field name="VAR">i</field>
+                    <value name="FROM">
+                      <shadow type="math_number" id="G!FB7vnz#ze}:(4~Kj#J">
+                        <field name="NUM">1</field>
+                      </shadow>
+                    </value>
+                    <value name="TO">
+                      <shadow type="math_number" id="f|X3EUJuy=rR/Jk.1H)r">
+                        <field name="NUM">16</field>
+                      </shadow>
+                    </value>
+                    <value name="BY">
+                      <shadow type="math_number" id="jf4BqB`}V{v.o5c^:XO{">
+                        <field name="NUM">1</field>
+                      </shadow>
+                    </value>
+                    <statement name="DO">
+                      <block type="esp32_main_controller_led_strip_set" id="_}(44TwY+a*,$F7cvb}y">
+                        <field name="varitem">STRIP</field>
+                        <value name="location">
+                          <shadow type="math_number" id="3C)Ej^/-0`z,H5X?CzD}">
+                            <field name="NUM">1</field>
+                          </shadow>
+                          <block type="variables_get" id="VJ^Ede3~M9}Jx4fbfZtW">
+                            <field name="VAR">i</field>
+                          </block>
+                        </value>
+                        <value name="color">
+                          <block type="led_strip_color_rgb" id="]3#hvB$!JBZM]`(d*FU4">
+                            <value name="rgb_value_r">
+                              <shadow type="math_number" id="di0_.$,n4@]fPPCddm.b">
+                                <field name="NUM">0</field>
+                              </shadow>
+                            </value>
+                            <value name="rgb_value_g">
+                              <shadow type="math_number" id="SM(x_sDUOAZy?8QObNHB">
+                                <field name="NUM">255</field>
+                              </shadow>
+                            </value>
+                            <value name="rgb_value_b">
+                              <shadow type="math_number" id="~0eKBf{_fwyi#*H5/-uA">
+                                <field name="NUM">0</field>
+                              </shadow>
+                            </value>
+                          </block>
+                        </value>
+                        <value name="brightness">
+                          <shadow type="math_number" id="(/aVBle(*f9Xk4zK_LVm">
+                            <field name="NUM">50</field>
+                          </shadow>
+                          <block type="variables_get" id="/i#nclqALT.epob^l~7A">
+                            <field name="VAR">j</field>
+                          </block>
+                        </value>
+                        <next>
+                          <block type="led_strip_show_above" id="snkH+2yoI?7p@~6o!$8h">
+                            <field name="varitem">STRIP</field>
+                          </block>
+                        </next>
+                      </block>
+                    </statement>
+                  </block>
+                </next>
+              </block>
+            </statement>
+            <next>
+              <block type="time_delay" id="]Qj}9K1E0Vglv4gs4qzp">
+                <value name="DELAY_TIME_MILI">
+                  <block type="math_number" id="F[BWgW?]ywsh-s|ZQh@w">
+                    <field name="NUM">500</field>
+                  </block>
+                </value>
+                <next>
+                  <block type="controls_for" id="t+e^jjU?RswKwUV6`|w5">
+                    <field name="VAR">k</field>
+                    <value name="FROM">
+                      <shadow type="math_number" id="]~.Plu!U{wm-Guht`D:n">
+                        <field name="NUM">100</field>
+                      </shadow>
+                    </value>
+                    <value name="TO">
+                      <shadow type="math_number" id="OYJ$G4q{Q@L~o39kYZ#p">
+                        <field name="NUM">0</field>
+                      </shadow>
+                    </value>
+                    <value name="BY">
+                      <shadow type="math_number" id="|lY);+*7-;t#Pm(IwNW;">
+                        <field name="NUM">10</field>
+                      </shadow>
+                    </value>
+                    <statement name="DO">
+                      <block type="time_delay" id="bb-w0bvQO{+SlxPNs%7t">
+                        <value name="DELAY_TIME_MILI">
+                          <block type="math_number" id="g|,!$.MA}zlBd]@foMC9">
+                            <field name="NUM">50</field>
+                          </block>
+                        </value>
+                        <next>
+                          <block type="controls_for" id="H?IhSuIqtV-rU]|onF0(">
+                            <field name="VAR">i</field>
+                            <value name="FROM">
+                              <shadow type="math_number" id="hmjWL`D-T9MWI2zv}HGa">
+                                <field name="NUM">16</field>
+                              </shadow>
+                            </value>
+                            <value name="TO">
+                              <shadow type="math_number" id=":n4Bl7Y:`b=ey]_4846W">
+                                <field name="NUM">1</field>
+                              </shadow>
+                            </value>
+                            <value name="BY">
+                              <shadow type="math_number" id="I-#LJ4`f9CB.Zc9f]50+">
+                                <field name="NUM">1</field>
+                              </shadow>
+                            </value>
+                            <statement name="DO">
+                              <block type="esp32_main_controller_led_strip_set" id="L!D?RJ|%Rhob6:3]LvDs">
+                                <field name="varitem">STRIP</field>
+                                <value name="location">
+                                  <shadow type="math_number" id="3C)Ej^/-0`z,H5X?CzD}">
+                                    <field name="NUM">1</field>
+                                  </shadow>
+                                  <block type="variables_get" id="k}6tzC*7iial/i^S3!8e">
+                                    <field name="VAR">i</field>
+                                  </block>
+                                </value>
+                                <value name="color">
+                                  <block type="led_strip_color_rgb" id="dN==y_%@#^?HL|QW/W#P">
+                                    <value name="rgb_value_r">
+                                      <shadow type="math_number" id="#t[!{(`@Q(#:rp)|V|to">
+                                        <field name="NUM">0</field>
+                                      </shadow>
+                                    </value>
+                                    <value name="rgb_value_g">
+                                      <shadow type="math_number" id=")Kx+1(oQ,P]d,aAV(8DD">
+                                        <field name="NUM">255</field>
+                                      </shadow>
+                                    </value>
+                                    <value name="rgb_value_b">
+                                      <shadow type="math_number" id="NUS-M$EO3_gnNR_{7n8p">
+                                        <field name="NUM">0</field>
+                                      </shadow>
+                                    </value>
+                                  </block>
+                                </value>
+                                <value name="brightness">
+                                  <shadow type="math_number" id="|tPJMMg+FW2ZRUfTn.^{">
+                                    <field name="NUM">50</field>
+                                  </shadow>
+                                  <block type="variables_get" id="I(h*@MH!hq.~;xh0OKwC">
+                                    <field name="VAR">k</field>
+                                  </block>
+                                </value>
+                                <next>
+                                  <block type="led_strip_show_above" id="rM#8IC(41Y!rg0oW.nS%">
+                                    <field name="varitem">STRIP</field>
+                                  </block>
+                                </next>
+                              </block>
+                            </statement>
+                          </block>
+                        </next>
+                      </block>
+                    </statement>
+                    <next>
+                      <block type="time_delay" id="[l(VM7Xao:hg`gudH6_H">
+                        <value name="DELAY_TIME_MILI">
+                          <block type="math_number" id="]-jFR`c$e3S0?;U+Mu7]">
+                            <field name="NUM">500</field>
+                          </block>
+                        </value>
+                      </block>
+                    </next>
+                  </block>
+                </next>
+              </block>
+            </next>
+          </block>
+        </statement>
+      </block>
+    </next>
+  </block>
+</xml>

+ 44 - 0
src/renderer/cocoblockly-x/src/python/扩展/蜂鸣器.xml

@@ -0,0 +1,44 @@
+<xml xmlns="http://www.w3.org/1999/xhtml" type="IoT">
+  <block type="esp32_main_controller_set_buzzer_init" id="80hoE9[FkF5{ZBF:e2q{" x="393" y="154">
+    <field name="notes">0</field>
+    <next>
+      <block type="controls_repeat_ext" id="Ih{j;)NSu2V7xnl*@=Yt">
+        <value name="TIMES">
+          <shadow type="math_number" id="z+.2Jh*4,7XifbFwfbfx">
+            <field name="NUM">3</field>
+          </shadow>
+        </value>
+        <statement name="DO">
+          <block type="esp32_main_controller_set_buzzer" id="tZ[LNL;|$ad!c/3@LJX|">
+            <field name="notes">0</field>
+            <field name="esp32_var_num">31</field>
+            <next>
+              <block type="time_delay" id=")Ia12X-l-QNesm%A:](_">
+                <value name="DELAY_TIME_MILI">
+                  <block type="math_number" id="wsiW}WwW?]hU;j*p%;k6">
+                    <field name="NUM">1000</field>
+                  </block>
+                </value>
+                <next>
+                  <block type="esp32_main_controller_set_buzzer" id="?J1~p?)?q!_$HWCc%,/^">
+                    <field name="notes">0</field>
+                    <field name="esp32_var_num">10000</field>
+                    <next>
+                      <block type="time_delay" id="j=-wxvcur=bB^~AwP]wS">
+                        <value name="DELAY_TIME_MILI">
+                          <block type="math_number" id="dx$,xdu0aYbKEYM3[1Mc">
+                            <field name="NUM">1000</field>
+                          </block>
+                        </value>
+                      </block>
+                    </next>
+                  </block>
+                </next>
+              </block>
+            </next>
+          </block>
+        </statement>
+      </block>
+    </next>
+  </block>
+</xml>

+ 118 - 149
src/renderer/cocoblockly-x/src/python/讯飞/情绪识别.xml

@@ -21,197 +21,166 @@
               </block>
             </value>
             <next>
-              <block type="ai_online_emotion_init" id="c4r:83mEPb0M?g~BL,BL">
+              <block type="ai_online_emotion_init" id="6hEm@Slaw+;3j@_Bxl*Y">
+                <field name="varitem">emotion_recognize_result</field>
+                <value name="path">
+                  <block type="text_dict" id="?VYlEk-{kXcuGbMggf{2">
+                    <field name="TEXT">"age":"", "emotion":"", "gender":"", "expression":""</field>
+                  </block>
+                </value>
                 <next>
-                  <block type="variables_set" id="PfIk~g+JE9,OQ,sqV_.`">
-                    <field name="VAR">emotion_recognize_result</field>
+                  <block type="variables_set" id="U7CVgUeDC:[Q(kYzwzv-">
+                    <field name="VAR">state</field>
                     <value name="VALUE">
-                      <shadow type="math_number" id="L1lDl|T$HyH!Oa$e32e=">
+                      <shadow type="math_number" id="mus9wVuMr+fcm1qg@/4c">
                         <field name="NUM">0</field>
                       </shadow>
-                      <block type="dict_create_with_items_insert" id="Sphx_7VYXW::lSKh?vfB">
-                        <mutation items="4"></mutation>
-                        <field name="KEY0">age</field>
-                        <field name="KEY1">emotion</field>
-                        <field name="KEY2">gender</field>
-                        <field name="KEY3">expression</field>
-                        <value name="ADD0">
-                          <block type="text" id="m6)O$lN1^u}tD*-9qW+g">
-                            <field name="TEXT"></field>
-                          </block>
-                        </value>
-                        <value name="ADD1">
-                          <block type="text" id="U|`[5Jn.}iCRrPE.wG=Q">
-                            <field name="TEXT"></field>
-                          </block>
-                        </value>
-                        <value name="ADD2">
-                          <block type="text" id="/qHaCZNGpzj_jx#XN7B!">
-                            <field name="TEXT"></field>
-                          </block>
-                        </value>
-                        <value name="ADD3">
-                          <block type="text" id="[[V5%K673vRyftati7Dy">
-                            <field name="TEXT"></field>
-                          </block>
-                        </value>
+                      <block type="text" id="]k@CQW7K)k5n`XjW_m:V">
+                        <field name="TEXT"></field>
                       </block>
                     </value>
                     <next>
-                      <block type="variables_set" id="U7CVgUeDC:[Q(kYzwzv-">
-                        <field name="VAR">state</field>
-                        <value name="VALUE">
-                          <shadow type="math_number" id="mus9wVuMr+fcm1qg@/4c">
-                            <field name="NUM">0</field>
-                          </shadow>
-                          <block type="text" id="]k@CQW7K)k5n`XjW_m:V">
-                            <field name="TEXT"></field>
-                          </block>
-                        </value>
+                      <block type="procedures_callnoreturn" id="#|J@-9Y/6L0KGb42+Z?b">
+                        <mutation name="connect_wifi_network"></mutation>
                         <next>
-                          <block type="procedures_callnoreturn" id="#|J@-9Y/6L0KGb42+Z?b">
-                            <mutation name="connect_wifi_network"></mutation>
-                            <next>
-                              <block type="controls_repeat_forever" id="PG.b9?agjAbFGi)W$h8Q">
-                                <statement name="DO">
-                                  <block type="variables_set" id="U[qT/|r8}7``,N`vk6?J">
-                                    <field name="VAR">canvas</field>
-                                    <value name="VALUE">
-                                      <shadow type="math_number" id="%CW!*Owz+{eafwR7.CU_">
-                                        <field name="NUM">0</field>
-                                      </shadow>
-                                      <block type="ai_camera_snapshot" id="-JAPBQuzh[!ohjs10zcD"></block>
+                          <block type="controls_repeat_forever" id="PG.b9?agjAbFGi)W$h8Q">
+                            <statement name="DO">
+                              <block type="variables_set" id="U[qT/|r8}7``,N`vk6?J">
+                                <field name="VAR">canvas</field>
+                                <value name="VALUE">
+                                  <shadow type="math_number" id="%CW!*Owz+{eafwR7.CU_">
+                                    <field name="NUM">0</field>
+                                  </shadow>
+                                  <block type="ai_camera_snapshot" id="-JAPBQuzh[!ohjs10zcD"></block>
+                                </value>
+                                <next>
+                                  <block type="controls_if" id=",-Z^afYHp4dzq|NvC92k">
+                                    <mutation elseif="3"></mutation>
+                                    <value name="IF0">
+                                      <block type="ai_v831_button_read_pressed" id="c:M!RF$#AS0X2O~+*!+M">
+                                        <field name="button_type">C</field>
+                                      </block>
                                     </value>
-                                    <next>
-                                      <block type="controls_if" id=",-Z^afYHp4dzq|NvC92k">
-                                        <mutation elseif="3"></mutation>
-                                        <value name="IF0">
-                                          <block type="ai_v831_button_read_pressed" id="c:M!RF$#AS0X2O~+*!+M">
-                                            <field name="button_type">C</field>
+                                    <statement name="DO0">
+                                      <block type="controls_whileUntil" id="=%;fL`|w:K6IQ)c7qGg=">
+                                        <field name="MODE">UNTIL</field>
+                                        <value name="BOOL">
+                                          <block type="ai_v831_button_read_released" id="XKOd`Z6R*.SZUjXd!k9}">
+                                            <field name="button_type_released">C</field>
                                           </block>
                                         </value>
-                                        <statement name="DO0">
-                                          <block type="controls_whileUntil" id="=%;fL`|w:K6IQ)c7qGg=">
-                                            <field name="MODE">UNTIL</field>
-                                            <value name="BOOL">
-                                              <block type="ai_v831_button_read_released" id="XKOd`Z6R*.SZUjXd!k9}">
-                                                <field name="button_type_released">C</field>
+                                        <statement name="DO">
+                                          <block type="time_delay" id="Fbs4)WBJ)y)}?Rp*G=`b">
+                                            <value name="DELAY_TIME_MILI">
+                                              <block type="math_number" id="ImlIsf[@b~cFX6RJ]fL=">
+                                                <field name="NUM">100</field>
                                               </block>
                                             </value>
-                                            <statement name="DO">
-                                              <block type="time_delay" id="Fbs4)WBJ)y)}?Rp*G=`b">
-                                                <value name="DELAY_TIME_MILI">
-                                                  <block type="math_number" id="ImlIsf[@b~cFX6RJ]fL=">
-                                                    <field name="NUM">100</field>
-                                                  </block>
-                                                </value>
-                                              </block>
-                                            </statement>
-                                            <next>
-                                              <block type="procedures_callnoreturn" id="{@?wpsNPFIpm|2wQddc#">
-                                                <mutation name="take_picture"></mutation>
-                                              </block>
-                                            </next>
                                           </block>
                                         </statement>
-                                        <value name="IF1">
-                                          <block type="logic_compare" id="@|w)V?eHg{yu_*?ysv]+">
-                                            <field name="OP">EQ</field>
-                                            <value name="A">
-                                              <block type="variables_get" id="~w!g:,Ni@VXj5[yTu{~V">
-                                                <field name="VAR">state</field>
-                                              </block>
-                                            </value>
-                                            <value name="B">
-                                              <block type="text" id="7{0Qj-3.CJ%*RWZajbpA">
-                                                <field name="TEXT">拍照發送</field>
-                                              </block>
-                                            </value>
+                                        <next>
+                                          <block type="procedures_callnoreturn" id="{@?wpsNPFIpm|2wQddc#">
+                                            <mutation name="take_picture"></mutation>
+                                          </block>
+                                        </next>
+                                      </block>
+                                    </statement>
+                                    <value name="IF1">
+                                      <block type="logic_compare" id="@|w)V?eHg{yu_*?ysv]+">
+                                        <field name="OP">EQ</field>
+                                        <value name="A">
+                                          <block type="variables_get" id="~w!g:,Ni@VXj5[yTu{~V">
+                                            <field name="VAR">state</field>
                                           </block>
                                         </value>
-                                        <statement name="DO1">
-                                          <block type="procedures_callnoreturn" id="2T@O`6V,1HGtHNVYWS$f">
-                                            <mutation name="send_picture"></mutation>
+                                        <value name="B">
+                                          <block type="text" id="7{0Qj-3.CJ%*RWZajbpA">
+                                            <field name="TEXT">拍照發送</field>
                                           </block>
-                                        </statement>
-                                        <value name="IF2">
-                                          <block type="logic_operation" id="zy`u#ic9qOm+IMSTw^nn">
-                                            <field name="OP">OR</field>
+                                        </value>
+                                      </block>
+                                    </value>
+                                    <statement name="DO1">
+                                      <block type="procedures_callnoreturn" id="2T@O`6V,1HGtHNVYWS$f">
+                                        <mutation name="send_picture"></mutation>
+                                      </block>
+                                    </statement>
+                                    <value name="IF2">
+                                      <block type="logic_operation" id="zy`u#ic9qOm+IMSTw^nn">
+                                        <field name="OP">OR</field>
+                                        <value name="A">
+                                          <block type="logic_compare" id="@Y~t_cpg=ZcR$2yL-Na#">
+                                            <field name="OP">EQ</field>
                                             <value name="A">
-                                              <block type="logic_compare" id="@Y~t_cpg=ZcR$2yL-Na#">
-                                                <field name="OP">EQ</field>
-                                                <value name="A">
-                                                  <block type="variables_get" id="6gza6}TN5:OSa4fNJ7qf">
-                                                    <field name="VAR">state</field>
-                                                  </block>
-                                                </value>
-                                                <value name="B">
-                                                  <block type="text" id="RWzw/1YPcx05w]6o)aq8">
-                                                    <field name="TEXT">識別超時</field>
-                                                  </block>
-                                                </value>
+                                              <block type="variables_get" id="6gza6}TN5:OSa4fNJ7qf">
+                                                <field name="VAR">state</field>
                                               </block>
                                             </value>
                                             <value name="B">
-                                              <block type="logic_compare" id="-vc7UB|3uX7jf6Y*8sM[">
-                                                <field name="OP">EQ</field>
-                                                <value name="A">
-                                                  <block type="variables_get" id="{pg+4yxgwC(/hJ4}ulDS">
-                                                    <field name="VAR">state</field>
-                                                  </block>
-                                                </value>
-                                                <value name="B">
-                                                  <block type="text" id="^Vth@q9Z`$X-_gclEbKy">
-                                                    <field name="TEXT">識別失敗</field>
-                                                  </block>
-                                                </value>
+                                              <block type="text" id="RWzw/1YPcx05w]6o)aq8">
+                                                <field name="TEXT">識別超時</field>
                                               </block>
                                             </value>
                                           </block>
                                         </value>
-                                        <statement name="DO2">
-                                          <block type="procedures_callnoreturn" id="CeAIl=Q*oq){{^%^Nf_(">
-                                            <mutation name="emotion_recognize_failure">
-                                              <arg name="failure_state"></arg>
-                                            </mutation>
-                                            <value name="ARG0">
-                                              <block type="variables_get" id="c~3nEb;T5/O.SZ(k^kj(">
-                                                <field name="VAR">state</field>
-                                              </block>
-                                            </value>
-                                          </block>
-                                        </statement>
-                                        <value name="IF3">
-                                          <block type="logic_compare" id="~g,]^OtBk#wdj^yic,zd">
+                                        <value name="B">
+                                          <block type="logic_compare" id="-vc7UB|3uX7jf6Y*8sM[">
                                             <field name="OP">EQ</field>
                                             <value name="A">
-                                              <block type="variables_get" id="Z?1a8H%S#RkcuZ$6S6W7">
+                                              <block type="variables_get" id="{pg+4yxgwC(/hJ4}ulDS">
                                                 <field name="VAR">state</field>
                                               </block>
                                             </value>
                                             <value name="B">
-                                              <block type="text" id="N!%{}ftin$83b$j%PX:$">
-                                                <field name="TEXT">識別成功</field>
+                                              <block type="text" id="^Vth@q9Z`$X-_gclEbKy">
+                                                <field name="TEXT">識別失敗</field>
                                               </block>
                                             </value>
                                           </block>
                                         </value>
-                                        <statement name="DO3">
-                                          <block type="procedures_callnoreturn" id="203XwBqw~Rry(G+8dnGF">
-                                            <mutation name="emotion_recognize_success"></mutation>
+                                      </block>
+                                    </value>
+                                    <statement name="DO2">
+                                      <block type="procedures_callnoreturn" id="CeAIl=Q*oq){{^%^Nf_(">
+                                        <mutation name="emotion_recognize_failure">
+                                          <arg name="failure_state"></arg>
+                                        </mutation>
+                                        <value name="ARG0">
+                                          <block type="variables_get" id="c~3nEb;T5/O.SZ(k^kj(">
+                                            <field name="VAR">state</field>
                                           </block>
-                                        </statement>
-                                        <next>
-                                          <block type="ai_lcd_showcarvas_set_display" id="}(:#512VNo8M*^OG%wEy">
-                                            <field name="varitem">canvas</field>
+                                        </value>
+                                      </block>
+                                    </statement>
+                                    <value name="IF3">
+                                      <block type="logic_compare" id="~g,]^OtBk#wdj^yic,zd">
+                                        <field name="OP">EQ</field>
+                                        <value name="A">
+                                          <block type="variables_get" id="Z?1a8H%S#RkcuZ$6S6W7">
+                                            <field name="VAR">state</field>
                                           </block>
-                                        </next>
+                                        </value>
+                                        <value name="B">
+                                          <block type="text" id="N!%{}ftin$83b$j%PX:$">
+                                            <field name="TEXT">識別成功</field>
+                                          </block>
+                                        </value>
+                                      </block>
+                                    </value>
+                                    <statement name="DO3">
+                                      <block type="procedures_callnoreturn" id="203XwBqw~Rry(G+8dnGF">
+                                        <mutation name="emotion_recognize_success"></mutation>
+                                      </block>
+                                    </statement>
+                                    <next>
+                                      <block type="ai_lcd_showcarvas_set_display" id="}(:#512VNo8M*^OG%wEy">
+                                        <field name="varitem">canvas</field>
                                       </block>
                                     </next>
                                   </block>
-                                </statement>
+                                </next>
                               </block>
-                            </next>
+                            </statement>
                           </block>
                         </next>
                       </block>

+ 24 - 8
src/renderer/cocoblockly-x/train_cocopi.html

@@ -895,17 +895,33 @@
                                             onclick="switchSerial('2')">终端显示</span>
                                         <span class="translatable_image_transmission serial-active"
                                             onclick="switchSerial('1')">图传</span>
-                                        <span class="translatable_screenshot serial-active blue" style="color: #ffffff;"
-                                            onclick="getTrainImg()">截图</span>
-                                        <span class="translatable_uploadFiles serial-active blue"
-                                            style="color: #ffffff;" onclick="uploadImg()">上传</span>
                                         <div id="repl_box_content"
                                             style="height: calc(100% - 30px);background: rgb(255, 255, 255);overflow-y: auto;display: none;">
                                         </div>
-                                        <div style="width: 100%;height: calc(100% - 30px);overflow-y: auto;background: rgb(255, 255, 255);position: relative;"
-                                            id="image_transmission">
-                                            <!-- <img id="image_transmission_canvas" style="width:100%;"> -->
-                                            <canvas id="image_transmission_canvas" style="width:100%;height:100%">
+                                        <div
+                                            style="display: flex;flex-direction: row;justify-content: center;align-items: center;height: 89%;background: rgb(255, 255, 255);">
+                                            <div style="width: 320px;height: 240px;background: rgb(255, 255, 255);"
+                                                id="image_transmission">
+                                                <!-- <img id="image_transmission_canvas" style="width:100%;"> -->
+                                                <canvas id="image_transmission_canvas" style="width:100%;height:100%">
+                                            </div>
+                                            <div
+                                                style="height: 240px;display: flex;flex-direction: column;justify-content: flex-end;margin-left: 10px;">
+                                                <span id="training_screenshot"
+                                                    class="translatable_screenshot serial-active blue"
+                                                    style="color: #ffffff;right: 50%;border-bottom-left-radius: 8px;border-bottom-right-radius: 8px;display: none;"
+                                                    onclick="getTrainImg()">截图</span>
+                                                <div style="display: flex;flex-direction:row;">
+                                                    <span id="training_upload"
+                                                        class="translatable_uploadFiles serial-active blue"
+                                                        style="color: #ffffff;right: 44%;border-bottom-left-radius: 8px;border-bottom-right-radius: 8px;display: none;"
+                                                        onclick="uploadImg()">上传</span>
+                                                    <span id="training_cancel"
+                                                        class="translatable_cancel serial-active blue"
+                                                        style="color: #ffffff;border-bottom-left-radius: 8px;border-bottom-right-radius: 8px;margin-left: 10px;display: none;"
+                                                        onclick="cancelImg()">取消</span>
+                                                </div>
+                                            </div>
                                         </div>
                                     </div>
                                 </div>

+ 23 - 2
src/renderer/cocoblockly-x/train_cocopi.js

@@ -1949,6 +1949,15 @@ function showServal(_data) {
       canImage.src = _data;
       canImage.onload = () => {
         canvasImg.drawImage(canImage, 0, 0, 300, 150)
+        $("#training_screenshot").css({
+          "display": "block"
+        })
+        $("#training_upload").css({
+          "display": "none"
+        })
+        $("#training_cancel").css({
+          "display": "none"
+        })
       }
     }
     catch (e) {
@@ -1959,6 +1968,15 @@ function showServal(_data) {
       canImage.src = newStr;
       canImage.onload = () => {
         canvasImg.drawImage(canImage, 0, 0, 300, 150)
+        $("#training_screenshot").css({
+          "display": "none"
+        })
+        $("#training_upload").css({
+          "display": "block"
+        })
+        $("#training_cancel").css({
+          "display": "block"
+        })
       }
     }
     catch (e) {
@@ -2218,9 +2236,9 @@ function convertBase64UrlToBlob(urlData) {
     ia[i] = bytes.charCodeAt(i);
   }
 
-  var blob = new Blob([ab], { type: 'image/png' })
+  var blob = new Blob([ab], { type: 'image/jpg' })
 
-  var newFile = new File([blob], "image" + screenIndex + ".png", { type: 'image/png', lastModified: Date.now() });
+  var newFile = new File([blob], "image" + screenIndex + ".jpg", { type: 'image/jpg', lastModified: Date.now() });
 
   return newFile;
 }
@@ -2241,4 +2259,7 @@ function uploadImg() {
     }
   });
   isScreenshot = false
+}
+function cancelImg() {
+  isScreenshot = false
 }

+ 180 - 2
src/renderer/cocoblockly-x/update.json

@@ -1,5 +1,184 @@
 {
     "updateNew":{
+        "time":"2023-08-01",
+        "zhHans":{
+            "blocks":[
+                "添加发送一代和二代串口积木",
+                "添加aprilTag检测和结果积木",
+                "添加条形码检测和结果积木",
+                "添加thingspeak相关积木",
+                "添加HTTP 请求相关积木",
+                "情绪识别初始化积木优化",
+                "积木在线api appid统一"
+            ],
+            "example":[
+                "条形码识别样例",
+                "寻找蓝色区域并追踪",
+                "自我学习采集",
+                "自我学习识别"
+            ],
+            "note":[
+                "云端存储样式修改",
+                "导航栏添加分享按钮",
+                "程序截图优化",
+                "串口打印问题处理"
+            ]
+        },
+        "zhHant":{
+            "blocks":[
+                "添加發送一代和二代串口積木",
+                "添加aprilTag檢測和結果積木",
+                "添加條形碼檢測和結果積木",
+                "添加thingspeak相關積木",
+                "添加HTTP 請求相關積木",
+                "情緒識別初始化積木優化",
+                "積木在線api appid統一"
+            ],
+            "example":[
+                "條形碼識別樣例",
+                "尋找藍色區域並追蹤",
+                "自我學習採集",
+                "自我學習識別"
+            ],
+            "note":[
+                "雲端存儲樣式修改",
+                "導航欄添加分享按鈕",
+                "程序截圖優化",
+                "串口打印問題處理"
+            ]
+        },
+        "en":{
+            "blocks":[
+                "Adding Send I and II Serial Port Building Blocks",
+                "Add aprilTag Detection and Results Building Blocks",
+                "Adding Barcode Detection and Results Building Blocks",
+                "Add thingspeak related blocks",
+                "Adding HTTP request related building blocks",
+                "Emotion recognition initialization building block optimization",
+                "Jackpot online api appid harmonization"
+            ],
+            "example":[
+                "Barcode Recognition Sample",
+                "Find the blue zone and track it.",
+                "Self-Learning Acquisition",
+                "Self-learning recognition"
+            ],
+            "note":[
+                "Cloud Storage Style Modification",
+                "Add share buttons to the navigation bar",
+                "Program screenshot optimization",
+                "Serial Printing Troubleshooting"
+            ]
+        }
+    },
+    "updateOld":[{
+        "time":"2023-07-01",
+        "zhHans":{
+            "blocks":[
+                "添加矩形绘制积木,起始坐标,宽高",
+                "添加人脸采集、人脸识别相关积木",
+                "添加语音录制和识别积木",
+                "添加获取数字信号和模拟信号积木",
+                "添加输出模拟信号和数字信号积木",
+                "添加音视频的结束播放积木",
+                "添加相机图像在网页显示积木",
+                "添加 LED 灯带积木",
+                "添加车牌识别积木",
+                "添加多线程积木",
+                "添加 GRB 灯",
+                "添加颜色识别积木",
+                "添加二维码识别积木",
+                "离线 AI 添加识别结果宽高,中心点坐标",
+                "周期重复计时器"
+            ],
+            "example":[
+                "按钮控制 RGB 灯",
+                "串口通信的收、发",
+                "循线",
+                "二维码识别",
+                "寻找蓝色",
+                "人脸采集和人脸识别",
+                "猜拳手势识别",
+                "语音录制和语音识别",
+                "车牌识别",
+                "LED 灯带"
+            ],
+            "note":[
+                "导航栏添加学习",
+                "云端存储功能添加"
+            ]
+        },
+        "zhHant":{
+            "blocks":[
+                "添加矩形繪製積木,起始座標,寬高",
+                "添加人臉採集、人臉識別相關積木",
+                "添加語音錄製和識別積木",
+                "添加獲取數字信號和模擬信號積木",
+                "添加輸出模擬信號和數字信號積木",
+                "添加音視頻的結束播放積木",
+                "添加相機圖像在網頁顯示積木",
+                "添加 LED 燈帶積木",
+                "添加車牌識別積木",
+                "添加多線程積木",
+                "添加 GRB 燈",
+                "添加顏色識別積木",
+                "添加二維碼識別積木",
+                "離線 AI 添加識別結果寬高,中心點座標",
+                "週期重複計時器"
+            ],
+            "example":[
+                "按鈕控制 RGB 燈",
+                "串口通信的收、發",
+                "循線",
+                "二維碼識別",
+                "尋找藍色",
+                "人臉採集和人臉識別",
+                "猜拳手勢識別",
+                "語音錄製和語音識別",
+                "車牌識別",
+                "LED 燈帶"
+            ],
+            "note":[
+                "導航欄添加學習",
+                "雲端存儲功能添加"
+            ]
+        },
+        "en":{
+            "blocks":[
+                "Add rectangular drawing blocks, starting coordinates, width and height",
+                "Add face capture and face recognition related building blocks",
+                "Add voice recording and recognition building blocks",
+                "Add building blocks for acquiring digital signals and analog signals",
+                "Add output analog and digital signal building blocks",
+                "Add audio and video end play building blocks",
+                "Add camera image display building block on web page",
+                "Add LED strip building block",
+                "Add license plate recognition building block",
+                "Add multi-threaded blocks",
+                "Add GRB Light",
+                "Add Color Recognition Building Block",
+                "Add QR Code Recognition Block",
+                "Offline AI add recognition result width, height, center coordinates",
+                "Cycle Repetition Timer Adding a Periodic Repetition Timer"
+            ],
+            "example":[
+                "Push Button Control RGB Lights",
+                "Receiving and sending of serial communication",
+                "Line Following",
+                "QR code recognition",
+                "Find Blue",
+                "Face Acquisition and Face Recognition",
+                "Guessing Gesture Recognition",
+                "Voice Recording and Voice Recognition",
+                "License plate recognition",
+                "LED Strip"
+            ],
+            "note":[
+                "Navigation bar added for learning",
+                "Cloud storage function added"
+            ]
+        }
+    },{
         "time":"2023-05-05",
         "zhHans":{
             "blocks":[
@@ -61,8 +240,7 @@
                 "Paste and copy across web pages"
             ]
         }
-    },
-    "updateOld":[{
+    },{
         "time":"2023-03-17",
         "zhHans":{
             "blocks":[

+ 67 - 60
src/renderer/cocoblockly-x/web.html

@@ -3,71 +3,78 @@
 
 <head>
     <meta charset="utf-8" />
-    <title>CocoBlockly V – Preview</title>
+    <title>CocoBlockly CocoPi – CocoRobo CocoPi Module</title>
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
     <meta http-equiv="Content-Type" content="text/html; scharset=UTF-8">
     <meta name="theme-color" content="#2C4FCD">
-    <!-- <script src="./webusb.js" type="module"></script> -->
-    <!-- <script type="text/javascript" src="uform.js"></script>
-    <script type="text/javascript" src="libs/jquery-3.3.1.min.js"></script>
-    <script type="text/javascript" src="libs/jquery-ui.min.js"></script>
-    <script type="text/javascript" src="libs/jquery.hotkeys.js"></script>
-    <script type="text/javascript" src="libs/jquery.multi-select.js"></script>
-    <script type="text/javascript" src="//x.cocorobo.cn/src/blockly/web.js"></script> -->
-
-
-    <script type="module">
-
-        import Pl2303WebUsbSerial from './webusb.js';
-        // import { debounce } from '';
-
-        const VENDOR_ID = 0x01000000;
-        const PRODUCT_ID = 0x01000001
-
-        const NUMBER_OF_BYTES_TO_READ = 64;
-        const READ_DEBOUNCE_DELAY_IN_MILLIS = 100;
-
-        let usbDevice;
-
-        // Invoke this function when the user clicked on a button to connect to the USB device. Due to security limitations of
-        // WebUSB, it's required to request the device within the event handler.
-        // E.g. <button onclick="handleConnectButtonClick">Connect to USB device</button>
-        const handleConnectButtonClick = async () => {
-            const device = await navigator.usb.requestDevice({ filters: [{ vendorId: VENDOR_ID, productId: PRODUCT_ID }] });
-            usbDevice = new Pl2303WebUsbSerial(device);
-            await usbDevice.connect();
-            await readUntilSilent();
-        };
-
-        // This function is used to (trivially) batch-process read bytes. To do so, the USB device is read, and the received
-        // bytes are stored in a local buffer. A function is debounced inovked to consume the buffer. After the wait 
-        // (here: 100 ms) the consume function is executed, the buffer is processed and emptied.
-        // Reading from the USB device is done in a loop.
-        const readUntilSilent = async () => {
-            let buffer = new Blob();
-
-            const debouncedConsumeBuffer = debounce(async () => {
-                const array = await buffer.arrayBuffer();
-                console.log(`debounced transfer in: ${new TextDecoder().decode(array)}`);
-                buffer = new Blob();
-            }, READ_DEBOUNCE_DELAY_IN_MILLIS);
-
-            while (usbDevice) {
-                try {
-                    const readout = await usbDevice.read(NUMBER_OF_BYTES_TO_READ);
-                    buffer = new Blob([buffer, readout.data.buffer]);
-                    debouncedConsumeBuffer();
-                } catch (error) {
-                    console.debug(`Readout error: ${error}`, error);
-                }
-            }
+    <style>
+        *{
+            box-sizing: border-box;
+        }
+        body{
+            width: 100%;
+            height: 100vh;
+            margin: 0;
+        }
+        #iframeDiv{
+            display: flex;
+            flex-flow: wrap;
+            /* justify-content: space-evenly; */
+        }
+        #iframeDiv img{
+            width: 25%;
+            /* height: 360px; */
+            padding: 5px;
         }
-        document.getElementById("testclick").onclick = function () { handleConnectButtonClick(); }    
-    </script>
+        input{
+            padding: 7px;
+            font-size: 1rem;
+            outline: none;
+        }
+        button{
+            margin-left: 10px;
+            color: #fff;
+            border: none;
+            border-radius: 2px;
+            display: inline-block;
+            height: 36px;
+            line-height: 36px;
+            padding: 0 16px;
+            text-transform: uppercase;
+            vertical-align: middle;
+            -webkit-tap-highlight-color: transparent;
+            background-color: #2196F3;
+            cursor: pointer;
+        }
+    </style>
 </head>
 
 <body>
-    <div id="testclick">点击测试</div>
+    <div id="iframeDiv">
+        <!-- <iframe src="http://192.168.43.193:18811" scrolling="no"></iframe> -->
+    </div>
+    <div style="margin: 20px auto;text-align: center;">
+        <input type="text" id="httpSrc" placeholder="">
+        <button onclick="addIframe()">添加</button>
+    </div>
 </body>
-
-</html>
+<script>
+    function addIframe(){
+        var iframeDiv = document.getElementById("iframeDiv");
+        var httpSrc = document.getElementById("httpSrc").value;
+        let createIframe = document.createElement("img")
+        createIframe.scrolling = "no"
+        console.log(httpSrc)
+        if(httpSrc){
+            createIframe.src = `http://${httpSrc}:18811`
+            console.log(createIframe)
+            // createIframe.onload=function(){
+                
+            // }
+            iframeDiv.appendChild(createIframe)
+            document.getElementById("httpSrc").value = ""
+        }
+        
+    }
+</script>
+</html>

+ 0 - 20
src/renderer/cocoblockly-x/ya-webadb/apps/book/.gitignore

@@ -1,20 +0,0 @@
-# Dependencies
-/node_modules
-
-# Production
-/build
-
-# Generated files
-.docusaurus
-.cache-loader
-
-# Misc
-.DS_Store
-.env.local
-.env.development.local
-.env.test.local
-.env.production.local
-
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*

+ 0 - 33
src/renderer/cocoblockly-x/ya-webadb/apps/book/README.md

@@ -1,33 +0,0 @@
-# Website
-
-This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator.
-
-## Installation
-
-```console
-yarn install
-```
-
-## Local Development
-
-```console
-yarn start
-```
-
-This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.
-
-## Build
-
-```console
-yarn build
-```
-
-This command generates static content into the `build` directory and can be served using any static contents hosting service.
-
-## Deployment
-
-```console
-GIT_USER=<Your GitHub username> USE_SSH=true yarn deploy
-```
-
-If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.

+ 0 - 3
src/renderer/cocoblockly-x/ya-webadb/apps/book/babel.config.js

@@ -1,3 +0,0 @@
-module.exports = {
-  presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
-};

+ 0 - 146
src/renderer/cocoblockly-x/ya-webadb/apps/book/docs/basics/architecture.md

@@ -1,146 +0,0 @@
----
-sidebar_position: 1
----
-
-<!--
-cspell: ignore libusb
-cspell: ignore nodaemon
--->
-
-# Architecture
-
-This part describes the architecture of native ADB and Web ADB, and why there are designed in this way.
-
-## Native ADB
-
-Native ADB has three components:
-
-<div className="flow-chart">
-
-```
-┌───────────────────────────────┐  ┌──────────────┐
-│                               │  │              │
-│ ┌───────────┐     ┌────────┐  │  │ ┌──────────┐ │
-│ │           ├─────►        ├──┼──┼─►          │ │
-│ │ Client A  │     │        │  │  │ │ Daemon A │ │
-│ │           ◄─────┤        ◄──┼──┼─┤          │ │
-│ └───────────┘     │        │  │  │ └──────────┘ │
-│                   │        │  │  │              │
-│ ┌───────────┐     │ Server │  │  │   Device A   │
-│ │           ├─────►        │  │  │              │  ┌──────────────┐
-│ │ Client B  │     │        │  │  └──────────────┘  │              │
-│ │           ◄─────┤        │  │                    │ ┌──────────┐ │
-│ └───────────┘     │        ├──┼────────────────────┼─►          │ │
-│                   │        │  │                    │ │ Daemon B │ │
-│                   │        ◄──┼────────────────────┼─┤          │ │
-│  Computer A       └──▲──┬──┘  │                    │ └──────────┘ │
-│                      │  │     │                    │              │
-└──────────────────────┼──┼─────┘                    │   Device B   │
-                       │  │                          │              │
-┌───────────────┐      │  │                          └──────────────┘
-│               │      │  │
-│ ┌───────────┐ │      │  │
-│ │           ├─┼──────┘  │
-│ │ Client C  │ │         │
-│ │           ◄─┼─────────┘
-│ └───────────┘ │
-│               │
-│  Computer B   │
-│               │
-└───────────────┘
-```
-
-</div>
-
-### Client
-
-**Client** receives command line inputs, generates request packets, sends them to **server** over TCP.
-
-Because there can be multiple devices connected to the computer, **clients** add a "host prefix" to specify the device.
-
-### Server
-
-**Server** is in the same binary as **client**, but runs in a separate process with different command line arguments. Usually **servers** are spawned by **clients** when they cannot find one on localhost. To manually spawn a **server**, use `adb server nodaemon`. By default, it binds to `localhost:5037`.
-
-It is also possible to use SSH tunnel to let **clients** connect to a **server** running on a remote machine.
-
-**Servers** are responsible for discovering and connecting to devices. They also handle packets from **clients**.
-
-Some packets should be processed by **server** itself (for example `adb devices`), it generates response packets and sends them to **client**.
-
-Others need to be forwarded to **daemons** (for example `adb shell`). It finds the specified **daemon** using the "host prefix", rewrites the packet to remove "host prefix", and finally sends it to the **daemon** over USB (libusb/WinUSB) or TCP.
-
-Because USB APIs only allow one connection to a device simultaneously, to use multiple CLI applications with one device, the **server** is required to multiplex the packets.
-
-### Daemon
-
-**Daemon** runs on Android devices and emulators, it receives packets, handles them, and generates responses.
-
-Historically, because most device only has one USB port, **daemons** can only handle one connection. But even after ADB over Wi-Fi has been added, one **daemon** can still handle one TCP connection.
-
-### Protocol
-
-All packets between **client-server** and **server-daemon** are in the ADB packet format, but as mentioned before, **client-server** packets contain an extra "host prefix". ADB packet format will be described in [packet](./packet.md) chapter, while "host prefix" will be described in [stream](./stream.md) chapter.
-
-## Web ADB
-
-Web ADB reuses native ADB daemons, but there is no **client**/**server**: One application, one connection, to one device.
-
-<div className="flow-chart">
-
-```
-┌──────────────────────────────────┐  ┌──────────────┐
-│                                  │  │              │
-│ ┌──────────┐    ┌─────────────┐  │  │ ┌──────────┐ │
-│ │          ├────►             ├──┼──┼─►          │ │
-│ │  Core A  │    │  Backend A  │  │  │ │ Daemon A │ │
-│ │          ◄────┤             ◄──┼──┼─┤          │ │
-│ └──────────┘    └─────────────┘  │  │ └──────────┘ │
-│                                  │  │              │
-│                                  │  │   Device A   │
-│                                  │  │              │  ┌──────────────┐
-│                                  │  └──────────────┘  │              │
-│ ┌──────────┐    ┌─────────────┐  │                    │ ┌──────────┐ │
-│ │          ├────►             ├──┼────────────────────┼─►          │ │
-│ │  Core B  │    │  Backend B  │  │                    │ │ Daemon B │ │
-│ │          ◄────┤             ◄──┼────────────────────┼─┤          │ │
-│ └──────────┘    └─────────────┘  │                    │ └──────────┘ │
-│                                  │                    │              │
-│        JavaScript Runtime        │                    │   Device B   │
-│                                  │                    │              │
-└──────────────────────────────────┘                    └──────────────┘
-```
-
-</div>
-
-### Core
-
-**Core** is the `@yume-chan/adb` package. It generates data in ADB protocol, without "host prefix" (not needed because packets are directly sent to **daemons** via a **backend**).
-
-### Backend
-
-One **backend** defines one method to transmit and receive ADB packets. There are already multiple backend implementations, for example `@yume-chan/adb-backend-usb` and `@yume-chan/adb-backend-ws`.
-
-One **core** instance requires one **backend** instance, so it only connects to one device.
-
-Because JavaScript runtimes are generally more isolated, sharing devices between multiple application is not a consideration. However, it is still very easy to share a **core** instance within a single application, and if a runtime has more privileges, sharing **core** using a custom protocol is also not impossible.
-
-Having Backend as an independent part also makes it extremely easy to port to other runtimes (Web Browsers, Node.js, Electron, etc.).
-
-Possible Backend implementations:
-
-* Web Browsers
-  * WebUSB API (USB)
-  * WebSocket + Custom WebSockify forwarder (TCP)
-* Node.js/Electron
-  * Any USB libraries (USB)
-  * `net` module (TCP)
-  * WebSocket + Custom WebSockify forwarder (TCP)
-
-## Comparison
-
-|                                  | Native ADB                             | Web ADB              |
-| -------------------------------- | -------------------------------------- | -------------------- |
-| Who implements all ADB commands? | Client                                 | Core                 |
-| Who directly talks to device?    | Server                                 | Backend              |
-| How does them talk internally?   | TCP Socket (variation of ADB protocol) | JavaScript API calls |

+ 0 - 7
src/renderer/cocoblockly-x/ya-webadb/apps/book/docs/basics/authentication.md

@@ -1,7 +0,0 @@
----
-sidebar_position: 4
----
-
-# Authentication
-
-Because ADB can be remotely controlled to modify device states, authentication is required to prevent malicious actions.

+ 0 - 113
src/renderer/cocoblockly-x/ya-webadb/apps/book/docs/basics/connection.md

@@ -1,113 +0,0 @@
----
-sidebar_position: 3
----
-
-<!--
-cspell: ignore bootloader
-cspell: ignore enduml
-cspell: ignore mkdir
-cspell: ignore startuml
--->
-
-# Connection
-
-In native ADB architecture, once ADB **server** detects a new device, it initiates a connection by sending a `CNXN` [packet](./packet.md).
-
-After optional [authentication](./authentication.md), the **daemon** responses with a `CNXN` packet to indicate success.
-
-## `CNXN` Packet
-
-| Field     | Value                                     | Description                      |
-| --------- | ----------------------------------------- | -------------------------------- |
-| `command` | `0x4e584e43`                              | `CNXN` in UTF-8 encoding         |
-| `arg0`    | See [Protocol Version](#protocol-version) | Highest supported version number |
-| `arg1`    | See [Protocol Version](#protocol-version) | Maximum supported payload size   |
-| `payload` | See [Device Banner](#device-banner)       | Device banner                    |
-
-## Protocol Version
-
-ADB now has two versions, here are the differences:
-
-| Version number                         | 0x01000000     | 0x01000001         |
-| -------------------------------------- | -------------- | ------------------ |
-| Android version                        | <9             | >=9                |
-| Max payload size in each packet        | 4 * 1024 bytes | 1024 * 1024 bytes  |
-| Does not validate the `checksum` field | :x:            | :heavy_check_mark: |
-
-In the first upstream (**server** to **daemon**) `CNXN` packet:
-
-* `arg0` field SHOULD contains this **server**'s version (it can be lower, just will be slower).
-* `arg1` MUST NOT exceed the max payload size for that version in above table.
-* `checksum` MUST NOT be omitted. The version of **daemon** is not yet to know. When connecting to an older version, it may still validate the `checksum` can reject the connection.
-
-In the response (**daemon** to **server**) `CNXN` packet:
-
-* `arg0` field SHOULD contains this **daemon**'s version.
-* `arg1` MUST NOT exceed the max payload size for that version in above table.
-* `checksum` can be omitted if the **server**'s version is at least `0x01000001`. "Omit" means filling with anything, not removing the field entirely.
-
-After exchanging `CNXN` packets, both sides pick the lowest version (whether can omit `checksum`) and lowest max payload size to use in further packets.
-
-## Device Banner
-
-Device banners describe device information and capabilities. It has the following format:
-
-*DeviceBanner* **:**<br/>
-  *DeviceIdentifier* **::** *ParameterList* **\0**
-
-*DeviceIdentifier* **:**<br/>
-  **host**<br/>
-  **device**<br/>
-  **bootloader**
-
-*ParameterList* **:**<br/>
-  *Parameter*<br/>
-  *ParameterList* *Parameter*
-
-*Parameter* **:**<br/>
-  *ParameterName* **=** *ParameterValue* **;**
-
-*ParameterName* **:**<br/>
-  any character except **=** **,** **;**
-
-*ParameterValue* **:**<br/>
-  *ParameterStringValue*<br/>
-  *ParameterListValue*
-
-*ParameterStringValue* **:**<br/>
-  any character except **=** **,** **;**
-
-*ParameterListValue* **:**<br/>
-  *ParameterStringValue*<br/>
-  *ParameterListValue* **,** *ParameterStringValue*
-
-A device banner sent by **server** may look like this:
-
-```text
-host::features=shell_v2,cmd,stat_v2,ls_v2,fixed_push_mkdir,apex,abb,fixed_push_symlink_timestamp,abb_exec,remount_shell,track_app,sendrecv_v2,sendrecv_v2_brotli,sendrecv_v2_lz4,sendrecv_v2_zstd,sendrecv_v2_dry_run_send;\0
-```
-
-:::tip NULL Termination
-The trailing `;` and `\0` are required in Android <9.
-:::
-
-A device banner sent by **daemon** may look like this:
-
-```text
-device::ro.product.name=venus;ro.product.model=M2011K2C;ro.product.device=venus;features=sendrecv_v2_brotli,remount_shell,sendrecv_v2,abb_exec,fixed_push_mkdir,fixed_push_symlink_timestamp,abb,shell_v2,cmd,ls_v2,apex,stat_v2
-```
-
-## Sequence Diagram
-
-```uml
-@startuml
-
-participant Client
-participant Daemon
-
-Client -> Daemon: CNXN (host::)
-...Optional Authentication...
-Daemon -> Client: CNXN (device::)
-
-@enduml
-```

+ 0 - 14
src/renderer/cocoblockly-x/ya-webadb/apps/book/docs/basics/intro.md

@@ -1,14 +0,0 @@
----
-slug: /
-sidebar_position: 0
----
-
-# Introduction
-
-[ADB (Android Debugging Bridge)](https://developer.android.com/studio/command-line/adb) is the protocol for communicating with Android devices.
-
-This is an unofficial book about it. Including an overview of how Native ADB and my Web ADB implementations work.
-
-## Links
-
-* Source Code: [https://android.googlesource.com/platform/packages/modules/adb](https://android.googlesource.com/platform/packages/modules/adb)

+ 0 - 39
src/renderer/cocoblockly-x/ya-webadb/apps/book/docs/basics/packet.md

@@ -1,39 +0,0 @@
----
-sidebar_position: 2
----
-
-# Packet Format
-
-ADB protocol is a bi-directional, packet-oriented protocol. Each packet has a fixed-sized header and an optional, variable-sized payload.
-
-Because it is originally implemented in C for Linux, all multi-byte fields are in little-endian, and all strings are in UTF-8 encoding.
-
-Before Android 9, it used `char *` for string handling, so null terminators are required. Now it’s transitioning to `std::string`, which doesn't require null-terminators. But not all places has been changed, and for backward compatibility, adding null-terminators are still recommended.
-
-Each packet contains following fields:
-
-| Byte Offset | Type                | Field         | Description                            |
-| ----------- | ------------------- | ------------- | -------------------------------------- |
-| 0           | char[4]             | command       | Packet type                            |
-| 4           | in32                | arg0          | Meaning defined by each packet type    |
-| 8           | in32                | arg1          | Meaning defined by each packet type    |
-| 12          | uint32              | payloadLength | Length of payload, in bytes            |
-| 16          | uint32              | checksum      | Checksum for verify data integrity     |
-| 20          | uint32              | magic         | Should equal to `command ^ 0xFFFFFFFF` |
-| 24          | byte[payloadLength] | payload       | Meaning defined by each packet type    |
-
-## Command
-
-The `command` field consists of four ASCII characters.
-
-For example, `"CNXN"` packets' `command` is `[0x43, 0x4e, 0x58, 0x4e]`, or `0x4e584e43` in Hex (Hex strings are big-endian).
-
-## arg0/arg1
-
-Two integer parameters for the `command`.
-
-## Checksum
-
-Checksum is calculated by adding up all bytes in `payload`.
-
-For example, when the payload is `[0x01, 0x02, 0x03]`, the `checksum` is `0x01 + 0x02 + 0x03 = 0x00000006`.

+ 0 - 5
src/renderer/cocoblockly-x/ya-webadb/apps/book/docs/basics/stream.md

@@ -1,5 +0,0 @@
----
-sidebar_position: 5
----
-
-# Stream

+ 0 - 13
src/renderer/cocoblockly-x/ya-webadb/apps/book/docs/commands/shell.md

@@ -1,13 +0,0 @@
----
-sidebar_position: 1
----
-
-# Shell
-
-:::tip TODO
-TODO
-:::
-
-## Interactive Shell
-
-## Spawn executable

+ 0 - 63
src/renderer/cocoblockly-x/ya-webadb/apps/book/docusaurus.config.js

@@ -1,63 +0,0 @@
-/** @type {import('@docusaurus/types').DocusaurusConfig} */
-module.exports = {
-    title: 'Unofficial ADB Book',
-    tagline: 'Deep-dive into ADB',
-    url: 'https://yume-chan.github.io',
-    baseUrl: '/ya-webadb/book/',
-    onBrokenLinks: 'throw',
-    onBrokenMarkdownLinks: 'warn',
-    favicon: 'img/favicon.ico',
-    organizationName: 'yume-chan',
-    projectName: 'ya-webadb', // Usually your repo name.
-    themeConfig: {
-        navbar: {
-            title: 'Unofficial ADB Book',
-            logo: {
-                alt: 'Site Logo',
-                src: 'img/logo.svg',
-            },
-            items: [
-                {
-                    type: 'doc',
-                    docId: 'basics/intro',
-                    position: 'left',
-                    label: 'Basics',
-                },
-                {
-                    type: 'doc',
-                    docId: 'commands/shell',
-                    position: 'left',
-                    label: 'Commands',
-                },
-                {
-                    href: 'https://github.com/yume-chan/ya-webadb',
-                    label: 'GitHub',
-                    position: 'right',
-                },
-            ],
-        },
-        footer: {
-            style: 'dark',
-            links: [],
-            copyright: `Copyright © ${new Date().getFullYear()} Simon Chan. Built with Docusaurus.`,
-        },
-    },
-    presets: [
-        [
-            '@docusaurus/preset-classic',
-            {
-                docs: {
-                    sidebarPath: require.resolve('./sidebars.js'),
-                    routeBasePath: '/',
-                    // Please change this to your repo.
-                    editUrl:
-                        'https://github.com/yume-chan/ya-webadb/edit/main/apps/book/',
-                    remarkPlugins: [require('./scripts/plantuml')],
-                },
-                theme: {
-                    customCss: require.resolve('./src/css/custom.css'),
-                },
-            },
-        ],
-    ],
-};

+ 0 - 46
src/renderer/cocoblockly-x/ya-webadb/apps/book/package.json

@@ -1,46 +0,0 @@
-{
-    "name": "unofficial-adb-book",
-    "version": "0.0.0",
-    "private": true,
-    "scripts": {
-        "docusaurus": "docusaurus",
-        "start": "docusaurus start",
-        "build": "",
-        "//build": "docusaurus build",
-        "swizzle": "docusaurus swizzle",
-        "deploy": "docusaurus deploy",
-        "clear": "docusaurus clear",
-        "serve": "docusaurus serve",
-        "write-translations": "docusaurus write-translations",
-        "write-heading-ids": "docusaurus write-heading-ids"
-    },
-    "dependencies": {
-        "@docusaurus/core": "^2.2.0",
-        "@docusaurus/preset-classic": "^2.2.0",
-        "@mdx-js/react": "^2.1.5",
-        "@svgr/webpack": "^6.5.1",
-        "clsx": "^1.1.1",
-        "file-loader": "^6.2.0",
-        "react": "^18.2.0",
-        "react-dom": "^18.2.0",
-        "url-loader": "^4.1.1"
-    },
-    "browserslist": {
-        "production": [
-            ">0.5%",
-            "not dead",
-            "not op_mini all"
-        ],
-        "development": [
-            "last 1 chrome version",
-            "last 1 firefox version",
-            "last 1 safari version"
-        ]
-    },
-    "devDependencies": {
-        "mini-svg-data-uri": "^1.3.3",
-        "node-fetch": "^3.3.0",
-        "plantuml-encoder": "^1.4.0",
-        "unist-util-visit": "^2.0.3"
-    }
-}

+ 0 - 36
src/renderer/cocoblockly-x/ya-webadb/apps/book/scripts/plantuml.js

@@ -1,36 +0,0 @@
-const encoder = require('plantuml-encoder');
-const svgToDataUri = require('mini-svg-data-uri');
-const fetch = require('node-fetch');
-const visit = require('unist-util-visit');
-
-async function umlToSvgDataUri(uml) {
-    const encoded = encoder.encode(uml);
-    const response = await fetch(`https://www.plantuml.com/plantuml/svg/${encoded}`);
-    let svg = await response.text();
-    return svgToDataUri(svg);
-}
-
-module.exports = () => {
-    return async syntaxTree => {
-        const matches = [];
-        visit(syntaxTree, 'code', node => {
-            if (node.lang === 'uml' && !!node.value) {
-                matches.push(node);
-            }
-        });
-        if (!matches.length) {
-            return;
-        }
-
-        const id = Math.random().toString().substring(2);
-        syntaxTree.children.unshift({ type: 'import', value: `import ThemedImage${id} from '@theme/ThemedImage'` });
-
-        await Promise.all(matches.map(async node => {
-            const lightSvg = await umlToSvgDataUri(node.value.replace('@startuml', '@startuml\n!theme bluegray'));
-            // Workaround https://github.com/bschwarz/puml-themes/issues/15
-            const darkSvg = await umlToSvgDataUri(node.value.replace('@startuml', '@startuml\n!theme cyborg\nskinparam SequenceDelayFontColor $FGCOLOR'));
-            node.type = 'jsx';
-            node.value = `<ThemedImage${id} sources={{ light: "${lightSvg}", dark: "${darkSvg}" }} />`;
-        }));
-    }
-}

+ 0 - 27
src/renderer/cocoblockly-x/ya-webadb/apps/book/sidebars.js

@@ -1,27 +0,0 @@
-/**
- * Creating a sidebar enables you to:
- - create an ordered group of docs
- - render a sidebar for each doc of that group
- - provide next/previous navigation
-
- The sidebars can be generated from the filesystem, or explicitly defined here.
-
- Create as many sidebars as you want.
- */
-
-module.exports = {
-    // By default, Docusaurus generates a sidebar from the docs folder structure
-    basics: [{ type: 'autogenerated', dirName: 'basics' }],
-    commands: [{ type: 'autogenerated', dirName: 'commands' }],
-
-    // But you can create a sidebar manually
-    /*
-    tutorialSidebar: [
-      {
-        type: 'category',
-        label: 'Tutorial',
-        items: ['hello'],
-      },
-    ],
-     */
-};

+ 0 - 29
src/renderer/cocoblockly-x/ya-webadb/apps/book/src/css/custom.css

@@ -1,29 +0,0 @@
-/* stylelint-disable docusaurus/copyright-header */
-/**
- * Any CSS included here will be global. The classic template
- * bundles Infima by default. Infima is a CSS framework designed to
- * work well for content-centric websites.
- */
-
-/* You can override the default Infima variables here. */
-:root {
-  --ifm-color-primary: #25c2a0;
-  --ifm-color-primary-dark: rgb(33, 175, 144);
-  --ifm-color-primary-darker: rgb(31, 165, 136);
-  --ifm-color-primary-darkest: rgb(26, 136, 112);
-  --ifm-color-primary-light: rgb(70, 203, 174);
-  --ifm-color-primary-lighter: rgb(102, 212, 189);
-  --ifm-color-primary-lightest: rgb(146, 224, 208);
-  --ifm-code-font-size: 95%;
-}
-
-.docusaurus-highlight-code-line {
-  background-color: rgb(72, 77, 91);
-  display: block;
-  margin: 0 calc(-1 * var(--ifm-pre-padding));
-  padding: 0 var(--ifm-pre-padding);
-}
-
-.flow-chart {
-  --ifm-pre-line-height: 1.2;
-}

+ 0 - 0
src/renderer/cocoblockly-x/ya-webadb/apps/book/static/.nojekyll


BIN
src/renderer/cocoblockly-x/ya-webadb/apps/book/static/img/favicon.ico


Різницю між файлами не показано, бо вона завелика
+ 0 - 0
src/renderer/cocoblockly-x/ya-webadb/apps/book/static/img/logo.svg


+ 0 - 10
src/renderer/cocoblockly-x/ya-webadb/common/changes/@yume-chan/scrcpy/main_2022-10-18-10-09.json

@@ -1,10 +0,0 @@
-{
-  "changes": [
-    {
-      "packageName": "@yume-chan/scrcpy",
-      "comment": "Move `@yume-chan/adb` to `peerDependencies`",
-      "type": "none"
-    }
-  ],
-  "packageName": "@yume-chan/scrcpy"
-}

+ 0 - 22
src/renderer/cocoblockly-x/ya-webadb/common/config/rush/.npmrc

@@ -1,22 +0,0 @@
-# Rush uses this file to configure the NPM package registry during installation.  It is applicable
-# to PNPM, NPM, and Yarn package managers.  It is used by operations such as "rush install",
-# "rush update", and the "install-run.js" scripts.
-#
-# NOTE: The "rush publish" command uses .npmrc-publish instead.
-#
-# Before invoking the package manager, Rush will copy this file to the folder where installation
-# is performed.  The copied file will omit any config lines that reference environment variables
-# that are undefined in that session; this avoids problems that would otherwise result due to
-# a missing variable being replaced by an empty string.
-#
-# * * * SECURITY WARNING * * *
-#
-# It is NOT recommended to store authentication tokens in a text file on a lab machine, because
-# other unrelated processes may be able to read the file.  Also, the file may persist indefinitely,
-# for example if the machine loses power.  A safer practice is to pass the token via an
-# environment variable, which can be referenced from .npmrc using ${} expansion.  For example:
-#
-#   //registry.npmjs.org/:_authToken=${NPM_AUTH_TOKEN}
-#
-registry=https://registry.npmjs.org/
-always-auth=false

+ 0 - 21
src/renderer/cocoblockly-x/ya-webadb/common/config/rush/.npmrc-publish

@@ -1,21 +0,0 @@
-# This config file is very similar to common/config/rush/.npmrc, except that .npmrc-publish
-# is used by the "rush publish" command, as publishing often involves different credentials
-# and registries than other operations.
-#
-# Before invoking the package manager, Rush will copy this file to "common/temp/publish-home/.npmrc"
-# and then temporarily map that folder as the "home directory" for the current user account.
-# This enables the same settings to apply for each project folder that gets published.  The copied file
-# will omit any config lines that reference environment variables that are undefined in that session;
-# this avoids problems that would otherwise result due to a missing variable being replaced by
-# an empty string.
-#
-# * * * SECURITY WARNING * * *
-#
-# It is NOT recommended to store authentication tokens in a text file on a lab machine, because
-# other unrelated processes may be able to read the file.  Also, the file may persist indefinitely,
-# for example if the machine loses power.  A safer practice is to pass the token via an
-# environment variable, which can be referenced from .npmrc using ${} expansion.  For example:
-#
-#   //registry.npmjs.org/:_authToken=${NPM_AUTH_TOKEN}
-#
-//registry.npmjs.org/:_authToken=${NPM_AUTH_TOKEN}

+ 0 - 38
src/renderer/cocoblockly-x/ya-webadb/common/config/rush/.pnpmfile.cjs

@@ -1,38 +0,0 @@
-'use strict';
-
-/**
- * When using the PNPM package manager, you can use pnpmfile.js to workaround
- * dependencies that have mistakes in their package.json file.  (This feature is
- * functionally similar to Yarn's "resolutions".)
- *
- * For details, see the PNPM documentation:
- * https://pnpm.js.org/docs/en/hooks.html
- *
- * IMPORTANT: SINCE THIS FILE CONTAINS EXECUTABLE CODE, MODIFYING IT IS LIKELY TO INVALIDATE
- * ANY CACHED DEPENDENCY ANALYSIS.  After any modification to pnpmfile.js, it's recommended to run
- * "rush update --full" so that PNPM will recalculate all version selections.
- */
-module.exports = {
-    hooks: {
-        readPackage
-    }
-};
-
-/**
- * This hook is invoked during installation before a package's dependencies
- * are selected.
- * The `packageJson` parameter is the deserialized package.json
- * contents for the package that is about to be installed.
- * The `context` parameter provides a log() function.
- * The return value is the updated object.
- */
-function readPackage(packageJson, context) {
-
-    // // The karma types have a missing dependency on typings from the log4js package.
-    // if (packageJson.name === '@types/karma') {
-    //  context.log('Fixed up dependencies for @types/karma');
-    //  packageJson.dependencies['log4js'] = '0.6.38';
-    // }
-
-    return packageJson;
-}

+ 0 - 85
src/renderer/cocoblockly-x/ya-webadb/common/config/rush/artifactory.json

@@ -1,85 +0,0 @@
-/**
- * This configuration file manages Rush integration with JFrog Artifactory services.
- * More documentation is available on the Rush website: https://rushjs.io
- */
-{
-  "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/artifactory.schema.json",
-
-  "packageRegistry": {
-    /**
-     * (Required) Set this to "true" to enable Rush to manage tokens for an Artifactory NPM registry.
-     * When enabled, "rush install" will automatically detect when the user's ~/.npmrc
-     * authentication token is missing or expired.  And "rush setup" will prompt the user to
-     * renew their token.
-     *
-     * The default value is false.
-     */
-    "enabled": false,
-
-    /**
-     * (Required) Specify the URL of your NPM registry.  This is the same URL that appears in
-     * your .npmrc file.  It should look something like this example:
-     *
-     *   https://your-company.jfrog.io/your-project/api/npm/npm-private/
-     */
-    "registryUrl": "",
-
-    /**
-     * A list of custom strings that "rush setup" should add to the user's ~/.npmrc file at the time
-     * when the token is updated.  This could be used for example to configure the company registry
-     * to be used whenever NPM is invoked as a standalone command (but it's not needed for Rush
-     * operations like "rush add" and "rush install", which get their mappings from the monorepo's
-     * common/config/rush/.npmrc file).
-     *
-     * NOTE: The ~/.npmrc settings are global for the user account on a given machine, so be careful
-     * about adding settings that may interfere with other work outside the monorepo.
-     */
-    "userNpmrcLinesToAdd": [
-      // "@example:registry=https://your-company.jfrog.io/your-project/api/npm/npm-private/"
-    ],
-
-    /**
-     * (Required) Specifies the URL of the Artifactory control panel where the user can generate
-     * an API key.  This URL is printed after the "visitWebsite" message.
-     * It should look something like this example:  https://your-company.jfrog.io/
-     * Specify an empty string to suppress this line entirely.
-     */
-    "artifactoryWebsiteUrl": "",
-
-    /**
-     * These settings allow the "rush setup" interactive prompts to be customized, for
-     * example with messages specific to your team or configuration.  Specify an empty string
-     * to suppress that message entirely.
-     */
-    "messageOverrides": {
-      /**
-       * Overrides the message that normally says:
-       * "This monorepo consumes packages from an Artifactory private NPM registry."
-       */
-      // "introduction": "",
-      /**
-       * Overrides the message that normally says:
-       * "Please contact the repository maintainers for help with setting up an Artifactory user account."
-       */
-      // "obtainAnAccount": "",
-      /**
-       * Overrides the message that normally says:
-       * "Please open this URL in your web browser:"
-       *
-       * The "artifactoryWebsiteUrl" string is printed after this message.
-       */
-      // "visitWebsite": "",
-      /**
-       * Overrides the message that normally says:
-       * "Your user name appears in the upper-right corner of the JFrog website."
-       */
-      // "locateUserName": "",
-      /**
-       * Overrides the message that normally says:
-       * "Click 'Edit Profile' on the JFrog website.  Click the 'Generate API Key'
-       * button if you haven't already done so previously."
-       */
-      // "locateApiKey": ""
-    }
-  }
-}

+ 0 - 84
src/renderer/cocoblockly-x/ya-webadb/common/config/rush/build-cache.json

@@ -1,84 +0,0 @@
-/**
- * This configuration file manages Rush's build cache feature.
- * More documentation is available on the Rush website: https://rushjs.io
- */
- {
-  "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/build-cache.schema.json",
-
-  /**
-   * (Required) EXPERIMENTAL - Set this to true to enable the build cache feature.
-   *
-   * See https://rushjs.io/pages/maintainer/build_cache/ for details about this experimental feature.
-   */
-  "buildCacheEnabled": false,
-
-  /**
-   * (Required) Choose where project build outputs will be cached.
-   *
-   * Possible values: "local-only", "azure-blob-storage", "amazon-s3"
-   */
-  "cacheProvider": "local-only",
-
-  /**
-   * Setting this property overrides the cache entry ID.  If this property is set, it must contain
-   * a [hash] token. It may also contain a [projectName] or a [projectName:normalized] token.
-   */
-  // "cacheEntryNamePattern": "[projectName:normalized]-[hash]"
-
-  /**
-   * Use this configuration with "cacheProvider"="azure-blob-storage"
-   */
-  "azureBlobStorageConfiguration": {
-    /**
-     * (Required) The name of the the Azure storage account to use for build cache.
-     */
-    // "storageAccountName": "example",
-
-    /**
-     * (Required) The name of the container in the Azure storage account to use for build cache.
-     */
-    // "storageContainerName": "my-container",
-
-    /**
-     * The Azure environment the storage account exists in. Defaults to AzurePublicCloud.
-     *
-     * Possible values: "AzurePublicCloud", "AzureChina", "AzureGermany", "AzureGovernment"
-     */
-    // "azureEnvironment": "AzurePublicCloud",
-
-    /**
-     * An optional prefix for cache item blob names.
-     */
-    // "blobPrefix": "my-prefix",
-
-    /**
-     * If set to true, allow writing to the cache. Defaults to false.
-     */
-    // "isCacheWriteAllowed": true
-  },
-
-  /**
-   * Use this configuration with "cacheProvider"="amazon-s3"
-   */
-  "amazonS3Configuration": {
-    /**
-     * (Required) The Amazon S3 region of the bucket to use for build cache (e.g. "us-east-1").
-     */
-    // "s3Region": "us-east-1",
-
-    /**
-     * The name of the bucket in Amazon S3 to use for build cache.
-     */
-    // (Required) "s3Bucket": "my-bucket",
-
-    /**
-     * An optional prefix ("folder") for cache items.
-     */
-    // "s3Prefix": "my-prefix",
-
-    /**
-     * If set to true, allow writing to the cache. Defaults to false.
-     */
-    // "isCacheWriteAllowed": true
-  }
-}

+ 0 - 330
src/renderer/cocoblockly-x/ya-webadb/common/config/rush/command-line.json

@@ -1,330 +0,0 @@
-/**
- * This configuration file defines custom commands for the "rush" command-line.
- * More documentation is available on the Rush website: https://rushjs.io
- */
-{
-    "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/command-line.schema.json",
-    /**
-   * Custom "commands" introduce new verbs for the command-line.  To see the help for these
-   * example commands, try "rush --help", "rush my-bulk-command --help", or
-   * "rush my-global-command --help".
-   */
-    "commands": [
-        // {
-        //   /**
-        //    * (Required) Determines the type of custom command.
-        //    * Rush's "bulk" commands are invoked separately for each project.  Rush will look in
-        //    * each project's package.json file for a "scripts" entry whose name matches the
-        //    * command name.  By default, the command will run for every project in the repo,
-        //    * according to the dependency graph (similar to how "rush build" works).
-        //    * The set of projects can be restricted e.g. using the "--to" or "--from" parameters.
-        //    */
-        //   "commandKind": "bulk",
-        //
-        //   /**
-        //    * (Required) The name that will be typed as part of the command line.  This is also the name
-        //    * of the "scripts" hook in the project's package.json file.
-        //    * The name should be comprised of lower case words separated by hyphens or colons. The name should include an
-        //    * English verb (e.g. "deploy"). Use a hyphen to separate words (e.g. "upload-docs"). A group of related commands
-        //    * can be prefixed with a colon (e.g. "docs:generate", "docs:deploy", "docs:serve", etc).
-        //    *
-        //    * Note that if the "rebuild" command is overridden here, it becomes separated from the "build" command
-        //    * and will call the "rebuild" script instead of the "build" script.
-        //    */
-        //   "name": "my-bulk-command",
-        //
-        //   /**
-        //    * (Required) A short summary of the custom command to be shown when printing command line
-        //    * help, e.g. "rush --help".
-        //    */
-        //   "summary": "Example bulk custom command",
-        //
-        //   /**
-        //    * A detailed description of the command to be shown when printing command line
-        //    * help (e.g. "rush --help my-command").
-        //    * If omitted, the "summary" text will be shown instead.
-        //    *
-        //    * Whenever you introduce commands/parameters, taking a little time to write meaningful
-        //    * documentation can make a big difference for the developer experience in your repo.
-        //    */
-        //   "description": "This is an example custom command that runs separately for each project",
-        //
-        //   /**
-        //    * By default, Rush operations acquire a lock file which prevents multiple commands from executing simultaneously
-        //    * in the same repo folder.  (For example, it would be a mistake to run "rush install" and "rush build" at the
-        //    * same time.)  If your command makes sense to run concurrently with other operations,
-        //    * set "safeForSimultaneousRushProcesses" to true to disable this protection.
-        //    *
-        //    * In particular, this is needed for custom scripts that invoke other Rush commands.
-        //    */
-        //   "safeForSimultaneousRushProcesses": false,
-        //
-        //   /**
-        //    * (Required) If true, then this command is safe to be run in parallel, i.e. executed
-        //    * simultaneously for multiple projects.  Similar to "rush build", regardless of parallelism
-        //    * projects will not start processing until their dependencies have completed processing.
-        //    */
-        //   "enableParallelism": false,
-        //
-        //   /**
-        //    * Normally projects will be processed according to their dependency order: a given project will not start
-        //    * processing the command until all of its dependencies have completed.  This restriction doesn't apply for
-        //    * certain operations, for example a "clean" task that deletes output files.  In this case
-        //    * you can set "ignoreDependencyOrder" to true to increase parallelism.
-        //    */
-        //   "ignoreDependencyOrder": false,
-        //
-        //   /**
-        //    * Normally Rush requires that each project's package.json has a "scripts" entry matching
-        //    * the custom command name.  To disable this check, set "ignoreMissingScript" to true;
-        //    * projects with a missing definition will be skipped.
-        //    */
-        //   "ignoreMissingScript": false,
-        //
-        //   /**
-        //    * When invoking shell scripts, Rush uses a heuristic to distinguish errors from warnings:
-        //    * - If the shell script returns a nonzero process exit code, Rush interprets this as "one or more errors".
-        //    * Error output is displayed in red, and it prevents Rush from attempting to process any downstream projects.
-        //    * - If the shell script returns a zero process exit code but writes something to its stderr stream,
-        //    * Rush interprets this as "one or more warnings". Warning output is printed in yellow, but does NOT prevent
-        //    * Rush from processing downstream projects.
-        //    *
-        //    * Thus, warnings do not interfere with local development, but they will cause a CI job to fail, because
-        //    * the Rush process itself returns a nonzero exit code if there are any warnings or errors. This is by design.
-        //    * In an active monorepo, we've found that if you allow any warnings in your master branch, it inadvertently
-        //    * teaches developers to ignore warnings, which quickly leads to a situation where so many "expected" warnings
-        //    * have accumulated that warnings no longer serve any useful purpose.
-        //    *
-        //    * Sometimes a poorly behaved task will write output to stderr even though its operation was successful.
-        //    * In that case, it's strongly recommended to fix the task.  However, as a workaround you can set
-        //    * allowWarningsInSuccessfulBuild=true, which causes Rush to return a nonzero exit code for errors only.
-        //    *
-        //    * Note: The default value is false. In Rush 5.7.x and earlier, the default value was true.
-        //    */
-        //   "allowWarningsInSuccessfulBuild": false,
-        //
-        //   /**
-        //    * If true then this command will be incremental like the built-in "build" command
-        //    */
-        //   "incremental": false,
-        //
-        //   /**
-        //    * (EXPERIMENTAL) Normally Rush terminates after the command finishes. If this option is set to "true" Rush
-        //    * will instead enter a loop where it watches the file system for changes to the selected projects. Whenever a
-        //    * change is detected, the command will be invoked again for the changed project and any selected projects that
-        //    * directly or indirectly depend on it.
-        //    *
-        //    * For details, refer to the website article "Using watch mode".
-        //    */
-        //   "watchForChanges": false,
-        //
-        //   /**
-        //    * (EXPERIMENTAL) Disable cache for this action. This may be useful if this command affects state outside of
-        //    * projects' own folders.
-        //    */
-        //   "disableBuildCache ": false
-        // },
-        //
-        // {
-        //   /**
-        //    * (Required) Determines the type of custom command.
-        //    * Rush's "global" commands are invoked once for the entire repo.
-        //    */
-        //   "commandKind": "global",
-        //
-        //   "name": "my-global-command",
-        //   "summary": "Example global custom command",
-        //   "description": "This is an example custom command that runs once for the entire repo",
-        //
-        //   "safeForSimultaneousRushProcesses": false,
-        //
-        //   /**
-        //    * (Required) A script that will be invoked using the OS shell. The working directory will be
-        //    * the folder that contains rush.json.  If custom parameters are associated with this command, their
-        //    * values will be appended to the end of this string.
-        //    */
-        //   "shellCommand": "node common/scripts/my-global-command.js",
-        //
-        //   /**
-        //    * If your "shellCommand" script depends on NPM packages, the recommended best practice is
-        //    * to make it into a regular Rush project that builds using your normal toolchain.  In cases where
-        //    * the command needs to work without first having to run "rush build", the recommended practice
-        //    * is to publish the project to an NPM registry and use common/scripts/install-run.js to launch it.
-        //    *
-        //    * Autoinstallers offer another possibility: They are folders under "common/autoinstallers" with
-        //    * a package.json file and shrinkwrap file. Rush will automatically invoke the package manager to
-        //    * install these dependencies before an associated command is invoked.  Autoinstallers have the
-        //    * advantage that they work even in a branch where "rush install" is broken, which makes them a
-        //    * good solution for Git hook scripts.  But they have the disadvantages of not being buildable
-        //    * projects, and of increasing the overall installation footprint for your monorepo.
-        //    *
-        //    * The "autoinstallerName" setting must not contain a path and must be a valid NPM package name.
-        //    * For example, the name "my-task" would map to "common/autoinstallers/my-task/package.json", and
-        //    * the "common/autoinstallers/my-task/node_modules/.bin" folder would be added to the shell PATH when
-        //    * invoking the "shellCommand".
-        //    */
-        //   // "autoinstallerName": "my-task"
-        // }
-        {
-            "commandKind": "bulk",
-            "name": "build",
-            "summary": "Builds all projects",
-            "enableParallelism": true,
-            "incremental": true,
-            "allowWarningsInSuccessfulBuild": true
-        },
-        {
-            "commandKind": "bulk",
-            "name": "test",
-            "summary": "Run Jest tests in each projects",
-            "ignoreMissingScript": true,
-            "allowWarningsInSuccessfulBuild": true,
-            "enableParallelism": true,
-            "incremental": true
-        },
-        {
-            "commandKind": "bulk",
-            "name": "build:watch",
-            "summary": "Watch all libraries",
-            "ignoreMissingScript": true,
-            "enableParallelism": true,
-            "incremental": true,
-            "watchForChanges": true
-        },
-        {
-            "commandKind": "bulk",
-            "name": "postinstall",
-            "summary": "Run all postinstall scripts",
-            "ignoreMissingScript": true,
-            "enableParallelism": true,
-            "ignoreDependencyOrder": true,
-            "safeForSimultaneousRushProcesses": true
-        }
-    ],
-    /**
-   * Custom "parameters" introduce new parameters for specified Rush command-line commands.
-   * For example, you might define a "--production" parameter for the "rush build" command.
-   */
-    "parameters": [
-        // {
-        //   /**
-        //    * (Required) Determines the type of custom parameter.
-        //    * A "flag" is a custom command-line parameter whose presence acts as an on/off switch.
-        //    */
-        //   "parameterKind": "flag",
-        //
-        //   /**
-        //    * (Required) The long name of the parameter.  It must be lower-case and use dash delimiters.
-        //    */
-        //   "longName": "--my-flag",
-        //
-        //   /**
-        //    * An optional alternative short name for the parameter.  It must be a dash followed by a single
-        //    * lower-case or upper-case letter, which is case-sensitive.
-        //    *
-        //    * NOTE: The Rush developers recommend that automation scripts should always use the long name
-        //    * to improve readability.  The short name is only intended as a convenience for humans.
-        //    * The alphabet letters run out quickly, and are difficult to memorize, so *only* use
-        //    * a short name if you expect the parameter to be needed very often in everyday operations.
-        //    */
-        //   "shortName": "-m",
-        //
-        //   /**
-        //    * (Required) A long description to be shown in the command-line help.
-        //    *
-        //    * Whenever you introduce commands/parameters, taking a little time to write meaningful
-        //    * documentation can make a big difference for the developer experience in your repo.
-        //    */
-        //   "description": "A custom flag parameter that is passed to the scripts that are invoked when building projects",
-        //
-        //   /**
-        //    * (Required) A list of custom commands and/or built-in Rush commands that this parameter may
-        //    * be used with.  The parameter will be appended to the shell command that Rush invokes.
-        //    */
-        //   "associatedCommands": ["build", "rebuild"]
-        // },
-        //
-        // {
-        //   /**
-        //    * (Required) Determines the type of custom parameter.
-        //    * A "string" is a custom command-line parameter whose value is a simple text string.
-        //    */
-        //   "parameterKind": "string",
-        //   "longName": "--my-string",
-        //   "description": "A custom string parameter for the \"my-global-command\" custom command",
-        //
-        //   "associatedCommands": ["my-global-command"],
-        //
-        //   /**
-        //    * The name of the argument, which will be shown in the command-line help.
-        //    *
-        //    * For example, if the parameter name is '--count" and the argument name is "NUMBER",
-        //    * then the command-line help would display "--count NUMBER".  The argument name must
-        //    * be comprised of upper-case letters, numbers, and underscores.  It should be kept short.
-        //    */
-        //   "argumentName": "SOME_TEXT",
-        //
-        //   /**
-        //    * If true, this parameter must be included with the command.  The default is false.
-        //    */
-        //   "required": false
-        // },
-        //
-        // {
-        //   /**
-        //    * (Required) Determines the type of custom parameter.
-        //    * A "choice" is a custom command-line parameter whose argument must be chosen from a list of
-        //    * allowable alternatives.
-        //    */
-        //   "parameterKind": "choice",
-        //   "longName": "--my-choice",
-        //   "description": "A custom choice parameter for the \"my-global-command\" custom command",
-        //
-        //   "associatedCommands": ["my-global-command"],
-        //
-        //   /**
-        //    * If true, this parameter must be included with the command.  The default is false.
-        //    */
-        //   "required": false,
-        //
-        //   /**
-        //    * Normally if a parameter is omitted from the command line, it will not be passed
-        //    * to the shell command. this value will be inserted by default.  Whereas if a "defaultValue"
-        //    * is defined, the parameter will always be passed to the shell command, and will use the
-        //    * default value if unspecified.  The value must be one of the defined alternatives.
-        //    */
-        //   "defaultValue": "vanilla",
-        //
-        //   /**
-        //    * (Required) A list of alternative argument values that can be chosen for this parameter.
-        //    */
-        //   "alternatives": [
-        //     {
-        //       /**
-        //        * A token that is one of the alternatives that can be used with the choice parameter,
-        //        * e.g. "vanilla" in "--flavor vanilla".
-        //        */
-        //       "name": "vanilla",
-        //
-        //       /**
-        //        * A detailed description for the alternative that can be shown in the command-line help.
-        //        *
-        //        * Whenever you introduce commands/parameters, taking a little time to write meaningful
-        //        * documentation can make a big difference for the developer experience in your repo.
-        //        */
-        //       "description": "Use the vanilla flavor (the default)"
-        //     },
-        //
-        //     {
-        //       "name": "chocolate",
-        //       "description": "Use the chocolate flavor"
-        //     },
-        //
-        //     {
-        //       "name": "strawberry",
-        //       "description": "Use the strawberry flavor"
-        //     }
-        //   ]
-        // }
-    ]
-}

+ 0 - 62
src/renderer/cocoblockly-x/ya-webadb/common/config/rush/common-versions.json

@@ -1,62 +0,0 @@
-/**
- * This configuration file specifies NPM dependency version selections that affect all projects
- * in a Rush repo.  More documentation is available on the Rush website: https://rushjs.io
- */
-{
-  "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/common-versions.schema.json",
-
-  /**
-   * A table that specifies a "preferred version" for a given NPM package.  This feature is typically used
-   * to hold back an indirect dependency to a specific older version, or to reduce duplication of indirect dependencies.
-   *
-   * The "preferredVersions" value can be any SemVer range specifier (e.g. "~1.2.3").  Rush injects these values into
-   * the "dependencies" field of the top-level common/temp/package.json, which influences how the package manager
-   * will calculate versions.  The specific effect depends on your package manager.  Generally it will have no
-   * effect on an incompatible or already constrained SemVer range.  If you are using PNPM, similar effects can be
-   * achieved using the pnpmfile.js hook.  See the Rush documentation for more details.
-   *
-   * After modifying this field, it's recommended to run "rush update --full" so that the package manager
-   * will recalculate all version selections.
-   */
-  "preferredVersions": {
-    /**
-     * When someone asks for "^1.0.0" make sure they get "1.2.3" when working in this repo,
-     * instead of the latest version.
-     */
-    // "some-library": "1.2.3"
-  },
-
-  /**
-   * When set to true, for all projects in the repo, all dependencies will be automatically added as preferredVersions,
-   * except in cases where different projects specify different version ranges for a given dependency.  For older
-   * package managers, this tended to reduce duplication of indirect dependencies.  However, it can sometimes cause
-   * trouble for indirect dependencies with incompatible peerDependencies ranges.
-   *
-   * The default value is true.  If you're encountering installation errors related to peer dependencies,
-   * it's recommended to set this to false.
-   *
-   * After modifying this field, it's recommended to run "rush update --full" so that the package manager
-   * will recalculate all version selections.
-   */
-  // "implicitlyPreferredVersions": false,
-
-  /**
-   * The "rush check" command can be used to enforce that every project in the repo must specify
-   * the same SemVer range for a given dependency.  However, sometimes exceptions are needed.
-   * The allowedAlternativeVersions table allows you to list other SemVer ranges that will be
-   * accepted by "rush check" for a given dependency.
-   *
-   * IMPORTANT: THIS TABLE IS FOR *ADDITIONAL* VERSION RANGES THAT ARE ALTERNATIVES TO THE
-   * USUAL VERSION (WHICH IS INFERRED BY LOOKING AT ALL PROJECTS IN THE REPO).
-   * This design avoids unnecessary churn in this file.
-   */
-  "allowedAlternativeVersions": {
-    /**
-     * For example, allow some projects to use an older TypeScript compiler
-     * (in addition to whatever "usual" version is being used by other projects in the repo):
-     */
-    // "typescript": [
-    //   "~2.4.0"
-    // ]
-  }
-}

+ 0 - 32
src/renderer/cocoblockly-x/ya-webadb/common/config/rush/experiments.json

@@ -1,32 +0,0 @@
-/**
- * This configuration file allows repo maintainers to enable and disable experimental
- * Rush features.  More documentation is available on the Rush website: https://rushjs.io
- */
-{
-  "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/experiments.schema.json",
-
-  /**
-   * By default, 'rush install' passes --no-prefer-frozen-lockfile to 'pnpm install'.
-   * Set this option to true to pass '--frozen-lockfile' instead for faster installs.
-   */
-  // "usePnpmFrozenLockfileForRushInstall": true,
-
-  /**
-   * By default, 'rush update' passes --no-prefer-frozen-lockfile to 'pnpm install'.
-   * Set this option to true to pass '--prefer-frozen-lockfile' instead to minimize shrinkwrap changes.
-   */
-  // "usePnpmPreferFrozenLockfileForRushUpdate": true,
-
-  /**
-   * If using the 'preventManualShrinkwrapChanges' option, restricts the hash to only include the layout of external dependencies.
-   * Used to allow links between workspace projects or the addition/removal of references to existing dependency versions to not
-   * cause hash changes.
-   */
-  // "omitImportersFromPreventManualShrinkwrapChanges": true,
-
-  /**
-   * If true, the chmod field in temporary project tar headers will not be normalized.
-   * This normalization can help ensure consistent tarball integrity across platforms.
-   */
-  // "noChmodFieldInTarHeaderNormalization": true
-}

+ 0 - 7
src/renderer/cocoblockly-x/ya-webadb/common/config/rush/pnpm-config.json

@@ -1,7 +0,0 @@
-{
-    "$schema": "https://raw.githubusercontent.com/microsoft/rushstack/main/libraries/rush-lib/src/schemas/pnpm-config.schema.json",
-    "pnpmStore": "global",
-    "strictPeerDependencies": false,
-    "useWorkspaces": true,
-    "preventManualShrinkwrapChanges": true
-}

+ 0 - 14571
src/renderer/cocoblockly-x/ya-webadb/common/config/rush/pnpm-lock.yaml

@@ -1,14571 +0,0 @@
-lockfileVersion: 5.4
-
-importers:
-
-  .:
-    specifiers: {}
-
-  ../../apps/book:
-    specifiers:
-      '@docusaurus/core': ^2.2.0
-      '@docusaurus/preset-classic': ^2.2.0
-      '@mdx-js/react': ^2.1.5
-      '@svgr/webpack': ^6.5.1
-      clsx: ^1.1.1
-      file-loader: ^6.2.0
-      mini-svg-data-uri: ^1.3.3
-      node-fetch: ^3.3.0
-      plantuml-encoder: ^1.4.0
-      react: ^18.2.0
-      react-dom: ^18.2.0
-      unist-util-visit: ^2.0.3
-      url-loader: ^4.1.1
-    dependencies:
-      '@docusaurus/core': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/preset-classic': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@mdx-js/react': 2.1.5_react@18.2.0
-      '@svgr/webpack': 6.5.1
-      clsx: 1.2.1
-      file-loader: 6.2.0
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      url-loader: 4.1.1_file-loader@6.2.0
-    devDependencies:
-      mini-svg-data-uri: 1.4.4
-      node-fetch: 3.3.0
-      plantuml-encoder: 1.4.0
-      unist-util-visit: 2.0.3
-
-  ../../apps/demo:
-    specifiers:
-      '@fluentui/react': ^8.101.1
-      '@fluentui/react-file-type-icons': ^8.8.2
-      '@fluentui/react-hooks': ^8.6.14
-      '@fluentui/react-icons': ^2.0.187
-      '@fluentui/style-utilities': ^8.8.3
-      '@griffel/react': ^1.4.2
-      '@mdx-js/loader': ^2.1.5
-      '@next/mdx': ^13.0.3
-      '@types/react': 18.0.25
-      '@yume-chan/adb': workspace:^0.0.17
-      '@yume-chan/adb-backend-direct-sockets': workspace:^0.0.9
-      '@yume-chan/adb-backend-webusb': workspace:^0.0.17
-      '@yume-chan/adb-backend-ws': workspace:^0.0.9
-      '@yume-chan/adb-credential-web': workspace:^0.0.17
-      '@yume-chan/android-bin': workspace:^0.0.17
-      '@yume-chan/async': ^2.2.0
-      '@yume-chan/b-tree': workspace:^0.0.16
-      '@yume-chan/event': workspace:^0.0.17
-      '@yume-chan/scrcpy': workspace:^0.0.17
-      '@yume-chan/scrcpy-decoder-tinyh264': workspace:^0.0.17
-      '@yume-chan/scrcpy-decoder-webcodecs': workspace:^0.0.17
-      '@yume-chan/stream-extra': workspace:^0.0.17
-      '@yume-chan/stream-saver': ^2.0.6
-      '@yume-chan/struct': workspace:^0.0.17
-      awesome-typescript-loader: ^3.2.3
-      eslint: 8.27.0
-      eslint-config-next: 13.0.3
-      mobx: ^6.7.0
-      mobx-react-lite: ^3.4.0
-      next: 13.0.3
-      react: ^18.2.0
-      react-dom: ^18.2.0
-      source-map-loader: ^4.0.1
-      typescript: ^4.8.4
-      xterm: ^5.0.0
-      xterm-addon-fit: ^0.6.0
-      xterm-addon-search: ^0.10.0
-      xterm-addon-webgl: ^0.13.0
-    dependencies:
-      '@fluentui/react': 8.101.1_2zx2umvpluuhvlq44va5bta2da
-      '@fluentui/react-file-type-icons': 8.8.2_fan5qbzahqtxlm5dzefqlqx5ia
-      '@fluentui/react-hooks': 8.6.14_fan5qbzahqtxlm5dzefqlqx5ia
-      '@fluentui/react-icons': 2.0.187_it3lvsvbvb6ccu3ygofv6sq6xa
-      '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia
-      '@griffel/react': 1.4.2_react@18.2.0
-      '@yume-chan/adb': link:../../libraries/adb
-      '@yume-chan/adb-backend-direct-sockets': link:../../libraries/adb-backend-direct-sockets
-      '@yume-chan/adb-backend-webusb': link:../../libraries/adb-backend-webusb
-      '@yume-chan/adb-backend-ws': link:../../libraries/adb-backend-ws
-      '@yume-chan/adb-credential-web': link:../../libraries/adb-credential-web
-      '@yume-chan/android-bin': link:../../libraries/android-bin
-      '@yume-chan/async': 2.2.0
-      '@yume-chan/b-tree': link:../../libraries/b-tree
-      '@yume-chan/event': link:../../libraries/event
-      '@yume-chan/scrcpy': link:../../libraries/scrcpy
-      '@yume-chan/scrcpy-decoder-tinyh264': link:../../libraries/scrcpy-decoder-tinyh264
-      '@yume-chan/scrcpy-decoder-webcodecs': link:../../libraries/scrcpy-decoder-webcodecs
-      '@yume-chan/stream-extra': link:../../libraries/stream-extra
-      '@yume-chan/stream-saver': 2.0.6
-      '@yume-chan/struct': link:../../libraries/struct
-      mobx: 6.7.0
-      mobx-react-lite: 3.4.0_jofyzmwkboewm6mjrhi25mngky
-      next: 13.0.3_biqbaboplfbrettd7655fr4n2y
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      xterm: 5.0.0
-      xterm-addon-fit: 0.6.0_xterm@5.0.0
-      xterm-addon-search: 0.10.0_xterm@5.0.0
-      xterm-addon-webgl: 0.13.0_xterm@5.0.0
-    devDependencies:
-      '@mdx-js/loader': 2.1.5
-      '@next/mdx': 13.0.3_@mdx-js+loader@2.1.5
-      '@types/react': 18.0.25
-      awesome-typescript-loader: 3.5.0_typescript@4.8.4
-      eslint: 8.27.0
-      eslint-config-next: 13.0.3_rmayb2veg2btbq6mbmnyivgasy
-      source-map-loader: 4.0.1
-      typescript: 4.8.4
-
-  ../../libraries/adb:
-    specifiers:
-      '@jest/globals': ^29.3.1
-      '@types/node': ^18.11.9
-      '@yume-chan/async': ^2.2.0
-      '@yume-chan/dataview-bigint-polyfill': workspace:^0.0.17
-      '@yume-chan/event': workspace:^0.0.17
-      '@yume-chan/stream-extra': workspace:^0.0.17
-      '@yume-chan/struct': workspace:^0.0.17
-      '@yume-chan/ts-package-builder': workspace:^1.0.0
-      cross-env: ^7.0.3
-      jest: ^29.3.1
-      ts-jest: ^29.0.3
-      tslib: ^2.4.1
-      typescript: ^4.8.4
-    dependencies:
-      '@yume-chan/async': 2.2.0
-      '@yume-chan/dataview-bigint-polyfill': link:../dataview-bigint-polyfill
-      '@yume-chan/event': link:../event
-      '@yume-chan/stream-extra': link:../stream-extra
-      '@yume-chan/struct': link:../struct
-      tslib: 2.4.1
-    devDependencies:
-      '@jest/globals': 29.3.1
-      '@types/node': 18.11.9
-      '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder
-      cross-env: 7.0.3
-      jest: 29.3.1_@types+node@18.11.9
-      ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se
-      typescript: 4.8.4
-
-  ../../libraries/adb-backend-direct-sockets:
-    specifiers:
-      '@yume-chan/adb': workspace:^0.0.17
-      '@yume-chan/stream-extra': workspace:^0.0.17
-      '@yume-chan/ts-package-builder': workspace:^1.0.0
-      tslib: ^2.4.1
-      typescript: ^4.8.4
-    dependencies:
-      '@yume-chan/adb': link:../adb
-      '@yume-chan/stream-extra': link:../stream-extra
-      tslib: 2.4.1
-    devDependencies:
-      '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder
-      typescript: 4.8.4
-
-  ../../libraries/adb-backend-webusb:
-    specifiers:
-      '@types/w3c-web-usb': ^1.0.6
-      '@yume-chan/adb': workspace:^0.0.17
-      '@yume-chan/stream-extra': workspace:^0.0.17
-      '@yume-chan/struct': workspace:^0.0.17
-      '@yume-chan/ts-package-builder': workspace:^1.0.0
-      jest: ^29.3.1
-      tslib: ^2.4.1
-      typescript: ^4.8.4
-    dependencies:
-      '@types/w3c-web-usb': 1.0.6
-      '@yume-chan/adb': link:../adb
-      '@yume-chan/stream-extra': link:../stream-extra
-      '@yume-chan/struct': link:../struct
-      tslib: 2.4.1
-    devDependencies:
-      '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder
-      jest: 29.3.1
-      typescript: 4.8.4
-
-  ../../libraries/adb-backend-ws:
-    specifiers:
-      '@yume-chan/adb': workspace:^0.0.17
-      '@yume-chan/stream-extra': workspace:^0.0.17
-      '@yume-chan/ts-package-builder': workspace:^1.0.0
-      jest: ^29.3.1
-      tslib: ^2.4.1
-      typescript: ^4.8.4
-    dependencies:
-      '@yume-chan/adb': link:../adb
-      '@yume-chan/stream-extra': link:../stream-extra
-      tslib: 2.4.1
-    devDependencies:
-      '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder
-      jest: 29.3.1
-      typescript: 4.8.4
-
-  ../../libraries/adb-credential-web:
-    specifiers:
-      '@yume-chan/adb': workspace:^0.0.17
-      '@yume-chan/ts-package-builder': workspace:^1.0.0
-      tslib: ^2.4.1
-      typescript: ^4.8.4
-    dependencies:
-      '@yume-chan/adb': link:../adb
-      tslib: 2.4.1
-    devDependencies:
-      '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder
-      typescript: 4.8.4
-
-  ../../libraries/android-bin:
-    specifiers:
-      '@yume-chan/adb': workspace:^0.0.17
-      '@yume-chan/stream-extra': workspace:^0.0.17
-      '@yume-chan/struct': workspace:^0.0.17
-      '@yume-chan/ts-package-builder': workspace:^1.0.0
-      tslib: ^2.4.1
-      typescript: ^4.8.4
-    dependencies:
-      '@yume-chan/adb': link:../adb
-      '@yume-chan/stream-extra': link:../stream-extra
-      '@yume-chan/struct': link:../struct
-      tslib: 2.4.1
-    devDependencies:
-      '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder
-      typescript: 4.8.4
-
-  ../../libraries/b-tree:
-    specifiers:
-      '@jest/globals': ^29.3.1
-      '@yume-chan/ts-package-builder': workspace:^1.0.0
-      cross-env: ^7.0.3
-      jest: ^29.3.1
-      ts-jest: ^29.0.3
-      tslib: ^2.4.1
-      typescript: ^4.8.4
-    dependencies:
-      tslib: 2.4.1
-    devDependencies:
-      '@jest/globals': 29.3.1
-      '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder
-      cross-env: 7.0.3
-      jest: 29.3.1
-      ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se
-      typescript: 4.8.4
-
-  ../../libraries/dataview-bigint-polyfill:
-    specifiers:
-      '@yume-chan/ts-package-builder': workspace:^1.0.0
-      jest: ^29.3.1
-      tslib: ^2.4.1
-      typescript: ^4.8.4
-    dependencies:
-      tslib: 2.4.1
-    devDependencies:
-      '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder
-      jest: 29.3.1
-      typescript: 4.8.4
-
-  ../../libraries/event:
-    specifiers:
-      '@jest/globals': ^29.3.1
-      '@yume-chan/async': ^2.2.0
-      '@yume-chan/ts-package-builder': workspace:^1.0.0
-      cross-env: ^7.0.3
-      jest: ^29.3.1
-      ts-jest: ^29.0.3
-      tslib: ^2.4.1
-      typescript: ^4.8.4
-    dependencies:
-      '@yume-chan/async': 2.2.0
-      tslib: 2.4.1
-    devDependencies:
-      '@jest/globals': 29.3.1
-      '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder
-      cross-env: 7.0.3
-      jest: 29.3.1
-      ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se
-      typescript: 4.8.4
-
-  ../../libraries/scrcpy:
-    specifiers:
-      '@jest/globals': ^29.3.1
-      '@yume-chan/adb': workspace:^0.0.17
-      '@yume-chan/async': ^2.2.0
-      '@yume-chan/event': workspace:^0.0.17
-      '@yume-chan/stream-extra': workspace:^0.0.17
-      '@yume-chan/struct': workspace:^0.0.17
-      '@yume-chan/ts-package-builder': workspace:^1.0.0
-      cross-env: ^7.0.3
-      gh-release-fetch: ^3.0.2
-      jest: ^29.3.1
-      ts-jest: ^29.0.3
-      tslib: ^2.4.1
-      typescript: ^4.8.4
-    dependencies:
-      '@yume-chan/async': 2.2.0
-      '@yume-chan/event': link:../event
-      '@yume-chan/stream-extra': link:../stream-extra
-      '@yume-chan/struct': link:../struct
-      tslib: 2.4.1
-    devDependencies:
-      '@jest/globals': 29.3.1
-      '@yume-chan/adb': link:../adb
-      '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder
-      cross-env: 7.0.3
-      gh-release-fetch: 3.0.2
-      jest: 29.3.1
-      ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se
-      typescript: 4.8.4
-
-  ../../libraries/scrcpy-decoder-tinyh264:
-    specifiers:
-      '@jest/globals': ^29.3.1
-      '@yume-chan/async': ^2.2.0
-      '@yume-chan/event': workspace:^0.0.17
-      '@yume-chan/scrcpy': workspace:^0.0.17
-      '@yume-chan/stream-extra': workspace:^0.0.17
-      '@yume-chan/ts-package-builder': workspace:^1.0.0
-      cross-env: ^7.0.3
-      jest: ^29.3.1
-      tinyh264: ^0.0.7
-      ts-jest: ^29.0.3
-      tslib: ^2.4.1
-      typescript: ^4.8.4
-      yuv-buffer: ^1.0.0
-      yuv-canvas: ^1.2.11
-    dependencies:
-      '@yume-chan/async': 2.2.0
-      '@yume-chan/event': link:../event
-      '@yume-chan/scrcpy': link:../scrcpy
-      '@yume-chan/stream-extra': link:../stream-extra
-      tinyh264: 0.0.7
-      tslib: 2.4.1
-      yuv-buffer: 1.0.0
-      yuv-canvas: 1.2.11
-    devDependencies:
-      '@jest/globals': 29.3.1
-      '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder
-      cross-env: 7.0.3
-      jest: 29.3.1
-      ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se
-      typescript: 4.8.4
-
-  ../../libraries/scrcpy-decoder-webcodecs:
-    specifiers:
-      '@jest/globals': ^29.3.1
-      '@types/dom-webcodecs': ^0.1.5
-      '@yume-chan/scrcpy': workspace:^0.0.17
-      '@yume-chan/stream-extra': workspace:^0.0.17
-      '@yume-chan/ts-package-builder': workspace:^1.0.0
-      cross-env: ^7.0.3
-      jest: ^29.3.1
-      ts-jest: ^29.0.3
-      tslib: ^2.4.1
-      typescript: ^4.8.4
-    dependencies:
-      '@types/dom-webcodecs': 0.1.5
-      '@yume-chan/scrcpy': link:../scrcpy
-      '@yume-chan/stream-extra': link:../stream-extra
-      tslib: 2.4.1
-    devDependencies:
-      '@jest/globals': 29.3.1
-      '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder
-      cross-env: 7.0.3
-      jest: 29.3.1
-      ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se
-      typescript: 4.8.4
-
-  ../../libraries/stream-extra:
-    specifiers:
-      '@jest/globals': ^29.3.1
-      '@yume-chan/async': ^2.2.0
-      '@yume-chan/struct': workspace:^0.0.17
-      '@yume-chan/ts-package-builder': workspace:^1.0.0
-      cross-env: ^7.0.3
-      jest: ^29.3.1
-      ts-jest: ^29.0.3
-      tslib: ^2.4.1
-      typescript: ^4.8.4
-      web-streams-polyfill: ^4.0.0-beta.3
-    dependencies:
-      '@yume-chan/async': 2.2.0
-      '@yume-chan/struct': link:../struct
-      tslib: 2.4.1
-      web-streams-polyfill: 4.0.0-beta.3
-    devDependencies:
-      '@jest/globals': 29.3.1
-      '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder
-      cross-env: 7.0.3
-      jest: 29.3.1
-      ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se
-      typescript: 4.8.4
-
-  ../../libraries/struct:
-    specifiers:
-      '@jest/globals': ^29.3.1
-      '@yume-chan/dataview-bigint-polyfill': workspace:^0.0.17
-      '@yume-chan/ts-package-builder': workspace:^1.0.0
-      cross-env: ^7.0.3
-      jest: ^29.3.1
-      ts-jest: ^29.0.3
-      tslib: ^2.4.1
-      typescript: ^4.8.4
-    dependencies:
-      '@yume-chan/dataview-bigint-polyfill': link:../dataview-bigint-polyfill
-      tslib: 2.4.1
-    devDependencies:
-      '@jest/globals': 29.3.1
-      '@yume-chan/ts-package-builder': link:../../toolchain/ts-package-builder
-      cross-env: 7.0.3
-      jest: 29.3.1
-      ts-jest: 29.0.3_r24ewcothphvclnu77pxb4u4se
-      typescript: 4.8.4
-
-  ../../toolchain/ts-package-builder:
-    specifiers:
-      '@types/node': ^18.11.9
-      json5: ^2.2.0
-    dependencies:
-      json5: 2.2.1
-    devDependencies:
-      '@types/node': 18.11.9
-
-packages:
-
-  /@algolia/autocomplete-core/1.7.1:
-    resolution: {integrity: sha512-eiZw+fxMzNQn01S8dA/hcCpoWCOCwcIIEUtHHdzN5TGB3IpzLbuhqFeTfh2OUhhgkE8Uo17+wH+QJ/wYyQmmzg==}
-    dependencies:
-      '@algolia/autocomplete-shared': 1.7.1
-    dev: false
-
-  /@algolia/autocomplete-preset-algolia/1.7.1_algoliasearch@4.14.0:
-    resolution: {integrity: sha512-pJwmIxeJCymU1M6cGujnaIYcY3QPOVYZOXhFkWVM7IxKzy272BwCvMFMyc5NpG/QmiObBxjo7myd060OeTNJXg==}
-    peerDependencies:
-      '@algolia/client-search': ^4.9.1
-      algoliasearch: ^4.9.1
-    dependencies:
-      '@algolia/autocomplete-shared': 1.7.1
-      algoliasearch: 4.14.0
-    dev: false
-
-  /@algolia/autocomplete-shared/1.7.1:
-    resolution: {integrity: sha512-eTmGVqY3GeyBTT8IWiB2K5EuURAqhnumfktAEoHxfDY2o7vg2rSnO16ZtIG0fMgt3py28Vwgq42/bVEuaQV7pg==}
-    dev: false
-
-  /@algolia/cache-browser-local-storage/4.14.0:
-    resolution: {integrity: sha512-vSX0uPTgTuWdKOv0DbjFBl5AGlWDzYADtv5ChLBBKHTBhAKp4f9b38zDB0v89pCbcoAGZjtb6UTM+pUEVSTuSw==}
-    dependencies:
-      '@algolia/cache-common': 4.14.0
-    dev: false
-
-  /@algolia/cache-common/4.14.0:
-    resolution: {integrity: sha512-9bCWX78td6DEtyVIJc2R8MokniFFgbS5r9ADVvBuBeDtVuNhOwDO/MYZ2WlAQJTwos9TtS9v0iJ9Ym0rDHMldA==}
-    dev: false
-
-  /@algolia/cache-in-memory/4.14.0:
-    resolution: {integrity: sha512-kIH9JjebSsZVxnTjaWarunFkWaHnMZ5vG98KwvQj++I4PCMgk7z/GBm9bMNgPUsDPqHxQ0p9HO/j8YgN6VYxgQ==}
-    dependencies:
-      '@algolia/cache-common': 4.14.0
-    dev: false
-
-  /@algolia/client-account/4.14.0:
-    resolution: {integrity: sha512-b0rAB3D2rf5qOeBZbUNcixl9EmiVPz6QgEvP2TC3Ed85+8xdVhtbyLD5EzTHQr2BPXvklo5NK1K5Q3UOZ9ojJQ==}
-    dependencies:
-      '@algolia/client-common': 4.14.0
-      '@algolia/client-search': 4.14.0
-      '@algolia/transporter': 4.14.0
-    dev: false
-
-  /@algolia/client-analytics/4.14.0:
-    resolution: {integrity: sha512-HcuAbUP2D2SZiV8pvBd6ZoJNJ1Zu5bvUctCknGS7QVQv4xfeDHFcQulwEPftKBhIoJmVZPsQznpeLf+PTGTA+w==}
-    dependencies:
-      '@algolia/client-common': 4.14.0
-      '@algolia/client-search': 4.14.0
-      '@algolia/requester-common': 4.14.0
-      '@algolia/transporter': 4.14.0
-    dev: false
-
-  /@algolia/client-common/4.14.0:
-    resolution: {integrity: sha512-7pmtPOicY6QEBQEYinChkVVi0SnDGcgJn1P0GkWxIMD23ZQk7o0/eMAQYqkGR3TET6YB/bZDeDrpL5v4DKN3tg==}
-    dependencies:
-      '@algolia/requester-common': 4.14.0
-      '@algolia/transporter': 4.14.0
-    dev: false
-
-  /@algolia/client-personalization/4.14.0:
-    resolution: {integrity: sha512-O/vADaSZYAzL0o8L+2QeTZr1O3VXu8DjBUXnEWWgn96v6zqTH0aoQsQ7gvYEsGNvTGiZZwNJNruzMaBNG0GNUA==}
-    dependencies:
-      '@algolia/client-common': 4.14.0
-      '@algolia/requester-common': 4.14.0
-      '@algolia/transporter': 4.14.0
-    dev: false
-
-  /@algolia/client-search/4.14.0:
-    resolution: {integrity: sha512-gFxteVMUzEMq6lDEex/gZKNudrFmOFLuWS9SQCU+sXeTCRw32aY5/RBDigOkD6Yp6nLkfnYWvPnDshwY6WgTbw==}
-    dependencies:
-      '@algolia/client-common': 4.14.0
-      '@algolia/requester-common': 4.14.0
-      '@algolia/transporter': 4.14.0
-    dev: false
-
-  /@algolia/events/4.0.1:
-    resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==}
-    dev: false
-
-  /@algolia/logger-common/4.14.0:
-    resolution: {integrity: sha512-1Fw+5Nd4d7NWNA9FhOIIXzESJn+j5VTO/f3YK+XhoOlbAwfMbD32InWEjNglrcHnSO8kpqrizFXveKTx1CzoKw==}
-    dev: false
-
-  /@algolia/logger-console/4.14.0:
-    resolution: {integrity: sha512-nBJwg1TVdzAZCIA5tIFYKA+QqYGD9iRhO8yEdm68VcOeckyNTQuvJtAkWyvzr2qNL6GD+bN8nUQ8Cf5HFy/wZg==}
-    dependencies:
-      '@algolia/logger-common': 4.14.0
-    dev: false
-
-  /@algolia/requester-browser-xhr/4.14.0:
-    resolution: {integrity: sha512-J4ND/l0/wOyztyOA3F4kFNIj/QDTeiS45m3hqSCVXpIJn/iq1ZP8zYW5q0/2sEMehO8TawVJiHnXYV0kO0Dk0Q==}
-    dependencies:
-      '@algolia/requester-common': 4.14.0
-    dev: false
-
-  /@algolia/requester-common/4.14.0:
-    resolution: {integrity: sha512-8DGIW5keIbAFet2TKGr/C9DVJ1r8IWFjgf4URPHn6NHMf6R+ruQp0gOf7xBP1Bw6JIS3/DbvlGqbw8sNO/N+Hw==}
-    dev: false
-
-  /@algolia/requester-node-http/4.14.0:
-    resolution: {integrity: sha512-DP0k1H9c6+lR4G/jKG4kez3QW1ksUDSSSSy3I8nhPZErIGgd0IqCTXDt1GwykDEkvYj/l4sA3x8pJtDMW3JSzw==}
-    dependencies:
-      '@algolia/requester-common': 4.14.0
-    dev: false
-
-  /@algolia/transporter/4.14.0:
-    resolution: {integrity: sha512-AP+8Qxeg0XvQ3rFbj4pIUzDMmtjo5pgBMx/57ADbge5Y4Y9ByDdQNjEKk6QFIe70SAwR/cGzglwYg7nl8mK/OA==}
-    dependencies:
-      '@algolia/cache-common': 4.14.0
-      '@algolia/logger-common': 4.14.0
-      '@algolia/requester-common': 4.14.0
-    dev: false
-
-  /@ampproject/remapping/2.2.0:
-    resolution: {integrity: sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==}
-    engines: {node: '>=6.0.0'}
-    dependencies:
-      '@jridgewell/gen-mapping': 0.1.1
-      '@jridgewell/trace-mapping': 0.3.14
-
-  /@babel/code-frame/7.18.6:
-    resolution: {integrity: sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/highlight': 7.18.6
-
-  /@babel/compat-data/7.18.8:
-    resolution: {integrity: sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ==}
-    engines: {node: '>=6.9.0'}
-    dev: false
-
-  /@babel/compat-data/7.20.1:
-    resolution: {integrity: sha512-EWZ4mE2diW3QALKvDMiXnbZpRvlj+nayZ112nK93SnhqOtpdsbVD4W+2tEoT3YNBAG9RBR0ISY758ZkOgsn6pQ==}
-    engines: {node: '>=6.9.0'}
-
-  /@babel/core/7.12.9:
-    resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/code-frame': 7.18.6
-      '@babel/generator': 7.20.4
-      '@babel/helper-module-transforms': 7.20.2
-      '@babel/helpers': 7.20.1
-      '@babel/parser': 7.20.3
-      '@babel/template': 7.18.10
-      '@babel/traverse': 7.20.1
-      '@babel/types': 7.20.2
-      convert-source-map: 1.8.0
-      debug: 4.3.4
-      gensync: 1.0.0-beta.2
-      json5: 2.2.1
-      lodash: 4.17.21
-      resolve: 1.22.1
-      semver: 5.7.1
-      source-map: 0.5.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/core/7.18.9:
-    resolution: {integrity: sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@ampproject/remapping': 2.2.0
-      '@babel/code-frame': 7.18.6
-      '@babel/generator': 7.18.9
-      '@babel/helper-compilation-targets': 7.18.9_@babel+core@7.18.9
-      '@babel/helper-module-transforms': 7.18.9
-      '@babel/helpers': 7.18.9
-      '@babel/parser': 7.18.9
-      '@babel/template': 7.18.6
-      '@babel/traverse': 7.18.9
-      '@babel/types': 7.18.9
-      convert-source-map: 1.8.0
-      debug: 4.3.4
-      gensync: 1.0.0-beta.2
-      json5: 2.2.1
-      semver: 6.3.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/core/7.20.2:
-    resolution: {integrity: sha512-w7DbG8DtMrJcFOi4VrLm+8QM4az8Mo+PuLBKLp2zrYRCow8W/f9xiXm5sN53C8HksCyDQwCKha9JiDoIyPjT2g==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@ampproject/remapping': 2.2.0
-      '@babel/code-frame': 7.18.6
-      '@babel/generator': 7.20.4
-      '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2
-      '@babel/helper-module-transforms': 7.20.2
-      '@babel/helpers': 7.20.1
-      '@babel/parser': 7.20.3
-      '@babel/template': 7.18.10
-      '@babel/traverse': 7.20.1
-      '@babel/types': 7.20.2
-      convert-source-map: 1.8.0
-      debug: 4.3.4
-      gensync: 1.0.0-beta.2
-      json5: 2.2.1
-      semver: 6.3.0
-    transitivePeerDependencies:
-      - supports-color
-
-  /@babel/generator/7.18.9:
-    resolution: {integrity: sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.18.9
-      '@jridgewell/gen-mapping': 0.3.2
-      jsesc: 2.5.2
-    dev: false
-
-  /@babel/generator/7.20.4:
-    resolution: {integrity: sha512-luCf7yk/cm7yab6CAW1aiFnmEfBJplb/JojV56MYEK7ziWfGmFlTfmL9Ehwfy4gFhbjBfWO1wj7/TuSbVNEEtA==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.20.2
-      '@jridgewell/gen-mapping': 0.3.2
-      jsesc: 2.5.2
-
-  /@babel/helper-annotate-as-pure/7.18.6:
-    resolution: {integrity: sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.20.2
-    dev: false
-
-  /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9:
-    resolution: {integrity: sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-explode-assignable-expression': 7.18.6
-      '@babel/types': 7.20.2
-    dev: false
-
-  /@babel/helper-compilation-targets/7.18.9_@babel+core@7.18.9:
-    resolution: {integrity: sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/compat-data': 7.18.8
-      '@babel/core': 7.18.9
-      '@babel/helper-validator-option': 7.18.6
-      browserslist: 4.21.2
-      semver: 6.3.0
-    dev: false
-
-  /@babel/helper-compilation-targets/7.20.0_@babel+core@7.18.9:
-    resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/compat-data': 7.20.1
-      '@babel/core': 7.18.9
-      '@babel/helper-validator-option': 7.18.6
-      browserslist: 4.21.4
-      semver: 6.3.0
-    dev: false
-
-  /@babel/helper-compilation-targets/7.20.0_@babel+core@7.20.2:
-    resolution: {integrity: sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/compat-data': 7.20.1
-      '@babel/core': 7.20.2
-      '@babel/helper-validator-option': 7.18.6
-      browserslist: 4.21.4
-      semver: 6.3.0
-
-  /@babel/helper-create-class-features-plugin/7.18.9_@babel+core@7.18.9:
-    resolution: {integrity: sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-annotate-as-pure': 7.18.6
-      '@babel/helper-environment-visitor': 7.18.9
-      '@babel/helper-function-name': 7.19.0
-      '@babel/helper-member-expression-to-functions': 7.18.9
-      '@babel/helper-optimise-call-expression': 7.18.6
-      '@babel/helper-replace-supers': 7.19.1
-      '@babel/helper-split-export-declaration': 7.18.6
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/helper-create-class-features-plugin/7.18.9_@babel+core@7.20.2:
-    resolution: {integrity: sha512-WvypNAYaVh23QcjpMR24CwZY2Nz6hqdOcFdPbNpV56hL5H6KiFheO7Xm1aPdlLQ7d5emYZX7VZwPp9x3z+2opw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-annotate-as-pure': 7.18.6
-      '@babel/helper-environment-visitor': 7.18.9
-      '@babel/helper-function-name': 7.19.0
-      '@babel/helper-member-expression-to-functions': 7.18.9
-      '@babel/helper-optimise-call-expression': 7.18.6
-      '@babel/helper-replace-supers': 7.19.1
-      '@babel/helper-split-export-declaration': 7.18.6
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/helper-create-regexp-features-plugin/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-annotate-as-pure': 7.18.6
-      regexpu-core: 5.1.0
-    dev: false
-
-  /@babel/helper-create-regexp-features-plugin/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-annotate-as-pure': 7.18.6
-      regexpu-core: 5.1.0
-    dev: false
-
-  /@babel/helper-create-regexp-features-plugin/7.19.0_@babel+core@7.18.9:
-    resolution: {integrity: sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-annotate-as-pure': 7.18.6
-      regexpu-core: 5.1.0
-    dev: false
-
-  /@babel/helper-create-regexp-features-plugin/7.19.0_@babel+core@7.20.2:
-    resolution: {integrity: sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-annotate-as-pure': 7.18.6
-      regexpu-core: 5.1.0
-    dev: false
-
-  /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.18.9:
-    resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==}
-    peerDependencies:
-      '@babel/core': ^7.4.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      debug: 4.3.4
-      lodash.debounce: 4.0.8
-      resolve: 1.22.1
-      semver: 6.3.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/helper-define-polyfill-provider/0.3.3_@babel+core@7.20.2:
-    resolution: {integrity: sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==}
-    peerDependencies:
-      '@babel/core': ^7.4.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      debug: 4.3.4
-      lodash.debounce: 4.0.8
-      resolve: 1.22.1
-      semver: 6.3.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/helper-environment-visitor/7.18.9:
-    resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==}
-    engines: {node: '>=6.9.0'}
-
-  /@babel/helper-explode-assignable-expression/7.18.6:
-    resolution: {integrity: sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.20.2
-    dev: false
-
-  /@babel/helper-function-name/7.18.9:
-    resolution: {integrity: sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/template': 7.18.6
-      '@babel/types': 7.18.9
-    dev: false
-
-  /@babel/helper-function-name/7.19.0:
-    resolution: {integrity: sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/template': 7.18.10
-      '@babel/types': 7.20.2
-
-  /@babel/helper-hoist-variables/7.18.6:
-    resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.18.9
-
-  /@babel/helper-member-expression-to-functions/7.18.9:
-    resolution: {integrity: sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.20.2
-    dev: false
-
-  /@babel/helper-module-imports/7.18.6:
-    resolution: {integrity: sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.18.9
-
-  /@babel/helper-module-transforms/7.18.9:
-    resolution: {integrity: sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-environment-visitor': 7.18.9
-      '@babel/helper-module-imports': 7.18.6
-      '@babel/helper-simple-access': 7.18.6
-      '@babel/helper-split-export-declaration': 7.18.6
-      '@babel/helper-validator-identifier': 7.18.6
-      '@babel/template': 7.18.6
-      '@babel/traverse': 7.18.9
-      '@babel/types': 7.18.9
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/helper-module-transforms/7.20.2:
-    resolution: {integrity: sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-environment-visitor': 7.18.9
-      '@babel/helper-module-imports': 7.18.6
-      '@babel/helper-simple-access': 7.20.2
-      '@babel/helper-split-export-declaration': 7.18.6
-      '@babel/helper-validator-identifier': 7.19.1
-      '@babel/template': 7.18.10
-      '@babel/traverse': 7.20.1
-      '@babel/types': 7.20.2
-    transitivePeerDependencies:
-      - supports-color
-
-  /@babel/helper-optimise-call-expression/7.18.6:
-    resolution: {integrity: sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.20.2
-    dev: false
-
-  /@babel/helper-plugin-utils/7.10.4:
-    resolution: {integrity: sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==}
-    dev: false
-
-  /@babel/helper-plugin-utils/7.18.9:
-    resolution: {integrity: sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w==}
-    engines: {node: '>=6.9.0'}
-
-  /@babel/helper-plugin-utils/7.20.2:
-    resolution: {integrity: sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==}
-    engines: {node: '>=6.9.0'}
-
-  /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.18.9:
-    resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-annotate-as-pure': 7.18.6
-      '@babel/helper-environment-visitor': 7.18.9
-      '@babel/helper-wrap-function': 7.18.9
-      '@babel/types': 7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/helper-remap-async-to-generator/7.18.9_@babel+core@7.20.2:
-    resolution: {integrity: sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-annotate-as-pure': 7.18.6
-      '@babel/helper-environment-visitor': 7.18.9
-      '@babel/helper-wrap-function': 7.18.9
-      '@babel/types': 7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/helper-replace-supers/7.18.9:
-    resolution: {integrity: sha512-dNsWibVI4lNT6HiuOIBr1oyxo40HvIVmbwPUm3XZ7wMh4k2WxrxTqZwSqw/eEmXDS9np0ey5M2bz9tBmO9c+YQ==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-environment-visitor': 7.18.9
-      '@babel/helper-member-expression-to-functions': 7.18.9
-      '@babel/helper-optimise-call-expression': 7.18.6
-      '@babel/traverse': 7.20.1
-      '@babel/types': 7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/helper-replace-supers/7.19.1:
-    resolution: {integrity: sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-environment-visitor': 7.18.9
-      '@babel/helper-member-expression-to-functions': 7.18.9
-      '@babel/helper-optimise-call-expression': 7.18.6
-      '@babel/traverse': 7.20.1
-      '@babel/types': 7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/helper-simple-access/7.18.6:
-    resolution: {integrity: sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.18.9
-    dev: false
-
-  /@babel/helper-simple-access/7.20.2:
-    resolution: {integrity: sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.20.2
-
-  /@babel/helper-skip-transparent-expression-wrappers/7.18.9:
-    resolution: {integrity: sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.20.2
-    dev: false
-
-  /@babel/helper-split-export-declaration/7.18.6:
-    resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/types': 7.18.9
-
-  /@babel/helper-string-parser/7.19.4:
-    resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==}
-    engines: {node: '>=6.9.0'}
-
-  /@babel/helper-validator-identifier/7.18.6:
-    resolution: {integrity: sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g==}
-    engines: {node: '>=6.9.0'}
-
-  /@babel/helper-validator-identifier/7.19.1:
-    resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==}
-    engines: {node: '>=6.9.0'}
-
-  /@babel/helper-validator-option/7.18.6:
-    resolution: {integrity: sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==}
-    engines: {node: '>=6.9.0'}
-
-  /@babel/helper-wrap-function/7.18.9:
-    resolution: {integrity: sha512-cG2ru3TRAL6a60tfQflpEfs4ldiPwF6YW3zfJiRgmoFVIaC1vGnBBgatfec+ZUziPHkHSaXAuEck3Cdkf3eRpQ==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-function-name': 7.19.0
-      '@babel/template': 7.18.10
-      '@babel/traverse': 7.20.1
-      '@babel/types': 7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/helpers/7.18.9:
-    resolution: {integrity: sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/template': 7.18.6
-      '@babel/traverse': 7.18.9
-      '@babel/types': 7.18.9
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/helpers/7.20.1:
-    resolution: {integrity: sha512-J77mUVaDTUJFZ5BpP6mMn6OIl3rEWymk2ZxDBQJUG3P+PbmyMcF3bYWvz0ma69Af1oobDqT/iAsvzhB58xhQUg==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/template': 7.18.10
-      '@babel/traverse': 7.20.1
-      '@babel/types': 7.20.2
-    transitivePeerDependencies:
-      - supports-color
-
-  /@babel/highlight/7.18.6:
-    resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-validator-identifier': 7.18.6
-      chalk: 2.4.2
-      js-tokens: 4.0.0
-
-  /@babel/parser/7.18.9:
-    resolution: {integrity: sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg==}
-    engines: {node: '>=6.0.0'}
-    hasBin: true
-    dependencies:
-      '@babel/types': 7.18.9
-    dev: false
-
-  /@babel/parser/7.20.3:
-    resolution: {integrity: sha512-OP/s5a94frIPXwjzEcv5S/tpQfc6XhxYUnmWpgdqMWGgYCuErA3SzozaRAMQgSZWKeTJxht9aWAkUY+0UzvOFg==}
-    engines: {node: '>=6.0.0'}
-    hasBin: true
-    dependencies:
-      '@babel/types': 7.20.2
-
-  /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.18.9:
-    resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.13.0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-skip-transparent-expression-wrappers': 7.18.9
-      '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.18.9
-    dev: false
-
-  /@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/7.18.9_@babel+core@7.20.2:
-    resolution: {integrity: sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.13.0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-skip-transparent-expression-wrappers': 7.18.9
-      '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.20.2
-    dev: false
-
-  /@babel/plugin-proposal-async-generator-functions/7.20.1_@babel+core@7.18.9:
-    resolution: {integrity: sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-environment-visitor': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.18.9
-      '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.18.9
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-proposal-async-generator-functions/7.20.1_@babel+core@7.20.2:
-    resolution: {integrity: sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-environment-visitor': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.2
-      '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-proposal-class-properties/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.12.0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.18.9
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-proposal-class-static-block/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.12.0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.18.9
-    dev: false
-
-  /@babel/plugin-proposal-dynamic-import/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.2
-    dev: false
-
-  /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.18.9:
-    resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.18.9
-    dev: false
-
-  /@babel/plugin-proposal-export-namespace-from/7.18.9_@babel+core@7.20.2:
-    resolution: {integrity: sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.2
-    dev: false
-
-  /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.18.9
-    dev: false
-
-  /@babel/plugin-proposal-json-strings/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.2
-    dev: false
-
-  /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.18.9:
-    resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.18.9
-    dev: false
-
-  /@babel/plugin-proposal-logical-assignment-operators/7.18.9_@babel+core@7.20.2:
-    resolution: {integrity: sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.2
-    dev: false
-
-  /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.18.9
-    dev: false
-
-  /@babel/plugin-proposal-nullish-coalescing-operator/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.2
-    dev: false
-
-  /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.18.9
-    dev: false
-
-  /@babel/plugin-proposal-numeric-separator/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.2
-    dev: false
-
-  /@babel/plugin-proposal-object-rest-spread/7.12.1_@babel+core@7.12.9:
-    resolution: {integrity: sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.12.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9
-      '@babel/plugin-transform-parameters': 7.20.3_@babel+core@7.12.9
-    dev: false
-
-  /@babel/plugin-proposal-object-rest-spread/7.20.2_@babel+core@7.18.9:
-    resolution: {integrity: sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/compat-data': 7.20.1
-      '@babel/core': 7.18.9
-      '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.18.9
-      '@babel/plugin-transform-parameters': 7.20.3_@babel+core@7.18.9
-    dev: false
-
-  /@babel/plugin-proposal-object-rest-spread/7.20.2_@babel+core@7.20.2:
-    resolution: {integrity: sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/compat-data': 7.20.1
-      '@babel/core': 7.20.2
-      '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.2
-      '@babel/plugin-transform-parameters': 7.20.3_@babel+core@7.20.2
-    dev: false
-
-  /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.18.9
-    dev: false
-
-  /@babel/plugin-proposal-optional-catch-binding/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.2
-    dev: false
-
-  /@babel/plugin-proposal-optional-chaining/7.18.9_@babel+core@7.18.9:
-    resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-skip-transparent-expression-wrappers': 7.18.9
-      '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.18.9
-    dev: false
-
-  /@babel/plugin-proposal-optional-chaining/7.18.9_@babel+core@7.20.2:
-    resolution: {integrity: sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-skip-transparent-expression-wrappers': 7.18.9
-      '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.2
-    dev: false
-
-  /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-proposal-private-methods/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-annotate-as-pure': 7.18.6
-      '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.18.9
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-proposal-private-property-in-object/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-annotate-as-pure': 7.18.6
-      '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==}
-    engines: {node: '>=4'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-proposal-unicode-property-regex/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==}
-    engines: {node: '>=4'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.18.9:
-    resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.18.9
-    dev: false
-
-  /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.20.2:
-    resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.18.9
-
-  /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.20.2:
-    resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: true
-
-  /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.18.9:
-    resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.18.9
-    dev: false
-
-  /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.20.2:
-    resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.18.9
-
-  /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.18.9:
-    resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-syntax-class-static-block/7.14.5_@babel+core@7.20.2:
-    resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.18.9:
-    resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-syntax-dynamic-import/7.8.3_@babel+core@7.20.2:
-    resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.18.9:
-    resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-syntax-export-namespace-from/7.8.3_@babel+core@7.20.2:
-    resolution: {integrity: sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.18.9:
-    resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-syntax-import-assertions/7.20.0_@babel+core@7.20.2:
-    resolution: {integrity: sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.20.2:
-    resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: true
-
-  /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.18.9:
-    resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.18.9
-    dev: false
-
-  /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.20.2:
-    resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.18.9
-
-  /@babel/plugin-syntax-jsx/7.12.1_@babel+core@7.12.9:
-    resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.12.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-
-  /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.18.9:
-    resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.18.9
-    dev: false
-
-  /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.20.2:
-    resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.18.9
-
-  /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.18.9:
-    resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.18.9
-    dev: false
-
-  /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.20.2:
-    resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.18.9
-
-  /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.18.9:
-    resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.18.9
-    dev: false
-
-  /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.20.2:
-    resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.18.9
-
-  /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.12.9:
-    resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.12.9
-      '@babel/helper-plugin-utils': 7.18.9
-    dev: false
-
-  /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.18.9:
-    resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.18.9
-    dev: false
-
-  /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.20.2:
-    resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.18.9
-
-  /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.18.9:
-    resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.18.9
-    dev: false
-
-  /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.20.2:
-    resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.18.9
-
-  /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.18.9:
-    resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.18.9
-    dev: false
-
-  /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.20.2:
-    resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.18.9
-
-  /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.18.9:
-    resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-syntax-private-property-in-object/7.14.5_@babel+core@7.20.2:
-    resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.18.9:
-    resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.18.9
-    dev: false
-
-  /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.20.2:
-    resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.18.9
-
-  /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.18.9
-    dev: false
-
-  /@babel/plugin-syntax-typescript/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.18.9
-
-  /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-arrow-functions/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-module-imports': 7.18.6
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.18.9
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-transform-async-to-generator/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-module-imports': 7.18.6
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-remap-async-to-generator': 7.18.9_@babel+core@7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-block-scoped-functions/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-block-scoping/7.20.2_@babel+core@7.18.9:
-    resolution: {integrity: sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-block-scoping/7.20.2_@babel+core@7.20.2:
-    resolution: {integrity: sha512-y5V15+04ry69OV2wULmwhEA6jwSWXO1TwAtIwiPXcvHcoOQUqpyMVd2bDsQJMW8AurjulIyUV8kDqtjSwHy1uQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-classes/7.20.2_@babel+core@7.18.9:
-    resolution: {integrity: sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-annotate-as-pure': 7.18.6
-      '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.18.9
-      '@babel/helper-environment-visitor': 7.18.9
-      '@babel/helper-function-name': 7.19.0
-      '@babel/helper-optimise-call-expression': 7.18.6
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-replace-supers': 7.19.1
-      '@babel/helper-split-export-declaration': 7.18.6
-      globals: 11.12.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-transform-classes/7.20.2_@babel+core@7.20.2:
-    resolution: {integrity: sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-annotate-as-pure': 7.18.6
-      '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2
-      '@babel/helper-environment-visitor': 7.18.9
-      '@babel/helper-function-name': 7.19.0
-      '@babel/helper-optimise-call-expression': 7.18.6
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-replace-supers': 7.19.1
-      '@babel/helper-split-export-declaration': 7.18.6
-      globals: 11.12.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.18.9:
-    resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-computed-properties/7.18.9_@babel+core@7.20.2:
-    resolution: {integrity: sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-destructuring/7.20.2_@babel+core@7.18.9:
-    resolution: {integrity: sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-destructuring/7.20.2_@babel+core@7.20.2:
-    resolution: {integrity: sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-dotall-regex/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.18.9:
-    resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-duplicate-keys/7.18.9_@babel+core@7.20.2:
-    resolution: {integrity: sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-exponentiation-operator/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-builder-binary-assignment-operator-visitor': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.18.9:
-    resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-for-of/7.18.8_@babel+core@7.20.2:
-    resolution: {integrity: sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.18.9:
-    resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.18.9
-      '@babel/helper-function-name': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-function-name/7.18.9_@babel+core@7.20.2:
-    resolution: {integrity: sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2
-      '@babel/helper-function-name': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-literals/7.18.9_@babel+core@7.18.9:
-    resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-literals/7.18.9_@babel+core@7.20.2:
-    resolution: {integrity: sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-member-expression-literals/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-modules-amd/7.19.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-module-transforms': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-transform-modules-amd/7.19.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-module-transforms': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-transform-modules-commonjs/7.19.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-module-transforms': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-simple-access': 7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-transform-modules-commonjs/7.19.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-module-transforms': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-simple-access': 7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-transform-modules-systemjs/7.19.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-hoist-variables': 7.18.6
-      '@babel/helper-module-transforms': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-validator-identifier': 7.19.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-transform-modules-systemjs/7.19.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-hoist-variables': 7.18.6
-      '@babel/helper-module-transforms': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-validator-identifier': 7.19.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-module-transforms': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-transform-modules-umd/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-module-transforms': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.18.9:
-    resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-named-capturing-groups-regex/7.19.1_@babel+core@7.20.2:
-    resolution: {integrity: sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-create-regexp-features-plugin': 7.19.0_@babel+core@7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-new-target/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-replace-supers': 7.18.9
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-transform-object-super/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-replace-supers': 7.18.9
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-transform-parameters/7.20.3_@babel+core@7.12.9:
-    resolution: {integrity: sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.12.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-parameters/7.20.3_@babel+core@7.18.9:
-    resolution: {integrity: sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-parameters/7.20.3_@babel+core@7.20.2:
-    resolution: {integrity: sha512-oZg/Fpx0YDrj13KsLyO8I/CX3Zdw7z0O9qOd95SqcoIzuqy/WTGWvePeHAnZCN54SfdyjHcb1S30gc8zlzlHcA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-property-literals/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-react-constant-elements/7.20.2_@babel+core@7.20.2:
-    resolution: {integrity: sha512-KS/G8YI8uwMGKErLFOHS/ekhqdHhpEloxs43NecQHVgo2QuQSyJhGIY1fL8UGl9wy5ItVwwoUL4YxVqsplGq2g==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-react-display-name/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-react-display-name/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/plugin-transform-react-jsx': 7.18.6_@babel+core@7.18.9
-    dev: false
-
-  /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/plugin-transform-react-jsx': 7.18.6_@babel+core@7.20.2
-    dev: false
-
-  /@babel/plugin-transform-react-jsx/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-annotate-as-pure': 7.18.6
-      '@babel/helper-module-imports': 7.18.6
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.18.9
-      '@babel/types': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-react-jsx/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-annotate-as-pure': 7.18.6
-      '@babel/helper-module-imports': 7.18.6
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.2
-      '@babel/types': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-react-pure-annotations/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-annotate-as-pure': 7.18.6
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-react-pure-annotations/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-annotate-as-pure': 7.18.6
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      regenerator-transform: 0.15.0
-    dev: false
-
-  /@babel/plugin-transform-regenerator/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      regenerator-transform: 0.15.0
-    dev: false
-
-  /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-reserved-words/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-runtime/7.18.9_@babel+core@7.18.9:
-    resolution: {integrity: sha512-wS8uJwBt7/b/mzE13ktsJdmS4JP/j7PQSaADtnb4I2wL0zK51MQ0pmF8/Jy0wUIS96fr+fXT6S/ifiPXnvrlSg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-module-imports': 7.18.6
-      '@babel/helper-plugin-utils': 7.20.2
-      babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.18.9
-      babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.18.9
-      babel-plugin-polyfill-regenerator: 0.3.1_@babel+core@7.18.9
-      semver: 6.3.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-shorthand-properties/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-spread/7.19.0_@babel+core@7.18.9:
-    resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-skip-transparent-expression-wrappers': 7.18.9
-    dev: false
-
-  /@babel/plugin-transform-spread/7.19.0_@babel+core@7.20.2:
-    resolution: {integrity: sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-skip-transparent-expression-wrappers': 7.18.9
-    dev: false
-
-  /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-sticky-regex/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.18.9:
-    resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-template-literals/7.18.9_@babel+core@7.20.2:
-    resolution: {integrity: sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.18.9:
-    resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-typeof-symbol/7.18.9_@babel+core@7.20.2:
-    resolution: {integrity: sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-typescript/7.18.8_@babel+core@7.18.9:
-    resolution: {integrity: sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.18.9
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-transform-typescript/7.18.8_@babel+core@7.20.2:
-    resolution: {integrity: sha512-p2xM8HI83UObjsZGofMV/EdYjamsDm6MoN3hXPYIT0+gxIoopE+B7rPYKAxfrz9K9PK7JafTTjqYC6qipLExYA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-create-class-features-plugin': 7.18.9_@babel+core@7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.18.9:
-    resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-unicode-escapes/7.18.10_@babel+core@7.20.2:
-    resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/plugin-transform-unicode-regex/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-create-regexp-features-plugin': 7.18.6_@babel+core@7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-    dev: false
-
-  /@babel/preset-env/7.18.9_@babel+core@7.18.9:
-    resolution: {integrity: sha512-75pt/q95cMIHWssYtyfjVlvI+QEZQThQbKvR9xH+F/Agtw/s4Wfc2V9Bwd/P39VtixB7oWxGdH4GteTTwYJWMg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/compat-data': 7.20.1
-      '@babel/core': 7.18.9
-      '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-validator-option': 7.18.6
-      '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.18.9
-      '@babel/plugin-proposal-async-generator-functions': 7.20.1_@babel+core@7.18.9
-      '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.18.9
-      '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.18.9
-      '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-proposal-object-rest-spread': 7.20.2_@babel+core@7.18.9
-      '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.18.9
-      '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.18.9
-      '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.18.9
-      '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.18.9
-      '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.18.9
-      '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.18.9
-      '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.18.9
-      '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.18.9
-      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.18.9
-      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.18.9
-      '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.18.9
-      '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.18.9
-      '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.18.9
-      '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.18.9
-      '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.18.9
-      '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.18.9
-      '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-block-scoping': 7.20.2_@babel+core@7.18.9
-      '@babel/plugin-transform-classes': 7.20.2_@babel+core@7.18.9
-      '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.18.9
-      '@babel/plugin-transform-destructuring': 7.20.2_@babel+core@7.18.9
-      '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.18.9
-      '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.18.9
-      '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.18.9
-      '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.18.9
-      '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-modules-amd': 7.19.6_@babel+core@7.18.9
-      '@babel/plugin-transform-modules-commonjs': 7.19.6_@babel+core@7.18.9
-      '@babel/plugin-transform-modules-systemjs': 7.19.6_@babel+core@7.18.9
-      '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.18.9
-      '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-parameters': 7.20.3_@babel+core@7.18.9
-      '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.18.9
-      '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.18.9
-      '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.18.9
-      '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.18.9
-      '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.18.9
-      '@babel/preset-modules': 0.1.5_@babel+core@7.18.9
-      '@babel/types': 7.20.2
-      babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.18.9
-      babel-plugin-polyfill-corejs3: 0.5.2_@babel+core@7.18.9
-      babel-plugin-polyfill-regenerator: 0.3.1_@babel+core@7.18.9
-      core-js-compat: 3.26.0
-      semver: 6.3.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/preset-env/7.20.2_@babel+core@7.20.2:
-    resolution: {integrity: sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/compat-data': 7.20.1
-      '@babel/core': 7.20.2
-      '@babel/helper-compilation-targets': 7.20.0_@babel+core@7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-validator-option': 7.18.6
-      '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.18.9_@babel+core@7.20.2
-      '@babel/plugin-proposal-async-generator-functions': 7.20.1_@babel+core@7.20.2
-      '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-proposal-class-static-block': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-proposal-dynamic-import': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-proposal-export-namespace-from': 7.18.9_@babel+core@7.20.2
-      '@babel/plugin-proposal-json-strings': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-proposal-logical-assignment-operators': 7.18.9_@babel+core@7.20.2
-      '@babel/plugin-proposal-nullish-coalescing-operator': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-proposal-numeric-separator': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-proposal-object-rest-spread': 7.20.2_@babel+core@7.20.2
-      '@babel/plugin-proposal-optional-catch-binding': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-proposal-optional-chaining': 7.18.9_@babel+core@7.20.2
-      '@babel/plugin-proposal-private-methods': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-proposal-private-property-in-object': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.2
-      '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.2
-      '@babel/plugin-syntax-class-static-block': 7.14.5_@babel+core@7.20.2
-      '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.20.2
-      '@babel/plugin-syntax-export-namespace-from': 7.8.3_@babel+core@7.20.2
-      '@babel/plugin-syntax-import-assertions': 7.20.0_@babel+core@7.20.2
-      '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.2
-      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.2
-      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.2
-      '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.2
-      '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.2
-      '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.2
-      '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.2
-      '@babel/plugin-syntax-private-property-in-object': 7.14.5_@babel+core@7.20.2
-      '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.2
-      '@babel/plugin-transform-arrow-functions': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-async-to-generator': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-block-scoped-functions': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-block-scoping': 7.20.2_@babel+core@7.20.2
-      '@babel/plugin-transform-classes': 7.20.2_@babel+core@7.20.2
-      '@babel/plugin-transform-computed-properties': 7.18.9_@babel+core@7.20.2
-      '@babel/plugin-transform-destructuring': 7.20.2_@babel+core@7.20.2
-      '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-duplicate-keys': 7.18.9_@babel+core@7.20.2
-      '@babel/plugin-transform-exponentiation-operator': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-for-of': 7.18.8_@babel+core@7.20.2
-      '@babel/plugin-transform-function-name': 7.18.9_@babel+core@7.20.2
-      '@babel/plugin-transform-literals': 7.18.9_@babel+core@7.20.2
-      '@babel/plugin-transform-member-expression-literals': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-modules-amd': 7.19.6_@babel+core@7.20.2
-      '@babel/plugin-transform-modules-commonjs': 7.19.6_@babel+core@7.20.2
-      '@babel/plugin-transform-modules-systemjs': 7.19.6_@babel+core@7.20.2
-      '@babel/plugin-transform-modules-umd': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-named-capturing-groups-regex': 7.19.1_@babel+core@7.20.2
-      '@babel/plugin-transform-new-target': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-object-super': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-parameters': 7.20.3_@babel+core@7.20.2
-      '@babel/plugin-transform-property-literals': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-regenerator': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-reserved-words': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-shorthand-properties': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-spread': 7.19.0_@babel+core@7.20.2
-      '@babel/plugin-transform-sticky-regex': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-template-literals': 7.18.9_@babel+core@7.20.2
-      '@babel/plugin-transform-typeof-symbol': 7.18.9_@babel+core@7.20.2
-      '@babel/plugin-transform-unicode-escapes': 7.18.10_@babel+core@7.20.2
-      '@babel/plugin-transform-unicode-regex': 7.18.6_@babel+core@7.20.2
-      '@babel/preset-modules': 0.1.5_@babel+core@7.20.2
-      '@babel/types': 7.20.2
-      babel-plugin-polyfill-corejs2: 0.3.3_@babel+core@7.20.2
-      babel-plugin-polyfill-corejs3: 0.6.0_@babel+core@7.20.2
-      babel-plugin-polyfill-regenerator: 0.4.1_@babel+core@7.20.2
-      core-js-compat: 3.26.0
-      semver: 6.3.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/preset-modules/0.1.5_@babel+core@7.18.9:
-    resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.18.9
-      '@babel/types': 7.20.2
-      esutils: 2.0.3
-    dev: false
-
-  /@babel/preset-modules/0.1.5_@babel+core@7.20.2:
-    resolution: {integrity: sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/plugin-proposal-unicode-property-regex': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-dotall-regex': 7.18.6_@babel+core@7.20.2
-      '@babel/types': 7.20.2
-      esutils: 2.0.3
-    dev: false
-
-  /@babel/preset-react/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-validator-option': 7.18.6
-      '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-react-jsx': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.18.9
-      '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.18.9
-    dev: false
-
-  /@babel/preset-react/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.20.2
-      '@babel/helper-validator-option': 7.18.6
-      '@babel/plugin-transform-react-display-name': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-react-jsx': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-react-jsx-development': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.20.2
-    dev: false
-
-  /@babel/preset-typescript/7.18.6_@babel+core@7.18.9:
-    resolution: {integrity: sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-plugin-utils': 7.18.9
-      '@babel/helper-validator-option': 7.18.6
-      '@babel/plugin-transform-typescript': 7.18.8_@babel+core@7.18.9
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/preset-typescript/7.18.6_@babel+core@7.20.2:
-    resolution: {integrity: sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==}
-    engines: {node: '>=6.9.0'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-plugin-utils': 7.18.9
-      '@babel/helper-validator-option': 7.18.6
-      '@babel/plugin-transform-typescript': 7.18.8_@babel+core@7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/runtime-corejs3/7.18.9:
-    resolution: {integrity: sha512-qZEWeccZCrHA2Au4/X05QW5CMdm4VjUDCrGq5gf1ZDcM4hRqreKrtwAn7yci9zfgAS9apvnsFXiGBHBAxZdK9A==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      core-js-pure: 3.23.5
-      regenerator-runtime: 0.13.9
-
-  /@babel/runtime/7.18.9:
-    resolution: {integrity: sha512-lkqXDcvlFT5rvEjiu6+QYO+1GXrEHRo2LOtS7E4GtX5ESIZOgepqsZBVIj6Pv+a6zqsya9VCgiK1KAK4BvJDAw==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      regenerator-runtime: 0.13.9
-
-  /@babel/template/7.18.10:
-    resolution: {integrity: sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/code-frame': 7.18.6
-      '@babel/parser': 7.20.3
-      '@babel/types': 7.20.2
-
-  /@babel/template/7.18.6:
-    resolution: {integrity: sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/code-frame': 7.18.6
-      '@babel/parser': 7.18.9
-      '@babel/types': 7.18.9
-    dev: false
-
-  /@babel/traverse/7.18.9:
-    resolution: {integrity: sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/code-frame': 7.18.6
-      '@babel/generator': 7.18.9
-      '@babel/helper-environment-visitor': 7.18.9
-      '@babel/helper-function-name': 7.18.9
-      '@babel/helper-hoist-variables': 7.18.6
-      '@babel/helper-split-export-declaration': 7.18.6
-      '@babel/parser': 7.18.9
-      '@babel/types': 7.18.9
-      debug: 4.3.4
-      globals: 11.12.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@babel/traverse/7.20.1:
-    resolution: {integrity: sha512-d3tN8fkVJwFLkHkBN479SOsw4DMZnz8cdbL/gvuDuzy3TS6Nfw80HuQqhw1pITbIruHyh7d1fMA47kWzmcUEGA==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/code-frame': 7.18.6
-      '@babel/generator': 7.20.4
-      '@babel/helper-environment-visitor': 7.18.9
-      '@babel/helper-function-name': 7.19.0
-      '@babel/helper-hoist-variables': 7.18.6
-      '@babel/helper-split-export-declaration': 7.18.6
-      '@babel/parser': 7.20.3
-      '@babel/types': 7.20.2
-      debug: 4.3.4
-      globals: 11.12.0
-    transitivePeerDependencies:
-      - supports-color
-
-  /@babel/types/7.18.9:
-    resolution: {integrity: sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-validator-identifier': 7.18.6
-      to-fast-properties: 2.0.0
-
-  /@babel/types/7.20.2:
-    resolution: {integrity: sha512-FnnvsNWgZCr232sqtXggapvlkk/tuwR/qhGzcmxI0GXLCjmPYQPzio2FbdlWuY6y1sHFfQKk+rRbUZ9VStQMog==}
-    engines: {node: '>=6.9.0'}
-    dependencies:
-      '@babel/helper-string-parser': 7.19.4
-      '@babel/helper-validator-identifier': 7.19.1
-      to-fast-properties: 2.0.0
-
-  /@bcoe/v8-coverage/0.2.3:
-    resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
-    dev: true
-
-  /@colors/colors/1.5.0:
-    resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==}
-    engines: {node: '>=0.1.90'}
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /@docsearch/css/3.1.1:
-    resolution: {integrity: sha512-utLgg7E1agqQeqCJn05DWC7XXMk4tMUUnL7MZupcknRu2OzGN13qwey2qA/0NAKkVBGugiWtON0+rlU0QIPojg==}
-    dev: false
-
-  /@docsearch/react/3.1.1_biqbaboplfbrettd7655fr4n2y:
-    resolution: {integrity: sha512-cfoql4qvtsVRqBMYxhlGNpvyy/KlCoPqjIsJSZYqYf9AplZncKjLBTcwBu6RXFMVCe30cIFljniI4OjqAU67pQ==}
-    peerDependencies:
-      '@types/react': '>= 16.8.0 < 19.0.0'
-      react: '>= 16.8.0 < 19.0.0'
-      react-dom: '>= 16.8.0 < 19.0.0'
-    dependencies:
-      '@algolia/autocomplete-core': 1.7.1
-      '@algolia/autocomplete-preset-algolia': 1.7.1_algoliasearch@4.14.0
-      '@docsearch/css': 3.1.1
-      algoliasearch: 4.14.0
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-    transitivePeerDependencies:
-      - '@algolia/client-search'
-    dev: false
-
-  /@docusaurus/core/2.2.0_biqbaboplfbrettd7655fr4n2y:
-    resolution: {integrity: sha512-Vd6XOluKQqzG12fEs9prJgDtyn6DPok9vmUWDR2E6/nV5Fl9SVkhEQOBxwObjk3kQh7OY7vguFaLh0jqdApWsA==}
-    engines: {node: '>=16.14'}
-    hasBin: true
-    peerDependencies:
-      react: ^16.8.4 || ^17.0.0
-      react-dom: ^16.8.4 || ^17.0.0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/generator': 7.18.9
-      '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.18.9
-      '@babel/plugin-transform-runtime': 7.18.9_@babel+core@7.18.9
-      '@babel/preset-env': 7.18.9_@babel+core@7.18.9
-      '@babel/preset-react': 7.18.6_@babel+core@7.18.9
-      '@babel/preset-typescript': 7.18.6_@babel+core@7.18.9
-      '@babel/runtime': 7.18.9
-      '@babel/runtime-corejs3': 7.18.9
-      '@babel/traverse': 7.18.9
-      '@docusaurus/cssnano-preset': 2.2.0
-      '@docusaurus/logger': 2.2.0
-      '@docusaurus/mdx-loader': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/react-loadable': 5.5.2_react@18.2.0
-      '@docusaurus/utils': 2.2.0
-      '@docusaurus/utils-common': 2.2.0
-      '@docusaurus/utils-validation': 2.2.0
-      '@slorber/static-site-generator-webpack-plugin': 4.0.7
-      '@svgr/webpack': 6.5.1
-      autoprefixer: 10.4.7_postcss@8.4.14
-      babel-loader: 8.2.5_sqoqrlbh4fciq6urcohea2fb5a
-      babel-plugin-dynamic-import-node: 2.3.3
-      boxen: 6.2.1
-      chalk: 4.1.2
-      chokidar: 3.5.3
-      clean-css: 5.3.1
-      cli-table3: 0.6.2
-      combine-promises: 1.1.0
-      commander: 5.1.0
-      copy-webpack-plugin: 11.0.0_webpack@5.73.0
-      core-js: 3.23.5
-      css-loader: 6.7.1_webpack@5.73.0
-      css-minimizer-webpack-plugin: 4.0.0_554fporn47vuq37dog2mjop3eu
-      cssnano: 5.1.12_postcss@8.4.14
-      del: 6.1.1
-      detect-port: 1.3.0
-      escape-html: 1.0.3
-      eta: 1.12.3
-      file-loader: 6.2.0_webpack@5.73.0
-      fs-extra: 10.1.0
-      html-minifier-terser: 6.1.0
-      html-tags: 3.2.0
-      html-webpack-plugin: 5.5.0_webpack@5.73.0
-      import-fresh: 3.3.0
-      leven: 3.1.0
-      lodash: 4.17.21
-      mini-css-extract-plugin: 2.6.1_webpack@5.73.0
-      postcss: 8.4.14
-      postcss-loader: 7.0.1_mepnsno3xmng6eyses4tepu7bu
-      prompts: 2.4.2
-      react: 18.2.0
-      react-dev-utils: 12.0.1_webpack@5.73.0
-      react-dom: 18.2.0_react@18.2.0
-      react-helmet-async: 1.3.0_biqbaboplfbrettd7655fr4n2y
-      react-loadable: /@docusaurus/react-loadable/5.5.2_react@18.2.0
-      react-loadable-ssr-addon-v5-slorber: 1.0.1_pobh4rnr4unizsdzh3gmmsgqtu
-      react-router: 5.3.3_react@18.2.0
-      react-router-config: 5.1.1_4gumyfmpzq3vvokmq4lwan2qpu
-      react-router-dom: 5.3.3_react@18.2.0
-      rtl-detect: 1.0.4
-      semver: 7.3.7
-      serve-handler: 6.1.3
-      shelljs: 0.8.5
-      terser-webpack-plugin: 5.3.3_webpack@5.73.0
-      tslib: 2.4.1
-      update-notifier: 5.1.0
-      url-loader: 4.1.1_ljnyroaqobwke7fusd7ro2cgzm
-      wait-on: 6.0.1
-      webpack: 5.73.0
-      webpack-bundle-analyzer: 4.5.0
-      webpack-dev-server: 4.9.3_webpack@5.73.0
-      webpack-merge: 5.8.0
-      webpackbar: 5.0.2_webpack@5.73.0
-    transitivePeerDependencies:
-      - '@docusaurus/types'
-      - '@parcel/css'
-      - '@swc/core'
-      - bufferutil
-      - csso
-      - debug
-      - esbuild
-      - eslint
-      - supports-color
-      - typescript
-      - uglify-js
-      - utf-8-validate
-      - vue-template-compiler
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/core/2.2.0_if65ga6ul5jnw5c4373drfty5m:
-    resolution: {integrity: sha512-Vd6XOluKQqzG12fEs9prJgDtyn6DPok9vmUWDR2E6/nV5Fl9SVkhEQOBxwObjk3kQh7OY7vguFaLh0jqdApWsA==}
-    engines: {node: '>=16.14'}
-    hasBin: true
-    peerDependencies:
-      react: ^16.8.4 || ^17.0.0
-      react-dom: ^16.8.4 || ^17.0.0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/generator': 7.18.9
-      '@babel/plugin-syntax-dynamic-import': 7.8.3_@babel+core@7.18.9
-      '@babel/plugin-transform-runtime': 7.18.9_@babel+core@7.18.9
-      '@babel/preset-env': 7.18.9_@babel+core@7.18.9
-      '@babel/preset-react': 7.18.6_@babel+core@7.18.9
-      '@babel/preset-typescript': 7.18.6_@babel+core@7.18.9
-      '@babel/runtime': 7.18.9
-      '@babel/runtime-corejs3': 7.18.9
-      '@babel/traverse': 7.18.9
-      '@docusaurus/cssnano-preset': 2.2.0
-      '@docusaurus/logger': 2.2.0
-      '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/react-loadable': 5.5.2_react@18.2.0
-      '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0
-      '@docusaurus/utils-common': 2.2.0_@docusaurus+types@2.2.0
-      '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0
-      '@slorber/static-site-generator-webpack-plugin': 4.0.7
-      '@svgr/webpack': 6.5.1
-      autoprefixer: 10.4.7_postcss@8.4.14
-      babel-loader: 8.2.5_sqoqrlbh4fciq6urcohea2fb5a
-      babel-plugin-dynamic-import-node: 2.3.3
-      boxen: 6.2.1
-      chalk: 4.1.2
-      chokidar: 3.5.3
-      clean-css: 5.3.1
-      cli-table3: 0.6.2
-      combine-promises: 1.1.0
-      commander: 5.1.0
-      copy-webpack-plugin: 11.0.0_webpack@5.73.0
-      core-js: 3.23.5
-      css-loader: 6.7.1_webpack@5.73.0
-      css-minimizer-webpack-plugin: 4.0.0_554fporn47vuq37dog2mjop3eu
-      cssnano: 5.1.12_postcss@8.4.14
-      del: 6.1.1
-      detect-port: 1.3.0
-      escape-html: 1.0.3
-      eta: 1.12.3
-      file-loader: 6.2.0_webpack@5.73.0
-      fs-extra: 10.1.0
-      html-minifier-terser: 6.1.0
-      html-tags: 3.2.0
-      html-webpack-plugin: 5.5.0_webpack@5.73.0
-      import-fresh: 3.3.0
-      leven: 3.1.0
-      lodash: 4.17.21
-      mini-css-extract-plugin: 2.6.1_webpack@5.73.0
-      postcss: 8.4.14
-      postcss-loader: 7.0.1_mepnsno3xmng6eyses4tepu7bu
-      prompts: 2.4.2
-      react: 18.2.0
-      react-dev-utils: 12.0.1_webpack@5.73.0
-      react-dom: 18.2.0_react@18.2.0
-      react-helmet-async: 1.3.0_biqbaboplfbrettd7655fr4n2y
-      react-loadable: /@docusaurus/react-loadable/5.5.2_react@18.2.0
-      react-loadable-ssr-addon-v5-slorber: 1.0.1_pobh4rnr4unizsdzh3gmmsgqtu
-      react-router: 5.3.3_react@18.2.0
-      react-router-config: 5.1.1_4gumyfmpzq3vvokmq4lwan2qpu
-      react-router-dom: 5.3.3_react@18.2.0
-      rtl-detect: 1.0.4
-      semver: 7.3.7
-      serve-handler: 6.1.3
-      shelljs: 0.8.5
-      terser-webpack-plugin: 5.3.3_webpack@5.73.0
-      tslib: 2.4.1
-      update-notifier: 5.1.0
-      url-loader: 4.1.1_ljnyroaqobwke7fusd7ro2cgzm
-      wait-on: 6.0.1
-      webpack: 5.73.0
-      webpack-bundle-analyzer: 4.5.0
-      webpack-dev-server: 4.9.3_webpack@5.73.0
-      webpack-merge: 5.8.0
-      webpackbar: 5.0.2_webpack@5.73.0
-    transitivePeerDependencies:
-      - '@docusaurus/types'
-      - '@parcel/css'
-      - '@swc/core'
-      - bufferutil
-      - csso
-      - debug
-      - esbuild
-      - eslint
-      - supports-color
-      - typescript
-      - uglify-js
-      - utf-8-validate
-      - vue-template-compiler
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/cssnano-preset/2.2.0:
-    resolution: {integrity: sha512-mAAwCo4n66TMWBH1kXnHVZsakW9VAXJzTO4yZukuL3ro4F+JtkMwKfh42EG75K/J/YIFQG5I/Bzy0UH/hFxaTg==}
-    engines: {node: '>=16.14'}
-    dependencies:
-      cssnano-preset-advanced: 5.3.8_postcss@8.4.14
-      postcss: 8.4.14
-      postcss-sort-media-queries: 4.2.1_postcss@8.4.14
-      tslib: 2.4.1
-    dev: false
-
-  /@docusaurus/logger/2.2.0:
-    resolution: {integrity: sha512-DF3j1cA5y2nNsu/vk8AG7xwpZu6f5MKkPPMaaIbgXLnWGfm6+wkOeW7kNrxnM95YOhKUkJUophX69nGUnLsm0A==}
-    engines: {node: '>=16.14'}
-    dependencies:
-      chalk: 4.1.2
-      tslib: 2.4.1
-    dev: false
-
-  /@docusaurus/mdx-loader/2.2.0_biqbaboplfbrettd7655fr4n2y:
-    resolution: {integrity: sha512-X2bzo3T0jW0VhUU+XdQofcEeozXOTmKQMvc8tUnWRdTnCvj4XEcBVdC3g+/jftceluiwSTNRAX4VBOJdNt18jA==}
-    engines: {node: '>=16.14'}
-    peerDependencies:
-      react: ^16.8.4 || ^17.0.0
-      react-dom: ^16.8.4 || ^17.0.0
-    dependencies:
-      '@babel/parser': 7.20.3
-      '@babel/traverse': 7.20.1
-      '@docusaurus/logger': 2.2.0
-      '@docusaurus/utils': 2.2.0
-      '@mdx-js/mdx': 1.6.22
-      escape-html: 1.0.3
-      file-loader: 6.2.0_webpack@5.73.0
-      fs-extra: 10.1.0
-      image-size: 1.0.2
-      mdast-util-to-string: 2.0.0
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      remark-emoji: 2.2.0
-      stringify-object: 3.3.0
-      tslib: 2.4.1
-      unified: 9.2.2
-      unist-util-visit: 2.0.3
-      url-loader: 4.1.1_ljnyroaqobwke7fusd7ro2cgzm
-      webpack: 5.73.0
-    transitivePeerDependencies:
-      - '@docusaurus/types'
-      - '@swc/core'
-      - esbuild
-      - supports-color
-      - uglify-js
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/mdx-loader/2.2.0_if65ga6ul5jnw5c4373drfty5m:
-    resolution: {integrity: sha512-X2bzo3T0jW0VhUU+XdQofcEeozXOTmKQMvc8tUnWRdTnCvj4XEcBVdC3g+/jftceluiwSTNRAX4VBOJdNt18jA==}
-    engines: {node: '>=16.14'}
-    peerDependencies:
-      react: ^16.8.4 || ^17.0.0
-      react-dom: ^16.8.4 || ^17.0.0
-    dependencies:
-      '@babel/parser': 7.20.3
-      '@babel/traverse': 7.20.1
-      '@docusaurus/logger': 2.2.0
-      '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0
-      '@mdx-js/mdx': 1.6.22
-      escape-html: 1.0.3
-      file-loader: 6.2.0_webpack@5.73.0
-      fs-extra: 10.1.0
-      image-size: 1.0.2
-      mdast-util-to-string: 2.0.0
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      remark-emoji: 2.2.0
-      stringify-object: 3.3.0
-      tslib: 2.4.1
-      unified: 9.2.2
-      unist-util-visit: 2.0.3
-      url-loader: 4.1.1_ljnyroaqobwke7fusd7ro2cgzm
-      webpack: 5.73.0
-    transitivePeerDependencies:
-      - '@docusaurus/types'
-      - '@swc/core'
-      - esbuild
-      - supports-color
-      - uglify-js
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/module-type-aliases/2.2.0_biqbaboplfbrettd7655fr4n2y:
-    resolution: {integrity: sha512-wDGW4IHKoOr9YuJgy7uYuKWrDrSpsUSDHLZnWQYM9fN7D5EpSmYHjFruUpKWVyxLpD/Wh0rW8hYZwdjJIQUQCQ==}
-    peerDependencies:
-      react: '*'
-      react-dom: '*'
-    dependencies:
-      '@docusaurus/react-loadable': 5.5.2_react@18.2.0
-      '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@types/history': 4.7.11
-      '@types/react': 18.0.25
-      '@types/react-router-config': 5.0.6
-      '@types/react-router-dom': 5.3.3
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      react-helmet-async: 1.3.0_biqbaboplfbrettd7655fr4n2y
-      react-loadable: /@docusaurus/react-loadable/5.5.2_react@18.2.0
-    transitivePeerDependencies:
-      - '@swc/core'
-      - esbuild
-      - uglify-js
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/plugin-content-blog/2.2.0_biqbaboplfbrettd7655fr4n2y:
-    resolution: {integrity: sha512-0mWBinEh0a5J2+8ZJXJXbrCk1tSTNf7Nm4tYAl5h2/xx+PvH/Bnu0V+7mMljYm/1QlDYALNIIaT/JcoZQFUN3w==}
-    engines: {node: '>=16.14'}
-    peerDependencies:
-      react: ^16.8.4 || ^17.0.0
-      react-dom: ^16.8.4 || ^17.0.0
-    dependencies:
-      '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/logger': 2.2.0
-      '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0
-      '@docusaurus/utils-common': 2.2.0_@docusaurus+types@2.2.0
-      '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0
-      cheerio: 1.0.0-rc.12
-      feed: 4.2.2
-      fs-extra: 10.1.0
-      lodash: 4.17.21
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      reading-time: 1.5.0
-      tslib: 2.4.1
-      unist-util-visit: 2.0.3
-      utility-types: 3.10.0
-      webpack: 5.73.0
-    transitivePeerDependencies:
-      - '@parcel/css'
-      - '@swc/core'
-      - bufferutil
-      - csso
-      - debug
-      - esbuild
-      - eslint
-      - supports-color
-      - typescript
-      - uglify-js
-      - utf-8-validate
-      - vue-template-compiler
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/plugin-content-docs/2.2.0_biqbaboplfbrettd7655fr4n2y:
-    resolution: {integrity: sha512-BOazBR0XjzsHE+2K1wpNxz5QZmrJgmm3+0Re0EVPYFGW8qndCWGNtXW/0lGKhecVPML8yyFeAmnUCIs7xM2wPw==}
-    engines: {node: '>=16.14'}
-    peerDependencies:
-      react: ^16.8.4 || ^17.0.0
-      react-dom: ^16.8.4 || ^17.0.0
-    dependencies:
-      '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/logger': 2.2.0
-      '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/module-type-aliases': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0
-      '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0
-      '@types/react-router-config': 5.0.6
-      combine-promises: 1.1.0
-      fs-extra: 10.1.0
-      import-fresh: 3.3.0
-      js-yaml: 4.1.0
-      lodash: 4.17.21
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      tslib: 2.4.1
-      utility-types: 3.10.0
-      webpack: 5.73.0
-    transitivePeerDependencies:
-      - '@parcel/css'
-      - '@swc/core'
-      - bufferutil
-      - csso
-      - debug
-      - esbuild
-      - eslint
-      - supports-color
-      - typescript
-      - uglify-js
-      - utf-8-validate
-      - vue-template-compiler
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/plugin-content-pages/2.2.0_biqbaboplfbrettd7655fr4n2y:
-    resolution: {integrity: sha512-+OTK3FQHk5WMvdelz8v19PbEbx+CNT6VSpx7nVOvMNs5yJCKvmqBJBQ2ZSxROxhVDYn+CZOlmyrC56NSXzHf6g==}
-    engines: {node: '>=16.14'}
-    peerDependencies:
-      react: ^16.8.4 || ^17.0.0
-      react-dom: ^16.8.4 || ^17.0.0
-    dependencies:
-      '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0
-      '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0
-      fs-extra: 10.1.0
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      tslib: 2.4.1
-      webpack: 5.73.0
-    transitivePeerDependencies:
-      - '@parcel/css'
-      - '@swc/core'
-      - bufferutil
-      - csso
-      - debug
-      - esbuild
-      - eslint
-      - supports-color
-      - typescript
-      - uglify-js
-      - utf-8-validate
-      - vue-template-compiler
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/plugin-debug/2.2.0_biqbaboplfbrettd7655fr4n2y:
-    resolution: {integrity: sha512-p9vOep8+7OVl6r/NREEYxf4HMAjV8JMYJ7Bos5fCFO0Wyi9AZEo0sCTliRd7R8+dlJXZEgcngSdxAUo/Q+CJow==}
-    engines: {node: '>=16.14'}
-    peerDependencies:
-      react: ^16.8.4 || ^17.0.0
-      react-dom: ^16.8.4 || ^17.0.0
-    dependencies:
-      '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0
-      fs-extra: 10.1.0
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      react-json-view: 1.21.3_biqbaboplfbrettd7655fr4n2y
-      tslib: 2.4.1
-    transitivePeerDependencies:
-      - '@parcel/css'
-      - '@swc/core'
-      - '@types/react'
-      - bufferutil
-      - csso
-      - debug
-      - encoding
-      - esbuild
-      - eslint
-      - supports-color
-      - typescript
-      - uglify-js
-      - utf-8-validate
-      - vue-template-compiler
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/plugin-google-analytics/2.2.0_biqbaboplfbrettd7655fr4n2y:
-    resolution: {integrity: sha512-+eZVVxVeEnV5nVQJdey9ZsfyEVMls6VyWTIj8SmX0k5EbqGvnIfET+J2pYEuKQnDIHxy+syRMoRM6AHXdHYGIg==}
-    engines: {node: '>=16.14'}
-    peerDependencies:
-      react: ^16.8.4 || ^17.0.0
-      react-dom: ^16.8.4 || ^17.0.0
-    dependencies:
-      '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      tslib: 2.4.1
-    transitivePeerDependencies:
-      - '@parcel/css'
-      - '@swc/core'
-      - bufferutil
-      - csso
-      - debug
-      - esbuild
-      - eslint
-      - supports-color
-      - typescript
-      - uglify-js
-      - utf-8-validate
-      - vue-template-compiler
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/plugin-google-gtag/2.2.0_biqbaboplfbrettd7655fr4n2y:
-    resolution: {integrity: sha512-6SOgczP/dYdkqUMGTRqgxAS1eTp6MnJDAQMy8VCF1QKbWZmlkx4agHDexihqmYyCujTYHqDAhm1hV26EET54NQ==}
-    engines: {node: '>=16.14'}
-    peerDependencies:
-      react: ^16.8.4 || ^17.0.0
-      react-dom: ^16.8.4 || ^17.0.0
-    dependencies:
-      '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      tslib: 2.4.1
-    transitivePeerDependencies:
-      - '@parcel/css'
-      - '@swc/core'
-      - bufferutil
-      - csso
-      - debug
-      - esbuild
-      - eslint
-      - supports-color
-      - typescript
-      - uglify-js
-      - utf-8-validate
-      - vue-template-compiler
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/plugin-sitemap/2.2.0_biqbaboplfbrettd7655fr4n2y:
-    resolution: {integrity: sha512-0jAmyRDN/aI265CbWZNZuQpFqiZuo+5otk2MylU9iVrz/4J7gSc+ZJ9cy4EHrEsW7PV8s1w18hIEsmcA1YgkKg==}
-    engines: {node: '>=16.14'}
-    peerDependencies:
-      react: ^16.8.4 || ^17.0.0
-      react-dom: ^16.8.4 || ^17.0.0
-    dependencies:
-      '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/logger': 2.2.0
-      '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0
-      '@docusaurus/utils-common': 2.2.0_@docusaurus+types@2.2.0
-      '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0
-      fs-extra: 10.1.0
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      sitemap: 7.1.1
-      tslib: 2.4.1
-    transitivePeerDependencies:
-      - '@parcel/css'
-      - '@swc/core'
-      - bufferutil
-      - csso
-      - debug
-      - esbuild
-      - eslint
-      - supports-color
-      - typescript
-      - uglify-js
-      - utf-8-validate
-      - vue-template-compiler
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/preset-classic/2.2.0_biqbaboplfbrettd7655fr4n2y:
-    resolution: {integrity: sha512-yKIWPGNx7BT8v2wjFIWvYrS+nvN04W+UameSFf8lEiJk6pss0kL6SG2MRvyULiI3BDxH+tj6qe02ncpSPGwumg==}
-    engines: {node: '>=16.14'}
-    peerDependencies:
-      react: ^16.8.4 || ^17.0.0
-      react-dom: ^16.8.4 || ^17.0.0
-    dependencies:
-      '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/plugin-content-blog': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/plugin-content-docs': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/plugin-content-pages': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/plugin-debug': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/plugin-google-analytics': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/plugin-google-gtag': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/plugin-sitemap': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/theme-classic': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/theme-common': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/theme-search-algolia': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-    transitivePeerDependencies:
-      - '@algolia/client-search'
-      - '@parcel/css'
-      - '@swc/core'
-      - '@types/react'
-      - bufferutil
-      - csso
-      - debug
-      - encoding
-      - esbuild
-      - eslint
-      - supports-color
-      - typescript
-      - uglify-js
-      - utf-8-validate
-      - vue-template-compiler
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/react-loadable/5.5.2_react@18.2.0:
-    resolution: {integrity: sha512-A3dYjdBGuy0IGT+wyLIGIKLRE+sAk1iNk0f1HjNDysO7u8lhL4N3VEm+FAubmJbAztn94F7MxBTPmnixbiyFdQ==}
-    peerDependencies:
-      react: '*'
-    dependencies:
-      '@types/react': 18.0.25
-      prop-types: 15.8.1
-      react: 18.2.0
-    dev: false
-
-  /@docusaurus/theme-classic/2.2.0_biqbaboplfbrettd7655fr4n2y:
-    resolution: {integrity: sha512-kjbg/qJPwZ6H1CU/i9d4l/LcFgnuzeiGgMQlt6yPqKo0SOJIBMPuz7Rnu3r/WWbZFPi//o8acclacOzmXdUUEg==}
-    engines: {node: '>=16.14'}
-    peerDependencies:
-      react: ^16.8.4 || ^17.0.0
-      react-dom: ^16.8.4 || ^17.0.0
-    dependencies:
-      '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/module-type-aliases': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/plugin-content-blog': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/plugin-content-docs': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/plugin-content-pages': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/theme-common': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/theme-translations': 2.2.0
-      '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0
-      '@docusaurus/utils-common': 2.2.0_@docusaurus+types@2.2.0
-      '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0
-      '@mdx-js/react': 1.6.22_react@18.2.0
-      clsx: 1.2.1
-      copy-text-to-clipboard: 3.0.1
-      infima: 0.2.0-alpha.42
-      lodash: 4.17.21
-      nprogress: 0.2.0
-      postcss: 8.4.14
-      prism-react-renderer: 1.3.5_react@18.2.0
-      prismjs: 1.28.0
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      react-router-dom: 5.3.3_react@18.2.0
-      rtlcss: 3.5.0
-      tslib: 2.4.1
-      utility-types: 3.10.0
-    transitivePeerDependencies:
-      - '@parcel/css'
-      - '@swc/core'
-      - bufferutil
-      - csso
-      - debug
-      - esbuild
-      - eslint
-      - supports-color
-      - typescript
-      - uglify-js
-      - utf-8-validate
-      - vue-template-compiler
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/theme-common/2.2.0_if65ga6ul5jnw5c4373drfty5m:
-    resolution: {integrity: sha512-R8BnDjYoN90DCL75gP7qYQfSjyitXuP9TdzgsKDmSFPNyrdE3twtPNa2dIN+h+p/pr+PagfxwWbd6dn722A1Dw==}
-    engines: {node: '>=16.14'}
-    peerDependencies:
-      react: ^16.8.4 || ^17.0.0
-      react-dom: ^16.8.4 || ^17.0.0
-    dependencies:
-      '@docusaurus/mdx-loader': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/module-type-aliases': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/plugin-content-blog': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/plugin-content-docs': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/plugin-content-pages': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0
-      '@types/history': 4.7.11
-      '@types/react': 18.0.25
-      '@types/react-router-config': 5.0.6
-      clsx: 1.2.1
-      parse-numeric-range: 1.3.0
-      prism-react-renderer: 1.3.5_react@18.2.0
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      tslib: 2.4.1
-      utility-types: 3.10.0
-    transitivePeerDependencies:
-      - '@docusaurus/types'
-      - '@parcel/css'
-      - '@swc/core'
-      - bufferutil
-      - csso
-      - debug
-      - esbuild
-      - eslint
-      - supports-color
-      - typescript
-      - uglify-js
-      - utf-8-validate
-      - vue-template-compiler
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/theme-search-algolia/2.2.0_if65ga6ul5jnw5c4373drfty5m:
-    resolution: {integrity: sha512-2h38B0tqlxgR2FZ9LpAkGrpDWVdXZ7vltfmTdX+4RsDs3A7khiNsmZB+x/x6sA4+G2V2CvrsPMlsYBy5X+cY1w==}
-    engines: {node: '>=16.14'}
-    peerDependencies:
-      react: ^16.8.4 || ^17.0.0
-      react-dom: ^16.8.4 || ^17.0.0
-    dependencies:
-      '@docsearch/react': 3.1.1_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/core': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/logger': 2.2.0
-      '@docusaurus/plugin-content-docs': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@docusaurus/theme-common': 2.2.0_if65ga6ul5jnw5c4373drfty5m
-      '@docusaurus/theme-translations': 2.2.0
-      '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0
-      '@docusaurus/utils-validation': 2.2.0_@docusaurus+types@2.2.0
-      algoliasearch: 4.14.0
-      algoliasearch-helper: 3.10.0_algoliasearch@4.14.0
-      clsx: 1.2.1
-      eta: 1.12.3
-      fs-extra: 10.1.0
-      lodash: 4.17.21
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      tslib: 2.4.1
-      utility-types: 3.10.0
-    transitivePeerDependencies:
-      - '@algolia/client-search'
-      - '@docusaurus/types'
-      - '@parcel/css'
-      - '@swc/core'
-      - '@types/react'
-      - bufferutil
-      - csso
-      - debug
-      - esbuild
-      - eslint
-      - supports-color
-      - typescript
-      - uglify-js
-      - utf-8-validate
-      - vue-template-compiler
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/theme-translations/2.2.0:
-    resolution: {integrity: sha512-3T140AG11OjJrtKlY4pMZ5BzbGRDjNs2co5hJ6uYJG1bVWlhcaFGqkaZ5lCgKflaNHD7UHBHU9Ec5f69jTdd6w==}
-    engines: {node: '>=16.14'}
-    dependencies:
-      fs-extra: 10.1.0
-      tslib: 2.4.1
-    dev: false
-
-  /@docusaurus/types/2.2.0_biqbaboplfbrettd7655fr4n2y:
-    resolution: {integrity: sha512-b6xxyoexfbRNRI8gjblzVOnLr4peCJhGbYGPpJ3LFqpi5nsFfoK4mmDLvWdeah0B7gmJeXabN7nQkFoqeSdmOw==}
-    peerDependencies:
-      react: ^16.8.4 || ^17.0.0
-      react-dom: ^16.8.4 || ^17.0.0
-    dependencies:
-      '@types/history': 4.7.11
-      '@types/react': 18.0.25
-      commander: 5.1.0
-      joi: 17.6.0
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      react-helmet-async: 1.3.0_biqbaboplfbrettd7655fr4n2y
-      utility-types: 3.10.0
-      webpack: 5.73.0
-      webpack-merge: 5.8.0
-    transitivePeerDependencies:
-      - '@swc/core'
-      - esbuild
-      - uglify-js
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/utils-common/2.2.0:
-    resolution: {integrity: sha512-qebnerHp+cyovdUseDQyYFvMW1n1nv61zGe5JJfoNQUnjKuApch3IVsz+/lZ9a38pId8kqehC1Ao2bW/s0ntDA==}
-    engines: {node: '>=16.14'}
-    peerDependencies:
-      '@docusaurus/types': '*'
-    peerDependenciesMeta:
-      '@docusaurus/types':
-        optional: true
-    dependencies:
-      tslib: 2.4.1
-    dev: false
-
-  /@docusaurus/utils-common/2.2.0_@docusaurus+types@2.2.0:
-    resolution: {integrity: sha512-qebnerHp+cyovdUseDQyYFvMW1n1nv61zGe5JJfoNQUnjKuApch3IVsz+/lZ9a38pId8kqehC1Ao2bW/s0ntDA==}
-    engines: {node: '>=16.14'}
-    peerDependencies:
-      '@docusaurus/types': '*'
-    peerDependenciesMeta:
-      '@docusaurus/types':
-        optional: true
-    dependencies:
-      '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      tslib: 2.4.1
-    dev: false
-
-  /@docusaurus/utils-validation/2.2.0:
-    resolution: {integrity: sha512-I1hcsG3yoCkasOL5qQAYAfnmVoLei7apugT6m4crQjmDGxq+UkiRrq55UqmDDyZlac/6ax/JC0p+usZ6W4nVyg==}
-    engines: {node: '>=16.14'}
-    dependencies:
-      '@docusaurus/logger': 2.2.0
-      '@docusaurus/utils': 2.2.0
-      joi: 17.6.0
-      js-yaml: 4.1.0
-      tslib: 2.4.1
-    transitivePeerDependencies:
-      - '@docusaurus/types'
-      - '@swc/core'
-      - esbuild
-      - supports-color
-      - uglify-js
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/utils-validation/2.2.0_@docusaurus+types@2.2.0:
-    resolution: {integrity: sha512-I1hcsG3yoCkasOL5qQAYAfnmVoLei7apugT6m4crQjmDGxq+UkiRrq55UqmDDyZlac/6ax/JC0p+usZ6W4nVyg==}
-    engines: {node: '>=16.14'}
-    dependencies:
-      '@docusaurus/logger': 2.2.0
-      '@docusaurus/utils': 2.2.0_@docusaurus+types@2.2.0
-      joi: 17.6.0
-      js-yaml: 4.1.0
-      tslib: 2.4.1
-    transitivePeerDependencies:
-      - '@docusaurus/types'
-      - '@swc/core'
-      - esbuild
-      - supports-color
-      - uglify-js
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/utils/2.2.0:
-    resolution: {integrity: sha512-oNk3cjvx7Tt1Lgh/aeZAmFpGV2pDr5nHKrBVx6hTkzGhrnMuQqLt6UPlQjdYQ3QHXwyF/ZtZMO1D5Pfi0lu7SA==}
-    engines: {node: '>=16.14'}
-    peerDependencies:
-      '@docusaurus/types': '*'
-    peerDependenciesMeta:
-      '@docusaurus/types':
-        optional: true
-    dependencies:
-      '@docusaurus/logger': 2.2.0
-      '@svgr/webpack': 6.5.1
-      file-loader: 6.2.0_webpack@5.73.0
-      fs-extra: 10.1.0
-      github-slugger: 1.4.0
-      globby: 11.1.0
-      gray-matter: 4.0.3
-      js-yaml: 4.1.0
-      lodash: 4.17.21
-      micromatch: 4.0.5
-      resolve-pathname: 3.0.0
-      shelljs: 0.8.5
-      tslib: 2.4.1
-      url-loader: 4.1.1_ljnyroaqobwke7fusd7ro2cgzm
-      webpack: 5.73.0
-    transitivePeerDependencies:
-      - '@swc/core'
-      - esbuild
-      - supports-color
-      - uglify-js
-      - webpack-cli
-    dev: false
-
-  /@docusaurus/utils/2.2.0_@docusaurus+types@2.2.0:
-    resolution: {integrity: sha512-oNk3cjvx7Tt1Lgh/aeZAmFpGV2pDr5nHKrBVx6hTkzGhrnMuQqLt6UPlQjdYQ3QHXwyF/ZtZMO1D5Pfi0lu7SA==}
-    engines: {node: '>=16.14'}
-    peerDependencies:
-      '@docusaurus/types': '*'
-    peerDependenciesMeta:
-      '@docusaurus/types':
-        optional: true
-    dependencies:
-      '@docusaurus/logger': 2.2.0
-      '@docusaurus/types': 2.2.0_biqbaboplfbrettd7655fr4n2y
-      '@svgr/webpack': 6.5.1
-      file-loader: 6.2.0_webpack@5.73.0
-      fs-extra: 10.1.0
-      github-slugger: 1.4.0
-      globby: 11.1.0
-      gray-matter: 4.0.3
-      js-yaml: 4.1.0
-      lodash: 4.17.21
-      micromatch: 4.0.5
-      resolve-pathname: 3.0.0
-      shelljs: 0.8.5
-      tslib: 2.4.1
-      url-loader: 4.1.1_ljnyroaqobwke7fusd7ro2cgzm
-      webpack: 5.73.0
-    transitivePeerDependencies:
-      - '@swc/core'
-      - esbuild
-      - supports-color
-      - uglify-js
-      - webpack-cli
-    dev: false
-
-  /@emotion/hash/0.8.0:
-    resolution: {integrity: sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow==}
-    dev: false
-
-  /@eslint/eslintrc/1.3.3:
-    resolution: {integrity: sha512-uj3pT6Mg+3t39fvLrj8iuCIJ38zKO9FpGtJ4BBJebJhEwjoT+KLVNCcHT5QC9NGRIEi7fZ0ZR8YRb884auB4Lg==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    dependencies:
-      ajv: 6.12.6
-      debug: 4.3.4
-      espree: 9.4.1
-      globals: 13.16.0
-      ignore: 5.2.0
-      import-fresh: 3.3.0
-      js-yaml: 4.1.0
-      minimatch: 3.1.2
-      strip-json-comments: 3.1.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@fluentui/date-time-utilities/8.5.3:
-    resolution: {integrity: sha512-jwbwcJlnerdjENIAfn/YHxl5H2sQruReOMWXWMgmvX0CmcbqsN9VBxBt+E35Tlr4Ds3MbGs60eyfZUIPpaB5RQ==}
-    dependencies:
-      '@fluentui/set-version': 8.2.3
-      tslib: 2.4.1
-    dev: false
-
-  /@fluentui/dom-utilities/2.2.3:
-    resolution: {integrity: sha512-Ml/xwpTC6vb9lHHVAbSUD9jMbt9nVzV208D0FEoQn0c0+dP2vdMXSvXC/QHs/57B6JicttVQPuX6EcPwR3Mkpg==}
-    dependencies:
-      '@fluentui/set-version': 8.2.3
-      tslib: 2.4.1
-    dev: false
-
-  /@fluentui/font-icons-mdl2/8.5.4_fan5qbzahqtxlm5dzefqlqx5ia:
-    resolution: {integrity: sha512-sIf1ND1Qr1Y1A/XAYG3vCAVnjNljXZxrwenv36VGBqjG/xwJ0Lu5bNAUqjmPy6biKiMttz73zcL2ST3QNlYvhw==}
-    dependencies:
-      '@fluentui/set-version': 8.2.3
-      '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia
-      '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia
-      tslib: 2.4.1
-    transitivePeerDependencies:
-      - '@types/react'
-      - react
-    dev: false
-
-  /@fluentui/foundation-legacy/8.2.24_fan5qbzahqtxlm5dzefqlqx5ia:
-    resolution: {integrity: sha512-ccGbQmXW2qXSl/xtFVuAkCFH5TJMJX4+qoQ/CwAq+43ZCJaMQaz0KHmk3t3u+TXUWLCc8EGSEgYAIxMPzHI53A==}
-    peerDependencies:
-      '@types/react': '>=16.8.0 <19.0.0'
-      react: '>=16.8.0 <19.0.0'
-    dependencies:
-      '@fluentui/merge-styles': 8.5.4
-      '@fluentui/set-version': 8.2.3
-      '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia
-      '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia
-      '@types/react': 18.0.25
-      react: 18.2.0
-      tslib: 2.4.1
-    dev: false
-
-  /@fluentui/keyboard-key/0.4.3:
-    resolution: {integrity: sha512-uLiwx+UyXDN7tShv/s2NzDPtqeT/BZCHvY9yxEeb6LgEkos8TZvT5ep/7G8BpxA/SuBnviZ8xpDB5JObyZikqQ==}
-    dependencies:
-      tslib: 2.4.1
-    dev: false
-
-  /@fluentui/merge-styles/8.5.4:
-    resolution: {integrity: sha512-CeQIEcEgZu0cxqqyhJyTqySXoUL1vXfdWDJ8WMzchaNnhvOvoXISw8xXHpNXUtEn+HgPrcy9mHQwFcAc+jv3Wg==}
-    dependencies:
-      '@fluentui/set-version': 8.2.3
-      tslib: 2.4.1
-    dev: false
-
-  /@fluentui/react-file-type-icons/8.8.2_fan5qbzahqtxlm5dzefqlqx5ia:
-    resolution: {integrity: sha512-FYJq8vR8DgZot//oUgV3x9TOFT1y/180kUAMXqo8EH106ijk2M4hXdg6Q1o9gM1Zy66Od951gr9u84r0+JucFA==}
-    peerDependencies:
-      '@types/react': '>=16.8.0 <19.0.0'
-      react: '>=16.8.0 <19.0.0'
-    dependencies:
-      '@fluentui/set-version': 8.2.3
-      '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia
-      '@types/react': 18.0.25
-      react: 18.2.0
-      tslib: 2.4.1
-    dev: false
-
-  /@fluentui/react-focus/8.8.10_fan5qbzahqtxlm5dzefqlqx5ia:
-    resolution: {integrity: sha512-CB1/VXRCvy6qLFLY8dCxOF8PPYxM2vayTRSNva4/uDqg60jlMSsdZiPJE1PnC9FQKUKXgMZp78kak/ckGc8VZQ==}
-    peerDependencies:
-      '@types/react': '>=16.8.0 <19.0.0'
-      react: '>=16.8.0 <19.0.0'
-    dependencies:
-      '@fluentui/keyboard-key': 0.4.3
-      '@fluentui/merge-styles': 8.5.4
-      '@fluentui/set-version': 8.2.3
-      '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia
-      '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia
-      '@types/react': 18.0.25
-      react: 18.2.0
-      tslib: 2.4.1
-    dev: false
-
-  /@fluentui/react-hooks/8.6.14_fan5qbzahqtxlm5dzefqlqx5ia:
-    resolution: {integrity: sha512-mM2bW7xIRGGx7thBXKDR64SaZB1tYwICdM9qpM/Jfiu0H+VPQhhhtMPJ+ImmG+DM8MxX9n5Su8ePo2QWtz9mYA==}
-    peerDependencies:
-      '@types/react': '>=16.8.0 <19.0.0'
-      react: '>=16.8.0 <19.0.0'
-    dependencies:
-      '@fluentui/react-window-provider': 2.2.4_fan5qbzahqtxlm5dzefqlqx5ia
-      '@fluentui/set-version': 8.2.3
-      '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia
-      '@types/react': 18.0.25
-      react: 18.2.0
-      tslib: 2.4.1
-    dev: false
-
-  /@fluentui/react-icons/2.0.187_it3lvsvbvb6ccu3ygofv6sq6xa:
-    resolution: {integrity: sha512-KYEEzqzYIMFOkIzYw/pT1FIp0TvSquw7HpYCPn+YX5B3iTrVySfLL0aKBIK/Q7gWexBLVgH8zErUDsZ6r5fGLg==}
-    peerDependencies:
-      '@griffel/react': ^1.0.0
-      react: '>=16.8.0 <18.0.0'
-    dependencies:
-      '@griffel/react': 1.4.2_react@18.2.0
-      react: 18.2.0
-      tslib: 2.4.1
-    dev: false
-
-  /@fluentui/react-portal-compat-context/9.0.4_fan5qbzahqtxlm5dzefqlqx5ia:
-    resolution: {integrity: sha512-qw2lmkxZ2TmgC0pB2dvFyrzVffxBdpCx1BdWRaF+MRGUlTxRtqfybSx3Edsqa6NMewc3J0ThLMFdVFBQ5Yafqw==}
-    peerDependencies:
-      '@types/react': '>=16.8.0 <19.0.0'
-      react: '>=16.8.0 <19.0.0'
-    dependencies:
-      '@types/react': 18.0.25
-      react: 18.2.0
-      tslib: 2.4.1
-    dev: false
-
-  /@fluentui/react-window-provider/2.2.4_fan5qbzahqtxlm5dzefqlqx5ia:
-    resolution: {integrity: sha512-tCiIGQSILSipcn8DwwRgYq5IMtwBKiSQ+/cVRNq54cJZoq5ie/kMGFpldZ+vREDbM8wjmO3eNgNi63A3QRx39g==}
-    peerDependencies:
-      '@types/react': '>=16.8.0 <19.0.0'
-      react: '>=16.8.0 <19.0.0'
-    dependencies:
-      '@fluentui/set-version': 8.2.3
-      '@types/react': 18.0.25
-      react: 18.2.0
-      tslib: 2.4.1
-    dev: false
-
-  /@fluentui/react/8.101.1_2zx2umvpluuhvlq44va5bta2da:
-    resolution: {integrity: sha512-9qqxgIzxQe6srEkHO04aYlI41Cz+9nq1QqmC5/QzYzafDkfKlPJ13rZJSO6Hm8mBEIeimMSHew09yvunkS3j1w==}
-    peerDependencies:
-      '@types/react': '>=16.8.0 <19.0.0'
-      '@types/react-dom': '>=16.8.0 <19.0.0'
-      react: '>=16.8.0 <19.0.0'
-      react-dom: '>=16.8.0 <19.0.0'
-    dependencies:
-      '@fluentui/date-time-utilities': 8.5.3
-      '@fluentui/font-icons-mdl2': 8.5.4_fan5qbzahqtxlm5dzefqlqx5ia
-      '@fluentui/foundation-legacy': 8.2.24_fan5qbzahqtxlm5dzefqlqx5ia
-      '@fluentui/merge-styles': 8.5.4
-      '@fluentui/react-focus': 8.8.10_fan5qbzahqtxlm5dzefqlqx5ia
-      '@fluentui/react-hooks': 8.6.14_fan5qbzahqtxlm5dzefqlqx5ia
-      '@fluentui/react-portal-compat-context': 9.0.4_fan5qbzahqtxlm5dzefqlqx5ia
-      '@fluentui/react-window-provider': 2.2.4_fan5qbzahqtxlm5dzefqlqx5ia
-      '@fluentui/set-version': 8.2.3
-      '@fluentui/style-utilities': 8.8.3_fan5qbzahqtxlm5dzefqlqx5ia
-      '@fluentui/theme': 2.6.19_fan5qbzahqtxlm5dzefqlqx5ia
-      '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia
-      '@microsoft/load-themed-styles': 1.10.281
-      '@types/react': 18.0.25
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      tslib: 2.4.1
-    dev: false
-
-  /@fluentui/set-version/8.2.3:
-    resolution: {integrity: sha512-/+5vrI1Bq/ZsNDEK9++RClnDOeCILS8RXxZb7OAqmOc8GnPScxKcIN8e/1bosUxTjb2EB1KbVk6XeUpk0WvQIg==}
-    dependencies:
-      tslib: 2.4.1
-    dev: false
-
-  /@fluentui/style-utilities/8.8.3_fan5qbzahqtxlm5dzefqlqx5ia:
-    resolution: {integrity: sha512-DxcCIHnKdaBpzdIawZIMcVyn8xVbK6A37J0Q7MPdjb9VV4Nsp/ohWnM9nPrPlbB+RSsKWrIssgWJdn5yZM9Wxg==}
-    dependencies:
-      '@fluentui/merge-styles': 8.5.4
-      '@fluentui/set-version': 8.2.3
-      '@fluentui/theme': 2.6.19_fan5qbzahqtxlm5dzefqlqx5ia
-      '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia
-      '@microsoft/load-themed-styles': 1.10.281
-      tslib: 2.4.1
-    transitivePeerDependencies:
-      - '@types/react'
-      - react
-    dev: false
-
-  /@fluentui/theme/2.6.19_fan5qbzahqtxlm5dzefqlqx5ia:
-    resolution: {integrity: sha512-Pk4STq3WAM3Mq4fGCBrq3F43o1u2SitO7CZ6A3/ALreaxTA1LC4bbyKQTYH3tvxapqEOYaEPYZ3dFjWjqYlFfg==}
-    peerDependencies:
-      '@types/react': '>=16.8.0 <19.0.0'
-      react: '>=16.8.0 <19.0.0'
-    dependencies:
-      '@fluentui/merge-styles': 8.5.4
-      '@fluentui/set-version': 8.2.3
-      '@fluentui/utilities': 8.13.4_fan5qbzahqtxlm5dzefqlqx5ia
-      '@types/react': 18.0.25
-      react: 18.2.0
-      tslib: 2.4.1
-    dev: false
-
-  /@fluentui/utilities/8.13.4_fan5qbzahqtxlm5dzefqlqx5ia:
-    resolution: {integrity: sha512-oJ6q8BvVdr0eEG5RgI/VBtKX2JvJV2h0AUkR7FwZoT8fvUUH/iykPZO/5CAVcQDyiXj73hmBibiEGkWNFFuPfw==}
-    peerDependencies:
-      '@types/react': '>=16.8.0 <19.0.0'
-      react: '>=16.8.0 <19.0.0'
-    dependencies:
-      '@fluentui/dom-utilities': 2.2.3
-      '@fluentui/merge-styles': 8.5.4
-      '@fluentui/set-version': 8.2.3
-      '@types/react': 18.0.25
-      react: 18.2.0
-      tslib: 2.4.1
-    dev: false
-
-  /@griffel/core/1.8.1:
-    resolution: {integrity: sha512-Zig4h+o2f8v7tV13yQCmRaEKp6Psdi+NZEPQOmM7DJNmAHYQgcHJcLqJH7SOGWr+QOh3ZXVpQ2EP3JDKz479GQ==}
-    dependencies:
-      '@emotion/hash': 0.8.0
-      csstype: 3.1.0
-      rtl-css-js: 1.16.0
-      stylis: 4.1.1
-      tslib: 2.4.1
-    dev: false
-
-  /@griffel/react/1.4.2_react@18.2.0:
-    resolution: {integrity: sha512-VM047UxJFiq/OX5YkRPVuGB9NdU/TxVX9nrBRncXuxzVRRmvf+1OmHlcXWaFuXVj0JOjiMBzm4jH34lqPRGS+Q==}
-    peerDependencies:
-      react: '>=16.8.0 <19.0.0'
-    dependencies:
-      '@griffel/core': 1.8.1
-      react: 18.2.0
-      tslib: 2.4.1
-    dev: false
-
-  /@hapi/hoek/9.3.0:
-    resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==}
-    dev: false
-
-  /@hapi/topo/5.1.0:
-    resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==}
-    dependencies:
-      '@hapi/hoek': 9.3.0
-    dev: false
-
-  /@humanwhocodes/config-array/0.11.7:
-    resolution: {integrity: sha512-kBbPWzN8oVMLb0hOUYXhmxggL/1cJE6ydvjDIGi9EnAGUyA7cLVKQg+d/Dsm+KZwx2czGHrCmMVLiyg8s5JPKw==}
-    engines: {node: '>=10.10.0'}
-    dependencies:
-      '@humanwhocodes/object-schema': 1.2.1
-      debug: 4.3.4
-      minimatch: 3.1.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@humanwhocodes/module-importer/1.0.1:
-    resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
-    engines: {node: '>=12.22'}
-    dev: true
-
-  /@humanwhocodes/object-schema/1.2.1:
-    resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==}
-    dev: true
-
-  /@istanbuljs/load-nyc-config/1.1.0:
-    resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
-    engines: {node: '>=8'}
-    dependencies:
-      camelcase: 5.3.1
-      find-up: 4.1.0
-      get-package-type: 0.1.0
-      js-yaml: 3.14.1
-      resolve-from: 5.0.0
-    dev: true
-
-  /@istanbuljs/schema/0.1.3:
-    resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
-    engines: {node: '>=8'}
-    dev: true
-
-  /@jest/console/29.3.1:
-    resolution: {integrity: sha512-IRE6GD47KwcqA09RIWrabKdHPiKDGgtAL31xDxbi/RjQMsr+lY+ppxmHwY0dUEV3qvvxZzoe5Hl0RXZJOjQNUg==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/types': 29.3.1
-      '@types/node': 18.11.9
-      chalk: 4.1.2
-      jest-message-util: 29.3.1
-      jest-util: 29.3.1
-      slash: 3.0.0
-    dev: true
-
-  /@jest/core/29.3.1:
-    resolution: {integrity: sha512-0ohVjjRex985w5MmO5L3u5GR1O30DexhBSpuwx2P+9ftyqHdJXnk7IUWiP80oHMvt7ubHCJHxV0a0vlKVuZirw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    peerDependencies:
-      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
-    peerDependenciesMeta:
-      node-notifier:
-        optional: true
-    dependencies:
-      '@jest/console': 29.3.1
-      '@jest/reporters': 29.3.1
-      '@jest/test-result': 29.3.1
-      '@jest/transform': 29.3.1
-      '@jest/types': 29.3.1
-      '@types/node': 18.11.9
-      ansi-escapes: 4.3.2
-      chalk: 4.1.2
-      ci-info: 3.3.2
-      exit: 0.1.2
-      graceful-fs: 4.2.10
-      jest-changed-files: 29.2.0
-      jest-config: 29.3.1_@types+node@18.11.9
-      jest-haste-map: 29.3.1
-      jest-message-util: 29.3.1
-      jest-regex-util: 29.2.0
-      jest-resolve: 29.3.1
-      jest-resolve-dependencies: 29.3.1
-      jest-runner: 29.3.1
-      jest-runtime: 29.3.1
-      jest-snapshot: 29.3.1
-      jest-util: 29.3.1
-      jest-validate: 29.3.1
-      jest-watcher: 29.3.1
-      micromatch: 4.0.5
-      pretty-format: 29.3.1
-      slash: 3.0.0
-      strip-ansi: 6.0.1
-    transitivePeerDependencies:
-      - supports-color
-      - ts-node
-    dev: true
-
-  /@jest/environment/29.3.1:
-    resolution: {integrity: sha512-pMmvfOPmoa1c1QpfFW0nXYtNLpofqo4BrCIk6f2kW4JFeNlHV2t3vd+3iDLf31e2ot2Mec0uqZfmI+U0K2CFag==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/fake-timers': 29.3.1
-      '@jest/types': 29.3.1
-      '@types/node': 18.11.9
-      jest-mock: 29.3.1
-    dev: true
-
-  /@jest/expect-utils/29.3.1:
-    resolution: {integrity: sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      jest-get-type: 29.2.0
-    dev: true
-
-  /@jest/expect/29.3.1:
-    resolution: {integrity: sha512-QivM7GlSHSsIAWzgfyP8dgeExPRZ9BIe2LsdPyEhCGkZkoyA+kGsoIzbKAfZCvvRzfZioKwPtCZIt5SaoxYCvg==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      expect: 29.3.1
-      jest-snapshot: 29.3.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@jest/fake-timers/29.3.1:
-    resolution: {integrity: sha512-iHTL/XpnDlFki9Tq0Q1GGuVeQ8BHZGIYsvCO5eN/O/oJaRzofG9Xndd9HuSDBI/0ZS79pg0iwn07OMTQ7ngF2A==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/types': 29.3.1
-      '@sinonjs/fake-timers': 9.1.2
-      '@types/node': 18.11.9
-      jest-message-util: 29.3.1
-      jest-mock: 29.3.1
-      jest-util: 29.3.1
-    dev: true
-
-  /@jest/globals/29.3.1:
-    resolution: {integrity: sha512-cTicd134vOcwO59OPaB6AmdHQMCtWOe+/DitpTZVxWgMJ+YvXL1HNAmPyiGbSHmF/mXVBkvlm8YYtQhyHPnV6Q==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/environment': 29.3.1
-      '@jest/expect': 29.3.1
-      '@jest/types': 29.3.1
-      jest-mock: 29.3.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@jest/reporters/29.3.1:
-    resolution: {integrity: sha512-GhBu3YFuDrcAYW/UESz1JphEAbvUjaY2vShRZRoRY1mxpCMB3yGSJ4j9n0GxVlEOdCf7qjvUfBCrTUUqhVfbRA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    peerDependencies:
-      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
-    peerDependenciesMeta:
-      node-notifier:
-        optional: true
-    dependencies:
-      '@bcoe/v8-coverage': 0.2.3
-      '@jest/console': 29.3.1
-      '@jest/test-result': 29.3.1
-      '@jest/transform': 29.3.1
-      '@jest/types': 29.3.1
-      '@jridgewell/trace-mapping': 0.3.17
-      '@types/node': 18.11.9
-      chalk: 4.1.2
-      collect-v8-coverage: 1.0.1
-      exit: 0.1.2
-      glob: 7.2.3
-      graceful-fs: 4.2.10
-      istanbul-lib-coverage: 3.2.0
-      istanbul-lib-instrument: 5.2.0
-      istanbul-lib-report: 3.0.0
-      istanbul-lib-source-maps: 4.0.1
-      istanbul-reports: 3.1.5
-      jest-message-util: 29.3.1
-      jest-util: 29.3.1
-      jest-worker: 29.3.1
-      slash: 3.0.0
-      string-length: 4.0.2
-      strip-ansi: 6.0.1
-      v8-to-istanbul: 9.0.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@jest/schemas/29.0.0:
-    resolution: {integrity: sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@sinclair/typebox': 0.24.20
-    dev: true
-
-  /@jest/source-map/29.2.0:
-    resolution: {integrity: sha512-1NX9/7zzI0nqa6+kgpSdKPK+WU1p+SJk3TloWZf5MzPbxri9UEeXX5bWZAPCzbQcyuAzubcdUHA7hcNznmRqWQ==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jridgewell/trace-mapping': 0.3.17
-      callsites: 3.1.0
-      graceful-fs: 4.2.10
-    dev: true
-
-  /@jest/test-result/29.3.1:
-    resolution: {integrity: sha512-qeLa6qc0ddB0kuOZyZIhfN5q0e2htngokyTWsGriedsDhItisW7SDYZ7ceOe57Ii03sL988/03wAcBh3TChMGw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/console': 29.3.1
-      '@jest/types': 29.3.1
-      '@types/istanbul-lib-coverage': 2.0.4
-      collect-v8-coverage: 1.0.1
-    dev: true
-
-  /@jest/test-sequencer/29.3.1:
-    resolution: {integrity: sha512-IqYvLbieTv20ArgKoAMyhLHNrVHJfzO6ARZAbQRlY4UGWfdDnLlZEF0BvKOMd77uIiIjSZRwq3Jb3Fa3I8+2UA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/test-result': 29.3.1
-      graceful-fs: 4.2.10
-      jest-haste-map: 29.3.1
-      slash: 3.0.0
-    dev: true
-
-  /@jest/transform/29.3.1:
-    resolution: {integrity: sha512-8wmCFBTVGYqFNLWfcOWoVuMuKYPUBTnTMDkdvFtAYELwDOl9RGwOsvQWGPFxDJ8AWY9xM/8xCXdqmPK3+Q5Lug==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@babel/core': 7.20.2
-      '@jest/types': 29.3.1
-      '@jridgewell/trace-mapping': 0.3.17
-      babel-plugin-istanbul: 6.1.1
-      chalk: 4.1.2
-      convert-source-map: 2.0.0
-      fast-json-stable-stringify: 2.1.0
-      graceful-fs: 4.2.10
-      jest-haste-map: 29.3.1
-      jest-regex-util: 29.2.0
-      jest-util: 29.3.1
-      micromatch: 4.0.5
-      pirates: 4.0.5
-      slash: 3.0.0
-      write-file-atomic: 4.0.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@jest/types/29.3.1:
-    resolution: {integrity: sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/schemas': 29.0.0
-      '@types/istanbul-lib-coverage': 2.0.4
-      '@types/istanbul-reports': 3.0.1
-      '@types/node': 18.11.9
-      '@types/yargs': 17.0.10
-      chalk: 4.1.2
-    dev: true
-
-  /@jridgewell/gen-mapping/0.1.1:
-    resolution: {integrity: sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==}
-    engines: {node: '>=6.0.0'}
-    dependencies:
-      '@jridgewell/set-array': 1.1.2
-      '@jridgewell/sourcemap-codec': 1.4.14
-
-  /@jridgewell/gen-mapping/0.3.2:
-    resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==}
-    engines: {node: '>=6.0.0'}
-    dependencies:
-      '@jridgewell/set-array': 1.1.2
-      '@jridgewell/sourcemap-codec': 1.4.14
-      '@jridgewell/trace-mapping': 0.3.14
-
-  /@jridgewell/resolve-uri/3.1.0:
-    resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==}
-    engines: {node: '>=6.0.0'}
-
-  /@jridgewell/set-array/1.1.2:
-    resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==}
-    engines: {node: '>=6.0.0'}
-
-  /@jridgewell/source-map/0.3.2:
-    resolution: {integrity: sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==}
-    dependencies:
-      '@jridgewell/gen-mapping': 0.3.2
-      '@jridgewell/trace-mapping': 0.3.14
-    dev: false
-
-  /@jridgewell/sourcemap-codec/1.4.14:
-    resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
-
-  /@jridgewell/trace-mapping/0.3.14:
-    resolution: {integrity: sha512-bJWEfQ9lPTvm3SneWwRFVLzrh6nhjwqw7TUFFBEMzwvg7t7PCDenf2lDwqo4NQXzdpgBXyFgDWnQA+2vkruksQ==}
-    dependencies:
-      '@jridgewell/resolve-uri': 3.1.0
-      '@jridgewell/sourcemap-codec': 1.4.14
-
-  /@jridgewell/trace-mapping/0.3.17:
-    resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==}
-    dependencies:
-      '@jridgewell/resolve-uri': 3.1.0
-      '@jridgewell/sourcemap-codec': 1.4.14
-    dev: true
-
-  /@leichtgewicht/ip-codec/2.0.4:
-    resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==}
-    dev: false
-
-  /@mdx-js/loader/2.1.5:
-    resolution: {integrity: sha512-oXjfTa/iAcMmW8DdQ+hQFodPCLqw5VKT2yoZkLwrZfPVVpUgKrI+5/ZePYq328xxtAUStZmR3ed0PWJrwd5Pkg==}
-    peerDependencies:
-      webpack: '>=4'
-    dependencies:
-      '@mdx-js/mdx': 2.1.2
-      source-map: 0.7.4
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@mdx-js/mdx/1.6.22:
-    resolution: {integrity: sha512-AMxuLxPz2j5/6TpF/XSdKpQP1NlG0z11dFOlq+2IP/lSgl11GY8ji6S/rgsViN/L0BDvHvUMruRb7ub+24LUYA==}
-    dependencies:
-      '@babel/core': 7.12.9
-      '@babel/plugin-syntax-jsx': 7.12.1_@babel+core@7.12.9
-      '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.12.9
-      '@mdx-js/util': 1.6.22
-      babel-plugin-apply-mdx-type-prop: 1.6.22_@babel+core@7.12.9
-      babel-plugin-extract-import-names: 1.6.22
-      camelcase-css: 2.0.1
-      detab: 2.0.4
-      hast-util-raw: 6.0.1
-      lodash.uniq: 4.5.0
-      mdast-util-to-hast: 10.0.1
-      remark-footnotes: 2.0.0
-      remark-mdx: 1.6.22
-      remark-parse: 8.0.3
-      remark-squeeze-paragraphs: 4.0.0
-      style-to-object: 0.3.0
-      unified: 9.2.0
-      unist-builder: 2.0.3
-      unist-util-visit: 2.0.3
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@mdx-js/mdx/2.1.2:
-    resolution: {integrity: sha512-ASN1GUH0gXsgJ2UD/Td7FzJo1SwFkkQ5V1i9at5o/ROra7brkyMcBsotsOWJWRzmXZaLw2uXWn4aN8B3PMNFMA==}
-    dependencies:
-      '@types/estree-jsx': 0.0.1
-      '@types/mdx': 2.0.2
-      astring: 1.8.3
-      estree-util-build-jsx: 2.1.0
-      estree-util-is-identifier-name: 2.0.1
-      estree-walker: 3.0.1
-      hast-util-to-estree: 2.0.2
-      markdown-extensions: 1.1.1
-      periscopic: 3.0.4
-      remark-mdx: 2.1.2
-      remark-parse: 10.0.1
-      remark-rehype: 10.1.0
-      unified: 10.1.2
-      unist-util-position-from-estree: 1.1.1
-      unist-util-stringify-position: 3.0.2
-      unist-util-visit: 4.1.0
-      vfile: 5.3.4
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@mdx-js/react/1.6.22_react@18.2.0:
-    resolution: {integrity: sha512-TDoPum4SHdfPiGSAaRBw7ECyI8VaHpK8GJugbJIJuqyh6kzw9ZLJZW3HGL3NNrJGxcAixUvqROm+YuQOo5eXtg==}
-    peerDependencies:
-      react: ^16.13.1 || ^17.0.0
-    dependencies:
-      react: 18.2.0
-    dev: false
-
-  /@mdx-js/react/2.1.5_react@18.2.0:
-    resolution: {integrity: sha512-3Az1I6SAWA9R38rYjz5rXBrGKeZhq96CSSyQtqY+maPj8stBsoUH5pNcmIixuGkufYsh8F5+ka2CVPo2fycWZw==}
-    peerDependencies:
-      react: '>=16'
-    dependencies:
-      '@types/mdx': 2.0.2
-      '@types/react': 18.0.25
-      react: 18.2.0
-    dev: false
-
-  /@mdx-js/util/1.6.22:
-    resolution: {integrity: sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==}
-    dev: false
-
-  /@microsoft/load-themed-styles/1.10.281:
-    resolution: {integrity: sha512-91uZ4u6p5ZClHQE2RpJKTZALeCl1G9cZB47SPivfPrRtjrhqCfS3gC3zNoikUhpwccWjfSN50zjm289Wxkf/8Q==}
-    dev: false
-
-  /@next/env/13.0.3:
-    resolution: {integrity: sha512-/4WzeG61Ot/PxsghXkSqQJ6UohFfwXoZ3dtsypmR9EBP+OIax9JRq0trq8Z/LCT9Aq4JbihVkaazRWguORjTAw==}
-    dev: false
-
-  /@next/eslint-plugin-next/13.0.3:
-    resolution: {integrity: sha512-slmTAHNKDyc7jhx4VF8lFbmOPWJ3PShtUUWpb6x9+ga59CyOxgP6AdcDhxfapnWYACKe/TwYiaveufu7LqXgZg==}
-    dependencies:
-      glob: 7.1.7
-    dev: true
-
-  /@next/mdx/13.0.3_@mdx-js+loader@2.1.5:
-    resolution: {integrity: sha512-0NWKlwQdKsG/KdpTceC17zGlGP7deRAc2/JXpsOcy0744QWd3ai1Eg5g6YsR25giiW6EJVQr0ynfFzTLXdzg9Q==}
-    peerDependencies:
-      '@mdx-js/loader': '>=0.15.0'
-      '@mdx-js/react': '*'
-    dependencies:
-      '@mdx-js/loader': 2.1.5
-      source-map: 0.7.4
-    dev: true
-
-  /@next/swc-android-arm-eabi/13.0.3:
-    resolution: {integrity: sha512-uxfUoj65CdFc1gX2q7GtBX3DhKv9Kn343LMqGNvXyuTpYTGMmIiVY7b9yF8oLWRV0gVKqhZBZifUmoPE8SJU6Q==}
-    engines: {node: '>= 10'}
-    cpu: [arm]
-    os: [android]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /@next/swc-android-arm64/13.0.3:
-    resolution: {integrity: sha512-t2k+WDfg7Cq2z/EnalKGsd/9E5F4Hdo1xu+UzZXYDpKUI9zgE6Bz8ajQb8m8txv3qOaWdKuDa5j5ziq9Acd1Xw==}
-    engines: {node: '>= 10'}
-    cpu: [arm64]
-    os: [android]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /@next/swc-darwin-arm64/13.0.3:
-    resolution: {integrity: sha512-wV6j6SZ1bc/YHOLCLk9JVqaZTCCey6HBV7inl2DriHsHqIcO6F3+QiYf0KXwRP9BE0GSZZrYd5mZQm2JPTHdJA==}
-    engines: {node: '>= 10'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /@next/swc-darwin-x64/13.0.3:
-    resolution: {integrity: sha512-jaI2CMuYWvUtRixV3AIjUhnxUDU1FKOR+8hADMhYt3Yz+pCKuj4RZ0n0nY5qUf3qT1AtvnJXEgyatSFJhSp/wQ==}
-    engines: {node: '>= 10'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /@next/swc-freebsd-x64/13.0.3:
-    resolution: {integrity: sha512-nbyT0toBTJrcj5TCB9pVnQpGJ3utGyQj4CWegZs1ulaeUQ5Z7CS/qt8nRyYyOKYHtOdSCJ9Nw5F/RgKNkdpOdw==}
-    engines: {node: '>= 10'}
-    cpu: [x64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /@next/swc-linux-arm-gnueabihf/13.0.3:
-    resolution: {integrity: sha512-1naLxYvRUQCoFCU1nMkcQueRc0Iux9xBv1L5pzH2ejtIWFg8BrSgyuluJG4nyAhFCx4WG863IEIkAaefOowVdA==}
-    engines: {node: '>= 10'}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /@next/swc-linux-arm64-gnu/13.0.3:
-    resolution: {integrity: sha512-3Z4A8JkuGWpMVbUhUPQInK/SLY+kijTT78Q/NZCrhLlyvwrVxaQALJNlXzxDLraUgv4oVH0Wz/FIw1W9PUUhxA==}
-    engines: {node: '>= 10'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /@next/swc-linux-arm64-musl/13.0.3:
-    resolution: {integrity: sha512-MoYe9SM40UaunTjC+01c9OILLH3uSoeri58kDMu3KF/EFEvn1LZ6ODeDj+SLGlAc95wn46hrRJS2BPmDDE+jFQ==}
-    engines: {node: '>= 10'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /@next/swc-linux-x64-gnu/13.0.3:
-    resolution: {integrity: sha512-z22T5WGnRanjLMXdF0NaNjSpBlEzzY43t5Ysp3nW1oI6gOkub6WdQNZeHIY7A2JwkgSWZmtjLtf+Fzzz38LHeQ==}
-    engines: {node: '>= 10'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /@next/swc-linux-x64-musl/13.0.3:
-    resolution: {integrity: sha512-ZOMT7zjBFmkusAtr47k8xs/oTLsNlTH6xvYb+iux7yly2hZGwhfBLzPGBsbeMZukZ96IphJTagT+C033s6LNVA==}
-    engines: {node: '>= 10'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /@next/swc-win32-arm64-msvc/13.0.3:
-    resolution: {integrity: sha512-Q4BM16Djl+Oah9UdGrvjFYgoftYB2jNd+rtRGPX5Mmxo09Ry/KiLbOZnoUyoIxKc1xPyfqMXuaVsAFQLYs0KEQ==}
-    engines: {node: '>= 10'}
-    cpu: [arm64]
-    os: [win32]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /@next/swc-win32-ia32-msvc/13.0.3:
-    resolution: {integrity: sha512-Sa8yGkNeRUsic8Qjf7MLIAfP0p0+einK/wIqJ8UO1y76j+8rRQu42AMs5H4Ax1fm9GEYq6I8njHtY59TVpTtGQ==}
-    engines: {node: '>= 10'}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /@next/swc-win32-x64-msvc/13.0.3:
-    resolution: {integrity: sha512-IAptmSqA7k4tQzaw2NAkoEjj3+Dz9ceuvlEHwYh770MMDL4V0ku2m+UHrmn5HUCEDHhgwwjg2nyf6728q2jr1w==}
-    engines: {node: '>= 10'}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: false
-    optional: true
-
-  /@nodelib/fs.scandir/2.1.5:
-    resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
-    engines: {node: '>= 8'}
-    dependencies:
-      '@nodelib/fs.stat': 2.0.5
-      run-parallel: 1.2.0
-
-  /@nodelib/fs.stat/2.0.5:
-    resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==}
-    engines: {node: '>= 8'}
-
-  /@nodelib/fs.walk/1.2.8:
-    resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
-    engines: {node: '>= 8'}
-    dependencies:
-      '@nodelib/fs.scandir': 2.1.5
-      fastq: 1.13.0
-
-  /@polka/url/1.0.0-next.21:
-    resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==}
-    dev: false
-
-  /@rushstack/eslint-patch/1.1.4:
-    resolution: {integrity: sha512-LwzQKA4vzIct1zNZzBmRKI9QuNpLgTQMEjsQLf3BXuGYb3QPTP4Yjf6mkdX+X1mYttZ808QpOwAzZjv28kq7DA==}
-    dev: true
-
-  /@sideway/address/4.1.4:
-    resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==}
-    dependencies:
-      '@hapi/hoek': 9.3.0
-    dev: false
-
-  /@sideway/formula/3.0.0:
-    resolution: {integrity: sha512-vHe7wZ4NOXVfkoRb8T5otiENVlT7a3IAiw7H5M2+GO+9CDgcVUUsX1zalAztCmwyOr2RUTGJdgB+ZvSVqmdHmg==}
-    dev: false
-
-  /@sideway/pinpoint/2.0.0:
-    resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==}
-    dev: false
-
-  /@sinclair/typebox/0.24.20:
-    resolution: {integrity: sha512-kVaO5aEFZb33nPMTZBxiPEkY+slxiPtqC7QX8f9B3eGOMBvEfuMfxp9DSTTCsRJPumPKjrge4yagyssO4q6qzQ==}
-    dev: true
-
-  /@sindresorhus/is/0.14.0:
-    resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==}
-    engines: {node: '>=6'}
-    dev: false
-
-  /@sindresorhus/is/0.7.0:
-    resolution: {integrity: sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /@sinonjs/commons/1.8.3:
-    resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==}
-    dependencies:
-      type-detect: 4.0.8
-    dev: true
-
-  /@sinonjs/fake-timers/9.1.2:
-    resolution: {integrity: sha512-BPS4ynJW/o92PUR4wgriz2Ud5gpST5vz6GQfMixEDK0Z8ZCUv2M7SkBLykH56T++Xs+8ln9zTGbOvNGIe02/jw==}
-    dependencies:
-      '@sinonjs/commons': 1.8.3
-    dev: true
-
-  /@slorber/static-site-generator-webpack-plugin/4.0.7:
-    resolution: {integrity: sha512-Ug7x6z5lwrz0WqdnNFOMYrDQNTPAprvHLSh6+/fmml3qUiz6l5eq+2MzLKWtn/q5K5NpSiFsZTP/fck/3vjSxA==}
-    engines: {node: '>=14'}
-    dependencies:
-      eval: 0.1.8
-      p-map: 4.0.0
-      webpack-sources: 3.2.3
-    dev: false
-
-  /@svgr/babel-plugin-add-jsx-attribute/6.5.1_@babel+core@7.20.2:
-    resolution: {integrity: sha512-9PYGcXrAxitycIjRmZB+Q0JaN07GZIWaTBIGQzfaZv+qr1n8X1XUEJ5rZ/vx6OVD9RRYlrNnXWExQXcmZeD/BQ==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-    dev: false
-
-  /@svgr/babel-plugin-remove-jsx-attribute/6.3.0_@babel+core@7.20.2:
-    resolution: {integrity: sha512-zD0sTwXpL78pWaxWxCyqimfukPcJfToKuwW1Po00pUeOYT6KuMQrPnG6XIZpLadydOo+fght8SoxwRb5O9TtWA==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-    dev: false
-
-  /@svgr/babel-plugin-remove-jsx-empty-expression/6.3.0_@babel+core@7.20.2:
-    resolution: {integrity: sha512-COsMIL1BRU/ZxFTvd59NFzJPIdvBkV19Jrn7w1NwFmglOUrpchPRSzfW6FzWUh2C8nzJrnjDn6V7i7klVhHZEA==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-    dev: false
-
-  /@svgr/babel-plugin-replace-jsx-attribute-value/6.5.1_@babel+core@7.20.2:
-    resolution: {integrity: sha512-8DPaVVE3fd5JKuIC29dqyMB54sA6mfgki2H2+swh+zNJoynC8pMPzOkidqHOSc6Wj032fhl8Z0TVn1GiPpAiJg==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-    dev: false
-
-  /@svgr/babel-plugin-svg-dynamic-title/6.5.1_@babel+core@7.20.2:
-    resolution: {integrity: sha512-FwOEi0Il72iAzlkaHrlemVurgSQRDFbk0OC8dSvD5fSBPHltNh7JtLsxmZUhjYBZo2PpcU/RJvvi6Q0l7O7ogw==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-    dev: false
-
-  /@svgr/babel-plugin-svg-em-dimensions/6.5.1_@babel+core@7.20.2:
-    resolution: {integrity: sha512-gWGsiwjb4tw+ITOJ86ndY/DZZ6cuXMNE/SjcDRg+HLuCmwpcjOktwRF9WgAiycTqJD/QXqL2f8IzE2Rzh7aVXA==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-    dev: false
-
-  /@svgr/babel-plugin-transform-react-native-svg/6.5.1_@babel+core@7.20.2:
-    resolution: {integrity: sha512-2jT3nTayyYP7kI6aGutkyfJ7UMGtuguD72OjeGLwVNyfPRBD8zQthlvL+fAbAKk5n9ZNcvFkp/b1lZ7VsYqVJg==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-    dev: false
-
-  /@svgr/babel-plugin-transform-svg-component/6.5.1_@babel+core@7.20.2:
-    resolution: {integrity: sha512-a1p6LF5Jt33O3rZoVRBqdxL350oge54iZWHNI6LJB5tQ7EelvD/Mb1mfBiZNAan0dt4i3VArkFRjA4iObuNykQ==}
-    engines: {node: '>=12'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-    dev: false
-
-  /@svgr/babel-preset/6.5.1_@babel+core@7.20.2:
-    resolution: {integrity: sha512-6127fvO/FF2oi5EzSQOAjo1LE3OtNVh11R+/8FXa+mHx1ptAaS4cknIjnUA7e6j6fwGGJ17NzaTJFUwOV2zwCw==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@svgr/babel-plugin-add-jsx-attribute': 6.5.1_@babel+core@7.20.2
-      '@svgr/babel-plugin-remove-jsx-attribute': 6.3.0_@babel+core@7.20.2
-      '@svgr/babel-plugin-remove-jsx-empty-expression': 6.3.0_@babel+core@7.20.2
-      '@svgr/babel-plugin-replace-jsx-attribute-value': 6.5.1_@babel+core@7.20.2
-      '@svgr/babel-plugin-svg-dynamic-title': 6.5.1_@babel+core@7.20.2
-      '@svgr/babel-plugin-svg-em-dimensions': 6.5.1_@babel+core@7.20.2
-      '@svgr/babel-plugin-transform-react-native-svg': 6.5.1_@babel+core@7.20.2
-      '@svgr/babel-plugin-transform-svg-component': 6.5.1_@babel+core@7.20.2
-    dev: false
-
-  /@svgr/core/6.5.1:
-    resolution: {integrity: sha512-/xdLSWxK5QkqG524ONSjvg3V/FkNyCv538OIBdQqPNaAta3AsXj/Bd2FbvR87yMbXO2hFSWiAe/Q6IkVPDw+mw==}
-    engines: {node: '>=10'}
-    dependencies:
-      '@babel/core': 7.20.2
-      '@svgr/babel-preset': 6.5.1_@babel+core@7.20.2
-      '@svgr/plugin-jsx': 6.5.1_@svgr+core@6.5.1
-      camelcase: 6.3.0
-      cosmiconfig: 7.0.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@svgr/hast-util-to-babel-ast/6.5.1:
-    resolution: {integrity: sha512-1hnUxxjd83EAxbL4a0JDJoD3Dao3hmjvyvyEV8PzWmLK3B9m9NPlW7GKjFyoWE8nM7HnXzPcmmSyOW8yOddSXw==}
-    engines: {node: '>=10'}
-    dependencies:
-      '@babel/types': 7.20.2
-      entities: 4.4.0
-    dev: false
-
-  /@svgr/plugin-jsx/6.5.1_@svgr+core@6.5.1:
-    resolution: {integrity: sha512-+UdQxI3jgtSjCykNSlEMuy1jSRQlGC7pqBCPvkG/2dATdWo082zHTTK3uhnAju2/6XpE6B5mZ3z4Z8Ns01S8Gw==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      '@svgr/core': ^6.0.0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@svgr/babel-preset': 6.5.1_@babel+core@7.20.2
-      '@svgr/core': 6.5.1
-      '@svgr/hast-util-to-babel-ast': 6.5.1
-      svg-parser: 2.0.4
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@svgr/plugin-svgo/6.5.1_@svgr+core@6.5.1:
-    resolution: {integrity: sha512-omvZKf8ixP9z6GWgwbtmP9qQMPX4ODXi+wzbVZgomNFsUIlHA1sf4fThdwTWSsZGgvGAG6yE+b/F5gWUkcZ/iQ==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      '@svgr/core': '*'
-    dependencies:
-      '@svgr/core': 6.5.1
-      cosmiconfig: 7.0.1
-      deepmerge: 4.2.2
-      svgo: 2.8.0
-    dev: false
-
-  /@svgr/webpack/6.5.1:
-    resolution: {integrity: sha512-cQ/AsnBkXPkEK8cLbv4Dm7JGXq2XrumKnL1dRpJD9rIO2fTIlJI9a1uCciYG1F2aUsox/hJQyNGbt3soDxSRkA==}
-    engines: {node: '>=10'}
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/plugin-transform-react-constant-elements': 7.20.2_@babel+core@7.20.2
-      '@babel/preset-env': 7.20.2_@babel+core@7.20.2
-      '@babel/preset-react': 7.18.6_@babel+core@7.20.2
-      '@babel/preset-typescript': 7.18.6_@babel+core@7.20.2
-      '@svgr/core': 6.5.1
-      '@svgr/plugin-jsx': 6.5.1_@svgr+core@6.5.1
-      '@svgr/plugin-svgo': 6.5.1_@svgr+core@6.5.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /@swc/helpers/0.4.11:
-    resolution: {integrity: sha512-rEUrBSGIoSFuYxwBYtlUFMlE2CwGhmW+w9355/5oduSw8e5h2+Tj4UrAGNNgP9915++wj5vkQo0UuOBqOAq4nw==}
-    dependencies:
-      tslib: 2.4.1
-    dev: false
-
-  /@szmarczak/http-timer/1.1.2:
-    resolution: {integrity: sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==}
-    engines: {node: '>=6'}
-    dependencies:
-      defer-to-connect: 1.1.3
-    dev: false
-
-  /@trysound/sax/0.2.0:
-    resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
-    engines: {node: '>=10.13.0'}
-    dev: false
-
-  /@types/acorn/4.0.6:
-    resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==}
-    dependencies:
-      '@types/estree': 1.0.0
-    dev: true
-
-  /@types/babel__core/7.1.19:
-    resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==}
-    dependencies:
-      '@babel/parser': 7.20.3
-      '@babel/types': 7.20.2
-      '@types/babel__generator': 7.6.4
-      '@types/babel__template': 7.4.1
-      '@types/babel__traverse': 7.17.1
-    dev: true
-
-  /@types/babel__generator/7.6.4:
-    resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==}
-    dependencies:
-      '@babel/types': 7.20.2
-    dev: true
-
-  /@types/babel__template/7.4.1:
-    resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==}
-    dependencies:
-      '@babel/parser': 7.20.3
-      '@babel/types': 7.20.2
-    dev: true
-
-  /@types/babel__traverse/7.17.1:
-    resolution: {integrity: sha512-kVzjari1s2YVi77D3w1yuvohV2idweYXMCDzqBiVNN63TcDWrIlTVOYpqVrvbbyOE/IyzBoTKF0fdnLPEORFxA==}
-    dependencies:
-      '@babel/types': 7.20.2
-    dev: true
-
-  /@types/body-parser/1.19.2:
-    resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==}
-    dependencies:
-      '@types/connect': 3.4.35
-      '@types/node': 18.11.9
-    dev: false
-
-  /@types/bonjour/3.5.10:
-    resolution: {integrity: sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==}
-    dependencies:
-      '@types/node': 18.11.9
-    dev: false
-
-  /@types/connect-history-api-fallback/1.3.5:
-    resolution: {integrity: sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==}
-    dependencies:
-      '@types/express-serve-static-core': 4.17.29
-      '@types/node': 18.11.9
-    dev: false
-
-  /@types/connect/3.4.35:
-    resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==}
-    dependencies:
-      '@types/node': 18.11.9
-    dev: false
-
-  /@types/debug/4.1.7:
-    resolution: {integrity: sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==}
-    dependencies:
-      '@types/ms': 0.7.31
-    dev: true
-
-  /@types/decompress/4.2.4:
-    resolution: {integrity: sha512-/C8kTMRTNiNuWGl5nEyKbPiMv6HA+0RbEXzFhFBEzASM6+oa4tJro9b8nj7eRlOFfuLdzUU+DS/GPDlvvzMOhA==}
-    dependencies:
-      '@types/node': 18.11.9
-    dev: true
-
-  /@types/dom-webcodecs/0.1.5:
-    resolution: {integrity: sha512-dsAE+4ws75W5mmNmIZ7IKZwv4bcz5GgPuA87u+Mk1CeVWB6g7ZwBfizRwBZDeyO12RSxoU3NlRa8jgLYQeSZGg==}
-    dev: false
-
-  /@types/download/8.0.1:
-    resolution: {integrity: sha512-t5DjMD6Y1DxjXtEHl7Kt+nQn9rOmVLYD8p4Swrcc5QpgyqyqR2gXTIK6RwwMnNeFJ+ZIiIW789fQKzCrK7AOFA==}
-    dependencies:
-      '@types/decompress': 4.2.4
-      '@types/got': 8.3.6
-      '@types/node': 18.11.9
-    dev: true
-
-  /@types/eslint-scope/3.7.4:
-    resolution: {integrity: sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==}
-    dependencies:
-      '@types/eslint': 8.4.5
-      '@types/estree': 1.0.0
-    dev: false
-
-  /@types/eslint/8.4.5:
-    resolution: {integrity: sha512-dhsC09y1gpJWnK+Ff4SGvCuSnk9DaU0BJZSzOwa6GVSg65XtTugLBITDAAzRU5duGBoXBHpdR/9jHGxJjNflJQ==}
-    dependencies:
-      '@types/estree': 1.0.0
-      '@types/json-schema': 7.0.11
-    dev: false
-
-  /@types/estree-jsx/0.0.1:
-    resolution: {integrity: sha512-gcLAYiMfQklDCPjQegGn0TBAn9it05ISEsEhlKQUddIk7o2XDokOcTN7HBO8tznM0D9dGezvHEfRZBfZf6me0A==}
-    dependencies:
-      '@types/estree': 1.0.0
-    dev: true
-
-  /@types/estree/0.0.51:
-    resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==}
-
-  /@types/estree/1.0.0:
-    resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==}
-
-  /@types/express-serve-static-core/4.17.29:
-    resolution: {integrity: sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==}
-    dependencies:
-      '@types/node': 18.11.9
-      '@types/qs': 6.9.7
-      '@types/range-parser': 1.2.4
-    dev: false
-
-  /@types/express/4.17.13:
-    resolution: {integrity: sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==}
-    dependencies:
-      '@types/body-parser': 1.19.2
-      '@types/express-serve-static-core': 4.17.29
-      '@types/qs': 6.9.7
-      '@types/serve-static': 1.13.10
-    dev: false
-
-  /@types/got/8.3.6:
-    resolution: {integrity: sha512-nvLlj+831dhdm4LR2Ly+HTpdLyBaMynoOr6wpIxS19d/bPeHQxFU5XQ6Gp6ohBpxvCWZM1uHQIC2+ySRH1rGrQ==}
-    dependencies:
-      '@types/node': 18.11.9
-    dev: true
-
-  /@types/graceful-fs/4.1.5:
-    resolution: {integrity: sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw==}
-    dependencies:
-      '@types/node': 18.11.9
-    dev: true
-
-  /@types/hast/2.3.4:
-    resolution: {integrity: sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==}
-    dependencies:
-      '@types/unist': 2.0.6
-
-  /@types/history/4.7.11:
-    resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==}
-    dev: false
-
-  /@types/html-minifier-terser/6.1.0:
-    resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==}
-    dev: false
-
-  /@types/http-proxy/1.17.9:
-    resolution: {integrity: sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==}
-    dependencies:
-      '@types/node': 18.11.9
-    dev: false
-
-  /@types/istanbul-lib-coverage/2.0.4:
-    resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==}
-    dev: true
-
-  /@types/istanbul-lib-report/3.0.0:
-    resolution: {integrity: sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==}
-    dependencies:
-      '@types/istanbul-lib-coverage': 2.0.4
-    dev: true
-
-  /@types/istanbul-reports/3.0.1:
-    resolution: {integrity: sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==}
-    dependencies:
-      '@types/istanbul-lib-report': 3.0.0
-    dev: true
-
-  /@types/json-schema/7.0.11:
-    resolution: {integrity: sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==}
-    dev: false
-
-  /@types/json5/0.0.29:
-    resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
-    dev: true
-
-  /@types/keyv/3.1.4:
-    resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==}
-    dependencies:
-      '@types/node': 17.0.45
-
-  /@types/mdast/3.0.10:
-    resolution: {integrity: sha512-W864tg/Osz1+9f4lrGTZpCSO5/z4608eUp19tbozkq2HJK6i3z1kT0H9tlADXuYIb1YYOBByU4Jsqkk75q48qA==}
-    dependencies:
-      '@types/unist': 2.0.6
-
-  /@types/mdurl/1.0.2:
-    resolution: {integrity: sha512-eC4U9MlIcu2q0KQmXszyn5Akca/0jrQmwDRgpAMJai7qBWq4amIQhZyNau4VYGtCeALvW1/NtjzJJ567aZxfKA==}
-    dev: true
-
-  /@types/mdx/2.0.2:
-    resolution: {integrity: sha512-mJGfgj4aWpiKb8C0nnJJchs1sHBHn0HugkVfqqyQi7Wn6mBRksLeQsPOFvih/Pu8L1vlDzfe/LidhVHBeUk3aQ==}
-
-  /@types/mime/1.3.2:
-    resolution: {integrity: sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==}
-    dev: false
-
-  /@types/ms/0.7.31:
-    resolution: {integrity: sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==}
-    dev: true
-
-  /@types/node-fetch/2.6.2:
-    resolution: {integrity: sha512-DHqhlq5jeESLy19TYhLakJ07kNumXWjcDdxXsLUMJZ6ue8VZJj4kLPQVE/2mdHh3xZziNF1xppu5lwmS53HR+A==}
-    dependencies:
-      '@types/node': 18.11.9
-      form-data: 3.0.1
-    dev: true
-
-  /@types/node/17.0.45:
-    resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==}
-
-  /@types/node/18.11.9:
-    resolution: {integrity: sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==}
-
-  /@types/parse-json/4.0.0:
-    resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==}
-    dev: false
-
-  /@types/parse5/5.0.3:
-    resolution: {integrity: sha512-kUNnecmtkunAoQ3CnjmMkzNU/gtxG8guhi+Fk2U/kOpIKjIMKnXGp4IJCgQJrXSgMsWYimYG4TGjz/UzbGEBTw==}
-    dev: false
-
-  /@types/prettier/2.6.3:
-    resolution: {integrity: sha512-ymZk3LEC/fsut+/Q5qejp6R9O1rMxz3XaRHDV6kX8MrGAhOSPqVARbDi+EZvInBpw+BnCX3TD240byVkOfQsHg==}
-    dev: true
-
-  /@types/prop-types/15.7.5:
-    resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==}
-
-  /@types/qs/6.9.7:
-    resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==}
-    dev: false
-
-  /@types/range-parser/1.2.4:
-    resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==}
-    dev: false
-
-  /@types/react-router-config/5.0.6:
-    resolution: {integrity: sha512-db1mx37a1EJDf1XeX8jJN7R3PZABmJQXR8r28yUjVMFSjkmnQo6X6pOEEmNl+Tp2gYQOGPdYbFIipBtdElZ3Yg==}
-    dependencies:
-      '@types/history': 4.7.11
-      '@types/react': 18.0.25
-      '@types/react-router': 5.1.18
-    dev: false
-
-  /@types/react-router-dom/5.3.3:
-    resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==}
-    dependencies:
-      '@types/history': 4.7.11
-      '@types/react': 18.0.25
-      '@types/react-router': 5.1.18
-    dev: false
-
-  /@types/react-router/5.1.18:
-    resolution: {integrity: sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g==}
-    dependencies:
-      '@types/history': 4.7.11
-      '@types/react': 18.0.25
-    dev: false
-
-  /@types/react/18.0.25:
-    resolution: {integrity: sha512-xD6c0KDT4m7n9uD4ZHi02lzskaiqcBxf4zi+tXZY98a04wvc0hi/TcCPC2FOESZi51Nd7tlUeOJY8RofL799/g==}
-    dependencies:
-      '@types/prop-types': 15.7.5
-      '@types/scheduler': 0.16.2
-      csstype: 3.1.0
-
-  /@types/responselike/1.0.0:
-    resolution: {integrity: sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==}
-    dependencies:
-      '@types/node': 17.0.45
-
-  /@types/retry/0.12.0:
-    resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==}
-    dev: false
-
-  /@types/sax/1.2.4:
-    resolution: {integrity: sha512-pSAff4IAxJjfAXUG6tFkO7dsSbTmf8CtUpfhhZ5VhkRpC4628tJhh3+V6H1E+/Gs9piSzYKT5yzHO5M4GG9jkw==}
-    dependencies:
-      '@types/node': 18.11.9
-    dev: false
-
-  /@types/scheduler/0.16.2:
-    resolution: {integrity: sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==}
-
-  /@types/semver/7.3.10:
-    resolution: {integrity: sha512-zsv3fsC7S84NN6nPK06u79oWgrPVd0NvOyqgghV1haPaFcVxIrP4DLomRwGAXk0ui4HZA7mOcSFL98sMVW9viw==}
-    dev: true
-
-  /@types/serve-index/1.9.1:
-    resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==}
-    dependencies:
-      '@types/express': 4.17.13
-    dev: false
-
-  /@types/serve-static/1.13.10:
-    resolution: {integrity: sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==}
-    dependencies:
-      '@types/mime': 1.3.2
-      '@types/node': 18.11.9
-    dev: false
-
-  /@types/sockjs/0.3.33:
-    resolution: {integrity: sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==}
-    dependencies:
-      '@types/node': 18.11.9
-    dev: false
-
-  /@types/stack-utils/2.0.1:
-    resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==}
-    dev: true
-
-  /@types/unist/2.0.6:
-    resolution: {integrity: sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==}
-
-  /@types/w3c-web-usb/1.0.6:
-    resolution: {integrity: sha512-cSjhgrr8g4KbPnnijAr/KJDNKa/bBa+ixYkywFRvrhvi9n1WEl7yYbtRyzE6jqNQiSxxJxoAW3STaOQwJHndaw==}
-    dev: false
-
-  /@types/ws/8.5.3:
-    resolution: {integrity: sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==}
-    dependencies:
-      '@types/node': 18.11.9
-    dev: false
-
-  /@types/yargs-parser/21.0.0:
-    resolution: {integrity: sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==}
-    dev: true
-
-  /@types/yargs/17.0.10:
-    resolution: {integrity: sha512-gmEaFwpj/7f/ROdtIlci1R1VYU1J4j95m8T+Tj3iBgiBFKg1foE/PSl93bBd5T9LDXNPo8UlNN6W0qwD8O5OaA==}
-    dependencies:
-      '@types/yargs-parser': 21.0.0
-    dev: true
-
-  /@typescript-eslint/parser/5.42.1_rmayb2veg2btbq6mbmnyivgasy:
-    resolution: {integrity: sha512-kAV+NiNBWVQDY9gDJDToTE/NO8BHi4f6b7zTsVAJoTkmB/zlfOpiEVBzHOKtlgTndCKe8vj9F/PuolemZSh50Q==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    peerDependencies:
-      eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
-      typescript: '*'
-    peerDependenciesMeta:
-      typescript:
-        optional: true
-    dependencies:
-      '@typescript-eslint/scope-manager': 5.42.1
-      '@typescript-eslint/types': 5.42.1
-      '@typescript-eslint/typescript-estree': 5.42.1_typescript@4.8.4
-      debug: 4.3.4
-      eslint: 8.27.0
-      typescript: 4.8.4
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@typescript-eslint/scope-manager/5.42.1:
-    resolution: {integrity: sha512-QAZY/CBP1Emx4rzxurgqj3rUinfsh/6mvuKbLNMfJMMKYLRBfweus8brgXF8f64ABkIZ3zdj2/rYYtF8eiuksQ==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    dependencies:
-      '@typescript-eslint/types': 5.42.1
-      '@typescript-eslint/visitor-keys': 5.42.1
-    dev: true
-
-  /@typescript-eslint/types/5.42.1:
-    resolution: {integrity: sha512-Qrco9dsFF5lhalz+lLFtxs3ui1/YfC6NdXu+RAGBa8uSfn01cjO7ssCsjIsUs484vny9Xm699FSKwpkCcqwWwA==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    dev: true
-
-  /@typescript-eslint/typescript-estree/5.42.1_typescript@4.8.4:
-    resolution: {integrity: sha512-qElc0bDOuO0B8wDhhW4mYVgi/LZL+igPwXtV87n69/kYC/7NG3MES0jHxJNCr4EP7kY1XVsRy8C/u3DYeTKQmw==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    peerDependencies:
-      typescript: '*'
-    peerDependenciesMeta:
-      typescript:
-        optional: true
-    dependencies:
-      '@typescript-eslint/types': 5.42.1
-      '@typescript-eslint/visitor-keys': 5.42.1
-      debug: 4.3.4
-      globby: 11.1.0
-      is-glob: 4.0.3
-      semver: 7.3.7
-      tsutils: 3.21.0_typescript@4.8.4
-      typescript: 4.8.4
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /@typescript-eslint/visitor-keys/5.42.1:
-    resolution: {integrity: sha512-LOQtSF4z+hejmpUvitPlc4hA7ERGoj2BVkesOcG91HCn8edLGUXbTrErmutmPbl8Bo9HjAvOO/zBKQHExXNA2A==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    dependencies:
-      '@typescript-eslint/types': 5.42.1
-      eslint-visitor-keys: 3.3.0
-    dev: true
-
-  /@webassemblyjs/ast/1.11.1:
-    resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==}
-    dependencies:
-      '@webassemblyjs/helper-numbers': 1.11.1
-      '@webassemblyjs/helper-wasm-bytecode': 1.11.1
-    dev: false
-
-  /@webassemblyjs/floating-point-hex-parser/1.11.1:
-    resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==}
-    dev: false
-
-  /@webassemblyjs/helper-api-error/1.11.1:
-    resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==}
-    dev: false
-
-  /@webassemblyjs/helper-buffer/1.11.1:
-    resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==}
-    dev: false
-
-  /@webassemblyjs/helper-numbers/1.11.1:
-    resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==}
-    dependencies:
-      '@webassemblyjs/floating-point-hex-parser': 1.11.1
-      '@webassemblyjs/helper-api-error': 1.11.1
-      '@xtuc/long': 4.2.2
-    dev: false
-
-  /@webassemblyjs/helper-wasm-bytecode/1.11.1:
-    resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==}
-    dev: false
-
-  /@webassemblyjs/helper-wasm-section/1.11.1:
-    resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==}
-    dependencies:
-      '@webassemblyjs/ast': 1.11.1
-      '@webassemblyjs/helper-buffer': 1.11.1
-      '@webassemblyjs/helper-wasm-bytecode': 1.11.1
-      '@webassemblyjs/wasm-gen': 1.11.1
-    dev: false
-
-  /@webassemblyjs/ieee754/1.11.1:
-    resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==}
-    dependencies:
-      '@xtuc/ieee754': 1.2.0
-    dev: false
-
-  /@webassemblyjs/leb128/1.11.1:
-    resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==}
-    dependencies:
-      '@xtuc/long': 4.2.2
-    dev: false
-
-  /@webassemblyjs/utf8/1.11.1:
-    resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==}
-    dev: false
-
-  /@webassemblyjs/wasm-edit/1.11.1:
-    resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==}
-    dependencies:
-      '@webassemblyjs/ast': 1.11.1
-      '@webassemblyjs/helper-buffer': 1.11.1
-      '@webassemblyjs/helper-wasm-bytecode': 1.11.1
-      '@webassemblyjs/helper-wasm-section': 1.11.1
-      '@webassemblyjs/wasm-gen': 1.11.1
-      '@webassemblyjs/wasm-opt': 1.11.1
-      '@webassemblyjs/wasm-parser': 1.11.1
-      '@webassemblyjs/wast-printer': 1.11.1
-    dev: false
-
-  /@webassemblyjs/wasm-gen/1.11.1:
-    resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==}
-    dependencies:
-      '@webassemblyjs/ast': 1.11.1
-      '@webassemblyjs/helper-wasm-bytecode': 1.11.1
-      '@webassemblyjs/ieee754': 1.11.1
-      '@webassemblyjs/leb128': 1.11.1
-      '@webassemblyjs/utf8': 1.11.1
-    dev: false
-
-  /@webassemblyjs/wasm-opt/1.11.1:
-    resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==}
-    dependencies:
-      '@webassemblyjs/ast': 1.11.1
-      '@webassemblyjs/helper-buffer': 1.11.1
-      '@webassemblyjs/wasm-gen': 1.11.1
-      '@webassemblyjs/wasm-parser': 1.11.1
-    dev: false
-
-  /@webassemblyjs/wasm-parser/1.11.1:
-    resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==}
-    dependencies:
-      '@webassemblyjs/ast': 1.11.1
-      '@webassemblyjs/helper-api-error': 1.11.1
-      '@webassemblyjs/helper-wasm-bytecode': 1.11.1
-      '@webassemblyjs/ieee754': 1.11.1
-      '@webassemblyjs/leb128': 1.11.1
-      '@webassemblyjs/utf8': 1.11.1
-    dev: false
-
-  /@webassemblyjs/wast-printer/1.11.1:
-    resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==}
-    dependencies:
-      '@webassemblyjs/ast': 1.11.1
-      '@xtuc/long': 4.2.2
-    dev: false
-
-  /@xtuc/ieee754/1.2.0:
-    resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==}
-    dev: false
-
-  /@xtuc/long/4.2.2:
-    resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==}
-    dev: false
-
-  /@yume-chan/async/2.2.0:
-    resolution: {integrity: sha512-jatCtX1/3DsR9Vt3EB8CGFy0MNrXP5f+eNiRGHLH+LkYz7MPLzpqL/DnvXSip+Z0EKBCDnzuNuELjsKEEzcdQA==}
-    dependencies:
-      tslib: 2.4.1
-    dev: false
-
-  /@yume-chan/stream-saver/2.0.6:
-    resolution: {integrity: sha512-DzRADjLoHcz18ocgGHvLIanapxygX3o9dlWwE32EUZqhyAsopfdvZ79ttR9+7pqAXIQamP9M4mbDy8hHgFKOIA==}
-    dev: false
-
-  /abab/2.0.6:
-    resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==}
-    dev: true
-
-  /accepts/1.3.8:
-    resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==}
-    engines: {node: '>= 0.6'}
-    dependencies:
-      mime-types: 2.1.35
-      negotiator: 0.6.3
-    dev: false
-
-  /acorn-import-assertions/1.8.0_acorn@8.7.1:
-    resolution: {integrity: sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==}
-    peerDependencies:
-      acorn: ^8
-    dependencies:
-      acorn: 8.7.1
-    dev: false
-
-  /acorn-jsx/5.3.2_acorn@8.7.1:
-    resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
-    peerDependencies:
-      acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
-    dependencies:
-      acorn: 8.7.1
-    dev: true
-
-  /acorn-jsx/5.3.2_acorn@8.8.1:
-    resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
-    peerDependencies:
-      acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
-    dependencies:
-      acorn: 8.8.1
-    dev: true
-
-  /acorn-walk/8.2.0:
-    resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==}
-    engines: {node: '>=0.4.0'}
-    dev: false
-
-  /acorn/8.7.1:
-    resolution: {integrity: sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==}
-    engines: {node: '>=0.4.0'}
-    hasBin: true
-
-  /acorn/8.8.1:
-    resolution: {integrity: sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==}
-    engines: {node: '>=0.4.0'}
-    hasBin: true
-    dev: true
-
-  /address/1.2.0:
-    resolution: {integrity: sha512-tNEZYz5G/zYunxFm7sfhAxkXEuLj3K6BKwv6ZURlsF6yiUQ65z0Q2wZW9L5cPUl9ocofGvXOdFYbFHp0+6MOig==}
-    engines: {node: '>= 10.0.0'}
-    dev: false
-
-  /aggregate-error/3.1.0:
-    resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
-    engines: {node: '>=8'}
-    dependencies:
-      clean-stack: 2.2.0
-      indent-string: 4.0.0
-    dev: false
-
-  /ajv-formats/2.1.1:
-    resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==}
-    peerDependenciesMeta:
-      ajv:
-        optional: true
-    dependencies:
-      ajv: 8.11.0
-    dev: false
-
-  /ajv-keywords/3.5.2_ajv@6.12.6:
-    resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==}
-    peerDependencies:
-      ajv: ^6.9.1
-    dependencies:
-      ajv: 6.12.6
-    dev: false
-
-  /ajv-keywords/5.1.0_ajv@8.11.0:
-    resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==}
-    peerDependencies:
-      ajv: ^8.8.2
-    dependencies:
-      ajv: 8.11.0
-      fast-deep-equal: 3.1.3
-    dev: false
-
-  /ajv/6.12.6:
-    resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
-    dependencies:
-      fast-deep-equal: 3.1.3
-      fast-json-stable-stringify: 2.1.0
-      json-schema-traverse: 0.4.1
-      uri-js: 4.4.1
-
-  /ajv/8.11.0:
-    resolution: {integrity: sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==}
-    dependencies:
-      fast-deep-equal: 3.1.3
-      json-schema-traverse: 1.0.0
-      require-from-string: 2.0.2
-      uri-js: 4.4.1
-    dev: false
-
-  /algoliasearch-helper/3.10.0_algoliasearch@4.14.0:
-    resolution: {integrity: sha512-4E4od8qWWDMVvQ3jaRX6Oks/k35ywD011wAA4LbYMMjOtaZV6VWaTjRr4iN2bdaXP2o1BP7SLFMBf3wvnHmd8Q==}
-    peerDependencies:
-      algoliasearch: '>= 3.1 < 6'
-    dependencies:
-      '@algolia/events': 4.0.1
-      algoliasearch: 4.14.0
-    dev: false
-
-  /algoliasearch/4.14.0:
-    resolution: {integrity: sha512-r1rt5UQnrmqwjloi4tZzggUC7oWjNR/gfk+fjx0x4oP2UeDW5c8/XCovVFs9nwJ4n2xNKlxELyMAedcuLrBdng==}
-    dependencies:
-      '@algolia/cache-browser-local-storage': 4.14.0
-      '@algolia/cache-common': 4.14.0
-      '@algolia/cache-in-memory': 4.14.0
-      '@algolia/client-account': 4.14.0
-      '@algolia/client-analytics': 4.14.0
-      '@algolia/client-common': 4.14.0
-      '@algolia/client-personalization': 4.14.0
-      '@algolia/client-search': 4.14.0
-      '@algolia/logger-common': 4.14.0
-      '@algolia/logger-console': 4.14.0
-      '@algolia/requester-browser-xhr': 4.14.0
-      '@algolia/requester-common': 4.14.0
-      '@algolia/requester-node-http': 4.14.0
-      '@algolia/transporter': 4.14.0
-    dev: false
-
-  /ansi-align/3.0.1:
-    resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
-    dependencies:
-      string-width: 4.2.3
-    dev: false
-
-  /ansi-escapes/4.3.2:
-    resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
-    engines: {node: '>=8'}
-    dependencies:
-      type-fest: 0.21.3
-    dev: true
-
-  /ansi-html-community/0.0.8:
-    resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==}
-    engines: {'0': node >= 0.8.0}
-    hasBin: true
-    dev: false
-
-  /ansi-regex/5.0.1:
-    resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==}
-    engines: {node: '>=8'}
-
-  /ansi-regex/6.0.1:
-    resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==}
-    engines: {node: '>=12'}
-    dev: false
-
-  /ansi-styles/3.2.1:
-    resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
-    engines: {node: '>=4'}
-    dependencies:
-      color-convert: 1.9.3
-
-  /ansi-styles/4.3.0:
-    resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
-    engines: {node: '>=8'}
-    dependencies:
-      color-convert: 2.0.1
-
-  /ansi-styles/5.2.0:
-    resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
-    engines: {node: '>=10'}
-    dev: true
-
-  /ansi-styles/6.1.0:
-    resolution: {integrity: sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==}
-    engines: {node: '>=12'}
-    dev: false
-
-  /anymatch/3.1.2:
-    resolution: {integrity: sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==}
-    engines: {node: '>= 8'}
-    dependencies:
-      normalize-path: 3.0.0
-      picomatch: 2.3.1
-
-  /archive-type/4.0.0:
-    resolution: {integrity: sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==}
-    engines: {node: '>=4'}
-    dependencies:
-      file-type: 4.4.0
-    dev: true
-
-  /arg/5.0.2:
-    resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==}
-    dev: false
-
-  /argparse/1.0.10:
-    resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
-    dependencies:
-      sprintf-js: 1.0.3
-
-  /argparse/2.0.1:
-    resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
-
-  /aria-query/4.2.2:
-    resolution: {integrity: sha512-o/HelwhuKpTj/frsOsbNLNgnNGVIFsVP/SW2BSF14gVl7kAfMOJ6/8wUAUvG1R1NHKrfG+2sHZTu0yauT1qBrA==}
-    engines: {node: '>=6.0'}
-    dependencies:
-      '@babel/runtime': 7.18.9
-      '@babel/runtime-corejs3': 7.18.9
-    dev: true
-
-  /arr-diff/4.0.0:
-    resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /arr-flatten/1.1.0:
-    resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /arr-union/3.1.0:
-    resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /array-flatten/1.1.1:
-    resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
-    dev: false
-
-  /array-flatten/2.1.2:
-    resolution: {integrity: sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==}
-    dev: false
-
-  /array-includes/3.1.5:
-    resolution: {integrity: sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      define-properties: 1.1.4
-      es-abstract: 1.20.1
-      get-intrinsic: 1.1.2
-      is-string: 1.0.7
-    dev: true
-
-  /array-union/2.1.0:
-    resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
-    engines: {node: '>=8'}
-
-  /array-unique/0.3.2:
-    resolution: {integrity: sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /array.prototype.flat/1.3.0:
-    resolution: {integrity: sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      define-properties: 1.1.4
-      es-abstract: 1.20.1
-      es-shim-unscopables: 1.0.0
-    dev: true
-
-  /array.prototype.flatmap/1.3.0:
-    resolution: {integrity: sha512-PZC9/8TKAIxcWKdyeb77EzULHPrIX/tIZebLJUQOMR1OwYosT8yggdfWScfTBCDj5utONvOuPQQumYsU2ULbkg==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      define-properties: 1.1.4
-      es-abstract: 1.20.1
-      es-shim-unscopables: 1.0.0
-    dev: true
-
-  /asap/2.0.6:
-    resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==}
-    dev: false
-
-  /assign-symbols/1.0.0:
-    resolution: {integrity: sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /ast-types-flow/0.0.7:
-    resolution: {integrity: sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==}
-    dev: true
-
-  /astring/1.8.3:
-    resolution: {integrity: sha512-sRpyiNrx2dEYIMmUXprS8nlpRg2Drs8m9ElX9vVEXaCB4XEAJhKfs7IcX0IwShjuOAjLR6wzIrgoptz1n19i1A==}
-    hasBin: true
-    dev: true
-
-  /asynckit/0.4.0:
-    resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
-    dev: true
-
-  /at-least-node/1.0.0:
-    resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
-    engines: {node: '>= 4.0.0'}
-    dev: false
-
-  /atob/2.1.2:
-    resolution: {integrity: sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==}
-    engines: {node: '>= 4.5.0'}
-    hasBin: true
-    dev: true
-
-  /autoprefixer/10.4.7_postcss@8.4.14:
-    resolution: {integrity: sha512-ypHju4Y2Oav95SipEcCcI5J7CGPuvz8oat7sUtYj3ClK44bldfvtvcxK6IEK++7rqB7YchDGzweZIBG+SD0ZAA==}
-    engines: {node: ^10 || ^12 || >=14}
-    hasBin: true
-    peerDependencies:
-      postcss: ^8.1.0
-    dependencies:
-      browserslist: 4.21.2
-      caniuse-lite: 1.0.30001367
-      fraction.js: 4.2.0
-      normalize-range: 0.1.2
-      picocolors: 1.0.0
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /awesome-typescript-loader/3.5.0_typescript@4.8.4:
-    resolution: {integrity: sha512-qzgm9SEvodVkSi9QY7Me1/rujg+YBNMjayNSAyzNghwTEez++gXoPCwMvpbHRG7wrOkDCiF6dquvv9ESmUBAuw==}
-    peerDependencies:
-      typescript: ^2
-    dependencies:
-      chalk: 2.4.2
-      enhanced-resolve: 3.3.0
-      loader-utils: 1.4.2
-      lodash: 4.17.21
-      micromatch: 3.1.10
-      mkdirp: 0.5.6
-      source-map-support: 0.5.21
-      typescript: 4.8.4
-    dev: true
-
-  /axe-core/4.4.3:
-    resolution: {integrity: sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /axios/0.25.0:
-    resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==}
-    dependencies:
-      follow-redirects: 1.15.1
-    transitivePeerDependencies:
-      - debug
-    dev: false
-
-  /axobject-query/2.2.0:
-    resolution: {integrity: sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==}
-    dev: true
-
-  /babel-jest/29.3.1_@babel+core@7.20.2:
-    resolution: {integrity: sha512-aard+xnMoxgjwV70t0L6wkW/3HQQtV+O0PEimxKgzNqCJnbYmroPojdP2tqKSOAt8QAKV/uSZU8851M7B5+fcA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    peerDependencies:
-      '@babel/core': ^7.8.0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@jest/transform': 29.3.1
-      '@types/babel__core': 7.1.19
-      babel-plugin-istanbul: 6.1.1
-      babel-preset-jest: 29.2.0_@babel+core@7.20.2
-      chalk: 4.1.2
-      graceful-fs: 4.2.10
-      slash: 3.0.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /babel-loader/8.2.5_sqoqrlbh4fciq6urcohea2fb5a:
-    resolution: {integrity: sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==}
-    engines: {node: '>= 8.9'}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-      webpack: '>=2'
-    dependencies:
-      '@babel/core': 7.18.9
-      find-cache-dir: 3.3.2
-      loader-utils: 2.0.2
-      make-dir: 3.1.0
-      schema-utils: 2.7.1
-      webpack: 5.73.0
-    dev: false
-
-  /babel-plugin-apply-mdx-type-prop/1.6.22_@babel+core@7.12.9:
-    resolution: {integrity: sha512-VefL+8o+F/DfK24lPZMtJctrCVOfgbqLAGZSkxwhazQv4VxPg3Za/i40fu22KR2m8eEda+IfSOlPLUSIiLcnCQ==}
-    peerDependencies:
-      '@babel/core': ^7.11.6
-    dependencies:
-      '@babel/core': 7.12.9
-      '@babel/helper-plugin-utils': 7.10.4
-      '@mdx-js/util': 1.6.22
-    dev: false
-
-  /babel-plugin-dynamic-import-node/2.3.3:
-    resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==}
-    dependencies:
-      object.assign: 4.1.2
-    dev: false
-
-  /babel-plugin-extract-import-names/1.6.22:
-    resolution: {integrity: sha512-yJ9BsJaISua7d8zNT7oRG1ZLBJCIdZ4PZqmH8qa9N5AK01ifk3fnkc98AXhtzE7UkfCsEumvoQWgoYLhOnJ7jQ==}
-    dependencies:
-      '@babel/helper-plugin-utils': 7.10.4
-    dev: false
-
-  /babel-plugin-istanbul/6.1.1:
-    resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
-    engines: {node: '>=8'}
-    dependencies:
-      '@babel/helper-plugin-utils': 7.20.2
-      '@istanbuljs/load-nyc-config': 1.1.0
-      '@istanbuljs/schema': 0.1.3
-      istanbul-lib-instrument: 5.2.0
-      test-exclude: 6.0.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /babel-plugin-jest-hoist/29.2.0:
-    resolution: {integrity: sha512-TnspP2WNiR3GLfCsUNHqeXw0RoQ2f9U5hQ5L3XFpwuO8htQmSrhh8qsB6vi5Yi8+kuynN1yjDjQsPfkebmB6ZA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@babel/template': 7.18.10
-      '@babel/types': 7.20.2
-      '@types/babel__core': 7.1.19
-      '@types/babel__traverse': 7.17.1
-    dev: true
-
-  /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.18.9:
-    resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/compat-data': 7.20.1
-      '@babel/core': 7.18.9
-      '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.18.9
-      semver: 6.3.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /babel-plugin-polyfill-corejs2/0.3.3_@babel+core@7.20.2:
-    resolution: {integrity: sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/compat-data': 7.20.1
-      '@babel/core': 7.20.2
-      '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.2
-      semver: 6.3.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /babel-plugin-polyfill-corejs3/0.5.2_@babel+core@7.18.9:
-    resolution: {integrity: sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.18.9
-      core-js-compat: 3.26.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /babel-plugin-polyfill-corejs3/0.6.0_@babel+core@7.20.2:
-    resolution: {integrity: sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.2
-      core-js-compat: 3.26.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /babel-plugin-polyfill-regenerator/0.3.1_@babel+core@7.18.9:
-    resolution: {integrity: sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.18.9
-      '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.18.9
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /babel-plugin-polyfill-regenerator/0.4.1_@babel+core@7.20.2:
-    resolution: {integrity: sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==}
-    peerDependencies:
-      '@babel/core': ^7.0.0-0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/helper-define-polyfill-provider': 0.3.3_@babel+core@7.20.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /babel-preset-current-node-syntax/1.0.1_@babel+core@7.20.2:
-    resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.20.2
-      '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.20.2
-      '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.20.2
-      '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.20.2
-      '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.20.2
-      '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.20.2
-      '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.20.2
-      '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.20.2
-      '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.20.2
-      '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.20.2
-      '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.20.2
-      '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.20.2
-    dev: true
-
-  /babel-preset-jest/29.2.0_@babel+core@7.20.2:
-    resolution: {integrity: sha512-z9JmMJppMxNv8N7fNRHvhMg9cvIkMxQBXgFkane3yKVEvEOP+kB50lk8DFRvF9PGqbyXxlmebKWhuDORO8RgdA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    peerDependencies:
-      '@babel/core': ^7.0.0
-    dependencies:
-      '@babel/core': 7.20.2
-      babel-plugin-jest-hoist: 29.2.0
-      babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.2
-    dev: true
-
-  /bail/1.0.5:
-    resolution: {integrity: sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==}
-    dev: false
-
-  /bail/2.0.2:
-    resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==}
-    dev: true
-
-  /balanced-match/1.0.2:
-    resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
-
-  /base/0.11.2:
-    resolution: {integrity: sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      cache-base: 1.0.1
-      class-utils: 0.3.6
-      component-emitter: 1.3.0
-      define-property: 1.0.0
-      isobject: 3.0.1
-      mixin-deep: 1.3.2
-      pascalcase: 0.1.1
-    dev: true
-
-  /base16/1.0.0:
-    resolution: {integrity: sha512-pNdYkNPiJUnEhnfXV56+sQy8+AaPcG3POZAUnwr4EeqCUZFz4u2PePbo3e5Gj4ziYPCWGUZT9RHisvJKnwFuBQ==}
-    dev: false
-
-  /base64-js/1.5.1:
-    resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
-    dev: true
-
-  /batch/0.6.1:
-    resolution: {integrity: sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=}
-    dev: false
-
-  /big.js/5.2.2:
-    resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==}
-
-  /binary-extensions/2.2.0:
-    resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==}
-    engines: {node: '>=8'}
-    dev: false
-
-  /bl/1.2.3:
-    resolution: {integrity: sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==}
-    dependencies:
-      readable-stream: 2.3.7
-      safe-buffer: 5.2.1
-    dev: true
-
-  /body-parser/1.20.0:
-    resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==}
-    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
-    dependencies:
-      bytes: 3.1.2
-      content-type: 1.0.4
-      debug: 2.6.9
-      depd: 2.0.0
-      destroy: 1.2.0
-      http-errors: 2.0.0
-      iconv-lite: 0.4.24
-      on-finished: 2.4.1
-      qs: 6.10.3
-      raw-body: 2.5.1
-      type-is: 1.6.18
-      unpipe: 1.0.0
-    dev: false
-
-  /bonjour-service/1.0.13:
-    resolution: {integrity: sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==}
-    dependencies:
-      array-flatten: 2.1.2
-      dns-equal: 1.0.0
-      fast-deep-equal: 3.1.3
-      multicast-dns: 7.2.5
-    dev: false
-
-  /boolbase/1.0.0:
-    resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==}
-    dev: false
-
-  /boxen/5.1.2:
-    resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==}
-    engines: {node: '>=10'}
-    dependencies:
-      ansi-align: 3.0.1
-      camelcase: 6.3.0
-      chalk: 4.1.2
-      cli-boxes: 2.2.1
-      string-width: 4.2.3
-      type-fest: 0.20.2
-      widest-line: 3.1.0
-      wrap-ansi: 7.0.0
-    dev: false
-
-  /boxen/6.2.1:
-    resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==}
-    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-    dependencies:
-      ansi-align: 3.0.1
-      camelcase: 6.3.0
-      chalk: 4.1.2
-      cli-boxes: 3.0.0
-      string-width: 5.1.2
-      type-fest: 2.16.0
-      widest-line: 4.0.1
-      wrap-ansi: 8.0.1
-    dev: false
-
-  /brace-expansion/1.1.11:
-    resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
-    dependencies:
-      balanced-match: 1.0.2
-      concat-map: 0.0.1
-
-  /braces/2.3.2:
-    resolution: {integrity: sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      arr-flatten: 1.1.0
-      array-unique: 0.3.2
-      extend-shallow: 2.0.1
-      fill-range: 4.0.0
-      isobject: 3.0.1
-      repeat-element: 1.1.4
-      snapdragon: 0.8.2
-      snapdragon-node: 2.1.1
-      split-string: 3.1.0
-      to-regex: 3.0.2
-    dev: true
-
-  /braces/3.0.2:
-    resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
-    engines: {node: '>=8'}
-    dependencies:
-      fill-range: 7.0.1
-
-  /browserslist/4.21.2:
-    resolution: {integrity: sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA==}
-    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
-    hasBin: true
-    dependencies:
-      caniuse-lite: 1.0.30001367
-      electron-to-chromium: 1.4.194
-      node-releases: 2.0.6
-      update-browserslist-db: 1.0.5_browserslist@4.21.2
-    dev: false
-
-  /browserslist/4.21.4:
-    resolution: {integrity: sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==}
-    engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
-    hasBin: true
-    dependencies:
-      caniuse-lite: 1.0.30001431
-      electron-to-chromium: 1.4.284
-      node-releases: 2.0.6
-      update-browserslist-db: 1.0.10_browserslist@4.21.4
-
-  /bs-logger/0.2.6:
-    resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==}
-    engines: {node: '>= 6'}
-    dependencies:
-      fast-json-stable-stringify: 2.1.0
-    dev: true
-
-  /bser/2.1.1:
-    resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
-    dependencies:
-      node-int64: 0.4.0
-    dev: true
-
-  /buffer-alloc-unsafe/1.1.0:
-    resolution: {integrity: sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==}
-    dev: true
-
-  /buffer-alloc/1.2.0:
-    resolution: {integrity: sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==}
-    dependencies:
-      buffer-alloc-unsafe: 1.1.0
-      buffer-fill: 1.0.0
-    dev: true
-
-  /buffer-crc32/0.2.13:
-    resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==}
-    dev: true
-
-  /buffer-fill/1.0.0:
-    resolution: {integrity: sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==}
-    dev: true
-
-  /buffer-from/1.1.2:
-    resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
-
-  /buffer/5.7.1:
-    resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
-    dependencies:
-      base64-js: 1.5.1
-      ieee754: 1.2.1
-    dev: true
-
-  /bytes/3.0.0:
-    resolution: {integrity: sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=}
-    engines: {node: '>= 0.8'}
-    dev: false
-
-  /bytes/3.1.2:
-    resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==}
-    engines: {node: '>= 0.8'}
-    dev: false
-
-  /cache-base/1.0.1:
-    resolution: {integrity: sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      collection-visit: 1.0.0
-      component-emitter: 1.3.0
-      get-value: 2.0.6
-      has-value: 1.0.0
-      isobject: 3.0.1
-      set-value: 2.0.1
-      to-object-path: 0.3.0
-      union-value: 1.0.1
-      unset-value: 1.0.0
-    dev: true
-
-  /cacheable-request/2.1.4:
-    resolution: {integrity: sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==}
-    dependencies:
-      clone-response: 1.0.2
-      get-stream: 3.0.0
-      http-cache-semantics: 3.8.1
-      keyv: 3.0.0
-      lowercase-keys: 1.0.0
-      normalize-url: 2.0.1
-      responselike: 1.0.2
-    dev: true
-
-  /cacheable-request/6.1.0:
-    resolution: {integrity: sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==}
-    engines: {node: '>=8'}
-    dependencies:
-      clone-response: 1.0.3
-      get-stream: 5.2.0
-      http-cache-semantics: 4.1.0
-      keyv: 3.1.0
-      lowercase-keys: 2.0.0
-      normalize-url: 4.5.1
-      responselike: 1.0.2
-    dev: false
-
-  /call-bind/1.0.2:
-    resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==}
-    dependencies:
-      function-bind: 1.1.1
-      get-intrinsic: 1.1.2
-
-  /callsites/3.1.0:
-    resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
-    engines: {node: '>=6'}
-
-  /camel-case/4.1.2:
-    resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==}
-    dependencies:
-      pascal-case: 3.1.2
-      tslib: 2.4.1
-    dev: false
-
-  /camelcase-css/2.0.1:
-    resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
-    engines: {node: '>= 6'}
-    dev: false
-
-  /camelcase/5.3.1:
-    resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
-    engines: {node: '>=6'}
-    dev: true
-
-  /camelcase/6.3.0:
-    resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
-    engines: {node: '>=10'}
-
-  /caniuse-api/3.0.0:
-    resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==}
-    dependencies:
-      browserslist: 4.21.4
-      caniuse-lite: 1.0.30001431
-      lodash.memoize: 4.1.2
-      lodash.uniq: 4.5.0
-    dev: false
-
-  /caniuse-lite/1.0.30001367:
-    resolution: {integrity: sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw==}
-    dev: false
-
-  /caniuse-lite/1.0.30001431:
-    resolution: {integrity: sha512-zBUoFU0ZcxpvSt9IU66dXVT/3ctO1cy4y9cscs1szkPlcWb6pasYM144GqrUygUbT+k7cmUCW61cvskjcv0enQ==}
-
-  /ccount/1.1.0:
-    resolution: {integrity: sha512-vlNK021QdI7PNeiUh/lKkC/mNHHfV0m/Ad5JoI0TYtlBnJAslM/JIkm/tGC88bkLIwO6OQ5uV6ztS6kVAtCDlg==}
-    dev: false
-
-  /ccount/2.0.1:
-    resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
-    dev: true
-
-  /chalk/2.4.2:
-    resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
-    engines: {node: '>=4'}
-    dependencies:
-      ansi-styles: 3.2.1
-      escape-string-regexp: 1.0.5
-      supports-color: 5.5.0
-
-  /chalk/4.1.2:
-    resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
-    engines: {node: '>=10'}
-    dependencies:
-      ansi-styles: 4.3.0
-      supports-color: 7.2.0
-
-  /char-regex/1.0.2:
-    resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
-    engines: {node: '>=10'}
-    dev: true
-
-  /character-entities-html4/2.1.0:
-    resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==}
-    dev: true
-
-  /character-entities-legacy/1.1.4:
-    resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==}
-    dev: false
-
-  /character-entities-legacy/3.0.0:
-    resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==}
-    dev: true
-
-  /character-entities/1.2.4:
-    resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==}
-    dev: false
-
-  /character-entities/2.0.2:
-    resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==}
-    dev: true
-
-  /character-reference-invalid/1.1.4:
-    resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==}
-    dev: false
-
-  /character-reference-invalid/2.0.1:
-    resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==}
-    dev: true
-
-  /cheerio-select/2.1.0:
-    resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==}
-    dependencies:
-      boolbase: 1.0.0
-      css-select: 5.1.0
-      css-what: 6.1.0
-      domelementtype: 2.3.0
-      domhandler: 5.0.3
-      domutils: 3.0.1
-    dev: false
-
-  /cheerio/1.0.0-rc.12:
-    resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==}
-    engines: {node: '>= 6'}
-    dependencies:
-      cheerio-select: 2.1.0
-      dom-serializer: 2.0.0
-      domhandler: 5.0.3
-      domutils: 3.0.1
-      htmlparser2: 8.0.1
-      parse5: 7.0.0
-      parse5-htmlparser2-tree-adapter: 7.0.0
-    dev: false
-
-  /chokidar/3.5.3:
-    resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
-    engines: {node: '>= 8.10.0'}
-    dependencies:
-      anymatch: 3.1.2
-      braces: 3.0.2
-      glob-parent: 5.1.2
-      is-binary-path: 2.1.0
-      is-glob: 4.0.3
-      normalize-path: 3.0.0
-      readdirp: 3.6.0
-    optionalDependencies:
-      fsevents: 2.3.2
-    dev: false
-
-  /chrome-trace-event/1.0.3:
-    resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==}
-    engines: {node: '>=6.0'}
-    dev: false
-
-  /ci-info/2.0.0:
-    resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==}
-    dev: false
-
-  /ci-info/3.3.2:
-    resolution: {integrity: sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==}
-    dev: true
-
-  /cjs-module-lexer/1.2.2:
-    resolution: {integrity: sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==}
-    dev: true
-
-  /class-utils/0.3.6:
-    resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      arr-union: 3.1.0
-      define-property: 0.2.5
-      isobject: 3.0.1
-      static-extend: 0.1.2
-    dev: true
-
-  /clean-css/5.3.1:
-    resolution: {integrity: sha512-lCr8OHhiWCTw4v8POJovCoh4T7I9U11yVsPjMWWnnMmp9ZowCxyad1Pathle/9HjaDp+fdQKjO9fQydE6RHTZg==}
-    engines: {node: '>= 10.0'}
-    dependencies:
-      source-map: 0.6.1
-    dev: false
-
-  /clean-stack/2.2.0:
-    resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==}
-    engines: {node: '>=6'}
-    dev: false
-
-  /cli-boxes/2.2.1:
-    resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==}
-    engines: {node: '>=6'}
-    dev: false
-
-  /cli-boxes/3.0.0:
-    resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
-    engines: {node: '>=10'}
-    dev: false
-
-  /cli-table3/0.6.2:
-    resolution: {integrity: sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==}
-    engines: {node: 10.* || >= 12.*}
-    dependencies:
-      string-width: 4.2.3
-    optionalDependencies:
-      '@colors/colors': 1.5.0
-    dev: false
-
-  /client-only/0.0.1:
-    resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==}
-    dev: false
-
-  /cliui/7.0.4:
-    resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==}
-    dependencies:
-      string-width: 4.2.3
-      strip-ansi: 6.0.1
-      wrap-ansi: 7.0.0
-    dev: true
-
-  /clone-deep/4.0.1:
-    resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==}
-    engines: {node: '>=6'}
-    dependencies:
-      is-plain-object: 2.0.4
-      kind-of: 6.0.3
-      shallow-clone: 3.0.1
-    dev: false
-
-  /clone-response/1.0.2:
-    resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==}
-    dependencies:
-      mimic-response: 1.0.1
-    dev: true
-
-  /clone-response/1.0.3:
-    resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==}
-    dependencies:
-      mimic-response: 1.0.1
-    dev: false
-
-  /clsx/1.2.1:
-    resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==}
-    engines: {node: '>=6'}
-    dev: false
-
-  /co/4.6.0:
-    resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
-    engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
-    dev: true
-
-  /collapse-white-space/1.0.6:
-    resolution: {integrity: sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==}
-    dev: false
-
-  /collect-v8-coverage/1.0.1:
-    resolution: {integrity: sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==}
-    dev: true
-
-  /collection-visit/1.0.0:
-    resolution: {integrity: sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      map-visit: 1.0.0
-      object-visit: 1.0.1
-    dev: true
-
-  /color-convert/1.9.3:
-    resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
-    dependencies:
-      color-name: 1.1.3
-
-  /color-convert/2.0.1:
-    resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
-    engines: {node: '>=7.0.0'}
-    dependencies:
-      color-name: 1.1.4
-
-  /color-name/1.1.3:
-    resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
-
-  /color-name/1.1.4:
-    resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
-
-  /colord/2.9.2:
-    resolution: {integrity: sha512-Uqbg+J445nc1TKn4FoDPS6ZZqAvEDnwrH42yo8B40JSOgSLxMZ/gt3h4nmCtPLQeXhjJJkqBx7SCY35WnIixaQ==}
-    dev: false
-
-  /colorette/2.0.19:
-    resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==}
-    dev: false
-
-  /combine-promises/1.1.0:
-    resolution: {integrity: sha512-ZI9jvcLDxqwaXEixOhArm3r7ReIivsXkpbyEWyeOhzz1QS0iSgBPnWvEqvIQtYyamGCYA88gFhmUrs9hrrQ0pg==}
-    engines: {node: '>=10'}
-    dev: false
-
-  /combined-stream/1.0.8:
-    resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==}
-    engines: {node: '>= 0.8'}
-    dependencies:
-      delayed-stream: 1.0.0
-    dev: true
-
-  /comma-separated-tokens/1.0.8:
-    resolution: {integrity: sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==}
-    dev: false
-
-  /comma-separated-tokens/2.0.2:
-    resolution: {integrity: sha512-G5yTt3KQN4Yn7Yk4ed73hlZ1evrFKXeUW3086p3PRFNp7m2vIjI6Pg+Kgb+oyzhd9F2qdcoj67+y3SdxL5XWsg==}
-    dev: true
-
-  /commander/2.20.3:
-    resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==}
-
-  /commander/5.1.0:
-    resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==}
-    engines: {node: '>= 6'}
-    dev: false
-
-  /commander/7.2.0:
-    resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==}
-    engines: {node: '>= 10'}
-    dev: false
-
-  /commander/8.3.0:
-    resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
-    engines: {node: '>= 12'}
-    dev: false
-
-  /commondir/1.0.1:
-    resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==}
-    dev: false
-
-  /component-emitter/1.3.0:
-    resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==}
-    dev: true
-
-  /compressible/2.0.18:
-    resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==}
-    engines: {node: '>= 0.6'}
-    dependencies:
-      mime-db: 1.52.0
-    dev: false
-
-  /compression/1.7.4:
-    resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==}
-    engines: {node: '>= 0.8.0'}
-    dependencies:
-      accepts: 1.3.8
-      bytes: 3.0.0
-      compressible: 2.0.18
-      debug: 2.6.9
-      on-headers: 1.0.2
-      safe-buffer: 5.1.2
-      vary: 1.1.2
-    dev: false
-
-  /concat-map/0.0.1:
-    resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=}
-
-  /configstore/5.0.1:
-    resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==}
-    engines: {node: '>=8'}
-    dependencies:
-      dot-prop: 5.3.0
-      graceful-fs: 4.2.10
-      make-dir: 3.1.0
-      unique-string: 2.0.0
-      write-file-atomic: 3.0.3
-      xdg-basedir: 4.0.0
-    dev: false
-
-  /connect-history-api-fallback/2.0.0:
-    resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==}
-    engines: {node: '>=0.8'}
-    dev: false
-
-  /consola/2.15.3:
-    resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==}
-    dev: false
-
-  /content-disposition/0.5.2:
-    resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==}
-    engines: {node: '>= 0.6'}
-    dev: false
-
-  /content-disposition/0.5.4:
-    resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==}
-    engines: {node: '>= 0.6'}
-    dependencies:
-      safe-buffer: 5.2.1
-
-  /content-type/1.0.4:
-    resolution: {integrity: sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==}
-    engines: {node: '>= 0.6'}
-    dev: false
-
-  /convert-source-map/1.8.0:
-    resolution: {integrity: sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==}
-    dependencies:
-      safe-buffer: 5.1.2
-
-  /convert-source-map/2.0.0:
-    resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
-    dev: true
-
-  /cookie-signature/1.0.6:
-    resolution: {integrity: sha1-4wOogrNCzD7oylE6eZmXNNqzriw=}
-    dev: false
-
-  /cookie/0.5.0:
-    resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==}
-    engines: {node: '>= 0.6'}
-    dev: false
-
-  /copy-descriptor/0.1.1:
-    resolution: {integrity: sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /copy-text-to-clipboard/3.0.1:
-    resolution: {integrity: sha512-rvVsHrpFcL4F2P8ihsoLdFHmd404+CMg71S756oRSeQgqk51U3kicGdnvfkrxva0xXH92SjGS62B0XIJsbh+9Q==}
-    engines: {node: '>=12'}
-    dev: false
-
-  /copy-webpack-plugin/11.0.0_webpack@5.73.0:
-    resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==}
-    engines: {node: '>= 14.15.0'}
-    peerDependencies:
-      webpack: ^5.1.0
-    dependencies:
-      fast-glob: 3.2.11
-      glob-parent: 6.0.2
-      globby: 13.1.2
-      normalize-path: 3.0.0
-      schema-utils: 4.0.0
-      serialize-javascript: 6.0.0
-      webpack: 5.73.0
-    dev: false
-
-  /core-js-compat/3.26.0:
-    resolution: {integrity: sha512-piOX9Go+Z4f9ZiBFLnZ5VrOpBl0h7IGCkiFUN11QTe6LjAvOT3ifL/5TdoizMh99hcGy5SoLyWbapIY/PIb/3A==}
-    dependencies:
-      browserslist: 4.21.4
-    dev: false
-
-  /core-js-pure/3.23.5:
-    resolution: {integrity: sha512-8t78LdpKSuCq4pJYCYk8hl7XEkAX+BP16yRIwL3AanTksxuEf7CM83vRyctmiEL8NDZ3jpUcv56fk9/zG3aIuw==}
-    requiresBuild: true
-
-  /core-js/3.23.5:
-    resolution: {integrity: sha512-7Vh11tujtAZy82da4duVreQysIoO2EvVrur7y6IzZkH1IHPSekuDi8Vuw1+YKjkbfWLRD7Nc9ICQ/sIUDutcyg==}
-    requiresBuild: true
-    dev: false
-
-  /core-util-is/1.0.3:
-    resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
-
-  /cosmiconfig/6.0.0:
-    resolution: {integrity: sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==}
-    engines: {node: '>=8'}
-    dependencies:
-      '@types/parse-json': 4.0.0
-      import-fresh: 3.3.0
-      parse-json: 5.2.0
-      path-type: 4.0.0
-      yaml: 1.10.2
-    dev: false
-
-  /cosmiconfig/7.0.1:
-    resolution: {integrity: sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==}
-    engines: {node: '>=10'}
-    dependencies:
-      '@types/parse-json': 4.0.0
-      import-fresh: 3.3.0
-      parse-json: 5.2.0
-      path-type: 4.0.0
-      yaml: 1.10.2
-    dev: false
-
-  /cross-env/7.0.3:
-    resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==}
-    engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'}
-    hasBin: true
-    dependencies:
-      cross-spawn: 7.0.3
-    dev: true
-
-  /cross-fetch/3.1.5:
-    resolution: {integrity: sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==}
-    dependencies:
-      node-fetch: 2.6.7
-    transitivePeerDependencies:
-      - encoding
-    dev: false
-
-  /cross-spawn/7.0.3:
-    resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
-    engines: {node: '>= 8'}
-    dependencies:
-      path-key: 3.1.1
-      shebang-command: 2.0.0
-      which: 2.0.2
-
-  /crypto-random-string/2.0.0:
-    resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==}
-    engines: {node: '>=8'}
-    dev: false
-
-  /css-declaration-sorter/6.3.0_postcss@8.4.14:
-    resolution: {integrity: sha512-OGT677UGHJTAVMRhPO+HJ4oKln3wkBTwtDFH0ojbqm+MJm6xuDMHp2nkhh/ThaBqq20IbraBQSWKfSLNHQO9Og==}
-    engines: {node: ^10 || ^12 || >=14}
-    peerDependencies:
-      postcss: ^8.0.9
-    dependencies:
-      postcss: 8.4.14
-    dev: false
-
-  /css-loader/6.7.1_webpack@5.73.0:
-    resolution: {integrity: sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==}
-    engines: {node: '>= 12.13.0'}
-    peerDependencies:
-      webpack: ^5.0.0
-    dependencies:
-      icss-utils: 5.1.0_postcss@8.4.14
-      postcss: 8.4.14
-      postcss-modules-extract-imports: 3.0.0_postcss@8.4.14
-      postcss-modules-local-by-default: 4.0.0_postcss@8.4.14
-      postcss-modules-scope: 3.0.0_postcss@8.4.14
-      postcss-modules-values: 4.0.0_postcss@8.4.14
-      postcss-value-parser: 4.2.0
-      semver: 7.3.7
-      webpack: 5.73.0
-    dev: false
-
-  /css-minimizer-webpack-plugin/4.0.0_554fporn47vuq37dog2mjop3eu:
-    resolution: {integrity: sha512-7ZXXRzRHvofv3Uac5Y+RkWRNo0ZMlcg8e9/OtrqUYmwDWJo+qs67GvdeFrXLsFb7czKNwjQhPkM0avlIYl+1nA==}
-    engines: {node: '>= 14.15.0'}
-    peerDependencies:
-      '@parcel/css': '*'
-      clean-css: '*'
-      csso: '*'
-      esbuild: '*'
-      webpack: ^5.0.0
-    peerDependenciesMeta:
-      '@parcel/css':
-        optional: true
-      clean-css:
-        optional: true
-      csso:
-        optional: true
-      esbuild:
-        optional: true
-    dependencies:
-      clean-css: 5.3.1
-      cssnano: 5.1.12_postcss@8.4.14
-      jest-worker: 27.5.1
-      postcss: 8.4.14
-      schema-utils: 4.0.0
-      serialize-javascript: 6.0.0
-      source-map: 0.6.1
-      webpack: 5.73.0
-    dev: false
-
-  /css-select/4.3.0:
-    resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==}
-    dependencies:
-      boolbase: 1.0.0
-      css-what: 6.1.0
-      domhandler: 4.3.1
-      domutils: 2.8.0
-      nth-check: 2.1.1
-    dev: false
-
-  /css-select/5.1.0:
-    resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==}
-    dependencies:
-      boolbase: 1.0.0
-      css-what: 6.1.0
-      domhandler: 5.0.3
-      domutils: 3.0.1
-      nth-check: 2.1.1
-    dev: false
-
-  /css-tree/1.1.3:
-    resolution: {integrity: sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==}
-    engines: {node: '>=8.0.0'}
-    dependencies:
-      mdn-data: 2.0.14
-      source-map: 0.6.1
-    dev: false
-
-  /css-what/6.1.0:
-    resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==}
-    engines: {node: '>= 6'}
-    dev: false
-
-  /cssesc/3.0.0:
-    resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
-    engines: {node: '>=4'}
-    hasBin: true
-    dev: false
-
-  /cssnano-preset-advanced/5.3.8_postcss@8.4.14:
-    resolution: {integrity: sha512-xUlLLnEB1LjpEik+zgRNlk8Y/koBPPtONZjp7JKbXigeAmCrFvq9H0pXW5jJV45bQWAlmJ0sKy+IMr0XxLYQZg==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      autoprefixer: 10.4.7_postcss@8.4.14
-      cssnano-preset-default: 5.2.12_postcss@8.4.14
-      postcss: 8.4.14
-      postcss-discard-unused: 5.1.0_postcss@8.4.14
-      postcss-merge-idents: 5.1.1_postcss@8.4.14
-      postcss-reduce-idents: 5.2.0_postcss@8.4.14
-      postcss-zindex: 5.1.0_postcss@8.4.14
-    dev: false
-
-  /cssnano-preset-default/5.2.12_postcss@8.4.14:
-    resolution: {integrity: sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      css-declaration-sorter: 6.3.0_postcss@8.4.14
-      cssnano-utils: 3.1.0_postcss@8.4.14
-      postcss: 8.4.14
-      postcss-calc: 8.2.4_postcss@8.4.14
-      postcss-colormin: 5.3.0_postcss@8.4.14
-      postcss-convert-values: 5.1.2_postcss@8.4.14
-      postcss-discard-comments: 5.1.2_postcss@8.4.14
-      postcss-discard-duplicates: 5.1.0_postcss@8.4.14
-      postcss-discard-empty: 5.1.1_postcss@8.4.14
-      postcss-discard-overridden: 5.1.0_postcss@8.4.14
-      postcss-merge-longhand: 5.1.6_postcss@8.4.14
-      postcss-merge-rules: 5.1.2_postcss@8.4.14
-      postcss-minify-font-values: 5.1.0_postcss@8.4.14
-      postcss-minify-gradients: 5.1.1_postcss@8.4.14
-      postcss-minify-params: 5.1.3_postcss@8.4.14
-      postcss-minify-selectors: 5.2.1_postcss@8.4.14
-      postcss-normalize-charset: 5.1.0_postcss@8.4.14
-      postcss-normalize-display-values: 5.1.0_postcss@8.4.14
-      postcss-normalize-positions: 5.1.1_postcss@8.4.14
-      postcss-normalize-repeat-style: 5.1.1_postcss@8.4.14
-      postcss-normalize-string: 5.1.0_postcss@8.4.14
-      postcss-normalize-timing-functions: 5.1.0_postcss@8.4.14
-      postcss-normalize-unicode: 5.1.0_postcss@8.4.14
-      postcss-normalize-url: 5.1.0_postcss@8.4.14
-      postcss-normalize-whitespace: 5.1.1_postcss@8.4.14
-      postcss-ordered-values: 5.1.3_postcss@8.4.14
-      postcss-reduce-initial: 5.1.0_postcss@8.4.14
-      postcss-reduce-transforms: 5.1.0_postcss@8.4.14
-      postcss-svgo: 5.1.0_postcss@8.4.14
-      postcss-unique-selectors: 5.1.1_postcss@8.4.14
-    dev: false
-
-  /cssnano-utils/3.1.0_postcss@8.4.14:
-    resolution: {integrity: sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-    dev: false
-
-  /cssnano/5.1.12_postcss@8.4.14:
-    resolution: {integrity: sha512-TgvArbEZu0lk/dvg2ja+B7kYoD7BBCmn3+k58xD0qjrGHsFzXY/wKTo9M5egcUCabPol05e/PVoIu79s2JN4WQ==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      cssnano-preset-default: 5.2.12_postcss@8.4.14
-      lilconfig: 2.0.6
-      postcss: 8.4.14
-      yaml: 1.10.2
-    dev: false
-
-  /csso/4.2.0:
-    resolution: {integrity: sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==}
-    engines: {node: '>=8.0.0'}
-    dependencies:
-      css-tree: 1.1.3
-    dev: false
-
-  /csstype/3.1.0:
-    resolution: {integrity: sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==}
-
-  /damerau-levenshtein/1.0.8:
-    resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
-    dev: true
-
-  /data-uri-to-buffer/4.0.0:
-    resolution: {integrity: sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA==}
-    engines: {node: '>= 12'}
-    dev: true
-
-  /debug/2.6.9:
-    resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==}
-    dependencies:
-      ms: 2.0.0
-
-  /debug/3.2.7:
-    resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
-    dependencies:
-      ms: 2.1.3
-    dev: true
-
-  /debug/4.3.4:
-    resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
-    engines: {node: '>=6.0'}
-    peerDependencies:
-      supports-color: '*'
-    peerDependenciesMeta:
-      supports-color:
-        optional: true
-    dependencies:
-      ms: 2.1.2
-
-  /decode-named-character-reference/1.0.2:
-    resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
-    dependencies:
-      character-entities: 2.0.2
-    dev: true
-
-  /decode-uri-component/0.2.0:
-    resolution: {integrity: sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==}
-    engines: {node: '>=0.10'}
-    dev: true
-
-  /decompress-response/3.3.0:
-    resolution: {integrity: sha512-BzRPQuY1ip+qDonAOz42gRm/pg9F768C+npV/4JOsxRC2sq+Rlk+Q4ZCAsOhnIaMrgarILY+RMUIvMmmX1qAEA==}
-    engines: {node: '>=4'}
-    dependencies:
-      mimic-response: 1.0.1
-
-  /decompress-tar/4.1.1:
-    resolution: {integrity: sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==}
-    engines: {node: '>=4'}
-    dependencies:
-      file-type: 5.2.0
-      is-stream: 1.1.0
-      tar-stream: 1.6.2
-    dev: true
-
-  /decompress-tarbz2/4.1.1:
-    resolution: {integrity: sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==}
-    engines: {node: '>=4'}
-    dependencies:
-      decompress-tar: 4.1.1
-      file-type: 6.2.0
-      is-stream: 1.1.0
-      seek-bzip: 1.0.6
-      unbzip2-stream: 1.4.3
-    dev: true
-
-  /decompress-targz/4.1.1:
-    resolution: {integrity: sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==}
-    engines: {node: '>=4'}
-    dependencies:
-      decompress-tar: 4.1.1
-      file-type: 5.2.0
-      is-stream: 1.1.0
-    dev: true
-
-  /decompress-unzip/4.0.1:
-    resolution: {integrity: sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==}
-    engines: {node: '>=4'}
-    dependencies:
-      file-type: 3.9.0
-      get-stream: 2.3.1
-      pify: 2.3.0
-      yauzl: 2.10.0
-    dev: true
-
-  /decompress/4.2.1:
-    resolution: {integrity: sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==}
-    engines: {node: '>=4'}
-    dependencies:
-      decompress-tar: 4.1.1
-      decompress-tarbz2: 4.1.1
-      decompress-targz: 4.1.1
-      decompress-unzip: 4.0.1
-      graceful-fs: 4.2.10
-      make-dir: 1.3.0
-      pify: 2.3.0
-      strip-dirs: 2.1.0
-    dev: true
-
-  /dedent/0.7.0:
-    resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==}
-    dev: true
-
-  /deep-extend/0.6.0:
-    resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
-    engines: {node: '>=4.0.0'}
-    dev: false
-
-  /deep-is/0.1.4:
-    resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
-    dev: true
-
-  /deepmerge/4.2.2:
-    resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==}
-    engines: {node: '>=0.10.0'}
-
-  /default-gateway/6.0.3:
-    resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==}
-    engines: {node: '>= 10'}
-    dependencies:
-      execa: 5.1.1
-    dev: false
-
-  /defer-to-connect/1.1.3:
-    resolution: {integrity: sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==}
-    dev: false
-
-  /define-lazy-prop/2.0.0:
-    resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
-    engines: {node: '>=8'}
-    dev: false
-
-  /define-properties/1.1.4:
-    resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      has-property-descriptors: 1.0.0
-      object-keys: 1.1.1
-
-  /define-property/0.2.5:
-    resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-descriptor: 0.1.6
-    dev: true
-
-  /define-property/1.0.0:
-    resolution: {integrity: sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-descriptor: 1.0.2
-    dev: true
-
-  /define-property/2.0.2:
-    resolution: {integrity: sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-descriptor: 1.0.2
-      isobject: 3.0.1
-    dev: true
-
-  /del/6.1.1:
-    resolution: {integrity: sha512-ua8BhapfP0JUJKC/zV9yHHDW/rDoDxP4Zhn3AkA6/xT6gY7jYXJiaeyBZznYVujhZZET+UgcbZiQ7sN3WqcImg==}
-    engines: {node: '>=10'}
-    dependencies:
-      globby: 11.1.0
-      graceful-fs: 4.2.10
-      is-glob: 4.0.3
-      is-path-cwd: 2.2.0
-      is-path-inside: 3.0.3
-      p-map: 4.0.0
-      rimraf: 3.0.2
-      slash: 3.0.0
-    dev: false
-
-  /delayed-stream/1.0.0:
-    resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
-    engines: {node: '>=0.4.0'}
-    dev: true
-
-  /depd/1.1.2:
-    resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==}
-    engines: {node: '>= 0.6'}
-    dev: false
-
-  /depd/2.0.0:
-    resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
-    engines: {node: '>= 0.8'}
-    dev: false
-
-  /dequal/2.0.3:
-    resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
-    engines: {node: '>=6'}
-    dev: true
-
-  /destroy/1.2.0:
-    resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
-    engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
-    dev: false
-
-  /detab/2.0.4:
-    resolution: {integrity: sha512-8zdsQA5bIkoRECvCrNKPla84lyoR7DSAyf7p0YgXzBO9PDJx8KntPUay7NS6yp+KdxdVtiE5SpHKtbp2ZQyA9g==}
-    dependencies:
-      repeat-string: 1.6.1
-    dev: false
-
-  /detect-newline/3.1.0:
-    resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==}
-    engines: {node: '>=8'}
-    dev: true
-
-  /detect-node/2.1.0:
-    resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
-    dev: false
-
-  /detect-port-alt/1.1.6:
-    resolution: {integrity: sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==}
-    engines: {node: '>= 4.2.1'}
-    hasBin: true
-    dependencies:
-      address: 1.2.0
-      debug: 2.6.9
-    dev: false
-
-  /detect-port/1.3.0:
-    resolution: {integrity: sha512-E+B1gzkl2gqxt1IhUzwjrxBKRqx1UzC3WLONHinn8S3T6lwV/agVCyitiFOsGJ/eYuEUBvD71MZHy3Pv1G9doQ==}
-    engines: {node: '>= 4.2.1'}
-    hasBin: true
-    dependencies:
-      address: 1.2.0
-      debug: 2.6.9
-    dev: false
-
-  /diff-sequences/29.3.1:
-    resolution: {integrity: sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dev: true
-
-  /diff/5.1.0:
-    resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==}
-    engines: {node: '>=0.3.1'}
-    dev: true
-
-  /dir-glob/3.0.1:
-    resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
-    engines: {node: '>=8'}
-    dependencies:
-      path-type: 4.0.0
-
-  /dns-equal/1.0.0:
-    resolution: {integrity: sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==}
-    dev: false
-
-  /dns-packet/5.4.0:
-    resolution: {integrity: sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==}
-    engines: {node: '>=6'}
-    dependencies:
-      '@leichtgewicht/ip-codec': 2.0.4
-    dev: false
-
-  /doctrine/2.1.0:
-    resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      esutils: 2.0.3
-    dev: true
-
-  /doctrine/3.0.0:
-    resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
-    engines: {node: '>=6.0.0'}
-    dependencies:
-      esutils: 2.0.3
-    dev: true
-
-  /dom-converter/0.2.0:
-    resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==}
-    dependencies:
-      utila: 0.4.0
-    dev: false
-
-  /dom-serializer/1.4.1:
-    resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==}
-    dependencies:
-      domelementtype: 2.3.0
-      domhandler: 4.3.1
-      entities: 2.2.0
-    dev: false
-
-  /dom-serializer/2.0.0:
-    resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==}
-    dependencies:
-      domelementtype: 2.3.0
-      domhandler: 5.0.3
-      entities: 4.4.0
-    dev: false
-
-  /domelementtype/2.3.0:
-    resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==}
-    dev: false
-
-  /domhandler/4.3.1:
-    resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==}
-    engines: {node: '>= 4'}
-    dependencies:
-      domelementtype: 2.3.0
-    dev: false
-
-  /domhandler/5.0.3:
-    resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==}
-    engines: {node: '>= 4'}
-    dependencies:
-      domelementtype: 2.3.0
-    dev: false
-
-  /domutils/2.8.0:
-    resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==}
-    dependencies:
-      dom-serializer: 1.4.1
-      domelementtype: 2.3.0
-      domhandler: 4.3.1
-    dev: false
-
-  /domutils/3.0.1:
-    resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==}
-    dependencies:
-      dom-serializer: 2.0.0
-      domelementtype: 2.3.0
-      domhandler: 5.0.3
-    dev: false
-
-  /dot-case/3.0.4:
-    resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==}
-    dependencies:
-      no-case: 3.0.4
-      tslib: 2.4.1
-    dev: false
-
-  /dot-prop/5.3.0:
-    resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
-    engines: {node: '>=8'}
-    dependencies:
-      is-obj: 2.0.0
-    dev: false
-
-  /download/8.0.0:
-    resolution: {integrity: sha512-ASRY5QhDk7FK+XrQtQyvhpDKanLluEEQtWl/J7Lxuf/b+i8RYh997QeXvL85xitrmRKVlx9c7eTrcRdq2GS4eA==}
-    engines: {node: '>=10'}
-    dependencies:
-      archive-type: 4.0.0
-      content-disposition: 0.5.4
-      decompress: 4.2.1
-      ext-name: 5.0.0
-      file-type: 11.1.0
-      filenamify: 3.0.0
-      get-stream: 4.1.0
-      got: 8.3.2
-      make-dir: 2.1.0
-      p-event: 2.3.1
-      pify: 4.0.1
-    dev: true
-
-  /duplexer/0.1.2:
-    resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==}
-    dev: false
-
-  /duplexer3/0.1.5:
-    resolution: {integrity: sha512-1A8za6ws41LQgv9HrE/66jyC5yuSjQ3L/KOpFtoBilsAK2iA2wuS5rTt1OCzIvtS2V7nVmedsUU+DGRcjBmOYA==}
-
-  /eastasianwidth/0.2.0:
-    resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
-    dev: false
-
-  /ee-first/1.1.1:
-    resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=}
-    dev: false
-
-  /electron-to-chromium/1.4.194:
-    resolution: {integrity: sha512-ola5UH0xAP1oYY0FFUsPvwtucEzCQHucXnT7PQ1zjHJMccZhCDktEugI++JUR3YuIs7Ff7afz+OVEhVAIMhLAQ==}
-    dev: false
-
-  /electron-to-chromium/1.4.284:
-    resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==}
-
-  /emittery/0.13.1:
-    resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
-    engines: {node: '>=12'}
-    dev: true
-
-  /emoji-regex/8.0.0:
-    resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
-
-  /emoji-regex/9.2.2:
-    resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
-
-  /emojis-list/3.0.0:
-    resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==}
-    engines: {node: '>= 4'}
-
-  /emoticon/3.2.0:
-    resolution: {integrity: sha512-SNujglcLTTg+lDAcApPNgEdudaqQFiAbJCqzjNxJkvN9vAwCGi0uu8IUVvx+f16h+V44KCY6Y2yboroc9pilHg==}
-    dev: false
-
-  /encodeurl/1.0.2:
-    resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==}
-    engines: {node: '>= 0.8'}
-    dev: false
-
-  /end-of-stream/1.4.4:
-    resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
-    dependencies:
-      once: 1.4.0
-
-  /enhanced-resolve/3.3.0:
-    resolution: {integrity: sha512-2qbxE7ek3YxPJ1ML6V+satHkzHpJQKWkRHmRx6mfAoW59yP8YH8BFplbegSP+u2hBd6B6KCOpvJQ3dZAP+hkpg==}
-    engines: {node: '>=4.3.0 <5.0.0 || >=5.10'}
-    dependencies:
-      graceful-fs: 4.2.10
-      memory-fs: 0.4.1
-      object-assign: 4.1.1
-      tapable: 0.2.9
-    dev: true
-
-  /enhanced-resolve/5.10.0:
-    resolution: {integrity: sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==}
-    engines: {node: '>=10.13.0'}
-    dependencies:
-      graceful-fs: 4.2.10
-      tapable: 2.2.1
-    dev: false
-
-  /entities/2.2.0:
-    resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==}
-    dev: false
-
-  /entities/4.4.0:
-    resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==}
-    engines: {node: '>=0.12'}
-    dev: false
-
-  /errno/0.1.8:
-    resolution: {integrity: sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==}
-    hasBin: true
-    dependencies:
-      prr: 1.0.1
-    dev: true
-
-  /error-ex/1.3.2:
-    resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
-    dependencies:
-      is-arrayish: 0.2.1
-
-  /es-abstract/1.20.1:
-    resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      es-to-primitive: 1.2.1
-      function-bind: 1.1.1
-      function.prototype.name: 1.1.5
-      get-intrinsic: 1.1.2
-      get-symbol-description: 1.0.0
-      has: 1.0.3
-      has-property-descriptors: 1.0.0
-      has-symbols: 1.0.3
-      internal-slot: 1.0.3
-      is-callable: 1.2.4
-      is-negative-zero: 2.0.2
-      is-regex: 1.1.4
-      is-shared-array-buffer: 1.0.2
-      is-string: 1.0.7
-      is-weakref: 1.0.2
-      object-inspect: 1.12.2
-      object-keys: 1.1.1
-      object.assign: 4.1.2
-      regexp.prototype.flags: 1.4.3
-      string.prototype.trimend: 1.0.5
-      string.prototype.trimstart: 1.0.5
-      unbox-primitive: 1.0.2
-    dev: true
-
-  /es-module-lexer/0.9.3:
-    resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==}
-    dev: false
-
-  /es-shim-unscopables/1.0.0:
-    resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==}
-    dependencies:
-      has: 1.0.3
-    dev: true
-
-  /es-to-primitive/1.2.1:
-    resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      is-callable: 1.2.4
-      is-date-object: 1.0.5
-      is-symbol: 1.0.4
-    dev: true
-
-  /escalade/3.1.1:
-    resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
-    engines: {node: '>=6'}
-
-  /escape-goat/2.1.1:
-    resolution: {integrity: sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==}
-    engines: {node: '>=8'}
-    dev: false
-
-  /escape-html/1.0.3:
-    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
-    dev: false
-
-  /escape-string-regexp/1.0.5:
-    resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
-    engines: {node: '>=0.8.0'}
-
-  /escape-string-regexp/2.0.0:
-    resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
-    engines: {node: '>=8'}
-    dev: true
-
-  /escape-string-regexp/4.0.0:
-    resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
-    engines: {node: '>=10'}
-
-  /eslint-config-next/13.0.3_rmayb2veg2btbq6mbmnyivgasy:
-    resolution: {integrity: sha512-i2JoQP8gGv303GjXTonA27fm1ckRRkRoAP1WYEQgN0D2DDoFeBPqlJgHlMHnXKWjmNct/sW8jQEvy9am2juc8g==}
-    peerDependencies:
-      eslint: ^7.23.0 || ^8.0.0
-      typescript: '>=3.3.1'
-    peerDependenciesMeta:
-      typescript:
-        optional: true
-    dependencies:
-      '@next/eslint-plugin-next': 13.0.3
-      '@rushstack/eslint-patch': 1.1.4
-      '@typescript-eslint/parser': 5.42.1_rmayb2veg2btbq6mbmnyivgasy
-      eslint: 8.27.0
-      eslint-import-resolver-node: 0.3.6
-      eslint-import-resolver-typescript: 2.7.1_dcpv4nbdr5ks2h5677xdltrk6e
-      eslint-plugin-import: 2.26.0_eslint@8.27.0
-      eslint-plugin-jsx-a11y: 6.6.0_eslint@8.27.0
-      eslint-plugin-react: 7.31.10_eslint@8.27.0
-      eslint-plugin-react-hooks: 4.6.0_eslint@8.27.0
-      typescript: 4.8.4
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /eslint-import-resolver-node/0.3.6:
-    resolution: {integrity: sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==}
-    dependencies:
-      debug: 3.2.7
-      resolve: 1.22.1
-    dev: true
-
-  /eslint-import-resolver-typescript/2.7.1_dcpv4nbdr5ks2h5677xdltrk6e:
-    resolution: {integrity: sha512-00UbgGwV8bSgUv34igBDbTOtKhqoRMy9bFjNehT40bXg6585PNIct8HhXZ0SybqB9rWtXj9crcku8ndDn/gIqQ==}
-    engines: {node: '>=4'}
-    peerDependencies:
-      eslint: '*'
-      eslint-plugin-import: '*'
-    dependencies:
-      debug: 4.3.4
-      eslint: 8.27.0
-      eslint-plugin-import: 2.26.0_eslint@8.27.0
-      glob: 7.2.3
-      is-glob: 4.0.3
-      resolve: 1.22.1
-      tsconfig-paths: 3.14.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /eslint-module-utils/2.7.3:
-    resolution: {integrity: sha512-088JEC7O3lDZM9xGe0RerkOMd0EjFl+Yvd1jPWIkMT5u3H9+HC34mWWPnqPrN13gieT9pBOO+Qt07Nb/6TresQ==}
-    engines: {node: '>=4'}
-    dependencies:
-      debug: 3.2.7
-      find-up: 2.1.0
-    dev: true
-
-  /eslint-plugin-import/2.26.0_eslint@8.27.0:
-    resolution: {integrity: sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==}
-    engines: {node: '>=4'}
-    peerDependencies:
-      eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
-    dependencies:
-      array-includes: 3.1.5
-      array.prototype.flat: 1.3.0
-      debug: 2.6.9
-      doctrine: 2.1.0
-      eslint: 8.27.0
-      eslint-import-resolver-node: 0.3.6
-      eslint-module-utils: 2.7.3
-      has: 1.0.3
-      is-core-module: 2.9.0
-      is-glob: 4.0.3
-      minimatch: 3.1.2
-      object.values: 1.1.5
-      resolve: 1.22.1
-      tsconfig-paths: 3.14.1
-    dev: true
-
-  /eslint-plugin-jsx-a11y/6.6.0_eslint@8.27.0:
-    resolution: {integrity: sha512-kTeLuIzpNhXL2CwLlc8AHI0aFRwWHcg483yepO9VQiHzM9bZwJdzTkzBszbuPrbgGmq2rlX/FaT2fJQsjUSHsw==}
-    engines: {node: '>=4.0'}
-    peerDependencies:
-      eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
-    dependencies:
-      '@babel/runtime': 7.18.9
-      aria-query: 4.2.2
-      array-includes: 3.1.5
-      ast-types-flow: 0.0.7
-      axe-core: 4.4.3
-      axobject-query: 2.2.0
-      damerau-levenshtein: 1.0.8
-      emoji-regex: 9.2.2
-      eslint: 8.27.0
-      has: 1.0.3
-      jsx-ast-utils: 3.3.2
-      language-tags: 1.0.5
-      minimatch: 3.1.2
-      semver: 6.3.0
-    dev: true
-
-  /eslint-plugin-react-hooks/4.6.0_eslint@8.27.0:
-    resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
-    dependencies:
-      eslint: 8.27.0
-    dev: true
-
-  /eslint-plugin-react/7.31.10_eslint@8.27.0:
-    resolution: {integrity: sha512-e4N/nc6AAlg4UKW/mXeYWd3R++qUano5/o+t+wnWxIf+bLsOaH3a4q74kX3nDjYym3VBN4HyO9nEn1GcAqgQOA==}
-    engines: {node: '>=4'}
-    peerDependencies:
-      eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
-    dependencies:
-      array-includes: 3.1.5
-      array.prototype.flatmap: 1.3.0
-      doctrine: 2.1.0
-      eslint: 8.27.0
-      estraverse: 5.3.0
-      jsx-ast-utils: 3.3.2
-      minimatch: 3.1.2
-      object.entries: 1.1.5
-      object.fromentries: 2.0.5
-      object.hasown: 1.1.1
-      object.values: 1.1.5
-      prop-types: 15.8.1
-      resolve: 2.0.0-next.4
-      semver: 6.3.0
-      string.prototype.matchall: 4.0.7
-    dev: true
-
-  /eslint-scope/5.1.1:
-    resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
-    engines: {node: '>=8.0.0'}
-    dependencies:
-      esrecurse: 4.3.0
-      estraverse: 4.3.0
-    dev: false
-
-  /eslint-scope/7.1.1:
-    resolution: {integrity: sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    dependencies:
-      esrecurse: 4.3.0
-      estraverse: 5.3.0
-    dev: true
-
-  /eslint-utils/3.0.0_eslint@8.27.0:
-    resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==}
-    engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0}
-    peerDependencies:
-      eslint: '>=5'
-    dependencies:
-      eslint: 8.27.0
-      eslint-visitor-keys: 2.1.0
-    dev: true
-
-  /eslint-visitor-keys/2.1.0:
-    resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
-    engines: {node: '>=10'}
-    dev: true
-
-  /eslint-visitor-keys/3.3.0:
-    resolution: {integrity: sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    dev: true
-
-  /eslint/8.27.0:
-    resolution: {integrity: sha512-0y1bfG2ho7mty+SiILVf9PfuRA49ek4Nc60Wmmu62QlobNR+CeXa4xXIJgcuwSQgZiWaPH+5BDsctpIW0PR/wQ==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    hasBin: true
-    dependencies:
-      '@eslint/eslintrc': 1.3.3
-      '@humanwhocodes/config-array': 0.11.7
-      '@humanwhocodes/module-importer': 1.0.1
-      '@nodelib/fs.walk': 1.2.8
-      ajv: 6.12.6
-      chalk: 4.1.2
-      cross-spawn: 7.0.3
-      debug: 4.3.4
-      doctrine: 3.0.0
-      escape-string-regexp: 4.0.0
-      eslint-scope: 7.1.1
-      eslint-utils: 3.0.0_eslint@8.27.0
-      eslint-visitor-keys: 3.3.0
-      espree: 9.4.1
-      esquery: 1.4.0
-      esutils: 2.0.3
-      fast-deep-equal: 3.1.3
-      file-entry-cache: 6.0.1
-      find-up: 5.0.0
-      glob-parent: 6.0.2
-      globals: 13.16.0
-      grapheme-splitter: 1.0.4
-      ignore: 5.2.0
-      import-fresh: 3.3.0
-      imurmurhash: 0.1.4
-      is-glob: 4.0.3
-      is-path-inside: 3.0.3
-      js-sdsl: 4.1.5
-      js-yaml: 4.1.0
-      json-stable-stringify-without-jsonify: 1.0.1
-      levn: 0.4.1
-      lodash.merge: 4.6.2
-      minimatch: 3.1.2
-      natural-compare: 1.4.0
-      optionator: 0.9.1
-      regexpp: 3.2.0
-      strip-ansi: 6.0.1
-      strip-json-comments: 3.1.1
-      text-table: 0.2.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /espree/9.4.1:
-    resolution: {integrity: sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==}
-    engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
-    dependencies:
-      acorn: 8.8.1
-      acorn-jsx: 5.3.2_acorn@8.8.1
-      eslint-visitor-keys: 3.3.0
-    dev: true
-
-  /esprima/4.0.1:
-    resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
-    engines: {node: '>=4'}
-    hasBin: true
-
-  /esquery/1.4.0:
-    resolution: {integrity: sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==}
-    engines: {node: '>=0.10'}
-    dependencies:
-      estraverse: 5.3.0
-    dev: true
-
-  /esrecurse/4.3.0:
-    resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
-    engines: {node: '>=4.0'}
-    dependencies:
-      estraverse: 5.3.0
-
-  /estraverse/4.3.0:
-    resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
-    engines: {node: '>=4.0'}
-    dev: false
-
-  /estraverse/5.3.0:
-    resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
-    engines: {node: '>=4.0'}
-
-  /estree-util-attach-comments/2.0.1:
-    resolution: {integrity: sha512-1wTBNndwMIsnvnuxjFIaYQz0M7PsCvcgP0YD7/dU8xWh1FuHk+O6pYpT4sLa5THY/CywJvdIdgw4uhozujga/g==}
-    dependencies:
-      '@types/estree': 0.0.51
-    dev: true
-
-  /estree-util-build-jsx/2.1.0:
-    resolution: {integrity: sha512-gsBGfsY6LOJUIDwmMkTOcgCX+3r/LUjRBccgHMSW55PHjhZsV13RmPl/iwpAvW8KcQqoN9P0FEFWTSS2Zc5bGA==}
-    dependencies:
-      '@types/estree-jsx': 0.0.1
-      estree-util-is-identifier-name: 2.0.1
-      estree-walker: 3.0.1
-    dev: true
-
-  /estree-util-is-identifier-name/2.0.1:
-    resolution: {integrity: sha512-rxZj1GkQhY4x1j/CSnybK9cGuMFQYFPLq0iNyopqf14aOVLFtMv7Esika+ObJWPWiOHuMOAHz3YkWoLYYRnzWQ==}
-    dev: true
-
-  /estree-util-visit/1.1.0:
-    resolution: {integrity: sha512-3lXJ4Us9j8TUif9cWcQy81t9p5OLasnDuuhrFiqb+XstmKC1d1LmrQWYsY49/9URcfHE64mPypDBaNK9NwWDPQ==}
-    dependencies:
-      '@types/estree-jsx': 0.0.1
-      '@types/unist': 2.0.6
-    dev: true
-
-  /estree-walker/3.0.1:
-    resolution: {integrity: sha512-woY0RUD87WzMBUiZLx8NsYr23N5BKsOMZHhu2hoNRVh6NXGfoiT1KOL8G3UHlJAnEDGmfa5ubNA/AacfG+Kb0g==}
-    dev: true
-
-  /esutils/2.0.3:
-    resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
-    engines: {node: '>=0.10.0'}
-
-  /eta/1.12.3:
-    resolution: {integrity: sha512-qHixwbDLtekO/d51Yr4glcaUJCIjGVJyTzuqV4GPlgZo1YpgOKG+avQynErZIYrfM6JIJdtiG2Kox8tbb+DoGg==}
-    engines: {node: '>=6.0.0'}
-    dev: false
-
-  /etag/1.8.1:
-    resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==}
-    engines: {node: '>= 0.6'}
-    dev: false
-
-  /eval/0.1.8:
-    resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==}
-    engines: {node: '>= 0.8'}
-    dependencies:
-      '@types/node': 18.11.9
-      require-like: 0.1.2
-    dev: false
-
-  /eventemitter3/4.0.7:
-    resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==}
-    dev: false
-
-  /events/3.3.0:
-    resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
-    engines: {node: '>=0.8.x'}
-    dev: false
-
-  /execa/5.1.1:
-    resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
-    engines: {node: '>=10'}
-    dependencies:
-      cross-spawn: 7.0.3
-      get-stream: 6.0.1
-      human-signals: 2.1.0
-      is-stream: 2.0.1
-      merge-stream: 2.0.0
-      npm-run-path: 4.0.1
-      onetime: 5.1.2
-      signal-exit: 3.0.7
-      strip-final-newline: 2.0.0
-
-  /exit/0.1.2:
-    resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
-    engines: {node: '>= 0.8.0'}
-    dev: true
-
-  /expand-brackets/2.1.4:
-    resolution: {integrity: sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      debug: 2.6.9
-      define-property: 0.2.5
-      extend-shallow: 2.0.1
-      posix-character-classes: 0.1.1
-      regex-not: 1.0.2
-      snapdragon: 0.8.2
-      to-regex: 3.0.2
-    dev: true
-
-  /expect/29.3.1:
-    resolution: {integrity: sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/expect-utils': 29.3.1
-      jest-get-type: 29.2.0
-      jest-matcher-utils: 29.3.1
-      jest-message-util: 29.3.1
-      jest-util: 29.3.1
-    dev: true
-
-  /express/4.18.1:
-    resolution: {integrity: sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==}
-    engines: {node: '>= 0.10.0'}
-    dependencies:
-      accepts: 1.3.8
-      array-flatten: 1.1.1
-      body-parser: 1.20.0
-      content-disposition: 0.5.4
-      content-type: 1.0.4
-      cookie: 0.5.0
-      cookie-signature: 1.0.6
-      debug: 2.6.9
-      depd: 2.0.0
-      encodeurl: 1.0.2
-      escape-html: 1.0.3
-      etag: 1.8.1
-      finalhandler: 1.2.0
-      fresh: 0.5.2
-      http-errors: 2.0.0
-      merge-descriptors: 1.0.1
-      methods: 1.1.2
-      on-finished: 2.4.1
-      parseurl: 1.3.3
-      path-to-regexp: 0.1.7
-      proxy-addr: 2.0.7
-      qs: 6.10.3
-      range-parser: 1.2.1
-      safe-buffer: 5.2.1
-      send: 0.18.0
-      serve-static: 1.15.0
-      setprototypeof: 1.2.0
-      statuses: 2.0.1
-      type-is: 1.6.18
-      utils-merge: 1.0.1
-      vary: 1.1.2
-    dev: false
-
-  /ext-list/2.2.2:
-    resolution: {integrity: sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      mime-db: 1.52.0
-    dev: true
-
-  /ext-name/5.0.0:
-    resolution: {integrity: sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==}
-    engines: {node: '>=4'}
-    dependencies:
-      ext-list: 2.2.2
-      sort-keys-length: 1.0.1
-    dev: true
-
-  /extend-shallow/2.0.1:
-    resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-extendable: 0.1.1
-
-  /extend-shallow/3.0.2:
-    resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      assign-symbols: 1.0.0
-      is-extendable: 1.0.1
-    dev: true
-
-  /extend/3.0.2:
-    resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==}
-
-  /extglob/2.0.4:
-    resolution: {integrity: sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      array-unique: 0.3.2
-      define-property: 1.0.0
-      expand-brackets: 2.1.4
-      extend-shallow: 2.0.1
-      fragment-cache: 0.2.1
-      regex-not: 1.0.2
-      snapdragon: 0.8.2
-      to-regex: 3.0.2
-    dev: true
-
-  /fast-deep-equal/3.1.3:
-    resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
-
-  /fast-glob/3.2.11:
-    resolution: {integrity: sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==}
-    engines: {node: '>=8.6.0'}
-    dependencies:
-      '@nodelib/fs.stat': 2.0.5
-      '@nodelib/fs.walk': 1.2.8
-      glob-parent: 5.1.2
-      merge2: 1.4.1
-      micromatch: 4.0.5
-
-  /fast-json-stable-stringify/2.1.0:
-    resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
-
-  /fast-levenshtein/2.0.6:
-    resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
-    dev: true
-
-  /fast-url-parser/1.1.3:
-    resolution: {integrity: sha1-9K8+qfNNiicc9YrSs3WfQx8LMY0=}
-    dependencies:
-      punycode: 1.4.1
-    dev: false
-
-  /fastq/1.13.0:
-    resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==}
-    dependencies:
-      reusify: 1.0.4
-
-  /faye-websocket/0.11.4:
-    resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==}
-    engines: {node: '>=0.8.0'}
-    dependencies:
-      websocket-driver: 0.7.4
-    dev: false
-
-  /fb-watchman/2.0.1:
-    resolution: {integrity: sha512-DkPJKQeY6kKwmuMretBhr7G6Vodr7bFwDYTXIkfG1gjvNpaxBTQV3PbXg6bR1c1UP4jPOX0jHUbbHANL9vRjVg==}
-    dependencies:
-      bser: 2.1.1
-    dev: true
-
-  /fbemitter/3.0.0:
-    resolution: {integrity: sha512-KWKaceCwKQU0+HPoop6gn4eOHk50bBv/VxjJtGMfwmJt3D29JpN4H4eisCtIPA+a8GVBam+ldMMpMjJUvpDyHw==}
-    dependencies:
-      fbjs: 3.0.4
-    transitivePeerDependencies:
-      - encoding
-    dev: false
-
-  /fbjs-css-vars/1.0.2:
-    resolution: {integrity: sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==}
-    dev: false
-
-  /fbjs/3.0.4:
-    resolution: {integrity: sha512-ucV0tDODnGV3JCnnkmoszb5lf4bNpzjv80K41wd4k798Etq+UYD0y0TIfalLjZoKgjive6/adkRnszwapiDgBQ==}
-    dependencies:
-      cross-fetch: 3.1.5
-      fbjs-css-vars: 1.0.2
-      loose-envify: 1.4.0
-      object-assign: 4.1.1
-      promise: 7.3.1
-      setimmediate: 1.0.5
-      ua-parser-js: 0.7.31
-    transitivePeerDependencies:
-      - encoding
-    dev: false
-
-  /fd-slicer/1.1.0:
-    resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==}
-    dependencies:
-      pend: 1.2.0
-    dev: true
-
-  /feed/4.2.2:
-    resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==}
-    engines: {node: '>=0.4.0'}
-    dependencies:
-      xml-js: 1.6.11
-    dev: false
-
-  /fetch-blob/3.2.0:
-    resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==}
-    engines: {node: ^12.20 || >= 14.13}
-    dependencies:
-      node-domexception: 1.0.0
-      web-streams-polyfill: 3.2.1
-    dev: true
-
-  /file-entry-cache/6.0.1:
-    resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
-    engines: {node: ^10.12.0 || >=12.0.0}
-    dependencies:
-      flat-cache: 3.0.4
-    dev: true
-
-  /file-loader/6.2.0:
-    resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==}
-    engines: {node: '>= 10.13.0'}
-    peerDependencies:
-      webpack: ^4.0.0 || ^5.0.0
-    dependencies:
-      loader-utils: 2.0.2
-      schema-utils: 3.1.1
-    dev: false
-
-  /file-loader/6.2.0_webpack@5.73.0:
-    resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==}
-    engines: {node: '>= 10.13.0'}
-    peerDependencies:
-      webpack: ^4.0.0 || ^5.0.0
-    dependencies:
-      loader-utils: 2.0.2
-      schema-utils: 3.1.1
-      webpack: 5.73.0
-    dev: false
-
-  /file-type/11.1.0:
-    resolution: {integrity: sha512-rM0UO7Qm9K7TWTtA6AShI/t7H5BPjDeGVDaNyg9BjHAj3PysKy7+8C8D137R88jnR3rFJZQB/tFgydl5sN5m7g==}
-    engines: {node: '>=6'}
-    dev: true
-
-  /file-type/3.9.0:
-    resolution: {integrity: sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /file-type/4.4.0:
-    resolution: {integrity: sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /file-type/5.2.0:
-    resolution: {integrity: sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /file-type/6.2.0:
-    resolution: {integrity: sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /filename-reserved-regex/2.0.0:
-    resolution: {integrity: sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /filenamify/3.0.0:
-    resolution: {integrity: sha512-5EFZ//MsvJgXjBAFJ+Bh2YaCTRF/VP1YOmGrgt+KJ4SFRLjI87EIdwLLuT6wQX0I4F9W41xutobzczjsOKlI/g==}
-    engines: {node: '>=6'}
-    dependencies:
-      filename-reserved-regex: 2.0.0
-      strip-outer: 1.0.1
-      trim-repeated: 1.0.0
-    dev: true
-
-  /filesize/8.0.7:
-    resolution: {integrity: sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==}
-    engines: {node: '>= 0.4.0'}
-    dev: false
-
-  /fill-range/4.0.0:
-    resolution: {integrity: sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      extend-shallow: 2.0.1
-      is-number: 3.0.0
-      repeat-string: 1.6.1
-      to-regex-range: 2.1.1
-    dev: true
-
-  /fill-range/7.0.1:
-    resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
-    engines: {node: '>=8'}
-    dependencies:
-      to-regex-range: 5.0.1
-
-  /finalhandler/1.2.0:
-    resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==}
-    engines: {node: '>= 0.8'}
-    dependencies:
-      debug: 2.6.9
-      encodeurl: 1.0.2
-      escape-html: 1.0.3
-      on-finished: 2.4.1
-      parseurl: 1.3.3
-      statuses: 2.0.1
-      unpipe: 1.0.0
-    dev: false
-
-  /find-cache-dir/3.3.2:
-    resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==}
-    engines: {node: '>=8'}
-    dependencies:
-      commondir: 1.0.1
-      make-dir: 3.1.0
-      pkg-dir: 4.2.0
-    dev: false
-
-  /find-up/2.1.0:
-    resolution: {integrity: sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==}
-    engines: {node: '>=4'}
-    dependencies:
-      locate-path: 2.0.0
-    dev: true
-
-  /find-up/3.0.0:
-    resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==}
-    engines: {node: '>=6'}
-    dependencies:
-      locate-path: 3.0.0
-    dev: false
-
-  /find-up/4.1.0:
-    resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
-    engines: {node: '>=8'}
-    dependencies:
-      locate-path: 5.0.0
-      path-exists: 4.0.0
-
-  /find-up/5.0.0:
-    resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
-    engines: {node: '>=10'}
-    dependencies:
-      locate-path: 6.0.0
-      path-exists: 4.0.0
-
-  /flat-cache/3.0.4:
-    resolution: {integrity: sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==}
-    engines: {node: ^10.12.0 || >=12.0.0}
-    dependencies:
-      flatted: 3.2.6
-      rimraf: 3.0.2
-    dev: true
-
-  /flatted/3.2.6:
-    resolution: {integrity: sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==}
-    dev: true
-
-  /flux/4.0.3_react@18.2.0:
-    resolution: {integrity: sha512-yKAbrp7JhZhj6uiT1FTuVMlIAT1J4jqEyBpFApi1kxpGZCvacMVc/t1pMQyotqHhAgvoE3bNvAykhCo2CLjnYw==}
-    peerDependencies:
-      react: ^15.0.2 || ^16.0.0 || ^17.0.0
-    dependencies:
-      fbemitter: 3.0.0
-      fbjs: 3.0.4
-      react: 18.2.0
-    transitivePeerDependencies:
-      - encoding
-    dev: false
-
-  /follow-redirects/1.15.1:
-    resolution: {integrity: sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==}
-    engines: {node: '>=4.0'}
-    peerDependencies:
-      debug: '*'
-    peerDependenciesMeta:
-      debug:
-        optional: true
-    dev: false
-
-  /for-in/1.0.2:
-    resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /fork-ts-checker-webpack-plugin/6.5.2_webpack@5.73.0:
-    resolution: {integrity: sha512-m5cUmF30xkZ7h4tWUgTAcEaKmUW7tfyUyTqNNOz7OxWJ0v1VWKTcOvH8FWHUwSjlW/356Ijc9vi3XfcPstpQKA==}
-    engines: {node: '>=10', yarn: '>=1.0.0'}
-    peerDependencies:
-      eslint: '>= 6'
-      typescript: '>= 2.7'
-      vue-template-compiler: '*'
-      webpack: '>= 4'
-    peerDependenciesMeta:
-      eslint:
-        optional: true
-      vue-template-compiler:
-        optional: true
-    dependencies:
-      '@babel/code-frame': 7.18.6
-      '@types/json-schema': 7.0.11
-      chalk: 4.1.2
-      chokidar: 3.5.3
-      cosmiconfig: 6.0.0
-      deepmerge: 4.2.2
-      fs-extra: 9.1.0
-      glob: 7.2.3
-      memfs: 3.4.7
-      minimatch: 3.1.2
-      schema-utils: 2.7.0
-      semver: 7.3.7
-      tapable: 1.1.3
-      webpack: 5.73.0
-    dev: false
-
-  /form-data/3.0.1:
-    resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==}
-    engines: {node: '>= 6'}
-    dependencies:
-      asynckit: 0.4.0
-      combined-stream: 1.0.8
-      mime-types: 2.1.35
-    dev: true
-
-  /formdata-polyfill/4.0.10:
-    resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==}
-    engines: {node: '>=12.20.0'}
-    dependencies:
-      fetch-blob: 3.2.0
-    dev: true
-
-  /forwarded/0.2.0:
-    resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==}
-    engines: {node: '>= 0.6'}
-    dev: false
-
-  /fraction.js/4.2.0:
-    resolution: {integrity: sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==}
-    dev: false
-
-  /fragment-cache/0.2.1:
-    resolution: {integrity: sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      map-cache: 0.2.2
-    dev: true
-
-  /fresh/0.5.2:
-    resolution: {integrity: sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=}
-    engines: {node: '>= 0.6'}
-    dev: false
-
-  /from2/2.3.0:
-    resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==}
-    dependencies:
-      inherits: 2.0.4
-      readable-stream: 2.3.7
-    dev: true
-
-  /fs-constants/1.0.0:
-    resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==}
-    dev: true
-
-  /fs-extra/10.1.0:
-    resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
-    engines: {node: '>=12'}
-    dependencies:
-      graceful-fs: 4.2.10
-      jsonfile: 6.1.0
-      universalify: 2.0.0
-    dev: false
-
-  /fs-extra/9.1.0:
-    resolution: {integrity: sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==}
-    engines: {node: '>=10'}
-    dependencies:
-      at-least-node: 1.0.0
-      graceful-fs: 4.2.10
-      jsonfile: 6.1.0
-      universalify: 2.0.0
-    dev: false
-
-  /fs-monkey/1.0.3:
-    resolution: {integrity: sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==}
-    dev: false
-
-  /fs.realpath/1.0.0:
-    resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
-
-  /fsevents/2.3.2:
-    resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
-    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
-    os: [darwin]
-    requiresBuild: true
-    optional: true
-
-  /function-bind/1.1.1:
-    resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
-
-  /function.prototype.name/1.1.5:
-    resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      define-properties: 1.1.4
-      es-abstract: 1.20.1
-      functions-have-names: 1.2.3
-    dev: true
-
-  /functions-have-names/1.2.3:
-    resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
-    dev: true
-
-  /gensync/1.0.0-beta.2:
-    resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
-    engines: {node: '>=6.9.0'}
-
-  /get-caller-file/2.0.5:
-    resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
-    engines: {node: 6.* || 8.* || >= 10.*}
-    dev: true
-
-  /get-intrinsic/1.1.2:
-    resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==}
-    dependencies:
-      function-bind: 1.1.1
-      has: 1.0.3
-      has-symbols: 1.0.3
-
-  /get-own-enumerable-property-symbols/3.0.2:
-    resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==}
-    dev: false
-
-  /get-package-type/0.1.0:
-    resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
-    engines: {node: '>=8.0.0'}
-    dev: true
-
-  /get-stream/2.3.1:
-    resolution: {integrity: sha512-AUGhbbemXxrZJRD5cDvKtQxLuYaIbNtDTK8YqupCI393Q2KSTreEsLUN3ZxAWFGiKTzL6nKuzfcIvieflUX9qA==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      object-assign: 4.1.1
-      pinkie-promise: 2.0.1
-    dev: true
-
-  /get-stream/3.0.0:
-    resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /get-stream/4.1.0:
-    resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==}
-    engines: {node: '>=6'}
-    dependencies:
-      pump: 3.0.0
-
-  /get-stream/5.2.0:
-    resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==}
-    engines: {node: '>=8'}
-    dependencies:
-      pump: 3.0.0
-    dev: false
-
-  /get-stream/6.0.1:
-    resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==}
-    engines: {node: '>=10'}
-
-  /get-symbol-description/1.0.0:
-    resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      get-intrinsic: 1.1.2
-    dev: true
-
-  /get-value/2.0.6:
-    resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /gh-release-fetch/3.0.2:
-    resolution: {integrity: sha512-xcX1uaOVDvsm+io4bvJfBFpQCLfoI3DsFay2GBMUtEnNInbNFFZqxTh7X0WIorCDtOmtos5atp2BGHAGEzmlAg==}
-    engines: {node: ^12.20.0 || ^14.14.0 || >=16.0.0}
-    dependencies:
-      '@types/download': 8.0.1
-      '@types/node-fetch': 2.6.2
-      '@types/semver': 7.3.10
-      download: 8.0.0
-      node-fetch: 2.6.7
-      semver: 7.3.7
-    transitivePeerDependencies:
-      - encoding
-    dev: true
-
-  /github-slugger/1.4.0:
-    resolution: {integrity: sha512-w0dzqw/nt51xMVmlaV1+JRzN+oCa1KfcgGEWhxUG16wbdA+Xnt/yoFO8Z8x/V82ZcZ0wy6ln9QDup5avbhiDhQ==}
-    dev: false
-
-  /glob-parent/5.1.2:
-    resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
-    engines: {node: '>= 6'}
-    dependencies:
-      is-glob: 4.0.3
-
-  /glob-parent/6.0.2:
-    resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
-    engines: {node: '>=10.13.0'}
-    dependencies:
-      is-glob: 4.0.3
-
-  /glob-to-regexp/0.4.1:
-    resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==}
-    dev: false
-
-  /glob/7.1.7:
-    resolution: {integrity: sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==}
-    dependencies:
-      fs.realpath: 1.0.0
-      inflight: 1.0.6
-      inherits: 2.0.4
-      minimatch: 3.1.2
-      once: 1.4.0
-      path-is-absolute: 1.0.1
-    dev: true
-
-  /glob/7.2.3:
-    resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
-    dependencies:
-      fs.realpath: 1.0.0
-      inflight: 1.0.6
-      inherits: 2.0.4
-      minimatch: 3.1.2
-      once: 1.4.0
-      path-is-absolute: 1.0.1
-
-  /global-dirs/3.0.0:
-    resolution: {integrity: sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==}
-    engines: {node: '>=10'}
-    dependencies:
-      ini: 2.0.0
-    dev: false
-
-  /global-modules/2.0.0:
-    resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==}
-    engines: {node: '>=6'}
-    dependencies:
-      global-prefix: 3.0.0
-    dev: false
-
-  /global-prefix/3.0.0:
-    resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==}
-    engines: {node: '>=6'}
-    dependencies:
-      ini: 1.3.8
-      kind-of: 6.0.3
-      which: 1.3.1
-    dev: false
-
-  /globals/11.12.0:
-    resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
-    engines: {node: '>=4'}
-
-  /globals/13.16.0:
-    resolution: {integrity: sha512-A1lrQfpNF+McdPOnnFqY3kSN0AFTy485bTi1bkLk4mVPODIUEcSfhHgRqA+QdXPksrSTTztYXx37NFV+GpGk3Q==}
-    engines: {node: '>=8'}
-    dependencies:
-      type-fest: 0.20.2
-    dev: true
-
-  /globby/11.1.0:
-    resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
-    engines: {node: '>=10'}
-    dependencies:
-      array-union: 2.1.0
-      dir-glob: 3.0.1
-      fast-glob: 3.2.11
-      ignore: 5.2.0
-      merge2: 1.4.1
-      slash: 3.0.0
-
-  /globby/13.1.2:
-    resolution: {integrity: sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ==}
-    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-    dependencies:
-      dir-glob: 3.0.1
-      fast-glob: 3.2.11
-      ignore: 5.2.0
-      merge2: 1.4.1
-      slash: 4.0.0
-    dev: false
-
-  /got/8.3.2:
-    resolution: {integrity: sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==}
-    engines: {node: '>=4'}
-    dependencies:
-      '@sindresorhus/is': 0.7.0
-      '@types/keyv': 3.1.4
-      '@types/responselike': 1.0.0
-      cacheable-request: 2.1.4
-      decompress-response: 3.3.0
-      duplexer3: 0.1.5
-      get-stream: 3.0.0
-      into-stream: 3.1.0
-      is-retry-allowed: 1.2.0
-      isurl: 1.0.0
-      lowercase-keys: 1.0.1
-      mimic-response: 1.0.1
-      p-cancelable: 0.4.1
-      p-timeout: 2.0.1
-      pify: 3.0.0
-      safe-buffer: 5.2.1
-      timed-out: 4.0.1
-      url-parse-lax: 3.0.0
-      url-to-options: 1.0.1
-    dev: true
-
-  /got/9.6.0:
-    resolution: {integrity: sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==}
-    engines: {node: '>=8.6'}
-    dependencies:
-      '@sindresorhus/is': 0.14.0
-      '@szmarczak/http-timer': 1.1.2
-      '@types/keyv': 3.1.4
-      '@types/responselike': 1.0.0
-      cacheable-request: 6.1.0
-      decompress-response: 3.3.0
-      duplexer3: 0.1.5
-      get-stream: 4.1.0
-      lowercase-keys: 1.0.1
-      mimic-response: 1.0.1
-      p-cancelable: 1.1.0
-      to-readable-stream: 1.0.0
-      url-parse-lax: 3.0.0
-    dev: false
-
-  /graceful-fs/4.2.10:
-    resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
-
-  /grapheme-splitter/1.0.4:
-    resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
-    dev: true
-
-  /gray-matter/4.0.3:
-    resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
-    engines: {node: '>=6.0'}
-    dependencies:
-      js-yaml: 3.14.1
-      kind-of: 6.0.3
-      section-matter: 1.0.0
-      strip-bom-string: 1.0.0
-    dev: false
-
-  /gzip-size/6.0.0:
-    resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==}
-    engines: {node: '>=10'}
-    dependencies:
-      duplexer: 0.1.2
-    dev: false
-
-  /handle-thing/2.0.1:
-    resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==}
-    dev: false
-
-  /has-bigints/1.0.2:
-    resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
-    dev: true
-
-  /has-flag/3.0.0:
-    resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
-    engines: {node: '>=4'}
-
-  /has-flag/4.0.0:
-    resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==}
-    engines: {node: '>=8'}
-
-  /has-property-descriptors/1.0.0:
-    resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==}
-    dependencies:
-      get-intrinsic: 1.1.2
-
-  /has-symbol-support-x/1.4.2:
-    resolution: {integrity: sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==}
-    dev: true
-
-  /has-symbols/1.0.3:
-    resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
-    engines: {node: '>= 0.4'}
-
-  /has-to-string-tag-x/1.4.1:
-    resolution: {integrity: sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==}
-    dependencies:
-      has-symbol-support-x: 1.4.2
-    dev: true
-
-  /has-tostringtag/1.0.0:
-    resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      has-symbols: 1.0.3
-    dev: true
-
-  /has-value/0.3.1:
-    resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      get-value: 2.0.6
-      has-values: 0.1.4
-      isobject: 2.1.0
-    dev: true
-
-  /has-value/1.0.0:
-    resolution: {integrity: sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      get-value: 2.0.6
-      has-values: 1.0.0
-      isobject: 3.0.1
-    dev: true
-
-  /has-values/0.1.4:
-    resolution: {integrity: sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /has-values/1.0.0:
-    resolution: {integrity: sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-number: 3.0.0
-      kind-of: 4.0.0
-    dev: true
-
-  /has-yarn/2.1.0:
-    resolution: {integrity: sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==}
-    engines: {node: '>=8'}
-    dev: false
-
-  /has/1.0.3:
-    resolution: {integrity: sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==}
-    engines: {node: '>= 0.4.0'}
-    dependencies:
-      function-bind: 1.1.1
-
-  /hast-to-hyperscript/9.0.1:
-    resolution: {integrity: sha512-zQgLKqF+O2F72S1aa4y2ivxzSlko3MAvxkwG8ehGmNiqd98BIN3JM1rAJPmplEyLmGLO2QZYJtIneOSZ2YbJuA==}
-    dependencies:
-      '@types/unist': 2.0.6
-      comma-separated-tokens: 1.0.8
-      property-information: 5.6.0
-      space-separated-tokens: 1.1.5
-      style-to-object: 0.3.0
-      unist-util-is: 4.1.0
-      web-namespaces: 1.1.4
-    dev: false
-
-  /hast-util-from-parse5/6.0.1:
-    resolution: {integrity: sha512-jeJUWiN5pSxW12Rh01smtVkZgZr33wBokLzKLwinYOUfSzm1Nl/c3GUGebDyOKjdsRgMvoVbV0VpAcpjF4NrJA==}
-    dependencies:
-      '@types/parse5': 5.0.3
-      hastscript: 6.0.0
-      property-information: 5.6.0
-      vfile: 4.2.1
-      vfile-location: 3.2.0
-      web-namespaces: 1.1.4
-    dev: false
-
-  /hast-util-parse-selector/2.2.5:
-    resolution: {integrity: sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==}
-    dev: false
-
-  /hast-util-raw/6.0.1:
-    resolution: {integrity: sha512-ZMuiYA+UF7BXBtsTBNcLBF5HzXzkyE6MLzJnL605LKE8GJylNjGc4jjxazAHUtcwT5/CEt6afRKViYB4X66dig==}
-    dependencies:
-      '@types/hast': 2.3.4
-      hast-util-from-parse5: 6.0.1
-      hast-util-to-parse5: 6.0.0
-      html-void-elements: 1.0.5
-      parse5: 6.0.1
-      unist-util-position: 3.1.0
-      vfile: 4.2.1
-      web-namespaces: 1.1.4
-      xtend: 4.0.2
-      zwitch: 1.0.5
-    dev: false
-
-  /hast-util-to-estree/2.0.2:
-    resolution: {integrity: sha512-UQrZVeBj6A9od0lpFvqHKNSH9zvDrNoyWKbveu1a2oSCXEDUI+3bnd6BoiQLPnLrcXXn/jzJ6y9hmJTTlvf8lQ==}
-    dependencies:
-      '@types/estree-jsx': 0.0.1
-      '@types/hast': 2.3.4
-      '@types/unist': 2.0.6
-      comma-separated-tokens: 2.0.2
-      estree-util-attach-comments: 2.0.1
-      estree-util-is-identifier-name: 2.0.1
-      hast-util-whitespace: 2.0.0
-      mdast-util-mdx-expression: 1.2.1
-      mdast-util-mdxjs-esm: 1.2.1
-      property-information: 6.1.1
-      space-separated-tokens: 2.0.1
-      style-to-object: 0.3.0
-      unist-util-position: 4.0.3
-      zwitch: 2.0.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /hast-util-to-parse5/6.0.0:
-    resolution: {integrity: sha512-Lu5m6Lgm/fWuz8eWnrKezHtVY83JeRGaNQ2kn9aJgqaxvVkFCZQBEhgodZUDUvoodgyROHDb3r5IxAEdl6suJQ==}
-    dependencies:
-      hast-to-hyperscript: 9.0.1
-      property-information: 5.6.0
-      web-namespaces: 1.1.4
-      xtend: 4.0.2
-      zwitch: 1.0.5
-    dev: false
-
-  /hast-util-whitespace/2.0.0:
-    resolution: {integrity: sha512-Pkw+xBHuV6xFeJprJe2BBEoDV+AvQySaz3pPDRUs5PNZEMQjpXJJueqrpcHIXxnWTcAGi/UOCgVShlkY6kLoqg==}
-    dev: true
-
-  /hastscript/6.0.0:
-    resolution: {integrity: sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==}
-    dependencies:
-      '@types/hast': 2.3.4
-      comma-separated-tokens: 1.0.8
-      hast-util-parse-selector: 2.2.5
-      property-information: 5.6.0
-      space-separated-tokens: 1.1.5
-    dev: false
-
-  /he/1.2.0:
-    resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==}
-    hasBin: true
-    dev: false
-
-  /history/4.10.1:
-    resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==}
-    dependencies:
-      '@babel/runtime': 7.18.9
-      loose-envify: 1.4.0
-      resolve-pathname: 3.0.0
-      tiny-invariant: 1.2.0
-      tiny-warning: 1.0.3
-      value-equal: 1.0.1
-    dev: false
-
-  /hoist-non-react-statics/3.3.2:
-    resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==}
-    dependencies:
-      react-is: 16.13.1
-    dev: false
-
-  /hpack.js/2.1.6:
-    resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==}
-    dependencies:
-      inherits: 2.0.4
-      obuf: 1.1.2
-      readable-stream: 2.3.7
-      wbuf: 1.7.3
-    dev: false
-
-  /html-entities/2.3.3:
-    resolution: {integrity: sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==}
-    dev: false
-
-  /html-escaper/2.0.2:
-    resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
-    dev: true
-
-  /html-minifier-terser/6.1.0:
-    resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==}
-    engines: {node: '>=12'}
-    hasBin: true
-    dependencies:
-      camel-case: 4.1.2
-      clean-css: 5.3.1
-      commander: 8.3.0
-      he: 1.2.0
-      param-case: 3.0.4
-      relateurl: 0.2.7
-      terser: 5.14.2
-    dev: false
-
-  /html-tags/3.2.0:
-    resolution: {integrity: sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==}
-    engines: {node: '>=8'}
-    dev: false
-
-  /html-void-elements/1.0.5:
-    resolution: {integrity: sha512-uE/TxKuyNIcx44cIWnjr/rfIATDH7ZaOMmstu0CwhFG1Dunhlp4OC6/NMbhiwoq5BpW0ubi303qnEk/PZj614w==}
-    dev: false
-
-  /html-webpack-plugin/5.5.0_webpack@5.73.0:
-    resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==}
-    engines: {node: '>=10.13.0'}
-    peerDependencies:
-      webpack: ^5.20.0
-    dependencies:
-      '@types/html-minifier-terser': 6.1.0
-      html-minifier-terser: 6.1.0
-      lodash: 4.17.21
-      pretty-error: 4.0.0
-      tapable: 2.2.1
-      webpack: 5.73.0
-    dev: false
-
-  /htmlparser2/6.1.0:
-    resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==}
-    dependencies:
-      domelementtype: 2.3.0
-      domhandler: 4.3.1
-      domutils: 2.8.0
-      entities: 2.2.0
-    dev: false
-
-  /htmlparser2/8.0.1:
-    resolution: {integrity: sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==}
-    dependencies:
-      domelementtype: 2.3.0
-      domhandler: 5.0.3
-      domutils: 3.0.1
-      entities: 4.4.0
-    dev: false
-
-  /http-cache-semantics/3.8.1:
-    resolution: {integrity: sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==}
-    dev: true
-
-  /http-cache-semantics/4.1.0:
-    resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==}
-    dev: false
-
-  /http-deceiver/1.2.7:
-    resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==}
-    dev: false
-
-  /http-errors/1.6.3:
-    resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==}
-    engines: {node: '>= 0.6'}
-    dependencies:
-      depd: 1.1.2
-      inherits: 2.0.3
-      setprototypeof: 1.1.0
-      statuses: 1.5.0
-    dev: false
-
-  /http-errors/2.0.0:
-    resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==}
-    engines: {node: '>= 0.8'}
-    dependencies:
-      depd: 2.0.0
-      inherits: 2.0.4
-      setprototypeof: 1.2.0
-      statuses: 2.0.1
-      toidentifier: 1.0.1
-    dev: false
-
-  /http-parser-js/0.5.8:
-    resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==}
-    dev: false
-
-  /http-proxy-middleware/2.0.6_@types+express@4.17.13:
-    resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==}
-    engines: {node: '>=12.0.0'}
-    peerDependencies:
-      '@types/express': ^4.17.13
-    peerDependenciesMeta:
-      '@types/express':
-        optional: true
-    dependencies:
-      '@types/express': 4.17.13
-      '@types/http-proxy': 1.17.9
-      http-proxy: 1.18.1
-      is-glob: 4.0.3
-      is-plain-obj: 3.0.0
-      micromatch: 4.0.5
-    transitivePeerDependencies:
-      - debug
-    dev: false
-
-  /http-proxy/1.18.1:
-    resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==}
-    engines: {node: '>=8.0.0'}
-    dependencies:
-      eventemitter3: 4.0.7
-      follow-redirects: 1.15.1
-      requires-port: 1.0.0
-    transitivePeerDependencies:
-      - debug
-    dev: false
-
-  /human-signals/2.1.0:
-    resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
-    engines: {node: '>=10.17.0'}
-
-  /iconv-lite/0.4.24:
-    resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      safer-buffer: 2.1.2
-    dev: false
-
-  /iconv-lite/0.6.3:
-    resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      safer-buffer: 2.1.2
-    dev: true
-
-  /icss-utils/5.1.0_postcss@8.4.14:
-    resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==}
-    engines: {node: ^10 || ^12 || >= 14}
-    peerDependencies:
-      postcss: ^8.1.0
-    dependencies:
-      postcss: 8.4.14
-    dev: false
-
-  /ieee754/1.2.1:
-    resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==}
-    dev: true
-
-  /ignore/5.2.0:
-    resolution: {integrity: sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==}
-    engines: {node: '>= 4'}
-
-  /image-size/1.0.2:
-    resolution: {integrity: sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==}
-    engines: {node: '>=14.0.0'}
-    hasBin: true
-    dependencies:
-      queue: 6.0.2
-    dev: false
-
-  /immer/9.0.15:
-    resolution: {integrity: sha512-2eB/sswms9AEUSkOm4SbV5Y7Vmt/bKRwByd52jfLkW4OLYeaTP3EEiJ9agqU0O/tq6Dk62Zfj+TJSqfm1rLVGQ==}
-    dev: false
-
-  /import-fresh/3.3.0:
-    resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
-    engines: {node: '>=6'}
-    dependencies:
-      parent-module: 1.0.1
-      resolve-from: 4.0.0
-
-  /import-lazy/2.1.0:
-    resolution: {integrity: sha512-m7ZEHgtw69qOGw+jwxXkHlrlIPdTGkyh66zXZ1ajZbxkDBNjSY/LGbmjc7h0s2ELsUDTAhFr55TrPSSqJGPG0A==}
-    engines: {node: '>=4'}
-    dev: false
-
-  /import-local/3.1.0:
-    resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==}
-    engines: {node: '>=8'}
-    hasBin: true
-    dependencies:
-      pkg-dir: 4.2.0
-      resolve-cwd: 3.0.0
-    dev: true
-
-  /imurmurhash/0.1.4:
-    resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
-    engines: {node: '>=0.8.19'}
-
-  /indent-string/4.0.0:
-    resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
-    engines: {node: '>=8'}
-    dev: false
-
-  /infima/0.2.0-alpha.42:
-    resolution: {integrity: sha512-ift8OXNbQQwtbIt6z16KnSWP7uJ/SysSMFI4F87MNRTicypfl4Pv3E2OGVv6N3nSZFJvA8imYulCBS64iyHYww==}
-    engines: {node: '>=12'}
-    dev: false
-
-  /inflight/1.0.6:
-    resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
-    dependencies:
-      once: 1.4.0
-      wrappy: 1.0.2
-
-  /inherits/2.0.3:
-    resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==}
-    dev: false
-
-  /inherits/2.0.4:
-    resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
-
-  /ini/1.3.8:
-    resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
-    dev: false
-
-  /ini/2.0.0:
-    resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==}
-    engines: {node: '>=10'}
-    dev: false
-
-  /inline-style-parser/0.1.1:
-    resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==}
-
-  /internal-slot/1.0.3:
-    resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      get-intrinsic: 1.1.2
-      has: 1.0.3
-      side-channel: 1.0.4
-    dev: true
-
-  /interpret/1.4.0:
-    resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==}
-    engines: {node: '>= 0.10'}
-    dev: false
-
-  /into-stream/3.1.0:
-    resolution: {integrity: sha512-TcdjPibTksa1NQximqep2r17ISRiNE9fwlfbg3F8ANdvP5/yrFTew86VcO//jk4QTaMlbjypPBq76HN2zaKfZQ==}
-    engines: {node: '>=4'}
-    dependencies:
-      from2: 2.3.0
-      p-is-promise: 1.1.0
-    dev: true
-
-  /invariant/2.2.4:
-    resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
-    dependencies:
-      loose-envify: 1.4.0
-    dev: false
-
-  /ipaddr.js/1.9.1:
-    resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==}
-    engines: {node: '>= 0.10'}
-    dev: false
-
-  /ipaddr.js/2.0.1:
-    resolution: {integrity: sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==}
-    engines: {node: '>= 10'}
-    dev: false
-
-  /is-accessor-descriptor/0.1.6:
-    resolution: {integrity: sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      kind-of: 3.2.2
-    dev: true
-
-  /is-accessor-descriptor/1.0.0:
-    resolution: {integrity: sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      kind-of: 6.0.3
-    dev: true
-
-  /is-alphabetical/1.0.4:
-    resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==}
-    dev: false
-
-  /is-alphabetical/2.0.1:
-    resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==}
-    dev: true
-
-  /is-alphanumerical/1.0.4:
-    resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==}
-    dependencies:
-      is-alphabetical: 1.0.4
-      is-decimal: 1.0.4
-    dev: false
-
-  /is-alphanumerical/2.0.1:
-    resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==}
-    dependencies:
-      is-alphabetical: 2.0.1
-      is-decimal: 2.0.1
-    dev: true
-
-  /is-arrayish/0.2.1:
-    resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
-
-  /is-bigint/1.0.4:
-    resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
-    dependencies:
-      has-bigints: 1.0.2
-    dev: true
-
-  /is-binary-path/2.1.0:
-    resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
-    engines: {node: '>=8'}
-    dependencies:
-      binary-extensions: 2.2.0
-    dev: false
-
-  /is-boolean-object/1.1.2:
-    resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      has-tostringtag: 1.0.0
-    dev: true
-
-  /is-buffer/1.1.6:
-    resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==}
-    dev: true
-
-  /is-buffer/2.0.5:
-    resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==}
-    engines: {node: '>=4'}
-
-  /is-callable/1.2.4:
-    resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==}
-    engines: {node: '>= 0.4'}
-    dev: true
-
-  /is-ci/2.0.0:
-    resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==}
-    hasBin: true
-    dependencies:
-      ci-info: 2.0.0
-    dev: false
-
-  /is-core-module/2.9.0:
-    resolution: {integrity: sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==}
-    dependencies:
-      has: 1.0.3
-
-  /is-data-descriptor/0.1.4:
-    resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      kind-of: 3.2.2
-    dev: true
-
-  /is-data-descriptor/1.0.0:
-    resolution: {integrity: sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      kind-of: 6.0.3
-    dev: true
-
-  /is-date-object/1.0.5:
-    resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      has-tostringtag: 1.0.0
-    dev: true
-
-  /is-decimal/1.0.4:
-    resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==}
-    dev: false
-
-  /is-decimal/2.0.1:
-    resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
-    dev: true
-
-  /is-descriptor/0.1.6:
-    resolution: {integrity: sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-accessor-descriptor: 0.1.6
-      is-data-descriptor: 0.1.4
-      kind-of: 5.1.0
-    dev: true
-
-  /is-descriptor/1.0.2:
-    resolution: {integrity: sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-accessor-descriptor: 1.0.0
-      is-data-descriptor: 1.0.0
-      kind-of: 6.0.3
-    dev: true
-
-  /is-docker/2.2.1:
-    resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
-    engines: {node: '>=8'}
-    hasBin: true
-    dev: false
-
-  /is-extendable/0.1.1:
-    resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==}
-    engines: {node: '>=0.10.0'}
-
-  /is-extendable/1.0.1:
-    resolution: {integrity: sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-plain-object: 2.0.4
-    dev: true
-
-  /is-extglob/2.1.1:
-    resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
-    engines: {node: '>=0.10.0'}
-
-  /is-fullwidth-code-point/3.0.0:
-    resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
-    engines: {node: '>=8'}
-
-  /is-generator-fn/2.1.0:
-    resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
-    engines: {node: '>=6'}
-    dev: true
-
-  /is-glob/4.0.3:
-    resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-extglob: 2.1.1
-
-  /is-hexadecimal/1.0.4:
-    resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==}
-    dev: false
-
-  /is-hexadecimal/2.0.1:
-    resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==}
-    dev: true
-
-  /is-installed-globally/0.4.0:
-    resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==}
-    engines: {node: '>=10'}
-    dependencies:
-      global-dirs: 3.0.0
-      is-path-inside: 3.0.3
-    dev: false
-
-  /is-natural-number/4.0.1:
-    resolution: {integrity: sha512-Y4LTamMe0DDQIIAlaer9eKebAlDSV6huy+TWhJVPlzZh2o4tRP5SQWFlLn5N0To4mDD22/qdOq+veo1cSISLgQ==}
-    dev: true
-
-  /is-negative-zero/2.0.2:
-    resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==}
-    engines: {node: '>= 0.4'}
-    dev: true
-
-  /is-npm/5.0.0:
-    resolution: {integrity: sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==}
-    engines: {node: '>=10'}
-    dev: false
-
-  /is-number-object/1.0.7:
-    resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      has-tostringtag: 1.0.0
-    dev: true
-
-  /is-number/3.0.0:
-    resolution: {integrity: sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      kind-of: 3.2.2
-    dev: true
-
-  /is-number/7.0.0:
-    resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
-    engines: {node: '>=0.12.0'}
-
-  /is-obj/1.0.1:
-    resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==}
-    engines: {node: '>=0.10.0'}
-    dev: false
-
-  /is-obj/2.0.0:
-    resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
-    engines: {node: '>=8'}
-    dev: false
-
-  /is-object/1.0.2:
-    resolution: {integrity: sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==}
-    dev: true
-
-  /is-path-cwd/2.2.0:
-    resolution: {integrity: sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==}
-    engines: {node: '>=6'}
-    dev: false
-
-  /is-path-inside/3.0.3:
-    resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
-    engines: {node: '>=8'}
-
-  /is-plain-obj/1.1.0:
-    resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /is-plain-obj/2.1.0:
-    resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==}
-    engines: {node: '>=8'}
-    dev: false
-
-  /is-plain-obj/3.0.0:
-    resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==}
-    engines: {node: '>=10'}
-    dev: false
-
-  /is-plain-obj/4.1.0:
-    resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
-    engines: {node: '>=12'}
-    dev: true
-
-  /is-plain-object/2.0.4:
-    resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      isobject: 3.0.1
-
-  /is-reference/3.0.0:
-    resolution: {integrity: sha512-Eo1W3wUoHWoCoVM4GVl/a+K0IgiqE5aIo4kJABFyMum1ZORlPkC+UC357sSQUL5w5QCE5kCC9upl75b7+7CY/Q==}
-    dependencies:
-      '@types/estree': 1.0.0
-    dev: true
-
-  /is-regex/1.1.4:
-    resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      has-tostringtag: 1.0.0
-    dev: true
-
-  /is-regexp/1.0.0:
-    resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==}
-    engines: {node: '>=0.10.0'}
-    dev: false
-
-  /is-retry-allowed/1.2.0:
-    resolution: {integrity: sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /is-root/2.1.0:
-    resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==}
-    engines: {node: '>=6'}
-    dev: false
-
-  /is-shared-array-buffer/1.0.2:
-    resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==}
-    dependencies:
-      call-bind: 1.0.2
-    dev: true
-
-  /is-stream/1.1.0:
-    resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /is-stream/2.0.1:
-    resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
-    engines: {node: '>=8'}
-
-  /is-string/1.0.7:
-    resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      has-tostringtag: 1.0.0
-    dev: true
-
-  /is-symbol/1.0.4:
-    resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      has-symbols: 1.0.3
-    dev: true
-
-  /is-typedarray/1.0.0:
-    resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==}
-    dev: false
-
-  /is-weakref/1.0.2:
-    resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
-    dependencies:
-      call-bind: 1.0.2
-    dev: true
-
-  /is-whitespace-character/1.0.4:
-    resolution: {integrity: sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==}
-    dev: false
-
-  /is-windows/1.0.2:
-    resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /is-word-character/1.0.4:
-    resolution: {integrity: sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==}
-    dev: false
-
-  /is-wsl/2.2.0:
-    resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
-    engines: {node: '>=8'}
-    dependencies:
-      is-docker: 2.2.1
-    dev: false
-
-  /is-yarn-global/0.3.0:
-    resolution: {integrity: sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==}
-    dev: false
-
-  /isarray/0.0.1:
-    resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==}
-    dev: false
-
-  /isarray/1.0.0:
-    resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
-
-  /isexe/2.0.0:
-    resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
-
-  /isobject/2.1.0:
-    resolution: {integrity: sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      isarray: 1.0.0
-    dev: true
-
-  /isobject/3.0.1:
-    resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==}
-    engines: {node: '>=0.10.0'}
-
-  /istanbul-lib-coverage/3.2.0:
-    resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==}
-    engines: {node: '>=8'}
-    dev: true
-
-  /istanbul-lib-instrument/5.2.0:
-    resolution: {integrity: sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==}
-    engines: {node: '>=8'}
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/parser': 7.20.3
-      '@istanbuljs/schema': 0.1.3
-      istanbul-lib-coverage: 3.2.0
-      semver: 6.3.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /istanbul-lib-report/3.0.0:
-    resolution: {integrity: sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==}
-    engines: {node: '>=8'}
-    dependencies:
-      istanbul-lib-coverage: 3.2.0
-      make-dir: 3.1.0
-      supports-color: 7.2.0
-    dev: true
-
-  /istanbul-lib-source-maps/4.0.1:
-    resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
-    engines: {node: '>=10'}
-    dependencies:
-      debug: 4.3.4
-      istanbul-lib-coverage: 3.2.0
-      source-map: 0.6.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /istanbul-reports/3.1.5:
-    resolution: {integrity: sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==}
-    engines: {node: '>=8'}
-    dependencies:
-      html-escaper: 2.0.2
-      istanbul-lib-report: 3.0.0
-    dev: true
-
-  /isurl/1.0.0:
-    resolution: {integrity: sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==}
-    engines: {node: '>= 4'}
-    dependencies:
-      has-to-string-tag-x: 1.4.1
-      is-object: 1.0.2
-    dev: true
-
-  /jest-changed-files/29.2.0:
-    resolution: {integrity: sha512-qPVmLLyBmvF5HJrY7krDisx6Voi8DmlV3GZYX0aFNbaQsZeoz1hfxcCMbqDGuQCxU1dJy9eYc2xscE8QrCCYaA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      execa: 5.1.1
-      p-limit: 3.1.0
-    dev: true
-
-  /jest-circus/29.3.1:
-    resolution: {integrity: sha512-wpr26sEvwb3qQQbdlmei+gzp6yoSSoSL6GsLPxnuayZSMrSd5Ka7IjAvatpIernBvT2+Ic6RLTg+jSebScmasg==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/environment': 29.3.1
-      '@jest/expect': 29.3.1
-      '@jest/test-result': 29.3.1
-      '@jest/types': 29.3.1
-      '@types/node': 18.11.9
-      chalk: 4.1.2
-      co: 4.6.0
-      dedent: 0.7.0
-      is-generator-fn: 2.1.0
-      jest-each: 29.3.1
-      jest-matcher-utils: 29.3.1
-      jest-message-util: 29.3.1
-      jest-runtime: 29.3.1
-      jest-snapshot: 29.3.1
-      jest-util: 29.3.1
-      p-limit: 3.1.0
-      pretty-format: 29.3.1
-      slash: 3.0.0
-      stack-utils: 2.0.5
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /jest-cli/29.3.1:
-    resolution: {integrity: sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    hasBin: true
-    peerDependencies:
-      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
-    peerDependenciesMeta:
-      node-notifier:
-        optional: true
-    dependencies:
-      '@jest/core': 29.3.1
-      '@jest/test-result': 29.3.1
-      '@jest/types': 29.3.1
-      chalk: 4.1.2
-      exit: 0.1.2
-      graceful-fs: 4.2.10
-      import-local: 3.1.0
-      jest-config: 29.3.1
-      jest-util: 29.3.1
-      jest-validate: 29.3.1
-      prompts: 2.4.2
-      yargs: 17.5.1
-    transitivePeerDependencies:
-      - '@types/node'
-      - supports-color
-      - ts-node
-    dev: true
-
-  /jest-cli/29.3.1_@types+node@18.11.9:
-    resolution: {integrity: sha512-TO/ewvwyvPOiBBuWZ0gm04z3WWP8TIK8acgPzE4IxgsLKQgb377NYGrQLc3Wl/7ndWzIH2CDNNsUjGxwLL43VQ==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    hasBin: true
-    peerDependencies:
-      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
-    peerDependenciesMeta:
-      node-notifier:
-        optional: true
-    dependencies:
-      '@jest/core': 29.3.1
-      '@jest/test-result': 29.3.1
-      '@jest/types': 29.3.1
-      chalk: 4.1.2
-      exit: 0.1.2
-      graceful-fs: 4.2.10
-      import-local: 3.1.0
-      jest-config: 29.3.1_@types+node@18.11.9
-      jest-util: 29.3.1
-      jest-validate: 29.3.1
-      prompts: 2.4.2
-      yargs: 17.5.1
-    transitivePeerDependencies:
-      - '@types/node'
-      - supports-color
-      - ts-node
-    dev: true
-
-  /jest-config/29.3.1:
-    resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    peerDependencies:
-      '@types/node': '*'
-      ts-node: '>=9.0.0'
-    peerDependenciesMeta:
-      '@types/node':
-        optional: true
-      ts-node:
-        optional: true
-    dependencies:
-      '@babel/core': 7.20.2
-      '@jest/test-sequencer': 29.3.1
-      '@jest/types': 29.3.1
-      babel-jest: 29.3.1_@babel+core@7.20.2
-      chalk: 4.1.2
-      ci-info: 3.3.2
-      deepmerge: 4.2.2
-      glob: 7.2.3
-      graceful-fs: 4.2.10
-      jest-circus: 29.3.1
-      jest-environment-node: 29.3.1
-      jest-get-type: 29.2.0
-      jest-regex-util: 29.2.0
-      jest-resolve: 29.3.1
-      jest-runner: 29.3.1
-      jest-util: 29.3.1
-      jest-validate: 29.3.1
-      micromatch: 4.0.5
-      parse-json: 5.2.0
-      pretty-format: 29.3.1
-      slash: 3.0.0
-      strip-json-comments: 3.1.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /jest-config/29.3.1_@types+node@18.11.9:
-    resolution: {integrity: sha512-y0tFHdj2WnTEhxmGUK1T7fgLen7YK4RtfvpLFBXfQkh2eMJAQq24Vx9472lvn5wg0MAO6B+iPfJfzdR9hJYalg==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    peerDependencies:
-      '@types/node': '*'
-      ts-node: '>=9.0.0'
-    peerDependenciesMeta:
-      '@types/node':
-        optional: true
-      ts-node:
-        optional: true
-    dependencies:
-      '@babel/core': 7.20.2
-      '@jest/test-sequencer': 29.3.1
-      '@jest/types': 29.3.1
-      '@types/node': 18.11.9
-      babel-jest: 29.3.1_@babel+core@7.20.2
-      chalk: 4.1.2
-      ci-info: 3.3.2
-      deepmerge: 4.2.2
-      glob: 7.2.3
-      graceful-fs: 4.2.10
-      jest-circus: 29.3.1
-      jest-environment-node: 29.3.1
-      jest-get-type: 29.2.0
-      jest-regex-util: 29.2.0
-      jest-resolve: 29.3.1
-      jest-runner: 29.3.1
-      jest-util: 29.3.1
-      jest-validate: 29.3.1
-      micromatch: 4.0.5
-      parse-json: 5.2.0
-      pretty-format: 29.3.1
-      slash: 3.0.0
-      strip-json-comments: 3.1.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /jest-diff/29.3.1:
-    resolution: {integrity: sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      chalk: 4.1.2
-      diff-sequences: 29.3.1
-      jest-get-type: 29.2.0
-      pretty-format: 29.3.1
-    dev: true
-
-  /jest-docblock/29.2.0:
-    resolution: {integrity: sha512-bkxUsxTgWQGbXV5IENmfiIuqZhJcyvF7tU4zJ/7ioTutdz4ToB5Yx6JOFBpgI+TphRY4lhOyCWGNH/QFQh5T6A==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      detect-newline: 3.1.0
-    dev: true
-
-  /jest-each/29.3.1:
-    resolution: {integrity: sha512-qrZH7PmFB9rEzCSl00BWjZYuS1BSOH8lLuC0azQE9lQrAx3PWGKHTDudQiOSwIy5dGAJh7KA0ScYlCP7JxvFYA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/types': 29.3.1
-      chalk: 4.1.2
-      jest-get-type: 29.2.0
-      jest-util: 29.3.1
-      pretty-format: 29.3.1
-    dev: true
-
-  /jest-environment-node/29.3.1:
-    resolution: {integrity: sha512-xm2THL18Xf5sIHoU7OThBPtuH6Lerd+Y1NLYiZJlkE3hbE+7N7r8uvHIl/FkZ5ymKXJe/11SQuf3fv4v6rUMag==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/environment': 29.3.1
-      '@jest/fake-timers': 29.3.1
-      '@jest/types': 29.3.1
-      '@types/node': 18.11.9
-      jest-mock: 29.3.1
-      jest-util: 29.3.1
-    dev: true
-
-  /jest-get-type/29.2.0:
-    resolution: {integrity: sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dev: true
-
-  /jest-haste-map/29.3.1:
-    resolution: {integrity: sha512-/FFtvoG1xjbbPXQLFef+WSU4yrc0fc0Dds6aRPBojUid7qlPqZvxdUBA03HW0fnVHXVCnCdkuoghYItKNzc/0A==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/types': 29.3.1
-      '@types/graceful-fs': 4.1.5
-      '@types/node': 18.11.9
-      anymatch: 3.1.2
-      fb-watchman: 2.0.1
-      graceful-fs: 4.2.10
-      jest-regex-util: 29.2.0
-      jest-util: 29.3.1
-      jest-worker: 29.3.1
-      micromatch: 4.0.5
-      walker: 1.0.8
-    optionalDependencies:
-      fsevents: 2.3.2
-    dev: true
-
-  /jest-leak-detector/29.3.1:
-    resolution: {integrity: sha512-3DA/VVXj4zFOPagGkuqHnSQf1GZBmmlagpguxEERO6Pla2g84Q1MaVIB3YMxgUaFIaYag8ZnTyQgiZ35YEqAQA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      jest-get-type: 29.2.0
-      pretty-format: 29.3.1
-    dev: true
-
-  /jest-matcher-utils/29.3.1:
-    resolution: {integrity: sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      chalk: 4.1.2
-      jest-diff: 29.3.1
-      jest-get-type: 29.2.0
-      pretty-format: 29.3.1
-    dev: true
-
-  /jest-message-util/29.3.1:
-    resolution: {integrity: sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@babel/code-frame': 7.18.6
-      '@jest/types': 29.3.1
-      '@types/stack-utils': 2.0.1
-      chalk: 4.1.2
-      graceful-fs: 4.2.10
-      micromatch: 4.0.5
-      pretty-format: 29.3.1
-      slash: 3.0.0
-      stack-utils: 2.0.5
-    dev: true
-
-  /jest-mock/29.3.1:
-    resolution: {integrity: sha512-H8/qFDtDVMFvFP4X8NuOT3XRDzOUTz+FeACjufHzsOIBAxivLqkB1PoLCaJx9iPPQ8dZThHPp/G3WRWyMgA3JA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/types': 29.3.1
-      '@types/node': 18.11.9
-      jest-util: 29.3.1
-    dev: true
-
-  /jest-pnp-resolver/1.2.2_jest-resolve@29.3.1:
-    resolution: {integrity: sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==}
-    engines: {node: '>=6'}
-    peerDependencies:
-      jest-resolve: '*'
-    peerDependenciesMeta:
-      jest-resolve:
-        optional: true
-    dependencies:
-      jest-resolve: 29.3.1
-    dev: true
-
-  /jest-regex-util/29.2.0:
-    resolution: {integrity: sha512-6yXn0kg2JXzH30cr2NlThF+70iuO/3irbaB4mh5WyqNIvLLP+B6sFdluO1/1RJmslyh/f9osnefECflHvTbwVA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dev: true
-
-  /jest-resolve-dependencies/29.3.1:
-    resolution: {integrity: sha512-Vk0cYq0byRw2WluNmNWGqPeRnZ3p3hHmjJMp2dyyZeYIfiBskwq4rpiuGFR6QGAdbj58WC7HN4hQHjf2mpvrLA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      jest-regex-util: 29.2.0
-      jest-snapshot: 29.3.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /jest-resolve/29.3.1:
-    resolution: {integrity: sha512-amXJgH/Ng712w3Uz5gqzFBBjxV8WFLSmNjoreBGMqxgCz5cH7swmBZzgBaCIOsvb0NbpJ0vgaSFdJqMdT+rADw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      chalk: 4.1.2
-      graceful-fs: 4.2.10
-      jest-haste-map: 29.3.1
-      jest-pnp-resolver: 1.2.2_jest-resolve@29.3.1
-      jest-util: 29.3.1
-      jest-validate: 29.3.1
-      resolve: 1.22.1
-      resolve.exports: 1.1.0
-      slash: 3.0.0
-    dev: true
-
-  /jest-runner/29.3.1:
-    resolution: {integrity: sha512-oFvcwRNrKMtE6u9+AQPMATxFcTySyKfLhvso7Sdk/rNpbhg4g2GAGCopiInk1OP4q6gz3n6MajW4+fnHWlU3bA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/console': 29.3.1
-      '@jest/environment': 29.3.1
-      '@jest/test-result': 29.3.1
-      '@jest/transform': 29.3.1
-      '@jest/types': 29.3.1
-      '@types/node': 18.11.9
-      chalk: 4.1.2
-      emittery: 0.13.1
-      graceful-fs: 4.2.10
-      jest-docblock: 29.2.0
-      jest-environment-node: 29.3.1
-      jest-haste-map: 29.3.1
-      jest-leak-detector: 29.3.1
-      jest-message-util: 29.3.1
-      jest-resolve: 29.3.1
-      jest-runtime: 29.3.1
-      jest-util: 29.3.1
-      jest-watcher: 29.3.1
-      jest-worker: 29.3.1
-      p-limit: 3.1.0
-      source-map-support: 0.5.13
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /jest-runtime/29.3.1:
-    resolution: {integrity: sha512-jLzkIxIqXwBEOZx7wx9OO9sxoZmgT2NhmQKzHQm1xwR1kNW/dn0OjxR424VwHHf1SPN6Qwlb5pp1oGCeFTQ62A==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/environment': 29.3.1
-      '@jest/fake-timers': 29.3.1
-      '@jest/globals': 29.3.1
-      '@jest/source-map': 29.2.0
-      '@jest/test-result': 29.3.1
-      '@jest/transform': 29.3.1
-      '@jest/types': 29.3.1
-      '@types/node': 18.11.9
-      chalk: 4.1.2
-      cjs-module-lexer: 1.2.2
-      collect-v8-coverage: 1.0.1
-      glob: 7.2.3
-      graceful-fs: 4.2.10
-      jest-haste-map: 29.3.1
-      jest-message-util: 29.3.1
-      jest-mock: 29.3.1
-      jest-regex-util: 29.2.0
-      jest-resolve: 29.3.1
-      jest-snapshot: 29.3.1
-      jest-util: 29.3.1
-      slash: 3.0.0
-      strip-bom: 4.0.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /jest-snapshot/29.3.1:
-    resolution: {integrity: sha512-+3JOc+s28upYLI2OJM4PWRGK9AgpsMs/ekNryUV0yMBClT9B1DF2u2qay8YxcQd338PPYSFNb0lsar1B49sLDA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@babel/core': 7.20.2
-      '@babel/generator': 7.20.4
-      '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.20.2
-      '@babel/plugin-syntax-typescript': 7.18.6_@babel+core@7.20.2
-      '@babel/traverse': 7.20.1
-      '@babel/types': 7.20.2
-      '@jest/expect-utils': 29.3.1
-      '@jest/transform': 29.3.1
-      '@jest/types': 29.3.1
-      '@types/babel__traverse': 7.17.1
-      '@types/prettier': 2.6.3
-      babel-preset-current-node-syntax: 1.0.1_@babel+core@7.20.2
-      chalk: 4.1.2
-      expect: 29.3.1
-      graceful-fs: 4.2.10
-      jest-diff: 29.3.1
-      jest-get-type: 29.2.0
-      jest-haste-map: 29.3.1
-      jest-matcher-utils: 29.3.1
-      jest-message-util: 29.3.1
-      jest-util: 29.3.1
-      natural-compare: 1.4.0
-      pretty-format: 29.3.1
-      semver: 7.3.7
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /jest-util/29.3.1:
-    resolution: {integrity: sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/types': 29.3.1
-      '@types/node': 18.11.9
-      chalk: 4.1.2
-      ci-info: 3.3.2
-      graceful-fs: 4.2.10
-      picomatch: 2.3.1
-    dev: true
-
-  /jest-validate/29.3.1:
-    resolution: {integrity: sha512-N9Lr3oYR2Mpzuelp1F8negJR3YE+L1ebk1rYA5qYo9TTY3f9OWdptLoNSPP9itOCBIRBqjt/S5XHlzYglLN67g==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/types': 29.3.1
-      camelcase: 6.3.0
-      chalk: 4.1.2
-      jest-get-type: 29.2.0
-      leven: 3.1.0
-      pretty-format: 29.3.1
-    dev: true
-
-  /jest-watcher/29.3.1:
-    resolution: {integrity: sha512-RspXG2BQFDsZSRKGCT/NiNa8RkQ1iKAjrO0//soTMWx/QUt+OcxMqMSBxz23PYGqUuWm2+m2mNNsmj0eIoOaFg==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/test-result': 29.3.1
-      '@jest/types': 29.3.1
-      '@types/node': 18.11.9
-      ansi-escapes: 4.3.2
-      chalk: 4.1.2
-      emittery: 0.13.1
-      jest-util: 29.3.1
-      string-length: 4.0.2
-    dev: true
-
-  /jest-worker/27.5.1:
-    resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
-    engines: {node: '>= 10.13.0'}
-    dependencies:
-      '@types/node': 18.11.9
-      merge-stream: 2.0.0
-      supports-color: 8.1.1
-    dev: false
-
-  /jest-worker/29.3.1:
-    resolution: {integrity: sha512-lY4AnnmsEWeiXirAIA0c9SDPbuCBq8IYuDVL8PMm0MZ2PEs2yPvRA/J64QBXuZp7CYKrDM/rmNrc9/i3KJQncw==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@types/node': 18.11.9
-      jest-util: 29.3.1
-      merge-stream: 2.0.0
-      supports-color: 8.1.1
-    dev: true
-
-  /jest/29.3.1:
-    resolution: {integrity: sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    hasBin: true
-    peerDependencies:
-      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
-    peerDependenciesMeta:
-      node-notifier:
-        optional: true
-    dependencies:
-      '@jest/core': 29.3.1
-      '@jest/types': 29.3.1
-      import-local: 3.1.0
-      jest-cli: 29.3.1
-    transitivePeerDependencies:
-      - '@types/node'
-      - supports-color
-      - ts-node
-    dev: true
-
-  /jest/29.3.1_@types+node@18.11.9:
-    resolution: {integrity: sha512-6iWfL5DTT0Np6UYs/y5Niu7WIfNv/wRTtN5RSXt2DIEft3dx3zPuw/3WJQBCJfmEzvDiEKwoqMbGD9n49+qLSA==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    hasBin: true
-    peerDependencies:
-      node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0
-    peerDependenciesMeta:
-      node-notifier:
-        optional: true
-    dependencies:
-      '@jest/core': 29.3.1
-      '@jest/types': 29.3.1
-      import-local: 3.1.0
-      jest-cli: 29.3.1_@types+node@18.11.9
-    transitivePeerDependencies:
-      - '@types/node'
-      - supports-color
-      - ts-node
-    dev: true
-
-  /joi/17.6.0:
-    resolution: {integrity: sha512-OX5dG6DTbcr/kbMFj0KGYxuew69HPcAE3K/sZpEV2nP6e/j/C0HV+HNiBPCASxdx5T7DMoa0s8UeHWMnb6n2zw==}
-    dependencies:
-      '@hapi/hoek': 9.3.0
-      '@hapi/topo': 5.1.0
-      '@sideway/address': 4.1.4
-      '@sideway/formula': 3.0.0
-      '@sideway/pinpoint': 2.0.0
-    dev: false
-
-  /js-sdsl/4.1.5:
-    resolution: {integrity: sha512-08bOAKweV2NUC1wqTtf3qZlnpOX/R2DU9ikpjOHs0H+ibQv3zpncVQg6um4uYtRtrwIX8M4Nh3ytK4HGlYAq7Q==}
-    dev: true
-
-  /js-tokens/4.0.0:
-    resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
-
-  /js-yaml/3.14.1:
-    resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
-    hasBin: true
-    dependencies:
-      argparse: 1.0.10
-      esprima: 4.0.1
-
-  /js-yaml/4.1.0:
-    resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
-    hasBin: true
-    dependencies:
-      argparse: 2.0.1
-
-  /jsesc/0.5.0:
-    resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==}
-    hasBin: true
-    dev: false
-
-  /jsesc/2.5.2:
-    resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
-    engines: {node: '>=4'}
-    hasBin: true
-
-  /json-buffer/3.0.0:
-    resolution: {integrity: sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=}
-
-  /json-parse-even-better-errors/2.3.1:
-    resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
-
-  /json-schema-traverse/0.4.1:
-    resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
-
-  /json-schema-traverse/1.0.0:
-    resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
-    dev: false
-
-  /json-stable-stringify-without-jsonify/1.0.1:
-    resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
-    dev: true
-
-  /json5/1.0.1:
-    resolution: {integrity: sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==}
-    hasBin: true
-    dependencies:
-      minimist: 1.2.6
-    dev: true
-
-  /json5/2.2.1:
-    resolution: {integrity: sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==}
-    engines: {node: '>=6'}
-    hasBin: true
-
-  /jsonfile/6.1.0:
-    resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==}
-    dependencies:
-      universalify: 2.0.0
-    optionalDependencies:
-      graceful-fs: 4.2.10
-    dev: false
-
-  /jsx-ast-utils/3.3.2:
-    resolution: {integrity: sha512-4ZCADZHRkno244xlNnn4AOG6sRQ7iBZ5BbgZ4vW4y5IZw7cVUD1PPeblm1xx/nfmMxPdt/LHsXZW8z/j58+l9Q==}
-    engines: {node: '>=4.0'}
-    dependencies:
-      array-includes: 3.1.5
-      object.assign: 4.1.2
-    dev: true
-
-  /keyv/3.0.0:
-    resolution: {integrity: sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==}
-    dependencies:
-      json-buffer: 3.0.0
-    dev: true
-
-  /keyv/3.1.0:
-    resolution: {integrity: sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==}
-    dependencies:
-      json-buffer: 3.0.0
-    dev: false
-
-  /kind-of/3.2.2:
-    resolution: {integrity: sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-buffer: 1.1.6
-    dev: true
-
-  /kind-of/4.0.0:
-    resolution: {integrity: sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-buffer: 1.1.6
-    dev: true
-
-  /kind-of/5.1.0:
-    resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /kind-of/6.0.3:
-    resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
-    engines: {node: '>=0.10.0'}
-
-  /kleur/3.0.3:
-    resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==}
-    engines: {node: '>=6'}
-
-  /kleur/4.1.5:
-    resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
-    engines: {node: '>=6'}
-    dev: true
-
-  /klona/2.0.5:
-    resolution: {integrity: sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==}
-    engines: {node: '>= 8'}
-    dev: false
-
-  /language-subtag-registry/0.3.22:
-    resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==}
-    dev: true
-
-  /language-tags/1.0.5:
-    resolution: {integrity: sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==}
-    dependencies:
-      language-subtag-registry: 0.3.22
-    dev: true
-
-  /latest-version/5.1.0:
-    resolution: {integrity: sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==}
-    engines: {node: '>=8'}
-    dependencies:
-      package-json: 6.5.0
-    dev: false
-
-  /leven/3.1.0:
-    resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
-    engines: {node: '>=6'}
-
-  /levn/0.4.1:
-    resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
-    engines: {node: '>= 0.8.0'}
-    dependencies:
-      prelude-ls: 1.2.1
-      type-check: 0.4.0
-    dev: true
-
-  /lilconfig/2.0.6:
-    resolution: {integrity: sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==}
-    engines: {node: '>=10'}
-    dev: false
-
-  /lines-and-columns/1.2.4:
-    resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
-
-  /loader-runner/4.3.0:
-    resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==}
-    engines: {node: '>=6.11.5'}
-    dev: false
-
-  /loader-utils/1.4.2:
-    resolution: {integrity: sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==}
-    engines: {node: '>=4.0.0'}
-    dependencies:
-      big.js: 5.2.2
-      emojis-list: 3.0.0
-      json5: 1.0.1
-    dev: true
-
-  /loader-utils/2.0.2:
-    resolution: {integrity: sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==}
-    engines: {node: '>=8.9.0'}
-    dependencies:
-      big.js: 5.2.2
-      emojis-list: 3.0.0
-      json5: 2.2.1
-    dev: false
-
-  /loader-utils/3.2.0:
-    resolution: {integrity: sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==}
-    engines: {node: '>= 12.13.0'}
-    dev: false
-
-  /locate-path/2.0.0:
-    resolution: {integrity: sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==}
-    engines: {node: '>=4'}
-    dependencies:
-      p-locate: 2.0.0
-      path-exists: 3.0.0
-    dev: true
-
-  /locate-path/3.0.0:
-    resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
-    engines: {node: '>=6'}
-    dependencies:
-      p-locate: 3.0.0
-      path-exists: 3.0.0
-    dev: false
-
-  /locate-path/5.0.0:
-    resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
-    engines: {node: '>=8'}
-    dependencies:
-      p-locate: 4.1.0
-
-  /locate-path/6.0.0:
-    resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
-    engines: {node: '>=10'}
-    dependencies:
-      p-locate: 5.0.0
-
-  /lodash.curry/4.1.1:
-    resolution: {integrity: sha512-/u14pXGviLaweY5JI0IUzgzF2J6Ne8INyzAZjImcryjgkZ+ebruBxy2/JaOOkTqScddcYtakjhSaeemV8lR0tA==}
-    dev: false
-
-  /lodash.debounce/4.0.8:
-    resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==}
-    dev: false
-
-  /lodash.flow/3.5.0:
-    resolution: {integrity: sha512-ff3BX/tSioo+XojX4MOsOMhJw0nZoUEF011LX8g8d3gvjVbxd89cCio4BCXronjxcTUIJUoqKEUA+n4CqvvRPw==}
-    dev: false
-
-  /lodash.memoize/4.1.2:
-    resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==}
-
-  /lodash.merge/4.6.2:
-    resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
-    dev: true
-
-  /lodash.uniq/4.5.0:
-    resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
-    dev: false
-
-  /lodash/4.17.21:
-    resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
-
-  /longest-streak/3.0.1:
-    resolution: {integrity: sha512-cHlYSUpL2s7Fb3394mYxwTYj8niTaNHUCLr0qdiCXQfSjfuA7CKofpX2uSwEfFDQ0EB7JcnMnm+GjbqqoinYYg==}
-    dev: true
-
-  /loose-envify/1.4.0:
-    resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
-    hasBin: true
-    dependencies:
-      js-tokens: 4.0.0
-
-  /lower-case/2.0.2:
-    resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==}
-    dependencies:
-      tslib: 2.4.1
-    dev: false
-
-  /lowercase-keys/1.0.0:
-    resolution: {integrity: sha512-RPlX0+PHuvxVDZ7xX+EBVAp4RsVxP/TdDSN2mJYdiq1Lc4Hz7EUSjUI7RZrKKlmrIzVhf6Jo2stj7++gVarS0A==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /lowercase-keys/1.0.1:
-    resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==}
-    engines: {node: '>=0.10.0'}
-
-  /lowercase-keys/2.0.0:
-    resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==}
-    engines: {node: '>=8'}
-    dev: false
-
-  /lru-cache/6.0.0:
-    resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
-    engines: {node: '>=10'}
-    dependencies:
-      yallist: 4.0.0
-
-  /make-dir/1.3.0:
-    resolution: {integrity: sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==}
-    engines: {node: '>=4'}
-    dependencies:
-      pify: 3.0.0
-    dev: true
-
-  /make-dir/2.1.0:
-    resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
-    engines: {node: '>=6'}
-    dependencies:
-      pify: 4.0.1
-      semver: 5.7.1
-    dev: true
-
-  /make-dir/3.1.0:
-    resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
-    engines: {node: '>=8'}
-    dependencies:
-      semver: 6.3.0
-
-  /make-error/1.3.6:
-    resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==}
-    dev: true
-
-  /makeerror/1.0.12:
-    resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
-    dependencies:
-      tmpl: 1.0.5
-    dev: true
-
-  /map-cache/0.2.2:
-    resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /map-visit/1.0.0:
-    resolution: {integrity: sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      object-visit: 1.0.1
-    dev: true
-
-  /markdown-escapes/1.0.4:
-    resolution: {integrity: sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==}
-    dev: false
-
-  /markdown-extensions/1.1.1:
-    resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /mdast-squeeze-paragraphs/4.0.0:
-    resolution: {integrity: sha512-zxdPn69hkQ1rm4J+2Cs2j6wDEv7O17TfXTJ33tl/+JPIoEmtV9t2ZzBM5LPHE8QlHsmVD8t3vPKCyY3oH+H8MQ==}
-    dependencies:
-      unist-util-remove: 2.1.0
-    dev: false
-
-  /mdast-util-definitions/4.0.0:
-    resolution: {integrity: sha512-k8AJ6aNnUkB7IE+5azR9h81O5EQ/cTDXtWdMq9Kk5KcEW/8ritU5CeLg/9HhOC++nALHBlaogJ5jz0Ybk3kPMQ==}
-    dependencies:
-      unist-util-visit: 2.0.3
-    dev: false
-
-  /mdast-util-definitions/5.1.1:
-    resolution: {integrity: sha512-rQ+Gv7mHttxHOBx2dkF4HWTg+EE+UR78ptQWDylzPKaQuVGdG4HIoY3SrS/pCp80nZ04greFvXbVFHT+uf0JVQ==}
-    dependencies:
-      '@types/mdast': 3.0.10
-      '@types/unist': 2.0.6
-      unist-util-visit: 4.1.0
-    dev: true
-
-  /mdast-util-from-markdown/1.2.0:
-    resolution: {integrity: sha512-iZJyyvKD1+K7QX1b5jXdE7Sc5dtoTry1vzV28UZZe8Z1xVnB/czKntJ7ZAkG0tANqRnBF6p3p7GpU1y19DTf2Q==}
-    dependencies:
-      '@types/mdast': 3.0.10
-      '@types/unist': 2.0.6
-      decode-named-character-reference: 1.0.2
-      mdast-util-to-string: 3.1.0
-      micromark: 3.0.10
-      micromark-util-decode-numeric-character-reference: 1.0.0
-      micromark-util-decode-string: 1.0.2
-      micromark-util-normalize-identifier: 1.0.0
-      micromark-util-symbol: 1.0.1
-      micromark-util-types: 1.0.2
-      unist-util-stringify-position: 3.0.2
-      uvu: 0.5.6
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /mdast-util-mdx-expression/1.2.1:
-    resolution: {integrity: sha512-BtQwyalaq6jRjx0pagtuAwGrmzL1yInrfA4EJv7GOoiPOUbR4gr6h65I+G3WTh1/Cag2Eda4ip400Ch6CFmWiA==}
-    dependencies:
-      '@types/estree-jsx': 0.0.1
-      '@types/hast': 2.3.4
-      '@types/mdast': 3.0.10
-      mdast-util-from-markdown: 1.2.0
-      mdast-util-to-markdown: 1.3.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /mdast-util-mdx-jsx/2.0.2:
-    resolution: {integrity: sha512-Bs1HnFprSJW0al1h49ZQBaLfwROFEY3SLK98xWsA60fVhe6zEbPS8gVYxkuT07TeEZWIbkjyFYXkZ34ARxfYNQ==}
-    dependencies:
-      '@types/estree-jsx': 0.0.1
-      '@types/hast': 2.3.4
-      '@types/mdast': 3.0.10
-      ccount: 2.0.1
-      mdast-util-to-markdown: 1.3.0
-      parse-entities: 4.0.0
-      stringify-entities: 4.0.3
-      unist-util-remove-position: 4.0.1
-      unist-util-stringify-position: 3.0.2
-      vfile-message: 3.1.2
-    dev: true
-
-  /mdast-util-mdx/2.0.0:
-    resolution: {integrity: sha512-M09lW0CcBT1VrJUaF/PYxemxxHa7SLDHdSn94Q9FhxjCQfuW7nMAWKWimTmA3OyDMSTH981NN1csW1X+HPSluw==}
-    dependencies:
-      mdast-util-mdx-expression: 1.2.1
-      mdast-util-mdx-jsx: 2.0.2
-      mdast-util-mdxjs-esm: 1.2.1
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /mdast-util-mdxjs-esm/1.2.1:
-    resolution: {integrity: sha512-3zNmTy1V1OgIxoV97PTkAl+tLriilS8d4CJwPV9LvBmWra5nnRriN8rpGSGGIM7NLoHfsUfvjcPoNIzl77F8Kw==}
-    dependencies:
-      '@types/estree-jsx': 0.0.1
-      '@types/hast': 2.3.4
-      '@types/mdast': 3.0.10
-      mdast-util-from-markdown: 1.2.0
-      mdast-util-to-markdown: 1.3.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /mdast-util-to-hast/10.0.1:
-    resolution: {integrity: sha512-BW3LM9SEMnjf4HXXVApZMt8gLQWVNXc3jryK0nJu/rOXPOnlkUjmdkDlmxMirpbU9ILncGFIwLH/ubnWBbcdgA==}
-    dependencies:
-      '@types/mdast': 3.0.10
-      '@types/unist': 2.0.6
-      mdast-util-definitions: 4.0.0
-      mdurl: 1.0.1
-      unist-builder: 2.0.3
-      unist-util-generated: 1.1.6
-      unist-util-position: 3.1.0
-      unist-util-visit: 2.0.3
-    dev: false
-
-  /mdast-util-to-hast/12.1.2:
-    resolution: {integrity: sha512-Wn6Mcj04qU4qUXHnHpPATYMH2Jd8RlntdnloDfYLe1ErWRHo6+pvSl/DzHp6sCZ9cBSYlc8Sk8pbwb8xtUoQhQ==}
-    dependencies:
-      '@types/hast': 2.3.4
-      '@types/mdast': 3.0.10
-      '@types/mdurl': 1.0.2
-      mdast-util-definitions: 5.1.1
-      mdurl: 1.0.1
-      micromark-util-sanitize-uri: 1.0.0
-      trim-lines: 3.0.1
-      unist-builder: 3.0.0
-      unist-util-generated: 2.0.0
-      unist-util-position: 4.0.3
-      unist-util-visit: 4.1.0
-    dev: true
-
-  /mdast-util-to-markdown/1.3.0:
-    resolution: {integrity: sha512-6tUSs4r+KK4JGTTiQ7FfHmVOaDrLQJPmpjD6wPMlHGUVXoG9Vjc3jIeP+uyBWRf8clwB2blM+W7+KrlMYQnftA==}
-    dependencies:
-      '@types/mdast': 3.0.10
-      '@types/unist': 2.0.6
-      longest-streak: 3.0.1
-      mdast-util-to-string: 3.1.0
-      micromark-util-decode-string: 1.0.2
-      unist-util-visit: 4.1.0
-      zwitch: 2.0.2
-    dev: true
-
-  /mdast-util-to-string/2.0.0:
-    resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==}
-    dev: false
-
-  /mdast-util-to-string/3.1.0:
-    resolution: {integrity: sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==}
-    dev: true
-
-  /mdn-data/2.0.14:
-    resolution: {integrity: sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==}
-    dev: false
-
-  /mdurl/1.0.1:
-    resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==}
-
-  /media-typer/0.3.0:
-    resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=}
-    engines: {node: '>= 0.6'}
-    dev: false
-
-  /memfs/3.4.7:
-    resolution: {integrity: sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==}
-    engines: {node: '>= 4.0.0'}
-    dependencies:
-      fs-monkey: 1.0.3
-    dev: false
-
-  /memory-fs/0.4.1:
-    resolution: {integrity: sha512-cda4JKCxReDXFXRqOHPQscuIYg1PvxbE2S2GP45rnwfEK+vZaXC8C1OFvdHIbgw0DLzowXGVoxLaAmlgRy14GQ==}
-    dependencies:
-      errno: 0.1.8
-      readable-stream: 2.3.7
-    dev: true
-
-  /merge-descriptors/1.0.1:
-    resolution: {integrity: sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=}
-    dev: false
-
-  /merge-stream/2.0.0:
-    resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
-
-  /merge2/1.4.1:
-    resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
-    engines: {node: '>= 8'}
-
-  /methods/1.1.2:
-    resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==}
-    engines: {node: '>= 0.6'}
-    dev: false
-
-  /micromark-core-commonmark/1.0.6:
-    resolution: {integrity: sha512-K+PkJTxqjFfSNkfAhp4GB+cZPfQd6dxtTXnf+RjZOV7T4EEXnvgzOcnp+eSTmpGk9d1S9sL6/lqrgSNn/s0HZA==}
-    dependencies:
-      decode-named-character-reference: 1.0.2
-      micromark-factory-destination: 1.0.0
-      micromark-factory-label: 1.0.2
-      micromark-factory-space: 1.0.0
-      micromark-factory-title: 1.0.2
-      micromark-factory-whitespace: 1.0.0
-      micromark-util-character: 1.1.0
-      micromark-util-chunked: 1.0.0
-      micromark-util-classify-character: 1.0.0
-      micromark-util-html-tag-name: 1.1.0
-      micromark-util-normalize-identifier: 1.0.0
-      micromark-util-resolve-all: 1.0.0
-      micromark-util-subtokenize: 1.0.2
-      micromark-util-symbol: 1.0.1
-      micromark-util-types: 1.0.2
-      uvu: 0.5.6
-    dev: true
-
-  /micromark-extension-mdx-expression/1.0.3:
-    resolution: {integrity: sha512-TjYtjEMszWze51NJCZmhv7MEBcgYRgb3tJeMAJ+HQCAaZHHRBaDCccqQzGizR/H4ODefP44wRTgOn2vE5I6nZA==}
-    dependencies:
-      micromark-factory-mdx-expression: 1.0.6
-      micromark-factory-space: 1.0.0
-      micromark-util-character: 1.1.0
-      micromark-util-events-to-acorn: 1.1.0
-      micromark-util-symbol: 1.0.1
-      micromark-util-types: 1.0.2
-      uvu: 0.5.6
-    dev: true
-
-  /micromark-extension-mdx-jsx/1.0.3:
-    resolution: {integrity: sha512-VfA369RdqUISF0qGgv2FfV7gGjHDfn9+Qfiv5hEwpyr1xscRj/CiVRkU7rywGFCO7JwJ5L0e7CJz60lY52+qOA==}
-    dependencies:
-      '@types/acorn': 4.0.6
-      estree-util-is-identifier-name: 2.0.1
-      micromark-factory-mdx-expression: 1.0.6
-      micromark-factory-space: 1.0.0
-      micromark-util-character: 1.1.0
-      micromark-util-symbol: 1.0.1
-      micromark-util-types: 1.0.2
-      uvu: 0.5.6
-      vfile-message: 3.1.2
-    dev: true
-
-  /micromark-extension-mdx-md/1.0.0:
-    resolution: {integrity: sha512-xaRAMoSkKdqZXDAoSgp20Azm0aRQKGOl0RrS81yGu8Hr/JhMsBmfs4wR7m9kgVUIO36cMUQjNyiyDKPrsv8gOw==}
-    dependencies:
-      micromark-util-types: 1.0.2
-    dev: true
-
-  /micromark-extension-mdxjs-esm/1.0.3:
-    resolution: {integrity: sha512-2N13ol4KMoxb85rdDwTAC6uzs8lMX0zeqpcyx7FhS7PxXomOnLactu8WI8iBNXW8AVyea3KIJd/1CKnUmwrK9A==}
-    dependencies:
-      micromark-core-commonmark: 1.0.6
-      micromark-util-character: 1.1.0
-      micromark-util-events-to-acorn: 1.1.0
-      micromark-util-symbol: 1.0.1
-      micromark-util-types: 1.0.2
-      unist-util-position-from-estree: 1.1.1
-      uvu: 0.5.6
-      vfile-message: 3.1.2
-    dev: true
-
-  /micromark-extension-mdxjs/1.0.0:
-    resolution: {integrity: sha512-TZZRZgeHvtgm+IhtgC2+uDMR7h8eTKF0QUX9YsgoL9+bADBpBY6SiLvWqnBlLbCEevITmTqmEuY3FoxMKVs1rQ==}
-    dependencies:
-      acorn: 8.7.1
-      acorn-jsx: 5.3.2_acorn@8.7.1
-      micromark-extension-mdx-expression: 1.0.3
-      micromark-extension-mdx-jsx: 1.0.3
-      micromark-extension-mdx-md: 1.0.0
-      micromark-extension-mdxjs-esm: 1.0.3
-      micromark-util-combine-extensions: 1.0.0
-      micromark-util-types: 1.0.2
-    dev: true
-
-  /micromark-factory-destination/1.0.0:
-    resolution: {integrity: sha512-eUBA7Rs1/xtTVun9TmV3gjfPz2wEwgK5R5xcbIM5ZYAtvGF6JkyaDsj0agx8urXnO31tEO6Ug83iVH3tdedLnw==}
-    dependencies:
-      micromark-util-character: 1.1.0
-      micromark-util-symbol: 1.0.1
-      micromark-util-types: 1.0.2
-    dev: true
-
-  /micromark-factory-label/1.0.2:
-    resolution: {integrity: sha512-CTIwxlOnU7dEshXDQ+dsr2n+yxpP0+fn271pu0bwDIS8uqfFcumXpj5mLn3hSC8iw2MUr6Gx8EcKng1dD7i6hg==}
-    dependencies:
-      micromark-util-character: 1.1.0
-      micromark-util-symbol: 1.0.1
-      micromark-util-types: 1.0.2
-      uvu: 0.5.6
-    dev: true
-
-  /micromark-factory-mdx-expression/1.0.6:
-    resolution: {integrity: sha512-WRQIc78FV7KrCfjsEf/sETopbYjElh3xAmNpLkd1ODPqxEngP42eVRGbiPEQWpRV27LzqW+XVTvQAMIIRLPnNA==}
-    dependencies:
-      micromark-factory-space: 1.0.0
-      micromark-util-character: 1.1.0
-      micromark-util-events-to-acorn: 1.1.0
-      micromark-util-symbol: 1.0.1
-      micromark-util-types: 1.0.2
-      unist-util-position-from-estree: 1.1.1
-      uvu: 0.5.6
-      vfile-message: 3.1.2
-    dev: true
-
-  /micromark-factory-space/1.0.0:
-    resolution: {integrity: sha512-qUmqs4kj9a5yBnk3JMLyjtWYN6Mzfcx8uJfi5XAveBniDevmZasdGBba5b4QsvRcAkmvGo5ACmSUmyGiKTLZew==}
-    dependencies:
-      micromark-util-character: 1.1.0
-      micromark-util-types: 1.0.2
-    dev: true
-
-  /micromark-factory-title/1.0.2:
-    resolution: {integrity: sha512-zily+Nr4yFqgMGRKLpTVsNl5L4PMu485fGFDOQJQBl2NFpjGte1e86zC0da93wf97jrc4+2G2GQudFMHn3IX+A==}
-    dependencies:
-      micromark-factory-space: 1.0.0
-      micromark-util-character: 1.1.0
-      micromark-util-symbol: 1.0.1
-      micromark-util-types: 1.0.2
-      uvu: 0.5.6
-    dev: true
-
-  /micromark-factory-whitespace/1.0.0:
-    resolution: {integrity: sha512-Qx7uEyahU1lt1RnsECBiuEbfr9INjQTGa6Err+gF3g0Tx4YEviPbqqGKNv/NrBaE7dVHdn1bVZKM/n5I/Bak7A==}
-    dependencies:
-      micromark-factory-space: 1.0.0
-      micromark-util-character: 1.1.0
-      micromark-util-symbol: 1.0.1
-      micromark-util-types: 1.0.2
-    dev: true
-
-  /micromark-util-character/1.1.0:
-    resolution: {integrity: sha512-agJ5B3unGNJ9rJvADMJ5ZiYjBRyDpzKAOk01Kpi1TKhlT1APx3XZk6eN7RtSz1erbWHC2L8T3xLZ81wdtGRZzg==}
-    dependencies:
-      micromark-util-symbol: 1.0.1
-      micromark-util-types: 1.0.2
-    dev: true
-
-  /micromark-util-chunked/1.0.0:
-    resolution: {integrity: sha512-5e8xTis5tEZKgesfbQMKRCyzvffRRUX+lK/y+DvsMFdabAicPkkZV6gO+FEWi9RfuKKoxxPwNL+dFF0SMImc1g==}
-    dependencies:
-      micromark-util-symbol: 1.0.1
-    dev: true
-
-  /micromark-util-classify-character/1.0.0:
-    resolution: {integrity: sha512-F8oW2KKrQRb3vS5ud5HIqBVkCqQi224Nm55o5wYLzY/9PwHGXC01tr3d7+TqHHz6zrKQ72Okwtvm/xQm6OVNZA==}
-    dependencies:
-      micromark-util-character: 1.1.0
-      micromark-util-symbol: 1.0.1
-      micromark-util-types: 1.0.2
-    dev: true
-
-  /micromark-util-combine-extensions/1.0.0:
-    resolution: {integrity: sha512-J8H058vFBdo/6+AsjHp2NF7AJ02SZtWaVUjsayNFeAiydTxUwViQPxN0Hf8dp4FmCQi0UUFovFsEyRSUmFH3MA==}
-    dependencies:
-      micromark-util-chunked: 1.0.0
-      micromark-util-types: 1.0.2
-    dev: true
-
-  /micromark-util-decode-numeric-character-reference/1.0.0:
-    resolution: {integrity: sha512-OzO9AI5VUtrTD7KSdagf4MWgHMtET17Ua1fIpXTpuhclCqD8egFWo85GxSGvxgkGS74bEahvtM0WP0HjvV0e4w==}
-    dependencies:
-      micromark-util-symbol: 1.0.1
-    dev: true
-
-  /micromark-util-decode-string/1.0.2:
-    resolution: {integrity: sha512-DLT5Ho02qr6QWVNYbRZ3RYOSSWWFuH3tJexd3dgN1odEuPNxCngTCXJum7+ViRAd9BbdxCvMToPOD/IvVhzG6Q==}
-    dependencies:
-      decode-named-character-reference: 1.0.2
-      micromark-util-character: 1.1.0
-      micromark-util-decode-numeric-character-reference: 1.0.0
-      micromark-util-symbol: 1.0.1
-    dev: true
-
-  /micromark-util-encode/1.0.1:
-    resolution: {integrity: sha512-U2s5YdnAYexjKDel31SVMPbfi+eF8y1U4pfiRW/Y8EFVCy/vgxk/2wWTxzcqE71LHtCuCzlBDRU2a5CQ5j+mQA==}
-    dev: true
-
-  /micromark-util-events-to-acorn/1.1.0:
-    resolution: {integrity: sha512-hB8HzidNt/Us5q2BvqXj8eeEm0U9rRfnZxcA9T65JRUMAY4MbfJRAFm7m9fXMAdSHJiVPmajsp8/rp6/FlHL8A==}
-    dependencies:
-      '@types/acorn': 4.0.6
-      '@types/estree': 0.0.51
-      estree-util-visit: 1.1.0
-      micromark-util-types: 1.0.2
-      uvu: 0.5.6
-      vfile-location: 4.0.1
-      vfile-message: 3.1.2
-    dev: true
-
-  /micromark-util-html-tag-name/1.1.0:
-    resolution: {integrity: sha512-BKlClMmYROy9UiV03SwNmckkjn8QHVaWkqoAqzivabvdGcwNGMMMH/5szAnywmsTBUzDsU57/mFi0sp4BQO6dA==}
-    dev: true
-
-  /micromark-util-normalize-identifier/1.0.0:
-    resolution: {integrity: sha512-yg+zrL14bBTFrQ7n35CmByWUTFsgst5JhA4gJYoty4Dqzj4Z4Fr/DHekSS5aLfH9bdlfnSvKAWsAgJhIbogyBg==}
-    dependencies:
-      micromark-util-symbol: 1.0.1
-    dev: true
-
-  /micromark-util-resolve-all/1.0.0:
-    resolution: {integrity: sha512-CB/AGk98u50k42kvgaMM94wzBqozSzDDaonKU7P7jwQIuH2RU0TeBqGYJz2WY1UdihhjweivStrJ2JdkdEmcfw==}
-    dependencies:
-      micromark-util-types: 1.0.2
-    dev: true
-
-  /micromark-util-sanitize-uri/1.0.0:
-    resolution: {integrity: sha512-cCxvBKlmac4rxCGx6ejlIviRaMKZc0fWm5HdCHEeDWRSkn44l6NdYVRyU+0nT1XC72EQJMZV8IPHF+jTr56lAg==}
-    dependencies:
-      micromark-util-character: 1.1.0
-      micromark-util-encode: 1.0.1
-      micromark-util-symbol: 1.0.1
-    dev: true
-
-  /micromark-util-subtokenize/1.0.2:
-    resolution: {integrity: sha512-d90uqCnXp/cy4G881Ub4psE57Sf8YD0pim9QdjCRNjfas2M1u6Lbt+XZK9gnHL2XFhnozZiEdCa9CNfXSfQ6xA==}
-    dependencies:
-      micromark-util-chunked: 1.0.0
-      micromark-util-symbol: 1.0.1
-      micromark-util-types: 1.0.2
-      uvu: 0.5.6
-    dev: true
-
-  /micromark-util-symbol/1.0.1:
-    resolution: {integrity: sha512-oKDEMK2u5qqAptasDAwWDXq0tG9AssVwAx3E9bBF3t/shRIGsWIRG+cGafs2p/SnDSOecnt6hZPCE2o6lHfFmQ==}
-    dev: true
-
-  /micromark-util-types/1.0.2:
-    resolution: {integrity: sha512-DCfg/T8fcrhrRKTPjRrw/5LLvdGV7BHySf/1LOZx7TzWZdYRjogNtyNq885z3nNallwr3QUKARjqvHqX1/7t+w==}
-    dev: true
-
-  /micromark/3.0.10:
-    resolution: {integrity: sha512-ryTDy6UUunOXy2HPjelppgJ2sNfcPz1pLlMdA6Rz9jPzhLikWXv/irpWV/I2jd68Uhmny7hHxAlAhk4+vWggpg==}
-    dependencies:
-      '@types/debug': 4.1.7
-      debug: 4.3.4
-      decode-named-character-reference: 1.0.2
-      micromark-core-commonmark: 1.0.6
-      micromark-factory-space: 1.0.0
-      micromark-util-character: 1.1.0
-      micromark-util-chunked: 1.0.0
-      micromark-util-combine-extensions: 1.0.0
-      micromark-util-decode-numeric-character-reference: 1.0.0
-      micromark-util-encode: 1.0.1
-      micromark-util-normalize-identifier: 1.0.0
-      micromark-util-resolve-all: 1.0.0
-      micromark-util-sanitize-uri: 1.0.0
-      micromark-util-subtokenize: 1.0.2
-      micromark-util-symbol: 1.0.1
-      micromark-util-types: 1.0.2
-      uvu: 0.5.6
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /micromatch/3.1.10:
-    resolution: {integrity: sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      arr-diff: 4.0.0
-      array-unique: 0.3.2
-      braces: 2.3.2
-      define-property: 2.0.2
-      extend-shallow: 3.0.2
-      extglob: 2.0.4
-      fragment-cache: 0.2.1
-      kind-of: 6.0.3
-      nanomatch: 1.2.13
-      object.pick: 1.3.0
-      regex-not: 1.0.2
-      snapdragon: 0.8.2
-      to-regex: 3.0.2
-    dev: true
-
-  /micromatch/4.0.5:
-    resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
-    engines: {node: '>=8.6'}
-    dependencies:
-      braces: 3.0.2
-      picomatch: 2.3.1
-
-  /mime-db/1.33.0:
-    resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==}
-    engines: {node: '>= 0.6'}
-    dev: false
-
-  /mime-db/1.52.0:
-    resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==}
-    engines: {node: '>= 0.6'}
-
-  /mime-types/2.1.18:
-    resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==}
-    engines: {node: '>= 0.6'}
-    dependencies:
-      mime-db: 1.33.0
-    dev: false
-
-  /mime-types/2.1.35:
-    resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==}
-    engines: {node: '>= 0.6'}
-    dependencies:
-      mime-db: 1.52.0
-
-  /mime/1.6.0:
-    resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==}
-    engines: {node: '>=4'}
-    hasBin: true
-    dev: false
-
-  /mimic-fn/2.1.0:
-    resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
-    engines: {node: '>=6'}
-
-  /mimic-response/1.0.1:
-    resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==}
-    engines: {node: '>=4'}
-
-  /mini-create-react-context/0.4.1_sh5qlbywuemxd2y3xkrw2y2kr4:
-    resolution: {integrity: sha512-YWCYEmd5CQeHGSAKrYvXgmzzkrvssZcuuQDDeqkT+PziKGMgE+0MCCtcKbROzocGBG1meBLl2FotlRwf4gAzbQ==}
-    deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info.
-    peerDependencies:
-      prop-types: ^15.0.0
-      react: ^0.14.0 || ^15.0.0 || ^16.0.0 || ^17.0.0
-    dependencies:
-      '@babel/runtime': 7.18.9
-      prop-types: 15.8.1
-      react: 18.2.0
-      tiny-warning: 1.0.3
-    dev: false
-
-  /mini-css-extract-plugin/2.6.1_webpack@5.73.0:
-    resolution: {integrity: sha512-wd+SD57/K6DiV7jIR34P+s3uckTRuQvx0tKPcvjFlrEylk6P4mQ2KSWk1hblj1Kxaqok7LogKOieygXqBczNlg==}
-    engines: {node: '>= 12.13.0'}
-    peerDependencies:
-      webpack: ^5.0.0
-    dependencies:
-      schema-utils: 4.0.0
-      webpack: 5.73.0
-    dev: false
-
-  /mini-svg-data-uri/1.4.4:
-    resolution: {integrity: sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==}
-    hasBin: true
-    dev: true
-
-  /minimalistic-assert/1.0.1:
-    resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==}
-    dev: false
-
-  /minimatch/3.0.4:
-    resolution: {integrity: sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==}
-    dependencies:
-      brace-expansion: 1.1.11
-    dev: false
-
-  /minimatch/3.1.2:
-    resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
-    dependencies:
-      brace-expansion: 1.1.11
-
-  /minimist/1.2.6:
-    resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==}
-
-  /mixin-deep/1.3.2:
-    resolution: {integrity: sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      for-in: 1.0.2
-      is-extendable: 1.0.1
-    dev: true
-
-  /mkdirp/0.5.6:
-    resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
-    hasBin: true
-    dependencies:
-      minimist: 1.2.6
-    dev: true
-
-  /mobx-react-lite/3.4.0_jofyzmwkboewm6mjrhi25mngky:
-    resolution: {integrity: sha512-bRuZp3C0itgLKHu/VNxi66DN/XVkQG7xtoBVWxpvC5FhAqbOCP21+nPhULjnzEqd7xBMybp6KwytdUpZKEgpIQ==}
-    peerDependencies:
-      mobx: ^6.1.0
-      react: ^16.8.0 || ^17 || ^18
-      react-dom: '*'
-      react-native: '*'
-    peerDependenciesMeta:
-      react-dom:
-        optional: true
-      react-native:
-        optional: true
-    dependencies:
-      mobx: 6.7.0
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-    dev: false
-
-  /mobx/6.7.0:
-    resolution: {integrity: sha512-1kBLBdSNG2bA522HQdbsTvwAwYf9hq9FWxmlhX7wTsJUAI54907J+ozfGW+LoYUo06vjit748g6QH1AAGLNebw==}
-    dev: false
-
-  /mri/1.2.0:
-    resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /mrmime/1.0.1:
-    resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==}
-    engines: {node: '>=10'}
-    dev: false
-
-  /ms/2.0.0:
-    resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==}
-
-  /ms/2.1.2:
-    resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
-
-  /ms/2.1.3:
-    resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
-
-  /multicast-dns/7.2.5:
-    resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==}
-    hasBin: true
-    dependencies:
-      dns-packet: 5.4.0
-      thunky: 1.1.0
-    dev: false
-
-  /nanoid/3.3.4:
-    resolution: {integrity: sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==}
-    engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
-    hasBin: true
-    dev: false
-
-  /nanomatch/1.2.13:
-    resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      arr-diff: 4.0.0
-      array-unique: 0.3.2
-      define-property: 2.0.2
-      extend-shallow: 3.0.2
-      fragment-cache: 0.2.1
-      is-windows: 1.0.2
-      kind-of: 6.0.3
-      object.pick: 1.3.0
-      regex-not: 1.0.2
-      snapdragon: 0.8.2
-      to-regex: 3.0.2
-    dev: true
-
-  /natural-compare/1.4.0:
-    resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
-    dev: true
-
-  /negotiator/0.6.3:
-    resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==}
-    engines: {node: '>= 0.6'}
-    dev: false
-
-  /neo-async/2.6.2:
-    resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
-    dev: false
-
-  /next/13.0.3_biqbaboplfbrettd7655fr4n2y:
-    resolution: {integrity: sha512-rFQeepcenRxKzeKlh1CsmEnxsJwhIERtbUjmYnKZyDInZsU06lvaGw5DT44rlNp1Rv2MT/e9vffZ8vK+ytwXHA==}
-    engines: {node: '>=14.6.0'}
-    hasBin: true
-    peerDependencies:
-      fibers: '>= 3.1.0'
-      node-sass: ^6.0.0 || ^7.0.0
-      react: ^18.2.0
-      react-dom: ^18.2.0
-      sass: ^1.3.0
-    peerDependenciesMeta:
-      fibers:
-        optional: true
-      node-sass:
-        optional: true
-      sass:
-        optional: true
-    dependencies:
-      '@next/env': 13.0.3
-      '@swc/helpers': 0.4.11
-      caniuse-lite: 1.0.30001431
-      postcss: 8.4.14
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      styled-jsx: 5.1.0_react@18.2.0
-      use-sync-external-store: 1.2.0_react@18.2.0
-    optionalDependencies:
-      '@next/swc-android-arm-eabi': 13.0.3
-      '@next/swc-android-arm64': 13.0.3
-      '@next/swc-darwin-arm64': 13.0.3
-      '@next/swc-darwin-x64': 13.0.3
-      '@next/swc-freebsd-x64': 13.0.3
-      '@next/swc-linux-arm-gnueabihf': 13.0.3
-      '@next/swc-linux-arm64-gnu': 13.0.3
-      '@next/swc-linux-arm64-musl': 13.0.3
-      '@next/swc-linux-x64-gnu': 13.0.3
-      '@next/swc-linux-x64-musl': 13.0.3
-      '@next/swc-win32-arm64-msvc': 13.0.3
-      '@next/swc-win32-ia32-msvc': 13.0.3
-      '@next/swc-win32-x64-msvc': 13.0.3
-    transitivePeerDependencies:
-      - '@babel/core'
-      - babel-plugin-macros
-    dev: false
-
-  /no-case/3.0.4:
-    resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==}
-    dependencies:
-      lower-case: 2.0.2
-      tslib: 2.4.1
-    dev: false
-
-  /node-domexception/1.0.0:
-    resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==}
-    engines: {node: '>=10.5.0'}
-    dev: true
-
-  /node-emoji/1.11.0:
-    resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==}
-    dependencies:
-      lodash: 4.17.21
-    dev: false
-
-  /node-fetch/2.6.7:
-    resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==}
-    engines: {node: 4.x || >=6.0.0}
-    peerDependencies:
-      encoding: ^0.1.0
-    peerDependenciesMeta:
-      encoding:
-        optional: true
-    dependencies:
-      whatwg-url: 5.0.0
-
-  /node-fetch/3.3.0:
-    resolution: {integrity: sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA==}
-    engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
-    dependencies:
-      data-uri-to-buffer: 4.0.0
-      fetch-blob: 3.2.0
-      formdata-polyfill: 4.0.10
-    dev: true
-
-  /node-forge/1.3.1:
-    resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==}
-    engines: {node: '>= 6.13.0'}
-    dev: false
-
-  /node-int64/0.4.0:
-    resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
-    dev: true
-
-  /node-releases/2.0.6:
-    resolution: {integrity: sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==}
-
-  /normalize-path/3.0.0:
-    resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
-    engines: {node: '>=0.10.0'}
-
-  /normalize-range/0.1.2:
-    resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
-    engines: {node: '>=0.10.0'}
-    dev: false
-
-  /normalize-url/2.0.1:
-    resolution: {integrity: sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==}
-    engines: {node: '>=4'}
-    dependencies:
-      prepend-http: 2.0.0
-      query-string: 5.1.1
-      sort-keys: 2.0.0
-    dev: true
-
-  /normalize-url/4.5.1:
-    resolution: {integrity: sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==}
-    engines: {node: '>=8'}
-    dev: false
-
-  /normalize-url/6.1.0:
-    resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==}
-    engines: {node: '>=10'}
-    dev: false
-
-  /npm-run-path/4.0.1:
-    resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
-    engines: {node: '>=8'}
-    dependencies:
-      path-key: 3.1.1
-
-  /nprogress/0.2.0:
-    resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==}
-    dev: false
-
-  /nth-check/2.1.1:
-    resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
-    dependencies:
-      boolbase: 1.0.0
-    dev: false
-
-  /object-assign/4.1.1:
-    resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
-    engines: {node: '>=0.10.0'}
-
-  /object-copy/0.1.0:
-    resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      copy-descriptor: 0.1.1
-      define-property: 0.2.5
-      kind-of: 3.2.2
-    dev: true
-
-  /object-inspect/1.12.2:
-    resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==}
-
-  /object-keys/1.1.1:
-    resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
-    engines: {node: '>= 0.4'}
-
-  /object-visit/1.0.1:
-    resolution: {integrity: sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      isobject: 3.0.1
-    dev: true
-
-  /object.assign/4.1.2:
-    resolution: {integrity: sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      define-properties: 1.1.4
-      has-symbols: 1.0.3
-      object-keys: 1.1.1
-
-  /object.entries/1.1.5:
-    resolution: {integrity: sha512-TyxmjUoZggd4OrrU1W66FMDG6CuqJxsFvymeyXI51+vQLN67zYfZseptRge703kKQdo4uccgAKebXFcRCzk4+g==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      define-properties: 1.1.4
-      es-abstract: 1.20.1
-    dev: true
-
-  /object.fromentries/2.0.5:
-    resolution: {integrity: sha512-CAyG5mWQRRiBU57Re4FKoTBjXfDoNwdFVH2Y1tS9PqCsfUTymAohOkEMSG3aRNKmv4lV3O7p1et7c187q6bynw==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      define-properties: 1.1.4
-      es-abstract: 1.20.1
-    dev: true
-
-  /object.hasown/1.1.1:
-    resolution: {integrity: sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==}
-    dependencies:
-      define-properties: 1.1.4
-      es-abstract: 1.20.1
-    dev: true
-
-  /object.pick/1.3.0:
-    resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      isobject: 3.0.1
-    dev: true
-
-  /object.values/1.1.5:
-    resolution: {integrity: sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      define-properties: 1.1.4
-      es-abstract: 1.20.1
-    dev: true
-
-  /obuf/1.1.2:
-    resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
-    dev: false
-
-  /on-finished/2.4.1:
-    resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
-    engines: {node: '>= 0.8'}
-    dependencies:
-      ee-first: 1.1.1
-    dev: false
-
-  /on-headers/1.0.2:
-    resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==}
-    engines: {node: '>= 0.8'}
-    dev: false
-
-  /once/1.4.0:
-    resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
-    dependencies:
-      wrappy: 1.0.2
-
-  /onetime/5.1.2:
-    resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
-    engines: {node: '>=6'}
-    dependencies:
-      mimic-fn: 2.1.0
-
-  /open/8.4.0:
-    resolution: {integrity: sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==}
-    engines: {node: '>=12'}
-    dependencies:
-      define-lazy-prop: 2.0.0
-      is-docker: 2.2.1
-      is-wsl: 2.2.0
-    dev: false
-
-  /opener/1.5.2:
-    resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==}
-    hasBin: true
-    dev: false
-
-  /optionator/0.9.1:
-    resolution: {integrity: sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==}
-    engines: {node: '>= 0.8.0'}
-    dependencies:
-      deep-is: 0.1.4
-      fast-levenshtein: 2.0.6
-      levn: 0.4.1
-      prelude-ls: 1.2.1
-      type-check: 0.4.0
-      word-wrap: 1.2.3
-    dev: true
-
-  /p-cancelable/0.4.1:
-    resolution: {integrity: sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /p-cancelable/1.1.0:
-    resolution: {integrity: sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==}
-    engines: {node: '>=6'}
-    dev: false
-
-  /p-event/2.3.1:
-    resolution: {integrity: sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==}
-    engines: {node: '>=6'}
-    dependencies:
-      p-timeout: 2.0.1
-    dev: true
-
-  /p-finally/1.0.0:
-    resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /p-is-promise/1.1.0:
-    resolution: {integrity: sha512-zL7VE4JVS2IFSkR2GQKDSPEVxkoH43/p7oEnwpdCndKYJO0HVeRB7fA8TJwuLOTBREtK0ea8eHaxdwcpob5dmg==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /p-limit/1.3.0:
-    resolution: {integrity: sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==}
-    engines: {node: '>=4'}
-    dependencies:
-      p-try: 1.0.0
-    dev: true
-
-  /p-limit/2.3.0:
-    resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
-    engines: {node: '>=6'}
-    dependencies:
-      p-try: 2.2.0
-
-  /p-limit/3.1.0:
-    resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
-    engines: {node: '>=10'}
-    dependencies:
-      yocto-queue: 0.1.0
-
-  /p-locate/2.0.0:
-    resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==}
-    engines: {node: '>=4'}
-    dependencies:
-      p-limit: 1.3.0
-    dev: true
-
-  /p-locate/3.0.0:
-    resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
-    engines: {node: '>=6'}
-    dependencies:
-      p-limit: 2.3.0
-    dev: false
-
-  /p-locate/4.1.0:
-    resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
-    engines: {node: '>=8'}
-    dependencies:
-      p-limit: 2.3.0
-
-  /p-locate/5.0.0:
-    resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
-    engines: {node: '>=10'}
-    dependencies:
-      p-limit: 3.1.0
-
-  /p-map/4.0.0:
-    resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==}
-    engines: {node: '>=10'}
-    dependencies:
-      aggregate-error: 3.1.0
-    dev: false
-
-  /p-retry/4.6.2:
-    resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==}
-    engines: {node: '>=8'}
-    dependencies:
-      '@types/retry': 0.12.0
-      retry: 0.13.1
-    dev: false
-
-  /p-timeout/2.0.1:
-    resolution: {integrity: sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==}
-    engines: {node: '>=4'}
-    dependencies:
-      p-finally: 1.0.0
-    dev: true
-
-  /p-try/1.0.0:
-    resolution: {integrity: sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /p-try/2.2.0:
-    resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
-    engines: {node: '>=6'}
-
-  /package-json/6.5.0:
-    resolution: {integrity: sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==}
-    engines: {node: '>=8'}
-    dependencies:
-      got: 9.6.0
-      registry-auth-token: 4.2.2
-      registry-url: 5.1.0
-      semver: 6.3.0
-    dev: false
-
-  /param-case/3.0.4:
-    resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==}
-    dependencies:
-      dot-case: 3.0.4
-      tslib: 2.4.1
-    dev: false
-
-  /parent-module/1.0.1:
-    resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
-    engines: {node: '>=6'}
-    dependencies:
-      callsites: 3.1.0
-
-  /parse-entities/2.0.0:
-    resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==}
-    dependencies:
-      character-entities: 1.2.4
-      character-entities-legacy: 1.1.4
-      character-reference-invalid: 1.1.4
-      is-alphanumerical: 1.0.4
-      is-decimal: 1.0.4
-      is-hexadecimal: 1.0.4
-    dev: false
-
-  /parse-entities/4.0.0:
-    resolution: {integrity: sha512-5nk9Fn03x3rEhGaX1FU6IDwG/k+GxLXlFAkgrbM1asuAFl3BhdQWvASaIsmwWypRNcZKHPYnIuOSfIWEyEQnPQ==}
-    dependencies:
-      '@types/unist': 2.0.6
-      character-entities: 2.0.2
-      character-entities-legacy: 3.0.0
-      character-reference-invalid: 2.0.1
-      decode-named-character-reference: 1.0.2
-      is-alphanumerical: 2.0.1
-      is-decimal: 2.0.1
-      is-hexadecimal: 2.0.1
-    dev: true
-
-  /parse-json/5.2.0:
-    resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
-    engines: {node: '>=8'}
-    dependencies:
-      '@babel/code-frame': 7.18.6
-      error-ex: 1.3.2
-      json-parse-even-better-errors: 2.3.1
-      lines-and-columns: 1.2.4
-
-  /parse-numeric-range/1.3.0:
-    resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==}
-    dev: false
-
-  /parse5-htmlparser2-tree-adapter/7.0.0:
-    resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==}
-    dependencies:
-      domhandler: 5.0.3
-      parse5: 7.0.0
-    dev: false
-
-  /parse5/6.0.1:
-    resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==}
-    dev: false
-
-  /parse5/7.0.0:
-    resolution: {integrity: sha512-y/t8IXSPWTuRZqXc0ajH/UwDj4mnqLEbSttNbThcFhGrZuOyoyvNBO85PBp2jQa55wY9d07PBNjsK8ZP3K5U6g==}
-    dependencies:
-      entities: 4.4.0
-    dev: false
-
-  /parseurl/1.3.3:
-    resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
-    engines: {node: '>= 0.8'}
-    dev: false
-
-  /pascal-case/3.1.2:
-    resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==}
-    dependencies:
-      no-case: 3.0.4
-      tslib: 2.4.1
-    dev: false
-
-  /pascalcase/0.1.1:
-    resolution: {integrity: sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /path-exists/3.0.0:
-    resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==}
-    engines: {node: '>=4'}
-
-  /path-exists/4.0.0:
-    resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
-    engines: {node: '>=8'}
-
-  /path-is-absolute/1.0.1:
-    resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
-    engines: {node: '>=0.10.0'}
-
-  /path-is-inside/1.0.2:
-    resolution: {integrity: sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=}
-    dev: false
-
-  /path-key/3.1.1:
-    resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
-    engines: {node: '>=8'}
-
-  /path-parse/1.0.7:
-    resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
-
-  /path-to-regexp/0.1.7:
-    resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==}
-    dev: false
-
-  /path-to-regexp/1.8.0:
-    resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==}
-    dependencies:
-      isarray: 0.0.1
-    dev: false
-
-  /path-to-regexp/2.2.1:
-    resolution: {integrity: sha512-gu9bD6Ta5bwGrrU8muHzVOBFFREpp2iRkVfhBJahwJ6p6Xw20SjT0MxLnwkjOibQmGSYhiUnf2FLe7k+jcFmGQ==}
-    dev: false
-
-  /path-type/4.0.0:
-    resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
-    engines: {node: '>=8'}
-
-  /pend/1.2.0:
-    resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==}
-    dev: true
-
-  /periscopic/3.0.4:
-    resolution: {integrity: sha512-SFx68DxCv0Iyo6APZuw/AKewkkThGwssmU0QWtTlvov3VAtPX+QJ4CadwSaz8nrT5jPIuxdvJWB4PnD2KNDxQg==}
-    dependencies:
-      estree-walker: 3.0.1
-      is-reference: 3.0.0
-    dev: true
-
-  /picocolors/1.0.0:
-    resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
-
-  /picomatch/2.3.1:
-    resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
-    engines: {node: '>=8.6'}
-
-  /pify/2.3.0:
-    resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /pify/3.0.0:
-    resolution: {integrity: sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /pify/4.0.1:
-    resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
-    engines: {node: '>=6'}
-    dev: true
-
-  /pinkie-promise/2.0.1:
-    resolution: {integrity: sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      pinkie: 2.0.4
-    dev: true
-
-  /pinkie/2.0.4:
-    resolution: {integrity: sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /pirates/4.0.5:
-    resolution: {integrity: sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==}
-    engines: {node: '>= 6'}
-    dev: true
-
-  /pkg-dir/4.2.0:
-    resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
-    engines: {node: '>=8'}
-    dependencies:
-      find-up: 4.1.0
-
-  /pkg-up/3.1.0:
-    resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==}
-    engines: {node: '>=8'}
-    dependencies:
-      find-up: 3.0.0
-    dev: false
-
-  /plantuml-encoder/1.4.0:
-    resolution: {integrity: sha512-sxMwpDw/ySY1WB2CE3+IdMuEcWibJ72DDOsXLkSmEaSzwEUaYBT6DWgOfBiHGCux4q433X6+OEFWjlVqp7gL6g==}
-    dev: true
-
-  /posix-character-classes/0.1.1:
-    resolution: {integrity: sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /postcss-calc/8.2.4_postcss@8.4.14:
-    resolution: {integrity: sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==}
-    peerDependencies:
-      postcss: ^8.2.2
-    dependencies:
-      postcss: 8.4.14
-      postcss-selector-parser: 6.0.10
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-colormin/5.3.0_postcss@8.4.14:
-    resolution: {integrity: sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      browserslist: 4.21.4
-      caniuse-api: 3.0.0
-      colord: 2.9.2
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-convert-values/5.1.2_postcss@8.4.14:
-    resolution: {integrity: sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      browserslist: 4.21.4
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-discard-comments/5.1.2_postcss@8.4.14:
-    resolution: {integrity: sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-    dev: false
-
-  /postcss-discard-duplicates/5.1.0_postcss@8.4.14:
-    resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-    dev: false
-
-  /postcss-discard-empty/5.1.1_postcss@8.4.14:
-    resolution: {integrity: sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-    dev: false
-
-  /postcss-discard-overridden/5.1.0_postcss@8.4.14:
-    resolution: {integrity: sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-    dev: false
-
-  /postcss-discard-unused/5.1.0_postcss@8.4.14:
-    resolution: {integrity: sha512-KwLWymI9hbwXmJa0dkrzpRbSJEh0vVUd7r8t0yOGPcfKzyJJxFM8kLyC5Ev9avji6nY95pOp1W6HqIrfT+0VGw==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-      postcss-selector-parser: 6.0.10
-    dev: false
-
-  /postcss-loader/7.0.1_mepnsno3xmng6eyses4tepu7bu:
-    resolution: {integrity: sha512-VRviFEyYlLjctSM93gAZtcJJ/iSkPZ79zWbN/1fSH+NisBByEiVLqpdVDrPLVSi8DX0oJo12kL/GppTBdKVXiQ==}
-    engines: {node: '>= 14.15.0'}
-    peerDependencies:
-      postcss: ^7.0.0 || ^8.0.1
-      webpack: ^5.0.0
-    dependencies:
-      cosmiconfig: 7.0.1
-      klona: 2.0.5
-      postcss: 8.4.14
-      semver: 7.3.7
-      webpack: 5.73.0
-    dev: false
-
-  /postcss-merge-idents/5.1.1_postcss@8.4.14:
-    resolution: {integrity: sha512-pCijL1TREiCoog5nQp7wUe+TUonA2tC2sQ54UGeMmryK3UFGIYKqDyjnqd6RcuI4znFn9hWSLNN8xKE/vWcUQw==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      cssnano-utils: 3.1.0_postcss@8.4.14
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-merge-longhand/5.1.6_postcss@8.4.14:
-    resolution: {integrity: sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-      stylehacks: 5.1.0_postcss@8.4.14
-    dev: false
-
-  /postcss-merge-rules/5.1.2_postcss@8.4.14:
-    resolution: {integrity: sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      browserslist: 4.21.4
-      caniuse-api: 3.0.0
-      cssnano-utils: 3.1.0_postcss@8.4.14
-      postcss: 8.4.14
-      postcss-selector-parser: 6.0.10
-    dev: false
-
-  /postcss-minify-font-values/5.1.0_postcss@8.4.14:
-    resolution: {integrity: sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-minify-gradients/5.1.1_postcss@8.4.14:
-    resolution: {integrity: sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      colord: 2.9.2
-      cssnano-utils: 3.1.0_postcss@8.4.14
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-minify-params/5.1.3_postcss@8.4.14:
-    resolution: {integrity: sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      browserslist: 4.21.4
-      cssnano-utils: 3.1.0_postcss@8.4.14
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-minify-selectors/5.2.1_postcss@8.4.14:
-    resolution: {integrity: sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-      postcss-selector-parser: 6.0.10
-    dev: false
-
-  /postcss-modules-extract-imports/3.0.0_postcss@8.4.14:
-    resolution: {integrity: sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==}
-    engines: {node: ^10 || ^12 || >= 14}
-    peerDependencies:
-      postcss: ^8.1.0
-    dependencies:
-      postcss: 8.4.14
-    dev: false
-
-  /postcss-modules-local-by-default/4.0.0_postcss@8.4.14:
-    resolution: {integrity: sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==}
-    engines: {node: ^10 || ^12 || >= 14}
-    peerDependencies:
-      postcss: ^8.1.0
-    dependencies:
-      icss-utils: 5.1.0_postcss@8.4.14
-      postcss: 8.4.14
-      postcss-selector-parser: 6.0.10
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-modules-scope/3.0.0_postcss@8.4.14:
-    resolution: {integrity: sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==}
-    engines: {node: ^10 || ^12 || >= 14}
-    peerDependencies:
-      postcss: ^8.1.0
-    dependencies:
-      postcss: 8.4.14
-      postcss-selector-parser: 6.0.10
-    dev: false
-
-  /postcss-modules-values/4.0.0_postcss@8.4.14:
-    resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==}
-    engines: {node: ^10 || ^12 || >= 14}
-    peerDependencies:
-      postcss: ^8.1.0
-    dependencies:
-      icss-utils: 5.1.0_postcss@8.4.14
-      postcss: 8.4.14
-    dev: false
-
-  /postcss-normalize-charset/5.1.0_postcss@8.4.14:
-    resolution: {integrity: sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-    dev: false
-
-  /postcss-normalize-display-values/5.1.0_postcss@8.4.14:
-    resolution: {integrity: sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-normalize-positions/5.1.1_postcss@8.4.14:
-    resolution: {integrity: sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-normalize-repeat-style/5.1.1_postcss@8.4.14:
-    resolution: {integrity: sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-normalize-string/5.1.0_postcss@8.4.14:
-    resolution: {integrity: sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-normalize-timing-functions/5.1.0_postcss@8.4.14:
-    resolution: {integrity: sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-normalize-unicode/5.1.0_postcss@8.4.14:
-    resolution: {integrity: sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      browserslist: 4.21.4
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-normalize-url/5.1.0_postcss@8.4.14:
-    resolution: {integrity: sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      normalize-url: 6.1.0
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-normalize-whitespace/5.1.1_postcss@8.4.14:
-    resolution: {integrity: sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-ordered-values/5.1.3_postcss@8.4.14:
-    resolution: {integrity: sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      cssnano-utils: 3.1.0_postcss@8.4.14
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-reduce-idents/5.2.0_postcss@8.4.14:
-    resolution: {integrity: sha512-BTrLjICoSB6gxbc58D5mdBK8OhXRDqud/zodYfdSi52qvDHdMwk+9kB9xsM8yJThH/sZU5A6QVSmMmaN001gIg==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-reduce-initial/5.1.0_postcss@8.4.14:
-    resolution: {integrity: sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      browserslist: 4.21.4
-      caniuse-api: 3.0.0
-      postcss: 8.4.14
-    dev: false
-
-  /postcss-reduce-transforms/5.1.0_postcss@8.4.14:
-    resolution: {integrity: sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-    dev: false
-
-  /postcss-selector-parser/6.0.10:
-    resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==}
-    engines: {node: '>=4'}
-    dependencies:
-      cssesc: 3.0.0
-      util-deprecate: 1.0.2
-    dev: false
-
-  /postcss-sort-media-queries/4.2.1_postcss@8.4.14:
-    resolution: {integrity: sha512-9VYekQalFZ3sdgcTjXMa0dDjsfBVHXlraYJEMiOJ/2iMmI2JGCMavP16z3kWOaRu8NSaJCTgVpB/IVpH5yT9YQ==}
-    engines: {node: '>=10.0.0'}
-    peerDependencies:
-      postcss: ^8.4.4
-    dependencies:
-      postcss: 8.4.14
-      sort-css-media-queries: 2.0.4
-    dev: false
-
-  /postcss-svgo/5.1.0_postcss@8.4.14:
-    resolution: {integrity: sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-      postcss-value-parser: 4.2.0
-      svgo: 2.8.0
-    dev: false
-
-  /postcss-unique-selectors/5.1.1_postcss@8.4.14:
-    resolution: {integrity: sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-      postcss-selector-parser: 6.0.10
-    dev: false
-
-  /postcss-value-parser/4.2.0:
-    resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
-    dev: false
-
-  /postcss-zindex/5.1.0_postcss@8.4.14:
-    resolution: {integrity: sha512-fgFMf0OtVSBR1va1JNHYgMxYk73yhn/qb4uQDq1DLGYolz8gHCyr/sesEuGUaYs58E3ZJRcpoGuPVoB7Meiq9A==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      postcss: 8.4.14
-    dev: false
-
-  /postcss/8.4.14:
-    resolution: {integrity: sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==}
-    engines: {node: ^10 || ^12 || >=14}
-    dependencies:
-      nanoid: 3.3.4
-      picocolors: 1.0.0
-      source-map-js: 1.0.2
-    dev: false
-
-  /prelude-ls/1.2.1:
-    resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
-    engines: {node: '>= 0.8.0'}
-    dev: true
-
-  /prepend-http/2.0.0:
-    resolution: {integrity: sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==}
-    engines: {node: '>=4'}
-
-  /pretty-error/4.0.0:
-    resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==}
-    dependencies:
-      lodash: 4.17.21
-      renderkid: 3.0.0
-    dev: false
-
-  /pretty-format/29.3.1:
-    resolution: {integrity: sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    dependencies:
-      '@jest/schemas': 29.0.0
-      ansi-styles: 5.2.0
-      react-is: 18.2.0
-    dev: true
-
-  /pretty-time/1.1.0:
-    resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==}
-    engines: {node: '>=4'}
-    dev: false
-
-  /prism-react-renderer/1.3.5_react@18.2.0:
-    resolution: {integrity: sha512-IJ+MSwBWKG+SM3b2SUfdrhC+gu01QkV2KmRQgREThBfSQRoufqRfxfHUxpG1WcaFjP+kojcFyO9Qqtpgt3qLCg==}
-    peerDependencies:
-      react: '>=0.14.9'
-    dependencies:
-      react: 18.2.0
-    dev: false
-
-  /prismjs/1.28.0:
-    resolution: {integrity: sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==}
-    engines: {node: '>=6'}
-    dev: false
-
-  /process-nextick-args/2.0.1:
-    resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
-
-  /promise/7.3.1:
-    resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==}
-    dependencies:
-      asap: 2.0.6
-    dev: false
-
-  /prompts/2.4.2:
-    resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
-    engines: {node: '>= 6'}
-    dependencies:
-      kleur: 3.0.3
-      sisteransi: 1.0.5
-
-  /prop-types/15.8.1:
-    resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
-    dependencies:
-      loose-envify: 1.4.0
-      object-assign: 4.1.1
-      react-is: 16.13.1
-
-  /property-information/5.6.0:
-    resolution: {integrity: sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==}
-    dependencies:
-      xtend: 4.0.2
-    dev: false
-
-  /property-information/6.1.1:
-    resolution: {integrity: sha512-hrzC564QIl0r0vy4l6MvRLhafmUowhO/O3KgVSoXIbbA2Sz4j8HGpJc6T2cubRVwMwpdiG/vKGfhT4IixmKN9w==}
-    dev: true
-
-  /proxy-addr/2.0.7:
-    resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==}
-    engines: {node: '>= 0.10'}
-    dependencies:
-      forwarded: 0.2.0
-      ipaddr.js: 1.9.1
-    dev: false
-
-  /prr/1.0.1:
-    resolution: {integrity: sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==}
-    dev: true
-
-  /pump/3.0.0:
-    resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==}
-    dependencies:
-      end-of-stream: 1.4.4
-      once: 1.4.0
-
-  /punycode/1.4.1:
-    resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==}
-    dev: false
-
-  /punycode/2.1.1:
-    resolution: {integrity: sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==}
-    engines: {node: '>=6'}
-
-  /pupa/2.1.1:
-    resolution: {integrity: sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==}
-    engines: {node: '>=8'}
-    dependencies:
-      escape-goat: 2.1.1
-    dev: false
-
-  /pure-color/1.3.0:
-    resolution: {integrity: sha512-QFADYnsVoBMw1srW7OVKEYjG+MbIa49s54w1MA1EDY6r2r/sTcKKYqRX1f4GYvnXP7eN/Pe9HFcX+hwzmrXRHA==}
-    dev: false
-
-  /qs/6.10.3:
-    resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==}
-    engines: {node: '>=0.6'}
-    dependencies:
-      side-channel: 1.0.4
-    dev: false
-
-  /query-string/5.1.1:
-    resolution: {integrity: sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      decode-uri-component: 0.2.0
-      object-assign: 4.1.1
-      strict-uri-encode: 1.1.0
-    dev: true
-
-  /queue-microtask/1.2.3:
-    resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
-
-  /queue/6.0.2:
-    resolution: {integrity: sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==}
-    dependencies:
-      inherits: 2.0.4
-    dev: false
-
-  /randombytes/2.1.0:
-    resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==}
-    dependencies:
-      safe-buffer: 5.2.1
-    dev: false
-
-  /range-parser/1.2.0:
-    resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==}
-    engines: {node: '>= 0.6'}
-    dev: false
-
-  /range-parser/1.2.1:
-    resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==}
-    engines: {node: '>= 0.6'}
-    dev: false
-
-  /raw-body/2.5.1:
-    resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==}
-    engines: {node: '>= 0.8'}
-    dependencies:
-      bytes: 3.1.2
-      http-errors: 2.0.0
-      iconv-lite: 0.4.24
-      unpipe: 1.0.0
-    dev: false
-
-  /rc/1.2.8:
-    resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
-    hasBin: true
-    dependencies:
-      deep-extend: 0.6.0
-      ini: 1.3.8
-      minimist: 1.2.6
-      strip-json-comments: 2.0.1
-    dev: false
-
-  /react-base16-styling/0.6.0:
-    resolution: {integrity: sha512-yvh/7CArceR/jNATXOKDlvTnPKPmGZz7zsenQ3jUwLzHkNUR0CvY3yGYJbWJ/nnxsL8Sgmt5cO3/SILVuPO6TQ==}
-    dependencies:
-      base16: 1.0.0
-      lodash.curry: 4.1.1
-      lodash.flow: 3.5.0
-      pure-color: 1.3.0
-    dev: false
-
-  /react-dev-utils/12.0.1_webpack@5.73.0:
-    resolution: {integrity: sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==}
-    engines: {node: '>=14'}
-    dependencies:
-      '@babel/code-frame': 7.18.6
-      address: 1.2.0
-      browserslist: 4.21.2
-      chalk: 4.1.2
-      cross-spawn: 7.0.3
-      detect-port-alt: 1.1.6
-      escape-string-regexp: 4.0.0
-      filesize: 8.0.7
-      find-up: 5.0.0
-      fork-ts-checker-webpack-plugin: 6.5.2_webpack@5.73.0
-      global-modules: 2.0.0
-      globby: 11.1.0
-      gzip-size: 6.0.0
-      immer: 9.0.15
-      is-root: 2.1.0
-      loader-utils: 3.2.0
-      open: 8.4.0
-      pkg-up: 3.1.0
-      prompts: 2.4.2
-      react-error-overlay: 6.0.11
-      recursive-readdir: 2.2.2
-      shell-quote: 1.7.3
-      strip-ansi: 6.0.1
-      text-table: 0.2.0
-    transitivePeerDependencies:
-      - eslint
-      - typescript
-      - vue-template-compiler
-      - webpack
-    dev: false
-
-  /react-dom/18.2.0_react@18.2.0:
-    resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==}
-    peerDependencies:
-      react: ^18.2.0
-    dependencies:
-      loose-envify: 1.4.0
-      react: 18.2.0
-      scheduler: 0.23.0
-    dev: false
-
-  /react-error-overlay/6.0.11:
-    resolution: {integrity: sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==}
-    dev: false
-
-  /react-fast-compare/3.2.0:
-    resolution: {integrity: sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA==}
-    dev: false
-
-  /react-helmet-async/1.3.0_biqbaboplfbrettd7655fr4n2y:
-    resolution: {integrity: sha512-9jZ57/dAn9t3q6hneQS0wukqC2ENOBgMNVEhb/ZG9ZSxUetzVIw4iAmEU38IaVg3QGYauQPhSeUTuIUtFglWpg==}
-    peerDependencies:
-      react: ^16.6.0 || ^17.0.0 || ^18.0.0
-      react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0
-    dependencies:
-      '@babel/runtime': 7.18.9
-      invariant: 2.2.4
-      prop-types: 15.8.1
-      react: 18.2.0
-      react-dom: 18.2.0_react@18.2.0
-      react-fast-compare: 3.2.0
-      shallowequal: 1.1.0
-    dev: false
-
-  /react-is/16.13.1:
-    resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
-
-  /react-is/18.2.0:
-    resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
-    dev: true
-
-  /react-json-view/1.21.3_biqbaboplfbrettd7655fr4n2y:
-    resolution: {integrity: sha512-13p8IREj9/x/Ye4WI/JpjhoIwuzEgUAtgJZNBJckfzJt1qyh24BdTm6UQNGnyTq9dapQdrqvquZTo3dz1X6Cjw==}
-    peerDependencies:
-      react: ^17.0.0 || ^16.3.0 || ^15.5.4
-      react-dom: ^17.0.0 || ^16.3.0 || ^15.5.4
-    dependencies:
-      flux: 4.0.3_react@18.2.0
-      react: 18.2.0
-      react-base16-styling: 0.6.0
-      react-dom: 18.2.0_react@18.2.0
-      react-lifecycles-compat: 3.0.4
-      react-textarea-autosize: 8.3.4_react@18.2.0
-    transitivePeerDependencies:
-      - '@types/react'
-      - encoding
-    dev: false
-
-  /react-lifecycles-compat/3.0.4:
-    resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==}
-    dev: false
-
-  /react-loadable-ssr-addon-v5-slorber/1.0.1_pobh4rnr4unizsdzh3gmmsgqtu:
-    resolution: {integrity: sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==}
-    engines: {node: '>=10.13.0'}
-    peerDependencies:
-      react-loadable: '*'
-      webpack: '>=4.41.1 || 5.x'
-    dependencies:
-      '@babel/runtime': 7.18.9
-      react-loadable: /@docusaurus/react-loadable/5.5.2_react@18.2.0
-      webpack: 5.73.0
-    dev: false
-
-  /react-router-config/5.1.1_4gumyfmpzq3vvokmq4lwan2qpu:
-    resolution: {integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==}
-    peerDependencies:
-      react: '>=15'
-      react-router: '>=5'
-    dependencies:
-      '@babel/runtime': 7.18.9
-      react: 18.2.0
-      react-router: 5.3.3_react@18.2.0
-    dev: false
-
-  /react-router-dom/5.3.3_react@18.2.0:
-    resolution: {integrity: sha512-Ov0tGPMBgqmbu5CDmN++tv2HQ9HlWDuWIIqn4b88gjlAN5IHI+4ZUZRcpz9Hl0azFIwihbLDYw1OiHGRo7ZIng==}
-    peerDependencies:
-      react: '>=15'
-    dependencies:
-      '@babel/runtime': 7.18.9
-      history: 4.10.1
-      loose-envify: 1.4.0
-      prop-types: 15.8.1
-      react: 18.2.0
-      react-router: 5.3.3_react@18.2.0
-      tiny-invariant: 1.2.0
-      tiny-warning: 1.0.3
-    dev: false
-
-  /react-router/5.3.3_react@18.2.0:
-    resolution: {integrity: sha512-mzQGUvS3bM84TnbtMYR8ZjKnuPJ71IjSzR+DE6UkUqvN4czWIqEs17yLL8xkAycv4ev0AiN+IGrWu88vJs/p2w==}
-    peerDependencies:
-      react: '>=15'
-    dependencies:
-      '@babel/runtime': 7.18.9
-      history: 4.10.1
-      hoist-non-react-statics: 3.3.2
-      loose-envify: 1.4.0
-      mini-create-react-context: 0.4.1_sh5qlbywuemxd2y3xkrw2y2kr4
-      path-to-regexp: 1.8.0
-      prop-types: 15.8.1
-      react: 18.2.0
-      react-is: 16.13.1
-      tiny-invariant: 1.2.0
-      tiny-warning: 1.0.3
-    dev: false
-
-  /react-textarea-autosize/8.3.4_react@18.2.0:
-    resolution: {integrity: sha512-CdtmP8Dc19xL8/R6sWvtknD/eCXkQr30dtvC4VmGInhRsfF8X/ihXCq6+9l9qbxmKRiq407/7z5fxE7cVWQNgQ==}
-    engines: {node: '>=10'}
-    peerDependencies:
-      react: ^16.8.0 || ^17.0.0 || ^18.0.0
-    dependencies:
-      '@babel/runtime': 7.18.9
-      react: 18.2.0
-      use-composed-ref: 1.3.0_react@18.2.0
-      use-latest: 1.2.1_react@18.2.0
-    transitivePeerDependencies:
-      - '@types/react'
-    dev: false
-
-  /react/18.2.0:
-    resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      loose-envify: 1.4.0
-    dev: false
-
-  /readable-stream/2.3.7:
-    resolution: {integrity: sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==}
-    dependencies:
-      core-util-is: 1.0.3
-      inherits: 2.0.4
-      isarray: 1.0.0
-      process-nextick-args: 2.0.1
-      safe-buffer: 5.1.2
-      string_decoder: 1.1.1
-      util-deprecate: 1.0.2
-
-  /readable-stream/3.6.0:
-    resolution: {integrity: sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==}
-    engines: {node: '>= 6'}
-    dependencies:
-      inherits: 2.0.4
-      string_decoder: 1.3.0
-      util-deprecate: 1.0.2
-    dev: false
-
-  /readdirp/3.6.0:
-    resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
-    engines: {node: '>=8.10.0'}
-    dependencies:
-      picomatch: 2.3.1
-    dev: false
-
-  /reading-time/1.5.0:
-    resolution: {integrity: sha512-onYyVhBNr4CmAxFsKS7bz+uTLRakypIe4R+5A824vBSkQy/hB3fZepoVEf8OVAxzLvK+H/jm9TzpI3ETSm64Kg==}
-    dev: false
-
-  /rechoir/0.6.2:
-    resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==}
-    engines: {node: '>= 0.10'}
-    dependencies:
-      resolve: 1.22.1
-    dev: false
-
-  /recursive-readdir/2.2.2:
-    resolution: {integrity: sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      minimatch: 3.0.4
-    dev: false
-
-  /regenerate-unicode-properties/10.0.1:
-    resolution: {integrity: sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==}
-    engines: {node: '>=4'}
-    dependencies:
-      regenerate: 1.4.2
-    dev: false
-
-  /regenerate/1.4.2:
-    resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==}
-    dev: false
-
-  /regenerator-runtime/0.13.9:
-    resolution: {integrity: sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==}
-
-  /regenerator-transform/0.15.0:
-    resolution: {integrity: sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==}
-    dependencies:
-      '@babel/runtime': 7.18.9
-    dev: false
-
-  /regex-not/1.0.2:
-    resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      extend-shallow: 3.0.2
-      safe-regex: 1.1.0
-    dev: true
-
-  /regexp.prototype.flags/1.4.3:
-    resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==}
-    engines: {node: '>= 0.4'}
-    dependencies:
-      call-bind: 1.0.2
-      define-properties: 1.1.4
-      functions-have-names: 1.2.3
-    dev: true
-
-  /regexpp/3.2.0:
-    resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
-    engines: {node: '>=8'}
-    dev: true
-
-  /regexpu-core/5.1.0:
-    resolution: {integrity: sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==}
-    engines: {node: '>=4'}
-    dependencies:
-      regenerate: 1.4.2
-      regenerate-unicode-properties: 10.0.1
-      regjsgen: 0.6.0
-      regjsparser: 0.8.4
-      unicode-match-property-ecmascript: 2.0.0
-      unicode-match-property-value-ecmascript: 2.0.0
-    dev: false
-
-  /registry-auth-token/4.2.2:
-    resolution: {integrity: sha512-PC5ZysNb42zpFME6D/XlIgtNGdTl8bBOCw90xQLVMpzuuubJKYDWFAEuUNc+Cn8Z8724tg2SDhDRrkVEsqfDMg==}
-    engines: {node: '>=6.0.0'}
-    dependencies:
-      rc: 1.2.8
-    dev: false
-
-  /registry-url/5.1.0:
-    resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==}
-    engines: {node: '>=8'}
-    dependencies:
-      rc: 1.2.8
-    dev: false
-
-  /regjsgen/0.6.0:
-    resolution: {integrity: sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==}
-    dev: false
-
-  /regjsparser/0.8.4:
-    resolution: {integrity: sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==}
-    hasBin: true
-    dependencies:
-      jsesc: 0.5.0
-    dev: false
-
-  /relateurl/0.2.7:
-    resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==}
-    engines: {node: '>= 0.10'}
-    dev: false
-
-  /remark-emoji/2.2.0:
-    resolution: {integrity: sha512-P3cj9s5ggsUvWw5fS2uzCHJMGuXYRb0NnZqYlNecewXt8QBU9n5vW3DUUKOhepS8F9CwdMx9B8a3i7pqFWAI5w==}
-    dependencies:
-      emoticon: 3.2.0
-      node-emoji: 1.11.0
-      unist-util-visit: 2.0.3
-    dev: false
-
-  /remark-footnotes/2.0.0:
-    resolution: {integrity: sha512-3Clt8ZMH75Ayjp9q4CorNeyjwIxHFcTkaektplKGl2A1jNGEUey8cKL0ZC5vJwfcD5GFGsNLImLG/NGzWIzoMQ==}
-    dev: false
-
-  /remark-mdx/1.6.22:
-    resolution: {integrity: sha512-phMHBJgeV76uyFkH4rvzCftLfKCr2RZuF+/gmVcaKrpsihyzmhXjA0BEMDaPTXG5y8qZOKPVo83NAOX01LPnOQ==}
-    dependencies:
-      '@babel/core': 7.12.9
-      '@babel/helper-plugin-utils': 7.10.4
-      '@babel/plugin-proposal-object-rest-spread': 7.12.1_@babel+core@7.12.9
-      '@babel/plugin-syntax-jsx': 7.12.1_@babel+core@7.12.9
-      '@mdx-js/util': 1.6.22
-      is-alphabetical: 1.0.4
-      remark-parse: 8.0.3
-      unified: 9.2.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /remark-mdx/2.1.2:
-    resolution: {integrity: sha512-npQagPdczPAv0xN9F8GSi5hJfAe/z6nBjylyfOfjLOmz086ahWrIjlk4BulRfNhA+asutqWxyuT3DFVsxiTVHA==}
-    dependencies:
-      mdast-util-mdx: 2.0.0
-      micromark-extension-mdxjs: 1.0.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /remark-parse/10.0.1:
-    resolution: {integrity: sha512-1fUyHr2jLsVOkhbvPRBJ5zTKZZyD6yZzYaWCS6BPBdQ8vEMBCH+9zNCDA6tET/zHCi/jLqjCWtlJZUPk+DbnFw==}
-    dependencies:
-      '@types/mdast': 3.0.10
-      mdast-util-from-markdown: 1.2.0
-      unified: 10.1.2
-    transitivePeerDependencies:
-      - supports-color
-    dev: true
-
-  /remark-parse/8.0.3:
-    resolution: {integrity: sha512-E1K9+QLGgggHxCQtLt++uXltxEprmWzNfg+MxpfHsZlrddKzZ/hZyWHDbK3/Ap8HJQqYJRXP+jHczdL6q6i85Q==}
-    dependencies:
-      ccount: 1.1.0
-      collapse-white-space: 1.0.6
-      is-alphabetical: 1.0.4
-      is-decimal: 1.0.4
-      is-whitespace-character: 1.0.4
-      is-word-character: 1.0.4
-      markdown-escapes: 1.0.4
-      parse-entities: 2.0.0
-      repeat-string: 1.6.1
-      state-toggle: 1.0.3
-      trim: 0.0.1
-      trim-trailing-lines: 1.1.4
-      unherit: 1.1.3
-      unist-util-remove-position: 2.0.1
-      vfile-location: 3.2.0
-      xtend: 4.0.2
-    dev: false
-
-  /remark-rehype/10.1.0:
-    resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==}
-    dependencies:
-      '@types/hast': 2.3.4
-      '@types/mdast': 3.0.10
-      mdast-util-to-hast: 12.1.2
-      unified: 10.1.2
-    dev: true
-
-  /remark-squeeze-paragraphs/4.0.0:
-    resolution: {integrity: sha512-8qRqmL9F4nuLPIgl92XUuxI3pFxize+F1H0e/W3llTk0UsjJaj01+RrirkMw7P21RKe4X6goQhYRSvNWX+70Rw==}
-    dependencies:
-      mdast-squeeze-paragraphs: 4.0.0
-    dev: false
-
-  /renderkid/3.0.0:
-    resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==}
-    dependencies:
-      css-select: 4.3.0
-      dom-converter: 0.2.0
-      htmlparser2: 6.1.0
-      lodash: 4.17.21
-      strip-ansi: 6.0.1
-    dev: false
-
-  /repeat-element/1.1.4:
-    resolution: {integrity: sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /repeat-string/1.6.1:
-    resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==}
-    engines: {node: '>=0.10'}
-
-  /require-directory/2.1.1:
-    resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /require-from-string/2.0.2:
-    resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
-    engines: {node: '>=0.10.0'}
-    dev: false
-
-  /require-like/0.1.2:
-    resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==}
-    dev: false
-
-  /requires-port/1.0.0:
-    resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
-    dev: false
-
-  /resolve-cwd/3.0.0:
-    resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
-    engines: {node: '>=8'}
-    dependencies:
-      resolve-from: 5.0.0
-    dev: true
-
-  /resolve-from/4.0.0:
-    resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
-    engines: {node: '>=4'}
-
-  /resolve-from/5.0.0:
-    resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
-    engines: {node: '>=8'}
-    dev: true
-
-  /resolve-pathname/3.0.0:
-    resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==}
-    dev: false
-
-  /resolve-url/0.2.1:
-    resolution: {integrity: sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==}
-    deprecated: https://github.com/lydell/resolve-url#deprecated
-    dev: true
-
-  /resolve.exports/1.1.0:
-    resolution: {integrity: sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==}
-    engines: {node: '>=10'}
-    dev: true
-
-  /resolve/1.22.1:
-    resolution: {integrity: sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==}
-    hasBin: true
-    dependencies:
-      is-core-module: 2.9.0
-      path-parse: 1.0.7
-      supports-preserve-symlinks-flag: 1.0.0
-
-  /resolve/2.0.0-next.4:
-    resolution: {integrity: sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==}
-    hasBin: true
-    dependencies:
-      is-core-module: 2.9.0
-      path-parse: 1.0.7
-      supports-preserve-symlinks-flag: 1.0.0
-    dev: true
-
-  /responselike/1.0.2:
-    resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==}
-    dependencies:
-      lowercase-keys: 1.0.1
-
-  /ret/0.1.15:
-    resolution: {integrity: sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==}
-    engines: {node: '>=0.12'}
-    dev: true
-
-  /retry/0.13.1:
-    resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==}
-    engines: {node: '>= 4'}
-    dev: false
-
-  /reusify/1.0.4:
-    resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
-    engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
-
-  /rimraf/3.0.2:
-    resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
-    hasBin: true
-    dependencies:
-      glob: 7.2.3
-
-  /rtl-css-js/1.16.0:
-    resolution: {integrity: sha512-Oc7PnzwIEU4M0K1J4h/7qUUaljXhQ0kCObRsZjxs2HjkpKsnoTMvSmvJ4sqgJZd0zBoEfAyTdnK/jMIYvrjySQ==}
-    dependencies:
-      '@babel/runtime': 7.18.9
-    dev: false
-
-  /rtl-detect/1.0.4:
-    resolution: {integrity: sha512-EBR4I2VDSSYr7PkBmFy04uhycIpDKp+21p/jARYXlCSjQksTBQcJ0HFUPOO79EPPH5JS6VAhiIQbycf0O3JAxQ==}
-    dev: false
-
-  /rtlcss/3.5.0:
-    resolution: {integrity: sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==}
-    hasBin: true
-    dependencies:
-      find-up: 5.0.0
-      picocolors: 1.0.0
-      postcss: 8.4.14
-      strip-json-comments: 3.1.1
-    dev: false
-
-  /run-parallel/1.2.0:
-    resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
-    dependencies:
-      queue-microtask: 1.2.3
-
-  /rxjs/7.5.6:
-    resolution: {integrity: sha512-dnyv2/YsXhnm461G+R/Pe5bWP41Nm6LBXEYWI6eiFP4fiwx6WRI/CD0zbdVAudd9xwLEF2IDcKXLHit0FYjUzw==}
-    dependencies:
-      tslib: 2.4.1
-    dev: false
-
-  /sade/1.8.1:
-    resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==}
-    engines: {node: '>=6'}
-    dependencies:
-      mri: 1.2.0
-    dev: true
-
-  /safe-buffer/5.1.2:
-    resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
-
-  /safe-buffer/5.2.1:
-    resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
-
-  /safe-regex/1.1.0:
-    resolution: {integrity: sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==}
-    dependencies:
-      ret: 0.1.15
-    dev: true
-
-  /safer-buffer/2.1.2:
-    resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
-
-  /sax/1.2.4:
-    resolution: {integrity: sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==}
-    dev: false
-
-  /scheduler/0.23.0:
-    resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==}
-    dependencies:
-      loose-envify: 1.4.0
-    dev: false
-
-  /schema-utils/2.7.0:
-    resolution: {integrity: sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==}
-    engines: {node: '>= 8.9.0'}
-    dependencies:
-      '@types/json-schema': 7.0.11
-      ajv: 6.12.6
-      ajv-keywords: 3.5.2_ajv@6.12.6
-    dev: false
-
-  /schema-utils/2.7.1:
-    resolution: {integrity: sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==}
-    engines: {node: '>= 8.9.0'}
-    dependencies:
-      '@types/json-schema': 7.0.11
-      ajv: 6.12.6
-      ajv-keywords: 3.5.2_ajv@6.12.6
-    dev: false
-
-  /schema-utils/3.1.1:
-    resolution: {integrity: sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==}
-    engines: {node: '>= 10.13.0'}
-    dependencies:
-      '@types/json-schema': 7.0.11
-      ajv: 6.12.6
-      ajv-keywords: 3.5.2_ajv@6.12.6
-    dev: false
-
-  /schema-utils/4.0.0:
-    resolution: {integrity: sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==}
-    engines: {node: '>= 12.13.0'}
-    dependencies:
-      '@types/json-schema': 7.0.11
-      ajv: 8.11.0
-      ajv-formats: 2.1.1
-      ajv-keywords: 5.1.0_ajv@8.11.0
-    dev: false
-
-  /section-matter/1.0.0:
-    resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==}
-    engines: {node: '>=4'}
-    dependencies:
-      extend-shallow: 2.0.1
-      kind-of: 6.0.3
-    dev: false
-
-  /seek-bzip/1.0.6:
-    resolution: {integrity: sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==}
-    hasBin: true
-    dependencies:
-      commander: 2.20.3
-    dev: true
-
-  /select-hose/2.0.0:
-    resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==}
-    dev: false
-
-  /selfsigned/2.0.1:
-    resolution: {integrity: sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==}
-    engines: {node: '>=10'}
-    dependencies:
-      node-forge: 1.3.1
-    dev: false
-
-  /semver-diff/3.1.1:
-    resolution: {integrity: sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==}
-    engines: {node: '>=8'}
-    dependencies:
-      semver: 6.3.0
-    dev: false
-
-  /semver/5.7.1:
-    resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==}
-    hasBin: true
-
-  /semver/6.3.0:
-    resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==}
-    hasBin: true
-
-  /semver/7.3.7:
-    resolution: {integrity: sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==}
-    engines: {node: '>=10'}
-    hasBin: true
-    dependencies:
-      lru-cache: 6.0.0
-
-  /send/0.18.0:
-    resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==}
-    engines: {node: '>= 0.8.0'}
-    dependencies:
-      debug: 2.6.9
-      depd: 2.0.0
-      destroy: 1.2.0
-      encodeurl: 1.0.2
-      escape-html: 1.0.3
-      etag: 1.8.1
-      fresh: 0.5.2
-      http-errors: 2.0.0
-      mime: 1.6.0
-      ms: 2.1.3
-      on-finished: 2.4.1
-      range-parser: 1.2.1
-      statuses: 2.0.1
-    dev: false
-
-  /serialize-javascript/6.0.0:
-    resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==}
-    dependencies:
-      randombytes: 2.1.0
-    dev: false
-
-  /serve-handler/6.1.3:
-    resolution: {integrity: sha512-FosMqFBNrLyeiIDvP1zgO6YoTzFYHxLDEIavhlmQ+knB2Z7l1t+kGLHkZIDN7UVWqQAmKI3D20A6F6jo3nDd4w==}
-    dependencies:
-      bytes: 3.0.0
-      content-disposition: 0.5.2
-      fast-url-parser: 1.1.3
-      mime-types: 2.1.18
-      minimatch: 3.0.4
-      path-is-inside: 1.0.2
-      path-to-regexp: 2.2.1
-      range-parser: 1.2.0
-    dev: false
-
-  /serve-index/1.9.1:
-    resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==}
-    engines: {node: '>= 0.8.0'}
-    dependencies:
-      accepts: 1.3.8
-      batch: 0.6.1
-      debug: 2.6.9
-      escape-html: 1.0.3
-      http-errors: 1.6.3
-      mime-types: 2.1.35
-      parseurl: 1.3.3
-    dev: false
-
-  /serve-static/1.15.0:
-    resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==}
-    engines: {node: '>= 0.8.0'}
-    dependencies:
-      encodeurl: 1.0.2
-      escape-html: 1.0.3
-      parseurl: 1.3.3
-      send: 0.18.0
-    dev: false
-
-  /set-value/2.0.1:
-    resolution: {integrity: sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      extend-shallow: 2.0.1
-      is-extendable: 0.1.1
-      is-plain-object: 2.0.4
-      split-string: 3.1.0
-    dev: true
-
-  /setimmediate/1.0.5:
-    resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==}
-    dev: false
-
-  /setprototypeof/1.1.0:
-    resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==}
-    dev: false
-
-  /setprototypeof/1.2.0:
-    resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==}
-    dev: false
-
-  /shallow-clone/3.0.1:
-    resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==}
-    engines: {node: '>=8'}
-    dependencies:
-      kind-of: 6.0.3
-    dev: false
-
-  /shallowequal/1.1.0:
-    resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==}
-    dev: false
-
-  /shebang-command/2.0.0:
-    resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
-    engines: {node: '>=8'}
-    dependencies:
-      shebang-regex: 3.0.0
-
-  /shebang-regex/3.0.0:
-    resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
-    engines: {node: '>=8'}
-
-  /shell-quote/1.7.3:
-    resolution: {integrity: sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==}
-    dev: false
-
-  /shelljs/0.8.5:
-    resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==}
-    engines: {node: '>=4'}
-    hasBin: true
-    dependencies:
-      glob: 7.2.3
-      interpret: 1.4.0
-      rechoir: 0.6.2
-    dev: false
-
-  /side-channel/1.0.4:
-    resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==}
-    dependencies:
-      call-bind: 1.0.2
-      get-intrinsic: 1.1.2
-      object-inspect: 1.12.2
-
-  /signal-exit/3.0.7:
-    resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==}
-
-  /sirv/1.0.19:
-    resolution: {integrity: sha512-JuLThK3TnZG1TAKDwNIqNq6QA2afLOCcm+iE8D1Kj3GA40pSPsxQjjJl0J8X3tsR7T+CP1GavpzLwYkgVLWrZQ==}
-    engines: {node: '>= 10'}
-    dependencies:
-      '@polka/url': 1.0.0-next.21
-      mrmime: 1.0.1
-      totalist: 1.1.0
-    dev: false
-
-  /sisteransi/1.0.5:
-    resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
-
-  /sitemap/7.1.1:
-    resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==}
-    engines: {node: '>=12.0.0', npm: '>=5.6.0'}
-    hasBin: true
-    dependencies:
-      '@types/node': 17.0.45
-      '@types/sax': 1.2.4
-      arg: 5.0.2
-      sax: 1.2.4
-    dev: false
-
-  /slash/3.0.0:
-    resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
-    engines: {node: '>=8'}
-
-  /slash/4.0.0:
-    resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==}
-    engines: {node: '>=12'}
-    dev: false
-
-  /snapdragon-node/2.1.1:
-    resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      define-property: 1.0.0
-      isobject: 3.0.1
-      snapdragon-util: 3.0.1
-    dev: true
-
-  /snapdragon-util/3.0.1:
-    resolution: {integrity: sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      kind-of: 3.2.2
-    dev: true
-
-  /snapdragon/0.8.2:
-    resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      base: 0.11.2
-      debug: 2.6.9
-      define-property: 0.2.5
-      extend-shallow: 2.0.1
-      map-cache: 0.2.2
-      source-map: 0.5.7
-      source-map-resolve: 0.5.3
-      use: 3.1.1
-    dev: true
-
-  /sockjs/0.3.24:
-    resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==}
-    dependencies:
-      faye-websocket: 0.11.4
-      uuid: 8.3.2
-      websocket-driver: 0.7.4
-    dev: false
-
-  /sort-css-media-queries/2.0.4:
-    resolution: {integrity: sha512-PAIsEK/XupCQwitjv7XxoMvYhT7EAfyzI3hsy/MyDgTvc+Ft55ctdkctJLOy6cQejaIC+zjpUL4djFVm2ivOOw==}
-    engines: {node: '>= 6.3.0'}
-    dev: false
-
-  /sort-keys-length/1.0.1:
-    resolution: {integrity: sha512-GRbEOUqCxemTAk/b32F2xa8wDTs+Z1QHOkbhJDQTvv/6G3ZkbJ+frYWsTcc7cBB3Fu4wy4XlLCuNtJuMn7Gsvw==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      sort-keys: 1.1.2
-    dev: true
-
-  /sort-keys/1.1.2:
-    resolution: {integrity: sha512-vzn8aSqKgytVik0iwdBEi+zevbTYZogewTUM6dtpmGwEcdzbub/TX4bCzRhebDCRC3QzXgJsLRKB2V/Oof7HXg==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-plain-obj: 1.1.0
-    dev: true
-
-  /sort-keys/2.0.0:
-    resolution: {integrity: sha512-/dPCrG1s3ePpWm6yBbxZq5Be1dXGLyLn9Z791chDC3NFrpkVbWGzkBwPN1knaciexFXgRJ7hzdnwZ4stHSDmjg==}
-    engines: {node: '>=4'}
-    dependencies:
-      is-plain-obj: 1.1.0
-    dev: true
-
-  /source-map-js/1.0.2:
-    resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
-    engines: {node: '>=0.10.0'}
-
-  /source-map-loader/4.0.1:
-    resolution: {integrity: sha512-oqXpzDIByKONVY8g1NUPOTQhe0UTU5bWUl32GSkqK2LjJj0HmwTMVKxcUip0RgAYhY1mqgOxjbQM48a0mmeNfA==}
-    engines: {node: '>= 14.15.0'}
-    peerDependencies:
-      webpack: ^5.72.1
-    dependencies:
-      abab: 2.0.6
-      iconv-lite: 0.6.3
-      source-map-js: 1.0.2
-    dev: true
-
-  /source-map-resolve/0.5.3:
-    resolution: {integrity: sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==}
-    deprecated: See https://github.com/lydell/source-map-resolve#deprecated
-    dependencies:
-      atob: 2.1.2
-      decode-uri-component: 0.2.0
-      resolve-url: 0.2.1
-      source-map-url: 0.4.1
-      urix: 0.1.0
-    dev: true
-
-  /source-map-support/0.5.13:
-    resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==}
-    dependencies:
-      buffer-from: 1.1.2
-      source-map: 0.6.1
-    dev: true
-
-  /source-map-support/0.5.21:
-    resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
-    dependencies:
-      buffer-from: 1.1.2
-      source-map: 0.6.1
-
-  /source-map-url/0.4.1:
-    resolution: {integrity: sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==}
-    deprecated: See https://github.com/lydell/source-map-url#deprecated
-    dev: true
-
-  /source-map/0.5.7:
-    resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
-    engines: {node: '>=0.10.0'}
-
-  /source-map/0.6.1:
-    resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
-    engines: {node: '>=0.10.0'}
-
-  /source-map/0.7.4:
-    resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
-    engines: {node: '>= 8'}
-    dev: true
-
-  /space-separated-tokens/1.1.5:
-    resolution: {integrity: sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==}
-    dev: false
-
-  /space-separated-tokens/2.0.1:
-    resolution: {integrity: sha512-ekwEbFp5aqSPKaqeY1PGrlGQxPNaq+Cnx4+bE2D8sciBQrHpbwoBbawqTN2+6jPs9IdWxxiUcN0K2pkczD3zmw==}
-    dev: true
-
-  /spdy-transport/3.0.0:
-    resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==}
-    dependencies:
-      debug: 4.3.4
-      detect-node: 2.1.0
-      hpack.js: 2.1.6
-      obuf: 1.1.2
-      readable-stream: 3.6.0
-      wbuf: 1.7.3
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /spdy/4.0.2:
-    resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==}
-    engines: {node: '>=6.0.0'}
-    dependencies:
-      debug: 4.3.4
-      handle-thing: 2.0.1
-      http-deceiver: 1.2.7
-      select-hose: 2.0.0
-      spdy-transport: 3.0.0
-    transitivePeerDependencies:
-      - supports-color
-    dev: false
-
-  /split-string/3.1.0:
-    resolution: {integrity: sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      extend-shallow: 3.0.2
-    dev: true
-
-  /sprintf-js/1.0.3:
-    resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
-
-  /stable/0.1.8:
-    resolution: {integrity: sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==}
-    deprecated: 'Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility'
-    dev: false
-
-  /stack-utils/2.0.5:
-    resolution: {integrity: sha512-xrQcmYhOsn/1kX+Vraq+7j4oE2j/6BFscZ0etmYg81xuM8Gq0022Pxb8+IqgOFUIaxHs0KaSb7T1+OegiNrNFA==}
-    engines: {node: '>=10'}
-    dependencies:
-      escape-string-regexp: 2.0.0
-    dev: true
-
-  /state-toggle/1.0.3:
-    resolution: {integrity: sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==}
-    dev: false
-
-  /static-extend/0.1.2:
-    resolution: {integrity: sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      define-property: 0.2.5
-      object-copy: 0.1.0
-    dev: true
-
-  /statuses/1.5.0:
-    resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==}
-    engines: {node: '>= 0.6'}
-    dev: false
-
-  /statuses/2.0.1:
-    resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
-    engines: {node: '>= 0.8'}
-    dev: false
-
-  /std-env/3.1.1:
-    resolution: {integrity: sha512-/c645XdExBypL01TpFKiG/3RAa/Qmu+zRi0MwAmrdEkwHNuN0ebo8ccAXBBDa5Z0QOJgBskUIbuCK91x0sCVEw==}
-    dev: false
-
-  /strict-uri-encode/1.1.0:
-    resolution: {integrity: sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /string-length/4.0.2:
-    resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
-    engines: {node: '>=10'}
-    dependencies:
-      char-regex: 1.0.2
-      strip-ansi: 6.0.1
-    dev: true
-
-  /string-width/4.2.3:
-    resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
-    engines: {node: '>=8'}
-    dependencies:
-      emoji-regex: 8.0.0
-      is-fullwidth-code-point: 3.0.0
-      strip-ansi: 6.0.1
-
-  /string-width/5.1.2:
-    resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==}
-    engines: {node: '>=12'}
-    dependencies:
-      eastasianwidth: 0.2.0
-      emoji-regex: 9.2.2
-      strip-ansi: 7.0.1
-    dev: false
-
-  /string.prototype.matchall/4.0.7:
-    resolution: {integrity: sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==}
-    dependencies:
-      call-bind: 1.0.2
-      define-properties: 1.1.4
-      es-abstract: 1.20.1
-      get-intrinsic: 1.1.2
-      has-symbols: 1.0.3
-      internal-slot: 1.0.3
-      regexp.prototype.flags: 1.4.3
-      side-channel: 1.0.4
-    dev: true
-
-  /string.prototype.trimend/1.0.5:
-    resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==}
-    dependencies:
-      call-bind: 1.0.2
-      define-properties: 1.1.4
-      es-abstract: 1.20.1
-    dev: true
-
-  /string.prototype.trimstart/1.0.5:
-    resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==}
-    dependencies:
-      call-bind: 1.0.2
-      define-properties: 1.1.4
-      es-abstract: 1.20.1
-    dev: true
-
-  /string_decoder/1.1.1:
-    resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
-    dependencies:
-      safe-buffer: 5.1.2
-
-  /string_decoder/1.3.0:
-    resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
-    dependencies:
-      safe-buffer: 5.2.1
-    dev: false
-
-  /stringify-entities/4.0.3:
-    resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==}
-    dependencies:
-      character-entities-html4: 2.1.0
-      character-entities-legacy: 3.0.0
-    dev: true
-
-  /stringify-object/3.3.0:
-    resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==}
-    engines: {node: '>=4'}
-    dependencies:
-      get-own-enumerable-property-symbols: 3.0.2
-      is-obj: 1.0.1
-      is-regexp: 1.0.0
-    dev: false
-
-  /strip-ansi/6.0.1:
-    resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
-    engines: {node: '>=8'}
-    dependencies:
-      ansi-regex: 5.0.1
-
-  /strip-ansi/7.0.1:
-    resolution: {integrity: sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==}
-    engines: {node: '>=12'}
-    dependencies:
-      ansi-regex: 6.0.1
-    dev: false
-
-  /strip-bom-string/1.0.0:
-    resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==}
-    engines: {node: '>=0.10.0'}
-    dev: false
-
-  /strip-bom/3.0.0:
-    resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /strip-bom/4.0.0:
-    resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
-    engines: {node: '>=8'}
-    dev: true
-
-  /strip-dirs/2.1.0:
-    resolution: {integrity: sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==}
-    dependencies:
-      is-natural-number: 4.0.1
-    dev: true
-
-  /strip-final-newline/2.0.0:
-    resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
-    engines: {node: '>=6'}
-
-  /strip-json-comments/2.0.1:
-    resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
-    engines: {node: '>=0.10.0'}
-    dev: false
-
-  /strip-json-comments/3.1.1:
-    resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
-    engines: {node: '>=8'}
-
-  /strip-outer/1.0.1:
-    resolution: {integrity: sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      escape-string-regexp: 1.0.5
-    dev: true
-
-  /style-to-object/0.3.0:
-    resolution: {integrity: sha512-CzFnRRXhzWIdItT3OmF8SQfWyahHhjq3HwcMNCNLn+N7klOOqPjMeG/4JSu77D7ypZdGvSzvkrbyeTMizz2VrA==}
-    dependencies:
-      inline-style-parser: 0.1.1
-
-  /styled-jsx/5.1.0_react@18.2.0:
-    resolution: {integrity: sha512-/iHaRJt9U7T+5tp6TRelLnqBqiaIT0HsO0+vgyj8hK2KUk7aejFqRrumqPUlAqDwAj8IbS/1hk3IhBAAK/FCUQ==}
-    engines: {node: '>= 12.0.0'}
-    peerDependencies:
-      '@babel/core': '*'
-      babel-plugin-macros: '*'
-      react: '>= 16.8.0 || 17.x.x || ^18.0.0-0'
-    peerDependenciesMeta:
-      '@babel/core':
-        optional: true
-      babel-plugin-macros:
-        optional: true
-    dependencies:
-      client-only: 0.0.1
-      react: 18.2.0
-    dev: false
-
-  /stylehacks/5.1.0_postcss@8.4.14:
-    resolution: {integrity: sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==}
-    engines: {node: ^10 || ^12 || >=14.0}
-    peerDependencies:
-      postcss: ^8.2.15
-    dependencies:
-      browserslist: 4.21.4
-      postcss: 8.4.14
-      postcss-selector-parser: 6.0.10
-    dev: false
-
-  /stylis/4.1.1:
-    resolution: {integrity: sha512-lVrM/bNdhVX2OgBFNa2YJ9Lxj7kPzylieHd3TNjuGE0Re9JB7joL5VUKOVH1kdNNJTgGPpT8hmwIAPLaSyEVFQ==}
-    dev: false
-
-  /supports-color/5.5.0:
-    resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
-    engines: {node: '>=4'}
-    dependencies:
-      has-flag: 3.0.0
-
-  /supports-color/7.2.0:
-    resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
-    engines: {node: '>=8'}
-    dependencies:
-      has-flag: 4.0.0
-
-  /supports-color/8.1.1:
-    resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
-    engines: {node: '>=10'}
-    dependencies:
-      has-flag: 4.0.0
-
-  /supports-preserve-symlinks-flag/1.0.0:
-    resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
-    engines: {node: '>= 0.4'}
-
-  /svg-parser/2.0.4:
-    resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==}
-    dev: false
-
-  /svgo/2.8.0:
-    resolution: {integrity: sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==}
-    engines: {node: '>=10.13.0'}
-    hasBin: true
-    dependencies:
-      '@trysound/sax': 0.2.0
-      commander: 7.2.0
-      css-select: 4.3.0
-      css-tree: 1.1.3
-      csso: 4.2.0
-      picocolors: 1.0.0
-      stable: 0.1.8
-    dev: false
-
-  /tapable/0.2.9:
-    resolution: {integrity: sha512-2wsvQ+4GwBvLPLWsNfLCDYGsW6xb7aeC6utq2Qh0PFwgEy7K7dsma9Jsmb2zSQj7GvYAyUGSntLtsv++GmgL1A==}
-    engines: {node: '>=0.6'}
-    dev: true
-
-  /tapable/1.1.3:
-    resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==}
-    engines: {node: '>=6'}
-    dev: false
-
-  /tapable/2.2.1:
-    resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
-    engines: {node: '>=6'}
-    dev: false
-
-  /tar-stream/1.6.2:
-    resolution: {integrity: sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==}
-    engines: {node: '>= 0.8.0'}
-    dependencies:
-      bl: 1.2.3
-      buffer-alloc: 1.2.0
-      end-of-stream: 1.4.4
-      fs-constants: 1.0.0
-      readable-stream: 2.3.7
-      to-buffer: 1.1.1
-      xtend: 4.0.2
-    dev: true
-
-  /terser-webpack-plugin/5.3.3_webpack@5.73.0:
-    resolution: {integrity: sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==}
-    engines: {node: '>= 10.13.0'}
-    peerDependencies:
-      '@swc/core': '*'
-      esbuild: '*'
-      uglify-js: '*'
-      webpack: ^5.1.0
-    peerDependenciesMeta:
-      '@swc/core':
-        optional: true
-      esbuild:
-        optional: true
-      uglify-js:
-        optional: true
-    dependencies:
-      '@jridgewell/trace-mapping': 0.3.14
-      jest-worker: 27.5.1
-      schema-utils: 3.1.1
-      serialize-javascript: 6.0.0
-      terser: 5.14.2
-      webpack: 5.73.0
-    dev: false
-
-  /terser/5.14.2:
-    resolution: {integrity: sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==}
-    engines: {node: '>=10'}
-    hasBin: true
-    dependencies:
-      '@jridgewell/source-map': 0.3.2
-      acorn: 8.7.1
-      commander: 2.20.3
-      source-map-support: 0.5.21
-    dev: false
-
-  /test-exclude/6.0.0:
-    resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
-    engines: {node: '>=8'}
-    dependencies:
-      '@istanbuljs/schema': 0.1.3
-      glob: 7.2.3
-      minimatch: 3.1.2
-    dev: true
-
-  /text-table/0.2.0:
-    resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
-
-  /through/2.3.8:
-    resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
-    dev: true
-
-  /thunky/1.1.0:
-    resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==}
-    dev: false
-
-  /timed-out/4.0.1:
-    resolution: {integrity: sha512-G7r3AhovYtr5YKOWQkta8RKAPb+J9IsO4uVmzjl8AZwfhs8UcUwTiD6gcJYSgOtzyjvQKrKYn41syHbUWMkafA==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /tiny-invariant/1.2.0:
-    resolution: {integrity: sha512-1Uhn/aqw5C6RI4KejVeTg6mIS7IqxnLJ8Mv2tV5rTc0qWobay7pDUz6Wi392Cnc8ak1H0F2cjoRzb2/AW4+Fvg==}
-    dev: false
-
-  /tiny-warning/1.0.3:
-    resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==}
-    dev: false
-
-  /tinyh264/0.0.7:
-    resolution: {integrity: sha512-etkBRgYkSFBdAi2Cqk4sZgi+xWs/vhzNgvjO3z2i4WILeEmORiNqxuQ4URJatrWQ9LPNV3WPWAtzsh/LA/XL/g==}
-    dev: false
-
-  /tmpl/1.0.5:
-    resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
-    dev: true
-
-  /to-buffer/1.1.1:
-    resolution: {integrity: sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==}
-    dev: true
-
-  /to-fast-properties/2.0.0:
-    resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
-    engines: {node: '>=4'}
-
-  /to-object-path/0.3.0:
-    resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      kind-of: 3.2.2
-    dev: true
-
-  /to-readable-stream/1.0.0:
-    resolution: {integrity: sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==}
-    engines: {node: '>=6'}
-    dev: false
-
-  /to-regex-range/2.1.1:
-    resolution: {integrity: sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      is-number: 3.0.0
-      repeat-string: 1.6.1
-    dev: true
-
-  /to-regex-range/5.0.1:
-    resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
-    engines: {node: '>=8.0'}
-    dependencies:
-      is-number: 7.0.0
-
-  /to-regex/3.0.2:
-    resolution: {integrity: sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      define-property: 2.0.2
-      extend-shallow: 3.0.2
-      regex-not: 1.0.2
-      safe-regex: 1.1.0
-    dev: true
-
-  /toidentifier/1.0.1:
-    resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==}
-    engines: {node: '>=0.6'}
-    dev: false
-
-  /totalist/1.1.0:
-    resolution: {integrity: sha512-gduQwd1rOdDMGxFG1gEvhV88Oirdo2p+KjoYFU7k2g+i7n6AFFbDQ5kMPUsW0pNbfQsB/cwXvT1i4Bue0s9g5g==}
-    engines: {node: '>=6'}
-    dev: false
-
-  /tr46/0.0.3:
-    resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
-
-  /trim-lines/3.0.1:
-    resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
-    dev: true
-
-  /trim-repeated/1.0.0:
-    resolution: {integrity: sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      escape-string-regexp: 1.0.5
-    dev: true
-
-  /trim-trailing-lines/1.1.4:
-    resolution: {integrity: sha512-rjUWSqnfTNrjbB9NQWfPMH/xRK1deHeGsHoVfpxJ++XeYXE0d6B1En37AHfw3jtfTU7dzMzZL2jjpe8Qb5gLIQ==}
-    dev: false
-
-  /trim/0.0.1:
-    resolution: {integrity: sha1-WFhUf2spB1fulczMZm+1AITEYN0=}
-    dev: false
-
-  /trough/1.0.5:
-    resolution: {integrity: sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==}
-    dev: false
-
-  /trough/2.1.0:
-    resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==}
-    dev: true
-
-  /ts-jest/29.0.3_r24ewcothphvclnu77pxb4u4se:
-    resolution: {integrity: sha512-Ibygvmuyq1qp/z3yTh9QTwVVAbFdDy/+4BtIQR2sp6baF2SJU/8CKK/hhnGIDY2L90Az2jIqTwZPnN2p+BweiQ==}
-    engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
-    hasBin: true
-    peerDependencies:
-      '@babel/core': '>=7.0.0-beta.0 <8'
-      '@jest/types': ^29.0.0
-      babel-jest: ^29.0.0
-      esbuild: '*'
-      jest: ^29.0.0
-      typescript: '>=4.3'
-    peerDependenciesMeta:
-      '@babel/core':
-        optional: true
-      '@jest/types':
-        optional: true
-      babel-jest:
-        optional: true
-      esbuild:
-        optional: true
-    dependencies:
-      bs-logger: 0.2.6
-      fast-json-stable-stringify: 2.1.0
-      jest: 29.3.1_@types+node@18.11.9
-      jest-util: 29.3.1
-      json5: 2.2.1
-      lodash.memoize: 4.1.2
-      make-error: 1.3.6
-      semver: 7.3.7
-      typescript: 4.8.4
-      yargs-parser: 21.0.1
-    dev: true
-
-  /tsconfig-paths/3.14.1:
-    resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==}
-    dependencies:
-      '@types/json5': 0.0.29
-      json5: 1.0.1
-      minimist: 1.2.6
-      strip-bom: 3.0.0
-    dev: true
-
-  /tslib/1.14.1:
-    resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
-    dev: true
-
-  /tslib/2.4.1:
-    resolution: {integrity: sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==}
-    dev: false
-
-  /tsutils/3.21.0_typescript@4.8.4:
-    resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==}
-    engines: {node: '>= 6'}
-    peerDependencies:
-      typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta'
-    dependencies:
-      tslib: 1.14.1
-      typescript: 4.8.4
-    dev: true
-
-  /type-check/0.4.0:
-    resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
-    engines: {node: '>= 0.8.0'}
-    dependencies:
-      prelude-ls: 1.2.1
-    dev: true
-
-  /type-detect/4.0.8:
-    resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
-    engines: {node: '>=4'}
-    dev: true
-
-  /type-fest/0.20.2:
-    resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==}
-    engines: {node: '>=10'}
-
-  /type-fest/0.21.3:
-    resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
-    engines: {node: '>=10'}
-    dev: true
-
-  /type-fest/2.16.0:
-    resolution: {integrity: sha512-qpaThT2HQkFb83gMOrdKVsfCN7LKxP26Yq+smPzY1FqoHRjqmjqHXA7n5Gkxi8efirtbeEUxzfEdePthQWCuHw==}
-    engines: {node: '>=12.20'}
-    dev: false
-
-  /type-is/1.6.18:
-    resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
-    engines: {node: '>= 0.6'}
-    dependencies:
-      media-typer: 0.3.0
-      mime-types: 2.1.35
-    dev: false
-
-  /typedarray-to-buffer/3.1.5:
-    resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
-    dependencies:
-      is-typedarray: 1.0.0
-    dev: false
-
-  /typescript/4.8.4:
-    resolution: {integrity: sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==}
-    engines: {node: '>=4.2.0'}
-    hasBin: true
-    dev: true
-
-  /ua-parser-js/0.7.31:
-    resolution: {integrity: sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==}
-    dev: false
-
-  /unbox-primitive/1.0.2:
-    resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
-    dependencies:
-      call-bind: 1.0.2
-      has-bigints: 1.0.2
-      has-symbols: 1.0.3
-      which-boxed-primitive: 1.0.2
-    dev: true
-
-  /unbzip2-stream/1.4.3:
-    resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==}
-    dependencies:
-      buffer: 5.7.1
-      through: 2.3.8
-    dev: true
-
-  /unherit/1.1.3:
-    resolution: {integrity: sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==}
-    dependencies:
-      inherits: 2.0.4
-      xtend: 4.0.2
-    dev: false
-
-  /unicode-canonical-property-names-ecmascript/2.0.0:
-    resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==}
-    engines: {node: '>=4'}
-    dev: false
-
-  /unicode-match-property-ecmascript/2.0.0:
-    resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==}
-    engines: {node: '>=4'}
-    dependencies:
-      unicode-canonical-property-names-ecmascript: 2.0.0
-      unicode-property-aliases-ecmascript: 2.0.0
-    dev: false
-
-  /unicode-match-property-value-ecmascript/2.0.0:
-    resolution: {integrity: sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==}
-    engines: {node: '>=4'}
-    dev: false
-
-  /unicode-property-aliases-ecmascript/2.0.0:
-    resolution: {integrity: sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==}
-    engines: {node: '>=4'}
-    dev: false
-
-  /unified/10.1.2:
-    resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==}
-    dependencies:
-      '@types/unist': 2.0.6
-      bail: 2.0.2
-      extend: 3.0.2
-      is-buffer: 2.0.5
-      is-plain-obj: 4.1.0
-      trough: 2.1.0
-      vfile: 5.3.4
-    dev: true
-
-  /unified/9.2.0:
-    resolution: {integrity: sha512-vx2Z0vY+a3YoTj8+pttM3tiJHCwY5UFbYdiWrwBEbHmK8pvsPj2rtAX2BFfgXen8T39CJWblWRDT4L5WGXtDdg==}
-    dependencies:
-      bail: 1.0.5
-      extend: 3.0.2
-      is-buffer: 2.0.5
-      is-plain-obj: 2.1.0
-      trough: 1.0.5
-      vfile: 4.2.1
-    dev: false
-
-  /unified/9.2.2:
-    resolution: {integrity: sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ==}
-    dependencies:
-      bail: 1.0.5
-      extend: 3.0.2
-      is-buffer: 2.0.5
-      is-plain-obj: 2.1.0
-      trough: 1.0.5
-      vfile: 4.2.1
-    dev: false
-
-  /union-value/1.0.1:
-    resolution: {integrity: sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      arr-union: 3.1.0
-      get-value: 2.0.6
-      is-extendable: 0.1.1
-      set-value: 2.0.1
-    dev: true
-
-  /unique-string/2.0.0:
-    resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==}
-    engines: {node: '>=8'}
-    dependencies:
-      crypto-random-string: 2.0.0
-    dev: false
-
-  /unist-builder/2.0.3:
-    resolution: {integrity: sha512-f98yt5pnlMWlzP539tPc4grGMsFaQQlP/vM396b00jngsiINumNmsY8rkXjfoi1c6QaM8nQ3vaGDuoKWbe/1Uw==}
-    dev: false
-
-  /unist-builder/3.0.0:
-    resolution: {integrity: sha512-GFxmfEAa0vi9i5sd0R2kcrI9ks0r82NasRq5QHh2ysGngrc6GiqD5CDf1FjPenY4vApmFASBIIlk/jj5J5YbmQ==}
-    dependencies:
-      '@types/unist': 2.0.6
-    dev: true
-
-  /unist-util-generated/1.1.6:
-    resolution: {integrity: sha512-cln2Mm1/CZzN5ttGK7vkoGw+RZ8VcUH6BtGbq98DDtRGquAAOXig1mrBQYelOwMXYS8rK+vZDyyojSjp7JX+Lg==}
-    dev: false
-
-  /unist-util-generated/2.0.0:
-    resolution: {integrity: sha512-TiWE6DVtVe7Ye2QxOVW9kqybs6cZexNwTwSMVgkfjEReqy/xwGpAXb99OxktoWwmL+Z+Epb0Dn8/GNDYP1wnUw==}
-    dev: true
-
-  /unist-util-is/4.1.0:
-    resolution: {integrity: sha512-ZOQSsnce92GrxSqlnEEseX0gi7GH9zTJZ0p9dtu87WRb/37mMPO2Ilx1s/t9vBHrFhbgweUwb+t7cIn5dxPhZg==}
-
-  /unist-util-is/5.1.1:
-    resolution: {integrity: sha512-F5CZ68eYzuSvJjGhCLPL3cYx45IxkqXSetCcRgUXtbcm50X2L9oOWQlfUfDdAf+6Pd27YDblBfdtmsThXmwpbQ==}
-    dev: true
-
-  /unist-util-position-from-estree/1.1.1:
-    resolution: {integrity: sha512-xtoY50b5+7IH8tFbkw64gisG9tMSpxDjhX9TmaJJae/XuxQ9R/Kc8Nv1eOsf43Gt4KV/LkriMy9mptDr7XLcaw==}
-    dependencies:
-      '@types/unist': 2.0.6
-    dev: true
-
-  /unist-util-position/3.1.0:
-    resolution: {integrity: sha512-w+PkwCbYSFw8vpgWD0v7zRCl1FpY3fjDSQ3/N/wNd9Ffa4gPi8+4keqt99N3XW6F99t/mUzp2xAhNmfKWp95QA==}
-    dev: false
-
-  /unist-util-position/4.0.3:
-    resolution: {integrity: sha512-p/5EMGIa1qwbXjA+QgcBXaPWjSnZfQ2Sc3yBEEfgPwsEmJd8Qh+DSk3LGnmOM4S1bY2C0AjmMnB8RuEYxpPwXQ==}
-    dependencies:
-      '@types/unist': 2.0.6
-    dev: true
-
-  /unist-util-remove-position/2.0.1:
-    resolution: {integrity: sha512-fDZsLYIe2uT+oGFnuZmy73K6ZxOPG/Qcm+w7jbEjaFcJgbQ6cqjs/eSPzXhsmGpAsWPkqZM9pYjww5QTn3LHMA==}
-    dependencies:
-      unist-util-visit: 2.0.3
-    dev: false
-
-  /unist-util-remove-position/4.0.1:
-    resolution: {integrity: sha512-0yDkppiIhDlPrfHELgB+NLQD5mfjup3a8UYclHruTJWmY74je8g+CIFr79x5f6AkmzSwlvKLbs63hC0meOMowQ==}
-    dependencies:
-      '@types/unist': 2.0.6
-      unist-util-visit: 4.1.0
-    dev: true
-
-  /unist-util-remove/2.1.0:
-    resolution: {integrity: sha512-J8NYPyBm4baYLdCbjmf1bhPu45Cr1MWTm77qd9istEkzWpnN6O9tMsEbB2JhNnBCqGENRqEWomQ+He6au0B27Q==}
-    dependencies:
-      unist-util-is: 4.1.0
-    dev: false
-
-  /unist-util-stringify-position/2.0.3:
-    resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==}
-    dependencies:
-      '@types/unist': 2.0.6
-    dev: false
-
-  /unist-util-stringify-position/3.0.2:
-    resolution: {integrity: sha512-7A6eiDCs9UtjcwZOcCpM4aPII3bAAGv13E96IkawkOAW0OhH+yRxtY0lzo8KiHpzEMfH7Q+FizUmwp8Iqy5EWg==}
-    dependencies:
-      '@types/unist': 2.0.6
-    dev: true
-
-  /unist-util-visit-parents/3.1.1:
-    resolution: {integrity: sha512-1KROIZWo6bcMrZEwiH2UrXDyalAa0uqzWCxCJj6lPOvTve2WkfgCytoDTPaMnodXh1WrXOq0haVYHj99ynJlsg==}
-    dependencies:
-      '@types/unist': 2.0.6
-      unist-util-is: 4.1.0
-
-  /unist-util-visit-parents/5.1.0:
-    resolution: {integrity: sha512-y+QVLcY5eR/YVpqDsLf/xh9R3Q2Y4HxkZTp7ViLDU6WtJCEcPmRzW1gpdWDCDIqIlhuPDXOgttqPlykrHYDekg==}
-    dependencies:
-      '@types/unist': 2.0.6
-      unist-util-is: 5.1.1
-    dev: true
-
-  /unist-util-visit/2.0.3:
-    resolution: {integrity: sha512-iJ4/RczbJMkD0712mGktuGpm/U4By4FfDonL7N/9tATGIF4imikjOuagyMY53tnZq3NP6BcmlrHhEKAfGWjh7Q==}
-    dependencies:
-      '@types/unist': 2.0.6
-      unist-util-is: 4.1.0
-      unist-util-visit-parents: 3.1.1
-
-  /unist-util-visit/4.1.0:
-    resolution: {integrity: sha512-n7lyhFKJfVZ9MnKtqbsqkQEk5P1KShj0+//V7mAcoI6bpbUjh3C/OG8HVD+pBihfh6Ovl01m8dkcv9HNqYajmQ==}
-    dependencies:
-      '@types/unist': 2.0.6
-      unist-util-is: 5.1.1
-      unist-util-visit-parents: 5.1.0
-    dev: true
-
-  /universalify/2.0.0:
-    resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==}
-    engines: {node: '>= 10.0.0'}
-    dev: false
-
-  /unpipe/1.0.0:
-    resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==}
-    engines: {node: '>= 0.8'}
-    dev: false
-
-  /unset-value/1.0.0:
-    resolution: {integrity: sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==}
-    engines: {node: '>=0.10.0'}
-    dependencies:
-      has-value: 0.3.1
-      isobject: 3.0.1
-    dev: true
-
-  /update-browserslist-db/1.0.10_browserslist@4.21.4:
-    resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==}
-    hasBin: true
-    peerDependencies:
-      browserslist: '>= 4.21.0'
-    dependencies:
-      browserslist: 4.21.4
-      escalade: 3.1.1
-      picocolors: 1.0.0
-
-  /update-browserslist-db/1.0.5_browserslist@4.21.2:
-    resolution: {integrity: sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q==}
-    hasBin: true
-    peerDependencies:
-      browserslist: '>= 4.21.0'
-    dependencies:
-      browserslist: 4.21.2
-      escalade: 3.1.1
-      picocolors: 1.0.0
-    dev: false
-
-  /update-notifier/5.1.0:
-    resolution: {integrity: sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==}
-    engines: {node: '>=10'}
-    dependencies:
-      boxen: 5.1.2
-      chalk: 4.1.2
-      configstore: 5.0.1
-      has-yarn: 2.1.0
-      import-lazy: 2.1.0
-      is-ci: 2.0.0
-      is-installed-globally: 0.4.0
-      is-npm: 5.0.0
-      is-yarn-global: 0.3.0
-      latest-version: 5.1.0
-      pupa: 2.1.1
-      semver: 7.3.7
-      semver-diff: 3.1.1
-      xdg-basedir: 4.0.0
-    dev: false
-
-  /uri-js/4.4.1:
-    resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
-    dependencies:
-      punycode: 2.1.1
-
-  /urix/0.1.0:
-    resolution: {integrity: sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==}
-    deprecated: Please see https://github.com/lydell/urix#deprecated
-    dev: true
-
-  /url-loader/4.1.1_file-loader@6.2.0:
-    resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==}
-    engines: {node: '>= 10.13.0'}
-    peerDependencies:
-      file-loader: '*'
-      webpack: ^4.0.0 || ^5.0.0
-    peerDependenciesMeta:
-      file-loader:
-        optional: true
-    dependencies:
-      file-loader: 6.2.0
-      loader-utils: 2.0.2
-      mime-types: 2.1.35
-      schema-utils: 3.1.1
-    dev: false
-
-  /url-loader/4.1.1_ljnyroaqobwke7fusd7ro2cgzm:
-    resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==}
-    engines: {node: '>= 10.13.0'}
-    peerDependencies:
-      file-loader: '*'
-      webpack: ^4.0.0 || ^5.0.0
-    peerDependenciesMeta:
-      file-loader:
-        optional: true
-    dependencies:
-      file-loader: 6.2.0_webpack@5.73.0
-      loader-utils: 2.0.2
-      mime-types: 2.1.35
-      schema-utils: 3.1.1
-      webpack: 5.73.0
-    dev: false
-
-  /url-parse-lax/3.0.0:
-    resolution: {integrity: sha512-NjFKA0DidqPa5ciFcSrXnAltTtzz84ogy+NebPvfEgAck0+TNg4UJ4IN+fB7zRZfbgUf0syOo9MDxFkDSMuFaQ==}
-    engines: {node: '>=4'}
-    dependencies:
-      prepend-http: 2.0.0
-
-  /url-to-options/1.0.1:
-    resolution: {integrity: sha512-0kQLIzG4fdk/G5NONku64rSH/x32NOA39LVQqlK8Le6lvTF6GGRJpqaQFGgU+CLwySIqBSMdwYM0sYcW9f6P4A==}
-    engines: {node: '>= 4'}
-    dev: true
-
-  /use-composed-ref/1.3.0_react@18.2.0:
-    resolution: {integrity: sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==}
-    peerDependencies:
-      react: ^16.8.0 || ^17.0.0 || ^18.0.0
-    dependencies:
-      react: 18.2.0
-    dev: false
-
-  /use-isomorphic-layout-effect/1.1.2_react@18.2.0:
-    resolution: {integrity: sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==}
-    peerDependencies:
-      '@types/react': '*'
-      react: ^16.8.0 || ^17.0.0 || ^18.0.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
-    dependencies:
-      react: 18.2.0
-    dev: false
-
-  /use-latest/1.2.1_react@18.2.0:
-    resolution: {integrity: sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==}
-    peerDependencies:
-      '@types/react': '*'
-      react: ^16.8.0 || ^17.0.0 || ^18.0.0
-    peerDependenciesMeta:
-      '@types/react':
-        optional: true
-    dependencies:
-      react: 18.2.0
-      use-isomorphic-layout-effect: 1.1.2_react@18.2.0
-    dev: false
-
-  /use-sync-external-store/1.2.0_react@18.2.0:
-    resolution: {integrity: sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==}
-    peerDependencies:
-      react: ^16.8.0 || ^17.0.0 || ^18.0.0
-    dependencies:
-      react: 18.2.0
-    dev: false
-
-  /use/3.1.1:
-    resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /util-deprecate/1.0.2:
-    resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
-
-  /utila/0.4.0:
-    resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==}
-    dev: false
-
-  /utility-types/3.10.0:
-    resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==}
-    engines: {node: '>= 4'}
-    dev: false
-
-  /utils-merge/1.0.1:
-    resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=}
-    engines: {node: '>= 0.4.0'}
-    dev: false
-
-  /uuid/8.3.2:
-    resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==}
-    hasBin: true
-    dev: false
-
-  /uvu/0.5.6:
-    resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==}
-    engines: {node: '>=8'}
-    hasBin: true
-    dependencies:
-      dequal: 2.0.3
-      diff: 5.1.0
-      kleur: 4.1.5
-      sade: 1.8.1
-    dev: true
-
-  /v8-to-istanbul/9.0.1:
-    resolution: {integrity: sha512-74Y4LqY74kLE6IFyIjPtkSTWzUZmj8tdHT9Ii/26dvQ6K9Dl2NbEfj0XgU2sHCtKgt5VupqhlO/5aWuqS+IY1w==}
-    engines: {node: '>=10.12.0'}
-    dependencies:
-      '@jridgewell/trace-mapping': 0.3.17
-      '@types/istanbul-lib-coverage': 2.0.4
-      convert-source-map: 1.8.0
-    dev: true
-
-  /value-equal/1.0.1:
-    resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==}
-    dev: false
-
-  /vary/1.1.2:
-    resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==}
-    engines: {node: '>= 0.8'}
-    dev: false
-
-  /vfile-location/3.2.0:
-    resolution: {integrity: sha512-aLEIZKv/oxuCDZ8lkJGhuhztf/BW4M+iHdCwglA/eWc+vtuRFJj8EtgceYFX4LRjOhCAAiNHsKGssC6onJ+jbA==}
-    dev: false
-
-  /vfile-location/4.0.1:
-    resolution: {integrity: sha512-JDxPlTbZrZCQXogGheBHjbRWjESSPEak770XwWPfw5mTc1v1nWGLB/apzZxsx8a0SJVfF8HK8ql8RD308vXRUw==}
-    dependencies:
-      '@types/unist': 2.0.6
-      vfile: 5.3.4
-    dev: true
-
-  /vfile-message/2.0.4:
-    resolution: {integrity: sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==}
-    dependencies:
-      '@types/unist': 2.0.6
-      unist-util-stringify-position: 2.0.3
-    dev: false
-
-  /vfile-message/3.1.2:
-    resolution: {integrity: sha512-QjSNP6Yxzyycd4SVOtmKKyTsSvClqBPJcd00Z0zuPj3hOIjg0rUPG6DbFGPvUKRgYyaIWLPKpuEclcuvb3H8qA==}
-    dependencies:
-      '@types/unist': 2.0.6
-      unist-util-stringify-position: 3.0.2
-    dev: true
-
-  /vfile/4.2.1:
-    resolution: {integrity: sha512-O6AE4OskCG5S1emQ/4gl8zK586RqA3srz3nfK/Viy0UPToBc5Trp9BVFb1u0CjsKrAWwnpr4ifM/KBXPWwJbCA==}
-    dependencies:
-      '@types/unist': 2.0.6
-      is-buffer: 2.0.5
-      unist-util-stringify-position: 2.0.3
-      vfile-message: 2.0.4
-    dev: false
-
-  /vfile/5.3.4:
-    resolution: {integrity: sha512-KI+7cnst03KbEyN1+JE504zF5bJBZa+J+CrevLeyIMq0aPU681I2rQ5p4PlnQ6exFtWiUrg26QUdFMnAKR6PIw==}
-    dependencies:
-      '@types/unist': 2.0.6
-      is-buffer: 2.0.5
-      unist-util-stringify-position: 3.0.2
-      vfile-message: 3.1.2
-    dev: true
-
-  /wait-on/6.0.1:
-    resolution: {integrity: sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw==}
-    engines: {node: '>=10.0.0'}
-    hasBin: true
-    dependencies:
-      axios: 0.25.0
-      joi: 17.6.0
-      lodash: 4.17.21
-      minimist: 1.2.6
-      rxjs: 7.5.6
-    transitivePeerDependencies:
-      - debug
-    dev: false
-
-  /walker/1.0.8:
-    resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
-    dependencies:
-      makeerror: 1.0.12
-    dev: true
-
-  /watchpack/2.4.0:
-    resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==}
-    engines: {node: '>=10.13.0'}
-    dependencies:
-      glob-to-regexp: 0.4.1
-      graceful-fs: 4.2.10
-    dev: false
-
-  /wbuf/1.7.3:
-    resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==}
-    dependencies:
-      minimalistic-assert: 1.0.1
-    dev: false
-
-  /web-namespaces/1.1.4:
-    resolution: {integrity: sha512-wYxSGajtmoP4WxfejAPIr4l0fVh+jeMXZb08wNc0tMg6xsfZXj3cECqIK0G7ZAqUq0PP8WlMDtaOGVBTAWztNw==}
-    dev: false
-
-  /web-streams-polyfill/3.2.1:
-    resolution: {integrity: sha512-e0MO3wdXWKrLbL0DgGnUV7WHVuw9OUvL4hjgnPkIeEvESk74gAITi5G606JtZPp39cd8HA9VQzCIvA49LpPN5Q==}
-    engines: {node: '>= 8'}
-    dev: true
-
-  /web-streams-polyfill/4.0.0-beta.3:
-    resolution: {integrity: sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug==}
-    engines: {node: '>= 14'}
-    dev: false
-
-  /webidl-conversions/3.0.1:
-    resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==}
-
-  /webpack-bundle-analyzer/4.5.0:
-    resolution: {integrity: sha512-GUMZlM3SKwS8Z+CKeIFx7CVoHn3dXFcUAjT/dcZQQmfSZGvitPfMob2ipjai7ovFFqPvTqkEZ/leL4O0YOdAYQ==}
-    engines: {node: '>= 10.13.0'}
-    hasBin: true
-    dependencies:
-      acorn: 8.7.1
-      acorn-walk: 8.2.0
-      chalk: 4.1.2
-      commander: 7.2.0
-      gzip-size: 6.0.0
-      lodash: 4.17.21
-      opener: 1.5.2
-      sirv: 1.0.19
-      ws: 7.5.9
-    transitivePeerDependencies:
-      - bufferutil
-      - utf-8-validate
-    dev: false
-
-  /webpack-dev-middleware/5.3.3_webpack@5.73.0:
-    resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==}
-    engines: {node: '>= 12.13.0'}
-    peerDependencies:
-      webpack: ^4.0.0 || ^5.0.0
-    dependencies:
-      colorette: 2.0.19
-      memfs: 3.4.7
-      mime-types: 2.1.35
-      range-parser: 1.2.1
-      schema-utils: 4.0.0
-      webpack: 5.73.0
-    dev: false
-
-  /webpack-dev-server/4.9.3_webpack@5.73.0:
-    resolution: {integrity: sha512-3qp/eoboZG5/6QgiZ3llN8TUzkSpYg1Ko9khWX1h40MIEUNS2mDoIa8aXsPfskER+GbTvs/IJZ1QTBBhhuetSw==}
-    engines: {node: '>= 12.13.0'}
-    hasBin: true
-    peerDependencies:
-      webpack: ^4.37.0 || ^5.0.0
-      webpack-cli: '*'
-    peerDependenciesMeta:
-      webpack-cli:
-        optional: true
-    dependencies:
-      '@types/bonjour': 3.5.10
-      '@types/connect-history-api-fallback': 1.3.5
-      '@types/express': 4.17.13
-      '@types/serve-index': 1.9.1
-      '@types/serve-static': 1.13.10
-      '@types/sockjs': 0.3.33
-      '@types/ws': 8.5.3
-      ansi-html-community: 0.0.8
-      bonjour-service: 1.0.13
-      chokidar: 3.5.3
-      colorette: 2.0.19
-      compression: 1.7.4
-      connect-history-api-fallback: 2.0.0
-      default-gateway: 6.0.3
-      express: 4.18.1
-      graceful-fs: 4.2.10
-      html-entities: 2.3.3
-      http-proxy-middleware: 2.0.6_@types+express@4.17.13
-      ipaddr.js: 2.0.1
-      open: 8.4.0
-      p-retry: 4.6.2
-      rimraf: 3.0.2
-      schema-utils: 4.0.0
-      selfsigned: 2.0.1
-      serve-index: 1.9.1
-      sockjs: 0.3.24
-      spdy: 4.0.2
-      webpack: 5.73.0
-      webpack-dev-middleware: 5.3.3_webpack@5.73.0
-      ws: 8.8.1
-    transitivePeerDependencies:
-      - bufferutil
-      - debug
-      - supports-color
-      - utf-8-validate
-    dev: false
-
-  /webpack-merge/5.8.0:
-    resolution: {integrity: sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==}
-    engines: {node: '>=10.0.0'}
-    dependencies:
-      clone-deep: 4.0.1
-      wildcard: 2.0.0
-    dev: false
-
-  /webpack-sources/3.2.3:
-    resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==}
-    engines: {node: '>=10.13.0'}
-    dev: false
-
-  /webpack/5.73.0:
-    resolution: {integrity: sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==}
-    engines: {node: '>=10.13.0'}
-    hasBin: true
-    peerDependencies:
-      webpack-cli: '*'
-    peerDependenciesMeta:
-      webpack-cli:
-        optional: true
-    dependencies:
-      '@types/eslint-scope': 3.7.4
-      '@types/estree': 0.0.51
-      '@webassemblyjs/ast': 1.11.1
-      '@webassemblyjs/wasm-edit': 1.11.1
-      '@webassemblyjs/wasm-parser': 1.11.1
-      acorn: 8.7.1
-      acorn-import-assertions: 1.8.0_acorn@8.7.1
-      browserslist: 4.21.2
-      chrome-trace-event: 1.0.3
-      enhanced-resolve: 5.10.0
-      es-module-lexer: 0.9.3
-      eslint-scope: 5.1.1
-      events: 3.3.0
-      glob-to-regexp: 0.4.1
-      graceful-fs: 4.2.10
-      json-parse-even-better-errors: 2.3.1
-      loader-runner: 4.3.0
-      mime-types: 2.1.35
-      neo-async: 2.6.2
-      schema-utils: 3.1.1
-      tapable: 2.2.1
-      terser-webpack-plugin: 5.3.3_webpack@5.73.0
-      watchpack: 2.4.0
-      webpack-sources: 3.2.3
-    transitivePeerDependencies:
-      - '@swc/core'
-      - esbuild
-      - uglify-js
-    dev: false
-
-  /webpackbar/5.0.2_webpack@5.73.0:
-    resolution: {integrity: sha512-BmFJo7veBDgQzfWXl/wwYXr/VFus0614qZ8i9znqcl9fnEdiVkdbi0TedLQ6xAK92HZHDJ0QmyQ0fmuZPAgCYQ==}
-    engines: {node: '>=12'}
-    peerDependencies:
-      webpack: 3 || 4 || 5
-    dependencies:
-      chalk: 4.1.2
-      consola: 2.15.3
-      pretty-time: 1.1.0
-      std-env: 3.1.1
-      webpack: 5.73.0
-    dev: false
-
-  /websocket-driver/0.7.4:
-    resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==}
-    engines: {node: '>=0.8.0'}
-    dependencies:
-      http-parser-js: 0.5.8
-      safe-buffer: 5.2.1
-      websocket-extensions: 0.1.4
-    dev: false
-
-  /websocket-extensions/0.1.4:
-    resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==}
-    engines: {node: '>=0.8.0'}
-    dev: false
-
-  /whatwg-url/5.0.0:
-    resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
-    dependencies:
-      tr46: 0.0.3
-      webidl-conversions: 3.0.1
-
-  /which-boxed-primitive/1.0.2:
-    resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
-    dependencies:
-      is-bigint: 1.0.4
-      is-boolean-object: 1.1.2
-      is-number-object: 1.0.7
-      is-string: 1.0.7
-      is-symbol: 1.0.4
-    dev: true
-
-  /which/1.3.1:
-    resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
-    hasBin: true
-    dependencies:
-      isexe: 2.0.0
-    dev: false
-
-  /which/2.0.2:
-    resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
-    engines: {node: '>= 8'}
-    hasBin: true
-    dependencies:
-      isexe: 2.0.0
-
-  /widest-line/3.1.0:
-    resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==}
-    engines: {node: '>=8'}
-    dependencies:
-      string-width: 4.2.3
-    dev: false
-
-  /widest-line/4.0.1:
-    resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==}
-    engines: {node: '>=12'}
-    dependencies:
-      string-width: 5.1.2
-    dev: false
-
-  /wildcard/2.0.0:
-    resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==}
-    dev: false
-
-  /word-wrap/1.2.3:
-    resolution: {integrity: sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==}
-    engines: {node: '>=0.10.0'}
-    dev: true
-
-  /wrap-ansi/7.0.0:
-    resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
-    engines: {node: '>=10'}
-    dependencies:
-      ansi-styles: 4.3.0
-      string-width: 4.2.3
-      strip-ansi: 6.0.1
-
-  /wrap-ansi/8.0.1:
-    resolution: {integrity: sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g==}
-    engines: {node: '>=12'}
-    dependencies:
-      ansi-styles: 6.1.0
-      string-width: 5.1.2
-      strip-ansi: 7.0.1
-    dev: false
-
-  /wrappy/1.0.2:
-    resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
-
-  /write-file-atomic/3.0.3:
-    resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==}
-    dependencies:
-      imurmurhash: 0.1.4
-      is-typedarray: 1.0.0
-      signal-exit: 3.0.7
-      typedarray-to-buffer: 3.1.5
-    dev: false
-
-  /write-file-atomic/4.0.1:
-    resolution: {integrity: sha512-nSKUxgAbyioruk6hU87QzVbY279oYT6uiwgDoujth2ju4mJ+TZau7SQBhtbTmUyuNYTuXnSyRn66FV0+eCgcrQ==}
-    engines: {node: ^12.13.0 || ^14.15.0 || >=16}
-    dependencies:
-      imurmurhash: 0.1.4
-      signal-exit: 3.0.7
-    dev: true
-
-  /ws/7.5.9:
-    resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==}
-    engines: {node: '>=8.3.0'}
-    peerDependencies:
-      bufferutil: ^4.0.1
-      utf-8-validate: ^5.0.2
-    peerDependenciesMeta:
-      bufferutil:
-        optional: true
-      utf-8-validate:
-        optional: true
-    dev: false
-
-  /ws/8.8.1:
-    resolution: {integrity: sha512-bGy2JzvzkPowEJV++hF07hAD6niYSr0JzBNo/J29WsB57A2r7Wlc1UFcTR9IzrPvuNVO4B8LGqF8qcpsVOhJCA==}
-    engines: {node: '>=10.0.0'}
-    peerDependencies:
-      bufferutil: ^4.0.1
-      utf-8-validate: ^5.0.2
-    peerDependenciesMeta:
-      bufferutil:
-        optional: true
-      utf-8-validate:
-        optional: true
-    dev: false
-
-  /xdg-basedir/4.0.0:
-    resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==}
-    engines: {node: '>=8'}
-    dev: false
-
-  /xml-js/1.6.11:
-    resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==}
-    hasBin: true
-    dependencies:
-      sax: 1.2.4
-    dev: false
-
-  /xtend/4.0.2:
-    resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
-    engines: {node: '>=0.4'}
-
-  /xterm-addon-fit/0.6.0_xterm@5.0.0:
-    resolution: {integrity: sha512-9/7A+1KEjkFam0yxTaHfuk9LEvvTSBi0PZmEkzJqgafXPEXL9pCMAVV7rB09sX6ATRDXAdBpQhZkhKj7CGvYeg==}
-    peerDependencies:
-      xterm: ^5.0.0
-    dependencies:
-      xterm: 5.0.0
-    dev: false
-
-  /xterm-addon-search/0.10.0_xterm@5.0.0:
-    resolution: {integrity: sha512-l+kjDxNDQbkniU5OUo9BHknxUEPZGM0OFpVpc2sMmrb97S0FKJVJO4wAZPJvSGVJ8ZEG6KuDyzXluvnb08t71Q==}
-    peerDependencies:
-      xterm: ^5.0.0
-    dependencies:
-      xterm: 5.0.0
-    dev: false
-
-  /xterm-addon-webgl/0.13.0_xterm@5.0.0:
-    resolution: {integrity: sha512-xL4qBQWUHjFR620/8VHCtrTMVQsnZaAtd1IxFoiKPhC63wKp6b+73a45s97lb34yeo57PoqZhE9Jq5pB++ksPQ==}
-    peerDependencies:
-      xterm: ^5.0.0
-    dependencies:
-      xterm: 5.0.0
-    dev: false
-
-  /xterm/5.0.0:
-    resolution: {integrity: sha512-tmVsKzZovAYNDIaUinfz+VDclraQpPUnAME+JawosgWRMphInDded/PuY0xmU5dOhyeYZsI0nz5yd8dPYsdLTA==}
-    dev: false
-
-  /y18n/5.0.8:
-    resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
-    engines: {node: '>=10'}
-    dev: true
-
-  /yallist/4.0.0:
-    resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
-
-  /yaml/1.10.2:
-    resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
-    engines: {node: '>= 6'}
-    dev: false
-
-  /yargs-parser/21.0.1:
-    resolution: {integrity: sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==}
-    engines: {node: '>=12'}
-    dev: true
-
-  /yargs/17.5.1:
-    resolution: {integrity: sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA==}
-    engines: {node: '>=12'}
-    dependencies:
-      cliui: 7.0.4
-      escalade: 3.1.1
-      get-caller-file: 2.0.5
-      require-directory: 2.1.1
-      string-width: 4.2.3
-      y18n: 5.0.8
-      yargs-parser: 21.0.1
-    dev: true
-
-  /yauzl/2.10.0:
-    resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==}
-    dependencies:
-      buffer-crc32: 0.2.13
-      fd-slicer: 1.1.0
-    dev: true
-
-  /yocto-queue/0.1.0:
-    resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
-    engines: {node: '>=10'}
-
-  /yuv-buffer/1.0.0:
-    resolution: {integrity: sha512-5r5u7g7Dbdrwao/z8c4harQIpZwaNuzXjQXtgdFxTjr5Pm2eMmxIuckkKOONEM7fkiMNkeffXs6EPNESvAVzVg==}
-    dev: false
-
-  /yuv-canvas/1.2.11:
-    resolution: {integrity: sha512-LOxjD+gUO7XeHeExFEozpTEFBlbqEZOnaHLAwx4esJ2tzSWl/S/xDRSDu1N+asxYn7ldV+HtisrYAzJXkT7Rhw==}
-    dev: false
-
-  /zwitch/1.0.5:
-    resolution: {integrity: sha512-V50KMwwzqJV0NpZIZFwfOD5/lyny3WlSzRiXgA0G7VUnRlqttta1L6UQIHzd6EuBY/cHGfwTIck7w1yH6Q5zUw==}
-    dev: false
-
-  /zwitch/2.0.2:
-    resolution: {integrity: sha512-JZxotl7SxAJH0j7dN4pxsTV6ZLXoLdGME+PsjkL/DaBrVryK9kTGq06GfKrwcSOqypP+fdXGoCHE36b99fWVoA==}
-    dev: true

+ 0 - 5
src/renderer/cocoblockly-x/ya-webadb/common/config/rush/repo-state.json

@@ -1,5 +0,0 @@
-// DO NOT MODIFY THIS FILE MANUALLY BUT DO COMMIT IT. It is generated and used by Rush.
-{
-  "pnpmShrinkwrapHash": "1dacff4296c92760f20d5364417a13ec11a890b8",
-  "preferredVersionsHash": "bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f"
-}

+ 0 - 95
src/renderer/cocoblockly-x/ya-webadb/common/config/rush/version-policies.json

@@ -1,95 +0,0 @@
-/**
- * This is configuration file is used for advanced publishing configurations with Rush.
- * More documentation is available on the Rush website: https://rushjs.io
- */
-/**
- * A list of version policy definitions.  A "version policy" is a custom package versioning
- * strategy that affects "rush change", "rush version", and "rush publish".  The strategy applies
- * to a set of projects that are specified using the "versionPolicyName" field in rush.json.
- */
-[
-    // {
-    //   /**
-    //    * (Required) Indicates the kind of version policy being defined ("lockStepVersion" or "individualVersion").
-    //    *
-    //    * The "lockStepVersion" mode specifies that the projects will use "lock-step versioning".  This
-    //    * strategy is appropriate for a set of packages that act as selectable components of a
-    //    * unified product.  The entire set of packages are always published together, and always share
-    //    * the same NPM version number.  When the packages depend on other packages in the set, the
-    //    * SemVer range is usually restricted to a single version.
-    //    */
-    //   "definitionName": "lockStepVersion",
-    //
-    //   /**
-    //    * (Required) The name that will be used for the "versionPolicyName" field in rush.json.
-    //    * This name is also used command-line parameters such as "--version-policy"
-    //    * and "--to-version-policy".
-    //    */
-    //   "policyName": "MyBigFramework",
-    //
-    //   /**
-    //    * (Required) The current version.  All packages belonging to the set should have this version
-    //    * in the current branch.  When bumping versions, Rush uses this to determine the next version.
-    //    * (The "version" field in package.json is NOT considered.)
-    //    */
-    //   "version": "1.0.0",
-    //
-    //   /**
-    //    * (Required) The type of bump that will be performed when publishing the next release.
-    //    * When creating a release branch in Git, this field should be updated according to the
-    //    * type of release.
-    //    *
-    //    * Valid values are: "prerelease", "release", "minor", "patch", "major"
-    //    */
-    //   "nextBump": "prerelease",
-    //
-    //   /**
-    //    * (Optional) If specified, all packages in the set share a common CHANGELOG.md file.
-    //    * This file is stored with the specified "main" project, which must be a member of the set.
-    //    *
-    //    * If this field is omitted, then a separate CHANGELOG.md file will be maintained for each
-    //    * package in the set.
-    //    */
-    //   "mainProject": "my-app"
-    // },
-    //
-    // {
-    //   /**
-    //    * (Required) Indicates the kind of version policy being defined ("lockStepVersion" or "individualVersion").
-    //    *
-    //    * The "individualVersion" mode specifies that the projects will use "individual versioning".
-    //    * This is the typical NPM model where each package has an independent version number
-    //    * and CHANGELOG.md file.  Although a single CI definition is responsible for publishing the
-    //    * packages, they otherwise don't have any special relationship.  The version bumping will
-    //    * depend on how developers answer the "rush change" questions for each package that
-    //    * is changed.
-    //    */
-    //   "definitionName": "individualVersion",
-    //
-    //   "policyName": "MyRandomLibraries",
-    //
-    //   /**
-    //    * (Optional) This can be used to enforce that all packages in the set must share a common
-    //    * major version number, e.g. because they are from the same major release branch.
-    //    * It can also be used to discourage people from accidentally making "MAJOR" SemVer changes
-    //    * inappropriately.  The minor/patch version parts will be bumped independently according
-    //    * to the types of changes made to each project, according to the "rush change" command.
-    //    */
-    //   "lockedMajor": 3,
-    //
-    //   /**
-    //    * (Optional) When publishing is managed by Rush, by default the "rush change" command will
-    //    * request changes for any projects that are modified by a pull request. These change entries
-    //    * will produce a CHANGELOG.md file. If you author your CHANGELOG.md manually or announce updates
-    //    * in some other way, set "exemptFromRushChange" to true to tell "rush change" to ignore the projects
-    //    * belonging to this version policy.
-    //    */
-    //   "exemptFromRushChange": false
-    // }
-    {
-        "definitionName": "lockStepVersion",
-        "policyName": "adb",
-        "version": "0.0.17",
-        "nextBump": "patch"
-    }
-]

+ 0 - 25
src/renderer/cocoblockly-x/ya-webadb/common/git-hooks/commit-msg.sample

@@ -1,25 +0,0 @@
-#!/bin/sh
-#
-# This is an example Git hook for use with Rush.  To enable this hook, rename this file
-# to "commit-msg" and then run "rush install", which will copy it from common/git-hooks
-# to the .git/hooks folder.
-#
-# TO LEARN MORE ABOUT GIT HOOKS
-#
-# The Git documentation is here: https://git-scm.com/docs/githooks
-# Some helpful resources: https://githooks.com
-#
-# ABOUT THIS EXAMPLE
-#
-# The commit-msg hook is called by "git commit" with one argument, the name of the file
-# that has the commit message.  The hook should exit with non-zero status after issuing
-# an appropriate message if it wants to stop the commit.  The hook is allowed to edit
-# the commit message file.
-
-# This example enforces that commit message should contain a minimum amount of
-# description text.
-if [ `cat $1 | wc -w` -lt 3 ]; then
-  echo ""
-  echo "Invalid commit message: The message must contain at least 3 words."
-	exit 1
-fi

+ 0 - 116
src/renderer/cocoblockly-x/ya-webadb/common/scripts/install-run-rush.js

@@ -1,116 +0,0 @@
-"use strict";
-// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
-// See the @microsoft/rush package's LICENSE file for license information.
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    var desc = Object.getOwnPropertyDescriptor(m, k);
-    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-      desc = { enumerable: true, get: function() { return m[k]; } };
-    }
-    Object.defineProperty(o, k2, desc);
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED.
-//
-// This script is intended for usage in an automated build environment where the Rush command may not have
-// been preinstalled, or may have an unpredictable version.  This script will automatically install the version of Rush
-// specified in the rush.json configuration file (if not already installed), and then pass a command-line to it.
-// An example usage would be:
-//
-//    node common/scripts/install-run-rush.js install
-//
-// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/
-const path = __importStar(require("path"));
-const fs = __importStar(require("fs"));
-const install_run_1 = require("./install-run");
-const PACKAGE_NAME = '@microsoft/rush';
-const RUSH_PREVIEW_VERSION = 'RUSH_PREVIEW_VERSION';
-const INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_RUSH_LOCKFILE_PATH';
-function _getRushVersion(logger) {
-    const rushPreviewVersion = process.env[RUSH_PREVIEW_VERSION];
-    if (rushPreviewVersion !== undefined) {
-        logger.info(`Using Rush version from environment variable ${RUSH_PREVIEW_VERSION}=${rushPreviewVersion}`);
-        return rushPreviewVersion;
-    }
-    const rushJsonFolder = (0, install_run_1.findRushJsonFolder)();
-    const rushJsonPath = path.join(rushJsonFolder, install_run_1.RUSH_JSON_FILENAME);
-    try {
-        const rushJsonContents = fs.readFileSync(rushJsonPath, 'utf-8');
-        // Use a regular expression to parse out the rushVersion value because rush.json supports comments,
-        // but JSON.parse does not and we don't want to pull in more dependencies than we need to in this script.
-        const rushJsonMatches = rushJsonContents.match(/\"rushVersion\"\s*\:\s*\"([0-9a-zA-Z.+\-]+)\"/);
-        return rushJsonMatches[1];
-    }
-    catch (e) {
-        throw new Error(`Unable to determine the required version of Rush from rush.json (${rushJsonFolder}). ` +
-            "The 'rushVersion' field is either not assigned in rush.json or was specified " +
-            'using an unexpected syntax.');
-    }
-}
-function _run() {
-    const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, ...packageBinArgs /* [build, --to, myproject] */] = process.argv;
-    // Detect if this script was directly invoked, or if the install-run-rushx script was invokved to select the
-    // appropriate binary inside the rush package to run
-    const scriptName = path.basename(scriptPath);
-    const bin = scriptName.toLowerCase() === 'install-run-rushx.js' ? 'rushx' : 'rush';
-    if (!nodePath || !scriptPath) {
-        throw new Error('Unexpected exception: could not detect node path or script path');
-    }
-    let commandFound = false;
-    let logger = { info: console.log, error: console.error };
-    for (const arg of packageBinArgs) {
-        if (arg === '-q' || arg === '--quiet') {
-            // The -q/--quiet flag is supported by both `rush` and `rushx`, and will suppress
-            // any normal informational/diagnostic information printed during startup.
-            //
-            // To maintain the same user experience, the install-run* scripts pass along this
-            // flag but also use it to suppress any diagnostic information normally printed
-            // to stdout.
-            logger = {
-                info: () => { },
-                error: console.error
-            };
-        }
-        else if (!arg.startsWith('-') || arg === '-h' || arg === '--help') {
-            // We either found something that looks like a command (i.e. - doesn't start with a "-"),
-            // or we found the -h/--help flag, which can be run without a command
-            commandFound = true;
-        }
-    }
-    if (!commandFound) {
-        console.log(`Usage: ${scriptName} <command> [args...]`);
-        if (scriptName === 'install-run-rush.js') {
-            console.log(`Example: ${scriptName} build --to myproject`);
-        }
-        else {
-            console.log(`Example: ${scriptName} custom-command`);
-        }
-        process.exit(1);
-    }
-    (0, install_run_1.runWithErrorAndStatusCode)(logger, () => {
-        const version = _getRushVersion(logger);
-        logger.info(`The rush.json configuration requests Rush version ${version}`);
-        const lockFilePath = process.env[INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE];
-        if (lockFilePath) {
-            logger.info(`Found ${INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE}="${lockFilePath}", installing with lockfile.`);
-        }
-        return (0, install_run_1.installAndRun)(logger, PACKAGE_NAME, version, bin, packageBinArgs, lockFilePath);
-    });
-}
-_run();
-//# sourceMappingURL=install-run-rush.js.map

+ 0 - 18
src/renderer/cocoblockly-x/ya-webadb/common/scripts/install-run-rushx.js

@@ -1,18 +0,0 @@
-"use strict";
-// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
-// See the @microsoft/rush package's LICENSE file for license information.
-Object.defineProperty(exports, "__esModule", { value: true });
-// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED.
-//
-// This script is intended for usage in an automated build environment where the Rush command may not have
-// been preinstalled, or may have an unpredictable version.  This script will automatically install the version of Rush
-// specified in the rush.json configuration file (if not already installed), and then pass a command-line to the
-// rushx command.
-//
-// An example usage would be:
-//
-//    node common/scripts/install-run-rushx.js custom-command
-//
-// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/
-require("./install-run-rush");
-//# sourceMappingURL=install-run-rushx.js.map

+ 0 - 500
src/renderer/cocoblockly-x/ya-webadb/common/scripts/install-run.js

@@ -1,500 +0,0 @@
-"use strict";
-// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
-// See the @microsoft/rush package's LICENSE file for license information.
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    var desc = Object.getOwnPropertyDescriptor(m, k);
-    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
-      desc = { enumerable: true, get: function() { return m[k]; } };
-    }
-    Object.defineProperty(o, k2, desc);
-}) : (function(o, m, k, k2) {
-    if (k2 === undefined) k2 = k;
-    o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
-    Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
-    o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || function (mod) {
-    if (mod && mod.__esModule) return mod;
-    var result = {};
-    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
-    __setModuleDefault(result, mod);
-    return result;
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.runWithErrorAndStatusCode = exports.installAndRun = exports.findRushJsonFolder = exports.getNpmPath = exports.RUSH_JSON_FILENAME = void 0;
-// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED.
-//
-// This script is intended for usage in an automated build environment where a Node tool may not have
-// been preinstalled, or may have an unpredictable version.  This script will automatically install the specified
-// version of the specified tool (if not already installed), and then pass a command-line to it.
-// An example usage would be:
-//
-//    node common/scripts/install-run.js qrcode@1.2.2 qrcode https://rushjs.io
-//
-// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/
-const childProcess = __importStar(require("child_process"));
-const fs = __importStar(require("fs"));
-const os = __importStar(require("os"));
-const path = __importStar(require("path"));
-exports.RUSH_JSON_FILENAME = 'rush.json';
-const RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME = 'RUSH_TEMP_FOLDER';
-const INSTALL_RUN_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_LOCKFILE_PATH';
-const INSTALLED_FLAG_FILENAME = 'installed.flag';
-const NODE_MODULES_FOLDER_NAME = 'node_modules';
-const PACKAGE_JSON_FILENAME = 'package.json';
-/**
- * Parse a package specifier (in the form of name\@version) into name and version parts.
- */
-function _parsePackageSpecifier(rawPackageSpecifier) {
-    rawPackageSpecifier = (rawPackageSpecifier || '').trim();
-    const separatorIndex = rawPackageSpecifier.lastIndexOf('@');
-    let name;
-    let version = undefined;
-    if (separatorIndex === 0) {
-        // The specifier starts with a scope and doesn't have a version specified
-        name = rawPackageSpecifier;
-    }
-    else if (separatorIndex === -1) {
-        // The specifier doesn't have a version
-        name = rawPackageSpecifier;
-    }
-    else {
-        name = rawPackageSpecifier.substring(0, separatorIndex);
-        version = rawPackageSpecifier.substring(separatorIndex + 1);
-    }
-    if (!name) {
-        throw new Error(`Invalid package specifier: ${rawPackageSpecifier}`);
-    }
-    return { name, version };
-}
-/**
- * As a workaround, copyAndTrimNpmrcFile() copies the .npmrc file to the target folder, and also trims
- * unusable lines from the .npmrc file.
- *
- * Why are we trimming the .npmrc lines?  NPM allows environment variables to be specified in
- * the .npmrc file to provide different authentication tokens for different registry.
- * However, if the environment variable is undefined, it expands to an empty string, which
- * produces a valid-looking mapping with an invalid URL that causes an error.  Instead,
- * we'd prefer to skip that line and continue looking in other places such as the user's
- * home directory.
- *
- * IMPORTANT: THIS CODE SHOULD BE KEPT UP TO DATE WITH Utilities.copyAndTrimNpmrcFile()
- */
-function _copyAndTrimNpmrcFile(logger, sourceNpmrcPath, targetNpmrcPath) {
-    logger.info(`Transforming ${sourceNpmrcPath}`); // Verbose
-    logger.info(`  --> "${targetNpmrcPath}"`);
-    let npmrcFileLines = fs.readFileSync(sourceNpmrcPath).toString().split('\n');
-    npmrcFileLines = npmrcFileLines.map((line) => (line || '').trim());
-    const resultLines = [];
-    // This finds environment variable tokens that look like "${VAR_NAME}"
-    const expansionRegExp = /\$\{([^\}]+)\}/g;
-    // Comment lines start with "#" or ";"
-    const commentRegExp = /^\s*[#;]/;
-    // Trim out lines that reference environment variables that aren't defined
-    for (const line of npmrcFileLines) {
-        let lineShouldBeTrimmed = false;
-        // Ignore comment lines
-        if (!commentRegExp.test(line)) {
-            const environmentVariables = line.match(expansionRegExp);
-            if (environmentVariables) {
-                for (const token of environmentVariables) {
-                    // Remove the leading "${" and the trailing "}" from the token
-                    const environmentVariableName = token.substring(2, token.length - 1);
-                    // Is the environment variable defined?
-                    if (!process.env[environmentVariableName]) {
-                        // No, so trim this line
-                        lineShouldBeTrimmed = true;
-                        break;
-                    }
-                }
-            }
-        }
-        if (lineShouldBeTrimmed) {
-            // Example output:
-            // "; MISSING ENVIRONMENT VARIABLE: //my-registry.com/npm/:_authToken=${MY_AUTH_TOKEN}"
-            resultLines.push('; MISSING ENVIRONMENT VARIABLE: ' + line);
-        }
-        else {
-            resultLines.push(line);
-        }
-    }
-    fs.writeFileSync(targetNpmrcPath, resultLines.join(os.EOL));
-}
-/**
- * syncNpmrc() copies the .npmrc file to the target folder, and also trims unusable lines from the .npmrc file.
- * If the source .npmrc file not exist, then syncNpmrc() will delete an .npmrc that is found in the target folder.
- *
- * IMPORTANT: THIS CODE SHOULD BE KEPT UP TO DATE WITH Utilities._syncNpmrc()
- */
-function _syncNpmrc(logger, sourceNpmrcFolder, targetNpmrcFolder, useNpmrcPublish) {
-    const sourceNpmrcPath = path.join(sourceNpmrcFolder, !useNpmrcPublish ? '.npmrc' : '.npmrc-publish');
-    const targetNpmrcPath = path.join(targetNpmrcFolder, '.npmrc');
-    try {
-        if (fs.existsSync(sourceNpmrcPath)) {
-            _copyAndTrimNpmrcFile(logger, sourceNpmrcPath, targetNpmrcPath);
-        }
-        else if (fs.existsSync(targetNpmrcPath)) {
-            // If the source .npmrc doesn't exist and there is one in the target, delete the one in the target
-            logger.info(`Deleting ${targetNpmrcPath}`); // Verbose
-            fs.unlinkSync(targetNpmrcPath);
-        }
-    }
-    catch (e) {
-        throw new Error(`Error syncing .npmrc file: ${e}`);
-    }
-}
-let _npmPath = undefined;
-/**
- * Get the absolute path to the npm executable
- */
-function getNpmPath() {
-    if (!_npmPath) {
-        try {
-            if (os.platform() === 'win32') {
-                // We're on Windows
-                const whereOutput = childProcess.execSync('where npm', { stdio: [] }).toString();
-                const lines = whereOutput.split(os.EOL).filter((line) => !!line);
-                // take the last result, we are looking for a .cmd command
-                // see https://github.com/microsoft/rushstack/issues/759
-                _npmPath = lines[lines.length - 1];
-            }
-            else {
-                // We aren't on Windows - assume we're on *NIX or Darwin
-                _npmPath = childProcess.execSync('command -v npm', { stdio: [] }).toString();
-            }
-        }
-        catch (e) {
-            throw new Error(`Unable to determine the path to the NPM tool: ${e}`);
-        }
-        _npmPath = _npmPath.trim();
-        if (!fs.existsSync(_npmPath)) {
-            throw new Error('The NPM executable does not exist');
-        }
-    }
-    return _npmPath;
-}
-exports.getNpmPath = getNpmPath;
-function _ensureFolder(folderPath) {
-    if (!fs.existsSync(folderPath)) {
-        const parentDir = path.dirname(folderPath);
-        _ensureFolder(parentDir);
-        fs.mkdirSync(folderPath);
-    }
-}
-/**
- * Create missing directories under the specified base directory, and return the resolved directory.
- *
- * Does not support "." or ".." path segments.
- * Assumes the baseFolder exists.
- */
-function _ensureAndJoinPath(baseFolder, ...pathSegments) {
-    let joinedPath = baseFolder;
-    try {
-        for (let pathSegment of pathSegments) {
-            pathSegment = pathSegment.replace(/[\\\/]/g, '+');
-            joinedPath = path.join(joinedPath, pathSegment);
-            if (!fs.existsSync(joinedPath)) {
-                fs.mkdirSync(joinedPath);
-            }
-        }
-    }
-    catch (e) {
-        throw new Error(`Error building local installation folder (${path.join(baseFolder, ...pathSegments)}): ${e}`);
-    }
-    return joinedPath;
-}
-function _getRushTempFolder(rushCommonFolder) {
-    const rushTempFolder = process.env[RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME];
-    if (rushTempFolder !== undefined) {
-        _ensureFolder(rushTempFolder);
-        return rushTempFolder;
-    }
-    else {
-        return _ensureAndJoinPath(rushCommonFolder, 'temp');
-    }
-}
-/**
- * Resolve a package specifier to a static version
- */
-function _resolvePackageVersion(logger, rushCommonFolder, { name, version }) {
-    if (!version) {
-        version = '*'; // If no version is specified, use the latest version
-    }
-    if (version.match(/^[a-zA-Z0-9\-\+\.]+$/)) {
-        // If the version contains only characters that we recognize to be used in static version specifiers,
-        // pass the version through
-        return version;
-    }
-    else {
-        // version resolves to
-        try {
-            const rushTempFolder = _getRushTempFolder(rushCommonFolder);
-            const sourceNpmrcFolder = path.join(rushCommonFolder, 'config', 'rush');
-            _syncNpmrc(logger, sourceNpmrcFolder, rushTempFolder);
-            const npmPath = getNpmPath();
-            // This returns something that looks like:
-            //  @microsoft/rush@3.0.0 '3.0.0'
-            //  @microsoft/rush@3.0.1 '3.0.1'
-            //  ...
-            //  @microsoft/rush@3.0.20 '3.0.20'
-            //  <blank line>
-            const npmVersionSpawnResult = childProcess.spawnSync(npmPath, ['view', `${name}@${version}`, 'version', '--no-update-notifier'], {
-                cwd: rushTempFolder,
-                stdio: []
-            });
-            if (npmVersionSpawnResult.status !== 0) {
-                throw new Error(`"npm view" returned error code ${npmVersionSpawnResult.status}`);
-            }
-            const npmViewVersionOutput = npmVersionSpawnResult.stdout.toString();
-            const versionLines = npmViewVersionOutput.split('\n').filter((line) => !!line);
-            const latestVersion = versionLines[versionLines.length - 1];
-            if (!latestVersion) {
-                throw new Error('No versions found for the specified version range.');
-            }
-            const versionMatches = latestVersion.match(/^.+\s\'(.+)\'$/);
-            if (!versionMatches) {
-                throw new Error(`Invalid npm output ${latestVersion}`);
-            }
-            return versionMatches[1];
-        }
-        catch (e) {
-            throw new Error(`Unable to resolve version ${version} of package ${name}: ${e}`);
-        }
-    }
-}
-let _rushJsonFolder;
-/**
- * Find the absolute path to the folder containing rush.json
- */
-function findRushJsonFolder() {
-    if (!_rushJsonFolder) {
-        let basePath = __dirname;
-        let tempPath = __dirname;
-        do {
-            const testRushJsonPath = path.join(basePath, exports.RUSH_JSON_FILENAME);
-            if (fs.existsSync(testRushJsonPath)) {
-                _rushJsonFolder = basePath;
-                break;
-            }
-            else {
-                basePath = tempPath;
-            }
-        } while (basePath !== (tempPath = path.dirname(basePath))); // Exit the loop when we hit the disk root
-        if (!_rushJsonFolder) {
-            throw new Error('Unable to find rush.json.');
-        }
-    }
-    return _rushJsonFolder;
-}
-exports.findRushJsonFolder = findRushJsonFolder;
-/**
- * Detects if the package in the specified directory is installed
- */
-function _isPackageAlreadyInstalled(packageInstallFolder) {
-    try {
-        const flagFilePath = path.join(packageInstallFolder, INSTALLED_FLAG_FILENAME);
-        if (!fs.existsSync(flagFilePath)) {
-            return false;
-        }
-        const fileContents = fs.readFileSync(flagFilePath).toString();
-        return fileContents.trim() === process.version;
-    }
-    catch (e) {
-        return false;
-    }
-}
-/**
- * Delete a file. Fail silently if it does not exist.
- */
-function _deleteFile(file) {
-    try {
-        fs.unlinkSync(file);
-    }
-    catch (err) {
-        if (err.code !== 'ENOENT' && err.code !== 'ENOTDIR') {
-            throw err;
-        }
-    }
-}
-/**
- * Removes the following files and directories under the specified folder path:
- *  - installed.flag
- *  -
- *  - node_modules
- */
-function _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath) {
-    try {
-        const flagFile = path.resolve(packageInstallFolder, INSTALLED_FLAG_FILENAME);
-        _deleteFile(flagFile);
-        const packageLockFile = path.resolve(packageInstallFolder, 'package-lock.json');
-        if (lockFilePath) {
-            fs.copyFileSync(lockFilePath, packageLockFile);
-        }
-        else {
-            // Not running `npm ci`, so need to cleanup
-            _deleteFile(packageLockFile);
-            const nodeModulesFolder = path.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME);
-            if (fs.existsSync(nodeModulesFolder)) {
-                const rushRecyclerFolder = _ensureAndJoinPath(rushTempFolder, 'rush-recycler');
-                fs.renameSync(nodeModulesFolder, path.join(rushRecyclerFolder, `install-run-${Date.now().toString()}`));
-            }
-        }
-    }
-    catch (e) {
-        throw new Error(`Error cleaning the package install folder (${packageInstallFolder}): ${e}`);
-    }
-}
-function _createPackageJson(packageInstallFolder, name, version) {
-    try {
-        const packageJsonContents = {
-            name: 'ci-rush',
-            version: '0.0.0',
-            dependencies: {
-                [name]: version
-            },
-            description: "DON'T WARN",
-            repository: "DON'T WARN",
-            license: 'MIT'
-        };
-        const packageJsonPath = path.join(packageInstallFolder, PACKAGE_JSON_FILENAME);
-        fs.writeFileSync(packageJsonPath, JSON.stringify(packageJsonContents, undefined, 2));
-    }
-    catch (e) {
-        throw new Error(`Unable to create package.json: ${e}`);
-    }
-}
-/**
- * Run "npm install" in the package install folder.
- */
-function _installPackage(logger, packageInstallFolder, name, version, command) {
-    try {
-        logger.info(`Installing ${name}...`);
-        const npmPath = getNpmPath();
-        const result = childProcess.spawnSync(npmPath, [command], {
-            stdio: 'inherit',
-            cwd: packageInstallFolder,
-            env: process.env
-        });
-        if (result.status !== 0) {
-            throw new Error(`"npm ${command}" encountered an error`);
-        }
-        logger.info(`Successfully installed ${name}@${version}`);
-    }
-    catch (e) {
-        throw new Error(`Unable to install package: ${e}`);
-    }
-}
-/**
- * Get the ".bin" path for the package.
- */
-function _getBinPath(packageInstallFolder, binName) {
-    const binFolderPath = path.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin');
-    const resolvedBinName = os.platform() === 'win32' ? `${binName}.cmd` : binName;
-    return path.resolve(binFolderPath, resolvedBinName);
-}
-/**
- * Write a flag file to the package's install directory, signifying that the install was successful.
- */
-function _writeFlagFile(packageInstallFolder) {
-    try {
-        const flagFilePath = path.join(packageInstallFolder, INSTALLED_FLAG_FILENAME);
-        fs.writeFileSync(flagFilePath, process.version);
-    }
-    catch (e) {
-        throw new Error(`Unable to create installed.flag file in ${packageInstallFolder}`);
-    }
-}
-function installAndRun(logger, packageName, packageVersion, packageBinName, packageBinArgs, lockFilePath = process.env[INSTALL_RUN_LOCKFILE_PATH_VARIABLE]) {
-    const rushJsonFolder = findRushJsonFolder();
-    const rushCommonFolder = path.join(rushJsonFolder, 'common');
-    const rushTempFolder = _getRushTempFolder(rushCommonFolder);
-    const packageInstallFolder = _ensureAndJoinPath(rushTempFolder, 'install-run', `${packageName}@${packageVersion}`);
-    if (!_isPackageAlreadyInstalled(packageInstallFolder)) {
-        // The package isn't already installed
-        _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath);
-        const sourceNpmrcFolder = path.join(rushCommonFolder, 'config', 'rush');
-        _syncNpmrc(logger, sourceNpmrcFolder, packageInstallFolder);
-        _createPackageJson(packageInstallFolder, packageName, packageVersion);
-        const command = lockFilePath ? 'ci' : 'install';
-        _installPackage(logger, packageInstallFolder, packageName, packageVersion, command);
-        _writeFlagFile(packageInstallFolder);
-    }
-    const statusMessage = `Invoking "${packageBinName} ${packageBinArgs.join(' ')}"`;
-    const statusMessageLine = new Array(statusMessage.length + 1).join('-');
-    logger.info(os.EOL + statusMessage + os.EOL + statusMessageLine + os.EOL);
-    const binPath = _getBinPath(packageInstallFolder, packageBinName);
-    const binFolderPath = path.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin');
-    // Windows environment variables are case-insensitive.  Instead of using SpawnSyncOptions.env, we need to
-    // assign via the process.env proxy to ensure that we append to the right PATH key.
-    const originalEnvPath = process.env.PATH || '';
-    let result;
-    try {
-        // Node.js on Windows can not spawn a file when the path has a space on it
-        // unless the path gets wrapped in a cmd friendly way and shell mode is used
-        const shouldUseShell = binPath.includes(' ') && os.platform() === 'win32';
-        const platformBinPath = shouldUseShell ? `"${binPath}"` : binPath;
-        process.env.PATH = [binFolderPath, originalEnvPath].join(path.delimiter);
-        result = childProcess.spawnSync(platformBinPath, packageBinArgs, {
-            stdio: 'inherit',
-            windowsVerbatimArguments: false,
-            shell: shouldUseShell,
-            cwd: process.cwd(),
-            env: process.env
-        });
-    }
-    finally {
-        process.env.PATH = originalEnvPath;
-    }
-    if (result.status !== null) {
-        return result.status;
-    }
-    else {
-        throw result.error || new Error('An unknown error occurred.');
-    }
-}
-exports.installAndRun = installAndRun;
-function runWithErrorAndStatusCode(logger, fn) {
-    process.exitCode = 1;
-    try {
-        const exitCode = fn();
-        process.exitCode = exitCode;
-    }
-    catch (e) {
-        logger.error(os.EOL + os.EOL + e.toString() + os.EOL + os.EOL);
-    }
-}
-exports.runWithErrorAndStatusCode = runWithErrorAndStatusCode;
-function _run() {
-    const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, rawPackageSpecifier /* qrcode@^1.2.0 */, packageBinName /* qrcode */, ...packageBinArgs /* [-f, myproject/lib] */] = process.argv;
-    if (!nodePath) {
-        throw new Error('Unexpected exception: could not detect node path');
-    }
-    if (path.basename(scriptPath).toLowerCase() !== 'install-run.js') {
-        // If install-run.js wasn't directly invoked, don't execute the rest of this function. Return control
-        // to the script that (presumably) imported this file
-        return;
-    }
-    if (process.argv.length < 4) {
-        console.log('Usage: install-run.js <package>@<version> <command> [args...]');
-        console.log('Example: install-run.js qrcode@1.2.2 qrcode https://rushjs.io');
-        process.exit(1);
-    }
-    const logger = { info: console.log, error: console.error };
-    runWithErrorAndStatusCode(logger, () => {
-        const rushJsonFolder = findRushJsonFolder();
-        const rushCommonFolder = _ensureAndJoinPath(rushJsonFolder, 'common');
-        const packageSpecifier = _parsePackageSpecifier(rawPackageSpecifier);
-        const name = packageSpecifier.name;
-        const version = _resolvePackageVersion(logger, rushCommonFolder, packageSpecifier);
-        if (packageSpecifier.version !== version) {
-            console.log(`Resolved to ${name}@${version}`);
-        }
-        return installAndRun(logger, name, version, packageBinName, packageBinArgs);
-    });
-}
-_run();
-//# sourceMappingURL=install-run.js.map

+ 0 - 14
src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-direct-sockets/.npmignore

@@ -1,14 +0,0 @@
-.rush
-
-# Test
-coverage
-**/*.spec.ts
-**/*.spec.js
-**/*.spec.js.map
-**/__helpers__
-jest.config.js
-
-tsconfig.json
-
-# Logs
-*.log

+ 0 - 5
src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-direct-sockets/README.md

@@ -1,5 +0,0 @@
-# `@yume-chan/adb-backend-direct-sockets`
-
-Use [Direct Sockets API](https://wicg.github.io/direct-sockets/) for plugin-free ADB over WiFi connection.
-
-Note: Direct Sockets API is still under development in Chrome and requires extra command line arguments to enable. This package is not intended to be used in production, thus not published to NPM registry.

+ 0 - 42
src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-direct-sockets/package.json

@@ -1,42 +0,0 @@
-{
-    "name": "@yume-chan/adb-backend-direct-sockets",
-    "private": true,
-    "version": "0.0.9",
-    "description": "Backend for `@yume-chan/adb` using Direct Sockets API.",
-    "keywords": [
-        "adb",
-        "direct-sockets"
-    ],
-    "author": {
-        "name": "Simon Chan",
-        "email": "cnsimonchan@live.com",
-        "url": "https://chensi.moe/blog"
-    },
-    "homepage": "https://github.com/yume-chan/ya-webadb/tree/main/libraries/adb-backend-direct-sockets#readme",
-    "repository": {
-        "type": "git",
-        "url": "git+https://github.com/yume-chan/ya-webadb.git",
-        "directory": "libraries/adb-backend-direct-sockets"
-    },
-    "bugs": {
-        "url": "https://github.com/yume-chan/ya-webadb/issues"
-    },
-    "license": "MIT",
-    "type": "module",
-    "main": "esm/index.js",
-    "types": "esm/index.d.ts",
-    "scripts": {
-        "build": "build-ts-package",
-        "build:watch": "build-ts-package --incremental",
-        "prepublishOnly": "npm run build"
-    },
-    "devDependencies": {
-        "@yume-chan/ts-package-builder": "workspace:^1.0.0",
-        "typescript": "^4.8.4"
-    },
-    "dependencies": {
-        "@yume-chan/adb": "workspace:^0.0.17",
-        "@yume-chan/stream-extra": "workspace:^0.0.17",
-        "tslib": "^2.4.1"
-    }
-}

+ 0 - 70
src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-direct-sockets/src/index.ts

@@ -1,70 +0,0 @@
-import { AdbBackend, AdbPacket, AdbPacketSerializeStream } from '@yume-chan/adb';
-import { pipeFrom, ReadableStream, StructDeserializeStream, WrapReadableStream, WrapWritableStream, WritableStream } from '@yume-chan/stream-extra';
-
-declare global {
-    interface TCPSocket {
-        close(): Promise<void>;
-
-        readonly remoteAddress: string;
-        readonly remotePort: number;
-        readonly readable: ReadableStream<Uint8Array>;
-        readonly writable: WritableStream<BufferSource>;
-    }
-
-    interface SocketOptions {
-        localAddress?: string | undefined;
-        localPort?: number | undefined;
-
-        remoteAddress: string;
-        remotePort: number;
-
-        sendBufferSize?: number;
-        receiveBufferSize?: number;
-
-        keepAlive?: number;
-        noDelay?: boolean;
-    }
-
-    interface Navigator {
-        openTCPSocket(options?: SocketOptions): Promise<TCPSocket>;
-    }
-}
-
-export default class AdbDirectSocketsBackend implements AdbBackend {
-    public static isSupported(): boolean {
-        return typeof window !== 'undefined' && !!window.navigator?.openTCPSocket;
-    }
-
-    public readonly serial: string;
-
-    public readonly host: string;
-
-    public readonly port: number;
-
-    public name: string | undefined;
-
-    public constructor(host: string, port: number = 5555, name?: string) {
-        this.host = host;
-        this.port = port;
-        this.serial = `${host}:${port}`;
-        this.name = name;
-    }
-
-    public async connect() {
-        const { readable, writable } = await navigator.openTCPSocket({
-            remoteAddress: this.host,
-            remotePort: this.port,
-            noDelay: true,
-        });
-
-        // Native streams can't `pipeTo()` or `pipeThrough()` polyfilled streams, so we need to wrap them
-        return {
-            readable: new WrapReadableStream(readable)
-                .pipeThrough(new StructDeserializeStream(AdbPacket)),
-            writable: pipeFrom(
-                new WrapWritableStream(writable),
-                new AdbPacketSerializeStream()
-            ),
-        };
-    }
-}

+ 0 - 17
src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-direct-sockets/tsconfig.json

@@ -1,17 +0,0 @@
-{
-    "extends": "./node_modules/@yume-chan/ts-package-builder/tsconfig.base.json",
-    "compilerOptions": {
-        "lib": [
-            "ESNext",
-            "DOM"
-        ],
-    },
-    "references": [
-        {
-            "path": "../adb/tsconfig.build.json"
-        },
-        {
-            "path": "../stream-extra/tsconfig.build.json"
-        }
-    ]
-}

+ 0 - 14
src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-webusb/.npmignore

@@ -1,14 +0,0 @@
-.rush
-
-# Test
-coverage
-**/*.spec.ts
-**/*.spec.js
-**/*.spec.js.map
-**/__helpers__
-jest.config.js
-
-tsconfig.json
-
-# Logs
-*.log

+ 0 - 106
src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-webusb/CHANGELOG.json

@@ -1,106 +0,0 @@
-{
-  "name": "@yume-chan/adb-backend-webusb",
-  "entries": [
-    {
-      "version": "0.0.17",
-      "tag": "@yume-chan/adb-backend-webusb_v0.0.17",
-      "date": "Tue, 18 Oct 2022 09:32:30 GMT",
-      "comments": {
-        "none": [
-          {
-            "comment": "Update to use new stream util package"
-          }
-        ]
-      }
-    },
-    {
-      "version": "0.0.16",
-      "tag": "@yume-chan/adb-backend-webusb_v0.0.16",
-      "date": "Sat, 28 May 2022 03:56:37 GMT",
-      "comments": {
-        "none": [
-          {
-            "comment": "Upgrade TypeScript to 4.7.2 to enable Node.js ESM"
-          }
-        ]
-      }
-    },
-    {
-      "version": "0.0.15",
-      "tag": "@yume-chan/adb-backend-webusb_v0.0.15",
-      "date": "Mon, 02 May 2022 04:18:01 GMT",
-      "comments": {
-        "none": [
-          {
-            "comment": "Improve connection lifecycle handling"
-          }
-        ]
-      }
-    },
-    {
-      "version": "0.0.14",
-      "tag": "@yume-chan/adb-backend-webusb_v0.0.14",
-      "date": "Sat, 30 Apr 2022 14:05:48 GMT",
-      "comments": {}
-    },
-    {
-      "version": "0.0.13",
-      "tag": "@yume-chan/adb-backend-webusb_v0.0.13",
-      "date": "Thu, 28 Apr 2022 01:23:53 GMT",
-      "comments": {
-        "none": [
-          {
-            "comment": "Workaround an issue in Chrome where `transferIn` never returns `babble` on Windows"
-          }
-        ]
-      }
-    },
-    {
-      "version": "0.0.12",
-      "tag": "@yume-chan/adb-backend-webusb_v0.0.12",
-      "date": "Sun, 03 Apr 2022 11:18:47 GMT",
-      "comments": {}
-    },
-    {
-      "version": "0.0.11",
-      "tag": "@yume-chan/adb-backend-webusb_v0.0.11",
-      "date": "Sun, 03 Apr 2022 10:54:15 GMT",
-      "comments": {
-        "none": [
-          {
-            "comment": "Update to use Web Streams API"
-          },
-          {
-            "comment": "Improve compatibility with Node.js 12 ESM format"
-          },
-          {
-            "comment": "Update license year"
-          }
-        ],
-        "dependency": [
-          {
-            "comment": "Updating dependency \"@yume-chan/adb\" from `^0.0.10` to `^0.0.11`"
-          }
-        ]
-      }
-    },
-    {
-      "version": "0.0.10",
-      "tag": "@yume-chan/adb-backend-webusb_v0.0.10",
-      "date": "Sun, 09 Jan 2022 15:52:20 GMT",
-      "comments": {
-        "none": [
-          {
-            "comment": "Remove `encodeUtf8()` and `decodeUtf8()` from `AdbBackend`"
-          }
-        ]
-      }
-    },
-    {
-      "version": "0.0.9",
-      "tag": "@yume-chan/adb-backend-webusb_v0.0.9",
-      "date": "Sun, 09 Jan 2022 15:50:20 GMT",
-      "comments": {}
-    }
-  ]
-}

+ 0 - 63
src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-webusb/CHANGELOG.md

@@ -1,63 +0,0 @@
-# Change Log - @yume-chan/adb-backend-webusb
-
-This log was last generated on Tue, 18 Oct 2022 09:32:30 GMT and should not be manually modified.
-
-## 0.0.17
-Tue, 18 Oct 2022 09:32:30 GMT
-
-### Updates
-
-- Update to use new stream util package
-
-## 0.0.16
-Sat, 28 May 2022 03:56:37 GMT
-
-### Updates
-
-- Upgrade TypeScript to 4.7.2 to enable Node.js ESM
-
-## 0.0.15
-Mon, 02 May 2022 04:18:01 GMT
-
-### Updates
-
-- Improve connection lifecycle handling
-
-## 0.0.14
-Sat, 30 Apr 2022 14:05:48 GMT
-
-_Version update only_
-
-## 0.0.13
-Thu, 28 Apr 2022 01:23:53 GMT
-
-### Updates
-
-- Workaround an issue in Chrome where `transferIn` never returns `babble` on Windows
-
-## 0.0.12
-Sun, 03 Apr 2022 11:18:47 GMT
-
-_Version update only_
-
-## 0.0.11
-Sun, 03 Apr 2022 10:54:15 GMT
-
-### Updates
-
-- Update to use Web Streams API
-- Improve compatibility with Node.js 12 ESM format
-- Update license year
-
-## 0.0.10
-Sun, 09 Jan 2022 15:52:20 GMT
-
-### Updates
-
-- Remove `encodeUtf8()` and `decodeUtf8()` from `AdbBackend`
-
-## 0.0.9
-Sun, 09 Jan 2022 15:50:20 GMT
-
-_Initial release_
-

+ 0 - 21
src/renderer/cocoblockly-x/ya-webadb/libraries/adb-backend-webusb/LICENSE

@@ -1,21 +0,0 @@
-MIT License
-
-Copyright (c) 2020-2022 Simon Chan
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-The above copyright notice and this permission notice shall be included in all
-copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
-SOFTWARE.

Деякі файли не було показано, через те що забагато файлів було змінено