@mybricks/to-code-taro 1.1.0 → 1.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/dist/cjs/core/comlib/{index.js → Index.js} +6 -6
  2. package/dist/cjs/core/utils/PopupRenderer.js +1 -1
  3. package/dist/cjs/core/utils/hooks.js +102 -38
  4. package/dist/cjs/core/utils/slots.js +11 -4
  5. package/dist/cjs/core/utils/useContext.js +6 -4
  6. package/dist/cjs/core/utils/with.js +3 -3
  7. package/dist/cjs/generate/generateTaroProjectJson.js +36 -11
  8. package/dist/cjs/generate/utils/commonDir.js +14 -10
  9. package/dist/cjs/generate/utils/pageImages.d.ts +14 -0
  10. package/dist/cjs/generate/utils/pageImages.js +36 -0
  11. package/dist/cjs/handleCom.js +37 -14
  12. package/dist/cjs/handleDom.d.ts +2 -0
  13. package/dist/cjs/handleDom.js +5 -2
  14. package/dist/cjs/handleGlobal.js +4 -2
  15. package/dist/cjs/handleSlot.d.ts +3 -0
  16. package/dist/cjs/handleSlot.js +38 -10
  17. package/dist/cjs/processors/processScene.js +3 -1
  18. package/dist/cjs/taro-template.json +313 -13
  19. package/dist/cjs/toCodeTaro.d.ts +4 -1
  20. package/dist/cjs/toCodeTaro.js +80 -1
  21. package/dist/cjs/utils/builder/buildResult.js +3 -16
  22. package/dist/cjs/utils/config/content/converter.js +2 -2
  23. package/dist/cjs/utils/config/content/pageConfig.js +4 -1
  24. package/dist/cjs/utils/config/content/saveBase64Image.d.ts +10 -0
  25. package/dist/cjs/utils/config/content/saveBase64Image.js +44 -3
  26. package/dist/cjs/utils/config/content/tabBarConfig.js +8 -2
  27. package/dist/cjs/utils/config/handlePageConfig.js +5 -3
  28. package/dist/cjs/utils/context/collectJSModules.d.ts +4 -0
  29. package/dist/cjs/utils/context/collectJSModules.js +4 -2
  30. package/dist/cjs/utils/logic/genJSModules.d.ts +8 -4
  31. package/dist/cjs/utils/logic/genJSModules.js +31 -33
  32. package/dist/cjs/utils/logic/handleProcess.js +4 -4
  33. package/dist/cjs/utils/logic/processChildren.d.ts +14 -1
  34. package/dist/cjs/utils/logic/processChildren.js +30 -6
  35. package/dist/cjs/utils/style/converter.js +34 -72
  36. package/dist/cjs/utils/templates/index.d.ts +1 -0
  37. package/dist/cjs/utils/templates/index.js +11 -2
  38. package/dist/cjs/utils/templates/renderManager.d.ts +4 -0
  39. package/dist/cjs/utils/templates/renderManager.js +10 -3
  40. package/dist/cjs/utils/templates/scene.js +13 -1
  41. package/dist/esm/core/comlib/{index.js → Index.js} +1 -1
  42. package/dist/esm/core/utils/PopupRenderer.js +1 -1
  43. package/dist/esm/core/utils/hooks.js +137 -53
  44. package/dist/esm/core/utils/popupRouter.js +2 -1
  45. package/dist/esm/core/utils/slots.js +24 -22
  46. package/dist/esm/core/utils/useContext.js +8 -10
  47. package/dist/esm/core/utils/with.js +3 -3
  48. package/dist/esm/generate/generateTaroProjectJson.js +28 -8
  49. package/dist/esm/generate/utils/commonDir.js +18 -14
  50. package/dist/esm/generate/utils/pageImages.d.ts +14 -0
  51. package/dist/esm/generate/utils/pageImages.d.ts.map +1 -0
  52. package/dist/esm/generate/utils/pageImages.js +15 -0
  53. package/dist/esm/handleCom.js +44 -17
  54. package/dist/esm/handleDom.d.ts +2 -0
  55. package/dist/esm/handleDom.js +6 -4
  56. package/dist/esm/handleGlobal.js +4 -2
  57. package/dist/esm/handleSlot.d.ts +3 -0
  58. package/dist/esm/handleSlot.js +57 -12
  59. package/dist/esm/processors/processComEvents.d.ts.map +1 -0
  60. package/dist/esm/processors/processScene.d.ts.map +1 -1
  61. package/dist/esm/processors/processScene.js +13 -3
  62. package/dist/esm/processors/processSceneLogic.d.ts.map +1 -0
  63. package/dist/esm/taro-template.json +313 -13
  64. package/dist/esm/toCodeTaro.d.ts +4 -1
  65. package/dist/esm/toCodeTaro.d.ts.map +1 -1
  66. package/dist/esm/toCodeTaro.js +89 -4
  67. package/dist/esm/utils/builder/buildResult.d.ts.map +1 -1
  68. package/dist/esm/utils/builder/buildResult.js +5 -14
  69. package/dist/esm/utils/common/helper.d.ts.map +1 -0
  70. package/dist/esm/utils/config/content/converter.js +2 -2
  71. package/dist/esm/utils/config/content/pageConfig.js +4 -1
  72. package/dist/esm/utils/config/content/saveBase64Image.d.ts +10 -0
  73. package/dist/esm/utils/config/content/saveBase64Image.js +42 -1
  74. package/dist/esm/utils/config/content/tabBarConfig.js +7 -2
  75. package/dist/esm/utils/config/handlePageConfig.d.ts.map +1 -1
  76. package/dist/esm/utils/config/handlePageConfig.js +5 -3
  77. package/dist/esm/utils/context/collectJSModules.d.ts +4 -0
  78. package/dist/esm/utils/context/collectJSModules.d.ts.map +1 -1
  79. package/dist/esm/utils/context/collectJSModules.js +1 -1
  80. package/dist/esm/utils/logic/genJSModules.d.ts +8 -4
  81. package/dist/esm/utils/logic/genJSModules.d.ts.map +1 -1
  82. package/dist/esm/utils/logic/genJSModules.js +16 -27
  83. package/dist/esm/utils/logic/handleProcess.js +4 -4
  84. package/dist/esm/utils/logic/processChildren.d.ts +14 -1
  85. package/dist/esm/utils/logic/processChildren.js +45 -8
  86. package/dist/esm/utils/style/converter.js +57 -106
  87. package/dist/esm/utils/templates/index.d.ts +1 -0
  88. package/dist/esm/utils/templates/index.js +9 -2
  89. package/dist/esm/utils/templates/renderManager.d.ts +4 -0
  90. package/dist/esm/utils/templates/renderManager.js +17 -4
  91. package/dist/esm/utils/templates/scene.js +8 -2
  92. package/package.json +1 -1
  93. package/dist/esm/generate/generateTaroProjectJson.d.ts.map +0 -1
  94. package/dist/esm/generate/utils/commonDir.d.ts.map +0 -1
  95. package/dist/esm/handleDom.d.ts.map +0 -1
  96. package/dist/esm/handleGlobal.d.ts.map +0 -1
  97. package/dist/esm/utils/config/content/converter.d.ts.map +0 -1
  98. package/dist/esm/utils/config/content/pageConfig.d.ts.map +0 -1
  99. package/dist/esm/utils/config/content/saveBase64Image.d.ts.map +0 -1
  100. package/dist/esm/utils/config/content/tabBarConfig.d.ts.map +0 -1
  101. package/dist/esm/utils/logic/processChildren.d.ts.map +0 -1
@@ -9,7 +9,7 @@
9
9
  },
10
10
  {
11
11
  "path": "config/index.ts",
12
- "content": "import { defineConfig, type UserConfigExport } from '@tarojs/cli'\nimport TsconfigPathsPlugin from 'tsconfig-paths-webpack-plugin'\nimport devConfig from './dev'\nimport prodConfig from './prod'\n\n// https://taro-docs.jd.com/docs/next/config#defineconfig-辅助函数\nexport default defineConfig<'webpack5'>(async (merge, { command, mode }) => {\n const baseConfig: UserConfigExport<'webpack5'> = {\n projectName: 'checkCom',\n date: '2025-12-24',\n designWidth: 375,\n deviceRatio: {\n 640: 2.34 / 2,\n 750: 1,\n 375: 2,\n 828: 1.81 / 2\n },\n sourceRoot: 'src',\n outputRoot: 'dist',\n plugins: [\n \"@tarojs/plugin-generator\"\n ],\n defineConstants: {\n },\n copy: {\n patterns: [\n ],\n options: {\n }\n },\n framework: 'react',\n compiler: {\n type: 'webpack5',\n prebundle: {\n exclude: ['brickd-mobile', '@taroify/icons']\n }\n },\n cache: {\n enable: false // Webpack 持久化缓存配置,建议开启。默认配置请参考:https://docs.taro.zone/docs/config-detail#cache\n },\n mini: {\n postcss: {\n pxtransform: {\n enable: true,\n config: {\n\n }\n },\n cssModules: {\n enable: true, // 默认为 false,如需使用 css modules 功能,则设为 true\n config: {\n namingPattern: 'global', // 转换模式,取值为 global/module\n generateScopedName: '[name]__[local]___[hash:base64:5]'\n }\n }\n },\n webpackChain(chain) {\n chain.resolve.plugin('tsconfig-paths').use(TsconfigPathsPlugin)\n }\n },\n h5: {\n publicPath: '/',\n staticDirectory: 'static',\n output: {\n filename: 'js/[name].[hash:8].js',\n chunkFilename: 'js/[name].[chunkhash:8].js'\n },\n miniCssExtractPluginOption: {\n ignoreOrder: true,\n filename: 'css/[name].[hash].css',\n chunkFilename: 'css/[name].[chunkhash].css'\n },\n postcss: {\n autoprefixer: {\n enable: true,\n config: {}\n },\n cssModules: {\n enable: true, // 默认为 false,如需使用 css modules 功能,则设为 true\n config: {\n namingPattern: 'module', // 转换模式,取值为 global/module\n generateScopedName: '[name]__[local]___[hash:base64:5]'\n }\n }\n },\n webpackChain(chain) {\n chain.resolve.plugin('tsconfig-paths').use(TsconfigPathsPlugin)\n }\n },\n rn: {\n appName: 'taroDemo',\n postcss: {\n cssModules: {\n enable: false, // 默认为 false,如需使用 css modules 功能,则设为 true\n }\n }\n }\n }\n\n process.env.BROWSERSLIST_ENV = process.env.NODE_ENV\n\n if (process.env.NODE_ENV === 'development') {\n // 本地开发构建配置(不混淆压缩)\n return merge({}, baseConfig, devConfig)\n }\n // 生产构建配置(默认开启压缩混淆等)\n return merge({}, baseConfig, prodConfig)\n})\n"
12
+ "content": "import { defineConfig, type UserConfigExport } from '@tarojs/cli'\nimport path from 'path'\nimport devConfig from './dev'\nimport prodConfig from './prod'\n\n// https://taro-docs.jd.com/docs/next/config#defineconfig-辅助函数\nexport default defineConfig<'webpack5'>(async (merge, { command, mode }) => {\n const baseConfig: UserConfigExport<'webpack5'> = {\n projectName: 'checkCom',\n date: '2025-12-24',\n designWidth: 375,\n deviceRatio: {\n 640: 2.34 / 2,\n 750: 1,\n 375: 2,\n 828: 1.81 / 2\n },\n sourceRoot: 'src',\n outputRoot: 'dist',\n plugins: [\n \"@tarojs/plugin-generator\"\n ],\n defineConstants: {\n },\n copy: {\n patterns: [\n ],\n options: {\n }\n },\n framework: 'react',\n compiler: {\n type: 'webpack5',\n prebundle: {\n exclude: ['brickd-mobile', '@taroify/icons']\n }\n },\n cache: {\n enable: false // Webpack 持久化缓存配置,建议开启。默认配置请参考:https://docs.taro.zone/docs/config-detail#cache\n },\n mini: {\n postcss: {\n pxtransform: {\n enable: true,\n config: {\n\n }\n },\n cssModules: {\n enable: true, // 默认为 false,如需使用 css modules 功能,则设为 true\n config: {\n namingPattern: 'global', // 转换模式,取值为 global/module\n generateScopedName: '[name]__[local]___[hash:base64:5]'\n }\n }\n },\n webpackChain(chain) {\n chain.resolve.alias\n .set('@', path.resolve(__dirname, '../src'))\n }\n },\n h5: {\n publicPath: '/',\n staticDirectory: 'static',\n output: {\n filename: 'js/[name].[hash:8].js',\n chunkFilename: 'js/[name].[chunkhash:8].js'\n },\n miniCssExtractPluginOption: {\n ignoreOrder: true,\n filename: 'css/[name].[hash].css',\n chunkFilename: 'css/[name].[chunkhash].css'\n },\n postcss: {\n autoprefixer: {\n enable: true,\n config: {}\n },\n cssModules: {\n enable: true, // 默认为 false,如需使用 css modules 功能,则设为 true\n config: {\n namingPattern: 'module', // 转换模式,取值为 global/module\n generateScopedName: '[name]__[local]___[hash:base64:5]'\n }\n }\n },\n webpackChain(chain) {\n chain.resolve.alias\n .set('@', path.resolve(__dirname, '../src'))\n }\n },\n rn: {\n appName: 'taroDemo',\n postcss: {\n cssModules: {\n enable: false, // 默认为 false,如需使用 css modules 功能,则设为 true\n }\n }\n }\n }\n\n process.env.BROWSERSLIST_ENV = process.env.NODE_ENV\n\n if (process.env.NODE_ENV === 'development') {\n // 本地开发构建配置(不混淆压缩)\n return merge({}, baseConfig, devConfig)\n }\n // 生产构建配置(默认开启压缩混淆等)\n return merge({}, baseConfig, prodConfig)\n})\n"
13
13
  },
14
14
  {
15
15
  "path": "config/prod.ts",
@@ -21,6 +21,16 @@
21
21
  "path": "src",
22
22
  "content": null,
23
23
  "children": [
24
+ {
25
+ "path": "src/common",
26
+ "content": null,
27
+ "children": [
28
+ {
29
+ "path": "src/common/pageLife.ts",
30
+ "content": "import Taro, { useDidShow, useDidHide, useRouter } from '@tarojs/taro';\n\n/**\n * 页面生命周期 Hook\n * 用于监听页面的 DidShow 和 DidHide 事件,并通过 Taro.eventCenter 触发全局事件\n */\nexport const usePageLife = () => {\n const router = useRouter();\n\n useDidShow(() => {\n Taro.eventCenter.trigger('pageDidShow', {\n path: router.path,\n query: router.params\n });\n });\n\n useDidHide(() => {\n Taro.eventCenter.trigger('pageDidHide', {\n path: router.path,\n query: router.params\n });\n });\n};\n\n"
31
+ }
32
+ ]
33
+ },
24
34
  {
25
35
  "path": "src/components",
26
36
  "content": null,
@@ -367,6 +377,296 @@
367
377
  }
368
378
  ]
369
379
  },
