@rotifer/playground 0.27.0 → 0.29.0

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 (65) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +3 -1
  3. package/README.zh.md +3 -1
  4. package/dist/cloud/capability-candidates.d.ts +89 -0
  5. package/dist/cloud/capability-candidates.d.ts.map +1 -0
  6. package/dist/cloud/capability-candidates.js +296 -0
  7. package/dist/cloud/capability-candidates.js.map +1 -0
  8. package/dist/commands/agent-create.d.ts +8 -0
  9. package/dist/commands/agent-create.d.ts.map +1 -1
  10. package/dist/commands/agent-create.js +5 -2
  11. package/dist/commands/agent-create.js.map +1 -1
  12. package/dist/commands/agent-run.d.ts.map +1 -1
  13. package/dist/commands/agent-run.js +30 -13
  14. package/dist/commands/agent-run.js.map +1 -1
  15. package/dist/commands/genome-format.d.ts +180 -0
  16. package/dist/commands/genome-format.d.ts.map +1 -0
  17. package/dist/commands/genome-format.js +774 -0
  18. package/dist/commands/genome-format.js.map +1 -0
  19. package/dist/commands/genome-import.d.ts +100 -0
  20. package/dist/commands/genome-import.d.ts.map +1 -0
  21. package/dist/commands/genome-import.js +425 -0
  22. package/dist/commands/genome-import.js.map +1 -0
  23. package/dist/commands/genome.d.ts +82 -0
  24. package/dist/commands/genome.d.ts.map +1 -0
  25. package/dist/commands/genome.js +392 -0
  26. package/dist/commands/genome.js.map +1 -0
  27. package/dist/commands/install.d.ts +54 -0
  28. package/dist/commands/install.d.ts.map +1 -1
  29. package/dist/commands/install.js +148 -75
  30. package/dist/commands/install.js.map +1 -1
  31. package/dist/commands/publish.js +2 -2
  32. package/dist/commands/publish.js.map +1 -1
  33. package/dist/commands/vg.js +2 -2
  34. package/dist/commands/vg.js.map +1 -1
  35. package/dist/index.js +4 -0
  36. package/dist/index.js.map +1 -1
  37. package/dist/publish/pre-publish-check.d.ts +15 -0
  38. package/dist/publish/pre-publish-check.d.ts.map +1 -1
  39. package/dist/publish/pre-publish-check.js +17 -2
  40. package/dist/publish/pre-publish-check.js.map +1 -1
  41. package/dist/scanner/index.d.ts +1 -1
  42. package/dist/scanner/index.d.ts.map +1 -1
  43. package/dist/scanner/index.js +3 -1
  44. package/dist/scanner/index.js.map +1 -1
  45. package/dist/scanner/literals.d.ts +2 -0
  46. package/dist/scanner/literals.d.ts.map +1 -0
  47. package/dist/scanner/literals.js +293 -0
  48. package/dist/scanner/literals.js.map +1 -0
  49. package/dist/scanner/rules.d.ts +14 -0
  50. package/dist/scanner/rules.d.ts.map +1 -1
  51. package/dist/scanner/rules.js +30 -1
  52. package/dist/scanner/rules.js.map +1 -1
  53. package/dist/scanner/scanner.d.ts.map +1 -1
  54. package/dist/scanner/scanner.js +8 -1
  55. package/dist/scanner/scanner.js.map +1 -1
  56. package/dist/scanner/types.d.ts +7 -0
  57. package/dist/scanner/types.d.ts.map +1 -1
  58. package/dist/utils/binding.d.ts +1 -1
  59. package/dist/utils/binding.d.ts.map +1 -1
  60. package/dist/utils/binding.js.map +1 -1
  61. package/dist/utils/rust-phenotype.d.ts +24 -0
  62. package/dist/utils/rust-phenotype.d.ts.map +1 -0
  63. package/dist/utils/rust-phenotype.js +59 -0
  64. package/dist/utils/rust-phenotype.js.map +1 -0
  65. package/package.json +5 -5
@@ -1,10 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SCAN_RULES = exports.computeGrade = exports.scanFile = exports.scan = void 0;
3
+ exports.rulesFingerprint = exports.SCANNER_VERSION = exports.SCAN_RULES = exports.computeGrade = exports.scanFile = exports.scan = void 0;
4
4
  var scanner_js_1 = require("./scanner.js");
5
5
  Object.defineProperty(exports, "scan", { enumerable: true, get: function () { return scanner_js_1.scan; } });
6
6
  Object.defineProperty(exports, "scanFile", { enumerable: true, get: function () { return scanner_js_1.scanFile; } });
7
7
  Object.defineProperty(exports, "computeGrade", { enumerable: true, get: function () { return scanner_js_1.computeGrade; } });
