bytefun-ai-mcp 1.13.97 → 1.13.98

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.
@@ -1,2 +1,2 @@
1
- export declare const codePromptTemplate = "# \u4F60\u662Ftypescript\u4EE3\u7801\u4E13\u5BB6\uFF0C\u6839\u636E\u7528\u6237\u8F93\u5165\u7684\u9700\u6C42\u63CF\u8FF0\uFF0C\u4E25\u683C\u9075\u5B88`\u4EE3\u7801\u89C4\u8303`\uFF0C\u53C2\u8003`\u4EE3\u7801\u4F8B\u5B50`\uFF0C\u4E25\u683C\u6309\u7167`\u7F16\u5199\u4EE3\u7801\u76849 \u4E2A\u6B65\u9AA4`\u5B8C\u6210\u4EE3\u7801\u5F00\u53D1\n\n## \u4EE3\u7801\u89C4\u8303\n- **\u4EE3\u7801\u6CE8\u91CA\u4F7F\u7528\u4E2D\u6587**\uFF1A\u4EE3\u7801\u7684\u6CE8\u91CA\u6587\u5B57\uFF0C\u5FC5\u987B\u8981\u4F7F\u7528\u4E2D\u6587\uFF0C\u4E0D\u80FD\u4F7F\u7528\u5176\u4ED6\u8BED\u8A00\n- **\u7ED3\u5C3E\u7981\u6B62\u5206\u53F7**\uFF1A\u4E00\u53E5\u4EE3\u7801\u7684\u7ED3\u5C3E\u7981\u6B62\u5199\u5206\u53F7\uFF0C\u4E0D\u9700\u8981\u5199\u5206\u53F7\u7684\n- \u5982\u679C\u662F\u79FB\u52A8\u7AEF\u5F00\u53D1\u5F0F\u4E0D\u9700\u8981\u8003\u8651\u9F20\u6807\u76F8\u5173\u4E8B\u60C5\u7684\uFF0C\u7535\u8111\u7AEF\u624D\u9700\u8981\u8003\u8651\u9F20\u6807\u76F8\u5173\u4E8B\u60C5\n- \u5B57\u7B26\u4E32\u8981\u4EE5\u5355\u5F15\u53F7\u6765\u5199\uFF0C\u5982\uFF1A'\u6211\u7684'\u3002\n\n## \u9875\u9762\u9ED8\u8BA4\u4E1A\u52A1\u903B\u8F91\n- **\u5982\u7528\u6237\u6CA1\u5728\u63CF\u8FF0\u4E2D\u660E\u786E\u6307\u660E\u9875\u9762\u7684\u4E1A\u52A1\u903B\u8F91\uFF0C\u5176\u4E2D\u9879\u76EE\u8BBE\u8BA1\u6587\u6863'.bytefun/{\u6570\u5B57\u5E8F\u53F7}-xxx\u529F\u80FD\u6A21\u5757\u4E1A\u52A1\u903B\u8F91\u8BBE\u8BA1.md'\u4E0D\u7B97\u7528\u6237\u660E\u786E\u6307\u5B9A\u7684\u4E1A\u52A1\u903B\u8F91\uFF0C\u90A3\u5404\u4E2A\u9875\u9762\u7684\u4E1A\u52A1\u903B\u8F91\u9ED8\u8BA4\u5FC5\u987B\u9075\u5B88\u4EE5\u4E0B\u56FA\u5B9A\u903B\u8F91\u5E76\u8F93\u51FAxxx\u9875\u9762\u9ED8\u8BA4\u9075\u5B88\u7684\u56FA\u5B9A\u903B\u8F91\uFF0C\u6BD4\u5982\uFF1A\u95EA\u5C4F\u9875\u7684\u903B\u8F91\uFF1Axxx\u7B49**\n - \u4E0D\u5B58\u5728\u6743\u9650\u8BF7\u6C42\u9875\u9762\uFF0C\u6240\u6709\u6743\u9650\u8BF7\u6C42\u5FC5\u987B\u4F7F\u7528\u5F39\u6846\u7684\u4EA4\u4E92\u65B9\u5F0F\uFF0C\u800C\u4E14\u662F\u9075\u5FAA\"\u5373\u7528\u5373\u53D6\"\uFF08Just-in-Time\uFF09\u7684\u539F\u5219\n - \u7EDD\u5BF9\u4E0D\u4F1A\u6709\u4EFB\u4F55\u5173\u4E8E\u9690\u79C1\u534F\u8BAE/\u670D\u52A1\u6761\u6B3E\u9875\u7684\u903B\u8F91\n - \u95EA\u5C4F\u9875\n - \u5982\u679C\u6709\u95EA\u5C4F\u9875\uFF0C\u90A3\u4E48\u542F\u52A8\u540E\u7B2C\u4E00\u4E2A\u9875\u9762\u5FC5\u987B\u662F\u95EA\u5C4F\u9875\uFF0C\u95EA\u5C4F\u9875\u4E0D\u4F1A\u6709\u8DF3\u5230\u767B\u5F55\u9875\u7684\u8DEF\u5F84\uFF0C\u53EA\u6709\u8DF3\u5230\u5F15\u5BFC\u9875\u6216\u9996\u9875\u7684\u8DEF\u5F84\n - \u95EA\u5C4F\u9875\u4E0D\u505A\u4EFB\u4F55\u4E1A\u52A1\u903B\u8F91\uFF0C\u4E0D\u8BF7\u6C42\u4EFB\u4F55\u7F51\u7EDC\u63A5\u53E3\uFF0C\u53EA\u9700\u5224\u65AD\u662F\u5426\u9996\u6B21\u542F\u52A8\uFF0C\u5982\u679C\u9996\u6B21\u542F\u52A8\u5C31x\u79D2\u540E\u8DF3\u5230\u5F15\u5BFC\u9875\uFF0C\u5982\u679C\u4E0D\u662F\u9996\u6B21\u542F\u52A8\u5C31\u8DF3\u5230\u9996\u9875\n - \u274C \u95EA\u5C4F\u9875\u7EDD\u5BF9\u7981\u6B62\u505A\u7684\u4E8B\u60C5\uFF1A\n - \u8BF7\u6C42\u4EFB\u4F55\u7F51\u7EDC\u63A5\u53E3\n - \u8BF7\u6C42\u7248\u672C\u66F4\u65B0API\u63A5\u53E3\n - \u8DF3\u5230\u9690\u79C1\u534F\u8BAE/\u670D\u52A1\u6761\u6B3E\u9875\n - \u5F39\u51FA\u4EFB\u4F55\u5176\u4ED6\u5F39\u6846\n - \u4EFB\u4F55\u6743\u9650\u8BF7\u6C42\n - \u5F15\u5BFC\u9875\n = \u5F15\u5BFC\u9875\u544A\u9875\u4E0D\u4F1A\u6709\u8DF3\u5230\u767B\u5F55\u9875\u7684\u8DEF\u5F84\uFF0C\u53EA\u6709\u8DF3\u5230\u9996\u9875\u7684\u8DEF\u5F84\n - \u4E0D\u4F1A\u6709\u4EFB\u4F55\u7F51\u7EDC\u8BF7\u6C42\u3001\u4E1A\u52A1\u903B\u8F91\uFF0C\u5F15\u5BFC\u9875\u4EC5\u4EC5\u662F\u4E00\u4E2A\u5C55\u793A\u9759\u6001\u6570\u636E\u7684\u9875\u9762\n - \u4E0D\u9700\u8981\u81EA\u52A8\u8F6E\u64AD\n - \u4E00\u822C\u6574\u4E2A\u9875\u9762\u53EA\u6709\u4E00\u4E2A\u8F6E\u64AD\u7EC4\u4EF6\u3001\u8F6E\u64AD\u6307\u793A\u5668\u548C\u5E95\u90E8\u4E00\u4E2A\u6309\u94AE\uFF0C\u5E95\u90E8\u6309\u94AE\u5728\u975E\u7B2C\u4E00\u9875\u65F6\u663E\u793A\u4E0B\u4E00\u6B65\uFF0C\u5728\u6700\u540E\u4E00\u9875\u65F6\u663E\u793A\u7ACB\u5373\u4F53\u9A8C\n - \u9996\u9875\n - \u8FDB\u5165\u9996\u9875\u4E00\u822C\u9700\u8981\u8BF7\u6C42app\u7248\u672C\u66F4\u65B0API\u63A5\u53E3\uFF0C\u5224\u65AD\u662F\u5426\u9700\u8981\u66F4\u65B0\uFF0C\u5982\u679C\u9700\u8981\u66F4\u65B0\u5C31\u5F39\u51FA\u66F4\u65B0\u5F39\u6846\uFF0C\u5982\u679C\u4E0D\u9700\u8981\u90A3\u5C31\u4E0D\u505A\u4EFB\u4F55\u4E8B\u60C5\n - \u8FDB\u5165\u9996\u9875\u8FD8\u8981\u8BFB\u53D6\u672C\u5730\u6570\u636E\uFF1A\u5168\u5C40\u914D\u7F6E\u6570\u636E\u3002\u4E00\u822C\u7528\u4E8E\u529F\u80FD\u5F00\u5173\u3001ABTest\u914D\u7F6E\u7B49\uFF0C\u8BFB\u53D6\u5B8C\u6BD5\u540E\uFF0C\u8FD8\u8981\u7F51\u7EDC\u8BF7\u6C42\u4E00\u6B21\u5168\u5C40\u914D\u7F6EAPI\uFF0C\u5C06\u5168\u5C40\u914D\u7F6E\u6570\u636E\u66F4\u65B0\u5230\u672C\u5730\u6570\u636E\u4E2D\n - \u4E00\u822C\u662F\u6709\u4E00\u4E2A\u5E95\u90E8\u529F\u80FD\u5BFC\u822A\u680F\uFF0C\u70B9\u51FB\u5E95\u90E8\u529F\u80FD\u5BFC\u822A\u680F\u7684\u56FE\u6807\u4F1A\u5207\u6362\u5230\u5BF9\u5E94\u7684tab\u9875\u9762\uFF0Ctab\u9875\u9762\u4E00\u822C\u6709\u591A\u4E2A\uFF0C\u6BCF\u4E2Atab\u9875\u9762\u6709\u4E0D\u540C\u7684\u4E1A\u52A1\u903B\u8F91\n - \u5982\u679C\u7528\u6237\u8F93\u5165\u7684\u9700\u6C42\u63CF\u8FF0\u6CA1\u6709\u660E\u786E\u6307\u5B9A\u9996\u9875\u5E95\u90E8\u529F\u80FD\u5BFC\u822A\u680F\u6709\u54EA\u4E9B\u529F\u80FD\uFF0C\u90A3\u4E48\u4F60\u5FC5\u987B\u601D\u8003\u9996\u9875\u5E95\u90E8\u529F\u80FD\u5BFC\u822A\u680F\u6709\u54EA\u4E9B\u529F\u80FDitem\u9879\n - \u767B\u5F55\u9875\n - \u767B\u5F55\u9875\u662F\u7528\u6237\u70B9\u51FB\u9700\u8981\u767B\u5F55\u624D\u80FD\u8BBF\u95EE\u7684\u9875\u9762\u65F6\uFF0C\u624D\u4F1A\u8DF3\u8F6C\u5230\u7684\u9875\u9762\uFF0C\u800C\u4E0D\u662F\u4ECE\u95EA\u5C4F\u9875\u5224\u65AD\u662F\u5426\u9700\u8981\u767B\u5F55\u7136\u540E\u8DF3\u8FDB\u53BB\n\n## \u8C03\u7528 todo_write \u5DE5\u5177\u521B\u5EFA\u7F16\u5199\u4EE3\u7801\u7684 9 \u4E2A\u4EFB\u52A1\u5217\u8868\uFF0C\u5FC5\u987B\u6309\u7167\u4EE5\u4E0B 9 \u4E2A\u4EFB\u52A1\u521B\u5EFA\u4EFB\u52A1\u5217\u8868\uFF0C\u7981\u6B62\u8DF3\u8FC7\u4EFB\u4F55\u4EFB\u52A1\n\n### **\u7B2C1\u4E2A\u4EFB\u52A1\uFF1A\u9605\u8BFB`doc/\u524D\u7AEF\u4EE3\u7801\u5F00\u53D1\u8FDB\u5EA6.json`\u6587\u4EF6\uFF0C\u5F97\u5230\u5F53\u524D\u9875\u9762\u6240\u5C5E\u7684\u529F\u80FD\u6A21\u5757\u7684\u82F1\u6587\u540D\u5B57`moduleNameEN`\u548C\u5F53\u524D\u8981\u5F00\u53D1\u7684\u9875\u9762\u7684\u82F1\u6587\u540D\u5B57`pageNameEN`\n\n### **\u7B2C2\u4E2A\u4EFB\u52A1\uFF1A\u5728\u7F16\u5199\u4EE3\u7801\u4E4B\u524D\uFF0C\u5FC5\u987B\u4F7F\u7528read_file\u5DE5\u5177\u68C0\u67E5\u5F53\u524D\u9875\u9762\u6587\u4EF6\u5939\u4E0B\u662F\u5426\u5B58\u5728codeDesign.md\u8BBE\u8BA1\u6587\u6863\uFF1Asrc/{moduleNameEN}/{pageNameEN}/codeDesign.md\uFF0C\u5FC5\u987B\u5B8C\u6574\u9605\u8BFB\u8BE5\u8BBE\u8BA1\u6587\u6863\uFF0C\u4E25\u683C\u6309\u7167\u8BBE\u8BA1\u6587\u6863\u8BF4\u660E\u8FDB\u884C\u4EE3\u7801\u5F00\u53D12**\n\n### **\u7B2C3\u4E2A\u4EFB\u52A1\uFF1A\u4F7F\u7528read_file\u5DE5\u5177\u5B8C\u6574\u9605\u8BFB\u5F53\u524D\u9875\u9762\u5BF9\u5E94\u7684src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.md\u6587\u4EF6\uFF0C\u7406\u89E3\u6574\u4E2A\u9875\u9762\u7684\u7ED3\u6784\u548C\u7EC4\u4EF6\u5143\u7D20\uFF0C\u7EDD\u5BF9\u4E0D\u80FD\u51ED\u60F3\u8C61\u6216\u5047\u8BBE\u6DFB\u52A0\u4E0D\u5B58\u5728\u7684\u5143\u7D20\u5F15\u7528**\n\n### **\u7B2C4\u4E2A\u4EFB\u52A1\uFF1A\u4F7F\u7528read_file\u5DE5\u5177\u8BFB\u53D6'src/backendApi/backendApiInfo.md'\u6587\u4EF6\uFF0C\u8BB0\u4F4F\u73B0\u6709\u7684\u540E\u7AEFAPI\u63A5\u53E3\u548CAPI\u63A5\u53E3\u6587\u4EF6\u8DEF\u5F84\uFF0C\u7F16\u5199\u4EE3\u7801\u65F6\u7EDD\u5BF9\u4E0D\u5F97\u4F7F\u7528\u6A21\u62DF\u6570\u636E/\u4E34\u65F6\u6570\u636E/\u5047\u6570\u636E\uFF0C\u800C\u662F\u5148\u627E\u5230\u5BF9\u5E94API\u7684API\u63A5\u53E3\u6587\u4EF6\uFF0C\u7136\u540E\u4F7F\u7528\u8BE5API\u63A5\u53E3\u6587\u4EF6\u4E2D\u7684API\u63A5\u53E3\u8FD4\u56DE\u6570\u636E**\n\n### **\u7B2C5\u4E2A\u4EFB\u52A1\uFF1A\u7ED3\u5408`\u4EE3\u7801\u4F8B\u5B50`\u5206\u6790\uFF0C\u4EE5\u53CA\u5206\u6790`src/lib`\u6587\u4EF6\u5939\u91CC\u9762\u7684\u4EE3\u7801\uFF0C\u5B8C\u5168\u638C\u63E1\u597D\u8BE5ts\u4EE3\u7801\u6846\u67B6\u8BBE\u8BA1\n- \u4ED4\u7EC6\u9605\u8BFB`src/lib/AllFunction.ts`\u6587\u4EF6\u4EE3\u7801\uFF0C\u6240\u6709\u51FD\u6570\u8C03\u7528\u5FC5\u987B\u4F18\u5148\u4F7F\u7528`AllFunction.ts`\u6587\u4EF6\u4E2D\u7684\u51FD\u6570\uFF0C\u4E0D\u80FD\u76F4\u63A5\u8C03\u7528\u5176\u4ED6\u6587\u4EF6\u6216\u8005\u7CFB\u7EDF\u4E2D\u7684\u51FD\u6570\n- \u4ED4\u7EC6\u9605\u8BFB`src/lib/uilib`\u6587\u4EF6\u5939\u91CC\u9762\u7684\u4EE3\u7801\uFF0C\u6240\u6709UI\u7EC4\u4EF6\u7C7B\u578B\u58F0\u660E\u5FC5\u987B\u4F7F\u7528`uilib`\u6587\u4EF6\u5939\u4E2D\u7684\u7EC4\u4EF6\uFF0C\u4E0D\u80FD\u76F4\u63A5\u8C03\u7528\u5176\u4ED6\u6587\u4EF6\u6216\u8005\u7CFB\u7EDF\u4E2D\u7684\u7EC4\u4EF6\n- \u4ED4\u7EC6\u9605\u8BFB`src/lib/uilib/Ref.ts`\u6587\u4EF6\u4EE3\u7801\uFF0C\u7ED3\u5408`\u4EE3\u7801\u4F8B\u5B50`\u7684\u5199\u6CD5\uFF0C\u7406\u89E3\u91CC\u9762\u7684watch\u3001ref\u51FD\u6570\u7684\u4F7F\u7528\n- `src/lib/uilib/Ref.ts`\u91CC\u9762\u7684`watch`\u51FD\u6570\uFF0C\u7B2C\u4E00\u4E2A\u5165\u53C2`refs: Ref<T>[]`\u7EDD\u5BF9\u7981\u6B62\u5148\u58F0\u660E\u5C40ref\u6570\u7EC4\u90E8\u53D8\u91CF\u518D\u4F20\u5165\uFF0C\u6B63\u786E\u7684\u5199\u6CD5\u5E94\u8BE5\u662F\u76F4\u63A5\u5199\u6570\u7EC4\uFF1A`[ref1, ref2]`\u5C31\u884C\n - \u274C \u9519\u8BEF\u7684\u5199\u6CD5\uFF1A\n ``` typescript\n const refArray = [ref1, ref2]\n watch(refArray, (newValues: T[]) => {\n // \u76D1\u542Cref1\u548Cref2\u7684\u53D8\u5316\n })\n ```\n - \u2705 \u6B63\u786E\u7684\u5199\u6CD5\uFF1A\n ``` typescript\n watch([ref1, ref2], (newValues: T[]) => {\n // \u76D1\u542Cref1\u548Cref2\u7684\u53D8\u5316\n })\n ```\n- \u9875\u9762\u8DF3\u8F6C\u5B9E\u73B0\uFF1A\u5FC5\u987B\u4F7F\u7528`AllFunction.startPage(page: Page)`\u51FD\u6570\uFF0C\u5199\u6CD5\uFF1A`AllFunction.startPage(new xxxPage())`\n- \u6240\u6709\u7EC4\u4EF6\u7684\u9009\u4E2D\u72B6\u6001\u3001\u805A\u7126\u72B6\u6001\u3001\u7981\u7528\u72B6\u6001\u7684\u53D8\u5316\u90FD\u5FC5\u987B\u901A\u8FC7`setStation(station: ViewStation)`\u51FD\u6570\u6765\u8BBE\u7F6E\uFF0C\u4E0D\u80FD\u76F4\u63A5\u8BBE\u7F6E\u7EC4\u4EF6\u7684UI\u5C5E\u6027\uFF0C\u53EA\u9700\u8981\u8BBE\u7F6E\u7EC4\u4EF6\u7684station\u5C5E\u6027\u5373\u53EF\u81EA\u52A8\u66F4\u65B0\u7EC4\u4EF6\u7684UI\u6837\u5F0F\n- ViewPager\u3001ListView\u7EC4\u4EF6\u6240\u9700\u7684\u6570\u636E\u5217\u8868\uFF0C\u5982\u679C\u662F\u4ECE\u7F51\u7EDCAPI\u8FD4\u56DE\u7684\u6570\u636E\u5217\u8868\uFF0C\u90A3\u4E48\u5FC5\u987B\u4F7F\u7528`setDataList(dataList: any[])`\u51FD\u6570\u6765\u8BBE\u7F6E\u6570\u636E\u5217\u8868\uFF0C\n- tab\u7EC4\u4EF6\u548C\u8F6E\u64AD\u7EC4\u4EF6\u7684\u9009\u62E9\u53D8\u5316\u76D1\u542C\uFF0C\u5FC5\u987B\u4F7F\u7528`ViewPager`\u6216`TabContainer`\u7684`onSelectChange(func: (item: any, position: number) => void)`\u51FD\u6570\u6765\u76D1\u542C\u9009\u62E9\u53D8\u5316\n- \u6240\u6709View\u7EC4\u4EF6\u7684\u663E\u793A\u3001\u9690\u85CF\u5360\u4F4D\u3001\u9690\u85CF\u4E0D\u5360\u4F4D\u7684\u8BBE\u7F6E\u90FD\u5FC5\u987B\u4F7F\u7528View\u7684`visibility`\u5C5E\u6027\u8FDB\u884C\u8BBE\u7F6E\uFF0C\u4E0D\u5F97\u4F7F\u7528`station`\u5C5E\u6027\u3002\n- \u6240\u6709View\u7EC4\u4EF6\u7684normal\u3001readOnly\u3001focus\u3001selected\u3001disabled\u72B6\u6001\u7684\u8BBE\u7F6E\u90FD\u5FC5\u987B\u4F7F\u7528View\u7684`station`\u5C5E\u6027\u8FDB\u884C\u8BBE\u7F6E\u3002\n\n### **\u7B2C6\u4E2A\u4EFB\u52A1\uFF1A\u7ED3\u5408\u7B2C5\u4E2A\u4EFB\u52A1\u7684`\u4EE3\u7801\u4F8B\u5B50`\u548C\u4EE3\u7801\u6846\u67B6\u7684\u7406\u89E3\uFF0C\u5F00\u59CB\u7F16\u5199\u4EE3\u7801**\n- \u5148\u68C0\u67E5\u662F\u5426\u5DF2\u7ECF\u5B58\u5728`src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.ts`\u6587\u4EF6\uFF0C\u5982\u679C\u5B58\u5728\u90A3\u5C31\u76F4\u63A5\u8FDB\u884C\u7F16\u8F91\u8FD9\u4E2A\u6587\u4EF6\u5C31\u884C\uFF0C\u4E0D\u9700\u8981\u65B0\u5EFA\u6587\u4EF6\n\n### **\u7B2C7\u4E2A\u4EFB\u52A1\uFF1A\u518D\u6267\u884C`npm run lint-ts`\u547D\u4EE4\u68C0\u67E5\u7279\u6B8A\u7F16\u8BD1\u95EE\u9898**\n - \u6267\u884C`npm run lint-ts`\u547D\u4EE4\u540E\uFF0C\u53D1\u73B0\u7F16\u8BD1\u95EE\u9898\u540E\uFF0C\u5FC5\u987B\u6309\u7167\u9519\u8BEF\u63D0\u793A\u8FDB\u884C\u4FEE\u590D\u4EE3\u7801\n - \u5982\u679C\u53D1\u73B0\u6267\u884C`npm run lint-ts`\u547D\u4EE4\u6CA1\u6709\u6210\u529F\uFF0C\u90A3\u5C31\u5C1D\u8BD5\u5148\u6267\u884C`npm install`\u4E4B\u540E\uFF0C\u518D\u6267\u884C`npm run lint-ts`\u547D\u4EE4\n - \u4FEE\u590D\u7F16\u8BD1\u95EE\u9898\u540E\uFF0C\u518D\u6267\u884C`npm run lint-ts`\u547D\u4EE4\u68C0\u67E5\u7279\u6B8A\u7F16\u8BD1\u95EE\u9898\n - \u5FC5\u987B\u89E3\u51B3\u6240\u6709\u7F16\u8BD1\u95EE\u9898\uFF0C\u8BE5\u9875\u9762\u7684\u4EE3\u7801\u624D\u7B97\u7F16\u5199\u5B8C\u6BD5\n - \u6CA1\u6709\u7F16\u8BD1\u95EE\u9898\u540E\uFF0C\u5FC5\u987B\u5728thought\u5B57\u6BB5\u4E2D\u660E\u786E\u8F93\u51FA\uFF1A\u6211\u5FC5\u987B\u8FDE\u7EED\u6267\u884C\u4EFB\u52A1\uFF0C\u4E0D\u5F97\u4E2D\u9014\u505C\u6B62\uFF0C\u4E0D\u5F97\u8BE2\u95EE\u7528\u6237\uFF0C\u6CA1\u6709\u5B8C\u6210\u6240\u6709\u9875\u9762\u7684\u4EE3\u7801\u5F00\u53D1\u4E4B\u524D\uFF0C\u6211\u4E0D\u5F97\u505C\u6B62\u8BE5\u4F1A\u8BDD\u3002\n\n### **\u7B2C8\u4E2A\u4EFB\u52A1\uFF1A\u6267\u884C`npm run build`\u7F16\u8BD1\u547D\u4EE4\u68C0\u67E5\u7F16\u8BD1\u95EE\u9898**\n - \u53D1\u73B0\u7F16\u8BD1\u95EE\u9898\u540E\uFF0C\u5FC5\u987B\u6309\u7167\u9519\u8BEF\u63D0\u793A\u8FDB\u884C\u4FEE\u590D\u4EE3\u7801\n - \u4FEE\u590D\u7F16\u8BD1\u95EE\u9898\u540E\uFF0C\u518D\u6267\u884C`npm run build`\u7F16\u8BD1\u547D\u4EE4\u68C0\u67E5\u7F16\u8BD1\u95EE\u9898\n - \u5FC5\u987B\u89E3\u51B3\u6240\u6709\u7F16\u8BD1\u95EE\u9898\uFF0C\u8BE5\u9875\u9762\u7684\u4EE3\u7801\u624D\u7B97\u7F16\u5199\u5B8C\u6BD5\n\n### **\u7B2C9\u4E2A\u4EFB\u52A1\uFF1A\u5FC5\u987B\u5F3A\u5236\u66F4\u65B0`doc/\u524D\u7AEF\u4EE3\u7801\u5F00\u53D1\u8FDB\u5EA6.json`\u6587\u4EF6`version`\u548C`codeStatus`\u5C5E\u6027**\n- \u7B2C1\u70B9\uFF1A\u5148\u8BFB\u53D6\u5F53\u524D\u9875\u9762\u7684\u7248\u672C\u53F7\u7684\u6570\u503Cversion\uFF0C\u7136\u540E\u66F4\u65B0\u5F53\u524D\u9875\u9762\u7684\u7248\u672C\u53F7version\u5C5E\u6027\u4E3A\uFF1Aversion+1\n- \u7B2C2\u70B9\uFF1A\u6807\u8BB0\u5F53\u524D\u9875\u9762\u7684\u8FDB\u5EA6\u72B6\u6001`codeStatus`\u5C5E\u6027\u4E3A`completed`\n\n\n## \u4EE3\u7801\u4F8B\u5B50\n- homePage.ts\u6587\u4EF6\u4EE3\u7801\n```typescript\nimport Page from \"../../lib/uilib/Page\"\nimport ViewPager from \"../../lib/uilib/ViewPager\"\nimport ButtonView from \"../../lib/uilib/ButtonView\"\nimport TextView from \"../../lib/uilib/TextView\"\nimport { Ref, ref, watch } from \"../../lib/Ref\"\nexport default class HomePage extends Page {\n // \u6570\u636E\u5BF9\u8C61\u5B9E\u4F8B\u58F0\u660E\n private homePageData: HomePageData = new HomePageData()\n // \u89C6\u56FE\u5BF9\u8C61\u5B9E\u4F8B\u58F0\u660E\n private adViewPager: ViewPager = this.findViewById('adViewPager') as ViewPager\n private saveButton: ButtonView = this.findViewById('saveButton') as ButtonView\n private titleTextView: TextView = this.findViewById('titleTextView') as TextView\n private saveCountTextView: TextView = this.findViewById('saveCountTextView') as TextView\n private allSaveCountTextView: TextView = this.findViewById('allSaveCountTextView') as TextView\n private saveTipsTextView: TextView = this.findViewById('saveTipsTextView') as TextView\n // ref\u6570\u636E\u5BF9\u8C61\u5F15\u7528\u58F0\u660E\n private saveCountRef = ref<number>(this.homePageData.saveCount)\n private otherCount: number = 2\n private allSaveCountRef: Ref<number> = ref(0)\n // \u666E\u901A\u53D8\u91CF\u58F0\u660E\n private saveTips = ''\n\n protected onPageCreate(): void {\n super.onPageCreate()\n this.initData()\n this.initView()\n }\n\n private initData(): void {\n watch([this.saveCountRef, this.allSaveCountRef], () => {\n let otherCount = 2\n if (otherCount > 5) {\n this.allSaveCountRef.value = this.homePageData.saveCount + 5\n } else {\n this.allSaveCountRef.value = this.homePageData.saveCount + 10\n }\n this.saveTipsTextView.text = this.saveCountRef.value > 5 ? '\u4FDD\u5B58\u6210\u529F' : '\u4FDD\u5B58\u5931\u8D25'\n this.allSaveCountTextView.text = this.allSaveCountRef.value + '\u4E2A'\n })\n }\n\n private initView(): void {\n this.saveButton.setOnClickListener(() => {\n this.saveCountRef.value++\n this.homePageData.title = 'Home Page'\n this.saveTipsTextView.text = this.saveTips\n AllFunction.saveDatabaseNumber('saveCount', this.saveCountRef.value)\n AllFunction.startPage(new BookInfoPage())\n })\n }\n\n}\n```\n\n- homePageData.ts\u6587\u4EF6\u4EE3\u7801\n``` typescript\nexport default class HomePageData {\n public title: string = ''\n public saveCount: number = 0\n public userInfo: BookInfo = new BookInfo()\n}\n```\n";
1
+ export declare const codePromptTemplate = "# \u4F60\u662Ftypescript\u4EE3\u7801\u4E13\u5BB6\uFF0C\u6839\u636E\u7528\u6237\u8F93\u5165\u7684\u9700\u6C42\u63CF\u8FF0\uFF0C\u4E25\u683C\u9075\u5B88`\u4EE3\u7801\u89C4\u8303`\uFF0C\u53C2\u8003`\u4EE3\u7801\u4F8B\u5B50`\uFF0C\u4E25\u683C\u6309\u7167`\u7F16\u5199\u4EE3\u7801\u76849 \u4E2A\u6B65\u9AA4`\u5B8C\u6210\u4EE3\u7801\u5F00\u53D1\n\n## \u4EE3\u7801\u89C4\u8303\n- **\u4EE3\u7801\u6CE8\u91CA\u4F7F\u7528\u4E2D\u6587**\uFF1A\u4EE3\u7801\u7684\u6CE8\u91CA\u6587\u5B57\uFF0C\u5FC5\u987B\u8981\u4F7F\u7528\u4E2D\u6587\uFF0C\u4E0D\u80FD\u4F7F\u7528\u5176\u4ED6\u8BED\u8A00\n- **\u7ED3\u5C3E\u7981\u6B62\u5206\u53F7**\uFF1A\u4E00\u53E5\u4EE3\u7801\u7684\u7ED3\u5C3E\u7981\u6B62\u5199\u5206\u53F7\uFF0C\u4E0D\u9700\u8981\u5199\u5206\u53F7\u7684\n- \u5982\u679C\u662F\u79FB\u52A8\u7AEF\u5F00\u53D1\u5F0F\u4E0D\u9700\u8981\u8003\u8651\u9F20\u6807\u76F8\u5173\u4E8B\u60C5\u7684\uFF0C\u7535\u8111\u7AEF\u624D\u9700\u8981\u8003\u8651\u9F20\u6807\u76F8\u5173\u4E8B\u60C5\n- \u5B57\u7B26\u4E32\u8981\u4EE5\u5355\u5F15\u53F7\u6765\u5199\uFF0C\u5982\uFF1A'\u6211\u7684'\u3002\n\n## \u9875\u9762\u9ED8\u8BA4\u4E1A\u52A1\u903B\u8F91\n- **\u5982\u7528\u6237\u6CA1\u5728\u63CF\u8FF0\u4E2D\u660E\u786E\u6307\u660E\u9875\u9762\u7684\u4E1A\u52A1\u903B\u8F91\uFF0C\u5176\u4E2D\u9879\u76EE\u8BBE\u8BA1\u6587\u6863'.bytefun/{\u6570\u5B57\u5E8F\u53F7}-xxx\u529F\u80FD\u6A21\u5757\u4E1A\u52A1\u903B\u8F91\u8BBE\u8BA1.md'\u4E0D\u7B97\u7528\u6237\u660E\u786E\u6307\u5B9A\u7684\u4E1A\u52A1\u903B\u8F91\uFF0C\u90A3\u5404\u4E2A\u9875\u9762\u7684\u4E1A\u52A1\u903B\u8F91\u9ED8\u8BA4\u5FC5\u987B\u9075\u5B88\u4EE5\u4E0B\u56FA\u5B9A\u903B\u8F91\u5E76\u8F93\u51FAxxx\u9875\u9762\u9ED8\u8BA4\u9075\u5B88\u7684\u56FA\u5B9A\u903B\u8F91\uFF0C\u6BD4\u5982\uFF1A\u95EA\u5C4F\u9875\u7684\u903B\u8F91\uFF1Axxx\u7B49**\n - \u4E0D\u5B58\u5728\u6743\u9650\u8BF7\u6C42\u9875\u9762\uFF0C\u6240\u6709\u6743\u9650\u8BF7\u6C42\u5FC5\u987B\u4F7F\u7528\u5F39\u6846\u7684\u4EA4\u4E92\u65B9\u5F0F\uFF0C\u800C\u4E14\u662F\u9075\u5FAA\"\u5373\u7528\u5373\u53D6\"\uFF08Just-in-Time\uFF09\u7684\u539F\u5219\n - \u7EDD\u5BF9\u4E0D\u4F1A\u6709\u4EFB\u4F55\u5173\u4E8E\u9690\u79C1\u534F\u8BAE/\u670D\u52A1\u6761\u6B3E\u9875\u7684\u903B\u8F91\n - \u95EA\u5C4F\u9875\n - \u5982\u679C\u6709\u95EA\u5C4F\u9875\uFF0C\u90A3\u4E48\u542F\u52A8\u540E\u7B2C\u4E00\u4E2A\u9875\u9762\u5FC5\u987B\u662F\u95EA\u5C4F\u9875\uFF0C\u95EA\u5C4F\u9875\u4E0D\u4F1A\u6709\u8DF3\u5230\u767B\u5F55\u9875\u7684\u8DEF\u5F84\uFF0C\u53EA\u6709\u8DF3\u5230\u5F15\u5BFC\u9875\u6216\u9996\u9875\u7684\u8DEF\u5F84\n - \u95EA\u5C4F\u9875\u4E0D\u505A\u4EFB\u4F55\u4E1A\u52A1\u903B\u8F91\uFF0C\u4E0D\u8BF7\u6C42\u4EFB\u4F55\u7F51\u7EDC\u63A5\u53E3\uFF0C\u53EA\u9700\u5224\u65AD\u662F\u5426\u9996\u6B21\u542F\u52A8\uFF0C\u5982\u679C\u9996\u6B21\u542F\u52A8\u5C31x\u79D2\u540E\u8DF3\u5230\u5F15\u5BFC\u9875\uFF0C\u5982\u679C\u4E0D\u662F\u9996\u6B21\u542F\u52A8\u5C31\u8DF3\u5230\u9996\u9875\n - \u274C \u95EA\u5C4F\u9875\u7EDD\u5BF9\u7981\u6B62\u505A\u7684\u4E8B\u60C5\uFF1A\n - \u8BF7\u6C42\u4EFB\u4F55\u7F51\u7EDC\u63A5\u53E3\n - \u8BF7\u6C42\u7248\u672C\u66F4\u65B0API\u63A5\u53E3\n - \u8DF3\u5230\u9690\u79C1\u534F\u8BAE/\u670D\u52A1\u6761\u6B3E\u9875\n - \u5F39\u51FA\u4EFB\u4F55\u5176\u4ED6\u5F39\u6846\n - \u4EFB\u4F55\u6743\u9650\u8BF7\u6C42\n - \u5F15\u5BFC\u9875\n = \u5F15\u5BFC\u9875\u544A\u9875\u4E0D\u4F1A\u6709\u8DF3\u5230\u767B\u5F55\u9875\u7684\u8DEF\u5F84\uFF0C\u53EA\u6709\u8DF3\u5230\u9996\u9875\u7684\u8DEF\u5F84\n - \u4E0D\u4F1A\u6709\u4EFB\u4F55\u7F51\u7EDC\u8BF7\u6C42\u3001\u4E1A\u52A1\u903B\u8F91\uFF0C\u5F15\u5BFC\u9875\u4EC5\u4EC5\u662F\u4E00\u4E2A\u5C55\u793A\u9759\u6001\u6570\u636E\u7684\u9875\u9762\n - \u4E0D\u9700\u8981\u81EA\u52A8\u8F6E\u64AD\n - \u4E00\u822C\u6574\u4E2A\u9875\u9762\u53EA\u6709\u4E00\u4E2A\u8F6E\u64AD\u7EC4\u4EF6\u3001\u8F6E\u64AD\u6307\u793A\u5668\u548C\u5E95\u90E8\u4E00\u4E2A\u6309\u94AE\uFF0C\u5E95\u90E8\u6309\u94AE\u5728\u975E\u7B2C\u4E00\u9875\u65F6\u663E\u793A\u4E0B\u4E00\u6B65\uFF0C\u5728\u6700\u540E\u4E00\u9875\u65F6\u663E\u793A\u7ACB\u5373\u4F53\u9A8C\n - \u9996\u9875\n - \u8FDB\u5165\u9996\u9875\u4E00\u822C\u9700\u8981\u8BF7\u6C42app\u7248\u672C\u66F4\u65B0API\u63A5\u53E3\uFF0C\u5224\u65AD\u662F\u5426\u9700\u8981\u66F4\u65B0\uFF0C\u5982\u679C\u9700\u8981\u66F4\u65B0\u5C31\u5F39\u51FA\u66F4\u65B0\u5F39\u6846\uFF0C\u5982\u679C\u4E0D\u9700\u8981\u90A3\u5C31\u4E0D\u505A\u4EFB\u4F55\u4E8B\u60C5\n - \u8FDB\u5165\u9996\u9875\u8FD8\u8981\u8BFB\u53D6\u672C\u5730\u6570\u636E\uFF1A\u5168\u5C40\u914D\u7F6E\u6570\u636E\u3002\u4E00\u822C\u7528\u4E8E\u529F\u80FD\u5F00\u5173\u3001ABTest\u914D\u7F6E\u7B49\uFF0C\u8BFB\u53D6\u5B8C\u6BD5\u540E\uFF0C\u8FD8\u8981\u7F51\u7EDC\u8BF7\u6C42\u4E00\u6B21\u5168\u5C40\u914D\u7F6EAPI\uFF0C\u5C06\u5168\u5C40\u914D\u7F6E\u6570\u636E\u66F4\u65B0\u5230\u672C\u5730\u6570\u636E\u4E2D\n - \u4E00\u822C\u662F\u6709\u4E00\u4E2A\u5E95\u90E8\u529F\u80FD\u5BFC\u822A\u680F\uFF0C\u70B9\u51FB\u5E95\u90E8\u529F\u80FD\u5BFC\u822A\u680F\u7684\u56FE\u6807\u4F1A\u5207\u6362\u5230\u5BF9\u5E94\u7684tab\u9875\u9762\uFF0Ctab\u9875\u9762\u4E00\u822C\u6709\u591A\u4E2A\uFF0C\u6BCF\u4E2Atab\u9875\u9762\u6709\u4E0D\u540C\u7684\u4E1A\u52A1\u903B\u8F91\n - \u5982\u679C\u7528\u6237\u8F93\u5165\u7684\u9700\u6C42\u63CF\u8FF0\u6CA1\u6709\u660E\u786E\u6307\u5B9A\u9996\u9875\u5E95\u90E8\u529F\u80FD\u5BFC\u822A\u680F\u6709\u54EA\u4E9B\u529F\u80FD\uFF0C\u90A3\u4E48\u4F60\u5FC5\u987B\u601D\u8003\u9996\u9875\u5E95\u90E8\u529F\u80FD\u5BFC\u822A\u680F\u6709\u54EA\u4E9B\u529F\u80FDitem\u9879\n - \u767B\u5F55\u9875\n - \u767B\u5F55\u9875\u662F\u7528\u6237\u70B9\u51FB\u9700\u8981\u767B\u5F55\u624D\u80FD\u8BBF\u95EE\u7684\u9875\u9762\u65F6\uFF0C\u624D\u4F1A\u8DF3\u8F6C\u5230\u7684\u9875\u9762\uFF0C\u800C\u4E0D\u662F\u4ECE\u95EA\u5C4F\u9875\u5224\u65AD\u662F\u5426\u9700\u8981\u767B\u5F55\u7136\u540E\u8DF3\u8FDB\u53BB\n\n## \u8C03\u7528 todo_write \u5DE5\u5177\u521B\u5EFA\u7F16\u5199\u4EE3\u7801\u7684 9 \u4E2A\u4EFB\u52A1\u5217\u8868\uFF0C\u5FC5\u987B\u6309\u7167\u4EE5\u4E0B 9 \u4E2A\u4EFB\u52A1\u521B\u5EFA\u4EFB\u52A1\u5217\u8868\uFF0C\u7981\u6B62\u8DF3\u8FC7\u4EFB\u4F55\u4EFB\u52A1\n\n### **\u7B2C1\u4E2A\u4EFB\u52A1\uFF1A\u9605\u8BFB`doc/\u524D\u7AEF\u4EE3\u7801\u5F00\u53D1\u8FDB\u5EA6.json`\u6587\u4EF6\uFF0C\u5F97\u5230\u5F53\u524D\u9875\u9762\u6240\u5C5E\u7684\u529F\u80FD\u6A21\u5757\u7684\u82F1\u6587\u540D\u5B57`moduleNameEN`\u548C\u5F53\u524D\u8981\u5F00\u53D1\u7684\u9875\u9762\u7684\u82F1\u6587\u540D\u5B57`pageNameEN`\n\n### **\u7B2C2\u4E2A\u4EFB\u52A1\uFF1A\u5728\u7F16\u5199\u4EE3\u7801\u4E4B\u524D\uFF0C\u5FC5\u987B\u4F7F\u7528read_file\u5DE5\u5177\u68C0\u67E5\u5F53\u524D\u9875\u9762\u6587\u4EF6\u5939\u4E0B\u662F\u5426\u5B58\u5728codeDesign.md\u8BBE\u8BA1\u6587\u6863\uFF1Asrc/{moduleNameEN}/{pageNameEN}/codeDesign.md\uFF0C\u5FC5\u987B\u5B8C\u6574\u9605\u8BFB\u8BE5\u8BBE\u8BA1\u6587\u6863\uFF0C\u4E25\u683C\u6309\u7167\u8BBE\u8BA1\u6587\u6863\u8BF4\u660E\u8FDB\u884C\u4EE3\u7801\u5F00\u53D12**\n\n### **\u7B2C3\u4E2A\u4EFB\u52A1\uFF1A\u4F7F\u7528read_file\u5DE5\u5177\u5B8C\u6574\u9605\u8BFB\u5F53\u524D\u9875\u9762\u5BF9\u5E94\u7684src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.md\u6587\u4EF6\uFF0C\u7406\u89E3\u6574\u4E2A\u9875\u9762\u7684\u7ED3\u6784\u548C\u7EC4\u4EF6\u5143\u7D20\uFF0C\u7EDD\u5BF9\u4E0D\u80FD\u51ED\u60F3\u8C61\u6216\u5047\u8BBE\u6DFB\u52A0\u4E0D\u5B58\u5728\u7684\u5143\u7D20\u5F15\u7528**\n\n### **\u7B2C4\u4E2A\u4EFB\u52A1\uFF1A\u4F7F\u7528read_file\u5DE5\u5177\u8BFB\u53D6'src/backendApi/backendApiInfo.md'\u6587\u4EF6\uFF0C\u8BB0\u4F4F\u73B0\u6709\u7684\u540E\u7AEFAPI\u63A5\u53E3\u548CAPI\u63A5\u53E3\u6587\u4EF6\u8DEF\u5F84\uFF0C\u7F16\u5199\u4EE3\u7801\u65F6\u7EDD\u5BF9\u4E0D\u5F97\u4F7F\u7528\u6A21\u62DF\u6570\u636E/\u4E34\u65F6\u6570\u636E/\u5047\u6570\u636E\uFF0C\u800C\u662F\u5148\u627E\u5230\u5BF9\u5E94API\u7684API\u63A5\u53E3\u6587\u4EF6\uFF0C\u7136\u540E\u4F7F\u7528\u8BE5API\u63A5\u53E3\u6587\u4EF6\u4E2D\u7684API\u63A5\u53E3\u8FD4\u56DE\u6570\u636E**\n\n### **\u7B2C5\u4E2A\u4EFB\u52A1\uFF1A\u5FC5\u987B\u5148\u7406\u89E3\u9879\u76EE\u4EE3\u7801\u6846\u67B611\u4E2A\u77E5\u8BC6\u70B9**\n#### 1. **\u7406\u89E3View\u7EC4\u4EF6\u7684\u58F0\u660E\u89C4\u5219**\n - \u8FD9\u4E0D\u662Fhtml\u3001react\u7B49\u5F00\u53D1\uFF0C\u8FD9\u662F\u4E00\u4E2A\u65B0\u7684\u5F00\u53D1\u6846\u67B6\uFF0C\u662F\u57FA\u4E8Esrc/lib/uilib\u6587\u4EF6\u5939\u91CC\u9762\u7684UI\u7EC4\u4EF6\u5E93\u6765\u5F00\u53D1\u7684\n - View\u7EC4\u4EF6\u7684\u57FA\u7C7B\u662FBaseView\uFF0C\u5BB9\u5668\u57FA\u7C7B\u662FBaseContainerView\uFF0C\u6240\u6709View\u7EC4\u4EF6\u90FD\u7EE7\u627F\u81EABaseView\n - \u67E5\u770B'src/lib/uilib/'\u6587\u4EF6\u5939\u4E0B\u9762\u7684\u6587\u4EF6\u540D\u5B57\uFF0C\u7406\u89E3\u603B\u5171\u6709\u591A\u5C11\u79CDUI\u7EC4\u4EF6\n - View\u7EC4\u4EF6\u7684\u58F0\u660E\u5FC5\u987B\u5728\u7C7B\u6587\u4EF6\u5F00\u59CB\u65F6\u5148\u58F0\u660E\uFF0C\u5E76\u4E14\u5FC5\u987B\u8981\u58F0\u660E\u5177\u4F53\u7684View\u7EC4\u4EF6\u7C7B\u578B\uFF0C\u4E0D\u5F97\u58F0\u660E\u4E3ABaseView\uFF0C\u4E0D\u5F97\u5728\u4EFB\u4F55\u51FD\u6570\u4F53\u91CC\u9762\u901A\u8FC7findViewById\u6765\u58F0\u660EView\u7EC4\u4EF6\uFF0C\u6BD4\u5982\uFF1A\n - \u2705 \u6B63\u786E\u7684\u5199\u6CD5\uFF1A\n ```typescript\n public class HomePage extends Page {\n private nameTextView: TextView = this.findViewById('nameTextView') as TextView\n ....\n }\n ```\n - \u274C \u9519\u8BEF\u7684\u5199\u6CD5\uFF08\u6CA1\u6709\u58F0\u5177\u4F53\u7684View\u7EC4\u4EF6\u7C7B\u578B\uFF09\uFF1A\n ```typescript\n private nameTextView = this.findViewById('nameTextView')\n ```\n - \u274C \u9519\u8BEF\u7684\u5199\u6CD5\uFF08\u5728\u51FD\u6570\u4F53\u91CC\u9762\u901A\u8FC7findViewById\u6765\u58F0\u660EView\u7EC4\u4EF6\uFF09\uFF1A\n ```typescript\n private oneFunction() {\n const nameTextView: TextView = this.findViewById('nameTextView') as TextView\n ....\n }\n ```\n - \u6240\u6709View\u7EC4\u4EF6\u7684\u9009\u4E2D\u72B6\u6001\u3001\u805A\u7126\u72B6\u6001\u3001\u7981\u7528\u72B6\u6001\u7684\u53D8\u5316\u90FD\u5FC5\u987B\u901A\u8FC7`setStation(station: ViewStation)`\u51FD\u6570\u6765\u8BBE\u7F6E\uFF0C\u4E0D\u80FD\u76F4\u63A5\u8BBE\u7F6E\u7EC4\u4EF6\u7684UI\u5C5E\u6027\uFF0C\u53EA\u9700\u8981\u8BBE\u7F6E\u7EC4\u4EF6\u7684station\u5C5E\u6027\u5373\u53EF\u81EA\u52A8\u66F4\u65B0\u7EC4\u4EF6\u7684UI\u6837\u5F0F\n - \u6240\u6709View\u7EC4\u4EF6\u7684\u663E\u793A\u3001\u9690\u85CF\u5360\u4F4D\u3001\u9690\u85CF\u4E0D\u5360\u4F4D\u7684\u8BBE\u7F6E\u90FD\u5FC5\u987B\u4F7F\u7528View\u7684`visibility`\u5C5E\u6027\u8FDB\u884C\u8BBE\u7F6E\uFF0C\u4E0D\u5F97\u4F7F\u7528`station`\u5C5E\u6027\u3002\n - \u6240\u6709View\u7EC4\u4EF6\u7684normal\u3001readOnly\u3001focus\u3001selected\u3001disabled\u72B6\u6001\u7684\u8BBE\u7F6E\u90FD\u5FC5\u987B\u4F7F\u7528View\u7684`station`\u5C5E\u6027\u8FDB\u884C\u8BBE\u7F6E\u3002\n\n#### 2. **\u7406\u89E3\u552F\u4E00\u7684\u80FD\u529B\u65B9\u6CD5AllFunction.ts\u4EE5\u53CAjson\u76F8\u5173\u4EE3\u7801**\n - \u4F7F\u7528'read_file'\u5DE5\u5177\u9605\u8BFB\u5E76\u7406\u89E3'src/lib/AllFunction.ts'\u6587\u4EF6\uFF0C\u7406\u89E3\u8BE5\u5DE5\u7A0B\u80FD\u4F7F\u7528\u7684\u552F\u4E00\u7684\u80FD\u529B\u65B9\u6CD5\n - \u8BF7\u4E25\u683C\u6309\u7167\u552F\u4E00\u7684\u80FD\u529B\u65B9\u6CD5AllFunction.ts\uFF0C\u4E0D\u8981\u65B0\u589E\u3001\u5220\u9664\u6216\u4FEE\u6539\u4EFB\u4F55AllFunction\u63A5\u53E3\u58F0\u660E\uFF1B\u4E5F\u4E0D\u8981\u8C03\u7528\u5176\u4ED6\u672A\u5728AllFunction\u4E2D\u51FA\u73B0\u7684\u51FD\u6570\u6216\u6A21\u5757\n \n#### 3. **\u7406\u89E3Ref\u3001watch**\n - Ref\u7684\u6570\u636E\u7C7B\u578B\u53EA\u80FD\u662F\u4EE5\u4E0B5\u4E2D\u7C7B\u578B\uFF1A\u6570\u5B57\u4F7F\u7528Ref<number>\uFF0C\u5B57\u7B26\u4E32\u4F7F\u7528Ref<string>\uFF0C\u5E03\u5C14\u91CF\u4F7F\u7528Ref<boolean>\uFF0C\u5BF9\u8C61\u4F7F\u7528Ref<any>\uFF0C\u6570\u7EC4\u4F7F\u7528Ref<Array<any>>\u6216Ref<Array<any> | null>\u6216Ref<any[]>\u6216Ref<any[] | null>\u3002\n - \u4F7F\u7528'read_file'\u5DE5\u5177\u9605\u8BFB\u5E76\u7406\u89E3'src/lib/Ref.ts'\u6587\u4EF6\uFF0C\u7406\u89E3Ref\u548Cwatch\u7684\u5B9A\u4E49\u7528\u6CD5\n - watch\u662F\u76D1\u542CRef\u7684\u53D8\u5316\uFF0C\u7136\u540E\u505A\u76F8\u5173UI\u66F4\u65B0\u6216\u5176\u4ED6\u4E1A\u52A1\u903B\u8F91\uFF0C\u7B2C\u4E00\u4E2A\u53C2\u6570\u662F\u76D1\u542C\u7684Ref\u6570\u7EC4\uFF0C\u7B2C\u4E8C\u4E2A\u53C2\u6570\u662F\u76D1\u542C\u7684\u56DE\u8C03\u51FD\u6570\uFF0C\u56DE\u8C03\u51FD\u6570\u4E2D\u53EF\u4EE5\u505A\u76F8\u5173UI\u66F4\u65B0\u6216\u5176\u4ED6\u4E1A\u52A1\u903B\u8F91\u3002\n - Ref\u662F\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0Cwatch\u662F\u76D1\u542CRef\u7684\u53D8\u5316\uFF0C\u7136\u540E\u505A\u76F8\u5173UI\u66F4\u65B0\u6216\u5176\u4ED6\u4E1A\u52A1\u903B\u8F91\uFF0C\u6BD4\u5982\uFF1A\n ```typescript\n private nameTextRef: Ref<string> = ref('')\n private otherCountRef: Ref<number> = ref(0)\n watch([this.nameTextRef, this.otherCountRef], () => {\n // \u53EF\u4EE5\u5148\u76F8\u5173\u7684UI\u66F4\u65B0\u6216\u4E1A\u52A1\u903B\u8F91\n if (this.otherCountRef.value > 5) {\n this.nameTextView.text = this.nameTextRef.value + '5'\n } else {\n this.nameTextView.text = this.nameTextRef.value + '10'\n }\n })\n ```\n - `src/lib/uilib/Ref.ts`\u91CC\u9762\u7684`watch`\u51FD\u6570\uFF0C\u7B2C\u4E00\u4E2A\u5165\u53C2`refs: Ref<T>[]`\u7EDD\u5BF9\u7981\u6B62\u5148\u58F0\u660E\u5C40ref\u6570\u7EC4\u90E8\u53D8\u91CF\u518D\u4F20\u5165\uFF0C\u6B63\u786E\u7684\u5199\u6CD5\u5E94\u8BE5\u662F\u76F4\u63A5\u5199\u6570\u7EC4\uFF1A`[ref1, ref2]`\u5C31\u884C\n - \u274C \u9519\u8BEF\u7684\u5199\u6CD5\uFF1A\n ``` typescript\n const refArray = [ref1, ref2]\n watch(refArray, (newValues: T[]) => {\n // \u76D1\u542Cref1\u548Cref2\u7684\u53D8\u5316\n })\n ```\n - \u2705 \u6B63\u786E\u7684\u5199\u6CD5\uFF1A\n ``` typescript\n watch([ref1, ref2], (newValues: T[]) => {\n // \u76D1\u542Cref1\u548Cref2\u7684\u53D8\u5316\n })\n ```\n\n#### 4. **\u7406\u89E3setDataList\u65B9\u6CD5\u7684\u9759\u6001\u6570\u636E\u4E0E\u52A8\u6001\u6570\u636E\u573A\u666F**\n - \u5BF9\u4E8E\u52A8\u6001\u6570\u636E\u5BB9\u5668ViewPager\u3001ListView\u7684setDataList\u65B9\u6CD5\uFF0C\u5982\u679C\u6570\u636E\u662F\u52A8\u6001\u7684\uFF0C\u6BD4\u5982\uFF1A\u4ECE\u540E\u7AEF\u63A5\u53E3\u83B7\u53D6\u7684\uFF0C\u624D\u80FD\u4F7F\u7528setDataList\u65B9\u6CD5\u6765\u8BBE\u7F6E\u6570\u636E\u3002\u9759\u6001\u6570\u636E\u5DF2\u7ECF\u5728UI\u9875\u9762\u4E0A\u5199\u597D\u4E86\uFF0C\u4F60\u4E0D\u5F97\u4F7F\u7528setDataList\u65B9\u6CD5\u6765\u8BBE\u7F6E\u6570\u636E\u3002\n - \u5224\u65AD\u6807\u51C6\uFF1A\u5982\u679CUI\u9875\u9762\u4E2D\u5DF2\u7ECF\u6709\u5B8C\u6574\u7684\u8F6E\u64AD\u9879\u76EE/\u5217\u8868\u9879\u76EE\uFF0C\u5C31\u662F\u9759\u6001\u6570\u636E\uFF0C\u5982\u679C\u662F\u7F51\u7EDCAPI\u8FD4\u56DE\u7684\u6570\u636E\u5217\u8868\u5C31\u662F\u52A8\u6001\u6570\u636E\u3002\n - \u2705 \u9759\u6001\u6570\u636E\u5BB9\u5668\uFF08UI\u9875\u9762\u4E2D\u5DF2\u5199\u597D\u5185\u5BB9\uFF09\uFF1A\u4E0D\u4F7F\u7528setDataList()\n - \u2705 \u52A8\u6001\u6570\u636E\u5BB9\u5668\uFF08\u9700\u8981\u4ECEAPI\u83B7\u53D6\uFF09\uFF1A\u624D\u4F7F\u7528setDataList()\n\n#### 5. **View\u7EC4\u4EF6\uFF0C\u7406\u89E3\u6BCF\u4E2A\u7EC4\u4EF6\u53EF\u80FD\u91CC\u9762\u5DF2\u7ECF\u6709\u4E86\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0C\u5982\u679C\u7EC4\u4EF6\u91CC\u9762\u5DF2\u7ECF\u6709\u4E86\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0C\u90A3\u4E48\u4F60\u4E0D\u5F97\u518D\u81EA\u5DF1\u521B\u5EFAref\u53D8\u91CF\u6216\u8005\u4F7F\u7528onSelectChange\u7B49\u56DE\u8C03\u89E6\u53D1UI\u66F4\u65B0**\n - \u4F8B\u5B50\uFF1AViewPager\u7684currentSelectIndex\u548CcurrentSelectIndexRef\u5C5E\u6027\u5DF2\u7ECF\u662F\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0C\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528currentSelectIndexRef\u6765\u7ED1\u5B9A\u81EA\u52A8\u66F4\u65B0UI\u3002\n public initView() {\n this.showIndexTextView.text = this.viewPager.currentSelectIndexRef.value + 1 + '/' + this.viewPager.dataList.length\n }\n - \u4F8B\u5B50\uFF1AViewPager\u7684currentSelectIndex\u548CcurrentSelectIndexRef\u5C5E\u6027\u5DF2\u7ECF\u662F\u54CD\u5E94\u5F0F\u6570\u636E\u6E90\uFF0C\u53EF\u4EE5\u76F4\u63A5\u4F7F\u7528currentSelectIndexRef\u6765\u7ED1\u5B9A\u81EA\u52A8\u66F4\u65B0UI\uFF0C\u6BD4\u5982\uFF1A\n ```typescript\n public initView() {\n watch([this.viewPager.currentSelectIndexRef], () => {\n this.showIndexTextView.text = this.viewPager.currentSelectIndexRef.value + 1 + '/' + this.viewPager.dataList.length\n })\n ```\n - tab\u7EC4\u4EF6\u548C\u8F6E\u64AD\u7EC4\u4EF6\u7684\u9009\u62E9\u53D8\u5316\u76D1\u542C\uFF0C\u5FC5\u987B\u4F7F\u7528`ViewPager`\u6216`TabContainer`\u7684`onSelectChange(func: (item: any, position: number) => void)`\u51FD\u6570\u6765\u76D1\u542C\u9009\u62E9\u53D8\u5316\n\n#### 6. **\u7406\u89E3\u9875\u9762\u8DF3\u8F6C**\n - \u9875\u9762\u8DF3\u8F6C\u5FC5\u987B\u4F7F\u7528AllFunction.startPage\u5B9E\u73B0\uFF0CstartPage\u4F20\u5165Page\u7684\u5B50\u7C7B\u5BF9\u8C61\uFF0C\u5982\uFF1AAllFunction.startPage(new ProductPage(this.productID))\u3002\n - \u274C \u9875\u9762\u8DF3\u8F6C\u4E0D\u9700\u8003\u8651\u6A21\u5757\u5316\u3001\u5FAA\u73AF\u4F9D\u8D56\u3001\u6E10\u8FDB\u5F0F\u5F00\u53D1\uFF0C\u7EDD\u5BF9\u7981\u6B62\u5C4F\u853D\u9875\u9762\u8DF3\u8F6C\u7684\u4EE3\u7801\uFF0C\u6240\u6709\u9875\u9762\u90FD\u5DF2\u7ECF\u5B58\u5728\uFF0C\u4E0D\u4F1A\u51FA\u73B0\u7F16\u8BD1\u51FA\u9519\u7684\uFF0C\u5FC5\u987B\u660E\u786E\u5199\u4E0A\u9875\u9762\u8DF3\u8F6C\u7684\u4EE3\u7801\u548C\u76EE\u6807\u9875\u9762\u6240\u9700\u7684\u8DF3\u8F6C\u53C2\u6570\u3002\n - \u5728Application.ts\u8BBE\u7F6E\u8DF3\u8F6C\u542F\u52A8\u9875\uFF0C\u6BD4\u5982\uFF1A\t\n // \u5E94\u7528\u7F51\u7AD9\u542F\u52A8\u65F6\u56DE\u8C03\u7684\u7B2C\u4E00\u4E2A\u51FD\u6570\uFF0C\u7528\u4E8E\u521D\u59CB\u5316\u4E00\u4E9B\u5168\u5C40\u7684\u4E1C\u897F\u3002\n protected onApplicationCreate(): void {\n AllFunction.startPage(new SplashPage())\n }\n - \u2705 \u5F15\u5165\u5176\u4ED6\u7C7B\u53EA\u5141\u8BB8\u4E00\u79CD\u5199\u6CD5\uFF1A\u5728\u7C7B\u6587\u4EF6\u9876\u90E8\u8FDB\u884Cimport\uFF1Aimport GuidePage from '../guidePage/guidePage'\u3002\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528\u52A8\u6001import\u7684\u5199\u6CD5\uFF0C\u7A0B\u5E8F\u5E95\u5C42\u5DF2\u7ECF\u5904\u7406\u597D\u5FAA\u73AF\u4F9D\u8D56\u95EE\u9898\u4E86\uFF0C\u4F60\u4E0D\u9700\u8981\u8003\u8651\uFF0C\u6BD4\u5982\u7EDD\u5BF9\u7981\u6B62\u4EE5\u4E0B\u5199\u6CD5\uFF1A\n // \u4F7F\u7528\u52A8\u6001\u5BFC\u5165\u907F\u514D\u5FAA\u73AF\u4F9D\u8D56\n import('../guidePage/guidePage').then(({ default: GuidePage }) => {\n AllFunction.startPage(new GuidePage())\n })\n - \u274C \u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528require\u7684\u5199\u6CD5\uFF0C\u7A0B\u5E8F\u5E95\u5C42\u5DF2\u7ECF\u5904\u7406\u597D\u5FAA\u73AF\u4F9D\u8D56\u95EE\u9898\u4E86\uFF0C\u4F60\u4E0D\u9700\u8981\u8003\u8651\uFF0C\u6BD4\u5982\u7EDD\u5BF9\u7981\u6B62\u4EE5\u4E0B\u5199\u6CD5\uFF1A\n require('../guidePage/guidePage').default\n - \u2705 \u6B63\u786E\u7684\u5199\u6CD5\u662F\uFF1AAllFunction.startPage(new GuidePage())\u3002\u7136\u540E\u5728\u7C7B\u6587\u4EF6\u9876\u90E8\u8FDB\u884Cimport\uFF1Aimport GuidePage from '../guidePage/guidePage'\u3002\n - \u5982\u679C\u9875\u9762\u8DF3\u8F6C\u9700\u8981\u4F20\u9012\u53C2\u6570\uFF0C\u90A3\u4E48\u9700\u8981\u4F7F\u7528Page\u7684\u5B50\u7C7B\u6784\u9020\u51FD\u6570\u6765\u4F20\u9012\u53C2\u6570\uFF0C\u6BD4\u5982\uFF1AAllFunction.startPage(new GuidePage(this.productID))\u3002\n - \u5728\u5B9E\u73B0\u9875\u9762\u8DF3\u8F6C\u4EE3\u7801\u7684\u65F6\u5019\uFF0C\u5FC5\u987B\u4E25\u683C\u6309\u7167\u4EE5\u4E0B\u4E09\u6B65\u6765\u5B9E\u73B0\uFF1A\n - **\u7B2C\u4E00\u6B65\uFF1A\u5148\u5206\u6790\u8DF3\u8F6C\u7684\u76EE\u6807\u9875\u9762\u9700\u8981\u4F20\u9012\u54EA\u4E9B\u53C2\u6570**\n - **\u7B2C\u4E8C\u6B65\uFF1A\u4FEE\u6539\u76EE\u6807\u9875\u9762\u6784\u9020\u51FD\u6570**\uFF1A\n ```typescript\n export default class ReadingPage extends Page {\n private bookId: number\n private chapterTitle: string\n \n constructor(bookId: number, chapterTitle: string) {\n super()\n this.bookId = bookId\n this.chapterTitle = chapterTitle\n }\n }\n ```\n - **\u7B2C\u4E09\u6B65\uFF1A\u4FEE\u6539\u8DF3\u8F6C\u4EE3\u7801**\n ```typescript\n const bookData = this.readingHistoryDataRef.value[0]\n AllFunction.startPage(new ReadingPage(bookData.id, bookData.chapterTitle))\n ```\n\n#### 7. **\u7406\u89E3\u57FA\u7840\u5F00\u53D1\u89C4\u5219**\n - lib\u6587\u4EF6\u5939\u91CC\u9762\u7684\u4EE3\u7801\u6587\u4EF6\u90FD\u662F\u5185\u7F6E\u6846\u67B6\u4EE3\u7801\uFF0C\u7EDD\u5BF9\u7981\u6B62\u5BF9lib\u6587\u4EF6\u5939\u7684\u4EE3\u7801\u8FDB\u884C\u589E\u5220\u6539\u64CD\u4F5C\n - \u6240\u6709Page\u7684\u5B50\u7C7B\uFF0C\u90FD\u5141\u8BB8\u6DFB\u52A0\u6784\u9020\u51FD\u6570\u548C\u6784\u9020\u51FD\u6570\u7684\u53C2\u6570\uFF0C\u8FD9\u4E9B\u53C2\u6570\u5C31\u7528\u6765\u9875\u9762\u8DF3\u8F6C\u65F6\u9875\u9762\u4E4B\u95F4\u4F20\u9012\u6570\u636E\u4F7F\u7528\uFF0C\u6BD4\u5982\uFF1A\u5546\u54C1\u5217\u8868\u9875ProjectListPage\u8DF3\u5230\u5546\u54C1\u8BE6\u60C5\u9875ProjectDetailPage\uFF0C\u90A3\u4E48ProjectListPage\u5E94\u8BE5\u8981\u4F20\u7ED9ProjectDetailPage\u4E00\u4E2A\u53C2\u6570\uFF1AproductID\u3002\u6240\u4EE5\uFF0CProjectDetailPage\u7684\u9875\u9762\u53C2\u6570\u58F0\u660E\u548C\u6784\u9020\u51FD\u6570\u5E94\u8BE5\u662F\u8FD9\u6837\u5199\uFF1A\n private productID: string\n constructor(productID: string) {\n super()\n this.productID = productID\n }\u3002\n - \u4EFB\u4F55\u9875\u9762\uFF08\u7279\u522B\u662F\u95EA\u5C4F\u9875\uFF09\u7684\u4E1A\u52A1\u903B\u8F91\u7EDD\u5BF9\u4E0D\u80FD\u653E\u5230Application.ts\u8FDB\u884C\u5904\u7406\uFF0CApplication.ts\u53EA\u8FDB\u884C\u5168\u5C40\u7F51\u7EDC\u62E6\u622A\u5904\u7406\u3001\u5168\u5C40\u9759\u6001\u53D8\u91CF\u3001\u5168\u5C40\u9759\u6001\u65B9\u6CD5\u7684\u5B9A\u4E49\u548C\u5B9E\u73B0\n - \u5982\u679C\u662F\u591A\u4E2A\u9875\u9762\u5171\u7528\u7684\u6570\u636E\u53D8\u91CF\uFF0C\u53EF\u4EE5\u8003\u8651\u58F0\u660E\u4E3A\u5168\u5C40\u9759\u6001\u53D8\u91CF\uFF0C\u5E76\u5728Application.ts\u4E2D\u8FDB\u884C\u58F0\u660E\u3002\n - \u5168\u5C40\u9759\u6001\u53D8\u91CF\u5728\u5173\u95EDAPP\u6216\u8005\u7F51\u9875\u540E\u4F1A\u6E05\u7406\u6389\u7684\uFF0C\u6240\u4EE5\u4F60\u8981\u601D\u8003\u6E05\u695A\u54EA\u4E9B\u6570\u636E\u53D8\u91CF\u9700\u8981\u6301\u4E45\u5316\u50A8\u5B58\uFF0C\u54EA\u4E9B\u662F\u5168\u5C40\u9759\u6001\u53D8\u91CF\uFF0C\u6301\u4E45\u5316\u63A5\u53E3\uFF1AsaveDatabaseXxx\u548CgetDatabaseDataXxx\uFF0C\u6BD4\u5982\u662F\u5426\u5DF2\u7ECF\u5F39\u51FA\u8FC7\u5E7F\u544A\u5F39\u6846\uFF0C\u8FD9\u4E2A\u5E94\u8BE5\u6301\u4E45\u5316\u50A8\u5B58\u3002\n - \u6240\u6709\u7684\u7F51\u7EDC\u62E6\u622A\u7684\u5168\u5C40\u7EDF\u4E00\u5904\u7406\u9700\u8981\u5728Application\u4E2D\u7684onGlobalNetSuccessIntercept(\u8054\u7F51\u6210\u529F\u540E\uFF0C\u540E\u7AEF\u4E1A\u52A1\u6B63\u786E\u4E0E\u9519\u8BEF\u90FD\u4F1A\u56DE\u8C03\u5230\u8FD9\u91CC\uFF0C\u6240\u4EE5\u5728\u8FD9\u91CC\u53EF\u7EDF\u4E00\u5904\u7406\u4E1A\u52A1\u9519\u8BEF\u7801)\u6216onGlobalNetFailIntercept(\u7F51\u7EDC\u4E0D\u901A\uFF0C\u8FDE\u63A5\u5931\u8D25\u60C5\u51B5\u4F1A\u56DE\u8C03\u5230\u8FD9\u91CC)\u91CC\u9762\u5904\u7406\u3002\n - \u9875\u9762\u5185\u7684\u7F51\u7EDC\u8BF7\u6C42\u4E1A\u52A1\u5904\u7406\u4E0D\u5F97\u5199\u5728Application\u7684onGlobalNetSuccessIntercept\u91CC\u9762\u3002\n - \u58F0\u660E\u5168\u5C40\u53D8\u91CF\u3001\u5C40\u90E8\u53D8\u91CF\u5FC5\u987B\u8981\u58F0\u660E\u6570\u636E\u7C7B\u578B\uFF0C\u5E76\u4E14\u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528any\uFF0C\u8BF7\u4F7F\u7528\u5177\u4F53\u7C7B\u578B\u6765\u58F0\u660E\n - \u5B57\u7B26\u4E32\u4E0D\u5F97\u76F4\u63A5\u8FDB\u884Cboolean\u8FD0\u7B97\u7136\u540E\u8D4B\u503C\u7ED9boolean\u7C7B\u578B\u7684\u53D8\u91CF\uFF0C\u9700\u8981\u5728\u5B57\u7B26\u4E32\u524D\u9762\u6DFB\u52A0\u4E24\u4E2A\u975E\u8FD0\u7B97\uFF1A!!\u3002\u6BD4\u5982\u6B63\u786E\u7684\u5199\u6CD5\uFF1Aconst isAdd = !!this.inputView.text && isNew\n - \u6240\u6709\u7684toast\u63D0\u793A\uFF0C\u5FC5\u987B\u8C03\u7528AllFunction.showToast\u65B9\u6CD5\u6765\u663E\u793A\uFF0C\u5E76\u4E14\u5982\u7528\u6237\u63CF\u8FF0\u6CA1\u6709\u660E\u786E\u8BF4\u660E\u9700\u8981toast\u63D0\u793A\uFF0C\u4F60\u4E0D\u5F97\u64C5\u81EA\u8FDB\u884CToast\u63D0\u793A\u3002\n - \u5EF6\u65F6\u6267\u884CAllFunction.setTimeout\u7CFB\u7EDF\u4F1A\u81EA\u52A8\u6E05\u7406timeout\uFF0C\u4EE3\u7801\u4E0A\u7EDD\u5BF9\u4E0D\u80FD\u8FDB\u884CcleaTimeout\u7B49\u7C7B\u4F3C\u64CD\u4F5C\uFF0C\u56E0\u6B64setTimeout\u4E5F\u4E0D\u9700\u8981\u58F0\u660E\u53D8\u91CF\u53BB\u63A5\u6536setTimeout\u8FD4\u56DE\u7684\u5F15\u7528\u3002\n - \u8F6E\u64ADViewPager\u5BF9\u5E94\u7684\u7D22\u5F15\u6307\u793A\u5668\u5BB9\u5668\uFF0C\u8FD9\u4E2A\u7D22\u5F15\u6307\u793A\u5668\u4E0D\u9700\u8981\u989D\u5916\u4EE3\u7801\u5B9E\u73B0\u6307\u793A\u5668\u70B9\u7684\u5207\u6362UI\u66F4\u65B0\u903B\u8F91\uFF0C\u672C\u8EABViewPager\u4E0EIndicatorContainer\u5E95\u5C42\u5DF2\u7ECF\u5B9E\u73B0\u4E86\u5207\u6362\u7684UI\u66F4\u65B0\u903B\u8F91\u7684\u4E86\uFF0C\u53EA\u9700\u8981viewPager.bindIndicator(indicatorContainer)\u5373\u53EF\u3002\n - \u79FB\u52A8\u7AEF\u7684ViewPager\u7684canIndicatorClick\u5C5E\u6027\u9ED8\u8BA4\u8BBE\u7F6E\u4E3Afalse\u7684\uFF0C\u9664\u975E\u7528\u6237\u660E\u786E\u8BF4\u660E\u9700\u8981\u6FC0\u6D3B\u6307\u793A\u5668\u7684\u70B9\u70B9\u51FB\u5207\u6362ViewPager\u3002\n - \u6BCF\u4E00\u4E2A\u9875\u9762(\u5982loginPage)\u5EFA\u8BAE\u5728page\u6587\u4EF6\u5939\u4E0B\u9762\u521B\u5EFA\u4E00\u4E2A\u9875\u9762\u6587\u4EF6\u5939(\u5982login)\uFF0C\u7136\u540E\u9875\u9762\u7684ts\u6587\u4EF6(\u5982loginPage.ts)\u521B\u5EFA\u5728\u9875\u9762\u6587\u4EF6\u5939\u4E0B\u9762\uFF0C\u9875\u9762\u6587\u4EF6\u5939\u4E0B\u5982\u679C\u9700\u8981\u8FD8\u53EF\u521B\u5EFA\u4E00\u4E2A\u9875\u9762\u6570\u636Ets\u6587\u4EF6(\u5982loginPageData.ts)\uFF0C\u8FD9\u6837\u5982loginPage\u8D1F\u8D23\u4E1A\u52A1\u903B\u8F91\u548C\u4EA4\u4E92\u903B\u8F91\uFF0C\u5982loginPageData\u8D1F\u8D23\u6570\u636E\u58F0\u660E\u5B9A\u4E49\u3001\u521D\u59CB\u5316\u4E0E\u7BA1\u7406\u7B49\u3002\n\n#### 8. **\u7406\u89E3\u540E\u7AEFAPI\u63A5\u53E3\u7684\u5B9A\u4E49\u4E0E\u4F7F\u7528**\n - \u4F7F\u7528'read_file'\u5DE5\u5177\u8BFB\u53D6'src/backendApi/backendApiInfo.md'\u540E\u7AEFAPI\u4F7F\u7528\u8BF4\u660E\u6587\u4EF6\uFF0C\u5FC5\u987B\u7F13\u5B58\u8BB0\u4F4F\u6240\u6709\u53EF\u7528\u7684\u540E\u7AEFAPI\u63A5\u53E3\u5217\u8868\u3002\n - \u540E\u7AEFAPI\u63A5\u53E3\u7684\u5B9A\u4E49\u4E0E\u4F7F\u7528\uFF0C\u5FC5\u987B\u4F7F\u7528src/backendApi\u6587\u4EF6\u5939\u91CC\u9762\u7684\u5404\u79CDAPI\u7C7B\u4E2D\u5B9A\u4E49\u7684\u65B9\u6CD5\uFF0C\u4E0D\u5141\u8BB8\u4F7F\u7528\u672A\u5728backendApi\u6587\u4EF6\u5939\u4E2D\u5B9A\u4E49\u7684\u540E\u7AEFAPI\uFF0C\u6BD4\u5982\uFF1AbackendApi/account/getUserInfo.ts\uFF0C\u8FD9\u4E2A\u5C31\u662F\u8D26\u53F7\u6A21\u5757\u4E2D\u7684\u83B7\u53D6\u7528\u6237\u4FE1\u606F\u7684API\u7C7B\uFF0C\u8FD4\u56DE\u7684res\u5FC5\u987B\u58F0\u660E\u5177\u4F53\u7C7B\u578B\uFF0C\u6BD4\u5982res: getUserInfoResponse\u3002\n - request\u63A5\u53E3\u53EA\u9700\u5B9A\u4E49\u5373\u53EF\uFF0C\u4E0D\u9700\u8981\u5B9E\u73B0\uFF0C\u5E95\u5C42\u5DF2\u7ECF\u5B9E\u73B0\u3002\n - API\u7C7B\u4EE3\u7801\u793A\u4F8B\uFF1A\n ```typescript\n import BaseApi from '../BaseApi'\n\n // \u8D26\u53F7\u7CFB\u7EDF-\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u63A5\u53E3\u8BF7\u6C42\u6570\u636E\n export interface postClientBizAuthLoginRequest {\n username?: string\n password?: string\n key?: string\n captcha?: string\n }\n\n // \u8D26\u53F7\u7CFB\u7EDF-\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u63A5\u53E3\u8FD4\u56DE\u6570\u636E\n export interface postClientBizAuthLoginResponse {\n code: number\n msg: string\n data: {\n access_token: string\n }\n }\n\n // \u8D26\u53F7\u7CFB\u7EDF-\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u63A5\u53E3\u5931\u8D25\u8FD4\u56DE\u6570\u636E\n export interface apiFailInfo {\n msg: string\n code: number\n }\n\n // \u8D26\u53F7\u7CFB\u7EDF-\u8D26\u53F7\u5BC6\u7801\u767B\u5F55\u63A5\u53E3\n export default class postClientBizAuthLogin extends BaseApi {\n\n public static request_ArtuX1d8a6A(\n request: postClientBizAuthLoginRequest,\n success: (res: postClientBizAuthLoginResponse) => void,\n fail: (error: apiFailInfo) => void\n ): void { }\n\n }\n ```\n - API\u7C7B\u7684\u4F7F\u7528\u65B9\u5F0F\uFF1A\u5148import API\u7C7B\uFF0C\u7136\u540E\u8C03\u7528API\u7C7B\u7684request\u65B9\u6CD5\uFF0C\u6BD4\u5982\uFF1A\n import { postClientBizAuthLogin } from '../../backendApi/account/postClientBizAuthLogin'\n ...\n const request: postClientBizAuthLoginRequest = {\n username: 'admin',\n password: '123456',\n key: '123456',\n captcha: '123456'\n }\n postClientBizAuthLogin.request_ArtuX1d8a6A(request, (response: postClientBizAuthLogoutResponse) => {\n // \u8BF7\u6C42\u6210\u529F\u540E\u7684\u5904\u7406\n }, (error: apiFailInfo) => {\n // \u8BF7\u6C42\u5931\u8D25\u540E\u7684\u5904\u7406\n })\n ...\n\n#### 9. **\u7406\u89E3\u8C03\u7528\u540E\u7AEFapi\u63A5\u53E3\u8FD4\u56DE\u6570\u636E\u540E\u4E0EUI\u6570\u636E\u7ED1\u5B9A**\n - \u5728\u8C03\u7528\u540E\u7AEFapi\u63A5\u53E3\u8FD4\u56DE\u6570\u636E\u540E\uFF0C\u9700\u8981\u6839\u636Evtype\u6765\u505A\u4E0D\u540C\u7684\u6570\u636E\u7ED1\u5B9A\uFF0C\u6BD4\u5982\uFF1A\n - vtype=\"verticalListView\"\u3001vtype=\"horizontalListView\"\u3001vtype=\"viewPager\"\u7C7B\u578B\u7684\u8282\u70B9\u7EC4\u4EF6\uFF0C\u9700\u8981\u4F7F\u7528setDataList\u65B9\u6CD5\u6765\u7ED1\u5B9A\u6570\u636E\uFF0C\u6BD4\u5982\uFF1A\n this.xxxVerticalListView.setDataList(response.data.list)\u3001this.xxxHorizontalListView.setDataList(response.data.list)\u3001this.xxxViewPager.setDataList(response.data.list)\n - vtype=\"listItemCard\"\u3001vtype=\"oneViewPagerContent\"\u7C7B\u578B\u7684\u8282\u70B9\u7EC4\u4EF6\uFF0C\u9700\u8981\u6DF1\u5EA6\u904D\u5386\u5B83\u7684\u7B2C1\u4E2Aitem\u7684\u5B69\u5B50\uFF0C\u7136\u540E\u7ED3\u5408\u540E\u7AEFapi\u8FD4\u56DE\u7684xxxResponse\u7684\u6570\u636E\u7ED3\u6784\u7ED9\u7B2C1\u4E2Aitem\u8BBE\u7F6E\u6570\u636E\uFF0C\u6CE8\u610F\u53EA\u9700\u7ED9\u7B2C1\u4E2Aitem\u8282\u70B9\u8BBE\u7F6E\u6570\u636E\uFF0C\u800C\u4E0D\u662F\u6240\u6709item\u8282\u70B9\u90FD\u8BBE\u7F6E\u6570\u636E\uFF0C\u6BD4\u5982\uFF1A\n ```typescript\n // \u540E\u7AEFxxxApi\u8FD4\u56DE\u7684xxxResponse\u6570\u636E\u7ED3\u6784\n export interface getRecommendBookListResponse {\n code: number\n msg: string\n data: {\n list: [\n {\n id: number // \u4E66\u7C4DID\n title: string // \u4E66\u7C4D\u6807\u9898\n author: string // \u4F5C\u8005\u540D\u79F0\n coverUrl: string // \u5C01\u9762\u56FE\u7247URL\n description: string // \u4E66\u7C4D\u7B80\u4ECB\n categoryName: string // \u5206\u7C7B\u540D\u79F0\n }\n ] // \u4E66\u7C4D\u5217\u8868\n total: number // \u603B\u6570\u91CF\n page: number // \u5F53\u524D\u9875\u7801\n size: number // \u6BCF\u9875\u6570\u91CF\n }\n }\n ...\n // \u8BBE\u7F6E\u4E66\u7C4D\u5217\u8868\u6570\u636E\n this.recommendBookList.setDataList(getRecommendBookListResponse.data.list)\n // \u8BBE\u7F6E\u7B2C1\u4E2Aitem\u8282\u70B9\u6570\u636E\n this.recommendBookCover1.src = getRecommendBookListResponse.data.list[0].coverUrl\n this.recommendBookTitle1.text = getRecommendBookListResponse.data.list[0].title\n this.recommendBookAuthor1.text = getRecommendBookListResponse.data.list[0].author\n ...\n // \u8BBE\u7F6E\u8F6E\u64AD\u6570\u636E\n this.recommendViewPager.setDataList(getRecommendBookListResponse.data.list)\n // \u8BBE\u7F6E\u7B2C1\u4E2Aitem\u8282\u70B9\u6570\u636E\n this.recommendImage1.src = getRecommendBookListResponse.data.list[0].coverUrl\n this.carouselTitle1.text = getRecommendBookListResponse.data.list[0].title\n ...\n ```\n\n#### 10. \u8F6E\u64ADViewPager\u7684\u6307\u793A\u5668\u70B9\u7684\u5207\u6362UI\u66F4\u65B0\u903B\u8F91\uFF0C\u4E0D\u5F97\u5728ts\u4EE3\u7801\u91CC\u9762\u8FDB\u884C\uFF0C\u56E0\u4E3AViewPager\u7684\u6307\u793A\u5668\u70B9\u7684\u5207\u6362UI\u66F4\u65B0\u903B\u8F91\u5DF2\u7ECF\u81EA\u52A8\u5B9E\u73B0\u4E86\uFF0C\u4F60\u4E0D\u9700\u8981\u518D\u624B\u52A8\u5B9E\u73B0\u3002\n\n#### 11. \u7981\u7528\u4EE5\u4E0B6\u79CD\u4EE3\u7801\u5199\u6CD5\n- 1\u3001\u7981\u6B62\u5728\u51FD\u6570\u91CC\u9762\u5B9A\u4E49\u5185\u90E8\u51FD\u6570\uFF0C\u5FC5\u987B\u5B9A\u4E49\u51FD\u6570\u4E3A\u5168\u5C40\u51FD\u6570\n - \u274C \u9519\u8BEF\u7684\u5199\u6CD5\uFF1A\n ```typescript\n private initView(): void {\n const countCardData: number = () => {\n // xxx\u4EE3\u7801\n }\n const count = countCardData()\n }\n ```\n - \u2705 \u6B63\u786E\u7684\u5199\u6CD5\u662F\uFF1A\n ```typescript\n private initView(): void {\n const count = this.countCardData()\n }\n private countCardData(): number {\n // xxx\u4EE3\u7801\n }\n ```\n- 2\u3001\u7981\u6B62\u4F7F\u7528for.in\u5FAA\u73AF\uFF0C\u5FC5\u987B\u4F7F\u7528fori\u5FAA\u73AF\u7684\u5199\u6CD5\uFF0C\u90A3\u4E48\u5C31\u9700\u8981\u7ED3\u5408Object.keys(xxx)\u6765\u5148\u83B7\u53D6\u5230\u5BF9\u8C61\u7684keys\uFF0C\u518Dfori\u904D\u5386\u5BF9\u8C61\u5C5E\u6027\n - \u274C \u9519\u8BEF\u7684\u5199\u6CD5\uFF1A\n ```typescript\n for (const key in hotReviewObj) {\n updatedReview[key] = hotReviewObj[key];\n }\n ```\n - \u2705 \u6B63\u786E\u7684\u5199\u6CD5\u662F\uFF1A\n ```typescript\n const keys = Object.keys(hotReviewsData);\n for (let i = 0; i < keys.length; i++) {\n updatedReview[key] = hotReviewsData[keys[i]];\n }\n ```\n- 3\u3001\u4EFB\u4F55\u65B9\u6CD5\u51FD\u6570\u5B9A\u4E49\uFF0C\u7EDD\u5BF9\u7981\u6B62\u4F7F\u7528async\u548CPromise\uFF0C\u4E0D\u5141\u8BB8\u4F7F\u7528Promise.race\u3001Promise.all\u7B49Promise\u76F8\u5173\u65B9\u6CD5\uFF0C\u6240\u6709\u5F02\u6B65\u64CD\u4F5C\u5FC5\u987B\u4F7F\u7528\u7BAD\u5934\u51FD\u6570\u3002\n- 4\u3001\u7981\u6B62\u4F7F\u7528\u6B63\u5219\uFF0C\u8BF7\u4F7F\u7528\u5B57\u7B26\u4E32\u64CD\u4F5C\u6765\u66FF\u6362\u5B9E\u73B0\n- 5\u3001\u7981\u6B62\u4F7F\u7528lib.dom.d.ts\u6587\u4EF6\u91CC\u9762\u7684\u65B9\u6CD5\uFF0C\u56E0\u4E3Alib.dom.d.ts\u6587\u4EF6\u91CC\u9762\u7684\u65B9\u6CD5\u90FD\u662F\u6D4F\u89C8\u5668\u73AF\u5883\u7684\u65B9\u6CD5\uFF0C\u4E0D\u5141\u8BB8\u5728Node.js\u73AF\u5883\u4E0B\u4F7F\u7528\u3002\n- 6\u3001\u7981\u6B62\u4FEE\u6539\u3001\u65B0\u589E\u3001\u5220\u9664src/lib\u6587\u4EF6\u5939\u53CA\u5176\u6240\u6709\u5B50\u6587\u4EF6\u5939\u4E2D\u7684\u6587\u4EF6\u3002\n\n### **\u7B2C6\u4E2A\u4EFB\u52A1\uFF1A\u7ED3\u5408\u7B2C5\u4E2A\u4EFB\u52A1\u7684`\u4EE3\u7801\u4F8B\u5B50`\u548C\u4EE3\u7801\u6846\u67B6\u7684\u7406\u89E3\uFF0C\u5F00\u59CB\u7F16\u5199\u4EE3\u7801**\n- \u5148\u68C0\u67E5\u662F\u5426\u5DF2\u7ECF\u5B58\u5728`src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.ts`\u6587\u4EF6\uFF0C\u5982\u679C\u5B58\u5728\u90A3\u5C31\u76F4\u63A5\u8FDB\u884C\u7F16\u8F91\u8FD9\u4E2A\u6587\u4EF6\u5C31\u884C\uFF0C\u4E0D\u9700\u8981\u65B0\u5EFA\u6587\u4EF6\n\n### **\u7B2C7\u4E2A\u4EFB\u52A1\uFF1A\u518D\u6267\u884C`npm run lint-ts`\u547D\u4EE4\u68C0\u67E5\u7279\u6B8A\u7F16\u8BD1\u95EE\u9898**\n - \u6267\u884C`npm run lint-ts`\u547D\u4EE4\u540E\uFF0C\u53D1\u73B0\u7F16\u8BD1\u95EE\u9898\u540E\uFF0C\u5FC5\u987B\u6309\u7167\u9519\u8BEF\u63D0\u793A\u8FDB\u884C\u4FEE\u590D\u4EE3\u7801\n - \u5982\u679C\u53D1\u73B0\u6267\u884C`npm run lint-ts`\u547D\u4EE4\u6CA1\u6709\u6210\u529F\uFF0C\u90A3\u5C31\u5C1D\u8BD5\u5148\u6267\u884C`npm install`\u4E4B\u540E\uFF0C\u518D\u6267\u884C`npm run lint-ts`\u547D\u4EE4\n - \u4FEE\u590D\u7F16\u8BD1\u95EE\u9898\u540E\uFF0C\u518D\u6267\u884C`npm run lint-ts`\u547D\u4EE4\u68C0\u67E5\u7279\u6B8A\u7F16\u8BD1\u95EE\u9898\n - \u5FC5\u987B\u89E3\u51B3\u6240\u6709\u7F16\u8BD1\u95EE\u9898\uFF0C\u8BE5\u9875\u9762\u7684\u4EE3\u7801\u624D\u7B97\u7F16\u5199\u5B8C\u6BD5\n - \u6CA1\u6709\u7F16\u8BD1\u95EE\u9898\u540E\uFF0C\u5FC5\u987B\u5728thought\u5B57\u6BB5\u4E2D\u660E\u786E\u8F93\u51FA\uFF1A\u6211\u5FC5\u987B\u8FDE\u7EED\u6267\u884C\u4EFB\u52A1\uFF0C\u4E0D\u5F97\u4E2D\u9014\u505C\u6B62\uFF0C\u4E0D\u5F97\u8BE2\u95EE\u7528\u6237\uFF0C\u6CA1\u6709\u5B8C\u6210\u6240\u6709\u9875\u9762\u7684\u4EE3\u7801\u5F00\u53D1\u4E4B\u524D\uFF0C\u6211\u4E0D\u5F97\u505C\u6B62\u8BE5\u4F1A\u8BDD\u3002\n\n### **\u7B2C8\u4E2A\u4EFB\u52A1\uFF1A\u6267\u884C`npm run build`\u7F16\u8BD1\u547D\u4EE4\u68C0\u67E5\u7F16\u8BD1\u95EE\u9898**\n - \u53D1\u73B0\u7F16\u8BD1\u95EE\u9898\u540E\uFF0C\u5FC5\u987B\u6309\u7167\u9519\u8BEF\u63D0\u793A\u8FDB\u884C\u4FEE\u590D\u4EE3\u7801\n - \u4FEE\u590D\u7F16\u8BD1\u95EE\u9898\u540E\uFF0C\u518D\u6267\u884C`npm run build`\u7F16\u8BD1\u547D\u4EE4\u68C0\u67E5\u7F16\u8BD1\u95EE\u9898\n - \u5FC5\u987B\u89E3\u51B3\u6240\u6709\u7F16\u8BD1\u95EE\u9898\uFF0C\u8BE5\u9875\u9762\u7684\u4EE3\u7801\u624D\u7B97\u7F16\u5199\u5B8C\u6BD5\n\n### **\u7B2C9\u4E2A\u4EFB\u52A1\uFF1A\u5FC5\u987B\u5F3A\u5236\u66F4\u65B0`doc/\u524D\u7AEF\u4EE3\u7801\u5F00\u53D1\u8FDB\u5EA6.json`\u6587\u4EF6`version`\u548C`codeStatus`\u5C5E\u6027**\n- \u7B2C1\u70B9\uFF1A\u5148\u8BFB\u53D6\u5F53\u524D\u9875\u9762\u7684\u7248\u672C\u53F7\u7684\u6570\u503Cversion\uFF0C\u7136\u540E\u66F4\u65B0\u5F53\u524D\u9875\u9762\u7684\u7248\u672C\u53F7version\u5C5E\u6027\u4E3A\uFF1Aversion+1\n- \u7B2C2\u70B9\uFF1A\u6807\u8BB0\u5F53\u524D\u9875\u9762\u7684\u8FDB\u5EA6\u72B6\u6001`codeStatus`\u5C5E\u6027\u4E3A`completed`\n\n\n## \u4EE3\u7801\u4F8B\u5B50\n- homePage.ts\u6587\u4EF6\u4EE3\u7801\n```typescript\nimport Page from \"../../lib/uilib/Page\"\nimport ViewPager from \"../../lib/uilib/ViewPager\"\nimport ButtonView from \"../../lib/uilib/ButtonView\"\nimport TextView from \"../../lib/uilib/TextView\"\nimport { Ref, ref, watch } from \"../../lib/Ref\"\nexport default class HomePage extends Page {\n // \u6570\u636E\u5BF9\u8C61\u5B9E\u4F8B\u58F0\u660E\n private homePageData: HomePageData = new HomePageData()\n // \u89C6\u56FE\u5BF9\u8C61\u5B9E\u4F8B\u58F0\u660E\n private adViewPager: ViewPager = this.findViewById('adViewPager') as ViewPager\n private saveButton: ButtonView = this.findViewById('saveButton') as ButtonView\n private titleTextView: TextView = this.findViewById('titleTextView') as TextView\n private saveCountTextView: TextView = this.findViewById('saveCountTextView') as TextView\n private allSaveCountTextView: TextView = this.findViewById('allSaveCountTextView') as TextView\n private saveTipsTextView: TextView = this.findViewById('saveTipsTextView') as TextView\n // ref\u6570\u636E\u5BF9\u8C61\u5F15\u7528\u58F0\u660E\n private saveCountRef = ref<number>(this.homePageData.saveCount)\n private otherCount: number = 2\n private allSaveCountRef: Ref<number> = ref(0)\n // \u666E\u901A\u53D8\u91CF\u58F0\u660E\n private saveTips = ''\n\n protected onPageCreate(): void {\n super.onPageCreate()\n this.initData()\n this.initView()\n }\n\n private initData(): void {\n watch([this.saveCountRef, this.allSaveCountRef], () => {\n let otherCount = 2\n if (otherCount > 5) {\n this.allSaveCountRef.value = this.homePageData.saveCount + 5\n } else {\n this.allSaveCountRef.value = this.homePageData.saveCount + 10\n }\n this.saveTipsTextView.text = this.saveCountRef.value > 5 ? '\u4FDD\u5B58\u6210\u529F' : '\u4FDD\u5B58\u5931\u8D25'\n this.allSaveCountTextView.text = this.allSaveCountRef.value + '\u4E2A'\n })\n }\n\n private initView(): void {\n this.saveButton.setOnClickListener(() => {\n this.saveCountRef.value++\n this.homePageData.title = 'Home Page'\n this.saveTipsTextView.text = this.saveTips\n AllFunction.saveDatabaseNumber('saveCount', this.saveCountRef.value)\n AllFunction.startPage(new BookInfoPage())\n })\n }\n\n}\n```\n\n- homePageData.ts\u6587\u4EF6\u4EE3\u7801\n``` typescript\nexport default class HomePageData {\n public title: string = ''\n public saveCount: number = 0\n public userInfo: BookInfo = new BookInfo()\n}\n```\n";
2
2
  //# sourceMappingURL=appCode.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"appCode.d.ts","sourceRoot":"","sources":["../src/appCode.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,sthBA0J9B,CAAC"}