380
+ {
381
+ "path": "src/components/chart",
382
+ "content": null,
383
+ "children": [
384
+ {
385
+ "path": "src/components/chart/chart-column",
386
+ "content": null,
387
+ "children": [
388
+ {
389
+ "path": "src/components/chart/chart-column/com.json",
390
+ "content": "{\n \"title\": \"柱状图\",\n \"namespace\": \"mybricks.taro.chart.column\",\n \"author\": \"mybricks-team\",\n \"author_name\": \"板砖团队\",\n \"icon\": \"./icon.svg\",\n \"version\": \"1.0.0\",\n \"description\": \"柱状图\",\n \"runtime\": \"./runtime.tsx\",\n \"runtime.edit\": \"./runtime.edit.tsx\",\n \"data\": \"./data.json\",\n \"editors\": \"./editors.tsx\",\n \"inputs\": [\n {\n \"id\": \"data\",\n \"title\": \"输入数据\",\n \"schema\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"xField\": {\n \"title\": \"x轴字段名\",\n \"type\": \"string\"\n },\n \"yField\": {\n \"title\": \"y轴字段名\",\n \"type\": \"string\"\n }\n }\n }\n },\n \"rels\": [\"afterrender\"]\n },\n {\n \"id\": \"loading\",\n \"title\": \"切换到加载中\",\n \"desc\": \"提示用户正在加载中\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"id\": \"noMore\",\n \"title\": \"切换到没有数据\",\n \"desc\": \"提示用户当前没有数据\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"id\": \"error\",\n \"title\": \"切换到加载报错\",\n \"desc\": \"提示用户报错信息\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n }\n ],\n \"outputs\": [\n {\n \"id\": \"afterrender\",\n \"title\": \"渲染完成\"\n }\n ]\n}\n"
391
+ },
392
+ {
393
+ "path": "src/components/chart/chart-column/data.json",
394
+ "content": "{\n \"type\": \"column\",\n \"config\": {\n \"xField\": \"label\",\n \"yField\": \"value\",\n \"xAxis\": {},\n \"yAxis\": {},\n \"legend\": {\n \"position\": \"right\"\n },\n \"seriesField\": \"\",\n \"padding\": \"auto\",\n \"label\": false,\n \"xFieldScrollable\": false,\n \"smooth\": false,\n \"xFieldTickCount\": 0\n },\n \"useCustomTooltip\": false,\n \"showTooltipTitle\": false\n}\n"
395
+ },
396
+ {
397
+ "path": "src/components/chart/chart-column/editors.tsx",
398
+ "content": "import {\n getNormalDataEditors,\n getLegendEditors,\n getChartTypeEditors,\n} from \"./../utils/editor\";\nimport { ChartType } from \"./../types\";\n\nexport default {\n \"@init\"({ style }) {\n style.height = 400;\n style.width = \"100%\";\n },\n \"@resize\": {\n options: [\"width\", \"height\"],\n },\n \":root\"({ data, output, style }, cate0, cate1, cate2) {\n cate0.title = \"常规\";\n cate0.items = [\n getChartTypeEditors({\n options: [\n {\n label: \"柱状图\",\n value: ChartType.Column,\n },\n {\n label: \"堆叠柱状图\",\n value: ChartType.ColumnStack,\n },\n {\n label: \"分组柱状图\",\n value: ChartType.ColumnGroup,\n },\n ],\n }),\n getNormalDataEditors({\n xFieldRotate: true,\n xFieldScrollable: true,\n yFieldDisplay: true,\n }),\n getLegendEditors({}),\n {\n title: \"Tooltip显示标题\",\n type: \"switch\",\n value: {\n get({ data }) {\n return data.showTooltipTitle;\n },\n set({ data, outputs }, value) {\n data.showTooltipTitle = value;\n },\n },\n },\n {\n title: \"自定义 Tooltip\",\n type: \"switch\",\n value: {\n get({ data }) {\n return data.useCustomTooltip;\n },\n set({ data, outputs }, value) {\n data.useCustomTooltip = value;\n\n if (value) {\n output.add(\"onTooltipShow\", \"Tooltip 显示\", { type: \"any\" });\n output.add(\"onTooltipHide\", \"Tooltip 隐藏\", { type: \"any\" });\n } else {\n output.remove(\"onTooltipShow\");\n output.remove(\"onTooltipHide\");\n }\n },\n },\n },\n {\n ifVisible({ data }) {\n return data.useCustomTooltip;\n },\n title: \"Tooltip 显示\",\n type: \"_event\",\n options: {\n outputId: \"onTooltipShow\",\n },\n },\n {\n ifVisible({ data }) {\n return data.useCustomTooltip;\n },\n title: \"Tooltip 隐藏\",\n type: \"_event\",\n options: {\n outputId: \"onTooltipHide\",\n },\n },\n ];\n\n cate1.title = \"高级\";\n cate1.items = [\n {\n title: \"升级\",\n type: \"button\",\n value: {\n set({ data, inputs, outputs }) {\n if (output.get(\"afterrender\")) {\n return;\n }\n\n outputs.add(\"afterrender\", \"渲染完成\", { type: \"any\" });\n inputs.get(\"data\").setRels([\"afterrender\"]);\n },\n },\n },\n ];\n },\n};\n"
399
+ },
400
+ {
401
+ "path": "src/components/chart/chart-column/icon.svg",
402
+ "content": "<?xml version=\"1.0\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg t=\"1637217879270\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"3860\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"200\" height=\"200\"><defs><style type=\"text/css\"></style></defs><path d=\"M85.312 938.688H1024V1024H0V0h85.312v938.688zM256 341.312h85.312V768H256V341.312zM512 128h85.312v640H512V128z m256 213.312h85.312V768H768V341.312z\" fill=\"#555555\" p-id=\"3861\"></path></svg>"
403
+ },
404
+ {
405
+ "path": "src/components/chart/chart-column/runtime.edit.tsx",
406
+ "content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { mockChart } from './../utils/mock'\nimport Runtime from './runtime'\n\nexport default function ({ data, ...others }) {\n return <Runtime data={data} {...others} mockData={mockChart(data.type, data)} />;\n}\n\n"
407
+ },
408
+ {
409
+ "path": "src/components/chart/chart-column/runtime.tsx",
410
+ "content": "import React, {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { ChartStatus, LoadStatus } from \"./../components/chart-status\";\nimport { useChart, getChartConfigFromData } from \"./../utils/chartLine\";\nimport { ChartType, isGroupChart } from \"./../types\";\nimport css from \"./style.less\";\n\nexport default function ({\n env,\n data,\n inputs,\n outputs,\n title,\n style,\n mockData = [],\n}) {\n const { chart, Canvas, events, ...props } = useChart(env);\n\n const [dataSource, setDataSource] = useState(env.edit ? mockData : []);\n const [status, setStatus] = useState(LoadStatus.IDLE);\n\n const tickit = useRef(null);\n\n const changeSize = useCallback(\n (width, height) => {\n if (!chart) {\n return;\n }\n chart.changeSize(width, height);\n },\n [chart]\n );\n\n useMemo(() => {\n inputs[\"loading\"]?.((bool) => {\n setStatus(LoadStatus.LOADING);\n });\n\n inputs[\"noMore\"]?.((bool) => {\n setStatus(LoadStatus.NOMORE);\n });\n\n inputs[\"error\"]?.((bool) => {\n setStatus(LoadStatus.ERROR);\n });\n\n inputs[\"data\"]((val, outputRels) => {\n if (Array.isArray(val)) {\n tickit.current = outputRels[\"afterrender\"];\n\n setDataSource(val);\n setStatus(LoadStatus.IDLE);\n }\n });\n }, []);\n\n useEffect(() => {\n if (!chart) {\n return;\n }\n\n chart.clear();\n\n let sourceParams = {\n [data.config.xField]: {\n tickCount: data.config.xFieldTickCount || 0,\n },\n } as any;\n\n if (data.config.xFieldScrollable) {\n sourceParams[data.config.xField].values = (\n env.edit ? mockData : dataSource\n )\n .slice(0, data.config.xFieldCount || 10)\n .map((d) => d[data.config.xField]);\n }\n\n chart.source(env.edit ? mockData : dataSource, {\n ...sourceParams,\n });\n\n // 配置 X 轴标签的旋转角度\n if (data.config.xFieldRotate) {\n chart.axis(data.config.xField, {\n label: function (text, index, total) {\n const cfg = {\n rotate: Math.PI / data.config.xFieldRotate, // 45度\n textAlign: \"start\",\n };\n return cfg;\n },\n });\n }\n\n const { legend } = getChartConfigFromData(data);\n\n const color = isGroupChart(data.type) ? data.config.seriesField : false;\n\n let adjust: any = null;\n switch (data.type) {\n case ChartType.ColumnStack:\n adjust = \"stack\";\n break;\n case ChartType.ColumnGroup:\n adjust = {\n type: \"dodge\",\n };\n break;\n }\n\n // 定义进度条\n if (data.config.xFieldScrollable) {\n chart.interaction(\"pan\");\n\n chart.scrollBar({\n mode: \"x\",\n xStyle: {\n offsetY: -5,\n },\n });\n }\n\n if (data.config.yFieldDisplay) {\n chart.guide().text({\n position: [\"min\", \"max\"], // 位置为 Y 轴的顶部\n content: data.config.yField, // 名称内容\n style: {\n textAlign: \"center\",\n textBaseline: \"bottom\",\n fontSize: 12,\n fill: \"#808080\",\n },\n offsetY: -12, // 向上偏移,避免与 Y 轴的刻度重叠\n });\n }\n\n chart\n .interval()\n .position(`${data.config.xField}*${data.config.yField}`)\n .color(color)\n .adjust(adjust);\n\n if (data.useCustomTooltip) {\n // 自定义 tooltip\n chart.tooltip({\n custom: true,\n onShow: (ev) => {\n outputs[\"onTooltipShow\"]?.(ev.items[0]);\n },\n onHide: () => {\n outputs[\"onTooltipHide\"]?.();\n },\n });\n } else {\n chart.tooltip({\n showTitle: data.showTooltipTitle ?? false,\n });\n }\n\n chart.legend(...legend);\n\n // 监听 afterrender 事件\n chart.on(\"afterrender\", () => {\n console.log(\"图表渲染完成\");\n if (typeof tickit.current === \"function\") {\n tickit.current();\n tickit.current = null;\n }\n });\n\n chart.render();\n }, [\n chart,\n mockData,\n dataSource,\n data.type,\n data.config.seriesField,\n data.config.xField,\n data.config.yField,\n data.config?.legend,\n\n data.config.xFieldScrollable,\n data.config.xFieldCount,\n data.config.xFieldRotate,\n data.config.yFieldDisplay,\n tickit.current,\n\n data.config.xFieldTickCount,\n ]);\n\n return (\n <ChartStatus env={env} status={status} {...events} onResize={changeSize}>\n <Canvas className={css.chart_line} {...props} />\n </ChartStatus>\n );\n}\n"
411
+ },
412
+ {
413
+ "path": "src/components/chart/chart-column/style.less",
414
+ "content": ".chart_line {\n width: 100%;\n height: 100%;\n}"
415
+ }
416
+ ]
417
+ },
418
+ {
419
+ "path": "src/components/chart/chart-line",
420
+ "content": null,
421
+ "children": [
422
+ {
423
+ "path": "src/components/chart/chart-line/com.json",
424
+ "content": "{\n \"title\": \"折线图\",\n \"namespace\": \"mybricks.taro.chart.line\",\n \"author\": \"mybricks-team\",\n \"author_name\": \"板砖团队\",\n \"icon\": \"./icon.svg\",\n \"version\": \"1.0.0\",\n \"description\": \"折线图\",\n \"runtime\": \"./runtime.tsx\",\n \"runtime.edit\": \"./runtime.edit.tsx\",\n \"data\": \"./data.json\",\n \"editors\": \"./editors.tsx\",\n \"inputs\": [\n {\n \"id\": \"data\",\n \"title\": \"输入数据\",\n \"schema\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"xField\": {\n \"title\": \"x轴字段名\",\n \"type\": \"string\"\n },\n \"yField\": {\n \"title\": \"y轴字段名\",\n \"type\": \"string\"\n }\n }\n }\n },\n \"rels\": [\"afterrender\"]\n },\n {\n \"id\": \"loading\",\n \"title\": \"切换到加载中\",\n \"desc\": \"提示用户正在加载中\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"id\": \"noMore\",\n \"title\": \"切换到没有数据\",\n \"desc\": \"提示用户当前没有数据\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"id\": \"error\",\n \"title\": \"切换到加载报错\",\n \"desc\": \"提示用户报错信息\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n }\n ],\n \"outputs\": [\n {\n \"id\": \"afterrender\",\n \"title\": \"渲染完成\"\n }\n ]\n}\n"
425
+ },
426
+ {
427
+ "path": "src/components/chart/chart-line/data.json",
428
+ "content": "{\n \"type\": \"line\",\n \"config\": {\n \"xField\": \"label\",\n \"yField\": \"value\",\n \"xAxis\": {},\n \"yAxis\": {},\n \"legend\": {\n \"position\": \"right\"\n },\n \"seriesField\": \"\",\n \"padding\": \"auto\",\n \"label\": false,\n \"xFieldScrollable\": false,\n \"xFieldTickCount\": 0\n },\n \"geo\": {\n \"line\": {\n \"show\": true,\n \"smooth\": false\n },\n \"dot\": {\n \"show\": true\n },\n \"area\": {\n \"show\": false\n }\n },\n \"useCustomTooltip\": false,\n \"showTooltipTitle\": false\n}\n"
429
+ },
430
+ {
431
+ "path": "src/components/chart/chart-line/editors.tsx",
432
+ "content": "import {\n getNormalDataEditors,\n getLegendEditors,\n getChartTypeEditors,\n getGeoEditors,\n} from \"./../utils/editor\";\nimport { ChartType } from \"./../types\";\n\nexport default {\n \"@init\"({ style }) {\n style.height = 400;\n style.width = \"100%\";\n },\n \"@resize\": {\n options: [\"width\", \"height\"],\n },\n \":root\"({ data, output, style }, cate0, cate1, cate2) {\n cate0.title = \"常规\";\n cate0.items = [\n getChartTypeEditors({\n options: [\n {\n label: \"折线图\",\n value: ChartType.Line,\n },\n {\n label: \"对比折线图\",\n value: ChartType.LineMuti,\n },\n ],\n }),\n getGeoEditors({}),\n getNormalDataEditors({\n xFieldRotate: true,\n xFieldScrollable: true,\n yFieldDisplay: true,\n }),\n getLegendEditors({}),\n {\n title: \"Tooltip显示标题\",\n type: \"switch\",\n value: {\n get({ data }) {\n return data.showTooltipTitle;\n },\n set({ data, outputs }, value) {\n data.showTooltipTitle = value;\n },\n },\n },\n {\n title: \"自定义 Tooltip\",\n type: \"switch\",\n value: {\n get({ data }) {\n return data.useCustomTooltip;\n },\n set({ data, outputs }, value) {\n data.useCustomTooltip = value;\n\n if (value) {\n output.add(\"onTooltipShow\", \"Tooltip 显示\", { type: \"any\" });\n output.add(\"onTooltipHide\", \"Tooltip 隐藏\", { type: \"any\" });\n } else {\n output.remove(\"onTooltipShow\");\n output.remove(\"onTooltipHide\");\n }\n },\n },\n },\n {\n ifVisible({ data }) {\n return data.useCustomTooltip;\n },\n title: \"Tooltip 显示\",\n type: \"_event\",\n options: {\n outputId: \"onTooltipShow\",\n },\n },\n {\n ifVisible({ data }) {\n return data.useCustomTooltip;\n },\n title: \"Tooltip 隐藏\",\n type: \"_event\",\n options: {\n outputId: \"onTooltipHide\",\n },\n },\n ];\n\n cate1.title = \"高级\";\n cate1.items = [\n {\n title: \"升级\",\n type: \"button\",\n value: {\n set({ data, inputs, outputs }) {\n if (output.get(\"afterrender\")) {\n return;\n }\n\n outputs.add(\"afterrender\", \"渲染完成\", { type: \"any\" });\n inputs.get(\"data\").setRels([\"afterrender\"]);\n },\n },\n },\n ];\n },\n};\n"
433
+ },
434
+ {
435
+ "path": "src/components/chart/chart-line/icon.svg",
436
+ "content": "<?xml version=\"1.0\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg t=\"1637218065080\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"4722\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"200\" height=\"200\"><defs><style type=\"text/css\"></style></defs><path d=\"M888 792H200V168c0-4.4-3.6-8-8-8h-56c-4.4 0-8 3.6-8 8v688c0 4.4 3.6 8 8 8h752c4.4 0 8-3.6 8-8v-56c0-4.4-3.6-8-8-8z\" p-id=\"4723\"></path><path d=\"M305.8 637.7c3.1 3.1 8.1 3.1 11.3 0l138.3-137.6L583 628.5c3.1 3.1 8.2 3.1 11.3 0l275.4-275.3c3.1-3.1 3.1-8.2 0-11.3l-39.6-39.6c-3.1-3.1-8.2-3.1-11.3 0l-230 229.9L461.4 404c-3.1-3.1-8.2-3.1-11.3 0L266.3 586.7c-3.1 3.1-3.1 8.2 0 11.3l39.5 39.7z\" p-id=\"4724\"></path></svg>"
437
+ },
438
+ {
439
+ "path": "src/components/chart/chart-line/runtime.edit.tsx",
440
+ "content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { mockChart } from \"./../utils/mock\";\nimport Runtime from \"./runtime\";\n\nexport default function ({ data, ...others }) {\n \n let mockData = mockChart(data.type, data);\n if (data.type === \"line\") {\n mockData = mockData.map((item, index) => {\n return {\n ...item,\n type: \"line\",\n };\n });\n }\n\n return <Runtime data={data} {...others} mockData={mockData} />;\n}\n"
441
+ },
442
+ {
443
+ "path": "src/components/chart/chart-line/runtime.tsx",
444
+ "content": "import React, {\n useCallback,\n useEffect,\n useMemo,\n useState,\n useRef,\n} from \"react\";\nimport { ChartStatus, LoadStatus } from \"./../components/chart-status\";\nimport { useChart, getChartConfigFromData } from \"./../utils/chartLine\";\nimport { ChartType, isGroupChart } from \"./../types\";\nimport css from \"./style.less\";\n\nexport default function ({\n env,\n data,\n inputs,\n outputs,\n title,\n style,\n mockData = [],\n}) {\n const { chart, Canvas, events, ...props } = useChart(env);\n\n const [dataSource, setDataSource] = useState([]);\n const [status, setStatus] = useState(LoadStatus.IDLE);\n\n const tickit = useRef(null);\n\n const changeSize = useCallback(\n (width, height) => {\n if (!chart) {\n return;\n }\n chart.changeSize(width, height);\n },\n [chart]\n );\n\n useMemo(() => {\n inputs[\"loading\"]?.((bool) => {\n setStatus(LoadStatus.LOADING);\n });\n\n inputs[\"noMore\"]?.((bool) => {\n setStatus(LoadStatus.NOMORE);\n });\n\n inputs[\"error\"]?.((bool) => {\n setStatus(LoadStatus.ERROR);\n });\n\n inputs[\"data\"]((val, outputRels) => {\n if (Array.isArray(val)) {\n tickit.current = outputRels[\"afterrender\"];\n\n setDataSource(val);\n setStatus(LoadStatus.IDLE);\n }\n });\n }, []);\n\n useEffect(() => {\n if (!chart) {\n return;\n }\n\n chart.clear();\n\n let sourceParams = {\n [data.config.xField]: {\n tickCount: data.config.xFieldTickCount || 0,\n },\n } as any;\n if (data.config.xFieldScrollable) {\n sourceParams[data.config.xField].values = (\n env.edit ? mockData : dataSource\n )\n .slice(0, data.config.xFieldCount || 10)\n .map((d) => d[data.config.xField]);\n }\n\n chart.source(env.edit ? mockData : dataSource, {\n ...sourceParams,\n });\n\n // 配置 X 轴标签的旋转角度\n if (data.config.xFieldRotate) {\n chart.axis(data.config.xField, {\n label: function (text, index, total) {\n const cfg = {\n rotate: Math.PI / data.config.xFieldRotate, // 45度\n textAlign: \"start\",\n };\n return cfg;\n },\n });\n }\n\n const { legend } = getChartConfigFromData(data);\n\n const color = isGroupChart(data.type) ? data.config.seriesField : \"\";\n\n chart\n .line()\n .position(`${data.config.xField}*${data.config.yField}`)\n .color(color)\n .shape(data?.geo?.line?.smooth ? \"smooth\" : \"line\")\n .animate({\n appear: {\n animation: \"groupWaveIn\",\n },\n });\n\n if (data.geo.dot?.show) {\n chart\n .point()\n .position(`${data.config.xField}*${data.config.yField}`)\n .color(color)\n .style({\n stroke: \"#fff\",\n lineWidth: 1,\n })\n .animate({\n appear: {\n animation: \"groupWaveIn\",\n },\n });\n }\n\n if (data.geo.area?.show) {\n chart\n .area()\n .position(`${data.config.xField}*${data.config.yField}`)\n .color(color)\n .animate({\n appear: {\n animation: \"groupWaveIn\",\n },\n });\n }\n\n // 定义进度条\n if (data.config.xFieldScrollable) {\n chart.interaction(\"pan\");\n\n chart.scrollBar({\n mode: \"x\",\n xStyle: {\n offsetY: -5,\n },\n });\n }\n\n if (data.config.yFieldDisplay) {\n chart.guide().text({\n position: [\"min\", \"max\"], // 位置为 Y 轴的顶部\n content: data.config.yField, // 名称内容\n style: {\n textAlign: \"center\",\n textBaseline: \"bottom\",\n fontSize: 12,\n fill: \"#808080\",\n },\n offsetY: -12, // 向上偏移,避免与 Y 轴的刻度重叠\n });\n }\n\n if (data.useCustomTooltip) {\n // 自定义 tooltip\n chart.tooltip({\n custom: true,\n onShow: (ev) => {\n let result;\n if (ev.items.length > 1) {\n result = ev.items;\n } else {\n result = ev.items[0];\n }\n\n outputs[\"onTooltipShow\"]?.(result);\n },\n onHide: () => {\n outputs[\"onTooltipHide\"]?.();\n },\n });\n } else {\n chart.tooltip({\n showTitle: data.showTooltipTitle ?? false,\n });\n }\n\n chart.legend(...legend);\n\n // 监听 afterrender 事件\n chart.on(\"afterrender\", () => {\n console.log(\"图表渲染完成\");\n if (typeof tickit.current === \"function\") {\n tickit.current();\n tickit.current = null;\n }\n });\n\n chart.render();\n }, [\n chart,\n mockData,\n dataSource,\n data.type,\n data.config.seriesField,\n data.config.xField,\n data.config.yField,\n data.config?.legend,\n\n data.geo?.line,\n data.geo?.dot,\n data.geo?.area,\n\n data.config.xFieldScrollable,\n data.config.xFieldCount,\n data.config.xFieldRotate,\n data.config.yFieldDisplay,\n\n data.config.xFieldTickCount,\n\n tickit.current,\n ]);\n\n return (\n <ChartStatus env={env} status={status} {...events} onResize={changeSize}>\n <Canvas className={css.chart_line} {...props} />\n </ChartStatus>\n );\n}\n"
445
+ },
446
+ {
447
+ "path": "src/components/chart/chart-line/style.less",
448
+ "content": ".chart_line {\n width: 100%;\n height: 100%;\n}"
449
+ }
450
+ ]
451
+ },
452
+ {
453
+ "path": "src/components/chart/chart-pie",
454
+ "content": null,
455
+ "children": [
456
+ {
457
+ "path": "src/components/chart/chart-pie/com.json",
458
+ "content": "{\n \"title\": \"饼图\",\n \"namespace\": \"mybricks.taro.chart.pie\",\n \"author\": \"mybricks-team\",\n \"author_name\": \"板砖团队\",\n \"icon\": \"./icon.svg\",\n \"version\": \"1.0.0\",\n \"description\": \"饼图\",\n \"runtime\": \"./runtime.tsx\",\n \"runtime.edit\": \"./runtime.edit.tsx\",\n \"data\": \"./data.json\",\n \"editors\": \"./editors.tsx\",\n \"inputs\": [\n {\n \"id\": \"data\",\n \"title\": \"输入数据\",\n \"schema\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"xField\": {\n \"title\": \"x轴字段名\",\n \"type\": \"string\"\n },\n \"yField\": {\n \"title\": \"y轴字段名\",\n \"type\": \"string\"\n }\n }\n }\n },\n \"rels\": [\"afterrender\"]\n },\n {\n \"id\": \"loading\",\n \"title\": \"切换到加载中\",\n \"desc\": \"提示用户正在加载中\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"id\": \"noMore\",\n \"title\": \"切换到没有数据\",\n \"desc\": \"提示用户当前没有数据\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"id\": \"error\",\n \"title\": \"切换到加载报错\",\n \"desc\": \"提示用户报错信息\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n }\n ],\n \"outputs\": [\n {\n \"id\": \"afterrender\",\n \"title\": \"渲染完成\"\n }\n ]\n}\n"
459
+ },
460
+ {
461
+ "path": "src/components/chart/chart-pie/data.json",
462
+ "content": "{\n \"type\": \"pie\",\n \"config\": {\n \"xField\": \"label\",\n \"yField\": \"value\",\n \"xAxis\": {},\n \"yAxis\": {},\n \"legend\": {\n \"position\": \"right\"\n },\n \"seriesField\": \"\",\n \"padding\": \"auto\",\n \"label\": false,\n \"smooth\": false\n }\n}"
463
+ },
464
+ {
465
+ "path": "src/components/chart/chart-pie/editors.tsx",
466
+ "content": "import {\n getNormalDataEditors,\n getLegendEditors,\n getChartTypeEditors,\n} from \"./../utils/editor\";\nimport { ChartType } from \"./../types\";\n\nexport default {\n \"@init\"({ style }) {\n style.height = 400;\n style.width = \"100%\";\n },\n \"@resize\": {\n options: [\"width\", \"height\"],\n },\n \":root\"({ data, output, style }, cate0, cate1, cate2) {\n cate0.title = \"常规\";\n cate0.items = [\n getChartTypeEditors({\n options: [\n {\n label: \"饼图\",\n value: ChartType.Pie,\n },\n {\n label: \"环形图\",\n value: ChartType.Circle,\n },\n ],\n }),\n {\n title: \"环形半径\",\n type: \"inputNumber\",\n ifVisible({ data }: EditorResult<Data>) {\n return data.type === ChartType.Circle;\n },\n options: [\n { min: 0, max: 1, step: 0.05, title: \"外环半径\" },\n { min: 0, max: 1, step: 0.05, title: \"内环半径\" },\n ],\n value: {\n get({ data }: EditorResult<Data>) {\n return [data.radius ?? 1, data.innerRadius ?? 0.7];\n },\n set({ data }: EditorResult<Data>, value: number[]) {\n [data.radius, data.innerRadius] = value;\n },\n },\n },\n getNormalDataEditors({}),\n getLegendEditors({}),\n {\n title: \"内容配置\",\n ifVisible({ data }: EditorResult<Data>) {\n return data.type === ChartType.Circle;\n },\n items: [\n {\n title: \"开启\",\n type: \"switch\",\n value: {\n get({ data }: EditorResult<Data>) {\n return data.guide?.open ?? false;\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n if (!data.guide) {\n data.guide = {\n title: \"总计\",\n };\n }\n data.guide.open = value;\n },\n },\n },\n // {\n // title: '标题文本',\n // type: 'text',\n // ifVisible({ data }: EditorResult<Data>) {\n // return !!data.guide?.open\n // },\n // value: {\n // get({ data }: EditorResult<Data>) {\n // return data.guide?.title;\n // },\n // set({ data, input, output }: EditorResult<Data>, value: string) {\n // data.guide.title = value\n // }\n // }\n // },\n ],\n },\n ];\n\n cate1.title = \"高级\";\n cate1.items = [\n {\n title: \"升级\",\n type: \"button\",\n value: {\n set({ data, inputs, outputs }) {\n if (output.get(\"afterrender\")) {\n return;\n }\n\n outputs.add(\"afterrender\", \"渲染完成\", { type: \"any\" });\n inputs.get(\"data\").setRels([\"afterrender\"]);\n },\n },\n },\n ];\n },\n};\n"
467
+ },
468
+ {
469
+ "path": "src/components/chart/chart-pie/icon.svg",
470
+ "content": "<?xml version=\"1.0\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg t=\"1636618022830\" class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" p-id=\"2352\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"200\" height=\"200\"><defs><style type=\"text/css\"></style></defs><path d=\"M864 518H506V160c0-4.4-3.6-8-8-8h-26c-54 0-106.4 10.6-155.7 31.4-47.6 20.1-90.4 49-127.1 85.7-36.7 36.7-65.6 79.5-85.7 127.1C82.6 445.6 72 498 72 552c0 54 10.6 106.4 31.4 155.7 20.1 47.6 49 90.4 85.7 127.1 36.7 36.7 79.5 65.6 127.1 85.7C365.6 941.4 418 952 472 952c54 0 106.4-10.6 155.7-31.4 47.6-20.1 90.4-49 127.1-85.7 36.7-36.7 65.6-79.5 85.7-127.1C861.4 658.4 872 606 872 552v-26c0-4.4-3.6-8-8-8zM705.7 787.8c-62.6 62.1-147.1 96.6-235.3 96.2-88.1-0.4-170.9-34.9-233.2-97.2C174.5 724.1 140 640.7 140 552c0-88.7 34.5-172.1 97.2-234.8 54.6-54.6 124.9-87.9 200.8-95.5V586h364.3c-7.7 76.3-41.3 147-96.6 201.8z\" p-id=\"2353\" fill=\"#555555\"></path><path d=\"M952 462.4l-2.6-28.2c-8.5-92.1-49.4-179-115.2-244.6-65.8-65.7-152.8-106.5-245.2-115L560.7 72c-4.7-0.4-8.7 3.2-8.7 7.9V464c0 4.4 3.6 8 8 8l384-1c4.7 0 8.4-4 8-8.6z m-332.2-58.2V147.6c62.6 13.1 120.7 44.2 166.4 89.8 45.7 45.6 77 103.6 90 166.1l-256.4 0.7z\" p-id=\"2354\" fill=\"#555555\"></path></svg>"
471
+ },
472
+ {
473
+ "path": "src/components/chart/chart-pie/runtime.edit.tsx",
474
+ "content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { mockPieChart } from './../utils/mock'\nimport Runtime from './runtime'\n\nexport default function ({ data, ...others }) {\n return <Runtime data={data} {...others} mockData={mockPieChart(data.type, data)} />;\n}\n\n"
475
+ },
476
+ {
477
+ "path": "src/components/chart/chart-pie/runtime.tsx",
478
+ "content": "import React, {\n useCallback,\n useEffect,\n useMemo,\n useState,\n useRef,\n} from \"react\";\nimport { ChartStatus, LoadStatus } from \"./../components/chart-status\";\nimport { useChart } from \"./../utils/chartPie\";\nimport { ChartType, isGroupChart } from \"./../types\";\nimport css from \"./style.less\";\n\nexport default function ({\n env,\n data,\n inputs,\n outputs,\n title,\n style,\n mockData = [],\n}) {\n const { chart, Canvas, events, ...props } = useChart(env);\n\n const [dataSource, setDataSource] = useState(env.edit ? mockData : []);\n const [status, setStatus] = useState(LoadStatus.IDLE);\n\n const tickit = useRef(null);\n\n const changeSize = useCallback(\n (width, height) => {\n if (!chart) {\n return;\n }\n chart.changeSize(width, height);\n },\n [chart]\n );\n\n useMemo(() => {\n inputs[\"loading\"]?.((bool) => {\n setStatus(LoadStatus.LOADING);\n });\n\n inputs[\"noMore\"]?.((bool) => {\n setStatus(LoadStatus.NOMORE);\n });\n\n inputs[\"error\"]?.((bool) => {\n setStatus(LoadStatus.ERROR);\n });\n\n inputs[\"data\"]((val, outputRels) => {\n if (Array.isArray(val)) {\n tickit.current = outputRels[\"afterrender\"];\n\n setDataSource(val);\n setStatus(LoadStatus.IDLE);\n }\n });\n }, []);\n\n useEffect(() => {\n if (!chart) {\n return;\n }\n\n chart.clear();\n\n let _data: any[] = env.edit ? mockData : dataSource;\n\n const total = _data.reduce((a, c) => a + c?.[data.config.yField], 0);\n _data = _data.map((item) => {\n return {\n ...item,\n total: total,\n };\n });\n\n chart.source(_data);\n\n chart.tooltip(false);\n\n if (data.type === ChartType.Circle) {\n chart.coord(\"polar\", {\n transposed: true,\n innerRadius: data.innerRadius ?? 0.7,\n radius: data.radius ?? 1,\n });\n } else if (data.type === ChartType.Pie) {\n chart.coord(\"polar\", {\n transposed: true,\n radius: data.radius ?? 1,\n });\n }\n\n chart.axis(false);\n\n chart\n .interval()\n .position(`total*${data.config.yField}`)\n .color(data.config.xField)\n .adjust(\"stack\")\n .style({\n lineWidth: 1,\n stroke: \"#fff\",\n lineJoin: \"round\",\n lineCap: \"round\",\n })\n .animate({\n appear: {\n duration: 1200,\n easing: \"bounceOut\",\n },\n });\n\n if (data.guide?.open && data.type === ChartType.Circle) {\n chart.pieLabel({\n sidePadding: 30,\n activeShape: true,\n lineStyle: {\n lineWidth: 0,\n },\n anchorStyle: {\n fill: \"\",\n },\n onClick(ev) {\n const itemData = ev.data;\n if (itemData) {\n // 设置 guíde,并重新渲染\n chart.guide().clear();\n\n chart.guide().text({\n position: [\"50%\", \"46%\"],\n content: itemData[data.config.xField],\n style: {\n fontSize: 13,\n textAlign: \"center\",\n fill: \"#8C8C8C\",\n },\n });\n\n chart.guide().text({\n position: [\"50%\", \"54%\"],\n content: \"\" + itemData[data.config.yField], // 类型转为字符串,避免出现数字异常\n style: {\n fontSize: 24,\n textAlign: \"center\",\n fontWeight: 500,\n fill: \"#1F1F1F\",\n },\n });\n\n chart.repaint();\n }\n },\n });\n }\n\n const legendConfig = getLegendFromData(data.config?.legend);\n if (!legendConfig) {\n chart.legend(false);\n } else {\n chart.legend(data.config.xField, legendConfig);\n }\n\n // 监听 afterrender 事件\n chart.on(\"afterrender\", () => {\n console.log(\"图表渲染完成\");\n if (typeof tickit.current === \"function\") {\n tickit.current();\n tickit.current = null;\n }\n });\n\n chart.render();\n }, [\n chart,\n dataSource,\n data.type,\n data.radius,\n data.innerRadius,\n data.config.xField,\n data.config.yField,\n data.config?.legend,\n data.guide,\n data.guide?.open,\n data.guide?.title,\n\n tickit.current,\n ]);\n\n return (\n <ChartStatus env={env} status={status} {...events} onResize={changeSize}>\n <Canvas className={css.chart_line} {...props} />\n </ChartStatus>\n );\n}\n\nfunction getColorFromData(config) {}\n\nfunction getLegendFromData(legendConfig) {\n if (!legendConfig) {\n return false;\n }\n\n let result = {};\n let posParams = {};\n\n if (legendConfig.position) {\n switch (legendConfig.position) {\n case \"top-left\":\n posParams = {\n position: \"top\",\n align: \"left\",\n };\n break;\n case \"top\":\n posParams = {\n position: \"top\",\n align: \"center\",\n };\n break;\n case \"top-right\":\n posParams = {\n position: \"top\",\n align: \"right\",\n };\n break;\n case \"bottom-left\":\n posParams = {\n position: \"bottom\",\n align: \"left\",\n };\n break;\n case \"bottom\":\n posParams = {\n position: \"bottom\",\n align: \"center\",\n };\n break;\n case \"bottom-right\":\n posParams = {\n position: \"bottom\",\n align: \"right\",\n };\n break;\n default:\n posParams = {\n position: legendConfig.position,\n };\n break;\n }\n }\n\n return { ...result, ...posParams };\n}\n"
479
+ },
480
+ {
481
+ "path": "src/components/chart/chart-pie/style.less",
482
+ "content": ".chart_line {\n width: 100%;\n height: 100%;\n}"
483
+ }
484
+ ]
485
+ },
486
+ {
487
+ "path": "src/components/chart/chart-radar",
488
+ "content": null,
489
+ "children": [
490
+ {
491
+ "path": "src/components/chart/chart-radar/com.json",
492
+ "content": "{\n \"title\": \"雷达图\",\n \"namespace\": \"mybricks.taro.chart.radar\",\n \"author\": \"mybricks-team\",\n \"author_name\": \"板砖团队\",\n \"icon\": \"./icon.svg\",\n \"version\": \"1.0.0\",\n \"description\": \"雷达图\",\n \"runtime\": \"./runtime.tsx\",\n \"runtime.edit\": \"./runtime.edit.tsx\",\n \"data\": \"./data.json\",\n \"editors\": \"./editors.tsx\",\n \"inputs\": [\n {\n \"id\": \"data\",\n \"title\": \"输入数据\",\n \"schema\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"xField\": {\n \"title\": \"x轴字段名\",\n \"type\": \"string\"\n },\n \"yField\": {\n \"title\": \"y轴字段名\",\n \"type\": \"string\"\n }\n }\n }\n }\n },\n {\n \"id\": \"loading\",\n \"title\": \"切换到加载中\",\n \"desc\": \"提示用户正在加载中\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"id\": \"noMore\",\n \"title\": \"切换到没有数据\",\n \"desc\": \"提示用户当前没有数据\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n },\n {\n \"id\": \"error\",\n \"title\": \"切换到加载报错\",\n \"desc\": \"提示用户报错信息\",\n \"schema\": {\n \"type\": \"boolean\"\n }\n }\n ],\n \"outputs\": [\n \n ]\n}"
493
+ },
494
+ {
495
+ "path": "src/components/chart/chart-radar/data.json",
496
+ "content": "{\n \"type\": \"radar\",\n \"config\": {\n \"xField\": \"label\",\n \"yField\": \"value\",\n \"xAxis\": {},\n \"yAxis\": {},\n \"legend\": {\n \"position\": \"right\"\n },\n \"seriesField\": \"\",\n \"padding\": \"auto\",\n \"label\": false\n },\n \"geo\": {\n \"line\": {\n \"show\": true,\n \"smooth\": false\n },\n \"dot\": {\n \"show\": true\n },\n \"area\": {\n \"show\": false\n }\n }\n}\n"
497
+ },
498
+ {
499
+ "path": "src/components/chart/chart-radar/editors.tsx",
500
+ "content": "import { getNormalDataEditors, getLegendEditors, getChartTypeEditors, getGeoEditors } from './../utils/editor'\nimport { ChartType } from './../types'\n\nexport default {\n \"@init\"({ style }) {\n style.height = 400;\n style.width = '100%';\n },\n \"@resize\": {\n options: [\"width\", \"height\"],\n },\n \":root\"({ data, output, style }, cate0, cate1, cate2) {\n cate0.title = \"常规\";\n cate0.items = [\n getChartTypeEditors({\n options: [\n {\n label: '雷达图',\n value: ChartType.Radar,\n },\n // {\n // label: '对比雷达图',\n // value: ChartType.RadarMuti,\n // }\n ]\n }),\n getGeoEditors({}),\n getNormalDataEditors({}),\n getLegendEditors({})\n ];\n\n cate1.title = \"样式\";\n cate1.items = [];\n\n cate2.title = \"动作\";\n cate2.items = [];\n },\n};\n"
501
+ },
502
+ {
503
+ "path": "src/components/chart/chart-radar/icon.svg",
504
+ "content": "<?xml version=\"1.0\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg class=\"icon\" width=\"200px\" height=\"200.00px\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"#555555\" d=\"M548.547685 0v1.316493a511.969648 511.969648 0 0 1 350.333516 845.920135l2.779264 2.706125-51.708934 51.708935-2.706126-2.706125A511.969648 511.969648 0 1 1 475.409164 1.316493L475.409164 0h73.138521z m96.250294 696.498136l-248.597833 81.915144-74.455015 129.089489c57.560016 27.792638 122.14133 43.298004 190.233294 43.298005 108.025596 0 206.982015-39.05597 283.411769-103.783561L644.797979 696.498136zM78.047579 445.998702a438.319157 438.319157 0 0 0 180.652147 424.349699l66.190362-114.900617L138.606275 462.235453l-60.558696-16.236751z m867.861691 0l-95.665185 25.598482-139.621437 187.307752 136.403342 136.476481a437.075802 437.075802 0 0 0 98.88328-349.382715zM517.098121 568.871417L444.837262 694.084565l148.544337-49.002809-76.210339-76.210339zM245.681069 490.905753l121.556222 191.257233 79.428434-137.427281-200.984656-53.829952z m495.220927 9.873701l-148.544337 39.860494 68.091963 68.091963 80.452374-107.952457zM548.547685 254.814607v221.902273l224.169567-60.046725L548.547685 254.814607z m-73.138521-5.558527L235.295399 412.42812l240.113765 64.28876v-227.4608z m73.138521-174.58165v97.347372l307.913174 222.194827 72.480274-19.381708a439.196819 439.196819 0 0 0-380.320309-300.160491z m-73.138521 0A439.196819 439.196819 0 0 0 95.088855 374.834921l57.194323 15.359089L475.409164 170.485893v-95.811463z\" /></svg>"
505
+ },
506
+ {
507
+ "path": "src/components/chart/chart-radar/runtime.edit.tsx",
508
+ "content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { mockLineChart } from './../utils/mock'\nimport Runtime from './runtime'\n\nexport default function ({ data, ...others }) {\n return <Runtime data={data} {...others} mockData={mockLineChart(data.config)} />;\n}\n\n"
509
+ },
510
+ {
511
+ "path": "src/components/chart/chart-radar/runtime.tsx",
512
+ "content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { ChartStatus, LoadStatus } from \"./../components/chart-status\";\nimport { useChart } from \"./../utils/chart\";\nimport { ChartType, isGroupChart } from \"./../types\";\nimport css from \"./style.less\";\n\nexport default function ({\n env,\n data,\n inputs,\n outputs,\n title,\n style,\n mockData = [],\n}) {\n const { chart, Canvas, events, ...props } = useChart(env);\n\n const [dataSource, setDataSource] = useState(env.edit ? mockData : []);\n const [status, setStatus] = useState(LoadStatus.IDLE);\n\n const changeSize = useCallback(\n (width, height) => {\n if (!chart) {\n return;\n }\n chart.changeSize(width, height);\n },\n [chart]\n );\n\n useMemo(() => {\n inputs[\"loading\"]?.((bool) => {\n setStatus(LoadStatus.LOADING);\n });\n\n inputs[\"noMore\"]?.((bool) => {\n setStatus(LoadStatus.NOMORE);\n });\n\n inputs[\"error\"]?.((bool) => {\n setStatus(LoadStatus.ERROR);\n });\n\n inputs[\"data\"]((val) => {\n if (Array.isArray(val)) {\n setDataSource(val);\n setStatus(LoadStatus.IDLE);\n }\n });\n }, []);\n\n useEffect(() => {\n if (!chart) {\n return;\n }\n\n chart.clear();\n\n chart.source(env.edit ? mockData : dataSource);\n\n chart.tooltip(false);\n chart.coord(\"polar\");\n chart.axis(data.config.yField);\n\n const color = isGroupChart(data.type) ? data.config.seriesField : false;\n\n chart\n .line()\n .position(`${data.config.xField}*${data.config.yField}`)\n .color(color)\n .shape(data?.geo?.line?.smooth ? \"smooth\" : \"line\")\n .animate({\n appear: {\n animation: \"groupWaveIn\",\n },\n });\n\n if (data.geo.dot?.show) {\n chart\n .point()\n .position(`${data.config.xField}*${data.config.yField}`)\n .color(color)\n .animate({\n appear: {\n animation: \"groupWaveIn\",\n },\n })\n .style({\n stroke: \"#fff\",\n lineWidth: 1,\n });\n }\n\n if (data.geo.area?.show) {\n chart\n .area()\n .position(`${data.config.xField}*${data.config.yField}`)\n .color(color)\n .animate({\n appear: {\n animation: \"groupWaveIn\",\n },\n });\n }\n\n const legendConfig = getLegendFromData(data.config?.legend);\n if (!legendConfig) {\n chart.legend(false);\n } else {\n chart.legend(data.config.xField, legendConfig);\n }\n\n chart.render();\n }, [\n chart,\n mockData,\n dataSource,\n data.type,\n data.config.seriesField,\n data.config.xField,\n data.config.yField,\n data.config?.legend,\n\n data.geo?.line,\n data.geo?.dot,\n data.geo?.area,\n ]);\n\n return (\n <ChartStatus env={env} status={status} {...events} onResize={changeSize}>\n <Canvas className={css.chart_line} {...props} />\n </ChartStatus>\n );\n}\n\nfunction getColorFromData(config) {}\n\nfunction getLegendFromData(legendConfig) {\n if (!legendConfig) {\n return false;\n }\n\n let result = {};\n let posParams = {};\n\n if (legendConfig.position) {\n switch (legendConfig.position) {\n case \"top-left\":\n posParams = {\n position: \"top\",\n align: \"left\",\n };\n break;\n case \"top\":\n posParams = {\n position: \"top\",\n align: \"center\",\n };\n break;\n case \"top-right\":\n posParams = {\n position: \"top\",\n align: \"right\",\n };\n break;\n case \"bottom-left\":\n posParams = {\n position: \"bottom\",\n align: \"left\",\n };\n break;\n case \"bottom\":\n posParams = {\n position: \"bottom\",\n align: \"center\",\n };\n break;\n case \"bottom-right\":\n posParams = {\n position: \"bottom\",\n align: \"right\",\n };\n break;\n default:\n posParams = {\n position: legendConfig.position,\n };\n break;\n }\n }\n\n return { ...result, ...posParams };\n}\n"
513
+ },
514
+ {
515
+ "path": "src/components/chart/chart-radar/style.less",
516
+ "content": ".chart_line {\n width: 100%;\n height: 100%;\n}"
517
+ }
518
+ ]
519
+ },
520
+ {
521
+ "path": "src/components/chart/chart-ringProgress",
522
+ "content": null,
523
+ "children": [
524
+ {
525
+ "path": "src/components/chart/chart-ringProgress/com.json",
526
+ "content": "{\n \"title\": \"环形进度图\",\n \"namespace\": \"mybricks.taro.chart.ringProgress\",\n \"author\": \"mybricks-team\",\n \"author_name\": \"板砖团队\",\n \"icon\": \"./icon.svg\",\n \"version\": \"1.0.0\",\n \"description\": \"环形进度图\",\n \"runtime\": \"./runtime.tsx\",\n \"runtime.edit\": \"./runtime.edit.tsx\",\n \"data\": \"./data.json\",\n \"editors\": \"./editors.tsx\",\n \"inputs\": [\n {\n \"id\": \"data\",\n \"title\": \"输入数据\",\n \"schema\": {\n \"type\": \"object\",\n \"properties\": {\n \"value\": {\n \"title\": \"数值\",\n \"type\": \"number\"\n },\n \"label\": {\n \"title\": \"标签\",\n \"type\": \"string\"\n },\n \"config\": {\n \"title\": \"颜色字体等配置\",\n \"type\": \"object\"\n }\n }\n }\n } \n ],\n \"outputs\": [\n \n {\n \"id\": \"afterrender\",\n \"title\": \"渲染完成\"\n }\n ]\n}"
527
+ },
528
+ {
529
+ "path": "src/components/chart/chart-ringProgress/data.json",
530
+ "content": "{\n \"type\": \"ringProgress\",\n \"config\": {\n \"color\": \"#1E90FF\",\n \"backgroundColor\": \"#eee\",\n \"size\": 100,\n \"strokeWidth\": 10,\n \"isShowLabel\" : true,\n \"isShowSubLabel\" :true,\n \"labelDistance\" : 10,\n \"labelSize\" : 14, \n \"labelColor\" :\"#eee\",\n \"subLabelSize\" :30,\n \"subLabelColor\":\"#000\",\n \"label\":\"\",\n \"subLabel\":\"\"\n },\n \"value\": 0,\n \"label\": \"进度\"\n}\n "
531
+ },
532
+ {
533
+ "path": "src/components/chart/chart-ringProgress/editors.tsx",
534
+ "content": "import { getNormalDataEditors, getLegendEditors, getChartTypeEditors, getGeoEditors } from './../utils/editor'\nimport { ChartType } from './../types'\n\nexport default {\n \"@init\"({ style }) {\n style.height = 'auto';\n style.width = 'auto';\n },\n \"@resize\": {\n options: [\"width\", \"height\"],\n },\n \":root\"({ data, output, style }, cate0, cate1, cate2) {\n cate0.title = \"常规\";\n cate0.items = [\n getChartTypeEditors({\n options: [\n {\n label: '圆形进度图',\n value: \"RingProgress\",\n },\n // {\n // label: '对比雷达图',\n // value: ChartType.RadarMuti,\n // }\n ]\n }),\n // getGeoEditors({}),\n // getNormalDataEditors({}),\n // getLegendEditors({})\n ];\n\n cate1.title = \"样式\";\n cate1.items = [];\n\n cate2.title = \"动作\";\n cate2.items = [];\n },\n};\n"
535
+ },
536
+ {
537
+ "path": "src/components/chart/chart-ringProgress/icon.svg",
538
+ "content": "<?xml version=\"1.0\" standalone=\"no\"?><!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\"><svg class=\"icon\" width=\"200px\" height=\"200.00px\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"><path fill=\"#555555\" d=\"M548.547685 0v1.316493a511.969648 511.969648 0 0 1 350.333516 845.920135l2.779264 2.706125-51.708934 51.708935-2.706126-2.706125A511.969648 511.969648 0 1 1 475.409164 1.316493L475.409164 0h73.138521z m96.250294 696.498136l-248.597833 81.915144-74.455015 129.089489c57.560016 27.792638 122.14133 43.298004 190.233294 43.298005 108.025596 0 206.982015-39.05597 283.411769-103.783561L644.797979 696.498136zM78.047579 445.998702a438.319157 438.319157 0 0 0 180.652147 424.349699l66.190362-114.900617L138.606275 462.235453l-60.558696-16.236751z m867.861691 0l-95.665185 25.598482-139.621437 187.307752 136.403342 136.476481a437.075802 437.075802 0 0 0 98.88328-349.382715zM517.098121 568.871417L444.837262 694.084565l148.544337-49.002809-76.210339-76.210339zM245.681069 490.905753l121.556222 191.257233 79.428434-137.427281-200.984656-53.829952z m495.220927 9.873701l-148.544337 39.860494 68.091963 68.091963 80.452374-107.952457zM548.547685 254.814607v221.902273l224.169567-60.046725L548.547685 254.814607z m-73.138521-5.558527L235.295399 412.42812l240.113765 64.28876v-227.4608z m73.138521-174.58165v97.347372l307.913174 222.194827 72.480274-19.381708a439.196819 439.196819 0 0 0-380.320309-300.160491z m-73.138521 0A439.196819 439.196819 0 0 0 95.088855 374.834921l57.194323 15.359089L475.409164 170.485893v-95.811463z\" /></svg>"
539
+ },
540
+ {
541
+ "path": "src/components/chart/chart-ringProgress/runtime.edit.tsx",
542
+ "content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { mockLineChart } from './../utils/mock'\nimport Runtime from './runtime'\n\nexport default function ({ data, ...others }) {\n return <Runtime data={data} {...others} mockData={mockLineChart(data.config)} />;\n}\n\n"
543
+ },
544
+ {
545
+ "path": "src/components/chart/chart-ringProgress/runtime.tsx",
546
+ "content": "import React, { useCallback, useEffect, useMemo, useState, useRef } from \"react\";\nimport * as Taro from '@tarojs/taro';\nimport { createSelectorQuery } from '@tarojs/taro'\nimport { View } from '@tarojs/components';\nimport RingProgress from \"./../components/ring-progress\";\nimport { useChart } from \"./../utils/chart\";\nimport { ChartType, isGroupChart } from './../types'\nimport { Base64 } from 'js-base64'\nimport css from \"./style.less\";\nconst isWeapp = (Taro.getEnv() === Taro.ENV_TYPE.WEAPP || Taro.getEnv() === 'weapp2');\n// 判断是否为小程序环境 最新小程序类型 是 weapp2\nexport default function ({\n env,\n data,\n inputs,\n outputs,\n title,\n style,\n mockData = [],\n logger\n}) {\n const [value, setValue] = useState(data.value)\n const [label, setLabel] = useState(data.label)\n const [config, setConfig] = useState<any>(data.config)\n inputs[\"data\"]((val) => {\n\n logger.info(\"🚀 ~ inputs['data'] ~ val:\", val)\n const { value, label, config } = val\n setValue(value)\n setLabel(label)\n setConfig(config)\n });\n\n return (\n // 自定义样式\n <RingProgress\n percent={value}\n size={config.size}\n strokeWidth={config.strokeWidth}\n color={config.color}\n backgroundColor={config.backgroundColor}\n isShowLabel={config.isShowLabel}\n isShowSubLabel={config.isShowSubLabel}\n labelDistance={config.labelDistance}\n labelSize={config.labelSize}\n labelColor={config.labelColor}\n subLabelSize={config.subLabelSize}\n subLabelColor={config.subLabelColor}\n label={config.label}\n subLabel={config.subLabel}\n canvasContainerBorder={config.canvasContainerBorder}\n canvasBorder={config.canvasBorder}\n // {...config}\n >\n {/* <View>{value}</View>\n <View>{label}</View> */}\n </RingProgress>\n );\n}\n"
547
+ },
548
+ {
549
+ "path": "src/components/chart/chart-ringProgress/style.less",
550
+ "content": ".chart_line {\n width: 100%;\n height: 100%;\n}"
551
+ }
552
+ ]
553
+ },
554
+ {
555
+ "path": "src/components/chart/components",
556
+ "content": null,
557
+ "children": [
558
+ {
559
+ "path": "src/components/chart/components/chart-status",
560
+ "content": null,
561
+ "children": [
562
+ {
563
+ "path": "src/components/chart/components/chart-status/index.less",
564
+ "content": ".chart_wrap {\n width: 100%;\n height: 100%;\n position: relative !important;\n}\n\n.chart_wrap_empty {\n position: absolute;\n top: 0px;\n left: 0px;\n right: 0px;\n bottom: 0px;\n color: #eee;\n}\n\n.chart_wrap_loading {\n position: absolute;\n top: 0px;\n left: 0px;\n right: 0px;\n bottom: 0px;\n color: #eee;\n}"
565
+ },
566
+ {
567
+ "path": "src/components/chart/components/chart-status/index.tsx",
568
+ "content": "import React, { useEffect, useRef } from \"react\";\nimport { View } from \"@tarojs/components\";\nimport css from \"./index.less\";\n\nconst Empty = () => {\n return <View className={css.chart_wrap_empty}>暂无数据</View>;\n};\n\nconst Loading = () => {\n return <View className={css.chart_wrap_loading}>加载中</View>;\n};\n\nexport const ChartStatus = ({\n env,\n className,\n children,\n status = LoadStatus.IDLE,\n onResize,\n ...props\n}: {\n className?;\n children?;\n status?;\n onResize?: (width: number, height: number) => void;\n [keyname: string]: any;\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n\n // 监听容器尺寸变化\n let resizeTimer: any;\n useEffect(() => {\n if (!containerRef.current || !env.edit) return;\n\n // 使用 ResizeObserver 监听尺寸变化\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { width, height } = entry.contentRect;\n // 防抖处理\n clearTimeout(resizeTimer);\n resizeTimer = setTimeout(() => {\n onResize?.(width, height);\n }, 200);\n }\n });\n\n resizeObserver.observe(containerRef.current);\n\n // 组件卸载时清理\n return () => {\n resizeObserver.disconnect();\n };\n }, [onResize]);\n\n return (\n <View\n ref={containerRef}\n className={`${css.chart_wrap} ${className}`}\n {...props}\n >\n {status === LoadStatus.LOADING && <Loading />}\n {status === LoadStatus.NOMORE && <Empty />}\n {children}\n </View>\n );\n};\n\nexport enum LoadStatus {\n IDLE = \"idle\",\n LOADING = \"loading\",\n ERROR = \"error\",\n NOMORE = \"noMore\",\n}\n\nexport default ChartStatus;\n"
569
+ }
570
+ ]
571
+ },
572
+ {
573
+ "path": "src/components/chart/components/ring-progress",
574
+ "content": null,
575
+ "children": [
576
+ {
577
+ "path": "src/components/chart/components/ring-progress/index.tsx",
578
+ "content": "import React, { useEffect, useRef } from 'react';\nimport * as Taro from '@tarojs/taro';\nimport { View, Canvas } from '@tarojs/components';\nimport { RingProgressProps } from './types';\nimport './style.less';\nfunction uuid(pre = \"c_\", len = 6) {\n const seed = \"abcdefhijkmnprstwxyz0123456789\",\n maxPos = seed.length;\n let rtn = \"\";\n for (let i = 0; i < len; i++) {\n rtn += seed.charAt(Math.floor(Math.random() * maxPos));\n }\n return pre + rtn;\n}\nfunction isDesigner(env): Boolean {\n if (env?.edit || env?.runtime?.debug) {\n return true;\n } else {\n return false;\n }\n}\nfunction createWebCanvas(canvasRef: any, size: number,\n strokeWidth: number, percent: number, color: string,\n backgroundColor: string, isShowLabel: boolean, labelSize: number,\n labelColor: string, label: string, isShowSubLabel: boolean,\n subLabelSize: number, subLabelColor: string, subLabel: string, labelDistance: number) {\n // const canvas:any = document.getElementById(\"#\"+canvasId);\n console.log(\"🚀 ~ createWebCanvas ~ canvasRef:\", canvasRef)\n const canvas = canvasRef.current;\n // const canvas = document.getElementById(canvasId) as HTMLCanvasElement;\n const pixelRatio = window.devicePixelRatio\n console.log(\"🚀 ~ createWebCanvas ~ pixelRatio:\", pixelRatio,canvas)\n canvas.width = size * pixelRatio;\n canvas.height = size * pixelRatio;\n const ctx = canvas.getContext('2d');\n // 计算中心点和半径\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n const radius = (canvas.width - strokeWidth) / 2;\n\n // 清除画布\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // 绘制背景圆环\n ctx.beginPath();\n ctx.arc(centerX, centerY, radius, 0, Math.PI * 2);\n ctx.strokeStyle = backgroundColor;\n ctx.lineWidth = strokeWidth;\n ctx.stroke();\n\n // 绘制进度圆环\n const startAngle = -Math.PI / 2;\n const endAngle = startAngle + (Math.PI * 2 * percent) / 100;\n\n ctx.beginPath();\n ctx.arc(centerX, centerY, radius, startAngle, endAngle);\n ctx.strokeStyle = color;\n ctx.lineWidth = strokeWidth;\n ctx.lineCap = 'round';\n ctx.stroke();\n\n\n // 绘制文字\n if (isShowLabel) {\n ctx.beginPath();\n ctx.font = `${labelSize}px`;\n ctx.fillStyle = labelColor;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(`${label}`, centerX, centerY);\n ctx.stroke();\n }\n if (isShowSubLabel) {\n ctx.beginPath();\n ctx.font = `${subLabelSize}px`;\n ctx.fillStyle = subLabelColor;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(`${subLabel}`, centerX, centerY + labelDistance);\n ctx.stroke();\n }\n\n}\nfunction createTaroCanvas(canvasId: string, size: number,\n strokeWidth: number, percent: number, color: string,\n backgroundColor: string, isShowLabel: boolean, labelSize: number,\n labelColor: string, label: string, isShowSubLabel: boolean,\n subLabelSize: number, subLabelColor: string, subLabel: string, labelDistance: number) {\n const query = Taro.createSelectorQuery();\n query.select('.mybricks_com >>> .' + canvasId)\n .fields({ node: true, size: true })\n .exec((res) => {\n const canvas = res[0].node;\n const ctx = canvas.getContext('2d');\n\n\n // 设置canvas尺寸\n\n console.log(\"🚀 ~ .exec ~ pixelRatio:\", pixelRatio, canvas)\n canvas.width = size * pixelRatio;\n canvas.height = size * pixelRatio;\n // canvas.width = size;\n // canvas.height = size;\n\n // 计算中心点和半径\n const centerX = canvas.width / 2;\n const centerY = canvas.height / 2;\n const radius = (canvas.width - strokeWidth) / 2;\n\n // 清除画布\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n // 绘制背景圆环\n ctx.beginPath();\n ctx.arc(centerX, centerY, radius, 0, Math.PI * 2);\n ctx.strokeStyle = backgroundColor;\n ctx.lineWidth = strokeWidth;\n ctx.stroke();\n\n // 绘制进度圆环\n const startAngle = -Math.PI / 2;\n const endAngle = startAngle + (Math.PI * 2 * percent) / 100;\n\n ctx.beginPath();\n ctx.arc(centerX, centerY, radius, startAngle, endAngle);\n ctx.strokeStyle = color;\n ctx.lineWidth = strokeWidth;\n ctx.lineCap = 'round';\n ctx.stroke();\n\n\n // 绘制文字\n if (isShowLabel) {\n ctx.beginPath();\n ctx.font = `${labelSize}px`;\n ctx.fillStyle = labelColor;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(`${label}`, centerX, centerY);\n ctx.stroke();\n }\n if (isShowSubLabel) {\n ctx.beginPath();\n ctx.font = `${subLabelSize}px`;\n ctx.fillStyle = subLabelColor;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(`${subLabel}`, centerX, centerY + labelDistance);\n ctx.stroke();\n }\n });\n}\nconst isWeapp = (Taro.getEnv() === Taro.ENV_TYPE.WEAPP || Taro.getEnv() === 'weapp2');\n\nconst pixelRatio = Taro.getSystemInfoSync().pixelRatio;\nconst RingProgress: React.FC<RingProgressProps> = ({\n isShowLabel = true,\n isShowSubLabel = true,\n labelDistance = 10,\n labelSize = 14,\n labelColor = '#eee',\n subLabelSize = 30,\n subLabelColor = '#000',\n label = \"\",\n subLabel = \"\",\n percent = 0,\n size = 120,\n strokeWidth = 8,\n color = '#1890ff',\n backgroundColor = '#f5f5f5',\n canvasBorder='',\n canvasContainerBorder='',\n children\n}) => {\n // const pixelRatioSize = size * pixelRatio;\n const canvasRef: any = useRef<HTMLElement>(null);\n const canvasId = uuid('ring-progress-canvas', 6)\n useEffect(() => {\n if (!isWeapp) {\n createWebCanvas(canvasRef, size, strokeWidth, percent, color, backgroundColor, isShowLabel, labelSize, labelColor, label, isShowSubLabel, subLabelSize, subLabelColor, subLabel, labelDistance);\n } else {\n createTaroCanvas(canvasId, size, strokeWidth, percent, color, backgroundColor, isShowLabel, labelSize, labelColor, label, isShowSubLabel, subLabelSize, subLabelColor, subLabel, labelDistance);\n }\n\n\n }, [percent, size, strokeWidth, color, backgroundColor]);\n\n return (\n <View className=\"ring-progress\" \n style={{ width: '100%', height: '100%',\n display: 'flex', justifyContent: 'center', alignItems: 'center',\n border:canvasContainerBorder }}>\n {isWeapp ?\n\n (<Canvas\n type=\"2d\"\n id={canvasId}\n canvasId={canvasId}\n className={`ring-progress-canvas ${canvasId}`}\n style={{ width: `${size}px`, height: `${size}px`,border:canvasBorder }}\n />) :\n (<canvas ref={canvasRef} id={canvasId} \n width={size} height={size}\n style={{border:canvasBorder}} />\n // { width: `${size}px`, height: `${size}px` }\n\n )}\n\n\n {/* {children && <View className=\"ring-progress-content\">{children}</View>} */}\n </View>\n );\n};\n\nexport default RingProgress;"
579
+ },
580
+ {
581
+ "path": "src/components/chart/components/ring-progress/README.md",
582
+ "content": "环形进度条"
583
+ },
584
+ {
585
+ "path": "src/components/chart/components/ring-progress/style.less",
586
+ "content": ".ring-progress {\n position: relative;\n display: inline-block;\n\n &-canvas {\n display: block;\n }\n\n &-content {\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n text-align: center;\n }\n}"
587
+ },
588
+ {
589
+ "path": "src/components/chart/components/ring-progress/types.ts",
590
+ "content": "export interface RingProgressProps {\n isShowLabel?: boolean;// 是否显示文字说明\n isShowSubLabel?: boolean;// 是否显示百分比\n labelDistance?: number; // 文字说明距离圆心的距离\n labelSize?: number; // 文字说明大小\n labelColor?: string; // 文字说明颜色\n subLabelSize?: number; // 百分比大小\n subLabelColor?: string; // 百分比颜色\n canvasContainerBorder?: string; // 画布容器边框\n canvasBorder?: string; // 画布边框\n /**\n * 进度百分比,范围 0-100\n */\n percent?: number;\n /**文字说明 */\n label?: string; \n subLabel?: string; \n /**\n * 环形进度条的尺寸\n */\n size?: number;\n /**\n * 环形进度条的宽度\n */\n strokeWidth?: number;\n /**\n * 进度条颜色\n */\n color?: string;\n /**\n * 背景色\n */\n backgroundColor?: string;\n /**\n * 自定义内容\n */\n children?: React.ReactNode;\n} "
591
+ }
592
+ ]
593
+ }
594
+ ]
595
+ },
596
+ {
597
+ "path": "src/components/chart/types",
598
+ "content": null,
599
+ "children": [
600
+ {
601
+ "path": "src/components/chart/types/index.ts",
602
+ "content": "export enum ColumnChartType {\n Column = 'column',\n ColumnStack = 'column-stack',\n ColumnGroup = 'column-group'\n}\n\nexport enum LineChartType {\n Line = 'line',\n LineMuti = 'line-muti',\n}\n\nexport enum PieChartType {\n Pie = 'pie',\n /** 环形图 */\n Circle = 'circle'\n}\n\nexport enum RadarChartType {\n Radar = 'radar',\n RadarMuti = 'radar-muti'\n}\n\ntype _ChartType = LineChartType | ColumnChartType | PieChartType | RadarChartType\n\nexport const ChartType = { ...ColumnChartType, ...LineChartType, ...PieChartType, ...RadarChartType }\n\nexport const isGroupChart = (type: _ChartType) => {\n return [ChartType.ColumnGroup, ChartType.ColumnStack, ChartType.LineMuti].includes(type)\n}"
603
+ }
604
+ ]
605
+ },
606
+ {
607
+ "path": "src/components/chart/utils",
608
+ "content": null,
609
+ "children": [
610
+ {
611
+ "path": "src/components/chart/utils/chart",
612
+ "content": null,
613
+ "children": [
614
+ {
615
+ "path": "src/components/chart/utils/chart/config.ts",
616
+ "content": "import { isGroupChart } from './../../types'\n\n/**\n * @description 获取真实的图表配置\n */\nexport function getChartConfigFromData(data) {\n return {\n legend: getLegendFromData(data.config.legend, {\n field: isGroupChart(data.type) ? data.config.seriesField : data.config.xField,\n })\n }\n}\n\nfunction getLegendFromData (legendConfig, { field }) {\n if (!legendConfig) {\n return [false];\n }\n\n let result = {}\n let posParams = {};\n\n if (legendConfig.position) {\n switch (legendConfig.position) {\n case \"top-left\":\n posParams = {\n position: \"top\",\n align: \"left\",\n };\n break;\n case \"top\":\n posParams = {\n position: \"top\",\n align: \"center\",\n };\n break;\n case \"top-right\":\n posParams = {\n position: \"top\",\n align: \"right\",\n };\n break;\n case \"bottom-left\":\n posParams = {\n position: \"bottom\",\n align: \"left\",\n };\n break;\n case \"bottom\":\n posParams = {\n position: \"bottom\",\n align: \"center\",\n };\n break;\n case \"bottom-right\":\n posParams = {\n position: \"bottom\",\n align: \"right\",\n };\n break;\n default:\n posParams = {\n position: legendConfig.position\n }\n break;\n }\n }\n\n return [field, { ...result, ...posParams }]\n}\n"
617
+ },
618
+ {
619
+ "path": "src/components/chart/utils/chart/index.tsx",
620
+ "content": "import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport { Canvas as TaroCanvas } from \"@tarojs/components\";\nimport * as Taro from \"@tarojs/taro\";\nimport F2 from \"@antv/f2\";\nimport ScrollBar from \"@antv/f2/lib/plugin/scroll-bar\";\nimport Pan from \"@antv/f2/lib/interaction/pan\";\nimport PieLabel from \"@antv/f2/lib/plugin/pie-label\";\n\nF2.Chart.registerInteraction(\"pan\", Pan);\n\nexport * from \"./config\";\n\nconst getCanvasInTaro = async (id) => {\n return new Promise((resolve, reject) => {\n Taro.createSelectorQuery()\n .select(`#${id}`)\n .fields({\n node: true,\n size: true,\n })\n .exec((res) => {\n const { width, height } = res[0];\n const canvas = res[0].node;\n\n const pixelRatio = Taro.getSystemInfoSync().pixelRatio;\n\n canvas.width = width * pixelRatio;\n canvas.height = height * pixelRatio;\n resolve({\n context: canvas.getContext(\"2d\"),\n pixelRatio,\n width,\n height,\n });\n });\n });\n};\n\nconst getCanvasInDesn = async (el: HTMLElement) => {\n const { width, height } = el.getBoundingClientRect();\n return Promise.resolve({\n el,\n width: width,\n height: height,\n pixelRatio: 2,\n });\n};\n\nexport const useChart = (env) => {\n const chartEl = useRef<HTMLElement>(null);\n\n const canvasEl = useRef(null);\n const [chart, setChart] = useState<any>(null);\n\n const chartId = useRef(uuid());\n\n useEffect(() => {\n let _chart = {\n ref: {},\n };\n\n (async () => {\n const options = await (isDesigner(env)\n ? getCanvasInDesn(chartEl.current)\n : getCanvasInTaro(chartId.current));\n _chart.ref = new F2.Chart({\n ...options,\n plugins: [ScrollBar, PieLabel],\n });\n\n if (!_chart.ref) {\n return;\n }\n\n canvasEl.current = _chart.ref.get(\"el\");\n setChart(_chart.ref);\n })();\n\n return () => {\n _chart.ref?.destroy?.();\n };\n }, []);\n\n const Canvas = useCallback((props) => {\n if (isDesigner(env)) {\n return <canvas ref={chartEl} {...props} />;\n }\n return <TaroCanvas {...props} />;\n }, []);\n\n const handleEvent = useCallback((type) => {\n return isDesigner(env)\n ? (e) => {}\n : (e) => canvasEl.current?.dispatchEvent(type, wrapEvent(e));\n }, []);\n\n const events = useMemo(() => {\n return {\n onClick: handleEvent(\"click\"),\n onTouchStart: handleEvent(\"touchstart\"),\n onTouchMove: handleEvent(\"touchmove\"),\n onTouchEnd: handleEvent(\"touchend\"),\n };\n }, []);\n\n return {\n chart,\n id: chartId.current,\n type: \"2d\",\n Canvas,\n events,\n };\n};\n\nfunction wrapEvent(e: any) {\n if (!e) return;\n if (!e.preventDefault) {\n e.preventDefault = function () {};\n }\n return e;\n}\n\nfunction uuid(pre = \"c_\", len = 6) {\n const seed = \"abcdefhijkmnprstwxyz0123456789\",\n maxPos = seed.length;\n let rtn = \"\";\n for (let i = 0; i < len; i++) {\n rtn += seed.charAt(Math.floor(Math.random() * maxPos));\n }\n return pre + rtn;\n}\n\nfunction isDesigner(env): Boolean {\n if (env?.edit || env?.runtime?.debug) {\n return true;\n } else {\n return false;\n }\n}\n"
621
+ }
622
+ ]
623
+ },
624
+ {
625
+ "path": "src/components/chart/utils/chartLine",
626
+ "content": null,
627
+ "children": [
628
+ {
629
+ "path": "src/components/chart/utils/chartLine/config.ts",
630
+ "content": "import { isGroupChart } from './../../types'\n\n/**\n * @description 获取真实的图表配置\n */\nexport function getChartConfigFromData(data) {\n return {\n legend: getLegendFromData(data.config.legend, {\n field: isGroupChart(data.type) ? data.config.seriesField : data.config.xField,\n })\n }\n}\n\nfunction getLegendFromData (legendConfig, { field }) {\n if (!legendConfig) {\n return [false];\n }\n\n let result = {}\n let posParams = {};\n\n if (legendConfig.position) {\n switch (legendConfig.position) {\n case \"top-left\":\n posParams = {\n position: \"top\",\n align: \"left\",\n };\n break;\n case \"top\":\n posParams = {\n position: \"top\",\n align: \"center\",\n };\n break;\n case \"top-right\":\n posParams = {\n position: \"top\",\n align: \"right\",\n };\n break;\n case \"bottom-left\":\n posParams = {\n position: \"bottom\",\n align: \"left\",\n };\n break;\n case \"bottom\":\n posParams = {\n position: \"bottom\",\n align: \"center\",\n };\n break;\n case \"bottom-right\":\n posParams = {\n position: \"bottom\",\n align: \"right\",\n };\n break;\n default:\n posParams = {\n position: legendConfig.position\n }\n break;\n }\n }\n\n return [field, { ...result, ...posParams }]\n}\n"
631
+ },
632
+ {
633
+ "path": "src/components/chart/utils/chartLine/index.tsx",
634
+ "content": "import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport { Canvas as TaroCanvas } from \"@tarojs/components\";\nimport * as Taro from \"@tarojs/taro\";\nimport F2 from \"@antv/f2\";\nimport ScrollBar from \"@antv/f2/lib/plugin/scroll-bar\";\nimport Pan from \"@antv/f2/lib/interaction/pan\";\n\nF2.Chart.registerInteraction(\"pan\", Pan);\n\nexport * from \"./config\";\n\nconst getCanvasInTaro = async (id) => {\n return new Promise((resolve, reject) => {\n Taro.createSelectorQuery()\n .select(`#${id}`)\n .fields({\n node: true,\n size: true,\n })\n .exec((res) => {\n const { width, height } = res[0];\n const canvas = res[0].node;\n\n const pixelRatio = Taro.getSystemInfoSync().pixelRatio;\n\n canvas.width = width * pixelRatio;\n canvas.height = height * pixelRatio;\n resolve({\n context: canvas.getContext(\"2d\"),\n pixelRatio,\n width,\n height,\n });\n });\n });\n};\n\nconst getCanvasInDesn = async (el: HTMLElement) => {\n const { width, height } = el.getBoundingClientRect();\n return Promise.resolve({\n el,\n width: width,\n height: height,\n pixelRatio: 2,\n });\n};\n\nexport const useChart = (env) => {\n const chartEl = useRef<HTMLElement>(null);\n\n const canvasEl = useRef(null);\n const [chart, setChart] = useState<any>(null);\n\n const chartId = useRef(uuid());\n\n useEffect(() => {\n let _chart = {\n ref: {},\n };\n\n (async () => {\n const options = await (isDesigner(env)\n ? getCanvasInDesn(chartEl.current)\n : getCanvasInTaro(chartId.current));\n _chart.ref = new F2.Chart({\n ...options,\n plugins: [ScrollBar],\n });\n\n if (!_chart.ref) {\n return;\n }\n\n canvasEl.current = _chart.ref.get(\"el\");\n setChart(_chart.ref);\n })();\n\n return () => {\n _chart.ref?.destroy?.();\n };\n }, []);\n\n const Canvas = useCallback((props) => {\n if (isDesigner(env)) {\n return <canvas ref={chartEl} {...props} />;\n }\n return <TaroCanvas {...props} />;\n }, []);\n\n const handleEvent = useCallback((type) => {\n return isDesigner(env)\n ? (e) => {}\n : (e) => canvasEl.current?.dispatchEvent(type, wrapEvent(e));\n }, []);\n\n const events = useMemo(() => {\n return {\n onClick: handleEvent(\"click\"),\n onTouchStart: handleEvent(\"touchstart\"),\n onTouchMove: handleEvent(\"touchmove\"),\n onTouchEnd: handleEvent(\"touchend\"),\n };\n }, []);\n\n return {\n chart,\n id: chartId.current,\n type: \"2d\",\n Canvas,\n events,\n };\n};\n\nfunction wrapEvent(e: any) {\n if (!e) return;\n if (!e.preventDefault) {\n e.preventDefault = function () {};\n }\n return e;\n}\n\nfunction uuid(pre = \"c_\", len = 6) {\n const seed = \"abcdefhijkmnprstwxyz0123456789\",\n maxPos = seed.length;\n let rtn = \"\";\n for (let i = 0; i < len; i++) {\n rtn += seed.charAt(Math.floor(Math.random() * maxPos));\n }\n return pre + rtn;\n}\n\nfunction isDesigner(env): Boolean {\n if (env?.edit || env?.runtime?.debug) {\n return true;\n } else {\n return false;\n }\n}\n"
635
+ }
636
+ ]
637
+ },
638
+ {
639
+ "path": "src/components/chart/utils/chartPie",
640
+ "content": null,
641
+ "children": [
642
+ {
643
+ "path": "src/components/chart/utils/chartPie/config.ts",
644
+ "content": "import { isGroupChart } from './../../types'\n\n/**\n * @description 获取真实的图表配置\n */\nexport function getChartConfigFromData(data) {\n return {\n legend: getLegendFromData(data.config.legend, {\n field: isGroupChart(data.type) ? data.config.seriesField : data.config.xField,\n })\n }\n}\n\nfunction getLegendFromData (legendConfig, { field }) {\n if (!legendConfig) {\n return [false];\n }\n\n let result = {}\n let posParams = {};\n\n if (legendConfig.position) {\n switch (legendConfig.position) {\n case \"top-left\":\n posParams = {\n position: \"top\",\n align: \"left\",\n };\n break;\n case \"top\":\n posParams = {\n position: \"top\",\n align: \"center\",\n };\n break;\n case \"top-right\":\n posParams = {\n position: \"top\",\n align: \"right\",\n };\n break;\n case \"bottom-left\":\n posParams = {\n position: \"bottom\",\n align: \"left\",\n };\n break;\n case \"bottom\":\n posParams = {\n position: \"bottom\",\n align: \"center\",\n };\n break;\n case \"bottom-right\":\n posParams = {\n position: \"bottom\",\n align: \"right\",\n };\n break;\n default:\n posParams = {\n position: legendConfig.position\n }\n break;\n }\n }\n\n return [field, { ...result, ...posParams }]\n}\n"
645
+ },
646
+ {
647
+ "path": "src/components/chart/utils/chartPie/index.tsx",
648
+ "content": "import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport { Canvas as TaroCanvas } from \"@tarojs/components\";\nimport * as Taro from \"@tarojs/taro\";\nimport F2 from \"@antv/f2\";\nimport PieLabel from \"@antv/f2/lib/plugin/pie-label\";\n\nexport * from \"./config\";\n\nconst getCanvasInTaro = async (id) => {\n return new Promise((resolve, reject) => {\n Taro.createSelectorQuery()\n .select(`#${id}`)\n .fields({\n node: true,\n size: true,\n })\n .exec((res) => {\n const { width, height } = res[0];\n const canvas = res[0].node;\n\n const pixelRatio = Taro.getSystemInfoSync().pixelRatio;\n\n canvas.width = width * pixelRatio;\n canvas.height = height * pixelRatio;\n resolve({\n context: canvas.getContext(\"2d\"),\n pixelRatio,\n width,\n height,\n });\n });\n });\n};\n\nconst getCanvasInDesn = async (el: HTMLElement) => {\n const { width, height } = el.getBoundingClientRect();\n return Promise.resolve({\n el,\n width: width,\n height: height,\n pixelRatio: 2,\n });\n};\n\nexport const useChart = (env) => {\n const chartEl = useRef<HTMLElement>(null);\n\n const canvasEl = useRef(null);\n const [chart, setChart] = useState<any>(null);\n\n const chartId = useRef(uuid());\n\n useEffect(() => {\n let _chart = {\n ref: {},\n };\n\n (async () => {\n const options = await (isDesigner(env)\n ? getCanvasInDesn(chartEl.current)\n : getCanvasInTaro(chartId.current));\n _chart.ref = new F2.Chart({\n ...options,\n plugins: [PieLabel],\n });\n\n if (!_chart.ref) {\n return;\n }\n\n canvasEl.current = _chart.ref.get(\"el\");\n setChart(_chart.ref);\n })();\n\n return () => {\n _chart.ref?.destroy?.();\n };\n }, []);\n\n const Canvas = useCallback((props) => {\n if (isDesigner(env)) {\n return <canvas ref={chartEl} {...props} />;\n }\n return <TaroCanvas {...props} />;\n }, []);\n\n const handleEvent = useCallback((type) => {\n return isDesigner(env)\n ? (e) => {}\n : (e) => canvasEl.current?.dispatchEvent(type, wrapEvent(e));\n }, []);\n\n const events = useMemo(() => {\n return {\n onClick: handleEvent(\"click\"),\n onTouchStart: handleEvent(\"touchstart\"),\n onTouchMove: handleEvent(\"touchmove\"),\n onTouchEnd: handleEvent(\"touchend\"),\n };\n }, []);\n\n return {\n chart,\n id: chartId.current,\n type: \"2d\",\n Canvas,\n events,\n };\n};\n\nfunction wrapEvent(e: any) {\n if (!e) return;\n if (!e.preventDefault) {\n e.preventDefault = function () {};\n }\n return e;\n}\n\nfunction uuid(pre = \"c_\", len = 6) {\n const seed = \"abcdefhijkmnprstwxyz0123456789\",\n maxPos = seed.length;\n let rtn = \"\";\n for (let i = 0; i < len; i++) {\n rtn += seed.charAt(Math.floor(Math.random() * maxPos));\n }\n return pre + rtn;\n}\n\nfunction isDesigner(env): Boolean {\n if (env?.edit || env?.runtime?.debug) {\n return true;\n } else {\n return false;\n }\n}\n"
649
+ }
650
+ ]
651
+ },
652
+ {
653
+ "path": "src/components/chart/utils/editor",
654
+ "content": null,
655
+ "children": [
656
+ {
657
+ "path": "src/components/chart/utils/editor/index.ts",
658
+ "content": "import { ChartType, isGroupChart } from \"./../../types\";\n\nexport const getChartTypeEditors = ({ options }) => {\n return {\n title: \"类型\",\n type: \"Select\",\n options: options,\n value: {\n get({ data }: EditorResult<Data>) {\n return data.type;\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n if (isGroupChart(value as any)) {\n if (!data.config?.seriesField) {\n data.config.seriesField = \"type\";\n }\n }\n\n data.type = value;\n\n // if (value === 'step') {\n // data.config = {\n // ...data.config,\n // stepType: 'vh',\n // seriesField: ''\n // };\n // } else if (value === 'more') {\n // data.config = {\n // ...data.config,\n // stepType: '',\n // seriesField: data.config.seriesField || 'category'\n // };\n // } else {\n // data.config = {\n // ...data.config,\n // stepType: '',\n // seriesField: ''\n // };\n // }\n // setSchema(data, input, output);\n },\n },\n };\n};\n\nexport const getNormalDataEditors = (config) => {\n return {\n title: \"数据映射\",\n items: [\n {\n title: \"x横轴字段名\",\n type: \"Text\",\n description: \"横轴映射对应的数据字段名\",\n value: {\n get({ data }: EditorResult<Data>) {\n return data.config.xField || \"label\";\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n data.config.xField = value;\n // setSchema(data, input, output);\n },\n },\n },\n {\n ifVisible({ data }) {\n return [\n ChartType.Column,\n ChartType.ColumnStack,\n ChartType.ColumnGroup,\n ChartType.Line,\n ChartType.LineMuti,\n ].includes(data.type);\n },\n title: \"x轴刻度线的条数\",\n description: \"0显示全部\",\n type: \"text\",\n options: {\n type: \"number\",\n },\n value: {\n get({ data }) {\n return data.config.xFieldTickCount || 0;\n },\n set({ data }, value) {\n data.config.xFieldTickCount = value;\n },\n },\n },\n {\n ifVisible({ data }) {\n return config.xFieldScrollable;\n },\n title: \"x横轴支持平移\",\n type: \"Switch\",\n value: {\n get({ data }) {\n return data.config.xFieldScrollable;\n },\n set({ data }, value) {\n data.config.xFieldScrollable = value;\n },\n },\n },\n {\n ifVisible({ data }) {\n return data.config.xFieldScrollable;\n },\n title: \"每屏展示个数\",\n type: \"text\",\n options: {\n type: \"number\",\n },\n value: {\n get({ data }) {\n return data.config.xFieldCount;\n },\n set({ data }, value) {\n data.config.xFieldCount = value;\n },\n },\n },\n {\n ifVisible({ data }) {\n return config.xFieldRotate;\n },\n title: \"x轴顺时针旋转角度\",\n type: \"radio\",\n options: [\n { label: \"不旋转\", value: 0 },\n { label: \"45度\", value: 4 },\n { label: \"90度\", value: 2 },\n ],\n value: {\n get({ data }) {\n return data.config.xFieldRotate || 0;\n },\n set({ data }, value) {\n data.config.xFieldRotate = value;\n },\n },\n },\n {\n title: \"y纵轴字段名\",\n type: \"Text\",\n description: \"纵轴映射对应的数据字段名\",\n value: {\n get({ data }: EditorResult<Data>) {\n return data.config.yField || \"value\";\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n data.config.yField = value;\n // setSchema(data, input, output);\n },\n },\n },\n {\n ifVisible({ data }) {\n return config.yFieldDisplay;\n },\n title: \"Y 轴显示字段名\",\n type: \"switch\",\n value: {\n get({ data }) {\n return data.config.yFieldDisplay;\n },\n set({ data }, value) {\n data.config.yFieldDisplay = value;\n },\n },\n },\n {\n title: \"分组字段名\",\n type: \"Text\",\n description: \"聚合维度对应的数据字段名\",\n ifVisible({ data }) {\n return [\n ChartType.ColumnGroup,\n ChartType.ColumnStack,\n ChartType.LineMuti,\n ].includes(data.type);\n },\n value: {\n get({ data }: EditorResult<Data>) {\n return data.config.seriesField || \"type\";\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n data.config.seriesField = value;\n // setSchema(data, input, output);\n },\n },\n },\n ],\n };\n};\n\nexport const getLegendEditors = ({}) => {\n return {\n title: \"图例\",\n // ifVisible({ data }: EditorResult<Data>) {\n // console.log(data.type)\n // return [ChartType.Column, ChartType.ColumnStack, ChartType.ColumnGroup, ChartType.LineMuti].includes(data.type);\n // },\n items: [\n {\n title: \"图例\",\n type: \"Switch\",\n value: {\n get({ data }: EditorResult<Data>) {\n if (typeof data.config.legend === \"boolean\") {\n return data.config.legend;\n } else {\n return true;\n }\n },\n set({ data }: EditorResult<Data>, value: boolean) {\n if (!value) {\n data.config.legend = false;\n } else {\n data.config.legend = { position: \"right\" };\n }\n },\n },\n },\n // {\n // title: '单击图例复制名称',\n // type: 'Switch',\n // ifVisible({ data }: EditorResult<Data>) {\n // return !!data.config.legend;\n // },\n // value: {\n // get({ data }: EditorResult<Data>) {\n // return data.copyLegendTextOnClick;\n // },\n // set({ data }: EditorResult<Data>, value: boolean) {\n // data.copyLegendTextOnClick = value;\n // }\n // }\n // },\n {\n title: \"位置\",\n type: \"Select\",\n ifVisible({ data }: EditorResult<Data>) {\n return !!data.config.legend;\n },\n options: [\n { label: \"左上\", value: \"top-left\" },\n { label: \"顶部\", value: \"top\" },\n { label: \"右上\", value: \"top-right\" },\n { label: \"底部\", value: \"bottom\" },\n { label: \"左下\", value: \"bottom-left\" },\n { label: \"左侧\", value: \"left\" },\n { label: \"右下\", value: \"bottom-right\" },\n { label: \"右侧\", value: \"right\" },\n ],\n value: {\n get({ data }: EditorResult<Data>) {\n if (typeof data.config.legend === \"boolean\") {\n return data.config.legend;\n }\n\n return data.config.legend?.position;\n },\n set({ data }: EditorResult<Data>, value: any) {\n if (typeof data.config.legend !== \"boolean\") {\n data.config.legend.position = value;\n data.config.legend = { ...data.config.legend };\n }\n },\n },\n },\n // {\n // title: 'x轴方向偏移',\n // type: 'text',\n // ifVisible({ data }: EditorResult<Data>) {\n // return !!data.config.legend;\n // },\n // value: {\n // get({ data }: EditorResult<Data>) {\n // return data.config.legend.offsetX;\n // },\n // set({ data }: EditorResult<Data>, value: string) {\n // data.config.legend.offsetX = Number(value);\n // data.config.legend = { ...data.config.legend };\n // }\n // }\n // },\n // {\n // title: 'y轴方向偏移',\n // type: 'text',\n // ifVisible({ data }: EditorResult<Data>) {\n // return !!data.config.legend;\n // },\n // value: {\n // get({ data }: EditorResult<Data>) {\n // return data.config.legend.offsetY;\n // },\n // set({ data }: EditorResult<Data>, value: string) {\n // data.config.legend.offsetY = Number(value);\n // data.config.legend = { ...data.config.legend };\n // }\n // }\n // }\n ],\n };\n};\n\nexport const getGeoEditors = ({}) => {\n return {\n title: \"图形配置\",\n items: [\n {\n title: \"线条\",\n catelog: \"线条\",\n items: [\n {\n title: \"展示\",\n type: \"switch\",\n value: {\n get({ data }: EditorResult<Data>) {\n return !!data.geo?.line?.show;\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n data.geo.line = {\n ...data.geo.line,\n show: value,\n };\n },\n },\n },\n {\n title: \"顺滑曲线\",\n type: \"switch\",\n value: {\n get({ data }: EditorResult<Data>) {\n return !!data.geo?.line?.smooth;\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n data.geo.line = {\n ...data.geo.line,\n smooth: value,\n };\n },\n },\n },\n ],\n },\n {\n title: \"节点\",\n catelog: \"节点\",\n items: [\n {\n title: \"展示\",\n type: \"switch\",\n value: {\n get({ data }: EditorResult<Data>) {\n return !!data.geo?.dot?.show;\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n data.geo.dot = {\n ...data.geo.dot,\n show: value,\n };\n },\n },\n },\n ],\n },\n {\n title: \"面积\",\n catelog: \"面积\",\n items: [\n {\n title: \"展示\",\n type: \"switch\",\n value: {\n get({ data }: EditorResult<Data>) {\n return !!data.geo?.area?.show;\n },\n set({ data, input, output }: EditorResult<Data>, value: string) {\n data.geo.area = {\n ...data.geo.area,\n show: value,\n };\n },\n },\n },\n ],\n },\n ],\n };\n};\n"
659
+ }
660
+ ]
661
+ },
662
+ {
663
+ "path": "src/components/chart/utils/mock.ts",
664
+ "content": "import { ChartType, isGroupChart } from './../types'\n\nexport const MockData = {\n default: [\n { label: '1991', value: 3 },\n { label: '1992', value: 4 },\n { label: '1993', value: 3.5 },\n { label: '1994', value: 5 },\n { label: '1995', value: 4.9 },\n { label: '1996', value: 6 },\n { label: '1997', value: 7 },\n { label: '1998', value: 9 },\n { label: '1999', value: 13 }\n ],\n group: [\n { label: '1991', value: 3, type: 'London' },\n { label: '1992', value: 4, type: 'London' },\n { label: '1993', value: 3.5, type: 'London' },\n { label: '1994', value: 5, type: 'London' },\n { label: '1995', value: 4.9, type: 'London' },\n { label: '1996', value: 6, type: 'London' },\n { label: '1997', value: 7, type: 'London' },\n { label: '1998', value: 9, type: 'London' },\n { label: '1999', value: 13, type: 'London' },\n { label: '1991', value: 1, type: 'Paris' },\n { label: '1992', value: 3, type: 'Paris' },\n { label: '1993', value: 4.6, type: 'Paris' },\n { label: '1994', value: 5, type: 'Paris' },\n { label: '1995', value: 8, type: 'Paris' },\n { label: '1996', value: 13, type: 'Paris' },\n { label: '1997', value: 12, type: 'Paris' },\n { label: '1998', value: 19, type: 'Paris' },\n { label: '1999', value: 20, type: 'Paris' },\n ],\n percent: [\n { label: '极氪001', value: 60 },\n { label: '小米su7', value: 30 },\n { label: 'model3', value: 90 },\n { label: '小鹏P7i', value: 5 },\n { label: '蔚来ET5', value: 17 },\n { label: '海豹', value: 13 },\n ]\n}\n\n\n/**\n *\n * @param arr 原数据\n * @param Field 新key 按 x,y,分类\n * @param defaultKey 原数据key 按 x,y,分类\n * @returns\n */\nexport const changeMockDataField = (\n arr: Array<Record<string, any>>,\n Field: { xField: string; yField: string; seriesField?: string },\n defaultKey?: { x?: string; y?: string; category?: string }\n): Array<Record<string, any>> => {\n const { xField, yField, seriesField } = Field;\n const { x = 'label', y = 'value', category = 'type' } = defaultKey || {};\n\n return arr.map((item) => ({\n [xField]: item[x],\n [yField]: item[y],\n [seriesField]: item?.[category]\n }));\n};\n\n\nexport const mockLineChart = (config) => {\n return changeMockDataField(MockData.default, config)\n}\n\n\nexport const mockPieChart = (chartType, data) => {\n return changeMockDataField(MockData.percent, data.config);\n}\n\nexport const mockChart = (chartType, data) => {\n return changeMockDataField(isGroupChart(chartType) ? MockData.group : MockData.default, data.config)\n}"
665
+ }
666
+ ]
667
+ }
668
+ ]
669
+ },
370
670
  {
371
671
  "path": "src/components/checkList",
372
672
  "content": null,
@@ -3287,7 +3587,7 @@
3287
3587
  },
