@aglyn/aglyn 1.0.0-beta.143
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/LICENSE +201 -0
- package/README.md +11 -0
- package/package.json +66 -0
- package/src/index.d.ts +25 -0
- package/src/index.js +26 -0
- package/src/index.js.map +1 -0
- package/src/lib/aglyn.d.ts +31 -0
- package/src/lib/aglyn.js +114 -0
- package/src/lib/aglyn.js.map +1 -0
- package/src/lib/app-utils/abuse-report.d.ts +193 -0
- package/src/lib/app-utils/abuse-report.js +321 -0
- package/src/lib/app-utils/abuse-report.js.map +1 -0
- package/src/lib/app-utils/accept-negotiation.d.ts +129 -0
- package/src/lib/app-utils/accept-negotiation.js +266 -0
- package/src/lib/app-utils/accept-negotiation.js.map +1 -0
- package/src/lib/app-utils/account-emails.d.ts +263 -0
- package/src/lib/app-utils/account-emails.js +264 -0
- package/src/lib/app-utils/account-emails.js.map +1 -0
- package/src/lib/app-utils/actions.d.ts +717 -0
- package/src/lib/app-utils/actions.js +1031 -0
- package/src/lib/app-utils/actions.js.map +1 -0
- package/src/lib/app-utils/activity-presenter.d.ts +152 -0
- package/src/lib/app-utils/activity-presenter.js +326 -0
- package/src/lib/app-utils/activity-presenter.js.map +1 -0
- package/src/lib/app-utils/advertising-tag-mounts.d.ts +133 -0
- package/src/lib/app-utils/advertising-tag-mounts.js +118 -0
- package/src/lib/app-utils/advertising-tag-mounts.js.map +1 -0
- package/src/lib/app-utils/advertising-tags.d.ts +307 -0
- package/src/lib/app-utils/advertising-tags.js +525 -0
- package/src/lib/app-utils/advertising-tags.js.map +1 -0
- package/src/lib/app-utils/agent-api-catalog.d.ts +94 -0
- package/src/lib/app-utils/agent-api-catalog.js +106 -0
- package/src/lib/app-utils/agent-api-catalog.js.map +1 -0
- package/src/lib/app-utils/agent-openapi.d.ts +103 -0
- package/src/lib/app-utils/agent-openapi.js +1128 -0
- package/src/lib/app-utils/agent-openapi.js.map +1 -0
- package/src/lib/app-utils/analytics-beacon.d.ts +154 -0
- package/src/lib/app-utils/analytics-beacon.js +152 -0
- package/src/lib/app-utils/analytics-beacon.js.map +1 -0
- package/src/lib/app-utils/analytics-environment.d.ts +133 -0
- package/src/lib/app-utils/analytics-environment.js +152 -0
- package/src/lib/app-utils/analytics-environment.js.map +1 -0
- package/src/lib/app-utils/analytics-events.d.ts +744 -0
- package/src/lib/app-utils/analytics-events.js +650 -0
- package/src/lib/app-utils/analytics-events.js.map +1 -0
- package/src/lib/app-utils/analytics-link-clicks.d.ts +102 -0
- package/src/lib/app-utils/analytics-link-clicks.js +267 -0
- package/src/lib/app-utils/analytics-link-clicks.js.map +1 -0
- package/src/lib/app-utils/analytics-path-key.d.ts +46 -0
- package/src/lib/app-utils/analytics-path-key.js +46 -0
- package/src/lib/app-utils/analytics-path-key.js.map +1 -0
- package/src/lib/app-utils/api-adapter.d.ts +47 -0
- package/src/lib/app-utils/api-adapter.js +367 -0
- package/src/lib/app-utils/api-adapter.js.map +1 -0
- package/src/lib/app-utils/api-idempotency.d.ts +169 -0
- package/src/lib/app-utils/api-idempotency.js +213 -0
- package/src/lib/app-utils/api-idempotency.js.map +1 -0
- package/src/lib/app-utils/api-plugins.d.ts +210 -0
- package/src/lib/app-utils/api-plugins.js +221 -0
- package/src/lib/app-utils/api-plugins.js.map +1 -0
- package/src/lib/app-utils/assist-credits.d.ts +482 -0
- package/src/lib/app-utils/assist-credits.js +509 -0
- package/src/lib/app-utils/assist-credits.js.map +1 -0
- package/src/lib/app-utils/attribution-attribute.d.ts +34 -0
- package/src/lib/app-utils/attribution-attribute.js +34 -0
- package/src/lib/app-utils/attribution-attribute.js.map +1 -0
- package/src/lib/app-utils/attribution-guard.d.ts +130 -0
- package/src/lib/app-utils/attribution-guard.js +410 -0
- package/src/lib/app-utils/attribution-guard.js.map +1 -0
- package/src/lib/app-utils/author-css.d.ts +123 -0
- package/src/lib/app-utils/author-css.js +275 -0
- package/src/lib/app-utils/author-css.js.map +1 -0
- package/src/lib/app-utils/author-html-markdown.d.ts +31 -0
- package/src/lib/app-utils/author-html-markdown.js +497 -0
- package/src/lib/app-utils/author-html-markdown.js.map +1 -0
- package/src/lib/app-utils/author-html.d.ts +135 -0
- package/src/lib/app-utils/author-html.js +1037 -0
- package/src/lib/app-utils/author-html.js.map +1 -0
- package/src/lib/app-utils/automation-placeholders.d.ts +72 -0
- package/src/lib/app-utils/automation-placeholders.js +207 -0
- package/src/lib/app-utils/automation-placeholders.js.map +1 -0
- package/src/lib/app-utils/bandwidth-cap.d.ts +183 -0
- package/src/lib/app-utils/bandwidth-cap.js +193 -0
- package/src/lib/app-utils/bandwidth-cap.js.map +1 -0
- package/src/lib/app-utils/binding-token-catalog.d.ts +82 -0
- package/src/lib/app-utils/binding-token-catalog.js +293 -0
- package/src/lib/app-utils/binding-token-catalog.js.map +1 -0
- package/src/lib/app-utils/binding-tokens.d.ts +157 -0
- package/src/lib/app-utils/binding-tokens.js +251 -0
- package/src/lib/app-utils/binding-tokens.js.map +1 -0
- package/src/lib/app-utils/breadcrumb-json-ld.d.ts +57 -0
- package/src/lib/app-utils/breadcrumb-json-ld.js +67 -0
- package/src/lib/app-utils/breadcrumb-json-ld.js.map +1 -0
- package/src/lib/app-utils/campaign-attribution.d.ts +117 -0
- package/src/lib/app-utils/campaign-attribution.js +162 -0
- package/src/lib/app-utils/campaign-attribution.js.map +1 -0
- package/src/lib/app-utils/campaign-forwarding.d.ts +220 -0
- package/src/lib/app-utils/campaign-forwarding.js +332 -0
- package/src/lib/app-utils/campaign-forwarding.js.map +1 -0
- package/src/lib/app-utils/campaign-membership.d.ts +109 -0
- package/src/lib/app-utils/campaign-membership.js +176 -0
- package/src/lib/app-utils/campaign-membership.js.map +1 -0
- package/src/lib/app-utils/campaign-touch.d.ts +206 -0
- package/src/lib/app-utils/campaign-touch.js +326 -0
- package/src/lib/app-utils/campaign-touch.js.map +1 -0
- package/src/lib/app-utils/child-contract-compose.d.ts +28 -0
- package/src/lib/app-utils/child-contract-compose.js +140 -0
- package/src/lib/app-utils/child-contract-compose.js.map +1 -0
- package/src/lib/app-utils/child-contract.d.ts +129 -0
- package/src/lib/app-utils/child-contract.js +153 -0
- package/src/lib/app-utils/child-contract.js.map +1 -0
- package/src/lib/app-utils/collection-delete.d.ts +113 -0
- package/src/lib/app-utils/collection-delete.js +120 -0
- package/src/lib/app-utils/collection-delete.js.map +1 -0
- package/src/lib/app-utils/collection-entries.d.ts +833 -0
- package/src/lib/app-utils/collection-entries.js +1285 -0
- package/src/lib/app-utils/collection-entries.js.map +1 -0
- package/src/lib/app-utils/collection-entry-date.d.ts +129 -0
- package/src/lib/app-utils/collection-entry-date.js +183 -0
- package/src/lib/app-utils/collection-entry-date.js.map +1 -0
- package/src/lib/app-utils/collection-kind.d.ts +55 -0
- package/src/lib/app-utils/collection-kind.js +69 -0
- package/src/lib/app-utils/collection-kind.js.map +1 -0
- package/src/lib/app-utils/collection-slug.d.ts +79 -0
- package/src/lib/app-utils/collection-slug.js +70 -0
- package/src/lib/app-utils/collection-slug.js.map +1 -0
- package/src/lib/app-utils/compose-layout-nodes.d.ts +147 -0
- package/src/lib/app-utils/compose-layout-nodes.js +261 -0
- package/src/lib/app-utils/compose-layout-nodes.js.map +1 -0
- package/src/lib/app-utils/compose-layout-props.d.ts +71 -0
- package/src/lib/app-utils/compose-layout-props.js +61 -0
- package/src/lib/app-utils/compose-layout-props.js.map +1 -0
- package/src/lib/app-utils/compose-reusable-components.d.ts +504 -0
- package/src/lib/app-utils/compose-reusable-components.js +1366 -0
- package/src/lib/app-utils/compose-reusable-components.js.map +1 -0
- package/src/lib/app-utils/compress.d.ts +35 -0
- package/src/lib/app-utils/compress.js +38 -0
- package/src/lib/app-utils/compress.js.map +1 -0
- package/src/lib/app-utils/consent-banner-ui.d.ts +226 -0
- package/src/lib/app-utils/consent-banner-ui.js +583 -0
- package/src/lib/app-utils/consent-banner-ui.js.map +1 -0
- package/src/lib/app-utils/consent-groups.d.ts +189 -0
- package/src/lib/app-utils/consent-groups.js +219 -0
- package/src/lib/app-utils/consent-groups.js.map +1 -0
- package/src/lib/app-utils/consent-preferences-dialog.d.ts +58 -0
- package/src/lib/app-utils/consent-preferences-dialog.js +106 -0
- package/src/lib/app-utils/consent-preferences-dialog.js.map +1 -0
- package/src/lib/app-utils/console-record-links.d.ts +163 -0
- package/src/lib/app-utils/console-record-links.js +178 -0
- package/src/lib/app-utils/console-record-links.js.map +1 -0
- package/src/lib/app-utils/console-routes.d.ts +658 -0
- package/src/lib/app-utils/console-routes.js +489 -0
- package/src/lib/app-utils/console-routes.js.map +1 -0
- package/src/lib/app-utils/console-widget-slot-context.d.ts +46 -0
- package/src/lib/app-utils/console-widget-slot-context.js +23 -0
- package/src/lib/app-utils/console-widget-slot-context.js.map +1 -0
- package/src/lib/app-utils/contact-custom-fields.d.ts +191 -0
- package/src/lib/app-utils/contact-custom-fields.js +349 -0
- package/src/lib/app-utils/contact-custom-fields.js.map +1 -0
- package/src/lib/app-utils/contact-holder.d.ts +52 -0
- package/src/lib/app-utils/contact-holder.js +98 -0
- package/src/lib/app-utils/contact-holder.js.map +1 -0
- package/src/lib/app-utils/contact-merge.d.ts +136 -0
- package/src/lib/app-utils/contact-merge.js +379 -0
- package/src/lib/app-utils/contact-merge.js.map +1 -0
- package/src/lib/app-utils/contacts.d.ts +554 -0
- package/src/lib/app-utils/contacts.js +401 -0
- package/src/lib/app-utils/contacts.js.map +1 -0
- package/src/lib/app-utils/content-author-profile.d.ts +68 -0
- package/src/lib/app-utils/content-author-profile.js +118 -0
- package/src/lib/app-utils/content-author-profile.js.map +1 -0
- package/src/lib/app-utils/content-authors.d.ts +662 -0
- package/src/lib/app-utils/content-authors.js +771 -0
- package/src/lib/app-utils/content-authors.js.map +1 -0
- package/src/lib/app-utils/content-schema-type.d.ts +81 -0
- package/src/lib/app-utils/content-schema-type.js +87 -0
- package/src/lib/app-utils/content-schema-type.js.map +1 -0
- package/src/lib/app-utils/contexts.d.ts +35 -0
- package/src/lib/app-utils/contexts.js +35 -0
- package/src/lib/app-utils/contexts.js.map +1 -0
- package/src/lib/app-utils/create-resource-uid.d.ts +18 -0
- package/src/lib/app-utils/create-resource-uid.js +23 -0
- package/src/lib/app-utils/create-resource-uid.js.map +1 -0
- package/src/lib/app-utils/crm-booking.d.ts +75 -0
- package/src/lib/app-utils/crm-booking.js +133 -0
- package/src/lib/app-utils/crm-booking.js.map +1 -0
- package/src/lib/app-utils/crm-csv.d.ts +232 -0
- package/src/lib/app-utils/crm-csv.js +432 -0
- package/src/lib/app-utils/crm-csv.js.map +1 -0
- package/src/lib/app-utils/crm-digest.d.ts +179 -0
- package/src/lib/app-utils/crm-digest.js +271 -0
- package/src/lib/app-utils/crm-digest.js.map +1 -0
- package/src/lib/app-utils/crm-email-templates.d.ts +172 -0
- package/src/lib/app-utils/crm-email-templates.js +382 -0
- package/src/lib/app-utils/crm-email-templates.js.map +1 -0
- package/src/lib/app-utils/crm-inbound.d.ts +245 -0
- package/src/lib/app-utils/crm-inbound.js +407 -0
- package/src/lib/app-utils/crm-inbound.js.map +1 -0
- package/src/lib/app-utils/crm-kinds.d.ts +73 -0
- package/src/lib/app-utils/crm-kinds.js +92 -0
- package/src/lib/app-utils/crm-kinds.js.map +1 -0
- package/src/lib/app-utils/crm-next-activity.d.ts +107 -0
- package/src/lib/app-utils/crm-next-activity.js +140 -0
- package/src/lib/app-utils/crm-next-activity.js.map +1 -0
- package/src/lib/app-utils/crm-reports.d.ts +479 -0
- package/src/lib/app-utils/crm-reports.js +680 -0
- package/src/lib/app-utils/crm-reports.js.map +1 -0
- package/src/lib/app-utils/crm-task-reminders.d.ts +129 -0
- package/src/lib/app-utils/crm-task-reminders.js +139 -0
- package/src/lib/app-utils/crm-task-reminders.js.map +1 -0
- package/src/lib/app-utils/crm.d.ts +1546 -0
- package/src/lib/app-utils/crm.js +1814 -0
- package/src/lib/app-utils/crm.js.map +1 -0
- package/src/lib/app-utils/csp-report.d.ts +84 -0
- package/src/lib/app-utils/csp-report.js +177 -0
- package/src/lib/app-utils/csp-report.js.map +1 -0
- package/src/lib/app-utils/csv-import.d.ts +192 -0
- package/src/lib/app-utils/csv-import.js +279 -0
- package/src/lib/app-utils/csv-import.js.map +1 -0
- package/src/lib/app-utils/dataset-csv.d.ts +109 -0
- package/src/lib/app-utils/dataset-csv.js +235 -0
- package/src/lib/app-utils/dataset-csv.js.map +1 -0
- package/src/lib/app-utils/dataset-models.d.ts +194 -0
- package/src/lib/app-utils/dataset-models.js +409 -0
- package/src/lib/app-utils/dataset-models.js.map +1 -0
- package/src/lib/app-utils/dataset-query.d.ts +57 -0
- package/src/lib/app-utils/dataset-query.js +126 -0
- package/src/lib/app-utils/dataset-query.js.map +1 -0
- package/src/lib/app-utils/datasets.d.ts +136 -0
- package/src/lib/app-utils/datasets.js +177 -0
- package/src/lib/app-utils/datasets.js.map +1 -0
- package/src/lib/app-utils/decompress.d.ts +36 -0
- package/src/lib/app-utils/decompress.js +32 -0
- package/src/lib/app-utils/decompress.js.map +1 -0
- package/src/lib/app-utils/dedicated-sending-domain.d.ts +47 -0
- package/src/lib/app-utils/dedicated-sending-domain.js +114 -0
- package/src/lib/app-utils/dedicated-sending-domain.js.map +1 -0
- package/src/lib/app-utils/deferred-image.d.ts +86 -0
- package/src/lib/app-utils/deferred-image.js +83 -0
- package/src/lib/app-utils/deferred-image.js.map +1 -0
- package/src/lib/app-utils/definition-canvas-tree.d.ts +61 -0
- package/src/lib/app-utils/definition-canvas-tree.js +126 -0
- package/src/lib/app-utils/definition-canvas-tree.js.map +1 -0
- package/src/lib/app-utils/deployment-shape.d.ts +167 -0
- package/src/lib/app-utils/deployment-shape.js +238 -0
- package/src/lib/app-utils/deployment-shape.js.map +1 -0
- package/src/lib/app-utils/detect-template-placeholders.d.ts +30 -0
- package/src/lib/app-utils/detect-template-placeholders.js +53 -0
- package/src/lib/app-utils/detect-template-placeholders.js.map +1 -0
- package/src/lib/app-utils/dmca-counter-notice.d.ts +185 -0
- package/src/lib/app-utils/dmca-counter-notice.js +277 -0
- package/src/lib/app-utils/dmca-counter-notice.js.map +1 -0
- package/src/lib/app-utils/docs-deflection.d.ts +156 -0
- package/src/lib/app-utils/docs-deflection.js +547 -0
- package/src/lib/app-utils/docs-deflection.js.map +1 -0
- package/src/lib/app-utils/docs-help.d.ts +57 -0
- package/src/lib/app-utils/docs-help.generated.d.ts +303 -0
- package/src/lib/app-utils/docs-help.generated.js +867 -0
- package/src/lib/app-utils/docs-help.generated.js.map +1 -0
- package/src/lib/app-utils/docs-help.js +46 -0
- package/src/lib/app-utils/docs-help.js.map +1 -0
- package/src/lib/app-utils/docs-index.generated.d.ts +29 -0
- package/src/lib/app-utils/docs-index.generated.js +8388 -0
- package/src/lib/app-utils/docs-index.generated.js.map +1 -0
- package/src/lib/app-utils/docs-retrieval.d.ts +67 -0
- package/src/lib/app-utils/docs-retrieval.js +188 -0
- package/src/lib/app-utils/docs-retrieval.js.map +1 -0
- package/src/lib/app-utils/document-landmark.d.ts +50 -0
- package/src/lib/app-utils/document-landmark.js +100 -0
- package/src/lib/app-utils/document-landmark.js.map +1 -0
- package/src/lib/app-utils/duplicate-resource.d.ts +101 -0
- package/src/lib/app-utils/duplicate-resource.js +206 -0
- package/src/lib/app-utils/duplicate-resource.js.map +1 -0
- package/src/lib/app-utils/dynamic-list-rule.d.ts +471 -0
- package/src/lib/app-utils/dynamic-list-rule.js +914 -0
- package/src/lib/app-utils/dynamic-list-rule.js.map +1 -0
- package/src/lib/app-utils/element-animation.d.ts +200 -0
- package/src/lib/app-utils/element-animation.js +233 -0
- package/src/lib/app-utils/element-animation.js.map +1 -0
- package/src/lib/app-utils/element-hidden-style.d.ts +46 -0
- package/src/lib/app-utils/element-hidden-style.js +48 -0
- package/src/lib/app-utils/element-hidden-style.js.map +1 -0
- package/src/lib/app-utils/element-ui.d.ts +243 -0
- package/src/lib/app-utils/element-ui.js +459 -0
- package/src/lib/app-utils/element-ui.js.map +1 -0
- package/src/lib/app-utils/email-starter-policy.d.ts +160 -0
- package/src/lib/app-utils/email-starter-policy.js +327 -0
- package/src/lib/app-utils/email-starter-policy.js.map +1 -0
- package/src/lib/app-utils/email-topics.d.ts +310 -0
- package/src/lib/app-utils/email-topics.js +336 -0
- package/src/lib/app-utils/email-topics.js.map +1 -0
- package/src/lib/app-utils/enabled-plugins-context.d.ts +100 -0
- package/src/lib/app-utils/enabled-plugins-context.js +113 -0
- package/src/lib/app-utils/enabled-plugins-context.js.map +1 -0
- package/src/lib/app-utils/ensure-canvas-root.d.ts +38 -0
- package/src/lib/app-utils/ensure-canvas-root.js +61 -0
- package/src/lib/app-utils/ensure-canvas-root.js.map +1 -0
- package/src/lib/app-utils/entity-picker-context.d.ts +199 -0
- package/src/lib/app-utils/entity-picker-context.js +93 -0
- package/src/lib/app-utils/entity-picker-context.js.map +1 -0
- package/src/lib/app-utils/error-beacon.d.ts +107 -0
- package/src/lib/app-utils/error-beacon.js +296 -0
- package/src/lib/app-utils/error-beacon.js.map +1 -0
- package/src/lib/app-utils/expand-repeatables.d.ts +172 -0
- package/src/lib/app-utils/expand-repeatables.js +299 -0
- package/src/lib/app-utils/expand-repeatables.js.map +1 -0
- package/src/lib/app-utils/foreign-script.d.ts +82 -0
- package/src/lib/app-utils/foreign-script.js +102 -0
- package/src/lib/app-utils/foreign-script.js.map +1 -0
- package/src/lib/app-utils/form-abuse-ceiling.d.ts +146 -0
- package/src/lib/app-utils/form-abuse-ceiling.js +158 -0
- package/src/lib/app-utils/form-abuse-ceiling.js.map +1 -0
- package/src/lib/app-utils/form-contract.d.ts +198 -0
- package/src/lib/app-utils/form-contract.js +282 -0
- package/src/lib/app-utils/form-contract.js.map +1 -0
- package/src/lib/app-utils/form-dataset-binding.d.ts +50 -0
- package/src/lib/app-utils/form-dataset-binding.js +74 -0
- package/src/lib/app-utils/form-dataset-binding.js.map +1 -0
- package/src/lib/app-utils/forms.d.ts +727 -0
- package/src/lib/app-utils/forms.js +777 -0
- package/src/lib/app-utils/forms.js.map +1 -0
- package/src/lib/app-utils/functions.d.ts +188 -0
- package/src/lib/app-utils/functions.js +529 -0
- package/src/lib/app-utils/functions.js.map +1 -0
- package/src/lib/app-utils/guarded-version-save.d.ts +91 -0
- package/src/lib/app-utils/guarded-version-save.js +131 -0
- package/src/lib/app-utils/guarded-version-save.js.map +1 -0
- package/src/lib/app-utils/health-report.d.ts +1766 -0
- package/src/lib/app-utils/health-report.js +2072 -0
- package/src/lib/app-utils/health-report.js.map +1 -0
- package/src/lib/app-utils/host-naming.d.ts +135 -0
- package/src/lib/app-utils/host-naming.js +188 -0
- package/src/lib/app-utils/host-naming.js.map +1 -0
- package/src/lib/app-utils/host-permissions.d.ts +76 -0
- package/src/lib/app-utils/host-permissions.js +119 -0
- package/src/lib/app-utils/host-permissions.js.map +1 -0
- package/src/lib/app-utils/host-tokens.d.ts +228 -0
- package/src/lib/app-utils/host-tokens.js +304 -0
- package/src/lib/app-utils/host-tokens.js.map +1 -0
- package/src/lib/app-utils/idp-profile.d.ts +83 -0
- package/src/lib/app-utils/idp-profile.js +268 -0
- package/src/lib/app-utils/idp-profile.js.map +1 -0
- package/src/lib/app-utils/image-upload-types.d.ts +49 -0
- package/src/lib/app-utils/image-upload-types.js +86 -0
- package/src/lib/app-utils/image-upload-types.js.map +1 -0
- package/src/lib/app-utils/index.d.ts +18 -0
- package/src/lib/app-utils/index.js +23 -0
- package/src/lib/app-utils/index.js.map +1 -0
- package/src/lib/app-utils/internal-traffic.d.ts +197 -0
- package/src/lib/app-utils/internal-traffic.js +288 -0
- package/src/lib/app-utils/internal-traffic.js.map +1 -0
- package/src/lib/app-utils/lineal-order.d.ts +62 -0
- package/src/lib/app-utils/lineal-order.js +65 -0
- package/src/lib/app-utils/lineal-order.js.map +1 -0
- package/src/lib/app-utils/link-references.d.ts +36 -0
- package/src/lib/app-utils/link-references.js +89 -0
- package/src/lib/app-utils/link-references.js.map +1 -0
- package/src/lib/app-utils/link-target-search-context.d.ts +123 -0
- package/src/lib/app-utils/link-target-search-context.js +221 -0
- package/src/lib/app-utils/link-target-search-context.js.map +1 -0
- package/src/lib/app-utils/list-assignment-policy.d.ts +169 -0
- package/src/lib/app-utils/list-assignment-policy.js +170 -0
- package/src/lib/app-utils/list-assignment-policy.js.map +1 -0
- package/src/lib/app-utils/list-import.d.ts +158 -0
- package/src/lib/app-utils/list-import.js +332 -0
- package/src/lib/app-utils/list-import.js.map +1 -0
- package/src/lib/app-utils/llms-txt.d.ts +104 -0
- package/src/lib/app-utils/llms-txt.js +144 -0
- package/src/lib/app-utils/llms-txt.js.map +1 -0
- package/src/lib/app-utils/local-storage-budget.d.ts +75 -0
- package/src/lib/app-utils/local-storage-budget.js +153 -0
- package/src/lib/app-utils/local-storage-budget.js.map +1 -0
- package/src/lib/app-utils/lockdown.d.ts +698 -0
- package/src/lib/app-utils/lockdown.js +929 -0
- package/src/lib/app-utils/lockdown.js.map +1 -0
- package/src/lib/app-utils/margin-utilization.d.ts +267 -0
- package/src/lib/app-utils/margin-utilization.js +351 -0
- package/src/lib/app-utils/margin-utilization.js.map +1 -0
- package/src/lib/app-utils/markdown-lite.d.ts +297 -0
- package/src/lib/app-utils/markdown-lite.js +705 -0
- package/src/lib/app-utils/markdown-lite.js.map +1 -0
- package/src/lib/app-utils/marketing-consent.d.ts +704 -0
- package/src/lib/app-utils/marketing-consent.js +783 -0
- package/src/lib/app-utils/marketing-consent.js.map +1 -0
- package/src/lib/app-utils/marketplace-listing-visibility.d.ts +120 -0
- package/src/lib/app-utils/marketplace-listing-visibility.js +139 -0
- package/src/lib/app-utils/marketplace-listing-visibility.js.map +1 -0
- package/src/lib/app-utils/marketplace-overrides.d.ts +271 -0
- package/src/lib/app-utils/marketplace-overrides.js +462 -0
- package/src/lib/app-utils/marketplace-overrides.js.map +1 -0
- package/src/lib/app-utils/marketplace-provenance.d.ts +150 -0
- package/src/lib/app-utils/marketplace-provenance.js +136 -0
- package/src/lib/app-utils/marketplace-provenance.js.map +1 -0
- package/src/lib/app-utils/marketplace-theme.d.ts +237 -0
- package/src/lib/app-utils/marketplace-theme.js +525 -0
- package/src/lib/app-utils/marketplace-theme.js.map +1 -0
- package/src/lib/app-utils/marketplace-update-state.d.ts +119 -0
- package/src/lib/app-utils/marketplace-update-state.js +132 -0
- package/src/lib/app-utils/marketplace-update-state.js.map +1 -0
- package/src/lib/app-utils/marketplace-verification.d.ts +95 -0
- package/src/lib/app-utils/marketplace-verification.js +81 -0
- package/src/lib/app-utils/marketplace-verification.js.map +1 -0
- package/src/lib/app-utils/measure-node-map.d.ts +76 -0
- package/src/lib/app-utils/measure-node-map.js +111 -0
- package/src/lib/app-utils/measure-node-map.js.map +1 -0
- package/src/lib/app-utils/media-alt.d.ts +55 -0
- package/src/lib/app-utils/media-alt.js +58 -0
- package/src/lib/app-utils/media-alt.js.map +1 -0
- package/src/lib/app-utils/media-asset-facts.d.ts +125 -0
- package/src/lib/app-utils/media-asset-facts.js +467 -0
- package/src/lib/app-utils/media-asset-facts.js.map +1 -0
- package/src/lib/app-utils/media-cdn-scope.d.ts +65 -0
- package/src/lib/app-utils/media-cdn-scope.js +75 -0
- package/src/lib/app-utils/media-cdn-scope.js.map +1 -0
- package/src/lib/app-utils/media-folders.d.ts +161 -0
- package/src/lib/app-utils/media-folders.js +230 -0
- package/src/lib/app-utils/media-folders.js.map +1 -0
- package/src/lib/app-utils/media-metadata.d.ts +277 -0
- package/src/lib/app-utils/media-metadata.js +388 -0
- package/src/lib/app-utils/media-metadata.js.map +1 -0
- package/src/lib/app-utils/media-picker-context.d.ts +93 -0
- package/src/lib/app-utils/media-picker-context.js +26 -0
- package/src/lib/app-utils/media-picker-context.js.map +1 -0
- package/src/lib/app-utils/media-quarantine.d.ts +247 -0
- package/src/lib/app-utils/media-quarantine.js +323 -0
- package/src/lib/app-utils/media-quarantine.js.map +1 -0
- package/src/lib/app-utils/media-ref.d.ts +661 -0
- package/src/lib/app-utils/media-ref.js +1055 -0
- package/src/lib/app-utils/media-ref.js.map +1 -0
- package/src/lib/app-utils/media-takedown-reach.d.ts +126 -0
- package/src/lib/app-utils/media-takedown-reach.js +143 -0
- package/src/lib/app-utils/media-takedown-reach.js.map +1 -0
- package/src/lib/app-utils/member-email-aliases.d.ts +180 -0
- package/src/lib/app-utils/member-email-aliases.js +217 -0
- package/src/lib/app-utils/member-email-aliases.js.map +1 -0
- package/src/lib/app-utils/merge-node-sx.d.ts +47 -0
- package/src/lib/app-utils/merge-node-sx.js +123 -0
- package/src/lib/app-utils/merge-node-sx.js.map +1 -0
- package/src/lib/app-utils/name-match.d.ts +155 -0
- package/src/lib/app-utils/name-match.js +175 -0
- package/src/lib/app-utils/name-match.js.map +1 -0
- package/src/lib/app-utils/name-search.d.ts +117 -0
- package/src/lib/app-utils/name-search.js +145 -0
- package/src/lib/app-utils/name-search.js.map +1 -0
- package/src/lib/app-utils/node-capabilities.d.ts +85 -0
- package/src/lib/app-utils/node-capabilities.js +88 -0
- package/src/lib/app-utils/node-capabilities.js.map +1 -0
- package/src/lib/app-utils/node-definition-sanitizer.d.ts +164 -0
- package/src/lib/app-utils/node-definition-sanitizer.js +402 -0
- package/src/lib/app-utils/node-definition-sanitizer.js.map +1 -0
- package/src/lib/app-utils/node-identity.d.ts +47 -0
- package/src/lib/app-utils/node-identity.js +50 -0
- package/src/lib/app-utils/node-identity.js.map +1 -0
- package/src/lib/app-utils/node-interactions.d.ts +102 -0
- package/src/lib/app-utils/node-interactions.js +192 -0
- package/src/lib/app-utils/node-interactions.js.map +1 -0
- package/src/lib/app-utils/node-url-policy.d.ts +54 -0
- package/src/lib/app-utils/node-url-policy.js +72 -0
- package/src/lib/app-utils/node-url-policy.js.map +1 -0
- package/src/lib/app-utils/notifications.d.ts +71 -0
- package/src/lib/app-utils/notifications.js +101 -0
- package/src/lib/app-utils/notifications.js.map +1 -0
- package/src/lib/app-utils/onboarding-deep-link.d.ts +120 -0
- package/src/lib/app-utils/onboarding-deep-link.js +142 -0
- package/src/lib/app-utils/onboarding-deep-link.js.map +1 -0
- package/src/lib/app-utils/operator-identity.d.ts +207 -0
- package/src/lib/app-utils/operator-identity.js +186 -0
- package/src/lib/app-utils/operator-identity.js.map +1 -0
- package/src/lib/app-utils/org-billing-doc.d.ts +231 -0
- package/src/lib/app-utils/org-billing-doc.js +238 -0
- package/src/lib/app-utils/org-billing-doc.js.map +1 -0
- package/src/lib/app-utils/org-override-reason.d.ts +100 -0
- package/src/lib/app-utils/org-override-reason.js +116 -0
- package/src/lib/app-utils/org-override-reason.js.map +1 -0
- package/src/lib/app-utils/org-permissions.d.ts +194 -0
- package/src/lib/app-utils/org-permissions.js +357 -0
- package/src/lib/app-utils/org-permissions.js.map +1 -0
- package/src/lib/app-utils/org-roles.d.ts +72 -0
- package/src/lib/app-utils/org-roles.js +131 -0
- package/src/lib/app-utils/org-roles.js.map +1 -0
- package/src/lib/app-utils/organizations.d.ts +407 -0
- package/src/lib/app-utils/organizations.js +511 -0
- package/src/lib/app-utils/organizations.js.map +1 -0
- package/src/lib/app-utils/page-header-actions-context.d.ts +83 -0
- package/src/lib/app-utils/page-header-actions-context.js +58 -0
- package/src/lib/app-utils/page-header-actions-context.js.map +1 -0
- package/src/lib/app-utils/page-header-record-context.d.ts +80 -0
- package/src/lib/app-utils/page-header-record-context.js +64 -0
- package/src/lib/app-utils/page-header-record-context.js.map +1 -0
- package/src/lib/app-utils/page-markdown.d.ts +103 -0
- package/src/lib/app-utils/page-markdown.js +385 -0
- package/src/lib/app-utils/page-markdown.js.map +1 -0
- package/src/lib/app-utils/paid-media-source.d.ts +90 -0
- package/src/lib/app-utils/paid-media-source.js +184 -0
- package/src/lib/app-utils/paid-media-source.js.map +1 -0
- package/src/lib/app-utils/palette-sx.d.ts +34 -0
- package/src/lib/app-utils/palette-sx.js +150 -0
- package/src/lib/app-utils/palette-sx.js.map +1 -0
- package/src/lib/app-utils/password-policy.d.ts +47 -0
- package/src/lib/app-utils/password-policy.js +46 -0
- package/src/lib/app-utils/password-policy.js.map +1 -0
- package/src/lib/app-utils/payments-configured.d.ts +84 -0
- package/src/lib/app-utils/payments-configured.js +88 -0
- package/src/lib/app-utils/payments-configured.js.map +1 -0
- package/src/lib/app-utils/person-erasure.d.ts +126 -0
- package/src/lib/app-utils/person-erasure.js +121 -0
- package/src/lib/app-utils/person-erasure.js.map +1 -0
- package/src/lib/app-utils/person-key.d.ts +32 -0
- package/src/lib/app-utils/person-key.js +62 -0
- package/src/lib/app-utils/person-key.js.map +1 -0
- package/src/lib/app-utils/plan-entitlements.d.ts +2756 -0
- package/src/lib/app-utils/plan-entitlements.js +4085 -0
- package/src/lib/app-utils/plan-entitlements.js.map +1 -0
- package/src/lib/app-utils/platform-ad-conversions.d.ts +122 -0
- package/src/lib/app-utils/platform-ad-conversions.js +174 -0
- package/src/lib/app-utils/platform-ad-conversions.js.map +1 -0
- package/src/lib/app-utils/platform-advertising-tags.d.ts +139 -0
- package/src/lib/app-utils/platform-advertising-tags.js +203 -0
- package/src/lib/app-utils/platform-advertising-tags.js.map +1 -0
- package/src/lib/app-utils/platform-brand.d.ts +151 -0
- package/src/lib/app-utils/platform-brand.js +175 -0
- package/src/lib/app-utils/platform-brand.js.map +1 -0
- package/src/lib/app-utils/platform-consent-default.d.ts +142 -0
- package/src/lib/app-utils/platform-consent-default.js +295 -0
- package/src/lib/app-utils/platform-consent-default.js.map +1 -0
- package/src/lib/app-utils/platform-marketing-consent.d.ts +151 -0
- package/src/lib/app-utils/platform-marketing-consent.js +182 -0
- package/src/lib/app-utils/platform-marketing-consent.js.map +1 -0
- package/src/lib/app-utils/platform-marketing-host.d.ts +33 -0
- package/src/lib/app-utils/platform-marketing-host.js +97 -0
- package/src/lib/app-utils/platform-marketing-host.js.map +1 -0
- package/src/lib/app-utils/platform-visitor-consent.d.ts +252 -0
- package/src/lib/app-utils/platform-visitor-consent.js +533 -0
- package/src/lib/app-utils/platform-visitor-consent.js.map +1 -0
- package/src/lib/app-utils/plugin-api-cross-origin.d.ts +61 -0
- package/src/lib/app-utils/plugin-api-cross-origin.js +202 -0
- package/src/lib/app-utils/plugin-api-cross-origin.js.map +1 -0
- package/src/lib/app-utils/plugin-api-rate-limit.d.ts +192 -0
- package/src/lib/app-utils/plugin-api-rate-limit.js +270 -0
- package/src/lib/app-utils/plugin-api-rate-limit.js.map +1 -0
- package/src/lib/app-utils/plugin-artifact-path.d.ts +32 -0
- package/src/lib/app-utils/plugin-artifact-path.js +33 -0
- package/src/lib/app-utils/plugin-artifact-path.js.map +1 -0
- package/src/lib/app-utils/plugin-bundle-checks.d.ts +148 -0
- package/src/lib/app-utils/plugin-bundle-checks.js +989 -0
- package/src/lib/app-utils/plugin-bundle-checks.js.map +1 -0
- package/src/lib/app-utils/plugin-manifest.d.ts +516 -0
- package/src/lib/app-utils/plugin-manifest.js +687 -0
- package/src/lib/app-utils/plugin-manifest.js.map +1 -0
- package/src/lib/app-utils/published-legal-pages.d.ts +71 -0
- package/src/lib/app-utils/published-legal-pages.js +90 -0
- package/src/lib/app-utils/published-legal-pages.js.map +1 -0
- package/src/lib/app-utils/publisher-agreement.d.ts +254 -0
- package/src/lib/app-utils/publisher-agreement.js +274 -0
- package/src/lib/app-utils/publisher-agreement.js.map +1 -0
- package/src/lib/app-utils/publisher-attestation.d.ts +99 -0
- package/src/lib/app-utils/publisher-attestation.js +158 -0
- package/src/lib/app-utils/publisher-attestation.js.map +1 -0
- package/src/lib/app-utils/recipient-email-render.d.ts +216 -0
- package/src/lib/app-utils/recipient-email-render.js +221 -0
- package/src/lib/app-utils/recipient-email-render.js.map +1 -0
- package/src/lib/app-utils/redispatch-caught-error.d.ts +38 -0
- package/src/lib/app-utils/redispatch-caught-error.js +46 -0
- package/src/lib/app-utils/redispatch-caught-error.js.map +1 -0
- package/src/lib/app-utils/registering-plugin.d.ts +19 -0
- package/src/lib/app-utils/registering-plugin.js +38 -0
- package/src/lib/app-utils/registering-plugin.js.map +1 -0
- package/src/lib/app-utils/release-flags.d.ts +283 -0
- package/src/lib/app-utils/release-flags.js +518 -0
- package/src/lib/app-utils/release-flags.js.map +1 -0
- package/src/lib/app-utils/repair-canvas-nodes.d.ts +130 -0
- package/src/lib/app-utils/repair-canvas-nodes.js +298 -0
- package/src/lib/app-utils/repair-canvas-nodes.js.map +1 -0
- package/src/lib/app-utils/repeat-infringer.d.ts +166 -0
- package/src/lib/app-utils/repeat-infringer.js +188 -0
- package/src/lib/app-utils/repeat-infringer.js.map +1 -0
- package/src/lib/app-utils/repeat-sources.d.ts +115 -0
- package/src/lib/app-utils/repeat-sources.js +86 -0
- package/src/lib/app-utils/repeat-sources.js.map +1 -0
- package/src/lib/app-utils/request-geo.d.ts +114 -0
- package/src/lib/app-utils/request-geo.js +247 -0
- package/src/lib/app-utils/request-geo.js.map +1 -0
- package/src/lib/app-utils/request-ip.d.ts +213 -0
- package/src/lib/app-utils/request-ip.js +344 -0
- package/src/lib/app-utils/request-ip.js.map +1 -0
- package/src/lib/app-utils/resolve-named-tokens.d.ts +26 -0
- package/src/lib/app-utils/resolve-named-tokens.js +59 -0
- package/src/lib/app-utils/resolve-named-tokens.js.map +1 -0
- package/src/lib/app-utils/responsive-typography-sx.d.ts +77 -0
- package/src/lib/app-utils/responsive-typography-sx.js +122 -0
- package/src/lib/app-utils/responsive-typography-sx.js.map +1 -0
- package/src/lib/app-utils/reusable-component-keys.d.ts +135 -0
- package/src/lib/app-utils/reusable-component-keys.js +140 -0
- package/src/lib/app-utils/reusable-component-keys.js.map +1 -0
- package/src/lib/app-utils/reusable-prop-values.d.ts +199 -0
- package/src/lib/app-utils/reusable-prop-values.js +494 -0
- package/src/lib/app-utils/reusable-prop-values.js.map +1 -0
- package/src/lib/app-utils/safe-json-ld.d.ts +29 -0
- package/src/lib/app-utils/safe-json-ld.js +37 -0
- package/src/lib/app-utils/safe-json-ld.js.map +1 -0
- package/src/lib/app-utils/sanitize-svg.d.ts +55 -0
- package/src/lib/app-utils/sanitize-svg.js +460 -0
- package/src/lib/app-utils/sanitize-svg.js.map +1 -0
- package/src/lib/app-utils/scheme-sx.d.ts +84 -0
- package/src/lib/app-utils/scheme-sx.js +148 -0
- package/src/lib/app-utils/scheme-sx.js.map +1 -0
- package/src/lib/app-utils/scope-tokens.d.ts +249 -0
- package/src/lib/app-utils/scope-tokens.js +331 -0
- package/src/lib/app-utils/scope-tokens.js.map +1 -0
- package/src/lib/app-utils/screen-link-context-value.d.ts +57 -0
- package/src/lib/app-utils/screen-link-context-value.js +43 -0
- package/src/lib/app-utils/screen-link-context-value.js.map +1 -0
- package/src/lib/app-utils/screen-link-context.d.ts +185 -0
- package/src/lib/app-utils/screen-link-context.js +304 -0
- package/src/lib/app-utils/screen-link-context.js.map +1 -0
- package/src/lib/app-utils/screen-link-value.d.ts +269 -0
- package/src/lib/app-utils/screen-link-value.js +384 -0
- package/src/lib/app-utils/screen-link-value.js.map +1 -0
- package/src/lib/app-utils/screen-route.d.ts +669 -0
- package/src/lib/app-utils/screen-route.js +751 -0
- package/src/lib/app-utils/screen-route.js.map +1 -0
- package/src/lib/app-utils/screen-seo-fields.d.ts +37 -0
- package/src/lib/app-utils/screen-seo-fields.js +42 -0
- package/src/lib/app-utils/screen-seo-fields.js.map +1 -0
- package/src/lib/app-utils/search-indexing.d.ts +162 -0
- package/src/lib/app-utils/search-indexing.js +207 -0
- package/src/lib/app-utils/search-indexing.js.map +1 -0
- package/src/lib/app-utils/seo-listing-fields.d.ts +70 -0
- package/src/lib/app-utils/seo-listing-fields.js +75 -0
- package/src/lib/app-utils/seo-listing-fields.js.map +1 -0
- package/src/lib/app-utils/seo-locale.d.ts +119 -0
- package/src/lib/app-utils/seo-locale.js +133 -0
- package/src/lib/app-utils/seo-locale.js.map +1 -0
- package/src/lib/app-utils/seo-title-variables.d.ts +149 -0
- package/src/lib/app-utils/seo-title-variables.js +190 -0
- package/src/lib/app-utils/seo-title-variables.js.map +1 -0
- package/src/lib/app-utils/seo-title.d.ts +70 -0
- package/src/lib/app-utils/seo-title.js +117 -0
- package/src/lib/app-utils/seo-title.js.map +1 -0
- package/src/lib/app-utils/server.d.ts +174 -0
- package/src/lib/app-utils/server.js +314 -0
- package/src/lib/app-utils/server.js.map +1 -0
- package/src/lib/app-utils/site-context.d.ts +106 -0
- package/src/lib/app-utils/site-context.js +100 -0
- package/src/lib/app-utils/site-context.js.map +1 -0
- package/src/lib/app-utils/sitemap.d.ts +117 -0
- package/src/lib/app-utils/sitemap.js +183 -0
- package/src/lib/app-utils/sitemap.js.map +1 -0
- package/src/lib/app-utils/social-image.d.ts +112 -0
- package/src/lib/app-utils/social-image.js +191 -0
- package/src/lib/app-utils/social-image.js.map +1 -0
- package/src/lib/app-utils/starter-templates.d.ts +99 -0
- package/src/lib/app-utils/starter-templates.js +579 -0
- package/src/lib/app-utils/starter-templates.js.map +1 -0
- package/src/lib/app-utils/stored-nodes.d.ts +120 -0
- package/src/lib/app-utils/stored-nodes.js +174 -0
- package/src/lib/app-utils/stored-nodes.js.map +1 -0
- package/src/lib/app-utils/strip-undefined.d.ts +59 -0
- package/src/lib/app-utils/strip-undefined.js +95 -0
- package/src/lib/app-utils/strip-undefined.js.map +1 -0
- package/src/lib/app-utils/stripe-deployment-mode.d.ts +47 -0
- package/src/lib/app-utils/stripe-deployment-mode.js +70 -0
- package/src/lib/app-utils/stripe-deployment-mode.js.map +1 -0
- package/src/lib/app-utils/support-tiers.d.ts +108 -0
- package/src/lib/app-utils/support-tiers.js +201 -0
- package/src/lib/app-utils/support-tiers.js.map +1 -0
- package/src/lib/app-utils/timezone-geo-hint.d.ts +36 -0
- package/src/lib/app-utils/timezone-geo-hint.js +180 -0
- package/src/lib/app-utils/timezone-geo-hint.js.map +1 -0
- package/src/lib/app-utils/upload-cors.d.ts +155 -0
- package/src/lib/app-utils/upload-cors.js +254 -0
- package/src/lib/app-utils/upload-cors.js.map +1 -0
- package/src/lib/app-utils/upload-inspection.d.ts +159 -0
- package/src/lib/app-utils/upload-inspection.js +539 -0
- package/src/lib/app-utils/upload-inspection.js.map +1 -0
- package/src/lib/app-utils/url-slug.d.ts +40 -0
- package/src/lib/app-utils/url-slug.js +42 -0
- package/src/lib/app-utils/url-slug.js.map +1 -0
- package/src/lib/app-utils/usage-budget.d.ts +429 -0
- package/src/lib/app-utils/usage-budget.js +421 -0
- package/src/lib/app-utils/usage-budget.js.map +1 -0
- package/src/lib/app-utils/variables.d.ts +96 -0
- package/src/lib/app-utils/variables.js +233 -0
- package/src/lib/app-utils/variables.js.map +1 -0
- package/src/lib/app-utils/video-asset-facts.d.ts +61 -0
- package/src/lib/app-utils/video-asset-facts.js +70 -0
- package/src/lib/app-utils/video-asset-facts.js.map +1 -0
- package/src/lib/app-utils/video-object.d.ts +89 -0
- package/src/lib/app-utils/video-object.js +245 -0
- package/src/lib/app-utils/video-object.js.map +1 -0
- package/src/lib/app-utils/visitor-consent.d.ts +757 -0
- package/src/lib/app-utils/visitor-consent.js +981 -0
- package/src/lib/app-utils/visitor-consent.js.map +1 -0
- package/src/lib/app-utils/visitor-record-ceiling.d.ts +223 -0
- package/src/lib/app-utils/visitor-record-ceiling.js +215 -0
- package/src/lib/app-utils/visitor-record-ceiling.js.map +1 -0
- package/src/lib/app-utils/web-vitals-rum.d.ts +53 -0
- package/src/lib/app-utils/web-vitals-rum.js +278 -0
- package/src/lib/app-utils/web-vitals-rum.js.map +1 -0
- package/src/lib/app-utils/webhook-delivery.d.ts +324 -0
- package/src/lib/app-utils/webhook-delivery.js +413 -0
- package/src/lib/app-utils/webhook-delivery.js.map +1 -0
- package/src/lib/app-utils/where-used.d.ts +57 -0
- package/src/lib/app-utils/where-used.js +59 -0
- package/src/lib/app-utils/where-used.js.map +1 -0
- package/src/lib/app-utils/wistia-embed.d.ts +86 -0
- package/src/lib/app-utils/wistia-embed.js +119 -0
- package/src/lib/app-utils/wistia-embed.js.map +1 -0
- package/src/lib/app-utils/workflows.d.ts +136 -0
- package/src/lib/app-utils/workflows.js +346 -0
- package/src/lib/app-utils/workflows.js.map +1 -0
- package/src/lib/canvas-manager/canvas-manager-tree.d.ts +109 -0
- package/src/lib/canvas-manager/canvas-manager-tree.js +139 -0
- package/src/lib/canvas-manager/canvas-manager-tree.js.map +1 -0
- package/src/lib/canvas-manager/canvas-manager.d.ts +549 -0
- package/src/lib/canvas-manager/canvas-manager.js +1311 -0
- package/src/lib/canvas-manager/canvas-manager.js.map +1 -0
- package/src/lib/canvas-manager/index.d.ts +20 -0
- package/src/lib/canvas-manager/index.js +21 -0
- package/src/lib/canvas-manager/index.js.map +1 -0
- package/src/lib/canvas-manager/stores/index.d.ts +17 -0
- package/src/lib/canvas-manager/stores/index.js +18 -0
- package/src/lib/canvas-manager/stores/index.js.map +1 -0
- package/src/lib/canvas-manager/stores/node.store.d.ts +30 -0
- package/src/lib/canvas-manager/stores/node.store.js +45 -0
- package/src/lib/canvas-manager/stores/node.store.js.map +1 -0
- package/src/lib/components-manager/components-manager.d.ts +56 -0
- package/src/lib/components-manager/components-manager.js +191 -0
- package/src/lib/components-manager/components-manager.js.map +1 -0
- package/src/lib/components-manager/index.d.ts +18 -0
- package/src/lib/components-manager/index.js +19 -0
- package/src/lib/components-manager/index.js.map +1 -0
- package/src/lib/emit-manager/emit-manager.d.ts +56 -0
- package/src/lib/emit-manager/emit-manager.js +60 -0
- package/src/lib/emit-manager/emit-manager.js.map +1 -0
- package/src/lib/emit-manager/index.d.ts +18 -0
- package/src/lib/emit-manager/index.js +19 -0
- package/src/lib/emit-manager/index.js.map +1 -0
- package/src/lib/foundation/constants/_internal.d.ts +18 -0
- package/src/lib/foundation/constants/_internal.js +62 -0
- package/src/lib/foundation/constants/_internal.js.map +1 -0
- package/src/lib/foundation/constants/app.d.ts +23 -0
- package/src/lib/foundation/constants/app.js +25 -0
- package/src/lib/foundation/constants/app.js.map +1 -0
- package/src/lib/foundation/constants/canvas.d.ts +18 -0
- package/src/lib/foundation/constants/canvas.js +18 -0
- package/src/lib/foundation/constants/canvas.js.map +1 -0
- package/src/lib/foundation/constants/components.d.ts +54 -0
- package/src/lib/foundation/constants/components.js +61 -0
- package/src/lib/foundation/constants/components.js.map +1 -0
- package/src/lib/foundation/constants/shared.d.ts +50 -0
- package/src/lib/foundation/constants/shared.js +49 -0
- package/src/lib/foundation/constants/shared.js.map +1 -0
- package/src/lib/foundation/constants/symbol.d.ts +63 -0
- package/src/lib/foundation/constants/symbol.js +75 -0
- package/src/lib/foundation/constants/symbol.js.map +1 -0
- package/src/lib/foundation/definitions/components.types.d.ts +372 -0
- package/src/lib/foundation/definitions/components.types.js +180 -0
- package/src/lib/foundation/definitions/components.types.js.map +1 -0
- package/src/lib/foundation/definitions/contact.types.d.ts +73 -0
- package/src/lib/foundation/definitions/contact.types.js +107 -0
- package/src/lib/foundation/definitions/contact.types.js.map +1 -0
- package/src/lib/foundation/definitions/host-content-collections.d.ts +137 -0
- package/src/lib/foundation/definitions/host-content-collections.js +219 -0
- package/src/lib/foundation/definitions/host-content-collections.js.map +1 -0
- package/src/lib/foundation/definitions/org-billing.types.d.ts +1361 -0
- package/src/lib/foundation/definitions/org-billing.types.js +77 -0
- package/src/lib/foundation/definitions/org-billing.types.js.map +1 -0
- package/src/lib/foundation/definitions/organization.types.d.ts +307 -0
- package/src/lib/foundation/definitions/organization.types.js +42 -0
- package/src/lib/foundation/definitions/organization.types.js.map +1 -0
- package/src/lib/foundation/definitions/platform.types.d.ts +1326 -0
- package/src/lib/foundation/definitions/platform.types.js +124 -0
- package/src/lib/foundation/definitions/platform.types.js.map +1 -0
- package/src/lib/foundation/definitions/property-kinds.d.ts +189 -0
- package/src/lib/foundation/definitions/property-kinds.js +565 -0
- package/src/lib/foundation/definitions/property-kinds.js.map +1 -0
- package/src/lib/foundation/definitions/shared.d.ts +23 -0
- package/src/lib/foundation/definitions/shared.js +18 -0
- package/src/lib/foundation/definitions/shared.js.map +1 -0
- package/src/lib/foundation/definitions/write-deny-coverage.util.d.ts +249 -0
- package/src/lib/foundation/definitions/write-deny-coverage.util.js +499 -0
- package/src/lib/foundation/definitions/write-deny-coverage.util.js.map +1 -0
- package/src/lib/foundation/index.d.ts +32 -0
- package/src/lib/foundation/index.js +67 -0
- package/src/lib/foundation/index.js.map +1 -0
- package/src/lib/lifecycle.d.ts +24 -0
- package/src/lib/lifecycle.js +39 -0
- package/src/lib/lifecycle.js.map +1 -0
- package/src/lib/mst/common.d.ts +17 -0
- package/src/lib/mst/common.js +23 -0
- package/src/lib/mst/common.js.map +1 -0
- package/src/lib/mst/index.d.ts +19 -0
- package/src/lib/mst/index.js +20 -0
- package/src/lib/mst/index.js.map +1 -0
- package/src/lib/mst/json.d.ts +22 -0
- package/src/lib/mst/json.js +23 -0
- package/src/lib/mst/json.js.map +1 -0
- package/src/lib/mst/types.d.ts +20 -0
- package/src/lib/mst/types.js +18 -0
- package/src/lib/mst/types.js.map +1 -0
- package/src/lib/plugin-manager/billing-webhook-hooks.d.ts +77 -0
- package/src/lib/plugin-manager/billing-webhook-hooks.js +55 -0
- package/src/lib/plugin-manager/billing-webhook-hooks.js.map +1 -0
- package/src/lib/plugin-manager/commerce-zone-props.d.ts +172 -0
- package/src/lib/plugin-manager/commerce-zone-props.js +31 -0
- package/src/lib/plugin-manager/commerce-zone-props.js.map +1 -0
- package/src/lib/plugin-manager/custom-fields.d.ts +60 -0
- package/src/lib/plugin-manager/custom-fields.js +39 -0
- package/src/lib/plugin-manager/custom-fields.js.map +1 -0
- package/src/lib/plugin-manager/editor-sessions.d.ts +109 -0
- package/src/lib/plugin-manager/editor-sessions.js +137 -0
- package/src/lib/plugin-manager/editor-sessions.js.map +1 -0
- package/src/lib/plugin-manager/enabled-plugins.d.ts +438 -0
- package/src/lib/plugin-manager/enabled-plugins.js +403 -0
- package/src/lib/plugin-manager/enabled-plugins.js.map +1 -0
- package/src/lib/plugin-manager/feature-plugins.d.ts +1314 -0
- package/src/lib/plugin-manager/feature-plugins.js +609 -0
- package/src/lib/plugin-manager/feature-plugins.js.map +1 -0
- package/src/lib/plugin-manager/first-party-plugins.generated.d.ts +11 -0
- package/src/lib/plugin-manager/first-party-plugins.generated.js +149 -0
- package/src/lib/plugin-manager/first-party-plugins.generated.js.map +1 -0
- package/src/lib/plugin-manager/index.d.ts +42 -0
- package/src/lib/plugin-manager/index.js +46 -0
- package/src/lib/plugin-manager/index.js.map +1 -0
- package/src/lib/plugin-manager/install-presets.d.ts +93 -0
- package/src/lib/plugin-manager/install-presets.js +86 -0
- package/src/lib/plugin-manager/install-presets.js.map +1 -0
- package/src/lib/plugin-manager/media-delivery-provider.d.ts +124 -0
- package/src/lib/plugin-manager/media-delivery-provider.js +53 -0
- package/src/lib/plugin-manager/media-delivery-provider.js.map +1 -0
- package/src/lib/plugin-manager/order-fulfilment.d.ts +142 -0
- package/src/lib/plugin-manager/order-fulfilment.js +104 -0
- package/src/lib/plugin-manager/order-fulfilment.js.map +1 -0
- package/src/lib/plugin-manager/plugin-activity-actions.d.ts +122 -0
- package/src/lib/plugin-manager/plugin-activity-actions.js +140 -0
- package/src/lib/plugin-manager/plugin-activity-actions.js.map +1 -0
- package/src/lib/plugin-manager/plugin-bridge.d.ts +98 -0
- package/src/lib/plugin-manager/plugin-bridge.js +154 -0
- package/src/lib/plugin-manager/plugin-bridge.js.map +1 -0
- package/src/lib/plugin-manager/plugin-config.d.ts +148 -0
- package/src/lib/plugin-manager/plugin-config.js +228 -0
- package/src/lib/plugin-manager/plugin-config.js.map +1 -0
- package/src/lib/plugin-manager/plugin-console-crons.d.ts +139 -0
- package/src/lib/plugin-manager/plugin-console-crons.js +177 -0
- package/src/lib/plugin-manager/plugin-console-crons.js.map +1 -0
- package/src/lib/plugin-manager/plugin-contact-capture.d.ts +220 -0
- package/src/lib/plugin-manager/plugin-contact-capture.js +89 -0
- package/src/lib/plugin-manager/plugin-contact-capture.js.map +1 -0
- package/src/lib/plugin-manager/plugin-contributions.d.ts +244 -0
- package/src/lib/plugin-manager/plugin-contributions.js +283 -0
- package/src/lib/plugin-manager/plugin-contributions.js.map +1 -0
- package/src/lib/plugin-manager/plugin-entitlement-keys.d.ts +169 -0
- package/src/lib/plugin-manager/plugin-entitlement-keys.js +84 -0
- package/src/lib/plugin-manager/plugin-entitlement-keys.js.map +1 -0
- package/src/lib/plugin-manager/plugin-entitlements.d.ts +181 -0
- package/src/lib/plugin-manager/plugin-entitlements.js +188 -0
- package/src/lib/plugin-manager/plugin-entitlements.js.map +1 -0
- package/src/lib/plugin-manager/plugin-events.d.ts +145 -0
- package/src/lib/plugin-manager/plugin-events.js +79 -0
- package/src/lib/plugin-manager/plugin-events.js.map +1 -0
- package/src/lib/plugin-manager/plugin-figures.d.ts +251 -0
- package/src/lib/plugin-manager/plugin-figures.js +252 -0
- package/src/lib/plugin-manager/plugin-figures.js.map +1 -0
- package/src/lib/plugin-manager/plugin-host-collections.d.ts +146 -0
- package/src/lib/plugin-manager/plugin-host-collections.js +116 -0
- package/src/lib/plugin-manager/plugin-host-collections.js.map +1 -0
- package/src/lib/plugin-manager/plugin-jobs.d.ts +130 -0
- package/src/lib/plugin-manager/plugin-jobs.js +182 -0
- package/src/lib/plugin-manager/plugin-jobs.js.map +1 -0
- package/src/lib/plugin-manager/plugin-loader.d.ts +86 -0
- package/src/lib/plugin-manager/plugin-loader.js +223 -0
- package/src/lib/plugin-manager/plugin-loader.js.map +1 -0
- package/src/lib/plugin-manager/plugin-manager.d.ts +95 -0
- package/src/lib/plugin-manager/plugin-manager.js +343 -0
- package/src/lib/plugin-manager/plugin-manager.js.map +1 -0
- package/src/lib/plugin-manager/plugin-metered-lines.d.ts +97 -0
- package/src/lib/plugin-manager/plugin-metered-lines.js +123 -0
- package/src/lib/plugin-manager/plugin-metered-lines.js.map +1 -0
- package/src/lib/plugin-manager/plugin-org-erasure.d.ts +52 -0
- package/src/lib/plugin-manager/plugin-org-erasure.js +100 -0
- package/src/lib/plugin-manager/plugin-org-erasure.js.map +1 -0
- package/src/lib/plugin-manager/plugin-permissions.d.ts +69 -0
- package/src/lib/plugin-manager/plugin-permissions.js +77 -0
- package/src/lib/plugin-manager/plugin-permissions.js.map +1 -0
- package/src/lib/plugin-manager/plugin-person-erasure.d.ts +58 -0
- package/src/lib/plugin-manager/plugin-person-erasure.js +109 -0
- package/src/lib/plugin-manager/plugin-person-erasure.js.map +1 -0
- package/src/lib/plugin-manager/plugin-record-cards.d.ts +99 -0
- package/src/lib/plugin-manager/plugin-record-cards.js +59 -0
- package/src/lib/plugin-manager/plugin-record-cards.js.map +1 -0
- package/src/lib/plugin-manager/plugin-record-facts.d.ts +111 -0
- package/src/lib/plugin-manager/plugin-record-facts.js +51 -0
- package/src/lib/plugin-manager/plugin-record-facts.js.map +1 -0
- package/src/lib/plugin-manager/plugin-record-routes.d.ts +129 -0
- package/src/lib/plugin-manager/plugin-record-routes.js +93 -0
- package/src/lib/plugin-manager/plugin-record-routes.js.map +1 -0
- package/src/lib/plugin-manager/plugin-record-timeline.d.ts +147 -0
- package/src/lib/plugin-manager/plugin-record-timeline.js +39 -0
- package/src/lib/plugin-manager/plugin-record-timeline.js.map +1 -0
- package/src/lib/plugin-manager/plugin-resource-drafts.d.ts +137 -0
- package/src/lib/plugin-manager/plugin-resource-drafts.js +51 -0
- package/src/lib/plugin-manager/plugin-resource-drafts.js.map +1 -0
- package/src/lib/plugin-manager/plugin-services.d.ts +94 -0
- package/src/lib/plugin-manager/plugin-services.js +153 -0
- package/src/lib/plugin-manager/plugin-services.js.map +1 -0
- package/src/lib/plugin-manager/plugin-styles-ui.d.ts +71 -0
- package/src/lib/plugin-manager/plugin-styles-ui.js +80 -0
- package/src/lib/plugin-manager/plugin-styles-ui.js.map +1 -0
- package/src/lib/plugin-manager/plugin-styles.d.ts +176 -0
- package/src/lib/plugin-manager/plugin-styles.js +186 -0
- package/src/lib/plugin-manager/plugin-styles.js.map +1 -0
- package/src/lib/plugin-manager/plugin-subprocessors.d.ts +135 -0
- package/src/lib/plugin-manager/plugin-subprocessors.js +129 -0
- package/src/lib/plugin-manager/plugin-subprocessors.js.map +1 -0
- package/src/lib/plugin-manager/plugin-tax-profile.d.ts +84 -0
- package/src/lib/plugin-manager/plugin-tax-profile.js +39 -0
- package/src/lib/plugin-manager/plugin-tax-profile.js.map +1 -0
- package/src/lib/plugin-manager/plugin-user-erasure.d.ts +53 -0
- package/src/lib/plugin-manager/plugin-user-erasure.js +84 -0
- package/src/lib/plugin-manager/plugin-user-erasure.js.map +1 -0
- package/src/lib/plugin-manager/plugin-zones.d.ts +121 -0
- package/src/lib/plugin-manager/plugin-zones.js +74 -0
- package/src/lib/plugin-manager/plugin-zones.js.map +1 -0
- package/src/lib/plugin-manager/realm-plugins.d.ts +112 -0
- package/src/lib/plugin-manager/realm-plugins.js +196 -0
- package/src/lib/plugin-manager/realm-plugins.js.map +1 -0
- package/src/lib/plugin-manager/realm-server.d.ts +54 -0
- package/src/lib/plugin-manager/realm-server.js +88 -0
- package/src/lib/plugin-manager/realm-server.js.map +1 -0
- package/src/lib/plugin-manager/record-zone-props.d.ts +126 -0
- package/src/lib/plugin-manager/record-zone-props.js +31 -0
- package/src/lib/plugin-manager/record-zone-props.js.map +1 -0
- package/src/lib/plugin-manager/site-page-hooks.d.ts +102 -0
- package/src/lib/plugin-manager/site-page-hooks.js +114 -0
- package/src/lib/plugin-manager/site-page-hooks.js.map +1 -0
- package/src/lib/plugin-manager/site-runtime.d.ts +57 -0
- package/src/lib/plugin-manager/site-runtime.js +25 -0
- package/src/lib/plugin-manager/site-runtime.js.map +1 -0
- package/src/lib/plugin-manager/usage-alert-contributors.d.ts +115 -0
- package/src/lib/plugin-manager/usage-alert-contributors.js +106 -0
- package/src/lib/plugin-manager/usage-alert-contributors.js.map +1 -0
- package/src/lib/types/ast.d.ts +199 -0
- package/src/lib/types/ast.js +20 -0
- package/src/lib/types/ast.js.map +1 -0
- package/src/lib/types/index.d.ts +20 -0
- package/src/lib/types/index.js +21 -0
- package/src/lib/types/index.js.map +1 -0
- package/src/lib/types/nodes.d.ts +608 -0
- package/src/lib/types/nodes.js +28 -0
- package/src/lib/types/nodes.js.map +1 -0
- package/src/lib/types/routing.d.ts +17 -0
- package/src/lib/types/routing.js +18 -0
- package/src/lib/types/routing.js.map +1 -0
- package/src/lib/types/screen.d.ts +23 -0
- package/src/lib/types/screen.js +18 -0
- package/src/lib/types/screen.js.map +1 -0
- package/src/lib/utils.d.ts +25 -0
- package/src/lib/utils.js +42 -0
- package/src/lib/utils.js.map +1 -0
- package/src/server.d.ts +37 -0
- package/src/server.js +55 -0
- package/src/server.js.map +1 -0
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2026 Aglyn LLC
|
|
4
|
+
*
|
|
5
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
6
|
+
* you may not use this file except in compliance with the License.
|
|
7
|
+
* You may obtain a copy of the License at
|
|
8
|
+
*
|
|
9
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
10
|
+
*
|
|
11
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
12
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
13
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
14
|
+
* See the License for the specific language governing permissions and
|
|
15
|
+
* limitations under the License.
|
|
16
|
+
*/ /**
|
|
17
|
+
* The VENDOR-AGNOSTIC advertising-tag gate.
|
|
18
|
+
*
|
|
19
|
+
* ## The hole this closes
|
|
20
|
+
*
|
|
21
|
+
* Until now the consent machinery could gate exactly one thing: Google. The
|
|
22
|
+
* `advertising` category has existed since AGL-1649 and it is honest — a
|
|
23
|
+
* refusal always wins, and a host that never asked gets nothing — but the
|
|
24
|
+
* only ENFORCEMENT it ever reached was {@link consentModeSignals}, four
|
|
25
|
+
* strings handed to `gtag`. A non-Google tag could not be consent-gated at
|
|
26
|
+
* all, because nothing in the repo knew how to gate one. Deciding to deploy a
|
|
27
|
+
* Meta Pixel with that as the state of the art would have meant either
|
|
28
|
+
* shipping it ungated or inventing a second consent implementation beside the
|
|
29
|
+
* first — the outcome AGL-1579 explicitly ruled out.
|
|
30
|
+
*
|
|
31
|
+
* This module is the missing enforcement channel, built for vendors in
|
|
32
|
+
* general and populated with one descriptor. **Deploying the Meta Pixel is a
|
|
33
|
+
* separate decision and this module does not take it** — see "What is NOT
|
|
34
|
+
* wired" below.
|
|
35
|
+
*
|
|
36
|
+
* ## Why the gate is STRUCTURAL
|
|
37
|
+
*
|
|
38
|
+
* The lesson AGL-1498 paid for and AGL-1608 paid for again: a boolean checked
|
|
39
|
+
* before each call is not a gate. A resident tag fires on its own — GA4
|
|
40
|
+
* enhanced measurement re-created `_ga_YW5PG16YTM` on aglyn.com after a
|
|
41
|
+
* hand-run sweep to zero cookies, from one scroll to the footer — so the only
|
|
42
|
+
* enforcement that holds is the tag never being in the document.
|
|
43
|
+
*
|
|
44
|
+
* So the shape here mirrors the GA gate exactly:
|
|
45
|
+
*
|
|
46
|
+
* - {@link resolveAdvertisingTags} is a PURE verdict over the host document
|
|
47
|
+
* and the visitor's stored record. It returns the tags that may exist. An
|
|
48
|
+
* ungranted visitor gets an empty array, the component renders no
|
|
49
|
+
* `<Script>`, and no request goes to the vendor. Not loaded-then-suppressed:
|
|
50
|
+
* not loaded.
|
|
51
|
+
* - {@link revokeAdvertisingTags} exists because the gate CANNOT unload a tag.
|
|
52
|
+
* Dropping the element on a mid-pageview withdrawal leaves the vendor's
|
|
53
|
+
* script executing, so withdrawal additionally revokes consent on the
|
|
54
|
+
* resident tag, removes its script elements, and sweeps its cookies — in
|
|
55
|
+
* that order, for the AGL-1608 reason: sweeping first deletes the cookies
|
|
56
|
+
* and immediately gets them back.
|
|
57
|
+
*
|
|
58
|
+
* ## The six conditions, all independent, all required
|
|
59
|
+
*
|
|
60
|
+
* 1. **{@link isPlatformMarketingHost}** — Aglyn's own marketing site, never a
|
|
61
|
+
* customer's. This is the DPA §3.2 boundary: Aglyn promises customers it
|
|
62
|
+
* does not "sell"/"share" Customer Personal Data, and an ad pixel on a
|
|
63
|
+
* customer's published site — or in the console — would breach that. Note
|
|
64
|
+
* the console needs no condition of its own: it does not render the tenant
|
|
65
|
+
* runtime's analytics component at all, so there is no mount point to gate.
|
|
66
|
+
* 2. **{@link analyticsMayEmit}** — a real production deployment. AGL-2067's
|
|
67
|
+
* finding was that `next dev` and Vercel PREVIEW builds resolve
|
|
68
|
+
* `aglyn.com`'s host document exactly as production does; without this a
|
|
69
|
+
* preview deploy would build real retargeting audiences out of our own
|
|
70
|
+
* engineers.
|
|
71
|
+
* 3. **{@link hostConsentRequired}** — the consent machinery is actually live
|
|
72
|
+
* for this site. A host that switched the tool off (`consent.disabled`)
|
|
73
|
+
* runs their own CMP and ours has no answer on file to act on.
|
|
74
|
+
* 4. **{@link advertisingGrantedByRecord}** — the host asks about advertising
|
|
75
|
+
* AND the visitor explicitly said yes to that specific category. This is
|
|
76
|
+
* where the region behaviour is INHERITED rather than reimplemented: an
|
|
77
|
+
* EEA/UK visitor pre-choice has no record, an unknown-region visitor has no
|
|
78
|
+
* record, a US `implied` visitor's status cannot carry an advertising
|
|
79
|
+
* grant, and `gpc-opt-out` cannot either. There is deliberately no country
|
|
80
|
+
* logic in this file.
|
|
81
|
+
* 5. **A configured, well-formed account id for a KNOWN vendor.** The gate
|
|
82
|
+
* describes what may load; the host document decides what is configured.
|
|
83
|
+
* 6. **{@link readInternalTrafficOverride} is false** — this browser has not
|
|
84
|
+
* been declared one of ours. A GA4 data filter is PROPERTY-scoped: it drops
|
|
85
|
+
* `traffic_type: internal` hits from the GA4 property and has no reach into
|
|
86
|
+
* an `AW-`/Meta/LinkedIn destination at all, which are separate products
|
|
87
|
+
* reached by separate requests. Measured on `aglyn.com`: a flagged browser's
|
|
88
|
+
* pageview is correctly absent from GA4 while the same pageview still sends
|
|
89
|
+
* `ccm/collect`, `pagead/1p-user-list` (`is_vtc=1`) and
|
|
90
|
+
* `viewthroughconversion` to Google Ads, joining our own staff to the
|
|
91
|
+
* remarketing audiences those requests build. Excluding ourselves from the
|
|
92
|
+
* reports while still training the bidding on ourselves is the worse half of
|
|
93
|
+
* the problem, because it is the half nobody can see in a report.
|
|
94
|
+
*
|
|
95
|
+
* This is the same browser-scoped opt-in the GA4 stamp uses, so one visit to
|
|
96
|
+
* `?aglyn_internal=1` covers both, and the two cannot drift apart into a
|
|
97
|
+
* browser that is internal for one product and external for the other. Note
|
|
98
|
+
* it is the BROWSER, not the account: staff ID-token claims are the console
|
|
99
|
+
* mechanism (AGL-1582) and there is no account to consult here.
|
|
100
|
+
*
|
|
101
|
+
* {@link analyticsEnvironmentForcesInternal} is the other half of the same
|
|
102
|
+
* condition. Condition 2 passes under the non-production escape hatch, and a
|
|
103
|
+
* build that emits because someone asked it to is ours by definition — so
|
|
104
|
+
* the hatch must not hand a dev or preview build the real `AW-` id. Without
|
|
105
|
+
* this the hatch reopens precisely the hole condition 2 closes, which is why
|
|
106
|
+
* `INTERNAL_TRAFFIC_FORCED_SNIPPET` exists on the GA side.
|
|
107
|
+
*
|
|
108
|
+
* ## What is NOT wired, and why that is the point
|
|
109
|
+
*
|
|
110
|
+
* No host document carries an `analytics.adTags` entry. The Meta descriptor
|
|
111
|
+
* below is a description of how that vendor would be loaded and — more
|
|
112
|
+
* importantly — how it would be torn down; it is inert until someone writes a
|
|
113
|
+
* pixel id onto the `aglyn-marketing` host. That makes deployment a DATA
|
|
114
|
+
* change reviewed on its own merits, exactly as configuring GA is, rather than
|
|
115
|
+
* something that rides along with this mechanism.
|
|
116
|
+
*
|
|
117
|
+
* ## Why customer sites are excluded outright rather than offered this
|
|
118
|
+
*
|
|
119
|
+
* A customer-facing "run your own ad pixel" feature is a different product
|
|
120
|
+
* decision with its own consent copy, its own cookie-policy rows and its own
|
|
121
|
+
* DPA implications. Nothing here forecloses it. What this module must not do
|
|
122
|
+
* is arrive as that feature by accident.
|
|
123
|
+
*/ import { GOOGLE_ADS_ID_PATTERN, LINKEDIN_PARTNER_ID_PATTERN, META_PIXEL_ID_PATTERN } from "./visitor-consent.js";
|
|
124
|
+
import { analyticsEnvironmentForcesInternal, analyticsMayEmit, readAnalyticsEnvironment } from "./analytics-environment.js";
|
|
125
|
+
import { readInternalTrafficOverride } from "./internal-traffic.js";
|
|
126
|
+
import { isPlatformMarketingHost } from "./platform-marketing-host.js";
|
|
127
|
+
import { ADVERTISING_COOKIE_PREFIXES, advertisingGrantedByRecord, clearCookiesWithPrefixes, hostConsentRequired } from "./visitor-consent.js";
|
|
128
|
+
/**
|
|
129
|
+
* The attribute every script element this module renders carries.
|
|
130
|
+
*
|
|
131
|
+
* Load-bearing for the teardown, not decoration. {@link revokeAdvertisingTags}
|
|
132
|
+
* acts ONLY on elements carrying it, so a vendor tag a customer pasted into
|
|
133
|
+
* their own site's Custom HTML is never touched by our withdrawal path — we
|
|
134
|
+
* did not load it, we do not know what basis it runs on, and silently killing
|
|
135
|
+
* it would be us configuring a customer's site. Its value is the vendor id.
|
|
136
|
+
*/ export const ADVERTISING_TAG_ATTRIBUTE = 'data-aglyn-ad-tag';
|
|
137
|
+
/**
|
|
138
|
+
* Meta (Facebook/Instagram) Pixel.
|
|
139
|
+
*
|
|
140
|
+
* ## What happens to `_fbp` / `_fbc` on withdrawal: they are DELETED
|
|
141
|
+
*
|
|
142
|
+
* Not merely stopped. The decision is inherited, not invented: AGL-1606
|
|
143
|
+
* settled that a withdrawal "cleans up, it does not merely stop adding" for
|
|
144
|
+
* the GA equivalents, and there is no honest reading under which Meta's
|
|
145
|
+
* first-party identifiers get a softer rule than Google's. Both are
|
|
146
|
+
* browser-lifetime identifiers written by an advertising tag under a consent
|
|
147
|
+
* the visitor has just withdrawn.
|
|
148
|
+
*
|
|
149
|
+
* They are swept with the SAME ladder as `_ga` — the exact hostname and every
|
|
150
|
+
* domain up to the registrable one — because Meta writes them the same way GA
|
|
151
|
+
* does: path `/`, first-party, at the registrable domain. A deletion aimed at
|
|
152
|
+
* the exact hostname would silently no-op.
|
|
153
|
+
*
|
|
154
|
+
* Two limits, stated rather than glossed. Any copy Meta already ingested is
|
|
155
|
+
* gone from our reach — deletion stops future joins, it does not retract past
|
|
156
|
+
* ones; the CPRA opt-out title on the control is about the ongoing "share",
|
|
157
|
+
* which this does stop. And a cookie written at a path other than `/` is not
|
|
158
|
+
* reachable through `document.cookie`; Meta does not write one.
|
|
159
|
+
*
|
|
160
|
+
* ## Why `consent revoke` is called BEFORE the sweep
|
|
161
|
+
*
|
|
162
|
+
* `fbq('consent', 'revoke')` is Meta's documented CMP control and the exact
|
|
163
|
+
* counterpart of the `ga-disable-<id>` flag. Skipping it and going straight to
|
|
164
|
+
* the cookies reproduces AGL-1608: the resident pixel's next automatic event
|
|
165
|
+
* re-writes `_fbp` and the sweep un-does itself inside the same pageview.
|
|
166
|
+
*/ export const META_PIXEL_VENDOR = {
|
|
167
|
+
id: 'meta',
|
|
168
|
+
label: 'Meta Pixel',
|
|
169
|
+
// Meta pixel ids are numeric; the length band is generous on both sides
|
|
170
|
+
// rather than pinned to today's 15-16 digits.
|
|
171
|
+
accountIdPattern: META_PIXEL_ID_PATTERN,
|
|
172
|
+
scriptSrc: 'https://connect.facebook.net/en_US/fbevents.js',
|
|
173
|
+
scriptMatch: 'connect.facebook.net',
|
|
174
|
+
cookiePrefixes: [
|
|
175
|
+
'_fbp',
|
|
176
|
+
'_fbc'
|
|
177
|
+
],
|
|
178
|
+
bootSnippet: (accountId)=>// Meta's own shim, then an EXPLICIT grant, then init. The explicit grant
|
|
179
|
+
// is the AGL-1622 move applied to this vendor: the tag's first hit should
|
|
180
|
+
// carry a state someone actually chose rather than the vendor's built-in
|
|
181
|
+
// default, and declaring it before `init` means the automatic PageView is
|
|
182
|
+
// already covered by it. Reached only where the gate said yes.
|
|
183
|
+
"!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?" + "n.callMethod.apply(n,arguments):n.queue.push(arguments)};" + "if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';n.queue=[]}" + '(window,document);' + "fbq('consent', 'grant');" + `fbq('init', '${accountId}');` + "fbq('track', 'PageView');",
|
|
184
|
+
setConsent: (scope, granted)=>{
|
|
185
|
+
try {
|
|
186
|
+
const fbq = scope.fbq;
|
|
187
|
+
if (typeof fbq === 'function') {
|
|
188
|
+
;
|
|
189
|
+
fbq('consent', granted ? 'grant' : 'revoke');
|
|
190
|
+
}
|
|
191
|
+
} catch (unused) {
|
|
192
|
+
// A tag that throws on its own consent call is one we cannot silence
|
|
193
|
+
// that way; the element removal and the cookie sweep still stand.
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
/**
|
|
198
|
+
* Google advertising storage — a SWEEP-ONLY vendor (AGL-2486).
|
|
199
|
+
*
|
|
200
|
+
* There is no Google ad script for this module to load. `_gcl_*` and `_gac_*`
|
|
201
|
+
* are written by the GA4 gtag that `site-analytics.tsx` already mounts, once
|
|
202
|
+
* the visitor's `ad_storage` is granted. So the tag is somebody else's to
|
|
203
|
+
* mount and somebody else's to signal; what belongs here is the half nobody
|
|
204
|
+
* owned, which is the cookies.
|
|
205
|
+
*
|
|
206
|
+
* `_gcl_au` is the specific reason this exists. It does not begin with `_ga`,
|
|
207
|
+
* so {@link ANALYTICS_COOKIE_PREFIXES} never reached it, and `revokeAdvertisingTags`
|
|
208
|
+
* could not either — that function acts on marked script ELEMENTS, and there
|
|
209
|
+
* has never been one for Google. The cookie therefore survived every
|
|
210
|
+
* withdrawal on every surface. See {@link ADVERTISING_COOKIE_PREFIXES} for why
|
|
211
|
+
* the prefix is `_gcl` ALONE and cannot reach `_ga`/`_gid`.
|
|
212
|
+
*
|
|
213
|
+
* ⚠️ `_gac` is NOT in that list and must not be added back. It is written
|
|
214
|
+
* under the analytics loader, sits in the `Google Analytics` row of
|
|
215
|
+
* `apps/console/constants/cookie-inventory.ts`, and is already swept by the
|
|
216
|
+
* `_ga` prefix; `advertising-cookie-sweep.spec.ts` pins it as analytics-owned.
|
|
217
|
+
* An earlier version of this comment named it here, and a published Cookie
|
|
218
|
+
* Policy line describing `_gac` as advertising-gated traces to exactly that.
|
|
219
|
+
*
|
|
220
|
+
* The prefixes are IMPORTED rather than restated. They are consumed in two
|
|
221
|
+
* places — the universal sweep in `storeVisitorConsent` and the element-scoped
|
|
222
|
+
* one below — and a second copy would be a second thing to forget.
|
|
223
|
+
*/ export const GOOGLE_ADS_VENDOR = {
|
|
224
|
+
id: 'google-ads',
|
|
225
|
+
label: 'Google advertising',
|
|
226
|
+
/*
|
|
227
|
+
* A LOADER now, not sweep-only (AGL-1152).
|
|
228
|
+
*
|
|
229
|
+
* It was sweep-only because Google's ad tags arrived through something else
|
|
230
|
+
* — a GA4 id or a GTM container — so there was nothing of ours to mount and
|
|
231
|
+
* only cookies to clear. That made advertising reachable ONLY through an
|
|
232
|
+
* analytics product: a site that wanted Google Ads and no analytics had no
|
|
233
|
+
* route at all, and the CSP gate that reads `adTags` never opened for it.
|
|
234
|
+
*
|
|
235
|
+
* `gtag.js` with an `AW-` id is Google's own documented install for Ads
|
|
236
|
+
* without Analytics. The same library serves both products; what differs is
|
|
237
|
+
* the id it is configured with, which is why the two patterns are separate
|
|
238
|
+
* and neither field accepts the other's.
|
|
239
|
+
*/ accountIdPattern: GOOGLE_ADS_ID_PATTERN,
|
|
240
|
+
// Keeps the AGL-2486 sweep it had as a sweep-only vendor: `_gcl_*` is
|
|
241
|
+
// written by any Google tag, including ones we never marked.
|
|
242
|
+
alwaysSweep: true,
|
|
243
|
+
scriptSrc: 'https://www.googletagmanager.com/gtag/js',
|
|
244
|
+
// The loader carries the account, because gtag resolves the container from
|
|
245
|
+
// the query rather than from the `config` that follows. See `scriptSrcFor`;
|
|
246
|
+
// reached only when `sharesLibrary` did NOT find a loader to ride.
|
|
247
|
+
scriptSrcFor: (accountId)=>`https://www.googletagmanager.com/gtag/js?id=${accountId}`,
|
|
248
|
+
// The GA4 measurement id loads this exact library. See `sharesLibrary`.
|
|
249
|
+
sharesLibrary: 'googletagmanager.com/gtag/js',
|
|
250
|
+
scriptMatch: 'googletagmanager.com/gtag/js',
|
|
251
|
+
cookiePrefixes: ADVERTISING_COOKIE_PREFIXES,
|
|
252
|
+
bootSnippet: (accountId)=>/*
|
|
253
|
+
* DENIED FIRST, then granted — the AGL-1622 order.
|
|
254
|
+
*
|
|
255
|
+
* `gtag('consent', 'default', …)` has to run before the config, or the
|
|
256
|
+
* library's own default applies to the first hit. This snippet is reached
|
|
257
|
+
* only where the gate already said yes, so the grant follows immediately;
|
|
258
|
+
* declaring the default anyway is what makes the first hit carry a state
|
|
259
|
+
* somebody chose rather than Google's.
|
|
260
|
+
*
|
|
261
|
+
* `ad_user_data` and `ad_personalization` are named alongside
|
|
262
|
+
* `ad_storage`: Consent Mode v2 treats them as separate signals, and a
|
|
263
|
+
* grant that sets only storage leaves the other two at the library's
|
|
264
|
+
* default on every EEA request.
|
|
265
|
+
*/ /*
|
|
266
|
+
* NO `consent default` here, deliberately.
|
|
267
|
+
*
|
|
268
|
+
* A default is a page-level declaration and something else may already
|
|
269
|
+
* have made it — the GA4 loader above declares one, and re-declaring it
|
|
270
|
+
* mid-pageview re-DENIES what that grant allowed until the update lands.
|
|
271
|
+
* This snippet is reached only where the gate already said yes, so it
|
|
272
|
+
* states the update and leaves the default to whoever mounts first.
|
|
273
|
+
*
|
|
274
|
+
* `ad_user_data` and `ad_personalization` travel with `ad_storage`:
|
|
275
|
+
* Consent Mode v2 treats them as separate signals, and an update setting
|
|
276
|
+
* only storage leaves the other two at the library's default on every
|
|
277
|
+
* EEA request.
|
|
278
|
+
*/ 'window.dataLayer=window.dataLayer||[];' + 'function gtag(){dataLayer.push(arguments);}' + "gtag('consent','update',{ad_storage:'granted'," + "ad_user_data:'granted',ad_personalization:'granted'});" + "gtag('js', new Date());" + `gtag('config', '${accountId}');`,
|
|
279
|
+
setConsent: (scope, granted)=>{
|
|
280
|
+
try {
|
|
281
|
+
const gtag = scope.gtag;
|
|
282
|
+
if (typeof gtag === 'function') {
|
|
283
|
+
;
|
|
284
|
+
gtag('consent', 'update', {
|
|
285
|
+
ad_storage: granted ? 'granted' : 'denied',
|
|
286
|
+
ad_user_data: granted ? 'granted' : 'denied',
|
|
287
|
+
ad_personalization: granted ? 'granted' : 'denied'
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
} catch (unused) {
|
|
291
|
+
// A tag that throws on its own consent call is one we cannot silence
|
|
292
|
+
// that way; the element removal and the cookie sweep still stand.
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
};
|
|
296
|
+
/**
|
|
297
|
+
* LinkedIn Insight Tag.
|
|
298
|
+
*
|
|
299
|
+
* ## Cookies, and why the prefix list is long
|
|
300
|
+
*
|
|
301
|
+
* LinkedIn writes more names than the other two and they do not share a stem:
|
|
302
|
+
* `li_sugr` and `UserMatchHistory` are the retargeting identifiers, `bcookie`
|
|
303
|
+
* and `lidc` are set on the `.linkedin.com` domain by the loader, and
|
|
304
|
+
* `AnalyticsSyncHistory` records the last sync. A prefix list that named only
|
|
305
|
+
* `li_` would leave three of them behind on withdrawal — the AGL-2486 shape,
|
|
306
|
+
* where a sweep looks thorough because it cleared the ones that happen to
|
|
307
|
+
* share a prefix.
|
|
308
|
+
*
|
|
309
|
+
* ⚠️ `bcookie` and `lidc` are written at `.linkedin.com`, a domain a page on
|
|
310
|
+
* our origin cannot delete through `document.cookie`. The sweep removes what
|
|
311
|
+
* it can reach and the element removal stops the tag writing more; the rest is
|
|
312
|
+
* LinkedIn's to hold, and saying so is better than a sweep that quietly
|
|
313
|
+
* half-works.
|
|
314
|
+
*/ export const LINKEDIN_INSIGHT_VENDOR = {
|
|
315
|
+
id: 'linkedin',
|
|
316
|
+
label: 'LinkedIn Insight Tag',
|
|
317
|
+
accountIdPattern: LINKEDIN_PARTNER_ID_PATTERN,
|
|
318
|
+
scriptSrc: 'https://snap.licdn.com/li.lms-analytics/insight.min.js',
|
|
319
|
+
scriptMatch: 'snap.licdn.com',
|
|
320
|
+
cookiePrefixes: [
|
|
321
|
+
'li_sugr',
|
|
322
|
+
'UserMatchHistory',
|
|
323
|
+
'AnalyticsSyncHistory',
|
|
324
|
+
'bcookie',
|
|
325
|
+
'lidc',
|
|
326
|
+
'li_gc'
|
|
327
|
+
],
|
|
328
|
+
bootSnippet: (accountId)=>// The Insight Tag reads its partner id off a global array the library
|
|
329
|
+
// drains on load, so the id is pushed before the script is appended
|
|
330
|
+
// rather than passed to it.
|
|
331
|
+
`window._linkedin_partner_id='${accountId}';` + 'window._linkedin_data_partner_ids=window._linkedin_data_partner_ids||[];' + 'window._linkedin_data_partner_ids.push(window._linkedin_partner_id);',
|
|
332
|
+
setConsent: (scope, granted)=>{
|
|
333
|
+
try {
|
|
334
|
+
// The tag has no consent API of its own. What it does have is the
|
|
335
|
+
// partner-id array it drains on load: emptying it stops a late or
|
|
336
|
+
// re-inserted library finding an id to report against. The element
|
|
337
|
+
// removal and the cookie sweep remain the substance.
|
|
338
|
+
if (!granted) scope._linkedin_data_partner_ids = [];
|
|
339
|
+
} catch (unused) {
|
|
340
|
+
// Same standing as the others: the teardown does not depend on this.
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
};
|
|
344
|
+
/**
|
|
345
|
+
* Every vendor this gate knows how to tear down — which is a SUPERSET of the
|
|
346
|
+
* vendors it knows how to load, now that a sweep-only member exists.
|
|
347
|
+
*/ export const ADVERTISING_VENDORS = [
|
|
348
|
+
META_PIXEL_VENDOR,
|
|
349
|
+
GOOGLE_ADS_VENDOR,
|
|
350
|
+
LINKEDIN_INSIGHT_VENDOR
|
|
351
|
+
];
|
|
352
|
+
/**
|
|
353
|
+
* The whole verdict: which advertising tags may exist in this document, for
|
|
354
|
+
* this visitor, on this site, right now?
|
|
355
|
+
*
|
|
356
|
+
* Pure, and empty is the answer to every question it cannot answer — an absent
|
|
357
|
+
* host, an unreadable record, an unknown vendor id, a malformed account id.
|
|
358
|
+
* See the module comment for the six conditions and why each one is separate.
|
|
359
|
+
*
|
|
360
|
+
* `stored` is the CLIENT-resolved record. Like the GA gate, this is evaluated
|
|
361
|
+
* after hydration only: tenant pages are ISR-cached, so the server HTML must
|
|
362
|
+
* be identical for every visitor and cannot carry a tag one of them granted.
|
|
363
|
+
*
|
|
364
|
+
* `internal` is read the same way and for the same reason. Taking it as a
|
|
365
|
+
* defaulted parameter rather than calling into the browser mid-verdict is what
|
|
366
|
+
* keeps this function testable in both directions — a gate that can only be
|
|
367
|
+
* exercised one way is the shape that ships broken (AGL-2067).
|
|
368
|
+
*/ export function resolveAdvertisingTags(host, stored, env = readAnalyticsEnvironment(), internal = readInternalTrafficOverride()) {
|
|
369
|
+
var _host_analytics;
|
|
370
|
+
if (isPlatformMarketingHost(host) === false) return [];
|
|
371
|
+
if (analyticsMayEmit(env) === false) return [];
|
|
372
|
+
if (hostConsentRequired(host) === false) return [];
|
|
373
|
+
if (advertisingGrantedByRecord(host, stored) === false) return [];
|
|
374
|
+
// Condition 6. Structural, like every other clause here: the tag is not
|
|
375
|
+
// mounted rather than mounted-and-suppressed, because a resident tag fires
|
|
376
|
+
// on its own and a `_gcl_*` cookie is written by the first automatic event.
|
|
377
|
+
//
|
|
378
|
+
// The environment half is not redundant with `analyticsMayEmit` above. That
|
|
379
|
+
// clause passes under the non-production escape hatch, and a build emitting
|
|
380
|
+
// because someone asked it to is ours by definition — so the hatch must not
|
|
381
|
+
// hand a dev or preview build the real `AW-` id and let it build remarketing
|
|
382
|
+
// audiences out of our own engineers, which is the hole condition 2 exists
|
|
383
|
+
// to close. Same reasoning as `INTERNAL_TRAFFIC_FORCED_SNIPPET`.
|
|
384
|
+
if (internal === true) return [];
|
|
385
|
+
if (analyticsEnvironmentForcesInternal(env) === true) return [];
|
|
386
|
+
const configured = host == null ? void 0 : (_host_analytics = host.analytics) == null ? void 0 : _host_analytics.adTags;
|
|
387
|
+
if (!configured) return [];
|
|
388
|
+
const tags = [];
|
|
389
|
+
for (const vendor of ADVERTISING_VENDORS){
|
|
390
|
+
var _configured_vendor_id;
|
|
391
|
+
// Sweep-only: nothing to mount, and no `accountIdPattern` to test with.
|
|
392
|
+
// Skipped explicitly rather than left to fail a pattern check, so a stray
|
|
393
|
+
// `adTags['google-ads']` cannot conjure a script (AGL-2486).
|
|
394
|
+
if (vendor.sweepOnly || !vendor.accountIdPattern) continue;
|
|
395
|
+
const accountId = String((_configured_vendor_id = configured[vendor.id]) != null ? _configured_vendor_id : '');
|
|
396
|
+
if (vendor.accountIdPattern.test(accountId)) {
|
|
397
|
+
tags.push({
|
|
398
|
+
vendor,
|
|
399
|
+
accountId
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
return tags;
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* The script elements THIS MODULE put in the document for a given vendor —
|
|
407
|
+
* both the inline boot and the library, since a vendor mounts as a pair.
|
|
408
|
+
*
|
|
409
|
+
* Scoped by {@link ADVERTISING_TAG_ATTRIBUTE}, which is the clause that keeps
|
|
410
|
+
* a pixel a customer pasted into their own Custom HTML out of our teardown.
|
|
411
|
+
* An element that carries the attribute but whose `src` points somewhere other
|
|
412
|
+
* than this vendor is excluded as well: the attribute is ours to write, so a
|
|
413
|
+
* mismatch means something rewrote it and the safe reading is "not ours".
|
|
414
|
+
* An element with NO `src` is the inline boot and passes — it has no URL to
|
|
415
|
+
* disagree with.
|
|
416
|
+
*/ function markedVendorElements(vendor) {
|
|
417
|
+
if (typeof document === 'undefined') return [];
|
|
418
|
+
// A sweep-only vendor has no script of ours and therefore no element that
|
|
419
|
+
// could be "ours" (AGL-2486). Returning early is also what stops an absent
|
|
420
|
+
// `scriptMatch` reaching `src.includes(...)` below — an empty string there
|
|
421
|
+
// would have matched EVERY marked script, handing one vendor's teardown
|
|
422
|
+
// another vendor's elements.
|
|
423
|
+
if (vendor.sweepOnly || !vendor.scriptMatch) return [];
|
|
424
|
+
try {
|
|
425
|
+
const selector = `script[${ADVERTISING_TAG_ATTRIBUTE}="${vendor.id}"]`;
|
|
426
|
+
return Array.from(document.querySelectorAll(selector)).filter((element)=>{
|
|
427
|
+
var _element_src;
|
|
428
|
+
const src = String((_element_src = element.src) != null ? _element_src : '');
|
|
429
|
+
return src === '' || src.includes(vendor.scriptMatch);
|
|
430
|
+
});
|
|
431
|
+
} catch (unused) {
|
|
432
|
+
// A hostile or absent DOM: nothing we can prove is ours.
|
|
433
|
+
return [];
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
/** Every vendor whose tag this module loaded and that is still resident. */ export function residentAdvertisingVendors() {
|
|
437
|
+
return ADVERTISING_VENDORS.filter((vendor)=>markedVendorElements(vendor).length > 0);
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Stop every advertising tag THIS MODULE loaded, and return the vendor ids it
|
|
441
|
+
* acted on — which is what makes the withdrawal assertable rather than
|
|
442
|
+
* assumed.
|
|
443
|
+
*
|
|
444
|
+
* Three steps, in this order and for these reasons:
|
|
445
|
+
*
|
|
446
|
+
* 1. **Revoke on the resident tag.** The gate cannot unload a script that has
|
|
447
|
+
* already executed. This is the vendor's own kill switch and it is what
|
|
448
|
+
* actually stops the next automatic event.
|
|
449
|
+
* 2. **Remove the script elements.** So the structural property the gate
|
|
450
|
+
* asserts — the vendor's script is not in this document — is restored and
|
|
451
|
+
* not merely claimed. React unmounting its `<Script>` does not reliably do
|
|
452
|
+
* this: `next/script` injects into the head and leaves it there.
|
|
453
|
+
* 3. **Sweep the cookies.** Last, because steps 1 and 2 are what stop them
|
|
454
|
+
* coming straight back (AGL-1608).
|
|
455
|
+
*
|
|
456
|
+
* Acts only on tags carrying {@link ADVERTISING_TAG_ATTRIBUTE}. On a customer
|
|
457
|
+
* site — where this module never loaded anything — it is a no-op that touches
|
|
458
|
+
* no cookie, which is the only correct behaviour: their pixel, if any, runs on
|
|
459
|
+
* a basis that is not ours to withdraw.
|
|
460
|
+
*/ export function revokeAdvertisingTags(hostname) {
|
|
461
|
+
if (typeof window === 'undefined') return [];
|
|
462
|
+
const acted = [];
|
|
463
|
+
const scope = window;
|
|
464
|
+
for (const vendor of ADVERTISING_VENDORS){
|
|
465
|
+
/*
|
|
466
|
+
* The element check is an OWNERSHIP test (AGL-1498 case (e)).
|
|
467
|
+
*
|
|
468
|
+
* A pixel we did not load is one running on a basis that is not ours to
|
|
469
|
+
* withdraw — a customer's own Custom HTML, on their own site, under their
|
|
470
|
+
* own notice. Killing it, or clearing its cookies, would be us
|
|
471
|
+
* reconfiguring their site against a consent record their tag never ran
|
|
472
|
+
* on. So no marker of ours means hands off, cookies included.
|
|
473
|
+
*
|
|
474
|
+
* `alwaysSweep` is the narrow exception and it is about the COOKIE, not
|
|
475
|
+
* the loader: `_gcl_*` is written by any Google tag — a GTM container, a
|
|
476
|
+
* bare gtag — with no marker of ours ever existing, which is why it
|
|
477
|
+
* survived every withdrawal until AGL-2486. Giving Google a loader must
|
|
478
|
+
* not quietly take that sweep away again.
|
|
479
|
+
*
|
|
480
|
+
* ORDER, which is the whole of AGL-1608: revoke on the tag FIRST, then
|
|
481
|
+
* remove it, then sweep. Sweeping first deletes the cookies and the
|
|
482
|
+
* resident pixel's next automatic event writes them straight back inside
|
|
483
|
+
* the same pageview.
|
|
484
|
+
*/ const elements = vendor.sweepOnly ? [] : markedVendorElements(vendor);
|
|
485
|
+
const ours = elements.length > 0;
|
|
486
|
+
if (ours) {
|
|
487
|
+
vendor.setConsent == null ? void 0 : vendor.setConsent.call(vendor, scope, false);
|
|
488
|
+
for (const element of elements){
|
|
489
|
+
try {
|
|
490
|
+
element.remove();
|
|
491
|
+
} catch (unused) {
|
|
492
|
+
// A detached or frozen node: the revoke above still stands.
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
}
|
|
496
|
+
const maySweep = ours || vendor.sweepOnly || vendor.alwaysSweep;
|
|
497
|
+
const swept = maySweep ? clearCookiesWithPrefixes(vendor.cookiePrefixes, hostname) : [];
|
|
498
|
+
if (ours || swept.length > 0) acted.push(vendor.id);
|
|
499
|
+
}
|
|
500
|
+
return acted;
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Re-grant on a tag that is still resident — the symmetric half.
|
|
504
|
+
*
|
|
505
|
+
* A visitor who withdraws and changes their mind inside one pageview would
|
|
506
|
+
* otherwise stay silently un-tracked until they navigated, because a re-
|
|
507
|
+
* rendered `<Script>` cannot re-execute a library the browser already ran.
|
|
508
|
+
* `setResidentAnalyticsTags` is symmetric for exactly this reason and this is
|
|
509
|
+
* the same move for a second channel.
|
|
510
|
+
*
|
|
511
|
+
* Returns the vendor ids it reached; empty when nothing is resident, which is
|
|
512
|
+
* the normal case — a re-grant after the elements were removed goes through
|
|
513
|
+
* the gate and loads a fresh tag instead.
|
|
514
|
+
*/ export function restoreAdvertisingTags() {
|
|
515
|
+
if (typeof window === 'undefined') return [];
|
|
516
|
+
const scope = window;
|
|
517
|
+
const acted = [];
|
|
518
|
+
for (const vendor of residentAdvertisingVendors()){
|
|
519
|
+
vendor.setConsent == null ? void 0 : vendor.setConsent.call(vendor, scope, true);
|
|
520
|
+
acted.push(vendor.id);
|
|
521
|
+
}
|
|
522
|
+
return acted;
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
//# sourceMappingURL=advertising-tags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../../libs/aglyn/src/lib/app-utils/advertising-tags.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The VENDOR-AGNOSTIC advertising-tag gate.\n *\n * ## The hole this closes\n *\n * Until now the consent machinery could gate exactly one thing: Google. The\n * `advertising` category has existed since AGL-1649 and it is honest — a\n * refusal always wins, and a host that never asked gets nothing — but the\n * only ENFORCEMENT it ever reached was {@link consentModeSignals}, four\n * strings handed to `gtag`. A non-Google tag could not be consent-gated at\n * all, because nothing in the repo knew how to gate one. Deciding to deploy a\n * Meta Pixel with that as the state of the art would have meant either\n * shipping it ungated or inventing a second consent implementation beside the\n * first — the outcome AGL-1579 explicitly ruled out.\n *\n * This module is the missing enforcement channel, built for vendors in\n * general and populated with one descriptor. **Deploying the Meta Pixel is a\n * separate decision and this module does not take it** — see \"What is NOT\n * wired\" below.\n *\n * ## Why the gate is STRUCTURAL\n *\n * The lesson AGL-1498 paid for and AGL-1608 paid for again: a boolean checked\n * before each call is not a gate. A resident tag fires on its own — GA4\n * enhanced measurement re-created `_ga_YW5PG16YTM` on aglyn.com after a\n * hand-run sweep to zero cookies, from one scroll to the footer — so the only\n * enforcement that holds is the tag never being in the document.\n *\n * So the shape here mirrors the GA gate exactly:\n *\n * - {@link resolveAdvertisingTags} is a PURE verdict over the host document\n * and the visitor's stored record. It returns the tags that may exist. An\n * ungranted visitor gets an empty array, the component renders no\n * `<Script>`, and no request goes to the vendor. Not loaded-then-suppressed:\n * not loaded.\n * - {@link revokeAdvertisingTags} exists because the gate CANNOT unload a tag.\n * Dropping the element on a mid-pageview withdrawal leaves the vendor's\n * script executing, so withdrawal additionally revokes consent on the\n * resident tag, removes its script elements, and sweeps its cookies — in\n * that order, for the AGL-1608 reason: sweeping first deletes the cookies\n * and immediately gets them back.\n *\n * ## The six conditions, all independent, all required\n *\n * 1. **{@link isPlatformMarketingHost}** — Aglyn's own marketing site, never a\n * customer's. This is the DPA §3.2 boundary: Aglyn promises customers it\n * does not \"sell\"/\"share\" Customer Personal Data, and an ad pixel on a\n * customer's published site — or in the console — would breach that. Note\n * the console needs no condition of its own: it does not render the tenant\n * runtime's analytics component at all, so there is no mount point to gate.\n * 2. **{@link analyticsMayEmit}** — a real production deployment. AGL-2067's\n * finding was that `next dev` and Vercel PREVIEW builds resolve\n * `aglyn.com`'s host document exactly as production does; without this a\n * preview deploy would build real retargeting audiences out of our own\n * engineers.\n * 3. **{@link hostConsentRequired}** — the consent machinery is actually live\n * for this site. A host that switched the tool off (`consent.disabled`)\n * runs their own CMP and ours has no answer on file to act on.\n * 4. **{@link advertisingGrantedByRecord}** — the host asks about advertising\n * AND the visitor explicitly said yes to that specific category. This is\n * where the region behaviour is INHERITED rather than reimplemented: an\n * EEA/UK visitor pre-choice has no record, an unknown-region visitor has no\n * record, a US `implied` visitor's status cannot carry an advertising\n * grant, and `gpc-opt-out` cannot either. There is deliberately no country\n * logic in this file.\n * 5. **A configured, well-formed account id for a KNOWN vendor.** The gate\n * describes what may load; the host document decides what is configured.\n * 6. **{@link readInternalTrafficOverride} is false** — this browser has not\n * been declared one of ours. A GA4 data filter is PROPERTY-scoped: it drops\n * `traffic_type: internal` hits from the GA4 property and has no reach into\n * an `AW-`/Meta/LinkedIn destination at all, which are separate products\n * reached by separate requests. Measured on `aglyn.com`: a flagged browser's\n * pageview is correctly absent from GA4 while the same pageview still sends\n * `ccm/collect`, `pagead/1p-user-list` (`is_vtc=1`) and\n * `viewthroughconversion` to Google Ads, joining our own staff to the\n * remarketing audiences those requests build. Excluding ourselves from the\n * reports while still training the bidding on ourselves is the worse half of\n * the problem, because it is the half nobody can see in a report.\n *\n * This is the same browser-scoped opt-in the GA4 stamp uses, so one visit to\n * `?aglyn_internal=1` covers both, and the two cannot drift apart into a\n * browser that is internal for one product and external for the other. Note\n * it is the BROWSER, not the account: staff ID-token claims are the console\n * mechanism (AGL-1582) and there is no account to consult here.\n *\n * {@link analyticsEnvironmentForcesInternal} is the other half of the same\n * condition. Condition 2 passes under the non-production escape hatch, and a\n * build that emits because someone asked it to is ours by definition — so\n * the hatch must not hand a dev or preview build the real `AW-` id. Without\n * this the hatch reopens precisely the hole condition 2 closes, which is why\n * `INTERNAL_TRAFFIC_FORCED_SNIPPET` exists on the GA side.\n *\n * ## What is NOT wired, and why that is the point\n *\n * No host document carries an `analytics.adTags` entry. The Meta descriptor\n * below is a description of how that vendor would be loaded and — more\n * importantly — how it would be torn down; it is inert until someone writes a\n * pixel id onto the `aglyn-marketing` host. That makes deployment a DATA\n * change reviewed on its own merits, exactly as configuring GA is, rather than\n * something that rides along with this mechanism.\n *\n * ## Why customer sites are excluded outright rather than offered this\n *\n * A customer-facing \"run your own ad pixel\" feature is a different product\n * decision with its own consent copy, its own cookie-policy rows and its own\n * DPA implications. Nothing here forecloses it. What this module must not do\n * is arrive as that feature by accident.\n */\n\nimport {\n GOOGLE_ADS_ID_PATTERN,\n LINKEDIN_PARTNER_ID_PATTERN,\n META_PIXEL_ID_PATTERN,\n} from './visitor-consent'\nimport {\n analyticsEnvironmentForcesInternal,\n analyticsMayEmit,\n type AnalyticsEnvironment,\n readAnalyticsEnvironment,\n} from './analytics-environment'\nimport { readInternalTrafficOverride } from './internal-traffic'\nimport { isPlatformMarketingHost } from './platform-marketing-host'\nimport {\n ADVERTISING_COOKIE_PREFIXES,\n advertisingGrantedByRecord,\n clearCookiesWithPrefixes,\n hostConsentRequired,\n type StoredVisitorConsent,\n type VisitorConsentHost,\n} from './visitor-consent'\n\n/**\n * The attribute every script element this module renders carries.\n *\n * Load-bearing for the teardown, not decoration. {@link revokeAdvertisingTags}\n * acts ONLY on elements carrying it, so a vendor tag a customer pasted into\n * their own site's Custom HTML is never touched by our withdrawal path — we\n * did not load it, we do not know what basis it runs on, and silently killing\n * it would be us configuring a customer's site. Its value is the vendor id.\n */\nexport const ADVERTISING_TAG_ATTRIBUTE = 'data-aglyn-ad-tag'\n\n/**\n * One advertising vendor, described completely enough to LOAD it and — the\n * half that is easy to forget and impossible to retrofit — to STOP it.\n *\n * Every field exists because withdrawal needs it. A vendor that cannot be\n * revoked, whose script cannot be found in the document, and whose cookies are\n * not named, cannot be consent-gated at all; requiring the descriptor to\n * answer all three is what stops a future vendor being added load-only.\n *\n * TWO SHAPES, since AGL-2486. A vendor we MOUNT answers all three and every\n * field below is required of it. A {@link AdvertisingVendor.sweepOnly} vendor\n * answers only the third, because there is no script of ours to find or stop —\n * its cookies are a side effect of a tag another module owns. The mount fields\n * are therefore optional at the type level and mandatory in practice for\n * anything without that flag, which `advertising-tag-gate.spec.tsx` asserts.\n * `cookiePrefixes` stays required of BOTH: naming the cookies is the one thing\n * no vendor is excused from, and it is what the Cookie Policy is written from.\n */\nexport interface AdvertisingVendor {\n /** Stable key: the `analytics.adTags` map key and the attribute value. */\n readonly id: string\n /** Human name, for the cookie policy and the consent copy. */\n readonly label: string\n /**\n * A vendor this module never LOADS — its cookies are a side effect of a tag\n * some other module owns (today: the GA4 gtag that `site-analytics.tsx`\n * mounts, which writes `_gcl_*` once `ad_storage` is granted). AGL-2486.\n *\n * It is a member of this registry because the registry's job is every\n * advertising artifact that touches the browser, and because the disclosure\n * guard in `cookie-inventory.spec.ts` keys on `cookiePrefixes` — a vendor\n * missing from here is a vendor missing from the Cookie Policy. Meta being\n * present while Google was absent is the asymmetry that produced the gap.\n *\n * Such a vendor declares `id`, `label` and `cookiePrefixes` and NOTHING\n * else: there is no script to mount, none to remove, and no vendor-specific\n * consent call — GA's own consent-mode signals carry the state. The mount\n * fields below are therefore optional, and `advertising-tag-gate.spec.tsx`\n * asserts every vendor WITHOUT this flag still declares all of them, so the\n * original invariant — a vendor that cannot be revoked cannot be gated —\n * survives for everything that does load.\n */\n readonly sweepOnly?: true\n /**\n * Sweep this vendor's cookies even when no marked element is present.\n *\n * The element check is an OWNERSHIP test, not a liveness one: a pixel we did\n * not load is a pixel running on a basis that is not ours to withdraw, so\n * its cookies are not ours to clear either. `alwaysSweep` is for a vendor\n * whose cookies cannot belong to anybody else's tag on our surfaces —\n * Google's `_gcl_*`, which a GTM container or a bare gtag writes without any\n * marker of ours ever existing. That is the AGL-2486 case, and it is a\n * property of the COOKIE rather than of the loader.\n */\n readonly alwaysSweep?: true\n /**\n * Strict format check on the configured account id. The id lands inside an\n * inline script, so this is load-bearing exactly as\n * `GA_MEASUREMENT_ID_PATTERN` is (the AGL-138 concern).\n */\n readonly accountIdPattern?: RegExp\n /** The vendor library URL. Constant — no interpolation reaches it. */\n readonly scriptSrc?: string\n /**\n * The library URL for a vendor whose LOADER carries the account id.\n *\n * Most vendors take their id in the boot snippet and fetch a constant URL,\n * which is what {@link scriptSrc} is. `gtag.js` is the exception: Google's\n * documented install is `gtag/js?id=<account>`, and the id in the query is\n * what tells the loader which container's configuration to fetch. Without\n * it the library still returns 200 and still defines `gtag()`, so nothing\n * anywhere reports an error — it simply registers no container, and every\n * `config` for the account queues against a runtime that will never serve\n * it. Measured on `app.aglyn.com` (AGL-2559): the bare loader left\n * `google_tag_data.tidr.container` holding the GA4 id and an EMPTY string,\n * with no request to `googleadservices` at all.\n *\n * Present, it wins over {@link scriptSrc}. `scriptSrc` stays the vendor's\n * base URL, because it is what {@link sharesLibrary}, {@link scriptMatch}\n * and the CSP origin list are all matched against, and none of those may\n * vary per account.\n *\n * The id reaching a URL is the same load-bearing check as the id reaching an\n * inline script: it is interpolated only after `accountIdPattern` passed.\n */\n readonly scriptSrcFor?: (accountId: string) => string\n /**\n * A substring of a library URL this vendor SHARES with another loader.\n *\n * Set it and the tag mounts its boot snippet but skips its own `<script>`\n * when a matching one is already in the document. Google Ads is the case:\n * `gtag.js` is the same library the GA4 measurement id loads, so a site with\n * both configured would fetch it twice, define `gtag()` twice, and — the\n * part that actually corrupts data — push a second `consent default` that\n * re-denies what the first one granted, mid-pageview.\n *\n * The boot snippet still runs, because a `config` for a SECOND product is\n * exactly how gtag is meant to carry two: one library, two configs, no\n * double count.\n */\n readonly sharesLibrary?: string\n /**\n * Substring that identifies a RESIDENT script element for this vendor,\n * used together with {@link ADVERTISING_TAG_ATTRIBUTE} at teardown.\n */\n readonly scriptMatch?: string\n /** Cookie-name prefixes this vendor sets, swept on withdrawal. */\n readonly cookiePrefixes: readonly string[]\n /** The inline boot snippet, built from a FORMAT-CHECKED account id. */\n readonly bootSnippet?: (accountId: string) => string\n /**\n * Tell a RESIDENT tag what the visitor decided. The vendor's own documented\n * opt-out mechanism — the `ga-disable-<id>` analogue — reached through\n * whatever global it left behind. Called in both directions, so a visitor\n * who withdraws and changes their mind in one pageview is not silently\n * unmeasured until they navigate.\n */\n readonly setConsent?: (\n scope: Record<string, unknown>,\n granted: boolean,\n ) => void\n}\n\n\n/**\n * Meta (Facebook/Instagram) Pixel.\n *\n * ## What happens to `_fbp` / `_fbc` on withdrawal: they are DELETED\n *\n * Not merely stopped. The decision is inherited, not invented: AGL-1606\n * settled that a withdrawal \"cleans up, it does not merely stop adding\" for\n * the GA equivalents, and there is no honest reading under which Meta's\n * first-party identifiers get a softer rule than Google's. Both are\n * browser-lifetime identifiers written by an advertising tag under a consent\n * the visitor has just withdrawn.\n *\n * They are swept with the SAME ladder as `_ga` — the exact hostname and every\n * domain up to the registrable one — because Meta writes them the same way GA\n * does: path `/`, first-party, at the registrable domain. A deletion aimed at\n * the exact hostname would silently no-op.\n *\n * Two limits, stated rather than glossed. Any copy Meta already ingested is\n * gone from our reach — deletion stops future joins, it does not retract past\n * ones; the CPRA opt-out title on the control is about the ongoing \"share\",\n * which this does stop. And a cookie written at a path other than `/` is not\n * reachable through `document.cookie`; Meta does not write one.\n *\n * ## Why `consent revoke` is called BEFORE the sweep\n *\n * `fbq('consent', 'revoke')` is Meta's documented CMP control and the exact\n * counterpart of the `ga-disable-<id>` flag. Skipping it and going straight to\n * the cookies reproduces AGL-1608: the resident pixel's next automatic event\n * re-writes `_fbp` and the sweep un-does itself inside the same pageview.\n */\nexport const META_PIXEL_VENDOR: AdvertisingVendor = {\n id: 'meta',\n label: 'Meta Pixel',\n // Meta pixel ids are numeric; the length band is generous on both sides\n // rather than pinned to today's 15-16 digits.\n accountIdPattern: META_PIXEL_ID_PATTERN,\n scriptSrc: 'https://connect.facebook.net/en_US/fbevents.js',\n scriptMatch: 'connect.facebook.net',\n cookiePrefixes: ['_fbp', '_fbc'],\n bootSnippet: (accountId: string) =>\n // Meta's own shim, then an EXPLICIT grant, then init. The explicit grant\n // is the AGL-1622 move applied to this vendor: the tag's first hit should\n // carry a state someone actually chose rather than the vendor's built-in\n // default, and declaring it before `init` means the automatic PageView is\n // already covered by it. Reached only where the gate said yes.\n \"!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?\" +\n \"n.callMethod.apply(n,arguments):n.queue.push(arguments)};\" +\n \"if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';n.queue=[]}\" +\n '(window,document);' +\n \"fbq('consent', 'grant');\" +\n `fbq('init', '${accountId}');` +\n \"fbq('track', 'PageView');\",\n setConsent: (scope: Record<string, unknown>, granted: boolean) => {\n try {\n const fbq = scope.fbq\n if (typeof fbq === 'function') {\n ;(fbq as (...args: unknown[]) => void)(\n 'consent',\n granted ? 'grant' : 'revoke',\n )\n }\n } catch {\n // A tag that throws on its own consent call is one we cannot silence\n // that way; the element removal and the cookie sweep still stand.\n }\n },\n}\n\n/**\n * Google advertising storage — a SWEEP-ONLY vendor (AGL-2486).\n *\n * There is no Google ad script for this module to load. `_gcl_*` and `_gac_*`\n * are written by the GA4 gtag that `site-analytics.tsx` already mounts, once\n * the visitor's `ad_storage` is granted. So the tag is somebody else's to\n * mount and somebody else's to signal; what belongs here is the half nobody\n * owned, which is the cookies.\n *\n * `_gcl_au` is the specific reason this exists. It does not begin with `_ga`,\n * so {@link ANALYTICS_COOKIE_PREFIXES} never reached it, and `revokeAdvertisingTags`\n * could not either — that function acts on marked script ELEMENTS, and there\n * has never been one for Google. The cookie therefore survived every\n * withdrawal on every surface. See {@link ADVERTISING_COOKIE_PREFIXES} for why\n * the prefix is `_gcl` ALONE and cannot reach `_ga`/`_gid`.\n *\n * ⚠️ `_gac` is NOT in that list and must not be added back. It is written\n * under the analytics loader, sits in the `Google Analytics` row of\n * `apps/console/constants/cookie-inventory.ts`, and is already swept by the\n * `_ga` prefix; `advertising-cookie-sweep.spec.ts` pins it as analytics-owned.\n * An earlier version of this comment named it here, and a published Cookie\n * Policy line describing `_gac` as advertising-gated traces to exactly that.\n *\n * The prefixes are IMPORTED rather than restated. They are consumed in two\n * places — the universal sweep in `storeVisitorConsent` and the element-scoped\n * one below — and a second copy would be a second thing to forget.\n */\nexport const GOOGLE_ADS_VENDOR: AdvertisingVendor = {\n id: 'google-ads',\n label: 'Google advertising',\n /*\n * A LOADER now, not sweep-only (AGL-1152).\n *\n * It was sweep-only because Google's ad tags arrived through something else\n * — a GA4 id or a GTM container — so there was nothing of ours to mount and\n * only cookies to clear. That made advertising reachable ONLY through an\n * analytics product: a site that wanted Google Ads and no analytics had no\n * route at all, and the CSP gate that reads `adTags` never opened for it.\n *\n * `gtag.js` with an `AW-` id is Google's own documented install for Ads\n * without Analytics. The same library serves both products; what differs is\n * the id it is configured with, which is why the two patterns are separate\n * and neither field accepts the other's.\n */\n accountIdPattern: GOOGLE_ADS_ID_PATTERN,\n // Keeps the AGL-2486 sweep it had as a sweep-only vendor: `_gcl_*` is\n // written by any Google tag, including ones we never marked.\n alwaysSweep: true,\n scriptSrc: 'https://www.googletagmanager.com/gtag/js',\n // The loader carries the account, because gtag resolves the container from\n // the query rather than from the `config` that follows. See `scriptSrcFor`;\n // reached only when `sharesLibrary` did NOT find a loader to ride.\n scriptSrcFor: (accountId: string) =>\n `https://www.googletagmanager.com/gtag/js?id=${accountId}`,\n // The GA4 measurement id loads this exact library. See `sharesLibrary`.\n sharesLibrary: 'googletagmanager.com/gtag/js',\n scriptMatch: 'googletagmanager.com/gtag/js',\n cookiePrefixes: ADVERTISING_COOKIE_PREFIXES,\n bootSnippet: (accountId: string) =>\n /*\n * DENIED FIRST, then granted — the AGL-1622 order.\n *\n * `gtag('consent', 'default', …)` has to run before the config, or the\n * library's own default applies to the first hit. This snippet is reached\n * only where the gate already said yes, so the grant follows immediately;\n * declaring the default anyway is what makes the first hit carry a state\n * somebody chose rather than Google's.\n *\n * `ad_user_data` and `ad_personalization` are named alongside\n * `ad_storage`: Consent Mode v2 treats them as separate signals, and a\n * grant that sets only storage leaves the other two at the library's\n * default on every EEA request.\n */\n /*\n * NO `consent default` here, deliberately.\n *\n * A default is a page-level declaration and something else may already\n * have made it — the GA4 loader above declares one, and re-declaring it\n * mid-pageview re-DENIES what that grant allowed until the update lands.\n * This snippet is reached only where the gate already said yes, so it\n * states the update and leaves the default to whoever mounts first.\n *\n * `ad_user_data` and `ad_personalization` travel with `ad_storage`:\n * Consent Mode v2 treats them as separate signals, and an update setting\n * only storage leaves the other two at the library's default on every\n * EEA request.\n */\n 'window.dataLayer=window.dataLayer||[];' +\n 'function gtag(){dataLayer.push(arguments);}' +\n \"gtag('consent','update',{ad_storage:'granted',\" +\n \"ad_user_data:'granted',ad_personalization:'granted'});\" +\n \"gtag('js', new Date());\" +\n `gtag('config', '${accountId}');`,\n setConsent: (scope: Record<string, unknown>, granted: boolean) => {\n try {\n const gtag = scope.gtag\n if (typeof gtag === 'function') {\n ;(gtag as (...args: unknown[]) => void)('consent', 'update', {\n ad_storage: granted ? 'granted' : 'denied',\n ad_user_data: granted ? 'granted' : 'denied',\n ad_personalization: granted ? 'granted' : 'denied',\n })\n }\n } catch {\n // A tag that throws on its own consent call is one we cannot silence\n // that way; the element removal and the cookie sweep still stand.\n }\n },\n}\n\n/**\n * LinkedIn Insight Tag.\n *\n * ## Cookies, and why the prefix list is long\n *\n * LinkedIn writes more names than the other two and they do not share a stem:\n * `li_sugr` and `UserMatchHistory` are the retargeting identifiers, `bcookie`\n * and `lidc` are set on the `.linkedin.com` domain by the loader, and\n * `AnalyticsSyncHistory` records the last sync. A prefix list that named only\n * `li_` would leave three of them behind on withdrawal — the AGL-2486 shape,\n * where a sweep looks thorough because it cleared the ones that happen to\n * share a prefix.\n *\n * ⚠️ `bcookie` and `lidc` are written at `.linkedin.com`, a domain a page on\n * our origin cannot delete through `document.cookie`. The sweep removes what\n * it can reach and the element removal stops the tag writing more; the rest is\n * LinkedIn's to hold, and saying so is better than a sweep that quietly\n * half-works.\n */\nexport const LINKEDIN_INSIGHT_VENDOR: AdvertisingVendor = {\n id: 'linkedin',\n label: 'LinkedIn Insight Tag',\n accountIdPattern: LINKEDIN_PARTNER_ID_PATTERN,\n scriptSrc: 'https://snap.licdn.com/li.lms-analytics/insight.min.js',\n scriptMatch: 'snap.licdn.com',\n cookiePrefixes: [\n 'li_sugr',\n 'UserMatchHistory',\n 'AnalyticsSyncHistory',\n 'bcookie',\n 'lidc',\n 'li_gc',\n ],\n bootSnippet: (accountId: string) =>\n // The Insight Tag reads its partner id off a global array the library\n // drains on load, so the id is pushed before the script is appended\n // rather than passed to it.\n `window._linkedin_partner_id='${accountId}';` +\n 'window._linkedin_data_partner_ids=window._linkedin_data_partner_ids||[];' +\n 'window._linkedin_data_partner_ids.push(window._linkedin_partner_id);',\n setConsent: (scope: Record<string, unknown>, granted: boolean) => {\n try {\n // The tag has no consent API of its own. What it does have is the\n // partner-id array it drains on load: emptying it stops a late or\n // re-inserted library finding an id to report against. The element\n // removal and the cookie sweep remain the substance.\n if (!granted) scope._linkedin_data_partner_ids = []\n } catch {\n // Same standing as the others: the teardown does not depend on this.\n }\n },\n}\n\n/**\n * Every vendor this gate knows how to tear down — which is a SUPERSET of the\n * vendors it knows how to load, now that a sweep-only member exists.\n */\nexport const ADVERTISING_VENDORS: readonly AdvertisingVendor[] = [\n META_PIXEL_VENDOR,\n GOOGLE_ADS_VENDOR,\n LINKEDIN_INSIGHT_VENDOR,\n]\n\n/**\n * The host fields this module reads, on top of the consent ones.\n *\n * `adTags` maps a vendor id to that vendor's account id. NO host document\n * carries it today; see the module comment on why deployment is a separate,\n * reviewable data change rather than a consequence of merging this.\n */\nexport interface AdvertisingTagHost extends VisitorConsentHost {\n analytics?: {\n gaMeasurementId?: string\n /** Vendor id → account id. Absent on every site that exists. */\n adTags?: Record<string, string> | null\n } | null\n}\n\n/** A vendor that may load, paired with the id it was configured with. */\nexport interface ResolvedAdvertisingTag {\n readonly vendor: AdvertisingVendor\n readonly accountId: string\n}\n\n/**\n * The whole verdict: which advertising tags may exist in this document, for\n * this visitor, on this site, right now?\n *\n * Pure, and empty is the answer to every question it cannot answer — an absent\n * host, an unreadable record, an unknown vendor id, a malformed account id.\n * See the module comment for the six conditions and why each one is separate.\n *\n * `stored` is the CLIENT-resolved record. Like the GA gate, this is evaluated\n * after hydration only: tenant pages are ISR-cached, so the server HTML must\n * be identical for every visitor and cannot carry a tag one of them granted.\n *\n * `internal` is read the same way and for the same reason. Taking it as a\n * defaulted parameter rather than calling into the browser mid-verdict is what\n * keeps this function testable in both directions — a gate that can only be\n * exercised one way is the shape that ships broken (AGL-2067).\n */\nexport function resolveAdvertisingTags(\n host: AdvertisingTagHost | null | undefined,\n stored: StoredVisitorConsent | null | undefined,\n env: AnalyticsEnvironment = readAnalyticsEnvironment(),\n internal: boolean = readInternalTrafficOverride(),\n): ResolvedAdvertisingTag[] {\n if (isPlatformMarketingHost(host) === false) return []\n if (analyticsMayEmit(env) === false) return []\n if (hostConsentRequired(host) === false) return []\n if (advertisingGrantedByRecord(host, stored) === false) return []\n // Condition 6. Structural, like every other clause here: the tag is not\n // mounted rather than mounted-and-suppressed, because a resident tag fires\n // on its own and a `_gcl_*` cookie is written by the first automatic event.\n //\n // The environment half is not redundant with `analyticsMayEmit` above. That\n // clause passes under the non-production escape hatch, and a build emitting\n // because someone asked it to is ours by definition — so the hatch must not\n // hand a dev or preview build the real `AW-` id and let it build remarketing\n // audiences out of our own engineers, which is the hole condition 2 exists\n // to close. Same reasoning as `INTERNAL_TRAFFIC_FORCED_SNIPPET`.\n if (internal === true) return []\n if (analyticsEnvironmentForcesInternal(env) === true) return []\n const configured = host?.analytics?.adTags\n if (!configured) return []\n const tags: ResolvedAdvertisingTag[] = []\n for (const vendor of ADVERTISING_VENDORS) {\n // Sweep-only: nothing to mount, and no `accountIdPattern` to test with.\n // Skipped explicitly rather than left to fail a pattern check, so a stray\n // `adTags['google-ads']` cannot conjure a script (AGL-2486).\n if (vendor.sweepOnly || !vendor.accountIdPattern) continue\n const accountId = String(configured[vendor.id] ?? '')\n if (vendor.accountIdPattern.test(accountId)) {\n tags.push({ vendor, accountId })\n }\n }\n return tags\n}\n\n/**\n * The script elements THIS MODULE put in the document for a given vendor —\n * both the inline boot and the library, since a vendor mounts as a pair.\n *\n * Scoped by {@link ADVERTISING_TAG_ATTRIBUTE}, which is the clause that keeps\n * a pixel a customer pasted into their own Custom HTML out of our teardown.\n * An element that carries the attribute but whose `src` points somewhere other\n * than this vendor is excluded as well: the attribute is ours to write, so a\n * mismatch means something rewrote it and the safe reading is \"not ours\".\n * An element with NO `src` is the inline boot and passes — it has no URL to\n * disagree with.\n */\nfunction markedVendorElements(vendor: AdvertisingVendor): Element[] {\n if (typeof document === 'undefined') return []\n // A sweep-only vendor has no script of ours and therefore no element that\n // could be \"ours\" (AGL-2486). Returning early is also what stops an absent\n // `scriptMatch` reaching `src.includes(...)` below — an empty string there\n // would have matched EVERY marked script, handing one vendor's teardown\n // another vendor's elements.\n if (vendor.sweepOnly || !vendor.scriptMatch) return []\n try {\n const selector = `script[${ADVERTISING_TAG_ATTRIBUTE}=\"${vendor.id}\"]`\n return Array.from(document.querySelectorAll(selector)).filter((element) => {\n const src = String((element as HTMLScriptElement).src ?? '')\n return src === '' || src.includes(vendor.scriptMatch)\n })\n } catch {\n // A hostile or absent DOM: nothing we can prove is ours.\n return []\n }\n}\n\n/** Every vendor whose tag this module loaded and that is still resident. */\nexport function residentAdvertisingVendors(): AdvertisingVendor[] {\n return ADVERTISING_VENDORS.filter(\n (vendor) => markedVendorElements(vendor).length > 0,\n )\n}\n\n/**\n * Stop every advertising tag THIS MODULE loaded, and return the vendor ids it\n * acted on — which is what makes the withdrawal assertable rather than\n * assumed.\n *\n * Three steps, in this order and for these reasons:\n *\n * 1. **Revoke on the resident tag.** The gate cannot unload a script that has\n * already executed. This is the vendor's own kill switch and it is what\n * actually stops the next automatic event.\n * 2. **Remove the script elements.** So the structural property the gate\n * asserts — the vendor's script is not in this document — is restored and\n * not merely claimed. React unmounting its `<Script>` does not reliably do\n * this: `next/script` injects into the head and leaves it there.\n * 3. **Sweep the cookies.** Last, because steps 1 and 2 are what stop them\n * coming straight back (AGL-1608).\n *\n * Acts only on tags carrying {@link ADVERTISING_TAG_ATTRIBUTE}. On a customer\n * site — where this module never loaded anything — it is a no-op that touches\n * no cookie, which is the only correct behaviour: their pixel, if any, runs on\n * a basis that is not ours to withdraw.\n */\nexport function revokeAdvertisingTags(hostname?: string | null): string[] {\n if (typeof window === 'undefined') return []\n const acted: string[] = []\n const scope = window as unknown as Record<string, unknown>\n for (const vendor of ADVERTISING_VENDORS) {\n /*\n * The element check is an OWNERSHIP test (AGL-1498 case (e)).\n *\n * A pixel we did not load is one running on a basis that is not ours to\n * withdraw — a customer's own Custom HTML, on their own site, under their\n * own notice. Killing it, or clearing its cookies, would be us\n * reconfiguring their site against a consent record their tag never ran\n * on. So no marker of ours means hands off, cookies included.\n *\n * `alwaysSweep` is the narrow exception and it is about the COOKIE, not\n * the loader: `_gcl_*` is written by any Google tag — a GTM container, a\n * bare gtag — with no marker of ours ever existing, which is why it\n * survived every withdrawal until AGL-2486. Giving Google a loader must\n * not quietly take that sweep away again.\n *\n * ORDER, which is the whole of AGL-1608: revoke on the tag FIRST, then\n * remove it, then sweep. Sweeping first deletes the cookies and the\n * resident pixel's next automatic event writes them straight back inside\n * the same pageview.\n */\n const elements = vendor.sweepOnly ? [] : markedVendorElements(vendor)\n const ours = elements.length > 0\n if (ours) {\n vendor.setConsent?.(scope, false)\n for (const element of elements) {\n try {\n element.remove()\n } catch {\n // A detached or frozen node: the revoke above still stands.\n }\n }\n }\n const maySweep = ours || vendor.sweepOnly || vendor.alwaysSweep\n const swept = maySweep\n ? clearCookiesWithPrefixes(vendor.cookiePrefixes, hostname)\n : []\n if (ours || swept.length > 0) acted.push(vendor.id)\n }\n return acted\n}\n\n/**\n * Re-grant on a tag that is still resident — the symmetric half.\n *\n * A visitor who withdraws and changes their mind inside one pageview would\n * otherwise stay silently un-tracked until they navigated, because a re-\n * rendered `<Script>` cannot re-execute a library the browser already ran.\n * `setResidentAnalyticsTags` is symmetric for exactly this reason and this is\n * the same move for a second channel.\n *\n * Returns the vendor ids it reached; empty when nothing is resident, which is\n * the normal case — a re-grant after the elements were removed goes through\n * the gate and loads a fresh tag instead.\n */\nexport function restoreAdvertisingTags(): string[] {\n if (typeof window === 'undefined') return []\n const scope = window as unknown as Record<string, unknown>\n const acted: string[] = []\n for (const vendor of residentAdvertisingVendors()) {\n vendor.setConsent?.(scope, true)\n acted.push(vendor.id)\n }\n return acted\n}\n"],"names":["GOOGLE_ADS_ID_PATTERN","LINKEDIN_PARTNER_ID_PATTERN","META_PIXEL_ID_PATTERN","analyticsEnvironmentForcesInternal","analyticsMayEmit","readAnalyticsEnvironment","readInternalTrafficOverride","isPlatformMarketingHost","ADVERTISING_COOKIE_PREFIXES","advertisingGrantedByRecord","clearCookiesWithPrefixes","hostConsentRequired","ADVERTISING_TAG_ATTRIBUTE","META_PIXEL_VENDOR","id","label","accountIdPattern","scriptSrc","scriptMatch","cookiePrefixes","bootSnippet","accountId","setConsent","scope","granted","fbq","GOOGLE_ADS_VENDOR","alwaysSweep","scriptSrcFor","sharesLibrary","gtag","ad_storage","ad_user_data","ad_personalization","LINKEDIN_INSIGHT_VENDOR","_linkedin_data_partner_ids","ADVERTISING_VENDORS","resolveAdvertisingTags","host","stored","env","internal","configured","analytics","adTags","tags","vendor","sweepOnly","String","test","push","markedVendorElements","document","selector","Array","from","querySelectorAll","filter","element","src","includes","residentAdvertisingVendors","length","revokeAdvertisingTags","hostname","window","acted","elements","ours","remove","maySweep","swept","restoreAdvertisingTags"],"mappings":"AAAA;;;;;;;;;;;;;;;CAeC,GAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2GC,GAED,SACEA,qBAAqB,EACrBC,2BAA2B,EAC3BC,qBAAqB,QAChB,uBAAmB;AAC1B,SACEC,kCAAkC,EAClCC,gBAAgB,EAEhBC,wBAAwB,QACnB,6BAAyB;AAChC,SAASC,2BAA2B,QAAQ,wBAAoB;AAChE,SAASC,uBAAuB,QAAQ,+BAA2B;AACnE,SACEC,2BAA2B,EAC3BC,0BAA0B,EAC1BC,wBAAwB,EACxBC,mBAAmB,QAGd,uBAAmB;AAE1B;;;;;;;;CAQC,GACD,OAAO,MAAMC,4BAA4B,oBAAmB;AA8H5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BC,GACD,OAAO,MAAMC,oBAAuC;IAClDC,IAAI;IACJC,OAAO;IACP,wEAAwE;IACxE,8CAA8C;IAC9CC,kBAAkBd;IAClBe,WAAW;IACXC,aAAa;IACbC,gBAAgB;QAAC;QAAQ;KAAO;IAChCC,aAAa,CAACC,YACZ,yEAAyE;QACzE,0EAA0E;QAC1E,yEAAyE;QACzE,0EAA0E;QAC1E,+DAA+D;QAC/D,8EACA,8DACA,yEACA,uBACA,6BACA,CAAC,aAAa,EAAEA,UAAU,GAAG,CAAC,GAC9B;IACFC,YAAY,CAACC,OAAgCC;QAC3C,IAAI;YACF,MAAMC,MAAMF,MAAME,GAAG;YACrB,IAAI,OAAOA,QAAQ,YAAY;;gBAC3BA,IACA,WACAD,UAAU,UAAU;YAExB;QACF,EAAE,eAAM;QACN,qEAAqE;QACrE,kEAAkE;QACpE;IACF;AACF,EAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BC,GACD,OAAO,MAAME,oBAAuC;IAClDZ,IAAI;IACJC,OAAO;IACP;;;;;;;;;;;;;GAaC,GACDC,kBAAkBhB;IAClB,sEAAsE;IACtE,6DAA6D;IAC7D2B,aAAa;IACbV,WAAW;IACX,2EAA2E;IAC3E,4EAA4E;IAC5E,mEAAmE;IACnEW,cAAc,CAACP,YACb,CAAC,4CAA4C,EAAEA,WAAW;IAC5D,wEAAwE;IACxEQ,eAAe;IACfX,aAAa;IACbC,gBAAgBX;IAChBY,aAAa,CAACC,YACZ;;;;;;;;;;;;;KAaC,GACD;;;;;;;;;;;;;KAaC,GACD,2CACA,gDACA,mDACA,2DACA,4BACA,CAAC,gBAAgB,EAAEA,UAAU,GAAG,CAAC;IACnCC,YAAY,CAACC,OAAgCC;QAC3C,IAAI;YACF,MAAMM,OAAOP,MAAMO,IAAI;YACvB,IAAI,OAAOA,SAAS,YAAY;;gBAC5BA,KAAsC,WAAW,UAAU;oBAC3DC,YAAYP,UAAU,YAAY;oBAClCQ,cAAcR,UAAU,YAAY;oBACpCS,oBAAoBT,UAAU,YAAY;gBAC5C;YACF;QACF,EAAE,eAAM;QACN,qEAAqE;QACrE,kEAAkE;QACpE;IACF;AACF,EAAC;AAED;;;;;;;;;;;;;;;;;;CAkBC,GACD,OAAO,MAAMU,0BAA6C;IACxDpB,IAAI;IACJC,OAAO;IACPC,kBAAkBf;IAClBgB,WAAW;IACXC,aAAa;IACbC,gBAAgB;QACd;QACA;QACA;QACA;QACA;QACA;KACD;IACDC,aAAa,CAACC,YACZ,sEAAsE;QACtE,oEAAoE;QACpE,4BAA4B;QAC5B,CAAC,6BAA6B,EAAEA,UAAU,EAAE,CAAC,GAC7C,6EACA;IACFC,YAAY,CAACC,OAAgCC;QAC3C,IAAI;YACF,kEAAkE;YAClE,kEAAkE;YAClE,mEAAmE;YACnE,qDAAqD;YACrD,IAAI,CAACA,SAASD,MAAMY,0BAA0B,GAAG,EAAE;QACrD,EAAE,eAAM;QACN,qEAAqE;QACvE;IACF;AACF,EAAC;AAED;;;CAGC,GACD,OAAO,MAAMC,sBAAoD;IAC/DvB;IACAa;IACAQ;CACD,CAAA;AAuBD;;;;;;;;;;;;;;;;CAgBC,GACD,OAAO,SAASG,uBACdC,IAA2C,EAC3CC,MAA+C,EAC/CC,MAA4BnC,0BAA0B,EACtDoC,WAAoBnC,6BAA6B;QAkB9BgC;IAhBnB,IAAI/B,wBAAwB+B,UAAU,OAAO,OAAO,EAAE;IACtD,IAAIlC,iBAAiBoC,SAAS,OAAO,OAAO,EAAE;IAC9C,IAAI7B,oBAAoB2B,UAAU,OAAO,OAAO,EAAE;IAClD,IAAI7B,2BAA2B6B,MAAMC,YAAY,OAAO,OAAO,EAAE;IACjE,wEAAwE;IACxE,2EAA2E;IAC3E,4EAA4E;IAC5E,EAAE;IACF,4EAA4E;IAC5E,4EAA4E;IAC5E,4EAA4E;IAC5E,6EAA6E;IAC7E,2EAA2E;IAC3E,iEAAiE;IACjE,IAAIE,aAAa,MAAM,OAAO,EAAE;IAChC,IAAItC,mCAAmCqC,SAAS,MAAM,OAAO,EAAE;IAC/D,MAAME,aAAaJ,yBAAAA,kBAAAA,KAAMK,SAAS,qBAAfL,gBAAiBM,MAAM;IAC1C,IAAI,CAACF,YAAY,OAAO,EAAE;IAC1B,MAAMG,OAAiC,EAAE;IACzC,KAAK,MAAMC,UAAUV,oBAAqB;YAKfM;QAJzB,wEAAwE;QACxE,0EAA0E;QAC1E,6DAA6D;QAC7D,IAAII,OAAOC,SAAS,IAAI,CAACD,OAAO9B,gBAAgB,EAAE;QAClD,MAAMK,YAAY2B,QAAON,wBAAAA,UAAU,CAACI,OAAOhC,EAAE,CAAC,YAArB4B,wBAAyB;QAClD,IAAII,OAAO9B,gBAAgB,CAACiC,IAAI,CAAC5B,YAAY;YAC3CwB,KAAKK,IAAI,CAAC;gBAAEJ;gBAAQzB;YAAU;QAChC;IACF;IACA,OAAOwB;AACT;AAEA;;;;;;;;;;;CAWC,GACD,SAASM,qBAAqBL,MAAyB;IACrD,IAAI,OAAOM,aAAa,aAAa,OAAO,EAAE;IAC9C,0EAA0E;IAC1E,2EAA2E;IAC3E,2EAA2E;IAC3E,wEAAwE;IACxE,6BAA6B;IAC7B,IAAIN,OAAOC,SAAS,IAAI,CAACD,OAAO5B,WAAW,EAAE,OAAO,EAAE;IACtD,IAAI;QACF,MAAMmC,WAAW,CAAC,OAAO,EAAEzC,0BAA0B,EAAE,EAAEkC,OAAOhC,EAAE,CAAC,EAAE,CAAC;QACtE,OAAOwC,MAAMC,IAAI,CAACH,SAASI,gBAAgB,CAACH,WAAWI,MAAM,CAAC,CAACC;gBAC1C;YAAnB,MAAMC,MAAMX,QAAO,eAAA,AAACU,QAA8BC,GAAG,YAAlC,eAAsC;YACzD,OAAOA,QAAQ,MAAMA,IAAIC,QAAQ,CAACd,OAAO5B,WAAW;QACtD;IACF,EAAE,eAAM;QACN,yDAAyD;QACzD,OAAO,EAAE;IACX;AACF;AAEA,0EAA0E,GAC1E,OAAO,SAAS2C;IACd,OAAOzB,oBAAoBqB,MAAM,CAC/B,CAACX,SAAWK,qBAAqBL,QAAQgB,MAAM,GAAG;AAEtD;AAEA;;;;;;;;;;;;;;;;;;;;;CAqBC,GACD,OAAO,SAASC,sBAAsBC,QAAwB;IAC5D,IAAI,OAAOC,WAAW,aAAa,OAAO,EAAE;IAC5C,MAAMC,QAAkB,EAAE;IAC1B,MAAM3C,QAAQ0C;IACd,KAAK,MAAMnB,UAAUV,oBAAqB;QACxC;;;;;;;;;;;;;;;;;;;KAmBC,GACD,MAAM+B,WAAWrB,OAAOC,SAAS,GAAG,EAAE,GAAGI,qBAAqBL;QAC9D,MAAMsB,OAAOD,SAASL,MAAM,GAAG;QAC/B,IAAIM,MAAM;YACRtB,OAAOxB,UAAU,oBAAjBwB,OAAOxB,UAAU,MAAjBwB,QAAoBvB,OAAO;YAC3B,KAAK,MAAMmC,WAAWS,SAAU;gBAC9B,IAAI;oBACFT,QAAQW,MAAM;gBAChB,EAAE,eAAM;gBACN,4DAA4D;gBAC9D;YACF;QACF;QACA,MAAMC,WAAWF,QAAQtB,OAAOC,SAAS,IAAID,OAAOnB,WAAW;QAC/D,MAAM4C,QAAQD,WACV5D,yBAAyBoC,OAAO3B,cAAc,EAAE6C,YAChD,EAAE;QACN,IAAII,QAAQG,MAAMT,MAAM,GAAG,GAAGI,MAAMhB,IAAI,CAACJ,OAAOhC,EAAE;IACpD;IACA,OAAOoD;AACT;AAEA;;;;;;;;;;;;CAYC,GACD,OAAO,SAASM;IACd,IAAI,OAAOP,WAAW,aAAa,OAAO,EAAE;IAC5C,MAAM1C,QAAQ0C;IACd,MAAMC,QAAkB,EAAE;IAC1B,KAAK,MAAMpB,UAAUe,6BAA8B;QACjDf,OAAOxB,UAAU,oBAAjBwB,OAAOxB,UAAU,MAAjBwB,QAAoBvB,OAAO;QAC3B2C,MAAMhB,IAAI,CAACJ,OAAOhC,EAAE;IACtB;IACA,OAAOoD;AACT"}
|