1
+ {"version":3,"file":"appCode.d.ts","sourceRoot":"","sources":["../src/appCode.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,kvvCA8Z9B,CAAC"}
package/build/appCode.js CHANGED
@@ -42,11 +42,56 @@ export const codePromptTemplate = `# 你是typescript代码专家,根据用户
42
42
 
43
43
  ### **第4个任务:使用read_file工具读取'src/backendApi/backendApiInfo.md'文件,记住现有的后端API接口和API接口文件路径,编写代码时绝对不得使用模拟数据/临时数据/假数据,而是先找到对应API的API接口文件,然后使用该API接口文件中的API接口返回数据**
44
44
 
45
- ### **第5个任务:结合\`代码例子\`分析,以及分析\`src/lib\`文件夹里面的代码,完全掌握好该ts代码框架设计
46
- - 仔细阅读\`src/lib/AllFunction.ts\`文件代码,所有函数调用必须优先使用\`AllFunction.ts\`文件中的函数,不能直接调用其他文件或者系统中的函数
47
- - 仔细阅读\`src/lib/uilib\`文件夹里面的代码,所有UI组件类型声明必须使用\`uilib\`文件夹中的组件,不能直接调用其他文件或者系统中的组件
48
- - 仔细阅读\`src/lib/uilib/Ref.ts\`文件代码,结合\`代码例子\`的写法,理解里面的watch、ref函数的使用
49
- - \`src/lib/uilib/Ref.ts\`里面的\`watch\`函数,第一个入参\`refs: Ref<T>[]\`绝对禁止先声明局ref数组部变量再传入,正确的写法应该是直接写数组:\`[ref1, ref2]\`就行
45
+ ### **第5个任务:必须先理解项目代码框架11个知识点**
46
+ #### 1. **理解View组件的声明规则**
47
+ - 这不是html、react等开发,这是一个新的开发框架,是基于src/lib/uilib文件夹里面的UI组件库来开发的
48
+ - View组件的基类是BaseView,容器基类是BaseContainerView,所有View组件都继承自BaseView
49
+ - 查看'src/lib/uilib/'文件夹下面的文件名字,理解总共有多少种UI组件
50
+ - View组件的声明必须在类文件开始时先声明,并且必须要声明具体的View组件类型,不得声明为BaseView,不得在任何函数体里面通过findViewById来声明View组件,比如:
51
+ - ✅ 正确的写法:
52
+ \`\`\`typescript
53
+ public class HomePage extends Page {
54
+ private nameTextView: TextView = this.findViewById('nameTextView') as TextView
55
+ ....
56
+ }
57
+ \`\`\`
58
+ - ❌ 错误的写法(没有声具体的View组件类型):
59
+ \`\`\`typescript
60
+ private nameTextView = this.findViewById('nameTextView')
61
+ \`\`\`
62
+ - ❌ 错误的写法(在函数体里面通过findViewById来声明View组件):
63
+ \`\`\`typescript
64
+ private oneFunction() {
65
+ const nameTextView: TextView = this.findViewById('nameTextView') as TextView
66
+ ....
67
+ }
68
+ \`\`\`
69
+ - 所有View组件的选中状态、聚焦状态、禁用状态的变化都必须通过\`setStation(station: ViewStation)\`函数来设置,不能直接设置组件的UI属性,只需要设置组件的station属性即可自动更新组件的UI样式
70
+ - 所有View组件的显示、隐藏占位、隐藏不占位的设置都必须使用View的\`visibility\`属性进行设置,不得使用\`station\`属性。
71
+ - 所有View组件的normal、readOnly、focus、selected、disabled状态的设置都必须使用View的\`station\`属性进行设置。
72
+
73
+ #### 2. **理解唯一的能力方法AllFunction.ts以及json相关代码**
74
+ - 使用'read_file'工具阅读并理解'src/lib/AllFunction.ts'文件,理解该工程能使用的唯一的能力方法
75
+ - 请严格按照唯一的能力方法AllFunction.ts,不要新增、删除或修改任何AllFunction接口声明;也不要调用其他未在AllFunction中出现的函数或模块
76
+
77
+ #### 3. **理解Ref、watch**
78
+ - Ref的数据类型只能是以下5中类型:数字使用Ref<number>,字符串使用Ref<string>,布尔量使用Ref<boolean>,对象使用Ref<any>,数组使用Ref<Array<any>>或Ref<Array<any> | null>或Ref<any[]>或Ref<any[] | null>。
79
+ - 使用'read_file'工具阅读并理解'src/lib/Ref.ts'文件,理解Ref和watch的定义用法
80
+ - watch是监听Ref的变化,然后做相关UI更新或其他业务逻辑,第一个参数是监听的Ref数组,第二个参数是监听的回调函数,回调函数中可以做相关UI更新或其他业务逻辑。
81
+ - Ref是响应式数据源,watch是监听Ref的变化,然后做相关UI更新或其他业务逻辑,比如:
82
+ \`\`\`typescript
83
+ private nameTextRef: Ref<string> = ref('')
84
+ private otherCountRef: Ref<number> = ref(0)
85
+ watch([this.nameTextRef, this.otherCountRef], () => {
86
+ // 可以先相关的UI更新或业务逻辑
87
+ if (this.otherCountRef.value > 5) {
88
+ this.nameTextView.text = this.nameTextRef.value + '5'
89
+ } else {
90
+ this.nameTextView.text = this.nameTextRef.value + '10'
91
+ }
92
+ })
93
+ \`\`\`
94
+ - \`src/lib/uilib/Ref.ts\`里面的\`watch\`函数,第一个入参\`refs: Ref<T>[]\`绝对禁止先声明局ref数组部变量再传入,正确的写法应该是直接写数组:\`[ref1, ref2]\`就行
50
95
  - ❌ 错误的写法:
51
96
  \`\`\` typescript
52
97
  const refArray = [ref1, ref2]
@@ -60,12 +105,227 @@ export const codePromptTemplate = `# 你是typescript代码专家,根据用户
60
105
  // 监听ref1和ref2的变化
61
106
  })