3288
3588
  {
3289
3589
  "path": "src/components/qrcode/runtime.tsx",
3290
- "content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { View, Image } from \"@tarojs/components\";\n// https://github.com/miaonster/taro-code\n// import { Barcode, QRCode } from \"taro-code\";\nimport { QRCode } from \"taro-code\";\nimport { isString } from \"./../utils/core\";\nimport css from \"./style.less\";\n\nexport default function ({ env, data, inputs, outputs, title, style }) {\n useMemo(() => {\n inputs[\"setValue\"]?.((val) => {\n if (isString(val)) {\n data.text = val;\n }\n });\n }, []);\n\n return (\n <View className={css.code}>\n {/* {data.mode === \"barcode\" && <Barcode text={data.text}></Barcode>} */}\n\n {data.mode === \"qrcode\" && (\n <QRCode\n style={{ display: \"block\", width: \"100%\", height: \"100%\" }}\n mode={\"widthFix\"}\n text={data.text}\n ></QRCode>\n )}\n </View>\n );\n}\n"
3590
+ "content": "import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { View, Image } from \"@tarojs/components\";\nimport QRCode from \"qrcode-generator\";\nimport { isString } from \"./../utils/core\";\nimport css from \"./style.less\";\n\nexport default function ({ env, data, inputs, outputs, title, style }) {\n const [qrCode, setQrCode] = useState(\"\");\n useMemo(() => {\n inputs[\"setValue\"]?.((val) => {\n if (isString(val)) {\n data.text = val;\n }\n });\n }, []);\n\n useEffect(() => {\n if (data.text) {\n const qr = QRCode(0, \"L\");\n const utf8Text = unescape(encodeURIComponent(data.text));\n qr.addData(utf8Text, \"Byte\");\n qr.make();\n const url = qr.createDataURL(10, 0);\n setQrCode(url);\n } else {\n setQrCode(\"\");\n }\n }, [data.text]);\n\n return (\n <View className={css.code}>\n {data.mode === \"qrcode\" && qrCode && (\n <Image\n mode=\"widthFix\"\n style={{ display: \"block\", width: \"100%\", height: \"100%\" }}\n src={qrCode}\n ></Image>\n )}\n </View>\n );\n}\n"
3291
3591
  },
