@mercuryo-ai/agentbrowse 0.2.50
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/CHANGELOG.md +15 -0
- package/README.md +335 -0
- package/dist/assistive-runtime.d.ts +110 -0
- package/dist/assistive-runtime.d.ts.map +1 -0
- package/dist/assistive-runtime.js +79 -0
- package/dist/assistive-runtime.test-support.d.ts +7 -0
- package/dist/assistive-runtime.test-support.d.ts.map +1 -0
- package/dist/assistive-runtime.test-support.js +106 -0
- package/dist/assistive-stagehand.d.ts +12 -0
- package/dist/assistive-stagehand.d.ts.map +1 -0
- package/dist/assistive-stagehand.js +10 -0
- package/dist/browser-session-state.d.ts +95 -0
- package/dist/browser-session-state.d.ts.map +1 -0
- package/dist/browser-session-state.js +279 -0
- package/dist/client-bindings.d.ts +10 -0
- package/dist/client-bindings.d.ts.map +1 -0
- package/dist/client-bindings.js +18 -0
- package/dist/client.d.ts +49 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +63 -0
- package/dist/command-api-tracing.d.ts +20 -0
- package/dist/command-api-tracing.d.ts.map +1 -0
- package/dist/command-api-tracing.js +149 -0
- package/dist/command-name.d.ts +3 -0
- package/dist/command-name.d.ts.map +1 -0
- package/dist/command-name.js +11 -0
- package/dist/commands/act.d.ts +43 -0
- package/dist/commands/act.d.ts.map +1 -0
- package/dist/commands/act.js +1107 -0
- package/dist/commands/action-acceptance.d.ts +93 -0
- package/dist/commands/action-acceptance.d.ts.map +1 -0
- package/dist/commands/action-acceptance.js +1938 -0
- package/dist/commands/action-artifacts.d.ts +33 -0
- package/dist/commands/action-artifacts.d.ts.map +1 -0
- package/dist/commands/action-artifacts.js +104 -0
- package/dist/commands/action-execution-guards.d.ts +5 -0
- package/dist/commands/action-execution-guards.d.ts.map +1 -0
- package/dist/commands/action-execution-guards.js +3 -0
- package/dist/commands/action-executor-helpers.d.ts +21 -0
- package/dist/commands/action-executor-helpers.d.ts.map +1 -0
- package/dist/commands/action-executor-helpers.js +265 -0
- package/dist/commands/action-executor.d.ts +14 -0
- package/dist/commands/action-executor.d.ts.map +1 -0
- package/dist/commands/action-executor.js +46 -0
- package/dist/commands/action-fallbacks.d.ts +6 -0
- package/dist/commands/action-fallbacks.d.ts.map +1 -0
- package/dist/commands/action-fallbacks.js +43 -0
- package/dist/commands/action-result-resolution.d.ts +17 -0
- package/dist/commands/action-result-resolution.d.ts.map +1 -0
- package/dist/commands/action-result-resolution.js +132 -0
- package/dist/commands/action-value-projection.d.ts +32 -0
- package/dist/commands/action-value-projection.d.ts.map +1 -0
- package/dist/commands/action-value-projection.js +151 -0
- package/dist/commands/attach.d.ts +41 -0
- package/dist/commands/attach.d.ts.map +1 -0
- package/dist/commands/attach.js +103 -0
- package/dist/commands/browse-actions.d.ts +4 -0
- package/dist/commands/browse-actions.d.ts.map +1 -0
- package/dist/commands/browse-actions.js +4 -0
- package/dist/commands/browser-status.d.ts +57 -0
- package/dist/commands/browser-status.d.ts.map +1 -0
- package/dist/commands/browser-status.js +243 -0
- package/dist/commands/click-action-executor.d.ts +12 -0
- package/dist/commands/click-action-executor.d.ts.map +1 -0
- package/dist/commands/click-action-executor.js +111 -0
- package/dist/commands/click-activation-policy.d.ts +5 -0
- package/dist/commands/click-activation-policy.d.ts.map +1 -0
- package/dist/commands/click-activation-policy.js +13 -0
- package/dist/commands/close.d.ts +26 -0
- package/dist/commands/close.d.ts.map +1 -0
- package/dist/commands/close.js +124 -0
- package/dist/commands/datepicker-action-executor.d.ts +12 -0
- package/dist/commands/datepicker-action-executor.d.ts.map +1 -0
- package/dist/commands/datepicker-action-executor.js +218 -0
- package/dist/commands/descriptor-validation.d.ts +27 -0
- package/dist/commands/descriptor-validation.d.ts.map +1 -0
- package/dist/commands/descriptor-validation.js +192 -0
- package/dist/commands/extract-scope-resolution.d.ts +20 -0
- package/dist/commands/extract-scope-resolution.d.ts.map +1 -0
- package/dist/commands/extract-scope-resolution.js +109 -0
- package/dist/commands/extract-scoped-dialog-text.d.ts +3 -0
- package/dist/commands/extract-scoped-dialog-text.d.ts.map +1 -0
- package/dist/commands/extract-scoped-dialog-text.js +210 -0
- package/dist/commands/extract-snapshot-sanitizer.d.ts +5 -0
- package/dist/commands/extract-snapshot-sanitizer.d.ts.map +1 -0
- package/dist/commands/extract-snapshot-sanitizer.js +98 -0
- package/dist/commands/extract-stagehand-executor.d.ts +17 -0
- package/dist/commands/extract-stagehand-executor.d.ts.map +1 -0
- package/dist/commands/extract-stagehand-executor.js +112 -0
- package/dist/commands/extract.d.ts +57 -0
- package/dist/commands/extract.d.ts.map +1 -0
- package/dist/commands/extract.js +668 -0
- package/dist/commands/interaction-kernel.d.ts +46 -0
- package/dist/commands/interaction-kernel.d.ts.map +1 -0
- package/dist/commands/interaction-kernel.js +215 -0
- package/dist/commands/launch.d.ts +41 -0
- package/dist/commands/launch.d.ts.map +1 -0
- package/dist/commands/launch.js +182 -0
- package/dist/commands/navigate.d.ts +31 -0
- package/dist/commands/navigate.d.ts.map +1 -0
- package/dist/commands/navigate.js +202 -0
- package/dist/commands/observe-accessibility.d.ts +22 -0
- package/dist/commands/observe-accessibility.d.ts.map +1 -0
- package/dist/commands/observe-accessibility.js +566 -0
- package/dist/commands/observe-display-label.d.ts +4 -0
- package/dist/commands/observe-display-label.d.ts.map +1 -0
- package/dist/commands/observe-display-label.js +26 -0
- package/dist/commands/observe-dom-label-contract.d.ts +2 -0
- package/dist/commands/observe-dom-label-contract.d.ts.map +1 -0
- package/dist/commands/observe-dom-label-contract.js +564 -0
- package/dist/commands/observe-fallback-semantics.d.ts +6 -0
- package/dist/commands/observe-fallback-semantics.d.ts.map +1 -0
- package/dist/commands/observe-fallback-semantics.js +86 -0
- package/dist/commands/observe-inventory.d.ts +149 -0
- package/dist/commands/observe-inventory.d.ts.map +1 -0
- package/dist/commands/observe-inventory.js +3545 -0
- package/dist/commands/observe-label-policy.d.ts +8 -0
- package/dist/commands/observe-label-policy.d.ts.map +1 -0
- package/dist/commands/observe-label-policy.js +21 -0
- package/dist/commands/observe-page-state.d.ts +11 -0
- package/dist/commands/observe-page-state.d.ts.map +1 -0
- package/dist/commands/observe-page-state.js +89 -0
- package/dist/commands/observe-persistence.d.ts +15 -0
- package/dist/commands/observe-persistence.d.ts.map +1 -0
- package/dist/commands/observe-persistence.js +238 -0
- package/dist/commands/observe-projection.d.ts +119 -0
- package/dist/commands/observe-projection.d.ts.map +1 -0
- package/dist/commands/observe-projection.js +726 -0
- package/dist/commands/observe-protected.d.ts +6 -0
- package/dist/commands/observe-protected.d.ts.map +1 -0
- package/dist/commands/observe-protected.js +31 -0
- package/dist/commands/observe-semantics.d.ts +10 -0
- package/dist/commands/observe-semantics.d.ts.map +1 -0
- package/dist/commands/observe-semantics.js +535 -0
- package/dist/commands/observe-signals.d.ts +48 -0
- package/dist/commands/observe-signals.d.ts.map +1 -0
- package/dist/commands/observe-signals.js +461 -0
- package/dist/commands/observe-stagehand.d.ts +49 -0
- package/dist/commands/observe-stagehand.d.ts.map +1 -0
- package/dist/commands/observe-stagehand.js +94 -0
- package/dist/commands/observe-surfaces.d.ts +11 -0
- package/dist/commands/observe-surfaces.d.ts.map +1 -0
- package/dist/commands/observe-surfaces.js +290 -0
- package/dist/commands/observe.d.ts +113 -0
- package/dist/commands/observe.d.ts.map +1 -0
- package/dist/commands/observe.js +556 -0
- package/dist/commands/screenshot.d.ts +37 -0
- package/dist/commands/screenshot.d.ts.map +1 -0
- package/dist/commands/screenshot.js +269 -0
- package/dist/commands/select-action-executor.d.ts +10 -0
- package/dist/commands/select-action-executor.d.ts.map +1 -0
- package/dist/commands/select-action-executor.js +156 -0
- package/dist/commands/semantic-observe-lexical.d.ts +31 -0
- package/dist/commands/semantic-observe-lexical.d.ts.map +1 -0
- package/dist/commands/semantic-observe-lexical.js +186 -0
- package/dist/commands/semantic-observe.d.ts +37 -0
- package/dist/commands/semantic-observe.d.ts.map +1 -0
- package/dist/commands/semantic-observe.js +1339 -0
- package/dist/commands/structured-grid-action-executor.d.ts +3 -0
- package/dist/commands/structured-grid-action-executor.d.ts.map +1 -0
- package/dist/commands/structured-grid-action-executor.js +4 -0
- package/dist/commands/target-resolution.d.ts +4 -0
- package/dist/commands/target-resolution.d.ts.map +1 -0
- package/dist/commands/target-resolution.js +33 -0
- package/dist/commands/text-input-action-executor.d.ts +5 -0
- package/dist/commands/text-input-action-executor.d.ts.map +1 -0
- package/dist/commands/text-input-action-executor.js +116 -0
- package/dist/commands/user-actionable.d.ts +4 -0
- package/dist/commands/user-actionable.d.ts.map +1 -0
- package/dist/commands/user-actionable.js +216 -0
- package/dist/control-semantics.d.ts +30 -0
- package/dist/control-semantics.d.ts.map +1 -0
- package/dist/control-semantics.js +419 -0
- package/dist/diagnostics.d.ts +132 -0
- package/dist/diagnostics.d.ts.map +1 -0
- package/dist/diagnostics.js +120 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +350 -0
- package/dist/library.d.ts +17 -0
- package/dist/library.d.ts.map +1 -0
- package/dist/library.js +14 -0
- package/dist/output.d.ts +32 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +33 -0
- package/dist/owned-browser.d.ts +12 -0
- package/dist/owned-browser.d.ts.map +1 -0
- package/dist/owned-browser.js +69 -0
- package/dist/owned-process.d.ts +19 -0
- package/dist/owned-process.d.ts.map +1 -0
- package/dist/owned-process.js +145 -0
- package/dist/playwright-runtime.d.ts +43 -0
- package/dist/playwright-runtime.d.ts.map +1 -0
- package/dist/playwright-runtime.js +339 -0
- package/dist/protected-fill-browser.d.ts +22 -0
- package/dist/protected-fill-browser.d.ts.map +1 -0
- package/dist/protected-fill-browser.js +52 -0
- package/dist/protected-fill.d.ts +82 -0
- package/dist/protected-fill.d.ts.map +1 -0
- package/dist/protected-fill.js +20 -0
- package/dist/runtime-metrics.d.ts +27 -0
- package/dist/runtime-metrics.d.ts.map +1 -0
- package/dist/runtime-metrics.js +66 -0
- package/dist/runtime-page-state.d.ts +11 -0
- package/dist/runtime-page-state.d.ts.map +1 -0
- package/dist/runtime-page-state.js +62 -0
- package/dist/runtime-protected-state.d.ts +14 -0
- package/dist/runtime-protected-state.d.ts.map +1 -0
- package/dist/runtime-protected-state.js +148 -0
- package/dist/runtime-resolution.d.ts +9 -0
- package/dist/runtime-resolution.d.ts.map +1 -0
- package/dist/runtime-resolution.js +19 -0
- package/dist/runtime-state.d.ts +251 -0
- package/dist/runtime-state.d.ts.map +1 -0
- package/dist/runtime-state.js +599 -0
- package/dist/secrets/catalog-applicability.d.ts +5 -0
- package/dist/secrets/catalog-applicability.d.ts.map +1 -0
- package/dist/secrets/catalog-applicability.js +59 -0
- package/dist/secrets/field-policy.d.ts +3 -0
- package/dist/secrets/field-policy.d.ts.map +1 -0
- package/dist/secrets/field-policy.js +3 -0
- package/dist/secrets/fill-ordering.d.ts +10 -0
- package/dist/secrets/fill-ordering.d.ts.map +1 -0
- package/dist/secrets/fill-ordering.js +41 -0
- package/dist/secrets/form-matcher.d.ts +60 -0
- package/dist/secrets/form-matcher.d.ts.map +1 -0
- package/dist/secrets/form-matcher.js +948 -0
- package/dist/secrets/protected-artifact-guard.d.ts +39 -0
- package/dist/secrets/protected-artifact-guard.d.ts.map +1 -0
- package/dist/secrets/protected-artifact-guard.js +44 -0
- package/dist/secrets/protected-bindings.d.ts +14 -0
- package/dist/secrets/protected-bindings.d.ts.map +1 -0
- package/dist/secrets/protected-bindings.js +29 -0
- package/dist/secrets/protected-exact-value-redaction.d.ts +14 -0
- package/dist/secrets/protected-exact-value-redaction.d.ts.map +1 -0
- package/dist/secrets/protected-exact-value-redaction.js +360 -0
- package/dist/secrets/protected-field-semantics.d.ts +9 -0
- package/dist/secrets/protected-field-semantics.d.ts.map +1 -0
- package/dist/secrets/protected-field-semantics.js +154 -0
- package/dist/secrets/protected-field-values.d.ts +15 -0
- package/dist/secrets/protected-field-values.d.ts.map +1 -0
- package/dist/secrets/protected-field-values.js +131 -0
- package/dist/secrets/protected-fill.d.ts +47 -0
- package/dist/secrets/protected-fill.d.ts.map +1 -0
- package/dist/secrets/protected-fill.js +446 -0
- package/dist/secrets/protected-value-adapters.d.ts +4 -0
- package/dist/secrets/protected-value-adapters.d.ts.map +1 -0
- package/dist/secrets/protected-value-adapters.js +118 -0
- package/dist/secrets/types.d.ts +70 -0
- package/dist/secrets/types.d.ts.map +1 -0
- package/dist/secrets/types.js +30 -0
- package/dist/session.d.ts +19 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +120 -0
- package/dist/solver/browser-launcher.d.ts +14 -0
- package/dist/solver/browser-launcher.d.ts.map +1 -0
- package/dist/solver/browser-launcher.js +799 -0
- package/dist/solver/config.d.ts +18 -0
- package/dist/solver/config.d.ts.map +1 -0
- package/dist/solver/config.js +67 -0
- package/dist/solver/fingerprint.d.ts +9 -0
- package/dist/solver/fingerprint.d.ts.map +1 -0
- package/dist/solver/fingerprint.js +96 -0
- package/dist/solver/profile-manager.d.ts +8 -0
- package/dist/solver/profile-manager.d.ts.map +1 -0
- package/dist/solver/profile-manager.js +74 -0
- package/dist/solver/turnstile-challenge.d.ts +3 -0
- package/dist/solver/turnstile-challenge.d.ts.map +1 -0
- package/dist/solver/turnstile-challenge.js +173 -0
- package/dist/solver/types.d.ts +67 -0
- package/dist/solver/types.d.ts.map +1 -0
- package/dist/solver/types.js +1 -0
- package/dist/stagehand-runtime.d.ts +4 -0
- package/dist/stagehand-runtime.d.ts.map +1 -0
- package/dist/stagehand-runtime.js +10 -0
- package/dist/stagehand.d.ts +15 -0
- package/dist/stagehand.d.ts.map +1 -0
- package/dist/stagehand.js +19 -0
- package/dist/testing.d.ts +5 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +4 -0
- package/dist/update-check.d.ts +14 -0
- package/dist/update-check.d.ts.map +1 -0
- package/dist/update-check.js +182 -0
- package/dist/workflow-session-state.d.ts +30 -0
- package/dist/workflow-session-state.d.ts.map +1 -0
- package/dist/workflow-session-state.js +74 -0
- package/docs/README.md +25 -0
- package/docs/api-reference.md +242 -0
- package/docs/assistive-runtime.md +148 -0
- package/docs/configuration.md +287 -0
- package/docs/getting-started.md +237 -0
- package/docs/integration-checklist.md +36 -0
- package/docs/protected-fill.md +112 -0
- package/docs/testing.md +50 -0
- package/docs/troubleshooting.md +71 -0
- package/examples/README.md +18 -0
- package/examples/attach.ts +27 -0
- package/examples/basic.ts +36 -0
- package/examples/extract.ts +50 -0
- package/package.json +83 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-grid-action-executor.d.ts","sourceRoot":"","sources":["../../src/commands/structured-grid-action-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAGrD,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,OAAO,CAAC,CAElB"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Locator, Page } from 'playwright-core';
|
|
2
|
+
import type { SurfaceDescriptor } from '../runtime-state.js';
|
|
3
|
+
export declare function resolveSurfaceScopeRoot(page: Page, surface: SurfaceDescriptor | null, attempts?: string[]): Promise<Locator | null>;
|
|
4
|
+
//# sourceMappingURL=target-resolution.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target-resolution.d.ts","sourceRoot":"","sources":["../../src/commands/target-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAK7D,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,iBAAiB,GAAG,IAAI,EACjC,QAAQ,CAAC,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAoCzB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { buildLocator, resolveLocatorRoot } from './action-fallbacks.js';
|
|
2
|
+
const STRUCTURAL_SURFACE_STRATEGIES = new Set(['css', 'xpath', 'testId', 'role']);
|
|
3
|
+
export async function resolveSurfaceScopeRoot(page, surface, attempts) {
|
|
4
|
+
if (!surface) {
|
|
5
|
+
return null;
|
|
6
|
+
}
|
|
7
|
+
const baseRoot = resolveLocatorRoot(page, surface.framePath);
|
|
8
|
+
for (const candidate of surface.locatorCandidates) {
|
|
9
|
+
if (!STRUCTURAL_SURFACE_STRATEGIES.has(candidate.strategy)) {
|
|
10
|
+
continue;
|
|
11
|
+
}
|
|
12
|
+
attempts?.push(`surface.resolve:${candidate.strategy}`);
|
|
13
|
+
const locator = buildLocator(baseRoot, candidate);
|
|
14
|
+
if (!locator) {
|
|
15
|
+
attempts?.push(`surface.resolve.skip:${candidate.strategy}:unsupported`);
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
const count = await locator.count().catch(() => 0);
|
|
19
|
+
if (count === 0) {
|
|
20
|
+
attempts?.push(`surface.resolve.skip:${candidate.strategy}:empty`);
|
|
21
|
+
continue;
|
|
22
|
+
}
|
|
23
|
+
const resolvedSurface = locator.first();
|
|
24
|
+
const visible = await resolvedSurface.isVisible().catch(() => false);
|
|
25
|
+
if (!visible) {
|
|
26
|
+
attempts?.push(`surface.resolve.skip:${candidate.strategy}:hidden`);
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
attempts?.push(`surface.resolve.ok:${candidate.strategy}`);
|
|
30
|
+
return resolvedSurface;
|
|
31
|
+
}
|
|
32
|
+
return null;
|
|
33
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Locator, Page } from 'playwright-core';
|
|
2
|
+
import { type ActionExecutionGuards } from './action-execution-guards.js';
|
|
3
|
+
export declare function applyTextFillAction(page: Page, locator: Locator, value: string, attempts: string[], guards?: ActionExecutionGuards): Promise<boolean>;
|
|
4
|
+
export declare function applyTypeAction(page: Page, locator: Locator, value: string, attempts: string[], guards?: ActionExecutionGuards): Promise<boolean>;
|
|
5
|
+
//# sourceMappingURL=text-input-action-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-input-action-executor.d.ts","sourceRoot":"","sources":["../../src/commands/text-input-action-executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAYrD,OAAO,EAA2B,KAAK,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAEnG,wBAAsB,mBAAmB,CACvC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,OAAO,CAAC,CA6FlB;AAED,wBAAsB,eAAe,CACnC,IAAI,EAAE,IAAI,EACV,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAAE,EAClB,MAAM,CAAC,EAAE,qBAAqB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAqBlB"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { LOCATOR_FILL_TIMEOUT_MS, applyValueWithJsFallback, blurLocator, clearLocatorForReplacement, deriveMaskedSequentialValue, focusLocator, normalizeFillValue, planTextFillStrategy, readLocatorCurrentValue, } from './action-executor-helpers.js';
|
|
2
|
+
import { runActionExecutionGuard } from './action-execution-guards.js';
|
|
3
|
+
export async function applyTextFillAction(page, locator, value, attempts, guards) {
|
|
4
|
+
const { normalizedValue, preferSequential, settleMs, initialPhonePrefix, blurAfterFill } = await planTextFillStrategy(locator, value, attempts);
|
|
5
|
+
if (preferSequential) {
|
|
6
|
+
await focusLocator(page, locator, attempts);
|
|
7
|
+
await clearLocatorForReplacement(locator, attempts);
|
|
8
|
+
const residualValue = await readLocatorCurrentValue(locator);
|
|
9
|
+
const sequentialValue = deriveMaskedSequentialValue(normalizedValue, residualValue, initialPhonePrefix, attempts);
|
|
10
|
+
if (typeof locator.pressSequentially === 'function') {
|
|
11
|
+
attempts.push('locator.pressSequentially.masked');
|
|
12
|
+
try {
|
|
13
|
+
await runActionExecutionGuard(guards, 'fill.masked.press-sequentially');
|
|
14
|
+
await locator.pressSequentially(sequentialValue);
|
|
15
|
+
if (settleMs > 0 && typeof page.waitForTimeout === 'function') {
|
|
16
|
+
attempts.push(`fill.settle:${settleMs}`);
|
|
17
|
+
await page.waitForTimeout(settleMs);
|
|
18
|
+
}
|
|
19
|
+
if (blurAfterFill) {
|
|
20
|
+
await blurLocator(locator, attempts);
|
|
21
|
+
}
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// Fall through to fill/js fallback with the normalized masked value.
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
attempts.push('locator.fill.masked-fallback');
|
|
29
|
+
try {
|
|
30
|
+
await runActionExecutionGuard(guards, 'fill.masked.fill');
|
|
31
|
+
await locator.fill(sequentialValue, { timeout: LOCATOR_FILL_TIMEOUT_MS });
|
|
32
|
+
if (settleMs > 0 && typeof page.waitForTimeout === 'function') {
|
|
33
|
+
attempts.push(`fill.settle:${settleMs}`);
|
|
34
|
+
await page.waitForTimeout(settleMs);
|
|
35
|
+
}
|
|
36
|
+
if (blurAfterFill) {
|
|
37
|
+
await blurLocator(locator, attempts);
|
|
38
|
+
}
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
await runActionExecutionGuard(guards, 'fill.masked.js-fallback');
|
|
43
|
+
await applyValueWithJsFallback(locator, sequentialValue, attempts);
|
|
44
|
+
if (blurAfterFill) {
|
|
45
|
+
await blurLocator(locator, attempts);
|
|
46
|
+
}
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const directFillValue = await normalizeFillValue(locator, normalizedValue, attempts);
|
|
51
|
+
attempts.push('locator.fill');
|
|
52
|
+
try {
|
|
53
|
+
await locator.fill(directFillValue, { timeout: LOCATOR_FILL_TIMEOUT_MS });
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
await runActionExecutionGuard(guards, 'fill.after-error');
|
|
58
|
+
await focusLocator(page, locator, attempts);
|
|
59
|
+
await clearLocatorForReplacement(locator, attempts);
|
|
60
|
+
if (typeof locator.pressSequentially === 'function') {
|
|
61
|
+
attempts.push('locator.pressSequentially');
|
|
62
|
+
try {
|
|
63
|
+
await runActionExecutionGuard(guards, 'fill.press-sequentially');
|
|
64
|
+
await locator.pressSequentially(directFillValue);
|
|
65
|
+
if (blurAfterFill) {
|
|
66
|
+
await blurLocator(locator, attempts);
|
|
67
|
+
}
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Fall through to retry and DOM-event fallback.
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
attempts.push('locator.fill.retry');
|
|
75
|
+
try {
|
|
76
|
+
await runActionExecutionGuard(guards, 'fill.retry');
|
|
77
|
+
await locator.fill(directFillValue, { timeout: LOCATOR_FILL_TIMEOUT_MS });
|
|
78
|
+
if (blurAfterFill) {
|
|
79
|
+
await blurLocator(locator, attempts);
|
|
80
|
+
}
|
|
81
|
+
return true;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
await runActionExecutionGuard(guards, 'fill.js-fallback');
|
|
85
|
+
await applyValueWithJsFallback(locator, directFillValue, attempts);
|
|
86
|
+
}
|
|
87
|
+
if (blurAfterFill) {
|
|
88
|
+
await blurLocator(locator, attempts);
|
|
89
|
+
}
|
|
90
|
+
return true;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
export async function applyTypeAction(page, locator, value, attempts, guards) {
|
|
94
|
+
await focusLocator(page, locator, attempts);
|
|
95
|
+
if (typeof locator.pressSequentially === 'function') {
|
|
96
|
+
attempts.push('locator.pressSequentially');
|
|
97
|
+
try {
|
|
98
|
+
await runActionExecutionGuard(guards, 'type.press-sequentially');
|
|
99
|
+
await locator.pressSequentially(value);
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
catch {
|
|
103
|
+
// Fall through to fill/DOM-event fallback.
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
attempts.push('locator.fill');
|
|
107
|
+
try {
|
|
108
|
+
await runActionExecutionGuard(guards, 'type.fill');
|
|
109
|
+
await locator.fill(value, { timeout: LOCATOR_FILL_TIMEOUT_MS });
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
await runActionExecutionGuard(guards, 'type.js-fallback');
|
|
113
|
+
await applyValueWithJsFallback(locator, value, attempts);
|
|
114
|
+
}
|
|
115
|
+
return true;
|
|
116
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-actionable.d.ts","sourceRoot":"","sources":["../../src/commands/user-actionable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,eAAO,MAAM,4CAA4C,QAoHxD,CAAC;AAEF,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAmIhF"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
export const TRANSPARENT_ACTIONABLE_CONTROL_HELPER_SCRIPT = String.raw `
|
|
2
|
+
const credibleLabelTextOf = (element) => {
|
|
3
|
+
if (!isHTMLElementNode(element)) {
|
|
4
|
+
return '';
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
const normalizeText = (value) => (value ?? '').replace(/\s+/g, ' ').trim();
|
|
8
|
+
const labelledByTextOf = (candidate) => {
|
|
9
|
+
const labelledBy = candidate.getAttribute?.('aria-labelledby')?.trim?.();
|
|
10
|
+
if (!labelledBy) {
|
|
11
|
+
return '';
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
return normalizeText(
|
|
15
|
+
labelledBy
|
|
16
|
+
.split(/\s+/)
|
|
17
|
+
.map((id) => candidate.ownerDocument?.getElementById?.(id)?.textContent ?? '')
|
|
18
|
+
.join(' ')
|
|
19
|
+
);
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
const directLabel =
|
|
23
|
+
normalizeText(element.getAttribute?.('aria-label')) ||
|
|
24
|
+
labelledByTextOf(element) ||
|
|
25
|
+
normalizeText(element.labels?.[0]?.textContent ?? '');
|
|
26
|
+
if (directLabel) {
|
|
27
|
+
return directLabel;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let current = element.parentElement;
|
|
31
|
+
let depth = 0;
|
|
32
|
+
while (isHTMLElementNode(current) && depth < 3) {
|
|
33
|
+
const inheritedLabel = labelledByTextOf(current);
|
|
34
|
+
if (inheritedLabel) {
|
|
35
|
+
return inheritedLabel;
|
|
36
|
+
}
|
|
37
|
+
current = current.parentElement;
|
|
38
|
+
depth += 1;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return '';
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const isTransparentActionableControl = (element) => {
|
|
45
|
+
if (!isHTMLElementNode(element)) {
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const tag = element.tagName?.toLowerCase?.() ?? '';
|
|
50
|
+
const role = (element.getAttribute?.('role') || '').trim().toLowerCase();
|
|
51
|
+
const isNativeControl =
|
|
52
|
+
tag === 'input' || tag === 'textarea' || tag === 'select' || element.isContentEditable;
|
|
53
|
+
const isInteractiveRole =
|
|
54
|
+
role === 'textbox' || role === 'combobox' || role === 'searchbox' || role === 'spinbutton';
|
|
55
|
+
if (!isNativeControl && !isInteractiveRole) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const view = ownerWindowOf(element);
|
|
60
|
+
const style = view?.getComputedStyle?.(element);
|
|
61
|
+
if (
|
|
62
|
+
!style ||
|
|
63
|
+
style.display === 'none' ||
|
|
64
|
+
style.visibility === 'hidden' ||
|
|
65
|
+
style.visibility === 'collapse' ||
|
|
66
|
+
style.pointerEvents === 'none'
|
|
67
|
+
) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const rect = element.getBoundingClientRect();
|
|
72
|
+
if (rect.width <= 0 || rect.height <= 0) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const documentNode = element.ownerDocument;
|
|
77
|
+
if (!documentNode?.elementFromPoint) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const viewportWidth = Math.max(
|
|
82
|
+
0,
|
|
83
|
+
Number(view?.innerWidth ?? documentNode?.documentElement?.clientWidth ?? 0)
|
|
84
|
+
);
|
|
85
|
+
const viewportHeight = Math.max(
|
|
86
|
+
0,
|
|
87
|
+
Number(view?.innerHeight ?? documentNode?.documentElement?.clientHeight ?? 0)
|
|
88
|
+
);
|
|
89
|
+
const visibleLeft = viewportWidth > 0 ? Math.max(0, rect.left) : rect.left;
|
|
90
|
+
const visibleRight = viewportWidth > 0 ? Math.min(viewportWidth, rect.right) : rect.right;
|
|
91
|
+
const visibleTop = viewportHeight > 0 ? Math.max(0, rect.top) : rect.top;
|
|
92
|
+
const visibleBottom = viewportHeight > 0 ? Math.min(viewportHeight, rect.bottom) : rect.bottom;
|
|
93
|
+
if (visibleRight <= visibleLeft || visibleBottom <= visibleTop) {
|
|
94
|
+
return Boolean(credibleLabelTextOf(element));
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const samplePoints = [
|
|
98
|
+
[visibleLeft + (visibleRight - visibleLeft) / 2, visibleTop + (visibleBottom - visibleTop) / 2],
|
|
99
|
+
[
|
|
100
|
+
Math.max(visibleLeft + 1, visibleLeft + (visibleRight - visibleLeft) * 0.25),
|
|
101
|
+
visibleTop + (visibleBottom - visibleTop) / 2,
|
|
102
|
+
],
|
|
103
|
+
[
|
|
104
|
+
Math.min(visibleRight - 1, visibleLeft + (visibleRight - visibleLeft) * 0.75),
|
|
105
|
+
visibleTop + (visibleBottom - visibleTop) / 2,
|
|
106
|
+
],
|
|
107
|
+
];
|
|
108
|
+
|
|
109
|
+
return samplePoints.some(([x, y]) => {
|
|
110
|
+
const hit = documentNode.elementFromPoint(x, y);
|
|
111
|
+
return (
|
|
112
|
+
isHTMLElementNode(hit) &&
|
|
113
|
+
(hit === element || element.contains(hit) || hit.contains(element))
|
|
114
|
+
);
|
|
115
|
+
});
|
|
116
|
+
};
|
|
117
|
+
`;
|
|
118
|
+
export async function isLocatorUserActionable(locator) {
|
|
119
|
+
const visible = await locator.isVisible().catch(() => false);
|
|
120
|
+
if (visible) {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
return locator
|
|
124
|
+
.evaluate((element) => {
|
|
125
|
+
if (!(element instanceof HTMLElement)) {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
const tag = element.tagName.toLowerCase();
|
|
129
|
+
const role = (element.getAttribute('role') || '').trim().toLowerCase();
|
|
130
|
+
const isNativeControl = tag === 'input' || tag === 'textarea' || tag === 'select' || element.isContentEditable;
|
|
131
|
+
const isInteractiveRole = role === 'textbox' || role === 'combobox' || role === 'searchbox' || role === 'spinbutton';
|
|
132
|
+
if (!isNativeControl && !isInteractiveRole) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
const style = element.ownerDocument.defaultView?.getComputedStyle(element);
|
|
136
|
+
if (!style ||
|
|
137
|
+
style.display === 'none' ||
|
|
138
|
+
style.visibility === 'hidden' ||
|
|
139
|
+
style.visibility === 'collapse' ||
|
|
140
|
+
style.pointerEvents === 'none') {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
const rect = element.getBoundingClientRect();
|
|
144
|
+
if (rect.width <= 0 || rect.height <= 0) {
|
|
145
|
+
return false;
|
|
146
|
+
}
|
|
147
|
+
const credibleLabelTextOf = (candidate) => {
|
|
148
|
+
const normalizeText = (value) => (value ?? '').replace(/\s+/g, ' ').trim();
|
|
149
|
+
const labelledByTextOf = (labelCandidate) => {
|
|
150
|
+
const labelledBy = labelCandidate.getAttribute('aria-labelledby')?.trim();
|
|
151
|
+
if (!labelledBy) {
|
|
152
|
+
return '';
|
|
153
|
+
}
|
|
154
|
+
return normalizeText(labelledBy
|
|
155
|
+
.split(/\s+/)
|
|
156
|
+
.map((id) => labelCandidate.ownerDocument.getElementById(id)?.textContent ?? '')
|
|
157
|
+
.join(' '));
|
|
158
|
+
};
|
|
159
|
+
const labelsText = candidate instanceof HTMLInputElement ||
|
|
160
|
+
candidate instanceof HTMLTextAreaElement ||
|
|
161
|
+
candidate instanceof HTMLSelectElement
|
|
162
|
+
? normalizeText(candidate.labels?.[0]?.textContent ?? '')
|
|
163
|
+
: '';
|
|
164
|
+
const directLabel = normalizeText(candidate.getAttribute('aria-label')) ||
|
|
165
|
+
labelledByTextOf(candidate) ||
|
|
166
|
+
labelsText;
|
|
167
|
+
if (directLabel) {
|
|
168
|
+
return directLabel;
|
|
169
|
+
}
|
|
170
|
+
let current = candidate.parentElement;
|
|
171
|
+
let depth = 0;
|
|
172
|
+
while (current instanceof HTMLElement && depth < 3) {
|
|
173
|
+
const inheritedLabel = labelledByTextOf(current);
|
|
174
|
+
if (inheritedLabel) {
|
|
175
|
+
return inheritedLabel;
|
|
176
|
+
}
|
|
177
|
+
current = current.parentElement;
|
|
178
|
+
depth += 1;
|
|
179
|
+
}
|
|
180
|
+
return '';
|
|
181
|
+
};
|
|
182
|
+
const viewportWidth = Math.max(0, Number(element.ownerDocument.defaultView?.innerWidth ??
|
|
183
|
+
element.ownerDocument.documentElement?.clientWidth ??
|
|
184
|
+
0));
|
|
185
|
+
const viewportHeight = Math.max(0, Number(element.ownerDocument.defaultView?.innerHeight ??
|
|
186
|
+
element.ownerDocument.documentElement?.clientHeight ??
|
|
187
|
+
0));
|
|
188
|
+
const visibleLeft = viewportWidth > 0 ? Math.max(0, rect.left) : rect.left;
|
|
189
|
+
const visibleRight = viewportWidth > 0 ? Math.min(viewportWidth, rect.right) : rect.right;
|
|
190
|
+
const visibleTop = viewportHeight > 0 ? Math.max(0, rect.top) : rect.top;
|
|
191
|
+
const visibleBottom = viewportHeight > 0 ? Math.min(viewportHeight, rect.bottom) : rect.bottom;
|
|
192
|
+
if (visibleRight <= visibleLeft || visibleBottom <= visibleTop) {
|
|
193
|
+
return Boolean(credibleLabelTextOf(element));
|
|
194
|
+
}
|
|
195
|
+
const samplePoints = [
|
|
196
|
+
[
|
|
197
|
+
visibleLeft + (visibleRight - visibleLeft) / 2,
|
|
198
|
+
visibleTop + (visibleBottom - visibleTop) / 2,
|
|
199
|
+
],
|
|
200
|
+
[
|
|
201
|
+
Math.max(visibleLeft + 1, visibleLeft + (visibleRight - visibleLeft) * 0.25),
|
|
202
|
+
visibleTop + (visibleBottom - visibleTop) / 2,
|
|
203
|
+
],
|
|
204
|
+
[
|
|
205
|
+
Math.min(visibleRight - 1, visibleLeft + (visibleRight - visibleLeft) * 0.75),
|
|
206
|
+
visibleTop + (visibleBottom - visibleTop) / 2,
|
|
207
|
+
],
|
|
208
|
+
];
|
|
209
|
+
return samplePoints.some(([x, y]) => {
|
|
210
|
+
const hit = element.ownerDocument.elementFromPoint(x, y);
|
|
211
|
+
return (hit instanceof HTMLElement &&
|
|
212
|
+
(hit === element || element.contains(hit) || hit.contains(element)));
|
|
213
|
+
});
|
|
214
|
+
})
|
|
215
|
+
.catch(() => false);
|
|
216
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { TargetAcceptancePolicy, TargetAllowedAction, TargetAvailabilityState, TargetControlFamily, TargetStructure } from './runtime-state.js';
|
|
2
|
+
export type TargetStateFacts = Record<string, string | boolean | number>;
|
|
3
|
+
export type TargetSemanticsFacts = {
|
|
4
|
+
kind?: string;
|
|
5
|
+
role?: string;
|
|
6
|
+
label?: string;
|
|
7
|
+
displayLabel?: string;
|
|
8
|
+
interactionHint?: 'click';
|
|
9
|
+
text?: string;
|
|
10
|
+
placeholder?: string;
|
|
11
|
+
inputName?: string;
|
|
12
|
+
inputType?: string;
|
|
13
|
+
autocomplete?: string;
|
|
14
|
+
ariaAutocomplete?: string;
|
|
15
|
+
surfaceKind?: string;
|
|
16
|
+
controlsSurfaceSelector?: string;
|
|
17
|
+
states?: TargetStateFacts;
|
|
18
|
+
structure?: TargetStructure;
|
|
19
|
+
legacyMethod?: string;
|
|
20
|
+
};
|
|
21
|
+
export type ComparableValueType = 'phone' | 'card-number' | 'expiry' | 'cvc' | 'date';
|
|
22
|
+
export declare function inferComparableValueTypeFromFacts(facts: TargetSemanticsFacts): ComparableValueType | undefined;
|
|
23
|
+
export declare function isLikelyDateLikeLabel(value: string | undefined): boolean;
|
|
24
|
+
export declare function inferAllowedActionsFromFacts(facts: TargetSemanticsFacts): TargetAllowedAction[];
|
|
25
|
+
export declare function inferAvailabilityFromFacts(states?: TargetStateFacts, contextHint?: string, options?: {
|
|
26
|
+
readonlyInteractive?: boolean;
|
|
27
|
+
}): TargetAvailabilityState;
|
|
28
|
+
export declare function inferControlFamilyFromFacts(facts: TargetSemanticsFacts, allowedActions: ReadonlyArray<TargetAllowedAction>): TargetControlFamily | undefined;
|
|
29
|
+
export declare function inferAcceptancePolicyFromFacts(facts: TargetSemanticsFacts, allowedActions: ReadonlyArray<TargetAllowedAction>): TargetAcceptancePolicy | undefined;
|
|
30
|
+
//# sourceMappingURL=control-semantics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-semantics.d.ts","sourceRoot":"","sources":["../src/control-semantics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,sBAAsB,EACtB,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,eAAe,EAChB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC,CAAC;AAEzE,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,SAAS,CAAC,EAAE,eAAe,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,OAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAC;AAwCtF,wBAAgB,iCAAiC,CAC/C,KAAK,EAAE,oBAAoB,GAC1B,mBAAmB,GAAG,SAAS,CAuCjC;AA6LD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAYxE;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,oBAAoB,GAAG,mBAAmB,EAAE,CA4G/F;AAED,wBAAgB,0BAA0B,CACxC,MAAM,CAAC,EAAE,gBAAgB,EACzB,WAAW,CAAC,EAAE,MAAM,EACpB,OAAO,GAAE;IACP,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC1B,GACL,uBAAuB,CAyBzB;AAED,wBAAgB,2BAA2B,CACzC,KAAK,EAAE,oBAAoB,EAC3B,cAAc,EAAE,aAAa,CAAC,mBAAmB,CAAC,GACjD,mBAAmB,GAAG,SAAS,CA0EjC;AAED,wBAAgB,8BAA8B,CAC5C,KAAK,EAAE,oBAAoB,EAC3B,cAAc,EAAE,aAAa,CAAC,mBAAmB,CAAC,GACjD,sBAAsB,GAAG,SAAS,CA6CpC"}
|