devlens-mcp 0.3.2 → 0.4.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 (121) hide show
  1. package/README.md +45 -37
  2. package/RELEASE_NOTES.md +249 -0
  3. package/dist/bin/cli.js +2 -0
  4. package/dist/bin/cli.js.map +1 -1
  5. package/dist/src/figma/figma-properties.d.ts +88 -0
  6. package/dist/src/figma/figma-properties.d.ts.map +1 -0
  7. package/dist/src/figma/figma-properties.js +121 -0
  8. package/dist/src/figma/figma-properties.js.map +1 -0
  9. package/dist/src/figma/figma-structure.d.ts +43 -0
  10. package/dist/src/figma/figma-structure.d.ts.map +1 -0
  11. package/dist/src/figma/figma-structure.js +74 -0
  12. package/dist/src/figma/figma-structure.js.map +1 -0
  13. package/dist/src/figma/figma-url.d.ts +37 -0
  14. package/dist/src/figma/figma-url.d.ts.map +1 -0
  15. package/dist/src/figma/figma-url.js +68 -0
  16. package/dist/src/figma/figma-url.js.map +1 -0
  17. package/dist/src/jds-tokens/resolve-token.d.ts +2 -0
  18. package/dist/src/jds-tokens/resolve-token.d.ts.map +1 -0
  19. package/dist/src/jds-tokens/resolve-token.js +24 -0
  20. package/dist/src/jds-tokens/resolve-token.js.map +1 -0
  21. package/dist/src/jds-tokens/tokens.d.ts +2 -0
  22. package/dist/src/jds-tokens/tokens.d.ts.map +1 -0
  23. package/dist/src/jds-tokens/tokens.js +12 -0
  24. package/dist/src/jds-tokens/tokens.js.map +1 -0
  25. package/dist/src/platform/ios/ios-device.d.ts +2 -0
  26. package/dist/src/platform/ios/ios-device.d.ts.map +1 -1
  27. package/dist/src/platform/ios/ios-device.js +18 -8
  28. package/dist/src/platform/ios/ios-device.js.map +1 -1
  29. package/dist/src/platform/ios/scale-resolver.d.ts +29 -0
  30. package/dist/src/platform/ios/scale-resolver.d.ts.map +1 -0
  31. package/dist/src/platform/ios/scale-resolver.js +114 -0
  32. package/dist/src/platform/ios/scale-resolver.js.map +1 -0
  33. package/dist/src/platform/ios/simctl.d.ts +5 -0
  34. package/dist/src/platform/ios/simctl.d.ts.map +1 -1
  35. package/dist/src/platform/ios/simctl.js +4 -0
  36. package/dist/src/platform/ios/simctl.js.map +1 -1
  37. package/dist/src/server.d.ts.map +1 -1
  38. package/dist/src/server.js +9 -1
  39. package/dist/src/server.js.map +1 -1
  40. package/dist/src/setup/config-patcher.d.ts +2 -0
  41. package/dist/src/setup/config-patcher.d.ts.map +1 -0
  42. package/dist/src/setup/config-patcher.js +128 -0
  43. package/dist/src/setup/config-patcher.js.map +1 -0
  44. package/dist/src/setup/shell-detector.d.ts +10 -0
  45. package/dist/src/setup/shell-detector.d.ts.map +1 -0
  46. package/dist/src/setup/shell-detector.js +72 -0
  47. package/dist/src/setup/shell-detector.js.map +1 -0
  48. package/dist/src/snapshot/device-properties.d.ts +53 -0
  49. package/dist/src/snapshot/device-properties.d.ts.map +1 -0
  50. package/dist/src/snapshot/device-properties.js +94 -0
  51. package/dist/src/snapshot/device-properties.js.map +1 -0
  52. package/dist/src/snapshot/formatter.d.ts +13 -5
  53. package/dist/src/snapshot/formatter.d.ts.map +1 -1
  54. package/dist/src/snapshot/formatter.js +28 -19
  55. package/dist/src/snapshot/formatter.js.map +1 -1
  56. package/dist/src/snapshot/layout-inference.d.ts +44 -0
  57. package/dist/src/snapshot/layout-inference.d.ts.map +1 -0
  58. package/dist/src/snapshot/layout-inference.js +138 -0
  59. package/dist/src/snapshot/layout-inference.js.map +1 -0
  60. package/dist/src/tools/analyze-tools.d.ts +60 -0
  61. package/dist/src/tools/analyze-tools.d.ts.map +1 -0
  62. package/dist/src/tools/analyze-tools.js +196 -0
  63. package/dist/src/tools/analyze-tools.js.map +1 -0
  64. package/dist/src/tools/interaction-tools.d.ts +6 -6
  65. package/dist/src/tools/interaction-tools.d.ts.map +1 -1
  66. package/dist/src/tools/interaction-tools.js +12 -2
  67. package/dist/src/tools/interaction-tools.js.map +1 -1
  68. package/dist/src/tools/metro-tools.d.ts +2 -2
  69. package/dist/src/tools/navigation-tools.d.ts.map +1 -1
  70. package/dist/src/tools/navigation-tools.js +6 -1
  71. package/dist/src/tools/navigation-tools.js.map +1 -1
  72. package/dist/src/tools/screenshot-tools.d.ts +75 -0
  73. package/dist/src/tools/screenshot-tools.d.ts.map +1 -1
  74. package/dist/src/tools/screenshot-tools.js +238 -8
  75. package/dist/src/tools/screenshot-tools.js.map +1 -1
  76. package/dist/src/tools/snapshot-tools.d.ts +15 -0
  77. package/dist/src/tools/snapshot-tools.d.ts.map +1 -1
  78. package/dist/src/tools/snapshot-tools.js +32 -1
  79. package/dist/src/tools/snapshot-tools.js.map +1 -1
  80. package/dist/src/tools/vqa-tools.d.ts +62 -0
  81. package/dist/src/tools/vqa-tools.d.ts.map +1 -0
  82. package/dist/src/tools/vqa-tools.js +204 -0
  83. package/dist/src/tools/vqa-tools.js.map +1 -0
  84. package/dist/src/utils/image-preprocess.d.ts +1 -1
  85. package/dist/src/utils/image-preprocess.d.ts.map +1 -1
  86. package/dist/src/utils/image-preprocess.js +79 -0
  87. package/dist/src/utils/image-preprocess.js.map +1 -1
  88. package/dist/src/visual/color-extractor.d.ts +37 -0
  89. package/dist/src/visual/color-extractor.d.ts.map +1 -0
  90. package/dist/src/visual/color-extractor.js +116 -0
  91. package/dist/src/visual/color-extractor.js.map +1 -0
  92. package/dist/src/visual/comparator.d.ts +21 -0
  93. package/dist/src/visual/comparator.d.ts.map +1 -1
  94. package/dist/src/visual/comparator.js +110 -13
  95. package/dist/src/visual/comparator.js.map +1 -1
  96. package/dist/src/visual/layout-analyzer.d.ts.map +1 -1
  97. package/dist/src/visual/layout-analyzer.js +17 -7
  98. package/dist/src/visual/layout-analyzer.js.map +1 -1
  99. package/dist/src/visual/node-matcher.d.ts +43 -0
  100. package/dist/src/visual/node-matcher.d.ts.map +1 -0
  101. package/dist/src/visual/node-matcher.js +190 -0
  102. package/dist/src/visual/node-matcher.js.map +1 -0
  103. package/dist/src/visual/property-comparator.d.ts +49 -0
  104. package/dist/src/visual/property-comparator.d.ts.map +1 -0
  105. package/dist/src/visual/property-comparator.js +246 -0
  106. package/dist/src/visual/property-comparator.js.map +1 -0
  107. package/dist/src/visual/structural-comparator.d.ts +46 -0
  108. package/dist/src/visual/structural-comparator.d.ts.map +1 -0
  109. package/dist/src/visual/structural-comparator.js +293 -0
  110. package/dist/src/visual/structural-comparator.js.map +1 -0
  111. package/dist/src/visual/vqa-analyzer.d.ts +30 -0
  112. package/dist/src/visual/vqa-analyzer.d.ts.map +1 -0
  113. package/dist/src/visual/vqa-analyzer.js +271 -0
  114. package/dist/src/visual/vqa-analyzer.js.map +1 -0
  115. package/docs/figma-workflow.md +207 -40
  116. package/docs/setup-guide.md +221 -226
  117. package/docs/tool-reference.md +71 -0
  118. package/package.json +1 -1
  119. package/tsconfig.json +1 -1
  120. package/INSTALLATION_GUIDE.md +0 -354
  121. package/QUICK_START.md +0 -153