3292
3592
  {
3293
3593
  "path": "src/components/qrcode/style.less",
@@ -5193,7 +5493,7 @@
5193
5493
  },
5194
5494
  {
5195
5495
  "path": "src/components/index.ts",
5196
- "content": "// 系统\nexport { default as SystemPage } from \"./system/systemPage/runtime\";\n\n// 基础\nexport { default as Image } from \"./image/runtime\";\nexport { default as Video } from \"./video/runtime\";\nexport { default as Button } from \"./button/runtime\";\nexport { default as Text } from \"./text/runtime\";\nexport { default as RichText } from \"./richText/runtime\";\nexport { default as Swiper } from \"./swiper/runtime\";\nexport { default as Icon } from \"./icon/runtime\";\n\n// 容器\nexport { default as ContainerBasic } from \"./containerBasic/runtime\";\nexport { default as Tabs2 } from \"./tabs2/runtime\";\nexport { default as ContainerList } from \"./containerList/runtime\";\nexport { default as Popup } from \"./popup/runtime\";\n// export { default as ContainerWaterfall } from \"./containerWaterfall/runtime\";\n// export { default as ContainerCondition2 } from \"./containerCondition2/runtime\";\nexport { default as Sidebar2 } from \"./sidebar2/runtime\";\n\n// 数据录入\nexport { default as FormContainer } from \"./formContainer/runtime\";\nexport { default as FormInput } from \"./formInput/runtime\";\nexport { default as FormStepper } from \"./formStepper/runtime\";\nexport { default as FormTextarea } from \"./formTextarea/runtime\";\nexport { default as FormPassword } from \"./formPassword/runtime\";\nexport { default as FormRadio } from \"./formRadio/runtime\";\nexport { default as FormCheckbox } from \"./formCheckbox/runtime\";\nexport { default as FormSwitch } from \"./formSwitch/runtime\";\nexport { default as FormRate } from \"./formRate/runtime\";\nexport { default as FormSelect } from \"./formSelect/runtime\";\nexport { default as FormDatetime } from \"./formDatetime/runtime\";\nexport { default as FormLocation } from \"./formLocation/runtime\";\nexport { default as FormPhoneNumber } from \"./formPhoneNumber/runtime\";\nexport { default as FormPhoneSMS } from \"./formPhoneSMS/runtime\";\nexport { default as FormImageUploader } from \"./formImageUploader/runtime\";\n// export { default as FormFileUploader } from \"./formFileUploader/runtime\";\n// export { default as FormEditor } from \"./formEditor/runtime\";\nexport { default as SearchBar } from \"./searchBar/runtime\";\nexport { default as SmsInput } from \"./smsInput/runtime\";\n// export { default as FormItemContainer } from \"./formItemContainer/runtime\";\nexport { default as FormAdditionContainer } from \"./formAdditionContainer/runtime\";\n\n// 数据展示\nexport { default as Table } from \"./table/runtime\";\nexport { default as Cell } from \"./cell/runtime\";\n// export { default as CheckList } from \"./checkList/runtime\";\nexport { default as FilterContainer } from \"./filter-coms/contaniner/runtime\";\nexport { default as FilterSort } from \"./filter-coms/sort/runtime\";\nexport { default as FilterSwitch } from \"./filter-coms/switch/runtime\";\nexport { default as FilterCustom } from \"./filter-coms/custom/runtime\";\n// export { default as Calendar } from \"./calendar/runtime\";\n// export { default as Cascader } from \"./cascader/runtime\";\n// export { default as Qrcode } from \"./qrcode/runtime\";\n\n// 微信\nexport { default as Map } from \"./map/runtime\";\nexport { default as AdPopup } from \"./ad-popup/runtime\";\nexport { default as ChannelVideo } from \"./channelVideo/runtime\";\n\n// 其它\nexport { default as Line } from \"./line/runtime\";\n// export { default as Anchor } from \"./anchor/runtime\";\nexport { default as Support } from \"./support/runtime\";\n"
5496
+ "content": "// 系统\nexport { default as SystemPage } from \"./system/systemPage/runtime\";\n\n// 基础\nexport { default as Image } from \"./image/runtime\";\nexport { default as Video } from \"./video/runtime\";\nexport { default as Button } from \"./button/runtime\";\nexport { default as Text } from \"./text/runtime\";\nexport { default as RichText } from \"./richText/runtime\";\nexport { default as Swiper } from \"./swiper/runtime\";\nexport { default as Icon } from \"./icon/runtime\";\n\n// 容器\nexport { default as ContainerBasic } from \"./containerBasic/runtime\";\nexport { default as Tabs2 } from \"./tabs2/runtime\";\nexport { default as ContainerList } from \"./containerList/runtime\";\nexport { default as Popup } from \"./popup/runtime\";\nexport { default as ContainerWaterfall } from \"./containerWaterfall/runtime\";\nexport { default as ContainerCondition2 } from \"./containerCondition2/runtime\";\nexport { default as Sidebar2 } from \"./sidebar2/runtime\";\n\n// 数据录入\nexport { default as FormContainer } from \"./formContainer/runtime\";\nexport { default as FormInput } from \"./formInput/runtime\";\nexport { default as FormStepper } from \"./formStepper/runtime\";\nexport { default as FormTextarea } from \"./formTextarea/runtime\";\nexport { default as FormPassword } from \"./formPassword/runtime\";\nexport { default as FormRadio } from \"./formRadio/runtime\";\nexport { default as FormCheckbox } from \"./formCheckbox/runtime\";\nexport { default as FormSwitch } from \"./formSwitch/runtime\";\nexport { default as FormRate } from \"./formRate/runtime\";\nexport { default as FormSelect } from \"./formSelect/runtime\";\nexport { default as FormDatetime } from \"./formDatetime/runtime\";\nexport { default as FormLocation } from \"./formLocation/runtime\";\nexport { default as FormPhoneNumber } from \"./formPhoneNumber/runtime\";\nexport { default as FormPhoneSMS } from \"./formPhoneSMS/runtime\";\nexport { default as FormImageUploader } from \"./formImageUploader/runtime\";\nexport { default as FormFileUploader } from \"./formFileUploader/runtime\";\nexport { default as FormEditor } from \"./formEditor/runtime\";\nexport { default as SearchBar } from \"./searchBar/runtime\";\nexport { default as SmsInput } from \"./smsInput/runtime\";\nexport { default as FormItemContainer } from \"./formItemContainer/runtime\";\nexport { default as FormAdditionContainer } from \"./formAdditionContainer/runtime\";\n\n// 数据展示\nexport { default as Table } from \"./table/runtime\";\nexport { default as Cell } from \"./cell/runtime\";\nexport { default as CheckList } from \"./checkList/runtime\";\nexport { default as FilterContainer } from \"./filter-coms/contaniner/runtime\";\nexport { default as FilterSort } from \"./filter-coms/sort/runtime\";\nexport { default as FilterSwitch } from \"./filter-coms/switch/runtime\";\nexport { default as FilterCustom } from \"./filter-coms/custom/runtime\";\nexport { default as Calendar } from \"./calendar/runtime\";\nexport { default as Cascader } from \"./cascader/runtime\";\nexport { default as Qrcode } from \"./qrcode/runtime\";\n\n// 微信\nexport { default as Map } from \"./map/runtime\";\nexport { default as AdPopup } from \"./ad-popup/runtime\";\nexport { default as ChannelVideo } from \"./channelVideo/runtime\";\n\n// 其它\nexport { default as Line } from \"./line/runtime\";\nexport { default as Anchor } from \"./anchor/runtime\";\nexport { default as Support } from \"./support/runtime\";\n\n// 图表组件\nexport { default as ChartColumn } from \"./chart/chart-column/runtime\";\nexport { default as ChartLine } from \"./chart/chart-line/runtime\";\nexport { default as ChartPie } from \"./chart/chart-pie/runtime\";\nexport { default as ChartRadar } from \"./chart/chart-radar/runtime\";\nexport { default as ChartRingProgress } from \"./chart/chart-ringProgress/runtime\";\n"
5197
5497
  }
