@genvidtech/c3-domain-manager 0.0.1 → 0.6.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 (70) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +195 -29
  3. package/dist/adapters/locations.d.ts +22 -0
  4. package/dist/adapters/locations.d.ts.map +1 -0
  5. package/dist/adapters/locations.js +42 -0
  6. package/dist/adapters/locations.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +99 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/domain/classification.d.ts +8 -0
  12. package/dist/domain/classification.d.ts.map +1 -0
  13. package/dist/domain/classification.js +66 -0
  14. package/dist/domain/classification.js.map +1 -0
  15. package/dist/domain/contextMap.d.ts +8 -0
  16. package/dist/domain/contextMap.d.ts.map +1 -0
  17. package/dist/domain/contextMap.js +168 -0
  18. package/dist/domain/contextMap.js.map +1 -0
  19. package/dist/domain/domainAnalysis.d.ts +25 -0
  20. package/dist/domain/domainAnalysis.d.ts.map +1 -0
  21. package/dist/domain/domainAnalysis.js +136 -0
  22. package/dist/domain/domainAnalysis.js.map +1 -0
  23. package/dist/domain/domainGenerator.d.ts +33 -0
  24. package/dist/domain/domainGenerator.d.ts.map +1 -0
  25. package/dist/domain/domainGenerator.js +307 -0
  26. package/dist/domain/domainGenerator.js.map +1 -0
  27. package/dist/domain/editorValidation.d.ts +19 -0
  28. package/dist/domain/editorValidation.d.ts.map +1 -0
  29. package/dist/domain/editorValidation.js +40 -0
  30. package/dist/domain/editorValidation.js.map +1 -0
  31. package/dist/domain/formatting.d.ts +16 -0
  32. package/dist/domain/formatting.d.ts.map +1 -0
  33. package/dist/domain/formatting.js +414 -0
  34. package/dist/domain/formatting.js.map +1 -0
  35. package/dist/domain/glossary.d.ts +20 -0
  36. package/dist/domain/glossary.d.ts.map +1 -0
  37. package/dist/domain/glossary.js +62 -0
  38. package/dist/domain/glossary.js.map +1 -0
  39. package/dist/domain/health.d.ts +14 -0
  40. package/dist/domain/health.d.ts.map +1 -0
  41. package/dist/domain/health.js +21 -0
  42. package/dist/domain/health.js.map +1 -0
  43. package/dist/domain/relationships.d.ts +13 -0
  44. package/dist/domain/relationships.d.ts.map +1 -0
  45. package/dist/domain/relationships.js +74 -0
  46. package/dist/domain/relationships.js.map +1 -0
  47. package/dist/domain/types.d.ts +290 -0
  48. package/dist/domain/types.d.ts.map +1 -0
  49. package/dist/domain/types.js +29 -0
  50. package/dist/domain/types.js.map +1 -0
  51. package/dist/index.d.ts +11 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +12 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/mcp/server.d.ts +3 -0
  56. package/dist/mcp/server.d.ts.map +1 -0
  57. package/dist/mcp/server.js +519 -0
  58. package/dist/mcp/server.js.map +1 -0
  59. package/docs/TOC.md +27 -0
  60. package/docs/decisions/0001-adopt-c3source-extractors.md +67 -0
  61. package/docs/decisions/0002-configurable-locations-adapters-seam.md +72 -0
  62. package/docs/decisions/0003-adopt-loadprojectconfig-schema-first.md +73 -0
  63. package/docs/decisions/0004-adopt-mcp-utils-0.4.0-helpers.md +74 -0
  64. package/docs/decisions/0005-validateforeditor-read-side-diagnostic.md +65 -0
  65. package/docs/decisions/0006-event-variable-reference-coupling.md +77 -0
  66. package/docs/decisions/0007-project-dir-resolverootfolder.md +72 -0
  67. package/docs/decisions/0008-adopt-openproject-option-a.md +74 -0
  68. package/docs/domain-architecture.md +242 -0
  69. package/docs/releasing.md +122 -0
  70. package/package.json +79 -8
