devlens-mcp 0.3.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 (175) hide show
  1. package/.claude/settings.json +12 -0
  2. package/.claude/settings.local.json +17 -0
  3. package/INSTALLATION_GUIDE.md +354 -0
  4. package/QUICK_START.md +153 -0
  5. package/README.md +354 -0
  6. package/bin/cli.ts +22 -0
  7. package/bin/register.ts +96 -0
  8. package/dist/bin/cli.d.ts +3 -0
  9. package/dist/bin/cli.d.ts.map +1 -0
  10. package/dist/bin/cli.js +20 -0
  11. package/dist/bin/cli.js.map +1 -0
  12. package/dist/bin/register.d.ts +10 -0
  13. package/dist/bin/register.d.ts.map +1 -0
  14. package/dist/bin/register.js +92 -0
  15. package/dist/bin/register.js.map +1 -0
  16. package/dist/src/config/devlens-config.d.ts +92 -0
  17. package/dist/src/config/devlens-config.d.ts.map +1 -0
  18. package/dist/src/config/devlens-config.js +70 -0
  19. package/dist/src/config/devlens-config.js.map +1 -0
  20. package/dist/src/index.d.ts +35 -0
  21. package/dist/src/index.d.ts.map +1 -0
  22. package/dist/src/index.js +8 -0
  23. package/dist/src/index.js.map +1 -0
  24. package/dist/src/metro/cdp-client.d.ts +48 -0
  25. package/dist/src/metro/cdp-client.d.ts.map +1 -0
  26. package/dist/src/metro/cdp-client.js +127 -0
  27. package/dist/src/metro/cdp-client.js.map +1 -0
  28. package/dist/src/metro/log-collector.d.ts +30 -0
  29. package/dist/src/metro/log-collector.d.ts.map +1 -0
  30. package/dist/src/metro/log-collector.js +114 -0
  31. package/dist/src/metro/log-collector.js.map +1 -0
  32. package/dist/src/metro/metro-bridge.d.ts +56 -0
  33. package/dist/src/metro/metro-bridge.d.ts.map +1 -0
  34. package/dist/src/metro/metro-bridge.js +255 -0
  35. package/dist/src/metro/metro-bridge.js.map +1 -0
  36. package/dist/src/metro/network-inspector.d.ts +34 -0
  37. package/dist/src/metro/network-inspector.d.ts.map +1 -0
  38. package/dist/src/metro/network-inspector.js +100 -0
  39. package/dist/src/metro/network-inspector.js.map +1 -0
  40. package/dist/src/platform/android/adb.d.ts +50 -0
  41. package/dist/src/platform/android/adb.d.ts.map +1 -0
  42. package/dist/src/platform/android/adb.js +137 -0
  43. package/dist/src/platform/android/adb.js.map +1 -0
  44. package/dist/src/platform/android/android-device.d.ts +21 -0
  45. package/dist/src/platform/android/android-device.d.ts.map +1 -0
  46. package/dist/src/platform/android/android-device.js +94 -0
  47. package/dist/src/platform/android/android-device.js.map +1 -0
  48. package/dist/src/platform/android/ui-automator.d.ts +17 -0
  49. package/dist/src/platform/android/ui-automator.d.ts.map +1 -0
  50. package/dist/src/platform/android/ui-automator.js +126 -0
  51. package/dist/src/platform/android/ui-automator.js.map +1 -0
  52. package/dist/src/platform/device-manager.d.ts +28 -0
  53. package/dist/src/platform/device-manager.d.ts.map +1 -0
  54. package/dist/src/platform/device-manager.js +185 -0
  55. package/dist/src/platform/device-manager.js.map +1 -0
  56. package/dist/src/platform/device.d.ts +86 -0
  57. package/dist/src/platform/device.d.ts.map +1 -0
  58. package/dist/src/platform/device.js +7 -0
  59. package/dist/src/platform/device.js.map +1 -0
  60. package/dist/src/platform/ios/accessibility.d.ts +17 -0
  61. package/dist/src/platform/ios/accessibility.d.ts.map +1 -0
  62. package/dist/src/platform/ios/accessibility.js +159 -0
  63. package/dist/src/platform/ios/accessibility.js.map +1 -0
  64. package/dist/src/platform/ios/ios-device.d.ts +22 -0
  65. package/dist/src/platform/ios/ios-device.d.ts.map +1 -0
  66. package/dist/src/platform/ios/ios-device.js +97 -0
  67. package/dist/src/platform/ios/ios-device.js.map +1 -0
  68. package/dist/src/platform/ios/simctl.d.ts +54 -0
  69. package/dist/src/platform/ios/simctl.d.ts.map +1 -0
  70. package/dist/src/platform/ios/simctl.js +192 -0
  71. package/dist/src/platform/ios/simctl.js.map +1 -0
  72. package/dist/src/server.d.ts +3 -0
  73. package/dist/src/server.d.ts.map +1 -0
  74. package/dist/src/server.js +176 -0
  75. package/dist/src/server.js.map +1 -0
  76. package/dist/src/snapshot/formatter.d.ts +18 -0
  77. package/dist/src/snapshot/formatter.d.ts.map +1 -0
  78. package/dist/src/snapshot/formatter.js +86 -0
  79. package/dist/src/snapshot/formatter.js.map +1 -0
  80. package/dist/src/snapshot/ref-registry.d.ts +67 -0
  81. package/dist/src/snapshot/ref-registry.d.ts.map +1 -0
  82. package/dist/src/snapshot/ref-registry.js +169 -0
  83. package/dist/src/snapshot/ref-registry.js.map +1 -0
  84. package/dist/src/snapshot/snapshot-differ.d.ts +57 -0
  85. package/dist/src/snapshot/snapshot-differ.d.ts.map +1 -0
  86. package/dist/src/snapshot/snapshot-differ.js +153 -0
  87. package/dist/src/snapshot/snapshot-differ.js.map +1 -0
  88. package/dist/src/tools/app-tools.d.ts +71 -0
  89. package/dist/src/tools/app-tools.d.ts.map +1 -0
  90. package/dist/src/tools/app-tools.js +97 -0
  91. package/dist/src/tools/app-tools.js.map +1 -0
  92. package/dist/src/tools/device-tools.d.ts +53 -0
  93. package/dist/src/tools/device-tools.d.ts.map +1 -0
  94. package/dist/src/tools/device-tools.js +86 -0
  95. package/dist/src/tools/device-tools.js.map +1 -0
  96. package/dist/src/tools/ds-tools.d.ts +65 -0
  97. package/dist/src/tools/ds-tools.d.ts.map +1 -0
  98. package/dist/src/tools/ds-tools.js +314 -0
  99. package/dist/src/tools/ds-tools.js.map +1 -0
  100. package/dist/src/tools/interaction-tools.d.ts +248 -0
  101. package/dist/src/tools/interaction-tools.d.ts.map +1 -0
  102. package/dist/src/tools/interaction-tools.js +391 -0
  103. package/dist/src/tools/interaction-tools.js.map +1 -0
  104. package/dist/src/tools/metro-tools.d.ts +115 -0
  105. package/dist/src/tools/metro-tools.d.ts.map +1 -0
  106. package/dist/src/tools/metro-tools.js +270 -0
  107. package/dist/src/tools/metro-tools.js.map +1 -0
  108. package/dist/src/tools/navigation-tools.d.ts +36 -0
  109. package/dist/src/tools/navigation-tools.d.ts.map +1 -0
  110. package/dist/src/tools/navigation-tools.js +60 -0
  111. package/dist/src/tools/navigation-tools.js.map +1 -0
  112. package/dist/src/tools/screenshot-tools.d.ts +298 -0
  113. package/dist/src/tools/screenshot-tools.d.ts.map +1 -0
  114. package/dist/src/tools/screenshot-tools.js +565 -0
  115. package/dist/src/tools/screenshot-tools.js.map +1 -0
  116. package/dist/src/tools/snapshot-tools.d.ts +161 -0
  117. package/dist/src/tools/snapshot-tools.d.ts.map +1 -0
  118. package/dist/src/tools/snapshot-tools.js +479 -0
  119. package/dist/src/tools/snapshot-tools.js.map +1 -0
  120. package/dist/src/utils/image-preprocess.d.ts +49 -0
  121. package/dist/src/utils/image-preprocess.d.ts.map +1 -0
  122. package/dist/src/utils/image-preprocess.js +322 -0
  123. package/dist/src/utils/image-preprocess.js.map +1 -0
  124. package/dist/src/utils/retry.d.ts +21 -0
  125. package/dist/src/utils/retry.d.ts.map +1 -0
  126. package/dist/src/utils/retry.js +33 -0
  127. package/dist/src/utils/retry.js.map +1 -0
  128. package/dist/src/visual/comparator.d.ts +51 -0
  129. package/dist/src/visual/comparator.d.ts.map +1 -0
  130. package/dist/src/visual/comparator.js +119 -0
  131. package/dist/src/visual/comparator.js.map +1 -0
  132. package/dist/src/visual/layout-analyzer.d.ts +64 -0
  133. package/dist/src/visual/layout-analyzer.d.ts.map +1 -0
  134. package/dist/src/visual/layout-analyzer.js +198 -0
  135. package/dist/src/visual/layout-analyzer.js.map +1 -0
  136. package/dist/src/visual/screenshot.d.ts +17 -0
  137. package/dist/src/visual/screenshot.d.ts.map +1 -0
  138. package/dist/src/visual/screenshot.js +39 -0
  139. package/dist/src/visual/screenshot.js.map +1 -0
  140. package/docs/figma-workflow.md +289 -0
  141. package/docs/setup-guide.md +360 -0
  142. package/docs/tool-reference.md +622 -0
  143. package/package.json +57 -0
  144. package/src/config/devlens-config.ts +76 -0
  145. package/src/index.ts +5 -0
  146. package/src/metro/cdp-client.ts +160 -0
  147. package/src/metro/log-collector.ts +137 -0
  148. package/src/metro/metro-bridge.ts +307 -0
  149. package/src/metro/network-inspector.ts +134 -0
  150. package/src/platform/android/adb.ts +200 -0
  151. package/src/platform/android/android-device.ts +116 -0
  152. package/src/platform/android/ui-automator.ts +141 -0
  153. package/src/platform/device-manager.ts +229 -0
  154. package/src/platform/device.ts +110 -0
  155. package/src/platform/ios/accessibility.ts +189 -0
  156. package/src/platform/ios/ios-device.ts +116 -0
  157. package/src/platform/ios/simctl.ts +244 -0
  158. package/src/server.ts +228 -0
  159. package/src/snapshot/formatter.ts +102 -0
  160. package/src/snapshot/ref-registry.ts +230 -0
  161. package/src/snapshot/snapshot-differ.ts +220 -0
  162. package/src/tools/app-tools.ts +111 -0
  163. package/src/tools/device-tools.ts +96 -0
  164. package/src/tools/ds-tools.ts +395 -0
  165. package/src/tools/interaction-tools.ts +467 -0
  166. package/src/tools/metro-tools.ts +320 -0
  167. package/src/tools/navigation-tools.ts +71 -0
  168. package/src/tools/screenshot-tools.ts +698 -0
  169. package/src/tools/snapshot-tools.ts +585 -0
  170. package/src/utils/image-preprocess.ts +430 -0
  171. package/src/utils/retry.ts +51 -0
  172. package/src/visual/comparator.ts +191 -0
  173. package/src/visual/layout-analyzer.ts +283 -0
  174. package/src/visual/screenshot.ts +49 -0
  175. package/tsconfig.json +20 -0