5198
5498
  ]
5199
5499
  },
@@ -5310,8 +5610,8 @@
5310
5610
  "content": "import Taro from '@tarojs/taro';\n\nexport type DataType = {\n type?: 'short' | 'long';\n duration?: number;\n};\n\nexport interface Inputs {\n vibrate?: (fn: (config: DataType, relOutputs?: any) => void) => void;\n}\n\nexport interface Outputs {\n onSuccess: (value?: any) => void;\n onFail: (value?: any) => void;\n}\n\ninterface IOContext {\n data: DataType;\n inputs: Inputs;\n outputs: Outputs;\n}\n\nexport default (context: IOContext) => {\n const data: DataType = context.data;\n const inputs: Inputs = context.inputs;\n const outputs: Outputs = context.outputs;\n\n inputs.vibrate?.((val: DataType) => {\n try {\n const type = val?.type || data.type || 'short';\n\n if (type === 'long') {\n Taro.vibrateLong({\n success: () => outputs.onSuccess('长振动成功'),\n fail: (err) => outputs.onFail(err.errMsg || '长振动失败'),\n });\n } else {\n Taro.vibrateShort({\n success: () => outputs.onSuccess('短振动成功'),\n fail: (err) => outputs.onFail(err.errMsg || '短振动失败'),\n });\n }\n } catch (error: any) {\n console.error('设备振动失败:', error);\n outputs.onFail(error?.message || '设备振动失败');\n }\n });\n};\n"
