@roarpeng/graphflow 1.7.9 → 1.7.10

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 (46) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/README.md +5 -4
  3. package/dist/config/discover-workspace.d.ts +2 -0
  4. package/dist/config/discover-workspace.d.ts.map +1 -1
  5. package/dist/config/discover-workspace.js +62 -15
  6. package/dist/config/discover-workspace.js.map +1 -1
  7. package/dist/config/workspace-root.d.ts.map +1 -1
  8. package/dist/config/workspace-root.js +7 -2
  9. package/dist/config/workspace-root.js.map +1 -1
  10. package/dist/core/types.d.ts +1 -1
  11. package/dist/core/types.d.ts.map +1 -1
  12. package/dist/graph/file-indexer.d.ts.map +1 -1
  13. package/dist/graph/file-indexer.js +18 -0
  14. package/dist/graph/file-indexer.js.map +1 -1
  15. package/dist/graph/graph-compression.d.ts.map +1 -1
  16. package/dist/graph/graph-compression.js +2 -0
  17. package/dist/graph/graph-compression.js.map +1 -1
  18. package/dist/graph/language-indexers/index.d.ts.map +1 -1
  19. package/dist/graph/language-indexers/index.js +4 -0
  20. package/dist/graph/language-indexers/index.js.map +1 -1
  21. package/dist/graph/language-indexers/markdown.d.ts +11 -0
  22. package/dist/graph/language-indexers/markdown.d.ts.map +1 -0
  23. package/dist/graph/language-indexers/markdown.js +158 -0
  24. package/dist/graph/language-indexers/markdown.js.map +1 -0
  25. package/dist/graph/language-indexers/plcopen-xml.d.ts +16 -0
  26. package/dist/graph/language-indexers/plcopen-xml.d.ts.map +1 -0
  27. package/dist/graph/language-indexers/plcopen-xml.js +204 -0
  28. package/dist/graph/language-indexers/plcopen-xml.js.map +1 -0
  29. package/dist/graph/language-indexers/st-analyzer.d.ts +49 -0
  30. package/dist/graph/language-indexers/st-analyzer.d.ts.map +1 -0
  31. package/dist/graph/language-indexers/st-analyzer.js +439 -0
  32. package/dist/graph/language-indexers/st-analyzer.js.map +1 -0
  33. package/dist/integrations/agent-mcp-installer.d.ts.map +1 -1
  34. package/dist/integrations/agent-mcp-installer.js +8 -4
  35. package/dist/integrations/agent-mcp-installer.js.map +1 -1
  36. package/dist/surfaces/cli/index.js +71 -8
  37. package/dist/surfaces/cli/index.js.map +1 -1
  38. package/dist/surfaces/cli/init.d.ts +55 -2
  39. package/dist/surfaces/cli/init.d.ts.map +1 -1
  40. package/dist/surfaces/cli/init.js +234 -56
  41. package/dist/surfaces/cli/init.js.map +1 -1
  42. package/dist/surfaces/cli/output.d.ts +6 -0
  43. package/dist/surfaces/cli/output.d.ts.map +1 -1
  44. package/dist/surfaces/cli/output.js +57 -1
  45. package/dist/surfaces/cli/output.js.map +1 -1
  46. package/package.json +1 -1
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.markdownIndexer = void 0;
4
+ exports.buildDocumentEdges = buildDocumentEdges;
5
+ exports.markdownIndexer = {
6
+ language: "markdown",
7
+ extensions: [".md"],
8
+ extract(filePath, content) {
9
+ const symbols = [];
10
+ const imports = [];
11
+ const lines = content.split(/\r?\n/);
12
+ let frontmatterTitle;
13
+ if (lines[0]?.trim() === "---") {
14
+ for (let i = 1; i < lines.length; i++) {
15
+ const line = lines[i]?.trim();
16
+ if (line === "---")
17
+ break;
18
+ const match = /^(\w[\w-]*):\s*(.+)/.exec(line ?? "");
19
+ if (match && match[1] === "title") {
20
+ frontmatterTitle = match[2].trim();
21
+ }
22
+ }
23
+ }
24
+ const headings = [];
25
+ const headingRegex = /^(#{1,6})\s+(.+)$/;
26
+ const wikiLinkRegex = /\[\[([^\]]+)\]\]/g;
27
+ const mdLinkRegex = /\[([^\]]*)\]\(([^)]+)\)/g;
28
+ for (let i = 0; i < lines.length; i++) {
29
+ const line = lines[i] ?? "";
30
+ const headingMatch = headingRegex.exec(line);
31
+ if (headingMatch) {
32
+ headings.push({
33
+ line: i + 1,
34
+ level: headingMatch[1].length,
35
+ text: headingMatch[2].trim(),
36
+ });
37
+ }
38
+ let wikiMatch;
39
+ wikiLinkRegex.lastIndex = 0;
40
+ while ((wikiMatch = wikiLinkRegex.exec(line)) !== null) {
41
+ imports.push({ module: wikiMatch[1].trim() });
42
+ }
43
+ let mdMatch;
44
+ mdLinkRegex.lastIndex = 0;
45
+ while ((mdMatch = mdLinkRegex.exec(line)) !== null) {
46
+ const text = mdMatch[1]?.trim() ?? "";
47
+ const url = mdMatch[2]?.trim() ?? "";
48
+ imports.push({ module: url, raw: text });
49
+ }
50
+ }
51
+ for (const heading of headings) {
52
+ const headingLine = lines[heading.line - 1] ?? "";
53
+ symbols.push({
54
+ name: heading.text.slice(0, 120),
55
+ kind: "section",
56
+ exported: true,
57
+ line: heading.line,
58
+ file: filePath,
59
+ jsdoc: `#${heading.level}`,
60
+ signature: headingLine.trim(),
61
+ });
62
+ }
63
+ if (frontmatterTitle && symbols.length > 0 && symbols[0]?.kind === "section") {
64
+ symbols[0].name = frontmatterTitle.slice(0, 120);
65
+ }
66
+ if (headings.length === 0) {
67
+ const chunkContent = content.trim();
68
+ if (chunkContent) {
69
+ symbols.push({
70
+ name: chunkContent.slice(0, 80),
71
+ kind: "chunk",
72
+ exported: true,
73
+ line: 1,
74
+ file: filePath,
75
+ signature: chunkContent,
76
+ });
77
+ }
78
+ }
79
+ else {
80
+ let contentStartLine = 1;
81
+ if (lines[0]?.trim() === "---") {
82
+ for (let i = 1; i < lines.length; i++) {
83
+ if (lines[i]?.trim() === "---") {
84
+ contentStartLine = i + 2;
85
+ break;
86
+ }
87
+ }
88
+ }
89
+ for (let i = 0; i < headings.length; i++) {
90
+ const heading = headings[i];
91
+ const nextHeading = headings[i + 1];
92
+ const startLine = i === 0 ? contentStartLine : heading.line + 1;
93
+ const endLine = nextHeading ? nextHeading.line - 1 : lines.length;
94
+ if (startLine <= endLine) {
95
+ const chunkLines = [];
96
+ for (let j = startLine; j <= endLine; j++) {
97
+ chunkLines.push(lines[j - 1] ?? "");
98
+ }
99
+ const chunkContent = chunkLines.join("\n").trim();
100
+ if (chunkContent) {
101
+ symbols.push({
102
+ name: `chunk: ${heading.text.slice(0, 70)}`,
103
+ kind: "chunk",
104
+ exported: true,
105
+ line: startLine,
106
+ file: filePath,
107
+ signature: chunkContent,
108
+ });
109
+ }
110
+ }
111
+ }
112
+ }
113
+ return { symbols, imports };
114
+ },
115
+ };
116
+ function buildDocumentEdges(fileNodeId, symbols) {
117
+ const edges = [];
118
+ const sections = symbols.filter((s) => s.kind === "section");
119
+ const chunks = symbols.filter((s) => s.kind === "chunk");
120
+ sections.sort((a, b) => a.line - b.line);
121
+ chunks.sort((a, b) => a.line - b.line);
122
+ for (const section of sections) {
123
+ edges.push({ from: section.nodeId, to: fileNodeId, relation: "part_of" });
124
+ }
125
+ for (let i = 0; i < sections.length - 1; i++) {
126
+ edges.push({
127
+ from: sections[i].nodeId,
128
+ to: sections[i + 1].nodeId,
129
+ relation: "next_section",
130
+ });
131
+ }
132
+ for (const chunk of chunks) {
133
+ const chunkLine = chunk.line;
134
+ let parentSection;
135
+ for (let i = sections.length - 1; i >= 0; i--) {
136
+ if (sections[i].line < chunkLine) {
137
+ parentSection = sections[i];
138
+ break;
139
+ }
140
+ }
141
+ if (parentSection) {
142
+ edges.push({
143
+ from: chunk.nodeId,
144
+ to: parentSection.nodeId,
145
+ relation: "part_of",
146
+ });
147
+ }
148
+ else {
149
+ edges.push({
150
+ from: chunk.nodeId,
151
+ to: fileNodeId,
152
+ relation: "part_of",
153
+ });
154
+ }
155
+ }
156
+ return edges;
157
+ }
158
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/graph/language-indexers/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * plcopen-xml.ts — PLCopen XML indexer (IEC 61131-10 / Beremiz / OpenPLC)
3
+ *
4
+ * Regex-based parser that extracts POU, variable, task, and ST code
5
+ * symbols from PLCopen TC6-compliant XML project files.
6
+ *
7
+ * NOTE: PLC XML files can exceed DEFAULT_MAX_FILE_SIZE (200 KB) for
8
+ * large projects with many SFC steps or inlined data. Consider raising
9
+ * `maxFileSizeBytes` when indexing large PLC workspaces.
10
+ */
11
+ import type { LanguageIndexer } from "./index.js";
12
+ import type { GraphEdge } from "../../core/types.js";
13
+ import type { IndexedSymbol } from "../file-indexer-nodes.js";
14
+ export declare function buildPlcEdges(fileNodeId: string, symbols: IndexedSymbol[], _imports: string[]): GraphEdge[];
15
+ export declare const plcopenIndexer: LanguageIndexer;
16
+ //# sourceMappingURL=plcopen-xml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plcopen-xml.d.ts","sourceRoot":"","sources":["../../../src/graph/language-indexers/plcopen-xml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAkD,eAAe,EAAE,MAAM,YAAY,CAAC;AAClG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AA0L9D,wBAAgB,aAAa,CAC3B,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,aAAa,EAAE,EACxB,QAAQ,EAAE,MAAM,EAAE,GACjB,SAAS,EAAE,CA0Cb;AAED,eAAO,MAAM,cAAc,EAAE,eAI5B,CAAC"}
@@ -0,0 +1,204 @@
1
+ "use strict";
2
+ /**
3
+ * plcopen-xml.ts — PLCopen XML indexer (IEC 61131-10 / Beremiz / OpenPLC)
4
+ *
5
+ * Regex-based parser that extracts POU, variable, task, and ST code
6
+ * symbols from PLCopen TC6-compliant XML project files.
7
+ *
8
+ * NOTE: PLC XML files can exceed DEFAULT_MAX_FILE_SIZE (200 KB) for
9
+ * large projects with many SFC steps or inlined data. Consider raising
10
+ * `maxFileSizeBytes` when indexing large PLC workspaces.
11
+ */
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.plcopenIndexer = void 0;
14
+ exports.buildPlcEdges = buildPlcEdges;
15
+ const PROJECT_TAG_RE = /<project\s+[^>]*xmlns\s*=\s*"[^"]*plcopen[^"]*"/i;
16
+ const VAR_SCOPE_TAGS = [
17
+ "localVars",
18
+ "inputVars",
19
+ "outputVars",
20
+ "inOutVars",
21
+ "tempVars",
22
+ "returnType",
23
+ ];
24
+ function isPlcOpenXml(content) {
25
+ return PROJECT_TAG_RE.test(content);
26
+ }
27
+ function extractTypeName(typeContent) {
28
+ const derived = typeContent.match(/<derived\s+name="([^"]+)"/);
29
+ if (derived?.[1])
30
+ return derived[1];
31
+ const baseType = typeContent.match(/<baseType>\s*<(\w+)\s*\/?>/);
32
+ if (baseType?.[1])
33
+ return baseType[1];
34
+ if (/<array>/.test(typeContent))
35
+ return "ARRAY";
36
+ const simple = typeContent.match(/<(\w+)\s*\/?>/);
37
+ if (simple?.[1])
38
+ return simple[1];
39
+ return "UNKNOWN";
40
+ }
41
+ function extractPouVariables(pouBody, pouName, filePath, symbols, imports) {
42
+ for (const scopeTag of VAR_SCOPE_TAGS) {
43
+ const scopeRe = new RegExp(`<${scopeTag}>([\\s\\S]*?)</${scopeTag}>`, "gi");
44
+ let scopeMatch;
45
+ while ((scopeMatch = scopeRe.exec(pouBody)) !== null) {
46
+ const scopeBody = scopeMatch[1];
47
+ if (!scopeBody)
48
+ continue;
49
+ const varRe = /<variable\s+name="([^"]+)">\s*<type>([\s\S]*?)<\/type>/gi;
50
+ let varMatch;
51
+ while ((varMatch = varRe.exec(scopeBody)) !== null) {
52
+ const varName = varMatch[1];
53
+ const typeContentRaw = varMatch[2];
54
+ if (!varName || !typeContentRaw)
55
+ continue;
56
+ const typeContent = typeContentRaw.trim();
57
+ const varType = extractTypeName(typeContent);
58
+ const fullName = `${pouName}.${varName}`;
59
+ symbols.push({
60
+ name: fullName,
61
+ kind: "variable",
62
+ line: 0,
63
+ exported: true,
64
+ signature: `VAR ${varType} ${fullName}`,
65
+ jsdoc: `${pouName}:${scopeTag}`,
66
+ file: filePath,
67
+ });
68
+ const derived = typeContent.match(/<derived\s+name="([^"]+)"/);
69
+ if (derived?.[1]) {
70
+ imports.push({ module: `pou:${derived[1]}` });
71
+ }
72
+ }
73
+ }
74
+ }
75
+ }
76
+ function extractStCode(pouBody, pouName, filePath, symbols) {
77
+ const stRe = /<ST>\s*<xhtml>\s*<!\[CDATA\[([\s\S]*?)\]\]>\s*<\/xhtml>\s*<\/ST>/gi;
78
+ let match;
79
+ while ((match = stRe.exec(pouBody)) !== null) {
80
+ const code = match[1]?.trim();
81
+ if (!code)
82
+ continue;
83
+ symbols.push({
84
+ name: `${pouName}.st_code`,
85
+ kind: "code",
86
+ line: 0,
87
+ exported: true,
88
+ signature: code,
89
+ file: filePath,
90
+ });
91
+ }
92
+ }
93
+ function extractTasks(xml, filePath, symbols) {
94
+ const resourceRe = /<resource\s+name="([^"]+)"[^>]*>([\s\S]*?)<\/resource>/g;
95
+ let resourceMatch;
96
+ while ((resourceMatch = resourceRe.exec(xml)) !== null) {
97
+ const resourceName = resourceMatch[1];
98
+ const resourceBody = resourceMatch[2];
99
+ if (!resourceName || !resourceBody)
100
+ continue;
101
+ const taskRe = /<task\s+name="([^"]+)"(?:\s+priority="(\d+)")?(?:\s+interval="([^"]+)")?/gi;
102
+ let taskMatch;
103
+ while ((taskMatch = taskRe.exec(resourceBody)) !== null) {
104
+ const taskName = taskMatch[1];
105
+ if (!taskName)
106
+ continue;
107
+ const priority = taskMatch[2] ?? "0";
108
+ const interval = taskMatch[3] ?? "N/A";
109
+ symbols.push({
110
+ name: `task.${taskName}`,
111
+ kind: "task",
112
+ line: 0,
113
+ exported: true,
114
+ signature: `TASK ${taskName} interval=${interval} prio=${priority}`,
115
+ jsdoc: `resource=${resourceName}`,
116
+ file: filePath,
117
+ });
118
+ }
119
+ }
120
+ }
121
+ function extractInstanceRefs(xml, imports) {
122
+ const re = /<pouInstance\s+name="([^"]+)"\s+typeName="([^"]+)"/gi;
123
+ let match;
124
+ while ((match = re.exec(xml)) !== null) {
125
+ const typeName = match[2];
126
+ if (!typeName)
127
+ continue;
128
+ imports.push({ module: `pou:${typeName}` });
129
+ }
130
+ }
131
+ function extract(filePath, content) {
132
+ if (!isPlcOpenXml(content)) {
133
+ return { symbols: [], imports: [] };
134
+ }
135
+ const cleanXml = content.replace(/<!--[\s\S]*?-->/g, "");
136
+ const symbols = [];
137
+ const imports = [];
138
+ const pouRe = /<pou\s+[^>]*?\bname="([^"]+)"[^>]*?\bpouType="([^"]+)"[^>]*>([\s\S]*?)<\/pou>/g;
139
+ let pouMatch;
140
+ while ((pouMatch = pouRe.exec(cleanXml)) !== null) {
141
+ const pouName = pouMatch[1];
142
+ const pouType = pouMatch[2];
143
+ const pouBody = pouMatch[3];
144
+ if (!pouName || !pouType)
145
+ continue;
146
+ symbols.push({
147
+ name: pouName,
148
+ kind: "pou",
149
+ line: 0,
150
+ exported: true,
151
+ signature: `POU ${pouType} ${pouName}`,
152
+ jsdoc: pouType,
153
+ file: filePath,
154
+ });
155
+ if (pouBody) {
156
+ extractPouVariables(pouBody, pouName, filePath, symbols, imports);
157
+ extractStCode(pouBody, pouName, filePath, symbols);
158
+ }
159
+ }
160
+ extractTasks(cleanXml, filePath, symbols);
161
+ extractInstanceRefs(cleanXml, imports);
162
+ return { symbols, imports };
163
+ }
164
+ function buildPlcEdges(fileNodeId, symbols, _imports) {
165
+ const edges = [];
166
+ for (const sym of symbols) {
167
+ if (sym.kind === "variable" && sym.jsdoc) {
168
+ const pouName = sym.jsdoc.split(":")[0];
169
+ const pouNode = symbols.find((s) => s.kind === "pou" && s.name === pouName);
170
+ if (pouNode?.nodeId && sym.nodeId) {
171
+ edges.push({
172
+ from: pouNode.nodeId,
173
+ to: sym.nodeId,
174
+ relation: "depends_on",
175
+ });
176
+ }
177
+ }
178
+ if (sym.kind === "code") {
179
+ const pouName = sym.name.replace(".st_code", "");
180
+ const pouNode = symbols.find((s) => s.kind === "pou" && s.name === pouName);
181
+ if (pouNode?.nodeId && sym.nodeId) {
182
+ edges.push({
183
+ from: pouNode.nodeId,
184
+ to: sym.nodeId,
185
+ relation: "depends_on",
186
+ });
187
+ }
188
+ }
189
+ if (sym.kind === "task" && sym.nodeId) {
190
+ edges.push({
191
+ from: fileNodeId,
192
+ to: sym.nodeId,
193
+ relation: "depends_on",
194
+ });
195
+ }
196
+ }
197
+ return edges;
198
+ }
199
+ exports.plcopenIndexer = {
200
+ language: "plcopen",
201
+ extensions: [".xml"],
202
+ extract,
203
+ };
204
+ //# sourceMappingURL=plcopen-xml.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plcopen-xml.js","sourceRoot":"","sources":["../../../src/graph/language-indexers/plcopen-xml.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * st-analyzer.ts — IEC 61131-3 Structured Text code analysis utility
3
+ *
4
+ * Extracts POU calls, data flow (variable reads/writes), and control flow
5
+ * from ST code embedded in PLCopen XML. Called by the plcopen-xml indexer
6
+ * to enhance its ExtractionResult.
7
+ *
8
+ * Integration guide for the plcopen-xml indexer:
9
+ *
10
+ * import { analyzeStCode } from "./st-analyzer";
11
+ *
12
+ * for (const pou of pouData) {
13
+ * if (pou.stCode !== undefined) {
14
+ * const analysis = analyzeStCode(pou.name, pou.stCode);
15
+ * // Merge analysis.calls into ExtractionResult.calls
16
+ * // Store analysis.dataFlow / analysis.controlFlow in POU symbol metadata
17
+ * stCalls.push(...analysis.calls);
18
+ * }
19
+ * }
20
+ */
21
+ import type { CallRelation } from "./index.js";
22
+ export interface StDataFlow {
23
+ /** Qualified source: `${pouName}.${varName}` */
24
+ from: string;
25
+ /** Qualified target: `${pouName}.${varName}` or `${pouName}.IF_12` for conditions */
26
+ to: string;
27
+ kind: "reads" | "writes";
28
+ line: number;
29
+ }
30
+ export interface StControlFlow {
31
+ /** Parent block name or "entry" */
32
+ from: string;
33
+ /** Block label, e.g. "IF_3", "FOR_8", "CASE_12" */
34
+ to: string;
35
+ /** Condition expression (abbreviated), if applicable */
36
+ condition?: string;
37
+ type: "if" | "elsif" | "else" | "for" | "while" | "repeat" | "case" | "case_entry";
38
+ line: number;
39
+ }
40
+ export interface StAnalysisResult {
41
+ /** POU call relations extracted from ST code */
42
+ calls: CallRelation[];
43
+ /** Variable-level read / write edges within the POU */
44
+ dataFlow: StDataFlow[];
45
+ /** High-level control structure for code understanding */
46
+ controlFlow: StControlFlow[];
47
+ }
48
+ export declare function analyzeStCode(pouName: string, stCode: string): StAnalysisResult;
49
+ //# sourceMappingURL=st-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"st-analyzer.d.ts","sourceRoot":"","sources":["../../../src/graph/language-indexers/st-analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,MAAM,WAAW,UAAU;IACzB,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAC;IACX,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,GAAG,YAAY,CAAC;IACnF,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,gDAAgD;IAChD,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,uDAAuD;IACvD,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,0DAA0D;IAC1D,WAAW,EAAE,aAAa,EAAE,CAAC;CAC9B;AAuMD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB,CA8P/E"}