@@ -0,0 +1,168 @@
1
+ // Special characters that require quoting in mermaid node IDs
2
+ function needsQuoting(name) {
3
+ return /[\s&()/\\,.'"]/.test(name);
4
+ }
5
+ function mermaidId(name) {
6
+ return needsQuoting(name) ? `"${name}"` : name;
7
+ }
8
+ function toMermaidArrow(type) {
9
+ switch (type) {
10
+ case "shared-kernel":
11
+ return "==SK==>";
12
+ case "customer-supplier":
13
+ return "-->|C/S|";
14
+ case "conformist":
15
+ return "-->|CF|";
16
+ case "anti-corruption-layer":
17
+ return "-->|ACL|";
18
+ case "open-host-service":
19
+ return "-->|OHS|";
20
+ }
21
+ }
22
+ function collectIncludedDomains(domains, config, focusDomain) {
23
+ const domainByName = new Map(domains.map((d) => [d.name, d]));
24
+ if (focusDomain === undefined) {
25
+ return new Set(domains.map((d) => d.name));
26
+ }
27
+ const focus = domainByName.get(focusDomain);
28
+ if (!focus)
29
+ return new Set();
30
+ const included = new Set();
31
+ included.add(focusDomain);
32
+ // 1-hop neighbors via includesFrom (outgoing deps from domain data)
33
+ for (const neighbor of focus.includesFrom.keys()) {
34
+ included.add(neighbor);
35
+ }
36
+ // 1-hop neighbors via includedBy (incoming deps from domain data)
37
+ for (const neighbor of focus.includedBy.keys()) {
38
+ included.add(neighbor);
39
+ }
40
+ // 1-hop neighbors via referencesFrom (outgoing event-var refs)
41
+ for (const neighbor of focus.referencesFrom.keys()) {
42
+ included.add(neighbor);
43
+ }
44
+ // 1-hop neighbors via referencedBy (incoming event-var refs)
45
+ for (const neighbor of focus.referencedBy.keys()) {
46
+ included.add(neighbor);
47
+ }
48
+ // 1-hop neighbors via declared relationships
49
+ for (const rel of config.relationships ?? []) {
50
+ if (rel.from === focusDomain)
51
+ included.add(rel.to);
52
+ if (rel.to === focusDomain)
53
+ included.add(rel.from);
54
+ }
55
+ return included;
56
+ }
57
+ function collectEdges(domains, config, includedNames, includeObserved) {
58
+ const edges = [];
59
+ const relationships = config.relationships ?? [];
60
+ // Add declared relationships between included domains
61
+ for (const rel of relationships) {
62
+ if (includedNames.has(rel.from) && includedNames.has(rel.to)) {
63
+ edges.push({ from: rel.from, to: rel.to, type: rel.type });
64
+ }
65
+ }
66
+ if (!includeObserved)
67
+ return edges;
68
+ // Build a set of pairs already covered by declared relationships
69
+ const declaredPairs = new Set();
70
+ for (const rel of relationships) {
71
+ declaredPairs.add(`${rel.from}::${rel.to}`);
72
+ declaredPairs.add(`${rel.to}::${rel.from}`);
73
+ }
74
+ // Add observed edges: domain.includesFrom entries not covered by any declared relationship
75
+ const observedIncludePairs = new Set();
76
+ for (const domain of domains) {
77
+ if (!includedNames.has(domain.name))
78
+ continue;
79
+ for (const targetDomain of domain.includesFrom.keys()) {
80
+ if (!includedNames.has(targetDomain))
81
+ continue;
82
+ const pairKey = `${domain.name}::${targetDomain}`;
83
+ if (!declaredPairs.has(pairKey)) {
84
+ edges.push({ from: domain.name, to: targetDomain, type: "observed" });
85
+ observedIncludePairs.add(pairKey);
86
+ }
87
+ }
88
+ }
89
+ // Add observed-ref edges: domain.referencesFrom entries not covered by declared or observed-include
90
+ for (const domain of domains) {
91
+ if (!includedNames.has(domain.name))
92
+ continue;
93
+ for (const targetDomain of domain.referencesFrom.keys()) {
94
+ if (!includedNames.has(targetDomain))
95
+ continue;
96
+ const pairKey = `${domain.name}::${targetDomain}`;
97
+ if (!declaredPairs.has(pairKey) && !observedIncludePairs.has(pairKey)) {
98
+ edges.push({ from: domain.name, to: targetDomain, type: "observed-ref" });
99
+ }
100
+ }
101
+ }
102
+ return edges;
103
+ }
104
+ function formatMermaid(includedNames, edges) {
105
+ if (edges.length === 0) {
106
+ return "graph LR";
107
+ }
108
+ const lines = ["graph LR"];
109
+ for (const edge of edges) {
110
+ const fromId = mermaidId(edge.from);
111
+ const toId = mermaidId(edge.to);
112
+ if (edge.type === "observed") {
113
+ lines.push(` ${fromId} -.-> ${toId}`);
114
+ }
115
+ else if (edge.type === "observed-ref") {
116
+ lines.push(` ${fromId} -.->|var| ${toId}`);
117
+ }
118
+ else {
119
+ const arrow = toMermaidArrow(edge.type);
120
+ lines.push(` ${fromId} ${arrow} ${toId}`);
121
+ }
122
+ }
123
+ return lines.join("\n");
124
+ }
125
+ function formatText(domains, includedNames, edges) {
126
+ const includedDomains = domains.filter((d) => includedNames.has(d.name));
127
+ if (includedDomains.length === 0) {
128
+ return "Context Map:\n\nNo domains.";
129
+ }
130
+ const lines = ["Context Map:", ""];
131
+ const outgoing = new Map();
132
+ const incoming = new Map();
133
+ for (const name of includedNames) {
134
+ outgoing.set(name, []);
135
+ incoming.set(name, []);
136
+ }
137
+ for (const edge of edges) {
138
+ outgoing.get(edge.from)?.push({ neighbor: edge.to, type: edge.type });
139
+ incoming.get(edge.to)?.push({ neighbor: edge.from, type: edge.type });
140
+ }
141
+ for (const domain of includedDomains) {
142
+ lines.push(domain.name);
143
+ const outs = outgoing.get(domain.name) ?? [];
144
+ const ins = incoming.get(domain.name) ?? [];
145
+ for (const entry of outs) {
146
+ lines.push(` → ${entry.neighbor} [${entry.type}]`);
147
+ }
148
+ for (const entry of ins) {
149
+ lines.push(` ← ${entry.neighbor} [${entry.type}]`);
150
+ }
151
+ lines.push("");
152
+ }
153
+ // Remove trailing empty line
154
+ if (lines[lines.length - 1] === "") {
155
+ lines.pop();
156
+ }
157
+ return lines.join("\n");
158
+ }
159
+ export function generateContextMap(domains, config, opts) {
160
+ const includeObserved = opts.includeObserved ?? true;
161
+ const includedNames = collectIncludedDomains(domains, config, opts.domain);
162
+ const edges = collectEdges(domains, config, includedNames, includeObserved);
163
+ if (opts.format === "mermaid") {
164
+ return formatMermaid(includedNames, edges);
165
+ }
166
+ return formatText(domains, includedNames, edges);
167
+ }
168
+ //# sourceMappingURL=contextMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contextMap.js","sourceRoot":"","sources":["../../src/domain/contextMap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { DomainConfig } from "./types.js";
2
+ /**
3
+ * Scan eventSheets/, layouts/, and scripts/ directories and return files
4
+ * that classifyFile() returns null for (sorted).
5
+ */
6
+ export declare function listUncategorized(rootDir: string, config: DomainConfig): string[];
7
+ /**
8
+ * Check each key in config.overrides — return keys that point to non-existent files (sorted).
9
+ */
10
+ export declare function listStaleOverrides(rootDir: string, config: DomainConfig): string[];
11
+ /**
12
+ * Collect all valid domain and subdomain names from the config.
13
+ */
14
+ export declare function collectValidDomainNames(config: DomainConfig): Set<string>;
15
+ /**
16
+ * Validate override keys have a recognized path prefix.
17
+ * Returns error strings for invalid keys. Empty array = all valid.
18
+ */
19
+ export declare function validateOverrideKeys(keys: string[]): string[];
20
+ /**
21
+ * Validate override values are known domain/subdomain names.
22
+ * Returns error strings for invalid values. Empty array = all valid.
23
+ */
24
+ export declare function validateOverrideValues(entries: Record<string, string>, validNames: Set<string>): string[];
25
+ //# sourceMappingURL=domainAnalysis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domainAnalysis.d.ts","sourceRoot":"","sources":["../../src/domain/domainAnalysis.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAiC/C;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAwCjF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,EAAE,CAYlF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC,CASzE;AAID;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAU7D;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,MAAM,EAAE,CAgBV"}
@@ -0,0 +1,136 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { openProject } from "@genvidtech/c3source";
4
+ import { classifyFile } from "./classification.js";
5
+ /**
6
+ * Recursively collect all files under a directory, returning paths relative to baseDir.
7
+ * Returns an empty array if the directory doesn't exist.
8
+ */
9
+ function collectFiles(dir, baseDir) {
10
+ if (!fs.existsSync(dir))
11
+ return [];
12
+ const results = [];
13
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
14
+ for (const entry of entries) {
15
+ const fullPath = path.join(dir, entry.name);
16
+ if (entry.isDirectory()) {
17
+ results.push(...collectFiles(fullPath, baseDir));
18
+ }
19
+ else {
20
+ results.push(path.relative(baseDir, fullPath).replace(/\\/g, "/"));
21
+ }
22
+ }
23
+ return results;
24
+ }
25
+ /**
26
+ * Collect root-level .ts files in a directory (non-recursive).
27
+ * Returns paths relative to baseDir.
28
+ */
29
+ function collectRootTsFiles(dir, baseDir) {
30
+ if (!fs.existsSync(dir))
31
+ return [];
32
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
33
+ return entries
34
+ .filter((e) => e.isFile() && e.name.endsWith(".ts"))
35
+ .map((e) => path.relative(baseDir, path.join(dir, e.name)).replace(/\\/g, "/"));
36
+ }
37
+ /**
38
+ * Scan eventSheets/, layouts/, and scripts/ directories and return files
39
+ * that classifyFile() returns null for (sorted).
40
+ */
41
+ export function listUncategorized(rootDir, config) {
42
+ const uncategorized = [];
43
+ const project = openProject(rootDir);
44
+ // EventSheets
45
+ const eventSheetFiles = collectFiles(project.eventSheetsDir, rootDir);
46
+ for (const file of eventSheetFiles) {
47
+ if (classifyFile(file, "eventSheet", config) === null) {
48
+ uncategorized.push(file);
49
+ }
50
+ }
51
+ // Layouts
52
+ const layoutFiles = collectFiles(project.layoutsDir, rootDir);
53
+ for (const file of layoutFiles) {
54
+ if (classifyFile(file, "layout", config) === null) {
55
+ uncategorized.push(file);
56
+ }
57
+ }
58
+ // Scripts: walk shared/, c3-runtime/, common/, ts-defs/ + root-level .ts files
59
+ const scriptSubdirs = ["shared", "c3-runtime", "common", "ts-defs"];
60
+ for (const subdir of scriptSubdirs) {
61
+ const files = collectFiles(path.join(project.scriptsDir, subdir), rootDir);
62
+ for (const file of files) {
63
+ if (classifyFile(file, "script", config) === null) {
64
+ uncategorized.push(file);
65
+ }
66
+ }
67
+ }
68
+ // Root-level .ts files in scripts/
69
+ const rootTsFiles = collectRootTsFiles(project.scriptsDir, rootDir);
70
+ for (const file of rootTsFiles) {
71
+ if (classifyFile(file, "script", config) === null) {
72
+ uncategorized.push(file);
73
+ }
74
+ }
75
+ return uncategorized.sort();
76
+ }
77
+ /**
78
+ * Check each key in config.overrides — return keys that point to non-existent files (sorted).
79
+ */
80
+ export function listStaleOverrides(rootDir, config) {
81
+ if (!config.overrides)
82
+ return [];
83
+ const stale = [];
84
+ for (const key of Object.keys(config.overrides)) {
85
+ const fullPath = path.join(rootDir, key);
86
+ if (!fs.existsSync(fullPath)) {
87
+ stale.push(key);
88
+ }
89
+ }
90
+ return stale.sort();
91
+ }
92
+ /**
93
+ * Collect all valid domain and subdomain names from the config.
94
+ */
95
+ export function collectValidDomainNames(config) {
96
+ const names = new Set();
97
+ for (const key of Object.keys(config.domains)) {
98
+ names.add(key);
99
+ }
100
+ for (const key of Object.keys(config.sharedSubdomains ?? {})) {
101
+ names.add(key);
102
+ }
103
+ return names;
104
+ }
105
+ const VALID_PREFIXES = ["eventSheets/", "layouts/", "scripts/"];
106
+ /**
107
+ * Validate override keys have a recognized path prefix.
108
+ * Returns error strings for invalid keys. Empty array = all valid.
109
+ */
110
+ export function validateOverrideKeys(keys) {
111
+ const errors = [];
112
+ for (const key of keys) {
113
+ if (!VALID_PREFIXES.some((prefix) => key.startsWith(prefix))) {
114
+ errors.push(`Invalid path prefix: '${key}' — must start with eventSheets/, layouts/, or scripts/`);
115
+ }
116
+ }
117
+ return errors;
118
+ }
119
+ /**
120
+ * Validate override values are known domain/subdomain names.
121
+ * Returns error strings for invalid values. Empty array = all valid.
122
+ */
123
+ export function validateOverrideValues(entries, validNames) {
124
+ const errors = [];
125
+ const sortedNames = Array.from(validNames).sort();
126
+ const suggestion = sortedNames.length <= 5
127
+ ? sortedNames.join(", ")
128
+ : sortedNames.slice(0, 5).join(", ") + ", ...";
129
+ for (const [filePath, domainName] of Object.entries(entries)) {
130
+ if (!validNames.has(domainName)) {
131
+ errors.push(`Unknown domain '${domainName}' for path '${filePath}' — valid names: ${suggestion}`);
132
+ }
133
+ }
134
+ return errors;
135
+ }
136
+ //# sourceMappingURL=domainAnalysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domainAnalysis.js","sourceRoot":"","sources":["../../src/domain/domainAnalysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { EventSheet } from "@genvidtech/c3source";
2
+ import type { DomainConfig, DomainData, FunctionDef } from "./types.js";
3
+ import type { Logger } from "@genvidtech/mcp-utils";
4
+ /**
5
+ * Map c3source's typed `ExtractedFunction` list for a sheet onto our `FunctionDef`
6
+ * shape: format params to a string, stamp the source sheet, and surface the
7
+ * custom-ACE `objectClass`/`aceName` that `formatting.ts` renders.
8
+ */
9
+ export declare function extractFunctionDefs(sheet: EventSheet, sheetName: string): FunctionDef[];
10
+ /**
11
+ * Top-level (sheet-root ≈ global-scope) event-variable declaration names for a sheet.
12
+ * Only root-level `variable` events are indexed — cross-sheet references in C3 require
13
+ * global variables, so root-level declarations are the global-scope approximation.
14
+ */
15
+ export declare function extractEventVarDecls(sheet: EventSheet): string[];
16
+ /**
17
+ * Deduped event-variable names referenced by System ACEs anywhere in a sheet's event tree.
18
+ * Walks every condition and action via `visitEvents`, applying c3source's
19
+ * `getEventVarReferenceName` (which gates on `objectClass === "System"`).
20
+ */
21
+ export declare function extractEventVarRefs(sheet: EventSheet): string[];
22
+ export declare function loadConfig(projectRoot: string, fileName: string): Promise<DomainConfig>;
23
+ export declare function findScriptEntries(scriptsDir: string): Array<{
24
+ relativePath: string;
25
+ isDirectory: boolean;
26
+ }>;
27
+ export interface ComputeDomainDataResult {
28
+ domains: DomainData[];
29
+ unclassified: string[];
30
+ }
31
+ export declare function computeDomainData(rootDir: string, config: DomainConfig, log?: Logger): ComputeDomainDataResult;
32
+ export declare function generateDomainIndex(rootDir: string, outDir: string, projectRoot: string, fileName: string, log?: Logger): Promise<void>;
33
+ //# sourceMappingURL=domainGenerator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domainGenerator.d.ts","sourceRoot":"","sources":["../../src/domain/domainGenerator.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,UAAU,EAA8C,MAAM,sBAAsB,CAAC;AAGnG,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGxE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAOpD;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE,CASvF;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE,CAIhE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,EAAE,CAiB/D;AAED,wBAAsB,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAQ7F;AAKD,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC,CAwB3G;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,YAAY,EACpB,GAAG,GAAE,MAAiB,GACrB,uBAAuB,CAgNzB;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,GAAG,GAAE,MAAoB,GACxB,OAAO,CAAC,IAAI,CAAC,CA4Bf"}