@@ -0,0 +1,161 @@
1
+ import { z } from "zod";
2
+ import type { DeviceManager } from "../platform/device-manager.js";
3
+ import { RefRegistry } from "../snapshot/ref-registry.js";
4
+ export declare const snapshotToolSchemas: {
5
+ devlens_snapshot: {
6
+ description: string;
7
+ parameters: z.ZodObject<{
8
+ mode: z.ZodDefault<z.ZodEnum<["full", "incremental"]>>;
9
+ validate: z.ZodDefault<z.ZodBoolean>;
10
+ }, "strip", z.ZodTypeAny, {
11
+ mode: "full" | "incremental";
12
+ validate: boolean;
13
+ }, {
14
+ mode?: "full" | "incremental" | undefined;
15
+ validate?: boolean | undefined;
16
+ }>;
17
+ };
18
+ devlens_find_element: {
19
+ description: string;
20
+ parameters: z.ZodObject<{
21
+ text: z.ZodOptional<z.ZodString>;
22
+ label: z.ZodOptional<z.ZodString>;
23
+ type: z.ZodOptional<z.ZodString>;
24
+ }, "strip", z.ZodTypeAny, {
25
+ type?: string | undefined;
26
+ text?: string | undefined;
27
+ label?: string | undefined;
28
+ }, {
29
+ type?: string | undefined;
30
+ text?: string | undefined;
31
+ label?: string | undefined;
32
+ }>;
33
+ };
34
+ devlens_wait_for_element: {
35
+ description: string;
36
+ parameters: z.ZodObject<{
37
+ text: z.ZodOptional<z.ZodString>;
38
+ label: z.ZodOptional<z.ZodString>;
39
+ timeout: z.ZodDefault<z.ZodNumber>;
40
+ }, "strip", z.ZodTypeAny, {
41
+ timeout: number;
42
+ text?: string | undefined;
43
+ label?: string | undefined;
44
+ }, {
45
+ text?: string | undefined;
46
+ label?: string | undefined;
47
+ timeout?: number | undefined;
48
+ }>;
49
+ };
50
+ devlens_wait_for_screen: {
51
+ description: string;
52
+ parameters: z.ZodObject<{
53
+ text: z.ZodOptional<z.ZodString>;
54
+ label: z.ZodOptional<z.ZodString>;
55
+ stableMs: z.ZodDefault<z.ZodNumber>;
56
+ timeoutMs: z.ZodDefault<z.ZodNumber>;
57
+ }, "strip", z.ZodTypeAny, {
58
+ stableMs: number;
59
+ timeoutMs: number;
60
+ text?: string | undefined;
61
+ label?: string | undefined;
62
+ }, {
63
+ text?: string | undefined;
64
+ label?: string | undefined;
65
+ stableMs?: number | undefined;
66
+ timeoutMs?: number | undefined;
67
+ }>;
68
+ };
69
+ devlens_element_info: {
70
+ description: string;
71
+ parameters: z.ZodObject<{
72
+ ref: z.ZodString;
73
+ }, "strip", z.ZodTypeAny, {
74
+ ref: string;
75
+ }, {
76
+ ref: string;
77
+ }>;
78
+ };
79
+ };
80
+ export declare function createSnapshotToolHandlers(deviceManager: DeviceManager, refRegistry: RefRegistry): {
81
+ handlers: {
82
+ devlens_snapshot: (params: {
83
+ mode: "full" | "incremental";
84
+ validate: boolean;
85
+ }) => Promise<{
86
+ content: {
87
+ type: "text";
88
+ text: string;
89
+ }[];
90
+ }>;
91
+ devlens_find_element: (params: {
92
+ text?: string;
93
+ label?: string;
94
+ type?: string;
95
+ }) => Promise<{
96
+ content: {
97
+ type: "text";
98
+ text: string;
99
+ }[];
100
+ isError: boolean;
101
+ } | {
102
+ content: {
103
+ type: "text";
104
+ text: string;
105
+ }[];
106
+ isError?: undefined;
107
+ }>;
108
+ devlens_wait_for_element: (params: {
109
+ text?: string;
110
+ label?: string;
111
+ timeout: number;
112
+ }) => Promise<{
113
+ content: {
114
+ type: "text";
115
+ text: string;
116
+ }[];
117
+ isError: boolean;
118
+ } | {
119
+ content: {
120
+ type: "text";
121
+ text: string;
122
+ }[];
123
+ isError?: undefined;
124
+ }>;
125
+ devlens_wait_for_screen: (params: {
126
+ text?: string;
127
+ label?: string;
128
+ stableMs: number;
129
+ timeoutMs: number;
130
+ }) => Promise<{
131
+ content: {
132
+ type: "text";
133
+ text: string;
134
+ }[];
135
+ isError?: undefined;
136
+ } | {
137
+ content: {
138
+ type: "text";
139
+ text: string;
140
+ }[];
141
+ isError: boolean;
142
+ }>;
143
+ devlens_element_info: (params: {
144
+ ref: string;
145
+ }) => Promise<{
146
+ content: {
147
+ type: "text";
148
+ text: string;
149
+ }[];
150
+ isError: boolean;
151
+ } | {
152
+ content: {
153
+ type: "text";
154
+ text: string;
155
+ }[];
156
+ isError?: undefined;
157
+ }>;
158
+ };
159
+ resetPreviousSnapshot: () => void;
160
+ };
161
+ //# sourceMappingURL=snapshot-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-tools.d.ts","sourceRoot":"","sources":["../../../src/tools/snapshot-tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAEnE,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAO1D,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0F/B,CAAC;AA+DF,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,aAAa,EAC5B,WAAW,EAAE,WAAW;;mCASW;YAC/B,IAAI,EAAE,MAAM,GAAG,aAAa,CAAC;YAC7B,QAAQ,EAAE,OAAO,CAAC;SACnB;;;;;;uCAsEoC;YACnC,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,IAAI,CAAC,EAAE,MAAM,CAAC;SACf;;;;;;;;;;;;;2CAgGwC;YACvC,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,OAAO,EAAE,MAAM,CAAC;SACjB;;;;;;;;;;;;;0CA4DuC;YACtC,IAAI,CAAC,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,QAAQ,EAAE,MAAM,CAAC;YACjB,SAAS,EAAE,MAAM,CAAC;SACnB;;;;;;;;;;;;;uCA0GoC;YAAE,GAAG,EAAE,MAAM,CAAA;SAAE;;;;;;;;;;;;;;;EA8DvD"}
@@ -0,0 +1,479 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.snapshotToolSchemas = void 0;
4
+ exports.createSnapshotToolHandlers = createSnapshotToolHandlers;
5
+ const zod_1 = require("zod");
6
+ const formatter_js_1 = require("../snapshot/formatter.js");
7
+ const snapshot_differ_js_1 = require("../snapshot/snapshot-differ.js");
8
+ exports.snapshotToolSchemas = {
9
+ devlens_snapshot: {
10
+ description: 'Capture the accessibility tree of the current screen. Returns a structured text representation with ref IDs (e.g., ref=e1) for every interactive element. Use these refs with devlens_tap, devlens_type, etc. Mode "incremental" only returns changes since last snapshot (saves tokens). Pass validate=true to scan for visibility issues (zero-size elements, invisible nodes, empty containers).',
11
+ parameters: zod_1.z.object({
12
+ mode: zod_1.z
13
+ .enum(["full", "incremental"])
14
+ .default("full")
15
+ .describe('"full" returns the entire tree. "incremental" returns only changes since last snapshot.'),
16
+ validate: zod_1.z
17
+ .boolean()
18
+ .default(false)
19
+ .describe("When true, scan the tree for visibility issues: zero-size elements that should be visible, invisible elements, empty containers. Useful for catching rendering bugs like missing icons."),
20
+ }),
21
+ },
22
+ devlens_find_element: {
23
+ description: "Find elements on screen matching text content, accessibility label, or element type. Returns matching elements with their refs for use with interaction tools. If no visible matches are found, also checks for invisible (zero-size) elements and warns about them.",
24
+ parameters: zod_1.z.object({
25
+ text: zod_1.z
26
+ .string()
27
+ .optional()
28
+ .describe("Text content to search for (partial match)"),
29
+ label: zod_1.z
30
+ .string()
31
+ .optional()
32
+ .describe("Accessibility label to search for (partial match)"),
33
+ type: zod_1.z
34
+ .string()
35
+ .optional()
36
+ .describe("Element type to search for (partial, case-insensitive match). E.g., 'Button', 'ScrollView', 'EditText'."),
37
+ }),
38
+ },
39
+ devlens_wait_for_element: {
40
+ description: "Wait for an element with specific text or label to appear on screen. Polls every 500ms until found or timeout.",
41
+ parameters: zod_1.z.object({
42
+ text: zod_1.z.string().optional().describe("Text content to wait for"),
43
+ label: zod_1.z.string().optional().describe("Accessibility label to wait for"),
44
+ timeout: zod_1.z
45
+ .number()
46
+ .default(10000)
47
+ .describe("Maximum wait time in milliseconds (default: 10000)"),
48
+ }),
49
+ },
50
+ devlens_wait_for_screen: {
51
+ description: "Wait for the screen to reach a stable state. Can wait for specific text/label to appear, or wait until the UI stops changing (stability detection). More efficient than manual sleep+screenshot loops. Returns the final snapshot when the condition is met.",
52
+ parameters: zod_1.z.object({
53
+ text: zod_1.z
54
+ .string()
55
+ .optional()
56
+ .describe("Wait for this text to appear on screen. If omitted, waits for screen stability."),
57
+ label: zod_1.z
58
+ .string()
59
+ .optional()
60
+ .describe("Wait for this accessibility label to appear."),
61
+ stableMs: zod_1.z
62
+ .number()
63
+ .default(1000)
64
+ .describe("For stability mode: the screen must remain unchanged for this many milliseconds to be considered stable (default: 1000)."),
65
+ timeoutMs: zod_1.z
66
+ .number()
67
+ .default(10000)
68
+ .describe("Maximum wait time in milliseconds before giving up (default: 10000)."),
69
+ }),
70
+ },
71
+ devlens_element_info: {
72
+ description: "Get detailed information about a specific element by its ref ID. Returns bounds, properties, children, inferred layout direction, and all attributes.",
73
+ parameters: zod_1.z.object({
74
+ ref: zod_1.z
75
+ .string()
76
+ .describe("Element ref from devlens_snapshot (e.g., e1, e2, e3)"),
77
+ }),
78
+ },
79
+ };
80
+ /**
81
+ * Infer layout direction from children bounds positions.
82
+ * Analyzes spatial arrangement of child elements to determine
83
+ * if they are laid out as row, column, stacked, or wrapped.
84
+ */
85
+ function inferLayoutDirection(node) {
86
+ if (node.children.length <= 1)
87
+ return "unknown";
88
+ // Filter to children with non-zero bounds
89
+ const positioned = node.children.filter((c) => c.bounds.width > 0 && c.bounds.height > 0);
90
+ if (positioned.length <= 1)
91
+ return "unknown";
92
+ // Check for overlapping (absolute/stacked positioning)
93
+ let hasOverlap = false;
94
+ for (let i = 0; i < positioned.length && !hasOverlap; i++) {
95
+ for (let j = i + 1; j < positioned.length; j++) {
96
+ const a = positioned[i].bounds;
97
+ const b = positioned[j].bounds;
98
+ const overlapX = a.x < b.x + b.width && a.x + a.width > b.x;
99
+ const overlapY = a.y < b.y + b.height && a.y + a.height > b.y;
100
+ if (overlapX && overlapY) {
101
+ hasOverlap = true;
102
+ break;
103
+ }
104
+ }
105
+ }
106
+ if (hasOverlap)
107
+ return "stacked";
108
+ // Measure variance in X and Y positions
109
+ const xs = positioned.map((c) => c.bounds.x);
110
+ const ys = positioned.map((c) => c.bounds.y);
111
+ const xVariance = Math.max(...xs) - Math.min(...xs);
112
+ const ySpan = Math.max(...ys.map((y, i) => y + positioned[i].bounds.height)) -
113
+ Math.min(...ys);
114
+ const yVariance = Math.max(...ys) - Math.min(...ys);
115
+ const xSpan = Math.max(...xs.map((x, i) => x + positioned[i].bounds.width)) -
116
+ Math.min(...xs);
117
+ const containerWidth = node.bounds.width || 1;
118
+ const containerHeight = node.bounds.height || 1;
119
+ // Use relative thresholds: low X variance = vertical, low Y variance = horizontal
120
+ const isVertical = xVariance < containerWidth * 0.3 && ySpan > 0;
121
+ const isHorizontal = yVariance < containerHeight * 0.3 && xSpan > 0;
122
+ if (isVertical && !isHorizontal)
123
+ return "column";
124
+ if (isHorizontal && !isVertical)
125
+ return "row";
126
+ if (isVertical && isHorizontal)
127
+ return "wrap";
128
+ return "unknown";
129
+ }
130
+ function createSnapshotToolHandlers(deviceManager, refRegistry) {
131
+ let previousSnapshot = null;
132
+ function resetPreviousSnapshot() {
133
+ previousSnapshot = null;
134
+ }
135
+ const handlers = {
136
+ devlens_snapshot: async (params) => {
137
+ const device = await deviceManager.getDevice();
138
+ const snapshot = await device.getSnapshot();
139
+ const nodeToRef = refRegistry.assignRefs(snapshot);
140
+ // Build validation report if requested
141
+ let validationText = "";
142
+ if (params.validate) {
143
+ const report = refRegistry.validateTree(snapshot);
144
+ if (report.issues.length > 0) {
145
+ const issueLines = report.issues.map((issue, idx) => ` ${idx + 1}. [${issue.type}] ${issue.detail}`);
146
+ validationText = [
147
+ "",
148
+ "--- Validation Report ---",
149
+ `Total nodes: ${report.totalNodes}`,
150
+ `Visible nodes: ${report.visibleNodes}`,
151
+ `Zero-size nodes: ${report.zeroSizeNodes}`,
152
+ `Interactive nodes: ${report.interactiveNodes}`,
153
+ `Issues found: ${report.issues.length}`,
154
+ "",
155
+ ...issueLines,
156
+ ].join("\n");
157
+ }
158
+ else {
159
+ validationText = "\n--- Validation: No issues found ---";
160
+ }
161
+ }
162
+ if (params.mode === "incremental" && previousSnapshot) {
163
+ const diff = (0, snapshot_differ_js_1.diffSnapshots)(previousSnapshot, snapshot);
164
+ previousSnapshot = snapshot;
165
+ if (diff.structuralChange) {
166
+ // Major change — return full snapshot
167
+ const formatted = (0, formatter_js_1.formatSnapshot)(snapshot, nodeToRef);
168
+ return {
169
+ content: [
170
+ {
171
+ type: "text",
172
+ text: `[Screen changed significantly — full snapshot]\n\n${formatted}\n\n${refRegistry.size} interactive elements found.${validationText}`,
173
+ },
174
+ ],
175
+ };
176
+ }
177
+ const diffText = (0, snapshot_differ_js_1.formatDiff)(diff);
178
+ return {
179
+ content: [
180
+ {
181
+ type: "text",
182
+ text: `[Incremental update]\n\n${diffText}\n\nTotal refs: ${refRegistry.size}${validationText}`,
183
+ },
184
+ ],
185
+ };
186
+ }
187
+ previousSnapshot = snapshot;
188
+ const formatted = (0, formatter_js_1.formatSnapshot)(snapshot, nodeToRef);
189
+ return {
190
+ content: [
191
+ {
192
+ type: "text",
193
+ text: `${formatted}\n\n${refRegistry.size} elements with refs assigned.${validationText}`,
194
+ },
195
+ ],
196
+ };
197
+ },
198
+ devlens_find_element: async (params) => {
199
+ if (!params.text && !params.label && !params.type) {
200
+ return {
201
+ content: [
202
+ {
203
+ type: "text",
204
+ text: "Please provide at least one of 'text', 'label', or 'type' to search for.",
205
+ },
206
+ ],
207
+ isError: true,
208
+ };
209
+ }
210
+ // Ensure we have a fresh snapshot with refs
211
+ const device = await deviceManager.getDevice();
212
+ const snapshot = await device.getSnapshot();
213
+ refRegistry.assignRefs(snapshot);
214
+ const matches = refRegistry.getAllRefs().filter((entry) => {
215
+ // Type filter: must match if provided
216
+ if (params.type) {
217
+ const nodeType = entry.node.type || "";
218
+ if (!nodeType.toLowerCase().includes(params.type.toLowerCase()))
219
+ return false;
220
+ }
221
+ // If only type filter is provided (no text/label), match on type alone
222
+ if (!params.text && !params.label)
223
+ return true;
224
+ // Text/label filters: match if either matches
225
+ if (params.text) {
226
+ const nodeText = entry.node.text || "";
227
+ if (nodeText.toLowerCase().includes(params.text.toLowerCase()))
228
+ return true;
229
+ }
230
+ if (params.label) {
231
+ const nodeLabel = entry.node.label || "";
232
+ if (nodeLabel.toLowerCase().includes(params.label.toLowerCase()))
233
+ return true;
234
+ }
235
+ return false;
236
+ });
237
+ if (matches.length === 0) {
238
+ // Check for invisible (zero-size) matches in the full tree
239
+ const zeroSizeMatches = refRegistry.findInTree(snapshot, params);
240
+ if (zeroSizeMatches.length > 0) {
241
+ const warnings = zeroSizeMatches.map((n) => ` WARNING: ${n.type}${n.text ? ` "${n.text}"` : ""}${n.label ? ` label="${n.label}"` : ""} found but has ZERO SIZE (${n.bounds.width}x${n.bounds.height}) — element exists in tree but is invisible`);
242
+ return {
243
+ content: [
244
+ {
245
+ type: "text",
246
+ text: `No visible elements found, but ${zeroSizeMatches.length} INVISIBLE match(es) detected:\n\n${warnings.join("\n")}\n\n` +
247
+ `These elements exist in the accessibility tree but render with zero dimensions. ` +
248
+ `This typically means the component rendered null or has no content (e.g., missing icon name).`,
249
+ },
250
+ ],
251
+ };
252
+ }
253
+ return {
254
+ content: [
255
+ {
256
+ type: "text",
257
+ text: `No elements found matching ${params.text ? `text="${params.text}" ` : ""}${params.label ? `label="${params.label}" ` : ""}${params.type ? `type="${params.type}"` : ""}`.trim(),
258
+ },
259
+ ],
260
+ };
261
+ }
262
+ const lines = matches.map((m) => {
263
+ const parts = [
264
+ `[ref=${m.ref}]`,
265
+ m.node.type,
266
+ m.node.text ? `"${m.node.text}"` : "",
267
+ m.node.label ? `label="${m.node.label}"` : "",
268
+ `at (${m.centerX}, ${m.centerY})`,
269
+ ];
270
+ return parts.filter(Boolean).join(" ");
271
+ });
272
+ return {
273
+ content: [
274
+ {
275
+ type: "text",
276
+ text: `Found ${matches.length} element(s):\n\n${lines.join("\n")}`,
277
+ },
278
+ ],
279
+ };
280
+ },
281
+ devlens_wait_for_element: async (params) => {
282
+ if (!params.text && !params.label) {
283
+ return {
284
+ content: [
285
+ {
286
+ type: "text",
287
+ text: "Please provide either 'text' or 'label' to wait for.",
288
+ },
289
+ ],
290
+ isError: true,
291
+ };
292
+ }
293
+ const device = await deviceManager.getDevice();
294
+ const startTime = Date.now();
295
+ const pollInterval = 500;
296
+ while (Date.now() - startTime < params.timeout) {
297
+ const snapshot = await device.getSnapshot();
298
+ refRegistry.assignRefs(snapshot);
299
+ const found = refRegistry.getAllRefs().find((entry) => {
300
+ if (params.text) {
301
+ const nodeText = entry.node.text || "";
302
+ if (nodeText.toLowerCase().includes(params.text.toLowerCase()))
303
+ return true;
304
+ }
305
+ if (params.label) {
306
+ const nodeLabel = entry.node.label || "";
307
+ if (nodeLabel.toLowerCase().includes(params.label.toLowerCase()))
308
+ return true;
309
+ }
310
+ return false;
311
+ });
312
+ if (found) {
313
+ return {
314
+ content: [
315
+ {
316
+ type: "text",
317
+ text: `Element found [ref=${found.ref}] ${found.node.type} "${found.node.text || found.node.label}" at (${found.centerX}, ${found.centerY})`,
318
+ },
319
+ ],
320
+ };
321
+ }
322
+ await new Promise((resolve) => setTimeout(resolve, pollInterval));
323
+ }
324
+ return {
325
+ content: [
326
+ {
327
+ type: "text",
328
+ text: `Timeout: element not found after ${params.timeout}ms. Search: ${params.text ? `text="${params.text}"` : ""} ${params.label ? `label="${params.label}"` : ""}`,
329
+ },
330
+ ],
331
+ isError: true,
332
+ };
333
+ },
334
+ devlens_wait_for_screen: async (params) => {
335
+ const device = await deviceManager.getDevice();
336
+ const startTime = Date.now();
337
+ // If text or label specified, wait for that element to appear
338
+ if (params.text || params.label) {
339
+ const pollInterval = 500;
340
+ while (Date.now() - startTime < params.timeoutMs) {
341
+ const snapshot = await device.getSnapshot();
342
+ const nodeToRef = refRegistry.assignRefs(snapshot);
343
+ const found = refRegistry.getAllRefs().find((entry) => {
344
+ if (params.text) {
345
+ const nodeText = entry.node.text || "";
346
+ if (nodeText.toLowerCase().includes(params.text.toLowerCase()))
347
+ return true;
348
+ }
349
+ if (params.label) {
350
+ const nodeLabel = entry.node.label || "";
351
+ if (nodeLabel.toLowerCase().includes(params.label.toLowerCase()))
352
+ return true;
353
+ }
354
+ return false;
355
+ });
356
+ if (found) {
357
+ const formatted = (0, formatter_js_1.formatSnapshot)(snapshot, nodeToRef);
358
+ return {
359
+ content: [
360
+ {
361
+ type: "text",
362
+ text: `Screen ready — "${params.text || params.label}" found [ref=${found.ref}] ` +
363
+ `after ${Date.now() - startTime}ms\n\n${formatted}\n\n${refRegistry.size} elements with refs.`,
364
+ },
365
+ ],
366
+ };
367
+ }
368
+ await new Promise((r) => setTimeout(r, pollInterval));
369
+ }
370
+ // Timeout
371
+ return {
372
+ content: [
373
+ {
374
+ type: "text",
375
+ text: `Timeout after ${params.timeoutMs}ms: "${params.text || params.label}" not found on screen.`,
376
+ },
377
+ ],
378
+ isError: true,
379
+ };
380
+ }
381
+ // Stability mode: wait until two consecutive snapshots show no diff
382
+ let lastSnapshot = await device.getSnapshot();
383
+ while (Date.now() - startTime < params.timeoutMs) {
384
+ await new Promise((r) => setTimeout(r, params.stableMs));
385
+ const currentSnapshot = await device.getSnapshot();
386
+ const diff = (0, snapshot_differ_js_1.diffSnapshots)(lastSnapshot, currentSnapshot);
387
+ if (diff.added.length === 0 &&
388
+ diff.removed.length === 0 &&
389
+ diff.changed.length === 0) {
390
+ // Screen is stable
391
+ const nodeToRef = refRegistry.assignRefs(currentSnapshot);
392
+ const formatted = (0, formatter_js_1.formatSnapshot)(currentSnapshot, nodeToRef);
393
+ return {
394
+ content: [
395
+ {
396
+ type: "text",
397
+ text: `Screen stable for ${params.stableMs}ms ` +
398
+ `(total wait: ${Date.now() - startTime}ms)\n\n${formatted}\n\n${refRegistry.size} elements with refs.`,
399
+ },
400
+ ],
401
+ };
402
+ }
403
+ lastSnapshot = currentSnapshot;
404
+ }
405
+ // Timeout — return latest snapshot anyway
406
+ const finalSnapshot = await device.getSnapshot();
407
+ const nodeToRef = refRegistry.assignRefs(finalSnapshot);
408
+ const formatted = (0, formatter_js_1.formatSnapshot)(finalSnapshot, nodeToRef);
409
+ return {
410
+ content: [
411
+ {
412
+ type: "text",
413
+ text: `Timeout after ${params.timeoutMs}ms: screen did not stabilize. ` +
414
+ `Returning latest snapshot.\n\n${formatted}\n\n${refRegistry.size} elements with refs.`,
415
+ },
416
+ ],
417
+ isError: true,
418
+ };
419
+ },
420
+ devlens_element_info: async (params) => {
421
+ const entry = refRegistry.resolve(params.ref);
422
+ if (!entry) {
423
+ return {
424
+ content: [
425
+ {
426
+ type: "text",
427
+ text: `Ref "${params.ref}" not found. Run devlens_snapshot first to get current refs.`,
428
+ },
429
+ ],
430
+ isError: true,
431
+ };
432
+ }
433
+ const node = entry.node;
434
+ const lines = [
435
+ `Ref: ${params.ref}`,
436
+ `Type: ${node.type}`,
437
+ `Text: ${node.text || "(none)"}`,
438
+ `Label: ${node.label || "(none)"}`,
439
+ `Bounds: x=${node.bounds.x}, y=${node.bounds.y}, ${node.bounds.width}x${node.bounds.height}`,
440
+ `Center: (${entry.centerX}, ${entry.centerY})`,
441
+ `Interactive: ${node.interactive}`,
442
+ `Focused: ${node.focused || false}`,
443
+ `Enabled: ${node.enabled !== false}`,
444
+ `Value: ${node.value || "(none)"}`,
445
+ `Resource ID: ${node.resourceId || "(none)"}`,
446
+ `Children: ${node.children.length}`,
447
+ ];
448
+ // Infer layout direction for containers with children
449
+ if (node.children.length > 0) {
450
+ const layout = inferLayoutDirection(node);
451
+ lines.push(`Inferred Layout: ${layout}`);
452
+ if (layout === "row") {
453
+ const childDescs = node.children
454
+ .filter((c) => c.bounds.width > 0)
455
+ .sort((a, b) => a.bounds.x - b.bounds.x)
456
+ .map((c) => `${c.type}${c.text ? ` "${c.text}"` : ""}@x=${c.bounds.x}`);
457
+ lines.push(` Children left-to-right: ${childDescs.join(", ")}`);
458
+ }
459
+ else if (layout === "column") {
460
+ const childDescs = node.children
461
+ .filter((c) => c.bounds.height > 0)
462
+ .sort((a, b) => a.bounds.y - b.bounds.y)
463
+ .map((c) => `${c.type}${c.text ? ` "${c.text}"` : ""}@y=${c.bounds.y}`);
464
+ lines.push(` Children top-to-bottom: ${childDescs.join(", ")}`);
465
+ }
466
+ }
467
+ return {
468
+ content: [
469
+ {
470
+ type: "text",
471
+ text: lines.join("\n"),
472
+ },
473
+ ],
474
+ };
475
+ },
476
+ };
477
+ return { handlers, resetPreviousSnapshot };
478
+ }
479
+ //# sourceMappingURL=snapshot-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"snapshot-tools.js","sourceRoot":"","sources":["../../../src/tools/snapshot-tools.ts"],"names":[],"mappings":";;;AAmKA,gEAqaC;AAxkBD,6BAAwB;AAIxB,2DAA0D;AAC1D,uEAGwC;AAE3B,QAAA,mBAAmB,GAAG;IACjC,gBAAgB,EAAE;QAChB,WAAW,EACT,qYAAqY;QACvY,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,OAAC;iBACJ,IAAI,CAAC,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;iBAC7B,OAAO,CAAC,MAAM,CAAC;iBACf,QAAQ,CACP,yFAAyF,CAC1F;YACH,QAAQ,EAAE,OAAC;iBACR,OAAO,EAAE;iBACT,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CACP,yLAAyL,CAC1L;SACJ,CAAC;KACH;IACD,oBAAoB,EAAE;QACpB,WAAW,EACT,sQAAsQ;QACxQ,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,OAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,4CAA4C,CAAC;YACzD,KAAK,EAAE,OAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,mDAAmD,CAAC;YAChE,IAAI,EAAE,OAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,yGAAyG,CAC1G;SACJ,CAAC;KACH;IACD,wBAAwB,EAAE;QACxB,WAAW,EACT,gHAAgH;QAClH,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;YAChE,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iCAAiC,CAAC;YACxE,OAAO,EAAE,OAAC;iBACP,MAAM,EAAE;iBACR,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,oDAAoD,CAAC;SAClE,CAAC;KACH;IACD,uBAAuB,EAAE;QACvB,WAAW,EACT,8PAA8P;QAChQ,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC;YACnB,IAAI,EAAE,OAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CACP,iFAAiF,CAClF;YACH,KAAK,EAAE,OAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,8CAA8C,CAAC;YAC3D,QAAQ,EAAE,OAAC;iBACR,MAAM,EAAE;iBACR,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CACP,0HAA0H,CAC3H;YACH,SAAS,EAAE,OAAC;iBACT,MAAM,EAAE;iBACR,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CACP,sEAAsE,CACvE;SACJ,CAAC;KACH;IACD,oBAAoB,EAAE;QACpB,WAAW,EACT,uJAAuJ;QACzJ,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC;YACnB,GAAG,EAAE,OAAC;iBACH,MAAM,EAAE;iBACR,QAAQ,CACP,sDAAsD,CACvD;SACJ,CAAC;KACH;CACF,CAAC;AAEF;;;;GAIG;AACH,SAAS,oBAAoB,CAC3B,IAAkB;IAElB,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAEhD,0CAA0C;IAC1C,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CACrC,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,IAAI,CAAC;QAAE,OAAO,SAAS,CAAC;IAE7C,uDAAuD;IACvD,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC/B,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC/B,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;YAC5D,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YAC9D,IAAI,QAAQ,IAAI,QAAQ,EAAE,CAAC;gBACzB,UAAU,GAAG,IAAI,CAAC;gBAClB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,UAAU;QAAE,OAAO,SAAS,CAAC;IAEjC,wCAAwC;IACxC,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7C,MAAM,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IAE7C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IACpD,MAAM,KAAK,GACT,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IAElB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IACpD,MAAM,KAAK,GACT,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7D,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;IAElB,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;IAC9C,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;IAEhD,kFAAkF;IAClF,MAAM,UAAU,GAAG,SAAS,GAAG,cAAc,GAAG,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC;IACjE,MAAM,YAAY,GAAG,SAAS,GAAG,eAAe,GAAG,GAAG,IAAI,KAAK,GAAG,CAAC,CAAC;IAEpE,IAAI,UAAU,IAAI,CAAC,YAAY;QAAE,OAAO,QAAQ,CAAC;IACjD,IAAI,YAAY,IAAI,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,UAAU,IAAI,YAAY;QAAE,OAAO,MAAM,CAAC;IAE9C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAgB,0BAA0B,CACxC,aAA4B,EAC5B,WAAwB;IAExB,IAAI,gBAAgB,GAAwB,IAAI,CAAC;IAEjD,SAAS,qBAAqB;QAC5B,gBAAgB,GAAG,IAAI,CAAC;IAC1B,CAAC;IAED,MAAM,QAAQ,GAAG;QACf,gBAAgB,EAAE,KAAK,EAAE,MAGxB,EAAE,EAAE;YACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5C,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAEnD,uCAAuC;YACvC,IAAI,cAAc,GAAG,EAAE,CAAC;YACxB,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;gBACpB,MAAM,MAAM,GAAG,WAAW,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;gBAClD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAClC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,GAAG,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,EAAE,CAChE,CAAC;oBACF,cAAc,GAAG;wBACf,EAAE;wBACF,2BAA2B;wBAC3B,gBAAgB,MAAM,CAAC,UAAU,EAAE;wBACnC,kBAAkB,MAAM,CAAC,YAAY,EAAE;wBACvC,oBAAoB,MAAM,CAAC,aAAa,EAAE;wBAC1C,sBAAsB,MAAM,CAAC,gBAAgB,EAAE;wBAC/C,iBAAiB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;wBACvC,EAAE;wBACF,GAAG,UAAU;qBACd,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACf,CAAC;qBAAM,CAAC;oBACN,cAAc,GAAG,uCAAuC,CAAC;gBAC3D,CAAC;YACH,CAAC;YAED,IAAI,MAAM,CAAC,IAAI,KAAK,aAAa,IAAI,gBAAgB,EAAE,CAAC;gBACtD,MAAM,IAAI,GAAG,IAAA,kCAAa,EAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAC;gBACvD,gBAAgB,GAAG,QAAQ,CAAC;gBAE5B,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBAC1B,sCAAsC;oBACtC,MAAM,SAAS,GAAG,IAAA,6BAAc,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;oBACtD,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAe;gCACrB,IAAI,EAAE,qDAAqD,SAAS,OAAO,WAAW,CAAC,IAAI,+BAA+B,cAAc,EAAE;6BAC3I;yBACF;qBACF,CAAC;gBACJ,CAAC;gBAED,MAAM,QAAQ,GAAG,IAAA,+BAAU,EAAC,IAAI,CAAC,CAAC;gBAClC,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,2BAA2B,QAAQ,mBAAmB,WAAW,CAAC,IAAI,GAAG,cAAc,EAAE;yBAChG;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,gBAAgB,GAAG,QAAQ,CAAC;YAC5B,MAAM,SAAS,GAAG,IAAA,6BAAc,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAEtD,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,GAAG,SAAS,OAAO,WAAW,CAAC,IAAI,gCAAgC,cAAc,EAAE;qBAC1F;iBACF;aACF,CAAC;QACJ,CAAC;QAED,oBAAoB,EAAE,KAAK,EAAE,MAI5B,EAAE,EAAE;YACH,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBAClD,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,0EAA0E;yBACjF;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,4CAA4C;YAC5C,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YAC5C,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAEjC,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;gBACxD,sCAAsC;gBACtC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;oBAChB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;oBACvC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;wBAC7D,OAAO,KAAK,CAAC;gBACjB,CAAC;gBAED,uEAAuE;gBACvE,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK;oBAAE,OAAO,IAAI,CAAC;gBAE/C,8CAA8C;gBAC9C,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;oBAChB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;oBACvC,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;wBAC5D,OAAO,IAAI,CAAC;gBAChB,CAAC;gBACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;oBACjB,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;oBACzC,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;wBAC9D,OAAO,IAAI,CAAC;gBAChB,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;YAEH,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACzB,2DAA2D;gBAC3D,MAAM,eAAe,GAAG,WAAW,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBAEjE,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC/B,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,CAClC,CAAC,CAAC,EAAE,EAAE,CACJ,cAAc,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,6BAA6B,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,MAAM,CAAC,MAAM,6CAA6C,CACxM,CAAC;oBACF,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAe;gCACrB,IAAI,EACF,kCAAkC,eAAe,CAAC,MAAM,qCAAqC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;oCACtH,kFAAkF;oCAClF,+FAA+F;6BAClG;yBACF;qBACF,CAAC;gBACJ,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,8BAA8B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE;yBACvL;qBACF;iBACF,CAAC;YACJ,CAAC;YAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;gBAC9B,MAAM,KAAK,GAAG;oBACZ,QAAQ,CAAC,CAAC,GAAG,GAAG;oBAChB,CAAC,CAAC,IAAI,CAAC,IAAI;oBACX,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE;oBACrC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE;oBAC7C,OAAO,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,OAAO,GAAG;iBAClC,CAAC;gBACF,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,SAAS,OAAO,CAAC,MAAM,mBAAmB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBACnE;iBACF;aACF,CAAC;QACJ,CAAC;QAED,wBAAwB,EAAE,KAAK,EAAE,MAIhC,EAAE,EAAE;YACH,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAClC,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,sDAAsD;yBAC7D;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,MAAM,YAAY,GAAG,GAAG,CAAC;YAEzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC/C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;gBAC5C,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAEjC,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;oBACpD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;wBAChB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;wBACvC,IAAI,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAK,CAAC,WAAW,EAAE,CAAC;4BAC7D,OAAO,IAAI,CAAC;oBAChB,CAAC;oBACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBACjB,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;wBACzC,IAAI,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAM,CAAC,WAAW,EAAE,CAAC;4BAC/D,OAAO,IAAI,CAAC;oBAChB,CAAC;oBACD,OAAO,KAAK,CAAC;gBACf,CAAC,CAAC,CAAC;gBAEH,IAAI,KAAK,EAAE,CAAC;oBACV,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAe;gCACrB,IAAI,EAAE,sBAAsB,KAAK,CAAC,GAAG,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,GAAG;6BAC7I;yBACF;qBACF,CAAC;gBACJ,CAAC;gBAED,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;YACpE,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,oCAAoC,MAAM,CAAC,OAAO,eAAe,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;qBACrK;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,uBAAuB,EAAE,KAAK,EAAE,MAK/B,EAAE,EAAE;YACH,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,SAAS,EAAE,CAAC;YAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAE7B,8DAA8D;YAC9D,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAChC,MAAM,YAAY,GAAG,GAAG,CAAC;gBACzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;oBACjD,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;oBAC5C,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBAEnD,MAAM,KAAK,GAAG,WAAW,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;wBACpD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;4BAChB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;4BACvC,IACE,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAK,CAAC,WAAW,EAAE,CAAC;gCAE3D,OAAO,IAAI,CAAC;wBAChB,CAAC;wBACD,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;4BACjB,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;4BACzC,IACE,SAAS,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAM,CAAC,WAAW,EAAE,CAAC;gCAE7D,OAAO,IAAI,CAAC;wBAChB,CAAC;wBACD,OAAO,KAAK,CAAC;oBACf,CAAC,CAAC,CAAC;oBAEH,IAAI,KAAK,EAAE,CAAC;wBACV,MAAM,SAAS,GAAG,IAAA,6BAAc,EAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;wBACtD,OAAO;4BACL,OAAO,EAAE;gCACP;oCACE,IAAI,EAAE,MAAe;oCACrB,IAAI,EACF,mBAAmB,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,gBAAgB,KAAK,CAAC,GAAG,IAAI;wCAC3E,SAAS,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,SAAS,SAAS,OAAO,WAAW,CAAC,IAAI,sBAAsB;iCACjG;6BACF;yBACF,CAAC;oBACJ,CAAC;oBACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC;gBACxD,CAAC;gBAED,UAAU;gBACV,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,iBAAiB,MAAM,CAAC,SAAS,QAAQ,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,KAAK,wBAAwB;yBACnG;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,oEAAoE;YACpE,IAAI,YAAY,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YAE9C,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;gBACjD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;gBAEzD,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;gBACnD,MAAM,IAAI,GAAG,IAAA,kCAAa,EAAC,YAAY,EAAE,eAAe,CAAC,CAAC;gBAE1D,IACE,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;oBACvB,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;oBACzB,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EACzB,CAAC;oBACD,mBAAmB;oBACnB,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;oBAC1D,MAAM,SAAS,GAAG,IAAA,6BAAc,EAAC,eAAe,EAAE,SAAS,CAAC,CAAC;oBAC7D,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAe;gCACrB,IAAI,EACF,qBAAqB,MAAM,CAAC,QAAQ,KAAK;oCACzC,gBAAgB,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,UAAU,SAAS,OAAO,WAAW,CAAC,IAAI,sBAAsB;6BACzG;yBACF;qBACF,CAAC;gBACJ,CAAC;gBAED,YAAY,GAAG,eAAe,CAAC;YACjC,CAAC;YAED,0CAA0C;YAC1C,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YACjD,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;YACxD,MAAM,SAAS,GAAG,IAAA,6BAAc,EAAC,aAAa,EAAE,SAAS,CAAC,CAAC;YAC3D,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EACF,iBAAiB,MAAM,CAAC,SAAS,gCAAgC;4BACjE,iCAAiC,SAAS,OAAO,WAAW,CAAC,IAAI,sBAAsB;qBAC1F;iBACF;gBACD,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,oBAAoB,EAAE,KAAK,EAAE,MAAuB,EAAE,EAAE;YACtD,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC9C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAe;4BACrB,IAAI,EAAE,QAAQ,MAAM,CAAC,GAAG,8DAA8D;yBACvF;qBACF;oBACD,OAAO,EAAE,IAAI;iBACd,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YACxB,MAAM,KAAK,GAAG;gBACZ,QAAQ,MAAM,CAAC,GAAG,EAAE;gBACpB,SAAS,IAAI,CAAC,IAAI,EAAE;gBACpB,SAAS,IAAI,CAAC,IAAI,IAAI,QAAQ,EAAE;gBAChC,UAAU,IAAI,CAAC,KAAK,IAAI,QAAQ,EAAE;gBAClC,aAAa,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;gBAC5F,YAAY,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,GAAG;gBAC9C,gBAAgB,IAAI,CAAC,WAAW,EAAE;gBAClC,YAAY,IAAI,CAAC,OAAO,IAAI,KAAK,EAAE;gBACnC,YAAY,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE;gBACpC,UAAU,IAAI,CAAC,KAAK,IAAI,QAAQ,EAAE;gBAClC,gBAAgB,IAAI,CAAC,UAAU,IAAI,QAAQ,EAAE;gBAC7C,aAAa,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;aACpC,CAAC;YAEF,sDAAsD;YACtD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,MAAM,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;gBAC1C,KAAK,CAAC,IAAI,CAAC,oBAAoB,MAAM,EAAE,CAAC,CAAC;gBAEzC,IAAI,MAAM,KAAK,KAAK,EAAE,CAAC;oBACrB,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ;yBAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;yBACjC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;yBACvC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC1E,KAAK,CAAC,IAAI,CAAC,6BAA6B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACnE,CAAC;qBAAM,IAAI,MAAM,KAAK,QAAQ,EAAE,CAAC;oBAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ;yBAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;yBAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;yBACvC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC;oBAC1E,KAAK,CAAC,IAAI,CAAC,6BAA6B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACnE,CAAC;YACH,CAAC;YAED,OAAO;gBACL,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;qBACvB;iBACF;aACF,CAAC;QACJ,CAAC;KACF,CAAC;IAEF,OAAO,EAAE,QAAQ,EAAE,qBAAqB,EAAE,CAAC;AAC7C,CAAC"}