@@ -0,0 +1,293 @@
1
+ "use strict";
2
+ /**
3
+ * Structural comparison between matched Figma/device node pairs.
4
+ *
5
+ * Compares layout direction, spacing, padding, child count, and alignment
6
+ * using the layout-inference functions from Sprint 2. Returns actionable
7
+ * mismatches with severity levels and fix suggestions.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.compareStructure = compareStructure;
11
+ exports.analyzeStructural = analyzeStructural;
12
+ exports.formatStructuralReport = formatStructuralReport;
13
+ const layout_inference_js_1 = require("../snapshot/layout-inference.js");
14
+ const node_matcher_js_1 = require("./node-matcher.js");
15
+ // ─── Constants ─────────────────────────────────────────────────────────────
16
+ /** Absolute pixel tolerance for spacing and padding comparisons */
17
+ const SPACING_TOLERANCE = 2;
18
+ // ─── Check functions ───────────────────────────────────────────────────────
19
+ function checkDirection(pair) {
20
+ const figmaDir = pair.figmaNode.layoutMode;
21
+ if (figmaDir === "NONE")
22
+ return null;
23
+ const deviceDir = (0, layout_inference_js_1.inferLayoutDirection)(pair.deviceNode);
24
+ if (deviceDir === "unknown" || deviceDir === "stacked" || deviceDir === "wrap") {
25
+ return null;
26
+ }
27
+ const figmaMapped = figmaDir === "HORIZONTAL" ? "row" : "column";
28
+ if (deviceDir === figmaMapped)
29
+ return null;
30
+ return {
31
+ path: pair.figmaPath,
32
+ property: "direction",
33
+ expected: `${figmaMapped} (${figmaDir})`,
34
+ actual: deviceDir,
35
+ severity: "critical",
36
+ suggestedFix: `Change layout direction from ${deviceDir} to ${figmaMapped}`,
37
+ };
38
+ }
39
+ function checkSpacing(pair) {
40
+ const figmaDir = pair.figmaNode.layoutMode;
41
+ if (figmaDir === "NONE")
42
+ return null;
43
+ const direction = figmaDir === "HORIZONTAL" ? "row" : "column";
44
+ const deviceGap = (0, layout_inference_js_1.measureAverageGap)(pair.deviceNode.children, direction);
45
+ if (deviceGap === undefined)
46
+ return null;
47
+ const figmaGap = pair.figmaNode.itemSpacing;
48
+ if (Math.abs(figmaGap - deviceGap) <= SPACING_TOLERANCE)
49
+ return null;
50
+ const delta = deviceGap - figmaGap;
51
+ const sign = delta > 0 ? "+" : "";
52
+ return {
53
+ path: pair.figmaPath,
54
+ property: "spacing",
55
+ expected: `${figmaGap}px`,
56
+ actual: `${deviceGap}px (${sign}${delta}px)`,
57
+ severity: "warning",
58
+ suggestedFix: `Adjust item spacing from ${deviceGap}px to ${figmaGap}px`,
59
+ };
60
+ }
61
+ function checkPadding(pair) {
62
+ const mismatches = [];
63
+ const devicePadding = (0, layout_inference_js_1.inferPadding)(pair.deviceNode.bounds, pair.deviceNode.children);
64
+ if (!devicePadding)
65
+ return mismatches;
66
+ const figmaPadding = {
67
+ top: pair.figmaNode.paddingTop,
68
+ right: pair.figmaNode.paddingRight,
69
+ bottom: pair.figmaNode.paddingBottom,
70
+ left: pair.figmaNode.paddingLeft,
71
+ };
72
+ const sides = [
73
+ "top",
74
+ "right",
75
+ "bottom",
76
+ "left",
77
+ ];
78
+ for (const side of sides) {
79
+ const expected = figmaPadding[side];
80
+ const actual = devicePadding[side];
81
+ if (Math.abs(expected - actual) > SPACING_TOLERANCE) {
82
+ const delta = actual - expected;
83
+ const sign = delta > 0 ? "+" : "";
84
+ mismatches.push({
85
+ path: pair.figmaPath,
86
+ property: "padding",
87
+ expected: `padding-${side}: ${expected}px`,
88
+ actual: `padding-${side}: ${actual}px (${sign}${delta}px)`,
89
+ severity: "warning",
90
+ suggestedFix: `Adjust padding-${side} from ${actual}px to ${expected}px`,
91
+ });
92
+ }
93
+ }
94
+ return mismatches;
95
+ }
96
+ function checkChildCount(pair) {
97
+ const figmaCount = pair.figmaNode.children.length;
98
+ const deviceVisibleChildren = pair.deviceNode.children.filter((c) => c.bounds.width > 0 && c.bounds.height > 0);
99
+ const deviceCount = deviceVisibleChildren.length;
100
+ if (figmaCount === deviceCount)
101
+ return null;
102
+ const diff = deviceCount - figmaCount;
103
+ return {
104
+ path: pair.figmaPath,
105
+ property: "childCount",
106
+ expected: `${figmaCount} children`,
107
+ actual: `${deviceCount} children`,
108
+ severity: "critical",
109
+ suggestedFix: figmaCount > deviceCount
110
+ ? `Missing ${figmaCount - deviceCount} child element(s)`
111
+ : `${deviceCount - figmaCount} extra child element(s) not in design`,
112
+ };
113
+ }
114
+ /**
115
+ * Infer primary axis alignment from child positions relative to parent.
116
+ * Returns the Figma-style alignment name or "UNKNOWN".
117
+ */
118
+ function inferPrimaryAxisAlignment(children, parent, figmaDir) {
119
+ const positioned = children.filter((c) => c.bounds.width > 0 && c.bounds.height > 0);
120
+ if (positioned.length < 2)
121
+ return "UNKNOWN";
122
+ if (figmaDir === "HORIZONTAL") {
123
+ const sorted = [...positioned].sort((a, b) => a.bounds.x - b.bounds.x);
124
+ const first = sorted[0];
125
+ const last = sorted[sorted.length - 1];
126
+ const startGap = first.bounds.x - parent.x;
127
+ const endGap = parent.x + parent.width - (last.bounds.x + last.bounds.width);
128
+ // Check SPACE_BETWEEN: children at edges, gaps roughly equal
129
+ if (startGap < 8 && endGap < 8 && sorted.length >= 2) {
130
+ const gaps = [];
131
+ for (let i = 1; i < sorted.length; i++) {
132
+ const prevRight = sorted[i - 1].bounds.x + sorted[i - 1].bounds.width;
133
+ gaps.push(sorted[i].bounds.x - prevRight);
134
+ }
135
+ const avgGap = gaps.reduce((s, g) => s + g, 0) / gaps.length;
136
+ const maxDev = Math.max(...gaps.map((g) => Math.abs(g - avgGap)));
137
+ if (maxDev <= 4)
138
+ return "SPACE_BETWEEN";
139
+ }
140
+ // Check CENTER
141
+ if (Math.abs(startGap - endGap) <= 8)
142
+ return "CENTER";
143
+ // Check MAX (flex-end)
144
+ if (startGap > endGap * 2 && endGap < 8)
145
+ return "MAX";
146
+ // Default: MIN (flex-start)
147
+ return "MIN";
148
+ }
149
+ else {
150
+ // VERTICAL axis
151
+ const sorted = [...positioned].sort((a, b) => a.bounds.y - b.bounds.y);
152
+ const first = sorted[0];
153
+ const last = sorted[sorted.length - 1];
154
+ const startGap = first.bounds.y - parent.y;
155
+ const endGap = parent.y + parent.height - (last.bounds.y + last.bounds.height);
156
+ if (startGap < 8 && endGap < 8 && sorted.length >= 2) {
157
+ const gaps = [];
158
+ for (let i = 1; i < sorted.length; i++) {
159
+ const prevBottom = sorted[i - 1].bounds.y + sorted[i - 1].bounds.height;
160
+ gaps.push(sorted[i].bounds.y - prevBottom);
161
+ }
162
+ const avgGap = gaps.reduce((s, g) => s + g, 0) / gaps.length;
163
+ const maxDev = Math.max(...gaps.map((g) => Math.abs(g - avgGap)));
164
+ if (maxDev <= 4)
165
+ return "SPACE_BETWEEN";
166
+ }
167
+ if (Math.abs(startGap - endGap) <= 8)
168
+ return "CENTER";
169
+ if (startGap > endGap * 2 && endGap < 8)
170
+ return "MAX";
171
+ return "MIN";
172
+ }
173
+ }
174
+ function checkAlignment(pair) {
175
+ const figmaDir = pair.figmaNode.layoutMode;
176
+ if (figmaDir === "NONE")
177
+ return null;
178
+ const figmaAlign = pair.figmaNode.primaryAxisAlignItems;
179
+ const positioned = pair.deviceNode.children.filter((c) => c.bounds.width > 0 && c.bounds.height > 0);
180
+ if (positioned.length < 2)
181
+ return null;
182
+ const inferred = inferPrimaryAxisAlignment(positioned, pair.deviceNode.bounds, figmaDir);
183
+ if (inferred === "UNKNOWN" || inferred === figmaAlign)
184
+ return null;
185
+ const friendlyNames = {
186
+ MIN: "flex-start",
187
+ CENTER: "center",
188
+ MAX: "flex-end",
189
+ SPACE_BETWEEN: "space-between",
190
+ };
191
+ return {
192
+ path: pair.figmaPath,
193
+ property: "alignment",
194
+ expected: `${figmaAlign} (${friendlyNames[figmaAlign] || figmaAlign})`,
195
+ actual: `${inferred} (${friendlyNames[inferred] || inferred})`,
196
+ severity: "warning",
197
+ suggestedFix: `Change primary axis alignment from ${friendlyNames[inferred] || inferred} to ${friendlyNames[figmaAlign] || figmaAlign}`,
198
+ };
199
+ }
200
+ // ─── Public API ────────────────────────────────────────────────────────────
201
+ /**
202
+ * Compare structural layout between matched Figma/device node pairs.
203
+ * Only compares pairs where the Figma node has children (container nodes).
204
+ */
205
+ function compareStructure(matched, _screenWidth) {
206
+ const mismatches = [];
207
+ for (const pair of matched) {
208
+ // Only run container-level checks on nodes with children
209
+ if (pair.figmaNode.children.length === 0 && pair.deviceNode.children.length === 0) {
210
+ continue;
211
+ }
212
+ const dir = checkDirection(pair);
213
+ if (dir)
214
+ mismatches.push(dir);
215
+ const spacing = checkSpacing(pair);
216
+ if (spacing)
217
+ mismatches.push(spacing);
218
+ mismatches.push(...checkPadding(pair));
219
+ const childCount = checkChildCount(pair);
220
+ if (childCount)
221
+ mismatches.push(childCount);
222
+ const alignment = checkAlignment(pair);
223
+ if (alignment)
224
+ mismatches.push(alignment);
225
+ }
226
+ return mismatches;
227
+ }
228
+ /**
229
+ * Full structural analysis: match nodes then compare structure.
230
+ */
231
+ function analyzeStructural(figmaRoot, deviceRoot, screenWidth, screenHeight) {
232
+ const matchResult = (0, node_matcher_js_1.matchNodes)(figmaRoot, deviceRoot, figmaRoot.absoluteBoundingBox, { width: screenWidth, height: screenHeight });
233
+ const mismatches = compareStructure(matchResult.matched, screenWidth);
234
+ const criticalCount = mismatches.filter((m) => m.severity === "critical").length;
235
+ const warningCount = mismatches.filter((m) => m.severity === "warning").length;
236
+ const infoCount = mismatches.filter((m) => m.severity === "info").length;
237
+ const parts = [];
238
+ if (criticalCount > 0)
239
+ parts.push(`${criticalCount} critical`);
240
+ if (warningCount > 0)
241
+ parts.push(`${warningCount} warning${warningCount > 1 ? "s" : ""}`);
242
+ if (infoCount > 0)
243
+ parts.push(`${infoCount} info`);
244
+ const summary = mismatches.length === 0
245
+ ? "No structural mismatches detected"
246
+ : parts.join(", ");
247
+ return {
248
+ mismatches,
249
+ matchedCount: matchResult.matched.length,
250
+ unmatchedFigmaCount: matchResult.unmatchedFigma.length,
251
+ unmatchedDeviceCount: matchResult.unmatchedDevice.length,
252
+ summary,
253
+ };
254
+ }
255
+ /**
256
+ * Format a structural report as human-readable text for MCP tool output.
257
+ */
258
+ function formatStructuralReport(report) {
259
+ const lines = [
260
+ "--- Structural Comparison ---",
261
+ `Matched: ${report.matchedCount} pairs | Unmatched Figma: ${report.unmatchedFigmaCount} | Unmatched Device: ${report.unmatchedDeviceCount}`,
262
+ ];
263
+ if (report.mismatches.length === 0) {
264
+ lines.push("", "No structural mismatches detected.");
265
+ return lines.join("\n");
266
+ }
267
+ const critical = report.mismatches.filter((m) => m.severity === "critical");
268
+ const warnings = report.mismatches.filter((m) => m.severity === "warning");
269
+ const info = report.mismatches.filter((m) => m.severity === "info");
270
+ if (critical.length > 0) {
271
+ lines.push("", `CRITICAL (${critical.length}):`);
272
+ for (const m of critical) {
273
+ lines.push(` ${m.path}: ${m.property} — expected ${m.expected}, actual ${m.actual}`);
274
+ lines.push(` → ${m.suggestedFix}`);
275
+ }
276
+ }
277
+ if (warnings.length > 0) {
278
+ lines.push("", `WARNING (${warnings.length}):`);
279
+ for (const m of warnings) {
280
+ lines.push(` ${m.path}: ${m.property} — expected ${m.expected}, actual ${m.actual}`);
281
+ lines.push(` → ${m.suggestedFix}`);
282
+ }
283
+ }
284
+ if (info.length > 0) {
285
+ lines.push("", `INFO (${info.length}):`);
286
+ for (const m of info) {
287
+ lines.push(` ${m.path}: ${m.property} — expected ${m.expected}, actual ${m.actual}`);
288
+ }
289
+ }
290
+ lines.push("", `Summary: ${report.summary}`);
291
+ return lines.join("\n");
292
+ }
293
+ //# sourceMappingURL=structural-comparator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"structural-comparator.js","sourceRoot":"","sources":["../../../src/visual/structural-comparator.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;AAyQH,4CA4BC;AAKD,8CAoCC;AAKD,wDAyCC;AAxXD,yEAIyC;AACzC,uDAAmF;AA6BnF,8EAA8E;AAE9E,mEAAmE;AACnE,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,8EAA8E;AAE9E,SAAS,cAAc,CAAC,IAAiB;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;IAC3C,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,SAAS,GAAG,IAAA,0CAAoB,EAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACxD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,MAAM,EAAE,CAAC;QAC/E,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IACjE,IAAI,SAAS,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAE3C,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,SAAS;QACpB,QAAQ,EAAE,WAAW;QACrB,QAAQ,EAAE,GAAG,WAAW,KAAK,QAAQ,GAAG;QACxC,MAAM,EAAE,SAAS;QACjB,QAAQ,EAAE,UAAU;QACpB,YAAY,EAAE,gCAAgC,SAAS,OAAO,WAAW,EAAE;KAC5E,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAiB;IACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;IAC3C,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,SAAS,GACb,QAAQ,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC/C,MAAM,SAAS,GAAG,IAAA,uCAAiB,EAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;IACzE,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAEzC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;IAC5C,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,IAAI,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAErE,MAAM,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAC;IACnC,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAElC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,SAAS;QACpB,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE,GAAG,QAAQ,IAAI;QACzB,MAAM,EAAE,GAAG,SAAS,OAAO,IAAI,GAAG,KAAK,KAAK;QAC5C,QAAQ,EAAE,SAAS;QACnB,YAAY,EAAE,4BAA4B,SAAS,SAAS,QAAQ,IAAI;KACzE,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAiB;IACrC,MAAM,UAAU,GAAqB,EAAE,CAAC;IACxC,MAAM,aAAa,GAAG,IAAA,kCAAY,EAAC,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IACrF,IAAI,CAAC,aAAa;QAAE,OAAO,UAAU,CAAC;IAEtC,MAAM,YAAY,GAAG;QACnB,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU;QAC9B,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY;QAClC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa;QACpC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW;KACjC,CAAC;IAEF,MAAM,KAAK,GAA+C;QACxD,KAAK;QACL,OAAO;QACP,QAAQ;QACR,MAAM;KACP,CAAC;IAEF,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,iBAAiB,EAAE,CAAC;YACpD,MAAM,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;YAChC,MAAM,IAAI,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YAClC,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI,EAAE,IAAI,CAAC,SAAS;gBACpB,QAAQ,EAAE,SAAS;gBACnB,QAAQ,EAAE,WAAW,IAAI,KAAK,QAAQ,IAAI;gBAC1C,MAAM,EAAE,WAAW,IAAI,KAAK,MAAM,OAAO,IAAI,GAAG,KAAK,KAAK;gBAC1D,QAAQ,EAAE,SAAS;gBACnB,YAAY,EAAE,kBAAkB,IAAI,SAAS,MAAM,SAAS,QAAQ,IAAI;aACzE,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,eAAe,CAAC,IAAiB;IACxC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;IAClD,MAAM,qBAAqB,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAC3D,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CACjD,CAAC;IACF,MAAM,WAAW,GAAG,qBAAqB,CAAC,MAAM,CAAC;IAEjD,IAAI,UAAU,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAE5C,MAAM,IAAI,GAAG,WAAW,GAAG,UAAU,CAAC;IAEtC,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,SAAS;QACpB,QAAQ,EAAE,YAAY;QACtB,QAAQ,EAAE,GAAG,UAAU,WAAW;QAClC,MAAM,EAAE,GAAG,WAAW,WAAW;QACjC,QAAQ,EAAE,UAAU;QACpB,YAAY,EACV,UAAU,GAAG,WAAW;YACtB,CAAC,CAAC,WAAW,UAAU,GAAG,WAAW,mBAAmB;YACxD,CAAC,CAAC,GAAG,WAAW,GAAG,UAAU,uCAAuC;KACzE,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAS,yBAAyB,CAChC,QAAwB,EACxB,MAA+D,EAC/D,QAAmC;IAEnC,MAAM,UAAU,GAAG,QAAQ,CAAC,MAAM,CAChC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CACjD,CAAC;IACF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAE5C,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEvC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE7E,6DAA6D;QAC7D,IAAI,QAAQ,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBACtE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;YAC5C,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAClE,IAAI,MAAM,IAAI,CAAC;gBAAE,OAAO,eAAe,CAAC;QAC1C,CAAC;QAED,eAAe;QACf,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO,QAAQ,CAAC;QAEtD,uBAAuB;QACvB,IAAI,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAEtD,4BAA4B;QAC5B,OAAO,KAAK,CAAC;IACf,CAAC;SAAM,CAAC;QACN,gBAAgB;QAChB,MAAM,MAAM,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAEvC,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE/E,IAAI,QAAQ,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;gBACxE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC;YAC7C,CAAC;YACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;YAC7D,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YAClE,IAAI,MAAM,IAAI,CAAC;gBAAE,OAAO,eAAe,CAAC;QAC1C,CAAC;QAED,IAAI,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC;YAAE,OAAO,QAAQ,CAAC;QACtD,IAAI,QAAQ,GAAG,MAAM,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC;QAEtD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAiB;IACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;IAC3C,IAAI,QAAQ,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAErC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC;IACxD,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,CAChD,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CACjD,CAAC;IACF,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,MAAM,QAAQ,GAAG,yBAAyB,CACxC,UAAU,EACV,IAAI,CAAC,UAAU,CAAC,MAAM,EACtB,QAAQ,CACT,CAAC;IAEF,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IAEnE,MAAM,aAAa,GAA2B;QAC5C,GAAG,EAAE,YAAY;QACjB,MAAM,EAAE,QAAQ;QAChB,GAAG,EAAE,UAAU;QACf,aAAa,EAAE,eAAe;KAC/B,CAAC;IAEF,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,SAAS;QACpB,QAAQ,EAAE,WAAW;QACrB,QAAQ,EAAE,GAAG,UAAU,KAAK,aAAa,CAAC,UAAU,CAAC,IAAI,UAAU,GAAG;QACtE,MAAM,EAAE,GAAG,QAAQ,KAAK,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG;QAC9D,QAAQ,EAAE,SAAS;QACnB,YAAY,EAAE,sCAAsC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,OAAO,aAAa,CAAC,UAAU,CAAC,IAAI,UAAU,EAAE;KACxI,CAAC;AACJ,CAAC;AAED,8EAA8E;AAE9E;;;GAGG;AACH,SAAgB,gBAAgB,CAC9B,OAAsB,EACtB,YAAoB;IAEpB,MAAM,UAAU,GAAqB,EAAE,CAAC;IAExC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,yDAAyD;QACzD,IAAI,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAClF,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,GAAG;YAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE9B,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,OAAO;YAAE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEtC,UAAU,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAEvC,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,UAAU;YAAE,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE5C,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,SAAS;YAAE,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAgB,iBAAiB,CAC/B,SAA0B,EAC1B,UAAwB,EACxB,WAAmB,EACnB,YAAoB;IAEpB,MAAM,WAAW,GAAgB,IAAA,4BAAU,EACzC,SAAS,EACT,UAAU,EACV,SAAS,CAAC,mBAAmB,EAC7B,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,CAC7C,CAAC;IAEF,MAAM,UAAU,GAAG,gBAAgB,CAAC,WAAW,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAEtE,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;IACjF,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IAC/E,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,MAAM,CAAC;IAEzE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,aAAa,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,aAAa,WAAW,CAAC,CAAC;IAC/D,IAAI,YAAY,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,WAAW,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAC1F,IAAI,SAAS,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,OAAO,CAAC,CAAC;IAEnD,MAAM,OAAO,GACX,UAAU,CAAC,MAAM,KAAK,CAAC;QACrB,CAAC,CAAC,mCAAmC;QACrC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEvB,OAAO;QACL,UAAU;QACV,YAAY,EAAE,WAAW,CAAC,OAAO,CAAC,MAAM;QACxC,mBAAmB,EAAE,WAAW,CAAC,cAAc,CAAC,MAAM;QACtD,oBAAoB,EAAE,WAAW,CAAC,eAAe,CAAC,MAAM;QACxD,OAAO;KACR,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,MAAwB;IAC7D,MAAM,KAAK,GAAa;QACtB,+BAA+B;QAC/B,YAAY,MAAM,CAAC,YAAY,6BAA6B,MAAM,CAAC,mBAAmB,wBAAwB,MAAM,CAAC,oBAAoB,EAAE;KAC5I,CAAC;IAEF,IAAI,MAAM,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,oCAAoC,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC;IAEpE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;QACjD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,eAAe,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YACtF,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;QAChD,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,eAAe,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;YACtF,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,YAAY,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC;QACzC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,eAAe,CAAC,CAAC,QAAQ,YAAY,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC;QACxF,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAE7C,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { RefEntry } from "../snapshot/ref-registry.js";
2
+ import { type LayoutReport } from "./layout-analyzer.js";
3
+ export type VqaCategory = "spacing" | "color" | "typography" | "alignment" | "missing" | "extra" | "sizing";
4
+ export type VqaSeverity = "critical" | "major" | "minor";
5
+ export interface VqaIssue {
6
+ category: VqaCategory;
7
+ severity: VqaSeverity;
8
+ ref?: string;
9
+ description: string;
10
+ expected: string;
11
+ actual: string;
12
+ }
13
+ export interface VqaSuggestion {
14
+ issueIndex: number;
15
+ fix: string;
16
+ confidence: "high" | "medium" | "low";
17
+ }
18
+ export interface VqaReport {
19
+ status: "pass" | "fail" | "warning";
20
+ overallScore: number;
21
+ issues: VqaIssue[];
22
+ suggestions: VqaSuggestion[];
23
+ layoutReport?: LayoutReport;
24
+ summary: string;
25
+ }
26
+ /**
27
+ * Run comprehensive VQA analysis comparing device screenshot against Figma design.
28
+ */
29
+ export declare function runVqaAnalysis(deviceBuffer: Buffer, figmaBuffer: Buffer, refs: RefEntry[], deviceW: number, deviceH: number, categories: VqaCategory[]): Promise<VqaReport>;
30
+ //# sourceMappingURL=vqa-analyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vqa-analyzer.d.ts","sourceRoot":"","sources":["../../../src/visual/vqa-analyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAM5D,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,MAAM,WAAW,GACnB,SAAS,GACT,OAAO,GACP,YAAY,GACZ,WAAW,GACX,SAAS,GACT,OAAO,GACP,QAAQ,CAAC;AAEb,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAEzD,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,WAAW,CAAC;IACtB,QAAQ,EAAE,WAAW,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,UAAU,EAAE,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CACvC;AAED,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnB,WAAW,EAAE,aAAa,EAAE,CAAC;IAC7B,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CACjB;AA2MD;;GAEG;AACH,wBAAsB,cAAc,CAClC,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,QAAQ,EAAE,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,WAAW,EAAE,GACxB,OAAO,CAAC,SAAS,CAAC,CAmFpB"}
@@ -0,0 +1,271 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runVqaAnalysis = runVqaAnalysis;
4
+ const color_extractor_js_1 = require("./color-extractor.js");
5
+ const layout_analyzer_js_1 = require("./layout-analyzer.js");
6
+ const SPACING_TOLERANCE_PX = 4;
7
+ const SIZING_TOLERANCE_RATIO = 0.05;
8
+ const ALIGNMENT_TOLERANCE_PX = 3;
9
+ const COLOR_DELTA_THRESHOLD = 20;
10
+ function severityFromSimilarity(similarity) {
11
+ if (similarity < 0.5)
12
+ return "critical";
13
+ if (similarity < 0.8)
14
+ return "major";
15
+ return "minor";
16
+ }
17
+ /**
18
+ * Check spacing between adjacent elements by comparing device and Figma bounds gaps.
19
+ */
20
+ function checkSpacing(regions) {
21
+ const issues = [];
22
+ const sorted = [...regions].sort((a, b) => a.deviceBounds.top - b.deviceBounds.top);
23
+ for (let i = 0; i < sorted.length - 1; i++) {
24
+ const current = sorted[i];
25
+ const next = sorted[i + 1];
26
+ const deviceGap = next.deviceBounds.top -
27
+ (current.deviceBounds.top + current.deviceBounds.height);
28
+ const figmaGap = next.figmaBounds.top -
29
+ (current.figmaBounds.top + current.figmaBounds.height);
30
+ const diff = Math.abs(deviceGap - figmaGap);
31
+ if (diff > SPACING_TOLERANCE_PX) {
32
+ issues.push({
33
+ category: "spacing",
34
+ severity: diff > 12 ? "major" : "minor",
35
+ ref: current.ref,
36
+ description: `Vertical gap between [${current.ref}] and [${next.ref}] differs from Figma.`,
37
+ expected: `${figmaGap}px gap`,
38
+ actual: `${deviceGap}px gap (${diff}px off)`,
39
+ });
40
+ }
41
+ }
42
+ return issues;
43
+ }
44
+ /**
45
+ * Check element sizing against Figma dimensions.
46
+ */
47
+ function checkSizing(regions) {
48
+ const issues = [];
49
+ for (const r of regions) {
50
+ const wRatio = Math.abs(r.deviceBounds.width - r.figmaBounds.width) / Math.max(r.figmaBounds.width, 1);
51
+ const hRatio = Math.abs(r.deviceBounds.height - r.figmaBounds.height) / Math.max(r.figmaBounds.height, 1);
52
+ if (wRatio > SIZING_TOLERANCE_RATIO || hRatio > SIZING_TOLERANCE_RATIO) {
53
+ issues.push({
54
+ category: "sizing",
55
+ severity: wRatio > 0.15 || hRatio > 0.15 ? "major" : "minor",
56
+ ref: r.ref,
57
+ description: `Element [${r.ref}] size differs from Figma design.`,
58
+ expected: `${r.figmaBounds.width}x${r.figmaBounds.height}`,
59
+ actual: `${r.deviceBounds.width}x${r.deviceBounds.height}`,
60
+ });
61
+ }
62
+ }
63
+ return issues;
64
+ }
65
+ /**
66
+ * Check horizontal alignment of elements by comparing their X-center positions.
67
+ */
68
+ function checkAlignment(regions) {
69
+ const issues = [];
70
+ for (const r of regions) {
71
+ const deviceCenterX = r.deviceBounds.left + r.deviceBounds.width / 2;
72
+ const figmaCenterX = r.figmaBounds.left + r.figmaBounds.width / 2;
73
+ const diffX = Math.abs(deviceCenterX - figmaCenterX);
74
+ const deviceCenterY = r.deviceBounds.top + r.deviceBounds.height / 2;
75
+ const figmaCenterY = r.figmaBounds.top + r.figmaBounds.height / 2;
76
+ const diffY = Math.abs(deviceCenterY - figmaCenterY);
77
+ if (diffX > ALIGNMENT_TOLERANCE_PX || diffY > ALIGNMENT_TOLERANCE_PX) {
78
+ issues.push({
79
+ category: "alignment",
80
+ severity: diffX > 10 || diffY > 10 ? "major" : "minor",
81
+ ref: r.ref,
82
+ description: `Element [${r.ref}] is misaligned from Figma position.`,
83
+ expected: `center (${figmaCenterX.toFixed(0)}, ${figmaCenterY.toFixed(0)})`,
84
+ actual: `center (${deviceCenterX.toFixed(0)}, ${deviceCenterY.toFixed(0)}) — off by (${diffX.toFixed(0)}, ${diffY.toFixed(0)})px`,
85
+ });
86
+ }
87
+ }
88
+ return issues;
89
+ }
90
+ /**
91
+ * Detect regions with poor visual similarity (potential missing or extra elements).
92
+ */
93
+ function checkVisualMismatches(regions) {
94
+ const issues = [];
95
+ for (const r of regions) {
96
+ if (r.verdict === "poor") {
97
+ issues.push({
98
+ category: "missing",
99
+ severity: "critical",
100
+ ref: r.ref,
101
+ description: `Element [${r.ref}] (${r.elementType}) has very low visual match — may be missing content or rendering differently.`,
102
+ expected: "Visual match >60%",
103
+ actual: `${(r.similarity * 100).toFixed(1)}% match`,
104
+ });
105
+ }
106
+ else if (r.verdict === "partial") {
107
+ issues.push({
108
+ category: "sizing",
109
+ severity: "major",
110
+ ref: r.ref,
111
+ description: `Element [${r.ref}] partially matches design — check styling, padding, or content.`,
112
+ expected: "Visual match >80%",
113
+ actual: `${(r.similarity * 100).toFixed(1)}% match`,
114
+ });
115
+ }
116
+ }
117
+ return issues;
118
+ }
119
+ /**
120
+ * Generate fix suggestions based on identified issues.
121
+ */
122
+ function generateSuggestions(issues) {
123
+ const suggestions = [];
124
+ issues.forEach((issue, idx) => {
125
+ switch (issue.category) {
126
+ case "spacing":
127
+ suggestions.push({
128
+ issueIndex: idx,
129
+ fix: `Adjust margin/padding on element [${issue.ref}] to match Figma specs: ${issue.expected}.`,
130
+ confidence: "high",
131
+ });
132
+ break;
133
+ case "color":
134
+ suggestions.push({
135
+ issueIndex: idx,
136
+ fix: `Update color value for [${issue.ref}]. Expected: ${issue.expected}, Actual: ${issue.actual}. Check design token mapping.`,
137
+ confidence: "high",
138
+ });
139
+ break;
140
+ case "alignment":
141
+ suggestions.push({
142
+ issueIndex: idx,
143
+ fix: `Fix alignment of [${issue.ref}]. Adjust flex alignment or positioning to match ${issue.expected}.`,
144
+ confidence: "medium",
145
+ });
146
+ break;
147
+ case "sizing":
148
+ suggestions.push({
149
+ issueIndex: idx,
150
+ fix: `Resize [${issue.ref}] from ${issue.actual} to ${issue.expected}. Check width/height or flex-grow properties.`,
151
+ confidence: "medium",
152
+ });
153
+ break;
154
+ case "missing":
155
+ suggestions.push({
156
+ issueIndex: idx,
157
+ fix: `Investigate [${issue.ref}]: ${issue.description} Verify component renders correctly and data is populated.`,
158
+ confidence: "low",
159
+ });
160
+ break;
161
+ default:
162
+ suggestions.push({
163
+ issueIndex: idx,
164
+ fix: `Review [${issue.ref}]: ${issue.description}`,
165
+ confidence: "low",
166
+ });
167
+ }
168
+ });
169
+ return suggestions;
170
+ }
171
+ /**
172
+ * Run comprehensive VQA analysis comparing device screenshot against Figma design.
173
+ */
174
+ async function runVqaAnalysis(deviceBuffer, figmaBuffer, refs, deviceW, deviceH, categories) {
175
+ const layoutReport = await (0, layout_analyzer_js_1.buildLayoutReport)(deviceBuffer, figmaBuffer, refs, deviceW, deviceH);
176
+ const allIssues = [];
177
+ const regions = layoutReport.regions;
178
+ if (categories.includes("spacing")) {
179
+ allIssues.push(...checkSpacing(regions));
180
+ }
181
+ if (categories.includes("sizing")) {
182
+ allIssues.push(...checkSizing(regions));
183
+ }
184
+ if (categories.includes("alignment")) {
185
+ allIssues.push(...checkAlignment(regions));
186
+ }
187
+ if (categories.includes("missing") || categories.includes("extra")) {
188
+ allIssues.push(...checkVisualMismatches(regions));
189
+ }
190
+ if (categories.includes("color")) {
191
+ for (const region of regions) {
192
+ if (region.verdict === "excellent")
193
+ continue;
194
+ try {
195
+ const [deviceColors, figmaColors] = await Promise.all([
196
+ (0, color_extractor_js_1.extractColorsFromRegion)(deviceBuffer, region.deviceBounds),
197
+ (0, color_extractor_js_1.extractColorsFromRegion)(figmaBuffer, region.figmaBounds),
198
+ ]);
199
+ const colorResult = (0, color_extractor_js_1.compareColors)(deviceColors, figmaColors);
200
+ if (colorResult.mismatch) {
201
+ allIssues.push({
202
+ category: "color",
203
+ severity: colorResult.maxDeltaE > 40 ? "critical" : "major",
204
+ ref: region.ref,
205
+ description: `Color mismatch on [${region.ref}]: ${colorResult.summary}`,
206
+ expected: figmaColors.slice(0, 2).map((c) => c.hex).join(", "),
207
+ actual: deviceColors.slice(0, 2).map((c) => c.hex).join(", "),
208
+ });
209
+ }
210
+ }
211
+ catch {
212
+ // Color extraction failed for this region — skip
213
+ }
214
+ }
215
+ }
216
+ const suggestions = generateSuggestions(allIssues);
217
+ const criticalCount = allIssues.filter((i) => i.severity === "critical").length;
218
+ const majorCount = allIssues.filter((i) => i.severity === "major").length;
219
+ let status;
220
+ if (criticalCount > 0) {
221
+ status = "fail";
222
+ }
223
+ else if (majorCount > 0) {
224
+ status = "warning";
225
+ }
226
+ else {
227
+ status = "pass";
228
+ }
229
+ const score = layoutReport.overallSimilarity;
230
+ const summary = formatVqaSummary(status, score, allIssues, suggestions);
231
+ return {
232
+ status,
233
+ overallScore: score,
234
+ issues: allIssues,
235
+ suggestions,
236
+ layoutReport,
237
+ summary,
238
+ };
239
+ }
240
+ function formatVqaSummary(status, score, issues, suggestions) {
241
+ const statusIcon = status === "pass" ? "PASS" : status === "warning" ? "WARNING" : "FAIL";
242
+ const lines = [
243
+ `=== VQA Report: ${statusIcon} ===`,
244
+ `Overall Score: ${(score * 100).toFixed(1)}%`,
245
+ `Issues: ${issues.length} (${issues.filter((i) => i.severity === "critical").length} critical, ${issues.filter((i) => i.severity === "major").length} major, ${issues.filter((i) => i.severity === "minor").length} minor)`,
246
+ "",
247
+ ];
248
+ if (issues.length === 0) {
249
+ lines.push("No VQA issues detected. Design implementation matches Figma.");
250
+ return lines.join("\n");
251
+ }
252
+ lines.push("--- Issues ---");
253
+ issues.forEach((issue, idx) => {
254
+ const tag = issue.severity === "critical"
255
+ ? "[CRITICAL]"
256
+ : issue.severity === "major"
257
+ ? "[MAJOR]"
258
+ : "[minor]";
259
+ lines.push(` ${idx + 1}. ${tag} [${issue.category}] ${issue.description}`);
260
+ lines.push(` Expected: ${issue.expected}`);
261
+ lines.push(` Actual: ${issue.actual}`);
262
+ });
263
+ if (suggestions.length > 0) {
264
+ lines.push("", "--- Suggested Fixes ---");
265
+ suggestions.forEach((s) => {
266
+ lines.push(` ${s.issueIndex + 1}. [${s.confidence}] ${s.fix}`);
267
+ });
268
+ }
269
+ return lines.join("\n");
270
+ }
271
+ //# sourceMappingURL=vqa-analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vqa-analyzer.js","sourceRoot":"","sources":["../../../src/visual/vqa-analyzer.ts"],"names":[],"mappings":";;AA2PA,wCA0FC;AApVD,6DAI8B;AAC9B,6DAI8B;AAqC9B,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,sBAAsB,GAAG,IAAI,CAAC;AACpC,MAAM,sBAAsB,GAAG,CAAC,CAAC;AACjC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAEjC,SAAS,sBAAsB,CAAC,UAAkB;IAChD,IAAI,UAAU,GAAG,GAAG;QAAE,OAAO,UAAU,CAAC;IACxC,IAAI,UAAU,GAAG,GAAG;QAAE,OAAO,OAAO,CAAC;IACrC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CACnB,OAAiC;IAEjC,MAAM,MAAM,GAAe,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAC9B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,CAClD,CAAC;IAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3B,MAAM,SAAS,GACb,IAAI,CAAC,YAAY,CAAC,GAAG;YACrB,CAAC,OAAO,CAAC,YAAY,CAAC,GAAG,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;QAC3D,MAAM,QAAQ,GACZ,IAAI,CAAC,WAAW,CAAC,GAAG;YACpB,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAEzD,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC;QAC5C,IAAI,IAAI,GAAG,oBAAoB,EAAE,CAAC;YAChC,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,SAAS;gBACnB,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;gBACvC,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,WAAW,EAAE,yBAAyB,OAAO,CAAC,GAAG,UAAU,IAAI,CAAC,GAAG,uBAAuB;gBAC1F,QAAQ,EAAE,GAAG,QAAQ,QAAQ;gBAC7B,MAAM,EAAE,GAAG,SAAS,WAAW,IAAI,SAAS;aAC7C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAClB,OAAiC;IAEjC,MAAM,MAAM,GAAe,EAAE,CAAC;IAE9B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CACrB,CAAC,CAAC,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC,WAAW,CAAC,KAAK,CAC3C,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAErC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CACrB,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,CAC7C,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAEtC,IAAI,MAAM,GAAG,sBAAsB,IAAI,MAAM,GAAG,sBAAsB,EAAE,CAAC;YACvE,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;gBAC5D,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,WAAW,EAAE,YAAY,CAAC,CAAC,GAAG,mCAAmC;gBACjE,QAAQ,EAAE,GAAG,CAAC,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,EAAE;gBAC1D,MAAM,EAAE,GAAG,CAAC,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC,CAAC,YAAY,CAAC,MAAM,EAAE;aAC3D,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CACrB,OAAiC;IAEjC,MAAM,MAAM,GAAe,EAAE,CAAC;IAE9B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,aAAa,GAAG,CAAC,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,YAAY,CAAC,KAAK,GAAG,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,CAAC,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,WAAW,CAAC,KAAK,GAAG,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,YAAY,CAAC,CAAC;QAErD,MAAM,aAAa,GAAG,CAAC,CAAC,YAAY,CAAC,GAAG,GAAG,CAAC,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QACrE,MAAM,YAAY,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;QAClE,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,aAAa,GAAG,YAAY,CAAC,CAAC;QAErD,IAAI,KAAK,GAAG,sBAAsB,IAAI,KAAK,GAAG,sBAAsB,EAAE,CAAC;YACrE,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,WAAW;gBACrB,QAAQ,EAAE,KAAK,GAAG,EAAE,IAAI,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;gBACtD,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,WAAW,EAAE,YAAY,CAAC,CAAC,GAAG,sCAAsC;gBACpE,QAAQ,EAAE,WAAW,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;gBAC3E,MAAM,EAAE,WAAW,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK;aAClI,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAC5B,OAAiC;IAEjC,MAAM,MAAM,GAAe,EAAE,CAAC;IAE9B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM,EAAE,CAAC;YACzB,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,SAAS;gBACnB,QAAQ,EAAE,UAAU;gBACpB,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,WAAW,EAAE,YAAY,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,WAAW,gFAAgF;gBACjI,QAAQ,EAAE,mBAAmB;gBAC7B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;aACpD,CAAC,CAAC;QACL,CAAC;aAAM,IAAI,CAAC,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;YACnC,MAAM,CAAC,IAAI,CAAC;gBACV,QAAQ,EAAE,QAAQ;gBAClB,QAAQ,EAAE,OAAO;gBACjB,GAAG,EAAE,CAAC,CAAC,GAAG;gBACV,WAAW,EAAE,YAAY,CAAC,CAAC,GAAG,kEAAkE;gBAChG,QAAQ,EAAE,mBAAmB;gBAC7B,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;aACpD,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,MAAkB;IAC7C,MAAM,WAAW,GAAoB,EAAE,CAAC;IAExC,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5B,QAAQ,KAAK,CAAC,QAAQ,EAAE,CAAC;YACvB,KAAK,SAAS;gBACZ,WAAW,CAAC,IAAI,CAAC;oBACf,UAAU,EAAE,GAAG;oBACf,GAAG,EAAE,qCAAqC,KAAK,CAAC,GAAG,2BAA2B,KAAK,CAAC,QAAQ,GAAG;oBAC/F,UAAU,EAAE,MAAM;iBACnB,CAAC,CAAC;gBACH,MAAM;YACR,KAAK,OAAO;gBACV,WAAW,CAAC,IAAI,CAAC;oBACf,UAAU,EAAE,GAAG;oBACf,GAAG,EAAE,2BAA2B,KAAK,CAAC,GAAG,gBAAgB,KAAK,CAAC,QAAQ,aAAa,KAAK,CAAC,MAAM,+BAA+B;oBAC/H,UAAU,EAAE,MAAM;iBACnB,CAAC,CAAC;gBACH,MAAM;YACR,KAAK,WAAW;gBACd,WAAW,CAAC,IAAI,CAAC;oBACf,UAAU,EAAE,GAAG;oBACf,GAAG,EAAE,qBAAqB,KAAK,CAAC,GAAG,oDAAoD,KAAK,CAAC,QAAQ,GAAG;oBACxG,UAAU,EAAE,QAAQ;iBACrB,CAAC,CAAC;gBACH,MAAM;YACR,KAAK,QAAQ;gBACX,WAAW,CAAC,IAAI,CAAC;oBACf,UAAU,EAAE,GAAG;oBACf,GAAG,EAAE,WAAW,KAAK,CAAC,GAAG,UAAU,KAAK,CAAC,MAAM,OAAO,KAAK,CAAC,QAAQ,+CAA+C;oBACnH,UAAU,EAAE,QAAQ;iBACrB,CAAC,CAAC;gBACH,MAAM;YACR,KAAK,SAAS;gBACZ,WAAW,CAAC,IAAI,CAAC;oBACf,UAAU,EAAE,GAAG;oBACf,GAAG,EAAE,gBAAgB,KAAK,CAAC,GAAG,MAAM,KAAK,CAAC,WAAW,4DAA4D;oBACjH,UAAU,EAAE,KAAK;iBAClB,CAAC,CAAC;gBACH,MAAM;YACR;gBACE,WAAW,CAAC,IAAI,CAAC;oBACf,UAAU,EAAE,GAAG;oBACf,GAAG,EAAE,WAAW,KAAK,CAAC,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE;oBAClD,UAAU,EAAE,KAAK;iBAClB,CAAC,CAAC;QACP,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,WAAW,CAAC;AACrB,CAAC;AAED;;GAEG;AACI,KAAK,UAAU,cAAc,CAClC,YAAoB,EACpB,WAAmB,EACnB,IAAgB,EAChB,OAAe,EACf,OAAe,EACf,UAAyB;IAEzB,MAAM,YAAY,GAAG,MAAM,IAAA,sCAAiB,EAC1C,YAAY,EACZ,WAAW,EACX,IAAI,EACJ,OAAO,EACP,OAAO,CACR,CAAC;IAEF,MAAM,SAAS,GAAe,EAAE,CAAC;IACjC,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC;IAErC,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,SAAS,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClC,SAAS,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QACrC,SAAS,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACnE,SAAS,CAAC,IAAI,CAAC,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,UAAU,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QACjC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,MAAM,CAAC,OAAO,KAAK,WAAW;gBAAE,SAAS;YAC7C,IAAI,CAAC;gBACH,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;oBACpD,IAAA,4CAAuB,EAAC,YAAY,EAAE,MAAM,CAAC,YAAY,CAAC;oBAC1D,IAAA,4CAAuB,EAAC,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC;iBACzD,CAAC,CAAC;gBAEH,MAAM,WAAW,GAAG,IAAA,kCAAa,EAAC,YAAY,EAAE,WAAW,CAAC,CAAC;gBAC7D,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;oBACzB,SAAS,CAAC,IAAI,CAAC;wBACb,QAAQ,EAAE,OAAO;wBACjB,QAAQ,EAAE,WAAW,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO;wBAC3D,GAAG,EAAE,MAAM,CAAC,GAAG;wBACf,WAAW,EAAE,sBAAsB,MAAM,CAAC,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE;wBACxE,QAAQ,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;wBAC9D,MAAM,EAAE,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;qBAC9D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,iDAAiD;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GAAG,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAEnD,MAAM,aAAa,GAAG,SAAS,CAAC,MAAM,CACpC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CACjC,CAAC,MAAM,CAAC;IACT,MAAM,UAAU,GAAG,SAAS,CAAC,MAAM,CACjC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAC9B,CAAC,MAAM,CAAC;IAET,IAAI,MAA2B,CAAC;IAChC,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,GAAG,MAAM,CAAC;IAClB,CAAC;SAAM,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,MAAM,GAAG,MAAM,CAAC;IAClB,CAAC;IAED,MAAM,KAAK,GAAG,YAAY,CAAC,iBAAiB,CAAC;IAC7C,MAAM,OAAO,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;IAExE,OAAO;QACL,MAAM;QACN,YAAY,EAAE,KAAK;QACnB,MAAM,EAAE,SAAS;QACjB,WAAW;QACX,YAAY;QACZ,OAAO;KACR,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,MAA2B,EAC3B,KAAa,EACb,MAAkB,EAClB,WAA4B;IAE5B,MAAM,UAAU,GACd,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;IACzE,MAAM,KAAK,GAAa;QACtB,mBAAmB,UAAU,MAAM;QACnC,kBAAkB,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG;QAC7C,WAAW,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,MAAM,cAAc,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,WAAW,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,SAAS;QAC3N,EAAE;KACH,CAAC;IAEF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QAC3E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC7B,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5B,MAAM,GAAG,GACP,KAAK,CAAC,QAAQ,KAAK,UAAU;YAC3B,CAAC,CAAC,YAAY;YACd,CAAC,CAAC,KAAK,CAAC,QAAQ,KAAK,OAAO;gBAC5B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,SAAS,CAAC;QAChB,KAAK,CAAC,IAAI,CACR,KAAK,GAAG,GAAG,CAAC,KAAK,GAAG,KAAK,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,WAAW,EAAE,CAChE,CAAC;QACF,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC/C,KAAK,CAAC,IAAI,CAAC,kBAAkB,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,yBAAyB,CAAC,CAAC;QAC1C,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;YACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAClE,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}