homegraph 1.5.2 → 1.5.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/CHANGELOG.md +156 -0
  2. package/README.md +63 -10
  3. package/dist/addons/dynamic-import.d.ts +18 -0
  4. package/dist/addons/dynamic-import.d.ts.map +1 -0
  5. package/dist/addons/dynamic-import.js +25 -0
  6. package/dist/addons/dynamic-import.js.map +1 -0
  7. package/dist/addons/init-template.d.ts +15 -0
  8. package/dist/addons/init-template.d.ts.map +1 -0
  9. package/dist/addons/init-template.js +290 -0
  10. package/dist/addons/init-template.js.map +1 -0
  11. package/dist/addons/loader.d.ts +18 -0
  12. package/dist/addons/loader.d.ts.map +1 -0
  13. package/dist/addons/loader.js +88 -0
  14. package/dist/addons/loader.js.map +1 -0
  15. package/dist/addons/manager.d.ts +106 -0
  16. package/dist/addons/manager.d.ts.map +1 -0
  17. package/dist/addons/manager.js +437 -0
  18. package/dist/addons/manager.js.map +1 -0
  19. package/dist/addons/paths.d.ts +22 -0
  20. package/dist/addons/paths.d.ts.map +1 -0
  21. package/dist/addons/paths.js +65 -0
  22. package/dist/addons/paths.js.map +1 -0
  23. package/dist/addons/registry.d.ts +38 -0
  24. package/dist/addons/registry.d.ts.map +1 -0
  25. package/dist/addons/registry.js +160 -0
  26. package/dist/addons/registry.js.map +1 -0
  27. package/dist/addons/semver.d.ts +21 -0
  28. package/dist/addons/semver.d.ts.map +1 -0
  29. package/dist/addons/semver.js +79 -0
  30. package/dist/addons/semver.js.map +1 -0
  31. package/dist/addons/types.d.ts +51 -0
  32. package/dist/addons/types.d.ts.map +1 -0
  33. package/dist/addons/types.js +14 -0
  34. package/dist/addons/types.js.map +1 -0
  35. package/dist/addons/validate.d.ts +38 -0
  36. package/dist/addons/validate.d.ts.map +1 -0
  37. package/dist/addons/validate.js +165 -0
  38. package/dist/addons/validate.js.map +1 -0
  39. package/dist/arkui/index.d.ts +4 -0
  40. package/dist/arkui/index.d.ts.map +1 -0
  41. package/dist/arkui/index.js +23 -0
  42. package/dist/arkui/index.js.map +1 -0
  43. package/dist/arkui/migrate-passage.d.ts +28 -0
  44. package/dist/arkui/migrate-passage.d.ts.map +1 -0
  45. package/dist/arkui/migrate-passage.js +310 -0
  46. package/dist/arkui/migrate-passage.js.map +1 -0
  47. package/dist/arkui/migrate-semantics.d.ts +47 -0
  48. package/dist/arkui/migrate-semantics.d.ts.map +1 -0
  49. package/dist/arkui/migrate-semantics.js +229 -0
  50. package/dist/arkui/migrate-semantics.js.map +1 -0
  51. package/dist/arkui/migrate-snapshot.d.ts +79 -0
  52. package/dist/arkui/migrate-snapshot.d.ts.map +1 -0
  53. package/dist/arkui/migrate-snapshot.js +364 -0
  54. package/dist/arkui/migrate-snapshot.js.map +1 -0
  55. package/dist/bin/addon-commands.d.ts +27 -0
  56. package/dist/bin/addon-commands.d.ts.map +1 -0
  57. package/dist/bin/addon-commands.js +254 -0
  58. package/dist/bin/addon-commands.js.map +1 -0
  59. package/dist/bin/fatal-handler.js +2 -2
  60. package/dist/bin/homegraph.js +111 -157
  61. package/dist/bin/homegraph.js.map +1 -1
  62. package/dist/bin/node-version-check.d.ts +6 -15
  63. package/dist/bin/node-version-check.d.ts.map +1 -1
  64. package/dist/bin/node-version-check.js +8 -37
  65. package/dist/bin/node-version-check.js.map +1 -1
  66. package/dist/db/index.d.ts +36 -1
  67. package/dist/db/index.d.ts.map +1 -1
  68. package/dist/db/index.js +92 -6
  69. package/dist/db/index.js.map +1 -1
  70. package/dist/db/migrations.d.ts +1 -1
  71. package/dist/db/migrations.d.ts.map +1 -1
  72. package/dist/db/migrations.js +15 -1
  73. package/dist/db/migrations.js.map +1 -1
  74. package/dist/db/queries.d.ts +42 -0
  75. package/dist/db/queries.d.ts.map +1 -1
  76. package/dist/db/queries.js +177 -10
  77. package/dist/db/queries.js.map +1 -1
  78. package/dist/db/schema.sql +6 -1
  79. package/dist/db/sqlite-adapter.d.ts +7 -3
  80. package/dist/db/sqlite-adapter.d.ts.map +1 -1
  81. package/dist/db/sqlite-adapter.js +44 -3
  82. package/dist/db/sqlite-adapter.js.map +1 -1
  83. package/dist/extraction/extraction-version.d.ts +1 -1
  84. package/dist/extraction/extraction-version.js +1 -1
  85. package/dist/extraction/generated-detection.d.ts +42 -11
  86. package/dist/extraction/generated-detection.d.ts.map +1 -1
  87. package/dist/extraction/generated-detection.js +141 -20
  88. package/dist/extraction/generated-detection.js.map +1 -1
  89. package/dist/extraction/index.d.ts +42 -0
  90. package/dist/extraction/index.d.ts.map +1 -1
  91. package/dist/extraction/index.js +96 -0
  92. package/dist/extraction/index.js.map +1 -1
  93. package/dist/extraction/languages/arkts.d.ts +33 -2
  94. package/dist/extraction/languages/arkts.d.ts.map +1 -1
  95. package/dist/extraction/languages/arkts.js +525 -129
  96. package/dist/extraction/languages/arkts.js.map +1 -1
  97. package/dist/extraction/wasm-runtime-flags.d.ts.map +1 -1
  98. package/dist/extraction/wasm-runtime-flags.js +9 -6
  99. package/dist/extraction/wasm-runtime-flags.js.map +1 -1
  100. package/dist/graph-sources.d.ts +41 -0
  101. package/dist/graph-sources.d.ts.map +1 -0
  102. package/dist/graph-sources.js +82 -0
  103. package/dist/graph-sources.js.map +1 -0
  104. package/dist/index.d.ts +20 -1
  105. package/dist/index.d.ts.map +1 -1
  106. package/dist/index.js +79 -9
  107. package/dist/index.js.map +1 -1
  108. package/dist/installer/index.d.ts.map +1 -1
  109. package/dist/installer/index.js +0 -48
  110. package/dist/installer/index.js.map +1 -1
  111. package/dist/installer/targets/antigravity.js +1 -1
  112. package/dist/installer/targets/antigravity.js.map +1 -1
  113. package/dist/installer/targets/deveco.js +1 -1
  114. package/dist/installer/targets/deveco.js.map +1 -1
  115. package/dist/installer/targets/hermes.d.ts +1 -1
  116. package/dist/installer/targets/hermes.js +2 -2
  117. package/dist/installer/targets/hermes.js.map +1 -1
  118. package/dist/installer/targets/opencode.js +1 -1
  119. package/dist/installer/targets/opencode.js.map +1 -1
  120. package/dist/installer/targets/shared.js +1 -1
  121. package/dist/installer/targets/shared.js.map +1 -1
  122. package/dist/mcp/daemon-paths.d.ts +5 -4
  123. package/dist/mcp/daemon-paths.d.ts.map +1 -1
  124. package/dist/mcp/daemon-paths.js +28 -13
  125. package/dist/mcp/daemon-paths.js.map +1 -1
  126. package/dist/mcp/daemon-registry.d.ts.map +1 -1
  127. package/dist/mcp/daemon-registry.js +4 -1
  128. package/dist/mcp/daemon-registry.js.map +1 -1
  129. package/dist/mcp/daemon.d.ts +1 -1
  130. package/dist/mcp/daemon.js +1 -1
  131. package/dist/mcp/engine.d.ts.map +1 -1
  132. package/dist/mcp/engine.js +12 -3
  133. package/dist/mcp/engine.js.map +1 -1
  134. package/dist/mcp/explore-dedup.d.ts +137 -0
  135. package/dist/mcp/explore-dedup.d.ts.map +1 -0
  136. package/dist/mcp/explore-dedup.js +236 -0
  137. package/dist/mcp/explore-dedup.js.map +1 -0
  138. package/dist/mcp/explore-repeat-guard.d.ts +123 -0
  139. package/dist/mcp/explore-repeat-guard.d.ts.map +1 -0
  140. package/dist/mcp/explore-repeat-guard.js +503 -0
  141. package/dist/mcp/explore-repeat-guard.js.map +1 -0
  142. package/dist/mcp/explore-session-state.d.ts +237 -0
  143. package/dist/mcp/explore-session-state.d.ts.map +1 -0
  144. package/dist/mcp/explore-session-state.js +353 -0
  145. package/dist/mcp/explore-session-state.js.map +1 -0
  146. package/dist/mcp/index.d.ts.map +1 -1
  147. package/dist/mcp/index.js +4 -7
  148. package/dist/mcp/index.js.map +1 -1
  149. package/dist/mcp/proxy.d.ts.map +1 -1
  150. package/dist/mcp/proxy.js +20 -18
  151. package/dist/mcp/proxy.js.map +1 -1
  152. package/dist/mcp/query-pool.d.ts.map +1 -1
  153. package/dist/mcp/query-pool.js +10 -13
  154. package/dist/mcp/query-pool.js.map +1 -1
  155. package/dist/mcp/query-worker.d.ts +1 -1
  156. package/dist/mcp/query-worker.js +1 -1
  157. package/dist/mcp/server-instructions.d.ts +5 -2
  158. package/dist/mcp/server-instructions.d.ts.map +1 -1
  159. package/dist/mcp/server-instructions.js +43 -32
  160. package/dist/mcp/server-instructions.js.map +1 -1
  161. package/dist/mcp/session.d.ts +14 -3
  162. package/dist/mcp/session.d.ts.map +1 -1
  163. package/dist/mcp/session.js +17 -14
  164. package/dist/mcp/session.js.map +1 -1
  165. package/dist/mcp/startup-handshake.d.ts +1 -1
  166. package/dist/mcp/startup-handshake.js +1 -1
  167. package/dist/mcp/tools.d.ts +149 -8
  168. package/dist/mcp/tools.d.ts.map +1 -1
  169. package/dist/mcp/tools.js +4265 -575
  170. package/dist/mcp/tools.js.map +1 -1
  171. package/dist/resolution/callback-synthesizer.d.ts.map +1 -1
  172. package/dist/resolution/callback-synthesizer.js +166 -0
  173. package/dist/resolution/callback-synthesizer.js.map +1 -1
  174. package/dist/resolution/frameworks/arkts-napi.d.ts +14 -0
  175. package/dist/resolution/frameworks/arkts-napi.d.ts.map +1 -1
  176. package/dist/resolution/frameworks/arkts-napi.js +169 -49
  177. package/dist/resolution/frameworks/arkts-napi.js.map +1 -1
  178. package/dist/search/query-utils.d.ts +157 -5
  179. package/dist/search/query-utils.d.ts.map +1 -1
  180. package/dist/search/query-utils.js +1105 -70
  181. package/dist/search/query-utils.js.map +1 -1
  182. package/dist/spec/build/scan.js +1 -1
  183. package/dist/spec/build/scan.js.map +1 -1
  184. package/dist/spec/build/scope-resolver.d.ts +24 -5
  185. package/dist/spec/build/scope-resolver.d.ts.map +1 -1
  186. package/dist/spec/build/scope-resolver.js +76 -10
  187. package/dist/spec/build/scope-resolver.js.map +1 -1
  188. package/dist/spec/config.d.ts +8 -0
  189. package/dist/spec/config.d.ts.map +1 -1
  190. package/dist/spec/config.js +3 -0
  191. package/dist/spec/config.js.map +1 -1
  192. package/dist/spec/evolve/pipeline.d.ts.map +1 -1
  193. package/dist/spec/evolve/pipeline.js +2 -1
  194. package/dist/spec/evolve/pipeline.js.map +1 -1
  195. package/dist/spec/git/commits.d.ts +8 -3
  196. package/dist/spec/git/commits.d.ts.map +1 -1
  197. package/dist/spec/git/commits.js +12 -11
  198. package/dist/spec/git/commits.js.map +1 -1
  199. package/dist/spec/mine/addon/adapter.d.ts +45 -0
  200. package/dist/spec/mine/addon/adapter.d.ts.map +1 -0
  201. package/dist/spec/mine/addon/adapter.js +118 -0
  202. package/dist/spec/mine/addon/adapter.js.map +1 -0
  203. package/dist/spec/mine/addon/render.d.ts +20 -0
  204. package/dist/spec/mine/addon/render.d.ts.map +1 -0
  205. package/dist/spec/mine/addon/render.js +41 -0
  206. package/dist/spec/mine/addon/render.js.map +1 -0
  207. package/dist/spec/mine/addon/types.d.ts +70 -0
  208. package/dist/spec/mine/addon/types.d.ts.map +1 -0
  209. package/dist/spec/mine/addon/types.js +14 -0
  210. package/dist/spec/mine/addon/types.js.map +1 -0
  211. package/dist/spec/mine/generator.d.ts +5 -1
  212. package/dist/spec/mine/generator.d.ts.map +1 -1
  213. package/dist/spec/mine/generator.js +69 -7
  214. package/dist/spec/mine/generator.js.map +1 -1
  215. package/dist/spec/mine/pipeline.d.ts.map +1 -1
  216. package/dist/spec/mine/pipeline.js +5 -1
  217. package/dist/spec/mine/pipeline.js.map +1 -1
  218. package/dist/spec/mine/scanner.d.ts +1 -0
  219. package/dist/spec/mine/scanner.d.ts.map +1 -1
  220. package/dist/spec/mine/scanner.js +1 -1
  221. package/dist/spec/mine/scanner.js.map +1 -1
  222. package/dist/spec/types.d.ts +1 -1
  223. package/dist/spec/types.d.ts.map +1 -1
  224. package/dist/types.d.ts +8 -0
  225. package/dist/types.d.ts.map +1 -1
  226. package/dist/upgrade/index.d.ts +14 -26
  227. package/dist/upgrade/index.d.ts.map +1 -1
  228. package/dist/upgrade/index.js +28 -123
  229. package/dist/upgrade/index.js.map +1 -1
  230. package/dist/upgrade/remove-binary.d.ts +19 -19
  231. package/dist/upgrade/remove-binary.d.ts.map +1 -1
  232. package/dist/upgrade/remove-binary.js +20 -21
  233. package/dist/upgrade/remove-binary.js.map +1 -1
  234. package/dist/upgrade/update-check.d.ts +4 -3
  235. package/dist/upgrade/update-check.d.ts.map +1 -1
  236. package/dist/upgrade/update-check.js +4 -3
  237. package/dist/upgrade/update-check.js.map +1 -1
  238. package/package.json +13 -9
  239. package/dist/telemetry/index.d.ts +0 -143
  240. package/dist/telemetry/index.d.ts.map +0 -1
  241. package/dist/telemetry/index.js +0 -541
  242. package/dist/telemetry/index.js.map +0 -1