5311
5611
  },
5312
5612
  {
5313
- "path": "src/core/comlib/index.ts",
5314
- "content": "// 显示提示消息\nexport { default as mybricks_taro_showToast } from './_ShowToast';\nexport type { DataType as mybricks_taro_showToast_DataType } from './_ShowToast';\n\n// 扫码\nexport { default as mybricks_taro_scanQrcode } from './_ScanQrcode';\nexport type { DataType as mybricks_taro_scanQrcode_DataType } from './_ScanQrcode';\n\n// 本地存储\nexport { default as mybricks_taro_setStorage } from './_SetStorage';\nexport type { DataType as mybricks_taro_setStorage_DataType } from './_SetStorage';\n\nexport { default as mybricks_taro_getStorage } from './_GetStorage';\nexport type { DataType as mybricks_taro_getStorage_DataType } from './_GetStorage';\n\nexport { default as mybricks_taro_removeStorage } from './_RemoveStorage';\nexport type { DataType as mybricks_taro_removeStorage_DataType } from './_RemoveStorage';\n\n// 地理位置\nexport { default as mybricks_taro_getLocation } from './_GetLocation';\nexport type { DataType as mybricks_taro_getLocation_DataType } from './_GetLocation';\n\n// 设备功能\nexport { default as mybricks_taro_vibrate } from './_Vibrate';\nexport type { DataType as mybricks_taro_vibrate_DataType } from './_Vibrate';\n\nexport { default as mybricks_taro_callPhone } from './_CallPhone';\nexport type { DataType as mybricks_taro_callPhone_DataType } from './_CallPhone';\n\nexport { default as mybricks_taro_openCamera } from './_OpenCamera';\nexport type { DataType as mybricks_taro_openCamera_DataType } from './_OpenCamera';\n\n// 系统功能\nexport { default as mybricks_taro_openUrl } from './_OpenUrl';\nexport type { DataType as mybricks_taro_openUrl_DataType } from './_OpenUrl';\n\nexport { default as mybricks_taro_share } from './_Share';\nexport type { DataType as mybricks_taro_share_DataType } from './_Share';\n\nexport { default as mybricks_taro_getSystemInfo } from './_GetSystemInfo';\nexport type { DataType as mybricks_taro_getSystemInfo_DataType } from './_GetSystemInfo';\n\n// 数据处理\nexport { default as mybricks_taro_aesEncode } from './_AesEncode';\nexport type { DataType as mybricks_taro_aesEncode_DataType } from './_AesEncode';\n\n// 模态对话框\nexport { default as mybricks_taro_modal } from './_Modal';\nexport type { DataType as mybricks_taro_modal_DataType } from './_Modal';\n\nexport { default as mybricks_taro_format } from './_Format';\nexport type { DataType as mybricks_taro_format_DataType } from './_Format';\n\n// 文件和媒体\nexport { default as mybricks_taro_chooseFile } from './_ChooseFile';\nexport type { DataType as mybricks_taro_chooseFile_DataType } from './_ChooseFile';\n\nexport { default as mybricks_taro_chooseMedia } from './_ChooseMedia';\nexport type { DataType as mybricks_taro_chooseMedia_DataType } from './_ChooseMedia';\n\n// 网络请求\nexport { default as mybricks_taro_connector } from './_Connector';\nexport type { DataType as mybricks_taro_connector_DataType } from './_Connector';\n\nexport { default as mybricks_taro_connectorGlobalHeaders } from './_ConnectorGlobalHeaders';\nexport type { DataType as mybricks_taro_connectorGlobalHeaders_DataType } from './_ConnectorGlobalHeaders';\n\n// 导航和路由\nexport { default as mybricks_taro_backTo } from './_BackTo';\nexport type { DataType as mybricks_taro_backTo_DataType } from './_BackTo';\n\nexport { default as mybricks_taro_router } from './_Router';\nexport type { DataType as mybricks_taro_router_DataType } from './_Router';\n\nexport { default as mybricks_taro_openPetalMap } from './_OpenPetalMap';\nexport type { DataType as mybricks_taro_openPetalMap_DataType } from './_OpenPetalMap';\n\n// 语音和多媒体\nexport { default as mybricks_taro_textToSpeech } from './_TextToSpeech';\nexport type { DataType as mybricks_taro_textToSpeech_DataType } from './_TextToSpeech';\n\n// 定时器\nexport { default as mybricks_taro_timerDebounce } from './_TimerDebounce';\nexport type { DataType as mybricks_taro_timerDebounce_DataType } from './_TimerDebounce';\n\nexport { default as mybricks_taro_timerDelay } from './_TimerDelay';\nexport type { DataType as mybricks_taro_timerDelay_DataType } from './_TimerDelay';\n\nexport { default as mybricks_taro_timerThrottle } from './_TimerThrottle';\nexport type { DataType as mybricks_taro_timerThrottle_DataType } from './_TimerThrottle';\n\n"
5613
+ "path": "src/core/comlib/Index.ts",
5614
+ "content": "// 显示提示消息\nexport { default as mybricks_taro_showToast } from './_ShowToast';\nexport type { DataType as mybricks_taro_showToast_DataType } from './_ShowToast';\n\n// 扫码\nexport { default as mybricks_taro_scanQrcode } from './_ScanQrcode';\nexport type { DataType as mybricks_taro_scanQrcode_DataType } from './_ScanQrcode';\n\n// 本地存储\nexport { default as mybricks_taro_setStorage } from './_SetStorage';\nexport type { DataType as mybricks_taro_setStorage_DataType } from './_SetStorage';\n\nexport { default as mybricks_taro_getStorage } from './_GetStorage';\nexport type { DataType as mybricks_taro_getStorage_DataType } from './_GetStorage';\n\nexport { default as mybricks_taro_removeStorage } from './_RemoveStorage';\nexport type { DataType as mybricks_taro_removeStorage_DataType } from './_RemoveStorage';\n\n// 地理位置\nexport { default as mybricks_taro_getLocation } from './_GetLocation';\nexport type { DataType as mybricks_taro_getLocation_DataType } from './_GetLocation';\n\n// 设备功能\nexport { default as mybricks_taro_vibrate } from './_Vibrate';\nexport type { DataType as mybricks_taro_vibrate_DataType } from './_Vibrate';\n\nexport { default as mybricks_taro_callPhone } from './_CallPhone';\nexport type { DataType as mybricks_taro_callPhone_DataType } from './_CallPhone';\n\nexport { default as mybricks_taro_openCamera } from './_OpenCamera';\nexport type { DataType as mybricks_taro_openCamera_DataType } from './_OpenCamera';\n\n// 系统功能\nexport { default as mybricks_taro_openUrl } from './_OpenUrl';\nexport type { DataType as mybricks_taro_openUrl_DataType } from './_OpenUrl';\n\nexport { default as mybricks_taro_share } from './_Share';\nexport type { DataType as mybricks_taro_share_DataType } from './_Share';\n\nexport { default as mybricks_taro_getSystemInfo } from './_GetSystemInfo';\nexport type { DataType as mybricks_taro_getSystemInfo_DataType } from './_GetSystemInfo';\n\n// 数据处理\nexport { default as mybricks_taro_aesEncode } from './_AesEncode';\nexport type { DataType as mybricks_taro_aesEncode_DataType } from './_AesEncode';\n\n// 模态对话框\nexport { default as mybricks_taro_modal } from './_Modal';\nexport type { DataType as mybricks_taro_modal_DataType } from './_Modal';\n\nexport { default as mybricks_taro_format } from './_Format';\nexport type { DataType as mybricks_taro_format_DataType } from './_Format';\n\n// 文件和媒体\nexport { default as mybricks_taro_chooseFile } from './_ChooseFile';\nexport type { DataType as mybricks_taro_chooseFile_DataType } from './_ChooseFile';\n\nexport { default as mybricks_taro_chooseMedia } from './_ChooseMedia';\nexport type { DataType as mybricks_taro_chooseMedia_DataType } from './_ChooseMedia';\n\n// 网络请求\nexport { default as mybricks_taro_connector } from './_Connector';\nexport type { DataType as mybricks_taro_connector_DataType } from './_Connector';\n\nexport { default as mybricks_taro_connectorGlobalHeaders } from './_ConnectorGlobalHeaders';\nexport type { DataType as mybricks_taro_connectorGlobalHeaders_DataType } from './_ConnectorGlobalHeaders';\n\n// 导航和路由\nexport { default as mybricks_taro_navigateBack } from './_BackTo';\nexport type { DataType as mybricks_taro_navigateBack_DataType } from './_BackTo';\n\nexport { default as mybricks_taro_router } from './_Router';\nexport type { DataType as mybricks_taro_router_DataType } from './_Router';\n\nexport { default as mybricks_taro_openPetalMap } from './_OpenPetalMap';\nexport type { DataType as mybricks_taro_openPetalMap_DataType } from './_OpenPetalMap';\n\n// 语音和多媒体\nexport { default as mybricks_taro_textToSpeech } from './_TextToSpeech';\nexport type { DataType as mybricks_taro_textToSpeech_DataType } from './_TextToSpeech';\n\n// 定时器\nexport { default as mybricks_taro_timerDebounce } from './_TimerDebounce';\nexport type { DataType as mybricks_taro_timerDebounce_DataType } from './_TimerDebounce';\n\nexport { default as mybricks_taro_timerDelay } from './_TimerDelay';\nexport type { DataType as mybricks_taro_timerDelay_DataType } from './_TimerDelay';\n\nexport { default as mybricks_taro_timerThrottle } from './_TimerThrottle';\nexport type { DataType as mybricks_taro_timerThrottle_DataType } from './_TimerThrottle';\n\n"
5315
5615
  }
5316
5616
  ]
5317
5617
  },
@@ -5353,7 +5653,7 @@
5353
5653
  },
5354
5654
  {
5355
5655
  "path": "src/core/mybricks/log.js",
5356
- "content": "export const log = (...args) => {\n console.log(\"[MyBricks]\", ...args)\n}\n\nexport const logger = {\n info: log,\n warn: log,\n error: log,\n}\n\n"
5656
+ "content": "export const log = (...args) => {\n // console.log(\"[MyBricks]\", ...args)\n}\n\nexport const logger = {\n info: log,\n warn: log,\n error: log,\n}\n\n"
5357
5657
  },
5358
5658
  {
5359
5659
  "path": "src/core/mybricks/MyBricksDescriptor.js",
@@ -5383,7 +5683,7 @@
5383
5683
  },
