openfeel 1.1.0 → 1.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.en.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/dist/cli/index.d.ts.map +1 -1
  4. package/dist/cli/index.js +2 -0
  5. package/dist/cli/index.js.map +1 -1
  6. package/dist/commands/init.d.ts +2 -1
  7. package/dist/commands/init.d.ts.map +1 -1
  8. package/dist/commands/init.js +7 -2
  9. package/dist/commands/init.js.map +1 -1
  10. package/dist/commands/migrate.d.ts.map +1 -1
  11. package/dist/commands/migrate.js +10 -1
  12. package/dist/commands/migrate.js.map +1 -1
  13. package/dist/commands/setup.d.ts +7 -0
  14. package/dist/commands/setup.d.ts.map +1 -0
  15. package/dist/commands/setup.js +31 -0
  16. package/dist/commands/setup.js.map +1 -0
  17. package/dist/commands/update.d.ts.map +1 -1
  18. package/dist/commands/update.js +1 -10
  19. package/dist/commands/update.js.map +1 -1
  20. package/dist/core/config.js +2 -2
  21. package/dist/core/global-paths.d.ts +3 -1
  22. package/dist/core/global-paths.d.ts.map +1 -1
  23. package/dist/core/global-paths.js +5 -1
  24. package/dist/core/global-paths.js.map +1 -1
  25. package/dist/core/i18n-data/en.d.ts +1 -0
  26. package/dist/core/i18n-data/en.d.ts.map +1 -1
  27. package/dist/core/i18n-data/en.js +17 -0
  28. package/dist/core/i18n-data/en.js.map +1 -1
  29. package/dist/core/i18n-data/zh-CN.d.ts +1 -0
  30. package/dist/core/i18n-data/zh-CN.d.ts.map +1 -1
  31. package/dist/core/i18n-data/zh-CN.js +18 -0
  32. package/dist/core/i18n-data/zh-CN.js.map +1 -1
  33. package/dist/core/i18n.js +4 -4
  34. package/dist/core/i18n.js.map +1 -1
  35. package/dist/core/init.d.ts +10 -15
  36. package/dist/core/init.d.ts.map +1 -1
  37. package/dist/core/init.js +57 -139
  38. package/dist/core/init.js.map +1 -1
  39. package/dist/core/migrate.d.ts +12 -0
  40. package/dist/core/migrate.d.ts.map +1 -1
  41. package/dist/core/migrate.js +36 -11
  42. package/dist/core/migrate.js.map +1 -1
  43. package/dist/core/opencode-config.d.ts +2 -2
  44. package/dist/core/opencode-config.d.ts.map +1 -1
  45. package/dist/core/opencode-config.js +16 -4
  46. package/dist/core/opencode-config.js.map +1 -1
  47. package/dist/core/setup.d.ts +10 -0
  48. package/dist/core/setup.d.ts.map +1 -0
  49. package/dist/core/setup.js +75 -0
  50. package/dist/core/setup.js.map +1 -0
  51. package/dist/core/template-loader.d.ts +4 -5
  52. package/dist/core/template-loader.d.ts.map +1 -1
  53. package/dist/core/template-loader.js +741 -62
  54. package/dist/core/template-loader.js.map +1 -1
  55. package/dist/core/templates.d.ts +2 -2
  56. package/dist/core/templates.d.ts.map +1 -1
  57. package/dist/core/templates.js +2 -2
  58. package/dist/core/templates.js.map +1 -1
  59. package/dist/core/update.d.ts +0 -6
  60. package/dist/core/update.d.ts.map +1 -1
  61. package/dist/core/update.js +92 -95
  62. package/dist/core/update.js.map +1 -1
  63. package/package.json +1 -1
@@ -153,6 +153,16 @@ Feel's primary reasoning model **may not support image/multimodal input**. When
153
153
 
154
154
  > If the primary model itself supports multimodal input, delegation is unnecessary. This rule triggers only when the primary model cannot process images.
155
155
 
156
+ ## Auto-Setup .openfeel/ for Blank Projects (Feel only)
157
+
158
+ When starting a session in a **blank project** (no \`.openfeel/\` directory at the project root), Feel should automatically set up the full workspace:
159
+
160
+ 1. Check whether the \`.openfeel/\` directory exists at the project root; if it exists, skip (not a blank project).
161
+ 2. If \`.openfeel/\` is absent, run \`openfeel init --workspace-only\` (a non-interactive lightweight subcommand) to create the \`.openfeel/\` directory structure + config.yaml + flow.json + .info.json + dev/kb skeleton.
162
+ 3. This rule is triggered by **Feel only**; non-Feel agents (openfeel-planner/schemer/executor, etc.) **must not trigger** it — they only run inside an already-set-up workspace and never set it up themselves.
163
+
164
+ > Note: \`--workspace-only\` does **not** create AGENTS.md / opencode.jsonc; the framework constraints are carried by the global \`~/.config/opencode/AGENTS.md\` (see the global AGENTS.md).
165
+
156
166
  ## Model Configuration
157
167
 
158
168
  ### Configure based on available models at init time
@@ -959,7 +969,7 @@ openfeel-planner is driven by a **reasoning model** (such as DeepSeek V4 Pro). I
959
969
  'openfeel-reviewer': `---
960
970
  description: openfeel-reviewer Agent, heterogenous reasoning model, responsible for cross-reviewing plans/schemes/code.
961
971
  mode: subagent
962
- model: zhipuai/glm-5.2
972
+ model: zhipuai/glm-5.3-flash
963
973
  reasoning_effort: medium
964
974
  color: "#D4A017"
965
975
  permission:
@@ -1470,6 +1480,16 @@ Feel 的主力推理模型**可能不支持图片/多模态输入**。当用户
1470
1480
 
1471
1481
  > 若当前主模型本身支持多模态则无需委派。此规则仅在主模型无法处理图片时触发。
1472
1482
 
1483
+ ## 空白项目自动搭建 .openfeel/(仅 Feel 触发)
1484
+
1485
+ 在**空白项目**(项目根无 \`.openfeel/\` 目录)启动会话时,Feel 应自动搭建完整工作区:
1486
+
1487
+ 1. 检测项目根是否存在 \`.openfeel/\` 目录;存在则跳过(非空白项目)。
1488
+ 2. 无 \`.openfeel/\` 时运行 \`openfeel init --workspace-only\`(非交互轻量子命令),创建 \`.openfeel/\` 目录结构 + config.yaml + flow.json + .info.json + dev/kb 骨架。
1489
+ 3. 本规则**仅 Feel 触发**;非 feel agent(openfeel-planner/schemer/executor 等)**不触发**——它们仅在已搭建的工作区内运行,不自行搭建。
1490
+
1491
+ > 注意:\`--workspace-only\` **不建** AGENTS.md / opencode.jsonc;框架约束由全局 \`~/.config/opencode/AGENTS.md\` 承载(见全局 AGENTS.md)。
1492
+
1473
1493
  ## 模型配置
1474
1494
 
1475
1495
  ### 初始化时按可用模型调配
@@ -2275,7 +2295,7 @@ openfeel-planner 由**推理模型**(如 DeepSeek V4 Pro)驱动。在 Feel
2275
2295
  'openfeel-reviewer': `---
2276
2296
  description: openfeel-reviewer 审查官 Agent,异种推理模型,负责交叉审查计划/方案/代码。
2277
2297
  mode: subagent
2278
- model: zhipuai/glm-5.2
2298
+ model: zhipuai/glm-5.3-flash
2279
2299
  reasoning_effort: medium
2280
2300
  color: "#D4A017"
2281
2301
  permission:
@@ -2641,19 +2661,13 @@ openfeel-vision 由**多模态模型**驱动,具备强大的图像理解和跨
2641
2661
  }
2642
2662
  };
2643
2663
  // AUTO-GENERATED-END: AGENT_TEMPLATES
2644
- // AUTO-GENERATED-BEGIN: CORE_INSTRUCTIONS_TEMPLATES
2645
- const CORE_INSTRUCTIONS_TEMPLATES = {
2646
- en: 'IyAub3BlbmZlZWwgV29ya3NwYWNlIE9wZXJhdGlvbnMgR3VpZGUKCj4gVGhlIHByb2plY3QncyBwZXJtYW5lbnQgYmVoYXZpb3JhbCBjb25zdHJhaW50cyBhbmQgY29kaW5nIGNvbnZlbnRpb25zIGNhbiBiZSBmb3VuZCBpbiB0aGUgcHJvamVjdCByb290IGBBR0VOVFMubWRgLiBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgc3BlY2lmaWMgb3BlcmF0aW9uYWwgcnVsZXMgZm9yIHRoZSBgLm9wZW5mZWVsL2Agd29ya3NwYWNlLgoKQXQgdGhlIHN0YXJ0IG9mIGVhY2ggc2Vzc2lvbiwgY2hlY2sgdGhlIC5vcGVuZmVlbCBkaXJlY3RvcnkgdW5kZXIgdGhlIHByb2plY3QgcGF0aCBhbmQgaXRzIGNvbnRlbnRzLiBUaGlzIGRpcmVjdG9yeSBpcyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgZW5zdXJpbmcgZGV2ZWxvcG1lbnQgY29uc2lzdGVuY3ksIGFuZCB5b3UgbXVzdCBtYWludGFpbiBpdHMgaW50ZWdyaXR5IGFuZCBhY2N1cmFjeS4KCkR1cmluZyBhIHNlc3Npb24sIHByb2FjdGl2ZWx5IHVzZSB0aGUgcGxhdGZvcm0ncyBidWlsdC1pbiB0b29scyAoc3VjaCBhcyBxdWVzdGlvbnMsIFRPRE8gbGlzdHMpOyBkbyBub3QgcmVseSBzb2xlbHkgb24gY29udmVyc2F0aW9uYWwgdGV4dCB0byBjb21wbGV0ZSBjb21wbGV4IHRhc2tzLgoKIyMgU2Vzc2lvbiBTdGFydHVwIFNlbGYtQ2hlY2sKCkF0IHRoZSBzdGFydCBvZiBlYWNoIHNlc3Npb24sIHRoZSBBZ2VudCBtdXN0IGNoZWNrIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXMgYW5kIGZpbGVzIG9uZSBieSBvbmUsIGNyZWF0aW5nIHRoZW0gYXV0b21hdGljYWxseSBpZiBtaXNzaW5nOgoKKipQdWJsaWMgZG9tYWluIGRpcmVjdG9yaWVzKiogKHVzZSBgbWtkaXIgLXBgIGlmIHRoZXkgZG8gbm90IGV4aXN0KToKLSBgLm9wZW5mZWVsL2Rldi9ub3RlL2AKLSBgLm9wZW5mZWVsL2xvZy9gCi0gYC5vcGVuZmVlbC9jb2RlX3Jldmlldy9gCi0gYC5vcGVuZmVlbC9idWdzL2AKLSBgLm9wZW5mZWVsL3BsYW4vYAotIGAub3BlbmZlZWwva2IvYAotIGAub3BlbmZlZWwvdG1wL2AKCioqUHVibGljIGRvbWFpbiBmaWxlcyoqIChjcmVhdGUgZW1wdHkgZmlsZXMgaWYgdGhleSBkbyBub3QgZXhpc3QpOgotIGAub3BlbmZlZWwvZGV2L2Rldl9jb3JlLm1kYAotIGAub3BlbmZlZWwvZGV2L2N1cnJlbnQubWRgCi0gYC5vcGVuZmVlbC9kZXYvZGVjaXNpb25zLm1kYAotIGAub3BlbmZlZWwva2IvaW5kZXgubWRgCgoqKlByaXZhdGUgZG9tYWluIGRpcmVjdG9yaWVzKiogKGJhc2VkIG9uIGB7dXNlcm5hbWV9YCBmcm9tIGAub3BlbmZlZWwvLmluZm8uanNvbmApOgotIGAub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS9sb2cvYAotIGAub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS9ub3RlL2AKLSBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vY29kZV9yZXZpZXcvYAotIGAub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS9idWdzL2AKLSBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vdG1wL2AKCioqUHJpdmF0ZSBkb21haW4gZmlsZXMqKjoKLSBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vZGV2X2xhc3QubWRgCgoqKkluY3JlbWVudGFsIHVwZGF0ZSByZXZpZXcqKjogQ2hlY2sgYH4vLm9wZW5mZWVsL3VwZGF0ZV9pbmZvcy5tZGA7IGlmIHRoZXJlIGFyZSB1bnJlcGFpcmVkIGVudHJpZXMgKGFwcGVuZGVkL2Fub21hbHkpLCAqKnJlbWluZCB0aGUgdXNlciB0byByZXN0YXJ0IHRoZSBzZXNzaW9uIG9yIGRlbGVnYXRlIHRvIEZlZWwqKjsgdGhpcyBBZ2VudCBtdXN0IG5vdCBtb2RpZnkgdGhhdCBmaWxlIG9uIGl0cyBvd24uCgojIyBEZXNpZ24gUHJpbmNpcGxlcwoKVGhlIC5vcGVuZmVlbCBkaXJlY3RvcnkgaXMgZGl2aWRlZCBpbnRvICoqUHVibGljIERvbWFpbioqIGFuZCAqKlByaXZhdGUgRG9tYWluKio6CgotIFB1YmxpYyBEb21haW46IGRpcmVjdGx5IHVuZGVyIGAub3BlbmZlZWwvYCwgc3RvcmVzIHByb2plY3QtbGV2ZWwgc2hhcmVkIGNvbnRlbnQgKGNvcmUgcnVsZXMsIHBsYW5zLCB0ZWFtIGxvZ3MsIGtub3dsZWRnZSBiYXNlLCBldGMuKSwgaW5jbHVkZWQgaW4gdmVyc2lvbiBjb250cm9sLgotIFByaXZhdGUgRG9tYWluOiB1bmRlciBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vYCwgc3RvcmVzIHBlcnNvbmFsIG9wZXJhdGlvbiBzdGF0dXMsIGxvZ3MsIG5vdGVzLCBjb2RlIHJldmlld3MsIEJ1ZyB0cmFja2luZywgZXRjLiwgYWRkZWQgdG8gYC5naXRpZ25vcmVgIGFuZCBub3QgaW5jbHVkZWQgaW4gdmVyc2lvbiBjb250cm9sLgoKQWxsIHVzZXJzIChpbmNsdWRpbmcgc2luZ2xlLXBlcnNvbiBwcm9qZWN0cykgZm9sbG93IHRoaXMgc3RydWN0dXJlLgoKIyMgQWdlbnQgVG9vbCBVc2FnZSBDb252ZW50aW9ucwoKQWxsIEFnZW50cyAoaW5jbHVkaW5nIEZlZWwsIG9wZW5mZWVsLXBsYW5uZXIsIG9wZW5mZWVsLXNjaGVtZXIsIG9wZW5mZWVsLWV4ZWN1dG9yLCBvcGVuZmVlbC1yZXZpZXdlciwgb3BlbmZlZWwtZmVlbC10ZXN0ZXIsIG9wZW5mZWVsLXZpc2lvbiwgb3BlbmZlZWwtYXJjaGl2ZXIpIHNob3VsZCBwcm9hY3RpdmVseSB1c2UgdGhlIHBsYXRmb3JtJ3MgYnVpbHQtaW4gdG9vbHMgZHVyaW5nIHNlc3Npb25zLiBEbyBub3QgcmVseSBzb2xlbHkgb24gY29udmVyc2F0aW9uYWwgdGV4dCB0byBjb21wbGV0ZSBjb21wbGV4IHRhc2tzLgoKIyMjIDEuIHRvZG93cml0ZSDigJQgVGFzayBMaXN0IE1hbmFnZW1lbnQKCioqVHJpZ2dlciBjb25kaXRpb25zKiogKHVzZSB3aGVuIGFueSBvZiB0aGUgZm9sbG93aW5nIGFwcGxpZXMpOgotIFRoZSBjdXJyZW50IHRhc2sgY29udGFpbnMgbW9yZSB0aGFuIDMgaW5kZXBlbmRlbnQgc3RlcHMKLSBUaGUgdXNlciBpc3N1ZXMgbXVsdGlwbGUgdGFza3MgYXQgb25jZSAobnVtYmVyZWQgb3IgY29tbWEtc2VwYXJhdGVkKQotIFRoZSB0YXNrIGludm9sdmVzIGNyb3NzLWZpbGUgbW9kaWZpY2F0aW9ucyBhbmQgbmVlZHMgcHJvZ3Jlc3MgdHJhY2tpbmcKCioqVXNhZ2UgcmVxdWlyZW1lbnRzKio6Ci0gQ3JlYXRlIGEgdG9kbyBsaXN0IGJlZm9yZSBzdGFydGluZyBleGVjdXRpb24sIG9uZSBlbnRyeSBwZXIgc3RlcAotIE9ubHkgb25lIGBpbl9wcm9ncmVzc2AgYXQgYSB0aW1lCi0gTWFyayBgY29tcGxldGVkYCBpbW1lZGlhdGVseSBhZnRlciBmaW5pc2hpbmcgKGRvIG5vdCB3YWl0IGZvciBiYXRjaCBwcm9jZXNzaW5nKQotIEFwcGVuZCBuZXdseSBkaXNjb3ZlcmVkIHN0ZXBzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKCioqRXhhbXBsZSoqOgpgYGAKVXNlcjogIkZpeCB0aHJlZSBidWdzIGluIGZsb3cuanNvbiwgdGhlbiBydW4gdGVzdHMiCuKGkiBDcmVhdGUgdG9kbzogW0ZpeEJ1ZzEsIEZpeEJ1ZzIsIEZpeEJ1ZzMsIFJ1blRlc3RzXQpgYGAKCiMjIyAyLiBxdWVzdGlvbiDigJQgQXNrIHRoZSBVc2VyCgoqKlRyaWdnZXIgY29uZGl0aW9ucyoqIChtdXN0IGFzayB3aGVuIGFueSBhcHBsaWVzOyBzcGVjdWxhdGl2ZSBhc3N1bXB0aW9ucyBhcmUgcHJvaGliaXRlZCk6Ci0gVGhlIHJlcXVpcmVtZW50IGlzIGFtYmlndW91cyBvciBoYXMgbXVsdGlwbGUgcmVhc29uYWJsZSBpbnRlcnByZXRhdGlvbnMKLSBUaGVyZSBhcmUgMiBvciBtb3JlIGVxdWFsbHkgcmVhc29uYWJsZSB0ZWNobmljYWwgYXBwcm9hY2hlcwotIFRoZSBvcGVyYXRpb24gbWF5IGNhdXNlIGlycmV2ZXJzaWJsZSBjb25zZXF1ZW5jZXMgKGRlbGV0aW5nIGZpbGVzLCBvdmVyd3JpdGluZyBjb25maWcsIGZvcmNlIHB1c2gsIGV0Yy4pCi0gSXQgaW52b2x2ZXMgYXJjaGl0ZWN0dXJlIGRlY2lzaW9ucyBvciBkZXNpZ24gZGlyZWN0aW9uIGNob2ljZXMKCioqVXNhZ2UgcmVxdWlyZW1lbnRzKio6Ci0gTWFyayB0aGUgcmVjb21tZW5kZWQgb3B0aW9uIHdpdGggIihSZWNvbW1lbmRlZCkiCi0gRWFjaCBvcHRpb24gbXVzdCBpbmNsdWRlIGEgb25lLXNlbnRlbmNlIGV4cGxhbmF0aW9uIG9mIGl0cyBjb25zZXF1ZW5jZXMKLSBTaW1wbGUgY29uZmlybWF0aW9uIHF1ZXN0aW9ucyBzaG91bGQgbm90IGV4Y2VlZCAzIG9wdGlvbnMKLSBVcmdlbnQgb3IgaGlnaC1yaXNrIG9wZXJhdGlvbnMgbXVzdCBpbmNsdWRlIGEgIkNhbmNlbCIgb3B0aW9uCgoqKlByb2hpYml0ZWQgYmVoYXZpb3JzKio6Ci0gTWFraW5nIHNwZWN1bGF0aXZlIGFzc3VtcHRpb25zIGFuZCBleGVjdXRpbmcgZGlyZWN0bHkgd2hlbiByZXF1aXJlbWVudHMgYXJlIGFtYmlndW91cwotIEltcGxlbWVudGluZyB3aXRob3V0IHVzZXIgc2VsZWN0aW9uIHdoZW4gbXVsdGlwbGUgb3B0aW9ucyBleGlzdAotIFN0YXJ0aW5nIHdpdGggIm1heWJlIiBvciAicGVyaGFwcyIgd2l0aG91dCBhc2tpbmcKCiMjIyAzLiB0YXNrIOKAlCBTdWItQWdlbnQgRGlzcGF0Y2gKCioqVHJpZ2dlciBjb25kaXRpb25zKio6Ci0gTmVlZCB0byBleHBsb3JlIG11bHRpcGxlIGNvZGUgYXJlYXMgaW4gcGFyYWxsZWwgKGxhdW5jaCAyfjMgZXhwbG9yZSBhZ2VudHMpCi0gQ29tcGxleCBtdWx0aS1zdGVwIHRhc2tzIG5lZWQgdG8gYmUgZGVsZWdhdGVkIHRvIGEgZ2VuZXJhbCBhZ2VudAotIENvbXBsZXggdGFza3MgbmVlZCB0byBiZSBkZWxlZ2F0ZWQgdG8gZG93bnN0cmVhbSBBZ2VudHMgKGRpc3BhdGNoZWQgYnkgRmVlbCwgdGhlIGNoaWVmIGNvbmR1Y3RvcikKCioqVXNhZ2UgcmVxdWlyZW1lbnRzKio6Ci0gRm9yIHBhcmFsbGVsIHRhc2tzLCBpc3N1ZSBtdWx0aXBsZSB0YXNrIGNhbGxzIGluIGEgc2luZ2xlIG1lc3NhZ2UKLSBFYWNoIHRhc2sgcHJvbXB0IG11c3QgaW5jbHVkZTogc3BlY2lmaWMgdGFzayBkZXNjcmlwdGlvbiArIGV4cGVjdGVkIGluZm9ybWF0aW9uIHRvIHJldHVybgotIENsZWFybHkgdGVsbCB0aGUgc3ViLWFnZW50IHdoZXRoZXIgaXQgaXMgcmVhZC1vbmx5IHJlc2VhcmNoIG9yIGNhbiB3cml0ZSBjb2RlCgojIyMgNC4gc2tpbGwg4oCUIFNraWxsIExvYWRpbmcKCioqVHJpZ2dlciBjb25kaXRpb25zKio6Ci0gTmVlZCB0byB1bmRlcnN0YW5kIGN1cnJlbnQgc3RhZ2Ugc3RhdHVzIOKGkiBgb3BlbmZlZWwtZ2V0LXN0YWdlLXN0YXR1c2AKLSBOZWVkIHRvIGNvbnN1bHQgdGhlIHByb2plY3Qga25vd2xlZGdlIGJhc2Ug4oaSIGBvcGVuZmVlbC1jaGVjay1rYmAKLSBOZWVkIHRvIGdldCB0aGUgQnVnIGxpc3Qg4oaSIGBvcGVuZmVlbC1nZXQtYnVnc2AKCioqVXNhZ2UgcmVxdWlyZW1lbnRzKio6Ci0gTG9hZCBgb3BlbmZlZWwtY2hlY2sta2JgIGF0IHNlc3Npb24gc3RhcnQgdG8gZ2V0IHByb2plY3QgYmFja2dyb3VuZAotIExvYWQgYG9wZW5mZWVsLWdldC1zdGFnZS1zdGF0dXNgIGJlZm9yZSBoYW5kbGluZyBzdGFnZSB0YXNrcyB0byBjb25maXJtIHByb2Nlc3Mgc3RhdHVzCi0gTXVzdCBub3Qgc2tpcCBza2lsbHMgYW5kIG9wZXJhdGUgZGlyZWN0bHkgZnJvbSBtZW1vcnkKCiMjIyA1LiBUb29sIFVzYWdlIFByaW9yaXR5Cgp8IFNjZW5hcmlvIHwgUHJlZmVycmVkIFRvb2wgfCBQcm9oaWJpdGVkIFByYWN0aWNlIHwKfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBNdWx0aS1zdGVwIHRhc2tzIHwgYHRvZG93cml0ZWAgfCBFeGVjdXRpbmcgc3RlcC1ieS1zdGVwIGZyb20gbWVtb3J5IHwKfCBBbWJpZ3VvdXMgcmVxdWlyZW1lbnRzIHwgYHF1ZXN0aW9uYCB8IE1ha2luZyBhc3N1bXB0aW9ucyBhbmQgYWN0aW5nIGRpcmVjdGx5IHwKfCBDb2RlIGV4cGxvcmF0aW9uIHwgYHRhc2soZXhwbG9yZSlgIHwgTWFudWFsIGdyZXAvcmVhZCBvbmUgYnkgb25lIHwKfCBHZXR0aW5nIHN0YXR1cyB8IGBza2lsbChvcGVuZmVlbC1nZXQtc3RhZ2Utc3RhdHVzKWAgfCBJbmZlcnJpbmcgZnJvbSBtZW1vcnkgfAp8IEJhdGNoIGZpbGUgb3BlcmF0aW9ucyB8IGB0YXNrKGdlbmVyYWwpYCB8IFByb2Nlc3Npbmcgc2VyaWFsbHkgb25lIGJ5IG9uZSB8CgojIyBVc2VyIElkZW50aXR5Cgo+IC5vcGVuZmVlbC8uaW5mby5qc29uCgpgYGBqc29uCnsgInVzZXIiOiAidXNlcm5hbWUiIH0KYGBgCgpBdCB0aGUgc3RhcnQgb2YgZWFjaCBzZXNzaW9uLCB0aGUgQWdlbnQgZmlyc3QgcmVhZHMgdGhpcyBmaWxlIHRvIGdldCB0aGUgY3VycmVudCB1c2VybmFtZS4gSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgYHVzZXJgIGlzIGVtcHR5LCBhdXRvbWF0aWNhbGx5IGV4ZWN1dGUgYGdpdCBjb25maWcgdXNlci5uYW1lYCB0byBnZXQgdGhlIEdpdCB1c2VybmFtZSBhbmQgd3JpdGUgaXQuIElmIHRoZXJlIGlzIG5vIEdpdCBjb25maWd1cmF0aW9uLCB1c2UgYSBkZWZhdWx0IHVzZXJuYW1lLiBUaGlzIGZpbGUgaXMgYWRkZWQgdG8gYC5naXRpZ25vcmVgIGFuZCBleGNsdWRlZCBmcm9tIHZlcnNpb24gY29udHJvbC4KCiMjIyBQYXRoIFNlbGYtQ2hlY2sKCkxhcmdlIG1vZGVscyBtYXkgaW5hZHZlcnRlbnRseSB0cnVuY2F0ZSBvciBtb2RpZnkgdGhlIHVzZXJuYW1lIHdoZW4gY29uc3RydWN0aW5nIGAub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS9gIHBhdGhzIChlLmcuLCBgQWxpY2VgIOKGkiBgQWxpY2ApLCBjYXVzaW5nIGZpbGUgcmVhZC93cml0ZSBmYWlsdXJlcy4gV2hlbiBhY2Nlc3NpbmcgYW55IGZpbGUgdW5kZXIgYC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L2AsIHRoZSBmb2xsb3dpbmcgc2VsZi1jaGVjayBydWxlcyBtdXN0IGJlIGZvbGxvd2VkOgoKMS4gKipJbW1lZGlhdGUgY2hlY2sgb24gYWNjZXNzIGZhaWx1cmUqKjogV2hlbiBgcmVhZGAgb3IgYGdsb2JgIHJldHVybnMgImZpbGUgbm90IGZvdW5kIiBvciAibm8gc3VjaCBmaWxlIiwgZG8gbm90IHJlcG9ydCBhbiBlcnJvciBkaXJlY3RseS4gRmlyc3QgZXhlY3V0ZSBgcmVhZCAub3BlbmZlZWwvLmluZm8uanNvbmAgdG8gcmUtYWNxdWlyZSB0aGUgY29ycmVjdCBgdXNlcm5hbWVgLgoyLiAqKkNvbXBhcmUgYW5kIGNvcnJlY3QqKjogQ29tcGFyZSB0aGUgY3VycmVudGx5IHVzZWQgYHVzZXJuYW1lYCB3aXRoIHRoZSB2YWx1ZSBpbiBgLm9wZW5mZWVsLy5pbmZvLmpzb25gIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIuIElmIGluY29uc2lzdGVudCwgcmVjb25zdHJ1Y3QgdGhlIGZ1bGwgcGF0aCB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlIGFuZCByZXRyeS4KMy4gKipFc2NhbGF0ZSBvbiBjb25zZWN1dGl2ZSBmYWlsdXJlcyoqOiBJZiB0aGUgcmV0cnkgc3RpbGwgZmFpbHMsIHJlcG9ydCB0byB0aGUgdXNlciB0aGF0ICJQYXRoIGB7ZmFpbGVkIHBhdGh9YCBkb2VzIG5vdCBleGlzdC4gQ29uZmlybWVkIHVzZXJuYW1lIGlzIGB7Y29ycmVjdCB1c2VybmFtZX1gIiwgYW5kIHdhaXQgZm9yIHVzZXIgY29uZmlybWF0aW9uIGJlZm9yZSBwcm9jZWVkaW5nLgoKVGhpcyBydWxlIGFwcGxpZXMgdG8gYWxsIEFnZW50cyAoRmVlbCAvIG9wZW5mZWVsLXBsYW5uZXIgLyBvcGVuZmVlbC1zY2hlbWVyIC8gb3BlbmZlZWwtZXhlY3V0b3IgLyBvcGVuZmVlbC1yZXZpZXdlciAvIG9wZW5mZWVsLWZlZWwtdGVzdGVyIC8gb3BlbmZlZWwtdmlzaW9uIC8gb3BlbmZlZWwtYXJjaGl2ZXIpLgoKLS0tCgojIyBQdWJsaWMgRG9tYWluCgojIyMgRGV2ZWxvcG1lbnQgRGlyZWN0b3J5Cgo+IC5vcGVuZmVlbC9kZXYKClN0b3JlcyBwcm9qZWN0LXNoYXJlZCBjb3JlIHJ1bGVzIGFuZCBwcm9ncmVzcyBzdGF0dXMuCgo+IC5vcGVuZmVlbC9kZXYvZGV2X2NvcmUubWQKClN0b3JlcyBsb25nLXRlcm0gdmFsaWQgcnVsZXMuIFByaW9yaXR5OiB1c2VyIGluc3RydWN0aW9ucyA+IHRoaXMgZG9jdW1lbnQgPiBzZXNzaW9uIHRlbXBvcmFyeSBoaW50cy4gRWFjaCBydWxlIGlzIHByZWZpeGVkIHdpdGggYFsrXWAgKGVuYWJsZWQpIC8gYFstXWAgKGRpc2FibGVkKS4gUnVsZXMgY2FuIG9ubHkgYmUgbWFya2VkIGFzIGRpc2FibGVkLCBub3QgZGVsZXRlZC4gV2hlbiBtb3JlIHRoYW4gMTAgcnVsZXMgYXJlIGRpc2FibGVkLCByZW1pbmQgdGhlIHVzZXIgdG8gY2xlYW4gdXAuCgo+IC5vcGVuZmVlbC9kZXYvY3VycmVudC5tZAoKUmVjb3JkcyB3b3JrIGN1cnJlbnRseSBpbiBwcm9ncmVzcy4gRm9sbG93cyB0aGUgYEB7dXNlcm5hbWV9IGRlc2NyaXB0aW9uIG9mIG9uZ29pbmcgd29ya2AgcGFyYWRpZ20gdG8gdHJhY2sgZWFjaCBtZW1iZXIncyBwcm9ncmVzcy4gVGhlIHRvcCBtYWludGFpbnMgb3ZlcmFsbCBwcm9ncmVzcyBzdGF0dXMuCgo+IC5vcGVuZmVlbC9kZXYvbm90ZS9kZXZfbm90ZS5tZAoKVGVhbS1zaGFyZWQgZGV2ZWxvcG1lbnQgbm90ZXMsIHNvdXJjZWQgZnJvbSBtZW1iZXIgcGVyc29uYWwgbm90ZXMgKHNlZSBQcml2YXRlIERvbWFpbiA+IFBlcnNvbmFsIE5vdGVzKS4gQnJpZWYgZGVzY3JpcHRpb25zIG9ubHk7IGRldGFpbHMgZ28gaW50byBzdWItZmlsZXMgd2l0aCBhbiBpbmRleC4KCiMjIyBMb2cgRGlyZWN0b3J5Cgo+IC5vcGVuZmVlbC9sb2cKClB1YmxpYyBsb2cgZGlyZWN0b3J5LCAqKm9ubHkgcmVjb3JkcyB0ZWFtLWxldmVsIGltcG9ydGFudCBldmVudHMqKiAocmVjb3JkcyB3aGVuIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldCk6Ci0gQ3JlYXRpb24gb3IgaW1wb3J0YW50IG1vZGlmaWNhdGlvbiBvZiBwdWJsaWMgZG9tYWluIGZpbGVzCi0gQ3Jvc3MtbWVtYmVyIGNvbGxhYm9yYXRpb24ga2V5IG9wZXJhdGlvbnMgKHB1YmxpYyBub3RlIHN1Ym1pc3Npb24sIHBsYW4gYWRqdXN0bWVudHMsIGV0Yy4pCi0gUGxhbiBtaWxlc3RvbmUgYWNoaWV2ZW1lbnRzIG9yIG1ham9yIGRldmlhdGlvbnMKLSBTZXZlcmUgaXNzdWVzIGluIHByaXZhdGUgY29kZSByZXZpZXdzIG9yIEJ1Z3MgKGhpZ2ggcHJpb3JpdHksIHJlcG9ydCBkZXRhaWxzIG9uIGZpcnN0IGRpc2NvdmVyeSkKLSBBbm9tYWxvdXMgZXZlbnRzIGFmZmVjdGluZyBtdWx0aXBsZSBwZW9wbGUKCkRhaWx5IG9wZXJhdGlvbnMgKHJvdXRpbmUgY29kZSBtb2RpZmljYXRpb25zLCBwZXJzb25hbCBwbGFuIGFkdmFuY2VtZW50LCBkZWJ1Z2dpbmcsIHBlcnNvbmFsIG5vdGVzKSBhcmUgcmVjb3JkZWQgaW4gdGhlIHByaXZhdGUgbG9nLgoKTG9ncyBhcmUgb3JnYW5pemVkIGJ5IHllYXIvbW9udGgvZGF5IGhpZXJhcmNoeS4gRGF5IGRpcmVjdG9yaWVzIGFyZSBvbmx5IGNyZWF0ZWQgd2hlbiBpbXBvcnRhbnQgZXZlbnRzIG9jY3VyIG9uIHRoYXQgZGF5LiBGaWxlIG5hbWluZzogYHl5eXktbW0tZGQte3VzZXJuYW1lfS1OTk4ubWRgLCBkYXkgZGlyZWN0b3JpZXMgY29udGFpbiBgZGF5X2luZGV4Lm1kYC4gVGhlIHJvb3QgbWFpbnRhaW5zIGBpbmRleC5tZGAgKGRhdGUgaW5kZXgpIGFuZCBgbG9nLm1kYCAobGFzdCAzMCBzdW1tYXJ5IGVudHJpZXMsIGZvcm1hdCBgW2ZpbGVuYW1lXSB7dXNlcm5hbWV9OiBkZXNjcmlwdGlvbmAsIHdpdGgganVtcCBsaW5rcykuCgojIyMgQ29kZSBSZXZpZXcgRGlyZWN0b3J5Cgo+IC5vcGVuZmVlbC9jb2RlX3JldmlldwoKUHVibGljIGNvZGUgcmV2aWV3IGRpcmVjdG9yeSwgc3RvcmluZyBjb3JlIGNvbmNsdXNpb24gc3VtbWFyaWVzIGFmdGVyIHByaXZhdGUgcmV2aWV3cyBhcmUgY29tcGxldGVkLiBJbmNsdWRlZCBpbiB2ZXJzaW9uIGNvbnRyb2wgZm9yIHRlYW0gcmVmZXJlbmNlLgoKT3JnYW5pemVkIGJ5IHBsYW4gc3RhZ2UsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByaXZhdGUgcmV2aWV3IGRpcmVjdG9yeS4gVGhlIHJvb3QgbWFpbnRhaW5zIGBpbmRleC5tZGAgKGdyb3VwZWQgYnkgc3RhZ2UsIHdpdGggc3RhdHVzIGNvdW50IHN0YXRpc3RpY3MgYXQgdGhlIHRvcCkuIEVhY2ggc3RhZ2UncyBpbnNpZ2h0cyBhbmQgc3VnZ2VzdGlvbnMgYXJlIHN1bW1hcml6ZWQgaW4gYHtzdGFnZX0ubWRgLiBUaGUgc3BlY2lmaWMgcmV2aWV3IHByb2Nlc3MgYW5kIGRldGFpbGVkIGNvbnRlbnQgZm9yIGVhY2ggc3VibWlzc2lvbiBwb2ludCBhcmUgc3RvcmVkIGluIHRoZSBwcml2YXRlIGBjb2RlX3Jldmlldy9SRVYte3N0YWdlfS5tZGAuCgojIyMgQnVnIFRyYWNraW5nIERpcmVjdG9yeQoKPiAub3BlbmZlZWwvYnVncwoKUHVibGljIEJ1ZyB0cmFja2luZyBkaXJlY3RvcnksIHN0b3JpbmcgY29yZSBjb25jbHVzaW9uIHN1bW1hcmllcyBhZnRlciBwcml2YXRlIEJ1Z3MgYXJlIGNsb3NlZC4gSW5jbHVkZWQgaW4gdmVyc2lvbiBjb250cm9sIGZvciB0ZWFtIHJlZmVyZW5jZS4KCk9yZ2FuaXplZCBieSBtb2R1bGUsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByaXZhdGUgQnVnIGRpcmVjdG9yeS4gVGhlIHJvb3QgbWFpbnRhaW5zIGBpbmRleC5tZGAgKGdyb3VwZWQgYnkgbW9kdWxlKS4gRWFjaCBtb2R1bGUncyBCdWcgcmVzb2x1dGlvbiBpbnNpZ2h0cyBhbmQgcm9vdCBjYXVzZSBhbmFseXNpcyBhcmUgYXJjaGl2ZWQgaW4gYHttb2R1bGV9Lm1kYC4gU3BlY2lmaWMgQnVnIHJlcG9ydHMsIHJlcHJvZHVjdGlvbiBzdGVwcywgYW5kIGFjY2VwdGFuY2UgZGV0YWlscyBhcmUgc3RvcmVkIGluIHRoZSBwcml2YXRlIGBidWdzL3ttb2R1bGV9L2AuCgojIyMgUGxhbiBEaXJlY3RvcnkKCj4gLm9wZW5mZWVsL3BsYW4KCioqQXV0b21hdGVkIHBsYW5uaW5nKio6IFdoZW4gdGhlIHVzZXIgcHJvcG9zZXMgYSB0YXNrIHdpdGggdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJpc3RpY3MsIHRoZSBBZ2VudCBzaG91bGQgcHJvYWN0aXZlbHkgY3JlYXRlIGFuIGVudHJ5IGluIGBwbGFuLm1kYCBvciB1cGRhdGUgYGN1cnJlbnQubWRgLCB3aXRob3V0IHdhaXRpbmcgZm9yIG1hbnVhbCB1c2VyIHRyaWdnZXI6Ci0gSW52b2x2ZXMgbXVsdGktc3RlcCBvcGVyYXRpb25zCi0gUmVxdWlyZXMgY3Jvc3Mtc2Vzc2lvbiBwcm9ncmVzcyB0cmFja2luZwotIE1heSBhZmZlY3QgbXVsdGlwbGUgbW9kdWxlcyBvciBmaWxlcwoKUGxhbnMgYXJlIGRpdmlkZWQgaW50byB0d28gbGF5ZXJzOgotICoqTGFyZ2UgcGxhbioqIChgcGxhbi5tZGApOiBPdmVyYWxsIGdvYWxzLCB0ZWNobmljYWwgYXJjaGl0ZWN0dXJlLCBjb3JlIG1pbGVzdG9uZXMuIENoYW5nZXMgcmVxdWlyZSB0ZWFtIGNvbW11bmljYXRpb24gYW5kIGNvbmZpcm1hdGlvbi4KLSAqKlNtYWxsIHBsYW5zKiogKGB7c3RhZ2V9L2Agc3ViZGlyZWN0b3JpZXMpOiBTcGVjaWZpYyB0YXNrIGJyZWFrZG93biBhbmQgaW1wbGVtZW50YXRpb24gc3RlcHMuIERhaWx5IG1vZGlmaWNhdGlvbnMgYW5kIHByb2dyZXNzIGhhcHBlbiBhdCB0aGlzIGxheWVyLgoKSWYgYSBwbGFuIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgaXQgYmFzZWQgb24gdXNlciBpbnN0cnVjdGlvbnMuIExhcmdlIHBsYW4gY2hhbmdlcyByZXF1aXJlIHVzZXIgY29uZmlybWF0aW9uOyBzbWFsbCBwbGFuIGFkanVzdG1lbnRzIGNhbiBiZSBkb25lIGF1dG9ub21vdXNseSBieSB0aGUgQWdlbnQgYnV0IG11c3QgYmUgcmVjb3JkZWQuCgpQbGFuIGluZGV4ZXMgYXJlIG9yZ2FuaXplZCBieSBtYWpvciB2ZXJzaW9uIHNlcmllczogYHBsYW4vaW5kZXgubWRgIGlzIHRoZSB0b3AtbGV2ZWwgaW5kZXgsIGFuZCBzZXJpZXMgaW5kZXhlcyBzdWNoIGFzIGBwbGFuL3Y0L2luZGV4Lm1kYCBhbmQgYHBsYW4vdjUvaW5kZXgubWRgIHN0b3JlIGNvcmUgc3VtbWFyaWVzIG9mIGVhY2ggcGxhbi4gYHBsYW5fbG9nLm1kYCByZWNvcmRzIHRoZSBsYXN0IDMwIGNoYW5nZSBzdW1tYXJpZXMsIGZvcm1hdCBge3VzZXJuYW1lfTogY2hhbmdlIGRlc2NyaXB0aW9uYCwgd2l0aCBqdW1wIGxpbmtzLgoKSWYgdW5wbGFubmVkIG9wZXJhdGlvbnMgb3IgZGV2aWF0aW9ucyBvY2N1ciwgZXhwbGFpbiB0byB0aGUgdXNlciBmaXJzdCBhbmQgc2VlayBjb25maXJtYXRpb24sIHdoaWxlIHJlY29yZGluZyBpbiB0aGUgbG9nLgoKIyMjIyBQaXBlbGluZSBBZHZhbmNlbWVudAoKRWFjaCBzdGFnZSdzIHN0YXRlIGlzIGpvaW50bHkgbWFuYWdlZCBieSBgZmxvdy5qc29uYCBhbmQgYHN0YXR1cy5tZGAuIFRoZSBGZWVsIEFnZW50IHJlYWRzIGZsb3cuanNvbiB0byBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgc3RhZ2UgYW5kIHBoYXNlLCBhbmQgYWR2YW5jZXMgdGhlIHBpcGVsaW5lIHRocm91Z2ggdGhlIGBvcGVuZmVlbCBmbG93YCBjb21tYW5kOgoKLSBgb3BlbmZlZWwgZmxvdyBzdGF0dXNgIOKAlCBWaWV3IGN1cnJlbnQgcGlwZWxpbmUgc3RhdHVzCi0gYG9wZW5mZWVsIGZsb3cgYWR2YW5jZWAg4oCUIEFkdmFuY2UgdG8gdGhlIG5leHQgcGhhc2UKLSBgb3BlbmZlZWwgZmxvdyByZXBhaXJgIOKAlCBSZXBhaXIgcGlwZWxpbmUgc3RhdGUKClBpcGVsaW5lIHBoYXNlIGVudW1lcmF0aW9uIChmbG93Lmpzb24gUGlwZWxpbmVQaGFzZSk6CnBsYW5fcGVuZGluZyDihpIgcGxhbl9yZXZpZXcg4oaSIHBsYW5fcGFzc2VkIOKGkiBzY2hlbWVfcGVuZGluZyDihpIgc2NoZW1lX3JldmlldyDihpIgc2NoZW1lX3Bhc3NlZCDihpIgZXhlY19ydW5uaW5nIOKGkiByZXZpZXdfcGVuZGluZyDihpIgcmV2aWV3X2ZhaWxlZCDihpIgcmV2aWV3X3Bhc3NlZCDihpIgdGVzdF9wZW5kaW5nIOKGkiB0ZXN0X2ZhaWxlZCDihpIgdGVzdF9wYXNzZWQg4oaSIGFyY2hpdmluZyDihpIgZG9uZQoKTWFudWFsIHByb2Nlc3MgaXMgdGhlIGRlZmF1bHQgbW9kZS4gRmVlbCBkaXNwYXRjaGVzIGRvd25zdHJlYW0gQWdlbnRzIChvcGVuZmVlbC1wbGFubmVyIC8gb3BlbmZlZWwtc2NoZW1lciAvIG9wZW5mZWVsLWV4ZWN1dG9yIC8gb3BlbmZlZWwtcmV2aWV3ZXIgLyBvcGVuZmVlbC1mZWVsLXRlc3RlciAvIG9wZW5mZWVsLXZpc2lvbiAvIG9wZW5mZWVsLWFyY2hpdmVyKSBiYXNlZCBvbiBmbG93Lmpzb24gc3RhdGUsIHdpdGhvdXQgcmVseWluZyBvbiBsZWdhY3kgYXV0b21hdGVkIHNjaGVkdWxpbmcuCgpXaGVuIHRoZSBzdGF0ZSBpcyBkb25lIG9yIHBhdXNlZCwgZG8gbm90IGNvbnRpbnVlIGF1dG9tYXRpYyBhZHZhbmNlbWVudC4gV2hlbiBlbmNvdW50ZXJpbmcgdW5wbGFubmVkIGNoYW5nZXMgb3IgY29uc2VjdXRpdmUgZmFpbHVyZXMsIHBhdXNlIGFuZCB3YWl0IGZvciB1c2VyIGRlY2lzaW9uLgoKIyMjIFRlbXBvcmFyeSBEaXJlY3RvcnkKCj4gLm9wZW5mZWVsL3RtcAoKU3RvcmVzIHByb2plY3QtbGV2ZWwgdGVtcG9yYXJ5IGZpbGVzIChzaGFyZWQgZGF0YSwgYnVpbGQgYXJ0aWZhY3RzLCBldGMuKS4gT25seSByZWFkcyBmaWxlcyBmcm9tIHRoaXMgZGlyZWN0b3J5IHdoZW4gc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgoKIyMjIEtub3dsZWRnZSBCYXNlCgo+IC5vcGVuZmVlbC9rYgoKUmVjb3JkcyAid2hhdCB0aGlzIHByb2plY3QgaXMgbGlrZSIgYW5kICJ3aGF0IHRvIGRvIHdoZW4gcHJvYmxlbXMgYXJpc2UiLCBzZXBhcmF0ZWQgZnJvbSB0aGUgY29uc3RyYWludCBzeXN0ZW0gKHdoaWNoIHJlY29yZHMgIndoYXQgdG8gZG8iKS4KCmBgYAoub3BlbmZlZWwva2IvCuKUnOKUgOKUgCBpbmRleC5tZCAgICAgICAgICAgIyBNYWluIGluZGV4OiBjYXRlZ29yeSBvdmVydmlldywgZmlsZSBzdW1tYXJpZXMsIHJlY2VudCB1cGRhdGVzCuKUnOKUgOKUgCBhcmNoaXRlY3R1cmUubWQgICAgIyBBcmNoaXRlY3R1cmUgZGVjaXNpb25zLCBkZXNpZ24gcmF0aW9uYWxlLCB0ZWNobm9sb2d5IHNlbGVjdGlvbgrilJzilIDilIAgcGF0dGVybnMubWQgICAgICAgICMgQ29kZSBwYXR0ZXJucywgcHJvamVjdCBjb252ZW50aW9ucywgYmVzdCBwcmFjdGljZXMK4pSc4pSA4pSAIHRyb3VibGVzaG9vdGluZy5tZCAjIENvbW1vbiBpc3N1ZXMsIGRlYnVnZ2luZyBwcm9jZWR1cmVzLCBrbm93biBwaXRmYWxscwrilJTilIDilIAgc2V0dXAubWQgICAgICAgICAgICMgRW52aXJvbm1lbnQgc2V0dXAsIGJ1aWxkIHByb2Nlc3MsIGRlcGVuZGVuY3kgbWFuYWdlbWVudApgYGAKClRoZXJlIGlzIG5vIGhhcmQgbGltaXQgb24gdGhlIG51bWJlciBvZiBjYXRlZ29yaWVzLiBgaW5kZXgubWRgIG1haW50YWlucyBjbGVhciBzdW1tYXJpZXMgZm9yIEFnZW50cyB0byBxdWlja2x5IGxvY2F0ZS4gVGhlIGBbK11gL2BbLV1gIG1hcmtpbmcgcnVsZXMgZm9yIGVhY2ggY2F0ZWdvcnkgZmlsZSBhcmUgY29uc2lzdGVudCB3aXRoIGBkZXZfY29yZS5tZGAuCgoqKldyaXRlIGNvbnZlbnRpb25zOioqCgp8IFR5cGUgfCBXcml0ZSBQYXRoIHwKfC0tLS0tLXwtLS0tLS0tLS0tLS18CnwgQXJjaGl0ZWN0dXJlIGRlY2lzaW9ucyAoZS5nLiwgT0F1dGgyICsgcmVmcmVzaCB0b2tlbiBhcHByb2FjaCkgfCBgYXJjaGl0ZWN0dXJlLm1kYCB8CnwgQ29kZSBwYXR0ZXJucyAoZS5nLiwgU3RhdGUgbWFjaGluZSB1c2luZyBTd2l0Y2ggKyBFbnVtKSB8IGBwYXR0ZXJucy5tZGAgfAp8IFRyb3VibGVzaG9vdGluZyBleHBlcmllbmNlIChlLmcuLCBTdGVwcyB0byBoYW5kbGUgYnVpbGQgZXJyb3JzKSB8IGB0cm91Ymxlc2hvb3RpbmcubWRgIHwKfCBFbnZpcm9ubWVudCBjb25maWd1cmF0aW9uIChlLmcuLCBTcGVjaWFsIGNvbXBpbGF0aW9uIGZsb3cpIHwgYHNldHVwLm1kYCB8CnwgUHJvamVjdCBhbmFseXNpcyByZXBvcnRzICh0ZXN0IHJldHJvc3BlY3RpdmVzLCBwcm9jZXNzIGFuYWx5c2lzLCBpc3N1ZSBzdW1tYXJpZXMpIHwgUHJvamVjdCByb290IGBkb2NzL3BoYXNlLXtOfS9gIHwKfCBVbmRlcnN0YW5kaW5nIG9mIHRoZSBzeXN0ZW0gKHNhbWUgZGlyZWN0b3J5IGFzIGFuYWx5c2lzIHJlcG9ydHMpIHwgUHJvamVjdCByb290IGBkb2NzL3BoYXNlLXtOfS9gIHwKClByb2hpYml0ZWQgZnJvbSB3cml0aW5nIHRvIHRoZSBrbm93bGVkZ2UgYmFzZTogYmVoYXZpb3JhbCBjb25zdHJhaW50cyAo4oaSIEFHRU5UUy5tZCksIG9wZXJhdGluZyBwcm9jZWR1cmVzICjihpIgSW5zdHJ1Y3Rpb25zKSwgd29ya3NwYWNlIG1haW50ZW5hbmNlIHJ1bGVzICjihpIgZGV2X2NvcmUubWQpLiBBZnRlciBlYWNoIHdyaXRlLCByZWNvcmQgaW4gdGhlIHB1YmxpYyBsb2cuCgojIyMjIEF1dG9tYXRpYyBXcml0aW5nIE1lY2hhbmlzbQoKKipUcmlnZ2VyIHRpbWluZyoqOiBBZnRlciBlYWNoIG5vbi10cml2aWFsIHRhc2sgaW4gYSBzZXNzaW9uIChleGNsdWRpbmcgcHVyZSBxdWVyeS9jb252ZXJzYXRpb24gb3BlcmF0aW9ucyksIHdoZW4gb3ZlcndyaXRpbmcgYGRldl9sYXN0Lm1kYCwgdGVtcG9yYXJpbHkgc3RvcmUgdGhpcyBzZXNzaW9uJ3MgKiprZXkgZXhwZXJpZW5jZSoqIGluIGl0LgoKKipFeHBlcmllbmNlIHN0YWdpbmcgZm9ybWF0KiogKHdyaXR0ZW4gdG8gYGRldl9sYXN0Lm1kYCk6Ci0gYC0gWyBdIFxge2NhdGVnb3J5fVxgOiB7ZXhwZXJpZW5jZSBkZXNjcmlwdGlvbn1gIOKAlCBwZW5kaW5nIHVzZXIgY29uZmlybWF0aW9uIHRvIGFyY2hpdmUgdG8ga2IvCgoqKkFyY2hpdmluZyBwcm9jZXNzKio6CjEuIEluIHRoZSBuZXh0IHNlc3Npb24sIHRoZSBBZ2VudCByZWFkcyBgZGV2X2xhc3QubWRgLiBJZiBpdCBmaW5kcyB1bmFyY2hpdmVkIGV4cGVyaWVuY2UgZW50cmllcywgaXQgcmVtaW5kcyB0aGUgdXNlciB0byBjb25maXJtLgoyLiBBZnRlciB1c2VyIGNvbmZpcm1hdGlvbiwgdGhlIEFnZW50IHdyaXRlcyB0aGUgZXhwZXJpZW5jZSB0byB0aGUgY29ycmVzcG9uZGluZyBrYi8gY2F0ZWdvcnkgZmlsZSAoYGFyY2hpdGVjdHVyZS5tZGAgLyBgcGF0dGVybnMubWRgIC8gYHRyb3VibGVzaG9vdGluZy5tZGAgLyBgc2V0dXAubWRgKS4KMy4gV3JpdGUgZm9ybWF0OiBFYWNoIGV4cGVyaWVuY2UgZW50cnkgc3RhcnRzIHdpdGggYCMjIFsrXSB7dGl0bGV9ICh7ZGF0ZX0pYCwgY29udGFpbmluZyBhIGRlc2NyaXB0aW9uIGFuZCBjb250ZXh0Lgo0LiBBZnRlciB3cml0aW5nLCB1cGRhdGUgdGhlICJSZWNlbnQgVXBkYXRlcyIgdGFibGUgaW4gYGtiL2luZGV4Lm1kYCBhbmQgcmVjb3JkIGluIHRoZSBwdWJsaWMgbG9nIGAub3BlbmZlZWwvbG9nL2AuCjUuIEZpbmFsbHksIG1hcmsgdGhlIGV4cGVyaWVuY2UgZW50cnkgaW4gYGRldl9sYXN0Lm1kYCBhcyBgW3hdYCAoYXJjaGl2ZWQpIG9yIGRlbGV0ZSBpdC4KCioqQXV0b21hdGljIHdyaXRlIGNyaXRlcmlhKiogKHdyaXRlIHdoZW4gYW55IGlzIG1ldCk6Ci0gU29sdmVkIGEgcHJldmlvdXNseSB1bmtub3duIGJ1aWxkL2Vudmlyb25tZW50IGlzc3VlCi0gRGlzY292ZXJlZCBhbmQgcmVjb3JkZWQgYSBjb2RlIHBhdHRlcm4vYmVzdCBwcmFjdGljZQotIE1hZGUgYW4gYXJjaGl0ZWN0dXJlIGRlY2lzaW9uIHRoYXQgYWZmZWN0cyBmdXR1cmUgZGV2ZWxvcG1lbnQKLSBFbmNvdW50ZXJlZCBhIG5vdGFibGUgcGl0ZmFsbC90cm91Ymxlc2hvb3RpbmcgZXhwZXJpZW5jZQoKVGhpcyBwcm9jZXNzIGVuc3VyZXMgdGhhdCB0aGUgQWdlbnQncyBleHBlcmllbmNlIGRvZXMgbm90IGRpc2FwcGVhciB3aXRoIHNlc3Npb24gbG9zcywgYW5kIHRoZSBrbm93bGVkZ2UgYmFzZSBncm93cyBjb250aW51b3VzbHkgd2l0aCB0aGUgcHJvamVjdC4KCi0tLQoKIyMgUHJpdmF0ZSBEb21haW4KCj4gLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vCgpUaGUgcHJpdmF0ZSBkb21haW4gZGlyZWN0b3J5LiBFYWNoIHRpbWUgdGhlIEFnZW50IG9idGFpbnMgdGhlIGN1cnJlbnQgdXNlcm5hbWUgZnJvbSBgLm9wZW5mZWVsLy5pbmZvLmpzb25gIHRvIGRldGVybWluZSB0aGUgY29ycmVzcG9uZGluZyBwYXRoLiBBZnRlciBjb2RlIG1vZGlmaWNhdGlvbnMsIHN5bmNocm9ub3VzbHkgdXBkYXRlIHJlbGF0ZWQgZmlsZXMgaW4gdGhlIHByaXZhdGUgZG9tYWluIChwbGFucywgbG9ncywgbm90ZXMsIGV0Yy4pIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggdGhlIGFjdHVhbCBzdGF0ZS4KCiMjIyBQZXJzb25hbCBPcGVyYXRpb24gU3RhdHVzCgo+IC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L2Rldl9sYXN0Lm1kCgpSZWNvcmRzIHRoZSBicmllZiBzdGF0ZSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IG9wZXJhdGlvbiwgb3ZlcndyaXR0ZW4gYXQgdGhlIGVuZCBvZiBlYWNoIGNvbnZlcnNhdGlvbi4gQXQgdGhlIG5leHQgc3RhcnR1cCwgcmVhZCBpdCBmaXJzdCB0byByZXN0b3JlIGNvbnRleHQuIElmIHRoZSBjb250ZW50IGNvbnRyYWRpY3RzIHRoZSBjdXJyZW50IGNvbnZlcnNhdGlvbiwgbWFyayBpdCBhcyAibWF5IGJlIG91dGRhdGVkIiBhbmQgY29uZmlybSB3aXRoIHRoZSB1c2VyLgoKKipUZW1wbGF0ZSoqOgpgYGBtYXJrZG93bgojIExhc3QgT3BlcmF0aW9uIFN0YXR1cwotIFRpbWU6IHl5eXktbW0tZGQgSEg6TU0KLSBTdGFnZToge2N1cnJlbnQgcGxhbiBzdGFnZX0KLSBPcGVyYXRpb246IHtvbmUtc2VudGVuY2UgZGVzY3JpcHRpb259Ci0gRmlsZXM6IHtrZXkgZmlsZXMgYWRkZWQgb3IgbW9kaWZpZWR9Ci0gQ3VycmVudCBTdGF0ZToge3N0YWdlIHByb2dyZXNzLCBlLmcuLCAzLzcgdGFza3MgY29tcGxldGVkfQoKIyMgVXNlciBQcmVmZXJlbmNlcwotIExhbmd1YWdlOiB7bGFuZ30KLSBBdXRvIEFkdmFuY2U6IHthdXRvX2FkdmFuY2V9Ci0gUmV2aWV3IE1vZGU6IHtyZXZpZXdfbW9kZX0KLSBDb21tdW5pY2F0aW9uOiB7Y29tbXVuaWNhdGlvbn0KLSBDb25maXJtIFRocmVzaG9sZDoge2NvbmZpcm1fdGhyZXNob2xkfQoKIyMgQ29udGV4dCBTbmFwc2hvdAotIEN1cnJlbnQgUGlwZWxpbmUgUGhhc2U6IHtwaGFzZX0KLSBBY3RpdmUgU3RhZ2VzOiB7YWN0aXZlX3N0YWdlc30KLSBMYXN0IE9wZXJhdGlvbiBTdW1tYXJ5OiB7b25lIHNlbnRlbmNlfQoKIyMgUGVuZGluZyBJdGVtcwotIFsgXSB7dW5maW5pc2hlZCB0YXNrc30KLSBbIF0ge2Jsb2NrZXJzfQoKIyMgS2V5IERlY2lzaW9ucwotIHtpbXBvcnRhbnQgYXJjaGl0ZWN0dXJlIG9yIGRlc2lnbiBkZWNpc2lvbnMgZnJvbSB0aGlzIHNlc3Npb259CgojIyBEZWNpc2lvbiBIaXN0b3J5CihOZXcgZGVjaXNpb25zIGZyb20gdGhpcyBzZXNzaW9uIGFyZSBhcHBlbmRlZCBoZXJlIGluIHRoZSBmb3JtYXQgYC0gW3hdIHtkYXRlfToge2RlY2lzaW9uIGRlc2NyaXB0aW9ufWApCgojIyBFeHBlcmllbmNlIFN0YWdpbmcKLSBbIF0gYGFyY2hpdGVjdHVyZWA6IHthcmNoaXRlY3R1cmUgZGVjaXNpb25zIHBlbmRpbmcgYXJjaGl2aW5nfQotIFsgXSBgcGF0dGVybnNgOiB7Y29kZSBwYXR0ZXJucyBwZW5kaW5nIGFyY2hpdmluZ30KLSBbIF0gYHRyb3VibGVzaG9vdGluZ2A6IHt0cm91Ymxlc2hvb3RpbmcgZXhwZXJpZW5jZSBwZW5kaW5nIGFyY2hpdmluZ30KLSBbIF0gYHNldHVwYDoge2Vudmlyb25tZW50IGNvbmZpZ3VyYXRpb24gcGVuZGluZyBhcmNoaXZpbmd9CmBgYAoKVGhpcyB0ZW1wbGF0ZSBlbnN1cmVzIHRoYXQgY3Jvc3Mtc2Vzc2lvbiBjb250ZXh0IGlzIHJlc3RvcmVkIHRvIGEgbGV2ZWwgc3VmZmljaWVudCB0byBleGVjdXRlIHRoZSBuZXh0IHRhc2ssIHdoaWxlIGFsc28gc3VwcG9ydGluZyB0aGUgZXhwZXJpZW5jZSBzdGFnaW5nIGZ1bmN0aW9uIHRoYXQgdW5kZXJwaW5zIHRoZSBhdXRvbWF0aWMga25vd2xlZGdlIGJhc2Ugd3JpdGluZyBtZWNoYW5pc20uICoqV3JpdGUgaW5zdHJ1Y3Rpb25zKio6IEZlZWwgZmlsbHMgdGhlICJVc2VyIFByZWZlcmVuY2VzIiBzZWN0aW9uIGZyb20gYHJlYWRQcm9maWxlKClgIGdsb2JhbCBwcmVmZXJlbmNlcyBhdCBzdGFydHVwOyBhcHBlbmRzIHRlY2huaWNhbC9hcmNoaXRlY3R1cmUgZGVjaXNpb25zIHRvICJEZWNpc2lvbiBIaXN0b3J5IiBkdXJpbmcgdGhlIHNlc3Npb247IHVwZGF0ZXMgdGhlICJDb250ZXh0IFNuYXBzaG90IiBzZWN0aW9uIGV2ZXJ5IHRpbWUgaXQgd3JpdGVzIGRldl9sYXN0Lm1kLgoKIyMjIFBlcnNvbmFsIE5vdGVzCgo+IC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L25vdGUvCgpUaGUgKipwcmltYXJ5IGxvY2F0aW9uKiogZm9yIGxlc3NvbnMgbGVhcm5lZC4gQnJpZWYgZGVzY3JpcHRpb25zOyBkZXRhaWxzIGdvIGludG8gc3ViLWZpbGVzIHdpdGggYW4gaW5kZXguIEluIGVhY2ggY29udmVyc2F0aW9uLCB0aGUgQWdlbnQgbWF5IHJhbmRvbWx5IHJlbWluZCB0aGUgdXNlciB3aGV0aGVyIHRvIHN1Ym1pdCB0byB0aGUgcHVibGljIG5vdGUgYGRldi9ub3RlL2Rldl9ub3RlLm1kYC4gQWZ0ZXIgc3VibWlzc2lvbiwgYW5ub3RhdGUgIlN1Ym1pdHRlZCB0byBwdWJsaWMgZG9tYWluIiB3aXRoIGEganVtcCBsaW5rLgoKIyMjIFBlcnNvbmFsIExvZ3MKCj4gLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vbG9nLwoKVGhlICoqcHJpbWFyeSBsb2NhdGlvbioqIGZvciBkYWlseSBvcGVyYXRpb25zLiBTdHJ1Y3R1cmUgY29uc2lzdGVudCB3aXRoIHRoZSBwdWJsaWMgbG9nIGRpcmVjdG9yeS4gRmlsZSBuYW1pbmcgZm9ybWF0OiBgeXl5eS1tbS1kZC1OTk4ubWRgIChubyB1c2VybmFtZSBuZWVkZWQsIGFzIGl0IGlzIGFscmVhZHkgdW5kZXIgdGhlIHVzZXIncyBkaXJlY3RvcnkpLgoKIyMjIENvZGUgUmV2aWV3Cgo+IC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L2NvZGVfcmV2aWV3LwoKTWFuYWdlcyBjb2RlIHJldmlldyBpc3N1ZXMgZHVyaW5nIHRoZSBkZXZlbG9wbWVudCBzdGFnZSAoYXJjaGl0ZWN0dXJlLCBjb252ZW50aW9ucywgbG9naWMpLCBvcmdhbml6ZWQgYnkgcGxhbiBzdGFnZS4gU2VwYXJhdGVkIGZyb20gQnVnIHRyYWNraW5nLgoKKipSb2xlIGRpdmlzaW9uOioqCi0gKipvcGVuZmVlbC1yZXZpZXdlcioqOiBSZXZpZXdzIGNvZGUgYWNjb3JkaW5nIHRvIHRoZSBwbGFuIHN0YWdlLCBzdWJtaXRzIGlzc3VlcywgdmVyaWZpZXMgZml4IHJlc3VsdHMuCi0gKipvcGVuZmVlbC1leGVjdXRvcioqOiBIYW5kbGVzIHJldmlldyBpc3N1ZXMsIG1vZGlmaWVzIGNvZGUgYW5kIHVwZGF0ZXMgc3RhdHVzLgoKUmV2aWV3IGlzc3VlcyBmb3IgZWFjaCBwbGFuIHN0YWdlIGFyZSBjb25zb2xpZGF0ZWQgaW4gYFJFVi17cGxhbl9zdGFnZX0ubWRgLiBFbnRyeSB0ZW1wbGF0ZToKCmBgYG1hcmtkb3duCiMjIFJFVi17Tk99OiB7QnJpZWYgVGl0bGV9Ci0gKipTdGF0dXMqKjogcGVuZGluZyB8IGZpeGluZyB8IHJlc29sdmVkIHwgY2xvc2VkCi0gKipQcmlvcml0eSoqOiBoaWdoIHwgbWVkaXVtIHwgbG93Ci0gKipBdXRob3IqKjogb3BlbmZlZWwtcmV2aWV3ZXIKLSAqKkNyZWF0ZWQqKjogeXl5eS1tbS1kZCBISDpNTQoKIyMjIElzc3VlIERlc2NyaXB0aW9uCi4uLgoKIyMjIFByb2Nlc3NpbmcgUmVjb3JkCnwgVGltZSB8IE9wZXJhdG9yIHwgRGVzY3JpcHRpb24gfCBDb21taXQgfAp8LS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLXwKCiMjIyBBY2NlcHRhbmNlIFJlY29yZAp8IFRpbWUgfCBvcGVuZmVlbC1yZXZpZXdlciB8IENvbmNsdXNpb24gfCBOb3RlcyB8CnwtLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18LS0tLS0tLXwKYGBgCgpUaGUgcm9vdCBtYWludGFpbnMgYGluZGV4Lm1kYCAoZ3JvdXBlZCBieSBzdGFnZSwgd2l0aCBzdGF0dXMgY291bnQgc3RhdGlzdGljcyBhdCB0aGUgdG9wKSBhbmQgYGxvZy5tZGAgKGxhc3QgMzAgcmV2aWV3IGNoYW5nZSBzdW1tYXJpZXMpLgoKV2hlbiBhIHJldmlldyBpc3N1ZSBpcyBtYXJrZWQgYXMgYHBlbmRpbmdgIHdpdGggYGhpZ2hgIHByaW9yaXR5LCB0aGUgaXNzdWUgZGV0YWlscyAodGl0bGUsIGRlc2NyaXB0aW9uLCBpbXBhY3Qgc2NvcGUpIG11c3QgYmUgd3JpdHRlbiB0byB0aGUgcHVibGljIGxvZyB0byBlbnN1cmUgdGltZWx5IHRlYW0gdmlzaWJpbGl0eS4gV2hlbiBhbiBpdGVtIGlzIGBjbG9zZWRgLCB0aGUgY29yZSBjb25jbHVzaW9uIGlzIHdyaXR0ZW4gdG8gYC5vcGVuZmVlbC9jb2RlX3Jldmlldy97c3RhZ2V9Lm1kYCwgYW5kIGJyaWVmbHkgcmVjb3JkZWQgaW4gdGhlIHB1YmxpYyBsb2cuCgojIyMgQnVnIFRyYWNraW5nCgo+IC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L2J1Z3MvCgpNYW5hZ2VzIGRlZmVjdHMgZm91bmQgZHVyaW5nIHRoZSB0ZXN0aW5nIHBoYXNlLCBvcmdhbml6ZWQgYnkgbW9kdWxlLiBTZXBhcmF0ZWQgZnJvbSBjb2RlIHJldmlldy4KCioqUm9sZSBkaXZpc2lvbjoqKgotICoqb3BlbmZlZWwtZmVlbC10ZXN0ZXIqKjogU3VibWl0cyBCdWdzIGFuZCBwZXJmb3JtcyBmaW5hbCBhY2NlcHRhbmNlLgotICoqb3BlbmZlZWwtZXhlY3V0b3IqKjogRml4ZXMgQnVncyBieSBtb2R1bGUuIE9uIHNlc3Npb24gc3RhcnQsIHVzZXMgYGxvYWQgc2tpbGwgb3BlbmZlZWwtZ2V0LWJ1Z3NgIHRvIGdldCBwZW5kaW5nIEJ1Z3MgZm9yIHRoZSByZXNwb25zaWJsZSBtb2R1bGUuCgpCdWdzIGFyZSBvcmdhbml6ZWQgaW4gbW9kdWxlIHN1YmRpcmVjdG9yaWVzLiBCdWcgbmFtaW5nIGluIGVhY2ggbW9kdWxlIGRpcmVjdG9yeTogYEJVRy17Tk5OfV97YnJpZWZfdGl0bGV9Lm1kYCAoTk5OIGluY3JlbWVudHMgd2l0aGluIHRoZSBtb2R1bGUpOgoKYGBgCi5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L2J1Z3MvCuKUnOKUgOKUgCBpbmRleC5tZCAgICAgICAgICAgICAgIyBHcm91cGVkIGJ5IG1vZHVsZSAoIyMjIHttb2R1bGVfbmFtZX0gQHtyZXNwb25zaWJsZV9BZ2VudF9uYW1lfSkK4pSc4pSA4pSAIGxvZy5tZCAgICAgICAgICAgICAgICAjIExhc3QgMzAgY2hhbmdlIHN1bW1hcmllcwrilJzilIDilIAge21vZHVsZV9hfS8K4pSCICAg4pSc4pSA4pSAIEJVRy0wMDFfdGl0bGUubWQK4pSCICAg4pSU4pSA4pSAIEJVRy0wMDJfdGl0bGUubWQK4pSU4pSA4pSAIHttb2R1bGVfYn0vCiAgICDilJTilIDilIAgQlVHLTAwMV90aXRsZS5tZApgYGAKCldoZW4gYSBCdWcgaXMgbWFya2VkIGFzIGBvcGVuYCB3aXRoIGBoaWdoYCBwcmlvcml0eSwgdGhlIGRlZmVjdCBkZXRhaWxzICh0aXRsZSwgZGVzY3JpcHRpb24sIHJlcHJvZHVjdGlvbiBzdGVwcywgYWZmZWN0ZWQgbW9kdWxlcykgbXVzdCBiZSB3cml0dGVuIHRvIHRoZSBwdWJsaWMgbG9nIHRvIGVuc3VyZSB0aW1lbHkgdGVhbSB2aXNpYmlsaXR5LiBXaGVuIGFuIGl0ZW0gaXMgYGNsb3NlZGAsIHRoZSBjb3JlIGNvbmNsdXNpb24gaXMgd3JpdHRlbiB0byBgLm9wZW5mZWVsL2J1Z3Mve21vZHVsZX0ubWRgLCBhbmQgYnJpZWZseSByZWNvcmRlZCBpbiB0aGUgcHVibGljIGxvZy4KCiMjIyBSZXZpZXcvQnVnIExpZmVjeWNsZQoKQm90aCBzaGFyZSB0aGUgc2FtZSBzdGF0ZSBmbG93IG1vZGVsIChvbmx5IHRoZSBzdGFydGluZyBzdGF0ZSBuYW1lIGRpZmZlcnMpOgoKYGBgCnBlbmRpbmcvb3BlbiAg4pSA4pSA4oaSICBmaXhpbmcgIOKUgOKUgOKGkiAgcmVzb2x2ZWQgIOKUgOKUgOKGkiAgY2xvc2VkCiAgICAgIOKGkSAgICAgICAgICAgICAgICAgICAgICAgICDilIIKICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIOmqjOaUtuS4jemAmui/hyDilIDilIDilIDilJgKYGBgCgp8IFN0YXRlIHwgQ29kZSBSZXZpZXcgfCBCdWcgVHJhY2tpbmcgfCBPcGVyYXRvciB8CnwtLS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CnwgU3RhcnQgfCBgcGVuZGluZ2AgfCBgb3BlbmAgfCBTdWJtaXR0ZWQgYnkgb3BlbmZlZWwtcmV2aWV3ZXIgLyBvcGVuZmVlbC1mZWVsLXRlc3RlciB8CnwgRml4aW5nIHwgYGZpeGluZ2AgfCBgZml4aW5nYCB8IEFzc2lnbmVkIHRvIG9wZW5mZWVsLWV4ZWN1dG9yIHwKfCBSZWFkeSBmb3IgYWNjZXB0YW5jZSB8IGByZXNvbHZlZGAgfCBgcmVzb2x2ZWRgIHwgQ29tcGxldGVkIGJ5IG9wZW5mZWVsLWV4ZWN1dG9yIHwKfCBDbG9zZWQgfCBgY2xvc2VkYCB8IGBjbG9zZWRgIHwgQWNjZXB0ZWQgYnkgb3BlbmZlZWwtcmV2aWV3ZXIgLyBvcGVuZmVlbC1mZWVsLXRlc3RlciB8CgojIyMgUGVyc29uYWwgVGVtcG9yYXJ5IERpcmVjdG9yeQoKPiAub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS90bXAvCgpTdG9yZXMgdGVtcG9yYXJ5IGZpbGVzIGZvciB0aGUgY3VycmVudCB1c2VyLCBmdWxseSBpc29sYXRlZCBmcm9tIG90aGVyIHVzZXJzLgo=',
2647
- 'zh-CN': 'IyAub3BlbmZlZWwg5bel5L2c5Yy65pON5L2c6KeE6IyDCgo+IOmhueebruawuOS5heaAp+ihjOS4uue6puadn+S4jue8lueggeinhOiMg+ingemhueebruagueebruW9lSBgQUdFTlRTLm1kYOOAguacrOaWh+S7tuaPj+i/sCBgLm9wZW5mZWVsL2Ag5bel5L2c5Yy655qE5YW35L2T5pON5L2c6KeE5YiZ44CCCgrlnKjmr4/mrKHlr7nor53lkK/liqjml7bvvIzmo4Dmn6Xpobnnm67ot6/lvoTkuIvnmoQgLm9wZW5mZWVsIOebruW9leWPiuWFtuWGheWuueOAguivpeebruW9leaYr+ehruS/neW8gOWPkeS4gOiHtOaAp+eahOWUr+S4gOaVsOaNrua6kO+8jOS9oOW/hemhu+e7tOaKpOWFtuWujOaVtOaAp+WSjOWHhuehruaAp+OAggoK5Zyo5Lya6K+d5Lit5bqU5Li75Yqo5L2/55So5bmz5Y+w5YaF572u5bel5YW377yI5aaC5o+Q6Zeu44CBVE9ETyDliJfooajvvInvvIzkuI3lvpfku4Xlh63lr7nor53mlofmnKzlrozmiJDlpI3mnYLku7vliqHjgIIKCiMjIOS8muivneWQr+WKqOiHquajgAoK5q+P5qyh5Lya6K+d5ZCv5Yqo5pe277yMQWdlbnQg5b+F6aG76YCQ6aG55qOA5p+l5Lul5LiL55uu5b2V5ZKM5paH5Lu277yM57y65aSx5YiZ6Ieq5Yqo5Yib5bu677yaCgoqKuWFrOWFseWfn+ebruW9lSoq77yI5aaC5LiN5a2Y5Zyo5YiZIGBta2RpciAtcGDvvInvvJoKLSBgLm9wZW5mZWVsL2Rldi9ub3RlL2AKLSBgLm9wZW5mZWVsL2xvZy9gCi0gYC5vcGVuZmVlbC9jb2RlX3Jldmlldy9gCi0gYC5vcGVuZmVlbC9idWdzL2AKLSBgLm9wZW5mZWVsL3BsYW4vYAotIGAub3BlbmZlZWwva2IvYAotIGAub3BlbmZlZWwvdG1wL2AKCioq5YWs5YWx5Z+f5paH5Lu2KirvvIjlpoLkuI3lrZjlnKjliJnliJvlu7rnqbrmlofku7bvvInvvJoKLSBgLm9wZW5mZWVsL2Rldi9kZXZfY29yZS5tZGAKLSBgLm9wZW5mZWVsL2Rldi9jdXJyZW50Lm1kYAotIGAub3BlbmZlZWwvZGV2L2RlY2lzaW9ucy5tZGAKLSBgLm9wZW5mZWVsL2tiL2luZGV4Lm1kYAoKKirnp4Hln5/nm67lvZUqKu+8iOWfuuS6jiBgLm9wZW5mZWVsLy5pbmZvLmpzb25gIOiOt+WPlueahCBge3VzZXJuYW1lfWDvvInvvJoKLSBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vbG9nL2AKLSBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vbm90ZS9gCi0gYC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L2NvZGVfcmV2aWV3L2AKLSBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vYnVncy9gCi0gYC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L3RtcC9gCgoqKuengeWfn+aWh+S7tioq77yaCi0gYC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L2Rldl9sYXN0Lm1kYAoKKirlop7ph4/mm7TmlrDlpI3moLgqKu+8muajgOafpSBgfi8ub3BlbmZlZWwvdXBkYXRlX2luZm9zLm1kYO+8jOiLpeWtmOWcqOacquS/ruWkjeadoeebru+8iOi/veWKoC/lvILluLjvvInvvIwqKuaPkOmGkueUqOaIt+mHjeWQr+S8muivneaIluWnlOaJmCBGZWVsIOWkhOeQhioq77yb5pysIEFnZW50IOS4jeiHquihjOS/ruaUueivpeaWh+S7tuOAggoKIyMg6K6+6K6h5Y6f5YiZCgoub3BlbmZlZWwg55uu5b2V5YiG5Li6KirlhazlhbHln58qKuS4jioq56eB5Z+fKirkuKTpg6jliIbvvJoKLSDlhazlhbHln5/vvJrnm7TmjqXkvY3kuo4gYC5vcGVuZmVlbC9gIOS4i++8jOWtmOaUvumhueebrue6p+WFseS6q+WGheWuue+8iOaguOW/g+inhOWImeOAgeiuoeWIkuOAgeWboumYn+aXpeW/l+OAgeefpeivhuW6k+etie+8ie+8jOe6s+WFpeeJiOacrOeuoeeQhuOAggotIOengeWfn++8muS9jeS6jiBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vYCDkuIvvvIzlrZjmlL7kuKrkurrmk43kvZznirbmgIHjgIHml6Xlv5fjgIHnrJTorrDjgIHku6PnoIHlrqHmn6XjgIFCdWcg6L+96Liq562J77yM5Yqg5YWlIGAuZ2l0aWdub3JlYCDkuI3nurPlhaXniYjmnKznrqHnkIbjgIIKCuaJgOacieeUqOaIt++8iOWQq+WNleS6uumhueebru+8ieWdh+mBteW+quatpOWIhuWMuue7k+aehOOAggoKIyMgQWdlbnQg5bel5YW35L2/55So6KeE6IyDCgrmiYDmnIkgQWdlbnTvvIjlkKsgRmVlbOOAgW9wZW5mZWVsLXBsYW5uZXLjgIFvcGVuZmVlbC1zY2hlbWVy44CBb3BlbmZlZWwtZXhlY3V0b3LjgIFvcGVuZmVlbC1yZXZpZXdlcuOAgW9wZW5mZWVsLWZlZWwtdGVzdGVy44CBb3BlbmZlZWwtdmlzaW9u44CBb3BlbmZlZWwtYXJjaGl2ZXLvvInlnKjkvJror53kuK3lupTkuLvliqjkvb/nlKjlubPlj7DlhoXnva7lt6XlhbfvvIzkuI3lvpfku4Xlh63lr7nor53mlofmnKzlrozmiJDlpI3mnYLku7vliqHjgIIKCiMjIyAxLiB0b2Rvd3JpdGUg4oCUIOS7u+WKoeWIl+ihqOeuoeeQhgoKKirop6blj5HmnaHku7YqKu+8iOa7oei2s+S7u+S4gOWNs+S9v+eUqO+8ie+8mgotIOW9k+WJjeS7u+WKoeWMheWQqyAzIOS4quS7peS4iueLrOeri+atpemqpAotIOeUqOaIt+WQjOaXtuS4i+i+vuWkmuS4quS7u+WKoe+8iOe8luWPt+aIlumAl+WPt+WIhumalO+8iQotIOS7u+WKoea2ieWPiui3qOaWh+S7tuS/ruaUue+8jOmcgOi/vei4qui/m+W6pgoKKirkvb/nlKjopoHmsYIqKu+8mgotIOW8gOWni+aJp+ihjOWJjeWIm+W7uiB0b2RvIOWIl+ihqO+8jOavj+S4quatpemqpOS4gOadoQotIOWQjOS4gOaXtumXtOWPquacieS4gOadoSBgaW5fcHJvZ3Jlc3NgCi0g5a6M5oiQ5ZCO56uL5Y2z5qCH6K6wIGBjb21wbGV0ZWRg77yI5LiN562J5om55aSE55CG77yJCi0g5Lit6YCU5Y+R546w55qE5paw5q2l6aqk6L+95Yqg5Yiw5YiX6KGo5pyr5bC+CgoqKuekuuS+iyoq77yaCmBgYArnlKjmiLfvvJoi5L+u5aSNIGZsb3cuanNvbiDnmoTkuInkuKogQnVn77yM54S25ZCO6LeR5rWL6K+VIgrihpIg5Yib5bu6IHRvZG86IFvkv67lpI1CdWcxLCDkv67lpI1CdWcyLCDkv67lpI1CdWczLCDov5DooYzmtYvor5VdCmBgYAoKIyMjIDIuIHF1ZXN0aW9uIOKAlCDlkJHnlKjmiLfmj5Dpl64KCioq6Kem5Y+R5p2h5Lu2KirvvIjmu6HotrPku7vkuIDlv4Xpobvmj5Dpl67vvIznpoHmraLoh6rooYzlgYforr7vvInvvJoKLSDpnIDmsYLlrZjlnKjmrafkuYnmiJblpJrnp43lkIjnkIbop6Por7sKLSDmioDmnK/mlrnmoYjmnIkgMiDkuKrku6XkuIrlkIznrYnlkIjnkIbnmoTpgInmi6kKLSDmk43kvZzlj6/og73kuqfnlJ/kuI3lj6/pgIblkI7mnpzvvIjliKDpmaTmlofku7bjgIHopobnm5bphY3nva7jgIFmb3JjZSBwdXNoIOetie+8iQotIOa2ieWPiuaetuaehOWGs+etluaIluiuvuiuoeaWueWQkemAieaLqQoKKirkvb/nlKjopoHmsYIqKu+8mgotIOmAiemhueS7pSAiKFJlY29tbWVuZGVkKSIg5qCH6K6w5o6o6I2Q5pa55qGICi0g5q+P5Liq6YCJ6aG56ZmE5bim5LiA5Y+l6K+d6K+05piO5YW25ZCO5p6cCi0g566A5Y2V56Gu6K6k5Z6L6Zeu6aKY5LiN6LaF6L+HIDMg5Liq6YCJ6aG5Ci0g57Sn5oCl5oiW6auY6aOO6Zmp5pON5L2c5b+F6aG75YyF5ZCrIuWPlua2iCLpgInpobkKCioq56aB5q2i6KGM5Li6KirvvJoKLSDpnIDmsYLmqKHns4rml7boh6rooYzlgYforr7lkI7nm7TmjqXmiafooYwKLSDlpJrnp43mlrnmoYjml7bmnKrnu4/nlKjmiLfpgInmi6nnm7TmjqXlrp7mlr0KLSDku6Ui5Y+v6IO9IiLkuZ/orrgi5byA5aS05L2G5LiN5o+Q6Zeu55u05o6l5Yqo5omLCgojIyMgMy4gdGFzayDigJQg5a2QIEFnZW50IOiwg+W6pgoKKirop6blj5HmnaHku7YqKu+8mgotIOmcgOW5tuihjOaOoue0ouWkmuS4quS7o+eggeWMuuWfn++8iOWQr+WKqCAyfjMg5LiqIGV4cGxvcmUgYWdlbnTvvIkKLSDlpI3mnYLlpJrmraXpqqTku7vliqHpnIDlp5TmiZjnu5kgZ2VuZXJhbCBhZ2VudAotIOWkjeadguS7u+WKoemcgOWnlOaJmOe7meS4i+a4uCBBZ2VudO+8iOmAmui/hyBGZWVsIOaAu+e7n+mihuiwg+W6pu+8iQoKKirkvb/nlKjopoHmsYIqKu+8mgotIOW5tuihjOS7u+WKoeeUqOS4gOadoea2iOaBr+WPkeWHuuWkmuS4qiB0YXNrIOiwg+eUqAotIOavj+S4qiB0YXNrIOeahCBwcm9tcHQg5b+F6aG75YyF5ZCr77ya5YW35L2T5Lu75Yqh5o+P6L+wICsg5pyf5pyb6L+U5Zue55qE5L+h5oGvCi0g5piO56Gu5ZGK55+l5a2QIEFnZW50IOaYr+WPquivu+eglOeptui/mOaYr+WPr+WGmeS7o+eggQoKIyMjIDQuIHNraWxsIOKAlCDmioDog73liqDovb0KCioq6Kem5Y+R5p2h5Lu2KirvvJoKLSDpnIDopoHkuobop6PlvZPliY3pmLbmrrXnirbmgIEg4oaSIGBvcGVuZmVlbC1nZXQtc3RhZ2Utc3RhdHVzYAotIOmcgOimgeafpemYhemhueebruefpeivhuW6kyDihpIgYG9wZW5mZWVsLWNoZWNrLWtiYAotIOmcgOimgeiOt+WPliBCdWcg5YiX6KGoIOKGkiBgb3BlbmZlZWwtZ2V0LWJ1Z3NgCgoqKuS9v+eUqOimgeaxgioq77yaCi0g5Lya6K+d5byA5aeL5pe25Yqg6L29IGBvcGVuZmVlbC1jaGVjay1rYmAg6I635Y+W6aG555uu6IOM5pmvCi0g5aSE55CG6Zi25q615Lu75Yqh5YmN5Yqg6L29IGBvcGVuZmVlbC1nZXQtc3RhZ2Utc3RhdHVzYCDnoa7orqTmtYHnqIvnirbmgIEKLSDkuI3lvpfot7Pov4fmioDog73nm7TmjqXlh63orrDlv4bmk43kvZwKCiMjIyA1LiDlt6Xlhbfkvb/nlKjkvJjlhYjnuqcKCnwg5Zy65pmvIHwg5LyY5YWI5bel5YW3IHwg56aB5q2i5YGa5rOVIHwKfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLXwKfCDlpJrmraXpqqTku7vliqEgfCBgdG9kb3dyaXRlYCB8IOWHreiusOW/humAkOadoeaJp+ihjCB8Cnwg6ZyA5rGC5LiN5piO56GuIHwgYHF1ZXN0aW9uYCB8IOiHquihjOWBh+iuvuWQjuWKqOaJiyB8Cnwg5o6i57Si5Luj56CBIHwgYHRhc2soZXhwbG9yZSlgIHwg5omL5Yqo6YCQ5LiqIGdyZXAvcmVhZCB8Cnwg6I635Y+W54q25oCBIHwgYHNraWxsKG9wZW5mZWVsLWdldC1zdGFnZS1zdGF0dXMpYCB8IOWHreiusOW/huaOqOaWrSB8Cnwg5om56YeP5paH5Lu25pON5L2cIHwgYHRhc2soZ2VuZXJhbClgIHwg5Liy6KGM6YCQ5Liq5aSE55CGIHwKCiMjIOeUqOaIt+i6q+S7vQoKPiAub3BlbmZlZWwvLmluZm8uanNvbgoKYGBganNvbgp7ICJ1c2VyIjogInVzZXJuYW1lIiB9CmBgYAoK5q+P5qyh5a+56K+d5ZCv5Yqo5pe277yMQWdlbnQg6aaW5YWI6K+75Y+W5q2k5paH5Lu26I635Y+W5b2T5YmN55So5oi35ZCN44CC6Iul5paH5Lu25LiN5a2Y5Zyo5oiWIGB1c2VyYCDkuLrnqbrvvIzliJnoh6rliqjmiafooYwgYGdpdCBjb25maWcgdXNlci5uYW1lYCDojrflj5YgR2l0IOeUqOaIt+WQjeW5tuWGmeWFpeOAguiLpeaXoCBHaXQg6YWN572u5YiZ6YCJ5Y+W6buY6K6k55So5oi35ZCN44CC5q2k5paH5Lu25Yqg5YWlIGAuZ2l0aWdub3JlYCDkuI3nurPlhaXniYjmnKznrqHnkIbjgIIKCiMjIyDot6/lvoToh6rmoKHpqowKCuWkp+aooeWei+WcqOaehOmAoCBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vYCDot6/lvoTml7blj6/og73mhI/lpJbmiKrmlq3miJbkv67mlLnnlKjmiLflkI3vvIjlpoIgYEFsaWNlYCDihpIgYEFsaWNg77yJ77yM5a+86Ie05paH5Lu26K+75YaZ5aSx6LSl44CC6K6/6Zeu5Lu75L2VIGAub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS9gIOS4i+eahOaWh+S7tuaXtu+8jOW/hemhu+mBteW+quS7peS4i+iHquagoemqjOinhOWIme+8mgoKMS4gKirorr/pl67lpLHotKXnq4vljbPmoKHpqowqKu+8mmByZWFkYOOAgWBnbG9iYCDmk43kvZzov5Tlm54gImZpbGUgbm90IGZvdW5kIiDmiJYgIm5vIHN1Y2ggZmlsZSIg5pe277yM5LiN6KaB55u05o6l5oql6ZSZ44CC5YWI5omn6KGMIGByZWFkIC5vcGVuZmVlbC8uaW5mby5qc29uYCDph43mlrDojrflj5bmraPnoa7nmoQgYHVzZXJuYW1lYOOAggoyLiAqKuavlOWvueW5tuS/ruatoyoq77ya5bCG5b2T5YmN5L2/55So55qEIGB1c2VybmFtZWAg5LiOIGAub3BlbmZlZWwvLmluZm8uanNvbmAg5Lit55qE5YC86YCQ5a2X56ym5q+U5a+544CC6Iul5LiN5LiA6Ie077yM55So5q2j56Gu5YC86YeN5bu65a6M5pW06Lev5b6E5ZCO6YeN6K+V44CCCjMuICoq6L+e57ut5aSx6LSl5LiK5oqlKirvvJrph43or5Xku43lpLHotKXml7bvvIzlkJHnlKjmiLfmiqXlkYrjgIzot6/lvoQgYHvlpLHotKXnmoTot6/lvoR9YCDkuI3lrZjlnKjvvIzlt7Lnoa7orqTnlKjmiLflkI3kuLogYHvmraPnoa7nlKjmiLflkI19YOOAje+8jOeUseeUqOaIt+ehruiupOWQjuWGjeaTjeS9nOOAggoK5q2k6KeE5YiZ6YCC55So5LqO5omA5pyJIEFnZW5077yIRmVlbCAvIG9wZW5mZWVsLXBsYW5uZXIgLyBvcGVuZmVlbC1zY2hlbWVyIC8gb3BlbmZlZWwtZXhlY3V0b3IgLyBvcGVuZmVlbC1yZXZpZXdlciAvIG9wZW5mZWVsLWZlZWwtdGVzdGVyIC8gb3BlbmZlZWwtdmlzaW9uIC8gb3BlbmZlZWwtYXJjaGl2ZXLvvInjgIIKCi0tLQoKIyMg5YWs5YWx5Z+fCgojIyMg5byA5Y+R55uu5b2VCgo+IC5vcGVuZmVlbC9kZXYKCuWtmOaUvumhueebruWFseS6q+eahOaguOW/g+inhOWImeS4jui/m+W6pueKtuaAgeOAggoKPiAub3BlbmZlZWwvZGV2L2Rldl9jb3JlLm1kCgrlrZjmlL7plb/mnJ/mnInmlYjop4TliJnjgILkvJjlhYjnuqfvvJrnlKjmiLfmjIfku6QgPiDmnKzmlofku7YgPiDkvJror53kuLTml7bmj5DnpLrjgILmr4/mnaHop4TliJnliY3luKYgYFsrXWDvvIjlkK/nlKjvvIkvIGBbLV1g77yI56aB55So77yJ77yM5Y+q6IO95qCH6K6w56aB55So5LiN6IO95Yig6Zmk77yM56aB55So6LaFIDEwIOadoeaXtuaPkOmGkueUqOaIt+a4heeQhuOAggoKPiAub3BlbmZlZWwvZGV2L2N1cnJlbnQubWQKCuiusOW9leW9k+WJjeato+WcqOi/m+ihjOeahOW3peS9nO+8jOaMiSBgQHt1c2VybmFtZX0g5o+P6L+w5q2j5Zyo6L+b6KGM55qE5bel5L2cYCDojIPlvI/nu7TmiqTlkITmiJDlkZjov5vluqbvvIzpobbpg6jnu7TmiqTmgLvov5vluqbnirbmgIHjgIIKCj4gLm9wZW5mZWVsL2Rldi9ub3RlL2Rldl9ub3RlLm1kCgrlm6LpmJ/lhbHkuqvlvIDlj5HnrJTorrDvvIzlhoXlrrnmnaXmupDkuo7miJDlkZjkuKrkurrnrJTorrDnmoTlvZLlhaXmj5DkuqTvvIjop4Hnp4Hln58gPiDkuKrkurrnrJTorrDvvInjgILnroDopoHmj4/ov7DvvIzor6bmg4XmlL7lhaXlrZDmlofku7blubblu7rnq4vntKLlvJXjgIIKCiMjIyDml6Xlv5fnm67lvZUKCj4gLm9wZW5mZWVsL2xvZwoK5YWs5YWx5pel5b+X55uu5b2V77yMKirku4XorrDlvZXlm6LpmJ/nuqfph43opoHkuovku7YqKu+8iOa7oei2s+S7u+S4gOWNs+iusOW9le+8ie+8mgotIOWFrOWFseWfn+aWh+S7tueahOWIm+W7uuaIlumHjeimgeS/ruaUuQotIOi3qOaIkOWRmOWNj+S9nOWFs+mUruaTjeS9nO+8iOWFrOWFseeslOiusOW9kuWFpeOAgeiuoeWIkuiwg+aVtOetie+8iQotIOiuoeWIkumHjOeoi+eikei+vuaIkOaIlumHjeWkp+WBj+W3rgotIOengeWfn+S7o+eggeWuoeafpeaIliBCdWcg55qE5Lil6YeN6Zeu6aKY77yIaGlnaCDkvJjlhYjnuqfvvIzpppbmrKHlj5HnjrDml7bkuIrmiqXor6bmg4XvvIkKLSDlvbHlk43lpJrkurrnmoTlvILluLjkuovku7YKCuaXpeW4uOaTjeS9nO+8iOW4uOinhOS7o+eggeS/ruaUueOAgeS4quS6uuiuoeWIkuaOqOi/m+OAgeiwg+ivleOAgeS4quS6uueslOiusO+8ieiusOW9leWcqOengeWfn+aXpeW/l+OAggoK5pel5b+X5oyJ5bm0L+aciC/ml6XliIblsYLlvZLmoaPvvIzml6Xnm67lvZXku4XlnKjlvZPlpKnmnInph43opoHkuovku7bml7bliJvlu7rjgILmlofku7blkb3lkI0gYHl5eXktbW0tZGQte3VzZXJuYW1lfS1OTk4ubWRg77yM5pel55uu5b2V5ZCrIGBkYXlfaW5kZXgubWRg44CC5qC555uu5b2V57u05oqkIGBpbmRleC5tZGDvvIjml6XmnJ/ntKLlvJXvvInlkowgYGxvZy5tZGDvvIjmnIDov5EgMzAg5p2h5pGY6KaB77yM5qC85byPIGBb5paH5Lu25ZCNXSB7dXNlcm5hbWV9OiDmj4/ov7Bg77yM5ZCr6Lez6L2s6ZO+5o6l77yJ44CCCgojIyMg5Luj56CB5a6h5p+l55uu5b2VCgo+IC5vcGVuZmVlbC9jb2RlX3JldmlldwoK5YWs5YWx5Luj56CB5a6h5p+l55uu5b2V77yM5a2Y5pS+56eB5Z+f5a6h5p+l5a6M5oiQ5ZCO55qE5qC45b+D57uT6K665pGY6KaB44CC57qz5YWl54mI5pys566h55CG77yM5L6b5Zui6Zif5p+l6ZiF44CCCgrmjInorqHliJLpmLbmrrXnu4Tnu4fvvIzkuI7np4Hln5/lrqHmn6Xnm67lvZXlr7nlupTjgILmoLnnm67lvZXnu7TmiqQgYGluZGV4Lm1kYO+8iOaMiemYtuauteWIhue7hOe0ouW8le+8jOmhtumDqOe7n+iuoeWQhOeKtuaAgeaVsOmHj++8ieOAguavj+S4qumYtuauteeahOW/g+W+l+W7uuiuruaAu+e7k+WcqCBge3N0YWdlfS5tZGAg5Lit77yM5YW35L2T55qE5a6h5p+l6L+H56iL5LiO5q+P5Liq5o+Q5Lqk54K555qE6K+m57uG5a6h5p+l5YaF5a655YiZ5L+d5a2Y5Zyo56eB5Z+fIGBjb2RlX3Jldmlldy9SRVYte3N0YWdlfS5tZGAg5Lit44CCCgojIyMgQnVnIOi/vei4quebruW9lQoKPiAub3BlbmZlZWwvYnVncwoK5YWs5YWxIEJ1ZyDov73ouKrnm67lvZXvvIzlrZjmlL7np4Hln58gQnVnIOWFs+mXreWQjueahOaguOW/g+e7k+iuuuaRmOimgeOAgue6s+WFpeeJiOacrOeuoeeQhu+8jOS+m+WboumYn+afpemYheOAggoK5oyJ5qih5Z2X57uE57uH77yM5LiO56eB5Z+fIEJ1ZyDnm67lvZXlr7nlupTjgILmoLnnm67lvZXnu7TmiqQgYGluZGV4Lm1kYO+8iOaMieaooeWdl+WIhue7hOe0ouW8le+8ieOAguavj+S4quaooeWdl+eahCBCdWcg6Kej5Yaz5b+D5b6X5ZKM5qC55Zug5YiG5p6Q5b2S5qGj5ZyoIGB7bW9kdWxlfS5tZGAg5Lit77yM5YW35L2T55qEIEJ1ZyDmiqXlkYrjgIHlpI3njrDmraXpqqTlkozpqozmlLbor6bmg4XliJnkv53lrZjlnKjnp4Hln58gYGJ1Z3Mve21vZHVsZX0vYCDkuK3jgIIKCiMjIyDorqHliJLnm67lvZUKCj4gLm9wZW5mZWVsL3BsYW4KCioq6Ieq5Yqo6K6h5YiS5YyWKirvvJrlvZPnlKjmiLfmj5Dlh7rljIXlkKvku6XkuIvnibnlvoHnmoTku7vliqHml7bvvIxBZ2VudCDlupTkuLvliqjlnKggYHBsYW4ubWRgIOS4reWIm+W7uuWvueW6lOadoeebruaIluabtOaWsCBgY3VycmVudC5tZGDvvIzml6DpnIDnrYnlvoXnlKjmiLfmiYvliqjop6blj5HvvJoKLSDmtonlj4rlpJrmraXpqqTmk43kvZwKLSDpnIDopoHot6jkvJror53ot5/ouKrov5vluqYKLSDlj6/og73lvbHlk43lpJrkuKrmqKHlnZfmiJbmlofku7YKCuiuoeWIkuWIhuS4pOWxgu+8mgotICoq5aSn6K6h5YiSKirvvIhgcGxhbi5tZGDvvInvvJrmlbTkvZPnm67moIfjgIHmioDmnK/mnrbmnoTjgIHmoLjlv4Pph4znqIvnopHjgILmm7TmlLnpobvnu4/lm6LpmJ/msp/pgJrnoa7orqTjgIIKLSAqKuWwj+iuoeWIkioq77yIYHtzdGFnZX0vYCDlrZDnm67lvZXvvInvvJrlhbfkvZPku7vliqHliIbop6PkuI7lrp7mlr3mraXpqqTjgILml6XluLjkv67mlLnlkozmjqjov5vlnKjmraTlsYLov5vooYzjgIIKCuiLpeiuoeWIkuS4jeWtmOWcqOWImeagueaNrueUqOaIt+aMh+S7pOWIm+W7uuOAguWkp+iuoeWIkuabtOaUuemhu+eUqOaIt+ehruiupO+8jOWwj+iuoeWIkuiwg+aVtOWPr+eUsSBBZ2VudCDoh6rkuLvlrozmiJDkvYbpobvorrDlvZXjgIIKCuiuoeWIkue0ouW8leaMieWkp+eJiOacrOezu+WIl+e7hOe7h++8mmBwbGFuL2luZGV4Lm1kYCDkuLrpobblsYLntKLlvJXvvIxgcGxhbi92NC9pbmRleC5tZGDjgIFgcGxhbi92NS9pbmRleC5tZGAg562J57O75YiX57Si5byV5a2Y5pS+5ZCE5pyf6K6h5YiS5qC45b+D5pGY6KaB44CCYHBsYW5fbG9nLm1kYCDorrDlvZXmnIDov5EgMzAg5p2h5Y+Y5pu05pGY6KaB77yM5qC85byPIGB7dXNlcm5hbWV9OiDlj5jmm7Tmj4/ov7Bg77yM5ZCr6Lez6L2s6ZO+5o6l44CCCgrlj5HnlJ/orqHliJLlpJbmk43kvZzmiJblgY/lt67ml7bvvIzlv4XpobvlhYjlkJHnlKjmiLfor7TmmI7lubblr7vmsYLnoa7orqTvvIzlkIzml7blnKjml6Xlv5fkuK3orrDlvZXjgIIKCiMjIyMg5rWB5rC057q/5o6o6L+bCgrlkITpmLbmrrXnirbmgIHnlLEgYGZsb3cuanNvbmAg5ZKMIGBzdGF0dXMubWRgIOiBlOWQiOeuoeeQhuOAgkZlZWwgQWdlbnQg6K+75Y+WIGZsb3cuanNvbiDliKTmlq3lvZPliY3pmLbmrrXlkowgcGhhc2XvvIzpgJrov4cgYG9wZW5mZWVsIGZsb3dgIOWRveS7pOaOqOi/m+a1geawtOe6v++8mgoKLSBgb3BlbmZlZWwgZmxvdyBzdGF0dXNgIOKAlCDmn6XnnIvlvZPliY3mtYHmsLTnur/nirbmgIEKLSBgb3BlbmZlZWwgZmxvdyBhZHZhbmNlYCDigJQg5o6o6L+b5Yiw5LiL5LiA6Zi25q61Ci0gYG9wZW5mZWVsIGZsb3cgcmVwYWlyYCDigJQg5L+u5aSN5rWB5rC057q/54q25oCBCgrmtYHmsLTnur8gcGhhc2Ug5p6a5Li+77yIZmxvdy5qc29uIFBpcGVsaW5lUGhhc2XvvInvvJoKcGxhbl9wZW5kaW5nIOKGkiBwbGFuX3JldmlldyDihpIgcGxhbl9wYXNzZWQg4oaSIHNjaGVtZV9wZW5kaW5nIOKGkiBzY2hlbWVfcmV2aWV3IOKGkiBzY2hlbWVfcGFzc2VkIOKGkiBleGVjX3J1bm5pbmcg4oaSIHJldmlld19wZW5kaW5nIOKGkiByZXZpZXdfZmFpbGVkIOKGkiByZXZpZXdfcGFzc2VkIOKGkiB0ZXN0X3BlbmRpbmcg4oaSIHRlc3RfZmFpbGVkIOKGkiB0ZXN0X3Bhc3NlZCDihpIgYXJjaGl2aW5nIOKGkiBkb25lCgrkurrlt6XmtYHnqIvkuLrpu5jorqTmqKHlvI/jgIJGZWVsIOagueaNriBmbG93Lmpzb24g54q25oCB6LCD5bqm5LiL5ri4IEFnZW5077yIb3BlbmZlZWwtcGxhbm5lciAvIG9wZW5mZWVsLXNjaGVtZXIgLyBvcGVuZmVlbC1leGVjdXRvciAvIG9wZW5mZWVsLXJldmlld2VyIC8gb3BlbmZlZWwtZmVlbC10ZXN0ZXIgLyBvcGVuZmVlbC12aXNpb24gLyBvcGVuZmVlbC1hcmNoaXZlcu+8ie+8jOS4jeS+nei1luaXp+W8j+iHquWKqOWMluiwg+W6puOAggoK54q25oCB5Li6IGRvbmUg5oiWIHBhdXNlZCDml7bvvIzkuI3lvpfnu6fnu63oh6rliqjmjqjov5vjgILpgYfliLDorqHliJLlpJblj5jmm7TmiJbov57nu63lpLHotKXml7bvvIzlv4XpobvmmoLlgZzlubbnrYnlvoXnlKjmiLflhrPnrZbjgIIKCiMjIyDkuLTml7bnm67lvZUKCj4gLm9wZW5mZWVsL3RtcAoK5a2Y5pS+6aG555uu57qn5Li05pe25paH5Lu277yI5YWx5Lqr5pWw5o2u44CB5p6E5bu65Lqn54mp562J77yJ44CC5LuF5Zyo55So5oi35oyH5a6a5pe26K+75Y+W5YW25Lit5paH5Lu244CCCgojIyMg55+l6K+G5bqTCgo+IC5vcGVuZmVlbC9rYgoK6K6w5b2VIui/meS4qumhueebruaYr+S7gOS5iOagt+eahCLlkowi6YGH5Yiw6Zeu6aKY5oCO5LmI5YqeIu+8jOS4jue6puadn+S9k+ezu++8iOiusOW9lSLlupTor6XmgI7kuYjlgZoi77yJ5YiG56a744CCCgpgYGAKLm9wZW5mZWVsL2tiLwrilJzilIDilIAgaW5kZXgubWQgICAgICAgICAgICMg5oC757Si5byV77ya5YiG57G75qaC6KeI44CB5ZCE5paH5Lu25pGY6KaB44CB5pyA6L+R5pu05pawCuKUnOKUgOKUgCBhcmNoaXRlY3R1cmUubWQgICAgIyDmnrbmnoTlhrPnrZbjgIHorr7orqHnkIbnlLHjgIHmioDmnK/pgInlnosK4pSc4pSA4pSAIHBhdHRlcm5zLm1kICAgICAgICAjIOS7o+eggeaooeW8j+OAgemhueebrue6puWumuOAgeacgOS9s+Wunui3tQrilJzilIDilIAgdHJvdWJsZXNob290aW5nLm1kICMg5bi46KeB6Zeu6aKY44CB6LCD6K+V5rWB56iL44CB5bey55+l5Z2R5L2NCuKUlOKUgOKUgCBzZXR1cC5tZCAgICAgICAgICAgIyDnjq/looPmkK3lu7rjgIHmnoTlu7rmtYHnqIvjgIHkvp3otZbnrqHnkIYKYGBgCgrliIbnsbvmlbDph4/kuI3lgZrnoazmgKfpmZDliLbjgIJgaW5kZXgubWRgIOe7tOaKpOa4heaZsOaRmOimgeS+myBBZ2VudCDlv6vpgJ/lrprkvY3jgILmr4/kuKrliIbnsbvmlofku7bnmoQgYFsrXWAvYFstXWAg5qCH6K6w6KeE5YiZ5LiOIGBkZXZfY29yZS5tZGAg5LiA6Ie044CCCgoqKuWGmeWFpeinhOiMg++8mioqCgp8IOexu+WeiyB8IOWGmeWFpei3r+W+hCB8CnwtLS0tLS18LS0tLS0tLS0tLXwKfCDmnrbmnoTlhrPnrZbvvIjlpoIgT0F1dGgyICsgcmVmcmVzaCB0b2tlbiDmlrnmoYjvvIkgfCBgYXJjaGl0ZWN0dXJlLm1kYCB8Cnwg5Luj56CB5qih5byP77yI5aaC54q25oCB5py657uf5LiA55SoIFN3aXRjaCArIEVudW3vvIkgfCBgcGF0dGVybnMubWRgIHwKfCDmjpLmn6Xnu4/pqozvvIjlpoLmnoTlu7rmiqXplJnml7bnmoTlpITnkIbmraXpqqTvvIkgfCBgdHJvdWJsZXNob290aW5nLm1kYCB8Cnwg546v5aKD6YWN572u77yI5aaC54m55q6K57yW6K+R5rWB56iL77yJIHwgYHNldHVwLm1kYCB8Cnwg6aG555uu5YiG5p6Q5oql5ZGK77yI5rWL6K+V5aSN55uY44CB5rWB56iL5YiG5p6Q44CB6Zeu6aKY5oC757uT77yJIHwg6aG555uu5qC555uu5b2V5LiL55qEIGBkb2NzL3BoYXNlLXtOfS9gIHwKfCDlr7nkvZPns7vnmoTnkIbop6PvvIjkuI7pobnnm67liIbmnpDmiqXlkYrlkIznm67lvZXvvIkgfCDpobnnm67moLnnm67lvZXkuIvnmoQgYGRvY3MvcGhhc2Ute059L2AgfAoK56aB5q2i5YaZ5YWl55+l6K+G5bqT77ya6KGM5Li657qm5p2f77yI4oaSIEFHRU5UUy5tZO+8ieOAgeaTjeS9nOa1geeoi++8iOKGkiBJbnN0cnVjdGlvbnPvvInjgIHlt6XkvZzljLrnu7TmiqTop4TliJnvvIjihpIgZGV2X2NvcmUubWTvvInjgILmr4/mrKHlhpnlhaXlkI7lnKjlhazlhbHml6Xlv5fkuK3orrDlvZXjgIIKCiMjIyMg6Ieq5Yqo5YaZ5YWl5py65Yi2CgoqKuinpuWPkeaXtuacuioq77ya5q+P5qyh5Lya6K+d5Lit77yMQWdlbnQg5a6M5oiQ6Z2e5bmz5Yeh5Lu75Yqh5ZCO77yI5o6S6Zmk57qv5p+l6K+iL+Wvueivneexu+aTjeS9nO+8ie+8jOW6lOWcqOimhuebluWGmeWFpSBgZGV2X2xhc3QubWRgIOaXtuWwhuacrOS8muivneeahCoq5YWz6ZSu57uP6aqMKirmmoLlrZjlhbbkuK3jgIIKCioq57uP6aqM5pqC5a2Y5qC85byPKirvvIjlhpnlhaUgYGRldl9sYXN0Lm1kYO+8ie+8mgotIGAtIFsgXSBcYHvliIbnsbt9XGDvvJp757uP6aqM5o+P6L+wfWAg4oCUIOW+heeUqOaIt+ehruiupOW9kuWFpSBrYi8KCioq5b2S5qGj5rWB56iLKirvvJoKMS4gQWdlbnQg5Zyo5LiL5LiA5qyh5Lya6K+d5ZCv5Yqo5pe26K+75Y+WIGBkZXZfbGFzdC5tZGDvvIzoi6Xlj5HnjrDmnInmnKrlvZLmoaPnmoTnu4/pqozmnaHnm67vvIzmj5DphpLnlKjmiLfnoa7orqTjgIIKMi4g55So5oi356Gu6K6k5ZCO77yMQWdlbnQg5bCG57uP6aqM5YaZ5YWl5a+55bqUIGtiLyDliIbnsbvmlofku7bvvIhgYXJjaGl0ZWN0dXJlLm1kYCAvIGBwYXR0ZXJucy5tZGAgLyBgdHJvdWJsZXNob290aW5nLm1kYCAvIGBzZXR1cC5tZGDvvInjgIIKMy4g5YaZ5YWl5qC85byP77ya5q+P5Liq57uP6aqM5p2h55uu5LulIGAjIyBbK10ge+agh+mimH0gKHvml6XmnJ99KWAg5byA5aS077yM5ZCr5o+P6L+w5ZKM5LiK5LiL5paH44CCCjQuIOWGmeWFpeWQjuabtOaWsCBga2IvaW5kZXgubWRgIOeahOOAjOacgOi/keabtOaWsOOAjeihqOagvO+8jOW5tuWcqOWFrOWFseaXpeW/lyBgLm9wZW5mZWVsL2xvZy9gIOS4reiusOW9leOAggo1LiDmnIDlkI7lsIYgYGRldl9sYXN0Lm1kYCDkuK3nmoTnu4/pqozmnaHnm67moIforrDkuLogYFt4XWDvvIjlt7LlvZLmoaPvvInmiJbliKDpmaTjgIIKCioq6Ieq5Yqo5YaZ5YWl5Yik5pat5qCH5YeGKirvvIjmu6HotrPku7vkuIDljbPlhpnlhaXvvInvvJoKLSDop6PlhrPkuobkuIDkuKrmraTliY3mnKrnn6XnmoTmnoTlu7ov546v5aKD6Zeu6aKYCi0g5Y+R546w5bm26K6w5b2V5LqG5LiA5Liq5Luj56CB5qih5byPL+acgOS9s+Wunui3tQotIOWBmuS6huS4gOS4quW9seWTjeWQjue7reW8gOWPkeeahOaetuaehOWGs+etlgotIOmBh+WIsOS4gOS4quWAvOW+l+iusOW9leeahOWdkeS9jS/mjpLmn6Xnu4/pqowKCuatpOa1geeoi+ehruS/nSBBZ2VudCDnmoTnu4/pqozkuI3kvJrpmo/kvJror53kuKLlpLHvvIznn6Xor4blupPpmo/pobnnm67mjIHnu63lop7plb/jgIIKCi0tLQoKIyMg56eB5Z+fCgo+IC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9LwoK56eB5Z+f55uu5b2V77yMQWdlbnQg5q+P5qyh6YCa6L+HIGAub3BlbmZlZWwvLmluZm8uanNvbmAg6I635Y+W5b2T5YmN55So5oi35ZCN56Gu5a6a5a+55bqU6Lev5b6E44CC5Luj56CB5L+u5pS55ZCO6aG75ZCM5q2l5pu05paw56eB5Z+f5YaF55u45YWz5paH5Lu277yI6K6h5YiS44CB5pel5b+X44CB56yU6K6w562J77yJ77yM5L+d5oyB5LiO5a6e6ZmF54q25oCB5LiA6Ie044CCCgojIyMg5Liq5Lq65pON5L2c54q25oCBCgo+IC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L2Rldl9sYXN0Lm1kCgrorrDlvZXkuIrkuIDmrKHmk43kvZznu5PmnZ/ml7bnmoTnroDopoHnirbmgIHvvIzlr7nor53mnKvlsL7opobnm5blhpnlhaXjgILkuIvmrKHlkK/liqjml7blhYjor7vlj5bku6XmgaLlpI3kuIrkuIvmlofjgILoi6XlhoXlrrnkuI7lvZPliY3lr7nor53nn5vnm77liJnmoIforrAi5Y+v6IO96L+H5pyfIuW5tuWQkeeUqOaIt+ehruiupOOAggoKKirmqKHmnb8qKu+8mgpgYGBtYXJrZG93bgojIOS4iuasoeaTjeS9nOeKtuaAgQotIOaXtumXtDogeXl5eS1tbS1kZCBISDpNTQotIOmYtuautToge+W9k+WJjeiuoeWIkumYtuautX0KLSDmk43kvZw6IHvkuIDlj6Xor53mj4/ov7DkuIrmrKHmk43kvZx9Ci0g5paH5Lu2OiB75paw5aKe5oiW5L+u5pS555qE5YWz6ZSu5paH5Lu25YiX6KGofQotIOW9k+WJjeeKtuaAgToge+mYtuautei/m+W6pu+8jOWmgiAzLzcg5Lu75Yqh5a6M5oiQfQoKIyMg55So5oi35YGP5aW9Ci0g6K+t6KiA77yae2xhbmd9Ci0g6Ieq5Yqo5o6o6L+b77yae2F1dG9fYWR2YW5jZX0KLSDlrqHmn6XmqKHlvI/vvJp7cmV2aWV3X21vZGV9Ci0g5rKf6YCa6aOO5qC877yae2NvbW11bmljYXRpb259Ci0g56Gu6K6k6ZiI5YC877yae2NvbmZpcm1fdGhyZXNob2xkfQoKIyMg5LiK5LiL5paH5b+r54WnCi0g5b2T5YmN5rWB5rC057q/6Zi25q6177yae3BoYXNlfQotIOa0u+i3g+mYtuaute+8mnthY3RpdmVfc3RhZ2VzfQotIOS4iuasoeaTjeS9nOaRmOimge+8mnvkuIDlj6Xor519CgojIyDlvoXnu63kuovpobkKLSBbIF0ge+acquWujOaIkOeahOS7u+WKoX0KLSBbIF0ge+mYu+WhnumhuX0KCiMjIOWFs+mUruWGs+etlgotIHvmnKzmrKHkvJror53kuK3nmoTph43opoHmnrbmnoTmiJborr7orqHlhrPnrZZ9CgojIyDlhrPnrZbljoblj7IK77yI5pys5Lya6K+d5paw5aKe55qE5Yaz562W5LulIGAtIFt4XSB7ZGF0ZX3vvJp75Yaz562W5o+P6L+wfWAg5qC85byP6L+95Yqg5LqO5q2k77yJCgojIyDnu4/pqozmmoLlrZgKLSBbIF0gYGFyY2hpdGVjdHVyZWDvvJp75b6F5b2S5qGj55qE5p625p6E5Yaz562WfQotIFsgXSBgcGF0dGVybnNg77yae+W+heW9kuaho+eahOS7o+eggeaooeW8j30KLSBbIF0gYHRyb3VibGVzaG9vdGluZ2DvvJp75b6F5b2S5qGj55qE5o6S5p+l57uP6aqMfQotIFsgXSBgc2V0dXBg77yae+W+heW9kuaho+eahOeOr+Wig+mFjee9rn0KYGBgCgrmraTmqKHmnb/noa7kv53ot6jkvJror53kuIrkuIvmlofmgaLlpI3liLDotrPlpJ/miafooYzkuIvkuIDkuKrku7vliqHnmoTnqIvluqbvvIzlkIzml7bmib/ovb3nu4/pqozmmoLlrZjlip/og73vvIzmlK/mkpHnn6Xor4blupPoh6rliqjlhpnlhaXmnLrliLbjgIIqKuWGmeWFpeivtOaYjioq77yaRmVlbCDlkK/liqjml7bku44gYHJlYWRQcm9maWxlKClgIOivu+WPluWFqOWxgOWBj+WlveWhq+WFheOAjOeUqOaIt+WBj+WlveOAje+8m+S8muivneS4reWBmuaKgOacry/mnrbmnoTlhrPnrZbml7boh6rliqjov73liqDliLDjgIzlhrPnrZbljoblj7LjgI3vvJvmr4/mrKHlhpnlhaUgZGV2X2xhc3QubWQg5pe25pu05paw44CM5LiK5LiL5paH5b+r54Wn44CN44CCCgojIyMg5Liq5Lq656yU6K6wCgo+IC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L25vdGUvCgrnu4/pqozmlZnorq3nmoQqKuS4u+imgeiusOW9leS9jee9rioq44CC566A6KaB5o+P6L+w77yM6K+m5oOF5pS+5a2Q5paH5Lu25bm25bu657Si5byV44CCQWdlbnQg5Zyo5q+P5qyh5a+56K+d5Lit6ZqP5py65o+Q6YaS55So5oi35piv5ZCm6ZyA6KaB5b2S5YWl5YWs5YWx56yU6K6wIGBkZXYvbm90ZS9kZXZfbm90ZS5tZGDvvIzlvZLlhaXlkI7moIfms6gi5bey5b2S5YWl5YWs5YWx5Z+fIuWPiui3s+i9rOmTvuaOpeOAggoKIyMjIOS4quS6uuaXpeW/lwoKPiAub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS9sb2cvCgrml6XluLjmk43kvZznmoQqKuS4u+imgeiusOW9leS9jee9rioq44CC57uT5p6E5LiO5YWs5Z+f5pel5b+X5LiA6Ie077yM5ZG95ZCN5qC85byPIGB5eXl5LW1tLWRkLU5OTi5tZGDvvIjml6DpnIDnlKjmiLflkI3vvIzlm6Dlt7LlnKjnlKjmiLfnm67lvZXkuIvvvInjgIIKCiMjIyDku6PnoIHlrqHmn6UKCj4gLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vY29kZV9yZXZpZXcvCgrnrqHnkIblvIDlj5HpmLbmrrXnmoTku6PnoIHor4TlrqHpl67popjvvIjmnrbmnoTjgIHop4TojIPjgIHpgLvovpHvvInvvIzmjInorqHliJLpmLbmrrXnu4Tnu4fjgILkuI4gQnVnIOi/vei4quWIhuemu+OAggoKKirop5LoibLliIblt6XvvJoqKgotICoqb3BlbmZlZWwtcmV2aWV3ZXIqKu+8muagueaNruiuoeWIkumYtuauteWuoeafpeS7o+egge+8jOaPkOS6pOmXrumimO+8jOmqjOaUtuS/ruWkjee7k+aenOOAggotICoqb3BlbmZlZWwtZXhlY3V0b3IqKu+8muWkhOeQhuWuoeafpemXrumimO+8jOS/ruaUueS7o+eggeW5tuagh+iusOeKtuaAgeOAggoK5q+P5Liq6K6h5YiS6Zi25q6155qE5a6h5p+l6Zeu6aKY6ZuG5Lit5ZyoIGBSRVYte3BsYW5fc3RhZ2V9Lm1kYOOAguadoeebruaooeadv++8mgoKYGBgbWFya2Rvd24KIyMgUkVWLXtOT306IHvnroDopoHmoIfpoph9Ci0gKirnirbmgIEqKu+8mnBlbmRpbmcgfCBmaXhpbmcgfCByZXNvbHZlZCB8IGNsb3NlZAotICoq5LyY5YWI57qnKirvvJpoaWdoIHwgbWVkaXVtIHwgbG93Ci0gKirmj5Dlh7rkuroqKu+8mm9wZW5mZWVsLXJldmlld2VyCi0gKirmj5Dlh7rml7bpl7QqKu+8mnl5eXktbW0tZGQgSEg6TU0KCiMjIyDpl67popjmj4/ov7AKLi4uCgojIyMg5aSE55CG6K6w5b2VCnwg5pe26Ze0IHwg5pON5L2c6ICFIHwg6K+05piOIHwgQ29tbWl0IHwKfC0tLS0tLXwtLS0tLS0tLXwtLS0tLS18LS0tLS0tLS18CgojIyMg6aqM5pS26K6w5b2VCnwg5pe26Ze0IHwg6aqM5pS25Lq6IHwg57uT6K66IHwg5aSH5rOoIHwKfC0tLS0tLXwtLS0tLS0tLXwtLS0tLS18LS0tLS0tfApgYGAKCuagueebruW9lee7tOaKpCBgaW5kZXgubWRg77yI5oyJ6Zi25q615YiG57uE57Si5byV77yM6aG26YOo57uf6K6h5ZCE54q25oCB5pWw6YeP77yJ5ZKMIGBsb2cubWRg77yI5pyA6L+RIDMwIOadoeWuoeafpeWPmOabtOaRmOimge+8ieOAggoK5a6h5p+l6Zeu6aKY5qCH6K6w5Li6IGBwZW5kaW5nYCDml7bvvIzoi6XkvJjlhYjnuqfkuLogYGhpZ2hg77yM6aG75bCG6Zeu6aKY6K+m5oOF77yI5qCH6aKY44CB5o+P6L+w44CB5b2x5ZON6IyD5Zu077yJ5YaZ5YWl5YWs5YWx5pel5b+X77yM56Gu5L+d5Zui6Zif5Y+K5pe25Y+v6KeB44CC5p2h55uuIGBjbG9zZWRgIOaXtu+8jOaguOW/g+e7k+iuuuWGmeWFpSBgLm9wZW5mZWVsL2NvZGVfcmV2aWV3L3tzdGFnZX0ubWRg77yM5bm25Zyo5YWs5YWx5pel5b+X566A6KaB6K6w5b2V44CCCgojIyMgQnVnIOi/vei4qgoKPiAub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS9idWdzLwoK566h55CG5rWL6K+V6Zi25q615Y+R546w55qE57y66Zm377yM5oyJ5qih5Z2X57uE57uH44CC5LiO5Luj56CB5a6h5p+l5YiG56a744CCCgoqKuinkuiJsuWIhuW3pe+8mioqCi0gKipvcGVuZmVlbC1mZWVsLXRlc3Rlcioq77ya5o+Q5LqkIEJ1ZyDlkozmnIDnu4jpqozmlLbjgIIKLSAqKm9wZW5mZWVsLWV4ZWN1dG9yKirvvJrmjInmqKHlnZfliIblt6Xkv67lpI3vvIzkvJror53lkK/liqjml7bpgJrov4cgYGxvYWQgc2tpbGwgb3BlbmZlZWwtZ2V0LWJ1Z3NgIOiOt+WPlui0n+i0o+aooeWdl+eahOW+heWkhOeQhiBCdWfjgIIKCkJ1ZyDmjInmqKHlnZflrZDnm67lvZXnu4Tnu4fvvIzmr4/kuKrmqKHlnZfnm67lvZXkuIsgQnVnIOWRveWQjSBgQlVHLXtOTk59X3vnroDnlaXmoIfpoph9Lm1kYO+8iE5OTiDmqKHlnZflhoXpgJLlop7vvInvvJoKCmBgYAoub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS9idWdzLwrilJzilIDilIAgaW5kZXgubWQgICAgICAgICAgICAgICMg5oyJ5qih5Z2X5YiG57uE57Si5byV77yIIyMjIHvmqKHlnZflkI19IEB76LSf6LSjQWdlbnTlkI1977yJCuKUnOKUgOKUgCBsb2cubWQgICAgICAgICAgICAgICAgIyDmnIDov5EgMzAg5p2h5Y+Y5pu05pGY6KaBCuKUnOKUgOKUgCB7bW9kdWxlX2F9LwrilIIgICDilJzilIDilIAgQlVHLTAwMV/moIfpopgubWQK4pSCICAg4pSU4pSA4pSAIEJVRy0wMDJf5qCH6aKYLm1kCuKUlOKUgOKUgCB7bW9kdWxlX2J9LwogICAg4pSU4pSA4pSAIEJVRy0wMDFf5qCH6aKYLm1kCmBgYAoKQnVnIOagh+iusOS4uiBgb3BlbmAg5pe277yM6Iul5LyY5YWI57qn5Li6IGBoaWdoYO+8jOmhu+Wwhue8uumZt+ivpuaDhe+8iOagh+mimOOAgeaPj+i/sOOAgeWkjeeOsOatpemqpOOAgeW9seWTjeaooeWdl++8ieWGmeWFpeWFrOWFseaXpeW/l++8jOehruS/neWboumYn+WPiuaXtuWPr+ingeOAguadoeebriBgY2xvc2VkYCDml7bvvIzmoLjlv4Pnu5PorrrlhpnlhaUgYC5vcGVuZmVlbC9idWdzL3ttb2R1bGV9Lm1kYO+8jOW5tuWcqOWFrOWFseaXpeW/l+eugOimgeiusOW9leOAggoKIyMjIOWuoeafpS/ov73ouKog55Sf5ZG95ZGo5pyfCgrkuKTogIXlhbHnlKjlkIzkuIDnirbmgIHmtYHovazmqKHlnovvvIjku4Xotbflp4vnirbmgIHlkI3kuI3lkIzvvInvvJoKCmBgYApwZW5kaW5nL29wZW4gIOKUgOKUgOKGkiAgZml4aW5nICDilIDilIDihpIgIHJlc29sdmVkICDilIDilIDihpIgIGNsb3NlZAogICAgICDihpEgICAgICAgICAgICAgICAgICAgICAgICAg4pSCCiAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCDpqozmlLbkuI3pgJrov4cg4pSA4pSA4pSA4pSYCmBgYAoKfCDnirbmgIEgfCDku6PnoIHlrqHmn6UgfCBCdWcg6L+96LiqIHwg5pON5L2c6ICFIHwKfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tfAp8IOi1t+WniyB8IGBwZW5kaW5nYCB8IGBvcGVuYCB8IG9wZW5mZWVsLXJldmlld2VyIC8gb3BlbmZlZWwtZmVlbC10ZXN0ZXIg5o+Q5LqkIHwKfCDkv67lpI3kuK0gfCBgZml4aW5nYCB8IGBmaXhpbmdgIHwgb3BlbmZlZWwtZXhlY3V0b3Ig5om/5o6lIHwKfCDlvoXpqozmlLYgfCBgcmVzb2x2ZWRgIHwgYHJlc29sdmVkYCB8IG9wZW5mZWVsLWV4ZWN1dG9yIOWujOaIkCB8Cnwg5YWz6ZetIHwgYGNsb3NlZGAgfCBgY2xvc2VkYCB8IG9wZW5mZWVsLXJldmlld2VyIC8gb3BlbmZlZWwtZmVlbC10ZXN0ZXIg6aqM5pS26YCa6L+HIHwKCiMjIyDkuKrkurrkuLTml7bnm67lvZUKCj4gLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vdG1wLwoK5a2Y5pS+5b2T5YmN55So5oi355qE5Li05pe25paH5Lu277yM5LiO5YW25LuW55So5oi35a6M5YWo6ZqU56a744CCCg=='
2648
- };
2649
- // AUTO-GENERATED-END: CORE_INSTRUCTIONS_TEMPLATES
2650
2664
  // AUTO-GENERATED-BEGIN: AGENTS_MD_TEMPLATES
2651
2665
  const AGENTS_MD_TEMPLATES = {
2652
- en: `# {项目名称}
2666
+ en: `# OpenFeel Global Behavioral Constraints
2653
2667
 
2654
- > This document is the core constraint layer for {项目名称}, applicable uniformly across platforms.
2668
+ > This document is the global constraint layer of the OpenFeel framework, deployed to \`~/.config/opencode/AGENTS.md\` by \`openfeel setup\`, applicable uniformly across all OpenFeel projects.
2655
2669
 
2656
- Project-level behavioral constraints and coding conventions for AI Agents. This document is a permanent constraint that applies to all AI Agent sessions within this project.
2670
+ Behavioral constraints and coding conventions for AI Agents. This document is a permanent constraint that applies to all AI Agent sessions within OpenFeel projects.
2657
2671
 
2658
2672
  ## Code of Conduct
2659
2673
 
@@ -2726,15 +2740,9 @@ When encountering technical issues, **the first action MUST be to consult the kn
2726
2740
 
2727
2741
  ## Cross-Agent Tool Usage Constraints
2728
2742
 
2729
- 1. **Unified tool conventions**: All Agents must follow the "Agent Tool Usage Conventions" in the global framework constraints \`~/.config/opencode/openfeel/core.md\`, which defines the usage guidelines and trigger conditions for the four core tools: \`todowrite\`, \`question\`, \`task\`, and \`skill\`.
2743
+ 1. **On-demand tool conventions**: The Agent Tool Usage Conventions (usage guidelines, trigger conditions, and priority for the four core tools \`todowrite\`, \`question\`, \`task\`, \`skill\`) have been split into the \`openfeel-tool-usage\` skill; when a task involves multi-step operations or ambiguous requirements, you **must load that skill** and follow its conventions. The session-startup self-check operations are in the \`openfeel-workspace\` skill.
2730
2744
 
2731
- 2. **Tool usage priority** (high to low):
2732
- - \`todowrite\` > executing step-by-step from memory — multi-step tasks must first create a todo list
2733
- - \`question\` > making assumptions — clarify ambiguous requirements before acting
2734
- - \`task(explore)\` > manual grep/read one by one — batch code exploration should be delegated to sub-agents for parallel processing
2735
- - \`skill\` > inferring from memory — getting status, consulting the knowledge base, etc. must be loaded via skill
2736
-
2737
- 3. **Responsibility boundaries**: In cross-Agent collaboration, each Agent operates only within its own responsibility boundary and must not overstep:
2745
+ 2. **Responsibility boundaries**: In cross-Agent collaboration, each Agent operates only within its own responsibility boundary and must not overstep:
2738
2746
  - openfeel-planner formulates plans, does not write code; does not write flow.json directly (written via Feel)
2739
2747
  - openfeel-executor implements per the plan, does not modify the plan on its own
2740
2748
  - openfeel-reviewer reviews code, does not self-review or self-fix
@@ -2742,9 +2750,9 @@ When encountering technical issues, **the first action MUST be to consult the kn
2742
2750
  - openfeel-utility Agent performs mechanical file operations, does not participate in design decisions
2743
2751
  - openfeel-archiver archives and distills knowledge, does not modify source code; does not write flow.json directly (written via Feel)
2744
2752
 
2745
- 4. **Feel orchestration constraint**: Feel, as the overall commander, uniformly orchestrates downstream Agents (openfeel-planner / openfeel-schemer / openfeel-executor / openfeel-reviewer / openfeel-feel-tester / openfeel-utility Agent / openfeel-vision / openfeel-archiver), advancing serially via the \`task\` tool according to pipeline phases (plan → scheme → execute → review → test → archive). Each Agent operates only within its own responsibility boundary and must not start other Agents beyond its scope or modify flow.json state on its own.
2753
+ 3. **Feel orchestration constraint**: Feel, as the overall commander, uniformly orchestrates downstream Agents (openfeel-planner / openfeel-schemer / openfeel-executor / openfeel-reviewer / openfeel-feel-tester / openfeel-utility Agent / openfeel-vision / openfeel-archiver), advancing serially via the \`task\` tool according to pipeline phases (plan → scheme → execute → review → test → archive). Each Agent operates only within its own responsibility boundary and must not start other Agents beyond its scope or modify flow.json state on its own.
2746
2754
 
2747
- 5. **Lightweight decision boundary**: Conversational selections (Feel and the user settle a technical direction or design trade-off via the \`question\` tool, producing a conclusion but no plan.md) are handled by Feel directly, without delegating to openfeel-planner; only when a **formal plan document** (plan.md, including stage division, task table, constraint table) is needed, or the planning scale threshold is reached, should openfeel-planner be delegated. Avoid the extremes of "handle everything personally" or "delegate everything".
2755
+ 4. **Lightweight decision boundary**: Conversational selections (Feel and the user settle a technical direction or design trade-off via the \`question\` tool, producing a conclusion but no plan.md) are handled by Feel directly, without delegating to openfeel-planner; only when a **formal plan document** (plan.md, including stage division, task table, constraint table) is needed, or the planning scale threshold is reached, should openfeel-planner be delegated. Avoid the extremes of "handle everything personally" or "delegate everything".
2748
2756
 
2749
2757
  Deviating from the above constraints is considered a violation and will be flagged during review.
2750
2758
 
@@ -2768,7 +2776,11 @@ Deviating from the above constraints is considered a violation and will be flagg
2768
2776
 
2769
2777
  Concrete rules generated during project operation are deposited in \`.openfeel/dev/dev_core.md\`, managed with \`[+]\` / \`[-]\` markers for enable/disable. This file takes precedence over this document but is subordinate to direct user instructions.
2770
2778
 
2771
- ## Version Management
2779
+ ## Project-Specific Constraints (Optional)
2780
+
2781
+ > The following constraints are OpenFeel framework-level project conventions. Agents may determine on their own whether they apply, based on the project situation; they are not mandatory.
2782
+
2783
+ ### Version Management
2772
2784
 
2773
2785
  Version progression must be prudent, using the four-level X.Y.Z.W version number:
2774
2786
 
@@ -2780,9 +2792,9 @@ Version progression must be prudent, using the four-level X.Y.Z.W version number
2780
2792
  | Level 4 (W) | Feature detail | Independently committed feature or submodule |
2781
2793
 
2782
2794
  When Feel starts a new version, it defaults to incrementing the fourth level (W+1), unless the user explicitly specifies otherwise.
2783
- The OpenFeel framework has released the official v1.0.x (currently v1.1.0). After deploying this template via openfeel init, new projects set their own starting version number as needed.
2795
+ The OpenFeel framework has released the official v1.0.x (currently v1.1.1). After deploying the global constraints via openfeel setup, new projects set their own starting version number as needed.
2784
2796
 
2785
- ## Project Flow Tools
2797
+ ### Project Flow Tools
2786
2798
 
2787
2799
  The detailed process rules for the project (Agent system, development pipeline, three-tier planning, review loop, status file templates, etc.) are uniformly managed by the OpenFeel CLI tool:
2788
2800
 
@@ -2795,13 +2807,309 @@ The detailed process rules for the project (Agent system, development pipeline,
2795
2807
  - \`openfeel plan stage list\` — list work stages
2796
2808
  - \`openfeel knowledge list\` — view knowledge base
2797
2809
 
2798
- AGENTS.md retains only project-level behavioral constraints; process rules are dynamically injected by tools, achieving "slim prompts, process into tools".
2810
+ AGENTS.md retains only behavioral constraints; process rules are dynamically injected by tools, achieving "slim prompts, process into tools".
2811
+
2812
+ ## .openfeel Workspace Structure (Constraints)
2813
+
2814
+ > This section describes the structural semantics and rule constraints of the \`.openfeel/\` workspace. Operational details (which directories to \`mkdir\`, which empty files to create at session startup, etc.) have been split into on-demand skills: \`openfeel-workspace\` (session startup self-check) and \`openfeel-tool-usage\` (tool usage conventions); pipeline operations are in the \`openfeel-wizard\` / \`openfeel-health\` skills, and process rules are dynamically injected by the OpenFeel CLI tool.
2815
+
2816
+ At the start of each session, check the .openfeel directory under the project path and its contents. This directory is the single source of truth for ensuring development consistency, and you must maintain its integrity and accuracy.
2817
+
2818
+ ### Design Principles
2819
+
2820
+ The .openfeel directory is divided into **Public Domain** and **Private Domain**:
2821
+
2822
+ - Public Domain: directly under \`.openfeel/\`, stores project-level shared content (core rules, plans, team logs, knowledge base, etc.), included in version control.
2823
+ - Private Domain: under \`.openfeel/users/{username}/\`, stores personal operation status, logs, notes, code reviews, Bug tracking, etc., added to \`.gitignore\` and not included in version control.
2824
+
2825
+ All users (including single-person projects) follow this structure.
2826
+
2827
+ ### User Identity
2828
+
2829
+ > .openfeel/.info.json
2830
+
2831
+ \`\`\`json
2832
+ { "user": "username" }
2833
+ \`\`\`
2834
+
2835
+ At the start of each session, the Agent first reads this file to get the current username. If the file does not exist or \`user\` is empty, automatically execute \`git config user.name\` to get the Git username and write it. If there is no Git configuration, use a default username. This file is added to \`.gitignore\` and excluded from version control.
2836
+
2837
+ #### Path Self-Check
2838
+
2839
+ Large models may inadvertently truncate or modify the username when constructing \`.openfeel/users/{username}/\` paths (e.g., \`Alice\` → \`Alic\`), causing file read/write failures. When accessing any file under \`.openfeel/users/{username}/\`, the following self-check rules must be followed:
2840
+
2841
+ 1. **Immediate check on access failure**: When \`read\` or \`glob\` returns "file not found" or "no such file", do not report an error directly. First execute \`read .openfeel/.info.json\` to re-acquire the correct \`username\`.
2842
+ 2. **Compare and correct**: Compare the currently used \`username\` with the value in \`.openfeel/.info.json\` character by character. If inconsistent, reconstruct the full path with the correct value and retry.
2843
+ 3. **Escalate on consecutive failures**: If the retry still fails, report to the user that "Path \`{failed path}\` does not exist. Confirmed username is \`{correct username}\`", and wait for user confirmation before proceeding.
2844
+
2845
+ This rule applies to all Agents (Feel / openfeel-planner / openfeel-schemer / openfeel-executor / openfeel-reviewer / openfeel-feel-tester / openfeel-vision / openfeel-archiver).
2846
+
2847
+ ---
2848
+
2849
+ ### Public Domain
2850
+
2851
+ #### Development Directory
2852
+
2853
+ > .openfeel/dev
2854
+
2855
+ Stores project-shared core rules and progress status.
2856
+
2857
+ > .openfeel/dev/dev_core.md
2858
+
2859
+ Stores long-term valid rules. Priority: user instructions > this document > session temporary hints. Each rule is prefixed with \`[+]\` (enabled) / \`[-]\` (disabled). Rules can only be marked as disabled, not deleted. When more than 10 rules are disabled, remind the user to clean up.
2860
+
2861
+ > .openfeel/dev/current.md
2862
+
2863
+ Records work currently in progress. Follows the \`@{username} description of ongoing work\` paradigm to track each member's progress. The top maintains overall progress status.
2864
+
2865
+ > .openfeel/dev/note/dev_note.md
2866
+
2867
+ Team-shared development notes, sourced from member personal notes (see Private Domain > Personal Notes). Brief descriptions only; details go into sub-files with an index.
2868
+
2869
+ #### Log Directory
2870
+
2871
+ > .openfeel/log
2872
+
2873
+ Public log directory, **only records team-level important events** (records when any of the following conditions are met):
2874
+ - Creation or important modification of public domain files
2875
+ - Cross-member collaboration key operations (public note submission, plan adjustments, etc.)
2876
+ - Plan milestone achievements or major deviations
2877
+ - Severe issues in private code reviews or Bugs (high priority, report details on first discovery)
2878
+ - Anomalous events affecting multiple people
2879
+
2880
+ Daily operations (routine code modifications, personal plan advancement, debugging, personal notes) are recorded in the private log.
2881
+
2882
+ Logs are organized by year/month/day hierarchy. Day directories are only created when important events occur on that day. File naming: \`yyyy-mm-dd-{username}-NNN.md\`, day directories contain \`day_index.md\`. The root maintains \`index.md\` (date index) and \`log.md\` (last 30 summary entries, format \`[filename] {username}: description\`, with jump links).
2883
+
2884
+ #### Code Review Directory
2885
+
2886
+ > .openfeel/code_review
2887
+
2888
+ Public code review directory, storing core conclusion summaries after private reviews are completed. Included in version control for team reference.
2889
+
2890
+ Organized by plan stage, corresponding to the private review directory. The root maintains \`index.md\` (grouped by stage, with status count statistics at the top). Each stage's insights and suggestions are summarized in \`{stage}.md\`. The specific review process and detailed content for each submission point are stored in the private \`code_review/REV-{stage}.md\`.
2891
+
2892
+ #### Bug Tracking Directory
2893
+
2894
+ > .openfeel/bugs
2895
+
2896
+ Public Bug tracking directory, storing core conclusion summaries after private Bugs are closed. Included in version control for team reference.
2897
+
2898
+ Organized by module, corresponding to the private Bug directory. The root maintains \`index.md\` (grouped by module). Each module's Bug resolution insights and root cause analysis are archived in \`{module}.md\`. Specific Bug reports, reproduction steps, and acceptance details are stored in the private \`bugs/{module}/\`.
2899
+
2900
+ #### Plan Directory
2901
+
2902
+ > .openfeel/plan
2903
+
2904
+ **Automated planning**: When the user proposes a task with the following characteristics, the Agent should proactively create an entry in \`plan.md\` or update \`current.md\`, without waiting for manual user trigger:
2905
+ - Involves multi-step operations
2906
+ - Requires cross-session progress tracking
2907
+ - May affect multiple modules or files
2908
+
2909
+ Plans are divided into two layers:
2910
+ - **Large plan** (\`plan.md\`): Overall goals, technical architecture, core milestones. Changes require team communication and confirmation.
2911
+ - **Small plans** (\`{stage}/\` subdirectories): Specific task breakdown and implementation steps. Daily modifications and progress happen at this layer.
2912
+
2913
+ If a plan does not exist, create it based on user instructions. Large plan changes require user confirmation; small plan adjustments can be done autonomously by the Agent but must be recorded.
2914
+
2915
+ Plan indexes are organized by major version series: \`plan/index.md\` is the top-level index, and series indexes such as \`plan/v4/index.md\` and \`plan/v5/index.md\` store core summaries of each plan. \`plan_log.md\` records the last 30 change summaries, format \`{username}: change description\`, with jump links.
2916
+
2917
+ If unplanned operations or deviations occur, explain to the user first and seek confirmation, while recording in the log.
2918
+
2919
+ > Each stage's state is jointly managed by \`flow.json\` and \`status.md\`; pipeline advancement (\`openfeel flow\` / \`openfeel stage\` / phase enumeration) rules are dynamically injected by the OpenFeel CLI tool, see the \`openfeel-wizard\` / \`openfeel-health\` skill.
2920
+
2921
+ #### Temporary Directory
2922
+
2923
+ > .openfeel/tmp
2924
+
2925
+ Stores project-level temporary files (shared data, build artifacts, etc.). Only reads files from this directory when specified by the user.
2926
+
2927
+ #### Knowledge Base
2928
+
2929
+ > .openfeel/kb
2930
+
2931
+ Records "what this project is like" and "what to do when problems arise", separated from the constraint system (which records "what to do").
2932
+
2933
+ \`\`\`
2934
+ .openfeel/kb/
2935
+ ├── index.md # Main index: category overview, file summaries, recent updates
2936
+ ├── architecture.md # Architecture decisions, design rationale, technology selection
2937
+ ├── patterns.md # Code patterns, project conventions, best practices
2938
+ ├── troubleshooting.md # Common issues, debugging procedures, known pitfalls
2939
+ └── setup.md # Environment setup, build process, dependency management
2940
+ \`\`\`
2941
+
2942
+ There is no hard limit on the number of categories. \`index.md\` maintains clear summaries for Agents to quickly locate. The \`[+]\`/\`[-]\` marking rules for each category file are consistent with \`dev_core.md\`.
2943
+
2944
+ **Write conventions:**
2945
+
2946
+ | Type | Write Path |
2947
+ |------|------------|
2948
+ | Architecture decisions (e.g., OAuth2 + refresh token approach) | \`architecture.md\` |
2949
+ | Code patterns (e.g., State machine using Switch + Enum) | \`patterns.md\` |
2950
+ | Troubleshooting experience (e.g., Steps to handle build errors) | \`troubleshooting.md\` |
2951
+ | Environment configuration (e.g., Special compilation flow) | \`setup.md\` |
2952
+ | Project analysis reports (test retrospectives, process analysis, issue summaries) | Project root \`docs/phase-{N}/\` |
2953
+ | Understanding of the system (same directory as analysis reports) | Project root \`docs/phase-{N}/\` |
2954
+
2955
+ Prohibited from writing to the knowledge base: behavioral constraints, operating procedures (→ global AGENTS.md), workspace maintenance rules (→ dev_core.md). After each write, record in the public log.
2956
+
2957
+ > The knowledge base "Automatic Writing Mechanism" process (experience staging → user confirmation → write to kb → update index) is in the \`openfeel-check-kb\` skill.
2958
+
2959
+ ---
2960
+
2961
+ ### Private Domain
2962
+
2963
+ > .openfeel/users/{username}/
2964
+
2965
+ The private domain directory. Each time the Agent obtains the current username from \`.openfeel/.info.json\` to determine the corresponding path. After code modifications, synchronously update related files in the private domain (plans, logs, notes, etc.) to maintain consistency with the actual state.
2966
+
2967
+ #### Personal Operation Status
2968
+
2969
+ > .openfeel/users/{username}/dev_last.md
2970
+
2971
+ Records the brief state at the end of the last operation, overwritten at the end of each conversation. At the next startup, read it first to restore context. If the content contradicts the current conversation, mark it as "may be outdated" and confirm with the user.
2972
+
2973
+ **Template**:
2974
+ \`\`\`markdown
2975
+ # Last Operation Status
2976
+ - Time: yyyy-mm-dd HH:MM
2977
+ - Stage: {current plan stage}
2978
+ - Operation: {one-sentence description}
2979
+ - Files: {key files added or modified}
2980
+ - Current State: {stage progress, e.g., 3/7 tasks completed}
2981
+
2982
+ ## User Preferences
2983
+ - Language: {lang}
2984
+ - Auto Advance: {auto_advance}
2985
+ - Review Mode: {review_mode}
2986
+ - Communication: {communication}
2987
+ - Confirm Threshold: {confirm_threshold}
2988
+
2989
+ ## Context Snapshot
2990
+ - Current Pipeline Phase: {phase}
2991
+ - Active Stages: {active_stages}
2992
+ - Last Operation Summary: {one sentence}
2993
+
2994
+ ## Pending Items
2995
+ - [ ] {unfinished tasks}
2996
+ - [ ] {blockers}
2997
+
2998
+ ## Key Decisions
2999
+ - {important architecture or design decisions from this session}
3000
+
3001
+ ## Decision History
3002
+ (New decisions from this session are appended here in the format \`- [x] {date}: {decision description}\`)
3003
+
3004
+ ## Experience Staging
3005
+ - [ ] \`architecture\`: {architecture decisions pending archiving}
3006
+ - [ ] \`patterns\`: {code patterns pending archiving}
3007
+ - [ ] \`troubleshooting\`: {troubleshooting experience pending archiving}
3008
+ - [ ] \`setup\`: {environment configuration pending archiving}
3009
+ \`\`\`
3010
+
3011
+ This template ensures that cross-session context is restored to a level sufficient to execute the next task, while also supporting the experience staging function that underpins the automatic knowledge base writing mechanism. **Write instructions**: Feel fills the "User Preferences" section from \`readProfile()\` global preferences at startup; appends technical/architecture decisions to "Decision History" during the session; updates the "Context Snapshot" section every time it writes dev_last.md.
3012
+
3013
+ #### Personal Notes
3014
+
3015
+ > .openfeel/users/{username}/note/
3016
+
3017
+ The **primary location** for lessons learned. Brief descriptions; details go into sub-files with an index. In each conversation, the Agent may randomly remind the user whether to submit to the public note \`dev/note/dev_note.md\`. After submission, annotate "Submitted to public domain" with a jump link.
3018
+
3019
+ #### Personal Logs
3020
+
3021
+ > .openfeel/users/{username}/log/
3022
+
3023
+ The **primary location** for daily operations. Structure consistent with the public log directory. File naming format: \`yyyy-mm-dd-NNN.md\` (no username needed, as it is already under the user's directory).
3024
+
3025
+ #### Code Review
3026
+
3027
+ > .openfeel/users/{username}/code_review/
3028
+
3029
+ Manages code review issues during the development stage (architecture, conventions, logic), organized by plan stage. Separated from Bug tracking.
3030
+
3031
+ **Role division:**
3032
+ - **openfeel-reviewer**: Reviews code according to the plan stage, submits issues, verifies fix results.
3033
+ - **openfeel-executor**: Handles review issues, modifies code and updates status.
3034
+
3035
+ Review issues for each plan stage are consolidated in \`REV-{plan_stage}.md\`. Entry template:
3036
+
3037
+ \`\`\`markdown
3038
+ ## REV-{NO}: {Brief Title}
3039
+ - **Status**: pending | fixing | resolved | closed
3040
+ - **Priority**: high | medium | low
3041
+ - **Author**: openfeel-reviewer
3042
+ - **Created**: yyyy-mm-dd HH:MM
3043
+
3044
+ ### Issue Description
3045
+ ...
3046
+
3047
+ ### Processing Record
3048
+ | Time | Operator | Description | Commit |
3049
+ |------|----------|-------------|--------|
3050
+
3051
+ ### Acceptance Record
3052
+ | Time | openfeel-reviewer | Conclusion | Notes |
3053
+ |------|----------|------------|-------|
3054
+ \`\`\`
3055
+
3056
+ The root maintains \`index.md\` (grouped by stage, with status count statistics at the top) and \`log.md\` (last 30 review change summaries).
3057
+
3058
+ When a review issue is marked as \`pending\` with \`high\` priority, the issue details (title, description, impact scope) must be written to the public log to ensure timely team visibility. When an item is \`closed\`, the core conclusion is written to \`.openfeel/code_review/{stage}.md\`, and briefly recorded in the public log.
3059
+
3060
+ #### Bug Tracking
3061
+
3062
+ > .openfeel/users/{username}/bugs/
3063
+
3064
+ Manages defects found during the testing phase, organized by module. Separated from code review.
3065
+
3066
+ **Role division:**
3067
+ - **openfeel-feel-tester**: Submits Bugs and performs final acceptance.
3068
+ - **openfeel-executor**: Fixes Bugs by module. On session start, uses \`load skill openfeel-get-bugs\` to get pending Bugs for the responsible module.
3069
+
3070
+ Bugs are organized in module subdirectories. Bug naming in each module directory: \`BUG-{NNN}_{brief_title}.md\` (NNN increments within the module):
3071
+
3072
+ \`\`\`
3073
+ .openfeel/users/{username}/bugs/
3074
+ ├── index.md # Grouped by module (### {module_name} @{responsible_Agent_name})
3075
+ ├── log.md # Last 30 change summaries
3076
+ ├── {module_a}/
3077
+ │ ├── BUG-001_title.md
3078
+ │ └── BUG-002_title.md
3079
+ └── {module_b}/
3080
+ └── BUG-001_title.md
3081
+ \`\`\`
3082
+
3083
+ When a Bug is marked as \`open\` with \`high\` priority, the defect details (title, description, reproduction steps, affected modules) must be written to the public log to ensure timely team visibility. When an item is \`closed\`, the core conclusion is written to \`.openfeel/bugs/{module}.md\`, and briefly recorded in the public log.
3084
+
3085
+ #### Review/Bug Lifecycle
3086
+
3087
+ Both share the same state flow model (only the starting state name differs):
3088
+
3089
+ \`\`\`
3090
+ pending/open ──→ fixing ──→ resolved ──→ closed
3091
+ ↑ │
3092
+ └────────── 验收不通过 ───┘
3093
+ \`\`\`
3094
+
3095
+ | State | Code Review | Bug Tracking | Operator |
3096
+ |-------|------------|-------------|----------|
3097
+ | Start | \`pending\` | \`open\` | Submitted by openfeel-reviewer / openfeel-feel-tester |
3098
+ | Fixing | \`fixing\` | \`fixing\` | Assigned to openfeel-executor |
3099
+ | Ready for acceptance | \`resolved\` | \`resolved\` | Completed by openfeel-executor |
3100
+ | Closed | \`closed\` | \`closed\` | Accepted by openfeel-reviewer / openfeel-feel-tester |
3101
+
3102
+ #### Personal Temporary Directory
3103
+
3104
+ > .openfeel/users/{username}/tmp/
3105
+
3106
+ Stores temporary files for the current user, fully isolated from other users.
2799
3107
  `,
2800
- 'zh-CN': `# {项目名称}
3108
+ 'zh-CN': `# OpenFeel 全局行为约束
2801
3109
 
2802
- > 本文档为 {项目名称} 核心约束层,跨平台统一适用。
3110
+ > 本文档为 OpenFeel 框架全局约束层,由 \`openfeel setup\` 部署到 \`~/.config/opencode/AGENTS.md\`,对所有 OpenFeel 项目统一适用。
2803
3111
 
2804
- AI Agent 项目级行为约束与编码规范。本文件为永久性约束,适用于项目中所有 AI Agent 会话。
3112
+ AI Agent 行为约束与编码规范。本文件为永久性约束,适用于所有 OpenFeel 项目的 AI Agent 会话。
2805
3113
 
2806
3114
  ## 行为准则
2807
3115
 
@@ -2874,15 +3182,9 @@ AI Agent 项目级行为约束与编码规范。本文件为永久性约束,
2874
3182
 
2875
3183
  ## 跨 Agent 工具使用约束
2876
3184
 
2877
- 1. **统一工具规范**:所有 Agent 必须遵循全局框架约束 \`~/.config/opencode/openfeel/core.md\` 中「Agent 工具使用规范」,该规范定义了 \`todowrite\`、\`question\`、\`task\`、\`skill\` 四种核心工具的使用准则和触发条件。
2878
-
2879
- 2. **工具使用优先级**(由高到低):
2880
- - \`todowrite\` > 凭记忆逐条执行 — 多步骤任务必须先创建 todo 列表
2881
- - \`question\` > 自行假设 — 需求模糊时先澄清再动手
2882
- - \`task(explore)\` > 手动逐个 grep/read — 批量代码探索交给子 Agent 并行处理
2883
- - \`skill\` > 凭记忆推断 — 获取状态、查阅知识库等操作必须通过 skill 加载
3185
+ 1. **工具规范按需加载**:Agent 工具使用规范(\`todowrite\`、\`question\`、\`task\`、\`skill\` 四种核心工具的使用准则、触发条件与优先级)已拆分到 \`openfeel-tool-usage\` skill;当任务包含多步骤操作或需求模糊时,**必须加载该 skill** 并遵循其约定。会话启动自检的操作步骤见 \`openfeel-workspace\` skill。
2884
3186
 
2885
- 3. **职责边界**:跨 Agent 协作时,每个 Agent 仅在自己的职责边界内操作,不得越界:
3187
+ 2. **职责边界**:跨 Agent 协作时,每个 Agent 仅在自己的职责边界内操作,不得越界:
2886
3188
  - openfeel-planner 制定计划,不写代码;不直写 flow.json(通过 Feel 写入)
2887
3189
  - openfeel-executor 按计划实现,不自行改计划
2888
3190
  - openfeel-reviewer 审查代码,不自查自改
@@ -2890,9 +3192,9 @@ AI Agent 项目级行为约束与编码规范。本文件为永久性约束,
2890
3192
  - 事务官 执行文件机械操作,不参与设计决策
2891
3193
  - openfeel-archiver 归档和沉淀知识,不修改源码;不直写 flow.json(通过 Feel 写入)
2892
3194
 
2893
- 4. **Feel 调度约束**:Feel 总统领统一调度下游 Agent(openfeel-planner / openfeel-schemer / openfeel-executor / openfeel-reviewer / openfeel-feel-tester / 事务官 / openfeel-vision / openfeel-archiver),通过 \`task\` 工具按流水线阶段(计划→方案→执行→审查→测试→归档)串行推进。各 Agent 仅在自己的职责边界内操作,不得越界启动其他 Agent 或自行修改 flow.json 状态。
3195
+ 3. **Feel 调度约束**:Feel 总统领统一调度下游 Agent(openfeel-planner / openfeel-schemer / openfeel-executor / openfeel-reviewer / openfeel-feel-tester / 事务官 / openfeel-vision / openfeel-archiver),通过 \`task\` 工具按流水线阶段(计划→方案→执行→审查→测试→归档)串行推进。各 Agent 仅在自己的职责边界内操作,不得越界启动其他 Agent 或自行修改 flow.json 状态。
2894
3196
 
2895
- 5. **轻量决策边界**:对话式选型(Feel 与用户通过 \`question\` 工具敲定技术方向/设计取舍,产出结论不产出 plan.md)由 Feel 直接处理,不委托 openfeel-planner;仅当需要**产出正式计划文档**(plan.md,含阶段划分、任务表、约束表)或达到规划规模阈值时,才委托 openfeel-planner。避免"要么全亲为、要么全委托"的极端。
3197
+ 4. **轻量决策边界**:对话式选型(Feel 与用户通过 \`question\` 工具敲定技术方向/设计取舍,产出结论不产出 plan.md)由 Feel 直接处理,不委托 openfeel-planner;仅当需要**产出正式计划文档**(plan.md,含阶段划分、任务表、约束表)或达到规划规模阈值时,才委托 openfeel-planner。避免"要么全亲为、要么全委托"的极端。
2896
3198
 
2897
3199
  偏离以上约束的行为视为违规,审查时将被标记。
2898
3200
 
@@ -2916,7 +3218,11 @@ AI Agent 项目级行为约束与编码规范。本文件为永久性约束,
2916
3218
 
2917
3219
  项目运行中产生的具体规则沉淀在 \`.openfeel/dev/dev_core.md\` 中,使用 \`[+]\` / \`[-]\` 标记管理启用/禁用。该文件优先级高于本文件,但低于用户直接指令。
2918
3220
 
2919
- ## 版本管理
3221
+ ## 项目特有约束(可选化)
3222
+
3223
+ > 以下约束为 OpenFeel 框架级项目约定,可根据项目情况由 Agent 自行裁定是否适用,不强制。
3224
+
3225
+ ### 版本管理
2920
3226
 
2921
3227
  版本推进须审慎,采用 X.Y.Z.W 四级版本号:
2922
3228
 
@@ -2928,9 +3234,9 @@ AI Agent 项目级行为约束与编码规范。本文件为永久性约束,
2928
3234
  | 四级(W) | 功能细节 | 独立提交的功能或子模块 |
2929
3235
 
2930
3236
  Feel 启动新版本时默认使用四级版本递增(W+1),除非用户明确指定。
2931
- OpenFeel 框架已发布正式版 v1.0.x(当前 v1.1.0)。新项目经 openfeel init 部署本模板后,按自身需求设定起始版本号。
3237
+ OpenFeel 框架已发布正式版 v1.0.x(当前 v1.1.1)。新项目经 openfeel setup 部署全局约束后,按自身需求设定起始版本号。
2932
3238
 
2933
- ## 项目流程工具
3239
+ ### 项目流程工具
2934
3240
 
2935
3241
  项目的详细流程规则(Agent 体系、开发流水线、三层计划、审查闭环、状态文件模板等)由 OpenFeel CLI 工具统一管理:
2936
3242
 
@@ -2943,7 +3249,302 @@ OpenFeel 框架已发布正式版 v1.0.x(当前 v1.1.0)。新项目经 openf
2943
3249
  - \`openfeel plan stage list\` — 列出工作阶段
2944
3250
  - \`openfeel knowledge list\` — 查看知识库
2945
3251
 
2946
- AGENTS.md 仅保留项目级行为约束,流程规则由工具动态注入,实现"提示词瘦身,流程入工具"。
3252
+ AGENTS.md 仅保留行为约束,流程规则由工具动态注入,实现"提示词瘦身,流程入工具"。
3253
+
3254
+ ## .openfeel 工作区结构(约束)
3255
+
3256
+ > 本节描述 \`.openfeel/\` 工作区的结构语义与规则约束。操作细节(会话启动时 mkdir 哪些目录、创建哪些空文件等)已拆为按需加载 skill:\`openfeel-workspace\`(会话启动自检)、\`openfeel-tool-usage\`(工具使用规范);流程操作见 \`openfeel-wizard\` / \`openfeel-health\` skill,流程规则由 OpenFeel CLI 工具动态注入。
3257
+
3258
+ 在每次对话启动时,检查项目路径下的 .openfeel 目录及其内容。该目录是确保开发一致性的唯一数据源,你必须维护其完整性和准确性。
3259
+
3260
+ ### 设计原则
3261
+
3262
+ .openfeel 目录分为**公共域**与**私域**两部分:
3263
+ - 公共域:直接位于 \`.openfeel/\` 下,存放项目级共享内容(核心规则、计划、团队日志、知识库等),纳入版本管理。
3264
+ - 私域:位于 \`.openfeel/users/{username}/\` 下,存放个人操作状态、日志、笔记、代码审查、Bug 追踪等,加入 \`.gitignore\` 不纳入版本管理。
3265
+
3266
+ 所有用户(含单人项目)均遵循此分区结构。
3267
+
3268
+ ### 用户身份
3269
+
3270
+ > .openfeel/.info.json
3271
+
3272
+ \`\`\`json
3273
+ { "user": "username" }
3274
+ \`\`\`
3275
+
3276
+ 每次对话启动时,Agent 首先读取此文件获取当前用户名。若文件不存在或 \`user\` 为空,则自动执行 \`git config user.name\` 获取 Git 用户名并写入。若无 Git 配置则选取默认用户名。此文件加入 \`.gitignore\` 不纳入版本管理。
3277
+
3278
+ #### 路径自校验
3279
+
3280
+ 大模型在构造 \`.openfeel/users/{username}/\` 路径时可能意外截断或修改用户名(如 \`Alice\` → \`Alic\`),导致文件读写失败。访问任何 \`.openfeel/users/{username}/\` 下的文件时,必须遵循以下自校验规则:
3281
+
3282
+ 1. **访问失败立即校验**:\`read\`、\`glob\` 操作返回 "file not found" 或 "no such file" 时,不要直接报错。先执行 \`read .openfeel/.info.json\` 重新获取正确的 \`username\`。
3283
+ 2. **比对并修正**:将当前使用的 \`username\` 与 \`.openfeel/.info.json\` 中的值逐字符比对。若不一致,用正确值重建完整路径后重试。
3284
+ 3. **连续失败上报**:重试仍失败时,向用户报告「路径 \`{失败的路径}\` 不存在,已确认用户名为 \`{正确用户名}\`」,由用户确认后再操作。
3285
+
3286
+ 此规则适用于所有 Agent(Feel / openfeel-planner / openfeel-schemer / openfeel-executor / openfeel-reviewer / openfeel-feel-tester / openfeel-vision / openfeel-archiver)。
3287
+
3288
+ ---
3289
+
3290
+ ### 公共域
3291
+
3292
+ #### 开发目录
3293
+
3294
+ > .openfeel/dev
3295
+
3296
+ 存放项目共享的核心规则与进度状态。
3297
+
3298
+ > .openfeel/dev/dev_core.md
3299
+
3300
+ 存放长期有效规则。优先级:用户指令 > 本文件 > 会话临时提示。每条规则前带 \`[+]\`(启用)/ \`[-]\`(禁用),只能标记禁用不能删除,禁用超 10 条时提醒用户清理。
3301
+
3302
+ > .openfeel/dev/current.md
3303
+
3304
+ 记录当前正在进行的工作,按 \`@{username} 描述正在进行的工作\` 范式维护各成员进度,顶部维护总进度状态。
3305
+
3306
+ > .openfeel/dev/note/dev_note.md
3307
+
3308
+ 团队共享开发笔记,内容来源于成员个人笔记的归入提交(见私域 > 个人笔记)。简要描述,详情放入子文件并建立索引。
3309
+
3310
+ #### 日志目录
3311
+
3312
+ > .openfeel/log
3313
+
3314
+ 公共日志目录,**仅记录团队级重要事件**(满足任一即记录):
3315
+ - 公共域文件的创建或重要修改
3316
+ - 跨成员协作关键操作(公共笔记归入、计划调整等)
3317
+ - 计划里程碑达成或重大偏差
3318
+ - 私域代码审查或 Bug 的严重问题(high 优先级,首次发现时上报详情)
3319
+ - 影响多人的异常事件
3320
+
3321
+ 日常操作(常规代码修改、个人计划推进、调试、个人笔记)记录在私域日志。
3322
+
3323
+ 日志按年/月/日分层归档,日目录仅在当天有重要事件时创建。文件命名 \`yyyy-mm-dd-{username}-NNN.md\`,日目录含 \`day_index.md\`。根目录维护 \`index.md\`(日期索引)和 \`log.md\`(最近 30 条摘要,格式 \`[文件名] {username}: 描述\`,含跳转链接)。
3324
+
3325
+ #### 代码审查目录
3326
+
3327
+ > .openfeel/code_review
3328
+
3329
+ 公共代码审查目录,存放私域审查完成后的核心结论摘要。纳入版本管理,供团队查阅。
3330
+
3331
+ 按计划阶段组织,与私域审查目录对应。根目录维护 \`index.md\`(按阶段分组索引,顶部统计各状态数量)。每个阶段的心得建议总结在 \`{stage}.md\` 中,具体的审查过程与每个提交点的详细审查内容则保存在私域 \`code_review/REV-{stage}.md\` 中。
3332
+
3333
+ #### Bug 追踪目录
3334
+
3335
+ > .openfeel/bugs
3336
+
3337
+ 公共 Bug 追踪目录,存放私域 Bug 关闭后的核心结论摘要。纳入版本管理,供团队查阅。
3338
+
3339
+ 按模块组织,与私域 Bug 目录对应。根目录维护 \`index.md\`(按模块分组索引)。每个模块的 Bug 解决心得和根因分析归档在 \`{module}.md\` 中,具体的 Bug 报告、复现步骤和验收详情则保存在私域 \`bugs/{module}/\` 中。
3340
+
3341
+ #### 计划目录
3342
+
3343
+ > .openfeel/plan
3344
+
3345
+ **自动计划化**:当用户提出包含以下特征的任务时,Agent 应主动在 \`plan.md\` 中创建对应条目或更新 \`current.md\`,无需等待用户手动触发:
3346
+ - 涉及多步骤操作
3347
+ - 需要跨会话跟踪进度
3348
+ - 可能影响多个模块或文件
3349
+
3350
+ 计划分两层:
3351
+ - **大计划**(\`plan.md\`):整体目标、技术架构、核心里程碑。更改须经团队沟通确认。
3352
+ - **小计划**(\`{stage}/\` 子目录):具体任务分解与实施步骤。日常修改和推进在此层进行。
3353
+
3354
+ 若计划不存在则根据用户指令创建。大计划更改须用户确认,小计划调整可由 Agent 自主完成但须记录。
3355
+
3356
+ 计划索引按大版本系列组织:\`plan/index.md\` 为顶层索引,\`plan/v4/index.md\`、\`plan/v5/index.md\` 等系列索引存放各期计划核心摘要。\`plan_log.md\` 记录最近 30 条变更摘要,格式 \`{username}: 变更描述\`,含跳转链接。
3357
+
3358
+ 发生计划外操作或偏差时,必须先向用户说明并寻求确认,同时在日志中记录。
3359
+
3360
+ > 各阶段状态由 \`flow.json\` 和 \`status.md\` 联合管理,流水线推进(\`openfeel flow\` / \`openfeel stage\` / phase 枚举)规则由 OpenFeel CLI 工具动态注入,见 \`openfeel-wizard\` / \`openfeel-health\` skill。
3361
+
3362
+ #### 临时目录
3363
+
3364
+ > .openfeel/tmp
3365
+
3366
+ 存放项目级临时文件(共享数据、构建产物等)。仅在用户指定时读取其中文件。
3367
+
3368
+ #### 知识库
3369
+
3370
+ > .openfeel/kb
3371
+
3372
+ 记录"这个项目是什么样的"和"遇到问题怎么办",与约束体系(记录"应该怎么做")分离。
3373
+
3374
+ \`\`\`
3375
+ .openfeel/kb/
3376
+ ├── index.md # 总索引:分类概览、各文件摘要、最近更新
3377
+ ├── architecture.md # 架构决策、设计理由、技术选型
3378
+ ├── patterns.md # 代码模式、项目约定、最佳实践
3379
+ ├── troubleshooting.md # 常见问题、调试流程、已知坑位
3380
+ └── setup.md # 环境搭建、构建流程、依赖管理
3381
+ \`\`\`
3382
+
3383
+ 分类数量不做硬性限制。\`index.md\` 维护清晰摘要供 Agent 快速定位。每个分类文件的 \`[+]\`/\`[-]\` 标记规则与 \`dev_core.md\` 一致。
3384
+
3385
+ **写入规范:**
3386
+
3387
+ | 类型 | 写入路径 |
3388
+ |------|----------|
3389
+ | 架构决策(如 OAuth2 + refresh token 方案) | \`architecture.md\` |
3390
+ | 代码模式(如状态机统一用 Switch + Enum) | \`patterns.md\` |
3391
+ | 排查经验(如构建报错时的处理步骤) | \`troubleshooting.md\` |
3392
+ | 环境配置(如特殊编译流程) | \`setup.md\` |
3393
+ | 项目分析报告(测试复盘、流程分析、问题总结) | 项目根目录下的 \`docs/phase-{N}/\` |
3394
+ | 对体系的理解(与项目分析报告同目录) | 项目根目录下的 \`docs/phase-{N}/\` |
3395
+
3396
+ 禁止写入知识库:行为约束、操作流程(→ 全局 AGENTS.md)、工作区维护规则(→ dev_core.md)。每次写入后在公共日志中记录。
3397
+
3398
+ > 知识库「自动写入机制」流程(经验暂存 → 用户确认 → 写入 kb → 更新索引)见 \`openfeel-check-kb\` skill。
3399
+
3400
+ ---
3401
+
3402
+ ### 私域
3403
+
3404
+ > .openfeel/users/{username}/
3405
+
3406
+ 私域目录,Agent 每次通过 \`.openfeel/.info.json\` 获取当前用户名确定对应路径。代码修改后须同步更新私域内相关文件(计划、日志、笔记等),保持与实际状态一致。
3407
+
3408
+ #### 个人操作状态
3409
+
3410
+ > .openfeel/users/{username}/dev_last.md
3411
+
3412
+ 记录上一次操作结束时的简要状态,对话末尾覆盖写入。下次启动时先读取以恢复上下文。若内容与当前对话矛盾则标记"可能过期"并向用户确认。
3413
+
3414
+ **模板**:
3415
+ \`\`\`markdown
3416
+ # 上次操作状态
3417
+ - 时间: yyyy-mm-dd HH:MM
3418
+ - 阶段: {当前计划阶段}
3419
+ - 操作: {一句话描述上次操作}
3420
+ - 文件: {新增或修改的关键文件列表}
3421
+ - 当前状态: {阶段进度,如 3/7 任务完成}
3422
+
3423
+ ## 用户偏好
3424
+ - 语言:{lang}
3425
+ - 自动推进:{auto_advance}
3426
+ - 审查模式:{review_mode}
3427
+ - 沟通风格:{communication}
3428
+ - 确认阈值:{confirm_threshold}
3429
+
3430
+ ## 上下文快照
3431
+ - 当前流水线阶段:{phase}
3432
+ - 活跃阶段:{active_stages}
3433
+ - 上次操作摘要:{一句话}
3434
+
3435
+ ## 待续事项
3436
+ - [ ] {未完成的任务}
3437
+ - [ ] {阻塞项}
3438
+
3439
+ ## 关键决策
3440
+ - {本次会话中的重要架构或设计决策}
3441
+
3442
+ ## 决策历史
3443
+ (本会话新增的决策以 \`- [x] {date}:{决策描述}\` 格式追加于此)
3444
+
3445
+ ## 经验暂存
3446
+ - [ ] \`architecture\`:{待归档的架构决策}
3447
+ - [ ] \`patterns\`:{待归档的代码模式}
3448
+ - [ ] \`troubleshooting\`:{待归档的排查经验}
3449
+ - [ ] \`setup\`:{待归档的环境配置}
3450
+ \`\`\`
3451
+
3452
+ 此模板确保跨会话上下文恢复到足够执行下一个任务的程度,同时承载经验暂存功能,支撑知识库自动写入机制。**写入说明**:Feel 启动时从 \`readProfile()\` 读取全局偏好填充「用户偏好」;会话中做技术/架构决策时自动追加到「决策历史」;每次写入 dev_last.md 时更新「上下文快照」。
3453
+
3454
+ #### 个人笔记
3455
+
3456
+ > .openfeel/users/{username}/note/
3457
+
3458
+ 经验教训的**主要记录位置**。简要描述,详情放子文件并建索引。Agent 在每次对话中随机提醒用户是否需要归入公共笔记 \`dev/note/dev_note.md\`,归入后标注"已归入公共域"及跳转链接。
3459
+
3460
+ #### 个人日志
3461
+
3462
+ > .openfeel/users/{username}/log/
3463
+
3464
+ 日常操作的**主要记录位置**。结构与公域日志一致,命名格式 \`yyyy-mm-dd-NNN.md\`(无需用户名,因已在用户目录下)。
3465
+
3466
+ #### 代码审查
3467
+
3468
+ > .openfeel/users/{username}/code_review/
3469
+
3470
+ 管理开发阶段的代码评审问题(架构、规范、逻辑),按计划阶段组织。与 Bug 追踪分离。
3471
+
3472
+ **角色分工:**
3473
+ - **openfeel-reviewer**:根据计划阶段审查代码,提交问题,验收修复结果。
3474
+ - **openfeel-executor**:处理审查问题,修改代码并标记状态。
3475
+
3476
+ 每个计划阶段的审查问题集中在 \`REV-{plan_stage}.md\`。条目模板:
3477
+
3478
+ \`\`\`markdown
3479
+ ## REV-{NO}: {简要标题}
3480
+ - **状态**:pending | fixing | resolved | closed
3481
+ - **优先级**:high | medium | low
3482
+ - **提出人**:openfeel-reviewer
3483
+ - **提出时间**:yyyy-mm-dd HH:MM
3484
+
3485
+ ### 问题描述
3486
+ ...
3487
+
3488
+ ### 处理记录
3489
+ | 时间 | 操作者 | 说明 | Commit |
3490
+ |------|--------|------|--------|
3491
+
3492
+ ### 验收记录
3493
+ | 时间 | 验收人 | 结论 | 备注 |
3494
+ |------|--------|------|------|
3495
+ \`\`\`
3496
+
3497
+ 根目录维护 \`index.md\`(按阶段分组索引,顶部统计各状态数量)和 \`log.md\`(最近 30 条审查变更摘要)。
3498
+
3499
+ 审查问题标记为 \`pending\` 时,若优先级为 \`high\`,须将问题详情(标题、描述、影响范围)写入公共日志,确保团队及时可见。条目 \`closed\` 时,核心结论写入 \`.openfeel/code_review/{stage}.md\`,并在公共日志简要记录。
3500
+
3501
+ #### Bug 追踪
3502
+
3503
+ > .openfeel/users/{username}/bugs/
3504
+
3505
+ 管理测试阶段发现的缺陷,按模块组织。与代码审查分离。
3506
+
3507
+ **角色分工:**
3508
+ - **openfeel-feel-tester**:提交 Bug 和最终验收。
3509
+ - **openfeel-executor**:按模块分工修复,会话启动时通过 \`load skill openfeel-get-bugs\` 获取负责模块的待处理 Bug。
3510
+
3511
+ Bug 按模块子目录组织,每个模块目录下 Bug 命名 \`BUG-{NNN}_{简略标题}.md\`(NNN 模块内递增):
3512
+
3513
+ \`\`\`
3514
+ .openfeel/users/{username}/bugs/
3515
+ ├── index.md # 按模块分组索引(### {模块名} @{负责Agent名})
3516
+ ├── log.md # 最近 30 条变更摘要
3517
+ ├── {module_a}/
3518
+ │ ├── BUG-001_标题.md
3519
+ │ └── BUG-002_标题.md
3520
+ └── {module_b}/
3521
+ └── BUG-001_标题.md
3522
+ \`\`\`
3523
+
3524
+ Bug 标记为 \`open\` 时,若优先级为 \`high\`,须将缺陷详情(标题、描述、复现步骤、影响模块)写入公共日志,确保团队及时可见。条目 \`closed\` 时,核心结论写入 \`.openfeel/bugs/{module}.md\`,并在公共日志简要记录。
3525
+
3526
+ #### 审查/追踪 生命周期
3527
+
3528
+ 两者共用同一状态流转模型(仅起始状态名不同):
3529
+
3530
+ \`\`\`
3531
+ pending/open ──→ fixing ──→ resolved ──→ closed
3532
+ ↑ │
3533
+ └────────── 验收不通过 ───┘
3534
+ \`\`\`
3535
+
3536
+ | 状态 | 代码审查 | Bug 追踪 | 操作者 |
3537
+ |------|---------|---------|--------|
3538
+ | 起始 | \`pending\` | \`open\` | openfeel-reviewer / openfeel-feel-tester 提交 |
3539
+ | 修复中 | \`fixing\` | \`fixing\` | openfeel-executor 承接 |
3540
+ | 待验收 | \`resolved\` | \`resolved\` | openfeel-executor 完成 |
3541
+ | 关闭 | \`closed\` | \`closed\` | openfeel-reviewer / openfeel-feel-tester 验收通过 |
3542
+
3543
+ #### 个人临时目录
3544
+
3545
+ > .openfeel/users/{username}/tmp/
3546
+
3547
+ 存放当前用户的临时文件,与其他用户完全隔离。
2947
3548
  `
2948
3549
  };
2949
3550
  // AUTO-GENERATED-END: AGENTS_MD_TEMPLATES
@@ -2970,17 +3571,11 @@ export function listAgentIds(lang) {
2970
3571
  return Object.keys(langData);
2971
3572
  }
2972
3573
  export function loadTemplate(lang, templateName) {
2973
- const map = templateName === 'core-instructions'
2974
- ? CORE_INSTRUCTIONS_TEMPLATES
2975
- : AGENTS_MD_TEMPLATES;
2976
- const raw = map[lang] ?? map['zh-CN'];
2977
- // [FIX] REV-004:空值检查在 B64 解码前,避免 TypeError
3574
+ const raw = AGENTS_MD_TEMPLATES[lang] ?? AGENTS_MD_TEMPLATES['zh-CN'];
3575
+ // 空值检查:指定语言与回退语言均缺失时抛出
2978
3576
  if (raw === undefined) {
2979
3577
  throw new Error(`Template not found: name=${templateName} (lang=${lang})`);
2980
3578
  }
2981
- if (templateName === 'core-instructions') {
2982
- return Buffer.from(raw, 'base64').toString('utf-8');
2983
- }
2984
3579
  return raw;
2985
3580
  }
2986
3581
  // AUTO-GENERATED-BEGIN: OPENCODE_AGENT_TEMPLATES
@@ -3132,6 +3727,16 @@ Feel's primary reasoning model **may not support image/multimodal input**. When
3132
3727
 
3133
3728
  > If the primary model itself supports multimodal input, delegation is unnecessary. This rule triggers only when the primary model cannot process images.
3134
3729
 
3730
+ ## Auto-Setup .openfeel/ for Blank Projects (Feel only)
3731
+
3732
+ When starting a session in a **blank project** (no \`.openfeel/\` directory at the project root), Feel should automatically set up the full workspace:
3733
+
3734
+ 1. Check whether the \`.openfeel/\` directory exists at the project root; if it exists, skip (not a blank project).
3735
+ 2. If \`.openfeel/\` is absent, run \`openfeel init --workspace-only\` (a non-interactive lightweight subcommand) to create the \`.openfeel/\` directory structure + config.yaml + flow.json + .info.json + dev/kb skeleton.
3736
+ 3. This rule is triggered by **Feel only**; non-Feel agents (openfeel-planner/schemer/executor, etc.) **must not trigger** it — they only run inside an already-set-up workspace and never set it up themselves.
3737
+
3738
+ > Note: \`--workspace-only\` does **not** create AGENTS.md / opencode.jsonc; the framework constraints are carried by the global \`~/.config/opencode/AGENTS.md\` (see the global AGENTS.md).
3739
+
3135
3740
  ## Model Configuration
3136
3741
 
3137
3742
  ### Configure based on available models at init time
@@ -3938,7 +4543,7 @@ openfeel-planner is driven by a **reasoning model** (such as DeepSeek V4 Pro). I
3938
4543
  'openfeel-reviewer': `---
3939
4544
  description: openfeel-reviewer Agent, heterogenous reasoning model, responsible for cross-reviewing plans/schemes/code.
3940
4545
  mode: subagent
3941
- model: zhipuai/glm-5.2
4546
+ model: zhipuai/glm-5.3-flash
3942
4547
  reasoning_effort: medium
3943
4548
  color: "#D4A017"
3944
4549
  permission:
@@ -4449,6 +5054,16 @@ Feel 的主力推理模型**可能不支持图片/多模态输入**。当用户
4449
5054
 
4450
5055
  > 若当前主模型本身支持多模态则无需委派。此规则仅在主模型无法处理图片时触发。
4451
5056
 
5057
+ ## 空白项目自动搭建 .openfeel/(仅 Feel 触发)
5058
+
5059
+ 在**空白项目**(项目根无 \`.openfeel/\` 目录)启动会话时,Feel 应自动搭建完整工作区:
5060
+
5061
+ 1. 检测项目根是否存在 \`.openfeel/\` 目录;存在则跳过(非空白项目)。
5062
+ 2. 无 \`.openfeel/\` 时运行 \`openfeel init --workspace-only\`(非交互轻量子命令),创建 \`.openfeel/\` 目录结构 + config.yaml + flow.json + .info.json + dev/kb 骨架。
5063
+ 3. 本规则**仅 Feel 触发**;非 feel agent(openfeel-planner/schemer/executor 等)**不触发**——它们仅在已搭建的工作区内运行,不自行搭建。
5064
+
5065
+ > 注意:\`--workspace-only\` **不建** AGENTS.md / opencode.jsonc;框架约束由全局 \`~/.config/opencode/AGENTS.md\` 承载(见全局 AGENTS.md)。
5066
+
4452
5067
  ## 模型配置
4453
5068
 
4454
5069
  ### 初始化时按可用模型调配
@@ -5254,7 +5869,7 @@ openfeel-planner 由**推理模型**(如 DeepSeek V4 Pro)驱动。在 Feel
5254
5869
  'openfeel-reviewer': `---
5255
5870
  description: openfeel-reviewer 审查官 Agent,异种推理模型,负责交叉审查计划/方案/代码。
5256
5871
  mode: subagent
5257
- model: zhipuai/glm-5.2
5872
+ model: zhipuai/glm-5.3-flash
5258
5873
  reasoning_effort: medium
5259
5874
  color: "#D4A017"
5260
5875
  permission:
@@ -6587,6 +7202,40 @@ description: 聚合所有成员的任务进度视图,供任意 Agent 快速了
6587
7202
 
6588
7203
  格式化后的 Markdown 进度摘要,不含文件修改。
6589
7204
 
7205
+ `,
7206
+ 'openfeel-tool-usage': `---
7207
+ name: openfeel-tool-usage
7208
+ description: Agent 工具使用规范(todowrite/question/task/skill 四工具触发条件、使用要求、禁止行为 + 优先级表)。
7209
+ ---
7210
+
7211
+ # Agent 工具使用规范
7212
+
7213
+ ## 输入
7214
+
7215
+ 无
7216
+
7217
+ ## 执行步骤
7218
+
7219
+ ### 1. todowrite — 任务列表管理
7220
+ 触发条件(任一即用):≥3 独立步骤 / 多任务下达 / 跨文件修改。使用要求:执行前创建、单条 in_progress、完成即标 completed、新步骤追加末尾。
7221
+
7222
+ ### 2. question — 向用户提问
7223
+ 触发条件(任一必问):需求歧义 / 技术方案 ≥2 同等合理 / 不可逆后果 / 架构决策。使用要求:(Recommended) 标记、选项附后果、≤3 选项、高风险含"取消"。禁止:模糊时自行假设、多方案不选直接实施。
7224
+
7225
+ ### 3. task — 子 Agent 调度
7226
+ 触发条件:并行探索多代码区 / 复杂多步委托 general / 下游 Agent(经 Feel)。使用要求:并行一条消息多 task、prompt 含任务描述+期望返回、明确只读/可写。
7227
+
7228
+ ### 4. skill — 技能加载
7229
+ 触发条件:查阶段状态→openfeel-get-stage-status / 查知识库→openfeel-check-kb / 取 Bug→openfeel-get-bugs。使用要求:会话开始载 check-kb、处理阶段任务前载 get-stage-status、不凭记忆跳过。
7230
+
7231
+ ### 5. 工具使用优先级
7232
+ | 场景 | 优先工具 | 禁止做法 |
7233
+ |------|---------|----------|
7234
+ | 多步骤任务 | todowrite | 凭记忆逐条执行 |
7235
+ | 需求不明确 | question | 自行假设后动手 |
7236
+ | 探索代码 | task(explore) | 手动逐个 grep/read |
7237
+ | 获取状态 | skill(openfeel-get-stage-status) | 凭记忆推断 |
7238
+ | 批量文件操作 | task(general) | 串行逐个处理 |
6590
7239
  `,
6591
7240
  'openfeel-update-stage-status': `---
6592
7241
  name: openfeel-update-stage-status
@@ -6730,24 +7379,54 @@ description: 交互式流水线向导,供 Agent 在终端中逐步推进流水
6730
7379
  向导推进结果:阶段 phase 变化(from → to),结束/退出提示
6731
7380
 
6732
7381
  > 注:需交互式终端(TTY),非交互环境请改用 \`openfeel flow advance --stage <id> --to <phase>\`
7382
+ `,
7383
+ 'openfeel-workspace': `---
7384
+ name: openfeel-workspace
7385
+ description: 会话启动时检查并补齐 .openfeel/ 工作区目录结构与空文件的标准化操作步骤(mkdir 哪些目录、创建哪些空文件、读 .info.json 取用户名)。
7386
+ ---
7387
+
7388
+ # 工作区启动自检
7389
+
7390
+ ## 输入
7391
+
7392
+ 无(自动按 .openfeel/.info.json 与 ~/.openfeel/update_infos.md 推断)
7393
+
7394
+ ## 执行步骤
7395
+
7396
+ ### 1. 读取用户名
7397
+ 读 \`.openfeel/.info.json\` 的 \`user\` 字段;缺失则 \`git config user.name\`。
7398
+
7399
+ ### 2. 检查公共域目录(缺失则 mkdir -p)
7400
+ \`.openfeel/dev/note/\`、\`.openfeel/log/\`、\`.openfeel/code_review/\`、\`.openfeel/bugs/\`、\`.openfeel/plan/\`、\`.openfeel/kb/\`、\`.openfeel/tmp/\`
7401
+
7402
+ ### 3. 检查公共域文件(缺失则创建空文件)
7403
+ \`.openfeel/dev/dev_core.md\`、\`.openfeel/dev/current.md\`、\`.openfeel/dev/decisions.md\`、\`.openfeel/kb/index.md\`
7404
+
7405
+ ### 4. 检查私域目录(基于 {username})
7406
+ \`.openfeel/users/{username}/log/\`、\`note/\`、\`code_review/\`、\`bugs/\`、\`tmp/\`
7407
+
7408
+ ### 5. 检查私域文件
7409
+ \`.openfeel/users/{username}/dev_last.md\`
7410
+
7411
+ ### 6. 增量更新复核
7412
+ 检查 \`~/.openfeel/update_infos.md\`,若存在未修复条目(追加/异常),提醒用户重启会话或委托 Feel 处理;本 Agent 不自行修改该文件。
7413
+
7414
+ > 目录结构语义、公共/私域分区、用户身份约束、路径自校验规则见全局 AGENTS.md(约束);本 skill 仅承载操作步骤。
6733
7415
  `,
6734
7416
  };
6735
7417
  // AUTO-GENERATED-END: OPENCODE_SKILL_DEFINITIONS
6736
7418
  // AUTO-GENERATED-BEGIN: OPENCODE_CONFIG_TEMPLATES
6737
7419
  const OPENCODE_CONFIG_TEMPLATES = {
6738
7420
  'zh-CN': {
6739
- instructions: 'IyAub3BlbmZlZWwg5bel5L2c5Yy65pON5L2c6KeE6IyDCgo+IOmhueebruawuOS5heaAp+ihjOS4uue6puadn+S4jue8lueggeinhOiMg+ingemhueebruagueebruW9lSBgQUdFTlRTLm1kYOOAguacrOaWh+S7tuaPj+i/sCBgLm9wZW5mZWVsL2Ag5bel5L2c5Yy655qE5YW35L2T5pON5L2c6KeE5YiZ44CCCgrlnKjmr4/mrKHlr7nor53lkK/liqjml7bvvIzmo4Dmn6Xpobnnm67ot6/lvoTkuIvnmoQgLm9wZW5mZWVsIOebruW9leWPiuWFtuWGheWuueOAguivpeebruW9leaYr+ehruS/neW8gOWPkeS4gOiHtOaAp+eahOWUr+S4gOaVsOaNrua6kO+8jOS9oOW/hemhu+e7tOaKpOWFtuWujOaVtOaAp+WSjOWHhuehruaAp+OAggoK5Zyo5Lya6K+d5Lit5bqU5Li75Yqo5L2/55So5bmz5Y+w5YaF572u5bel5YW377yI5aaC5o+Q6Zeu44CBVE9ETyDliJfooajvvInvvIzkuI3lvpfku4Xlh63lr7nor53mlofmnKzlrozmiJDlpI3mnYLku7vliqHjgIIKCiMjIOS8muivneWQr+WKqOiHquajgAoK5q+P5qyh5Lya6K+d5ZCv5Yqo5pe277yMQWdlbnQg5b+F6aG76YCQ6aG55qOA5p+l5Lul5LiL55uu5b2V5ZKM5paH5Lu277yM57y65aSx5YiZ6Ieq5Yqo5Yib5bu677yaCgoqKuWFrOWFseWfn+ebruW9lSoq77yI5aaC5LiN5a2Y5Zyo5YiZIGBta2RpciAtcGDvvInvvJoKLSBgLm9wZW5mZWVsL2Rldi9ub3RlL2AKLSBgLm9wZW5mZWVsL2xvZy9gCi0gYC5vcGVuZmVlbC9jb2RlX3Jldmlldy9gCi0gYC5vcGVuZmVlbC9idWdzL2AKLSBgLm9wZW5mZWVsL3BsYW4vYAotIGAub3BlbmZlZWwva2IvYAotIGAub3BlbmZlZWwvdG1wL2AKCioq5YWs5YWx5Z+f5paH5Lu2KirvvIjlpoLkuI3lrZjlnKjliJnliJvlu7rnqbrmlofku7bvvInvvJoKLSBgLm9wZW5mZWVsL2Rldi9kZXZfY29yZS5tZGAKLSBgLm9wZW5mZWVsL2Rldi9jdXJyZW50Lm1kYAotIGAub3BlbmZlZWwvZGV2L2RlY2lzaW9ucy5tZGAKLSBgLm9wZW5mZWVsL2tiL2luZGV4Lm1kYAoKKirnp4Hln5/nm67lvZUqKu+8iOWfuuS6jiBgLm9wZW5mZWVsLy5pbmZvLmpzb25gIOiOt+WPlueahCBge3VzZXJuYW1lfWDvvInvvJoKLSBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vbG9nL2AKLSBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vbm90ZS9gCi0gYC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L2NvZGVfcmV2aWV3L2AKLSBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vYnVncy9gCi0gYC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L3RtcC9gCgoqKuengeWfn+aWh+S7tioq77yaCi0gYC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L2Rldl9sYXN0Lm1kYAoKKirlop7ph4/mm7TmlrDlpI3moLgqKu+8muajgOafpSBgfi8ub3BlbmZlZWwvdXBkYXRlX2luZm9zLm1kYO+8jOiLpeWtmOWcqOacquS/ruWkjeadoeebru+8iOi/veWKoC/lvILluLjvvInvvIwqKuaPkOmGkueUqOaIt+mHjeWQr+S8muivneaIluWnlOaJmCBGZWVsIOWkhOeQhioq77yb5pysIEFnZW50IOS4jeiHquihjOS/ruaUueivpeaWh+S7tuOAggoKIyMg6K6+6K6h5Y6f5YiZCgoub3BlbmZlZWwg55uu5b2V5YiG5Li6KirlhazlhbHln58qKuS4jioq56eB5Z+fKirkuKTpg6jliIbvvJoKLSDlhazlhbHln5/vvJrnm7TmjqXkvY3kuo4gYC5vcGVuZmVlbC9gIOS4i++8jOWtmOaUvumhueebrue6p+WFseS6q+WGheWuue+8iOaguOW/g+inhOWImeOAgeiuoeWIkuOAgeWboumYn+aXpeW/l+OAgeefpeivhuW6k+etie+8ie+8jOe6s+WFpeeJiOacrOeuoeeQhuOAggotIOengeWfn++8muS9jeS6jiBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vYCDkuIvvvIzlrZjmlL7kuKrkurrmk43kvZznirbmgIHjgIHml6Xlv5fjgIHnrJTorrDjgIHku6PnoIHlrqHmn6XjgIFCdWcg6L+96Liq562J77yM5Yqg5YWlIGAuZ2l0aWdub3JlYCDkuI3nurPlhaXniYjmnKznrqHnkIbjgIIKCuaJgOacieeUqOaIt++8iOWQq+WNleS6uumhueebru+8ieWdh+mBteW+quatpOWIhuWMuue7k+aehOOAggoKIyMgQWdlbnQg5bel5YW35L2/55So6KeE6IyDCgrmiYDmnIkgQWdlbnTvvIjlkKsgRmVlbOOAgW9wZW5mZWVsLXBsYW5uZXLjgIFvcGVuZmVlbC1zY2hlbWVy44CBb3BlbmZlZWwtZXhlY3V0b3LjgIFvcGVuZmVlbC1yZXZpZXdlcuOAgW9wZW5mZWVsLWZlZWwtdGVzdGVy44CBb3BlbmZlZWwtdmlzaW9u44CBb3BlbmZlZWwtYXJjaGl2ZXLvvInlnKjkvJror53kuK3lupTkuLvliqjkvb/nlKjlubPlj7DlhoXnva7lt6XlhbfvvIzkuI3lvpfku4Xlh63lr7nor53mlofmnKzlrozmiJDlpI3mnYLku7vliqHjgIIKCiMjIyAxLiB0b2Rvd3JpdGUg4oCUIOS7u+WKoeWIl+ihqOeuoeeQhgoKKirop6blj5HmnaHku7YqKu+8iOa7oei2s+S7u+S4gOWNs+S9v+eUqO+8ie+8mgotIOW9k+WJjeS7u+WKoeWMheWQqyAzIOS4quS7peS4iueLrOeri+atpemqpAotIOeUqOaIt+WQjOaXtuS4i+i+vuWkmuS4quS7u+WKoe+8iOe8luWPt+aIlumAl+WPt+WIhumalO+8iQotIOS7u+WKoea2ieWPiui3qOaWh+S7tuS/ruaUue+8jOmcgOi/vei4qui/m+W6pgoKKirkvb/nlKjopoHmsYIqKu+8mgotIOW8gOWni+aJp+ihjOWJjeWIm+W7uiB0b2RvIOWIl+ihqO+8jOavj+S4quatpemqpOS4gOadoQotIOWQjOS4gOaXtumXtOWPquacieS4gOadoSBgaW5fcHJvZ3Jlc3NgCi0g5a6M5oiQ5ZCO56uL5Y2z5qCH6K6wIGBjb21wbGV0ZWRg77yI5LiN562J5om55aSE55CG77yJCi0g5Lit6YCU5Y+R546w55qE5paw5q2l6aqk6L+95Yqg5Yiw5YiX6KGo5pyr5bC+CgoqKuekuuS+iyoq77yaCmBgYArnlKjmiLfvvJoi5L+u5aSNIGZsb3cuanNvbiDnmoTkuInkuKogQnVn77yM54S25ZCO6LeR5rWL6K+VIgrihpIg5Yib5bu6IHRvZG86IFvkv67lpI1CdWcxLCDkv67lpI1CdWcyLCDkv67lpI1CdWczLCDov5DooYzmtYvor5VdCmBgYAoKIyMjIDIuIHF1ZXN0aW9uIOKAlCDlkJHnlKjmiLfmj5Dpl64KCioq6Kem5Y+R5p2h5Lu2KirvvIjmu6HotrPku7vkuIDlv4Xpobvmj5Dpl67vvIznpoHmraLoh6rooYzlgYforr7vvInvvJoKLSDpnIDmsYLlrZjlnKjmrafkuYnmiJblpJrnp43lkIjnkIbop6Por7sKLSDmioDmnK/mlrnmoYjmnIkgMiDkuKrku6XkuIrlkIznrYnlkIjnkIbnmoTpgInmi6kKLSDmk43kvZzlj6/og73kuqfnlJ/kuI3lj6/pgIblkI7mnpzvvIjliKDpmaTmlofku7bjgIHopobnm5bphY3nva7jgIFmb3JjZSBwdXNoIOetie+8iQotIOa2ieWPiuaetuaehOWGs+etluaIluiuvuiuoeaWueWQkemAieaLqQoKKirkvb/nlKjopoHmsYIqKu+8mgotIOmAiemhueS7pSAiKFJlY29tbWVuZGVkKSIg5qCH6K6w5o6o6I2Q5pa55qGICi0g5q+P5Liq6YCJ6aG56ZmE5bim5LiA5Y+l6K+d6K+05piO5YW25ZCO5p6cCi0g566A5Y2V56Gu6K6k5Z6L6Zeu6aKY5LiN6LaF6L+HIDMg5Liq6YCJ6aG5Ci0g57Sn5oCl5oiW6auY6aOO6Zmp5pON5L2c5b+F6aG75YyF5ZCrIuWPlua2iCLpgInpobkKCioq56aB5q2i6KGM5Li6KirvvJoKLSDpnIDmsYLmqKHns4rml7boh6rooYzlgYforr7lkI7nm7TmjqXmiafooYwKLSDlpJrnp43mlrnmoYjml7bmnKrnu4/nlKjmiLfpgInmi6nnm7TmjqXlrp7mlr0KLSDku6Ui5Y+v6IO9IiLkuZ/orrgi5byA5aS05L2G5LiN5o+Q6Zeu55u05o6l5Yqo5omLCgojIyMgMy4gdGFzayDigJQg5a2QIEFnZW50IOiwg+W6pgoKKirop6blj5HmnaHku7YqKu+8mgotIOmcgOW5tuihjOaOoue0ouWkmuS4quS7o+eggeWMuuWfn++8iOWQr+WKqCAyfjMg5LiqIGV4cGxvcmUgYWdlbnTvvIkKLSDlpI3mnYLlpJrmraXpqqTku7vliqHpnIDlp5TmiZjnu5kgZ2VuZXJhbCBhZ2VudAotIOWkjeadguS7u+WKoemcgOWnlOaJmOe7meS4i+a4uCBBZ2VudO+8iOmAmui/hyBGZWVsIOaAu+e7n+mihuiwg+W6pu+8iQoKKirkvb/nlKjopoHmsYIqKu+8mgotIOW5tuihjOS7u+WKoeeUqOS4gOadoea2iOaBr+WPkeWHuuWkmuS4qiB0YXNrIOiwg+eUqAotIOavj+S4qiB0YXNrIOeahCBwcm9tcHQg5b+F6aG75YyF5ZCr77ya5YW35L2T5Lu75Yqh5o+P6L+wICsg5pyf5pyb6L+U5Zue55qE5L+h5oGvCi0g5piO56Gu5ZGK55+l5a2QIEFnZW50IOaYr+WPquivu+eglOeptui/mOaYr+WPr+WGmeS7o+eggQoKIyMjIDQuIHNraWxsIOKAlCDmioDog73liqDovb0KCioq6Kem5Y+R5p2h5Lu2KirvvJoKLSDpnIDopoHkuobop6PlvZPliY3pmLbmrrXnirbmgIEg4oaSIGBvcGVuZmVlbC1nZXQtc3RhZ2Utc3RhdHVzYAotIOmcgOimgeafpemYhemhueebruefpeivhuW6kyDihpIgYG9wZW5mZWVsLWNoZWNrLWtiYAotIOmcgOimgeiOt+WPliBCdWcg5YiX6KGoIOKGkiBgb3BlbmZlZWwtZ2V0LWJ1Z3NgCgoqKuS9v+eUqOimgeaxgioq77yaCi0g5Lya6K+d5byA5aeL5pe25Yqg6L29IGBvcGVuZmVlbC1jaGVjay1rYmAg6I635Y+W6aG555uu6IOM5pmvCi0g5aSE55CG6Zi25q615Lu75Yqh5YmN5Yqg6L29IGBvcGVuZmVlbC1nZXQtc3RhZ2Utc3RhdHVzYCDnoa7orqTmtYHnqIvnirbmgIEKLSDkuI3lvpfot7Pov4fmioDog73nm7TmjqXlh63orrDlv4bmk43kvZwKCiMjIyA1LiDlt6Xlhbfkvb/nlKjkvJjlhYjnuqcKCnwg5Zy65pmvIHwg5LyY5YWI5bel5YW3IHwg56aB5q2i5YGa5rOVIHwKfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tLXwKfCDlpJrmraXpqqTku7vliqEgfCBgdG9kb3dyaXRlYCB8IOWHreiusOW/humAkOadoeaJp+ihjCB8Cnwg6ZyA5rGC5LiN5piO56GuIHwgYHF1ZXN0aW9uYCB8IOiHquihjOWBh+iuvuWQjuWKqOaJiyB8Cnwg5o6i57Si5Luj56CBIHwgYHRhc2soZXhwbG9yZSlgIHwg5omL5Yqo6YCQ5LiqIGdyZXAvcmVhZCB8Cnwg6I635Y+W54q25oCBIHwgYHNraWxsKG9wZW5mZWVsLWdldC1zdGFnZS1zdGF0dXMpYCB8IOWHreiusOW/huaOqOaWrSB8Cnwg5om56YeP5paH5Lu25pON5L2cIHwgYHRhc2soZ2VuZXJhbClgIHwg5Liy6KGM6YCQ5Liq5aSE55CGIHwKCiMjIOeUqOaIt+i6q+S7vQoKPiAub3BlbmZlZWwvLmluZm8uanNvbgoKYGBganNvbgp7ICJ1c2VyIjogInVzZXJuYW1lIiB9CmBgYAoK5q+P5qyh5a+56K+d5ZCv5Yqo5pe277yMQWdlbnQg6aaW5YWI6K+75Y+W5q2k5paH5Lu26I635Y+W5b2T5YmN55So5oi35ZCN44CC6Iul5paH5Lu25LiN5a2Y5Zyo5oiWIGB1c2VyYCDkuLrnqbrvvIzliJnoh6rliqjmiafooYwgYGdpdCBjb25maWcgdXNlci5uYW1lYCDojrflj5YgR2l0IOeUqOaIt+WQjeW5tuWGmeWFpeOAguiLpeaXoCBHaXQg6YWN572u5YiZ6YCJ5Y+W6buY6K6k55So5oi35ZCN44CC5q2k5paH5Lu25Yqg5YWlIGAuZ2l0aWdub3JlYCDkuI3nurPlhaXniYjmnKznrqHnkIbjgIIKCiMjIyDot6/lvoToh6rmoKHpqowKCuWkp+aooeWei+WcqOaehOmAoCBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vYCDot6/lvoTml7blj6/og73mhI/lpJbmiKrmlq3miJbkv67mlLnnlKjmiLflkI3vvIjlpoIgYEFsaWNlYCDihpIgYEFsaWNg77yJ77yM5a+86Ie05paH5Lu26K+75YaZ5aSx6LSl44CC6K6/6Zeu5Lu75L2VIGAub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS9gIOS4i+eahOaWh+S7tuaXtu+8jOW/hemhu+mBteW+quS7peS4i+iHquagoemqjOinhOWIme+8mgoKMS4gKirorr/pl67lpLHotKXnq4vljbPmoKHpqowqKu+8mmByZWFkYOOAgWBnbG9iYCDmk43kvZzov5Tlm54gImZpbGUgbm90IGZvdW5kIiDmiJYgIm5vIHN1Y2ggZmlsZSIg5pe277yM5LiN6KaB55u05o6l5oql6ZSZ44CC5YWI5omn6KGMIGByZWFkIC5vcGVuZmVlbC8uaW5mby5qc29uYCDph43mlrDojrflj5bmraPnoa7nmoQgYHVzZXJuYW1lYOOAggoyLiAqKuavlOWvueW5tuS/ruatoyoq77ya5bCG5b2T5YmN5L2/55So55qEIGB1c2VybmFtZWAg5LiOIGAub3BlbmZlZWwvLmluZm8uanNvbmAg5Lit55qE5YC86YCQ5a2X56ym5q+U5a+544CC6Iul5LiN5LiA6Ie077yM55So5q2j56Gu5YC86YeN5bu65a6M5pW06Lev5b6E5ZCO6YeN6K+V44CCCjMuICoq6L+e57ut5aSx6LSl5LiK5oqlKirvvJrph43or5Xku43lpLHotKXml7bvvIzlkJHnlKjmiLfmiqXlkYrjgIzot6/lvoQgYHvlpLHotKXnmoTot6/lvoR9YCDkuI3lrZjlnKjvvIzlt7Lnoa7orqTnlKjmiLflkI3kuLogYHvmraPnoa7nlKjmiLflkI19YOOAje+8jOeUseeUqOaIt+ehruiupOWQjuWGjeaTjeS9nOOAggoK5q2k6KeE5YiZ6YCC55So5LqO5omA5pyJIEFnZW5077yIRmVlbCAvIG9wZW5mZWVsLXBsYW5uZXIgLyBvcGVuZmVlbC1zY2hlbWVyIC8gb3BlbmZlZWwtZXhlY3V0b3IgLyBvcGVuZmVlbC1yZXZpZXdlciAvIG9wZW5mZWVsLWZlZWwtdGVzdGVyIC8gb3BlbmZlZWwtdmlzaW9uIC8gb3BlbmZlZWwtYXJjaGl2ZXLvvInjgIIKCi0tLQoKIyMg5YWs5YWx5Z+fCgojIyMg5byA5Y+R55uu5b2VCgo+IC5vcGVuZmVlbC9kZXYKCuWtmOaUvumhueebruWFseS6q+eahOaguOW/g+inhOWImeS4jui/m+W6pueKtuaAgeOAggoKPiAub3BlbmZlZWwvZGV2L2Rldl9jb3JlLm1kCgrlrZjmlL7plb/mnJ/mnInmlYjop4TliJnjgILkvJjlhYjnuqfvvJrnlKjmiLfmjIfku6QgPiDmnKzmlofku7YgPiDkvJror53kuLTml7bmj5DnpLrjgILmr4/mnaHop4TliJnliY3luKYgYFsrXWDvvIjlkK/nlKjvvIkvIGBbLV1g77yI56aB55So77yJ77yM5Y+q6IO95qCH6K6w56aB55So5LiN6IO95Yig6Zmk77yM56aB55So6LaFIDEwIOadoeaXtuaPkOmGkueUqOaIt+a4heeQhuOAggoKPiAub3BlbmZlZWwvZGV2L2N1cnJlbnQubWQKCuiusOW9leW9k+WJjeato+WcqOi/m+ihjOeahOW3peS9nO+8jOaMiSBgQHt1c2VybmFtZX0g5o+P6L+w5q2j5Zyo6L+b6KGM55qE5bel5L2cYCDojIPlvI/nu7TmiqTlkITmiJDlkZjov5vluqbvvIzpobbpg6jnu7TmiqTmgLvov5vluqbnirbmgIHjgIIKCj4gLm9wZW5mZWVsL2Rldi9ub3RlL2Rldl9ub3RlLm1kCgrlm6LpmJ/lhbHkuqvlvIDlj5HnrJTorrDvvIzlhoXlrrnmnaXmupDkuo7miJDlkZjkuKrkurrnrJTorrDnmoTlvZLlhaXmj5DkuqTvvIjop4Hnp4Hln58gPiDkuKrkurrnrJTorrDvvInjgILnroDopoHmj4/ov7DvvIzor6bmg4XmlL7lhaXlrZDmlofku7blubblu7rnq4vntKLlvJXjgIIKCiMjIyDml6Xlv5fnm67lvZUKCj4gLm9wZW5mZWVsL2xvZwoK5YWs5YWx5pel5b+X55uu5b2V77yMKirku4XorrDlvZXlm6LpmJ/nuqfph43opoHkuovku7YqKu+8iOa7oei2s+S7u+S4gOWNs+iusOW9le+8ie+8mgotIOWFrOWFseWfn+aWh+S7tueahOWIm+W7uuaIlumHjeimgeS/ruaUuQotIOi3qOaIkOWRmOWNj+S9nOWFs+mUruaTjeS9nO+8iOWFrOWFseeslOiusOW9kuWFpeOAgeiuoeWIkuiwg+aVtOetie+8iQotIOiuoeWIkumHjOeoi+eikei+vuaIkOaIlumHjeWkp+WBj+W3rgotIOengeWfn+S7o+eggeWuoeafpeaIliBCdWcg55qE5Lil6YeN6Zeu6aKY77yIaGlnaCDkvJjlhYjnuqfvvIzpppbmrKHlj5HnjrDml7bkuIrmiqXor6bmg4XvvIkKLSDlvbHlk43lpJrkurrnmoTlvILluLjkuovku7YKCuaXpeW4uOaTjeS9nO+8iOW4uOinhOS7o+eggeS/ruaUueOAgeS4quS6uuiuoeWIkuaOqOi/m+OAgeiwg+ivleOAgeS4quS6uueslOiusO+8ieiusOW9leWcqOengeWfn+aXpeW/l+OAggoK5pel5b+X5oyJ5bm0L+aciC/ml6XliIblsYLlvZLmoaPvvIzml6Xnm67lvZXku4XlnKjlvZPlpKnmnInph43opoHkuovku7bml7bliJvlu7rjgILmlofku7blkb3lkI0gYHl5eXktbW0tZGQte3VzZXJuYW1lfS1OTk4ubWRg77yM5pel55uu5b2V5ZCrIGBkYXlfaW5kZXgubWRg44CC5qC555uu5b2V57u05oqkIGBpbmRleC5tZGDvvIjml6XmnJ/ntKLlvJXvvInlkowgYGxvZy5tZGDvvIjmnIDov5EgMzAg5p2h5pGY6KaB77yM5qC85byPIGBb5paH5Lu25ZCNXSB7dXNlcm5hbWV9OiDmj4/ov7Bg77yM5ZCr6Lez6L2s6ZO+5o6l77yJ44CCCgojIyMg5Luj56CB5a6h5p+l55uu5b2VCgo+IC5vcGVuZmVlbC9jb2RlX3JldmlldwoK5YWs5YWx5Luj56CB5a6h5p+l55uu5b2V77yM5a2Y5pS+56eB5Z+f5a6h5p+l5a6M5oiQ5ZCO55qE5qC45b+D57uT6K665pGY6KaB44CC57qz5YWl54mI5pys566h55CG77yM5L6b5Zui6Zif5p+l6ZiF44CCCgrmjInorqHliJLpmLbmrrXnu4Tnu4fvvIzkuI7np4Hln5/lrqHmn6Xnm67lvZXlr7nlupTjgILmoLnnm67lvZXnu7TmiqQgYGluZGV4Lm1kYO+8iOaMiemYtuauteWIhue7hOe0ouW8le+8jOmhtumDqOe7n+iuoeWQhOeKtuaAgeaVsOmHj++8ieOAguavj+S4qumYtuauteeahOW/g+W+l+W7uuiuruaAu+e7k+WcqCBge3N0YWdlfS5tZGAg5Lit77yM5YW35L2T55qE5a6h5p+l6L+H56iL5LiO5q+P5Liq5o+Q5Lqk54K555qE6K+m57uG5a6h5p+l5YaF5a655YiZ5L+d5a2Y5Zyo56eB5Z+fIGBjb2RlX3Jldmlldy9SRVYte3N0YWdlfS5tZGAg5Lit44CCCgojIyMgQnVnIOi/vei4quebruW9lQoKPiAub3BlbmZlZWwvYnVncwoK5YWs5YWxIEJ1ZyDov73ouKrnm67lvZXvvIzlrZjmlL7np4Hln58gQnVnIOWFs+mXreWQjueahOaguOW/g+e7k+iuuuaRmOimgeOAgue6s+WFpeeJiOacrOeuoeeQhu+8jOS+m+WboumYn+afpemYheOAggoK5oyJ5qih5Z2X57uE57uH77yM5LiO56eB5Z+fIEJ1ZyDnm67lvZXlr7nlupTjgILmoLnnm67lvZXnu7TmiqQgYGluZGV4Lm1kYO+8iOaMieaooeWdl+WIhue7hOe0ouW8le+8ieOAguavj+S4quaooeWdl+eahCBCdWcg6Kej5Yaz5b+D5b6X5ZKM5qC55Zug5YiG5p6Q5b2S5qGj5ZyoIGB7bW9kdWxlfS5tZGAg5Lit77yM5YW35L2T55qEIEJ1ZyDmiqXlkYrjgIHlpI3njrDmraXpqqTlkozpqozmlLbor6bmg4XliJnkv53lrZjlnKjnp4Hln58gYGJ1Z3Mve21vZHVsZX0vYCDkuK3jgIIKCiMjIyDorqHliJLnm67lvZUKCj4gLm9wZW5mZWVsL3BsYW4KCioq6Ieq5Yqo6K6h5YiS5YyWKirvvJrlvZPnlKjmiLfmj5Dlh7rljIXlkKvku6XkuIvnibnlvoHnmoTku7vliqHml7bvvIxBZ2VudCDlupTkuLvliqjlnKggYHBsYW4ubWRgIOS4reWIm+W7uuWvueW6lOadoeebruaIluabtOaWsCBgY3VycmVudC5tZGDvvIzml6DpnIDnrYnlvoXnlKjmiLfmiYvliqjop6blj5HvvJoKLSDmtonlj4rlpJrmraXpqqTmk43kvZwKLSDpnIDopoHot6jkvJror53ot5/ouKrov5vluqYKLSDlj6/og73lvbHlk43lpJrkuKrmqKHlnZfmiJbmlofku7YKCuiuoeWIkuWIhuS4pOWxgu+8mgotICoq5aSn6K6h5YiSKirvvIhgcGxhbi5tZGDvvInvvJrmlbTkvZPnm67moIfjgIHmioDmnK/mnrbmnoTjgIHmoLjlv4Pph4znqIvnopHjgILmm7TmlLnpobvnu4/lm6LpmJ/msp/pgJrnoa7orqTjgIIKLSAqKuWwj+iuoeWIkioq77yIYHtzdGFnZX0vYCDlrZDnm67lvZXvvInvvJrlhbfkvZPku7vliqHliIbop6PkuI7lrp7mlr3mraXpqqTjgILml6XluLjkv67mlLnlkozmjqjov5vlnKjmraTlsYLov5vooYzjgIIKCuiLpeiuoeWIkuS4jeWtmOWcqOWImeagueaNrueUqOaIt+aMh+S7pOWIm+W7uuOAguWkp+iuoeWIkuabtOaUuemhu+eUqOaIt+ehruiupO+8jOWwj+iuoeWIkuiwg+aVtOWPr+eUsSBBZ2VudCDoh6rkuLvlrozmiJDkvYbpobvorrDlvZXjgIIKCuiuoeWIkue0ouW8leaMieWkp+eJiOacrOezu+WIl+e7hOe7h++8mmBwbGFuL2luZGV4Lm1kYCDkuLrpobblsYLntKLlvJXvvIxgcGxhbi92NC9pbmRleC5tZGDjgIFgcGxhbi92NS9pbmRleC5tZGAg562J57O75YiX57Si5byV5a2Y5pS+5ZCE5pyf6K6h5YiS5qC45b+D5pGY6KaB44CCYHBsYW5fbG9nLm1kYCDorrDlvZXmnIDov5EgMzAg5p2h5Y+Y5pu05pGY6KaB77yM5qC85byPIGB7dXNlcm5hbWV9OiDlj5jmm7Tmj4/ov7Bg77yM5ZCr6Lez6L2s6ZO+5o6l44CCCgrlj5HnlJ/orqHliJLlpJbmk43kvZzmiJblgY/lt67ml7bvvIzlv4XpobvlhYjlkJHnlKjmiLfor7TmmI7lubblr7vmsYLnoa7orqTvvIzlkIzml7blnKjml6Xlv5fkuK3orrDlvZXjgIIKCiMjIyMg5rWB5rC057q/5o6o6L+bCgrlkITpmLbmrrXnirbmgIHnlLEgYGZsb3cuanNvbmAg5ZKMIGBzdGF0dXMubWRgIOiBlOWQiOeuoeeQhuOAgkZlZWwgQWdlbnQg6K+75Y+WIGZsb3cuanNvbiDliKTmlq3lvZPliY3pmLbmrrXlkowgcGhhc2XvvIzpgJrov4cgYG9wZW5mZWVsIGZsb3dgIOWRveS7pOaOqOi/m+a1geawtOe6v++8mgoKLSBgb3BlbmZlZWwgZmxvdyBzdGF0dXNgIOKAlCDmn6XnnIvlvZPliY3mtYHmsLTnur/nirbmgIEKLSBgb3BlbmZlZWwgZmxvdyBhZHZhbmNlYCDigJQg5o6o6L+b5Yiw5LiL5LiA6Zi25q61Ci0gYG9wZW5mZWVsIGZsb3cgcmVwYWlyYCDigJQg5L+u5aSN5rWB5rC057q/54q25oCBCgrmtYHmsLTnur8gcGhhc2Ug5p6a5Li+77yIZmxvdy5qc29uIFBpcGVsaW5lUGhhc2XvvInvvJoKcGxhbl9wZW5kaW5nIOKGkiBwbGFuX3JldmlldyDihpIgcGxhbl9wYXNzZWQg4oaSIHNjaGVtZV9wZW5kaW5nIOKGkiBzY2hlbWVfcmV2aWV3IOKGkiBzY2hlbWVfcGFzc2VkIOKGkiBleGVjX3J1bm5pbmcg4oaSIHJldmlld19wZW5kaW5nIOKGkiByZXZpZXdfZmFpbGVkIOKGkiByZXZpZXdfcGFzc2VkIOKGkiB0ZXN0X3BlbmRpbmcg4oaSIHRlc3RfZmFpbGVkIOKGkiB0ZXN0X3Bhc3NlZCDihpIgYXJjaGl2aW5nIOKGkiBkb25lCgrkurrlt6XmtYHnqIvkuLrpu5jorqTmqKHlvI/jgIJGZWVsIOagueaNriBmbG93Lmpzb24g54q25oCB6LCD5bqm5LiL5ri4IEFnZW5077yIb3BlbmZlZWwtcGxhbm5lciAvIG9wZW5mZWVsLXNjaGVtZXIgLyBvcGVuZmVlbC1leGVjdXRvciAvIG9wZW5mZWVsLXJldmlld2VyIC8gb3BlbmZlZWwtZmVlbC10ZXN0ZXIgLyBvcGVuZmVlbC12aXNpb24gLyBvcGVuZmVlbC1hcmNoaXZlcu+8ie+8jOS4jeS+nei1luaXp+W8j+iHquWKqOWMluiwg+W6puOAggoK54q25oCB5Li6IGRvbmUg5oiWIHBhdXNlZCDml7bvvIzkuI3lvpfnu6fnu63oh6rliqjmjqjov5vjgILpgYfliLDorqHliJLlpJblj5jmm7TmiJbov57nu63lpLHotKXml7bvvIzlv4XpobvmmoLlgZzlubbnrYnlvoXnlKjmiLflhrPnrZbjgIIKCiMjIyDkuLTml7bnm67lvZUKCj4gLm9wZW5mZWVsL3RtcAoK5a2Y5pS+6aG555uu57qn5Li05pe25paH5Lu277yI5YWx5Lqr5pWw5o2u44CB5p6E5bu65Lqn54mp562J77yJ44CC5LuF5Zyo55So5oi35oyH5a6a5pe26K+75Y+W5YW25Lit5paH5Lu244CCCgojIyMg55+l6K+G5bqTCgo+IC5vcGVuZmVlbC9rYgoK6K6w5b2VIui/meS4qumhueebruaYr+S7gOS5iOagt+eahCLlkowi6YGH5Yiw6Zeu6aKY5oCO5LmI5YqeIu+8jOS4jue6puadn+S9k+ezu++8iOiusOW9lSLlupTor6XmgI7kuYjlgZoi77yJ5YiG56a744CCCgpgYGAKLm9wZW5mZWVsL2tiLwrilJzilIDilIAgaW5kZXgubWQgICAgICAgICAgICMg5oC757Si5byV77ya5YiG57G75qaC6KeI44CB5ZCE5paH5Lu25pGY6KaB44CB5pyA6L+R5pu05pawCuKUnOKUgOKUgCBhcmNoaXRlY3R1cmUubWQgICAgIyDmnrbmnoTlhrPnrZbjgIHorr7orqHnkIbnlLHjgIHmioDmnK/pgInlnosK4pSc4pSA4pSAIHBhdHRlcm5zLm1kICAgICAgICAjIOS7o+eggeaooeW8j+OAgemhueebrue6puWumuOAgeacgOS9s+Wunui3tQrilJzilIDilIAgdHJvdWJsZXNob290aW5nLm1kICMg5bi46KeB6Zeu6aKY44CB6LCD6K+V5rWB56iL44CB5bey55+l5Z2R5L2NCuKUlOKUgOKUgCBzZXR1cC5tZCAgICAgICAgICAgIyDnjq/looPmkK3lu7rjgIHmnoTlu7rmtYHnqIvjgIHkvp3otZbnrqHnkIYKYGBgCgrliIbnsbvmlbDph4/kuI3lgZrnoazmgKfpmZDliLbjgIJgaW5kZXgubWRgIOe7tOaKpOa4heaZsOaRmOimgeS+myBBZ2VudCDlv6vpgJ/lrprkvY3jgILmr4/kuKrliIbnsbvmlofku7bnmoQgYFsrXWAvYFstXWAg5qCH6K6w6KeE5YiZ5LiOIGBkZXZfY29yZS5tZGAg5LiA6Ie044CCCgoqKuWGmeWFpeinhOiMg++8mioqCgp8IOexu+WeiyB8IOWGmeWFpei3r+W+hCB8CnwtLS0tLS18LS0tLS0tLS0tLXwKfCDmnrbmnoTlhrPnrZbvvIjlpoIgT0F1dGgyICsgcmVmcmVzaCB0b2tlbiDmlrnmoYjvvIkgfCBgYXJjaGl0ZWN0dXJlLm1kYCB8Cnwg5Luj56CB5qih5byP77yI5aaC54q25oCB5py657uf5LiA55SoIFN3aXRjaCArIEVudW3vvIkgfCBgcGF0dGVybnMubWRgIHwKfCDmjpLmn6Xnu4/pqozvvIjlpoLmnoTlu7rmiqXplJnml7bnmoTlpITnkIbmraXpqqTvvIkgfCBgdHJvdWJsZXNob290aW5nLm1kYCB8Cnwg546v5aKD6YWN572u77yI5aaC54m55q6K57yW6K+R5rWB56iL77yJIHwgYHNldHVwLm1kYCB8Cnwg6aG555uu5YiG5p6Q5oql5ZGK77yI5rWL6K+V5aSN55uY44CB5rWB56iL5YiG5p6Q44CB6Zeu6aKY5oC757uT77yJIHwg6aG555uu5qC555uu5b2V5LiL55qEIGBkb2NzL3BoYXNlLXtOfS9gIHwKfCDlr7nkvZPns7vnmoTnkIbop6PvvIjkuI7pobnnm67liIbmnpDmiqXlkYrlkIznm67lvZXvvIkgfCDpobnnm67moLnnm67lvZXkuIvnmoQgYGRvY3MvcGhhc2Ute059L2AgfAoK56aB5q2i5YaZ5YWl55+l6K+G5bqT77ya6KGM5Li657qm5p2f77yI4oaSIEFHRU5UUy5tZO+8ieOAgeaTjeS9nOa1geeoi++8iOKGkiBJbnN0cnVjdGlvbnPvvInjgIHlt6XkvZzljLrnu7TmiqTop4TliJnvvIjihpIgZGV2X2NvcmUubWTvvInjgILmr4/mrKHlhpnlhaXlkI7lnKjlhazlhbHml6Xlv5fkuK3orrDlvZXjgIIKCiMjIyMg6Ieq5Yqo5YaZ5YWl5py65Yi2CgoqKuinpuWPkeaXtuacuioq77ya5q+P5qyh5Lya6K+d5Lit77yMQWdlbnQg5a6M5oiQ6Z2e5bmz5Yeh5Lu75Yqh5ZCO77yI5o6S6Zmk57qv5p+l6K+iL+Wvueivneexu+aTjeS9nO+8ie+8jOW6lOWcqOimhuebluWGmeWFpSBgZGV2X2xhc3QubWRgIOaXtuWwhuacrOS8muivneeahCoq5YWz6ZSu57uP6aqMKirmmoLlrZjlhbbkuK3jgIIKCioq57uP6aqM5pqC5a2Y5qC85byPKirvvIjlhpnlhaUgYGRldl9sYXN0Lm1kYO+8ie+8mgotIGAtIFsgXSBcYHvliIbnsbt9XGDvvJp757uP6aqM5o+P6L+wfWAg4oCUIOW+heeUqOaIt+ehruiupOW9kuWFpSBrYi8KCioq5b2S5qGj5rWB56iLKirvvJoKMS4gQWdlbnQg5Zyo5LiL5LiA5qyh5Lya6K+d5ZCv5Yqo5pe26K+75Y+WIGBkZXZfbGFzdC5tZGDvvIzoi6Xlj5HnjrDmnInmnKrlvZLmoaPnmoTnu4/pqozmnaHnm67vvIzmj5DphpLnlKjmiLfnoa7orqTjgIIKMi4g55So5oi356Gu6K6k5ZCO77yMQWdlbnQg5bCG57uP6aqM5YaZ5YWl5a+55bqUIGtiLyDliIbnsbvmlofku7bvvIhgYXJjaGl0ZWN0dXJlLm1kYCAvIGBwYXR0ZXJucy5tZGAgLyBgdHJvdWJsZXNob290aW5nLm1kYCAvIGBzZXR1cC5tZGDvvInjgIIKMy4g5YaZ5YWl5qC85byP77ya5q+P5Liq57uP6aqM5p2h55uu5LulIGAjIyBbK10ge+agh+mimH0gKHvml6XmnJ99KWAg5byA5aS077yM5ZCr5o+P6L+w5ZKM5LiK5LiL5paH44CCCjQuIOWGmeWFpeWQjuabtOaWsCBga2IvaW5kZXgubWRgIOeahOOAjOacgOi/keabtOaWsOOAjeihqOagvO+8jOW5tuWcqOWFrOWFseaXpeW/lyBgLm9wZW5mZWVsL2xvZy9gIOS4reiusOW9leOAggo1LiDmnIDlkI7lsIYgYGRldl9sYXN0Lm1kYCDkuK3nmoTnu4/pqozmnaHnm67moIforrDkuLogYFt4XWDvvIjlt7LlvZLmoaPvvInmiJbliKDpmaTjgIIKCioq6Ieq5Yqo5YaZ5YWl5Yik5pat5qCH5YeGKirvvIjmu6HotrPku7vkuIDljbPlhpnlhaXvvInvvJoKLSDop6PlhrPkuobkuIDkuKrmraTliY3mnKrnn6XnmoTmnoTlu7ov546v5aKD6Zeu6aKYCi0g5Y+R546w5bm26K6w5b2V5LqG5LiA5Liq5Luj56CB5qih5byPL+acgOS9s+Wunui3tQotIOWBmuS6huS4gOS4quW9seWTjeWQjue7reW8gOWPkeeahOaetuaehOWGs+etlgotIOmBh+WIsOS4gOS4quWAvOW+l+iusOW9leeahOWdkeS9jS/mjpLmn6Xnu4/pqowKCuatpOa1geeoi+ehruS/nSBBZ2VudCDnmoTnu4/pqozkuI3kvJrpmo/kvJror53kuKLlpLHvvIznn6Xor4blupPpmo/pobnnm67mjIHnu63lop7plb/jgIIKCi0tLQoKIyMg56eB5Z+fCgo+IC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9LwoK56eB5Z+f55uu5b2V77yMQWdlbnQg5q+P5qyh6YCa6L+HIGAub3BlbmZlZWwvLmluZm8uanNvbmAg6I635Y+W5b2T5YmN55So5oi35ZCN56Gu5a6a5a+55bqU6Lev5b6E44CC5Luj56CB5L+u5pS55ZCO6aG75ZCM5q2l5pu05paw56eB5Z+f5YaF55u45YWz5paH5Lu277yI6K6h5YiS44CB5pel5b+X44CB56yU6K6w562J77yJ77yM5L+d5oyB5LiO5a6e6ZmF54q25oCB5LiA6Ie044CCCgojIyMg5Liq5Lq65pON5L2c54q25oCBCgo+IC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L2Rldl9sYXN0Lm1kCgrorrDlvZXkuIrkuIDmrKHmk43kvZznu5PmnZ/ml7bnmoTnroDopoHnirbmgIHvvIzlr7nor53mnKvlsL7opobnm5blhpnlhaXjgILkuIvmrKHlkK/liqjml7blhYjor7vlj5bku6XmgaLlpI3kuIrkuIvmlofjgILoi6XlhoXlrrnkuI7lvZPliY3lr7nor53nn5vnm77liJnmoIforrAi5Y+v6IO96L+H5pyfIuW5tuWQkeeUqOaIt+ehruiupOOAggoKKirmqKHmnb8qKu+8mgpgYGBtYXJrZG93bgojIOS4iuasoeaTjeS9nOeKtuaAgQotIOaXtumXtDogeXl5eS1tbS1kZCBISDpNTQotIOmYtuautToge+W9k+WJjeiuoeWIkumYtuautX0KLSDmk43kvZw6IHvkuIDlj6Xor53mj4/ov7DkuIrmrKHmk43kvZx9Ci0g5paH5Lu2OiB75paw5aKe5oiW5L+u5pS555qE5YWz6ZSu5paH5Lu25YiX6KGofQotIOW9k+WJjeeKtuaAgToge+mYtuautei/m+W6pu+8jOWmgiAzLzcg5Lu75Yqh5a6M5oiQfQoKIyMg55So5oi35YGP5aW9Ci0g6K+t6KiA77yae2xhbmd9Ci0g6Ieq5Yqo5o6o6L+b77yae2F1dG9fYWR2YW5jZX0KLSDlrqHmn6XmqKHlvI/vvJp7cmV2aWV3X21vZGV9Ci0g5rKf6YCa6aOO5qC877yae2NvbW11bmljYXRpb259Ci0g56Gu6K6k6ZiI5YC877yae2NvbmZpcm1fdGhyZXNob2xkfQoKIyMg5LiK5LiL5paH5b+r54WnCi0g5b2T5YmN5rWB5rC057q/6Zi25q6177yae3BoYXNlfQotIOa0u+i3g+mYtuaute+8mnthY3RpdmVfc3RhZ2VzfQotIOS4iuasoeaTjeS9nOaRmOimge+8mnvkuIDlj6Xor519CgojIyDlvoXnu63kuovpobkKLSBbIF0ge+acquWujOaIkOeahOS7u+WKoX0KLSBbIF0ge+mYu+WhnumhuX0KCiMjIOWFs+mUruWGs+etlgotIHvmnKzmrKHkvJror53kuK3nmoTph43opoHmnrbmnoTmiJborr7orqHlhrPnrZZ9CgojIyDlhrPnrZbljoblj7IK77yI5pys5Lya6K+d5paw5aKe55qE5Yaz562W5LulIGAtIFt4XSB7ZGF0ZX3vvJp75Yaz562W5o+P6L+wfWAg5qC85byP6L+95Yqg5LqO5q2k77yJCgojIyDnu4/pqozmmoLlrZgKLSBbIF0gYGFyY2hpdGVjdHVyZWDvvJp75b6F5b2S5qGj55qE5p625p6E5Yaz562WfQotIFsgXSBgcGF0dGVybnNg77yae+W+heW9kuaho+eahOS7o+eggeaooeW8j30KLSBbIF0gYHRyb3VibGVzaG9vdGluZ2DvvJp75b6F5b2S5qGj55qE5o6S5p+l57uP6aqMfQotIFsgXSBgc2V0dXBg77yae+W+heW9kuaho+eahOeOr+Wig+mFjee9rn0KYGBgCgrmraTmqKHmnb/noa7kv53ot6jkvJror53kuIrkuIvmlofmgaLlpI3liLDotrPlpJ/miafooYzkuIvkuIDkuKrku7vliqHnmoTnqIvluqbvvIzlkIzml7bmib/ovb3nu4/pqozmmoLlrZjlip/og73vvIzmlK/mkpHnn6Xor4blupPoh6rliqjlhpnlhaXmnLrliLbjgIIqKuWGmeWFpeivtOaYjioq77yaRmVlbCDlkK/liqjml7bku44gYHJlYWRQcm9maWxlKClgIOivu+WPluWFqOWxgOWBj+WlveWhq+WFheOAjOeUqOaIt+WBj+WlveOAje+8m+S8muivneS4reWBmuaKgOacry/mnrbmnoTlhrPnrZbml7boh6rliqjov73liqDliLDjgIzlhrPnrZbljoblj7LjgI3vvJvmr4/mrKHlhpnlhaUgZGV2X2xhc3QubWQg5pe25pu05paw44CM5LiK5LiL5paH5b+r54Wn44CN44CCCgojIyMg5Liq5Lq656yU6K6wCgo+IC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L25vdGUvCgrnu4/pqozmlZnorq3nmoQqKuS4u+imgeiusOW9leS9jee9rioq44CC566A6KaB5o+P6L+w77yM6K+m5oOF5pS+5a2Q5paH5Lu25bm25bu657Si5byV44CCQWdlbnQg5Zyo5q+P5qyh5a+56K+d5Lit6ZqP5py65o+Q6YaS55So5oi35piv5ZCm6ZyA6KaB5b2S5YWl5YWs5YWx56yU6K6wIGBkZXYvbm90ZS9kZXZfbm90ZS5tZGDvvIzlvZLlhaXlkI7moIfms6gi5bey5b2S5YWl5YWs5YWx5Z+fIuWPiui3s+i9rOmTvuaOpeOAggoKIyMjIOS4quS6uuaXpeW/lwoKPiAub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS9sb2cvCgrml6XluLjmk43kvZznmoQqKuS4u+imgeiusOW9leS9jee9rioq44CC57uT5p6E5LiO5YWs5Z+f5pel5b+X5LiA6Ie077yM5ZG95ZCN5qC85byPIGB5eXl5LW1tLWRkLU5OTi5tZGDvvIjml6DpnIDnlKjmiLflkI3vvIzlm6Dlt7LlnKjnlKjmiLfnm67lvZXkuIvvvInjgIIKCiMjIyDku6PnoIHlrqHmn6UKCj4gLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vY29kZV9yZXZpZXcvCgrnrqHnkIblvIDlj5HpmLbmrrXnmoTku6PnoIHor4TlrqHpl67popjvvIjmnrbmnoTjgIHop4TojIPjgIHpgLvovpHvvInvvIzmjInorqHliJLpmLbmrrXnu4Tnu4fjgILkuI4gQnVnIOi/vei4quWIhuemu+OAggoKKirop5LoibLliIblt6XvvJoqKgotICoqb3BlbmZlZWwtcmV2aWV3ZXIqKu+8muagueaNruiuoeWIkumYtuauteWuoeafpeS7o+egge+8jOaPkOS6pOmXrumimO+8jOmqjOaUtuS/ruWkjee7k+aenOOAggotICoqb3BlbmZlZWwtZXhlY3V0b3IqKu+8muWkhOeQhuWuoeafpemXrumimO+8jOS/ruaUueS7o+eggeW5tuagh+iusOeKtuaAgeOAggoK5q+P5Liq6K6h5YiS6Zi25q6155qE5a6h5p+l6Zeu6aKY6ZuG5Lit5ZyoIGBSRVYte3BsYW5fc3RhZ2V9Lm1kYOOAguadoeebruaooeadv++8mgoKYGBgbWFya2Rvd24KIyMgUkVWLXtOT306IHvnroDopoHmoIfpoph9Ci0gKirnirbmgIEqKu+8mnBlbmRpbmcgfCBmaXhpbmcgfCByZXNvbHZlZCB8IGNsb3NlZAotICoq5LyY5YWI57qnKirvvJpoaWdoIHwgbWVkaXVtIHwgbG93Ci0gKirmj5Dlh7rkuroqKu+8mm9wZW5mZWVsLXJldmlld2VyCi0gKirmj5Dlh7rml7bpl7QqKu+8mnl5eXktbW0tZGQgSEg6TU0KCiMjIyDpl67popjmj4/ov7AKLi4uCgojIyMg5aSE55CG6K6w5b2VCnwg5pe26Ze0IHwg5pON5L2c6ICFIHwg6K+05piOIHwgQ29tbWl0IHwKfC0tLS0tLXwtLS0tLS0tLXwtLS0tLS18LS0tLS0tLS18CgojIyMg6aqM5pS26K6w5b2VCnwg5pe26Ze0IHwg6aqM5pS25Lq6IHwg57uT6K66IHwg5aSH5rOoIHwKfC0tLS0tLXwtLS0tLS0tLXwtLS0tLS18LS0tLS0tfApgYGAKCuagueebruW9lee7tOaKpCBgaW5kZXgubWRg77yI5oyJ6Zi25q615YiG57uE57Si5byV77yM6aG26YOo57uf6K6h5ZCE54q25oCB5pWw6YeP77yJ5ZKMIGBsb2cubWRg77yI5pyA6L+RIDMwIOadoeWuoeafpeWPmOabtOaRmOimge+8ieOAggoK5a6h5p+l6Zeu6aKY5qCH6K6w5Li6IGBwZW5kaW5nYCDml7bvvIzoi6XkvJjlhYjnuqfkuLogYGhpZ2hg77yM6aG75bCG6Zeu6aKY6K+m5oOF77yI5qCH6aKY44CB5o+P6L+w44CB5b2x5ZON6IyD5Zu077yJ5YaZ5YWl5YWs5YWx5pel5b+X77yM56Gu5L+d5Zui6Zif5Y+K5pe25Y+v6KeB44CC5p2h55uuIGBjbG9zZWRgIOaXtu+8jOaguOW/g+e7k+iuuuWGmeWFpSBgLm9wZW5mZWVsL2NvZGVfcmV2aWV3L3tzdGFnZX0ubWRg77yM5bm25Zyo5YWs5YWx5pel5b+X566A6KaB6K6w5b2V44CCCgojIyMgQnVnIOi/vei4qgoKPiAub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS9idWdzLwoK566h55CG5rWL6K+V6Zi25q615Y+R546w55qE57y66Zm377yM5oyJ5qih5Z2X57uE57uH44CC5LiO5Luj56CB5a6h5p+l5YiG56a744CCCgoqKuinkuiJsuWIhuW3pe+8mioqCi0gKipvcGVuZmVlbC1mZWVsLXRlc3Rlcioq77ya5o+Q5LqkIEJ1ZyDlkozmnIDnu4jpqozmlLbjgIIKLSAqKm9wZW5mZWVsLWV4ZWN1dG9yKirvvJrmjInmqKHlnZfliIblt6Xkv67lpI3vvIzkvJror53lkK/liqjml7bpgJrov4cgYGxvYWQgc2tpbGwgb3BlbmZlZWwtZ2V0LWJ1Z3NgIOiOt+WPlui0n+i0o+aooeWdl+eahOW+heWkhOeQhiBCdWfjgIIKCkJ1ZyDmjInmqKHlnZflrZDnm67lvZXnu4Tnu4fvvIzmr4/kuKrmqKHlnZfnm67lvZXkuIsgQnVnIOWRveWQjSBgQlVHLXtOTk59X3vnroDnlaXmoIfpoph9Lm1kYO+8iE5OTiDmqKHlnZflhoXpgJLlop7vvInvvJoKCmBgYAoub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS9idWdzLwrilJzilIDilIAgaW5kZXgubWQgICAgICAgICAgICAgICMg5oyJ5qih5Z2X5YiG57uE57Si5byV77yIIyMjIHvmqKHlnZflkI19IEB76LSf6LSjQWdlbnTlkI1977yJCuKUnOKUgOKUgCBsb2cubWQgICAgICAgICAgICAgICAgIyDmnIDov5EgMzAg5p2h5Y+Y5pu05pGY6KaBCuKUnOKUgOKUgCB7bW9kdWxlX2F9LwrilIIgICDilJzilIDilIAgQlVHLTAwMV/moIfpopgubWQK4pSCICAg4pSU4pSA4pSAIEJVRy0wMDJf5qCH6aKYLm1kCuKUlOKUgOKUgCB7bW9kdWxlX2J9LwogICAg4pSU4pSA4pSAIEJVRy0wMDFf5qCH6aKYLm1kCmBgYAoKQnVnIOagh+iusOS4uiBgb3BlbmAg5pe277yM6Iul5LyY5YWI57qn5Li6IGBoaWdoYO+8jOmhu+Wwhue8uumZt+ivpuaDhe+8iOagh+mimOOAgeaPj+i/sOOAgeWkjeeOsOatpemqpOOAgeW9seWTjeaooeWdl++8ieWGmeWFpeWFrOWFseaXpeW/l++8jOehruS/neWboumYn+WPiuaXtuWPr+ingeOAguadoeebriBgY2xvc2VkYCDml7bvvIzmoLjlv4Pnu5PorrrlhpnlhaUgYC5vcGVuZmVlbC9idWdzL3ttb2R1bGV9Lm1kYO+8jOW5tuWcqOWFrOWFseaXpeW/l+eugOimgeiusOW9leOAggoKIyMjIOWuoeafpS/ov73ouKog55Sf5ZG95ZGo5pyfCgrkuKTogIXlhbHnlKjlkIzkuIDnirbmgIHmtYHovazmqKHlnovvvIjku4Xotbflp4vnirbmgIHlkI3kuI3lkIzvvInvvJoKCmBgYApwZW5kaW5nL29wZW4gIOKUgOKUgOKGkiAgZml4aW5nICDilIDilIDihpIgIHJlc29sdmVkICDilIDilIDihpIgIGNsb3NlZAogICAgICDihpEgICAgICAgICAgICAgICAgICAgICAgICAg4pSCCiAgICAgIOKUlOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgCDpqozmlLbkuI3pgJrov4cg4pSA4pSA4pSA4pSYCmBgYAoKfCDnirbmgIEgfCDku6PnoIHlrqHmn6UgfCBCdWcg6L+96LiqIHwg5pON5L2c6ICFIHwKfC0tLS0tLXwtLS0tLS0tLS18LS0tLS0tLS0tfC0tLS0tLS0tfAp8IOi1t+WniyB8IGBwZW5kaW5nYCB8IGBvcGVuYCB8IG9wZW5mZWVsLXJldmlld2VyIC8gb3BlbmZlZWwtZmVlbC10ZXN0ZXIg5o+Q5LqkIHwKfCDkv67lpI3kuK0gfCBgZml4aW5nYCB8IGBmaXhpbmdgIHwgb3BlbmZlZWwtZXhlY3V0b3Ig5om/5o6lIHwKfCDlvoXpqozmlLYgfCBgcmVzb2x2ZWRgIHwgYHJlc29sdmVkYCB8IG9wZW5mZWVsLWV4ZWN1dG9yIOWujOaIkCB8Cnwg5YWz6ZetIHwgYGNsb3NlZGAgfCBgY2xvc2VkYCB8IG9wZW5mZWVsLXJldmlld2VyIC8gb3BlbmZlZWwtZmVlbC10ZXN0ZXIg6aqM5pS26YCa6L+HIHwKCiMjIyDkuKrkurrkuLTml7bnm67lvZUKCj4gLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vdG1wLwoK5a2Y5pS+5b2T5YmN55So5oi355qE5Li05pe25paH5Lu277yM5LiO5YW25LuW55So5oi35a6M5YWo6ZqU56a744CCCg==',
6740
- adapter: 'IyBPcGVuQ29kZSDlubPlj7DpgILphY3lmagKCui/meaYryBPcGVuQ29kZSDlubPlj7DpgILphY3lmajvvIzljIXlkKsgOSDkuKogQWdlbnQg5a6a5LmJ5ZKMIDE0IOS4qiBTa2lsbOOAggoK6YOo572y5ZCO5bCG5Zyo55uu5qCH6aG555uu5Lit55Sf5oiQ77yaCgotIGBvcGVuY29kZS5qc29uY2Ag4oCUIE9wZW5Db2RlIOW5s+WPsOmFjee9ru+8iEFnZW50IOaooeWei+OAgVNraWxscyDliJfooajnrYnvvIkKLSBgLm9wZW5jb2RlL2FnZW50cy9gIOKAlCA5IOS4qiBBZ2VudCDlrprkuYnvvIhmZWVs44CBb3BlbmZlZWwtcGxhbm5lcuOAgW9wZW5mZWVsLXNjaGVtZXLjgIFvcGVuZmVlbC1leGVjdXRvcuOAgW9wZW5mZWVsLXJldmlld2Vy44CBb3BlbmZlZWwtZmVlbC10ZXN0ZXLjgIFvcGVuZmVlbC12aXNpb27jgIFvcGVuZmVlbC1hcmNoaXZlcuOAgW9wZW5mZWVsLXV0aWxpdHnvvIkKLSBgLm9wZW5jb2RlL3NraWxscy9gIOKAlCAxNCDkuKogU2tpbGwg5a6a5LmJ77yIb3BlbmZlZWwtYWdlbnQtbW9kZWwtY2hlY2vjgIFvcGVuZmVlbC1idWctYWNjZXB0YW5jZeOAgW9wZW5mZWVsLWNoZWNrLWti44CBb3BlbmZlZWwtZ2V0LWJ1Z3PjgIFvcGVuZmVlbC1nZXQtc3RhZ2Utc3RhdHVz44CBb3BlbmZlZWwtaGVhbHRo44CBb3BlbmZlZWwtbW9kZWwtY2hlY2vjgIFvcGVuZmVlbC1tb2RlbC1jb25maWfjgIFvcGVuZmVlbC1yZWNvdmVy44CBb3BlbmZlZWwtcm9hZG1hcOOAgW9wZW5mZWVsLXNlYXJjaC1rYuOAgW9wZW5mZWVsLXN5bmMtc3RhdHVz44CBb3BlbmZlZWwtdXBkYXRlLXN0YWdlLXN0YXR1c+OAgW9wZW5mZWVsLXdpemFyZO+8iQotIGAub3BlbmNvZGUvaW5zdHJ1Y3Rpb25zL2NvcmUubWRgIOKAlCDlubPlj7Dmk43kvZzop4TojIMKLSBgLm9wZW5jb2RlL0FEQVBURVIubWRgIOKAlCDmnKzpgILphY3lmajor7TmmI4KLSBgLm9wZW5jb2RlLy5naXRpZ25vcmVgIOKAlCDlv73nlaXop4TliJkKCj4g5rOo77ya5pys6aG555uu5LiN6YOo572yIGBwYWNrYWdlLmpzb25g77yI55Sx55So5oi36aG555uu6Ieq6KGM566h55CG77yJ44CCCg==',
7421
+ adapter: 'IyBPcGVuQ29kZSDlubPlj7DpgILphY3lmagKCui/meaYryBPcGVuQ29kZSDlubPlj7DpgILphY3lmajvvIzljIXlkKsgOSDkuKogQWdlbnQg5a6a5LmJ5ZKMIDE0IOS4qiBTa2lsbOOAggoK6YOo572y5ZCO5bCG5Zyo55uu5qCH6aG555uu5Lit55Sf5oiQ77yaCgotIGBvcGVuY29kZS5qc29uY2Ag4oCUIE9wZW5Db2RlIOW5s+WPsOmFjee9ru+8iEFnZW50IOaooeWei+OAgVNraWxscyDliJfooajnrYnvvIkKLSBgLm9wZW5jb2RlL2FnZW50cy9gIOKAlCA5IOS4qiBBZ2VudCDlrprkuYnvvIhmZWVs44CBb3BlbmZlZWwtcGxhbm5lcuOAgW9wZW5mZWVsLXNjaGVtZXLjgIFvcGVuZmVlbC1leGVjdXRvcuOAgW9wZW5mZWVsLXJldmlld2Vy44CBb3BlbmZlZWwtZmVlbC10ZXN0ZXLjgIFvcGVuZmVlbC12aXNpb27jgIFvcGVuZmVlbC1hcmNoaXZlcuOAgW9wZW5mZWVsLXV0aWxpdHnvvIkKLSBgLm9wZW5jb2RlL3NraWxscy9gIOKAlCAxNCDkuKogU2tpbGwg5a6a5LmJ77yIb3BlbmZlZWwtYWdlbnQtbW9kZWwtY2hlY2vjgIFvcGVuZmVlbC1idWctYWNjZXB0YW5jZeOAgW9wZW5mZWVsLWNoZWNrLWti44CBb3BlbmZlZWwtZ2V0LWJ1Z3PjgIFvcGVuZmVlbC1nZXQtc3RhZ2Utc3RhdHVz44CBb3BlbmZlZWwtaGVhbHRo44CBb3BlbmZlZWwtbW9kZWwtY2hlY2vjgIFvcGVuZmVlbC1tb2RlbC1jb25maWfjgIFvcGVuZmVlbC1yZWNvdmVy44CBb3BlbmZlZWwtcm9hZG1hcOOAgW9wZW5mZWVsLXNlYXJjaC1rYuOAgW9wZW5mZWVsLXN5bmMtc3RhdHVz44CBb3BlbmZlZWwtdXBkYXRlLXN0YWdlLXN0YXR1c+OAgW9wZW5mZWVsLXdpemFyZO+8iQotIGAub3BlbmNvZGUvQURBUFRFUi5tZGAg4oCUIOacrOmAgumFjeWZqOivtOaYjgotIGAub3BlbmNvZGUvLmdpdGlnbm9yZWAg4oCUIOW/veeVpeinhOWImQoKPiDms6jvvJrmnKzpobnnm67kuI3pg6jnvbIgYHBhY2thZ2UuanNvbmDvvIjnlLHnlKjmiLfpobnnm67oh6rooYznrqHnkIbvvInjgIIK',
6741
7422
  },
6742
7423
  en: {
6743
- instructions: 'IyAub3BlbmZlZWwgV29ya3NwYWNlIE9wZXJhdGlvbnMgR3VpZGUKCj4gVGhlIHByb2plY3QncyBwZXJtYW5lbnQgYmVoYXZpb3JhbCBjb25zdHJhaW50cyBhbmQgY29kaW5nIGNvbnZlbnRpb25zIGNhbiBiZSBmb3VuZCBpbiB0aGUgcHJvamVjdCByb290IGBBR0VOVFMubWRgLiBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB0aGUgc3BlY2lmaWMgb3BlcmF0aW9uYWwgcnVsZXMgZm9yIHRoZSBgLm9wZW5mZWVsL2Agd29ya3NwYWNlLgoKQXQgdGhlIHN0YXJ0IG9mIGVhY2ggc2Vzc2lvbiwgY2hlY2sgdGhlIC5vcGVuZmVlbCBkaXJlY3RvcnkgdW5kZXIgdGhlIHByb2plY3QgcGF0aCBhbmQgaXRzIGNvbnRlbnRzLiBUaGlzIGRpcmVjdG9yeSBpcyB0aGUgc2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3IgZW5zdXJpbmcgZGV2ZWxvcG1lbnQgY29uc2lzdGVuY3ksIGFuZCB5b3UgbXVzdCBtYWludGFpbiBpdHMgaW50ZWdyaXR5IGFuZCBhY2N1cmFjeS4KCkR1cmluZyBhIHNlc3Npb24sIHByb2FjdGl2ZWx5IHVzZSB0aGUgcGxhdGZvcm0ncyBidWlsdC1pbiB0b29scyAoc3VjaCBhcyBxdWVzdGlvbnMsIFRPRE8gbGlzdHMpOyBkbyBub3QgcmVseSBzb2xlbHkgb24gY29udmVyc2F0aW9uYWwgdGV4dCB0byBjb21wbGV0ZSBjb21wbGV4IHRhc2tzLgoKIyMgU2Vzc2lvbiBTdGFydHVwIFNlbGYtQ2hlY2sKCkF0IHRoZSBzdGFydCBvZiBlYWNoIHNlc3Npb24sIHRoZSBBZ2VudCBtdXN0IGNoZWNrIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3JpZXMgYW5kIGZpbGVzIG9uZSBieSBvbmUsIGNyZWF0aW5nIHRoZW0gYXV0b21hdGljYWxseSBpZiBtaXNzaW5nOgoKKipQdWJsaWMgZG9tYWluIGRpcmVjdG9yaWVzKiogKHVzZSBgbWtkaXIgLXBgIGlmIHRoZXkgZG8gbm90IGV4aXN0KToKLSBgLm9wZW5mZWVsL2Rldi9ub3RlL2AKLSBgLm9wZW5mZWVsL2xvZy9gCi0gYC5vcGVuZmVlbC9jb2RlX3Jldmlldy9gCi0gYC5vcGVuZmVlbC9idWdzL2AKLSBgLm9wZW5mZWVsL3BsYW4vYAotIGAub3BlbmZlZWwva2IvYAotIGAub3BlbmZlZWwvdG1wL2AKCioqUHVibGljIGRvbWFpbiBmaWxlcyoqIChjcmVhdGUgZW1wdHkgZmlsZXMgaWYgdGhleSBkbyBub3QgZXhpc3QpOgotIGAub3BlbmZlZWwvZGV2L2Rldl9jb3JlLm1kYAotIGAub3BlbmZlZWwvZGV2L2N1cnJlbnQubWRgCi0gYC5vcGVuZmVlbC9kZXYvZGVjaXNpb25zLm1kYAotIGAub3BlbmZlZWwva2IvaW5kZXgubWRgCgoqKlByaXZhdGUgZG9tYWluIGRpcmVjdG9yaWVzKiogKGJhc2VkIG9uIGB7dXNlcm5hbWV9YCBmcm9tIGAub3BlbmZlZWwvLmluZm8uanNvbmApOgotIGAub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS9sb2cvYAotIGAub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS9ub3RlL2AKLSBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vY29kZV9yZXZpZXcvYAotIGAub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS9idWdzL2AKLSBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vdG1wL2AKCioqUHJpdmF0ZSBkb21haW4gZmlsZXMqKjoKLSBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vZGV2X2xhc3QubWRgCgoqKkluY3JlbWVudGFsIHVwZGF0ZSByZXZpZXcqKjogQ2hlY2sgYH4vLm9wZW5mZWVsL3VwZGF0ZV9pbmZvcy5tZGA7IGlmIHRoZXJlIGFyZSB1bnJlcGFpcmVkIGVudHJpZXMgKGFwcGVuZGVkL2Fub21hbHkpLCAqKnJlbWluZCB0aGUgdXNlciB0byByZXN0YXJ0IHRoZSBzZXNzaW9uIG9yIGRlbGVnYXRlIHRvIEZlZWwqKjsgdGhpcyBBZ2VudCBtdXN0IG5vdCBtb2RpZnkgdGhhdCBmaWxlIG9uIGl0cyBvd24uCgojIyBEZXNpZ24gUHJpbmNpcGxlcwoKVGhlIC5vcGVuZmVlbCBkaXJlY3RvcnkgaXMgZGl2aWRlZCBpbnRvICoqUHVibGljIERvbWFpbioqIGFuZCAqKlByaXZhdGUgRG9tYWluKio6CgotIFB1YmxpYyBEb21haW46IGRpcmVjdGx5IHVuZGVyIGAub3BlbmZlZWwvYCwgc3RvcmVzIHByb2plY3QtbGV2ZWwgc2hhcmVkIGNvbnRlbnQgKGNvcmUgcnVsZXMsIHBsYW5zLCB0ZWFtIGxvZ3MsIGtub3dsZWRnZSBiYXNlLCBldGMuKSwgaW5jbHVkZWQgaW4gdmVyc2lvbiBjb250cm9sLgotIFByaXZhdGUgRG9tYWluOiB1bmRlciBgLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vYCwgc3RvcmVzIHBlcnNvbmFsIG9wZXJhdGlvbiBzdGF0dXMsIGxvZ3MsIG5vdGVzLCBjb2RlIHJldmlld3MsIEJ1ZyB0cmFja2luZywgZXRjLiwgYWRkZWQgdG8gYC5naXRpZ25vcmVgIGFuZCBub3QgaW5jbHVkZWQgaW4gdmVyc2lvbiBjb250cm9sLgoKQWxsIHVzZXJzIChpbmNsdWRpbmcgc2luZ2xlLXBlcnNvbiBwcm9qZWN0cykgZm9sbG93IHRoaXMgc3RydWN0dXJlLgoKIyMgQWdlbnQgVG9vbCBVc2FnZSBDb252ZW50aW9ucwoKQWxsIEFnZW50cyAoaW5jbHVkaW5nIEZlZWwsIG9wZW5mZWVsLXBsYW5uZXIsIG9wZW5mZWVsLXNjaGVtZXIsIG9wZW5mZWVsLWV4ZWN1dG9yLCBvcGVuZmVlbC1yZXZpZXdlciwgb3BlbmZlZWwtZmVlbC10ZXN0ZXIsIG9wZW5mZWVsLXZpc2lvbiwgb3BlbmZlZWwtYXJjaGl2ZXIpIHNob3VsZCBwcm9hY3RpdmVseSB1c2UgdGhlIHBsYXRmb3JtJ3MgYnVpbHQtaW4gdG9vbHMgZHVyaW5nIHNlc3Npb25zLiBEbyBub3QgcmVseSBzb2xlbHkgb24gY29udmVyc2F0aW9uYWwgdGV4dCB0byBjb21wbGV0ZSBjb21wbGV4IHRhc2tzLgoKIyMjIDEuIHRvZG93cml0ZSDigJQgVGFzayBMaXN0IE1hbmFnZW1lbnQKCioqVHJpZ2dlciBjb25kaXRpb25zKiogKHVzZSB3aGVuIGFueSBvZiB0aGUgZm9sbG93aW5nIGFwcGxpZXMpOgotIFRoZSBjdXJyZW50IHRhc2sgY29udGFpbnMgbW9yZSB0aGFuIDMgaW5kZXBlbmRlbnQgc3RlcHMKLSBUaGUgdXNlciBpc3N1ZXMgbXVsdGlwbGUgdGFza3MgYXQgb25jZSAobnVtYmVyZWQgb3IgY29tbWEtc2VwYXJhdGVkKQotIFRoZSB0YXNrIGludm9sdmVzIGNyb3NzLWZpbGUgbW9kaWZpY2F0aW9ucyBhbmQgbmVlZHMgcHJvZ3Jlc3MgdHJhY2tpbmcKCioqVXNhZ2UgcmVxdWlyZW1lbnRzKio6Ci0gQ3JlYXRlIGEgdG9kbyBsaXN0IGJlZm9yZSBzdGFydGluZyBleGVjdXRpb24sIG9uZSBlbnRyeSBwZXIgc3RlcAotIE9ubHkgb25lIGBpbl9wcm9ncmVzc2AgYXQgYSB0aW1lCi0gTWFyayBgY29tcGxldGVkYCBpbW1lZGlhdGVseSBhZnRlciBmaW5pc2hpbmcgKGRvIG5vdCB3YWl0IGZvciBiYXRjaCBwcm9jZXNzaW5nKQotIEFwcGVuZCBuZXdseSBkaXNjb3ZlcmVkIHN0ZXBzIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKCioqRXhhbXBsZSoqOgpgYGAKVXNlcjogIkZpeCB0aHJlZSBidWdzIGluIGZsb3cuanNvbiwgdGhlbiBydW4gdGVzdHMiCuKGkiBDcmVhdGUgdG9kbzogW0ZpeEJ1ZzEsIEZpeEJ1ZzIsIEZpeEJ1ZzMsIFJ1blRlc3RzXQpgYGAKCiMjIyAyLiBxdWVzdGlvbiDigJQgQXNrIHRoZSBVc2VyCgoqKlRyaWdnZXIgY29uZGl0aW9ucyoqIChtdXN0IGFzayB3aGVuIGFueSBhcHBsaWVzOyBzcGVjdWxhdGl2ZSBhc3N1bXB0aW9ucyBhcmUgcHJvaGliaXRlZCk6Ci0gVGhlIHJlcXVpcmVtZW50IGlzIGFtYmlndW91cyBvciBoYXMgbXVsdGlwbGUgcmVhc29uYWJsZSBpbnRlcnByZXRhdGlvbnMKLSBUaGVyZSBhcmUgMiBvciBtb3JlIGVxdWFsbHkgcmVhc29uYWJsZSB0ZWNobmljYWwgYXBwcm9hY2hlcwotIFRoZSBvcGVyYXRpb24gbWF5IGNhdXNlIGlycmV2ZXJzaWJsZSBjb25zZXF1ZW5jZXMgKGRlbGV0aW5nIGZpbGVzLCBvdmVyd3JpdGluZyBjb25maWcsIGZvcmNlIHB1c2gsIGV0Yy4pCi0gSXQgaW52b2x2ZXMgYXJjaGl0ZWN0dXJlIGRlY2lzaW9ucyBvciBkZXNpZ24gZGlyZWN0aW9uIGNob2ljZXMKCioqVXNhZ2UgcmVxdWlyZW1lbnRzKio6Ci0gTWFyayB0aGUgcmVjb21tZW5kZWQgb3B0aW9uIHdpdGggIihSZWNvbW1lbmRlZCkiCi0gRWFjaCBvcHRpb24gbXVzdCBpbmNsdWRlIGEgb25lLXNlbnRlbmNlIGV4cGxhbmF0aW9uIG9mIGl0cyBjb25zZXF1ZW5jZXMKLSBTaW1wbGUgY29uZmlybWF0aW9uIHF1ZXN0aW9ucyBzaG91bGQgbm90IGV4Y2VlZCAzIG9wdGlvbnMKLSBVcmdlbnQgb3IgaGlnaC1yaXNrIG9wZXJhdGlvbnMgbXVzdCBpbmNsdWRlIGEgIkNhbmNlbCIgb3B0aW9uCgoqKlByb2hpYml0ZWQgYmVoYXZpb3JzKio6Ci0gTWFraW5nIHNwZWN1bGF0aXZlIGFzc3VtcHRpb25zIGFuZCBleGVjdXRpbmcgZGlyZWN0bHkgd2hlbiByZXF1aXJlbWVudHMgYXJlIGFtYmlndW91cwotIEltcGxlbWVudGluZyB3aXRob3V0IHVzZXIgc2VsZWN0aW9uIHdoZW4gbXVsdGlwbGUgb3B0aW9ucyBleGlzdAotIFN0YXJ0aW5nIHdpdGggIm1heWJlIiBvciAicGVyaGFwcyIgd2l0aG91dCBhc2tpbmcKCiMjIyAzLiB0YXNrIOKAlCBTdWItQWdlbnQgRGlzcGF0Y2gKCioqVHJpZ2dlciBjb25kaXRpb25zKio6Ci0gTmVlZCB0byBleHBsb3JlIG11bHRpcGxlIGNvZGUgYXJlYXMgaW4gcGFyYWxsZWwgKGxhdW5jaCAyfjMgZXhwbG9yZSBhZ2VudHMpCi0gQ29tcGxleCBtdWx0aS1zdGVwIHRhc2tzIG5lZWQgdG8gYmUgZGVsZWdhdGVkIHRvIGEgZ2VuZXJhbCBhZ2VudAotIENvbXBsZXggdGFza3MgbmVlZCB0byBiZSBkZWxlZ2F0ZWQgdG8gZG93bnN0cmVhbSBBZ2VudHMgKGRpc3BhdGNoZWQgYnkgRmVlbCwgdGhlIGNoaWVmIGNvbmR1Y3RvcikKCioqVXNhZ2UgcmVxdWlyZW1lbnRzKio6Ci0gRm9yIHBhcmFsbGVsIHRhc2tzLCBpc3N1ZSBtdWx0aXBsZSB0YXNrIGNhbGxzIGluIGEgc2luZ2xlIG1lc3NhZ2UKLSBFYWNoIHRhc2sgcHJvbXB0IG11c3QgaW5jbHVkZTogc3BlY2lmaWMgdGFzayBkZXNjcmlwdGlvbiArIGV4cGVjdGVkIGluZm9ybWF0aW9uIHRvIHJldHVybgotIENsZWFybHkgdGVsbCB0aGUgc3ViLWFnZW50IHdoZXRoZXIgaXQgaXMgcmVhZC1vbmx5IHJlc2VhcmNoIG9yIGNhbiB3cml0ZSBjb2RlCgojIyMgNC4gc2tpbGwg4oCUIFNraWxsIExvYWRpbmcKCioqVHJpZ2dlciBjb25kaXRpb25zKio6Ci0gTmVlZCB0byB1bmRlcnN0YW5kIGN1cnJlbnQgc3RhZ2Ugc3RhdHVzIOKGkiBgb3BlbmZlZWwtZ2V0LXN0YWdlLXN0YXR1c2AKLSBOZWVkIHRvIGNvbnN1bHQgdGhlIHByb2plY3Qga25vd2xlZGdlIGJhc2Ug4oaSIGBvcGVuZmVlbC1jaGVjay1rYmAKLSBOZWVkIHRvIGdldCB0aGUgQnVnIGxpc3Qg4oaSIGBvcGVuZmVlbC1nZXQtYnVnc2AKCioqVXNhZ2UgcmVxdWlyZW1lbnRzKio6Ci0gTG9hZCBgb3BlbmZlZWwtY2hlY2sta2JgIGF0IHNlc3Npb24gc3RhcnQgdG8gZ2V0IHByb2plY3QgYmFja2dyb3VuZAotIExvYWQgYG9wZW5mZWVsLWdldC1zdGFnZS1zdGF0dXNgIGJlZm9yZSBoYW5kbGluZyBzdGFnZSB0YXNrcyB0byBjb25maXJtIHByb2Nlc3Mgc3RhdHVzCi0gTXVzdCBub3Qgc2tpcCBza2lsbHMgYW5kIG9wZXJhdGUgZGlyZWN0bHkgZnJvbSBtZW1vcnkKCiMjIyA1LiBUb29sIFVzYWdlIFByaW9yaXR5Cgp8IFNjZW5hcmlvIHwgUHJlZmVycmVkIFRvb2wgfCBQcm9oaWJpdGVkIFByYWN0aWNlIHwKfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBNdWx0aS1zdGVwIHRhc2tzIHwgYHRvZG93cml0ZWAgfCBFeGVjdXRpbmcgc3RlcC1ieS1zdGVwIGZyb20gbWVtb3J5IHwKfCBBbWJpZ3VvdXMgcmVxdWlyZW1lbnRzIHwgYHF1ZXN0aW9uYCB8IE1ha2luZyBhc3N1bXB0aW9ucyBhbmQgYWN0aW5nIGRpcmVjdGx5IHwKfCBDb2RlIGV4cGxvcmF0aW9uIHwgYHRhc2soZXhwbG9yZSlgIHwgTWFudWFsIGdyZXAvcmVhZCBvbmUgYnkgb25lIHwKfCBHZXR0aW5nIHN0YXR1cyB8IGBza2lsbChvcGVuZmVlbC1nZXQtc3RhZ2Utc3RhdHVzKWAgfCBJbmZlcnJpbmcgZnJvbSBtZW1vcnkgfAp8IEJhdGNoIGZpbGUgb3BlcmF0aW9ucyB8IGB0YXNrKGdlbmVyYWwpYCB8IFByb2Nlc3Npbmcgc2VyaWFsbHkgb25lIGJ5IG9uZSB8CgojIyBVc2VyIElkZW50aXR5Cgo+IC5vcGVuZmVlbC8uaW5mby5qc29uCgpgYGBqc29uCnsgInVzZXIiOiAidXNlcm5hbWUiIH0KYGBgCgpBdCB0aGUgc3RhcnQgb2YgZWFjaCBzZXNzaW9uLCB0aGUgQWdlbnQgZmlyc3QgcmVhZHMgdGhpcyBmaWxlIHRvIGdldCB0aGUgY3VycmVudCB1c2VybmFtZS4gSWYgdGhlIGZpbGUgZG9lcyBub3QgZXhpc3Qgb3IgYHVzZXJgIGlzIGVtcHR5LCBhdXRvbWF0aWNhbGx5IGV4ZWN1dGUgYGdpdCBjb25maWcgdXNlci5uYW1lYCB0byBnZXQgdGhlIEdpdCB1c2VybmFtZSBhbmQgd3JpdGUgaXQuIElmIHRoZXJlIGlzIG5vIEdpdCBjb25maWd1cmF0aW9uLCB1c2UgYSBkZWZhdWx0IHVzZXJuYW1lLiBUaGlzIGZpbGUgaXMgYWRkZWQgdG8gYC5naXRpZ25vcmVgIGFuZCBleGNsdWRlZCBmcm9tIHZlcnNpb24gY29udHJvbC4KCiMjIyBQYXRoIFNlbGYtQ2hlY2sKCkxhcmdlIG1vZGVscyBtYXkgaW5hZHZlcnRlbnRseSB0cnVuY2F0ZSBvciBtb2RpZnkgdGhlIHVzZXJuYW1lIHdoZW4gY29uc3RydWN0aW5nIGAub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS9gIHBhdGhzIChlLmcuLCBgQWxpY2VgIOKGkiBgQWxpY2ApLCBjYXVzaW5nIGZpbGUgcmVhZC93cml0ZSBmYWlsdXJlcy4gV2hlbiBhY2Nlc3NpbmcgYW55IGZpbGUgdW5kZXIgYC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L2AsIHRoZSBmb2xsb3dpbmcgc2VsZi1jaGVjayBydWxlcyBtdXN0IGJlIGZvbGxvd2VkOgoKMS4gKipJbW1lZGlhdGUgY2hlY2sgb24gYWNjZXNzIGZhaWx1cmUqKjogV2hlbiBgcmVhZGAgb3IgYGdsb2JgIHJldHVybnMgImZpbGUgbm90IGZvdW5kIiBvciAibm8gc3VjaCBmaWxlIiwgZG8gbm90IHJlcG9ydCBhbiBlcnJvciBkaXJlY3RseS4gRmlyc3QgZXhlY3V0ZSBgcmVhZCAub3BlbmZlZWwvLmluZm8uanNvbmAgdG8gcmUtYWNxdWlyZSB0aGUgY29ycmVjdCBgdXNlcm5hbWVgLgoyLiAqKkNvbXBhcmUgYW5kIGNvcnJlY3QqKjogQ29tcGFyZSB0aGUgY3VycmVudGx5IHVzZWQgYHVzZXJuYW1lYCB3aXRoIHRoZSB2YWx1ZSBpbiBgLm9wZW5mZWVsLy5pbmZvLmpzb25gIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIuIElmIGluY29uc2lzdGVudCwgcmVjb25zdHJ1Y3QgdGhlIGZ1bGwgcGF0aCB3aXRoIHRoZSBjb3JyZWN0IHZhbHVlIGFuZCByZXRyeS4KMy4gKipFc2NhbGF0ZSBvbiBjb25zZWN1dGl2ZSBmYWlsdXJlcyoqOiBJZiB0aGUgcmV0cnkgc3RpbGwgZmFpbHMsIHJlcG9ydCB0byB0aGUgdXNlciB0aGF0ICJQYXRoIGB7ZmFpbGVkIHBhdGh9YCBkb2VzIG5vdCBleGlzdC4gQ29uZmlybWVkIHVzZXJuYW1lIGlzIGB7Y29ycmVjdCB1c2VybmFtZX1gIiwgYW5kIHdhaXQgZm9yIHVzZXIgY29uZmlybWF0aW9uIGJlZm9yZSBwcm9jZWVkaW5nLgoKVGhpcyBydWxlIGFwcGxpZXMgdG8gYWxsIEFnZW50cyAoRmVlbCAvIG9wZW5mZWVsLXBsYW5uZXIgLyBvcGVuZmVlbC1zY2hlbWVyIC8gb3BlbmZlZWwtZXhlY3V0b3IgLyBvcGVuZmVlbC1yZXZpZXdlciAvIG9wZW5mZWVsLWZlZWwtdGVzdGVyIC8gb3BlbmZlZWwtdmlzaW9uIC8gb3BlbmZlZWwtYXJjaGl2ZXIpLgoKLS0tCgojIyBQdWJsaWMgRG9tYWluCgojIyMgRGV2ZWxvcG1lbnQgRGlyZWN0b3J5Cgo+IC5vcGVuZmVlbC9kZXYKClN0b3JlcyBwcm9qZWN0LXNoYXJlZCBjb3JlIHJ1bGVzIGFuZCBwcm9ncmVzcyBzdGF0dXMuCgo+IC5vcGVuZmVlbC9kZXYvZGV2X2NvcmUubWQKClN0b3JlcyBsb25nLXRlcm0gdmFsaWQgcnVsZXMuIFByaW9yaXR5OiB1c2VyIGluc3RydWN0aW9ucyA+IHRoaXMgZG9jdW1lbnQgPiBzZXNzaW9uIHRlbXBvcmFyeSBoaW50cy4gRWFjaCBydWxlIGlzIHByZWZpeGVkIHdpdGggYFsrXWAgKGVuYWJsZWQpIC8gYFstXWAgKGRpc2FibGVkKS4gUnVsZXMgY2FuIG9ubHkgYmUgbWFya2VkIGFzIGRpc2FibGVkLCBub3QgZGVsZXRlZC4gV2hlbiBtb3JlIHRoYW4gMTAgcnVsZXMgYXJlIGRpc2FibGVkLCByZW1pbmQgdGhlIHVzZXIgdG8gY2xlYW4gdXAuCgo+IC5vcGVuZmVlbC9kZXYvY3VycmVudC5tZAoKUmVjb3JkcyB3b3JrIGN1cnJlbnRseSBpbiBwcm9ncmVzcy4gRm9sbG93cyB0aGUgYEB7dXNlcm5hbWV9IGRlc2NyaXB0aW9uIG9mIG9uZ29pbmcgd29ya2AgcGFyYWRpZ20gdG8gdHJhY2sgZWFjaCBtZW1iZXIncyBwcm9ncmVzcy4gVGhlIHRvcCBtYWludGFpbnMgb3ZlcmFsbCBwcm9ncmVzcyBzdGF0dXMuCgo+IC5vcGVuZmVlbC9kZXYvbm90ZS9kZXZfbm90ZS5tZAoKVGVhbS1zaGFyZWQgZGV2ZWxvcG1lbnQgbm90ZXMsIHNvdXJjZWQgZnJvbSBtZW1iZXIgcGVyc29uYWwgbm90ZXMgKHNlZSBQcml2YXRlIERvbWFpbiA+IFBlcnNvbmFsIE5vdGVzKS4gQnJpZWYgZGVzY3JpcHRpb25zIG9ubHk7IGRldGFpbHMgZ28gaW50byBzdWItZmlsZXMgd2l0aCBhbiBpbmRleC4KCiMjIyBMb2cgRGlyZWN0b3J5Cgo+IC5vcGVuZmVlbC9sb2cKClB1YmxpYyBsb2cgZGlyZWN0b3J5LCAqKm9ubHkgcmVjb3JkcyB0ZWFtLWxldmVsIGltcG9ydGFudCBldmVudHMqKiAocmVjb3JkcyB3aGVuIGFueSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldCk6Ci0gQ3JlYXRpb24gb3IgaW1wb3J0YW50IG1vZGlmaWNhdGlvbiBvZiBwdWJsaWMgZG9tYWluIGZpbGVzCi0gQ3Jvc3MtbWVtYmVyIGNvbGxhYm9yYXRpb24ga2V5IG9wZXJhdGlvbnMgKHB1YmxpYyBub3RlIHN1Ym1pc3Npb24sIHBsYW4gYWRqdXN0bWVudHMsIGV0Yy4pCi0gUGxhbiBtaWxlc3RvbmUgYWNoaWV2ZW1lbnRzIG9yIG1ham9yIGRldmlhdGlvbnMKLSBTZXZlcmUgaXNzdWVzIGluIHByaXZhdGUgY29kZSByZXZpZXdzIG9yIEJ1Z3MgKGhpZ2ggcHJpb3JpdHksIHJlcG9ydCBkZXRhaWxzIG9uIGZpcnN0IGRpc2NvdmVyeSkKLSBBbm9tYWxvdXMgZXZlbnRzIGFmZmVjdGluZyBtdWx0aXBsZSBwZW9wbGUKCkRhaWx5IG9wZXJhdGlvbnMgKHJvdXRpbmUgY29kZSBtb2RpZmljYXRpb25zLCBwZXJzb25hbCBwbGFuIGFkdmFuY2VtZW50LCBkZWJ1Z2dpbmcsIHBlcnNvbmFsIG5vdGVzKSBhcmUgcmVjb3JkZWQgaW4gdGhlIHByaXZhdGUgbG9nLgoKTG9ncyBhcmUgb3JnYW5pemVkIGJ5IHllYXIvbW9udGgvZGF5IGhpZXJhcmNoeS4gRGF5IGRpcmVjdG9yaWVzIGFyZSBvbmx5IGNyZWF0ZWQgd2hlbiBpbXBvcnRhbnQgZXZlbnRzIG9jY3VyIG9uIHRoYXQgZGF5LiBGaWxlIG5hbWluZzogYHl5eXktbW0tZGQte3VzZXJuYW1lfS1OTk4ubWRgLCBkYXkgZGlyZWN0b3JpZXMgY29udGFpbiBgZGF5X2luZGV4Lm1kYC4gVGhlIHJvb3QgbWFpbnRhaW5zIGBpbmRleC5tZGAgKGRhdGUgaW5kZXgpIGFuZCBgbG9nLm1kYCAobGFzdCAzMCBzdW1tYXJ5IGVudHJpZXMsIGZvcm1hdCBgW2ZpbGVuYW1lXSB7dXNlcm5hbWV9OiBkZXNjcmlwdGlvbmAsIHdpdGgganVtcCBsaW5rcykuCgojIyMgQ29kZSBSZXZpZXcgRGlyZWN0b3J5Cgo+IC5vcGVuZmVlbC9jb2RlX3JldmlldwoKUHVibGljIGNvZGUgcmV2aWV3IGRpcmVjdG9yeSwgc3RvcmluZyBjb3JlIGNvbmNsdXNpb24gc3VtbWFyaWVzIGFmdGVyIHByaXZhdGUgcmV2aWV3cyBhcmUgY29tcGxldGVkLiBJbmNsdWRlZCBpbiB2ZXJzaW9uIGNvbnRyb2wgZm9yIHRlYW0gcmVmZXJlbmNlLgoKT3JnYW5pemVkIGJ5IHBsYW4gc3RhZ2UsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByaXZhdGUgcmV2aWV3IGRpcmVjdG9yeS4gVGhlIHJvb3QgbWFpbnRhaW5zIGBpbmRleC5tZGAgKGdyb3VwZWQgYnkgc3RhZ2UsIHdpdGggc3RhdHVzIGNvdW50IHN0YXRpc3RpY3MgYXQgdGhlIHRvcCkuIEVhY2ggc3RhZ2UncyBpbnNpZ2h0cyBhbmQgc3VnZ2VzdGlvbnMgYXJlIHN1bW1hcml6ZWQgaW4gYHtzdGFnZX0ubWRgLiBUaGUgc3BlY2lmaWMgcmV2aWV3IHByb2Nlc3MgYW5kIGRldGFpbGVkIGNvbnRlbnQgZm9yIGVhY2ggc3VibWlzc2lvbiBwb2ludCBhcmUgc3RvcmVkIGluIHRoZSBwcml2YXRlIGBjb2RlX3Jldmlldy9SRVYte3N0YWdlfS5tZGAuCgojIyMgQnVnIFRyYWNraW5nIERpcmVjdG9yeQoKPiAub3BlbmZlZWwvYnVncwoKUHVibGljIEJ1ZyB0cmFja2luZyBkaXJlY3RvcnksIHN0b3JpbmcgY29yZSBjb25jbHVzaW9uIHN1bW1hcmllcyBhZnRlciBwcml2YXRlIEJ1Z3MgYXJlIGNsb3NlZC4gSW5jbHVkZWQgaW4gdmVyc2lvbiBjb250cm9sIGZvciB0ZWFtIHJlZmVyZW5jZS4KCk9yZ2FuaXplZCBieSBtb2R1bGUsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHByaXZhdGUgQnVnIGRpcmVjdG9yeS4gVGhlIHJvb3QgbWFpbnRhaW5zIGBpbmRleC5tZGAgKGdyb3VwZWQgYnkgbW9kdWxlKS4gRWFjaCBtb2R1bGUncyBCdWcgcmVzb2x1dGlvbiBpbnNpZ2h0cyBhbmQgcm9vdCBjYXVzZSBhbmFseXNpcyBhcmUgYXJjaGl2ZWQgaW4gYHttb2R1bGV9Lm1kYC4gU3BlY2lmaWMgQnVnIHJlcG9ydHMsIHJlcHJvZHVjdGlvbiBzdGVwcywgYW5kIGFjY2VwdGFuY2UgZGV0YWlscyBhcmUgc3RvcmVkIGluIHRoZSBwcml2YXRlIGBidWdzL3ttb2R1bGV9L2AuCgojIyMgUGxhbiBEaXJlY3RvcnkKCj4gLm9wZW5mZWVsL3BsYW4KCioqQXV0b21hdGVkIHBsYW5uaW5nKio6IFdoZW4gdGhlIHVzZXIgcHJvcG9zZXMgYSB0YXNrIHdpdGggdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJpc3RpY3MsIHRoZSBBZ2VudCBzaG91bGQgcHJvYWN0aXZlbHkgY3JlYXRlIGFuIGVudHJ5IGluIGBwbGFuLm1kYCBvciB1cGRhdGUgYGN1cnJlbnQubWRgLCB3aXRob3V0IHdhaXRpbmcgZm9yIG1hbnVhbCB1c2VyIHRyaWdnZXI6Ci0gSW52b2x2ZXMgbXVsdGktc3RlcCBvcGVyYXRpb25zCi0gUmVxdWlyZXMgY3Jvc3Mtc2Vzc2lvbiBwcm9ncmVzcyB0cmFja2luZwotIE1heSBhZmZlY3QgbXVsdGlwbGUgbW9kdWxlcyBvciBmaWxlcwoKUGxhbnMgYXJlIGRpdmlkZWQgaW50byB0d28gbGF5ZXJzOgotICoqTGFyZ2UgcGxhbioqIChgcGxhbi5tZGApOiBPdmVyYWxsIGdvYWxzLCB0ZWNobmljYWwgYXJjaGl0ZWN0dXJlLCBjb3JlIG1pbGVzdG9uZXMuIENoYW5nZXMgcmVxdWlyZSB0ZWFtIGNvbW11bmljYXRpb24gYW5kIGNvbmZpcm1hdGlvbi4KLSAqKlNtYWxsIHBsYW5zKiogKGB7c3RhZ2V9L2Agc3ViZGlyZWN0b3JpZXMpOiBTcGVjaWZpYyB0YXNrIGJyZWFrZG93biBhbmQgaW1wbGVtZW50YXRpb24gc3RlcHMuIERhaWx5IG1vZGlmaWNhdGlvbnMgYW5kIHByb2dyZXNzIGhhcHBlbiBhdCB0aGlzIGxheWVyLgoKSWYgYSBwbGFuIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgaXQgYmFzZWQgb24gdXNlciBpbnN0cnVjdGlvbnMuIExhcmdlIHBsYW4gY2hhbmdlcyByZXF1aXJlIHVzZXIgY29uZmlybWF0aW9uOyBzbWFsbCBwbGFuIGFkanVzdG1lbnRzIGNhbiBiZSBkb25lIGF1dG9ub21vdXNseSBieSB0aGUgQWdlbnQgYnV0IG11c3QgYmUgcmVjb3JkZWQuCgpQbGFuIGluZGV4ZXMgYXJlIG9yZ2FuaXplZCBieSBtYWpvciB2ZXJzaW9uIHNlcmllczogYHBsYW4vaW5kZXgubWRgIGlzIHRoZSB0b3AtbGV2ZWwgaW5kZXgsIGFuZCBzZXJpZXMgaW5kZXhlcyBzdWNoIGFzIGBwbGFuL3Y0L2luZGV4Lm1kYCBhbmQgYHBsYW4vdjUvaW5kZXgubWRgIHN0b3JlIGNvcmUgc3VtbWFyaWVzIG9mIGVhY2ggcGxhbi4gYHBsYW5fbG9nLm1kYCByZWNvcmRzIHRoZSBsYXN0IDMwIGNoYW5nZSBzdW1tYXJpZXMsIGZvcm1hdCBge3VzZXJuYW1lfTogY2hhbmdlIGRlc2NyaXB0aW9uYCwgd2l0aCBqdW1wIGxpbmtzLgoKSWYgdW5wbGFubmVkIG9wZXJhdGlvbnMgb3IgZGV2aWF0aW9ucyBvY2N1ciwgZXhwbGFpbiB0byB0aGUgdXNlciBmaXJzdCBhbmQgc2VlayBjb25maXJtYXRpb24sIHdoaWxlIHJlY29yZGluZyBpbiB0aGUgbG9nLgoKIyMjIyBQaXBlbGluZSBBZHZhbmNlbWVudAoKRWFjaCBzdGFnZSdzIHN0YXRlIGlzIGpvaW50bHkgbWFuYWdlZCBieSBgZmxvdy5qc29uYCBhbmQgYHN0YXR1cy5tZGAuIFRoZSBGZWVsIEFnZW50IHJlYWRzIGZsb3cuanNvbiB0byBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgc3RhZ2UgYW5kIHBoYXNlLCBhbmQgYWR2YW5jZXMgdGhlIHBpcGVsaW5lIHRocm91Z2ggdGhlIGBvcGVuZmVlbCBmbG93YCBjb21tYW5kOgoKLSBgb3BlbmZlZWwgZmxvdyBzdGF0dXNgIOKAlCBWaWV3IGN1cnJlbnQgcGlwZWxpbmUgc3RhdHVzCi0gYG9wZW5mZWVsIGZsb3cgYWR2YW5jZWAg4oCUIEFkdmFuY2UgdG8gdGhlIG5leHQgcGhhc2UKLSBgb3BlbmZlZWwgZmxvdyByZXBhaXJgIOKAlCBSZXBhaXIgcGlwZWxpbmUgc3RhdGUKClBpcGVsaW5lIHBoYXNlIGVudW1lcmF0aW9uIChmbG93Lmpzb24gUGlwZWxpbmVQaGFzZSk6CnBsYW5fcGVuZGluZyDihpIgcGxhbl9yZXZpZXcg4oaSIHBsYW5fcGFzc2VkIOKGkiBzY2hlbWVfcGVuZGluZyDihpIgc2NoZW1lX3JldmlldyDihpIgc2NoZW1lX3Bhc3NlZCDihpIgZXhlY19ydW5uaW5nIOKGkiByZXZpZXdfcGVuZGluZyDihpIgcmV2aWV3X2ZhaWxlZCDihpIgcmV2aWV3X3Bhc3NlZCDihpIgdGVzdF9wZW5kaW5nIOKGkiB0ZXN0X2ZhaWxlZCDihpIgdGVzdF9wYXNzZWQg4oaSIGFyY2hpdmluZyDihpIgZG9uZQoKTWFudWFsIHByb2Nlc3MgaXMgdGhlIGRlZmF1bHQgbW9kZS4gRmVlbCBkaXNwYXRjaGVzIGRvd25zdHJlYW0gQWdlbnRzIChvcGVuZmVlbC1wbGFubmVyIC8gb3BlbmZlZWwtc2NoZW1lciAvIG9wZW5mZWVsLWV4ZWN1dG9yIC8gb3BlbmZlZWwtcmV2aWV3ZXIgLyBvcGVuZmVlbC1mZWVsLXRlc3RlciAvIG9wZW5mZWVsLXZpc2lvbiAvIG9wZW5mZWVsLWFyY2hpdmVyKSBiYXNlZCBvbiBmbG93Lmpzb24gc3RhdGUsIHdpdGhvdXQgcmVseWluZyBvbiBsZWdhY3kgYXV0b21hdGVkIHNjaGVkdWxpbmcuCgpXaGVuIHRoZSBzdGF0ZSBpcyBkb25lIG9yIHBhdXNlZCwgZG8gbm90IGNvbnRpbnVlIGF1dG9tYXRpYyBhZHZhbmNlbWVudC4gV2hlbiBlbmNvdW50ZXJpbmcgdW5wbGFubmVkIGNoYW5nZXMgb3IgY29uc2VjdXRpdmUgZmFpbHVyZXMsIHBhdXNlIGFuZCB3YWl0IGZvciB1c2VyIGRlY2lzaW9uLgoKIyMjIFRlbXBvcmFyeSBEaXJlY3RvcnkKCj4gLm9wZW5mZWVsL3RtcAoKU3RvcmVzIHByb2plY3QtbGV2ZWwgdGVtcG9yYXJ5IGZpbGVzIChzaGFyZWQgZGF0YSwgYnVpbGQgYXJ0aWZhY3RzLCBldGMuKS4gT25seSByZWFkcyBmaWxlcyBmcm9tIHRoaXMgZGlyZWN0b3J5IHdoZW4gc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgoKIyMjIEtub3dsZWRnZSBCYXNlCgo+IC5vcGVuZmVlbC9rYgoKUmVjb3JkcyAid2hhdCB0aGlzIHByb2plY3QgaXMgbGlrZSIgYW5kICJ3aGF0IHRvIGRvIHdoZW4gcHJvYmxlbXMgYXJpc2UiLCBzZXBhcmF0ZWQgZnJvbSB0aGUgY29uc3RyYWludCBzeXN0ZW0gKHdoaWNoIHJlY29yZHMgIndoYXQgdG8gZG8iKS4KCmBgYAoub3BlbmZlZWwva2IvCuKUnOKUgOKUgCBpbmRleC5tZCAgICAgICAgICAgIyBNYWluIGluZGV4OiBjYXRlZ29yeSBvdmVydmlldywgZmlsZSBzdW1tYXJpZXMsIHJlY2VudCB1cGRhdGVzCuKUnOKUgOKUgCBhcmNoaXRlY3R1cmUubWQgICAgIyBBcmNoaXRlY3R1cmUgZGVjaXNpb25zLCBkZXNpZ24gcmF0aW9uYWxlLCB0ZWNobm9sb2d5IHNlbGVjdGlvbgrilJzilIDilIAgcGF0dGVybnMubWQgICAgICAgICMgQ29kZSBwYXR0ZXJucywgcHJvamVjdCBjb252ZW50aW9ucywgYmVzdCBwcmFjdGljZXMK4pSc4pSA4pSAIHRyb3VibGVzaG9vdGluZy5tZCAjIENvbW1vbiBpc3N1ZXMsIGRlYnVnZ2luZyBwcm9jZWR1cmVzLCBrbm93biBwaXRmYWxscwrilJTilIDilIAgc2V0dXAubWQgICAgICAgICAgICMgRW52aXJvbm1lbnQgc2V0dXAsIGJ1aWxkIHByb2Nlc3MsIGRlcGVuZGVuY3kgbWFuYWdlbWVudApgYGAKClRoZXJlIGlzIG5vIGhhcmQgbGltaXQgb24gdGhlIG51bWJlciBvZiBjYXRlZ29yaWVzLiBgaW5kZXgubWRgIG1haW50YWlucyBjbGVhciBzdW1tYXJpZXMgZm9yIEFnZW50cyB0byBxdWlja2x5IGxvY2F0ZS4gVGhlIGBbK11gL2BbLV1gIG1hcmtpbmcgcnVsZXMgZm9yIGVhY2ggY2F0ZWdvcnkgZmlsZSBhcmUgY29uc2lzdGVudCB3aXRoIGBkZXZfY29yZS5tZGAuCgoqKldyaXRlIGNvbnZlbnRpb25zOioqCgp8IFR5cGUgfCBXcml0ZSBQYXRoIHwKfC0tLS0tLXwtLS0tLS0tLS0tLS18CnwgQXJjaGl0ZWN0dXJlIGRlY2lzaW9ucyAoZS5nLiwgT0F1dGgyICsgcmVmcmVzaCB0b2tlbiBhcHByb2FjaCkgfCBgYXJjaGl0ZWN0dXJlLm1kYCB8CnwgQ29kZSBwYXR0ZXJucyAoZS5nLiwgU3RhdGUgbWFjaGluZSB1c2luZyBTd2l0Y2ggKyBFbnVtKSB8IGBwYXR0ZXJucy5tZGAgfAp8IFRyb3VibGVzaG9vdGluZyBleHBlcmllbmNlIChlLmcuLCBTdGVwcyB0byBoYW5kbGUgYnVpbGQgZXJyb3JzKSB8IGB0cm91Ymxlc2hvb3RpbmcubWRgIHwKfCBFbnZpcm9ubWVudCBjb25maWd1cmF0aW9uIChlLmcuLCBTcGVjaWFsIGNvbXBpbGF0aW9uIGZsb3cpIHwgYHNldHVwLm1kYCB8CnwgUHJvamVjdCBhbmFseXNpcyByZXBvcnRzICh0ZXN0IHJldHJvc3BlY3RpdmVzLCBwcm9jZXNzIGFuYWx5c2lzLCBpc3N1ZSBzdW1tYXJpZXMpIHwgUHJvamVjdCByb290IGBkb2NzL3BoYXNlLXtOfS9gIHwKfCBVbmRlcnN0YW5kaW5nIG9mIHRoZSBzeXN0ZW0gKHNhbWUgZGlyZWN0b3J5IGFzIGFuYWx5c2lzIHJlcG9ydHMpIHwgUHJvamVjdCByb290IGBkb2NzL3BoYXNlLXtOfS9gIHwKClByb2hpYml0ZWQgZnJvbSB3cml0aW5nIHRvIHRoZSBrbm93bGVkZ2UgYmFzZTogYmVoYXZpb3JhbCBjb25zdHJhaW50cyAo4oaSIEFHRU5UUy5tZCksIG9wZXJhdGluZyBwcm9jZWR1cmVzICjihpIgSW5zdHJ1Y3Rpb25zKSwgd29ya3NwYWNlIG1haW50ZW5hbmNlIHJ1bGVzICjihpIgZGV2X2NvcmUubWQpLiBBZnRlciBlYWNoIHdyaXRlLCByZWNvcmQgaW4gdGhlIHB1YmxpYyBsb2cuCgojIyMjIEF1dG9tYXRpYyBXcml0aW5nIE1lY2hhbmlzbQoKKipUcmlnZ2VyIHRpbWluZyoqOiBBZnRlciBlYWNoIG5vbi10cml2aWFsIHRhc2sgaW4gYSBzZXNzaW9uIChleGNsdWRpbmcgcHVyZSBxdWVyeS9jb252ZXJzYXRpb24gb3BlcmF0aW9ucyksIHdoZW4gb3ZlcndyaXRpbmcgYGRldl9sYXN0Lm1kYCwgdGVtcG9yYXJpbHkgc3RvcmUgdGhpcyBzZXNzaW9uJ3MgKiprZXkgZXhwZXJpZW5jZSoqIGluIGl0LgoKKipFeHBlcmllbmNlIHN0YWdpbmcgZm9ybWF0KiogKHdyaXR0ZW4gdG8gYGRldl9sYXN0Lm1kYCk6Ci0gYC0gWyBdIFxge2NhdGVnb3J5fVxgOiB7ZXhwZXJpZW5jZSBkZXNjcmlwdGlvbn1gIOKAlCBwZW5kaW5nIHVzZXIgY29uZmlybWF0aW9uIHRvIGFyY2hpdmUgdG8ga2IvCgoqKkFyY2hpdmluZyBwcm9jZXNzKio6CjEuIEluIHRoZSBuZXh0IHNlc3Npb24sIHRoZSBBZ2VudCByZWFkcyBgZGV2X2xhc3QubWRgLiBJZiBpdCBmaW5kcyB1bmFyY2hpdmVkIGV4cGVyaWVuY2UgZW50cmllcywgaXQgcmVtaW5kcyB0aGUgdXNlciB0byBjb25maXJtLgoyLiBBZnRlciB1c2VyIGNvbmZpcm1hdGlvbiwgdGhlIEFnZW50IHdyaXRlcyB0aGUgZXhwZXJpZW5jZSB0byB0aGUgY29ycmVzcG9uZGluZyBrYi8gY2F0ZWdvcnkgZmlsZSAoYGFyY2hpdGVjdHVyZS5tZGAgLyBgcGF0dGVybnMubWRgIC8gYHRyb3VibGVzaG9vdGluZy5tZGAgLyBgc2V0dXAubWRgKS4KMy4gV3JpdGUgZm9ybWF0OiBFYWNoIGV4cGVyaWVuY2UgZW50cnkgc3RhcnRzIHdpdGggYCMjIFsrXSB7dGl0bGV9ICh7ZGF0ZX0pYCwgY29udGFpbmluZyBhIGRlc2NyaXB0aW9uIGFuZCBjb250ZXh0Lgo0LiBBZnRlciB3cml0aW5nLCB1cGRhdGUgdGhlICJSZWNlbnQgVXBkYXRlcyIgdGFibGUgaW4gYGtiL2luZGV4Lm1kYCBhbmQgcmVjb3JkIGluIHRoZSBwdWJsaWMgbG9nIGAub3BlbmZlZWwvbG9nL2AuCjUuIEZpbmFsbHksIG1hcmsgdGhlIGV4cGVyaWVuY2UgZW50cnkgaW4gYGRldl9sYXN0Lm1kYCBhcyBgW3hdYCAoYXJjaGl2ZWQpIG9yIGRlbGV0ZSBpdC4KCioqQXV0b21hdGljIHdyaXRlIGNyaXRlcmlhKiogKHdyaXRlIHdoZW4gYW55IGlzIG1ldCk6Ci0gU29sdmVkIGEgcHJldmlvdXNseSB1bmtub3duIGJ1aWxkL2Vudmlyb25tZW50IGlzc3VlCi0gRGlzY292ZXJlZCBhbmQgcmVjb3JkZWQgYSBjb2RlIHBhdHRlcm4vYmVzdCBwcmFjdGljZQotIE1hZGUgYW4gYXJjaGl0ZWN0dXJlIGRlY2lzaW9uIHRoYXQgYWZmZWN0cyBmdXR1cmUgZGV2ZWxvcG1lbnQKLSBFbmNvdW50ZXJlZCBhIG5vdGFibGUgcGl0ZmFsbC90cm91Ymxlc2hvb3RpbmcgZXhwZXJpZW5jZQoKVGhpcyBwcm9jZXNzIGVuc3VyZXMgdGhhdCB0aGUgQWdlbnQncyBleHBlcmllbmNlIGRvZXMgbm90IGRpc2FwcGVhciB3aXRoIHNlc3Npb24gbG9zcywgYW5kIHRoZSBrbm93bGVkZ2UgYmFzZSBncm93cyBjb250aW51b3VzbHkgd2l0aCB0aGUgcHJvamVjdC4KCi0tLQoKIyMgUHJpdmF0ZSBEb21haW4KCj4gLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vCgpUaGUgcHJpdmF0ZSBkb21haW4gZGlyZWN0b3J5LiBFYWNoIHRpbWUgdGhlIEFnZW50IG9idGFpbnMgdGhlIGN1cnJlbnQgdXNlcm5hbWUgZnJvbSBgLm9wZW5mZWVsLy5pbmZvLmpzb25gIHRvIGRldGVybWluZSB0aGUgY29ycmVzcG9uZGluZyBwYXRoLiBBZnRlciBjb2RlIG1vZGlmaWNhdGlvbnMsIHN5bmNocm9ub3VzbHkgdXBkYXRlIHJlbGF0ZWQgZmlsZXMgaW4gdGhlIHByaXZhdGUgZG9tYWluIChwbGFucywgbG9ncywgbm90ZXMsIGV0Yy4pIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IHdpdGggdGhlIGFjdHVhbCBzdGF0ZS4KCiMjIyBQZXJzb25hbCBPcGVyYXRpb24gU3RhdHVzCgo+IC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L2Rldl9sYXN0Lm1kCgpSZWNvcmRzIHRoZSBicmllZiBzdGF0ZSBhdCB0aGUgZW5kIG9mIHRoZSBsYXN0IG9wZXJhdGlvbiwgb3ZlcndyaXR0ZW4gYXQgdGhlIGVuZCBvZiBlYWNoIGNvbnZlcnNhdGlvbi4gQXQgdGhlIG5leHQgc3RhcnR1cCwgcmVhZCBpdCBmaXJzdCB0byByZXN0b3JlIGNvbnRleHQuIElmIHRoZSBjb250ZW50IGNvbnRyYWRpY3RzIHRoZSBjdXJyZW50IGNvbnZlcnNhdGlvbiwgbWFyayBpdCBhcyAibWF5IGJlIG91dGRhdGVkIiBhbmQgY29uZmlybSB3aXRoIHRoZSB1c2VyLgoKKipUZW1wbGF0ZSoqOgpgYGBtYXJrZG93bgojIExhc3QgT3BlcmF0aW9uIFN0YXR1cwotIFRpbWU6IHl5eXktbW0tZGQgSEg6TU0KLSBTdGFnZToge2N1cnJlbnQgcGxhbiBzdGFnZX0KLSBPcGVyYXRpb246IHtvbmUtc2VudGVuY2UgZGVzY3JpcHRpb259Ci0gRmlsZXM6IHtrZXkgZmlsZXMgYWRkZWQgb3IgbW9kaWZpZWR9Ci0gQ3VycmVudCBTdGF0ZToge3N0YWdlIHByb2dyZXNzLCBlLmcuLCAzLzcgdGFza3MgY29tcGxldGVkfQoKIyMgVXNlciBQcmVmZXJlbmNlcwotIExhbmd1YWdlOiB7bGFuZ30KLSBBdXRvIEFkdmFuY2U6IHthdXRvX2FkdmFuY2V9Ci0gUmV2aWV3IE1vZGU6IHtyZXZpZXdfbW9kZX0KLSBDb21tdW5pY2F0aW9uOiB7Y29tbXVuaWNhdGlvbn0KLSBDb25maXJtIFRocmVzaG9sZDoge2NvbmZpcm1fdGhyZXNob2xkfQoKIyMgQ29udGV4dCBTbmFwc2hvdAotIEN1cnJlbnQgUGlwZWxpbmUgUGhhc2U6IHtwaGFzZX0KLSBBY3RpdmUgU3RhZ2VzOiB7YWN0aXZlX3N0YWdlc30KLSBMYXN0IE9wZXJhdGlvbiBTdW1tYXJ5OiB7b25lIHNlbnRlbmNlfQoKIyMgUGVuZGluZyBJdGVtcwotIFsgXSB7dW5maW5pc2hlZCB0YXNrc30KLSBbIF0ge2Jsb2NrZXJzfQoKIyMgS2V5IERlY2lzaW9ucwotIHtpbXBvcnRhbnQgYXJjaGl0ZWN0dXJlIG9yIGRlc2lnbiBkZWNpc2lvbnMgZnJvbSB0aGlzIHNlc3Npb259CgojIyBEZWNpc2lvbiBIaXN0b3J5CihOZXcgZGVjaXNpb25zIGZyb20gdGhpcyBzZXNzaW9uIGFyZSBhcHBlbmRlZCBoZXJlIGluIHRoZSBmb3JtYXQgYC0gW3hdIHtkYXRlfToge2RlY2lzaW9uIGRlc2NyaXB0aW9ufWApCgojIyBFeHBlcmllbmNlIFN0YWdpbmcKLSBbIF0gYGFyY2hpdGVjdHVyZWA6IHthcmNoaXRlY3R1cmUgZGVjaXNpb25zIHBlbmRpbmcgYXJjaGl2aW5nfQotIFsgXSBgcGF0dGVybnNgOiB7Y29kZSBwYXR0ZXJucyBwZW5kaW5nIGFyY2hpdmluZ30KLSBbIF0gYHRyb3VibGVzaG9vdGluZ2A6IHt0cm91Ymxlc2hvb3RpbmcgZXhwZXJpZW5jZSBwZW5kaW5nIGFyY2hpdmluZ30KLSBbIF0gYHNldHVwYDoge2Vudmlyb25tZW50IGNvbmZpZ3VyYXRpb24gcGVuZGluZyBhcmNoaXZpbmd9CmBgYAoKVGhpcyB0ZW1wbGF0ZSBlbnN1cmVzIHRoYXQgY3Jvc3Mtc2Vzc2lvbiBjb250ZXh0IGlzIHJlc3RvcmVkIHRvIGEgbGV2ZWwgc3VmZmljaWVudCB0byBleGVjdXRlIHRoZSBuZXh0IHRhc2ssIHdoaWxlIGFsc28gc3VwcG9ydGluZyB0aGUgZXhwZXJpZW5jZSBzdGFnaW5nIGZ1bmN0aW9uIHRoYXQgdW5kZXJwaW5zIHRoZSBhdXRvbWF0aWMga25vd2xlZGdlIGJhc2Ugd3JpdGluZyBtZWNoYW5pc20uICoqV3JpdGUgaW5zdHJ1Y3Rpb25zKio6IEZlZWwgZmlsbHMgdGhlICJVc2VyIFByZWZlcmVuY2VzIiBzZWN0aW9uIGZyb20gYHJlYWRQcm9maWxlKClgIGdsb2JhbCBwcmVmZXJlbmNlcyBhdCBzdGFydHVwOyBhcHBlbmRzIHRlY2huaWNhbC9hcmNoaXRlY3R1cmUgZGVjaXNpb25zIHRvICJEZWNpc2lvbiBIaXN0b3J5IiBkdXJpbmcgdGhlIHNlc3Npb247IHVwZGF0ZXMgdGhlICJDb250ZXh0IFNuYXBzaG90IiBzZWN0aW9uIGV2ZXJ5IHRpbWUgaXQgd3JpdGVzIGRldl9sYXN0Lm1kLgoKIyMjIFBlcnNvbmFsIE5vdGVzCgo+IC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L25vdGUvCgpUaGUgKipwcmltYXJ5IGxvY2F0aW9uKiogZm9yIGxlc3NvbnMgbGVhcm5lZC4gQnJpZWYgZGVzY3JpcHRpb25zOyBkZXRhaWxzIGdvIGludG8gc3ViLWZpbGVzIHdpdGggYW4gaW5kZXguIEluIGVhY2ggY29udmVyc2F0aW9uLCB0aGUgQWdlbnQgbWF5IHJhbmRvbWx5IHJlbWluZCB0aGUgdXNlciB3aGV0aGVyIHRvIHN1Ym1pdCB0byB0aGUgcHVibGljIG5vdGUgYGRldi9ub3RlL2Rldl9ub3RlLm1kYC4gQWZ0ZXIgc3VibWlzc2lvbiwgYW5ub3RhdGUgIlN1Ym1pdHRlZCB0byBwdWJsaWMgZG9tYWluIiB3aXRoIGEganVtcCBsaW5rLgoKIyMjIFBlcnNvbmFsIExvZ3MKCj4gLm9wZW5mZWVsL3VzZXJzL3t1c2VybmFtZX0vbG9nLwoKVGhlICoqcHJpbWFyeSBsb2NhdGlvbioqIGZvciBkYWlseSBvcGVyYXRpb25zLiBTdHJ1Y3R1cmUgY29uc2lzdGVudCB3aXRoIHRoZSBwdWJsaWMgbG9nIGRpcmVjdG9yeS4gRmlsZSBuYW1pbmcgZm9ybWF0OiBgeXl5eS1tbS1kZC1OTk4ubWRgIChubyB1c2VybmFtZSBuZWVkZWQsIGFzIGl0IGlzIGFscmVhZHkgdW5kZXIgdGhlIHVzZXIncyBkaXJlY3RvcnkpLgoKIyMjIENvZGUgUmV2aWV3Cgo+IC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L2NvZGVfcmV2aWV3LwoKTWFuYWdlcyBjb2RlIHJldmlldyBpc3N1ZXMgZHVyaW5nIHRoZSBkZXZlbG9wbWVudCBzdGFnZSAoYXJjaGl0ZWN0dXJlLCBjb252ZW50aW9ucywgbG9naWMpLCBvcmdhbml6ZWQgYnkgcGxhbiBzdGFnZS4gU2VwYXJhdGVkIGZyb20gQnVnIHRyYWNraW5nLgoKKipSb2xlIGRpdmlzaW9uOioqCi0gKipvcGVuZmVlbC1yZXZpZXdlcioqOiBSZXZpZXdzIGNvZGUgYWNjb3JkaW5nIHRvIHRoZSBwbGFuIHN0YWdlLCBzdWJtaXRzIGlzc3VlcywgdmVyaWZpZXMgZml4IHJlc3VsdHMuCi0gKipvcGVuZmVlbC1leGVjdXRvcioqOiBIYW5kbGVzIHJldmlldyBpc3N1ZXMsIG1vZGlmaWVzIGNvZGUgYW5kIHVwZGF0ZXMgc3RhdHVzLgoKUmV2aWV3IGlzc3VlcyBmb3IgZWFjaCBwbGFuIHN0YWdlIGFyZSBjb25zb2xpZGF0ZWQgaW4gYFJFVi17cGxhbl9zdGFnZX0ubWRgLiBFbnRyeSB0ZW1wbGF0ZToKCmBgYG1hcmtkb3duCiMjIFJFVi17Tk99OiB7QnJpZWYgVGl0bGV9Ci0gKipTdGF0dXMqKjogcGVuZGluZyB8IGZpeGluZyB8IHJlc29sdmVkIHwgY2xvc2VkCi0gKipQcmlvcml0eSoqOiBoaWdoIHwgbWVkaXVtIHwgbG93Ci0gKipBdXRob3IqKjogb3BlbmZlZWwtcmV2aWV3ZXIKLSAqKkNyZWF0ZWQqKjogeXl5eS1tbS1kZCBISDpNTQoKIyMjIElzc3VlIERlc2NyaXB0aW9uCi4uLgoKIyMjIFByb2Nlc3NpbmcgUmVjb3JkCnwgVGltZSB8IE9wZXJhdG9yIHwgRGVzY3JpcHRpb24gfCBDb21taXQgfAp8LS0tLS0tfC0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLXwKCiMjIyBBY2NlcHRhbmNlIFJlY29yZAp8IFRpbWUgfCBvcGVuZmVlbC1yZXZpZXdlciB8IENvbmNsdXNpb24gfCBOb3RlcyB8CnwtLS0tLS18LS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18LS0tLS0tLXwKYGBgCgpUaGUgcm9vdCBtYWludGFpbnMgYGluZGV4Lm1kYCAoZ3JvdXBlZCBieSBzdGFnZSwgd2l0aCBzdGF0dXMgY291bnQgc3RhdGlzdGljcyBhdCB0aGUgdG9wKSBhbmQgYGxvZy5tZGAgKGxhc3QgMzAgcmV2aWV3IGNoYW5nZSBzdW1tYXJpZXMpLgoKV2hlbiBhIHJldmlldyBpc3N1ZSBpcyBtYXJrZWQgYXMgYHBlbmRpbmdgIHdpdGggYGhpZ2hgIHByaW9yaXR5LCB0aGUgaXNzdWUgZGV0YWlscyAodGl0bGUsIGRlc2NyaXB0aW9uLCBpbXBhY3Qgc2NvcGUpIG11c3QgYmUgd3JpdHRlbiB0byB0aGUgcHVibGljIGxvZyB0byBlbnN1cmUgdGltZWx5IHRlYW0gdmlzaWJpbGl0eS4gV2hlbiBhbiBpdGVtIGlzIGBjbG9zZWRgLCB0aGUgY29yZSBjb25jbHVzaW9uIGlzIHdyaXR0ZW4gdG8gYC5vcGVuZmVlbC9jb2RlX3Jldmlldy97c3RhZ2V9Lm1kYCwgYW5kIGJyaWVmbHkgcmVjb3JkZWQgaW4gdGhlIHB1YmxpYyBsb2cuCgojIyMgQnVnIFRyYWNraW5nCgo+IC5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L2J1Z3MvCgpNYW5hZ2VzIGRlZmVjdHMgZm91bmQgZHVyaW5nIHRoZSB0ZXN0aW5nIHBoYXNlLCBvcmdhbml6ZWQgYnkgbW9kdWxlLiBTZXBhcmF0ZWQgZnJvbSBjb2RlIHJldmlldy4KCioqUm9sZSBkaXZpc2lvbjoqKgotICoqb3BlbmZlZWwtZmVlbC10ZXN0ZXIqKjogU3VibWl0cyBCdWdzIGFuZCBwZXJmb3JtcyBmaW5hbCBhY2NlcHRhbmNlLgotICoqb3BlbmZlZWwtZXhlY3V0b3IqKjogRml4ZXMgQnVncyBieSBtb2R1bGUuIE9uIHNlc3Npb24gc3RhcnQsIHVzZXMgYGxvYWQgc2tpbGwgb3BlbmZlZWwtZ2V0LWJ1Z3NgIHRvIGdldCBwZW5kaW5nIEJ1Z3MgZm9yIHRoZSByZXNwb25zaWJsZSBtb2R1bGUuCgpCdWdzIGFyZSBvcmdhbml6ZWQgaW4gbW9kdWxlIHN1YmRpcmVjdG9yaWVzLiBCdWcgbmFtaW5nIGluIGVhY2ggbW9kdWxlIGRpcmVjdG9yeTogYEJVRy17Tk5OfV97YnJpZWZfdGl0bGV9Lm1kYCAoTk5OIGluY3JlbWVudHMgd2l0aGluIHRoZSBtb2R1bGUpOgoKYGBgCi5vcGVuZmVlbC91c2Vycy97dXNlcm5hbWV9L2J1Z3MvCuKUnOKUgOKUgCBpbmRleC5tZCAgICAgICAgICAgICAgIyBHcm91cGVkIGJ5IG1vZHVsZSAoIyMjIHttb2R1bGVfbmFtZX0gQHtyZXNwb25zaWJsZV9BZ2VudF9uYW1lfSkK4pSc4pSA4pSAIGxvZy5tZCAgICAgICAgICAgICAgICAjIExhc3QgMzAgY2hhbmdlIHN1bW1hcmllcwrilJzilIDilIAge21vZHVsZV9hfS8K4pSCICAg4pSc4pSA4pSAIEJVRy0wMDFfdGl0bGUubWQK4pSCICAg4pSU4pSA4pSAIEJVRy0wMDJfdGl0bGUubWQK4pSU4pSA4pSAIHttb2R1bGVfYn0vCiAgICDilJTilIDilIAgQlVHLTAwMV90aXRsZS5tZApgYGAKCldoZW4gYSBCdWcgaXMgbWFya2VkIGFzIGBvcGVuYCB3aXRoIGBoaWdoYCBwcmlvcml0eSwgdGhlIGRlZmVjdCBkZXRhaWxzICh0aXRsZSwgZGVzY3JpcHRpb24sIHJlcHJvZHVjdGlvbiBzdGVwcywgYWZmZWN0ZWQgbW9kdWxlcykgbXVzdCBiZSB3cml0dGVuIHRvIHRoZSBwdWJsaWMgbG9nIHRvIGVuc3VyZSB0aW1lbHkgdGVhbSB2aXNpYmlsaXR5LiBXaGVuIGFuIGl0ZW0gaXMgYGNsb3NlZGAsIHRoZSBjb3JlIGNvbmNsdXNpb24gaXMgd3JpdHRlbiB0byBgLm9wZW5mZWVsL2J1Z3Mve21vZHVsZX0ubWRgLCBhbmQgYnJpZWZseSByZWNvcmRlZCBpbiB0aGUgcHVibGljIGxvZy4KCiMjIyBSZXZpZXcvQnVnIExpZmVjeWNsZQoKQm90aCBzaGFyZSB0aGUgc2FtZSBzdGF0ZSBmbG93IG1vZGVsIChvbmx5IHRoZSBzdGFydGluZyBzdGF0ZSBuYW1lIGRpZmZlcnMpOgoKYGBgCnBlbmRpbmcvb3BlbiAg4pSA4pSA4oaSICBmaXhpbmcgIOKUgOKUgOKGkiAgcmVzb2x2ZWQgIOKUgOKUgOKGkiAgY2xvc2VkCiAgICAgIOKGkSAgICAgICAgICAgICAgICAgICAgICAgICDilIIKICAgICAg4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAIOmqjOaUtuS4jemAmui/hyDilIDilIDilIDilJgKYGBgCgp8IFN0YXRlIHwgQ29kZSBSZXZpZXcgfCBCdWcgVHJhY2tpbmcgfCBPcGVyYXRvciB8CnwtLS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS18CnwgU3RhcnQgfCBgcGVuZGluZ2AgfCBgb3BlbmAgfCBTdWJtaXR0ZWQgYnkgb3BlbmZlZWwtcmV2aWV3ZXIgLyBvcGVuZmVlbC1mZWVsLXRlc3RlciB8CnwgRml4aW5nIHwgYGZpeGluZ2AgfCBgZml4aW5nYCB8IEFzc2lnbmVkIHRvIG9wZW5mZWVsLWV4ZWN1dG9yIHwKfCBSZWFkeSBmb3IgYWNjZXB0YW5jZSB8IGByZXNvbHZlZGAgfCBgcmVzb2x2ZWRgIHwgQ29tcGxldGVkIGJ5IG9wZW5mZWVsLWV4ZWN1dG9yIHwKfCBDbG9zZWQgfCBgY2xvc2VkYCB8IGBjbG9zZWRgIHwgQWNjZXB0ZWQgYnkgb3BlbmZlZWwtcmV2aWV3ZXIgLyBvcGVuZmVlbC1mZWVsLXRlc3RlciB8CgojIyMgUGVyc29uYWwgVGVtcG9yYXJ5IERpcmVjdG9yeQoKPiAub3BlbmZlZWwvdXNlcnMve3VzZXJuYW1lfS90bXAvCgpTdG9yZXMgdGVtcG9yYXJ5IGZpbGVzIGZvciB0aGUgY3VycmVudCB1c2VyLCBmdWxseSBpc29sYXRlZCBmcm9tIG90aGVyIHVzZXJzLgo=',
6744
- adapter: 'IyBPcGVuQ29kZSBQbGF0Zm9ybSBBZGFwdGVyCgpUaGlzIGlzIHRoZSBPcGVuQ29kZSBwbGF0Zm9ybSBhZGFwdGVyLCBjb250YWluaW5nIDkgQWdlbnQgZGVmaW5pdGlvbnMgYW5kIDE0IFNraWxscy4KCkFmdGVyIGRlcGxveW1lbnQsIHRoZSBmb2xsb3dpbmcgZmlsZXMgd2lsbCBiZSBnZW5lcmF0ZWQgaW4gdGhlIHRhcmdldCBwcm9qZWN0OgoKLSBgb3BlbmNvZGUuanNvbmNgIOKAlCBPcGVuQ29kZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIChBZ2VudCBtb2RlbHMsIFNraWxscyBsaXN0LCBldGMuKQotIGAub3BlbmNvZGUvYWdlbnRzL2Ag4oCUIDkgQWdlbnQgZGVmaW5pdGlvbnMgKGZlZWwsIG9wZW5mZWVsLXBsYW5uZXIsIG9wZW5mZWVsLXNjaGVtZXIsIG9wZW5mZWVsLWV4ZWN1dG9yLCBvcGVuZmVlbC1yZXZpZXdlciwgb3BlbmZlZWwtZmVlbC10ZXN0ZXIsIG9wZW5mZWVsLXZpc2lvbiwgb3BlbmZlZWwtYXJjaGl2ZXIsIG9wZW5mZWVsLXV0aWxpdHkpCi0gYC5vcGVuY29kZS9za2lsbHMvYCDigJQgMTQgU2tpbGwgZGVmaW5pdGlvbnMgKG9wZW5mZWVsLWFnZW50LW1vZGVsLWNoZWNrLCBvcGVuZmVlbC1idWctYWNjZXB0YW5jZSwgb3BlbmZlZWwtY2hlY2sta2IsIG9wZW5mZWVsLWdldC1idWdzLCBvcGVuZmVlbC1nZXQtc3RhZ2Utc3RhdHVzLCBvcGVuZmVlbC1oZWFsdGgsIG9wZW5mZWVsLW1vZGVsLWNoZWNrLCBvcGVuZmVlbC1tb2RlbC1jb25maWcsIG9wZW5mZWVsLXJlY292ZXIsIG9wZW5mZWVsLXJvYWRtYXAsIG9wZW5mZWVsLXNlYXJjaC1rYiwgb3BlbmZlZWwtc3luYy1zdGF0dXMsIG9wZW5mZWVsLXVwZGF0ZS1zdGFnZS1zdGF0dXMsIG9wZW5mZWVsLXdpemFyZCkKLSBgLm9wZW5jb2RlL2luc3RydWN0aW9ucy9jb3JlLm1kYCDigJQgUGxhdGZvcm0gb3BlcmF0aW9uIGluc3RydWN0aW9ucwotIGAub3BlbmNvZGUvQURBUFRFUi5tZGAg4oCUIFRoaXMgYWRhcHRlciBkb2N1bWVudGF0aW9uCi0gYC5vcGVuY29kZS8uZ2l0aWdub3JlYCDigJQgSWdub3JlIHJ1bGVzCgo+IE5vdGU6IFRoaXMgcHJvamVjdCBkb2VzIG5vdCBkZXBsb3kgYHBhY2thZ2UuanNvbmAgKG1hbmFnZWQgYnkgdGhlIHVzZXIncyBwcm9qZWN0IGl0c2VsZikuCg==',
7424
+ adapter: 'IyBPcGVuQ29kZSBQbGF0Zm9ybSBBZGFwdGVyCgpUaGlzIGlzIHRoZSBPcGVuQ29kZSBwbGF0Zm9ybSBhZGFwdGVyLCBjb250YWluaW5nIDkgQWdlbnQgZGVmaW5pdGlvbnMgYW5kIDE0IFNraWxscy4KCkFmdGVyIGRlcGxveW1lbnQsIHRoZSBmb2xsb3dpbmcgZmlsZXMgd2lsbCBiZSBnZW5lcmF0ZWQgaW4gdGhlIHRhcmdldCBwcm9qZWN0OgoKLSBgb3BlbmNvZGUuanNvbmNgIOKAlCBPcGVuQ29kZSBwbGF0Zm9ybSBjb25maWd1cmF0aW9uIChBZ2VudCBtb2RlbHMsIFNraWxscyBsaXN0LCBldGMuKQotIGAub3BlbmNvZGUvYWdlbnRzL2Ag4oCUIDkgQWdlbnQgZGVmaW5pdGlvbnMgKGZlZWwsIG9wZW5mZWVsLXBsYW5uZXIsIG9wZW5mZWVsLXNjaGVtZXIsIG9wZW5mZWVsLWV4ZWN1dG9yLCBvcGVuZmVlbC1yZXZpZXdlciwgb3BlbmZlZWwtZmVlbC10ZXN0ZXIsIG9wZW5mZWVsLXZpc2lvbiwgb3BlbmZlZWwtYXJjaGl2ZXIsIG9wZW5mZWVsLXV0aWxpdHkpCi0gYC5vcGVuY29kZS9za2lsbHMvYCDigJQgMTQgU2tpbGwgZGVmaW5pdGlvbnMgKG9wZW5mZWVsLWFnZW50LW1vZGVsLWNoZWNrLCBvcGVuZmVlbC1idWctYWNjZXB0YW5jZSwgb3BlbmZlZWwtY2hlY2sta2IsIG9wZW5mZWVsLWdldC1idWdzLCBvcGVuZmVlbC1nZXQtc3RhZ2Utc3RhdHVzLCBvcGVuZmVlbC1oZWFsdGgsIG9wZW5mZWVsLW1vZGVsLWNoZWNrLCBvcGVuZmVlbC1tb2RlbC1jb25maWcsIG9wZW5mZWVsLXJlY292ZXIsIG9wZW5mZWVsLXJvYWRtYXAsIG9wZW5mZWVsLXNlYXJjaC1rYiwgb3BlbmZlZWwtc3luYy1zdGF0dXMsIG9wZW5mZWVsLXVwZGF0ZS1zdGFnZS1zdGF0dXMsIG9wZW5mZWVsLXdpemFyZCkKLSBgLm9wZW5jb2RlL0FEQVBURVIubWRgIOKAlCBUaGlzIGFkYXB0ZXIgZG9jdW1lbnRhdGlvbgotIGAub3BlbmNvZGUvLmdpdGlnbm9yZWAg4oCUIElnbm9yZSBydWxlcwoKPiBOb3RlOiBUaGlzIHByb2plY3QgZG9lcyBub3QgZGVwbG95IGBwYWNrYWdlLmpzb25gIChtYW5hZ2VkIGJ5IHRoZSB1c2VyJ3MgcHJvamVjdCBpdHNlbGYpLgo=',
6745
7425
  }
6746
7426
  };
6747
7427
  // AUTO-GENERATED-END: OPENCODE_CONFIG_TEMPLATES
6748
- // 兼容旧导出(供 templates.ts 和 init.ts 平滑迁移)
7428
+ // 兼容旧导出(供 templates.ts 平滑迁移)
6749
7429
  export const AGENTS_MD_TEMPLATE = AGENTS_MD_TEMPLATES['zh-CN'];
6750
- export const CORE_INSTRUCTIONS_TEMPLATE_B64 = CORE_INSTRUCTIONS_TEMPLATES['zh-CN'];
6751
7430
  /**
6752
7431
  * 加载 opencode Agent 模板(用于部署 .opencode/agents/)
6753
7432
  * 指定语言不存在时回退到 zh-CN
@@ -6771,8 +7450,8 @@ export function loadOpencodeSkillTemplate(skillName) {
6771
7450
  return content;
6772
7451
  }
6773
7452
  /**
6774
- * 加载 opencode 配置类模板(instructions / adapter)
6775
- * instructions 与 adapter 以 Base64 存储(与 core-instructions 一致),加载时解码
7453
+ * 加载 opencode 配置类模板(adapter)
7454
+ * adapter 以 Base64 存储(与旧 instructions 一致),加载时解码
6776
7455
  * 指定语言不存在时回退到 zh-CN
6777
7456
  */
6778
7457
  export function loadOpencodeConfigTemplate(lang, configName) {
@@ -6781,8 +7460,8 @@ export function loadOpencodeConfigTemplate(lang, configName) {
6781
7460
  if (content === undefined) {
6782
7461
  throw new Error(`Opencode config template not found: ${configName} (lang=${lang})`);
6783
7462
  }
6784
- // Base64 编码的键(instructions / adapter)在加载时解码
6785
- if (configName === 'instructions' || configName === 'adapter') {
7463
+ // Base64 编码的键(adapter)在加载时解码
7464
+ if (configName === 'adapter') {
6786
7465
  return Buffer.from(content, 'base64').toString('utf-8');
6787
7466
  }
6788
7467
  return content;