@stablyai/playwright-test 2.1.3-rc.2 → 2.1.3
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/index-B3E10pom.mjs +9665 -0
- package/dist/index-B3E10pom.mjs.map +1 -0
- package/dist/index-Cjfxwz2m.cjs +9687 -0
- package/dist/index-Cjfxwz2m.cjs.map +1 -0
- package/dist/index.cjs +15 -10
- package/dist/index.cjs.map +1 -1
- package/dist/{index.d-Be6DvZw5.d.cts → index.d-BjGuH5NO.d.cts} +1 -3
- package/dist/{index.d-Be6DvZw5.d.cts.map → index.d-BjGuH5NO.d.cts.map} +1 -1
- package/dist/{index.d-Be6DvZw5.d.mts → index.d-BjGuH5NO.d.mts} +1 -3
- package/dist/{index.d-Be6DvZw5.d.mts.map → index.d-BjGuH5NO.d.mts.map} +1 -1
- package/dist/{index.d-Be6DvZw5.d.ts → index.d-BjGuH5NO.d.ts} +1 -3
- package/dist/{index.d-Be6DvZw5.d.ts.map → index.d-BjGuH5NO.d.ts.map} +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.mjs +10 -5
- package/dist/index.mjs.map +1 -1
- package/dist/reporter.cjs +11 -5
- package/dist/reporter.cjs.map +1 -1
- package/dist/reporter.d.cts +1 -1
- package/dist/reporter.d.mts +1 -1
- package/dist/reporter.mjs +11 -5
- package/dist/reporter.mjs.map +1 -1
- package/package.json +4 -6
- package/dist/index-Bm8kx_6L.cjs +0 -8340
- package/dist/index-Bm8kx_6L.cjs.map +0 -1
- package/dist/index-DxD3Jxyb.mjs +0 -8317
- package/dist/index-DxD3Jxyb.mjs.map +0 -1
- package/dist/sync-suite-worker.cjs +0 -110
- package/dist/sync-suite-worker.cjs.map +0 -1
- package/dist/sync-suite-worker.mjs +0 -108
- package/dist/sync-suite-worker.mjs.map +0 -1
|
@@ -1,110 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var synckit = require('synckit');
|
|
4
|
-
var f = require('ws');
|
|
5
|
-
|
|
6
|
-
const SERVER_ERROR_CODES = {
|
|
7
|
-
AUTHENTICATION_FAILED: 1008
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
async function createSuiteAsync(input) {
|
|
11
|
-
const { apiKey, projectId, suitePayload, timeoutMs, wsUrl } = input;
|
|
12
|
-
return new Promise((resolve, reject) => {
|
|
13
|
-
const headers = {
|
|
14
|
-
Authorization: apiKey,
|
|
15
|
-
"x-project-id": projectId
|
|
16
|
-
};
|
|
17
|
-
const socket = new f(wsUrl, { headers });
|
|
18
|
-
let isResolved = false;
|
|
19
|
-
const timeout = setTimeout(() => {
|
|
20
|
-
if (!isResolved) {
|
|
21
|
-
isResolved = true;
|
|
22
|
-
socket.close();
|
|
23
|
-
reject(
|
|
24
|
-
new Error(
|
|
25
|
-
`Suite creation timed out after ${timeoutMs / 1e3}s. This usually means the connection to the Stably server could not be established.`
|
|
26
|
-
)
|
|
27
|
-
);
|
|
28
|
-
}
|
|
29
|
-
}, timeoutMs);
|
|
30
|
-
const cleanup = () => {
|
|
31
|
-
clearTimeout(timeout);
|
|
32
|
-
if (socket.readyState === f.OPEN) {
|
|
33
|
-
socket.close();
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
socket.on("message", (data) => {
|
|
37
|
-
if (isResolved) {
|
|
38
|
-
return;
|
|
39
|
-
}
|
|
40
|
-
try {
|
|
41
|
-
const dataStr = typeof data === "string" ? data : data.toString();
|
|
42
|
-
const message = JSON.parse(dataStr);
|
|
43
|
-
if (message.type === "connected") {
|
|
44
|
-
socket.send(
|
|
45
|
-
JSON.stringify({
|
|
46
|
-
payload: suitePayload,
|
|
47
|
-
type: "suite_start"
|
|
48
|
-
})
|
|
49
|
-
);
|
|
50
|
-
} else if (message.type === "suite_created") {
|
|
51
|
-
if (!message.id || !message.name || !message.url) {
|
|
52
|
-
isResolved = true;
|
|
53
|
-
cleanup();
|
|
54
|
-
reject(
|
|
55
|
-
new Error(
|
|
56
|
-
"Server sent suite_created with missing fields (id, name, or url)"
|
|
57
|
-
)
|
|
58
|
-
);
|
|
59
|
-
return;
|
|
60
|
-
}
|
|
61
|
-
isResolved = true;
|
|
62
|
-
cleanup();
|
|
63
|
-
resolve({
|
|
64
|
-
id: message.id,
|
|
65
|
-
name: message.name,
|
|
66
|
-
url: message.url
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
} catch (parseError) {
|
|
70
|
-
console.error(
|
|
71
|
-
`[sync-suite-worker] Failed to parse server message: ${parseError instanceof Error ? parseError.message : String(parseError)}`
|
|
72
|
-
);
|
|
73
|
-
}
|
|
74
|
-
});
|
|
75
|
-
socket.on("close", (code, reason) => {
|
|
76
|
-
if (isResolved) {
|
|
77
|
-
return;
|
|
78
|
-
}
|
|
79
|
-
isResolved = true;
|
|
80
|
-
cleanup();
|
|
81
|
-
if (code === SERVER_ERROR_CODES.AUTHENTICATION_FAILED) {
|
|
82
|
-
reject(
|
|
83
|
-
new Error(
|
|
84
|
-
`Authentication failed. Either the API Key or Project ID is invalid. These can be provided via stablyReporter({ apiKey, projectId }) in playwright.config.ts or environment variables (STABLY_API_KEY, STABLY_PROJECT_ID). You can find your API key and Project ID at https://app.stably.ai/settings?tab=api-key`
|
|
85
|
-
)
|
|
86
|
-
);
|
|
87
|
-
} else {
|
|
88
|
-
reject(
|
|
89
|
-
new Error(
|
|
90
|
-
`WebSocket connection closed unexpectedly (code: ${code}, reason: ${reason.toString()})`
|
|
91
|
-
)
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
});
|
|
95
|
-
socket.on("error", (error) => {
|
|
96
|
-
if (isResolved) {
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
isResolved = true;
|
|
100
|
-
cleanup();
|
|
101
|
-
reject(
|
|
102
|
-
new Error(
|
|
103
|
-
`Failed to connect to Stably server: ${error.message}. Please check your internet connection and try again.`
|
|
104
|
-
)
|
|
105
|
-
);
|
|
106
|
-
});
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
synckit.runAsWorker(createSuiteAsync);
|
|
110
|
-
//# sourceMappingURL=sync-suite-worker.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sync-suite-worker.cjs","sources":["../src/sync-suite-types.ts","../src/sync-suite-worker.ts"],"sourcesContent":["export type SuiteCreationInput = {\n wsUrl: string;\n apiKey: string;\n projectId: string;\n suitePayload: Record<string, unknown>;\n timeoutMs: number;\n};\n\nexport type SuiteCreationResult = {\n id: string;\n name: string;\n url: string;\n};\n\nexport const SERVER_ERROR_CODES = {\n AUTHENTICATION_FAILED: 1008,\n} as const;\n","import { runAsWorker } from \"synckit\";\nimport WebSocket from \"ws\";\n\nimport type {\n SuiteCreationInput,\n SuiteCreationResult,\n} from \"./sync-suite-types\";\nimport { SERVER_ERROR_CODES } from \"./sync-suite-types\";\n\nasync function createSuiteAsync(\n input: SuiteCreationInput,\n): Promise<SuiteCreationResult> {\n const { apiKey, projectId, suitePayload, timeoutMs, wsUrl } = input;\n\n return new Promise((resolve, reject) => {\n const headers = {\n Authorization: apiKey,\n \"x-project-id\": projectId,\n };\n\n const socket = new WebSocket(wsUrl, { headers });\n let isResolved = false;\n\n const timeout = setTimeout(() => {\n if (!isResolved) {\n isResolved = true;\n socket.close();\n reject(\n new Error(\n `Suite creation timed out after ${timeoutMs / 1000}s. ` +\n `This usually means the connection to the Stably server could not be established.`,\n ),\n );\n }\n }, timeoutMs);\n\n const cleanup = () => {\n clearTimeout(timeout);\n if (socket.readyState === WebSocket.OPEN) {\n socket.close();\n }\n };\n\n // Wait for auth confirmation (via \"connected\" message) before sending\n socket.on(\"message\", (data: WebSocket.Data) => {\n if (isResolved) {\n return;\n }\n\n try {\n const dataStr = typeof data === \"string\" ? data : data.toString();\n const message = JSON.parse(dataStr);\n\n if (message.type === \"connected\") {\n // Auth confirmed, send suite_start\n socket.send(\n JSON.stringify({\n payload: suitePayload,\n type: \"suite_start\",\n }),\n );\n } else if (message.type === \"suite_created\") {\n if (!message.id || !message.name || !message.url) {\n isResolved = true;\n cleanup();\n reject(\n new Error(\n \"Server sent suite_created with missing fields (id, name, or url)\",\n ),\n );\n return;\n }\n isResolved = true;\n cleanup();\n resolve({\n id: message.id,\n name: message.name,\n url: message.url,\n });\n }\n } catch (parseError) {\n console.error(\n `[sync-suite-worker] Failed to parse server message: ${parseError instanceof Error ? parseError.message : String(parseError)}`,\n );\n }\n });\n\n socket.on(\"close\", (code: number, reason: Buffer) => {\n if (isResolved) {\n return;\n }\n\n isResolved = true;\n cleanup();\n\n if (code === SERVER_ERROR_CODES.AUTHENTICATION_FAILED) {\n reject(\n new Error(\n `Authentication failed. Either the API Key or Project ID is invalid. ` +\n `These can be provided via stablyReporter({ apiKey, projectId }) in playwright.config.ts ` +\n `or environment variables (STABLY_API_KEY, STABLY_PROJECT_ID). ` +\n `You can find your API key and Project ID at https://app.stably.ai/settings?tab=api-key`,\n ),\n );\n } else {\n reject(\n new Error(\n `WebSocket connection closed unexpectedly (code: ${code}, reason: ${reason.toString()})`,\n ),\n );\n }\n });\n\n socket.on(\"error\", (error: Error) => {\n if (isResolved) {\n return;\n }\n\n isResolved = true;\n cleanup();\n reject(\n new Error(\n `Failed to connect to Stably server: ${error.message}. ` +\n `Please check your internet connection and try again.`,\n ),\n );\n });\n });\n}\n\nrunAsWorker(createSuiteAsync);\n"],"names":["WebSocket","runAsWorker"],"mappings":"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"}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { runAsWorker } from 'synckit';
|
|
2
|
-
import f from 'ws';
|
|
3
|
-
|
|
4
|
-
const SERVER_ERROR_CODES = {
|
|
5
|
-
AUTHENTICATION_FAILED: 1008
|
|
6
|
-
};
|
|
7
|
-
|
|
8
|
-
async function createSuiteAsync(input) {
|
|
9
|
-
const { apiKey, projectId, suitePayload, timeoutMs, wsUrl } = input;
|
|
10
|
-
return new Promise((resolve, reject) => {
|
|
11
|
-
const headers = {
|
|
12
|
-
Authorization: apiKey,
|
|
13
|
-
"x-project-id": projectId
|
|
14
|
-
};
|
|
15
|
-
const socket = new f(wsUrl, { headers });
|
|
16
|
-
let isResolved = false;
|
|
17
|
-
const timeout = setTimeout(() => {
|
|
18
|
-
if (!isResolved) {
|
|
19
|
-
isResolved = true;
|
|
20
|
-
socket.close();
|
|
21
|
-
reject(
|
|
22
|
-
new Error(
|
|
23
|
-
`Suite creation timed out after ${timeoutMs / 1e3}s. This usually means the connection to the Stably server could not be established.`
|
|
24
|
-
)
|
|
25
|
-
);
|
|
26
|
-
}
|
|
27
|
-
}, timeoutMs);
|
|
28
|
-
const cleanup = () => {
|
|
29
|
-
clearTimeout(timeout);
|
|
30
|
-
if (socket.readyState === f.OPEN) {
|
|
31
|
-
socket.close();
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
socket.on("message", (data) => {
|
|
35
|
-
if (isResolved) {
|
|
36
|
-
return;
|
|
37
|
-
}
|
|
38
|
-
try {
|
|
39
|
-
const dataStr = typeof data === "string" ? data : data.toString();
|
|
40
|
-
const message = JSON.parse(dataStr);
|
|
41
|
-
if (message.type === "connected") {
|
|
42
|
-
socket.send(
|
|
43
|
-
JSON.stringify({
|
|
44
|
-
payload: suitePayload,
|
|
45
|
-
type: "suite_start"
|
|
46
|
-
})
|
|
47
|
-
);
|
|
48
|
-
} else if (message.type === "suite_created") {
|
|
49
|
-
if (!message.id || !message.name || !message.url) {
|
|
50
|
-
isResolved = true;
|
|
51
|
-
cleanup();
|
|
52
|
-
reject(
|
|
53
|
-
new Error(
|
|
54
|
-
"Server sent suite_created with missing fields (id, name, or url)"
|
|
55
|
-
)
|
|
56
|
-
);
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
isResolved = true;
|
|
60
|
-
cleanup();
|
|
61
|
-
resolve({
|
|
62
|
-
id: message.id,
|
|
63
|
-
name: message.name,
|
|
64
|
-
url: message.url
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
} catch (parseError) {
|
|
68
|
-
console.error(
|
|
69
|
-
`[sync-suite-worker] Failed to parse server message: ${parseError instanceof Error ? parseError.message : String(parseError)}`
|
|
70
|
-
);
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
socket.on("close", (code, reason) => {
|
|
74
|
-
if (isResolved) {
|
|
75
|
-
return;
|
|
76
|
-
}
|
|
77
|
-
isResolved = true;
|
|
78
|
-
cleanup();
|
|
79
|
-
if (code === SERVER_ERROR_CODES.AUTHENTICATION_FAILED) {
|
|
80
|
-
reject(
|
|
81
|
-
new Error(
|
|
82
|
-
`Authentication failed. Either the API Key or Project ID is invalid. These can be provided via stablyReporter({ apiKey, projectId }) in playwright.config.ts or environment variables (STABLY_API_KEY, STABLY_PROJECT_ID). You can find your API key and Project ID at https://app.stably.ai/settings?tab=api-key`
|
|
83
|
-
)
|
|
84
|
-
);
|
|
85
|
-
} else {
|
|
86
|
-
reject(
|
|
87
|
-
new Error(
|
|
88
|
-
`WebSocket connection closed unexpectedly (code: ${code}, reason: ${reason.toString()})`
|
|
89
|
-
)
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
});
|
|
93
|
-
socket.on("error", (error) => {
|
|
94
|
-
if (isResolved) {
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
isResolved = true;
|
|
98
|
-
cleanup();
|
|
99
|
-
reject(
|
|
100
|
-
new Error(
|
|
101
|
-
`Failed to connect to Stably server: ${error.message}. Please check your internet connection and try again.`
|
|
102
|
-
)
|
|
103
|
-
);
|
|
104
|
-
});
|
|
105
|
-
});
|
|
106
|
-
}
|
|
107
|
-
runAsWorker(createSuiteAsync);
|
|
108
|
-
//# sourceMappingURL=sync-suite-worker.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sync-suite-worker.mjs","sources":["../src/sync-suite-types.ts","../src/sync-suite-worker.ts"],"sourcesContent":["export type SuiteCreationInput = {\n wsUrl: string;\n apiKey: string;\n projectId: string;\n suitePayload: Record<string, unknown>;\n timeoutMs: number;\n};\n\nexport type SuiteCreationResult = {\n id: string;\n name: string;\n url: string;\n};\n\nexport const SERVER_ERROR_CODES = {\n AUTHENTICATION_FAILED: 1008,\n} as const;\n","import { runAsWorker } from \"synckit\";\nimport WebSocket from \"ws\";\n\nimport type {\n SuiteCreationInput,\n SuiteCreationResult,\n} from \"./sync-suite-types\";\nimport { SERVER_ERROR_CODES } from \"./sync-suite-types\";\n\nasync function createSuiteAsync(\n input: SuiteCreationInput,\n): Promise<SuiteCreationResult> {\n const { apiKey, projectId, suitePayload, timeoutMs, wsUrl } = input;\n\n return new Promise((resolve, reject) => {\n const headers = {\n Authorization: apiKey,\n \"x-project-id\": projectId,\n };\n\n const socket = new WebSocket(wsUrl, { headers });\n let isResolved = false;\n\n const timeout = setTimeout(() => {\n if (!isResolved) {\n isResolved = true;\n socket.close();\n reject(\n new Error(\n `Suite creation timed out after ${timeoutMs / 1000}s. ` +\n `This usually means the connection to the Stably server could not be established.`,\n ),\n );\n }\n }, timeoutMs);\n\n const cleanup = () => {\n clearTimeout(timeout);\n if (socket.readyState === WebSocket.OPEN) {\n socket.close();\n }\n };\n\n // Wait for auth confirmation (via \"connected\" message) before sending\n socket.on(\"message\", (data: WebSocket.Data) => {\n if (isResolved) {\n return;\n }\n\n try {\n const dataStr = typeof data === \"string\" ? data : data.toString();\n const message = JSON.parse(dataStr);\n\n if (message.type === \"connected\") {\n // Auth confirmed, send suite_start\n socket.send(\n JSON.stringify({\n payload: suitePayload,\n type: \"suite_start\",\n }),\n );\n } else if (message.type === \"suite_created\") {\n if (!message.id || !message.name || !message.url) {\n isResolved = true;\n cleanup();\n reject(\n new Error(\n \"Server sent suite_created with missing fields (id, name, or url)\",\n ),\n );\n return;\n }\n isResolved = true;\n cleanup();\n resolve({\n id: message.id,\n name: message.name,\n url: message.url,\n });\n }\n } catch (parseError) {\n console.error(\n `[sync-suite-worker] Failed to parse server message: ${parseError instanceof Error ? parseError.message : String(parseError)}`,\n );\n }\n });\n\n socket.on(\"close\", (code: number, reason: Buffer) => {\n if (isResolved) {\n return;\n }\n\n isResolved = true;\n cleanup();\n\n if (code === SERVER_ERROR_CODES.AUTHENTICATION_FAILED) {\n reject(\n new Error(\n `Authentication failed. Either the API Key or Project ID is invalid. ` +\n `These can be provided via stablyReporter({ apiKey, projectId }) in playwright.config.ts ` +\n `or environment variables (STABLY_API_KEY, STABLY_PROJECT_ID). ` +\n `You can find your API key and Project ID at https://app.stably.ai/settings?tab=api-key`,\n ),\n );\n } else {\n reject(\n new Error(\n `WebSocket connection closed unexpectedly (code: ${code}, reason: ${reason.toString()})`,\n ),\n );\n }\n });\n\n socket.on(\"error\", (error: Error) => {\n if (isResolved) {\n return;\n }\n\n isResolved = true;\n cleanup();\n reject(\n new Error(\n `Failed to connect to Stably server: ${error.message}. ` +\n `Please check your internet connection and try again.`,\n ),\n );\n });\n });\n}\n\nrunAsWorker(createSuiteAsync);\n"],"names":["WebSocket"],"mappings":";;;AAcO,MAAM,kBAAA,GAAqB;AAAA,EAChC,qBAAA,EAAuB;AACzB,CAAA;;ACPA,eAAe,iBACb,KAAA,EAC8B;AAC9B,EAAA,MAAM,EAAE,MAAA,EAAQ,SAAA,EAAW,YAAA,EAAc,SAAA,EAAW,OAAM,GAAI,KAAA;AAE9D,EAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,aAAA,EAAe,MAAA;AAAA,MACf,cAAA,EAAgB;AAAA,KAClB;AAEA,IAAA,MAAM,SAAS,IAAIA,CAAA,CAAU,KAAA,EAAO,EAAE,SAAS,CAAA;AAC/C,IAAA,IAAI,UAAA,GAAa,KAAA;AAEjB,IAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,UAAA,GAAa,IAAA;AACb,QAAA,MAAA,CAAO,KAAA,EAAM;AACb,QAAA,MAAA;AAAA,UACE,IAAI,KAAA;AAAA,YACF,CAAA,+BAAA,EAAkC,YAAY,GAAI,CAAA,mFAAA;AAAA;AAEpD,SACF;AAAA,MACF;AAAA,IACF,GAAG,SAAS,CAAA;AAEZ,IAAA,MAAM,UAAU,MAAM;AACpB,MAAA,YAAA,CAAa,OAAO,CAAA;AACpB,MAAA,IAAI,MAAA,CAAO,UAAA,KAAeA,CAAA,CAAU,IAAA,EAAM;AACxC,QAAA,MAAA,CAAO,KAAA,EAAM;AAAA,MACf;AAAA,IACF,CAAA;AAGA,IAAA,MAAA,CAAO,EAAA,CAAG,SAAA,EAAW,CAAC,IAAA,KAAyB;AAC7C,MAAA,IAAI,UAAA,EAAY;AACd,QAAA;AAAA,MACF;AAEA,MAAA,IAAI;AACF,QAAA,MAAM,UAAU,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,KAAK,QAAA,EAAS;AAChE,QAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAElC,QAAA,IAAI,OAAA,CAAQ,SAAS,WAAA,EAAa;AAEhC,UAAA,MAAA,CAAO,IAAA;AAAA,YACL,KAAK,SAAA,CAAU;AAAA,cACb,OAAA,EAAS,YAAA;AAAA,cACT,IAAA,EAAM;AAAA,aACP;AAAA,WACH;AAAA,QACF,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,eAAA,EAAiB;AAC3C,UAAA,IAAI,CAAC,QAAQ,EAAA,IAAM,CAAC,QAAQ,IAAA,IAAQ,CAAC,QAAQ,GAAA,EAAK;AAChD,YAAA,UAAA,GAAa,IAAA;AACb,YAAA,OAAA,EAAQ;AACR,YAAA,MAAA;AAAA,cACE,IAAI,KAAA;AAAA,gBACF;AAAA;AACF,aACF;AACA,YAAA;AAAA,UACF;AACA,UAAA,UAAA,GAAa,IAAA;AACb,UAAA,OAAA,EAAQ;AACR,UAAA,OAAA,CAAQ;AAAA,YACN,IAAI,OAAA,CAAQ,EAAA;AAAA,YACZ,MAAM,OAAA,CAAQ,IAAA;AAAA,YACd,KAAK,OAAA,CAAQ;AAAA,WACd,CAAA;AAAA,QACH;AAAA,MACF,SAAS,UAAA,EAAY;AACnB,QAAA,OAAA,CAAQ,KAAA;AAAA,UACN,uDAAuD,UAAA,YAAsB,KAAA,GAAQ,WAAW,OAAA,GAAU,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,SAC9H;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,EAAc,MAAA,KAAmB;AACnD,MAAA,IAAI,UAAA,EAAY;AACd,QAAA;AAAA,MACF;AAEA,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,OAAA,EAAQ;AAER,MAAA,IAAI,IAAA,KAAS,mBAAmB,qBAAA,EAAuB;AACrD,QAAA,MAAA;AAAA,UACE,IAAI,KAAA;AAAA,YACF,CAAA,gTAAA;AAAA;AAIF,SACF;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAA;AAAA,UACE,IAAI,KAAA;AAAA,YACF,CAAA,gDAAA,EAAmD,IAAI,CAAA,UAAA,EAAa,MAAA,CAAO,UAAU,CAAA,CAAA;AAAA;AACvF,SACF;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAED,IAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAiB;AACnC,MAAA,IAAI,UAAA,EAAY;AACd,QAAA;AAAA,MACF;AAEA,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,OAAA,EAAQ;AACR,MAAA,MAAA;AAAA,QACE,IAAI,KAAA;AAAA,UACF,CAAA,oCAAA,EAAuC,MAAM,OAAO,CAAA,sDAAA;AAAA;AAEtD,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAEA,WAAA,CAAY,gBAAgB,CAAA"}
|