5384
5684
  {
5385
5685
  "path": "src/core/utils/hooks.ts",
5386
- "content": "import { useState, useRef, useMemo } from 'react';\nimport { createReactiveInputHandler } from '../mybricks/createReactiveInputHandler';\n\n/**\n * 深度代理,支持自动路径初始化和响应式更新(鸿蒙化处理方案)\n */\nexport function deepProxy(target: any, onSet?: () => void): any {\n if (target === null || typeof target !== 'object' || target.__isProxy) {\n return target;\n }\n\n return new Proxy(target, {\n get(obj, prop) {\n if (prop === '__isProxy') return true;\n if (prop === 'toJSON') return () => obj;\n\n let value = (obj as any)[prop];\n\n // 只代理已存在的对象属性,不自动创建空对象\n // 避免访问不存在的属性(如 disabled)时污染原始数据\n if (typeof value === 'object' && value !== null && !value.__isProxy) {\n (obj as any)[prop] = deepProxy(value, onSet);\n }\n\n return (obj as any)[prop];\n },\n set(obj, prop, value) {\n const result = Reflect.set(obj, prop, value);\n if (onSet) onSet();\n return result;\n }\n });\n}\n\nexport function useModel(rawData: any) {\n const [, forceUpdate] = useState({});\n const dataRef = useRef(rawData || {});\n\n return useMemo(() => {\n return deepProxy(dataRef.current, () => forceUpdate({}));\n }, []);\n}\n\nexport function useBindInputs(scope: any, id: string, initialHandlers?: Record<string, any>) {\n const handlersRef = useRef<Record<string, any>>({ ...initialHandlers });\n\n // 同步最新的 initialHandlers\n if (initialHandlers) {\n Object.assign(handlersRef.current, initialHandlers);\n }\n\n return useMemo(() => {\n const proxy = new Proxy({}, {\n get: (_target, pin: string) => {\n return (arg: any, ...args: any[]) => {\n if (typeof arg === 'function') {\n // 组件注册回调\n handlersRef.current[pin] = arg;\n } else {\n // 逻辑流触发输入\n const handler = handlersRef.current[pin];\n\n if (typeof handler === 'function') {\n if (pin === '_setData') {\n return handler(arg, ...args);\n }\n // 构造 createReactiveInputHandler 需要的参数\n return createReactiveInputHandler({\n input: handler,\n value: arg,\n rels: {}, // 这里可以扩展 output 关联\n title: id\n });\n }\n }\n };\n }\n });\n\n // 将代理对象挂载到作用域,供外部 comRefs.current.id.pin() 调用\n if (scope && scope.current) {\n scope.current[id] = proxy;\n }\n return proxy;\n }, [scope, id]);\n}\n\nexport function useBindEvents(props: any, context?: { id: string, name: string, parentSlot?: any }) {\n return useMemo(() => {\n const _events: Record<string, any> = {};\n\n // 预处理已存在的事件\n Object.keys(props).forEach(key => {\n // 兼容:MyBricks 输出 pin 既可能是 onChange,也可能是 changeTab 这种非 on 前缀\n if (typeof props[key] === 'function') {\n const handler = props[key];\n const wrapped = (originalValue: any) => {\n // 鸿蒙/render-web 规范:如果是在插槽中触发事件,且存在父级协议,则自动封装元数据\n // 这解决了 FormContainer 等组件识别子项的需求\n // 注意:不要仅凭 parentSlot 存在就封装,否则会影响 Tabs2/changeTab 这类事件直接给 JS 计算组件传参\n // 仅在父级 slot 使用 itemWrap 协议时才需要这层元数据\n const value = context?.parentSlot?.params?.itemWrap ? {\n id: context.id,\n name: context.name,\n value: originalValue\n } : originalValue;\n \n return handler(value);\n };\n wrapped.getConnections = () => [{ id: 'default' }];\n _events[key] = wrapped;\n }\n });\n\n return new Proxy(_events, {\n get(target, key: string) {\n // 对 onXXX 事件(不少组件 runtime 直接 outputs[\"onChange\"](...))提供兜底函数,避免未连线时报错\n if (typeof key === 'string' && key.startsWith('on')) {\n if ((target as any)[key]) {\n return (target as any)[key];\n }\n // 对未连接的事件返回兜底函数\n const emptyFn: any = () => { };\n emptyFn.getConnections = () => [];\n return emptyFn;\n }\n return (target as any)[key];\n }\n });\n }, [props, context]);\n}\n\n\n"
5686
+ "content": "import { useState, useRef, useMemo, useEffect } from 'react';\nimport { createReactiveInputHandler } from '../mybricks/createReactiveInputHandler';\nimport { useAppContext, useParentSlot } from './ComContext';\n\n/** 深度代理:支持响应式更新 */\nexport function deepProxy(target: any, onSet?: () => void): any {\n if (target === null || typeof target !== 'object' || target.__isProxy) return target;\n\n return new Proxy(target, {\n get(obj, prop) {\n if (prop === '__isProxy') return true;\n if (prop === 'toJSON') return () => obj;\n\n const value = obj[prop];\n if (typeof value === 'object' && value !== null && !value.__isProxy) {\n obj[prop] = deepProxy(value, onSet);\n }\n return obj[prop];\n },\n set(obj, prop, value) {\n const result = Reflect.set(obj, prop, value);\n onSet?.();\n return result;\n }\n });\n}\n\n/** 状态 Hook:提供响应式数据能力 */\nexport function useModel(rawData: any) {\n const [, forceUpdate] = useState({});\n const dataRef = useRef(rawData || {});\n\n return useMemo(() => deepProxy(dataRef.current, () => forceUpdate({})), []);\n}\n\n/** \n * 组件引用代理:\n * 1. 自动缓冲:访问未渲染组件时返回影子对象,缓冲后续指令\n * 2. 引用渗透:子作用域注册的真实引用自动同步至父级\n * 3. 自动同步清理:卸载时从作用域链中彻底移除,防止僵尸引用\n */\nexport function proxyRefs(target: any, parentComRefs?: any, globalTodoPool?: Map<string, any[]>): any {\n return new Proxy(target, {\n get(obj, prop) {\n if (prop === '__isProxy') return true;\n if (prop === 'toJSON') return () => obj;\n\n if (typeof prop === 'string' && prop.startsWith('u_') && obj[prop] === undefined) {\n // 懒加载影子对象\n return (obj[prop] = new Proxy({ __isShadow: true }, {\n get(_, method: string) {\n if (method === '__isShadow') return true;\n return (...args: any[]) => {\n if (!(globalTodoPool instanceof Map)) return;\n\n const instances = globalTodoPool.get(prop) || [];\n if (!globalTodoPool.has(prop)) globalTodoPool.set(prop, instances);\n\n const index = obj.$index ?? 0;\n const todo = instances[index] || (instances[index] = {});\n todo[method] = args;\n };\n }\n }));\n }\n return obj[prop];\n },\n set(obj, prop, value) {\n const result = Reflect.set(obj, prop, value);\n const isRealRef = typeof prop === 'string' && !prop.startsWith('$') && value?.__isShadow !== true;\n\n if (isRealRef && parentComRefs?.current) {\n try { parentComRefs.current[prop] = value; } catch {}\n }\n return result;\n },\n deleteProperty(obj, prop) {\n const result = Reflect.deleteProperty(obj, prop);\n const isRealRef = typeof prop === 'string' && !prop.startsWith('$');\n\n if (isRealRef && parentComRefs?.current) {\n try { delete parentComRefs.current[prop]; } catch {}\n }\n return result;\n }\n });\n}\n\n/** \n * 组件输入绑定 Hook:\n * 1. 注册输入执行器\n * 2. 自动重放缓冲指令(精准索引匹配)\n * 3. 生命周期自动化:卸载时自动注销引用渗透路径\n */\nexport function useBindInputs(scope: any, id: string, initialHandlers?: Record<string, any>) {\n const handlersRef = useRef<Record<string, any>>({ ...initialHandlers });\n const { globalTodoInputs } = useAppContext();\n const parentSlot = useParentSlot();\n const index = parentSlot?.params?.inputValues?.index ?? 0;\n\n useEffect(() => {\n return () => {\n if (scope?.current) {\n delete scope.current[id];\n }\n };\n }, [scope, id]);\n\n return useMemo(() => {\n const proxy = new Proxy({}, {\n get: (target, pin: string) => {\n if (pin === '__isShadow') return false;\n if (pin === 'toJSON') return () => target;\n\n return (arg: any, ...args: any[]) => {\n if (typeof arg === 'function') {\n handlersRef.current[pin] = arg;\n\n // 处理指令重放\n const instances = globalTodoInputs?.get(id);\n const todo = instances?.[index] || instances?.[0];\n if (todo?.[pin]) {\n const pendingArgs = todo[pin];\n if (pin === '_setData') {\n arg(...pendingArgs);\n } else {\n createReactiveInputHandler({ input: arg, value: pendingArgs[0], rels: {}, title: id });\n }\n delete todo[pin];\n\n // 检查全局清理\n const hasTasks = instances?.some((inst: any) => inst && Object.keys(inst).length > 0);\n if (!hasTasks) globalTodoInputs.delete(id);\n }\n } else {\n const handler = handlersRef.current[pin];\n if (typeof handler === 'function') {\n return pin === '_setData' \n ? handler(arg, ...args) \n : createReactiveInputHandler({ input: handler, value: arg, rels: {}, title: id });\n }\n }\n };\n }\n });\n\n if (scope?.current) scope.current[id] = proxy;\n if (initialHandlers) {\n Object.keys(initialHandlers).forEach(pin => (proxy as any)[pin](initialHandlers[pin]));\n }\n\n return proxy;\n }, [scope, id, globalTodoInputs, index]);\n}\n\n/** 组件事件绑定 Hook */\nexport function useBindEvents(props: any, context?: { id: string, name: string, parentSlot?: any }) {\n return useMemo(() => {\n const events: Record<string, any> = {};\n\n Object.keys(props).forEach(key => {\n if (typeof props[key] === 'function') {\n const handler = props[key];\n const wrapped = (original: any) => {\n const value = context?.parentSlot?.params?.itemWrap \n ? { id: context.id, name: context.name, value: original } \n : original;\n return handler(value);\n };\n wrapped.getConnections = () => [{ id: 'default' }];\n events[key] = wrapped;\n }\n });\n\n return new Proxy(events, {\n get(target, key: string) {\n if (typeof key === 'string' && key.startsWith('on')) {\n if (target[key]) return target[key];\n const fn: any = () => {};\n fn.getConnections = () => [];\n return fn;\n }\n return target[key];\n }\n });\n }, [props, context]);\n}\n"
5387
5687
  },
5388
5688
  {
5389
5689
  "path": "src/core/utils/index.ts",
@@ -5403,15 +5703,15 @@
5403
5703
  },
5404
5704
  {
5405
5705
  "path": "src/core/utils/slots.tsx",
5406
- "content": "import React, { useMemo, useRef } from \"react\";\nimport ComContext, { SlotProvider, useAppContext, useParentSlot } from \"./ComContext\";\nimport { createReactiveInputHandler } from \"../mybricks/createReactiveInputHandler\";\n\ntype AnyRecord = Record<string, any>;\n\ntype SlotState = {\n inputs: any;\n outputs: any;\n _inputs: any;\n /** scopeId -> scoped comRefs(每个 scope 一套,避免列表多实例覆盖) */\n _scopedComRefs?: Record<string, any>;\n _render?: any;\n render: (params?: any) => any;\n};\n\nfunction SlotParamsBridge(props: {\n state: SlotState;\n params: any;\n render?: any;\n children?: React.ReactNode;\n}) {\n const parentSlot = useParentSlot<any>();\n const mergedParams =\n props.params?.inputValues === undefined && parentSlot?.params?.inputValues\n ? { ...(props.params || {}), inputValues: parentSlot.params.inputValues }\n : props.params;\n\n const SlotComp = props.render;\n const content = SlotComp ? <SlotComp {...(mergedParams || {})} /> : props.children ?? null;\n\n return <SlotProvider value={{ ...props.state, params: mergedParams }}>{content}</SlotProvider>;\n}\n\nfunction createChannelProxy(title: string) {\n const handlersMap: Record<string, any> = {};\n return new Proxy(\n {},\n {\n get: (_t, pin: string) => {\n return (arg: any) => {\n if (typeof arg === \"function\") {\n handlersMap[pin] = arg;\n return;\n }\n const handler = handlersMap[pin];\n if (typeof handler === \"function\") {\n return createReactiveInputHandler({\n input: handler,\n value: arg,\n rels: {},\n title,\n });\n }\n };\n },\n },\n );\n}\n\n/**\n * 参考鸿蒙的 createSlotsIO:\n * - 确保每个 slot 都具备 inputs / outputs / _inputs 三套通道,避免 runtime 访问时报 undefined\n * - render 时通过 SlotProvider 注入 parentSlot(slot 内子组件可 useParentSlot 获取)\n */\nexport function useEnhancedSlots(rawSlots: any, id: string) {\n const slotStoreRef = useRef<Record<string, SlotState>>({});\n\n return useMemo(() => {\n if (!rawSlots) return {};\n const nextSlots: AnyRecord = {};\n\n Object.entries(rawSlots).forEach(([slotKey, slotDef]: any) => {\n const state =\n slotStoreRef.current[slotKey] ||\n (slotStoreRef.current[slotKey] = {\n inputs: createChannelProxy(`${id}.${slotKey}.inputs`),\n outputs: createChannelProxy(`${id}.${slotKey}.outputs`),\n _inputs: createChannelProxy(`${id}.${slotKey}._inputs`),\n _scopedComRefs: {},\n _render: undefined,\n render: (params?: any) => {\n const r = state._render;\n // 只有存在 key 或 index 时才认为是“多实例作用域插槽”,需要实例隔离\n const rawScope = params?.key ?? params?.inputValues?.index ?? params?.inputValues?.itemData?.id;\n \n if (rawScope === undefined || rawScope === null) {\n return (\n <SlotParamsBridge state={state} params={params} render={r} />\n );\n }\n\n const scopeId = `${id}.${slotKey}::${String(rawScope)}`;\n const scopedComRefs =\n (state._scopedComRefs![scopeId] ||= { current: { $inputs: {}, $outputs: {} } });\n return (\n <SlotProvider value={{ ...state, params }}>\n <ScopedComContextProvider comRefs={scopedComRefs} scopeId={scopeId}>\n <SlotParamsBridge state={state} params={params} render={r} />\n </ScopedComContextProvider>\n </SlotProvider>\n );\n },\n });\n\n state._render = slotDef?.render;\n nextSlots[slotKey] = {\n ...(slotDef || {}),\n render: state.render,\n inputs: state.inputs,\n outputs: state.outputs,\n _inputs: state._inputs,\n };\n });\n\n return nextSlots;\n }, [rawSlots, id]);\n}\n\nexport function ScopedComContextProvider(props: {\n comRefs?: any;\n scopeId: string;\n children: React.ReactNode;\n}) {\n const parent = useAppContext();\n const value = useMemo(() => {\n // $outputs 与 $inputs 一样:在 scoped 下应当隔离(由 scopedComRefs.current.$outputs 提供)\n // 如果没有显式传 comRefs,则沿用父级的,但依然带上新的 scopeId\n return {\n ...parent,\n comRefs: props.comRefs || parent.comRefs,\n $scopeId: props.scopeId,\n } as any;\n }, [parent, props.comRefs, props.scopeId]);\n\n return <ComContext.Provider value={value}>{props.children}</ComContext.Provider>;\n}\n\n/** parentSlot 解析:props 优先,其次用 SlotProvider 注入的 context */\nexport function useResolvedParentSlot(parentSlotProp: any) {\n const parentSlotFromCtx = useParentSlot();\n return parentSlotProp ?? parentSlotFromCtx;\n}\n"
5706
+ "content": "import React, { useMemo, useRef } from \"react\";\nimport ComContext, { SlotProvider, useAppContext, useParentSlot } from \"./ComContext\";\nimport { createReactiveInputHandler } from \"../mybricks/createReactiveInputHandler\";\nimport { proxyRefs } from \"./hooks\";\n\ntype AnyRecord = Record<string, any>;\n\ntype SlotState = {\n inputs: any;\n outputs: any;\n _inputs: any;\n /** scopeId -> scoped comRefs(每个 scope 一套,避免列表多实例覆盖) */\n _scopedComRefs?: Record<string, any>;\n _render?: any;\n render: (params?: any) => any;\n};\n\n/**\n * 创建一个具有“向上渗透”和“隔离 Todo 池”能力的 comRefs 对象\n */\nfunction createPenetratingComRefs(parentComRefs: any, globalTodoPool?: Map<string, any>, index: number = 0) {\n const localTarget = { $inputs: {}, $outputs: {}, $index: index };\n return { current: proxyRefs(localTarget, parentComRefs, globalTodoPool) };\n}\n\nfunction SlotParamsBridge(props: {\n state: SlotState;\n params: any;\n render?: any;\n children?: React.ReactNode;\n}) {\n const parentSlot = useParentSlot<any>();\n const mergedParams =\n props.params?.inputValues === undefined && parentSlot?.params?.inputValues\n ? { ...(props.params || {}), inputValues: parentSlot.params.inputValues }\n : props.params;\n\n const SlotComp = props.render;\n const content = SlotComp ? <SlotComp {...(mergedParams || {})} /> : props.children ?? null;\n\n return <SlotProvider value={{ ...props.state, params: mergedParams }}>{content}</SlotProvider>;\n}\n\nfunction createChannelProxy(title: string) {\n const handlersMap: Record<string, any> = {};\n return new Proxy(\n {},\n {\n get: (_t, pin: string) => {\n return (arg: any) => {\n if (typeof arg === \"function\") {\n handlersMap[pin] = arg;\n return;\n }\n const handler = handlersMap[pin];\n if (typeof handler === \"function\") {\n return createReactiveInputHandler({\n input: handler,\n value: arg,\n rels: {},\n title,\n });\n }\n };\n },\n },\n );\n}\n\nexport function useEnhancedSlots(rawSlots: any, id: string) {\n const { comRefs: parentComRefs, globalTodoInputs } = useAppContext();\n const slotStoreRef = useRef<Record<string, SlotState>>({});\n\n return useMemo(() => {\n if (!rawSlots) return {};\n const nextSlots: AnyRecord = {};\n\n Object.entries(rawSlots).forEach(([slotKey, slotDef]: any) => {\n const state =\n slotStoreRef.current[slotKey] ||\n (slotStoreRef.current[slotKey] = {\n inputs: createChannelProxy(`${id}.${slotKey}.inputs`),\n outputs: createChannelProxy(`${id}.${slotKey}.outputs`),\n _inputs: createChannelProxy(`${id}.${slotKey}._inputs`),\n _scopedComRefs: {},\n _render: undefined,\n render: (params?: any) => {\n const r = state._render;\n // 只有存在 key 或 index 时才认为是“多实例作用域插槽”,需要实例隔离\n const rawScope = params?.key ?? params?.inputValues?.index ?? params?.inputValues?.itemData?.id;\n \n if (rawScope === undefined || rawScope === null) {\n return (\n <SlotParamsBridge state={state} params={params} render={r} />\n );\n }\n\n const scopeId = `${id}.${slotKey}::${String(rawScope)}`;\n const index = params?.inputValues?.index ?? 0;\n const scopedComRefs =\n (state._scopedComRefs![scopeId] ||= createPenetratingComRefs(parentComRefs, globalTodoInputs, index));\n\n return (\n <ScopedComContextProvider comRefs={scopedComRefs} scopeId={scopeId}>\n <SlotParamsBridge state={state} params={params} render={r} />\n </ScopedComContextProvider>\n );\n },\n });\n\n state._render = slotDef?.render;\n nextSlots[slotKey] = {\n ...(slotDef || {}),\n render: state.render,\n inputs: state.inputs,\n outputs: state.outputs,\n _inputs: state._inputs,\n };\n });\n\n return nextSlots;\n }, [rawSlots, id, parentComRefs, globalTodoInputs]);\n}\n\nexport function ScopedComContextProvider(props: {\n comRefs?: any;\n scopeId: string;\n children: React.ReactNode;\n}) {\n const parent = useAppContext();\n const value = useMemo(() => {\n return {\n ...parent,\n comRefs: props.comRefs || parent.comRefs,\n $scopeId: props.scopeId,\n } as any;\n }, [parent, props.comRefs, props.scopeId]);\n\n return <ComContext.Provider value={value}>{props.children}</ComContext.Provider>;\n}\n\n/** parentSlot 解析:props 优先,其次用 SlotProvider 注入的 context */\nexport function useResolvedParentSlot(parentSlotProp: any) {\n const parentSlotFromCtx = useParentSlot();\n return parentSlotProp ?? parentSlotFromCtx;\n}\n"
5407
5707
  },
5408
5708
  {
5409
5709
  "path": "src/core/utils/useContext.ts",
5410
- "content": "import { useRef, useState, useMemo } from 'react'\nimport { deepProxy } from './hooks'\n\nexport interface ComContextStore {\n comRefs: any;\n $vars: any;\n $fxs: any;\n appContext: any; \n popupState: {\n visible: boolean;\n name: string;\n value: any;\n controller: any;\n };\n setPopupState: (state: any) => void;\n}\n\nexport function useAppCreateContext(id: string): ComContextStore {\n // 约定:场景级 inputs 统一挂载到 $inputs,避免与组件 runtime 的 inputs 命名冲突\n // 同时可避免 `Cannot set property 'open' of undefined`\n // 注册表拆分:\n // - comRefs: 组件实例/inputs/outputs 注册表(可 scoped)\n // - $vars/$fxs: 逻辑能力注册表(仅页面级,全作用域共享)\n const comRefs = useRef<any>(deepProxy({ $inputs: {}, $outputs: {} }));\n const $vars = useRef<any>({});\n const $fxs = useRef<any>({});\n const [popupState, setPopupState] = useState({\n visible: false,\n name: '',\n value: null,\n controller: null\n });\n\n const appContext = useRef({\n canvas: {\n id, // 使用 data 中的 id\n },\n runtime: {\n debug: false,\n },\n edit: false,\n isH5: false,\n isDesigner: false,\n isPreview: false,\n isRelease: false,\n isDebug: false,\n isLocal: false,\n isTest: false,\n tabBar: [],\n useTabBar: false,\n }).current;\n\n return useMemo(() => ({\n comRefs,\n $vars,\n $fxs,\n appContext,\n popupState,\n setPopupState\n }), [popupState]);\n}\n"
5710
+ "content": "import { useRef, useState, useMemo } from 'react'\nimport { proxyRefs } from './hooks'\n\nconst GLOBAL_TODO_POOL = new Map<string, any[]>();\n\nexport interface ComContextStore {\n comRefs: any;\n $vars: any;\n $fxs: any;\n appContext: any; \n popupState: {\n visible: boolean;\n name: string;\n value: any;\n controller: any;\n };\n setPopupState: (state: any) => void;\n globalTodoInputs: Map<string, any[]>;\n}\n\nexport function useAppCreateContext(id: string): ComContextStore {\n const globalTodoInputs = useRef<Map<string, any[]>>(GLOBAL_TODO_POOL);\n const comRefs = useRef<any>(proxyRefs({ $inputs: {}, $outputs: {} }, undefined, globalTodoInputs.current));\n const $vars = useRef<any>({});\n const $fxs = useRef<any>({});\n\n const [popupState, setPopupState] = useState({\n visible: false,\n name: '',\n value: null,\n controller: null\n });\n\n const appContext = useRef({\n canvas: {\n id,\n },\n runtime: {\n debug: false,\n },\n edit: false,\n isH5: false,\n isDesigner: false,\n isPreview: false,\n isRelease: false,\n isDebug: false,\n isLocal: false,\n isTest: false,\n tabBar: [],\n useTabBar: false,\n }).current;\n\n return useMemo(() => ({\n comRefs,\n $vars,\n $fxs,\n globalTodoInputs: globalTodoInputs.current,\n appContext,\n popupState,\n setPopupState\n }), [popupState]);\n}\n"
5411
5711
  },
