@jobshimo/browser-link 0.14.0 → 0.15.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.
- package/dist/agent-instructions/content.js +11 -0
- package/dist/agent-instructions/content.js.map +1 -1
- package/dist/auth/process-identity.d.ts +7 -0
- package/dist/auth/process-identity.js +56 -7
- package/dist/auth/process-identity.js.map +1 -1
- package/dist/extension/background.js +20 -239
- package/dist/extension/background.js.map +1 -1
- package/dist/extension/inpage/builders.d.ts +70 -0
- package/dist/extension/inpage/builders.js +223 -0
- package/dist/extension/inpage/builders.js.map +1 -0
- package/dist/extension/inpage/deep-query.d.ts +40 -0
- package/dist/extension/inpage/deep-query.js +308 -0
- package/dist/extension/inpage/deep-query.js.map +1 -0
- package/dist/extension/inpage/dom-helpers.d.ts +22 -0
- package/dist/extension/inpage/dom-helpers.js +142 -0
- package/dist/extension/inpage/dom-helpers.js.map +1 -0
- package/dist/extension/manifest.json +1 -1
- package/dist/tools/browser-definitions.js +16 -4
- package/dist/tools/browser-definitions.js.map +1 -1
- package/dist/tools/browser-dispatch.js +2 -2
- package/dist/tools/browser-dispatch.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-page JS source injected into CDP `Runtime.evaluate` expressions built
|
|
3
|
+
* by background.ts. This is the "deep search" layer that lets `snapshot`,
|
|
4
|
+
* `find`, `click` and `type` see past two boundaries plain
|
|
5
|
+
* `document.querySelector` / `document.querySelectorAll` cannot cross:
|
|
6
|
+
*
|
|
7
|
+
* - OPEN Shadow DOM roots (`element.attachShadow({ mode: 'open' })`),
|
|
8
|
+
* walked recursively (shadow roots nested inside shadow roots).
|
|
9
|
+
* - Same-origin `<iframe>` documents, walked recursively (iframes nested
|
|
10
|
+
* inside iframes, shadow roots nested inside iframes and vice versa).
|
|
11
|
+
*
|
|
12
|
+
* Exported as a raw string, not real TypeScript — it runs inside the
|
|
13
|
+
* TARGET PAGE's JS context via CDP `Runtime.evaluate`, not inside the
|
|
14
|
+
* extension's own service worker. Keep the syntax plain (`var`/`function`,
|
|
15
|
+
* no optional chaining assumptions) since it must run unmodified in
|
|
16
|
+
* whatever JS engine the connected tab uses, and keep it dependency-free so
|
|
17
|
+
* it can be unit-tested by evaluating this exact string in a DOM
|
|
18
|
+
* environment (see `deep-query.test.ts`).
|
|
19
|
+
*
|
|
20
|
+
* Known limitations (also documented on the MCP tool descriptions):
|
|
21
|
+
* - CLOSED shadow roots (`{ mode: 'closed' }`) are unreachable from page
|
|
22
|
+
* world JS — `element.shadowRoot` is `null` for them by design. There
|
|
23
|
+
* is no CDP-level workaround from `Runtime.evaluate`.
|
|
24
|
+
* - CROSS-ORIGIN iframes are unreachable — `contentDocument` throws or
|
|
25
|
+
* returns null under the same-origin policy. Access is wrapped in
|
|
26
|
+
* try/catch so a cross-origin frame is silently skipped rather than
|
|
27
|
+
* failing the whole query.
|
|
28
|
+
* - A plain CSS selector cannot distinguish between two elements that
|
|
29
|
+
* produce byte-identical generated selectors in two different roots
|
|
30
|
+
* (e.g. two structurally-identical Shadow DOM component instances).
|
|
31
|
+
* `deepQueryFirst` returns the first match in traversal order
|
|
32
|
+
* (the start root itself, then nested shadow roots, then nested
|
|
33
|
+
* same-origin iframe documents, depth-first). Extremely rare in
|
|
34
|
+
* practice — real content differs — but worth knowing when a page
|
|
35
|
+
* repeats the exact same component markup in multiple places. When
|
|
36
|
+
* selector generation cannot avoid this (see `genSelectorInfo` in
|
|
37
|
+
* `dom-helpers.ts`), snapshot/find mark the affected entry with
|
|
38
|
+
* `ambiguous: true` so agents know not to cache that selector.
|
|
39
|
+
*/
|
|
40
|
+
export const DEEP_QUERY_JS = `
|
|
41
|
+
function collectSearchRoots(start) {
|
|
42
|
+
// start: a Document, Element or ShadowRoot to scope the search to.
|
|
43
|
+
// Returns [start, ...every open shadow root and same-origin iframe
|
|
44
|
+
// document reachable inside start's subtree, recursively]. The caller
|
|
45
|
+
// runs .querySelectorAll()/.querySelector() on each entry directly —
|
|
46
|
+
// each entry's own querySelectorAll does NOT pierce into nested shadow
|
|
47
|
+
// roots or iframes on its own, which is why we enumerate them here.
|
|
48
|
+
var roots = [start];
|
|
49
|
+
function walk(scope, depth) {
|
|
50
|
+
// Depth guard, same pattern as the other recursive helpers here:
|
|
51
|
+
// pathological nesting (or a cycle introduced by a broken mock)
|
|
52
|
+
// must degrade to a truncated result, never a stack overflow.
|
|
53
|
+
if (depth > 20) return;
|
|
54
|
+
var all;
|
|
55
|
+
try {
|
|
56
|
+
all = scope.querySelectorAll('*');
|
|
57
|
+
} catch (_) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
for (var i = 0; i < all.length; i++) {
|
|
61
|
+
var el = all[i];
|
|
62
|
+
if (el.shadowRoot) {
|
|
63
|
+
roots.push(el.shadowRoot);
|
|
64
|
+
walk(el.shadowRoot, depth + 1);
|
|
65
|
+
}
|
|
66
|
+
if (el.tagName === 'IFRAME') {
|
|
67
|
+
var doc = null;
|
|
68
|
+
try {
|
|
69
|
+
doc = el.contentDocument;
|
|
70
|
+
} catch (_) {
|
|
71
|
+
doc = null;
|
|
72
|
+
}
|
|
73
|
+
if (doc) {
|
|
74
|
+
roots.push(doc);
|
|
75
|
+
walk(doc, depth + 1);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
walk(start, 0);
|
|
81
|
+
return roots;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function deepWalkAll(callback, start) {
|
|
85
|
+
// Tree-walk primitive: invoke callback(el) for every element reachable
|
|
86
|
+
// from start (default: document) across the top document, every open
|
|
87
|
+
// shadow root, and every same-origin iframe document.
|
|
88
|
+
var root = start || document;
|
|
89
|
+
var roots = collectSearchRoots(root);
|
|
90
|
+
for (var r = 0; r < roots.length; r++) {
|
|
91
|
+
var all;
|
|
92
|
+
try {
|
|
93
|
+
all = roots[r].querySelectorAll('*');
|
|
94
|
+
} catch (_) {
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
for (var i = 0; i < all.length; i++) callback(all[i]);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function deepQueryAll(selector, start) {
|
|
102
|
+
var root = start || document;
|
|
103
|
+
var roots = collectSearchRoots(root);
|
|
104
|
+
var out = [];
|
|
105
|
+
for (var r = 0; r < roots.length; r++) {
|
|
106
|
+
var found;
|
|
107
|
+
try {
|
|
108
|
+
found = roots[r].querySelectorAll(selector);
|
|
109
|
+
} catch (_) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
for (var i = 0; i < found.length; i++) out.push(found[i]);
|
|
113
|
+
}
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function deepQueryFirst(selector, start) {
|
|
118
|
+
var root = start || document;
|
|
119
|
+
var roots = collectSearchRoots(root);
|
|
120
|
+
for (var r = 0; r < roots.length; r++) {
|
|
121
|
+
var el = null;
|
|
122
|
+
try {
|
|
123
|
+
el = roots[r].querySelector(selector);
|
|
124
|
+
} catch (_) {
|
|
125
|
+
el = null;
|
|
126
|
+
}
|
|
127
|
+
if (el) return el;
|
|
128
|
+
}
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function frameElementChain(el) {
|
|
133
|
+
// Walk up from el's own window to the top window, collecting the
|
|
134
|
+
// <iframe> element that hosts each intermediate document. Outermost
|
|
135
|
+
// frame first. Same-origin only — frameElement throws/returns null
|
|
136
|
+
// across an origin boundary, at which point the chain simply stops
|
|
137
|
+
// (the coordinate math below degrades gracefully rather than throwing).
|
|
138
|
+
var chain = [];
|
|
139
|
+
var doc = el.ownerDocument;
|
|
140
|
+
var win = doc && doc.defaultView;
|
|
141
|
+
if (!win) return chain;
|
|
142
|
+
var topWin;
|
|
143
|
+
try {
|
|
144
|
+
topWin = win.top;
|
|
145
|
+
} catch (_) {
|
|
146
|
+
topWin = win;
|
|
147
|
+
}
|
|
148
|
+
var guard = 0;
|
|
149
|
+
while (win && win !== topWin && guard < 20) {
|
|
150
|
+
guard++;
|
|
151
|
+
var fe = null;
|
|
152
|
+
try {
|
|
153
|
+
fe = win.frameElement;
|
|
154
|
+
} catch (_) {
|
|
155
|
+
fe = null;
|
|
156
|
+
}
|
|
157
|
+
if (!fe) break;
|
|
158
|
+
chain.unshift(fe);
|
|
159
|
+
win = fe.ownerDocument && fe.ownerDocument.defaultView;
|
|
160
|
+
}
|
|
161
|
+
return chain;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
function frameViewportOriginOffset(fe) {
|
|
165
|
+
// The embedded document's viewport origin sits at the frame element's
|
|
166
|
+
// CONTENT box, but getBoundingClientRect() returns the BORDER box —
|
|
167
|
+
// border and padding must be added on top of rect.left/rect.top or
|
|
168
|
+
// every coordinate inside a styled iframe lands short. clientLeft/
|
|
169
|
+
// clientTop are the border widths; padding comes from computed style
|
|
170
|
+
// (read through the frame's own view — same-origin, so reachable).
|
|
171
|
+
var borderX = fe.clientLeft || 0;
|
|
172
|
+
var borderY = fe.clientTop || 0;
|
|
173
|
+
var padX = 0;
|
|
174
|
+
var padY = 0;
|
|
175
|
+
try {
|
|
176
|
+
var view = (fe.ownerDocument && fe.ownerDocument.defaultView) || window;
|
|
177
|
+
var style = view.getComputedStyle(fe);
|
|
178
|
+
padX = parseFloat(style.paddingLeft) || 0;
|
|
179
|
+
padY = parseFloat(style.paddingTop) || 0;
|
|
180
|
+
} catch (_) {}
|
|
181
|
+
return { x: borderX + padX, y: borderY + padY };
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function clickRectOf(el) {
|
|
185
|
+
// For a line-wrapped INLINE element (a link spanning two lines), the
|
|
186
|
+
// center of getBoundingClientRect() can land in the unpainted gap
|
|
187
|
+
// between the line boxes — elementFromPoint would report whatever sits
|
|
188
|
+
// behind, and a dispatched click would miss. The first client rect is
|
|
189
|
+
// always a painted fragment, so its center is a safe click point.
|
|
190
|
+
// Block-level elements have exactly one client rect, identical to the
|
|
191
|
+
// bounding rect — no behavior change for them.
|
|
192
|
+
var rects = null;
|
|
193
|
+
try {
|
|
194
|
+
rects = el.getClientRects ? el.getClientRects() : null;
|
|
195
|
+
} catch (_) {
|
|
196
|
+
rects = null;
|
|
197
|
+
}
|
|
198
|
+
if (rects && rects.length > 0) return rects[0];
|
|
199
|
+
return el.getBoundingClientRect();
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function viewportCenterOf(el) {
|
|
203
|
+
// Returns the element's click point in two coordinate spaces:
|
|
204
|
+
// - localX/localY: relative to el's OWN document viewport (what
|
|
205
|
+
// that document's elementFromPoint expects).
|
|
206
|
+
// - x/y: relative to the TOP-LEVEL viewport (what CDP
|
|
207
|
+
// Input.dispatchMouseEvent expects) — localX/localY plus the
|
|
208
|
+
// accumulated content-box origin of every ancestor <iframe>
|
|
209
|
+
// element (border-box rect + border + padding). Shadow DOM
|
|
210
|
+
// boundaries need no offset: they do not introduce a new
|
|
211
|
+
// coordinate space.
|
|
212
|
+
// Both spaces derive from the SAME point (first-client-rect center),
|
|
213
|
+
// so the occlusion hit-test and the CDP dispatch always agree.
|
|
214
|
+
var rect = clickRectOf(el);
|
|
215
|
+
var localX = rect.left + rect.width / 2;
|
|
216
|
+
var localY = rect.top + rect.height / 2;
|
|
217
|
+
var chain = frameElementChain(el);
|
|
218
|
+
var offsetX = 0;
|
|
219
|
+
var offsetY = 0;
|
|
220
|
+
for (var i = 0; i < chain.length; i++) {
|
|
221
|
+
var frameRect = chain[i].getBoundingClientRect();
|
|
222
|
+
var origin = frameViewportOriginOffset(chain[i]);
|
|
223
|
+
offsetX += frameRect.left + origin.x;
|
|
224
|
+
offsetY += frameRect.top + origin.y;
|
|
225
|
+
}
|
|
226
|
+
return { x: offsetX + localX, y: offsetY + localY, localX: localX, localY: localY };
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function composedContains(ancestor, node) {
|
|
230
|
+
// Node.contains() does not cross shadow boundaries. This walks the
|
|
231
|
+
// COMPOSED tree: when climbing hits a ShadowRoot (no parentNode), jump
|
|
232
|
+
// to its host and keep climbing.
|
|
233
|
+
var cur = node;
|
|
234
|
+
var guard = 0;
|
|
235
|
+
while (cur && guard < 1000) {
|
|
236
|
+
guard++;
|
|
237
|
+
if (cur === ancestor) return true;
|
|
238
|
+
if (cur.parentNode) {
|
|
239
|
+
cur = cur.parentNode;
|
|
240
|
+
continue;
|
|
241
|
+
}
|
|
242
|
+
if (cur.host) {
|
|
243
|
+
cur = cur.host;
|
|
244
|
+
continue;
|
|
245
|
+
}
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
return false;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
function describeElement(el) {
|
|
252
|
+
if (!el || !el.tagName) return 'an unknown element';
|
|
253
|
+
var desc = el.tagName.toLowerCase();
|
|
254
|
+
if (el.id) desc += '#' + el.id;
|
|
255
|
+
if (el.classList && el.classList.length) {
|
|
256
|
+
var classes = [];
|
|
257
|
+
for (var i = 0; i < el.classList.length && i < 2; i++) classes.push(el.classList[i]);
|
|
258
|
+
if (classes.length) desc += '.' + classes.join('.');
|
|
259
|
+
}
|
|
260
|
+
return desc;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
function hitTestDeep(root, x, y) {
|
|
264
|
+
var node = null;
|
|
265
|
+
try {
|
|
266
|
+
node = root && root.elementFromPoint ? root.elementFromPoint(x, y) : null;
|
|
267
|
+
} catch (_) {
|
|
268
|
+
node = null;
|
|
269
|
+
}
|
|
270
|
+
// The hit element may itself host a nested open shadow root whose
|
|
271
|
+
// content visually covers the point — descend until elementFromPoint
|
|
272
|
+
// stops finding a deeper shadow tree.
|
|
273
|
+
var guard = 0;
|
|
274
|
+
while (node && node.shadowRoot && guard < 20) {
|
|
275
|
+
guard++;
|
|
276
|
+
var inner = null;
|
|
277
|
+
try {
|
|
278
|
+
inner = node.shadowRoot.elementFromPoint ? node.shadowRoot.elementFromPoint(x, y) : null;
|
|
279
|
+
} catch (_) {
|
|
280
|
+
inner = null;
|
|
281
|
+
}
|
|
282
|
+
if (!inner || inner === node) break;
|
|
283
|
+
node = inner;
|
|
284
|
+
}
|
|
285
|
+
return node;
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
function checkOcclusion(target, localX, localY) {
|
|
289
|
+
// Hit-test starting from the element's OWN root (its closest shadow
|
|
290
|
+
// root, or the document that owns it when not in shadow DOM) using
|
|
291
|
+
// LOCAL coordinates — the same coordinate space that root's own
|
|
292
|
+
// elementFromPoint expects (an iframe document's viewport starts at
|
|
293
|
+
// its own top-left, not the top-level page's).
|
|
294
|
+
var root = target.getRootNode ? target.getRootNode() : document;
|
|
295
|
+
var hit = hitTestDeep(root, localX, localY);
|
|
296
|
+
if (!hit) {
|
|
297
|
+
// Nothing hit-tested at all (e.g. elementFromPoint unsupported in
|
|
298
|
+
// this environment, or the point is outside the rendered area).
|
|
299
|
+
// Fail open rather than block a click we cannot actually verify.
|
|
300
|
+
return { allowed: true };
|
|
301
|
+
}
|
|
302
|
+
if (hit === target || composedContains(target, hit) || composedContains(hit, target)) {
|
|
303
|
+
return { allowed: true };
|
|
304
|
+
}
|
|
305
|
+
return { allowed: false, blocker: describeElement(hit) };
|
|
306
|
+
}
|
|
307
|
+
`;
|
|
308
|
+
//# sourceMappingURL=deep-query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deep-query.js","sourceRoot":"","sources":["../../src/inpage/deep-query.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2Q5B,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared in-page DOM helpers, injected verbatim into any JS template that
|
|
3
|
+
* needs them (`buildSnapshotJs`, `buildFindJs`). Defining them once here
|
|
4
|
+
* keeps the heuristics (visibility, selector generation, accessible text)
|
|
5
|
+
* identical across tools so a selector returned by `snapshot` and a selector
|
|
6
|
+
* returned by `find` follow the same rules.
|
|
7
|
+
*
|
|
8
|
+
* `genSelectorInfo` calls `deepQueryAll` to verify a candidate selector is
|
|
9
|
+
* unique across the FULL deep search scope (top document + every open
|
|
10
|
+
* shadow root + every same-origin iframe), not just `document`. That is a
|
|
11
|
+
* runtime dependency, not an import-time one — these are plain string
|
|
12
|
+
* templates concatenated at the CDP-expression build site, not real ES
|
|
13
|
+
* modules. Always interpolate `DEEP_QUERY_JS` (from `./deep-query.js`)
|
|
14
|
+
* BEFORE this constant in any expression that calls `genSelectorInfo`.
|
|
15
|
+
*
|
|
16
|
+
* When even a fully-qualified structural path stays ambiguous (two
|
|
17
|
+
* structurally-identical twins in different roots — no CSS syntax can
|
|
18
|
+
* scope to one root), `genSelectorInfo` returns `ambiguous: true` and the
|
|
19
|
+
* snapshot/find builders surface it on the affected entry so agents know
|
|
20
|
+
* that selector resolves first-match-wins and must not be cached.
|
|
21
|
+
*/
|
|
22
|
+
export declare const DOM_HELPERS_JS = "\n function isVisible(el) {\n if (!(el instanceof HTMLElement)) return true;\n const style = getComputedStyle(el);\n if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') return false;\n if (el.offsetParent === null && style.position !== 'fixed') return false;\n return true;\n }\n function shortText(el) {\n const t = (el.innerText || el.textContent || '').trim();\n return t.length > 120 ? t.slice(0, 120) + '...' : t;\n }\n function safeCss(s) {\n return s.replace(/\"/g, '\\\\\"');\n }\n function genSelectorInfo(el) {\n // Uniqueness is verified with deepQueryAll \u2014 an id/testid/aria-label/\n // name that is unique in the top document can still collide with an\n // identically-attributed element inside a shadow root or same-origin\n // iframe, since each root has its own independent attribute namespace.\n if (el.id && !/^[\\d]/.test(el.id) && !/\\s/.test(el.id)) {\n try {\n const candidate = '#' + CSS.escape(el.id);\n if (deepQueryAll(candidate).length === 1) return { selector: candidate, ambiguous: false };\n } catch (_) {}\n }\n const tid = el.getAttribute('data-testid');\n if (tid) {\n const candidate = '[data-testid=\"' + safeCss(tid) + '\"]';\n if (deepQueryAll(candidate).length === 1) return { selector: candidate, ambiguous: false };\n }\n const al = el.getAttribute('aria-label');\n if (al && al.length < 60) {\n const candidate = el.tagName.toLowerCase() + '[aria-label=\"' + safeCss(al) + '\"]';\n if (deepQueryAll(candidate).length === 1) return { selector: candidate, ambiguous: false };\n }\n const name = el.getAttribute('name');\n if (name && (el.tagName === 'INPUT' || el.tagName === 'SELECT' || el.tagName === 'TEXTAREA')) {\n const candidate = el.tagName.toLowerCase() + '[name=\"' + safeCss(name) + '\"]';\n if (deepQueryAll(candidate).length === 1) return { selector: candidate, ambiguous: false };\n }\n // Structural fallback, verified like every shortcut above. The short\n // form (6 parts, indexed only where siblings force it) is preferred\n // for stability; when it matches more than one element across roots,\n // retry with a fully-qualified path (every level :nth-of-type-indexed,\n // climbed all the way to the root boundary).\n const structural = buildStructuralSelector(el, 6, false);\n try {\n if (deepQueryAll(structural).length === 1) return { selector: structural, ambiguous: false };\n } catch (_) {}\n const qualified = buildStructuralSelector(el, 32, true);\n try {\n if (deepQueryAll(qualified).length === 1) return { selector: qualified, ambiguous: false };\n } catch (_) {}\n // Still ambiguous: structurally-identical twins in different roots.\n // No CSS syntax can scope a selector to one shadow root / iframe, so\n // return the most qualified path and flag it \u2014 deepQueryFirst will\n // resolve it first-match-wins (deterministic traversal order), and\n // the flag tells agents not to cache it.\n return { selector: qualified, ambiguous: true };\n }\n function genSelector(el) {\n return genSelectorInfo(el).selector;\n }\n function buildStructuralSelector(el, maxParts, alwaysIndex) {\n // Local-root-scoped structural path: CLIMBING stops at a shadow root or\n // document boundary (parentElement is null for a shadow root's direct\n // children) \u2014 matches how deepQueryAll scopes each root's own\n // querySelectorAll call, so the path resolves back to the same element\n // when re-queried through deepQueryFirst. Sibling lookup for the\n // :nth-of-type qualifier uses parentNode rather than parentElement so a\n // shadow root's own top-level children (parentNode = the ShadowRoot,\n // which still exposes .children) get disambiguated too, even though we\n // do not climb past that boundary. With alwaysIndex, every level gets\n // an explicit :nth-of-type \u2014 maximum qualification for the retry pass.\n const parts = [];\n let cur = el;\n while (cur && cur.nodeType === 1 && cur !== document.body && parts.length < maxParts) {\n let part = cur.tagName.toLowerCase();\n const parentNode = cur.parentNode;\n if (parentNode && parentNode.children) {\n const sib = Array.from(parentNode.children).filter(s => s.tagName === cur.tagName);\n if (sib.length > 1 || alwaysIndex) {\n part += ':nth-of-type(' + (sib.indexOf(cur) + 1) + ')';\n }\n }\n parts.unshift(part);\n cur = cur.parentElement;\n }\n return parts.join(' > ');\n }\n function accessibleText(el) {\n const aria = el.getAttribute && el.getAttribute('aria-label');\n if (aria) return aria;\n const txt = (el.innerText || el.textContent || '').trim();\n if (txt) return txt;\n if ('value' in el && el.value) return String(el.value);\n const ph = el.getAttribute && el.getAttribute('placeholder');\n if (ph) return ph;\n const title = el.getAttribute && el.getAttribute('title');\n if (title) return title;\n return '';\n }\n function frameSelectorFor(el) {\n // Lightweight context field for snapshot/find entries: the selector of\n // the innermost same-origin <iframe> hosting el, or null when el lives\n // in the top document. Computed via genSelector so it benefits from the\n // same deep-uniqueness verification.\n if (el.ownerDocument === document) return null;\n const win = el.ownerDocument && el.ownerDocument.defaultView;\n let fe = null;\n try {\n fe = win && win.frameElement;\n } catch (_) {\n fe = null;\n }\n if (!fe) return null;\n return genSelector(fe);\n }\n";
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared in-page DOM helpers, injected verbatim into any JS template that
|
|
3
|
+
* needs them (`buildSnapshotJs`, `buildFindJs`). Defining them once here
|
|
4
|
+
* keeps the heuristics (visibility, selector generation, accessible text)
|
|
5
|
+
* identical across tools so a selector returned by `snapshot` and a selector
|
|
6
|
+
* returned by `find` follow the same rules.
|
|
7
|
+
*
|
|
8
|
+
* `genSelectorInfo` calls `deepQueryAll` to verify a candidate selector is
|
|
9
|
+
* unique across the FULL deep search scope (top document + every open
|
|
10
|
+
* shadow root + every same-origin iframe), not just `document`. That is a
|
|
11
|
+
* runtime dependency, not an import-time one — these are plain string
|
|
12
|
+
* templates concatenated at the CDP-expression build site, not real ES
|
|
13
|
+
* modules. Always interpolate `DEEP_QUERY_JS` (from `./deep-query.js`)
|
|
14
|
+
* BEFORE this constant in any expression that calls `genSelectorInfo`.
|
|
15
|
+
*
|
|
16
|
+
* When even a fully-qualified structural path stays ambiguous (two
|
|
17
|
+
* structurally-identical twins in different roots — no CSS syntax can
|
|
18
|
+
* scope to one root), `genSelectorInfo` returns `ambiguous: true` and the
|
|
19
|
+
* snapshot/find builders surface it on the affected entry so agents know
|
|
20
|
+
* that selector resolves first-match-wins and must not be cached.
|
|
21
|
+
*/
|
|
22
|
+
export const DOM_HELPERS_JS = `
|
|
23
|
+
function isVisible(el) {
|
|
24
|
+
if (!(el instanceof HTMLElement)) return true;
|
|
25
|
+
const style = getComputedStyle(el);
|
|
26
|
+
if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') return false;
|
|
27
|
+
if (el.offsetParent === null && style.position !== 'fixed') return false;
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
function shortText(el) {
|
|
31
|
+
const t = (el.innerText || el.textContent || '').trim();
|
|
32
|
+
return t.length > 120 ? t.slice(0, 120) + '...' : t;
|
|
33
|
+
}
|
|
34
|
+
function safeCss(s) {
|
|
35
|
+
return s.replace(/"/g, '\\\\"');
|
|
36
|
+
}
|
|
37
|
+
function genSelectorInfo(el) {
|
|
38
|
+
// Uniqueness is verified with deepQueryAll — an id/testid/aria-label/
|
|
39
|
+
// name that is unique in the top document can still collide with an
|
|
40
|
+
// identically-attributed element inside a shadow root or same-origin
|
|
41
|
+
// iframe, since each root has its own independent attribute namespace.
|
|
42
|
+
if (el.id && !/^[\\d]/.test(el.id) && !/\\s/.test(el.id)) {
|
|
43
|
+
try {
|
|
44
|
+
const candidate = '#' + CSS.escape(el.id);
|
|
45
|
+
if (deepQueryAll(candidate).length === 1) return { selector: candidate, ambiguous: false };
|
|
46
|
+
} catch (_) {}
|
|
47
|
+
}
|
|
48
|
+
const tid = el.getAttribute('data-testid');
|
|
49
|
+
if (tid) {
|
|
50
|
+
const candidate = '[data-testid="' + safeCss(tid) + '"]';
|
|
51
|
+
if (deepQueryAll(candidate).length === 1) return { selector: candidate, ambiguous: false };
|
|
52
|
+
}
|
|
53
|
+
const al = el.getAttribute('aria-label');
|
|
54
|
+
if (al && al.length < 60) {
|
|
55
|
+
const candidate = el.tagName.toLowerCase() + '[aria-label="' + safeCss(al) + '"]';
|
|
56
|
+
if (deepQueryAll(candidate).length === 1) return { selector: candidate, ambiguous: false };
|
|
57
|
+
}
|
|
58
|
+
const name = el.getAttribute('name');
|
|
59
|
+
if (name && (el.tagName === 'INPUT' || el.tagName === 'SELECT' || el.tagName === 'TEXTAREA')) {
|
|
60
|
+
const candidate = el.tagName.toLowerCase() + '[name="' + safeCss(name) + '"]';
|
|
61
|
+
if (deepQueryAll(candidate).length === 1) return { selector: candidate, ambiguous: false };
|
|
62
|
+
}
|
|
63
|
+
// Structural fallback, verified like every shortcut above. The short
|
|
64
|
+
// form (6 parts, indexed only where siblings force it) is preferred
|
|
65
|
+
// for stability; when it matches more than one element across roots,
|
|
66
|
+
// retry with a fully-qualified path (every level :nth-of-type-indexed,
|
|
67
|
+
// climbed all the way to the root boundary).
|
|
68
|
+
const structural = buildStructuralSelector(el, 6, false);
|
|
69
|
+
try {
|
|
70
|
+
if (deepQueryAll(structural).length === 1) return { selector: structural, ambiguous: false };
|
|
71
|
+
} catch (_) {}
|
|
72
|
+
const qualified = buildStructuralSelector(el, 32, true);
|
|
73
|
+
try {
|
|
74
|
+
if (deepQueryAll(qualified).length === 1) return { selector: qualified, ambiguous: false };
|
|
75
|
+
} catch (_) {}
|
|
76
|
+
// Still ambiguous: structurally-identical twins in different roots.
|
|
77
|
+
// No CSS syntax can scope a selector to one shadow root / iframe, so
|
|
78
|
+
// return the most qualified path and flag it — deepQueryFirst will
|
|
79
|
+
// resolve it first-match-wins (deterministic traversal order), and
|
|
80
|
+
// the flag tells agents not to cache it.
|
|
81
|
+
return { selector: qualified, ambiguous: true };
|
|
82
|
+
}
|
|
83
|
+
function genSelector(el) {
|
|
84
|
+
return genSelectorInfo(el).selector;
|
|
85
|
+
}
|
|
86
|
+
function buildStructuralSelector(el, maxParts, alwaysIndex) {
|
|
87
|
+
// Local-root-scoped structural path: CLIMBING stops at a shadow root or
|
|
88
|
+
// document boundary (parentElement is null for a shadow root's direct
|
|
89
|
+
// children) — matches how deepQueryAll scopes each root's own
|
|
90
|
+
// querySelectorAll call, so the path resolves back to the same element
|
|
91
|
+
// when re-queried through deepQueryFirst. Sibling lookup for the
|
|
92
|
+
// :nth-of-type qualifier uses parentNode rather than parentElement so a
|
|
93
|
+
// shadow root's own top-level children (parentNode = the ShadowRoot,
|
|
94
|
+
// which still exposes .children) get disambiguated too, even though we
|
|
95
|
+
// do not climb past that boundary. With alwaysIndex, every level gets
|
|
96
|
+
// an explicit :nth-of-type — maximum qualification for the retry pass.
|
|
97
|
+
const parts = [];
|
|
98
|
+
let cur = el;
|
|
99
|
+
while (cur && cur.nodeType === 1 && cur !== document.body && parts.length < maxParts) {
|
|
100
|
+
let part = cur.tagName.toLowerCase();
|
|
101
|
+
const parentNode = cur.parentNode;
|
|
102
|
+
if (parentNode && parentNode.children) {
|
|
103
|
+
const sib = Array.from(parentNode.children).filter(s => s.tagName === cur.tagName);
|
|
104
|
+
if (sib.length > 1 || alwaysIndex) {
|
|
105
|
+
part += ':nth-of-type(' + (sib.indexOf(cur) + 1) + ')';
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
parts.unshift(part);
|
|
109
|
+
cur = cur.parentElement;
|
|
110
|
+
}
|
|
111
|
+
return parts.join(' > ');
|
|
112
|
+
}
|
|
113
|
+
function accessibleText(el) {
|
|
114
|
+
const aria = el.getAttribute && el.getAttribute('aria-label');
|
|
115
|
+
if (aria) return aria;
|
|
116
|
+
const txt = (el.innerText || el.textContent || '').trim();
|
|
117
|
+
if (txt) return txt;
|
|
118
|
+
if ('value' in el && el.value) return String(el.value);
|
|
119
|
+
const ph = el.getAttribute && el.getAttribute('placeholder');
|
|
120
|
+
if (ph) return ph;
|
|
121
|
+
const title = el.getAttribute && el.getAttribute('title');
|
|
122
|
+
if (title) return title;
|
|
123
|
+
return '';
|
|
124
|
+
}
|
|
125
|
+
function frameSelectorFor(el) {
|
|
126
|
+
// Lightweight context field for snapshot/find entries: the selector of
|
|
127
|
+
// the innermost same-origin <iframe> hosting el, or null when el lives
|
|
128
|
+
// in the top document. Computed via genSelector so it benefits from the
|
|
129
|
+
// same deep-uniqueness verification.
|
|
130
|
+
if (el.ownerDocument === document) return null;
|
|
131
|
+
const win = el.ownerDocument && el.ownerDocument.defaultView;
|
|
132
|
+
let fe = null;
|
|
133
|
+
try {
|
|
134
|
+
fe = win && win.frameElement;
|
|
135
|
+
} catch (_) {
|
|
136
|
+
fe = null;
|
|
137
|
+
}
|
|
138
|
+
if (!fe) return null;
|
|
139
|
+
return genSelector(fe);
|
|
140
|
+
}
|
|
141
|
+
`;
|
|
142
|
+
//# sourceMappingURL=dom-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom-helpers.js","sourceRoot":"","sources":["../../src/inpage/dom-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuH7B,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifest_version": 3,
|
|
3
3
|
"name": "browser-link",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.15.0",
|
|
5
5
|
"description": "Bridge between Chrome and an MCP client (Claude Code, OpenCode, GitHub Copilot CLI, …). Per-tab manual activation.",
|
|
6
6
|
"permissions": [
|
|
7
7
|
"debugger",
|
|
@@ -130,7 +130,7 @@ export const BROWSER_TOOL_DEFINITIONS = [
|
|
|
130
130
|
},
|
|
131
131
|
{
|
|
132
132
|
name: 'browser.snapshot',
|
|
133
|
-
description: 'Snapshot of the tab: title, url, visible text (truncated) and a list of interactive elements (buttons, links, inputs, selects, textareas) with a CSS selector and labels. Use this to understand page state before clicking or typing. Optional filters keep the response small: `within_selector` restricts the scan to a subtree; `only_interactive` skips headings and the text dump; `exclude` drops landmarks like nav/footer; `max_interactive` overrides the default cap of 120. The per-entry serializer omits empty-string fields, so the same call returns a leaner payload than before — no behavior change for clients that read by key.',
|
|
133
|
+
description: 'Snapshot of the tab: title, url, visible text (truncated) and a list of interactive elements (buttons, links, inputs, selects, textareas) with a CSS selector and labels. Use this to understand page state before clicking or typing. The scan pierces OPEN Shadow DOM roots and same-origin iframes (nested arbitrarily) — a web component internal or an in-page iframe shows up without extra steps. An entry for an element living inside an iframe carries an extra `frame` field (the CSS selector of the innermost hosting iframe) so you know it is framed; entries in the top document or in Shadow DOM omit it. An entry whose selector could not be made unique across all roots (structurally-identical component twins) carries `ambiguous: true` — that selector resolves first-match-wins, so use it immediately and do NOT store it in the persistent map. Optional filters keep the response small: `within_selector` restricts the scan to a subtree (also deep-search-aware — it can target a subtree inside a shadow root or iframe); `only_interactive` skips headings and the text dump; `exclude` drops landmarks like nav/footer; `max_interactive` overrides the default cap of 120. The per-entry serializer omits empty-string fields, so the same call returns a leaner payload than before — no behavior change for clients that read by key.',
|
|
134
134
|
inputSchema: {
|
|
135
135
|
type: 'object',
|
|
136
136
|
properties: {
|
|
@@ -168,13 +168,15 @@ export const BROWSER_TOOL_DEFINITIONS = [
|
|
|
168
168
|
'The snapshot is the source of truth; the persistent map is a cache, not a substitute.',
|
|
169
169
|
'Filters are applied in-page, so the dropped material never travels back — they are a token win, not a post-filter.',
|
|
170
170
|
'Empty-string fields (`placeholder`, `aria_label`, etc.) are omitted from each entry. Read by key with optional-chaining or fall back to "".',
|
|
171
|
+
'CLOSED shadow roots (attachShadow({mode:"closed"})) are unreachable from any CDP-based tool — there is no workaround. Cross-origin iframes are also unreachable (same-origin policy); their content is invisible to this scan.',
|
|
172
|
+
'Two structurally-identical component instances in different roots (e.g. twin web components with byte-identical internals) cannot be told apart by any CSS selector — no syntax scopes a selector to one shadow root. Affected entries carry `ambiguous: true`; their selector resolves to the FIRST match in a deterministic traversal order. Use it right away, never cache it.',
|
|
171
173
|
],
|
|
172
174
|
example: 'browser.snapshot({ tab_id: "tab_1", within_selector: "main", exclude: ["nav", "footer"] })',
|
|
173
175
|
},
|
|
174
176
|
},
|
|
175
177
|
{
|
|
176
178
|
name: 'browser.find',
|
|
177
|
-
description: 'Locate ONE interactive element by its visible text and return a stable selector plus viewport coordinates. The match is case-insensitive substring by default (set `exact:true` for full-string equality). Pass `role` to narrow to a specific ARIA role (`button`, `link`, `textbox`, `checkbox`, `tab`, `menuitem`) — without it the scan covers buttons, links, inputs, role-bearing elements, contenteditable nodes, and `[onclick]` divs (the "peruvian markup" case). Returns `{ matched: true, selector, coords:{x,y}, tag, text }` on a unique hit, `{ matched: false, reason: "not-found" }` when nothing matches, or `{ matched: false, reason: "multiple-matches", candidates: [{selector, text, tag}] }` (up to 5) when several elements match — pick one and try again with `exact:true` or a longer text. The returned `selector` uses the same heuristic as `browser.snapshot` (id → data-testid → aria-label → name → positional fallback), so a subsequent `browser.click` / `browser.type` works without re-querying.',
|
|
179
|
+
description: 'Locate ONE interactive element by its visible text and return a stable selector plus viewport coordinates. The match is case-insensitive substring by default (set `exact:true` for full-string equality). Pass `role` to narrow to a specific ARIA role (`button`, `link`, `textbox`, `checkbox`, `tab`, `menuitem`) — without it the scan covers buttons, links, inputs, role-bearing elements, contenteditable nodes, and `[onclick]` divs (the "peruvian markup" case). The scan pierces OPEN Shadow DOM roots and same-origin iframes, same as browser.snapshot. Returns `{ matched: true, selector, coords:{x,y}, tag, text, frame?, ambiguous? }` on a unique hit, `{ matched: false, reason: "not-found" }` when nothing matches, or `{ matched: false, reason: "multiple-matches", candidates: [{selector, text, tag}] }` (up to 5) when several elements match — pick one and try again with `exact:true` or a longer text. `frame`, when present, is the CSS selector of the innermost iframe hosting the match. `ambiguous: true`, when present, means the selector could not be made unique across all roots (structurally-identical twins) and resolves first-match-wins — use it immediately, never cache it. `coords` are already mapped to TOP-LEVEL viewport coordinates even when the match lives inside an iframe. The returned `selector` uses the same heuristic as `browser.snapshot` (id → data-testid → aria-label → name → positional fallback, each verified unique across the full deep search scope), so a subsequent `browser.click` / `browser.type` works without re-querying.',
|
|
178
180
|
inputSchema: {
|
|
179
181
|
type: 'object',
|
|
180
182
|
properties: {
|
|
@@ -207,6 +209,8 @@ export const BROWSER_TOOL_DEFINITIONS = [
|
|
|
207
209
|
'A `<div onclick>` IS considered clickable here — the broad selector set (`[onclick]`, `[role]`, `[tabindex]`, `[contenteditable]`) is the whole point. A naive `querySelectorAll("button")` misses these silently.',
|
|
208
210
|
'On `multiple-matches`, the response includes up to 5 candidates with their selectors and snippets so the agent can disambiguate without another round-trip. Retry with `exact:true` or a longer/unique substring.',
|
|
209
211
|
'`coords` are viewport-relative at the moment of the call. If the page reflows between `find` and `click`, the selector is the durable identifier — prefer it over coords.',
|
|
212
|
+
'CLOSED shadow roots and cross-origin iframes are unreachable, same as browser.snapshot.',
|
|
213
|
+
'A result with `ambiguous: true` names an element whose generated selector matches structurally-identical twins in other roots. It still works (first-match-wins, deterministic order) but must be used immediately and never saved to the persistent map.',
|
|
210
214
|
],
|
|
211
215
|
example: 'browser.find({ tab_id: "tab_1", text: "Save changes", role: "button" })',
|
|
212
216
|
},
|
|
@@ -499,12 +503,17 @@ export const BROWSER_TOOL_DEFINITIONS = [
|
|
|
499
503
|
},
|
|
500
504
|
{
|
|
501
505
|
name: 'browser.click',
|
|
502
|
-
description: 'Click an element by CSS selector in the connected tab. The selector usually comes from browser.snapshot.',
|
|
506
|
+
description: 'Click an element by CSS selector in the connected tab. The selector usually comes from browser.snapshot or browser.find. The lookup pierces open Shadow DOM roots and same-origin iframes (nested arbitrarily), so a selector for a web-component internal or an in-page iframe works without extra steps. Before dispatching the click, the element is hit-tested at its own click point (starting from its own shadow root / iframe document) — if a different element covers that point, the call returns ok:false with a description of the blocker instead of clicking the wrong thing blindly. Pass `force:true` to skip that guard.',
|
|
503
507
|
inputSchema: {
|
|
504
508
|
type: 'object',
|
|
505
509
|
properties: {
|
|
506
510
|
tab_id: { type: 'string' },
|
|
507
511
|
selector: { type: 'string' },
|
|
512
|
+
force: {
|
|
513
|
+
type: 'boolean',
|
|
514
|
+
default: false,
|
|
515
|
+
description: 'Skip the occlusion guard and dispatch the click even if another element currently covers the click point. Escape hatch for cases where the "covering" element is intentional (e.g. a transparent hit-target layer) or the guard produces a false positive. Default false.',
|
|
516
|
+
},
|
|
508
517
|
},
|
|
509
518
|
required: ['tab_id', 'selector'],
|
|
510
519
|
additionalProperties: false,
|
|
@@ -517,12 +526,14 @@ export const BROWSER_TOOL_DEFINITIONS = [
|
|
|
517
526
|
gotchas: [
|
|
518
527
|
'Never click a selector you have not just verified via browser.snapshot or browser.map.recall — speculating wastes a turn.',
|
|
519
528
|
'Auto-claims the tab on first use in multi-agent mode.',
|
|
529
|
+
'ok:false with an "Element covered by …" error means something else is on top of the target at click time (a modal backdrop, a loading overlay, a dropdown). Click or dismiss the covering element first, or re-snapshot — do not blindly retry with force:true.',
|
|
530
|
+
'CLOSED shadow roots (attachShadow({mode:"closed"})) are unreachable — there is no CDP-level workaround. Cross-origin iframes are also unreachable (same-origin policy).',
|
|
520
531
|
],
|
|
521
532
|
},
|
|
522
533
|
},
|
|
523
534
|
{
|
|
524
535
|
name: 'browser.type',
|
|
525
|
-
description: 'Focus an input by CSS selector and type text into it. If clear=true, clears the current value first.',
|
|
536
|
+
description: 'Focus an input by CSS selector and type text into it. If clear=true, clears the current value first. The lookup pierces open Shadow DOM roots and same-origin iframes, same as browser.click.',
|
|
526
537
|
inputSchema: {
|
|
527
538
|
type: 'object',
|
|
528
539
|
properties: {
|
|
@@ -541,6 +552,7 @@ export const BROWSER_TOOL_DEFINITIONS = [
|
|
|
541
552
|
],
|
|
542
553
|
gotchas: [
|
|
543
554
|
'Pass clear:true when you need to replace the current value instead of appending to it.',
|
|
555
|
+
'CLOSED shadow roots and cross-origin iframes are unreachable, same as browser.click.',
|
|
544
556
|
],
|
|
545
557
|
},
|
|
546
558
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-definitions.js","sourceRoot":"","sources":["../../src/tools/browser-definitions.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"browser-definitions.js","sourceRoot":"","sources":["../../src/tools/browser-definitions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,MAAM,CAAC,MAAM,wBAAwB,GAAqB;IACxD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,0VAA0V;QAC5V,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE;QAC5E,GAAG,EAAE;YACH,OAAO,EACL,kGAAkG;YACpG,WAAW,EAAE;gBACX,oEAAoE;gBACpE,qFAAqF;gBACrF,iGAAiG;aAClG;YACD,OAAO,EAAE;gBACP,yJAAyJ;aAC1J;SACF;KACF;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,ggBAAggB;QAClgB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,yEAAyE;iBACvF;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,6JAA6J;iBAChK;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;YACpB,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EACL,uFAAuF;YACzF,WAAW,EAAE;gBACX,+FAA+F;gBAC/F,sFAAsF;aACvF;YACD,OAAO,EAAE;gBACP,+IAA+I;gBAC/I,qIAAqI;aACtI;YACD,OAAO,EAAE,+EAA+E;SACzF;KACF;IACD;QACE,IAAI,EAAE,qBAAqB;QAC3B,WAAW,EACT,0TAA0T;QAC5T,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YAC1C,QAAQ,EAAE,CAAC,QAAQ,CAAC;YACpB,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EAAE,kEAAkE;YAC3E,WAAW,EAAE;gBACX,qFAAqF;aACtF;YACD,OAAO,EAAE;gBACP,+IAA+I;aAChJ;SACF;KACF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,4NAA4N;QAC9N,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE;QAC5E,GAAG,EAAE;YACH,OAAO,EAAE,yEAAyE;YAClF,WAAW,EAAE;gBACX,8FAA8F;gBAC9F,+EAA+E;aAChF;SACF;KACF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EAAE,gEAAgE;QAC7E,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YAC1C,QAAQ,EAAE,CAAC,QAAQ,CAAC;YACpB,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EAAE,8EAA8E;YACvF,WAAW,EAAE,CAAC,4EAA4E,CAAC;SAC5F;KACF;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EAAE,2EAA2E;QACxF,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;gBACpE,aAAa,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE;aAClD;YACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;YAC3B,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EAAE,qCAAqC;YAC9C,WAAW,EAAE;gBACX,iGAAiG;gBACjG,wEAAwE;aACzE;YACD,OAAO,EAAE;gBACP,wFAAwF;aACzF;YACD,OAAO,EAAE,mEAAmE;SAC7E;KACF;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,6yCAA6yC;QAC/yC,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,eAAe,EAAE;oBACf,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,oLAAoL;iBACvL;gBACD,gBAAgB,EAAE;oBAChB,IAAI,EAAE,SAAS;oBACf,WAAW,EACT,4IAA4I;iBAC/I;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE;oBACrE,WAAW,EACT,0KAA0K;iBAC7K;gBACD,eAAe,EAAE;oBACf,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,mFAAmF;iBACtF;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;YACpB,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EACL,uJAAuJ;YACzJ,WAAW,EAAE;gBACX,mGAAmG;gBACnG,8EAA8E;gBAC9E,oHAAoH;gBACpH,oGAAoG;aACrG;YACD,OAAO,EAAE;gBACP,uFAAuF;gBACvF,oHAAoH;gBACpH,6IAA6I;gBAC7I,gOAAgO;gBAChO,mXAAmX;aACpX;YACD,OAAO,EACL,4FAA4F;SAC/F;KACF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,ghDAAghD;QAClhD,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,0KAA0K;iBAC7K;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC;oBAClE,WAAW,EACT,+HAA+H;iBAClI;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,SAAS;oBACf,WAAW,EACT,kGAAkG;iBACrG;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;YAC5B,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EACL,0GAA0G;YAC5G,WAAW,EAAE;gBACX,qIAAqI;gBACrI,wMAAwM;gBACxM,0OAA0O;aAC3O;YACD,OAAO,EAAE;gBACP,oNAAoN;gBACpN,mNAAmN;gBACnN,2KAA2K;gBAC3K,yFAAyF;gBACzF,2PAA2P;aAC5P;YACD,OAAO,EAAE,yEAAyE;SACnF;KACF;IACD;QACE,IAAI,EAAE,2BAA2B;QACjC,WAAW,EACT,47BAA47B;QAC97B,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,mWAAmW;iBACtW;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;wBACrB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;qBACtB;oBACD,QAAQ,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;oBAC9B,oBAAoB,EAAE,KAAK;oBAC3B,WAAW,EACT,6OAA6O;iBAChP;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC;oBACrB,WAAW,EACT,yLAAyL;iBAC5L;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;YACpB,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EACL,2KAA2K;YAC7K,WAAW,EAAE;gBACX,+KAA+K;gBAC/K,kIAAkI;gBAClI,yKAAyK;aAC1K;YACD,OAAO,EAAE;gBACP,mQAAmQ;gBACnQ,0SAA0S;gBAC1S,0MAA0M;gBAC1M,oNAAoN;aACrN;YACD,OAAO,EACL,yFAAyF;SAC5F;KACF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,kIAAkI;QACpI,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE;aAC3E;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;YACpB,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EAAE,4EAA4E;YACrF,WAAW,EAAE;gBACX,sGAAsG;gBACtG,0DAA0D;aAC3D;YACD,OAAO,EAAE;gBACP,0GAA0G;aAC3G;SACF;KACF;IACD;QACE,IAAI,EAAE,iBAAiB;QACvB,WAAW,EACT,mNAAmN;QACrN,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4CAA4C,EAAE;aAC1F;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;YACpB,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EAAE,kEAAkE;YAC3E,WAAW,EAAE;gBACX,2FAA2F;gBAC3F,qEAAqE;aACtE;YACD,OAAO,EAAE;gBACP,4EAA4E;gBAC5E,iFAAiF;aAClF;SACF;KACF;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EACT,2FAA2F;QAC7F,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC/B;YACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;YAClC,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EAAE,yEAAyE;YAClF,WAAW,EAAE;gBACX,6FAA6F;aAC9F;SACF;KACF;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,0qBAA0qB;QAC5qB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,uFAAuF;iBAC1F;gBACD,SAAS,EAAE;oBACT,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,CAAC;oBACnD,WAAW,EACT,2JAA2J;iBAC9J;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,qJAAqJ;iBACxJ;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,0NAA0N;iBAC7N;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,2IAA2I;iBAC9I;gBACD,gBAAgB,EAAE;oBAChB,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,gEAAgE;iBAC9E;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;YACpB,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EACL,4GAA4G;YAC9G,WAAW,EAAE;gBACX,0HAA0H;gBAC1H,4EAA4E;gBAC5E,0GAA0G;aAC3G;YACD,OAAO,EAAE;gBACP,mHAAmH;gBACnH,gJAAgJ;gBAChJ,0MAA0M;aAC3M;YACD,OAAO,EACL,iHAAiH;SACpH;KACF;IACD;QACE,IAAI,EAAE,sBAAsB;QAC5B,WAAW,EACT,szBAAszB;QACxzB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,oKAAoK;iBACvK;gBACD,aAAa,EAAE;oBACb,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,qIAAqI;iBACxI;gBACD,UAAU,EAAE;oBACV,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,iDAAiD;iBAC/D;aACF;YACD,QAAQ,EAAE,CAAC,aAAa,CAAC;YACzB,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EACL,kIAAkI;YACpI,WAAW,EAAE;gBACX,yFAAyF;gBACzF,qEAAqE;aACtE;YACD,OAAO,EAAE;gBACP,0IAA0I;gBAC1I,6MAA6M;gBAC7M,oHAAoH;gBACpH,gaAAga;aACja;YACD,OAAO,EACL,4FAA4F;SAC/F;KACF;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EACT,mqBAAmqB;QACrqB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,MAAM,EAAE;oBACN,IAAI,EAAE,SAAS;oBACf,WAAW,EACT,iFAAiF;iBACpF;gBACD,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,qGAAqG;iBACxG;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;YAC9B,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EACL,qJAAqJ;YACvJ,WAAW,EAAE;gBACX,qGAAqG;gBACrG,6GAA6G;aAC9G;YACD,OAAO,EAAE;gBACP,sHAAsH;gBACtH,+IAA+I;gBAC/I,kFAAkF;aACnF;YACD,OAAO,EAAE,iFAAiF;SAC3F;KACF;IACD;QACE,IAAI,EAAE,wBAAwB;QAC9B,WAAW,EACT,kjBAAkjB;QACpjB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,kIAAkI;iBACrI;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,kJAAkJ;iBACrJ;gBACD,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE;wBACJ,aAAa;wBACb,eAAe;wBACf,QAAQ;wBACR,YAAY;wBACZ,oBAAoB;wBACpB,yBAAyB;wBACzB,SAAS;qBACV;oBACD,WAAW,EACT,kQAAkQ;iBACrQ;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,IAAI,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC;oBACrC,WAAW,EACT,mNAAmN;iBACtN;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC;YAC/C,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EACL,2GAA2G;YAC7G,WAAW,EAAE;gBACX,8KAA8K;gBAC9K,8GAA8G;aAC/G;YACD,OAAO,EAAE;gBACP,iKAAiK;gBACjK,8LAA8L;gBAC9L,8KAA8K;gBAC9K,2GAA2G;aAC5G;YACD,OAAO,EACL,wHAAwH;SAC3H;KACF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,4mBAA4mB;QAC9mB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC5B,KAAK,EAAE;oBACL,IAAI,EAAE,SAAS;oBACf,OAAO,EAAE,KAAK;oBACd,WAAW,EACT,2QAA2Q;iBAC9Q;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;YAChC,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EAAE,gDAAgD;YACzD,WAAW,EAAE;gBACX,iGAAiG;aAClG;YACD,OAAO,EAAE;gBACP,2HAA2H;gBAC3H,uDAAuD;gBACvD,iQAAiQ;gBACjQ,yKAAyK;aAC1K;SACF;KACF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,+LAA+L;QACjM,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC5B,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACxB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;aAC3C;YACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC;YACxC,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EAAE,2DAA2D;YACpE,WAAW,EAAE;gBACX,iFAAiF;aAClF;YACD,OAAO,EAAE;gBACP,wFAAwF;gBACxF,sFAAsF;aACvF;SACF;KACF;IACD;QACE,IAAI,EAAE,cAAc;QACpB,WAAW,EACT,6zBAA6zB;QAC/zB,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,aAAa,EAAE;oBACb,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,4EAA4E;iBAC1F;gBACD,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,sGAAsG;iBACzG;gBACD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,iCAAiC,EAAE;gBAC1E,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,6EAA6E;iBAChF;gBACD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE;gBAC7E,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sCAAsC,EAAE;gBAC7E,WAAW,EAAE;oBACX,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,2IAA2I;iBAC9I;gBACD,mBAAmB,EAAE;oBACnB,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,oIAAoI;iBACvI;gBACD,sBAAsB,EAAE;oBACtB,IAAI,EAAE,QAAQ;oBACd,WAAW,EACT,oHAAoH;iBACvH;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,CAAC;YACpB,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EACL,0FAA0F;YAC5F,WAAW,EAAE;gBACX,wFAAwF;gBACxF,gFAAgF;gBAChF,2EAA2E;aAC5E;YACD,OAAO,EAAE;gBACP,oLAAoL;gBACpL,mKAAmK;gBACnK,0JAA0J;aAC3J;YACD,OAAO,EACL,oHAAoH;SACvH;KACF;IACD;QACE,IAAI,EAAE,kBAAkB;QACxB,WAAW,EACT,8HAA8H;QAChI,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBAC1B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;aAC/B;YACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,YAAY,CAAC;YAClC,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EAAE,mEAAmE;YAC5E,WAAW,EAAE;gBACX,8HAA8H;aAC/H;YACD,OAAO,EAAE,CAAC,mEAAmE,CAAC;SAC/E;KACF;IACD;QACE,IAAI,EAAE,gBAAgB;QACtB,WAAW,EACT,ibAAib;QACnb,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2EAA2E;iBACzF;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,2DAA2D;iBACzE;aACF;YACD,oBAAoB,EAAE,KAAK;SAC5B;QACD,GAAG,EAAE;YACH,OAAO,EACL,sFAAsF;YACxF,WAAW,EAAE;gBACX,wGAAwG;gBACxG,kDAAkD;aACnD;YACD,OAAO,EAAE;gBACP,4FAA4F;aAC7F;SACF;KACF;IACD;QACE,IAAI,EAAE,eAAe;QACrB,WAAW,EACT,ydAAyd;QAC3d,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE;QAC5E,GAAG,EAAE;YACH,OAAO,EACL,2FAA2F;YAC7F,WAAW,EAAE;gBACX,gGAAgG;gBAChG,4FAA4F;aAC7F;YACD,OAAO,EAAE;gBACP,uHAAuH;gBACvH,sHAAsH;aACvH;SACF;KACF;CACF,CAAC"}
|