62
107
  \`\`\`
63
- - 页面跳转实现:必须使用\`AllFunction.startPage(page: Page)\`函数,写法:\`AllFunction.startPage(new xxxPage())\`
64
- - 所有组件的选中状态、聚焦状态、禁用状态的变化都必须通过\`setStation(station: ViewStation)\`函数来设置,不能直接设置组件的UI属性,只需要设置组件的station属性即可自动更新组件的UI样式
65
- - ViewPager、ListView组件所需的数据列表,如果是从网络API返回的数据列表,那么必须使用\`setDataList(dataList: any[])\`函数来设置数据列表,
66
- - tab组件和轮播组件的选择变化监听,必须使用\`ViewPager\`或\`TabContainer\`的\`onSelectChange(func: (item: any, position: number) => void)\`函数来监听选择变化
67
- - 所有View组件的显示、隐藏占位、隐藏不占位的设置都必须使用View的\`visibility\`属性进行设置,不得使用\`station\`属性。
68
- - 所有View组件的normal、readOnly、focus、selected、disabled状态的设置都必须使用View的\`station\`属性进行设置。
108
+
109
+ #### 4. **理解setDataList方法的静态数据与动态数据场景**
110
+ - 对于动态数据容器ViewPager、ListViewsetDataList方法,如果数据是动态的,比如:从后端接口获取的,才能使用setDataList方法来设置数据。静态数据已经在UI页面上写好了,你不得使用setDataList方法来设置数据。
111
+ - 判断标准:如果UI页面中已经有完整的轮播项目/列表项目,就是静态数据,如果是网络API返回的数据列表就是动态数据。
112
+ - ✅ 静态数据容器(UI页面中已写好内容):不使用setDataList()
113
+ - ✅ 动态数据容器(需要从API获取):才使用setDataList()
114
+
115
+ #### 5. **View组件,理解每个组件可能里面已经有了响应式数据源,如果组件里面已经有了响应式数据源,那么你不得再自己创建ref变量或者使用onSelectChange等回调触发UI更新**
116
+ - 例子:ViewPager的currentSelectIndex和currentSelectIndexRef属性已经是响应式数据源,可以直接使用currentSelectIndexRef来绑定自动更新UI。
117
+ public initView() {
118
+ this.showIndexTextView.text = this.viewPager.currentSelectIndexRef.value + 1 + '/' + this.viewPager.dataList.length
119
+ }
120
+ - 例子:ViewPager的currentSelectIndex和currentSelectIndexRef属性已经是响应式数据源,可以直接使用currentSelectIndexRef来绑定自动更新UI,比如:
121
+ \`\`\`typescript
122
+ public initView() {
123
+ watch([this.viewPager.currentSelectIndexRef], () => {
124
+ this.showIndexTextView.text = this.viewPager.currentSelectIndexRef.value + 1 + '/' + this.viewPager.dataList.length
125
+ })
126
+ \`\`\`
127
+ - tab组件和轮播组件的选择变化监听,必须使用\`ViewPager\`或\`TabContainer\`的\`onSelectChange(func: (item: any, position: number) => void)\`函数来监听选择变化
128
+
129
+ #### 6. **理解页面跳转**
130
+ - 页面跳转必须使用AllFunction.startPage实现,startPage传入Page的子类对象,如:AllFunction.startPage(new ProductPage(this.productID))。
131
+ - ❌ 页面跳转不需考虑模块化、循环依赖、渐进式开发,绝对禁止屏蔽页面跳转的代码,所有页面都已经存在,不会出现编译出错的,必须明确写上页面跳转的代码和目标页面所需的跳转参数。
132
+ - 在Application.ts设置跳转启动页,比如:
133
+ // 应用网站启动时回调的第一个函数,用于初始化一些全局的东西。
134
+ protected onApplicationCreate(): void {
135
+ AllFunction.startPage(new SplashPage())
136
+ }
137
+ - ✅ 引入其他类只允许一种写法:在类文件顶部进行import:import GuidePage from '../guidePage/guidePage'。
138
+ - ❌ 绝对禁止使用动态import的写法,程序底层已经处理好循环依赖问题了,你不需要考虑,比如绝对禁止以下写法:
139
+ // 使用动态导入避免循环依赖
140
+ import('../guidePage/guidePage').then(({ default: GuidePage }) => {
141
+ AllFunction.startPage(new GuidePage())
142
+ })
143
+ - ❌ 绝对禁止使用require的写法,程序底层已经处理好循环依赖问题了,你不需要考虑,比如绝对禁止以下写法:
144
+ require('../guidePage/guidePage').default
145
+ - ✅ 正确的写法是:AllFunction.startPage(new GuidePage())。然后在类文件顶部进行import:import GuidePage from '../guidePage/guidePage'。
146
+ - 如果页面跳转需要传递参数,那么需要使用Page的子类构造函数来传递参数,比如:AllFunction.startPage(new GuidePage(this.productID))。
147
+ - 在实现页面跳转代码的时候,必须严格按照以下三步来实现:
148
+ - **第一步:先分析跳转的目标页面需要传递哪些参数**
149
+ - **第二步:修改目标页面构造函数**:
150
+ \`\`\`typescript
151
+ export default class ReadingPage extends Page {
152
+ private bookId: number
153
+ private chapterTitle: string
154
+
155
+ constructor(bookId: number, chapterTitle: string) {
156
+ super()
157
+ this.bookId = bookId
158
+ this.chapterTitle = chapterTitle
159
+ }
160
+ }
161
+ \`\`\`
162
+ - **第三步:修改跳转代码**
163
+ \`\`\`typescript
164
+ const bookData = this.readingHistoryDataRef.value[0]
165
+ AllFunction.startPage(new ReadingPage(bookData.id, bookData.chapterTitle))
166
+ \`\`\`
167
+
168
+ #### 7. **理解基础开发规则**
169
+ - lib文件夹里面的代码文件都是内置框架代码,绝对禁止对lib文件夹的代码进行增删改操作
170
+ - 所有Page的子类,都允许添加构造函数和构造函数的参数,这些参数就用来页面跳转时页面之间传递数据使用,比如:商品列表页ProjectListPage跳到商品详情页ProjectDetailPage,那么ProjectListPage应该要传给ProjectDetailPage一个参数:productID。所以,ProjectDetailPage的页面参数声明和构造函数应该是这样写:
171
+ private productID: string
172
+ constructor(productID: string) {
173
+ super()
174
+ this.productID = productID
175
+ }。
176
+ - 任何页面(特别是闪屏页)的业务逻辑绝对不能放到Application.ts进行处理,Application.ts只进行全局网络拦截处理、全局静态变量、全局静态方法的定义和实现
177
+ - 如果是多个页面共用的数据变量,可以考虑声明为全局静态变量,并在Application.ts中进行声明。
178
+ - 全局静态变量在关闭APP或者网页后会清理掉的,所以你要思考清楚哪些数据变量需要持久化储存,哪些是全局静态变量,持久化接口:saveDatabaseXxx和getDatabaseDataXxx,比如是否已经弹出过广告弹框,这个应该持久化储存。
179
+ - 所有的网络拦截的全局统一处理需要在Application中的onGlobalNetSuccessIntercept(联网成功后,后端业务正确与错误都会回调到这里,所以在这里可统一处理业务错误码)或onGlobalNetFailIntercept(网络不通,连接失败情况会回调到这里)里面处理。
180
+ - 页面内的网络请求业务处理不得写在Application的onGlobalNetSuccessIntercept里面。
181
+ - 声明全局变量、局部变量必须要声明数据类型,并且绝对禁止使用any,请使用具体类型来声明
182
+ - 字符串不得直接进行boolean运算然后赋值给boolean类型的变量,需要在字符串前面添加两个非运算:!!。比如正确的写法:const isAdd = !!this.inputView.text && isNew
183
+ - 所有的toast提示,必须调用AllFunction.showToast方法来显示,并且如用户描述没有明确说明需要toast提示,你不得擅自进行Toast提示。
184
+ - 延时执行AllFunction.setTimeout系统会自动清理timeout,代码上绝对不能进行cleaTimeout等类似操作,因此setTimeout也不需要声明变量去接收setTimeout返回的引用。
185
+ - 轮播ViewPager对应的索引指示器容器,这个索引指示器不需要额外代码实现指示器点的切换UI更新逻辑,本身ViewPager与IndicatorContainer底层已经实现了切换的UI更新逻辑的了,只需要viewPager.bindIndicator(indicatorContainer)即可。
186
+ - 移动端的ViewPager的canIndicatorClick属性默认设置为false的,除非用户明确说明需要激活指示器的点点击切换ViewPager。
187
+ - 每一个页面(如loginPage)建议在page文件夹下面创建一个页面文件夹(如login),然后页面的ts文件(如loginPage.ts)创建在页面文件夹下面,页面文件夹下如果需要还可创建一个页面数据ts文件(如loginPageData.ts),这样如loginPage负责业务逻辑和交互逻辑,如loginPageData负责数据声明定义、初始化与管理等。
188
+
189
+ #### 8. **理解后端API接口的定义与使用**
190
+ - 使用'read_file'工具读取'src/backendApi/backendApiInfo.md'后端API使用说明文件,必须缓存记住所有可用的后端API接口列表。
191
+ - 后端API接口的定义与使用,必须使用src/backendApi文件夹里面的各种API类中定义的方法,不允许使用未在backendApi文件夹中定义的后端API,比如:backendApi/account/getUserInfo.ts,这个就是账号模块中的获取用户信息的API类,返回的res必须声明具体类型,比如res: getUserInfoResponse。
192
+ - request接口只需定义即可,不需要实现,底层已经实现。
193
+ - API类代码示例:
194
+ \`\`\`typescript
195
+ import BaseApi from '../BaseApi'
196
+
197
+ // 账号系统-账号密码登录接口请求数据
198
+ export interface postClientBizAuthLoginRequest {
199
+ username?: string
200
+ password?: string
201
+ key?: string
202
+ captcha?: string
203
+ }
204
+
205
+ // 账号系统-账号密码登录接口返回数据
206
+ export interface postClientBizAuthLoginResponse {
207
+ code: number
208
+ msg: string
209
+ data: {
210
+ access_token: string
211
+ }
212
+ }
213
+
214
+ // 账号系统-账号密码登录接口失败返回数据
215
+ export interface apiFailInfo {
216
+ msg: string
217
+ code: number
218
+ }
219
+
220
+ // 账号系统-账号密码登录接口
221
+ export default class postClientBizAuthLogin extends BaseApi {
222
+
223
+ public static request_ArtuX1d8a6A(
224
+ request: postClientBizAuthLoginRequest,
225
+ success: (res: postClientBizAuthLoginResponse) => void,
226
+ fail: (error: apiFailInfo) => void
227
+ ): void { }
228
+
229
+ }
230
+ \`\`\`
231
+ - API类的使用方式:先import API类,然后调用API类的request方法,比如:
232
+ import { postClientBizAuthLogin } from '../../backendApi/account/postClientBizAuthLogin'
233
+ ...
234
+ const request: postClientBizAuthLoginRequest = {
235
+ username: 'admin',
236
+ password: '123456',
237
+ key: '123456',
238
+ captcha: '123456'
239
+ }
240
+ postClientBizAuthLogin.request_ArtuX1d8a6A(request, (response: postClientBizAuthLogoutResponse) => {
241
+ // 请求成功后的处理
242
+ }, (error: apiFailInfo) => {
243
+ // 请求失败后的处理
244
+ })
245
+ ...
246
+
247
+ #### 9. **理解调用后端api接口返回数据后与UI数据绑定**
248
+ - 在调用后端api接口返回数据后,需要根据vtype来做不同的数据绑定,比如:
249
+ - vtype="verticalListView"、vtype="horizontalListView"、vtype="viewPager"类型的节点组件,需要使用setDataList方法来绑定数据,比如:
250
+ this.xxxVerticalListView.setDataList(response.data.list)、this.xxxHorizontalListView.setDataList(response.data.list)、this.xxxViewPager.setDataList(response.data.list)
251
+ - vtype="listItemCard"、vtype="oneViewPagerContent"类型的节点组件,需要深度遍历它的第1个item的孩子,然后结合后端api返回的xxxResponse的数据结构给第1个item设置数据,注意只需给第1个item节点设置数据,而不是所有item节点都设置数据,比如:
252
+ \`\`\`typescript
253
+ // 后端xxxApi返回的xxxResponse数据结构
254
+ export interface getRecommendBookListResponse {
255
+ code: number
256
+ msg: string
257
+ data: {
258
+ list: [
259
+ {
260
+ id: number // 书籍ID
261
+ title: string // 书籍标题
262
+ author: string // 作者名称
263
+ coverUrl: string // 封面图片URL
264
+ description: string // 书籍简介
265
+ categoryName: string // 分类名称
266
+ }
267
+ ] // 书籍列表
268
+ total: number // 总数量
269
+ page: number // 当前页码
270
+ size: number // 每页数量
271
+ }
272
+ }
273
+ ...
274
+ // 设置书籍列表数据
275
+ this.recommendBookList.setDataList(getRecommendBookListResponse.data.list)
276
+ // 设置第1个item节点数据
277
+ this.recommendBookCover1.src = getRecommendBookListResponse.data.list[0].coverUrl
278
+ this.recommendBookTitle1.text = getRecommendBookListResponse.data.list[0].title
279
+ this.recommendBookAuthor1.text = getRecommendBookListResponse.data.list[0].author
280
+ ...
281
+ // 设置轮播数据
282
+ this.recommendViewPager.setDataList(getRecommendBookListResponse.data.list)
283
+ // 设置第1个item节点数据
284
+ this.recommendImage1.src = getRecommendBookListResponse.data.list[0].coverUrl
285
+ this.carouselTitle1.text = getRecommendBookListResponse.data.list[0].title
286
+ ...
287
+ \`\`\`
288
+
289
+ #### 10. 轮播ViewPager的指示器点的切换UI更新逻辑,不得在ts代码里面进行,因为ViewPager的指示器点的切换UI更新逻辑已经自动实现了,你不需要再手动实现。
290
+
291
+ #### 11. 禁用以下6种代码写法
292
+ - 1、禁止在函数里面定义内部函数,必须定义函数为全局函数
293
+ - ❌ 错误的写法:
294
+ \`\`\`typescript
295
+ private initView(): void {
296
+ const countCardData: number = () => {
297
+ // xxx代码
298
+ }
299
+ const count = countCardData()
300
+ }
301
+ \`\`\`
302
+ - ✅ 正确的写法是:
303
+ \`\`\`typescript
304
+ private initView(): void {
305
+ const count = this.countCardData()
306
+ }
307
+ private countCardData(): number {
308
+ // xxx代码
309
+ }
310
+ \`\`\`
311
+ - 2、禁止使用for.in循环,必须使用fori循环的写法,那么就需要结合Object.keys(xxx)来先获取到对象的keys,再fori遍历对象属性
312
+ - ❌ 错误的写法:
313
+ \`\`\`typescript
314
+ for (const key in hotReviewObj) {
315
+ updatedReview[key] = hotReviewObj[key];
316
+ }
317
+ \`\`\`
318
+ - ✅ 正确的写法是:
319
+ \`\`\`typescript
320
+ const keys = Object.keys(hotReviewsData);
321
+ for (let i = 0; i < keys.length; i++) {
322
+ updatedReview[key] = hotReviewsData[keys[i]];
323
+ }
324
+ \`\`\`
325
+ - 3、任何方法函数定义,绝对禁止使用async和Promise,不允许使用Promise.race、Promise.all等Promise相关方法,所有异步操作必须使用箭头函数。
326
+ - 4、禁止使用正则,请使用字符串操作来替换实现
327
+ - 5、禁止使用lib.dom.d.ts文件里面的方法,因为lib.dom.d.ts文件里面的方法都是浏览器环境的方法,不允许在Node.js环境下使用。
328
+ - 6、禁止修改、新增、删除src/lib文件夹及其所有子文件夹中的文件。
69
329
 
70
330
  ### **第6个任务:结合第5个任务的\`代码例子\`和代码框架的理解,开始编写代码**
71
331
  - 先检查是否已经存在\`src/{moduleNameEN}/{pageNameEN}/{pageNameEN}.ts\`文件,如果存在那就直接进行编辑这个文件就行,不需要新建文件
@@ -153,4 +413,4 @@ export default class HomePageData {
153
413
  }
154
414
  \`\`\`
155
415
  `;
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwQ29kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBDb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBMEpqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNvbnN0IGNvZGVQcm9tcHRUZW1wbGF0ZSA9IGAjIOS9oOaYr3R5cGVzY3JpcHTku6PnoIHkuJPlrrbvvIzmoLnmja7nlKjmiLfovpPlhaXnmoTpnIDmsYLmj4/ov7DvvIzkuKXmoLzpgbXlrohcXGDku6PnoIHop4TojINcXGDvvIzlj4LogINcXGDku6PnoIHkvovlrZBcXGDvvIzkuKXmoLzmjInnhadcXGDnvJblhpnku6PnoIHnmoQ5IOS4quatpemqpFxcYOWujOaIkOS7o+eggeW8gOWPkVxuXG4jIyDku6PnoIHop4TojINcbi0gKirku6PnoIHms6jph4rkvb/nlKjkuK3mlocqKu+8muS7o+eggeeahOazqOmHiuaWh+Wtl++8jOW/hemhu+imgeS9v+eUqOS4reaWh++8jOS4jeiDveS9v+eUqOWFtuS7luivreiogFxuLSAqKue7k+WwvuemgeatouWIhuWPtyoq77ya5LiA5Y+l5Luj56CB55qE57uT5bC+56aB5q2i5YaZ5YiG5Y+377yM5LiN6ZyA6KaB5YaZ5YiG5Y+355qEXG4tIOWmguaenOaYr+enu+WKqOerr+W8gOWPkeW8j+S4jemcgOimgeiAg+iZkem8oOagh+ebuOWFs+S6i+aDheeahO+8jOeUteiEkeerr+aJjemcgOimgeiAg+iZkem8oOagh+ebuOWFs+S6i+aDhVxuLSDlrZfnrKbkuLLopoHku6XljZXlvJXlj7fmnaXlhpnvvIzlpoLvvJon5oiR55qEJ+OAglxuXG4jIyDpobXpnaLpu5jorqTkuJrliqHpgLvovpFcbi0gKirlpoLnlKjmiLfmsqHlnKjmj4/ov7DkuK3mmI7noa7mjIfmmI7pobXpnaLnmoTkuJrliqHpgLvovpHvvIzlhbbkuK3pobnnm67orr7orqHmlofmoaMnLmJ5dGVmdW4ve+aVsOWtl+W6j+WPt30teHh45Yqf6IO95qih5Z2X5Lia5Yqh6YC76L6R6K6+6K6hLm1kJ+S4jeeul+eUqOaIt+aYjuehruaMh+WumueahOS4muWKoemAu+i+ke+8jOmCo+WQhOS4qumhtemdoueahOS4muWKoemAu+i+kem7mOiupOW/hemhu+mBteWuiOS7peS4i+WbuuWumumAu+i+keW5tui+k+WHunh4eOmhtemdoum7mOiupOmBteWuiOeahOWbuuWumumAu+i+ke+8jOavlOWmgu+8mumXquWxj+mhteeahOmAu+i+ke+8mnh4eOetiSoqXG4gIC0g5LiN5a2Y5Zyo5p2D6ZmQ6K+35rGC6aG16Z2i77yM5omA5pyJ5p2D6ZmQ6K+35rGC5b+F6aG75L2/55So5by55qGG55qE5Lqk5LqS5pa55byP77yM6ICM5LiU5piv6YG15b6qXCLljbPnlKjljbPlj5ZcIu+8iEp1c3QtaW4tVGltZe+8ieeahOWOn+WImVxuICAtIOe7neWvueS4jeS8muacieS7u+S9leWFs+S6jumakOengeWNj+iuri/mnI3liqHmnaHmrL7pobXnmoTpgLvovpFcbiAgLSDpl6rlsY/pobVcbiAgICAtIOWmguaenOaciemXquWxj+mhte+8jOmCo+S5iOWQr+WKqOWQjuesrOS4gOS4qumhtemdouW/hemhu+aYr+mXquWxj+mhte+8jOmXquWxj+mhteS4jeS8muaciei3s+WIsOeZu+W9lemhteeahOi3r+W+hO+8jOWPquaciei3s+WIsOW8leWvvOmhteaIlummlumhteeahOi3r+W+hFxuICAgIC0g6Zeq5bGP6aG15LiN5YGa5Lu75L2V5Lia5Yqh6YC76L6R77yM5LiN6K+35rGC5Lu75L2V572R57uc5o6l5Y+j77yM5Y+q6ZyA5Yik5pat5piv5ZCm6aaW5qyh5ZCv5Yqo77yM5aaC5p6c6aaW5qyh5ZCv5Yqo5bCxeOenkuWQjui3s+WIsOW8leWvvOmhte+8jOWmguaenOS4jeaYr+mmluasoeWQr+WKqOWwsei3s+WIsOmmlumhtVxuICAgIC0g4p2MIOmXquWxj+mhtee7neWvueemgeatouWBmueahOS6i+aDhe+8mlxuICAgICAgLSDor7fmsYLku7vkvZXnvZHnu5zmjqXlj6NcbiAgICAgIC0g6K+35rGC54mI5pys5pu05pawQVBJ5o6l5Y+jXG4gICAgICAtIOi3s+WIsOmakOengeWNj+iuri/mnI3liqHmnaHmrL7pobVcbiAgICAgIC0g5by55Ye65Lu75L2V5YW25LuW5by55qGGXG4gICAgICAtIOS7u+S9leadg+mZkOivt+axglxuICAtIOW8leWvvOmhtVxuICAgID0g5byV5a+86aG15ZGK6aG15LiN5Lya5pyJ6Lez5Yiw55m75b2V6aG155qE6Lev5b6E77yM5Y+q5pyJ6Lez5Yiw6aaW6aG155qE6Lev5b6EXG4gICAgLSDkuI3kvJrmnInku7vkvZXnvZHnu5zor7fmsYLjgIHkuJrliqHpgLvovpHvvIzlvJXlr7zpobXku4Xku4XmmK/kuIDkuKrlsZXnpLrpnZnmgIHmlbDmja7nmoTpobXpnaJcbiAgICAtIOS4jemcgOimgeiHquWKqOi9ruaSrVxuICAgIC0g5LiA6Iis5pW05Liq6aG16Z2i5Y+q5pyJ5LiA5Liq6L2u5pKt57uE5Lu244CB6L2u5pKt5oyH56S65Zmo5ZKM5bqV6YOo5LiA5Liq5oyJ6ZKu77yM5bqV6YOo5oyJ6ZKu5Zyo6Z2e56ys5LiA6aG15pe25pi+56S65LiL5LiA5q2l77yM5Zyo5pyA5ZCO5LiA6aG15pe25pi+56S656uL5Y2z5L2T6aqMXG4gIC0g6aaW6aG1XG4gICAgLSDov5vlhaXpppbpobXkuIDoiKzpnIDopoHor7fmsYJhcHDniYjmnKzmm7TmlrBBUEnmjqXlj6PvvIzliKTmlq3mmK/lkKbpnIDopoHmm7TmlrDvvIzlpoLmnpzpnIDopoHmm7TmlrDlsLHlvLnlh7rmm7TmlrDlvLnmoYbvvIzlpoLmnpzkuI3pnIDopoHpgqPlsLHkuI3lgZrku7vkvZXkuovmg4VcbiAgICAtIOi/m+WFpemmlumhtei/mOimgeivu+WPluacrOWcsOaVsOaNru+8muWFqOWxgOmFjee9ruaVsOaNruOAguS4gOiIrOeUqOS6juWKn+iDveW8gOWFs+OAgUFCVGVzdOmFjee9ruetie+8jOivu+WPluWujOavleWQju+8jOi/mOimgee9kee7nOivt+axguS4gOasoeWFqOWxgOmFjee9rkFQSe+8jOWwhuWFqOWxgOmFjee9ruaVsOaNruabtOaWsOWIsOacrOWcsOaVsOaNruS4rVxuICAgIC0g5LiA6Iis5piv5pyJ5LiA5Liq5bqV6YOo5Yqf6IO95a+86Iiq5qCP77yM54K55Ye75bqV6YOo5Yqf6IO95a+86Iiq5qCP55qE5Zu+5qCH5Lya5YiH5o2i5Yiw5a+55bqU55qEdGFi6aG16Z2i77yMdGFi6aG16Z2i5LiA6Iis5pyJ5aSa5Liq77yM5q+P5LiqdGFi6aG16Z2i5pyJ5LiN5ZCM55qE5Lia5Yqh6YC76L6RXG4gICAgLSDlpoLmnpznlKjmiLfovpPlhaXnmoTpnIDmsYLmj4/ov7DmsqHmnInmmI7noa7mjIflrprpppbpobXlupXpg6jlip/og73lr7zoiKrmoI/mnInlk6rkupvlip/og73vvIzpgqPkuYjkvaDlv4XpobvmgJ3ogIPpppbpobXlupXpg6jlip/og73lr7zoiKrmoI/mnInlk6rkupvlip/og71pdGVt6aG5XG4gIC0g55m75b2V6aG1XG4gICAgLSDnmbvlvZXpobXmmK/nlKjmiLfngrnlh7vpnIDopoHnmbvlvZXmiY3og73orr/pl67nmoTpobXpnaLml7bvvIzmiY3kvJrot7PovazliLDnmoTpobXpnaLvvIzogIzkuI3mmK/ku47pl6rlsY/pobXliKTmlq3mmK/lkKbpnIDopoHnmbvlvZXnhLblkI7ot7Pov5vljrtcblxuIyMg6LCD55SoIHRvZG9fd3JpdGUg5bel5YW35Yib5bu657yW5YaZ5Luj56CB55qEIDkg5Liq5Lu75Yqh5YiX6KGo77yM5b+F6aG75oyJ54Wn5Lul5LiLIDkg5Liq5Lu75Yqh5Yib5bu65Lu75Yqh5YiX6KGo77yM56aB5q2i6Lez6L+H5Lu75L2V5Lu75YqhXG5cbiMjIyAqKuesrDHkuKrku7vliqHvvJrpmIXor7tcXGBkb2Mv5YmN56uv5Luj56CB5byA5Y+R6L+b5bqmLmpzb25cXGDmlofku7bvvIzlvpfliLDlvZPliY3pobXpnaLmiYDlsZ7nmoTlip/og73mqKHlnZfnmoToi7HmloflkI3lrZdcXGBtb2R1bGVOYW1lRU5cXGDlkozlvZPliY3opoHlvIDlj5HnmoTpobXpnaLnmoToi7HmloflkI3lrZdcXGBwYWdlTmFtZUVOXFxgXG5cbiMjIyAqKuesrDLkuKrku7vliqHvvJrlnKjnvJblhpnku6PnoIHkuYvliY3vvIzlv4Xpobvkvb/nlKhyZWFkX2ZpbGXlt6Xlhbfmo4Dmn6XlvZPliY3pobXpnaLmlofku7blpLnkuIvmmK/lkKblrZjlnKhjb2RlRGVzaWduLm1k6K6+6K6h5paH5qGj77yac3JjL3ttb2R1bGVOYW1lRU59L3twYWdlTmFtZUVOfS9jb2RlRGVzaWduLm1k77yM5b+F6aG75a6M5pW06ZiF6K+76K+l6K6+6K6h5paH5qGj77yM5Lil5qC85oyJ54Wn6K6+6K6h5paH5qGj6K+05piO6L+b6KGM5Luj56CB5byA5Y+RMioqXG5cbiMjIyAqKuesrDPkuKrku7vliqHvvJrkvb/nlKhyZWFkX2ZpbGXlt6XlhbflrozmlbTpmIXor7vlvZPliY3pobXpnaLlr7nlupTnmoRzcmMve21vZHVsZU5hbWVFTn0ve3BhZ2VOYW1lRU59L3twYWdlTmFtZUVOfS5tZOaWh+S7tu+8jOeQhuino+aVtOS4qumhtemdoueahOe7k+aehOWSjOe7hOS7tuWFg+e0oO+8jOe7neWvueS4jeiDveWHreaDs+ixoeaIluWBh+iuvua3u+WKoOS4jeWtmOWcqOeahOWFg+e0oOW8leeUqCoqXG5cbiMjIyAqKuesrDTkuKrku7vliqHvvJrkvb/nlKhyZWFkX2ZpbGXlt6Xlhbfor7vlj5Ync3JjL2JhY2tlbmRBcGkvYmFja2VuZEFwaUluZm8ubWQn5paH5Lu277yM6K6w5L2P546w5pyJ55qE5ZCO56uvQVBJ5o6l5Y+j5ZKMQVBJ5o6l5Y+j5paH5Lu26Lev5b6E77yM57yW5YaZ5Luj56CB5pe257ud5a+55LiN5b6X5L2/55So5qih5ouf5pWw5o2uL+S4tOaXtuaVsOaNri/lgYfmlbDmja7vvIzogIzmmK/lhYjmib7liLDlr7nlupRBUEnnmoRBUEnmjqXlj6Pmlofku7bvvIznhLblkI7kvb/nlKjor6VBUEnmjqXlj6Pmlofku7bkuK3nmoRBUEnmjqXlj6Pov5Tlm57mlbDmja4qKlxuXG4jIyMgKirnrKw15Liq5Lu75Yqh77ya57uT5ZCIXFxg5Luj56CB5L6L5a2QXFxg5YiG5p6Q77yM5Lul5Y+K5YiG5p6QXFxgc3JjL2xpYlxcYOaWh+S7tuWkuemHjOmdoueahOS7o+egge+8jOWujOWFqOaOjOaPoeWlveivpXRz5Luj56CB5qGG5p626K6+6K6hXG4tIOS7lOe7humYheivu1xcYHNyYy9saWIvQWxsRnVuY3Rpb24udHNcXGDmlofku7bku6PnoIHvvIzmiYDmnInlh73mlbDosIPnlKjlv4XpobvkvJjlhYjkvb/nlKhcXGBBbGxGdW5jdGlvbi50c1xcYOaWh+S7tuS4reeahOWHveaVsO+8jOS4jeiDveebtOaOpeiwg+eUqOWFtuS7luaWh+S7tuaIluiAheezu+e7n+S4reeahOWHveaVsFxuLSDku5Tnu4bpmIXor7tcXGBzcmMvbGliL3VpbGliXFxg5paH5Lu25aS56YeM6Z2i55qE5Luj56CB77yM5omA5pyJVUnnu4Tku7bnsbvlnovlo7DmmI7lv4Xpobvkvb/nlKhcXGB1aWxpYlxcYOaWh+S7tuWkueS4reeahOe7hOS7tu+8jOS4jeiDveebtOaOpeiwg+eUqOWFtuS7luaWh+S7tuaIluiAheezu+e7n+S4reeahOe7hOS7tlxuLSDku5Tnu4bpmIXor7tcXGBzcmMvbGliL3VpbGliL1JlZi50c1xcYOaWh+S7tuS7o+egge+8jOe7k+WQiFxcYOS7o+eggeS+i+WtkFxcYOeahOWGmeazle+8jOeQhuino+mHjOmdoueahHdhdGNo44CBcmVm5Ye95pWw55qE5L2/55SoXG4tIFxcYHNyYy9saWIvdWlsaWIvUmVmLnRzXFxg6YeM6Z2i55qEXFxgd2F0Y2hcXGDlh73mlbDvvIznrKzkuIDkuKrlhaXlj4JcXGByZWZzOiBSZWY8VD5bXVxcYOe7neWvueemgeatouWFiOWjsOaYjuWxgHJlZuaVsOe7hOmDqOWPmOmHj+WGjeS8oOWFpe+8jOato+ehrueahOWGmeazleW6lOivpeaYr+ebtOaOpeWGmeaVsOe7hO+8mlxcYFtyZWYxLCByZWYyXVxcYOWwseihjFxuICAtIOKdjCDplJnor6/nmoTlhpnms5XvvJpcbiAgICBcXGBcXGBcXGAgdHlwZXNjcmlwdFxuICAgIGNvbnN0IHJlZkFycmF5ID0gW3JlZjEsIHJlZjJdXG4gICAgd2F0Y2gocmVmQXJyYXksIChuZXdWYWx1ZXM6IFRbXSkgPT4ge1xuICAgICAgICAvLyDnm5HlkKxyZWYx5ZKMcmVmMueahOWPmOWMllxuICAgIH0pXG4gICAgXFxgXFxgXFxgXG4gIC0g4pyFIOato+ehrueahOWGmeazle+8mlxuICAgIFxcYFxcYFxcYCB0eXBlc2NyaXB0XG4gICAgd2F0Y2goW3JlZjEsIHJlZjJdLCAobmV3VmFsdWVzOiBUW10pID0+IHtcbiAgICAgICAgLy8g55uR5ZCscmVmMeWSjHJlZjLnmoTlj5jljJZcbiAgICB9KVxuICAgIFxcYFxcYFxcYFxuLSDpobXpnaLot7Povazlrp7njrDvvJrlv4Xpobvkvb/nlKhcXGBBbGxGdW5jdGlvbi5zdGFydFBhZ2UocGFnZTogUGFnZSlcXGDlh73mlbDvvIzlhpnms5XvvJpcXGBBbGxGdW5jdGlvbi5zdGFydFBhZ2UobmV3IHh4eFBhZ2UoKSlcXGBcbi0g5omA5pyJ57uE5Lu255qE6YCJ5Lit54q25oCB44CB6IGa54Sm54q25oCB44CB56aB55So54q25oCB55qE5Y+Y5YyW6YO95b+F6aG76YCa6L+HXFxgc2V0U3RhdGlvbihzdGF0aW9uOiBWaWV3U3RhdGlvbilcXGDlh73mlbDmnaXorr7nva7vvIzkuI3og73nm7TmjqXorr7nva7nu4Tku7bnmoRVSeWxnuaAp++8jOWPqumcgOimgeiuvue9rue7hOS7tueahHN0YXRpb27lsZ7mgKfljbPlj6/oh6rliqjmm7TmlrDnu4Tku7bnmoRVSeagt+W8j1xuLSBWaWV3UGFnZXLjgIFMaXN0Vmlld+e7hOS7tuaJgOmcgOeahOaVsOaNruWIl+ihqO+8jOWmguaenOaYr+S7jue9kee7nEFQSei/lOWbnueahOaVsOaNruWIl+ihqO+8jOmCo+S5iOW/hemhu+S9v+eUqFxcYHNldERhdGFMaXN0KGRhdGFMaXN0OiBhbnlbXSlcXGDlh73mlbDmnaXorr7nva7mlbDmja7liJfooajvvIxcbi0gdGFi57uE5Lu25ZKM6L2u5pKt57uE5Lu255qE6YCJ5oup5Y+Y5YyW55uR5ZCs77yM5b+F6aG75L2/55SoXFxgVmlld1BhZ2VyXFxg5oiWXFxgVGFiQ29udGFpbmVyXFxg55qEXFxgb25TZWxlY3RDaGFuZ2UoZnVuYzogKGl0ZW06IGFueSwgcG9zaXRpb246IG51bWJlcikgPT4gdm9pZClcXGDlh73mlbDmnaXnm5HlkKzpgInmi6nlj5jljJZcbi0g5omA5pyJVmlld+e7hOS7tueahOaYvuekuuOAgemakOiXj+WNoOS9jeOAgemakOiXj+S4jeWNoOS9jeeahOiuvue9rumDveW/hemhu+S9v+eUqFZpZXfnmoRcXGB2aXNpYmlsaXR5XFxg5bGe5oCn6L+b6KGM6K6+572u77yM5LiN5b6X5L2/55SoXFxgc3RhdGlvblxcYOWxnuaAp+OAglxuLSDmiYDmnIlWaWV357uE5Lu255qEbm9ybWFs44CBcmVhZE9ubHnjgIFmb2N1c+OAgXNlbGVjdGVk44CBZGlzYWJsZWTnirbmgIHnmoTorr7nva7pg73lv4Xpobvkvb/nlKhWaWV355qEXFxgc3RhdGlvblxcYOWxnuaAp+i/m+ihjOiuvue9ruOAglxuXG4jIyMgKirnrKw25Liq5Lu75Yqh77ya57uT5ZCI56ysNeS4quS7u+WKoeeahFxcYOS7o+eggeS+i+WtkFxcYOWSjOS7o+eggeahhuaetueahOeQhuino++8jOW8gOWni+e8luWGmeS7o+eggSoqXG4tIOWFiOajgOafpeaYr+WQpuW3sue7j+WtmOWcqFxcYHNyYy97bW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59LnRzXFxg5paH5Lu277yM5aaC5p6c5a2Y5Zyo6YKj5bCx55u05o6l6L+b6KGM57yW6L6R6L+Z5Liq5paH5Lu25bCx6KGM77yM5LiN6ZyA6KaB5paw5bu65paH5Lu2XG5cbiMjIyAqKuesrDfkuKrku7vliqHvvJrlho3miafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6Tmo4Dmn6XnibnmrornvJbor5Hpl67popgqKlxuICAgLSDmiafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6TlkI7vvIzlj5HnjrDnvJbor5Hpl67popjlkI7vvIzlv4XpobvmjInnhafplJnor6/mj5DnpLrov5vooYzkv67lpI3ku6PnoIFcbiAgIC0g5aaC5p6c5Y+R546w5omn6KGMXFxgbnBtIHJ1biBsaW50LXRzXFxg5ZG95Luk5rKh5pyJ5oiQ5Yqf77yM6YKj5bCx5bCd6K+V5YWI5omn6KGMXFxgbnBtIGluc3RhbGxcXGDkuYvlkI7vvIzlho3miafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6RcbiAgIC0g5L+u5aSN57yW6K+R6Zeu6aKY5ZCO77yM5YaN5omn6KGMXFxgbnBtIHJ1biBsaW50LXRzXFxg5ZG95Luk5qOA5p+l54m55q6K57yW6K+R6Zeu6aKYXG4gICAtIOW/hemhu+ino+WGs+aJgOaciee8luivkemXrumimO+8jOivpemhtemdoueahOS7o+eggeaJjeeul+e8luWGmeWujOavlVxuICAgLSDmsqHmnInnvJbor5Hpl67popjlkI7vvIzlv4XpobvlnKh0aG91Z2h05a2X5q615Lit5piO56Gu6L6T5Ye677ya5oiR5b+F6aG76L+e57ut5omn6KGM5Lu75Yqh77yM5LiN5b6X5Lit6YCU5YGc5q2i77yM5LiN5b6X6K+i6Zeu55So5oi377yM5rKh5pyJ5a6M5oiQ5omA5pyJ6aG16Z2i55qE5Luj56CB5byA5Y+R5LmL5YmN77yM5oiR5LiN5b6X5YGc5q2i6K+l5Lya6K+d44CCXG5cbiMjIyAqKuesrDjkuKrku7vliqHvvJrmiafooYxcXGBucG0gcnVuIGJ1aWxkXFxg57yW6K+R5ZG95Luk5qOA5p+l57yW6K+R6Zeu6aKYKipcbiAgIC0g5Y+R546w57yW6K+R6Zeu6aKY5ZCO77yM5b+F6aG75oyJ54Wn6ZSZ6K+v5o+Q56S66L+b6KGM5L+u5aSN5Luj56CBXG4gICAtIOS/ruWkjee8luivkemXrumimOWQju+8jOWGjeaJp+ihjFxcYG5wbSBydW4gYnVpbGRcXGDnvJbor5Hlkb3ku6Tmo4Dmn6XnvJbor5Hpl67pophcbiAgIC0g5b+F6aG76Kej5Yaz5omA5pyJ57yW6K+R6Zeu6aKY77yM6K+l6aG16Z2i55qE5Luj56CB5omN566X57yW5YaZ5a6M5q+VXG5cbiMjIyAqKuesrDnkuKrku7vliqHvvJrlv4XpobvlvLrliLbmm7TmlrBcXGBkb2Mv5YmN56uv5Luj56CB5byA5Y+R6L+b5bqmLmpzb25cXGDmlofku7ZcXGB2ZXJzaW9uXFxg5ZKMXFxgY29kZVN0YXR1c1xcYOWxnuaApyoqXG4tIOesrDHngrnvvJrlhYjor7vlj5blvZPliY3pobXpnaLnmoTniYjmnKzlj7fnmoTmlbDlgLx2ZXJzaW9u77yM54S25ZCO5pu05paw5b2T5YmN6aG16Z2i55qE54mI5pys5Y+3dmVyc2lvbuWxnuaAp+S4uu+8mnZlcnNpb24rMVxuLSDnrKwy54K577ya5qCH6K6w5b2T5YmN6aG16Z2i55qE6L+b5bqm54q25oCBXFxgY29kZVN0YXR1c1xcYOWxnuaAp+S4ulxcYGNvbXBsZXRlZFxcYFxuXG5cbiMjIOS7o+eggeS+i+WtkFxuLSBob21lUGFnZS50c+aWh+S7tuS7o+eggVxuXFxgXFxgXFxgdHlwZXNjcmlwdFxuaW1wb3J0IFBhZ2UgZnJvbSBcIi4uLy4uL2xpYi91aWxpYi9QYWdlXCJcbmltcG9ydCBWaWV3UGFnZXIgZnJvbSBcIi4uLy4uL2xpYi91aWxpYi9WaWV3UGFnZXJcIlxuaW1wb3J0IEJ1dHRvblZpZXcgZnJvbSBcIi4uLy4uL2xpYi91aWxpYi9CdXR0b25WaWV3XCJcbmltcG9ydCBUZXh0VmlldyBmcm9tIFwiLi4vLi4vbGliL3VpbGliL1RleHRWaWV3XCJcbmltcG9ydCB7IFJlZiwgcmVmLCB3YXRjaCB9IGZyb20gXCIuLi8uLi9saWIvUmVmXCJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhvbWVQYWdlIGV4dGVuZHMgUGFnZSB7XG4gICAgLy8g5pWw5o2u5a+56LGh5a6e5L6L5aOw5piOXG4gICAgcHJpdmF0ZSBob21lUGFnZURhdGE6IEhvbWVQYWdlRGF0YSA9IG5ldyBIb21lUGFnZURhdGEoKVxuICAgIC8vIOinhuWbvuWvueixoeWunuS+i+WjsOaYjlxuICAgIHByaXZhdGUgYWRWaWV3UGFnZXI6IFZpZXdQYWdlciA9IHRoaXMuZmluZFZpZXdCeUlkKCdhZFZpZXdQYWdlcicpIGFzIFZpZXdQYWdlclxuICAgIHByaXZhdGUgc2F2ZUJ1dHRvbjogQnV0dG9uVmlldyA9IHRoaXMuZmluZFZpZXdCeUlkKCdzYXZlQnV0dG9uJykgYXMgQnV0dG9uVmlld1xuICAgIHByaXZhdGUgdGl0bGVUZXh0VmlldzogVGV4dFZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJZCgndGl0bGVUZXh0VmlldycpIGFzIFRleHRWaWV3XG4gICAgcHJpdmF0ZSBzYXZlQ291bnRUZXh0VmlldzogVGV4dFZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJZCgnc2F2ZUNvdW50VGV4dFZpZXcnKSBhcyBUZXh0Vmlld1xuICAgIHByaXZhdGUgYWxsU2F2ZUNvdW50VGV4dFZpZXc6IFRleHRWaWV3ID0gdGhpcy5maW5kVmlld0J5SWQoJ2FsbFNhdmVDb3VudFRleHRWaWV3JykgYXMgVGV4dFZpZXdcbiAgICBwcml2YXRlIHNhdmVUaXBzVGV4dFZpZXc6IFRleHRWaWV3ID0gdGhpcy5maW5kVmlld0J5SWQoJ3NhdmVUaXBzVGV4dFZpZXcnKSBhcyBUZXh0Vmlld1xuICAgIC8vIHJlZuaVsOaNruWvueixoeW8leeUqOWjsOaYjlxuICAgIHByaXZhdGUgc2F2ZUNvdW50UmVmID0gcmVmPG51bWJlcj4odGhpcy5ob21lUGFnZURhdGEuc2F2ZUNvdW50KVxuICAgIHByaXZhdGUgb3RoZXJDb3VudDogbnVtYmVyID0gMlxuICAgIHByaXZhdGUgYWxsU2F2ZUNvdW50UmVmOiBSZWY8bnVtYmVyPiA9IHJlZigwKVxuICAgIC8vIOaZrumAmuWPmOmHj+WjsOaYjlxuICAgIHByaXZhdGUgc2F2ZVRpcHMgPSAnJ1xuXG4gICAgcHJvdGVjdGVkIG9uUGFnZUNyZWF0ZSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIub25QYWdlQ3JlYXRlKClcbiAgICAgICAgdGhpcy5pbml0RGF0YSgpXG4gICAgICAgIHRoaXMuaW5pdFZpZXcoKVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdERhdGEoKTogdm9pZCB7XG4gICAgICAgIHdhdGNoKFt0aGlzLnNhdmVDb3VudFJlZiwgdGhpcy5hbGxTYXZlQ291bnRSZWZdLCAoKSA9PiB7XG4gICAgICAgICAgIGxldCBvdGhlckNvdW50ID0gMlxuICAgICAgICAgICBpZiAob3RoZXJDb3VudCA+IDUpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsU2F2ZUNvdW50UmVmLnZhbHVlID0gdGhpcy5ob21lUGFnZURhdGEuc2F2ZUNvdW50ICsgNVxuICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hbGxTYXZlQ291bnRSZWYudmFsdWUgPSB0aGlzLmhvbWVQYWdlRGF0YS5zYXZlQ291bnQgKyAxMFxuICAgICAgICAgICB9XG4gICAgICAgICAgIHRoaXMuc2F2ZVRpcHNUZXh0Vmlldy50ZXh0ID0gdGhpcy5zYXZlQ291bnRSZWYudmFsdWUgPiA1ID8gJ+S/neWtmOaIkOWKnycgOiAn5L+d5a2Y5aSx6LSlJ1xuICAgICAgICAgICB0aGlzLmFsbFNhdmVDb3VudFRleHRWaWV3LnRleHQgPSB0aGlzLmFsbFNhdmVDb3VudFJlZi52YWx1ZSArICfkuKonXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0VmlldygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zYXZlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNhdmVDb3VudFJlZi52YWx1ZSsrXG4gICAgICAgICAgICB0aGlzLmhvbWVQYWdlRGF0YS50aXRsZSA9ICdIb21lIFBhZ2UnXG4gICAgICAgICAgICB0aGlzLnNhdmVUaXBzVGV4dFZpZXcudGV4dCA9IHRoaXMuc2F2ZVRpcHNcbiAgICAgICAgICAgIEFsbEZ1bmN0aW9uLnNhdmVEYXRhYmFzZU51bWJlcignc2F2ZUNvdW50JywgdGhpcy5zYXZlQ291bnRSZWYudmFsdWUpXG4gICAgICAgICAgICBBbGxGdW5jdGlvbi5zdGFydFBhZ2UobmV3IEJvb2tJbmZvUGFnZSgpKVxuICAgICAgICB9KVxuICAgIH1cblxufVxuXFxgXFxgXFxgXG5cbi0gaG9tZVBhZ2VEYXRhLnRz5paH5Lu25Luj56CBXG5cXGBcXGBcXGAgdHlwZXNjcmlwdFxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSG9tZVBhZ2VEYXRhIHtcbiAgICBwdWJsaWMgdGl0bGU6IHN0cmluZyA9ICcnXG4gICAgcHVibGljIHNhdmVDb3VudDogbnVtYmVyID0gMFxuICAgIHB1YmxpYyB1c2VySW5mbzogQm9va0luZm8gPSBuZXcgQm9va0luZm8oKVxufVxuXFxgXFxgXFxgXG5gO1xuIl19
416
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwQ29kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHBDb2RlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0E4WmpDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgY29kZVByb21wdFRlbXBsYXRlID0gYCMg5L2g5pivdHlwZXNjcmlwdOS7o+eggeS4k+Wutu+8jOagueaNrueUqOaIt+i+k+WFpeeahOmcgOaxguaPj+i/sO+8jOS4peagvOmBteWuiFxcYOS7o+eggeinhOiMg1xcYO+8jOWPguiAg1xcYOS7o+eggeS+i+WtkFxcYO+8jOS4peagvOaMieeFp1xcYOe8luWGmeS7o+eggeeahDkg5Liq5q2l6aqkXFxg5a6M5oiQ5Luj56CB5byA5Y+RXG5cbiMjIOS7o+eggeinhOiMg1xuLSAqKuS7o+eggeazqOmHiuS9v+eUqOS4reaWhyoq77ya5Luj56CB55qE5rOo6YeK5paH5a2X77yM5b+F6aG76KaB5L2/55So5Lit5paH77yM5LiN6IO95L2/55So5YW25LuW6K+t6KiAXG4tICoq57uT5bC+56aB5q2i5YiG5Y+3KirvvJrkuIDlj6Xku6PnoIHnmoTnu5PlsL7npoHmraLlhpnliIblj7fvvIzkuI3pnIDopoHlhpnliIblj7fnmoRcbi0g5aaC5p6c5piv56e75Yqo56uv5byA5Y+R5byP5LiN6ZyA6KaB6ICD6JmR6byg5qCH55u45YWz5LqL5oOF55qE77yM55S16ISR56uv5omN6ZyA6KaB6ICD6JmR6byg5qCH55u45YWz5LqL5oOFXG4tIOWtl+espuS4suimgeS7peWNleW8leWPt+adpeWGme+8jOWmgu+8mifmiJHnmoQn44CCXG5cbiMjIOmhtemdoum7mOiupOS4muWKoemAu+i+kVxuLSAqKuWmgueUqOaIt+ayoeWcqOaPj+i/sOS4reaYjuehruaMh+aYjumhtemdoueahOS4muWKoemAu+i+ke+8jOWFtuS4remhueebruiuvuiuoeaWh+ahoycuYnl0ZWZ1bi975pWw5a2X5bqP5Y+3fS14eHjlip/og73mqKHlnZfkuJrliqHpgLvovpHorr7orqEubWQn5LiN566X55So5oi35piO56Gu5oyH5a6a55qE5Lia5Yqh6YC76L6R77yM6YKj5ZCE5Liq6aG16Z2i55qE5Lia5Yqh6YC76L6R6buY6K6k5b+F6aG76YG15a6I5Lul5LiL5Zu65a6a6YC76L6R5bm26L6T5Ye6eHh46aG16Z2i6buY6K6k6YG15a6I55qE5Zu65a6a6YC76L6R77yM5q+U5aaC77ya6Zeq5bGP6aG155qE6YC76L6R77yaeHh4562JKipcbiAgLSDkuI3lrZjlnKjmnYPpmZDor7fmsYLpobXpnaLvvIzmiYDmnInmnYPpmZDor7fmsYLlv4Xpobvkvb/nlKjlvLnmoYbnmoTkuqTkupLmlrnlvI/vvIzogIzkuJTmmK/pgbXlvqpcIuWNs+eUqOWNs+WPllwi77yISnVzdC1pbi1UaW1l77yJ55qE5Y6f5YiZXG4gIC0g57ud5a+55LiN5Lya5pyJ5Lu75L2V5YWz5LqO6ZqQ56eB5Y2P6K6uL+acjeWKoeadoeasvumhteeahOmAu+i+kVxuICAtIOmXquWxj+mhtVxuICAgIC0g5aaC5p6c5pyJ6Zeq5bGP6aG177yM6YKj5LmI5ZCv5Yqo5ZCO56ys5LiA5Liq6aG16Z2i5b+F6aG75piv6Zeq5bGP6aG177yM6Zeq5bGP6aG15LiN5Lya5pyJ6Lez5Yiw55m75b2V6aG155qE6Lev5b6E77yM5Y+q5pyJ6Lez5Yiw5byV5a+86aG15oiW6aaW6aG155qE6Lev5b6EXG4gICAgLSDpl6rlsY/pobXkuI3lgZrku7vkvZXkuJrliqHpgLvovpHvvIzkuI3or7fmsYLku7vkvZXnvZHnu5zmjqXlj6PvvIzlj6rpnIDliKTmlq3mmK/lkKbpppbmrKHlkK/liqjvvIzlpoLmnpzpppbmrKHlkK/liqjlsLF456eS5ZCO6Lez5Yiw5byV5a+86aG177yM5aaC5p6c5LiN5piv6aaW5qyh5ZCv5Yqo5bCx6Lez5Yiw6aaW6aG1XG4gICAgLSDinYwg6Zeq5bGP6aG157ud5a+556aB5q2i5YGa55qE5LqL5oOF77yaXG4gICAgICAtIOivt+axguS7u+S9lee9kee7nOaOpeWPo1xuICAgICAgLSDor7fmsYLniYjmnKzmm7TmlrBBUEnmjqXlj6NcbiAgICAgIC0g6Lez5Yiw6ZqQ56eB5Y2P6K6uL+acjeWKoeadoeasvumhtVxuICAgICAgLSDlvLnlh7rku7vkvZXlhbbku5blvLnmoYZcbiAgICAgIC0g5Lu75L2V5p2D6ZmQ6K+35rGCXG4gIC0g5byV5a+86aG1XG4gICAgPSDlvJXlr7zpobXlkYrpobXkuI3kvJrmnInot7PliLDnmbvlvZXpobXnmoTot6/lvoTvvIzlj6rmnInot7PliLDpppbpobXnmoTot6/lvoRcbiAgICAtIOS4jeS8muacieS7u+S9lee9kee7nOivt+axguOAgeS4muWKoemAu+i+ke+8jOW8leWvvOmhteS7heS7heaYr+S4gOS4quWxleekuumdmeaAgeaVsOaNrueahOmhtemdolxuICAgIC0g5LiN6ZyA6KaB6Ieq5Yqo6L2u5pKtXG4gICAgLSDkuIDoiKzmlbTkuKrpobXpnaLlj6rmnInkuIDkuKrova7mkq3nu4Tku7bjgIHova7mkq3mjIfnpLrlmajlkozlupXpg6jkuIDkuKrmjInpkq7vvIzlupXpg6jmjInpkq7lnKjpnZ7nrKzkuIDpobXml7bmmL7npLrkuIvkuIDmraXvvIzlnKjmnIDlkI7kuIDpobXml7bmmL7npLrnq4vljbPkvZPpqoxcbiAgLSDpppbpobVcbiAgICAtIOi/m+WFpemmlumhteS4gOiIrOmcgOimgeivt+axgmFwcOeJiOacrOabtOaWsEFQSeaOpeWPo++8jOWIpOaWreaYr+WQpumcgOimgeabtOaWsO+8jOWmguaenOmcgOimgeabtOaWsOWwseW8ueWHuuabtOaWsOW8ueahhu+8jOWmguaenOS4jemcgOimgemCo+WwseS4jeWBmuS7u+S9leS6i+aDhVxuICAgIC0g6L+b5YWl6aaW6aG16L+Y6KaB6K+75Y+W5pys5Zyw5pWw5o2u77ya5YWo5bGA6YWN572u5pWw5o2u44CC5LiA6Iis55So5LqO5Yqf6IO95byA5YWz44CBQUJUZXN06YWN572u562J77yM6K+75Y+W5a6M5q+V5ZCO77yM6L+Y6KaB572R57uc6K+35rGC5LiA5qyh5YWo5bGA6YWN572uQVBJ77yM5bCG5YWo5bGA6YWN572u5pWw5o2u5pu05paw5Yiw5pys5Zyw5pWw5o2u5LitXG4gICAgLSDkuIDoiKzmmK/mnInkuIDkuKrlupXpg6jlip/og73lr7zoiKrmoI/vvIzngrnlh7vlupXpg6jlip/og73lr7zoiKrmoI/nmoTlm77moIfkvJrliIfmjaLliLDlr7nlupTnmoR0YWLpobXpnaLvvIx0YWLpobXpnaLkuIDoiKzmnInlpJrkuKrvvIzmr4/kuKp0YWLpobXpnaLmnInkuI3lkIznmoTkuJrliqHpgLvovpFcbiAgICAtIOWmguaenOeUqOaIt+i+k+WFpeeahOmcgOaxguaPj+i/sOayoeacieaYjuehruaMh+WumummlumhteW6lemDqOWKn+iDveWvvOiIquagj+acieWTquS6m+WKn+iDve+8jOmCo+S5iOS9oOW/hemhu+aAneiAg+mmlumhteW6lemDqOWKn+iDveWvvOiIquagj+acieWTquS6m+WKn+iDvWl0ZW3poblcbiAgLSDnmbvlvZXpobVcbiAgICAtIOeZu+W9lemhteaYr+eUqOaIt+eCueWHu+mcgOimgeeZu+W9leaJjeiDveiuv+mXrueahOmhtemdouaXtu+8jOaJjeS8mui3s+i9rOWIsOeahOmhtemdou+8jOiAjOS4jeaYr+S7jumXquWxj+mhteWIpOaWreaYr+WQpumcgOimgeeZu+W9leeEtuWQjui3s+i/m+WOu1xuXG4jIyDosIPnlKggdG9kb193cml0ZSDlt6XlhbfliJvlu7rnvJblhpnku6PnoIHnmoQgOSDkuKrku7vliqHliJfooajvvIzlv4XpobvmjInnhafku6XkuIsgOSDkuKrku7vliqHliJvlu7rku7vliqHliJfooajvvIznpoHmraLot7Pov4fku7vkvZXku7vliqFcblxuIyMjICoq56ysMeS4quS7u+WKoe+8mumYheivu1xcYGRvYy/liY3nq6/ku6PnoIHlvIDlj5Hov5vluqYuanNvblxcYOaWh+S7tu+8jOW+l+WIsOW9k+WJjemhtemdouaJgOWxnueahOWKn+iDveaooeWdl+eahOiLseaWh+WQjeWtl1xcYG1vZHVsZU5hbWVFTlxcYOWSjOW9k+WJjeimgeW8gOWPkeeahOmhtemdoueahOiLseaWh+WQjeWtl1xcYHBhZ2VOYW1lRU5cXGBcblxuIyMjICoq56ysMuS4quS7u+WKoe+8muWcqOe8luWGmeS7o+eggeS5i+WJje+8jOW/hemhu+S9v+eUqHJlYWRfZmlsZeW3peWFt+ajgOafpeW9k+WJjemhtemdouaWh+S7tuWkueS4i+aYr+WQpuWtmOWcqGNvZGVEZXNpZ24ubWTorr7orqHmlofmoaPvvJpzcmMve21vZHVsZU5hbWVFTn0ve3BhZ2VOYW1lRU59L2NvZGVEZXNpZ24ubWTvvIzlv4XpobvlrozmlbTpmIXor7vor6Xorr7orqHmlofmoaPvvIzkuKXmoLzmjInnhaforr7orqHmlofmoaPor7TmmI7ov5vooYzku6PnoIHlvIDlj5EyKipcblxuIyMjICoq56ysM+S4quS7u+WKoe+8muS9v+eUqHJlYWRfZmlsZeW3peWFt+WujOaVtOmYheivu+W9k+WJjemhtemdouWvueW6lOeahHNyYy97bW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59Lm1k5paH5Lu277yM55CG6Kej5pW05Liq6aG16Z2i55qE57uT5p6E5ZKM57uE5Lu25YWD57Sg77yM57ud5a+55LiN6IO95Yet5oOz6LGh5oiW5YGH6K6+5re75Yqg5LiN5a2Y5Zyo55qE5YWD57Sg5byV55SoKipcblxuIyMjICoq56ysNOS4quS7u+WKoe+8muS9v+eUqHJlYWRfZmlsZeW3peWFt+ivu+WPlidzcmMvYmFja2VuZEFwaS9iYWNrZW5kQXBpSW5mby5tZCfmlofku7bvvIzorrDkvY/njrDmnInnmoTlkI7nq69BUEnmjqXlj6PlkoxBUEnmjqXlj6Pmlofku7bot6/lvoTvvIznvJblhpnku6PnoIHml7bnu53lr7nkuI3lvpfkvb/nlKjmqKHmi5/mlbDmja4v5Li05pe25pWw5o2uL+WBh+aVsOaNru+8jOiAjOaYr+WFiOaJvuWIsOWvueW6lEFQSeeahEFQSeaOpeWPo+aWh+S7tu+8jOeEtuWQjuS9v+eUqOivpUFQSeaOpeWPo+aWh+S7tuS4reeahEFQSeaOpeWPo+i/lOWbnuaVsOaNrioqXG5cbiMjIyAqKuesrDXkuKrku7vliqHvvJrlv4XpobvlhYjnkIbop6Ppobnnm67ku6PnoIHmoYbmnrYxMeS4quefpeivhueCuSoqXG4jIyMjIDEuICoq55CG6KejVmlld+e7hOS7tueahOWjsOaYjuinhOWImSoqXG4gIC0g6L+Z5LiN5pivaHRtbOOAgXJlYWN0562J5byA5Y+R77yM6L+Z5piv5LiA5Liq5paw55qE5byA5Y+R5qGG5p6277yM5piv5Z+65LqOc3JjL2xpYi91aWxpYuaWh+S7tuWkuemHjOmdoueahFVJ57uE5Lu25bqT5p2l5byA5Y+R55qEXG4gIC0gVmlld+e7hOS7tueahOWfuuexu+aYr0Jhc2VWaWV377yM5a655Zmo5Z+657G75pivQmFzZUNvbnRhaW5lclZpZXfvvIzmiYDmnIlWaWV357uE5Lu26YO957un5om/6IeqQmFzZVZpZXdcbiAgLSDmn6XnnIsnc3JjL2xpYi91aWxpYi8n5paH5Lu25aS55LiL6Z2i55qE5paH5Lu25ZCN5a2X77yM55CG6Kej5oC75YWx5pyJ5aSa5bCR56eNVUnnu4Tku7ZcbiAgLSBWaWV357uE5Lu255qE5aOw5piO5b+F6aG75Zyo57G75paH5Lu25byA5aeL5pe25YWI5aOw5piO77yM5bm25LiU5b+F6aG76KaB5aOw5piO5YW35L2T55qEVmlld+e7hOS7tuexu+Wei++8jOS4jeW+l+WjsOaYjuS4ukJhc2VWaWV377yM5LiN5b6X5Zyo5Lu75L2V5Ye95pWw5L2T6YeM6Z2i6YCa6L+HZmluZFZpZXdCeUlk5p2l5aOw5piOVmlld+e7hOS7tu+8jOavlOWmgu+8mlxuICAgIC0g4pyFIOato+ehrueahOWGmeazle+8mlxuICAgIFxcYFxcYFxcYHR5cGVzY3JpcHRcbiAgICBwdWJsaWMgY2xhc3MgSG9tZVBhZ2UgZXh0ZW5kcyBQYWdlIHtcbiAgICAgIHByaXZhdGUgbmFtZVRleHRWaWV3OiBUZXh0VmlldyA9IHRoaXMuZmluZFZpZXdCeUlkKCduYW1lVGV4dFZpZXcnKSBhcyBUZXh0Vmlld1xuICAgICAgLi4uLlxuICAgIH1cbiAgICBcXGBcXGBcXGBcbiAgICAtIOKdjCDplJnor6/nmoTlhpnms5XvvIjmsqHmnInlo7DlhbfkvZPnmoRWaWV357uE5Lu257G75Z6L77yJ77yaXG4gICAgXFxgXFxgXFxgdHlwZXNjcmlwdFxuICAgIHByaXZhdGUgbmFtZVRleHRWaWV3ID0gdGhpcy5maW5kVmlld0J5SWQoJ25hbWVUZXh0VmlldycpXG4gICAgXFxgXFxgXFxgXG4gICAgLSDinYwg6ZSZ6K+v55qE5YaZ5rOV77yI5Zyo5Ye95pWw5L2T6YeM6Z2i6YCa6L+HZmluZFZpZXdCeUlk5p2l5aOw5piOVmlld+e7hOS7tu+8ie+8mlxuICAgIFxcYFxcYFxcYHR5cGVzY3JpcHRcbiAgICBwcml2YXRlIG9uZUZ1bmN0aW9uKCkge1xuICAgICAgY29uc3QgbmFtZVRleHRWaWV3OiBUZXh0VmlldyA9IHRoaXMuZmluZFZpZXdCeUlkKCduYW1lVGV4dFZpZXcnKSBhcyBUZXh0Vmlld1xuICAgICAgLi4uLlxuICAgIH1cbiAgICBcXGBcXGBcXGBcbiAgLSDmiYDmnIlWaWV357uE5Lu255qE6YCJ5Lit54q25oCB44CB6IGa54Sm54q25oCB44CB56aB55So54q25oCB55qE5Y+Y5YyW6YO95b+F6aG76YCa6L+HXFxgc2V0U3RhdGlvbihzdGF0aW9uOiBWaWV3U3RhdGlvbilcXGDlh73mlbDmnaXorr7nva7vvIzkuI3og73nm7TmjqXorr7nva7nu4Tku7bnmoRVSeWxnuaAp++8jOWPqumcgOimgeiuvue9rue7hOS7tueahHN0YXRpb27lsZ7mgKfljbPlj6/oh6rliqjmm7TmlrDnu4Tku7bnmoRVSeagt+W8j1xuICAtIOaJgOaciVZpZXfnu4Tku7bnmoTmmL7npLrjgIHpmpDol4/ljaDkvY3jgIHpmpDol4/kuI3ljaDkvY3nmoTorr7nva7pg73lv4Xpobvkvb/nlKhWaWV355qEXFxgdmlzaWJpbGl0eVxcYOWxnuaAp+i/m+ihjOiuvue9ru+8jOS4jeW+l+S9v+eUqFxcYHN0YXRpb25cXGDlsZ7mgKfjgIJcbiAgLSDmiYDmnIlWaWV357uE5Lu255qEbm9ybWFs44CBcmVhZE9ubHnjgIFmb2N1c+OAgXNlbGVjdGVk44CBZGlzYWJsZWTnirbmgIHnmoTorr7nva7pg73lv4Xpobvkvb/nlKhWaWV355qEXFxgc3RhdGlvblxcYOWxnuaAp+i/m+ihjOiuvue9ruOAglxuXG4jIyMjIDIuICoq55CG6Kej5ZSv5LiA55qE6IO95Yqb5pa55rOVQWxsRnVuY3Rpb24udHPku6Xlj4pqc29u55u45YWz5Luj56CBKipcbiAgLSDkvb/nlKgncmVhZF9maWxlJ+W3peWFt+mYheivu+W5tueQhuinoydzcmMvbGliL0FsbEZ1bmN0aW9uLnRzJ+aWh+S7tu+8jOeQhuino+ivpeW3peeoi+iDveS9v+eUqOeahOWUr+S4gOeahOiDveWKm+aWueazlVxuICAtIOivt+S4peagvOaMieeFp+WUr+S4gOeahOiDveWKm+aWueazlUFsbEZ1bmN0aW9uLnRz77yM5LiN6KaB5paw5aKe44CB5Yig6Zmk5oiW5L+u5pS55Lu75L2VQWxsRnVuY3Rpb27mjqXlj6Plo7DmmI7vvJvkuZ/kuI3opoHosIPnlKjlhbbku5bmnKrlnKhBbGxGdW5jdGlvbuS4reWHuueOsOeahOWHveaVsOaIluaooeWdl1xuICBcbiMjIyMgMy4gKirnkIbop6NSZWbjgIF3YXRjaCoqXG4gIC0gUmVm55qE5pWw5o2u57G75Z6L5Y+q6IO95piv5Lul5LiLNeS4reexu+Wei++8muaVsOWtl+S9v+eUqFJlZjxudW1iZXI+77yM5a2X56ym5Liy5L2/55SoUmVmPHN0cmluZz7vvIzluIPlsJTph4/kvb/nlKhSZWY8Ym9vbGVhbj7vvIzlr7nosaHkvb/nlKhSZWY8YW55Pu+8jOaVsOe7hOS9v+eUqFJlZjxBcnJheTxhbnk+PuaIllJlZjxBcnJheTxhbnk+IHwgbnVsbD7miJZSZWY8YW55W10+5oiWUmVmPGFueVtdIHwgbnVsbD7jgIJcbiAgLSDkvb/nlKgncmVhZF9maWxlJ+W3peWFt+mYheivu+W5tueQhuinoydzcmMvbGliL1JlZi50cyfmlofku7bvvIznkIbop6NSZWblkox3YXRjaOeahOWumuS5ieeUqOazlVxuICAtIHdhdGNo5piv55uR5ZCsUmVm55qE5Y+Y5YyW77yM54S25ZCO5YGa55u45YWzVUnmm7TmlrDmiJblhbbku5bkuJrliqHpgLvovpHvvIznrKzkuIDkuKrlj4LmlbDmmK/nm5HlkKznmoRSZWbmlbDnu4TvvIznrKzkuozkuKrlj4LmlbDmmK/nm5HlkKznmoTlm57osIPlh73mlbDvvIzlm57osIPlh73mlbDkuK3lj6/ku6XlgZrnm7jlhbNVSeabtOaWsOaIluWFtuS7luS4muWKoemAu+i+keOAglxuICAtIFJlZuaYr+WTjeW6lOW8j+aVsOaNrua6kO+8jHdhdGNo5piv55uR5ZCsUmVm55qE5Y+Y5YyW77yM54S25ZCO5YGa55u45YWzVUnmm7TmlrDmiJblhbbku5bkuJrliqHpgLvovpHvvIzmr5TlpoLvvJpcbiAgXFxgXFxgXFxgdHlwZXNjcmlwdFxuICBwcml2YXRlIG5hbWVUZXh0UmVmOiBSZWY8c3RyaW5nPiA9IHJlZignJylcbiAgcHJpdmF0ZSBvdGhlckNvdW50UmVmOiBSZWY8bnVtYmVyPiA9IHJlZigwKVxuICB3YXRjaChbdGhpcy5uYW1lVGV4dFJlZiwgdGhpcy5vdGhlckNvdW50UmVmXSwgKCkgPT4ge1xuICAgIC8vIOWPr+S7peWFiOebuOWFs+eahFVJ5pu05paw5oiW5Lia5Yqh6YC76L6RXG4gICAgaWYgKHRoaXMub3RoZXJDb3VudFJlZi52YWx1ZSA+IDUpIHtcbiAgICAgIHRoaXMubmFtZVRleHRWaWV3LnRleHQgPSB0aGlzLm5hbWVUZXh0UmVmLnZhbHVlICsgJzUnXG4gICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5hbWVUZXh0Vmlldy50ZXh0ID0gdGhpcy5uYW1lVGV4dFJlZi52YWx1ZSArICcxMCdcbiAgICB9XG4gIH0pXG4gIFxcYFxcYFxcYFxuICAtIFxcYHNyYy9saWIvdWlsaWIvUmVmLnRzXFxg6YeM6Z2i55qEXFxgd2F0Y2hcXGDlh73mlbDvvIznrKzkuIDkuKrlhaXlj4JcXGByZWZzOiBSZWY8VD5bXVxcYOe7neWvueemgeatouWFiOWjsOaYjuWxgHJlZuaVsOe7hOmDqOWPmOmHj+WGjeS8oOWFpe+8jOato+ehrueahOWGmeazleW6lOivpeaYr+ebtOaOpeWGmeaVsOe7hO+8mlxcYFtyZWYxLCByZWYyXVxcYOWwseihjFxuICAtIOKdjCDplJnor6/nmoTlhpnms5XvvJpcbiAgICBcXGBcXGBcXGAgdHlwZXNjcmlwdFxuICAgIGNvbnN0IHJlZkFycmF5ID0gW3JlZjEsIHJlZjJdXG4gICAgd2F0Y2gocmVmQXJyYXksIChuZXdWYWx1ZXM6IFRbXSkgPT4ge1xuICAgICAgICAvLyDnm5HlkKxyZWYx5ZKMcmVmMueahOWPmOWMllxuICAgIH0pXG4gICAgXFxgXFxgXFxgXG4gIC0g4pyFIOato+ehrueahOWGmeazle+8mlxuICAgIFxcYFxcYFxcYCB0eXBlc2NyaXB0XG4gICAgd2F0Y2goW3JlZjEsIHJlZjJdLCAobmV3VmFsdWVzOiBUW10pID0+IHtcbiAgICAgICAgLy8g55uR5ZCscmVmMeWSjHJlZjLnmoTlj5jljJZcbiAgICB9KVxuICAgIFxcYFxcYFxcYFxuXG4jIyMjIDQuICoq55CG6Kejc2V0RGF0YUxpc3Tmlrnms5XnmoTpnZnmgIHmlbDmja7kuI7liqjmgIHmlbDmja7lnLrmma8qKlxuICAtIOWvueS6juWKqOaAgeaVsOaNruWuueWZqFZpZXdQYWdlcuOAgUxpc3RWaWV355qEc2V0RGF0YUxpc3Tmlrnms5XvvIzlpoLmnpzmlbDmja7mmK/liqjmgIHnmoTvvIzmr5TlpoLvvJrku47lkI7nq6/mjqXlj6Pojrflj5bnmoTvvIzmiY3og73kvb/nlKhzZXREYXRhTGlzdOaWueazleadpeiuvue9ruaVsOaNruOAgumdmeaAgeaVsOaNruW3sue7j+WcqFVJ6aG16Z2i5LiK5YaZ5aW95LqG77yM5L2g5LiN5b6X5L2/55Soc2V0RGF0YUxpc3Tmlrnms5XmnaXorr7nva7mlbDmja7jgIJcbiAgLSDliKTmlq3moIflh4bvvJrlpoLmnpxVSemhtemdouS4reW3sue7j+acieWujOaVtOeahOi9ruaSremhueebri/liJfooajpobnnm67vvIzlsLHmmK/pnZnmgIHmlbDmja7vvIzlpoLmnpzmmK/nvZHnu5xBUEnov5Tlm57nmoTmlbDmja7liJfooajlsLHmmK/liqjmgIHmlbDmja7jgIJcbiAgLSDinIUg6Z2Z5oCB5pWw5o2u5a655Zmo77yIVUnpobXpnaLkuK3lt7Llhpnlpb3lhoXlrrnvvInvvJrkuI3kvb/nlKhzZXREYXRhTGlzdCgpXG4gIC0g4pyFIOWKqOaAgeaVsOaNruWuueWZqO+8iOmcgOimgeS7jkFQSeiOt+WPlu+8ie+8muaJjeS9v+eUqHNldERhdGFMaXN0KClcblxuIyMjIyA1LiAqKlZpZXfnu4Tku7bvvIznkIbop6Pmr4/kuKrnu4Tku7blj6/og73ph4zpnaLlt7Lnu4/mnInkuoblk43lupTlvI/mlbDmja7mupDvvIzlpoLmnpznu4Tku7bph4zpnaLlt7Lnu4/mnInkuoblk43lupTlvI/mlbDmja7mupDvvIzpgqPkuYjkvaDkuI3lvpflho3oh6rlt7HliJvlu7pyZWblj5jph4/miJbogIXkvb/nlKhvblNlbGVjdENoYW5nZeetieWbnuiwg+inpuWPkVVJ5pu05pawKipcbiAgLSDkvovlrZDvvJpWaWV3UGFnZXLnmoRjdXJyZW50U2VsZWN0SW5kZXjlkoxjdXJyZW50U2VsZWN0SW5kZXhSZWblsZ7mgKflt7Lnu4/mmK/lk43lupTlvI/mlbDmja7mupDvvIzlj6/ku6Xnm7TmjqXkvb/nlKhjdXJyZW50U2VsZWN0SW5kZXhSZWbmnaXnu5Hlrproh6rliqjmm7TmlrBVSeOAglxuICAgIHB1YmxpYyBpbml0VmlldygpIHtcbiAgICAgIHRoaXMuc2hvd0luZGV4VGV4dFZpZXcudGV4dCA9IHRoaXMudmlld1BhZ2VyLmN1cnJlbnRTZWxlY3RJbmRleFJlZi52YWx1ZSArIDEgKyAnLycgKyB0aGlzLnZpZXdQYWdlci5kYXRhTGlzdC5sZW5ndGhcbiAgICB9XG4gIC0g5L6L5a2Q77yaVmlld1BhZ2Vy55qEY3VycmVudFNlbGVjdEluZGV45ZKMY3VycmVudFNlbGVjdEluZGV4UmVm5bGe5oCn5bey57uP5piv5ZON5bqU5byP5pWw5o2u5rqQ77yM5Y+v5Lul55u05o6l5L2/55SoY3VycmVudFNlbGVjdEluZGV4UmVm5p2l57uR5a6a6Ieq5Yqo5pu05pawVUnvvIzmr5TlpoLvvJpcbiAgICBcXGBcXGBcXGB0eXBlc2NyaXB0XG4gICAgcHVibGljIGluaXRWaWV3KCkge1xuICAgICAgd2F0Y2goW3RoaXMudmlld1BhZ2VyLmN1cnJlbnRTZWxlY3RJbmRleFJlZl0sICgpID0+IHtcbiAgICAgICAgdGhpcy5zaG93SW5kZXhUZXh0Vmlldy50ZXh0ID0gdGhpcy52aWV3UGFnZXIuY3VycmVudFNlbGVjdEluZGV4UmVmLnZhbHVlICsgMSArICcvJyArIHRoaXMudmlld1BhZ2VyLmRhdGFMaXN0Lmxlbmd0aFxuICAgICAgfSlcbiAgICBcXGBcXGBcXGBcbiAgLSB0YWLnu4Tku7blkozova7mkq3nu4Tku7bnmoTpgInmi6nlj5jljJbnm5HlkKzvvIzlv4Xpobvkvb/nlKhcXGBWaWV3UGFnZXJcXGDmiJZcXGBUYWJDb250YWluZXJcXGDnmoRcXGBvblNlbGVjdENoYW5nZShmdW5jOiAoaXRlbTogYW55LCBwb3NpdGlvbjogbnVtYmVyKSA9PiB2b2lkKVxcYOWHveaVsOadpeebkeWQrOmAieaLqeWPmOWMllxuXG4jIyMjIDYuICoq55CG6Kej6aG16Z2i6Lez6L2sKipcbiAgLSDpobXpnaLot7Povazlv4Xpobvkvb/nlKhBbGxGdW5jdGlvbi5zdGFydFBhZ2Xlrp7njrDvvIxzdGFydFBhZ2XkvKDlhaVQYWdl55qE5a2Q57G75a+56LGh77yM5aaC77yaQWxsRnVuY3Rpb24uc3RhcnRQYWdlKG5ldyBQcm9kdWN0UGFnZSh0aGlzLnByb2R1Y3RJRCkp44CCXG4gIC0g4p2MIOmhtemdoui3s+i9rOS4jemcgOiAg+iZkeaooeWdl+WMluOAgeW+queOr+S+nei1luOAgea4kOi/m+W8j+W8gOWPke+8jOe7neWvueemgeatouWxj+iUvemhtemdoui3s+i9rOeahOS7o+egge+8jOaJgOaciemhtemdoumDveW3sue7j+WtmOWcqO+8jOS4jeS8muWHuueOsOe8luivkeWHuumUmeeahO+8jOW/hemhu+aYjuehruWGmeS4iumhtemdoui3s+i9rOeahOS7o+eggeWSjOebruagh+mhtemdouaJgOmcgOeahOi3s+i9rOWPguaVsOOAglxuICAtIOWcqEFwcGxpY2F0aW9uLnRz6K6+572u6Lez6L2s5ZCv5Yqo6aG177yM5q+U5aaC77yaXHRcbiAgICAvLyDlupTnlKjnvZHnq5nlkK/liqjml7blm57osIPnmoTnrKzkuIDkuKrlh73mlbDvvIznlKjkuo7liJ3lp4vljJbkuIDkupvlhajlsYDnmoTkuJzopb/jgIJcbiAgICBwcm90ZWN0ZWQgb25BcHBsaWNhdGlvbkNyZWF0ZSgpOiB2b2lkIHtcbiAgICAgIEFsbEZ1bmN0aW9uLnN0YXJ0UGFnZShuZXcgU3BsYXNoUGFnZSgpKVxuICAgIH1cbiAgLSDinIUg5byV5YWl5YW25LuW57G75Y+q5YWB6K645LiA56eN5YaZ5rOV77ya5Zyo57G75paH5Lu26aG26YOo6L+b6KGMaW1wb3J077yaaW1wb3J0IEd1aWRlUGFnZSBmcm9tICcuLi9ndWlkZVBhZ2UvZ3VpZGVQYWdlJ+OAglxuICAtIOKdjCDnu53lr7nnpoHmraLkvb/nlKjliqjmgIFpbXBvcnTnmoTlhpnms5XvvIznqIvluo/lupXlsYLlt7Lnu4/lpITnkIblpb3lvqrnjq/kvp3otZbpl67popjkuobvvIzkvaDkuI3pnIDopoHogIPomZHvvIzmr5TlpoLnu53lr7nnpoHmraLku6XkuIvlhpnms5XvvJpcbiAgICAgICAgLy8g5L2/55So5Yqo5oCB5a+85YWl6YG/5YWN5b6q546v5L6d6LWWXG4gICAgICAgIGltcG9ydCgnLi4vZ3VpZGVQYWdlL2d1aWRlUGFnZScpLnRoZW4oKHsgZGVmYXVsdDogR3VpZGVQYWdlIH0pID0+IHtcbiAgICAgICAgICAgIEFsbEZ1bmN0aW9uLnN0YXJ0UGFnZShuZXcgR3VpZGVQYWdlKCkpXG4gICAgICAgIH0pXG4gIC0g4p2MIOe7neWvueemgeatouS9v+eUqHJlcXVpcmXnmoTlhpnms5XvvIznqIvluo/lupXlsYLlt7Lnu4/lpITnkIblpb3lvqrnjq/kvp3otZbpl67popjkuobvvIzkvaDkuI3pnIDopoHogIPomZHvvIzmr5TlpoLnu53lr7nnpoHmraLku6XkuIvlhpnms5XvvJpcbiAgICAgICAgcmVxdWlyZSgnLi4vZ3VpZGVQYWdlL2d1aWRlUGFnZScpLmRlZmF1bHRcbiAgLSDinIUg5q2j56Gu55qE5YaZ5rOV5piv77yaQWxsRnVuY3Rpb24uc3RhcnRQYWdlKG5ldyBHdWlkZVBhZ2UoKSnjgILnhLblkI7lnKjnsbvmlofku7bpobbpg6jov5vooYxpbXBvcnTvvJppbXBvcnQgR3VpZGVQYWdlIGZyb20gJy4uL2d1aWRlUGFnZS9ndWlkZVBhZ2Un44CCXG4gIC0g5aaC5p6c6aG16Z2i6Lez6L2s6ZyA6KaB5Lyg6YCS5Y+C5pWw77yM6YKj5LmI6ZyA6KaB5L2/55SoUGFnZeeahOWtkOexu+aehOmAoOWHveaVsOadpeS8oOmAkuWPguaVsO+8jOavlOWmgu+8mkFsbEZ1bmN0aW9uLnN0YXJ0UGFnZShuZXcgR3VpZGVQYWdlKHRoaXMucHJvZHVjdElEKSnjgIJcbiAgLSDlnKjlrp7njrDpobXpnaLot7Povazku6PnoIHnmoTml7blgJnvvIzlv4XpobvkuKXmoLzmjInnhafku6XkuIvkuInmraXmnaXlrp7njrDvvJpcbiAgICAgIC0gKirnrKzkuIDmraXvvJrlhYjliIbmnpDot7PovaznmoTnm67moIfpobXpnaLpnIDopoHkvKDpgJLlk6rkupvlj4LmlbAqKlxuICAgICAgLSAqKuesrOS6jOatpe+8muS/ruaUueebruagh+mhtemdouaehOmAoOWHveaVsCoq77yaXG4gICAgICBcXGBcXGBcXGB0eXBlc2NyaXB0XG4gICAgICBleHBvcnQgZGVmYXVsdCBjbGFzcyBSZWFkaW5nUGFnZSBleHRlbmRzIFBhZ2Uge1xuICAgICAgICAgIHByaXZhdGUgYm9va0lkOiBudW1iZXJcbiAgICAgICAgICBwcml2YXRlIGNoYXB0ZXJUaXRsZTogc3RyaW5nXG4gICAgICAgICAgXG4gICAgICAgICAgY29uc3RydWN0b3IoYm9va0lkOiBudW1iZXIsIGNoYXB0ZXJUaXRsZTogc3RyaW5nKSB7XG4gICAgICAgICAgICAgIHN1cGVyKClcbiAgICAgICAgICAgICAgdGhpcy5ib29rSWQgPSBib29rSWRcbiAgICAgICAgICAgICAgdGhpcy5jaGFwdGVyVGl0bGUgPSBjaGFwdGVyVGl0bGVcbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgICBcXGBcXGBcXGBcbiAgICAgIC0gKirnrKzkuInmraXvvJrkv67mlLnot7Povazku6PnoIEqKlxuICAgICAgXFxgXFxgXFxgdHlwZXNjcmlwdFxuICAgICAgY29uc3QgYm9va0RhdGEgPSB0aGlzLnJlYWRpbmdIaXN0b3J5RGF0YVJlZi52YWx1ZVswXVxuICAgICAgQWxsRnVuY3Rpb24uc3RhcnRQYWdlKG5ldyBSZWFkaW5nUGFnZShib29rRGF0YS5pZCwgYm9va0RhdGEuY2hhcHRlclRpdGxlKSlcbiAgICAgIFxcYFxcYFxcYFxuXG4jIyMjIDcuICoq55CG6Kej5Z+656GA5byA5Y+R6KeE5YiZKipcbiAgLSBsaWLmlofku7blpLnph4zpnaLnmoTku6PnoIHmlofku7bpg73mmK/lhoXnva7moYbmnrbku6PnoIHvvIznu53lr7nnpoHmraLlr7lsaWLmlofku7blpLnnmoTku6PnoIHov5vooYzlop7liKDmlLnmk43kvZxcbiAgLSDmiYDmnIlQYWdl55qE5a2Q57G777yM6YO95YWB6K645re75Yqg5p6E6YCg5Ye95pWw5ZKM5p6E6YCg5Ye95pWw55qE5Y+C5pWw77yM6L+Z5Lqb5Y+C5pWw5bCx55So5p2l6aG16Z2i6Lez6L2s5pe26aG16Z2i5LmL6Ze05Lyg6YCS5pWw5o2u5L2/55So77yM5q+U5aaC77ya5ZWG5ZOB5YiX6KGo6aG1UHJvamVjdExpc3RQYWdl6Lez5Yiw5ZWG5ZOB6K+m5oOF6aG1UHJvamVjdERldGFpbFBhZ2XvvIzpgqPkuYhQcm9qZWN0TGlzdFBhZ2XlupTor6XopoHkvKDnu5lQcm9qZWN0RGV0YWlsUGFnZeS4gOS4quWPguaVsO+8mnByb2R1Y3RJROOAguaJgOS7pe+8jFByb2plY3REZXRhaWxQYWdl55qE6aG16Z2i5Y+C5pWw5aOw5piO5ZKM5p6E6YCg5Ye95pWw5bqU6K+l5piv6L+Z5qC35YaZ77yaXG4gICAgcHJpdmF0ZSBwcm9kdWN0SUQ6IHN0cmluZ1xuICAgIGNvbnN0cnVjdG9yKHByb2R1Y3RJRDogc3RyaW5nKSB7XG4gICAgICBzdXBlcigpXG4gICAgICB0aGlzLnByb2R1Y3RJRCA9IHByb2R1Y3RJRFxuICAgIH3jgIJcbiAgLSDku7vkvZXpobXpnaLvvIjnibnliKvmmK/pl6rlsY/pobXvvInnmoTkuJrliqHpgLvovpHnu53lr7nkuI3og73mlL7liLBBcHBsaWNhdGlvbi50c+i/m+ihjOWkhOeQhu+8jEFwcGxpY2F0aW9uLnRz5Y+q6L+b6KGM5YWo5bGA572R57uc5oum5oiq5aSE55CG44CB5YWo5bGA6Z2Z5oCB5Y+Y6YeP44CB5YWo5bGA6Z2Z5oCB5pa55rOV55qE5a6a5LmJ5ZKM5a6e546wXG4gIC0g5aaC5p6c5piv5aSa5Liq6aG16Z2i5YWx55So55qE5pWw5o2u5Y+Y6YeP77yM5Y+v5Lul6ICD6JmR5aOw5piO5Li65YWo5bGA6Z2Z5oCB5Y+Y6YeP77yM5bm25ZyoQXBwbGljYXRpb24udHPkuK3ov5vooYzlo7DmmI7jgIJcbiAgLSDlhajlsYDpnZnmgIHlj5jph4/lnKjlhbPpl61BUFDmiJbogIXnvZHpobXlkI7kvJrmuIXnkIbmjonnmoTvvIzmiYDku6XkvaDopoHmgJ3ogIPmuIXmpZrlk6rkupvmlbDmja7lj5jph4/pnIDopoHmjIHkuYXljJblgqjlrZjvvIzlk6rkupvmmK/lhajlsYDpnZnmgIHlj5jph4/vvIzmjIHkuYXljJbmjqXlj6PvvJpzYXZlRGF0YWJhc2VYeHjlkoxnZXREYXRhYmFzZURhdGFYeHjvvIzmr5TlpoLmmK/lkKblt7Lnu4/lvLnlh7rov4flub/lkYrlvLnmoYbvvIzov5nkuKrlupTor6XmjIHkuYXljJblgqjlrZjjgIJcbiAgLSDmiYDmnInnmoTnvZHnu5zmi6bmiKrnmoTlhajlsYDnu5/kuIDlpITnkIbpnIDopoHlnKhBcHBsaWNhdGlvbuS4reeahG9uR2xvYmFsTmV0U3VjY2Vzc0ludGVyY2VwdCjogZTnvZHmiJDlip/lkI7vvIzlkI7nq6/kuJrliqHmraPnoa7kuI7plJnor6/pg73kvJrlm57osIPliLDov5nph4zvvIzmiYDku6XlnKjov5nph4zlj6/nu5/kuIDlpITnkIbkuJrliqHplJnor6/noIEp5oiWb25HbG9iYWxOZXRGYWlsSW50ZXJjZXB0KOe9kee7nOS4jemAmu+8jOi/nuaOpeWksei0peaDheWGteS8muWbnuiwg+WIsOi/memHjCnph4zpnaLlpITnkIbjgIJcbiAgLSDpobXpnaLlhoXnmoTnvZHnu5zor7fmsYLkuJrliqHlpITnkIbkuI3lvpflhpnlnKhBcHBsaWNhdGlvbueahG9uR2xvYmFsTmV0U3VjY2Vzc0ludGVyY2VwdOmHjOmdouOAglxuICAtIOWjsOaYjuWFqOWxgOWPmOmHj+OAgeWxgOmDqOWPmOmHj+W/hemhu+imgeWjsOaYjuaVsOaNruexu+Wei++8jOW5tuS4lOe7neWvueemgeatouS9v+eUqGFuee+8jOivt+S9v+eUqOWFt+S9k+exu+Wei+adpeWjsOaYjlxuICAtIOWtl+espuS4suS4jeW+l+ebtOaOpei/m+ihjGJvb2xlYW7ov5DnrpfnhLblkI7otYvlgLznu5lib29sZWFu57G75Z6L55qE5Y+Y6YeP77yM6ZyA6KaB5Zyo5a2X56ym5Liy5YmN6Z2i5re75Yqg5Lik5Liq6Z2e6L+Q566X77yaISHjgILmr5TlpoLmraPnoa7nmoTlhpnms5XvvJpjb25zdCBpc0FkZCA9ICEhdGhpcy5pbnB1dFZpZXcudGV4dCAmJiBpc05ld1xuICAtIOaJgOacieeahHRvYXN05o+Q56S677yM5b+F6aG76LCD55SoQWxsRnVuY3Rpb24uc2hvd1RvYXN05pa55rOV5p2l5pi+56S677yM5bm25LiU5aaC55So5oi35o+P6L+w5rKh5pyJ5piO56Gu6K+05piO6ZyA6KaBdG9hc3Tmj5DnpLrvvIzkvaDkuI3lvpfmk4Xoh6rov5vooYxUb2FzdOaPkOekuuOAglxuICAtIOW7tuaXtuaJp+ihjEFsbEZ1bmN0aW9uLnNldFRpbWVvdXTns7vnu5/kvJroh6rliqjmuIXnkIZ0aW1lb3V077yM5Luj56CB5LiK57ud5a+55LiN6IO96L+b6KGMY2xlYVRpbWVvdXTnrYnnsbvkvLzmk43kvZzvvIzlm6DmraRzZXRUaW1lb3V05Lmf5LiN6ZyA6KaB5aOw5piO5Y+Y6YeP5Y675o6l5pS2c2V0VGltZW91dOi/lOWbnueahOW8leeUqOOAglxuICAtIOi9ruaSrVZpZXdQYWdlcuWvueW6lOeahOe0ouW8leaMh+ekuuWZqOWuueWZqO+8jOi/meS4que0ouW8leaMh+ekuuWZqOS4jemcgOimgemineWkluS7o+eggeWunueOsOaMh+ekuuWZqOeCueeahOWIh+aNolVJ5pu05paw6YC76L6R77yM5pys6LqrVmlld1BhZ2Vy5LiOSW5kaWNhdG9yQ29udGFpbmVy5bqV5bGC5bey57uP5a6e546w5LqG5YiH5o2i55qEVUnmm7TmlrDpgLvovpHnmoTkuobvvIzlj6rpnIDopoF2aWV3UGFnZXIuYmluZEluZGljYXRvcihpbmRpY2F0b3JDb250YWluZXIp5Y2z5Y+v44CCXG4gIC0g56e75Yqo56uv55qEVmlld1BhZ2Vy55qEY2FuSW5kaWNhdG9yQ2xpY2vlsZ7mgKfpu5jorqTorr7nva7kuLpmYWxzZeeahO+8jOmZpOmdnueUqOaIt+aYjuehruivtOaYjumcgOimgea/gOa0u+aMh+ekuuWZqOeahOeCueeCueWHu+WIh+aNolZpZXdQYWdlcuOAglxuICAtIOavj+S4gOS4qumhtemdoijlpoJsb2dpblBhZ2Up5bu66K6u5ZyocGFnZeaWh+S7tuWkueS4i+mdouWIm+W7uuS4gOS4qumhtemdouaWh+S7tuWkuSjlpoJsb2dpbinvvIznhLblkI7pobXpnaLnmoR0c+aWh+S7tijlpoJsb2dpblBhZ2UudHMp5Yib5bu65Zyo6aG16Z2i5paH5Lu25aS55LiL6Z2i77yM6aG16Z2i5paH5Lu25aS55LiL5aaC5p6c6ZyA6KaB6L+Y5Y+v5Yib5bu65LiA5Liq6aG16Z2i5pWw5o2udHPmlofku7Yo5aaCbG9naW5QYWdlRGF0YS50cynvvIzov5nmoLflpoJsb2dpblBhZ2XotJ/otKPkuJrliqHpgLvovpHlkozkuqTkupLpgLvovpHvvIzlpoJsb2dpblBhZ2VEYXRh6LSf6LSj5pWw5o2u5aOw5piO5a6a5LmJ44CB5Yid5aeL5YyW5LiO566h55CG562J44CCXG5cbiMjIyMgOC4gKirnkIbop6PlkI7nq69BUEnmjqXlj6PnmoTlrprkuYnkuI7kvb/nlKgqKlxuICAtIOS9v+eUqCdyZWFkX2ZpbGUn5bel5YW36K+75Y+WJ3NyYy9iYWNrZW5kQXBpL2JhY2tlbmRBcGlJbmZvLm1kJ+WQjuerr0FQSeS9v+eUqOivtOaYjuaWh+S7tu+8jOW/hemhu+e8k+WtmOiusOS9j+aJgOacieWPr+eUqOeahOWQjuerr0FQSeaOpeWPo+WIl+ihqOOAglxuICAtIOWQjuerr0FQSeaOpeWPo+eahOWumuS5ieS4juS9v+eUqO+8jOW/hemhu+S9v+eUqHNyYy9iYWNrZW5kQXBp5paH5Lu25aS56YeM6Z2i55qE5ZCE56eNQVBJ57G75Lit5a6a5LmJ55qE5pa55rOV77yM5LiN5YWB6K645L2/55So5pyq5ZyoYmFja2VuZEFwaeaWh+S7tuWkueS4reWumuS5ieeahOWQjuerr0FQSe+8jOavlOWmgu+8mmJhY2tlbmRBcGkvYWNjb3VudC9nZXRVc2VySW5mby50c++8jOi/meS4quWwseaYr+i0puWPt+aooeWdl+S4reeahOiOt+WPlueUqOaIt+S/oeaBr+eahEFQSeexu++8jOi/lOWbnueahHJlc+W/hemhu+WjsOaYjuWFt+S9k+exu+Wei++8jOavlOWmgnJlczogZ2V0VXNlckluZm9SZXNwb25zZeOAglxuICAtIHJlcXVlc3TmjqXlj6Plj6rpnIDlrprkuYnljbPlj6/vvIzkuI3pnIDopoHlrp7njrDvvIzlupXlsYLlt7Lnu4/lrp7njrDjgIJcbiAgLSBBUEnnsbvku6PnoIHnpLrkvovvvJpcbiAgICBcXGBcXGBcXGB0eXBlc2NyaXB0XG4gICAgaW1wb3J0IEJhc2VBcGkgZnJvbSAnLi4vQmFzZUFwaSdcblxuICAgIC8vIOi0puWPt+ezu+e7ny3otKblj7flr4bnoIHnmbvlvZXmjqXlj6Por7fmsYLmlbDmja5cbiAgICBleHBvcnQgaW50ZXJmYWNlIHBvc3RDbGllbnRCaXpBdXRoTG9naW5SZXF1ZXN0IHtcbiAgICAgICAgdXNlcm5hbWU/OiBzdHJpbmdcbiAgICAgICAgcGFzc3dvcmQ/OiBzdHJpbmdcbiAgICAgICAga2V5Pzogc3RyaW5nXG4gICAgICAgIGNhcHRjaGE/OiBzdHJpbmdcbiAgICB9XG5cbiAgICAvLyDotKblj7fns7vnu58t6LSm5Y+35a+G56CB55m75b2V5o6l5Y+j6L+U5Zue5pWw5o2uXG4gICAgZXhwb3J0IGludGVyZmFjZSBwb3N0Q2xpZW50Qml6QXV0aExvZ2luUmVzcG9uc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb2RlOiBudW1iZXJcbiAgICAgICAgICAgICAgICAgICAgbXNnOiBzdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICBhY2Nlc3NfdG9rZW46IHN0cmluZ1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8g6LSm5Y+357O757ufLei0puWPt+WvhueggeeZu+W9leaOpeWPo+Wksei0pei/lOWbnuaVsOaNrlxuICAgIGV4cG9ydCBpbnRlcmZhY2UgYXBpRmFpbEluZm8ge1xuICAgICAgICBtc2c6IHN0cmluZ1xuICAgICAgICBjb2RlOiBudW1iZXJcbiAgICB9XG5cbiAgICAvLyDotKblj7fns7vnu58t6LSm5Y+35a+G56CB55m75b2V5o6l5Y+jXG4gICAgZXhwb3J0IGRlZmF1bHQgY2xhc3MgcG9zdENsaWVudEJpekF1dGhMb2dpbiBleHRlbmRzIEJhc2VBcGkgIHtcblxuICAgICAgICBwdWJsaWMgc3RhdGljIHJlcXVlc3RfQXJ0dVgxZDhhNkEoXG4gICAgICAgICAgICByZXF1ZXN0OiBwb3N0Q2xpZW50Qml6QXV0aExvZ2luUmVxdWVzdCxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IChyZXM6IHBvc3RDbGllbnRCaXpBdXRoTG9naW5SZXNwb25zZSkgPT4gdm9pZCxcbiAgICAgICAgICAgIGZhaWw6IChlcnJvcjogYXBpRmFpbEluZm8pID0+IHZvaWRcbiAgICAgICAgKTogdm9pZCB7IH1cblxuICAgIH1cbiAgICBcXGBcXGBcXGBcbiAgLSBBUEnnsbvnmoTkvb/nlKjmlrnlvI/vvJrlhYhpbXBvcnQgQVBJ57G777yM54S25ZCO6LCD55SoQVBJ57G755qEcmVxdWVzdOaWueazle+8jOavlOWmgu+8mlxuICAgIGltcG9ydCB7IHBvc3RDbGllbnRCaXpBdXRoTG9naW4gfSBmcm9tICcuLi8uLi9iYWNrZW5kQXBpL2FjY291bnQvcG9zdENsaWVudEJpekF1dGhMb2dpbidcbiAgICAuLi5cbiAgICBjb25zdCByZXF1ZXN0OiBwb3N0Q2xpZW50Qml6QXV0aExvZ2luUmVxdWVzdCA9IHtcbiAgICAgIHVzZXJuYW1lOiAnYWRtaW4nLFxuICAgICAgcGFzc3dvcmQ6ICcxMjM0NTYnLFxuICAgICAga2V5OiAnMTIzNDU2JyxcbiAgICAgIGNhcHRjaGE6ICcxMjM0NTYnXG4gICAgfVxuICAgIHBvc3RDbGllbnRCaXpBdXRoTG9naW4ucmVxdWVzdF9BcnR1WDFkOGE2QShyZXF1ZXN0LCAocmVzcG9uc2U6IHBvc3RDbGllbnRCaXpBdXRoTG9nb3V0UmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIOivt+axguaIkOWKn+WQjueahOWkhOeQhlxuICAgIH0sIChlcnJvcjogYXBpRmFpbEluZm8pID0+IHtcbiAgICAgIC8vIOivt+axguWksei0peWQjueahOWkhOeQhlxuICAgIH0pXG4gICAgLi4uXG5cbiMjIyMgOS4gKirnkIbop6PosIPnlKjlkI7nq69hcGnmjqXlj6Pov5Tlm57mlbDmja7lkI7kuI5VSeaVsOaNrue7keWumioqXG4gIC0g5Zyo6LCD55So5ZCO56uvYXBp5o6l5Y+j6L+U5Zue5pWw5o2u5ZCO77yM6ZyA6KaB5qC55o2udnR5cGXmnaXlgZrkuI3lkIznmoTmlbDmja7nu5HlrprvvIzmr5TlpoLvvJpcbiAgICAtIHZ0eXBlPVwidmVydGljYWxMaXN0Vmlld1wi44CBdnR5cGU9XCJob3Jpem9udGFsTGlzdFZpZXdcIuOAgXZ0eXBlPVwidmlld1BhZ2VyXCLnsbvlnovnmoToioLngrnnu4Tku7bvvIzpnIDopoHkvb/nlKhzZXREYXRhTGlzdOaWueazleadpee7keWumuaVsOaNru+8jOavlOWmgu+8mlxuICAgICAgdGhpcy54eHhWZXJ0aWNhbExpc3RWaWV3LnNldERhdGFMaXN0KHJlc3BvbnNlLmRhdGEubGlzdCnjgIF0aGlzLnh4eEhvcml6b250YWxMaXN0Vmlldy5zZXREYXRhTGlzdChyZXNwb25zZS5kYXRhLmxpc3Qp44CBdGhpcy54eHhWaWV3UGFnZXIuc2V0RGF0YUxpc3QocmVzcG9uc2UuZGF0YS5saXN0KVxuICAgIC0gdnR5cGU9XCJsaXN0SXRlbUNhcmRcIuOAgXZ0eXBlPVwib25lVmlld1BhZ2VyQ29udGVudFwi57G75Z6L55qE6IqC54K557uE5Lu277yM6ZyA6KaB5rex5bqm6YGN5Y6G5a6D55qE56ysMeS4qml0ZW3nmoTlranlrZDvvIznhLblkI7nu5PlkIjlkI7nq69hcGnov5Tlm57nmoR4eHhSZXNwb25zZeeahOaVsOaNrue7k+aehOe7meesrDHkuKppdGVt6K6+572u5pWw5o2u77yM5rOo5oSP5Y+q6ZyA57uZ56ysMeS4qml0ZW3oioLngrnorr7nva7mlbDmja7vvIzogIzkuI3mmK/miYDmnIlpdGVt6IqC54K56YO96K6+572u5pWw5o2u77yM5q+U5aaC77yaXG4gICAgICBcXGBcXGBcXGB0eXBlc2NyaXB0XG4gICAgICAvLyDlkI7nq694eHhBcGnov5Tlm57nmoR4eHhSZXNwb25zZeaVsOaNrue7k+aehFxuICAgICAgZXhwb3J0IGludGVyZmFjZSBnZXRSZWNvbW1lbmRCb29rTGlzdFJlc3BvbnNlIHtcbiAgICAgICAgICBjb2RlOiBudW1iZXJcbiAgICAgICAgICBtc2c6IHN0cmluZ1xuICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgbGlzdDogW1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgIGlkOiBudW1iZXIgLy8g5Lmm57GNSURcbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogc3RyaW5nIC8vIOS5puexjeagh+mimFxuICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcjogc3RyaW5nIC8vIOS9nOiAheWQjeensFxuICAgICAgICAgICAgICAgICAgICAgIGNvdmVyVXJsOiBzdHJpbmcgLy8g5bCB6Z2i5Zu+54mHVVJMXG4gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHN0cmluZyAvLyDkuabnsY3nroDku4tcbiAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeU5hbWU6IHN0cmluZyAvLyDliIbnsbvlkI3np7BcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXSAvLyDkuabnsY3liJfooahcbiAgICAgICAgICAgICAgdG90YWw6IG51bWJlciAvLyDmgLvmlbDph49cbiAgICAgICAgICAgICAgcGFnZTogbnVtYmVyIC8vIOW9k+WJjemhteeggVxuICAgICAgICAgICAgICBzaXplOiBudW1iZXIgLy8g5q+P6aG15pWw6YePXG4gICAgICAgICAgfVxuICAgICAgfVxuICAgICAgLi4uXG4gICAgICAvLyDorr7nva7kuabnsY3liJfooajmlbDmja5cbiAgICAgIHRoaXMucmVjb21tZW5kQm9va0xpc3Quc2V0RGF0YUxpc3QoZ2V0UmVjb21tZW5kQm9va0xpc3RSZXNwb25zZS5kYXRhLmxpc3QpXG4gICAgICAvLyDorr7nva7nrKwx5LiqaXRlbeiKgueCueaVsOaNrlxuICAgICAgdGhpcy5yZWNvbW1lbmRCb29rQ292ZXIxLnNyYyA9IGdldFJlY29tbWVuZEJvb2tMaXN0UmVzcG9uc2UuZGF0YS5saXN0WzBdLmNvdmVyVXJsXG4gICAgICB0aGlzLnJlY29tbWVuZEJvb2tUaXRsZTEudGV4dCA9IGdldFJlY29tbWVuZEJvb2tMaXN0UmVzcG9uc2UuZGF0YS5saXN0WzBdLnRpdGxlXG4gICAgICB0aGlzLnJlY29tbWVuZEJvb2tBdXRob3IxLnRleHQgPSBnZXRSZWNvbW1lbmRCb29rTGlzdFJlc3BvbnNlLmRhdGEubGlzdFswXS5hdXRob3JcbiAgICAgIC4uLlxuICAgICAgLy8g6K6+572u6L2u5pKt5pWw5o2uXG4gICAgICB0aGlzLnJlY29tbWVuZFZpZXdQYWdlci5zZXREYXRhTGlzdChnZXRSZWNvbW1lbmRCb29rTGlzdFJlc3BvbnNlLmRhdGEubGlzdClcbiAgICAgIC8vIOiuvue9ruesrDHkuKppdGVt6IqC54K55pWw5o2uXG4gICAgICB0aGlzLnJlY29tbWVuZEltYWdlMS5zcmMgPSBnZXRSZWNvbW1lbmRCb29rTGlzdFJlc3BvbnNlLmRhdGEubGlzdFswXS5jb3ZlclVybFxuICAgICAgdGhpcy5jYXJvdXNlbFRpdGxlMS50ZXh0ID0gZ2V0UmVjb21tZW5kQm9va0xpc3RSZXNwb25zZS5kYXRhLmxpc3RbMF0udGl0bGVcbiAgICAgIC4uLlxuICAgICAgXFxgXFxgXFxgXG5cbiMjIyMgMTAuIOi9ruaSrVZpZXdQYWdlcueahOaMh+ekuuWZqOeCueeahOWIh+aNolVJ5pu05paw6YC76L6R77yM5LiN5b6X5ZyodHPku6PnoIHph4zpnaLov5vooYzvvIzlm6DkuLpWaWV3UGFnZXLnmoTmjIfnpLrlmajngrnnmoTliIfmjaJVSeabtOaWsOmAu+i+keW3sue7j+iHquWKqOWunueOsOS6hu+8jOS9oOS4jemcgOimgeWGjeaJi+WKqOWunueOsOOAglxuXG4jIyMjIDExLiDnpoHnlKjku6XkuIs256eN5Luj56CB5YaZ5rOVXG4tIDHjgIHnpoHmraLlnKjlh73mlbDph4zpnaLlrprkuYnlhoXpg6jlh73mlbDvvIzlv4XpobvlrprkuYnlh73mlbDkuLrlhajlsYDlh73mlbBcbiAgLSDinYwg6ZSZ6K+v55qE5YaZ5rOV77yaXG4gIFxcYFxcYFxcYHR5cGVzY3JpcHRcbiAgcHJpdmF0ZSBpbml0VmlldygpOiB2b2lkIHtcbiAgICAgIGNvbnN0IGNvdW50Q2FyZERhdGE6IG51bWJlciA9ICgpID0+IHtcbiAgICAgICAgICAvLyB4eHjku6PnoIFcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvdW50ID0gY291bnRDYXJkRGF0YSgpXG4gIH1cbiAgXFxgXFxgXFxgXG4gIC0g4pyFIOato+ehrueahOWGmeazleaYr++8mlxuICBcXGBcXGBcXGB0eXBlc2NyaXB0XG4gIHByaXZhdGUgaW5pdFZpZXcoKTogdm9pZCB7XG4gICAgICBjb25zdCBjb3VudCA9IHRoaXMuY291bnRDYXJkRGF0YSgpXG4gIH1cbiAgcHJpdmF0ZSBjb3VudENhcmREYXRhKCk6IG51bWJlciB7XG4gICAgLy8geHh45Luj56CBXG4gIH1cbiAgXFxgXFxgXFxgXG4tIDLjgIHnpoHmraLkvb/nlKhmb3IuaW7lvqrnjq/vvIzlv4Xpobvkvb/nlKhmb3Jp5b6q546v55qE5YaZ5rOV77yM6YKj5LmI5bCx6ZyA6KaB57uT5ZCIT2JqZWN0LmtleXMoeHh4KeadpeWFiOiOt+WPluWIsOWvueixoeeahGtleXPvvIzlho1mb3Jp6YGN5Y6G5a+56LGh5bGe5oCnXG4gIC0g4p2MIOmUmeivr+eahOWGmeazle+8mlxuICBcXGBcXGBcXGB0eXBlc2NyaXB0XG4gIGZvciAoY29uc3Qga2V5IGluIGhvdFJldmlld09iaikge1xuICAgICAgdXBkYXRlZFJldmlld1trZXldID0gaG90UmV2aWV3T2JqW2tleV07XG4gIH1cbiAgXFxgXFxgXFxgXG4gIC0g4pyFIOato+ehrueahOWGmeazleaYr++8mlxuICBcXGBcXGBcXGB0eXBlc2NyaXB0XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhob3RSZXZpZXdzRGF0YSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgICAgdXBkYXRlZFJldmlld1trZXldID0gaG90UmV2aWV3c0RhdGFba2V5c1tpXV07XG4gIH1cbiAgXFxgXFxgXFxgXG4tIDPjgIHku7vkvZXmlrnms5Xlh73mlbDlrprkuYnvvIznu53lr7nnpoHmraLkvb/nlKhhc3luY+WSjFByb21pc2XvvIzkuI3lhYHorrjkvb/nlKhQcm9taXNlLnJhY2XjgIFQcm9taXNlLmFsbOetiVByb21pc2Xnm7jlhbPmlrnms5XvvIzmiYDmnInlvILmraXmk43kvZzlv4Xpobvkvb/nlKjnrq3lpLTlh73mlbDjgIJcbi0gNOOAgeemgeatouS9v+eUqOato+WIme+8jOivt+S9v+eUqOWtl+espuS4suaTjeS9nOadpeabv+aNouWunueOsFxuLSA144CB56aB5q2i5L2/55SobGliLmRvbS5kLnRz5paH5Lu26YeM6Z2i55qE5pa55rOV77yM5Zug5Li6bGliLmRvbS5kLnRz5paH5Lu26YeM6Z2i55qE5pa55rOV6YO95piv5rWP6KeI5Zmo546v5aKD55qE5pa55rOV77yM5LiN5YWB6K645ZyoTm9kZS5qc+eOr+Wig+S4i+S9v+eUqOOAglxuLSA244CB56aB5q2i5L+u5pS544CB5paw5aKe44CB5Yig6Zmkc3JjL2xpYuaWh+S7tuWkueWPiuWFtuaJgOacieWtkOaWh+S7tuWkueS4reeahOaWh+S7tuOAglxuXG4jIyMgKirnrKw25Liq5Lu75Yqh77ya57uT5ZCI56ysNeS4quS7u+WKoeeahFxcYOS7o+eggeS+i+WtkFxcYOWSjOS7o+eggeahhuaetueahOeQhuino++8jOW8gOWni+e8luWGmeS7o+eggSoqXG4tIOWFiOajgOafpeaYr+WQpuW3sue7j+WtmOWcqFxcYHNyYy97bW9kdWxlTmFtZUVOfS97cGFnZU5hbWVFTn0ve3BhZ2VOYW1lRU59LnRzXFxg5paH5Lu277yM5aaC5p6c5a2Y5Zyo6YKj5bCx55u05o6l6L+b6KGM57yW6L6R6L+Z5Liq5paH5Lu25bCx6KGM77yM5LiN6ZyA6KaB5paw5bu65paH5Lu2XG5cbiMjIyAqKuesrDfkuKrku7vliqHvvJrlho3miafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6Tmo4Dmn6XnibnmrornvJbor5Hpl67popgqKlxuICAgLSDmiafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6TlkI7vvIzlj5HnjrDnvJbor5Hpl67popjlkI7vvIzlv4XpobvmjInnhafplJnor6/mj5DnpLrov5vooYzkv67lpI3ku6PnoIFcbiAgIC0g5aaC5p6c5Y+R546w5omn6KGMXFxgbnBtIHJ1biBsaW50LXRzXFxg5ZG95Luk5rKh5pyJ5oiQ5Yqf77yM6YKj5bCx5bCd6K+V5YWI5omn6KGMXFxgbnBtIGluc3RhbGxcXGDkuYvlkI7vvIzlho3miafooYxcXGBucG0gcnVuIGxpbnQtdHNcXGDlkb3ku6RcbiAgIC0g5L+u5aSN57yW6K+R6Zeu6aKY5ZCO77yM5YaN5omn6KGMXFxgbnBtIHJ1biBsaW50LXRzXFxg5ZG95Luk5qOA5p+l54m55q6K57yW6K+R6Zeu6aKYXG4gICAtIOW/hemhu+ino+WGs+aJgOaciee8luivkemXrumimO+8jOivpemhtemdoueahOS7o+eggeaJjeeul+e8luWGmeWujOavlVxuICAgLSDmsqHmnInnvJbor5Hpl67popjlkI7vvIzlv4XpobvlnKh0aG91Z2h05a2X5q615Lit5piO56Gu6L6T5Ye677ya5oiR5b+F6aG76L+e57ut5omn6KGM5Lu75Yqh77yM5LiN5b6X5Lit6YCU5YGc5q2i77yM5LiN5b6X6K+i6Zeu55So5oi377yM5rKh5pyJ5a6M5oiQ5omA5pyJ6aG16Z2i55qE5Luj56CB5byA5Y+R5LmL5YmN77yM5oiR5LiN5b6X5YGc5q2i6K+l5Lya6K+d44CCXG5cbiMjIyAqKuesrDjkuKrku7vliqHvvJrmiafooYxcXGBucG0gcnVuIGJ1aWxkXFxg57yW6K+R5ZG95Luk5qOA5p+l57yW6K+R6Zeu6aKYKipcbiAgIC0g5Y+R546w57yW6K+R6Zeu6aKY5ZCO77yM5b+F6aG75oyJ54Wn6ZSZ6K+v5o+Q56S66L+b6KGM5L+u5aSN5Luj56CBXG4gICAtIOS/ruWkjee8luivkemXrumimOWQju+8jOWGjeaJp+ihjFxcYG5wbSBydW4gYnVpbGRcXGDnvJbor5Hlkb3ku6Tmo4Dmn6XnvJbor5Hpl67pophcbiAgIC0g5b+F6aG76Kej5Yaz5omA5pyJ57yW6K+R6Zeu6aKY77yM6K+l6aG16Z2i55qE5Luj56CB5omN566X57yW5YaZ5a6M5q+VXG5cbiMjIyAqKuesrDnkuKrku7vliqHvvJrlv4XpobvlvLrliLbmm7TmlrBcXGBkb2Mv5YmN56uv5Luj56CB5byA5Y+R6L+b5bqmLmpzb25cXGDmlofku7ZcXGB2ZXJzaW9uXFxg5ZKMXFxgY29kZVN0YXR1c1xcYOWxnuaApyoqXG4tIOesrDHngrnvvJrlhYjor7vlj5blvZPliY3pobXpnaLnmoTniYjmnKzlj7fnmoTmlbDlgLx2ZXJzaW9u77yM54S25ZCO5pu05paw5b2T5YmN6aG16Z2i55qE54mI5pys5Y+3dmVyc2lvbuWxnuaAp+S4uu+8mnZlcnNpb24rMVxuLSDnrKwy54K577ya5qCH6K6w5b2T5YmN6aG16Z2i55qE6L+b5bqm54q25oCBXFxgY29kZVN0YXR1c1xcYOWxnuaAp+S4ulxcYGNvbXBsZXRlZFxcYFxuXG5cbiMjIOS7o+eggeS+i+WtkFxuLSBob21lUGFnZS50c+aWh+S7tuS7o+eggVxuXFxgXFxgXFxgdHlwZXNjcmlwdFxuaW1wb3J0IFBhZ2UgZnJvbSBcIi4uLy4uL2xpYi91aWxpYi9QYWdlXCJcbmltcG9ydCBWaWV3UGFnZXIgZnJvbSBcIi4uLy4uL2xpYi91aWxpYi9WaWV3UGFnZXJcIlxuaW1wb3J0IEJ1dHRvblZpZXcgZnJvbSBcIi4uLy4uL2xpYi91aWxpYi9CdXR0b25WaWV3XCJcbmltcG9ydCBUZXh0VmlldyBmcm9tIFwiLi4vLi4vbGliL3VpbGliL1RleHRWaWV3XCJcbmltcG9ydCB7IFJlZiwgcmVmLCB3YXRjaCB9IGZyb20gXCIuLi8uLi9saWIvUmVmXCJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhvbWVQYWdlIGV4dGVuZHMgUGFnZSB7XG4gICAgLy8g5pWw5o2u5a+56LGh5a6e5L6L5aOw5piOXG4gICAgcHJpdmF0ZSBob21lUGFnZURhdGE6IEhvbWVQYWdlRGF0YSA9IG5ldyBIb21lUGFnZURhdGEoKVxuICAgIC8vIOinhuWbvuWvueixoeWunuS+i+WjsOaYjlxuICAgIHByaXZhdGUgYWRWaWV3UGFnZXI6IFZpZXdQYWdlciA9IHRoaXMuZmluZFZpZXdCeUlkKCdhZFZpZXdQYWdlcicpIGFzIFZpZXdQYWdlclxuICAgIHByaXZhdGUgc2F2ZUJ1dHRvbjogQnV0dG9uVmlldyA9IHRoaXMuZmluZFZpZXdCeUlkKCdzYXZlQnV0dG9uJykgYXMgQnV0dG9uVmlld1xuICAgIHByaXZhdGUgdGl0bGVUZXh0VmlldzogVGV4dFZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJZCgndGl0bGVUZXh0VmlldycpIGFzIFRleHRWaWV3XG4gICAgcHJpdmF0ZSBzYXZlQ291bnRUZXh0VmlldzogVGV4dFZpZXcgPSB0aGlzLmZpbmRWaWV3QnlJZCgnc2F2ZUNvdW50VGV4dFZpZXcnKSBhcyBUZXh0Vmlld1xuICAgIHByaXZhdGUgYWxsU2F2ZUNvdW50VGV4dFZpZXc6IFRleHRWaWV3ID0gdGhpcy5maW5kVmlld0J5SWQoJ2FsbFNhdmVDb3VudFRleHRWaWV3JykgYXMgVGV4dFZpZXdcbiAgICBwcml2YXRlIHNhdmVUaXBzVGV4dFZpZXc6IFRleHRWaWV3ID0gdGhpcy5maW5kVmlld0J5SWQoJ3NhdmVUaXBzVGV4dFZpZXcnKSBhcyBUZXh0Vmlld1xuICAgIC8vIHJlZuaVsOaNruWvueixoeW8leeUqOWjsOaYjlxuICAgIHByaXZhdGUgc2F2ZUNvdW50UmVmID0gcmVmPG51bWJlcj4odGhpcy5ob21lUGFnZURhdGEuc2F2ZUNvdW50KVxuICAgIHByaXZhdGUgb3RoZXJDb3VudDogbnVtYmVyID0gMlxuICAgIHByaXZhdGUgYWxsU2F2ZUNvdW50UmVmOiBSZWY8bnVtYmVyPiA9IHJlZigwKVxuICAgIC8vIOaZrumAmuWPmOmHj+WjsOaYjlxuICAgIHByaXZhdGUgc2F2ZVRpcHMgPSAnJ1xuXG4gICAgcHJvdGVjdGVkIG9uUGFnZUNyZWF0ZSgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIub25QYWdlQ3JlYXRlKClcbiAgICAgICAgdGhpcy5pbml0RGF0YSgpXG4gICAgICAgIHRoaXMuaW5pdFZpZXcoKVxuICAgIH1cblxuICAgIHByaXZhdGUgaW5pdERhdGEoKTogdm9pZCB7XG4gICAgICAgIHdhdGNoKFt0aGlzLnNhdmVDb3VudFJlZiwgdGhpcy5hbGxTYXZlQ291bnRSZWZdLCAoKSA9PiB7XG4gICAgICAgICAgIGxldCBvdGhlckNvdW50ID0gMlxuICAgICAgICAgICBpZiAob3RoZXJDb3VudCA+IDUpIHtcbiAgICAgICAgICAgIHRoaXMuYWxsU2F2ZUNvdW50UmVmLnZhbHVlID0gdGhpcy5ob21lUGFnZURhdGEuc2F2ZUNvdW50ICsgNVxuICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hbGxTYXZlQ291bnRSZWYudmFsdWUgPSB0aGlzLmhvbWVQYWdlRGF0YS5zYXZlQ291bnQgKyAxMFxuICAgICAgICAgICB9XG4gICAgICAgICAgIHRoaXMuc2F2ZVRpcHNUZXh0Vmlldy50ZXh0ID0gdGhpcy5zYXZlQ291bnRSZWYudmFsdWUgPiA1ID8gJ+S/neWtmOaIkOWKnycgOiAn5L+d5a2Y5aSx6LSlJ1xuICAgICAgICAgICB0aGlzLmFsbFNhdmVDb3VudFRleHRWaWV3LnRleHQgPSB0aGlzLmFsbFNhdmVDb3VudFJlZi52YWx1ZSArICfkuKonXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbml0VmlldygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zYXZlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNhdmVDb3VudFJlZi52YWx1ZSsrXG4gICAgICAgICAgICB0aGlzLmhvbWVQYWdlRGF0YS50aXRsZSA9ICdIb21lIFBhZ2UnXG4gICAgICAgICAgICB0aGlzLnNhdmVUaXBzVGV4dFZpZXcudGV4dCA9IHRoaXMuc2F2ZVRpcHNcbiAgICAgICAgICAgIEFsbEZ1bmN0aW9uLnNhdmVEYXRhYmFzZU51bWJlcignc2F2ZUNvdW50JywgdGhpcy5zYXZlQ291bnRSZWYudmFsdWUpXG4gICAgICAgICAgICBBbGxGdW5jdGlvbi5zdGFydFBhZ2UobmV3IEJvb2tJbmZvUGFnZSgpKVxuICAgICAgICB9KVxuICAgIH1cblxufVxuXFxgXFxgXFxgXG5cbi0gaG9tZVBhZ2VEYXRhLnRz5paH5Lu25Luj56CBXG5cXGBcXGBcXGAgdHlwZXNjcmlwdFxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSG9tZVBhZ2VEYXRhIHtcbiAgICBwdWJsaWMgdGl0bGU6IHN0cmluZyA9ICcnXG4gICAgcHVibGljIHNhdmVDb3VudDogbnVtYmVyID0gMFxuICAgIHB1YmxpYyB1c2VySW5mbzogQm9va0luZm8gPSBuZXcgQm9va0luZm8oKVxufVxuXFxgXFxgXFxgXG5gO1xuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bytefun-ai-mcp",
3
- "version": "1.13.97",
3
+ "version": "1.13.98",
4
4
  "description": "ByteFun AI MCP服务 - 打通产品设计、UI设计、代码开发的服务平台,支持设计稿转代码和跨平台原生代码开发",
5
5
  "main": "build/index.js",
6
6
  "type": "module",