5412
5712
  {
5413
5713
  "path": "src/core/utils/with.tsx",
5414
- "content": "import React, { useState, useEffect } from 'react';\n// @ts-ignore 运行时由宿主项目提供 @tarojs/components\nimport { View } from '@tarojs/components';\nimport { useModel, useBindInputs, useBindEvents, subscribePopupRouter, closeActivePopupRouter } from './index';\nimport { useAppCreateContext } from './useContext';\nimport ComContext, { useAppContext } from './ComContext';\nimport { useEnhancedSlots, useResolvedParentSlot } from './slots';\n// @ts-ignore 运行时由宿主项目提供 @tarojs/taro\nimport { useTabItemTap } from '@tarojs/taro';\n\ninterface WithComProps {\n component: React.ComponentType<any>;\n intputRef?: any;\n id?: string;\n data?: any;\n className?: string;\n style?: any;\n [key: string]: any;\n}\n\nexport const WithCom: React.FC<WithComProps> = (props) => {\n const { component: Component, id = '', data, className, style, ...rest } = props;\n const { comRefs, appContext } = useAppContext();\n const env = appContext; //TODO: 需要根据实际情况修改\n\n const isPopup = (Component as any).isPopup;\n const [show, setShow] = useState(true);\n const [dynamicStyle, setDynamicStyle] = useState({});\n\n\n //数据模型\n const _data = useModel(data || {});\n\n // 内置通用能力\n const handlers = {\n _setStyle: (style: any) => {\n setDynamicStyle((prev) => ({ ...prev, ...style }));\n },\n _setData: (path: string, value: any) => {\n const paths = path.split('.');\n let current = _data;\n for (let i = 0; i < paths.length - 1; i++) {\n if (!current[paths[i]]) current[paths[i]] = {};\n current = current[paths[i]];\n }\n current[paths[paths.length - 1]] = value;\n }\n };\n\n if (!isPopup) {\n Object.assign(handlers, {\n show: () => setShow(true),\n hide: () => setShow(false),\n showOrHide: () => setShow((prev) => !prev),\n });\n }\n\n // 绑定输入,传入初始 handlers\n const inputProxy = useBindInputs(comRefs, id, handlers);\n\n const { slots: rawSlots, parentSlot: parentSlotProp, ...restProps } = rest as any;\n const parentSlot = useResolvedParentSlot(parentSlotProp);\n\n // 绑定事件,带上上下文(用于事件流自动封装 id/name)\n const eventProxy = useBindEvents(restProps, { \n id, \n name: props.name || id, \n parentSlot \n });\n\n // 注册 outputs 到注册表(按组件 id)\n if (comRefs?.current?.$outputs) {\n comRefs.current.$outputs[id] = eventProxy;\n }\n\n // 鸿蒙规范:确保 comRefs 中挂载的是最新的 inputProxy\n comRefs.current[id] = inputProxy;\n\n const enhancedSlots = useEnhancedSlots(rawSlots, id);\n\n const jsx = (\n <Component\n {...restProps}\n inputs={inputProxy}\n outputs={eventProxy}\n slots={enhancedSlots}\n parentSlot={parentSlot}\n data={_data}\n env={env}\n id={id}\n style={style}\n />\n );\n\n // 鸿蒙化处理:支持 itemWrap 协议\n if (parentSlot?.params?.itemWrap) {\n return parentSlot.params.itemWrap({\n id,\n name: props.name || id,\n jsx,\n def: (Component as any).def,\n inputs: inputProxy,\n outputs: eventProxy,\n style\n });\n }\n\n return (\n show || isPopup ? (\n <View className={className} style={{ ...style, ...dynamicStyle }} >\n {jsx}\n </View>\n ) : null\n );\n};\n\nexport const WithWrapper = (id: string, Component: React.ComponentType<any>) => {\n return function WrappedComponent(props: any) {\n const contextStore = useAppCreateContext(id);\n const { setPopupState } = contextStore;\n const isPopup = (Component as any).isPopup;\n\n // 通过发布订阅模式解耦弹窗状态变化\n useEffect(() => {\n return subscribePopupRouter((state) => setPopupState(state));\n }, [setPopupState]);\n\n // 点击 TabBar 时自动关闭弹窗(自定义 TabBar 或原生 TabBar 点击均会触发)\n useTabItemTap(() => {\n if (isPopup) return;\n closeActivePopupRouter();\n });\n\n return (\n <ComContext.Provider value={contextStore}>\n <Component {...props} />\n </ComContext.Provider>\n );\n };\n};\n"
5714
+ "content": "import React, { useState, useEffect } from 'react';\n// @ts-ignore 运行时由宿主项目提供 @tarojs/components\nimport { View } from '@tarojs/components';\nimport { useModel, useBindInputs, useBindEvents, subscribePopupRouter, closeActivePopupRouter } from './index';\nimport { useAppCreateContext } from './useContext';\nimport ComContext, { useAppContext } from './ComContext';\nimport { useEnhancedSlots, useResolvedParentSlot } from './slots';\n// @ts-ignore 运行时由宿主项目提供 @tarojs/taro\nimport { useTabItemTap } from '@tarojs/taro';\n\ninterface WithComProps {\n component: React.ComponentType<any>;\n intputRef?: any;\n id?: string;\n data?: any;\n className?: string;\n style?: any;\n [key: string]: any;\n}\n\nexport const WithCom: React.FC<WithComProps> = (props) => {\n const { component: Component, id = '', data, className, style, ...rest } = props;\n const { comRefs, appContext } = useAppContext();\n const env = appContext; //TODO: 需要根据实际情况修改\n\n const isPopup = (Component as any).isPopup;\n const [show, setShow] = useState(true);\n const [dynamicStyle, setDynamicStyle] = useState({});\n\n\n //数据模型\n const _data = useModel(data || {});\n\n // 内置通用能力\n const handlers = {\n _setStyle: (style: any) => {\n setDynamicStyle((prev) => ({ ...prev, ...style }));\n },\n _setData: (path: string, value: any) => {\n const paths = path.split('.');\n let current = _data;\n for (let i = 0; i < paths.length - 1; i++) {\n if (!current[paths[i]]) current[paths[i]] = {};\n current = current[paths[i]];\n }\n current[paths[paths.length - 1]] = value;\n }\n };\n\n if (!isPopup) {\n Object.assign(handlers, {\n show: () => setShow(true),\n hide: () => setShow(false),\n showOrHide: () => setShow((prev) => !prev),\n });\n }\n\n // 绑定输入,传入初始 handlers\n const inputProxy = useBindInputs(comRefs, id, handlers);\n\n const { slots: rawSlots, parentSlot: parentSlotProp, ...restProps } = rest as any;\n const parentSlot = useResolvedParentSlot(parentSlotProp);\n\n // 绑定事件,带上上下文(用于事件流自动封装 id/name)\n const eventProxy = useBindEvents(restProps, { \n id, \n name: props.name || id, \n parentSlot \n });\n\n // 注册 outputs 到注册表(按组件 id)\n if (comRefs?.current?.$outputs) {\n comRefs.current.$outputs[id] = eventProxy;\n }\n\n // 鸿蒙规范:确保 comRefs 中挂载的是最新的 inputProxy\n comRefs.current[id] = inputProxy;\n\n const enhancedSlots = useEnhancedSlots(rawSlots, id);\n\n const jsx = (\n <Component\n {...restProps}\n inputs={inputProxy}\n outputs={eventProxy}\n slots={enhancedSlots}\n parentSlot={parentSlot}\n data={_data}\n env={env}\n id={id}\n style={style}\n />\n );\n\n // 鸿蒙化处理:支持 itemWrap 协议\n if (parentSlot?.params?.itemWrap) {\n return parentSlot.params.itemWrap({\n id,\n name: props.name || id,\n jsx,\n def: (Component as any).def,\n inputs: inputProxy,\n outputs: eventProxy,\n style\n });\n }\n\n return (\n show || isPopup ? (\n <View className={className} style={{ ...style, ...dynamicStyle }} >\n {jsx}\n {props.children}\n </View>\n ) : null\n );\n};\n\nexport const WithWrapper = (id: string, Component: React.ComponentType<any>) => {\n return function WrappedComponent(props: any) {\n const contextStore = useAppCreateContext(id);\n const { setPopupState } = contextStore;\n const isPopup = (Component as any).isPopup;\n\n // 通过发布订阅模式解耦弹窗状态变化\n useEffect(() => {\n return subscribePopupRouter((state) => setPopupState(state));\n }, [setPopupState]);\n\n // 点击 TabBar 时自动关闭弹窗(自定义 TabBar 或原生 TabBar 点击均会触发)\n useTabItemTap(() => {\n if (isPopup) return;\n closeActivePopupRouter();\n });\n\n return (\n <ComContext.Provider value={contextStore}>\n <Component {...props} />\n </ComContext.Provider>\n );\n };\n};\n"
5415
5715
  }
5416
5716
  ]
5417
5717
  }
@@ -5473,7 +5773,7 @@
5473
5773
  },
5474
5774
  {
5475
5775
  "path": "src/app.global.less",
5476
- "content": "/* 隐藏 React Refresh 的全屏错误遮罩 */\n#react-refresh-overlay, \niframe[id=\"react-refresh-overlay\"] {\n display: none !important;\n}\n\n.mybricks_taro_systemPage {\n height: 100vh !important;\n}\n\nview {\n box-sizing: border-box;\n}\n"
5776
+ "content": "/* 隐藏 React Refresh 的全屏错误遮罩 */\n#react-refresh-overlay, \niframe[id=\"react-refresh-overlay\"] {\n display: none !important;\n}\n\n.mybricks_taro_systemPage {\n height: 100vh !important;\n}\n\n.mybricks_com{\n flex-shrink: 0;\n min-height: 0; /* 防止子元素撑开父元素 */\n}\n\nview {\n box-sizing: border-box;\n}\n"
5477
5777
  },
5478
5778
  {
5479
5779
  "path": "src/app.ts",
@@ -5497,7 +5797,7 @@
5497
5797
  },
5498
5798
  {
5499
5799
  "path": ".DS_Store",
5500
- "content": "\u0000\u0000\u0000\u0001Bud1\u0000\u0000\u0010\u0000\u0000\u0000\b\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000%\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\b\u0000\u0000\u0000\b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\b\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000 \u0000\u0000\u0000\u0001\u0000\u0000\u0000@\u0000\u0000\u0000\u0001\u0000\u0000\u0000�\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000�\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000�\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u000b\u0000\u0000\u0000E\u0000\u0000\u0000%\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004DSDB\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000`\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000�\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0002\u0000\u0000\b\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000�\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000�\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"
5800
+ "content": "\u0000\u0000\u0000\u0001Bud1\u0000\u0000\u0010\u0000\u0000\u0000\b\u0000\u0000\u0000\u0010\u0000\u0000\u0000\u0000%\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0003\u0000s\u0000r\u0000cdsclbool\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000clbool\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\b\u000b\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000 \u0000\u0000\u0000\u0001\u0000\u0000\u0000@\u0000\u0000\u0000\u0001\u0000\u0000\u0000�\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0010\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000�\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000�\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0010\u000b\u0000\u0000\u0000E\u0000\u0000\u0000%\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004DSDB\u0000\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000`\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0000�\u0000\u0000\u0000\u0001\u0000\u0000\u0001\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0002\u0000\u0000\u0000\u0000\u0001\u0000\u0000\u0004\u0000\u0000\u0000\u0000\u0002\u0000\u0000\b\u0000\u0000\u0000\u0018\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0000 \u0000\u0000\u0000\u0000\u0001\u0000\u0000@\u0000\u0000\u0000\u0000\u0001\u0000\u0000�\u0000\u0000\u0000\u0000\u0001\u0000\u0001\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0002\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0004\u0000\u0000\u0000\u0000\u0000\u0001\u0000\b\u0000\u0000\u0000\u0000\u0000\u0001\u0000\u0010\u0000\u0000\u0000\u0000\u0000\u0001\u0000 \u0000\u0000\u0000\u0000\u0000\u0001\u0000@\u0000\u0000\u0000\u0000\u0000\u0001\u0000�\u0000\u0000\u0000\u0000\u0000\u0001\u0001\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0002\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0004\u0000\u0000\u0000\u0000\u0000\u0000\u0001\b\u0000\u0000\u0000\u0000\u0000\u0000\u0001\u0010\u0000\u0000\u0000\u0000\u0000\u0000\u0001 \u0000\u0000\u0000\u0000\u0000\u0000\u0001@\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"
5501
5801
  },
5502
5802
  {
5503
5803
  "path": ".editorconfig",
@@ -5533,7 +5833,7 @@
5533
5833
  },
5534
5834
  {
5535
5835
  "path": "package.json",
5536
- "content": "{\n \"name\": \"checkCom\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"description\": \"\",\n \"templateInfo\": {\n \"name\": \"default\",\n \"typescript\": true,\n \"css\": \"Less\",\n \"framework\": \"React\"\n },\n \"scripts\": {\n \"prepare\": \"husky\",\n \"new\": \"taro new\",\n \"build:weapp\": \"taro build --type weapp\",\n \"build:swan\": \"taro build --type swan\",\n \"build:alipay\": \"taro build --type alipay\",\n \"build:tt\": \"taro build --type tt\",\n \"build:h5\": \"taro build --type h5\",\n \"build:rn\": \"taro build --type rn\",\n \"build:qq\": \"taro build --type qq\",\n \"build:jd\": \"taro build --type jd\",\n \"build:harmony-hybrid\": \"taro build --type harmony-hybrid\",\n \"dev:weapp\": \"npm run build:weapp -- --watch\",\n \"dev:swan\": \"npm run build:swan -- --watch\",\n \"dev:alipay\": \"npm run build:alipay -- --watch\",\n \"dev:tt\": \"npm run build:tt -- --watch\",\n \"dev:h5\": \"npm run build:h5 -- --watch\",\n \"dev:rn\": \"npm run build:rn -- --watch\",\n \"dev:qq\": \"npm run build:qq -- --watch\",\n \"dev:jd\": \"npm run build:jd -- --watch\",\n \"dev:harmony-hybrid\": \"npm run build:harmony-hybrid -- --watch\"\n },\n \"browserslist\": {\n \"development\": [\n \"defaults and fully supports es6-module\",\n \"maintained node versions\"\n ],\n \"production\": [\n \"last 3 versions\",\n \"Android >= 4.1\",\n \"ios >= 8\"\n ]\n },\n \"author\": \"\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.24.4\",\n \"@tarojs/components\": \"4.1.9\",\n \"@tarojs/helper\": \"4.1.9\",\n \"@tarojs/plugin-platform-weapp\": \"4.1.9\",\n \"@tarojs/plugin-platform-alipay\": \"4.1.9\",\n \"@tarojs/plugin-platform-tt\": \"4.1.9\",\n \"@tarojs/plugin-platform-swan\": \"4.1.9\",\n \"@tarojs/plugin-platform-jd\": \"4.1.9\",\n \"@tarojs/plugin-platform-qq\": \"4.1.9\",\n \"@tarojs/plugin-platform-h5\": \"4.1.9\",\n \"@tarojs/plugin-platform-harmony-hybrid\": \"4.1.9\",\n \"@tarojs/runtime\": \"4.1.9\",\n \"@tarojs/shared\": \"4.1.9\",\n \"@tarojs/taro\": \"4.1.9\",\n \"@tarojs/plugin-framework-react\": \"4.1.9\",\n \"@tarojs/react\": \"4.1.9\",\n \"react-dom\": \"^18.0.0\",\n \"react\": \"^18.0.0\",\n \"brickd-mobile\": \"^0.0.53\",\n \"@taroify/icons\": \"^0.9.0\",\n \"@types/crypto-js\": \"^4.2.2\",\n \"crypto-js\": \"^4.2.0\"\n },\n \"devDependencies\": {\n \"@tarojs/plugin-generator\": \"4.1.9\",\n \"@commitlint/cli\": \"^19.8.1\",\n \"@commitlint/config-conventional\": \"^19.8.1\",\n \"lint-staged\": \"^16.1.2\",\n \"husky\": \"^9.1.7\",\n \"stylelint-config-standard\": \"^38.0.0\",\n \"@babel/core\": \"^7.24.4\",\n \"@tarojs/cli\": \"4.1.9\",\n \"@babel/plugin-transform-class-properties\": \"7.25.9\",\n \"@types/webpack-env\": \"^1.13.6\",\n \"@types/react\": \"^18.0.0\",\n \"webpack\": \"5.91.0\",\n \"@tarojs/taro-loader\": \"4.1.9\",\n \"@tarojs/webpack5-runner\": \"4.1.9\",\n \"less\": \"^4.2.0\",\n \"babel-preset-taro\": \"4.1.9\",\n \"eslint-config-taro\": \"4.1.9\",\n \"eslint\": \"^8.57.0\",\n \"@pmmmwh/react-refresh-webpack-plugin\": \"^0.5.5\",\n \"react-refresh\": \"^0.14.0\",\n \"@babel/preset-react\": \"^7.24.1\",\n \"eslint-plugin-react\": \"^7.34.1\",\n \"eslint-plugin-react-hooks\": \"^4.4.0\",\n \"stylelint\": \"^16.4.0\",\n \"typescript\": \"^5.4.5\",\n \"tsconfig-paths-webpack-plugin\": \"^4.1.0\",\n \"postcss\": \"^8.5.6\",\n \"@types/node\": \"^18\",\n \"@types/minimatch\": \"^5\"\n }\n}\n"
5836
+ "content": "{\n \"name\": \"checkCom\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"description\": \"\",\n \"templateInfo\": {\n \"name\": \"default\",\n \"typescript\": true,\n \"css\": \"Less\",\n \"framework\": \"React\"\n },\n \"scripts\": {\n \"prepare\": \"husky\",\n \"new\": \"taro new\",\n \"build:weapp\": \"taro build --type weapp\",\n \"build:swan\": \"taro build --type swan\",\n \"build:alipay\": \"taro build --type alipay\",\n \"build:tt\": \"taro build --type tt\",\n \"build:h5\": \"taro build --type h5\",\n \"build:rn\": \"taro build --type rn\",\n \"build:qq\": \"taro build --type qq\",\n \"build:jd\": \"taro build --type jd\",\n \"build:harmony-hybrid\": \"taro build --type harmony-hybrid\",\n \"dev:weapp\": \"npm run build:weapp -- --watch\",\n \"dev:swan\": \"npm run build:swan -- --watch\",\n \"dev:alipay\": \"npm run build:alipay -- --watch\",\n \"dev:tt\": \"npm run build:tt -- --watch\",\n \"dev:h5\": \"npm run build:h5 -- --watch\",\n \"dev:rn\": \"npm run build:rn -- --watch\",\n \"dev:qq\": \"npm run build:qq -- --watch\",\n \"dev:jd\": \"npm run build:jd -- --watch\",\n \"dev:harmony-hybrid\": \"npm run build:harmony-hybrid -- --watch\"\n },\n \"browserslist\": {\n \"development\": [\n \"defaults and fully supports es6-module\",\n \"maintained node versions\"\n ],\n \"production\": [\n \"last 3 versions\",\n \"Android >= 4.1\",\n \"ios >= 8\"\n ]\n },\n \"author\": \"\",\n \"dependencies\": {\n \"@babel/runtime\": \"^7.24.4\",\n \"@tarojs/components\": \"4.1.9\",\n \"@tarojs/helper\": \"4.1.9\",\n \"@tarojs/plugin-platform-weapp\": \"4.1.9\",\n \"@tarojs/plugin-platform-alipay\": \"4.1.9\",\n \"@tarojs/plugin-platform-tt\": \"4.1.9\",\n \"@tarojs/plugin-platform-swan\": \"4.1.9\",\n \"@tarojs/plugin-platform-jd\": \"4.1.9\",\n \"@tarojs/plugin-platform-qq\": \"4.1.9\",\n \"@tarojs/plugin-platform-h5\": \"4.1.9\",\n \"@tarojs/plugin-platform-harmony-hybrid\": \"4.1.9\",\n \"@tarojs/runtime\": \"4.1.9\",\n \"@tarojs/shared\": \"4.1.9\",\n \"@tarojs/taro\": \"4.1.9\",\n \"@tarojs/plugin-framework-react\": \"4.1.9\",\n \"@tarojs/react\": \"4.1.9\",\n \"react-dom\": \"^18.0.0\",\n \"react\": \"^18.0.0\",\n \"brickd-mobile\": \"^0.0.53\",\n \"@taroify/icons\": \"^0.9.0\",\n \"@types/crypto-js\": \"^4.2.2\",\n \"crypto-js\": \"^4.2.0\",\n \"@antv/f2\": \"3.8.12\",\n \"qrcode-generator\": \"^2.0.4\"\n },\n \"devDependencies\": {\n \"@tarojs/plugin-generator\": \"4.1.9\",\n \"@commitlint/cli\": \"^19.8.1\",\n \"@commitlint/config-conventional\": \"^19.8.1\",\n \"lint-staged\": \"^16.1.2\",\n \"husky\": \"^9.1.7\",\n \"stylelint-config-standard\": \"^38.0.0\",\n \"@babel/core\": \"^7.24.4\",\n \"@tarojs/cli\": \"4.1.9\",\n \"@babel/plugin-transform-class-properties\": \"7.25.9\",\n \"@types/webpack-env\": \"^1.13.6\",\n \"@types/react\": \"^18.0.0\",\n \"webpack\": \"5.91.0\",\n \"@tarojs/taro-loader\": \"4.1.9\",\n \"@tarojs/webpack5-runner\": \"4.1.9\",\n \"less\": \"^4.2.0\",\n \"babel-preset-taro\": \"4.1.9\",\n \"eslint-config-taro\": \"4.1.9\",\n \"eslint\": \"^8.57.0\",\n \"@pmmmwh/react-refresh-webpack-plugin\": \"^0.5.5\",\n \"react-refresh\": \"^0.14.0\",\n \"@babel/preset-react\": \"^7.24.1\",\n \"eslint-plugin-react\": \"^7.34.1\",\n \"eslint-plugin-react-hooks\": \"^4.4.0\",\n \"stylelint\": \"^16.4.0\",\n \"typescript\": \"^5.4.5\",\n \"tsconfig-paths-webpack-plugin\": \"^4.1.0\",\n \"postcss\": \"^8.5.6\",\n \"@types/node\": \"^18\",\n \"@types/minimatch\": \"^5\"\n }\n}\n"
5537
5837
  },
5538
5838
  {
5539
5839
  "path": "project.config.json",