@@ -0,0 +1,503 @@
1
+ "use strict";
2
+ /**
3
+ * Session-level explore repeat / partial guidance (generic).
4
+ *
5
+ * Stops agents from treating `homegraph_explore` as an iterative keyword
6
+ * searcher: overlapping queries after a successful explore get a short refuse
7
+ * instead of another multi-kB payload. Partial/busy replies carry concrete
8
+ * retry anchors extracted from the query — never an empty 242-char shell.
9
+ *
10
+ * Failure fuse (post A/B): hard-cap explores per session, require tight
11
+ * single-Type follow-ups after 2 calls, and bind Partial → named Next anchor.
12
+ *
13
+ * Shape-driven only — no product nouns.
14
+ */
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.exploreQueryTokens = exploreQueryTokens;
17
+ exports.queryTokenJaccard = queryTokenJaccard;
18
+ exports.queryTokenOverlapScore = queryTokenOverlapScore;
19
+ exports.extractRetryAnchorsFromQuery = extractRetryAnchorsFromQuery;
20
+ exports.novelAnchorsVsPriors = novelAnchorsVsPriors;
21
+ exports.isTightExploreFollowUp = isTightExploreFollowUp;
22
+ exports.extractNextAnchorFromText = extractNextAnchorFromText;
23
+ exports.inferExplorePartialMeta = inferExplorePartialMeta;
24
+ exports.decideExploreRepeat = decideExploreRepeat;
25
+ exports.formatExploreRepeatRefuse = formatExploreRepeatRefuse;
26
+ exports.latestCountedExplore = latestCountedExplore;
27
+ exports.decideDepthToolFuse = decideDepthToolFuse;
28
+ exports.formatDepthToolRefuse = formatDepthToolRefuse;
29
+ exports.scoreDomainRoleForQuery = scoreDomainRoleForQuery;
30
+ exports.pickBestDomainRoleAnchor = pickBestDomainRoleAnchor;
31
+ exports.formatNextAnchorCaption = formatNextAnchorCaption;
32
+ exports.formatMechanismSoftCloseHeader = formatMechanismSoftCloseHeader;
33
+ exports.formatMechanismSoftCloseFooter = formatMechanismSoftCloseFooter;
34
+ exports.formatMechanismPartialFooter = formatMechanismPartialFooter;
35
+ exports.formatSecondPartialStopFooter = formatSecondPartialStopFooter;
36
+ exports.extractRetryIntentHints = extractRetryIntentHints;
37
+ exports.formatPartialExploreGuidance = formatPartialExploreGuidance;
38
+ const query_utils_1 = require("../search/query-utils");
39
+ /** Tokens that do not distinguish one explore bag from another. */
40
+ const STOP = new Set([
41
+ 'the', 'a', 'an', 'and', 'or', 'of', 'to', 'in', 'on', 'for', 'with', 'from',
42
+ 'how', 'what', 'which', 'where', 'when', 'why', 'is', 'are', 'was', 'were',
43
+ 'do', 'does', 'did', 'be', 'been', 'this', 'that', 'these', 'those',
44
+ '项目', '工程', '代码', '功能', '如何', '怎么', '什么', '哪些', '哪个',
45
+ '实现', '相关', '关于', '进行', '使用', '调用', '涉及', '是否', '有没有',
46
+ 'please', 'show', 'find', 'list', 'explain', 'describe', 'implement',
47
+ 'code', 'file', 'files', 'function', 'functions', 'method', 'methods',
48
+ 'class', 'module', 'project', 'repo', 'repository',
49
+ ]);
50
+ /**
51
+ * Significant tokens for bag-overlap (ASCII identifiers + CJK runs ≥2).
52
+ */
53
+ function exploreQueryTokens(query) {
54
+ const out = new Set();
55
+ const q = query.trim().toLowerCase();
56
+ if (!q)
57
+ return out;
58
+ for (const m of q.matchAll(/[a-z][a-z0-9_./:@-]{2,}/g)) {
59
+ const t = m[0].replace(/^[@/]+|[/]+$/g, '');
60
+ if (t.length >= 3 && !STOP.has(t))
61
+ out.add(t);
62
+ }
63
+ for (const m of q.matchAll(/[\u4e00-\u9fff]{2,}/g)) {
64
+ const t = m[0];
65
+ if (!STOP.has(t))
66
+ out.add(t);
67
+ }
68
+ return out;
69
+ }
70
+ /** Jaccard overlap in [0, 1]. */
71
+ function queryTokenJaccard(a, b) {
72
+ if (a.size === 0 || b.size === 0)
73
+ return 0;
74
+ let inter = 0;
75
+ for (const t of a)
76
+ if (b.has(t))
77
+ inter++;
78
+ const union = a.size + b.size - inter;
79
+ return union === 0 ? 0 : inter / union;
80
+ }
81
+ /**
82
+ * Bag similarity: max(Jaccard, one-sided containment).
83
+ * Paraphrases often keep the same English seeds while swapping CJK filler —
84
+ * pure Jaccard under-fires on those; containment catches them.
85
+ */
86
+ function queryTokenOverlapScore(a, b) {
87
+ if (a.size === 0 || b.size === 0)
88
+ return 0;
89
+ let inter = 0;
90
+ for (const t of a)
91
+ if (b.has(t))
92
+ inter++;
93
+ if (inter === 0)
94
+ return 0;
95
+ const jaccard = inter / (a.size + b.size - inter);
96
+ const containment = Math.max(inter / a.size, inter / b.size);
97
+ return Math.max(jaccard, containment);
98
+ }
99
+ /**
100
+ * Concrete anchors an agent can put in a tighter follow-up explore.
101
+ * Pure string extraction — no DB.
102
+ */
103
+ function extractRetryAnchorsFromQuery(query) {
104
+ const anchors = [];
105
+ const seen = new Set();
106
+ const add = (s) => {
107
+ const t = s.trim();
108
+ if (!t || seen.has(t.toLowerCase()))
109
+ return;
110
+ seen.add(t.toLowerCase());
111
+ anchors.push(t);
112
+ };
113
+ for (const m of query.matchAll(/@kit\.[A-Za-z][\w.]*/g))
114
+ add(m[0]);
115
+ for (const m of query.matchAll(/@ohos\.[A-Za-z][\w.]*/g))
116
+ add(m[0]);
117
+ for (const m of query.matchAll(/\b[A-Za-z_][\w]*\.(?:ets|ts|tsx|js|jsx|cpp|h|hpp|c)\b/g))
118
+ add(m[0]);
119
+ for (const m of query.matchAll(/\b([A-Z][A-Za-z0-9]*(?:[A-Z][a-z0-9]+)+)\b/g))
120
+ add(m[1]);
121
+ for (const m of query.matchAll(/\b([A-Za-z_][\w]*)::([A-Za-z_][\w]*)\b/g))
122
+ add(`${m[1]}::${m[2]}`);
123
+ for (const m of query.matchAll(/\b([A-Z][A-Za-z0-9]+)\.([a-z][A-Za-z0-9]*)\b/g)) {
124
+ add(`${m[1]}.${m[2]}`);
125
+ }
126
+ return anchors.slice(0, 8);
127
+ }
128
+ /** Anchors present in `query` that never appeared in any prior query string. */
129
+ function novelAnchorsVsPriors(query, priors) {
130
+ const priorBlob = priors.map((c) => c.query).join('\n').toLowerCase();
131
+ return extractRetryAnchorsFromQuery(query).filter((a) => !priorBlob.includes(a.toLowerCase()));
132
+ }
133
+ /**
134
+ * Follow-up after the soft budget must be a tight Type/file bag — not another
135
+ * NL paraphrase that merely picks a Type name from a prior inventory.
136
+ */
137
+ function isTightExploreFollowUp(query) {
138
+ const anchors = extractRetryAnchorsFromQuery(query);
139
+ if (anchors.length < 1 || anchors.length > 2)
140
+ return false;
141
+ const tokens = exploreQueryTokens(query);
142
+ return tokens.size <= anchors.length + 3;
143
+ }
144
+ /** Pull `Next anchor` name from a Partial response body. */
145
+ function extractNextAnchorFromText(text) {
146
+ const m = text.match(/\*\*Next anchor:\*\*[^*\n`]*`([^`]+)`/i)
147
+ || text.match(/Next anchor:\s*`([^`]+)`/i);
148
+ const raw = m?.[1]?.trim();
149
+ if (!raw)
150
+ return undefined;
151
+ // Prefer the leading identifier if the caption includes kind/path.
152
+ const id = raw.match(/^[A-Za-z_@][\w./:@-]*/)?.[0] ?? raw.split(/\s+/)[0];
153
+ return id?.slice(0, 120);
154
+ }
155
+ function inferExplorePartialMeta(text) {
156
+ // Soft-close / coarse-locate ANSWER must win over a leftover Partial header
157
+ // (same response used to emit both — session fuse must treat it as closed).
158
+ const closedAnswer = /\*\*ANSWER NOW\*\*|Mechanism explore complete — \*\*ANSWER NOW\*\*|Explore complete — ANSWER NOW|Coarse locate — ANSWER|Coarse locate complete/i
159
+ .test(text);
160
+ const partial = /\*\*Partial locator\*\*|Partial locator|⚠️ \*\*Partial result\*\*|\*\*Partial result\*\*/i.test(text)
161
+ && !closedAnswer;
162
+ return {
163
+ partial,
164
+ nextAnchor: partial ? extractNextAnchorFromText(text) : undefined,
165
+ };
166
+ }
167
+ const OVERLAP_THRESHOLD = 0.45;
168
+ /**
169
+ * Absolute explore fuse per session/project (counted responses ≥400 chars).
170
+ * After this many, refuse — answer from prior Anchors or ONE narrow Grep.
171
+ */
172
+ const MAX_EXPLORES = 2;
173
+ /**
174
+ * After a counted Partial explore, allow this many depth tools
175
+ * (`homegraph_node` / callers / callees) before refusing — stops Partial→node×N
176
+ * compensation without per-question tuning.
177
+ */
178
+ const MAX_DEPTH_AFTER_PARTIAL = 1;
179
+ function isCountedCall(call) {
180
+ return (call.responseBytes || 0) >= 400;
181
+ }
182
+ /**
183
+ * Whether this explore should short-refuse instead of re-running.
184
+ */
185
+ function decideExploreRepeat(prior, query) {
186
+ if (!prior || prior.calls.length === 0)
187
+ return { refuse: false, reason: 'ok' };
188
+ const qTokens = exploreQueryTokens(query);
189
+ const counted = prior.calls.filter(isCountedCall);
190
+ const novel = novelAnchorsVsPriors(query, prior.calls);
191
+ const last = counted[counted.length - 1];
192
+ // Hard fuse — never explore×N after two counted calls (inventory Manager hops included).
193
+ if (counted.length >= MAX_EXPLORES) {
194
+ return {
195
+ refuse: true,
196
+ matched: last,
197
+ reason: 'hard-cap',
198
+ };
199
+ }
200
+ // Partial named a Next anchor — follow-up MUST include that name (no novel-Type bypass).
201
+ if (last?.partial && last.nextAnchor) {
202
+ const na = last.nextAnchor.toLowerCase();
203
+ if (!query.toLowerCase().includes(na)) {
204
+ return {
205
+ refuse: true,
206
+ matched: last,
207
+ reason: 'next-anchor',
208
+ };
209
+ }
210
+ }
211
+ // Overlap with any prior counted explore — unless a tight novel Type/file bag
212
+ // (and, after Partial, only when Next anchor is already in the query above).
213
+ if (novel.length > 0 && isTightExploreFollowUp(query)) {
214
+ return { refuse: false, reason: 'ok' };
215
+ }
216
+ let best;
217
+ let bestScore = 0;
218
+ for (const call of counted) {
219
+ const score = queryTokenOverlapScore(qTokens, exploreQueryTokens(call.query));
220
+ if (score > bestScore) {
221
+ bestScore = score;
222
+ best = call;
223
+ }
224
+ }
225
+ if (best && bestScore >= OVERLAP_THRESHOLD) {
226
+ return { refuse: true, matched: best, reason: 'overlap' };
227
+ }
228
+ return { refuse: false, reason: 'ok' };
229
+ }
230
+ /** Short success-shaped refuse when a repeat explore would waste tokens. */
231
+ function formatExploreRepeatRefuse(decision, query) {
232
+ const priorQ = decision.matched?.query?.trim().slice(0, 100) || '(earlier explore)';
233
+ const files = (decision.matched?.files || []).map((f) => f.path).slice(0, 6);
234
+ const fileLine = files.length > 0
235
+ ? `\nAlready covered files include: ${files.map((f) => `\`${f}\``).join(', ')}.`
236
+ : '';
237
+ const next = decision.matched?.nextAnchor
238
+ ? `\nPrior **Next anchor** was \`${decision.matched.nextAnchor}\` — use that name, or ONE narrow Grep.`
239
+ : '';
240
+ let why;
241
+ switch (decision.reason) {
242
+ case 'hard-cap':
243
+ why = `This session already ran **${MAX_EXPLORES}** \`homegraph_explore\` calls on this project. Stop exploring.`;
244
+ break;
245
+ case 'next-anchor':
246
+ why = `Prior explore was Partial and named a **Next anchor** — do not re-explore a paraphrase of "${priorQ}${priorQ.length >= 100 ? '…' : ''}".`;
247
+ break;
248
+ case 'call-budget':
249
+ why = `Explore call budget exhausted for this project in the session.`;
250
+ break;
251
+ default:
252
+ why = `This query overlaps a prior explore (bag ≈ "${priorQ}${priorQ.length >= 100 ? '…' : ''}").`;
253
+ }
254
+ return [
255
+ '**Skip repeat explore — stop HomeGraph drill-down.**',
256
+ why + fileLine + next,
257
+ `Current query: "${query.trim().slice(0, 160)}${query.trim().length > 160 ? '…' : ''}"`,
258
+ 'Answer from Anchors / digests already in this conversation, or run **ONE narrow Grep** for residual unindexed wiring.',
259
+ 'Do **not** glob/read the whole repo, and do **not** fan out `homegraph_explore` / `homegraph_node` / callers on the same bag.',
260
+ ].join('\n');
261
+ }
262
+ /** Latest counted explore call (≥400 response bytes), if any. */
263
+ function latestCountedExplore(prior) {
264
+ if (!prior?.calls.length)
265
+ return undefined;
266
+ for (let i = prior.calls.length - 1; i >= 0; i--) {
267
+ const c = prior.calls[i];
268
+ if (isCountedCall(c))
269
+ return c;
270
+ }
271
+ return undefined;
272
+ }
273
+ /**
274
+ * Whether `homegraph_node` / callers / callees should short-refuse after a
275
+ * Partial explore (same failure class as explore×N — depth fan-out).
276
+ *
277
+ * After Partial: callers/callees are refused immediately (wrong tool + often a
278
+ * multi-def token bomb). `homegraph_node` gets one shot, then refuse.
279
+ */
280
+ function decideDepthToolFuse(prior, depthCallCount, toolName) {
281
+ const last = latestCountedExplore(prior);
282
+ if (!last?.partial)
283
+ return { refuse: false, reason: 'ok' };
284
+ const nextAnchor = last.nextAnchor;
285
+ if (toolName === 'homegraph_callers' || toolName === 'homegraph_callees') {
286
+ return {
287
+ refuse: true,
288
+ reason: 'partial-no-callers',
289
+ nextAnchor,
290
+ };
291
+ }
292
+ if (depthCallCount >= MAX_DEPTH_AFTER_PARTIAL) {
293
+ return {
294
+ refuse: true,
295
+ reason: 'partial-depth-cap',
296
+ nextAnchor,
297
+ };
298
+ }
299
+ return { refuse: false, reason: 'ok', nextAnchor };
300
+ }
301
+ /** Success-shaped refuse when Partial already spent its one depth drill. */
302
+ function formatDepthToolRefuse(decision, toolName, symbolHint) {
303
+ const next = decision.nextAnchor
304
+ ? `\nPrior **Next anchor** was \`${decision.nextAnchor}\` — ONE \`homegraph_node\` / tighter explore with that name, or ONE narrow Grep.`
305
+ : '';
306
+ const sym = symbolHint?.trim()
307
+ ? `\nRequested: \`${symbolHint.trim().slice(0, 80)}\``
308
+ : '';
309
+ const why = decision.reason === 'partial-no-callers'
310
+ ? `Prior \`homegraph_explore\` was a Partial locator — do **not** call \`${toolName}\` next (multi-def dumps + fan-out).`
311
+ : `Prior \`homegraph_explore\` was a Partial locator; this session already used its **${MAX_DEPTH_AFTER_PARTIAL}** `
312
+ + `allowed \`homegraph_node\` call on this project.`;
313
+ return [
314
+ '**Skip HomeGraph depth drill — stop after Partial.**',
315
+ why + next + sym,
316
+ 'Answer from Anchors / digests already in this conversation, or run **ONE narrow Grep** for residual unindexed wiring.',
317
+ 'Do **not** fan out more `homegraph_node` / callers / callees, and do **not** glob/read the whole repo.',
318
+ ].join('\n');
319
+ }
320
+ /**
321
+ * Score a domain Manager/Service for Next-anchor / digest preference.
322
+ * Prefer query-token overlap + *Manager /manager/ paths; demote weak *Utils /
323
+ * *Constants / bare *Subscriber helpers without strong token overlap.
324
+ *
325
+ * `domainTokens` (from {@link mechanismDomainPathTokens}) carries CJK→ASCII
326
+ * stems so NL asks like 通知订阅 rank SubscribeManager over screenlock StateManager.
327
+ */
328
+ function scoreDomainRoleForQuery(candidate, query, domainTokens) {
329
+ const tokens = [...exploreQueryTokens(query)].filter((t) => t.length >= 3);
330
+ const domain = (domainTokens && domainTokens.length > 0
331
+ ? domainTokens
332
+ : (0, query_utils_1.mechanismDomainPathTokens)(query)).map((t) => t.toLowerCase()).filter((t) => t.length >= 4);
333
+ const name = candidate.name || '';
334
+ const fp = (candidate.filePath || '').toLowerCase().replace(/\\/g, '/');
335
+ const nameLc = name.toLowerCase();
336
+ let score = 0;
337
+ for (const t of tokens) {
338
+ if (nameLc.includes(t))
339
+ score += 12;
340
+ if (fp.includes(`/${t}/`))
341
+ score += 10;
342
+ else if (fp.includes(t))
343
+ score += 4;
344
+ }
345
+ for (const t of domain) {
346
+ if (nameLc.includes(t))
347
+ score += 14;
348
+ if (fp.includes(`/${t}/`))
349
+ score += 12;
350
+ else if (fp.includes(t))
351
+ score += 5;
352
+ }
353
+ if (/Manager$/i.test(name))
354
+ score += 8;
355
+ if (/\/manager\//i.test(fp))
356
+ score += 5;
357
+ if (/Service$/i.test(name))
358
+ score += 3;
359
+ if (/SubscribeManager|SubscriberManager|EventManager|BridgeManager/i.test(name))
360
+ score += 4;
361
+ // Intent-shaped role boosts (shape only — no product nouns beyond domain stems).
362
+ if (/订阅|subscribe/i.test(query)) {
363
+ if (/Subscribe(?:r)?Manager/i.test(name))
364
+ score += 22;
365
+ if (/BridgeManager|EventManager/i.test(name) && /notif|subscribe/i.test(nameLc + fp))
366
+ score += 8;
367
+ if (/StateManager$/i.test(name) && !/状态|state/i.test(query))
368
+ score -= 18;
369
+ if (/screenlock|keyguard/i.test(fp) && !/锁屏|screenlock|keyguard/i.test(query))
370
+ score -= 14;
371
+ }
372
+ if (/备份|恢复|backup|restore/i.test(query)) {
373
+ if (/Extension$/i.test(name) || /ExtensionAbility/i.test(name))
374
+ score += 22;
375
+ if (/BackupLauncher|RestoreLauncher|DataRestore|Controller$/i.test(name))
376
+ score += 12;
377
+ if (/EventManager$/i.test(name) && !/Extension/i.test(name))
378
+ score -= 6;
379
+ }
380
+ // Weak helpers: only keep if they already scored on tokens.
381
+ if (/(Utils|Constants|Info|Entry|Helper)$/i.test(name))
382
+ score -= 8;
383
+ if (/Subscriber$/i.test(name) && !/Manager/i.test(name) && score < 16)
384
+ score -= 6;
385
+ if (/Listener$/i.test(name) && !/Manager/i.test(name) && score < 16)
386
+ score -= 4;
387
+ return score;
388
+ }
389
+ /** Best domain-role Type for Next anchor, or undefined when inventory empty. */
390
+ function pickBestDomainRoleAnchor(candidates, query, domainTokens) {
391
+ if (!candidates.length)
392
+ return undefined;
393
+ let best;
394
+ let bestScore = -Infinity;
395
+ for (const c of candidates) {
396
+ if (!c?.name)
397
+ continue;
398
+ const s = scoreDomainRoleForQuery(c, query, domainTokens);
399
+ if (s > bestScore) {
400
+ bestScore = s;
401
+ best = c;
402
+ }
403
+ }
404
+ return best;
405
+ }
406
+ /** Format Next anchor caption used in Partial / soft-close footers. */
407
+ function formatNextAnchorCaption(c) {
408
+ const line = c.startLine && c.startLine > 0 ? String(c.startLine) : '?';
409
+ return `\`${c.name}\` (${c.kind}) — \`${c.filePath.replace(/\\/g, '/')}:${line}\``;
410
+ }
411
+ /**
412
+ * Soft-close opening banner (must match footer — never pair with Partial locator).
413
+ */
414
+ function formatMechanismSoftCloseHeader() {
415
+ return ('> **Coarse locate — ANSWER from anchors + digests below.** '
416
+ + 'Treat inventory + Source as already Read. '
417
+ + 'ONE narrow Grep only for residual unindexed wiring — do not re-explore or fan out depth tools.');
418
+ }
419
+ /**
420
+ * Soft-close footer: enough inventory + digest to answer without another explore.
421
+ * Must NOT contain "Partial locator" so the session fuse treats the call as closed.
422
+ */
423
+ function formatMechanismSoftCloseFooter(next) {
424
+ const hint = next
425
+ ? ` Primary Type: \`${next.name}\`.`
426
+ : '';
427
+ return ('> **Coarse locate — ANSWER from anchors + digests above.**'
428
+ + hint
429
+ + ' ONE narrow Grep only for residual unindexed wiring named above. '
430
+ + 'Do **not** re-explore, fan out `homegraph_node` / callers, or glob/read the repo.');
431
+ }
432
+ /** Honest Partial footer with a single Next anchor + ONE Grep. */
433
+ function formatMechanismPartialFooter(nextCaption) {
434
+ return ('> **Partial locator** — not a full mechanism closure. '
435
+ + `**Next anchor:** ${nextCaption}. `
436
+ + 'ONE tighter `homegraph_explore` **only** with that exact name, '
437
+ + 'or **ONE narrow Grep** for residual unindexed wiring — '
438
+ + 'do **not** fan out `homegraph_node` / Read / glob, and do **not** ANSWER NOW from inventory alone.');
439
+ }
440
+ /**
441
+ * Appended when a second counted Partial is emitted in the same session —
442
+ * stop HomeGraph; do not take a third explore.
443
+ */
444
+ function formatSecondPartialStopFooter(nextAnchor) {
445
+ const next = nextAnchor
446
+ ? `\nPrior **Next anchor:** \`${nextAnchor}\`.`
447
+ : '';
448
+ return [
449
+ '',
450
+ '---',
451
+ '> **Second Partial — stop HomeGraph.** Do **not** call `homegraph_explore` again.'
452
+ + next
453
+ + ' Answer from Anchors / digests already returned, or **ONE narrow Grep** for residual unindexed wiring. '
454
+ + 'Do not glob/read the whole repo.',
455
+ ].join('\n');
456
+ }
457
+ /**
458
+ * Intent phrases that must ride with a bare Type on Partial retry —
459
+ * dropping them collapses data-source / event-dispatch surveys into empty compact.
460
+ */
461
+ function extractRetryIntentHints(query) {
462
+ const hints = [];
463
+ const q = query.trim();
464
+ if (/来源于|数据来源|状态来源|哪个系统服务|data\s+source|which\s+service/i.test(q)) {
465
+ hints.push('数据来源 系统服务');
466
+ }
467
+ if (/分发|分发给|哪些\s*Manager|dispatch|DataShareMgr|事件类型/i.test(q)) {
468
+ hints.push('事件类型 分发 Manager');
469
+ }
470
+ if (/调用链|跨模块|如何驱动|重新计算|multi[- ]?thread|多线程/i.test(q)) {
471
+ hints.push('调用链');
472
+ }
473
+ return hints.slice(0, 2);
474
+ }
475
+ /**
476
+ * Busy/deadline Partial with actionable anchors from the query (no DB).
477
+ */
478
+ function formatPartialExploreGuidance(opts) {
479
+ const secs = Math.max(1, opts.seconds);
480
+ const why = opts.why
481
+ || `HomeGraph did not finish within ${secs}s (deadline / busy / queue)`;
482
+ const anchors = opts.query ? extractRetryAnchorsFromQuery(opts.query) : [];
483
+ const intents = opts.query ? extractRetryIntentHints(opts.query) : [];
484
+ const retryBits = [
485
+ ...anchors.map((a) => `\`${a}\``),
486
+ ...intents.map((h) => `\`${h}\``),
487
+ ];
488
+ const anchorLine = retryBits.length > 0
489
+ ? `If you retry, ONE tight \`homegraph_explore\` using only: ${retryBits.join(', ')} `
490
+ + '(not a paraphrase of the whole question).'
491
+ + (intents.length > 0
492
+ ? ' Keep the intent words with the Type.'
493
+ : '')
494
+ : 'If you retry, ONE tight \`homegraph_explore\` with a single Type / file / `@kit` name — not a broad paraphrase.';
495
+ return [
496
+ `⚠️ **Partial result** — ${why}. This is NOT an error.`,
497
+ 'Prefer **ONE narrow Grep** for residual unindexed wiring using names already in the question — do **not** glob/read the repo.',
498
+ anchorLine,
499
+ 'At most **one** `homegraph_node` (or callers/callees) after Partial — further depth calls are refused. Do not open a Grep/Read storm.',
500
+ 'If a second explore still Partials, **stop HomeGraph** and answer from anchors + ONE narrow Grep.',
501
+ ].join('\n');
502
+ }
503
+ //# sourceMappingURL=explore-repeat-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"explore-repeat-guard.js","sourceRoot":"","sources":["../../src/mcp/explore-repeat-guard.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;;AAoBH,gDAaC;AAGD,8CAMC;AAOD,wDAQC;AAMD,oEAoBC;AAGD,oDAGC;AAMD,wDAKC;AAGD,8DASC;AAED,0DAaC;AA8BD,kDAoDC;AAGD,8DAmCC;AASD,oDASC;AASD,kDAuBC;AAGD,sDAqBC;AAkBD,0DA6CC;AAGD,4DAiBC;AAGD,0DAGC;AAKD,wEAMC;AAMD,wEAUC;AAGD,oEAQC;AAMD,sEAYC;AAMD,0DAaC;AAKD,oEA6BC;AArgBD,uDAAkE;AAGlE,mEAAmE;AACnE,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC;IACnB,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM;IAC5E,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;IAC1E,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IACnE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI;IACpD,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK;IACrD,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW;IACpE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS;IACrE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY;CACnD,CAAC,CAAC;AAEH;;GAEG;AACH,SAAgB,kBAAkB,CAAC,KAAa;IAC9C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACrC,IAAI,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IACnB,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC,EAAE,CAAC;QACnD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC/B,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,iCAAiC;AACjC,SAAgB,iBAAiB,CAAC,CAAsB,EAAE,CAAsB;IAC9E,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,KAAK,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC;IACtC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,SAAgB,sBAAsB,CAAC,CAAsB,EAAE,CAAsB;IACnF,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,CAAC;QAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,KAAK,EAAE,CAAC;IACzC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC1B,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC;IAClD,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;AACxC,CAAC;AAED;;;GAGG;AACH,SAAgB,4BAA4B,CAAC,KAAa;IACxD,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE;QACxB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACnB,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;YAAE,OAAO;QAC5C,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,uBAAuB,CAAC;QAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IACpE,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,wBAAwB,CAAC;QAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IACrE,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,wDAAwD,CAAC;QAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IACrG,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,6CAA6C,CAAC;QAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;IAC1F,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,yCAAyC,CAAC;QAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACnG,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,+CAA+C,CAAC,EAAE,CAAC;QAChF,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,gFAAgF;AAChF,SAAgB,oBAAoB,CAAC,KAAa,EAAE,MAAwC;IAC1F,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACtE,OAAO,4BAA4B,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AACjG,CAAC;AAED;;;GAGG;AACH,SAAgB,sBAAsB,CAAC,KAAa;IAClD,MAAM,OAAO,GAAG,4BAA4B,CAAC,KAAK,CAAC,CAAC;IACpD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3D,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACzC,OAAO,MAAM,CAAC,IAAI,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,4DAA4D;AAC5D,SAAgB,yBAAyB,CAAC,IAAY;IACpD,MAAM,CAAC,GACL,IAAI,CAAC,KAAK,CAAC,wCAAwC,CAAC;WACjD,IAAI,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC7C,MAAM,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,GAAG;QAAE,OAAO,SAAS,CAAC;IAC3B,mEAAmE;IACnE,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,SAAgB,uBAAuB,CAAC,IAAY;IAClD,4EAA4E;IAC5E,4EAA4E;IAC5E,MAAM,YAAY,GAChB,iJAAiJ;SAC9I,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,MAAM,OAAO,GACX,2FAA2F,CAAC,IAAI,CAAC,IAAI,CAAC;WACnG,CAAC,YAAY,CAAC;IACnB,OAAO;QACL,OAAO;QACP,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;KAClE,CAAC;AACJ,CAAC;AASD,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B;;;GAGG;AACH,MAAM,YAAY,GAAG,CAAC,CAAC;AAEvB;;;;GAIG;AACH,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAElC,SAAS,aAAa,CAAC,IAAuB;IAC5C,OAAO,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CACjC,KAA6C,EAC7C,KAAa;IAEb,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAE/E,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IAClD,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACvD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEzC,yFAAyF;IACzF,IAAI,OAAO,CAAC,MAAM,IAAI,YAAY,EAAE,CAAC;QACnC,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,UAAU;SACnB,CAAC;IACJ,CAAC;IAED,yFAAyF;IACzF,IAAI,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;YACtC,OAAO;gBACL,MAAM,EAAE,IAAI;gBACZ,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE,aAAa;aACtB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,8EAA8E;IAC9E,6EAA6E;IAC7E,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IACzC,CAAC;IAED,IAAI,IAAmC,CAAC;IACxC,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,KAAK,GAAG,sBAAsB,CAAC,OAAO,EAAE,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC9E,IAAI,KAAK,GAAG,SAAS,EAAE,CAAC;YACtB,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,GAAG,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,IAAI,IAAI,IAAI,SAAS,IAAI,iBAAiB,EAAE,CAAC;QAC3C,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC5D,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACzC,CAAC;AAED,4EAA4E;AAC5E,SAAgB,yBAAyB,CACvC,QAA+B,EAC/B,KAAa;IAEb,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,mBAAmB,CAAC;IACpF,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7E,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAC/B,CAAC,CAAC,oCAAoC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;QAChF,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,EAAE,UAAU;QACvC,CAAC,CAAC,iCAAiC,QAAQ,CAAC,OAAO,CAAC,UAAU,yCAAyC;QACvG,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,GAAW,CAAC;IAChB,QAAQ,QAAQ,CAAC,MAAM,EAAE,CAAC;QACxB,KAAK,UAAU;YACb,GAAG,GAAG,8BAA8B,YAAY,iEAAiE,CAAC;YAClH,MAAM;QACR,KAAK,aAAa;YAChB,GAAG,GAAG,8FAA8F,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;YACjJ,MAAM;QACR,KAAK,aAAa;YAChB,GAAG,GAAG,gEAAgE,CAAC;YACvE,MAAM;QACR;YACE,GAAG,GAAG,+CAA+C,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;IACvG,CAAC;IAED,OAAO;QACL,sDAAsD;QACtD,GAAG,GAAG,QAAQ,GAAG,IAAI;QACrB,mBAAmB,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG;QACvF,uHAAuH;QACvH,+HAA+H;KAChI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAQD,iEAAiE;AACjE,SAAgB,oBAAoB,CAClC,KAA6C;IAE7C,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IAC3C,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACjD,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC;QAC1B,IAAI,aAAa,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,mBAAmB,CACjC,KAA6C,EAC7C,cAAsB,EACtB,QAAiB;IAEjB,MAAM,IAAI,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI,EAAE,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;IAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IACnC,IAAI,QAAQ,KAAK,mBAAmB,IAAI,QAAQ,KAAK,mBAAmB,EAAE,CAAC;QACzE,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,oBAAoB;YAC5B,UAAU;SACX,CAAC;IACJ,CAAC;IACD,IAAI,cAAc,IAAI,uBAAuB,EAAE,CAAC;QAC9C,OAAO;YACL,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,mBAAmB;YAC3B,UAAU;SACX,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;AACrD,CAAC;AAED,4EAA4E;AAC5E,SAAgB,qBAAqB,CACnC,QAA+B,EAC/B,QAAgB,EAChB,UAAmB;IAEnB,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU;QAC9B,CAAC,CAAC,iCAAiC,QAAQ,CAAC,UAAU,mFAAmF;QACzI,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,GAAG,GAAG,UAAU,EAAE,IAAI,EAAE;QAC5B,CAAC,CAAC,kBAAkB,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI;QACtD,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,KAAK,oBAAoB;QAClD,CAAC,CAAC,yEAAyE,QAAQ,sCAAsC;QACzH,CAAC,CAAC,sFAAsF,uBAAuB,KAAK;cAChH,kDAAkD,CAAC;IACzD,OAAO;QACL,sDAAsD;QACtD,GAAG,GAAG,IAAI,GAAG,GAAG;QAChB,uHAAuH;QACvH,wGAAwG;KACzG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAUD;;;;;;;GAOG;AACH,SAAgB,uBAAuB,CACrC,SAAoC,EACpC,KAAa,EACb,YAAgC;IAEhC,MAAM,MAAM,GAAG,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAC3E,MAAM,MAAM,GAAG,CAAC,YAAY,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;QACrD,CAAC,CAAC,YAAY;QACd,CAAC,CAAC,IAAA,uCAAyB,EAAC,KAAK,CAAC,CACnC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;IAC3D,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC;IAClC,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAClC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,KAAK,IAAI,EAAE,CAAC;QACpC,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,KAAK,IAAI,EAAE,CAAC;aAClC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,KAAK,IAAI,EAAE,CAAC;QACpC,IAAI,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;YAAE,KAAK,IAAI,EAAE,CAAC;aAClC,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;IACtC,CAAC;IACD,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IACvC,IAAI,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IACxC,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IACvC,IAAI,gEAAgE,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IAC5F,iFAAiF;IACjF,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,IAAI,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,KAAK,IAAI,EAAE,CAAC;QACtD,IAAI,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;QACjG,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,KAAK,IAAI,EAAE,CAAC;QACzE,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,KAAK,IAAI,EAAE,CAAC;IAC7F,CAAC;IACD,IAAI,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACxC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,KAAK,IAAI,EAAE,CAAC;QAC5E,IAAI,yDAAyD,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,KAAK,IAAI,EAAE,CAAC;QACtF,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,KAAK,IAAI,CAAC,CAAC;IAC1E,CAAC;IACD,4DAA4D;IAC5D,IAAI,uCAAuC,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,KAAK,IAAI,CAAC,CAAC;IACnE,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE;QAAE,KAAK,IAAI,CAAC,CAAC;IAClF,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,GAAG,EAAE;QAAE,KAAK,IAAI,CAAC,CAAC;IAChF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,gFAAgF;AAChF,SAAgB,wBAAwB,CACtC,UAAoD,EACpD,KAAa,EACb,YAAgC;IAEhC,IAAI,CAAC,UAAU,CAAC,MAAM;QAAE,OAAO,SAAS,CAAC;IACzC,IAAI,IAA2C,CAAC;IAChD,IAAI,SAAS,GAAG,CAAC,QAAQ,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,IAAI,CAAC,CAAC,EAAE,IAAI;YAAE,SAAS;QACvB,MAAM,CAAC,GAAG,uBAAuB,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC;YAClB,SAAS,GAAG,CAAC,CAAC;YACd,IAAI,GAAG,CAAC,CAAC;QACX,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uEAAuE;AACvE,SAAgB,uBAAuB,CAAC,CAA4B;IAClE,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IACxE,OAAO,KAAK,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI,CAAC;AACrF,CAAC;AAED;;GAEG;AACH,SAAgB,8BAA8B;IAC5C,OAAO,CACL,6DAA6D;UAC3D,4CAA4C;UAC5C,gGAAgG,CACnG,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,8BAA8B,CAAC,IAAgC;IAC7E,MAAM,IAAI,GAAG,IAAI;QACf,CAAC,CAAC,oBAAoB,IAAI,CAAC,IAAI,KAAK;QACpC,CAAC,CAAC,EAAE,CAAC;IACP,OAAO,CACL,4DAA4D;UAC1D,IAAI;UACJ,mEAAmE;UACnE,mFAAmF,CACtF,CAAC;AACJ,CAAC;AAED,kEAAkE;AAClE,SAAgB,4BAA4B,CAAC,WAAmB;IAC9D,OAAO,CACL,wDAAwD;UACtD,oBAAoB,WAAW,IAAI;UACnC,iEAAiE;UACjE,yDAAyD;UACzD,oGAAoG,CACvG,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,6BAA6B,CAAC,UAAmB;IAC/D,MAAM,IAAI,GAAG,UAAU;QACrB,CAAC,CAAC,8BAA8B,UAAU,KAAK;QAC/C,CAAC,CAAC,EAAE,CAAC;IACP,OAAO;QACL,EAAE;QACF,KAAK;QACL,mFAAmF;cACjF,IAAI;cACJ,yGAAyG;cACzG,kCAAkC;KACrC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,KAAa;IACnD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACvB,IAAI,qDAAqD,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1B,CAAC;IACD,IAAI,iDAAiD,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9D,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,yCAAyC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,SAAgB,4BAA4B,CAAC,IAI5C;IACC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG;WACf,mCAAmC,IAAI,6BAA6B,CAAC;IAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,MAAM,SAAS,GAAG;QAChB,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;QACjC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC;KAClC,CAAC;IACF,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC;QACrC,CAAC,CAAC,6DAA6D,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;cAClF,2CAA2C;cAC3C,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;gBACnB,CAAC,CAAC,uCAAuC;gBACzC,CAAC,CAAC,EAAE,CAAC;QACT,CAAC,CAAC,iHAAiH,CAAC;IAEtH,OAAO;QACL,2BAA2B,GAAG,yBAAyB;QACvD,+HAA+H;QAC/H,UAAU;QACV,uIAAuI;QACvI,mGAAmG;KACpG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC"}