8
8
  var rules_js_1 = require("./rules.js");
9
9
  Object.defineProperty(exports, "SCAN_RULES", { enumerable: true, get: function () { return rules_js_1.SCAN_RULES; } });
10
+ Object.defineProperty(exports, "SCANNER_VERSION", { enumerable: true, get: function () { return rules_js_1.SCANNER_VERSION; } });
11
+ Object.defineProperty(exports, "rulesFingerprint", { enumerable: true, get: function () { return rules_js_1.rulesFingerprint; } });
10
12
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":";;;AAAA,2CAA4D;AAAnD,kGAAA,IAAI,OAAA;AAAE,sGAAA,QAAQ,OAAA;AAAE,0GAAA,YAAY,OAAA;AAErC,uCAAwC;AAA/B,sGAAA,UAAU,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":";;;AAAA,2CAA4D;AAAnD,kGAAA,IAAI,OAAA;AAAE,sGAAA,QAAQ,OAAA;AAAE,0GAAA,YAAY,OAAA;AAErC,uCAA2E;AAAlE,sGAAA,UAAU,OAAA;AAAE,2GAAA,eAAe,OAAA;AAAE,4GAAA,gBAAgB,OAAA"}
@@ -0,0 +1,2 @@
1
+ export declare function maskJsLiterals(lines: string[]): string[];
2
+ //# sourceMappingURL=literals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"literals.d.ts","sourceRoot":"","sources":["../../src/scanner/literals.ts"],"names":[],"mappings":"AA2RA,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAoCxD"}
@@ -0,0 +1,293 @@
1
+ "use strict";
2
+ // Blanks out the parts of JavaScript / TypeScript source that cannot execute —
3
+ // string, template and regex literal bodies and comments — so a rule can tell a
4
+ // real `eval(` call from the text "eval() usage" or the regex /\beval\s*\(/.
5
+ // Delimiters stay in place and every masked character becomes a space, so
6
+ // column positions and line count are unchanged.
7
+ //
8
+ // What it guarantees, and what it does not:
9
+ //
10
+ // - A `/` that could be either division or the start of a regex is lexed both
11
+ // ways in parallel, and a character is blanked only if every reading puts it
12
+ // inside a literal or comment. Readings that reach the same state merge; if
13
+ // more than MAX_READINGS are alive at once, masking stops and the rest of the
14
+ // file is left as raw source.
15
+ // - A regex is only considered where a closing `/` exists on the same line.
16
+ // Strings continued with a trailing `\` stay strings on the next line;
17
+ // template literals and block comments are tracked across lines; `\r`,
18
+ // U+2028 and U+2029 end a line comment, as they do in JavaScript.
19
+ //
20
+ // Within those rules, a character that JavaScript executes as code is never
21
+ // blanked. It does not make S-01 complete: code it cannot see as a call at
22
+ // all, such as globalThis["ev" + "al"](x), was never caught by the raw-line
23
+ // patterns either.
24
+ //
25
+ // Changing this file changes scan results: bump SCANNER_VERSION in rules.ts.
26
+ // tests/unit/scanner-rules.test.ts pins this file's hash to make that visible.
27
+ Object.defineProperty(exports, "__esModule", { value: true });
28
+ exports.maskJsLiterals = maskJsLiterals;
29
+ const MAX_READINGS = 16;
30
+ // After these, a `/` cannot be division, so it starts a regex.
31
+ const REGEX_AFTER_PUNCT = new Set(["(", ",", "=", ":", "[", "&", "|", "?", "{", ";", "*", "%", "<", "~", "^", "/"]);
32
+ // After these, a `/` is always division: an identifier, a number or a literal.
33
+ const WORD = "w";
34
+ const LITERAL = "L";
35
+ // Reserved words after which an expression, and so a regex, starts.
36
+ const REGEX_AFTER_KEYWORD = new Set([
37
+ "return", "typeof", "instanceof", "in", "new", "delete", "void", "throw",
38
+ "case", "do", "else", "extends", "default",
39
+ ]);
40
+ // Words after which a `/` may be either. `yield`, `await` and `of` are
41
+ // identifiers in some contexts. `break` and `continue` get an automatic `;`
42
+ // before a line break, so a `/` on the next line starts a regex.
43
+ const AMBIGUOUS_WORDS = new Set(["yield", "await", "of", "break", "continue"]);
44
+ const IDENT_CHAR = /[A-Za-z0-9_$]/;
45
+ const LINE_TERMINATORS = new Set(["\n", "\r", "
", "
"]);
46
+ function slashKind(r) {
47
+ if (r.prev === WORD) {
48
+ if (REGEX_AFTER_KEYWORD.has(r.prevWord))
49
+ return "regex";
50
+ if (AMBIGUOUS_WORDS.has(r.prevWord))
51
+ return "ambiguous";
52
+ return "division";
53
+ }
54
+ if (r.prev === LITERAL)
55
+ return "division";
56
+ if (r.prev === "")
57
+ return "regex";
58
+ // `a++ / b` is division; `a + +/x/` is a regex.
59
+ if ((r.prev === "+" || r.prev === "-") && r.prev2 === r.prev)
60
+ return "ambiguous";
61
+ // `=>` precedes an expression; any other `>` may close a TypeScript generic.
62
+ if (r.prev === ">")
63
+ return r.prev2 === "=" ? "regex" : "ambiguous";
64
+ if (REGEX_AFTER_PUNCT.has(r.prev) || r.prev === "+" || r.prev === "-")
65
+ return "regex";
66
+ // `)`, `]`, `}`, `!` (TypeScript non-null), `.` and anything else.
67
+ return "ambiguous";
68
+ }
69
+ // Index of the `/` that would close a regex starting at `start`, or -1 if the
70
+ // line ends first (then it cannot be a regex).
71
+ function findRegexEnd(text, start) {
72
+ let isInClass = false;
73
+ for (let j = start + 1; j < text.length; j++) {
74
+ const c = text[j];
75
+ if (LINE_TERMINATORS.has(c))
76
+ return -1;
77
+ if (c === "\\") {
78
+ j++;
79
+ if (j < text.length && LINE_TERMINATORS.has(text[j]))
80
+ return -1;
81
+ continue;
82
+ }
83
+ if (c === "[")
84
+ isInClass = true;
85
+ else if (c === "]")
86
+ isInClass = false;
87
+ else if (c === "/" && !isInClass)
88
+ return j;
89
+ }
90
+ return -1;
91
+ }
92
+ function setPrev(r, token) {
93
+ r.prev2 = r.prev;
94
+ r.prev = token;
95
+ r.prevWord = "";
96
+ }
97
+ function endIdent(r) {
98
+ if (!r.ident)
99
+ return;
100
+ r.prevWord = r.isPropertyIdent ? "" : r.ident;
101
+ r.ident = "";
102
+ }
103
+ function stateKey(r) {
104
+ return JSON.stringify([
105
+ r.mode, r.quote, r.isEscaped, r.regexEnd, r.templateStack, r.braceDepth,
106
+ r.prev, r.prev2, r.prevWord, r.ident, r.isPropertyIdent, r.skip,
107
+ ]);
108
+ }
109
+ // Advances `r` over text[i]. Returns whether that character is masked, plus
110
+ // the alternative reading when text[i] is an ambiguous `/`.
111
+ function step(r, text, i) {
112
+ const ch = text[i];
113
+ if (r.skip > 0) {
114
+ r.skip--;
115
+ return { isMasked: false };
116
+ }
117
+ switch (r.mode) {
118
+ case "lineComment":
119
+ if (LINE_TERMINATORS.has(ch)) {
120
+ r.mode = "code";
121
+ return { isMasked: false };
122
+ }
123
+ return { isMasked: true };
124
+ case "blockComment":
125
+ if (ch === "*" && text[i + 1] === "/") {
126
+ r.mode = "code";
127
+ r.skip = 1;
128
+ return { isMasked: false };
129
+ }
130
+ return { isMasked: ch !== "\n" };
131
+ case "string":
132
+ if (r.isEscaped) {
133
+ r.isEscaped = false;
134
+ // `\` + CRLF is one line continuation.
135
+ if (ch === "\r" && text[i + 1] === "\n")
136
+ r.skip = 1;
137
+ return { isMasked: ch !== "\n" && ch !== "\r" };
138
+ }
139
+ if (ch === "\\") {
140
+ r.isEscaped = true;
141
+ return { isMasked: true };
142
+ }
143
+ if (ch === r.quote) {
144
+ r.mode = "code";
145
+ setPrev(r, LITERAL);
146
+ return { isMasked: false };
147
+ }
148
+ if (ch === "\n" || ch === "\r") {
149
+ // Unterminated string: not valid JavaScript. Stop masking here.
150
+ r.mode = "code";
151
+ setPrev(r, LITERAL);
152
+ return { isMasked: false };
153
+ }
154
+ return { isMasked: true };
155
+ case "template":
156
+ if (r.isEscaped) {
157
+ r.isEscaped = false;
158
+ return { isMasked: ch !== "\n" };
159
+ }
160
+ if (ch === "\\") {
161
+ r.isEscaped = true;
162
+ return { isMasked: true };
163
+ }
164
+ if (ch === "`") {
165
+ r.mode = "code";
166
+ setPrev(r, LITERAL);
167
+ return { isMasked: false };
168
+ }
169
+ if (ch === "$" && text[i + 1] === "{") {
170
+ r.templateStack = [...r.templateStack, r.braceDepth];
171
+ r.braceDepth++;
172
+ r.mode = "code";
173
+ r.skip = 1;
174
+ setPrev(r, "{");
175
+ return { isMasked: false };
176
+ }
177
+ return { isMasked: ch !== "\n" };
178
+ case "regex":
179
+ if (i === r.regexEnd) {
180
+ r.mode = "code";
181
+ setPrev(r, LITERAL);
182
+ return { isMasked: false };
183
+ }
184
+ return { isMasked: true };
185
+ case "code":
186
+ break;
187
+ }
188
+ if (IDENT_CHAR.test(ch)) {
189
+ if (!r.ident) {
190
+ r.isPropertyIdent = r.prev === ".";
191
+ setPrev(r, WORD);
192
+ }
193
+ r.ident += ch;
194
+ return { isMasked: false };
195
+ }
196
+ endIdent(r);
197
+ if (ch === " " || ch === "\t" || LINE_TERMINATORS.has(ch))
198
+ return { isMasked: false };
199
+ if (ch === "/" && text[i + 1] === "/") {
200
+ r.mode = "lineComment";
201
+ r.skip = 1;
202
+ return { isMasked: false };
203
+ }
204
+ if (ch === "/" && text[i + 1] === "*") {
205
+ r.mode = "blockComment";
206
+ r.skip = 1;
207
+ return { isMasked: false };
208
+ }
209
+ if (ch === "'" || ch === '"') {
210
+ r.mode = "string";
211
+ r.quote = ch;
212
+ return { isMasked: false };
213
+ }
214
+ if (ch === "`") {
215
+ r.mode = "template";
216
+ return { isMasked: false };
217
+ }
218
+ if (ch === "/") {
219
+ const end = findRegexEnd(text, i);
220
+ const kind = end === -1 ? "division" : slashKind(r);
221
+ if (kind === "division") {
222
+ setPrev(r, "/");
223
+ return { isMasked: false };
224
+ }
225
+ if (kind === "ambiguous") {
226
+ const asDivision = cloneReading(r);
227
+ setPrev(asDivision, "/");
228
+ r.mode = "regex";
229
+ r.regexEnd = end;
230
+ return { isMasked: false, fork: asDivision };
231
+ }
232
+ r.mode = "regex";
233
+ r.regexEnd = end;
234
+ return { isMasked: false };
235
+ }
236
+ if (ch === "{") {
237
+ r.braceDepth++;
238
+ }
239
+ else if (ch === "}") {
240
+ r.braceDepth--;
241
+ const top = r.templateStack[r.templateStack.length - 1];
242
+ if (r.templateStack.length > 0 && r.braceDepth === top) {
243
+ r.templateStack = r.templateStack.slice(0, -1);
244
+ r.mode = "template";
245
+ return { isMasked: false };
246
+ }
247
+ }
248
+ setPrev(r, ch);
249
+ return { isMasked: false };
250
+ }
251
+ function cloneReading(r) {
252
+ return { ...r, templateStack: [...r.templateStack] };
253
+ }
254
+ function maskJsLiterals(lines) {
255
+ const text = lines.join("\n");
256
+ const out = text.split("");
257
+ let readings = [{
258
+ mode: "code", quote: "", isEscaped: false, regexEnd: -1, templateStack: [],
259
+ braceDepth: 0, prev: "", prev2: "", prevWord: "", ident: "",
260
+ isPropertyIdent: false, skip: 0,
261
+ }];
262
+ for (let i = 0; i < text.length; i++) {
263
+ let isMaskedEverywhere = true;
264
+ const next = [];
265
+ for (const r of readings) {
266
+ const { isMasked, fork } = step(r, text, i);
267
+ if (!isMasked)
268
+ isMaskedEverywhere = false;
269
+ next.push(r);
270
+ if (fork)
271
+ next.push(fork);
272
+ }
273
+ if (isMaskedEverywhere)
274
+ out[i] = " ";
275
+ if (next.length === 1) {
276
+ readings = next;
277
+ continue;
278
+ }
279
+ const seen = new Set();
280
+ readings = next.filter((r) => {
281
+ const key = stateKey(r);
282
+ if (seen.has(key))
283
+ return false;
284
+ seen.add(key);
285
+ return true;
286
+ });
287
+ // Too many readings to follow: leave the rest of the file unmasked.
288
+ if (readings.length > MAX_READINGS)
289
+ break;
290
+ }
291
+ return out.join("").split("\n");
292
+ }
293
+ //# sourceMappingURL=literals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"literals.js","sourceRoot":"","sources":["../../src/scanner/literals.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,17 @@
1
1
  import type { ScanRule } from "./types.js";
2
+ /**
3
+ * Version of the rules table, sent as `scanner_version` with every uploaded
4
+ * safety badge. Grades are only comparable between scans of the same version,
5
+ * so any change to SCAN_RULES or to how lines are matched (scanner.ts,
6
+ * literals.ts) must bump it. tests/unit/scanner-rules.test.ts pins
7
+ * rulesFingerprint() per version, and the hash of literals.ts, and fails until
8
+ * both are updated.
9
+ */
10
+ export declare const SCANNER_VERSION = "0.8.2";
2
11
  export declare const SCAN_RULES: ScanRule[];
12
+ /**
13
+ * SHA-256 over everything in the rules table that affects a scan result: ids,
14
+ * descriptions, severities, match mode and each pattern's source and flags.
15
+ */
16
+ export declare function rulesFingerprint(rules?: ScanRule[]): string;
3
17
  //# sourceMappingURL=rules.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/scanner/rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,eAAO,MAAM,UAAU,EAAE,QAAQ,EAmGhC,CAAC"}
1
+ {"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/scanner/rules.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;;;;GAOG;AACH,eAAO,MAAM,eAAe,UAAU,CAAC;AAEvC,eAAO,MAAM,UAAU,EAAE,QAAQ,EAuGhC,CAAC;AAEF;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,GAAE,QAAQ,EAAe,GAAG,MAAM,CASvE"}
@@ -1,11 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SCAN_RULES = void 0;
3
+ exports.SCAN_RULES = exports.SCANNER_VERSION = void 0;
4
+ exports.rulesFingerprint = rulesFingerprint;
5
+ const node_crypto_1 = require("node:crypto");
6
+ /**
7
+ * Version of the rules table, sent as `scanner_version` with every uploaded
8
+ * safety badge. Grades are only comparable between scans of the same version,
9
+ * so any change to SCAN_RULES or to how lines are matched (scanner.ts,
10
+ * literals.ts) must bump it. tests/unit/scanner-rules.test.ts pins
11
+ * rulesFingerprint() per version, and the hash of literals.ts, and fails until
12
+ * both are updated.
13
+ */
14
+ exports.SCANNER_VERSION = "0.8.2";
4
15
  exports.SCAN_RULES = [
5
16
  {
6
17
  id: "S-01",
7
18
  description: "Dynamic code execution",
8
19
  severity: "CRITICAL",
20
+ // security-auditor detects eval() in other code, so its source holds the
21
+ // regex /\beval\s*\(/ and the message "eval() usage"; raw-line matching
22
+ // graded it D. Only an actual call in code counts.
23
+ matchOn: "code",
9
24
  patterns: [
10
25
  /\beval\s*\(/,
11
26
  /\bFunction\s*\(/,
@@ -101,4 +116,18 @@ exports.SCAN_RULES = [
101
116
  ],
102
117
  },
103
118
  ];
119
+ /**
120
+ * SHA-256 over everything in the rules table that affects a scan result: ids,
121
+ * descriptions, severities, match mode and each pattern's source and flags.
122
+ */
123
+ function rulesFingerprint(rules = exports.SCAN_RULES) {
124
+ const canonical = rules.map((r) => ({
125
+ id: r.id,
126
+ description: r.description,
127
+ severity: r.severity,
128
+ matchOn: r.matchOn ?? "line",
129
+ patterns: r.patterns.map((p) => [p.source, p.flags]),
130
+ }));
131
+ return (0, node_crypto_1.createHash)("sha256").update(JSON.stringify(canonical)).digest("hex");
132
+ }
104
133
  //# sourceMappingURL=rules.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/scanner/rules.ts"],"names":[],"mappings":";;;AAEa,QAAA,UAAU,GAAe;IACpC;QACE,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,wBAAwB;QACrC,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE;YACR,aAAa;YACb,iBAAiB;YACjB,qBAAqB;SACtB;KACF;IACD;QACE,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,0BAA0B;QACvC,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE;YACR,sEAAsE;YACtE,yEAAyE;YACzE,wDAAwD;YACxD,2CAA2C;YAC3C,8BAA8B;YAC9B,iEAAiE;YACjE,0EAA0E;YAC1E,uEAAuE;YACvE,4EAA4E;YAC5E,2EAA2E;YAC3E,sEAAsE;YACtE,wEAAwE;YACxE,sBAAsB;YACtB,0BAA0B;YAC1B,uBAAuB;YACvB,2BAA2B;SAC5B;KACF;IACD;QACE,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,4CAA4C;QACzD,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE;YACR,iCAAiC;YACjC,sBAAsB;YACtB,yDAAyD;YACzD,kDAAkD;SACnD;KACF;IACD;QACE,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,mCAAmC;QAChD,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE;YACR,cAAc;YACd,sBAAsB;YACtB,uBAAuB;YACvB,2BAA2B;YAC3B,gBAAgB;SACjB;KACF;IACD;QACE,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,6BAA6B;QAC1C,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE;YACR,kBAAkB;YAClB,eAAe;YACf,iBAAiB;YACjB,uBAAuB;SACxB;KACF;IACD;QACE,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,gCAAgC;QAC7C,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE;YACR,sBAAsB;YACtB,oBAAoB;YACpB,wBAAwB;YACxB,8BAA8B;YAC9B,qBAAqB;SACtB;KACF;IACD;QACE,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,wBAAwB;QACrC,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE;YACR,kBAAkB;YAClB,sBAAsB;YACtB,mBAAmB;YACnB,uBAAuB;YACvB,gBAAgB;YAChB,oBAAoB;YACpB,gBAAgB;YAChB,YAAY;YACZ,eAAe;YACf,mBAAmB;YACnB,qBAAqB;YACrB,sBAAsB;SACvB;KACF;CACF,CAAC"}
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/scanner/rules.ts"],"names":[],"mappings":";;;AA0HA,4CASC;AAnID,6CAAyC;AAGzC;;;;;;;GAOG;AACU,QAAA,eAAe,GAAG,OAAO,CAAC;AAE1B,QAAA,UAAU,GAAe;IACpC;QACE,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,wBAAwB;QACrC,QAAQ,EAAE,UAAU;QACpB,yEAAyE;QACzE,wEAAwE;QACxE,mDAAmD;QACnD,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE;YACR,aAAa;YACb,iBAAiB;YACjB,qBAAqB;SACtB;KACF;IACD;QACE,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,0BAA0B;QACvC,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE;YACR,sEAAsE;YACtE,yEAAyE;YACzE,wDAAwD;YACxD,2CAA2C;YAC3C,8BAA8B;YAC9B,iEAAiE;YACjE,0EAA0E;YAC1E,uEAAuE;YACvE,4EAA4E;YAC5E,2EAA2E;YAC3E,sEAAsE;YACtE,wEAAwE;YACxE,sBAAsB;YACtB,0BAA0B;YAC1B,uBAAuB;YACvB,2BAA2B;SAC5B;KACF;IACD;QACE,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,4CAA4C;QACzD,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE;YACR,iCAAiC;YACjC,sBAAsB;YACtB,yDAAyD;YACzD,kDAAkD;SACnD;KACF;IACD;QACE,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,mCAAmC;QAChD,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE;YACR,cAAc;YACd,sBAAsB;YACtB,uBAAuB;YACvB,2BAA2B;YAC3B,gBAAgB;SACjB;KACF;IACD;QACE,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,6BAA6B;QAC1C,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE;YACR,kBAAkB;YAClB,eAAe;YACf,iBAAiB;YACjB,uBAAuB;SACxB;KACF;IACD;QACE,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,gCAAgC;QAC7C,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE;YACR,sBAAsB;YACtB,oBAAoB;YACpB,wBAAwB;YACxB,8BAA8B;YAC9B,qBAAqB;SACtB;KACF;IACD;QACE,EAAE,EAAE,MAAM;QACV,WAAW,EAAE,wBAAwB;QACrC,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE;YACR,kBAAkB;YAClB,sBAAsB;YACtB,mBAAmB;YACnB,uBAAuB;YACvB,gBAAgB;YAChB,oBAAoB;YACpB,gBAAgB;YAChB,YAAY;YACZ,eAAe;YACf,mBAAmB;YACnB,qBAAqB;YACrB,sBAAsB;SACvB;KACF;CACF,CAAC;AAEF;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,QAAoB,kBAAU;IAC7D,MAAM,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAClC,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,WAAW,EAAE,CAAC,CAAC,WAAW;QAC1B,QAAQ,EAAE,CAAC,CAAC,QAAQ;QACpB,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,MAAM;QAC5B,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;KACrD,CAAC,CAAC,CAAC;IACJ,OAAO,IAAA,wBAAU,EAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/scanner/scanner.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA0B7D,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,CA2BrE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAQvD;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,UAAU,CAkCrF"}
1
+ {"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../src/scanner/scanner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA+B7D,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,EAAE,CA6BrE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,KAAK,CAQvD;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,UAAU,CAkCrF"}
@@ -6,7 +6,12 @@ exports.scan = scan;
6
6
  const node_fs_1 = require("node:fs");
7
7
  const node_path_1 = require("node:path");
8
8
  const rules_js_1 = require("./rules.js");
9
+ const literals_js_1 = require("./literals.js");
9
10
  const CODE_EXTENSIONS = new Set([".ts", ".js", ".mts", ".mjs", ".cjs", ".tsx", ".jsx", ".sh", ".py"]);
11
+ // Files whose literals maskJsLiterals understands. .tsx/.jsx are left out (JSX
12
+ // text such as `Don't` is not a string literal), as are .sh and .py, whose
13
+ // quoting rules differ; those keep raw-line matching for every rule.
14
+ const JS_EXTENSIONS = new Set([".ts", ".js", ".mts", ".mjs", ".cjs"]);
10
15
  function collectCodeFiles(dir) {
11
16
  const files = [];
12
17
  const walk = (d) => {
@@ -34,13 +39,15 @@ function scanFile(filePath, rootDir) {
34
39
  const lines = content.split("\n");
35
40
  const relPath = (0, node_path_1.relative)(rootDir, filePath);
36
41
  const findings = [];
42
+ const codeLines = JS_EXTENSIONS.has((0, node_path_1.extname)(filePath)) ? (0, literals_js_1.maskJsLiterals)(lines) : lines;
37
43
  for (let i = 0; i < lines.length; i++) {
38
44
  const line = lines[i];
39
45
  if (line.trimStart().startsWith("//") || line.trimStart().startsWith("*"))
40
46
  continue;
41
47
  for (const rule of rules_js_1.SCAN_RULES) {
48
+ const subject = rule.matchOn === "code" ? codeLines[i] : line;
42
49
  for (const pattern of rule.patterns) {
43
- if (pattern.test(line)) {
50
+ if (pattern.test(subject)) {
44
51
  findings.push({
45
52
  rule: rule.id,
46
53
  severity: rule.severity,
@@ -1 +1 @@
1
- {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/scanner/scanner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../src/scanner/scanner.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,13 @@ export interface ScanRule {
5
5
  description: string;
6
6
  severity: Severity;
7
7
  patterns: RegExp[];
8
+ /**
9
+ * "code": in JS/TS files, match against the line with string, template and
10
+ * regex literal bodies and comments blanked out (see literals.ts), so text
11
+ * that merely names a call is not a finding. Other file types, and rules
12
+ * without this field, match the raw line.
13
+ */
14
+ matchOn?: "code";
8
15
  }
9
16
  export interface Finding {
10
17
  rule: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scanner/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AACtD,MAAM,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAEhD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE;QACL,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/scanner/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;AACtD,MAAM,MAAM,KAAK,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAEhD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,QAAQ,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,KAAK,CAAC;IACb,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,EAAE;QACL,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;CACH"}
@@ -35,7 +35,7 @@ export interface NativeBinding {
35
35
  buildTranslateGeneWasm(): Buffer;
36
36
  executeGene(wasmBytes: Buffer, inputJson: string, phenotypeJson: string, constraintsJson?: string): ExecutionResultView;
37
37
  l0Check(phenotypeJson: string, permissionsJson?: string, constraintsJson?: string): L0CheckResultView;
38
- executeAlgebra(algebraJson: string, geneEntriesJson: string, inputJson: string): AlgebraResultView;
38
+ executeAlgebra(algebraJson: string, geneEntriesJson: string, inputJson: string, constraintsJson?: string): AlgebraResultView;
39
39
  }
40
40
  export declare function tryLoadBinding(): NativeBinding | null;
41
41
  /** A gene announcement received from a peer (mirrors the Rust napi struct). */
@@ -1 +1 @@
1
- {"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../../src/utils/binding.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"binding.d.ts","sourceRoot":"","sources":["../../src/utils/binding.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"binding.js","sourceRoot":"","sources":["../../src/utils/binding.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"binding.js","sourceRoot":"","sources":["../../src/utils/binding.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Converts a phenotype.json, as the CLI writes it, into the JSON shape that
3
+ * `rotifer_core::types::gene::Phenotype` deserializes:
4
+ *
5
+ * | field | phenotype.json | Rust |
6
+ * |----------------|------------------------------------|----------------------|
7
+ * | `irHash` | 64-char hex string | `Option<[u8; 32]>` |
8
+ * | `createdAt` | epoch ms, or ISO 8601 (`wrap`) | `u64` epoch ms |
9
+ * | `dependencies` | gene names, or 64-char hex ids | `Vec<[u8; 32]>` |
10
+ *
11
+ * Values are converted, not dropped. A value that cannot be converted
12
+ * faithfully (an irHash that is not 32 bytes of hex, a createdAt that is not a
13
+ * date) is omitted, so Rust falls back to its serde default (`None` / `0`).
14
+ * None of the three fields is read while executing a gene — they are
15
+ * metadata — so omitting one does not change what runs.
16
+ *
17
+ * Other fields pass through unchanged.
18
+ */
19
+ /**
20
+ * @param geneId maps a dependency given by gene name to its gene id, using the
21
+ * same derivation as the gene entries passed alongside the phenotype.
22
+ */
23
+ export declare function toRustPhenotype(phenotype: Record<string, unknown>, geneId: (geneName: string) => string): Record<string, unknown>;
24
+ //# sourceMappingURL=rust-phenotype.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust-phenotype.d.ts","sourceRoot":"","sources":["../../src/utils/rust-phenotype.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAqBH;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,MAAM,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,GACnC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ /**
3
+ * Converts a phenotype.json, as the CLI writes it, into the JSON shape that
4
+ * `rotifer_core::types::gene::Phenotype` deserializes:
5
+ *
6
+ * | field | phenotype.json | Rust |
7
+ * |----------------|------------------------------------|----------------------|
8
+ * | `irHash` | 64-char hex string | `Option<[u8; 32]>` |
9
+ * | `createdAt` | epoch ms, or ISO 8601 (`wrap`) | `u64` epoch ms |
10
+ * | `dependencies` | gene names, or 64-char hex ids | `Vec<[u8; 32]>` |
11
+ *
12
+ * Values are converted, not dropped. A value that cannot be converted
13
+ * faithfully (an irHash that is not 32 bytes of hex, a createdAt that is not a
14
+ * date) is omitted, so Rust falls back to its serde default (`None` / `0`).
15
+ * None of the three fields is read while executing a gene — they are
16
+ * metadata — so omitting one does not change what runs.
17
+ *
18
+ * Other fields pass through unchanged.
19
+ */
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.toRustPhenotype = toRustPhenotype;
22
+ const HEX_32_BYTES = /^[0-9a-fA-F]{64}$/;
23
+ function hexToBytes(hex) {
24
+ const bytes = [];
25
+ for (let i = 0; i < 64; i += 2)
26
+ bytes.push(parseInt(hex.slice(i, i + 2), 16));
27
+ return bytes;
28
+ }
29
+ function toEpochMillis(value) {
30
+ if (typeof value === "number") {
31
+ return Number.isSafeInteger(value) && value >= 0 ? value : undefined;
32
+ }
33
+ if (typeof value === "string") {
34
+ const ms = Date.parse(value);
35
+ return Number.isFinite(ms) && ms >= 0 ? ms : undefined;
36
+ }
37
+ return undefined;
38
+ }
39
+ /**
40
+ * @param geneId maps a dependency given by gene name to its gene id, using the
41
+ * same derivation as the gene entries passed alongside the phenotype.
42
+ */
43
+ function toRustPhenotype(phenotype, geneId) {
44
+ const { irHash, createdAt, dependencies, ...rest } = phenotype;
45
+ const out = { ...rest };
46
+ if (typeof irHash === "string" && HEX_32_BYTES.test(irHash)) {
47
+ out.irHash = hexToBytes(irHash);
48
+ }
49
+ const ms = toEpochMillis(createdAt);
50
+ if (ms !== undefined)
51
+ out.createdAt = ms;
52
+ if (Array.isArray(dependencies)) {
53
+ out.dependencies = dependencies
54
+ .filter((d) => typeof d === "string" && d.length > 0)
55
+ .map((d) => hexToBytes(HEX_32_BYTES.test(d) ? d : geneId(d)));
56
+ }
57
+ return out;
58
+ }
59
+ //# sourceMappingURL=rust-phenotype.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust-phenotype.js","sourceRoot":"","sources":["../../src/utils/rust-phenotype.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;AAyBH,0CAqBC;AA5CD,MAAM,YAAY,GAAG,mBAAmB,CAAC;AAEzC,SAAS,UAAU,CAAC,GAAW;IAC7B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IAC9E,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACvE,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACzD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAC7B,SAAkC,EAClC,MAAoC;IAEpC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,GAAG,IAAI,EAAE,GAAG,SAAS,CAAC;IAC/D,MAAM,GAAG,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;IAEjD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5D,GAAG,CAAC,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,MAAM,EAAE,GAAG,aAAa,CAAC,SAAS,CAAC,CAAC;IACpC,IAAI,EAAE,KAAK,SAAS;QAAE,GAAG,CAAC,SAAS,GAAG,EAAE,CAAC;IAEzC,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,GAAG,CAAC,YAAY,GAAG,YAAY;aAC5B,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aACjE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}