@juxtapose/core 0.4.0 → 0.5.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/handoff.d.ts +8 -1
- package/dist/agent/handoff.js +75 -7
- package/dist/agent/handoff.js.map +1 -1
- package/dist/analysis/affected.d.ts +37 -0
- package/dist/analysis/affected.js +97 -22
- package/dist/analysis/affected.js.map +1 -1
- package/dist/analysis/cause.d.ts +32 -0
- package/dist/analysis/cause.js +187 -0
- package/dist/analysis/cause.js.map +1 -0
- package/dist/baseline/approve.d.ts +24 -0
- package/dist/baseline/approve.js +54 -0
- package/dist/baseline/approve.js.map +1 -0
- package/dist/baseline/git-store.d.ts +4 -0
- package/dist/baseline/git-store.js +22 -0
- package/dist/baseline/git-store.js.map +1 -1
- package/dist/browser/acquire.d.ts +11 -0
- package/dist/browser/acquire.js +15 -0
- package/dist/browser/acquire.js.map +1 -0
- package/dist/browser/browser.d.ts +53 -0
- package/dist/browser/browser.js +122 -0
- package/dist/browser/browser.js.map +1 -0
- package/dist/browser/cdp.d.ts +81 -0
- package/dist/browser/cdp.js +230 -0
- package/dist/browser/cdp.js.map +1 -0
- package/dist/browser/index.d.ts +9 -0
- package/dist/browser/index.js +10 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/browser/install.d.ts +33 -0
- package/dist/browser/install.js +167 -0
- package/dist/browser/install.js.map +1 -0
- package/dist/browser/launch.d.ts +37 -0
- package/dist/browser/launch.js +265 -0
- package/dist/browser/launch.js.map +1 -0
- package/dist/browser/page.d.ts +125 -0
- package/dist/browser/page.js +564 -0
- package/dist/browser/page.js.map +1 -0
- package/dist/browser/pins.d.ts +12 -0
- package/dist/browser/pins.js +57 -0
- package/dist/browser/pins.js.map +1 -0
- package/dist/browser/resolve.d.ts +25 -0
- package/dist/browser/resolve.js +115 -0
- package/dist/browser/resolve.js.map +1 -0
- package/dist/browser/selectors.d.ts +10 -0
- package/dist/browser/selectors.js +60 -0
- package/dist/browser/selectors.js.map +1 -0
- package/dist/browser/transport.d.ts +39 -0
- package/dist/browser/transport.js +99 -0
- package/dist/browser/transport.js.map +1 -0
- package/dist/browser/zip.d.ts +27 -0
- package/dist/browser/zip.js +241 -0
- package/dist/browser/zip.js.map +1 -0
- package/dist/capture/capture.d.ts +7 -1
- package/dist/capture/capture.js +25 -8
- package/dist/capture/capture.js.map +1 -1
- package/dist/capture/env.d.ts +1 -1
- package/dist/capture/launch.d.ts +19 -1
- package/dist/capture/launch.js +91 -1
- package/dist/capture/launch.js.map +1 -1
- package/dist/capture/pool.d.ts +1 -1
- package/dist/capture/pool.js +41 -8
- package/dist/capture/pool.js.map +1 -1
- package/dist/capture/settle.d.ts +1 -1
- package/dist/capture/settle.js +2 -0
- package/dist/capture/settle.js.map +1 -1
- package/dist/capture/snap.d.ts +43 -0
- package/dist/capture/snap.js +103 -0
- package/dist/capture/snap.js.map +1 -0
- package/dist/capture/structure.d.ts +77 -0
- package/dist/capture/structure.js +498 -0
- package/dist/capture/structure.js.map +1 -0
- package/dist/diff/compare.d.ts +19 -0
- package/dist/diff/compare.js +19 -0
- package/dist/diff/compare.js.map +1 -0
- package/dist/diff/crops.d.ts +26 -0
- package/dist/diff/crops.js +92 -0
- package/dist/diff/crops.js.map +1 -0
- package/dist/diff/structural/classify.d.ts +29 -0
- package/dist/diff/structural/classify.js +113 -0
- package/dist/diff/structural/classify.js.map +1 -0
- package/dist/diff/structural/coverage.d.ts +11 -0
- package/dist/diff/structural/coverage.js +37 -0
- package/dist/diff/structural/coverage.js.map +1 -0
- package/dist/diff/structural/deltas.d.ts +29 -0
- package/dist/diff/structural/deltas.js +218 -0
- package/dist/diff/structural/deltas.js.map +1 -0
- package/dist/diff/structural/disambiguate.d.ts +3 -0
- package/dist/diff/structural/disambiguate.js +89 -0
- package/dist/diff/structural/disambiguate.js.map +1 -0
- package/dist/diff/structural/label.d.ts +15 -0
- package/dist/diff/structural/label.js +64 -0
- package/dist/diff/structural/label.js.map +1 -0
- package/dist/diff/structural/match.d.ts +13 -0
- package/dist/diff/structural/match.js +135 -0
- package/dist/diff/structural/match.js.map +1 -0
- package/dist/diff/structural/shift.d.ts +2 -0
- package/dist/diff/structural/shift.js +144 -0
- package/dist/diff/structural/shift.js.map +1 -0
- package/dist/diff/structural/summary.d.ts +31 -0
- package/dist/diff/structural/summary.js +420 -0
- package/dist/diff/structural/summary.js.map +1 -0
- package/dist/diff/structural.d.ts +40 -0
- package/dist/diff/structural.js +219 -0
- package/dist/diff/structural.js.map +1 -0
- package/dist/index.d.ts +25 -3
- package/dist/index.js +29 -2
- package/dist/index.js.map +1 -1
- package/dist/platform.d.ts +1 -1
- package/dist/platforms/urls.d.ts +3 -0
- package/dist/platforms/urls.js +89 -0
- package/dist/platforms/urls.js.map +1 -0
- package/dist/report/comment.js +9 -3
- package/dist/report/comment.js.map +1 -1
- package/dist/report/format.d.ts +18 -0
- package/dist/report/format.js +20 -0
- package/dist/report/format.js.map +1 -1
- package/dist/report/html.js +2 -2
- package/dist/report/html.js.map +1 -1
- package/dist/run/groups.d.ts +2 -0
- package/dist/run/groups.js +45 -0
- package/dist/run/groups.js.map +1 -0
- package/dist/run/run.d.ts +6 -2
- package/dist/run/run.js +74 -6
- package/dist/run/run.js.map +1 -1
- package/dist/shell-quote.d.ts +2 -0
- package/dist/shell-quote.js +10 -0
- package/dist/shell-quote.js.map +1 -0
- package/dist/types.d.ts +199 -1
- package/dist/url-platform.d.ts +2 -2
- package/dist/url-platform.js +2 -2
- package/dist/url-platform.js.map +1 -1
- package/package.json +5 -10
|
@@ -0,0 +1,564 @@
|
|
|
1
|
+
// packages/core/src/browser/page.ts
|
|
2
|
+
//
|
|
3
|
+
// One target, one flattened session. The init sequence is exactly what the
|
|
4
|
+
// byte-identity spike sent (spec §Decisions 3) — no more: Target.setAutoAttach
|
|
5
|
+
// without its handler pauses every worker and cross-origin iframe forever,
|
|
6
|
+
// and the geolocation/file-chooser overrides are things Playwright only
|
|
7
|
+
// sends when asked. The screenshot is a verbatim port of
|
|
8
|
+
// Screenshotter.screenshotPage (coreBundle.js L21258–21370).
|
|
9
|
+
import { CdpConnection, CdpError, TargetClosedError } from './cdp.js';
|
|
10
|
+
import { assertCssSelector, QUERY_ALL_SOURCE, queryAllExpression } from './selectors.js';
|
|
11
|
+
export class TimeoutError extends Error {
|
|
12
|
+
constructor(message) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.name = 'TimeoutError';
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
/** The renderer died (OOM, Page.crash, a GPU fault); the page cannot be used again. */
|
|
18
|
+
export class PageCrashedError extends Error {
|
|
19
|
+
constructor() {
|
|
20
|
+
super('jux: the page crashed (its renderer process is gone)');
|
|
21
|
+
this.name = 'PageCrashedError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const DEFAULT_TIMEOUT_MS = 30_000;
|
|
25
|
+
// Page.setFontFamilies tables, playwright-core 1.62.0 `platformToFontFamilies`
|
|
26
|
+
// (coreBundle.js L36529+), copied verbatim: linux has no forScripts; mac has
|
|
27
|
+
// jpan/hang/hans/hant; win has seven. Generic families resolve through these
|
|
28
|
+
// in headless mode; without them a story that says `font-family: sans-serif`
|
|
29
|
+
// renders with Chromium's built-in defaults and the bytes differ from every
|
|
30
|
+
// existing baseline.
|
|
31
|
+
const FONT_FAMILIES = {
|
|
32
|
+
linux: {
|
|
33
|
+
fontFamilies: {
|
|
34
|
+
standard: 'Times New Roman',
|
|
35
|
+
fixed: 'Monospace',
|
|
36
|
+
serif: 'Times New Roman',
|
|
37
|
+
sansSerif: 'Arial',
|
|
38
|
+
cursive: 'Comic Sans MS',
|
|
39
|
+
fantasy: 'Impact',
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
mac: {
|
|
43
|
+
fontFamilies: {
|
|
44
|
+
standard: 'Times',
|
|
45
|
+
fixed: 'Courier',
|
|
46
|
+
serif: 'Times',
|
|
47
|
+
sansSerif: 'Helvetica',
|
|
48
|
+
cursive: 'Apple Chancery',
|
|
49
|
+
fantasy: 'Papyrus',
|
|
50
|
+
},
|
|
51
|
+
forScripts: [
|
|
52
|
+
{
|
|
53
|
+
script: 'jpan',
|
|
54
|
+
fontFamilies: {
|
|
55
|
+
standard: 'Hiragino Kaku Gothic ProN',
|
|
56
|
+
fixed: 'Osaka-Mono',
|
|
57
|
+
serif: 'Hiragino Mincho ProN',
|
|
58
|
+
sansSerif: 'Hiragino Kaku Gothic ProN',
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
script: 'hang',
|
|
63
|
+
fontFamilies: {
|
|
64
|
+
standard: 'Apple SD Gothic Neo',
|
|
65
|
+
serif: 'AppleMyungjo',
|
|
66
|
+
sansSerif: 'Apple SD Gothic Neo',
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
script: 'hans',
|
|
71
|
+
fontFamilies: {
|
|
72
|
+
standard: ',PingFang SC,STHeiti',
|
|
73
|
+
serif: 'Songti SC',
|
|
74
|
+
sansSerif: ',PingFang SC,STHeiti',
|
|
75
|
+
cursive: 'Kaiti SC',
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
script: 'hant',
|
|
80
|
+
fontFamilies: {
|
|
81
|
+
standard: ',PingFang TC,Heiti TC',
|
|
82
|
+
serif: 'Songti TC',
|
|
83
|
+
sansSerif: ',PingFang TC,Heiti TC',
|
|
84
|
+
cursive: 'Kaiti TC',
|
|
85
|
+
},
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
},
|
|
89
|
+
win: {
|
|
90
|
+
fontFamilies: {
|
|
91
|
+
standard: 'Times New Roman',
|
|
92
|
+
fixed: 'Consolas',
|
|
93
|
+
serif: 'Times New Roman',
|
|
94
|
+
sansSerif: 'Arial',
|
|
95
|
+
cursive: 'Comic Sans MS',
|
|
96
|
+
fantasy: 'Impact',
|
|
97
|
+
},
|
|
98
|
+
forScripts: [
|
|
99
|
+
{
|
|
100
|
+
script: 'cyrl',
|
|
101
|
+
fontFamilies: {
|
|
102
|
+
standard: 'Times New Roman',
|
|
103
|
+
fixed: 'Courier New',
|
|
104
|
+
serif: 'Times New Roman',
|
|
105
|
+
sansSerif: 'Arial',
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
{ script: 'arab', fontFamilies: { fixed: 'Courier New', sansSerif: 'Segoe UI' } },
|
|
109
|
+
{
|
|
110
|
+
script: 'grek',
|
|
111
|
+
fontFamilies: {
|
|
112
|
+
standard: 'Times New Roman',
|
|
113
|
+
fixed: 'Courier New',
|
|
114
|
+
serif: 'Times New Roman',
|
|
115
|
+
sansSerif: 'Arial',
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
script: 'jpan',
|
|
120
|
+
fontFamilies: {
|
|
121
|
+
standard: ',Meiryo,Yu Gothic',
|
|
122
|
+
fixed: 'MS Gothic',
|
|
123
|
+
serif: ',Yu Mincho,MS PMincho',
|
|
124
|
+
sansSerif: ',Meiryo,Yu Gothic',
|
|
125
|
+
},
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
script: 'hang',
|
|
129
|
+
fontFamilies: {
|
|
130
|
+
standard: 'Malgun Gothic',
|
|
131
|
+
fixed: 'Gulimche',
|
|
132
|
+
serif: 'Batang',
|
|
133
|
+
sansSerif: 'Malgun Gothic',
|
|
134
|
+
cursive: 'Gungsuh',
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
script: 'hans',
|
|
139
|
+
fontFamilies: {
|
|
140
|
+
standard: 'Microsoft YaHei',
|
|
141
|
+
fixed: 'NSimsun',
|
|
142
|
+
serif: 'Simsun',
|
|
143
|
+
sansSerif: 'Microsoft YaHei',
|
|
144
|
+
cursive: 'KaiTi',
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
script: 'hant',
|
|
149
|
+
fontFamilies: {
|
|
150
|
+
standard: 'Microsoft JhengHei',
|
|
151
|
+
fixed: 'MingLiU',
|
|
152
|
+
serif: 'PMingLiU',
|
|
153
|
+
sansSerif: 'Microsoft JhengHei',
|
|
154
|
+
cursive: 'DFKai-SB',
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
],
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
// coreBundle.js L51296, verbatim (serviceWorkers: 'block').
|
|
161
|
+
const BLOCK_SERVICE_WORKERS_SCRIPT = `
|
|
162
|
+
if (navigator.serviceWorker) navigator.serviceWorker.register = async () => { console.warn('Service Worker registration blocked by Playwright'); };
|
|
163
|
+
`;
|
|
164
|
+
const metricsOverride = (v) => ({
|
|
165
|
+
mobile: false,
|
|
166
|
+
width: v.width,
|
|
167
|
+
height: v.height,
|
|
168
|
+
screenWidth: v.width,
|
|
169
|
+
screenHeight: v.height,
|
|
170
|
+
deviceScaleFactor: 1,
|
|
171
|
+
screenOrientation: { angle: 0, type: 'landscapePrimary' },
|
|
172
|
+
});
|
|
173
|
+
const EMULATED_MEDIA = {
|
|
174
|
+
media: '',
|
|
175
|
+
features: [
|
|
176
|
+
{ name: 'prefers-color-scheme', value: 'light' },
|
|
177
|
+
{ name: 'prefers-reduced-motion', value: 'no-preference' },
|
|
178
|
+
{ name: 'forced-colors', value: 'none' },
|
|
179
|
+
{ name: 'prefers-contrast', value: 'no-preference' },
|
|
180
|
+
],
|
|
181
|
+
};
|
|
182
|
+
// Screenshotter._preparePageForScreenshots with caret:'hide', animations:'allow'.
|
|
183
|
+
const PREPARE_SCREENSHOT = `(function (hideCaret) {
|
|
184
|
+
const collectRoots = (root, roots = []) => {
|
|
185
|
+
roots.push(root);
|
|
186
|
+
const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT);
|
|
187
|
+
do {
|
|
188
|
+
const node = walker.currentNode;
|
|
189
|
+
const shadowRoot = node instanceof Element ? node.shadowRoot : null;
|
|
190
|
+
if (shadowRoot) collectRoots(shadowRoot, roots);
|
|
191
|
+
} while (walker.nextNode());
|
|
192
|
+
return roots;
|
|
193
|
+
};
|
|
194
|
+
const roots = collectRoots(document);
|
|
195
|
+
const cleanupCallbacks = [];
|
|
196
|
+
if (hideCaret) {
|
|
197
|
+
const elements = new Map();
|
|
198
|
+
for (const root of roots) {
|
|
199
|
+
root.querySelectorAll('input,textarea,[contenteditable]').forEach((element) => {
|
|
200
|
+
elements.set(element, { value: element.style.getPropertyValue('caret-color'), priority: element.style.getPropertyPriority('caret-color') });
|
|
201
|
+
element.style.setProperty('caret-color', 'transparent', 'important');
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
cleanupCallbacks.push(() => { for (const [element, value] of elements) element.style.setProperty('caret-color', value.value, value.priority); });
|
|
205
|
+
}
|
|
206
|
+
window.__juxCleanupScreenshot = () => { for (const cb of cleanupCallbacks) cb(); delete window.__juxCleanupScreenshot; };
|
|
207
|
+
})(true)`;
|
|
208
|
+
// Playwright's mask overlay: injected highlight.css + Highlight.updateHighlight.
|
|
209
|
+
const HIGHLIGHT_CSS = ':host{font-size:13px;font-family:system-ui,Ubuntu,Droid Sans,sans-serif;color:#333;color-scheme:light}svg{position:absolute;height:0}x-pw-highlight{position:absolute;top:0;left:0;width:0;height:0}';
|
|
210
|
+
const MASK_BODY = `
|
|
211
|
+
const glass = document.createElement('x-pw-glass');
|
|
212
|
+
glass.setAttribute('popover', 'manual');
|
|
213
|
+
const s = glass.style;
|
|
214
|
+
s.inset = '0'; s.width = '100%'; s.height = '100%'; s.maxWidth = 'none'; s.maxHeight = 'none';
|
|
215
|
+
s.padding = '0'; s.margin = '0'; s.border = 'none'; s.overflow = 'visible';
|
|
216
|
+
s.pointerEvents = 'none'; s.display = 'flex'; s.backgroundColor = 'transparent';
|
|
217
|
+
const shadow = glass.attachShadow({ mode: 'open' });
|
|
218
|
+
const style = document.createElement('style');
|
|
219
|
+
style.textContent = ${JSON.stringify(HIGHLIGHT_CSS)};
|
|
220
|
+
shadow.appendChild(style);
|
|
221
|
+
document.documentElement.appendChild(glass);
|
|
222
|
+
glass.showPopover();
|
|
223
|
+
const entries = els.map((el) => { const h = document.createElement('x-pw-highlight'); shadow.appendChild(h); return { el, h }; });
|
|
224
|
+
for (const { el, h } of entries) {
|
|
225
|
+
const box = el.getBoundingClientRect();
|
|
226
|
+
h.style.backgroundColor = a0;
|
|
227
|
+
h.style.left = box.x + 'px'; h.style.top = box.y + 'px';
|
|
228
|
+
h.style.width = box.width + 'px'; h.style.height = box.height + 'px';
|
|
229
|
+
h.style.display = 'block';
|
|
230
|
+
}
|
|
231
|
+
window.__juxUnmask = () => { glass.remove(); delete window.__juxUnmask; };
|
|
232
|
+
return entries.length;`;
|
|
233
|
+
// Playwright's default waitForSelector state is 'visible': the first match
|
|
234
|
+
// has a non-empty box and is not visibility:hidden. Matches pierce open
|
|
235
|
+
// shadow roots, as Playwright's css engine does.
|
|
236
|
+
const SELECTOR_VISIBLE = `function (selector) {
|
|
237
|
+
const el = (${QUERY_ALL_SOURCE})(selector)[0];
|
|
238
|
+
if (!el) return false;
|
|
239
|
+
const r = el.getBoundingClientRect();
|
|
240
|
+
return r.width > 0 && r.height > 0 && getComputedStyle(el).visibility !== 'hidden';
|
|
241
|
+
}`;
|
|
242
|
+
/** CDP's Frame.url excludes the fragment; Playwright's page.url() includes it. */
|
|
243
|
+
const frameUrl = (f) => f.url + (f.urlFragment ?? '');
|
|
244
|
+
function serialize(arg) {
|
|
245
|
+
return arg === undefined ? 'undefined' : JSON.stringify(arg);
|
|
246
|
+
}
|
|
247
|
+
export class CdpPage {
|
|
248
|
+
connection;
|
|
249
|
+
targetId;
|
|
250
|
+
sessionId;
|
|
251
|
+
currentUrl = 'about:blank';
|
|
252
|
+
viewport;
|
|
253
|
+
closed = false;
|
|
254
|
+
/**
|
|
255
|
+
* Why the page is unusable, once it is. `goneP` rejects with it at that
|
|
256
|
+
* moment and every send, evaluate and goto races it, so work already in
|
|
257
|
+
* flight fails at once: Chrome never answers a command on a crashed or
|
|
258
|
+
* detached session, and a committed navigation whose `load` never comes
|
|
259
|
+
* would otherwise hold a pool worker for its full timeout.
|
|
260
|
+
*/
|
|
261
|
+
goneError = null;
|
|
262
|
+
rejectGone;
|
|
263
|
+
goneP;
|
|
264
|
+
/** Every connection listener this page holds; dispose() removes them all. */
|
|
265
|
+
offs = [];
|
|
266
|
+
constructor(connection, targetId, sessionId, viewport) {
|
|
267
|
+
this.connection = connection;
|
|
268
|
+
this.targetId = targetId;
|
|
269
|
+
this.sessionId = sessionId;
|
|
270
|
+
this.viewport = viewport;
|
|
271
|
+
this.goneP = new Promise((_, reject) => (this.rejectGone = reject));
|
|
272
|
+
// A crash or close with nothing in flight rejects this with no racer
|
|
273
|
+
// attached; without the catch that is an unhandledRejection, which kills
|
|
274
|
+
// a host running with Node's default --unhandled-rejections=throw.
|
|
275
|
+
// Racers still see the rejection: each race attaches its own handler.
|
|
276
|
+
this.goneP.catch(() => { });
|
|
277
|
+
this.offs.push(connection.on('Page.frameNavigated', (p) => {
|
|
278
|
+
const f = p.frame;
|
|
279
|
+
if (!f.parentId)
|
|
280
|
+
this.currentUrl = frameUrl(f);
|
|
281
|
+
}, sessionId),
|
|
282
|
+
// Playwright's DialogManager with no handlers (coreBundle.js L12963,
|
|
283
|
+
// L37640): beforeunload is accepted so navigation proceeds, every other
|
|
284
|
+
// dialog is dismissed. A story that calls alert() would otherwise block
|
|
285
|
+
// every later evaluate on this page.
|
|
286
|
+
connection.on('Page.javascriptDialogOpening', (p) => {
|
|
287
|
+
const accept = p.type === 'beforeunload';
|
|
288
|
+
void this.send('Page.handleJavaScriptDialog', { accept }).catch(() => { });
|
|
289
|
+
}, sessionId),
|
|
290
|
+
// The earliest crash signal CDP has. RenderFrameDevToolsAgentHost::
|
|
291
|
+
// RenderProcessExited sends it first, then NotifyCrashed → the
|
|
292
|
+
// browser-level Target.targetCrashed in the same call (measured: same
|
|
293
|
+
// millisecond on macOS), so listening there too would gain nothing.
|
|
294
|
+
// Nothing can beat it: the browser learns of the death only when the
|
|
295
|
+
// renderer process is gone.
|
|
296
|
+
connection.on('Inspector.targetCrashed', () => this.fail(new PageCrashedError()), sessionId),
|
|
297
|
+
// The same function's other branch: a renderer that exits with a status
|
|
298
|
+
// Chromium does not class as a crash gets Inspector.detached("Render
|
|
299
|
+
// process gone.") instead, and no Target event at all while the target
|
|
300
|
+
// stays open. Without this, work in flight would wait out its timeout.
|
|
301
|
+
connection.on('Inspector.detached', (p) => {
|
|
302
|
+
const reason = p.reason ?? '';
|
|
303
|
+
this.fail(/render process gone/i.test(reason)
|
|
304
|
+
? new PageCrashedError()
|
|
305
|
+
: new TargetClosedError(reason || 'inspector detached'));
|
|
306
|
+
}, sessionId),
|
|
307
|
+
// Browser-session event: the target closed under us (context disposed,
|
|
308
|
+
// window.close()). Drop our listeners with it.
|
|
309
|
+
connection.on('Target.detachedFromTarget', (p) => {
|
|
310
|
+
if (p.sessionId !== this.sessionId)
|
|
311
|
+
return;
|
|
312
|
+
this.fail(new TargetClosedError('target closed'));
|
|
313
|
+
this.dispose();
|
|
314
|
+
}), connection.onClosed((e) => this.fail(e)));
|
|
315
|
+
}
|
|
316
|
+
/** The spike's init list (spec §Decisions 3), plus Log.enable which Playwright also sends. */
|
|
317
|
+
static async create(connection, targetId, sessionId, opts) {
|
|
318
|
+
const page = new CdpPage(connection, targetId, sessionId, opts.viewport);
|
|
319
|
+
// Keyed on the host's process.platform, where Playwright keys on the
|
|
320
|
+
// browser's UA. The two agree for every supported setup: the pinned
|
|
321
|
+
// download is per-host, and a BYO binary (JUX_CHROME / --chrome) is
|
|
322
|
+
// necessarily same-OS because we spawn it locally.
|
|
323
|
+
const fonts = FONT_FAMILIES[opts.os === 'darwin' ? 'mac' : opts.os === 'win32' ? 'win' : 'linux'];
|
|
324
|
+
try {
|
|
325
|
+
await Promise.all([
|
|
326
|
+
page.send('Page.enable'),
|
|
327
|
+
page.send('Page.setLifecycleEventsEnabled', { enabled: true }),
|
|
328
|
+
page.send('Runtime.enable'),
|
|
329
|
+
page.send('Network.enable'),
|
|
330
|
+
page.send('Log.enable'),
|
|
331
|
+
page.send('Emulation.setFocusEmulationEnabled', { enabled: true }),
|
|
332
|
+
page.send('Emulation.setDeviceMetricsOverride', metricsOverride(opts.viewport)),
|
|
333
|
+
page.send('Page.setFontFamilies', fonts),
|
|
334
|
+
page.send('Emulation.setEmulatedMedia', EMULATED_MEDIA),
|
|
335
|
+
...(opts.blockServiceWorkers
|
|
336
|
+
? [
|
|
337
|
+
page.send('Page.addScriptToEvaluateOnNewDocument', {
|
|
338
|
+
source: BLOCK_SERVICE_WORKERS_SCRIPT,
|
|
339
|
+
runImmediately: true,
|
|
340
|
+
}),
|
|
341
|
+
]
|
|
342
|
+
: []),
|
|
343
|
+
]);
|
|
344
|
+
}
|
|
345
|
+
catch (e) {
|
|
346
|
+
page.dispose();
|
|
347
|
+
throw e;
|
|
348
|
+
}
|
|
349
|
+
return page;
|
|
350
|
+
}
|
|
351
|
+
send(method, params = {}) {
|
|
352
|
+
if (this.goneError)
|
|
353
|
+
return Promise.reject(this.goneError);
|
|
354
|
+
return this.guard(this.connection.send(method, params, this.sessionId));
|
|
355
|
+
}
|
|
356
|
+
url() {
|
|
357
|
+
return this.currentUrl;
|
|
358
|
+
}
|
|
359
|
+
onMainResponse(handler) {
|
|
360
|
+
if (this.closed)
|
|
361
|
+
return () => { };
|
|
362
|
+
const off = this.connection.on('Network.responseReceived', (p) => {
|
|
363
|
+
const r = p;
|
|
364
|
+
// The top frame's id is the target id in Chromium (verified 2026-10-13).
|
|
365
|
+
if (r.type === 'Document' && r.frameId === this.targetId)
|
|
366
|
+
handler(r.response.status);
|
|
367
|
+
}, this.sessionId);
|
|
368
|
+
this.offs.push(off);
|
|
369
|
+
return off;
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Page.navigate, then the main frame's `load` for the document that
|
|
373
|
+
* navigation created. The timeout covers the whole thing: Chrome answers
|
|
374
|
+
* Page.navigate only at commit or failure, so a server that never responds
|
|
375
|
+
* never replies. A child frame's own `load` must not count (a same-process
|
|
376
|
+
* iframe fires one for itself), nor may a late `load` from the previous
|
|
377
|
+
* document: Playwright waits on the new document's loaderId.
|
|
378
|
+
*/
|
|
379
|
+
async goto(url, opts = {}) {
|
|
380
|
+
const timeout = opts.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
381
|
+
const early = []; // loaderIds that fired load before navigate replied
|
|
382
|
+
let wanted;
|
|
383
|
+
let onLoad;
|
|
384
|
+
const loaded = new Promise((r) => (onLoad = r));
|
|
385
|
+
const off = this.connection.on('Page.lifecycleEvent', (p) => {
|
|
386
|
+
const e = p;
|
|
387
|
+
if (e.name !== 'load' || e.frameId !== this.targetId)
|
|
388
|
+
return;
|
|
389
|
+
if (wanted === undefined)
|
|
390
|
+
early.push(e.loaderId);
|
|
391
|
+
else if (e.loaderId === wanted)
|
|
392
|
+
onLoad();
|
|
393
|
+
}, this.sessionId);
|
|
394
|
+
let timer;
|
|
395
|
+
const expired = new Promise((_, reject) => {
|
|
396
|
+
timer = setTimeout(() => reject(new TimeoutError(`jux: navigation to ${url} did not fire load within ${timeout} ms`)), timeout);
|
|
397
|
+
});
|
|
398
|
+
const navigated = (async () => {
|
|
399
|
+
if (this.goneError)
|
|
400
|
+
throw this.goneError;
|
|
401
|
+
// The send's own cap sits past the goto timeout so the TimeoutError
|
|
402
|
+
// naming the url is the one the caller sees.
|
|
403
|
+
const res = await this.connection.send('Page.navigate', { url }, this.sessionId, { timeout: timeout + 1000 });
|
|
404
|
+
if (res.errorText)
|
|
405
|
+
throw new Error(`jux: navigation to ${url} failed: ${res.errorText}`);
|
|
406
|
+
// No loaderId: a same-document navigation (fragment change); the
|
|
407
|
+
// document is already loaded and no new `load` will fire.
|
|
408
|
+
if (res.loaderId === undefined)
|
|
409
|
+
return;
|
|
410
|
+
wanted = res.loaderId;
|
|
411
|
+
if (early.includes(wanted))
|
|
412
|
+
return;
|
|
413
|
+
await loaded;
|
|
414
|
+
})();
|
|
415
|
+
try {
|
|
416
|
+
await Promise.race([navigated, expired, this.goneP]);
|
|
417
|
+
}
|
|
418
|
+
finally {
|
|
419
|
+
clearTimeout(timer);
|
|
420
|
+
off();
|
|
421
|
+
navigated.catch(() => { }); // the loser of the race is not an unhandled rejection
|
|
422
|
+
}
|
|
423
|
+
const { frameTree } = await this.send('Page.getFrameTree');
|
|
424
|
+
this.currentUrl = frameUrl(frameTree.frame);
|
|
425
|
+
}
|
|
426
|
+
async evaluate(fn, arg, opts = {}) {
|
|
427
|
+
const expression = typeof fn === 'string' ? fn : `(${fn.toString()})(${serialize(arg)})`;
|
|
428
|
+
if (this.goneError)
|
|
429
|
+
throw this.goneError;
|
|
430
|
+
const r = await this.guard(this.connection.send('Runtime.evaluate', { expression, awaitPromise: true, returnByValue: true }, this.sessionId, { timeout: opts.timeout ?? DEFAULT_TIMEOUT_MS }));
|
|
431
|
+
if (r.exceptionDetails) {
|
|
432
|
+
throw new Error(r.exceptionDetails.exception?.description ?? r.exceptionDetails.text);
|
|
433
|
+
}
|
|
434
|
+
return r.result.value;
|
|
435
|
+
}
|
|
436
|
+
/** Playwright polls on requestAnimationFrame by default (polling: 'raf'). */
|
|
437
|
+
waitForFunction(fn, arg, opts = {}) {
|
|
438
|
+
const timeout = opts.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
439
|
+
return this.poll(fn.toString(), serialize(arg), timeout).then((ok) => {
|
|
440
|
+
if (!ok)
|
|
441
|
+
throw new TimeoutError(`jux: waitForFunction timed out after ${timeout} ms`);
|
|
442
|
+
});
|
|
443
|
+
}
|
|
444
|
+
waitForSelector(selector, opts = {}) {
|
|
445
|
+
assertCssSelector(selector); // throws synchronously: a non-CSS selector is a config error, not a slow page
|
|
446
|
+
const timeout = opts.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
447
|
+
return this.poll(SELECTOR_VISIBLE, JSON.stringify(selector), timeout).then((ok) => {
|
|
448
|
+
if (!ok)
|
|
449
|
+
throw new TimeoutError(`jux: selector '${selector}' did not appear within ${timeout} ms`);
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
/** rAF-poll `predicate(arg)` in the page; true once truthy, false at the in-page cap. */
|
|
453
|
+
async poll(predicate, arg, timeout) {
|
|
454
|
+
const outcome = await this.evaluate(`new Promise((resolve) => {
|
|
455
|
+
const predicate = ${predicate};
|
|
456
|
+
const arg = ${arg};
|
|
457
|
+
const start = performance.now();
|
|
458
|
+
const tick = () => {
|
|
459
|
+
let value;
|
|
460
|
+
try { value = predicate(arg); } catch (e) { return resolve('error:' + (e && e.message)); }
|
|
461
|
+
if (value) return resolve('ok');
|
|
462
|
+
if (performance.now() - start > ${timeout}) return resolve('timeout');
|
|
463
|
+
requestAnimationFrame(tick);
|
|
464
|
+
};
|
|
465
|
+
tick();
|
|
466
|
+
})`, undefined,
|
|
467
|
+
// The in-page cap fires first; the node-side cap only matters if the page is wedged.
|
|
468
|
+
{ timeout: timeout + 1000 });
|
|
469
|
+
if (outcome.startsWith('error:'))
|
|
470
|
+
throw new Error(outcome.slice(6));
|
|
471
|
+
return outcome === 'ok';
|
|
472
|
+
}
|
|
473
|
+
/** Frame._addStyleTag → addStyleContent, verbatim. */
|
|
474
|
+
async addStyleTag(opts) {
|
|
475
|
+
await this.evaluate((content) => {
|
|
476
|
+
const style = document.createElement('style');
|
|
477
|
+
style.type = 'text/css';
|
|
478
|
+
style.appendChild(document.createTextNode(content));
|
|
479
|
+
document.head.appendChild(style);
|
|
480
|
+
return true;
|
|
481
|
+
}, opts.content);
|
|
482
|
+
}
|
|
483
|
+
async setViewportSize(viewport) {
|
|
484
|
+
if (viewport.width === this.viewport.width &&
|
|
485
|
+
viewport.height === this.viewport.height)
|
|
486
|
+
return;
|
|
487
|
+
await this.send('Emulation.setDeviceMetricsOverride', metricsOverride(viewport));
|
|
488
|
+
this.viewport = viewport;
|
|
489
|
+
}
|
|
490
|
+
/** Screenshotter.screenshotPage: prepare → fonts.ready → mask → getLayoutMetrics → captureScreenshot → cleanup. */
|
|
491
|
+
async screenshot(opts = {}) {
|
|
492
|
+
const mask = opts.mask ?? [];
|
|
493
|
+
for (const sel of mask)
|
|
494
|
+
assertCssSelector(sel);
|
|
495
|
+
await this.evaluate(PREPARE_SCREENSHOT);
|
|
496
|
+
try {
|
|
497
|
+
await this.evaluate('document.fonts.ready').catch(() => { });
|
|
498
|
+
if (mask.length) {
|
|
499
|
+
// One glass pane for all selectors: Playwright adds every selector's
|
|
500
|
+
// matches to the same highlight list before painting.
|
|
501
|
+
await this.evaluate(queryAllExpression(mask.join(', '), MASK_BODY, '#F0F'));
|
|
502
|
+
}
|
|
503
|
+
try {
|
|
504
|
+
const { visualViewport } = await this.send('Page.getLayoutMetrics');
|
|
505
|
+
const clip = {
|
|
506
|
+
x: visualViewport.pageX,
|
|
507
|
+
y: visualViewport.pageY,
|
|
508
|
+
width: Math.ceil(this.viewport.width / visualViewport.scale),
|
|
509
|
+
height: Math.ceil(this.viewport.height / visualViewport.scale),
|
|
510
|
+
scale: visualViewport.scale,
|
|
511
|
+
};
|
|
512
|
+
const { data } = await this.send('Page.captureScreenshot', {
|
|
513
|
+
format: 'png',
|
|
514
|
+
clip,
|
|
515
|
+
captureBeyondViewport: false,
|
|
516
|
+
});
|
|
517
|
+
return Buffer.from(data, 'base64');
|
|
518
|
+
}
|
|
519
|
+
finally {
|
|
520
|
+
if (mask.length)
|
|
521
|
+
await this.evaluate('window.__juxUnmask && window.__juxUnmask()').catch(() => { });
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
finally {
|
|
525
|
+
await this.evaluate('window.__juxCleanupScreenshot && window.__juxCleanupScreenshot()').catch(() => { });
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
async clearOrigin(origin) {
|
|
529
|
+
await this.send('Storage.clearDataForOrigin', { origin, storageTypes: 'all' });
|
|
530
|
+
}
|
|
531
|
+
async close() {
|
|
532
|
+
if (this.closed)
|
|
533
|
+
return;
|
|
534
|
+
this.dispose();
|
|
535
|
+
await this.connection
|
|
536
|
+
.send('Target.closeTarget', { targetId: this.targetId })
|
|
537
|
+
.catch((e) => {
|
|
538
|
+
if (!(e instanceof CdpError) && !(e instanceof TargetClosedError))
|
|
539
|
+
throw e;
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
/** Mark closed and drop every listener; idempotent. BrowserContext.close calls it for its pages. */
|
|
543
|
+
dispose() {
|
|
544
|
+
if (this.closed)
|
|
545
|
+
return;
|
|
546
|
+
this.closed = true;
|
|
547
|
+
this.fail(new TargetClosedError('page closed'));
|
|
548
|
+
for (const off of this.offs.splice(0))
|
|
549
|
+
off();
|
|
550
|
+
}
|
|
551
|
+
/** First cause wins: a crash followed by the context closing still reports the crash. */
|
|
552
|
+
fail(e) {
|
|
553
|
+
if (this.goneError)
|
|
554
|
+
return;
|
|
555
|
+
this.goneError = e;
|
|
556
|
+
this.rejectGone(e);
|
|
557
|
+
}
|
|
558
|
+
/** `p`, unless the page goes first. */
|
|
559
|
+
guard(p) {
|
|
560
|
+
p.catch(() => { }); // the loser of the race is not an unhandled rejection
|
|
561
|
+
return Promise.race([p, this.goneP]);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
//# sourceMappingURL=page.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page.js","sourceRoot":"","sources":["../../src/browser/page.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const CHROME_VERSION = "151.0.7922.34";
|
|
2
|
+
export declare const MS_PLAYWRIGHT_REVISION = "1234";
|
|
3
|
+
export type ChromePlatform = 'linux64' | 'mac-arm64' | 'mac-x64' | 'win64';
|
|
4
|
+
export interface ChromePin {
|
|
5
|
+
platform: ChromePlatform;
|
|
6
|
+
url: string;
|
|
7
|
+
sha256: string;
|
|
8
|
+
bytes: number;
|
|
9
|
+
}
|
|
10
|
+
export declare const CHROME_PINS: Record<ChromePlatform, ChromePin>;
|
|
11
|
+
/** CfT platform key for this machine. linux-arm64 has no 151.0.7922.34 build. */
|
|
12
|
+
export declare function chromePlatform(platform?: NodeJS.Platform, arch?: string): ChromePlatform;
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// packages/core/src/browser/pins.ts
|
|
2
|
+
//
|
|
3
|
+
// The browser is pinned, not "latest": Chromium 149 -> 151 changed 2 of 18
|
|
4
|
+
// example baselines (see capture/env.ts), so moving the version is a
|
|
5
|
+
// deliberate PR with a migration note, never a side effect of an install.
|
|
6
|
+
//
|
|
7
|
+
// 151.0.7922.34 is the exact build playwright-core 1.62.0 ships as
|
|
8
|
+
// chromium-headless-shell r1234, so upgrading from the Playwright driver to
|
|
9
|
+
// this one changes no bytes. Verified 2026-10-13: the binary inside CfT's
|
|
10
|
+
// mac-arm64 zip and the one in ~/Library/Caches/ms-playwright/
|
|
11
|
+
// chromium_headless_shell-1234 share sha256 7687bff7cb2db075….
|
|
12
|
+
//
|
|
13
|
+
// Chrome for Testing publishes no checksums (known-good-versions-with-
|
|
14
|
+
// downloads.json carries only version, revision and urls), so the sha256 of
|
|
15
|
+
// each zip was measured from the published files and pinned here.
|
|
16
|
+
export const CHROME_VERSION = '151.0.7922.34';
|
|
17
|
+
export const MS_PLAYWRIGHT_REVISION = '1234';
|
|
18
|
+
const url = (p) => `https://storage.googleapis.com/chrome-for-testing-public/${CHROME_VERSION}/${p}/chrome-headless-shell-${p}.zip`;
|
|
19
|
+
export const CHROME_PINS = {
|
|
20
|
+
linux64: {
|
|
21
|
+
platform: 'linux64',
|
|
22
|
+
url: url('linux64'),
|
|
23
|
+
sha256: '3cfc2bd00d1bafcf8a68dc74c9c92bb7150ddc8d26ade948a776316e1cec4f14',
|
|
24
|
+
bytes: 120231126,
|
|
25
|
+
},
|
|
26
|
+
'mac-arm64': {
|
|
27
|
+
platform: 'mac-arm64',
|
|
28
|
+
url: url('mac-arm64'),
|
|
29
|
+
sha256: 'cb46a336dbe3d6f1339c5039c3083e4e5dd8e4379710790e34f8f4a865e2452d',
|
|
30
|
+
bytes: 99275008,
|
|
31
|
+
},
|
|
32
|
+
'mac-x64': {
|
|
33
|
+
platform: 'mac-x64',
|
|
34
|
+
url: url('mac-x64'),
|
|
35
|
+
sha256: '608e2b5b1815b45e8bf59c9a381412b62df3ce36f2c182bc04e22fcf04ad53ea',
|
|
36
|
+
bytes: 103580477,
|
|
37
|
+
},
|
|
38
|
+
win64: {
|
|
39
|
+
platform: 'win64',
|
|
40
|
+
url: url('win64'),
|
|
41
|
+
sha256: '46cc69ef55ba29268ffe32dda4192a9d2165be42c3f4e923241153d519493aea',
|
|
42
|
+
bytes: 120106945,
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
/** CfT platform key for this machine. linux-arm64 has no 151.0.7922.34 build. */
|
|
46
|
+
export function chromePlatform(platform = process.platform, arch = process.arch) {
|
|
47
|
+
if (platform === 'darwin')
|
|
48
|
+
return arch === 'arm64' ? 'mac-arm64' : 'mac-x64';
|
|
49
|
+
if (platform === 'linux' && arch === 'x64')
|
|
50
|
+
return 'linux64';
|
|
51
|
+
if (platform === 'win32' && arch === 'x64')
|
|
52
|
+
return 'win64';
|
|
53
|
+
const key = platform === 'linux' ? `linux-${arch}` : `${platform}-${arch}`;
|
|
54
|
+
throw new Error(`jux: Chrome for Testing publishes no chrome-headless-shell ${CHROME_VERSION} for ${key}. ` +
|
|
55
|
+
`Point JUX_CHROME at a Chromium ${CHROME_VERSION.split('.')[0]} headless shell.`);
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=pins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pins.js","sourceRoot":"","sources":["../../src/browser/pins.ts"],"names":[],"mappings":"AAAA,oCAAoC;AACpC,EAAE;AACF,2EAA2E;AAC3E,qEAAqE;AACrE,0EAA0E;AAC1E,EAAE;AACF,mEAAmE;AACnE,4EAA4E;AAC5E,0EAA0E;AAC1E,+DAA+D;AAC/D,+DAA+D;AAC/D,EAAE;AACF,uEAAuE;AACvE,4EAA4E;AAC5E,kEAAkE;AAElE,MAAM,CAAC,MAAM,cAAc,GAAG,eAAe,CAAC;AAC9C,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAW7C,MAAM,GAAG,GAAG,CAAC,CAAiB,EAAE,EAAE,CAChC,4DAA4D,cAAc,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC;AAEnH,MAAM,CAAC,MAAM,WAAW,GAAsC;IAC5D,OAAO,EAAE;QACP,QAAQ,EAAE,SAAS;QACnB,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC;QACnB,MAAM,EAAE,kEAAkE;QAC1E,KAAK,EAAE,SAAS;KACjB;IACD,WAAW,EAAE;QACX,QAAQ,EAAE,WAAW;QACrB,GAAG,EAAE,GAAG,CAAC,WAAW,CAAC;QACrB,MAAM,EAAE,kEAAkE;QAC1E,KAAK,EAAE,QAAQ;KAChB;IACD,SAAS,EAAE;QACT,QAAQ,EAAE,SAAS;QACnB,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC;QACnB,MAAM,EAAE,kEAAkE;QAC1E,KAAK,EAAE,SAAS;KACjB;IACD,KAAK,EAAE;QACL,QAAQ,EAAE,OAAO;QACjB,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC;QACjB,MAAM,EAAE,kEAAkE;QAC1E,KAAK,EAAE,SAAS;KACjB;CACF,CAAC;AAEF,iFAAiF;AACjF,MAAM,UAAU,cAAc,CAC5B,WAA4B,OAAO,CAAC,QAAQ,EAC5C,OAAe,OAAO,CAAC,IAAI;IAE3B,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7D,IAAI,QAAQ,KAAK,OAAO,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,OAAO,CAAC;IAC3D,MAAM,GAAG,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;IAC3E,MAAM,IAAI,KAAK,CACb,8DAA8D,cAAc,QAAQ,GAAG,IAAI;QACzF,kCAAkC,cAAc,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,kBAAkB,CACnF,CAAC;AACJ,CAAC"}
|