@sixb/core 0.0.1
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 +21 -0
- package/README.md +470 -0
- package/dist/actions/builders/define-action.d.ts +7 -0
- package/dist/actions/builders/define-action.d.ts.map +1 -0
- package/dist/actions/builders/params.d.ts +23 -0
- package/dist/actions/builders/params.d.ts.map +1 -0
- package/dist/actions/builders.d.ts +3 -0
- package/dist/actions/builders.d.ts.map +1 -0
- package/dist/actions/commit-edits.d.ts +54 -0
- package/dist/actions/commit-edits.d.ts.map +1 -0
- package/dist/actions/errors.d.ts +9 -0
- package/dist/actions/errors.d.ts.map +1 -0
- package/dist/actions/index.d.ts +14 -0
- package/dist/actions/index.d.ts.map +1 -0
- package/dist/actions/index.js +73 -0
- package/dist/actions/index.js.map +9 -0
- package/dist/actions/read-facade.d.ts +56 -0
- package/dist/actions/read-facade.d.ts.map +1 -0
- package/dist/actions/registry.d.ts +17 -0
- package/dist/actions/registry.d.ts.map +1 -0
- package/dist/actions/request.d.ts +37 -0
- package/dist/actions/request.d.ts.map +1 -0
- package/dist/actions/run-id.d.ts +3 -0
- package/dist/actions/run-id.d.ts.map +1 -0
- package/dist/actions/runtime.d.ts +11 -0
- package/dist/actions/runtime.d.ts.map +1 -0
- package/dist/actions/types/context.d.ts +147 -0
- package/dist/actions/types/context.d.ts.map +1 -0
- package/dist/actions/types/definitions.d.ts +67 -0
- package/dist/actions/types/definitions.d.ts.map +1 -0
- package/dist/actions/types/handlers.d.ts +19 -0
- package/dist/actions/types/handlers.d.ts.map +1 -0
- package/dist/actions/types/params.d.ts +45 -0
- package/dist/actions/types/params.d.ts.map +1 -0
- package/dist/actions/types.d.ts +5 -0
- package/dist/actions/types.d.ts.map +1 -0
- package/dist/actions/validation.d.ts +33 -0
- package/dist/actions/validation.d.ts.map +1 -0
- package/dist/actions/validators.d.ts +8 -0
- package/dist/actions/validators.d.ts.map +1 -0
- package/dist/actions/worker.d.ts +3 -0
- package/dist/actions/worker.d.ts.map +1 -0
- package/dist/actions/worker.js +324 -0
- package/dist/actions/worker.js.map +11 -0
- package/dist/agents/adapters.d.ts +185 -0
- package/dist/agents/adapters.d.ts.map +1 -0
- package/dist/agents/api-gateway.d.ts +21 -0
- package/dist/agents/api-gateway.d.ts.map +1 -0
- package/dist/agents/builders.d.ts +10 -0
- package/dist/agents/builders.d.ts.map +1 -0
- package/dist/agents/context-model.d.ts +4 -0
- package/dist/agents/context-model.d.ts.map +1 -0
- package/dist/agents/context-resolution.d.ts +5 -0
- package/dist/agents/context-resolution.d.ts.map +1 -0
- package/dist/agents/context.d.ts +57 -0
- package/dist/agents/context.d.ts.map +1 -0
- package/dist/agents/context.js +23 -0
- package/dist/agents/context.js.map +9 -0
- package/dist/agents/dispatch.d.ts +36 -0
- package/dist/agents/dispatch.d.ts.map +1 -0
- package/dist/agents/errors.d.ts +27 -0
- package/dist/agents/errors.d.ts.map +1 -0
- package/dist/agents/ids.d.ts +11 -0
- package/dist/agents/ids.d.ts.map +1 -0
- package/dist/agents/index.d.ts +24 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +121 -0
- package/dist/agents/index.js.map +9 -0
- package/dist/agents/message.d.ts +78 -0
- package/dist/agents/message.d.ts.map +1 -0
- package/dist/agents/prompt.d.ts +15 -0
- package/dist/agents/prompt.d.ts.map +1 -0
- package/dist/agents/request.d.ts +42 -0
- package/dist/agents/request.d.ts.map +1 -0
- package/dist/agents/runtime.d.ts +41 -0
- package/dist/agents/runtime.d.ts.map +1 -0
- package/dist/agents/streams.d.ts +72 -0
- package/dist/agents/streams.d.ts.map +1 -0
- package/dist/agents/streams.js +32 -0
- package/dist/agents/streams.js.map +9 -0
- package/dist/agents/types.d.ts +52 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/validation.d.ts +10 -0
- package/dist/agents/validation.d.ts.map +1 -0
- package/dist/auth/access-tokens.d.ts +19 -0
- package/dist/auth/access-tokens.d.ts.map +1 -0
- package/dist/auth/audience.d.ts +8 -0
- package/dist/auth/audience.d.ts.map +1 -0
- package/dist/auth/cookies.d.ts +50 -0
- package/dist/auth/cookies.d.ts.map +1 -0
- package/dist/auth/csrf.d.ts +8 -0
- package/dist/auth/csrf.d.ts.map +1 -0
- package/dist/auth/errors.d.ts +7 -0
- package/dist/auth/errors.d.ts.map +1 -0
- package/dist/auth/index.d.ts +15 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +101 -0
- package/dist/auth/index.js.map +9 -0
- package/dist/auth/runtime.d.ts +129 -0
- package/dist/auth/runtime.d.ts.map +1 -0
- package/dist/auth/session-cache.d.ts +44 -0
- package/dist/auth/session-cache.d.ts.map +1 -0
- package/dist/auth/sessions.d.ts +16 -0
- package/dist/auth/sessions.d.ts.map +1 -0
- package/dist/auth/strategy.d.ts +11 -0
- package/dist/auth/strategy.d.ts.map +1 -0
- package/dist/auth/strategy.js +14 -0
- package/dist/auth/strategy.js.map +9 -0
- package/dist/auth/types.d.ts +460 -0
- package/dist/auth/types.d.ts.map +1 -0
- package/dist/auth/validation.d.ts +26 -0
- package/dist/auth/validation.d.ts.map +1 -0
- package/dist/authorization/application-access.d.ts +18 -0
- package/dist/authorization/application-access.d.ts.map +1 -0
- package/dist/authorization/decision.d.ts +104 -0
- package/dist/authorization/decision.d.ts.map +1 -0
- package/dist/authorization/errors.d.ts +10 -0
- package/dist/authorization/errors.d.ts.map +1 -0
- package/dist/authorization/event-visibility.d.ts +16 -0
- package/dist/authorization/event-visibility.d.ts.map +1 -0
- package/dist/authorization/grant-kinds.d.ts +48 -0
- package/dist/authorization/grant-kinds.d.ts.map +1 -0
- package/dist/authorization/index.d.ts +11 -0
- package/dist/authorization/index.d.ts.map +1 -0
- package/dist/authorization/index.js +48 -0
- package/dist/authorization/index.js.map +9 -0
- package/dist/authorization/resolve.d.ts +28 -0
- package/dist/authorization/resolve.d.ts.map +1 -0
- package/dist/authorization/run-visibility.d.ts +15 -0
- package/dist/authorization/run-visibility.d.ts.map +1 -0
- package/dist/authorization/types.d.ts +46 -0
- package/dist/authorization/types.d.ts.map +1 -0
- package/dist/blob-storage/browser.d.ts +14 -0
- package/dist/blob-storage/browser.d.ts.map +1 -0
- package/dist/blob-storage/browser.js +22 -0
- package/dist/blob-storage/browser.js.map +9 -0
- package/dist/blob-storage/constants.d.ts +10 -0
- package/dist/blob-storage/constants.d.ts.map +1 -0
- package/dist/blob-storage/derive.d.ts +4 -0
- package/dist/blob-storage/derive.d.ts.map +1 -0
- package/dist/blob-storage/errors.d.ts +7 -0
- package/dist/blob-storage/errors.d.ts.map +1 -0
- package/dist/blob-storage/in-memory.d.ts +10 -0
- package/dist/blob-storage/in-memory.d.ts.map +1 -0
- package/dist/blob-storage/index.d.ts +8 -0
- package/dist/blob-storage/index.d.ts.map +1 -0
- package/dist/blob-storage/index.js +44 -0
- package/dist/blob-storage/index.js.map +9 -0
- package/dist/blob-storage/types.d.ts +126 -0
- package/dist/blob-storage/types.d.ts.map +1 -0
- package/dist/blob-storage/utils.d.ts +9 -0
- package/dist/blob-storage/utils.d.ts.map +1 -0
- package/dist/blob-storage/validation.d.ts +6 -0
- package/dist/blob-storage/validation.d.ts.map +1 -0
- package/dist/bootstrap/discovery.d.ts +34 -0
- package/dist/bootstrap/discovery.d.ts.map +1 -0
- package/dist/bootstrap/index.d.ts +4 -0
- package/dist/bootstrap/index.d.ts.map +1 -0
- package/dist/bootstrap/index.js +80 -0
- package/dist/bootstrap/index.js.map +9 -0
- package/dist/bootstrap/ontology-type-manifest.d.ts +22 -0
- package/dist/bootstrap/ontology-type-manifest.d.ts.map +1 -0
- package/dist/broker/errors.d.ts +12 -0
- package/dist/broker/errors.d.ts.map +1 -0
- package/dist/broker/in-memory.d.ts +53 -0
- package/dist/broker/in-memory.d.ts.map +1 -0
- package/dist/broker/index.d.ts +5 -0
- package/dist/broker/index.d.ts.map +1 -0
- package/dist/broker/index.js +15 -0
- package/dist/broker/index.js.map +9 -0
- package/dist/broker/types.d.ts +119 -0
- package/dist/broker/types.d.ts.map +1 -0
- package/dist/chunk-04b07a9q.js +89 -0
- package/dist/chunk-04b07a9q.js.map +10 -0
- package/dist/chunk-0fygrz37.js +354 -0
- package/dist/chunk-0fygrz37.js.map +17 -0
- package/dist/chunk-0psb6kdw.js +989 -0
- package/dist/chunk-0psb6kdw.js.map +15 -0
- package/dist/chunk-1evzqhks.js +76 -0
- package/dist/chunk-1evzqhks.js.map +10 -0
- package/dist/chunk-1vffvydj.js +109 -0
- package/dist/chunk-1vffvydj.js.map +10 -0
- package/dist/chunk-2ab72m2h.js +59 -0
- package/dist/chunk-2ab72m2h.js.map +10 -0
- package/dist/chunk-2gpr6jsz.js +1968 -0
- package/dist/chunk-2gpr6jsz.js.map +13 -0
- package/dist/chunk-2s6sydsh.js +368 -0
- package/dist/chunk-2s6sydsh.js.map +12 -0
- package/dist/chunk-45tw90k7.js +72 -0
- package/dist/chunk-45tw90k7.js.map +11 -0
- package/dist/chunk-4pycxcj3.js +35 -0
- package/dist/chunk-4pycxcj3.js.map +11 -0
- package/dist/chunk-50kv63vj.js +523 -0
- package/dist/chunk-50kv63vj.js.map +12 -0
- package/dist/chunk-51fjndv0.js +17 -0
- package/dist/chunk-51fjndv0.js.map +11 -0
- package/dist/chunk-590dejbp.js +49 -0
- package/dist/chunk-590dejbp.js.map +10 -0
- package/dist/chunk-5yny9z0e.js +60 -0
- package/dist/chunk-5yny9z0e.js.map +10 -0
- package/dist/chunk-6wetht33.js +89 -0
- package/dist/chunk-6wetht33.js.map +10 -0
- package/dist/chunk-74drx9gd.js +362 -0
- package/dist/chunk-74drx9gd.js.map +11 -0
- package/dist/chunk-867jxh7c.js +1156 -0
- package/dist/chunk-867jxh7c.js.map +19 -0
- package/dist/chunk-88ppkr54.js +257 -0
- package/dist/chunk-88ppkr54.js.map +12 -0
- package/dist/chunk-8r8cw2xw.js +373 -0
- package/dist/chunk-8r8cw2xw.js.map +11 -0
- package/dist/chunk-8ydjhh27.js +95 -0
- package/dist/chunk-8ydjhh27.js.map +11 -0
- package/dist/chunk-9dzba0f2.js +43 -0
- package/dist/chunk-9dzba0f2.js.map +10 -0
- package/dist/chunk-aebzcsxr.js +5272 -0
- package/dist/chunk-aebzcsxr.js.map +48 -0
- package/dist/chunk-b49dgvsj.js +49 -0
- package/dist/chunk-b49dgvsj.js.map +10 -0
- package/dist/chunk-btpe64e4.js +554 -0
- package/dist/chunk-btpe64e4.js.map +13 -0
- package/dist/chunk-c3zd880g.js +629 -0
- package/dist/chunk-c3zd880g.js.map +14 -0
- package/dist/chunk-dcgrzj1t.js +2954 -0
- package/dist/chunk-dcgrzj1t.js.map +36 -0
- package/dist/chunk-dhmj53mx.js +501 -0
- package/dist/chunk-dhmj53mx.js.map +16 -0
- package/dist/chunk-dktq02ne.js +16 -0
- package/dist/chunk-dktq02ne.js.map +10 -0
- package/dist/chunk-f2b5e2gf.js +141 -0
- package/dist/chunk-f2b5e2gf.js.map +11 -0
- package/dist/chunk-gqdd7508.js +273 -0
- package/dist/chunk-gqdd7508.js.map +11 -0
- package/dist/chunk-hsv43v58.js +1390 -0
- package/dist/chunk-hsv43v58.js.map +21 -0
- package/dist/chunk-jdwx7vzs.js +454 -0
- package/dist/chunk-jdwx7vzs.js.map +14 -0
- package/dist/chunk-k25jm1x5.js +102 -0
- package/dist/chunk-k25jm1x5.js.map +10 -0
- package/dist/chunk-k41ajtz7.js +352 -0
- package/dist/chunk-k41ajtz7.js.map +13 -0
- package/dist/chunk-k6j72mtt.js +9 -0
- package/dist/chunk-k6j72mtt.js.map +10 -0
- package/dist/chunk-mx84y05q.js +426 -0
- package/dist/chunk-mx84y05q.js.map +11 -0
- package/dist/chunk-nvamz5dv.js +819 -0
- package/dist/chunk-nvamz5dv.js.map +21 -0
- package/dist/chunk-p6r5g77m.js +113 -0
- package/dist/chunk-p6r5g77m.js.map +10 -0
- package/dist/chunk-pv1yad91.js +1165 -0
- package/dist/chunk-pv1yad91.js.map +27 -0
- package/dist/chunk-q4qzq0ea.js +832 -0
- package/dist/chunk-q4qzq0ea.js.map +14 -0
- package/dist/chunk-r65yscvk.js +187 -0
- package/dist/chunk-r65yscvk.js.map +11 -0
- package/dist/chunk-ry24jbr1.js +50 -0
- package/dist/chunk-ry24jbr1.js.map +10 -0
- package/dist/chunk-t358gywy.js +991 -0
- package/dist/chunk-t358gywy.js.map +34 -0
- package/dist/chunk-t72dvahb.js +167 -0
- package/dist/chunk-t72dvahb.js.map +12 -0
- package/dist/chunk-tsk2bxs3.js +1254 -0
- package/dist/chunk-tsk2bxs3.js.map +17 -0
- package/dist/chunk-v5c085yp.js +49 -0
- package/dist/chunk-v5c085yp.js.map +10 -0
- package/dist/chunk-vj723r3p.js +146 -0
- package/dist/chunk-vj723r3p.js.map +12 -0
- package/dist/chunk-wj01s5hr.js +363 -0
- package/dist/chunk-wj01s5hr.js.map +11 -0
- package/dist/chunk-wxhdnwh4.js +37 -0
- package/dist/chunk-wxhdnwh4.js.map +10 -0
- package/dist/chunk-xqbtf4wn.js +170 -0
- package/dist/chunk-xqbtf4wn.js.map +10 -0
- package/dist/chunk-xwnf87e1.js +324 -0
- package/dist/chunk-xwnf87e1.js.map +13 -0
- package/dist/chunk-xz5g49bp.js +239 -0
- package/dist/chunk-xz5g49bp.js.map +11 -0
- package/dist/chunk-y64skrwp.js +19 -0
- package/dist/chunk-y64skrwp.js.map +9 -0
- package/dist/chunk-ya6brh8a.js +136 -0
- package/dist/chunk-ya6brh8a.js.map +11 -0
- package/dist/chunk-yt8wphsx.js +12 -0
- package/dist/chunk-yt8wphsx.js.map +10 -0
- package/dist/chunk-yvef9xwc.js +3842 -0
- package/dist/chunk-yvef9xwc.js.map +44 -0
- package/dist/chunk-yxss87qa.js +821 -0
- package/dist/chunk-yxss87qa.js.map +14 -0
- package/dist/connectors/builders.d.ts +10 -0
- package/dist/connectors/builders.d.ts.map +1 -0
- package/dist/connectors/errors.d.ts +14 -0
- package/dist/connectors/errors.d.ts.map +1 -0
- package/dist/connectors/index.d.ts +5 -0
- package/dist/connectors/index.d.ts.map +1 -0
- package/dist/connectors/runtime.d.ts +13 -0
- package/dist/connectors/runtime.d.ts.map +1 -0
- package/dist/connectors/types.d.ts +39 -0
- package/dist/connectors/types.d.ts.map +1 -0
- package/dist/datasets/builders.d.ts +54 -0
- package/dist/datasets/builders.d.ts.map +1 -0
- package/dist/datasets/errors.d.ts +4 -0
- package/dist/datasets/errors.d.ts.map +1 -0
- package/dist/datasets/index.d.ts +5 -0
- package/dist/datasets/index.d.ts.map +1 -0
- package/dist/datasets/types.d.ts +23 -0
- package/dist/datasets/types.d.ts.map +1 -0
- package/dist/datasets/validation.d.ts +8 -0
- package/dist/datasets/validation.d.ts.map +1 -0
- package/dist/edits/errors.d.ts +4 -0
- package/dist/edits/errors.d.ts.map +1 -0
- package/dist/edits/index.d.ts +4 -0
- package/dist/edits/index.d.ts.map +1 -0
- package/dist/edits/index.js +14 -0
- package/dist/edits/index.js.map +9 -0
- package/dist/edits/normalize.d.ts +14 -0
- package/dist/edits/normalize.d.ts.map +1 -0
- package/dist/edits/properties.d.ts +25 -0
- package/dist/edits/properties.d.ts.map +1 -0
- package/dist/edits/recorder.d.ts +4 -0
- package/dist/edits/recorder.d.ts.map +1 -0
- package/dist/edits/types.d.ts +159 -0
- package/dist/edits/types.d.ts.map +1 -0
- package/dist/error-reporting/capability.d.ts +57 -0
- package/dist/error-reporting/capability.d.ts.map +1 -0
- package/dist/error-reporting/internal.d.ts +4 -0
- package/dist/error-reporting/internal.d.ts.map +1 -0
- package/dist/error-reporting/internal.js +24 -0
- package/dist/error-reporting/internal.js.map +9 -0
- package/dist/error-reporting/normalize.d.ts +3 -0
- package/dist/error-reporting/normalize.d.ts.map +1 -0
- package/dist/error-reporting/reporter.d.ts +10 -0
- package/dist/error-reporting/reporter.d.ts.map +1 -0
- package/dist/error-reporting/types.d.ts +112 -0
- package/dist/error-reporting/types.d.ts.map +1 -0
- package/dist/events/definitions.d.ts +76 -0
- package/dist/events/definitions.d.ts.map +1 -0
- package/dist/events/envelope.d.ts +56 -0
- package/dist/events/envelope.d.ts.map +1 -0
- package/dist/events/errors.d.ts +8 -0
- package/dist/events/errors.d.ts.map +1 -0
- package/dist/events/index.d.ts +11 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +68 -0
- package/dist/events/index.js.map +9 -0
- package/dist/events/outbox-dispatcher.d.ts +82 -0
- package/dist/events/outbox-dispatcher.d.ts.map +1 -0
- package/dist/events/property-changes.d.ts +16 -0
- package/dist/events/property-changes.d.ts.map +1 -0
- package/dist/events/runtime.d.ts +87 -0
- package/dist/events/runtime.d.ts.map +1 -0
- package/dist/events/scope.d.ts +25 -0
- package/dist/events/scope.d.ts.map +1 -0
- package/dist/events/scope.js +10 -0
- package/dist/events/scope.js.map +9 -0
- package/dist/events/selectors/builder.d.ts +64 -0
- package/dist/events/selectors/builder.d.ts.map +1 -0
- package/dist/events/selectors/index.d.ts +5 -0
- package/dist/events/selectors/index.d.ts.map +1 -0
- package/dist/events/selectors/index.js +15 -0
- package/dist/events/selectors/index.js.map +9 -0
- package/dist/events/selectors/predicate.d.ts +5 -0
- package/dist/events/selectors/predicate.d.ts.map +1 -0
- package/dist/events/selectors/types.d.ts +141 -0
- package/dist/events/selectors/types.d.ts.map +1 -0
- package/dist/events/toStoredEvent.d.ts +10 -0
- package/dist/events/toStoredEvent.d.ts.map +1 -0
- package/dist/events/types/actions.d.ts +39 -0
- package/dist/events/types/actions.d.ts.map +1 -0
- package/dist/events/types/datasets.d.ts +20 -0
- package/dist/events/types/datasets.d.ts.map +1 -0
- package/dist/events/types/index.d.ts +137 -0
- package/dist/events/types/index.d.ts.map +1 -0
- package/dist/events/types/links.d.ts +37 -0
- package/dist/events/types/links.d.ts.map +1 -0
- package/dist/events/types/objects.d.ts +33 -0
- package/dist/events/types/objects.d.ts.map +1 -0
- package/dist/events/types/pipelines.d.ts +59 -0
- package/dist/events/types/pipelines.d.ts.map +1 -0
- package/dist/events/types/rules.d.ts +28 -0
- package/dist/events/types/rules.d.ts.map +1 -0
- package/dist/events/types/schedules.d.ts +14 -0
- package/dist/events/types/schedules.d.ts.map +1 -0
- package/dist/events/types/syncs.d.ts +25 -0
- package/dist/events/types/syncs.d.ts.map +1 -0
- package/dist/events/types/telemetry.d.ts +17 -0
- package/dist/events/types/telemetry.d.ts.map +1 -0
- package/dist/events/types/workflows.d.ts +150 -0
- package/dist/events/types/workflows.d.ts.map +1 -0
- package/dist/http/api-routes.d.ts +24 -0
- package/dist/http/api-routes.d.ts.map +1 -0
- package/dist/http/index.d.ts +4 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +16 -0
- package/dist/http/index.js.map +9 -0
- package/dist/http/route-pattern.d.ts +14 -0
- package/dist/http/route-pattern.d.ts.map +1 -0
- package/dist/index.d.ts +70 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +430 -0
- package/dist/index.js.map +9 -0
- package/dist/json.d.ts +14 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/lake-storage/definition-updates.d.ts +40 -0
- package/dist/lake-storage/definition-updates.d.ts.map +1 -0
- package/dist/lake-storage/errors.d.ts +7 -0
- package/dist/lake-storage/errors.d.ts.map +1 -0
- package/dist/lake-storage/in-memory.d.ts +25 -0
- package/dist/lake-storage/in-memory.d.ts.map +1 -0
- package/dist/lake-storage/index.d.ts +9 -0
- package/dist/lake-storage/index.d.ts.map +1 -0
- package/dist/lake-storage/index.js +24 -0
- package/dist/lake-storage/index.js.map +9 -0
- package/dist/lake-storage/sql-transforms.d.ts +45 -0
- package/dist/lake-storage/sql-transforms.d.ts.map +1 -0
- package/dist/lake-storage/types.d.ts +114 -0
- package/dist/lake-storage/types.d.ts.map +1 -0
- package/dist/logging/console-logger.d.ts +17 -0
- package/dist/logging/console-logger.d.ts.map +1 -0
- package/dist/logging/index.d.ts +5 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +45 -0
- package/dist/logging/index.js.map +9 -0
- package/dist/logging/record.d.ts +10 -0
- package/dist/logging/record.d.ts.map +1 -0
- package/dist/logging/run-logger.d.ts +61 -0
- package/dist/logging/run-logger.d.ts.map +1 -0
- package/dist/logging/runtime.d.ts +87 -0
- package/dist/logging/runtime.d.ts.map +1 -0
- package/dist/logging/stream.d.ts +24 -0
- package/dist/logging/stream.d.ts.map +1 -0
- package/dist/logging/types.d.ts +82 -0
- package/dist/logging/types.d.ts.map +1 -0
- package/dist/logging/types.js +27 -0
- package/dist/logging/types.js.map +9 -0
- package/dist/maintenance/index.d.ts +3 -0
- package/dist/maintenance/index.d.ts.map +1 -0
- package/dist/maintenance/ontology-maintenance.d.ts +48 -0
- package/dist/maintenance/ontology-maintenance.d.ts.map +1 -0
- package/dist/maintenance/types.d.ts +53 -0
- package/dist/maintenance/types.d.ts.map +1 -0
- package/dist/materialization/dataset-watermark.d.ts +5 -0
- package/dist/materialization/dataset-watermark.d.ts.map +1 -0
- package/dist/materialization/errors.d.ts +37 -0
- package/dist/materialization/errors.d.ts.map +1 -0
- package/dist/materialization/events.d.ts +57 -0
- package/dist/materialization/events.d.ts.map +1 -0
- package/dist/materialization/identity.d.ts +8 -0
- package/dist/materialization/identity.d.ts.map +1 -0
- package/dist/materialization/index.d.ts +13 -0
- package/dist/materialization/index.d.ts.map +1 -0
- package/dist/materialization/index.js +56 -0
- package/dist/materialization/index.js.map +9 -0
- package/dist/materialization/model.d.ts +342 -0
- package/dist/materialization/model.d.ts.map +1 -0
- package/dist/materialization/refs.d.ts +24 -0
- package/dist/materialization/refs.d.ts.map +1 -0
- package/dist/materializer/context.d.ts +34 -0
- package/dist/materializer/context.d.ts.map +1 -0
- package/dist/materializer/edits/apply.d.ts +35 -0
- package/dist/materializer/edits/apply.d.ts.map +1 -0
- package/dist/materializer/edits/commit.d.ts +4 -0
- package/dist/materializer/edits/commit.d.ts.map +1 -0
- package/dist/materializer/edits/execution-units.d.ts +14 -0
- package/dist/materializer/edits/execution-units.d.ts.map +1 -0
- package/dist/materializer/edits/load-state.d.ts +6 -0
- package/dist/materializer/edits/load-state.d.ts.map +1 -0
- package/dist/materializer/edits/operations.d.ts +32 -0
- package/dist/materializer/edits/operations.d.ts.map +1 -0
- package/dist/materializer/edits/plan.d.ts +18 -0
- package/dist/materializer/edits/plan.d.ts.map +1 -0
- package/dist/materializer/edits/read-set.d.ts +8 -0
- package/dist/materializer/edits/read-set.d.ts.map +1 -0
- package/dist/materializer/edits/working-state.d.ts +30 -0
- package/dist/materializer/edits/working-state.d.ts.map +1 -0
- package/dist/materializer/effective/build-events.d.ts +26 -0
- package/dist/materializer/effective/build-events.d.ts.map +1 -0
- package/dist/materializer/effective/diff.d.ts +15 -0
- package/dist/materializer/effective/diff.d.ts.map +1 -0
- package/dist/materializer/effective/load-state.d.ts +7 -0
- package/dist/materializer/effective/load-state.d.ts.map +1 -0
- package/dist/materializer/effective/resolve.d.ts +26 -0
- package/dist/materializer/effective/resolve.d.ts.map +1 -0
- package/dist/materializer/effective/validate.d.ts +11 -0
- package/dist/materializer/effective/validate.d.ts.map +1 -0
- package/dist/materializer/execution/commit-lifecycle.d.ts +8 -0
- package/dist/materializer/execution/commit-lifecycle.d.ts.map +1 -0
- package/dist/materializer/execution/plan-stream.d.ts +8 -0
- package/dist/materializer/execution/plan-stream.d.ts.map +1 -0
- package/dist/materializer/execution/run-correlation.d.ts +19 -0
- package/dist/materializer/execution/run-correlation.d.ts.map +1 -0
- package/dist/materializer/execution/work-executor.d.ts +13 -0
- package/dist/materializer/execution/work-executor.d.ts.map +1 -0
- package/dist/materializer/execution/work-records.d.ts +15 -0
- package/dist/materializer/execution/work-records.d.ts.map +1 -0
- package/dist/materializer/index.d.ts +15 -0
- package/dist/materializer/index.d.ts.map +1 -0
- package/dist/materializer/index.js +134 -0
- package/dist/materializer/index.js.map +9 -0
- package/dist/materializer/materializer.d.ts +27 -0
- package/dist/materializer/materializer.d.ts.map +1 -0
- package/dist/materializer/projections/entry-validator.d.ts +8 -0
- package/dist/materializer/projections/entry-validator.d.ts.map +1 -0
- package/dist/materializer/projections/finish-run.d.ts +4 -0
- package/dist/materializer/projections/finish-run.d.ts.map +1 -0
- package/dist/materializer/projections/replace.d.ts +4 -0
- package/dist/materializer/projections/replace.d.ts.map +1 -0
- package/dist/materializer/projections/replacement-plan.d.ts +14 -0
- package/dist/materializer/projections/replacement-plan.d.ts.map +1 -0
- package/dist/materializer/projections/source-materialization.d.ts +27 -0
- package/dist/materializer/projections/source-materialization.d.ts.map +1 -0
- package/dist/materializer/shared/abort.d.ts +2 -0
- package/dist/materializer/shared/abort.d.ts.map +1 -0
- package/dist/materializer/shared/batching.d.ts +11 -0
- package/dist/materializer/shared/batching.d.ts.map +1 -0
- package/dist/materializer/shared/chunking.d.ts +6 -0
- package/dist/materializer/shared/chunking.d.ts.map +1 -0
- package/dist/materializer/shared/identity.d.ts +38 -0
- package/dist/materializer/shared/identity.d.ts.map +1 -0
- package/dist/materializer/shared/normalize.d.ts +10 -0
- package/dist/materializer/shared/normalize.d.ts.map +1 -0
- package/dist/materializer/shared/projection-run.d.ts +19 -0
- package/dist/materializer/shared/projection-run.d.ts.map +1 -0
- package/dist/materializer/telemetry/append.d.ts +4 -0
- package/dist/materializer/telemetry/append.d.ts.map +1 -0
- package/dist/materializer/telemetry/plan.d.ts +12 -0
- package/dist/materializer/telemetry/plan.d.ts.map +1 -0
- package/dist/objects/action/errors.d.ts +39 -0
- package/dist/objects/action/errors.d.ts.map +1 -0
- package/dist/objects/action/index.d.ts +4 -0
- package/dist/objects/action/index.d.ts.map +1 -0
- package/dist/objects/action/request.d.ts +23 -0
- package/dist/objects/action/request.d.ts.map +1 -0
- package/dist/objects/context/index.d.ts +3 -0
- package/dist/objects/context/index.d.ts.map +1 -0
- package/dist/objects/context/resolve.d.ts +27 -0
- package/dist/objects/context/resolve.d.ts.map +1 -0
- package/dist/objects/context/types.d.ts +28 -0
- package/dist/objects/context/types.d.ts.map +1 -0
- package/dist/objects/contexts.d.ts +45 -0
- package/dist/objects/contexts.d.ts.map +1 -0
- package/dist/objects/errors.d.ts +8 -0
- package/dist/objects/errors.d.ts.map +1 -0
- package/dist/objects/helpers.d.ts +7 -0
- package/dist/objects/helpers.d.ts.map +1 -0
- package/dist/objects/index.d.ts +18 -0
- package/dist/objects/index.d.ts.map +1 -0
- package/dist/objects/index.js +71 -0
- package/dist/objects/index.js.map +9 -0
- package/dist/objects/link/authorization.d.ts +25 -0
- package/dist/objects/link/authorization.d.ts.map +1 -0
- package/dist/objects/link/endpoints.d.ts +28 -0
- package/dist/objects/link/endpoints.d.ts.map +1 -0
- package/dist/objects/link/index.d.ts +4 -0
- package/dist/objects/link/index.d.ts.map +1 -0
- package/dist/objects/link/remove.d.ts +8 -0
- package/dist/objects/link/remove.d.ts.map +1 -0
- package/dist/objects/link/upsert-batch.d.ts +11 -0
- package/dist/objects/link/upsert-batch.d.ts.map +1 -0
- package/dist/objects/link/upsert.d.ts +12 -0
- package/dist/objects/link/upsert.d.ts.map +1 -0
- package/dist/objects/materializer-adapter.d.ts +114 -0
- package/dist/objects/materializer-adapter.d.ts.map +1 -0
- package/dist/objects/object/delete.d.ts +17 -0
- package/dist/objects/object/delete.d.ts.map +1 -0
- package/dist/objects/object/index.d.ts +4 -0
- package/dist/objects/object/index.d.ts.map +1 -0
- package/dist/objects/object/upsert-batch.d.ts +7 -0
- package/dist/objects/object/upsert-batch.d.ts.map +1 -0
- package/dist/objects/object/upsert.d.ts +7 -0
- package/dist/objects/object/upsert.d.ts.map +1 -0
- package/dist/objects/query/errors.d.ts +23 -0
- package/dist/objects/query/errors.d.ts.map +1 -0
- package/dist/objects/query/executor.d.ts +63 -0
- package/dist/objects/query/executor.d.ts.map +1 -0
- package/dist/objects/query/explain-format.d.ts +10 -0
- package/dist/objects/query/explain-format.d.ts.map +1 -0
- package/dist/objects/query/explain.d.ts +26 -0
- package/dist/objects/query/explain.d.ts.map +1 -0
- package/dist/objects/query/index.d.ts +14 -0
- package/dist/objects/query/index.d.ts.map +1 -0
- package/dist/objects/query/index.js +54 -0
- package/dist/objects/query/index.js.map +9 -0
- package/dist/objects/query/ir.d.ts +166 -0
- package/dist/objects/query/ir.d.ts.map +1 -0
- package/dist/objects/query/normalize.d.ts +12 -0
- package/dist/objects/query/normalize.d.ts.map +1 -0
- package/dist/objects/query/planner.d.ts +32 -0
- package/dist/objects/query/planner.d.ts.map +1 -0
- package/dist/objects/query/scalar-values.d.ts +6 -0
- package/dist/objects/query/scalar-values.d.ts.map +1 -0
- package/dist/objects/query/validate.d.ts +23 -0
- package/dist/objects/query/validate.d.ts.map +1 -0
- package/dist/objects/runtime-batch.d.ts +29 -0
- package/dist/objects/runtime-batch.d.ts.map +1 -0
- package/dist/objects/sdk/index.d.ts +3 -0
- package/dist/objects/sdk/index.d.ts.map +1 -0
- package/dist/objects/sdk/object-handle.d.ts +6 -0
- package/dist/objects/sdk/object-handle.d.ts.map +1 -0
- package/dist/objects/sdk/object-set.d.ts +14 -0
- package/dist/objects/sdk/object-set.d.ts.map +1 -0
- package/dist/objects/sdk/query-builder.d.ts +20 -0
- package/dist/objects/sdk/query-builder.d.ts.map +1 -0
- package/dist/objects/sdk/query-executor.d.ts +51 -0
- package/dist/objects/sdk/query-executor.d.ts.map +1 -0
- package/dist/objects/sdk/runtime-query-executor.d.ts +16 -0
- package/dist/objects/sdk/runtime-query-executor.d.ts.map +1 -0
- package/dist/objects/sdk/telemetry-channel.d.ts +6 -0
- package/dist/objects/sdk/telemetry-channel.d.ts.map +1 -0
- package/dist/objects/sdk/where.d.ts +15 -0
- package/dist/objects/sdk/where.d.ts.map +1 -0
- package/dist/objects/service/action-service.d.ts +12 -0
- package/dist/objects/service/action-service.d.ts.map +1 -0
- package/dist/objects/service/index.d.ts +7 -0
- package/dist/objects/service/index.d.ts.map +1 -0
- package/dist/objects/service/link-service.d.ts +26 -0
- package/dist/objects/service/link-service.d.ts.map +1 -0
- package/dist/objects/service/list-service.d.ts +24 -0
- package/dist/objects/service/list-service.d.ts.map +1 -0
- package/dist/objects/service/object-service.d.ts +12 -0
- package/dist/objects/service/object-service.d.ts.map +1 -0
- package/dist/objects/service/telemetry-service.d.ts +12 -0
- package/dist/objects/service/telemetry-service.d.ts.map +1 -0
- package/dist/objects/telemetry/append-batch.d.ts +10 -0
- package/dist/objects/telemetry/append-batch.d.ts.map +1 -0
- package/dist/objects/telemetry/history.d.ts +8 -0
- package/dist/objects/telemetry/history.d.ts.map +1 -0
- package/dist/objects/telemetry/index.d.ts +5 -0
- package/dist/objects/telemetry/index.d.ts.map +1 -0
- package/dist/objects/telemetry/write-batch.d.ts +8 -0
- package/dist/objects/telemetry/write-batch.d.ts.map +1 -0
- package/dist/ontology/builders.d.ts +323 -0
- package/dist/ontology/builders.d.ts.map +1 -0
- package/dist/ontology/decimal.d.ts +28 -0
- package/dist/ontology/decimal.d.ts.map +1 -0
- package/dist/ontology/errors.d.ts +20 -0
- package/dist/ontology/errors.d.ts.map +1 -0
- package/dist/ontology/index.d.ts +23 -0
- package/dist/ontology/index.d.ts.map +1 -0
- package/dist/ontology/index.js +120 -0
- package/dist/ontology/index.js.map +9 -0
- package/dist/ontology/inference/index.d.ts +112 -0
- package/dist/ontology/inference/index.d.ts.map +1 -0
- package/dist/ontology/internal.d.ts +4 -0
- package/dist/ontology/internal.d.ts.map +1 -0
- package/dist/ontology/internal.js +118 -0
- package/dist/ontology/internal.js.map +10 -0
- package/dist/ontology/json-schema.d.ts +9 -0
- package/dist/ontology/json-schema.d.ts.map +1 -0
- package/dist/ontology/refs.d.ts +16 -0
- package/dist/ontology/refs.d.ts.map +1 -0
- package/dist/ontology/registry.d.ts +82 -0
- package/dist/ontology/registry.d.ts.map +1 -0
- package/dist/ontology/tokens.d.ts +54 -0
- package/dist/ontology/tokens.d.ts.map +1 -0
- package/dist/ontology/types.d.ts +402 -0
- package/dist/ontology/types.d.ts.map +1 -0
- package/dist/ontology/units/index.d.ts +74 -0
- package/dist/ontology/units/index.d.ts.map +1 -0
- package/dist/ontology/units/quantitative-types.d.ts +1605 -0
- package/dist/ontology/units/quantitative-types.d.ts.map +1 -0
- package/dist/ontology/units/types.d.ts +26 -0
- package/dist/ontology/units/types.d.ts.map +1 -0
- package/dist/ontology/validation/index.d.ts +7 -0
- package/dist/ontology/validation/index.d.ts.map +1 -0
- package/dist/ontology/validation/links.d.ts +18 -0
- package/dist/ontology/validation/links.d.ts.map +1 -0
- package/dist/ontology/validation/normalize.d.ts +21 -0
- package/dist/ontology/validation/normalize.d.ts.map +1 -0
- package/dist/ontology/validation/properties.d.ts +19 -0
- package/dist/ontology/validation/properties.d.ts.map +1 -0
- package/dist/ontology/validation/query.d.ts +3 -0
- package/dist/ontology/validation/query.d.ts.map +1 -0
- package/dist/ontology/validation/schema.d.ts +7 -0
- package/dist/ontology/validation/schema.d.ts.map +1 -0
- package/dist/ontology/validation/telemetry.d.ts +7 -0
- package/dist/ontology/validation/telemetry.d.ts.map +1 -0
- package/dist/pipelines/builders.d.ts +14 -0
- package/dist/pipelines/builders.d.ts.map +1 -0
- package/dist/pipelines/errors.d.ts +4 -0
- package/dist/pipelines/errors.d.ts.map +1 -0
- package/dist/pipelines/index.d.ts +7 -0
- package/dist/pipelines/index.d.ts.map +1 -0
- package/dist/pipelines/request.d.ts +31 -0
- package/dist/pipelines/request.d.ts.map +1 -0
- package/dist/pipelines/types.d.ts +84 -0
- package/dist/pipelines/types.d.ts.map +1 -0
- package/dist/predicates/builders.d.ts +24 -0
- package/dist/predicates/builders.d.ts.map +1 -0
- package/dist/predicates/evaluate.d.ts +8 -0
- package/dist/predicates/evaluate.d.ts.map +1 -0
- package/dist/predicates/index.d.ts +5 -0
- package/dist/predicates/index.d.ts.map +1 -0
- package/dist/predicates/types.d.ts +69 -0
- package/dist/predicates/types.d.ts.map +1 -0
- package/dist/predicates/validation.d.ts +15 -0
- package/dist/predicates/validation.d.ts.map +1 -0
- package/dist/projections/builders.d.ts +212 -0
- package/dist/projections/builders.d.ts.map +1 -0
- package/dist/projections/errors.d.ts +4 -0
- package/dist/projections/errors.d.ts.map +1 -0
- package/dist/projections/index.d.ts +5 -0
- package/dist/projections/index.d.ts.map +1 -0
- package/dist/projections/internal.d.ts +24 -0
- package/dist/projections/internal.d.ts.map +1 -0
- package/dist/projections/internal.js +26 -0
- package/dist/projections/internal.js.map +9 -0
- package/dist/projections/ownership.d.ts +9 -0
- package/dist/projections/ownership.d.ts.map +1 -0
- package/dist/projections/registry.d.ts +30 -0
- package/dist/projections/registry.d.ts.map +1 -0
- package/dist/projections/revision.d.ts +7 -0
- package/dist/projections/revision.d.ts.map +1 -0
- package/dist/projections/types.d.ts +153 -0
- package/dist/projections/types.d.ts.map +1 -0
- package/dist/projections/validation.d.ts +97 -0
- package/dist/projections/validation.d.ts.map +1 -0
- package/dist/provider-scope.d.ts +12 -0
- package/dist/provider-scope.d.ts.map +1 -0
- package/dist/query.d.ts +17 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +21 -0
- package/dist/query.js.map +9 -0
- package/dist/queues/errors.d.ts +7 -0
- package/dist/queues/errors.d.ts.map +1 -0
- package/dist/queues/in-memory.d.ts +73 -0
- package/dist/queues/in-memory.d.ts.map +1 -0
- package/dist/queues/index.d.ts +5 -0
- package/dist/queues/index.d.ts.map +1 -0
- package/dist/queues/index.js +12 -0
- package/dist/queues/index.js.map +9 -0
- package/dist/queues/types.d.ts +182 -0
- package/dist/queues/types.d.ts.map +1 -0
- package/dist/rules/builders.d.ts +10 -0
- package/dist/rules/builders.d.ts.map +1 -0
- package/dist/rules/dependencies.d.ts +9 -0
- package/dist/rules/dependencies.d.ts.map +1 -0
- package/dist/rules/errors.d.ts +11 -0
- package/dist/rules/errors.d.ts.map +1 -0
- package/dist/rules/index.d.ts +6 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/internal.d.ts +9 -0
- package/dist/rules/internal.d.ts.map +1 -0
- package/dist/rules/internal.js +10 -0
- package/dist/rules/internal.js.map +9 -0
- package/dist/rules/types.d.ts +72 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/validation.d.ts +23 -0
- package/dist/rules/validation.d.ts.map +1 -0
- package/dist/runtime/create.d.ts +68 -0
- package/dist/runtime/create.d.ts.map +1 -0
- package/dist/runtime/errors.d.ts +9 -0
- package/dist/runtime/errors.d.ts.map +1 -0
- package/dist/runtime/index.d.ts +26 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/internal.d.ts +3 -0
- package/dist/runtime/internal.d.ts.map +1 -0
- package/dist/runtime/internal.js +16 -0
- package/dist/runtime/internal.js.map +9 -0
- package/dist/runtime/ontology-mutations.d.ts +16 -0
- package/dist/runtime/ontology-mutations.d.ts.map +1 -0
- package/dist/runtime/scoped.d.ts +158 -0
- package/dist/runtime/scoped.d.ts.map +1 -0
- package/dist/runtime/sixb.d.ts +226 -0
- package/dist/runtime/sixb.d.ts.map +1 -0
- package/dist/runtime/storage-readiness.d.ts +20 -0
- package/dist/runtime/storage-readiness.d.ts.map +1 -0
- package/dist/runtime/types.d.ts +840 -0
- package/dist/runtime/types.d.ts.map +1 -0
- package/dist/sandboxes/errors.d.ts +20 -0
- package/dist/sandboxes/errors.d.ts.map +1 -0
- package/dist/sandboxes/exec.d.ts +17 -0
- package/dist/sandboxes/exec.d.ts.map +1 -0
- package/dist/sandboxes/index.d.ts +5 -0
- package/dist/sandboxes/index.d.ts.map +1 -0
- package/dist/sandboxes/index.js +18 -0
- package/dist/sandboxes/index.js.map +9 -0
- package/dist/sandboxes/sandbox.d.ts +110 -0
- package/dist/sandboxes/sandbox.d.ts.map +1 -0
- package/dist/scheduler/errors.d.ts +7 -0
- package/dist/scheduler/errors.d.ts.map +1 -0
- package/dist/scheduler/index.d.ts +4 -0
- package/dist/scheduler/index.d.ts.map +1 -0
- package/dist/scheduler/index.js +18 -0
- package/dist/scheduler/index.js.map +9 -0
- package/dist/scheduler/runtime.d.ts +32 -0
- package/dist/scheduler/runtime.d.ts.map +1 -0
- package/dist/schedules/builders.d.ts +4 -0
- package/dist/schedules/builders.d.ts.map +1 -0
- package/dist/schedules/cron.d.ts +14 -0
- package/dist/schedules/cron.d.ts.map +1 -0
- package/dist/schedules/errors.d.ts +7 -0
- package/dist/schedules/errors.d.ts.map +1 -0
- package/dist/schedules/index.d.ts +12 -0
- package/dist/schedules/index.d.ts.map +1 -0
- package/dist/schedules/index.js +37 -0
- package/dist/schedules/index.js.map +9 -0
- package/dist/schedules/next-occurrence.d.ts +11 -0
- package/dist/schedules/next-occurrence.d.ts.map +1 -0
- package/dist/schedules/runtime.d.ts +17 -0
- package/dist/schedules/runtime.d.ts.map +1 -0
- package/dist/schedules/types.d.ts +99 -0
- package/dist/schedules/types.d.ts.map +1 -0
- package/dist/schedules/validation.d.ts +13 -0
- package/dist/schedules/validation.d.ts.map +1 -0
- package/dist/security/applications.d.ts +15 -0
- package/dist/security/applications.d.ts.map +1 -0
- package/dist/security/builders.d.ts +20 -0
- package/dist/security/builders.d.ts.map +1 -0
- package/dist/security/errors.d.ts +4 -0
- package/dist/security/errors.d.ts.map +1 -0
- package/dist/security/every.d.ts +68 -0
- package/dist/security/every.d.ts.map +1 -0
- package/dist/security/grants.d.ts +40 -0
- package/dist/security/grants.d.ts.map +1 -0
- package/dist/security/index.d.ts +12 -0
- package/dist/security/index.d.ts.map +1 -0
- package/dist/security/membership-policies.d.ts +17 -0
- package/dist/security/membership-policies.d.ts.map +1 -0
- package/dist/security/runtime.d.ts +16 -0
- package/dist/security/runtime.d.ts.map +1 -0
- package/dist/security/types.d.ts +133 -0
- package/dist/security/types.d.ts.map +1 -0
- package/dist/security/validation.d.ts +36 -0
- package/dist/security/validation.d.ts.map +1 -0
- package/dist/storage/action-runs/errors.d.ts +10 -0
- package/dist/storage/action-runs/errors.d.ts.map +1 -0
- package/dist/storage/action-runs/idempotency.d.ts +10 -0
- package/dist/storage/action-runs/idempotency.d.ts.map +1 -0
- package/dist/storage/action-runs/in-memory.d.ts +28 -0
- package/dist/storage/action-runs/in-memory.d.ts.map +1 -0
- package/dist/storage/action-runs/index.d.ts +6 -0
- package/dist/storage/action-runs/index.d.ts.map +1 -0
- package/dist/storage/action-runs/types.d.ts +138 -0
- package/dist/storage/action-runs/types.d.ts.map +1 -0
- package/dist/storage/agents/errors.d.ts +11 -0
- package/dist/storage/agents/errors.d.ts.map +1 -0
- package/dist/storage/agents/in-memory.d.ts +70 -0
- package/dist/storage/agents/in-memory.d.ts.map +1 -0
- package/dist/storage/agents/index.d.ts +7 -0
- package/dist/storage/agents/index.d.ts.map +1 -0
- package/dist/storage/agents/types.d.ts +295 -0
- package/dist/storage/agents/types.d.ts.map +1 -0
- package/dist/storage/auth/errors.d.ts +10 -0
- package/dist/storage/auth/errors.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/access-tokens.d.ts +32 -0
- package/dist/storage/auth/in-memory/access-tokens.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/auth-storage.d.ts +36 -0
- package/dist/storage/auth/in-memory/auth-storage.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/group-memberships.d.ts +21 -0
- package/dist/storage/auth/in-memory/group-memberships.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/identities.d.ts +17 -0
- package/dist/storage/auth/in-memory/identities.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/index.d.ts +2 -0
- package/dist/storage/auth/in-memory/index.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/invitations.d.ts +28 -0
- package/dist/storage/auth/in-memory/invitations.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/magic-links.d.ts +28 -0
- package/dist/storage/auth/in-memory/magic-links.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/oidc-attempts.d.ts +18 -0
- package/dist/storage/auth/in-memory/oidc-attempts.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/service-account-group-memberships.d.ts +17 -0
- package/dist/storage/auth/in-memory/service-account-group-memberships.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/service-accounts.d.ts +14 -0
- package/dist/storage/auth/in-memory/service-accounts.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/sessions.d.ts +55 -0
- package/dist/storage/auth/in-memory/sessions.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/shared.d.ts +71 -0
- package/dist/storage/auth/in-memory/shared.d.ts.map +1 -0
- package/dist/storage/auth/in-memory/users.d.ts +19 -0
- package/dist/storage/auth/in-memory/users.d.ts.map +1 -0
- package/dist/storage/auth/in-memory.d.ts +2 -0
- package/dist/storage/auth/in-memory.d.ts.map +1 -0
- package/dist/storage/auth/index.d.ts +5 -0
- package/dist/storage/auth/index.d.ts.map +1 -0
- package/dist/storage/auth/types.d.ts +584 -0
- package/dist/storage/auth/types.d.ts.map +1 -0
- package/dist/storage/errors.d.ts +27 -0
- package/dist/storage/errors.d.ts.map +1 -0
- package/dist/storage/file-upload-sessions/errors.d.ts +15 -0
- package/dist/storage/file-upload-sessions/errors.d.ts.map +1 -0
- package/dist/storage/file-upload-sessions/in-memory.d.ts +27 -0
- package/dist/storage/file-upload-sessions/in-memory.d.ts.map +1 -0
- package/dist/storage/file-upload-sessions/index.d.ts +6 -0
- package/dist/storage/file-upload-sessions/index.d.ts.map +1 -0
- package/dist/storage/file-upload-sessions/types.d.ts +53 -0
- package/dist/storage/file-upload-sessions/types.d.ts.map +1 -0
- package/dist/storage/file-upload-sessions/utils.d.ts +11 -0
- package/dist/storage/file-upload-sessions/utils.d.ts.map +1 -0
- package/dist/storage/in-memory/index.d.ts +105 -0
- package/dist/storage/in-memory/index.d.ts.map +1 -0
- package/dist/storage/in-memory/testing.d.ts +8 -0
- package/dist/storage/in-memory/testing.d.ts.map +1 -0
- package/dist/storage/index.d.ts +44 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +144 -0
- package/dist/storage/index.js.map +9 -0
- package/dist/storage/migrations/check-schema.d.ts +19 -0
- package/dist/storage/migrations/check-schema.d.ts.map +1 -0
- package/dist/storage/migrations/index.d.ts +5 -0
- package/dist/storage/migrations/index.d.ts.map +1 -0
- package/dist/storage/migrations/migrate-storage.d.ts +6 -0
- package/dist/storage/migrations/migrate-storage.d.ts.map +1 -0
- package/dist/storage/migrations/migration-set.d.ts +27 -0
- package/dist/storage/migrations/migration-set.d.ts.map +1 -0
- package/dist/storage/migrations/types.d.ts +115 -0
- package/dist/storage/migrations/types.d.ts.map +1 -0
- package/dist/storage/objects/in-memory.d.ts +126 -0
- package/dist/storage/objects/in-memory.d.ts.map +1 -0
- package/dist/storage/objects/index.d.ts +2 -0
- package/dist/storage/objects/index.d.ts.map +1 -0
- package/dist/storage/objects/types.d.ts +222 -0
- package/dist/storage/objects/types.d.ts.map +1 -0
- package/dist/storage/ontology/commits.d.ts +117 -0
- package/dist/storage/ontology/commits.d.ts.map +1 -0
- package/dist/storage/ontology/in-memory/commits.d.ts +12 -0
- package/dist/storage/ontology/in-memory/commits.d.ts.map +1 -0
- package/dist/storage/ontology/in-memory/index.d.ts +36 -0
- package/dist/storage/ontology/in-memory/index.d.ts.map +1 -0
- package/dist/storage/ontology/in-memory/materializations-finalization.d.ts +5 -0
- package/dist/storage/ontology/in-memory/materializations-finalization.d.ts.map +1 -0
- package/dist/storage/ontology/in-memory/materializations-state.d.ts +20 -0
- package/dist/storage/ontology/in-memory/materializations-state.d.ts.map +1 -0
- package/dist/storage/ontology/in-memory/materializations-work.d.ts +6 -0
- package/dist/storage/ontology/in-memory/materializations-work.d.ts.map +1 -0
- package/dist/storage/ontology/in-memory/materializations.d.ts +101 -0
- package/dist/storage/ontology/in-memory/materializations.d.ts.map +1 -0
- package/dist/storage/ontology/in-memory/outbox.d.ts +19 -0
- package/dist/storage/ontology/in-memory/outbox.d.ts.map +1 -0
- package/dist/storage/ontology/in-memory/shared-state.d.ts +48 -0
- package/dist/storage/ontology/in-memory/shared-state.d.ts.map +1 -0
- package/dist/storage/ontology/in-memory/sources.d.ts +23 -0
- package/dist/storage/ontology/in-memory/sources.d.ts.map +1 -0
- package/dist/storage/ontology/in-memory/testing.d.ts +11 -0
- package/dist/storage/ontology/in-memory/testing.d.ts.map +1 -0
- package/dist/storage/ontology/index.d.ts +16 -0
- package/dist/storage/ontology/index.d.ts.map +1 -0
- package/dist/storage/ontology/materializations.d.ts +333 -0
- package/dist/storage/ontology/materializations.d.ts.map +1 -0
- package/dist/storage/ontology/outbox.d.ts +66 -0
- package/dist/storage/ontology/outbox.d.ts.map +1 -0
- package/dist/storage/ontology/provider-header-validation.d.ts +4 -0
- package/dist/storage/ontology/provider-header-validation.d.ts.map +1 -0
- package/dist/storage/ontology/provider-validation.d.ts +6 -0
- package/dist/storage/ontology/provider-validation.d.ts.map +1 -0
- package/dist/storage/ontology/provider-work.d.ts +12 -0
- package/dist/storage/ontology/provider-work.d.ts.map +1 -0
- package/dist/storage/ontology/provider.d.ts +191 -0
- package/dist/storage/ontology/provider.d.ts.map +1 -0
- package/dist/storage/ontology/provider.js +115 -0
- package/dist/storage/ontology/provider.js.map +9 -0
- package/dist/storage/ontology/sources.d.ts +151 -0
- package/dist/storage/ontology/sources.d.ts.map +1 -0
- package/dist/storage/operation-scope.d.ts +32 -0
- package/dist/storage/operation-scope.d.ts.map +1 -0
- package/dist/storage/operation-scope.js +22 -0
- package/dist/storage/operation-scope.js.map +9 -0
- package/dist/storage/pagination.d.ts +11 -0
- package/dist/storage/pagination.d.ts.map +1 -0
- package/dist/storage/pipeline-runs/errors.d.ts +7 -0
- package/dist/storage/pipeline-runs/errors.d.ts.map +1 -0
- package/dist/storage/pipeline-runs/in-memory.d.ts +26 -0
- package/dist/storage/pipeline-runs/in-memory.d.ts.map +1 -0
- package/dist/storage/pipeline-runs/index.d.ts +4 -0
- package/dist/storage/pipeline-runs/index.d.ts.map +1 -0
- package/dist/storage/pipeline-runs/types.d.ts +133 -0
- package/dist/storage/pipeline-runs/types.d.ts.map +1 -0
- package/dist/storage/projection-runs/errors.d.ts +9 -0
- package/dist/storage/projection-runs/errors.d.ts.map +1 -0
- package/dist/storage/projection-runs/in-memory.d.ts +42 -0
- package/dist/storage/projection-runs/in-memory.d.ts.map +1 -0
- package/dist/storage/projection-runs/index.d.ts +5 -0
- package/dist/storage/projection-runs/index.d.ts.map +1 -0
- package/dist/storage/projection-runs/lifecycle.d.ts +93 -0
- package/dist/storage/projection-runs/lifecycle.d.ts.map +1 -0
- package/dist/storage/projection-runs/lifecycle.js +64 -0
- package/dist/storage/projection-runs/lifecycle.js.map +9 -0
- package/dist/storage/projection-runs/types.d.ts +175 -0
- package/dist/storage/projection-runs/types.d.ts.map +1 -0
- package/dist/storage/rules/in-memory.d.ts +26 -0
- package/dist/storage/rules/in-memory.d.ts.map +1 -0
- package/dist/storage/rules/index.d.ts +3 -0
- package/dist/storage/rules/index.d.ts.map +1 -0
- package/dist/storage/rules/types.d.ts +60 -0
- package/dist/storage/rules/types.d.ts.map +1 -0
- package/dist/storage/run-listing.d.ts +36 -0
- package/dist/storage/run-listing.d.ts.map +1 -0
- package/dist/storage/sync-runs/errors.d.ts +8 -0
- package/dist/storage/sync-runs/errors.d.ts.map +1 -0
- package/dist/storage/sync-runs/in-memory.d.ts +16 -0
- package/dist/storage/sync-runs/in-memory.d.ts.map +1 -0
- package/dist/storage/sync-runs/index.d.ts +4 -0
- package/dist/storage/sync-runs/index.d.ts.map +1 -0
- package/dist/storage/sync-runs/types.d.ts +85 -0
- package/dist/storage/sync-runs/types.d.ts.map +1 -0
- package/dist/storage/timeseries/index.d.ts +2 -0
- package/dist/storage/timeseries/index.d.ts.map +1 -0
- package/dist/storage/timeseries/store.d.ts +46 -0
- package/dist/storage/timeseries/store.d.ts.map +1 -0
- package/dist/storage/timeseries/types.d.ts +50 -0
- package/dist/storage/timeseries/types.d.ts.map +1 -0
- package/dist/storage/transaction.d.ts +4 -0
- package/dist/storage/transaction.d.ts.map +1 -0
- package/dist/storage/types.d.ts +78 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/webhook-deliveries/in-memory.d.ts +18 -0
- package/dist/storage/webhook-deliveries/in-memory.d.ts.map +1 -0
- package/dist/storage/webhook-deliveries/index.d.ts +3 -0
- package/dist/storage/webhook-deliveries/index.d.ts.map +1 -0
- package/dist/storage/webhook-deliveries/types.d.ts +43 -0
- package/dist/storage/webhook-deliveries/types.d.ts.map +1 -0
- package/dist/storage/webhook-runs/errors.d.ts +7 -0
- package/dist/storage/webhook-runs/errors.d.ts.map +1 -0
- package/dist/storage/webhook-runs/in-memory.d.ts +16 -0
- package/dist/storage/webhook-runs/in-memory.d.ts.map +1 -0
- package/dist/storage/webhook-runs/index.d.ts +4 -0
- package/dist/storage/webhook-runs/index.d.ts.map +1 -0
- package/dist/storage/webhook-runs/types.d.ts +66 -0
- package/dist/storage/webhook-runs/types.d.ts.map +1 -0
- package/dist/storage/workflow-interventions/errors.d.ts +7 -0
- package/dist/storage/workflow-interventions/errors.d.ts.map +1 -0
- package/dist/storage/workflow-interventions/in-memory.d.ts +18 -0
- package/dist/storage/workflow-interventions/in-memory.d.ts.map +1 -0
- package/dist/storage/workflow-interventions/index.d.ts +4 -0
- package/dist/storage/workflow-interventions/index.d.ts.map +1 -0
- package/dist/storage/workflow-interventions/types.d.ts +94 -0
- package/dist/storage/workflow-interventions/types.d.ts.map +1 -0
- package/dist/storage/workflow-runs/errors.d.ts +7 -0
- package/dist/storage/workflow-runs/errors.d.ts.map +1 -0
- package/dist/storage/workflow-runs/in-memory.d.ts +83 -0
- package/dist/storage/workflow-runs/in-memory.d.ts.map +1 -0
- package/dist/storage/workflow-runs/index.d.ts +4 -0
- package/dist/storage/workflow-runs/index.d.ts.map +1 -0
- package/dist/storage/workflow-runs/types.d.ts +305 -0
- package/dist/storage/workflow-runs/types.d.ts.map +1 -0
- package/dist/syncs/builders.d.ts +9 -0
- package/dist/syncs/builders.d.ts.map +1 -0
- package/dist/syncs/errors.d.ts +4 -0
- package/dist/syncs/errors.d.ts.map +1 -0
- package/dist/syncs/index.d.ts +7 -0
- package/dist/syncs/index.d.ts.map +1 -0
- package/dist/syncs/request.d.ts +41 -0
- package/dist/syncs/request.d.ts.map +1 -0
- package/dist/syncs/types.d.ts +76 -0
- package/dist/syncs/types.d.ts.map +1 -0
- package/dist/testing/agent-storage-contract.d.ts +16 -0
- package/dist/testing/agent-storage-contract.d.ts.map +1 -0
- package/dist/testing/auth-storage-contract.d.ts +16 -0
- package/dist/testing/auth-storage-contract.d.ts.map +1 -0
- package/dist/testing/blob-storage-contract.d.ts +10 -0
- package/dist/testing/blob-storage-contract.d.ts.map +1 -0
- package/dist/testing/broker-contract.d.ts +39 -0
- package/dist/testing/broker-contract.d.ts.map +1 -0
- package/dist/testing/effective-storage-contract.d.ts +7 -0
- package/dist/testing/effective-storage-contract.d.ts.map +1 -0
- package/dist/testing/index.d.ts +15 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +7000 -0
- package/dist/testing/index.js.map +24 -0
- package/dist/testing/lake-storage-contract.d.ts +29 -0
- package/dist/testing/lake-storage-contract.d.ts.map +1 -0
- package/dist/testing/materialization-failure-contract.d.ts +26 -0
- package/dist/testing/materialization-failure-contract.d.ts.map +1 -0
- package/dist/testing/materializer-fixture.d.ts +35 -0
- package/dist/testing/materializer-fixture.d.ts.map +1 -0
- package/dist/testing/materializer-storage-contract.d.ts +7 -0
- package/dist/testing/materializer-storage-contract.d.ts.map +1 -0
- package/dist/testing/object-query-contract.d.ts +21 -0
- package/dist/testing/object-query-contract.d.ts.map +1 -0
- package/dist/testing/ontology-contract-fixture.d.ts +33 -0
- package/dist/testing/ontology-contract-fixture.d.ts.map +1 -0
- package/dist/testing/ontology-storage-contract.d.ts +21 -0
- package/dist/testing/ontology-storage-contract.d.ts.map +1 -0
- package/dist/testing/projection-run-storage-contract.d.ts +10 -0
- package/dist/testing/projection-run-storage-contract.d.ts.map +1 -0
- package/dist/testing/queues-contract.d.ts +31 -0
- package/dist/testing/queues-contract.d.ts.map +1 -0
- package/dist/testing/sandboxes-contract.d.ts +31 -0
- package/dist/testing/sandboxes-contract.d.ts.map +1 -0
- package/dist/tsconfig.json +5 -0
- package/dist/webhooks/builders.d.ts +41 -0
- package/dist/webhooks/builders.d.ts.map +1 -0
- package/dist/webhooks/connector.d.ts +10 -0
- package/dist/webhooks/connector.d.ts.map +1 -0
- package/dist/webhooks/errors.d.ts +4 -0
- package/dist/webhooks/errors.d.ts.map +1 -0
- package/dist/webhooks/index.d.ts +9 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/registry.d.ts +7 -0
- package/dist/webhooks/registry.d.ts.map +1 -0
- package/dist/webhooks/types.d.ts +79 -0
- package/dist/webhooks/types.d.ts.map +1 -0
- package/dist/webhooks/unverified.d.ts +57 -0
- package/dist/webhooks/unverified.d.ts.map +1 -0
- package/dist/workers/errors.d.ts +17 -0
- package/dist/workers/errors.d.ts.map +1 -0
- package/dist/workers/index.d.ts +7 -0
- package/dist/workers/index.d.ts.map +1 -0
- package/dist/workers/index.js +506 -0
- package/dist/workers/index.js.map +13 -0
- package/dist/workers/queue-delivery.d.ts +38 -0
- package/dist/workers/queue-delivery.d.ts.map +1 -0
- package/dist/workers/queue-worker.d.ts +30 -0
- package/dist/workers/queue-worker.d.ts.map +1 -0
- package/dist/workers/worker.d.ts +14 -0
- package/dist/workers/worker.d.ts.map +1 -0
- package/dist/workflows/builders.d.ts +27 -0
- package/dist/workflows/builders.d.ts.map +1 -0
- package/dist/workflows/errors.d.ts +11 -0
- package/dist/workflows/errors.d.ts.map +1 -0
- package/dist/workflows/index.d.ts +9 -0
- package/dist/workflows/index.d.ts.map +1 -0
- package/dist/workflows/index.js +108 -0
- package/dist/workflows/index.js.map +9 -0
- package/dist/workflows/request.d.ts +29 -0
- package/dist/workflows/request.d.ts.map +1 -0
- package/dist/workflows/runtime.d.ts +33 -0
- package/dist/workflows/runtime.d.ts.map +1 -0
- package/dist/workflows/snapshot.d.ts +55 -0
- package/dist/workflows/snapshot.d.ts.map +1 -0
- package/dist/workflows/types.d.ts +288 -0
- package/dist/workflows/types.d.ts.map +1 -0
- package/dist/workflows/validation.d.ts +66 -0
- package/dist/workflows/validation.d.ts.map +1 -0
- package/package.json +312 -0
- package/src/actions/builders/define-action.ts +243 -0
- package/src/actions/builders/params.ts +48 -0
- package/src/actions/builders.ts +2 -0
- package/src/actions/commit-edits.ts +110 -0
- package/src/actions/errors.ts +15 -0
- package/src/actions/index.ts +75 -0
- package/src/actions/read-facade.ts +224 -0
- package/src/actions/registry.ts +135 -0
- package/src/actions/request.ts +407 -0
- package/src/actions/run-id.ts +17 -0
- package/src/actions/runtime.ts +31 -0
- package/src/actions/types/context.ts +224 -0
- package/src/actions/types/definitions.ts +181 -0
- package/src/actions/types/handlers.ts +68 -0
- package/src/actions/types/params.ts +82 -0
- package/src/actions/types.ts +4 -0
- package/src/actions/validation.ts +186 -0
- package/src/actions/validators.ts +56 -0
- package/src/actions/worker.ts +2 -0
- package/src/agents/adapters.ts +647 -0
- package/src/agents/api-gateway.ts +57 -0
- package/src/agents/builders.ts +46 -0
- package/src/agents/context-model.ts +41 -0
- package/src/agents/context-resolution.ts +43 -0
- package/src/agents/context.ts +185 -0
- package/src/agents/dispatch.ts +107 -0
- package/src/agents/errors.ts +40 -0
- package/src/agents/ids.ts +24 -0
- package/src/agents/index.ts +122 -0
- package/src/agents/message.ts +91 -0
- package/src/agents/prompt.ts +45 -0
- package/src/agents/request.ts +198 -0
- package/src/agents/runtime.ts +124 -0
- package/src/agents/streams.ts +194 -0
- package/src/agents/types.ts +70 -0
- package/src/agents/validation.ts +151 -0
- package/src/auth/access-tokens.ts +125 -0
- package/src/auth/audience.ts +28 -0
- package/src/auth/cookies.ts +263 -0
- package/src/auth/csrf.ts +41 -0
- package/src/auth/errors.ts +19 -0
- package/src/auth/index.ts +149 -0
- package/src/auth/runtime.ts +1642 -0
- package/src/auth/session-cache.ts +112 -0
- package/src/auth/sessions.ts +55 -0
- package/src/auth/strategy.ts +46 -0
- package/src/auth/types.ts +573 -0
- package/src/auth/validation.ts +241 -0
- package/src/authorization/application-access.ts +34 -0
- package/src/authorization/decision.ts +215 -0
- package/src/authorization/errors.ts +12 -0
- package/src/authorization/event-visibility.ts +99 -0
- package/src/authorization/grant-kinds.ts +149 -0
- package/src/authorization/index.ts +24 -0
- package/src/authorization/resolve.ts +101 -0
- package/src/authorization/run-visibility.ts +78 -0
- package/src/authorization/types.ts +52 -0
- package/src/blob-storage/browser.ts +28 -0
- package/src/blob-storage/constants.ts +9 -0
- package/src/blob-storage/derive.ts +13 -0
- package/src/blob-storage/errors.ts +6 -0
- package/src/blob-storage/in-memory.ts +74 -0
- package/src/blob-storage/index.ts +37 -0
- package/src/blob-storage/types.ts +143 -0
- package/src/blob-storage/utils.ts +126 -0
- package/src/blob-storage/validation.ts +58 -0
- package/src/bootstrap/discovery.ts +507 -0
- package/src/bootstrap/index.ts +26 -0
- package/src/bootstrap/ontology-type-manifest.ts +316 -0
- package/src/broker/errors.ts +15 -0
- package/src/broker/in-memory.ts +511 -0
- package/src/broker/index.ts +12 -0
- package/src/broker/types.ts +129 -0
- package/src/connectors/builders.ts +33 -0
- package/src/connectors/errors.ts +15 -0
- package/src/connectors/index.ts +9 -0
- package/src/connectors/runtime.ts +100 -0
- package/src/connectors/types.ts +64 -0
- package/src/datasets/builders.ts +233 -0
- package/src/datasets/errors.ts +3 -0
- package/src/datasets/index.ts +13 -0
- package/src/datasets/types.ts +52 -0
- package/src/datasets/validation.ts +251 -0
- package/src/edits/errors.ts +6 -0
- package/src/edits/index.ts +24 -0
- package/src/edits/normalize.ts +87 -0
- package/src/edits/properties.ts +153 -0
- package/src/edits/recorder.ts +312 -0
- package/src/edits/types.ts +275 -0
- package/src/error-reporting/capability.ts +160 -0
- package/src/error-reporting/internal.ts +13 -0
- package/src/error-reporting/normalize.ts +35 -0
- package/src/error-reporting/reporter.ts +65 -0
- package/src/error-reporting/types.ts +125 -0
- package/src/events/definitions.ts +241 -0
- package/src/events/envelope.ts +68 -0
- package/src/events/errors.ts +7 -0
- package/src/events/index.ts +167 -0
- package/src/events/outbox-dispatcher.ts +534 -0
- package/src/events/property-changes.ts +9 -0
- package/src/events/runtime.ts +401 -0
- package/src/events/scope.ts +71 -0
- package/src/events/selectors/builder.ts +531 -0
- package/src/events/selectors/index.ts +42 -0
- package/src/events/selectors/predicate.ts +91 -0
- package/src/events/selectors/types.ts +258 -0
- package/src/events/toStoredEvent.ts +35 -0
- package/src/events/types/actions.ts +42 -0
- package/src/events/types/datasets.ts +21 -0
- package/src/events/types/index.ts +206 -0
- package/src/events/types/links.ts +42 -0
- package/src/events/types/objects.ts +38 -0
- package/src/events/types/pipelines.ts +67 -0
- package/src/events/types/rules.ts +31 -0
- package/src/events/types/schedules.ts +15 -0
- package/src/events/types/syncs.ts +27 -0
- package/src/events/types/telemetry.ts +19 -0
- package/src/events/types/workflows.ts +172 -0
- package/src/http/api-routes.ts +384 -0
- package/src/http/index.ts +3 -0
- package/src/http/route-pattern.ts +37 -0
- package/src/index.ts +916 -0
- package/src/json.ts +137 -0
- package/src/lake-storage/definition-updates.ts +263 -0
- package/src/lake-storage/errors.ts +6 -0
- package/src/lake-storage/in-memory.ts +348 -0
- package/src/lake-storage/index.ts +48 -0
- package/src/lake-storage/sql-transforms.ts +67 -0
- package/src/lake-storage/types.ts +135 -0
- package/src/logging/console-logger.ts +63 -0
- package/src/logging/index.ts +43 -0
- package/src/logging/record.ts +126 -0
- package/src/logging/run-logger.ts +350 -0
- package/src/logging/runtime.ts +341 -0
- package/src/logging/stream.ts +38 -0
- package/src/logging/types.ts +156 -0
- package/src/maintenance/index.ts +9 -0
- package/src/maintenance/ontology-maintenance.ts +351 -0
- package/src/maintenance/types.ts +57 -0
- package/src/materialization/dataset-watermark.ts +52 -0
- package/src/materialization/errors.ts +73 -0
- package/src/materialization/events.ts +92 -0
- package/src/materialization/identity.ts +36 -0
- package/src/materialization/index.ts +75 -0
- package/src/materialization/model.ts +394 -0
- package/src/materialization/refs.ts +134 -0
- package/src/materializer/README.md +130 -0
- package/src/materializer/context.ts +75 -0
- package/src/materializer/edits/apply.ts +241 -0
- package/src/materializer/edits/commit.ts +311 -0
- package/src/materializer/edits/execution-units.ts +32 -0
- package/src/materializer/edits/load-state.ts +148 -0
- package/src/materializer/edits/operations.ts +298 -0
- package/src/materializer/edits/plan.ts +192 -0
- package/src/materializer/edits/read-set.ts +79 -0
- package/src/materializer/edits/working-state.ts +171 -0
- package/src/materializer/effective/build-events.ts +197 -0
- package/src/materializer/effective/diff.ts +169 -0
- package/src/materializer/effective/load-state.ts +75 -0
- package/src/materializer/effective/resolve.ts +96 -0
- package/src/materializer/effective/validate.ts +180 -0
- package/src/materializer/execution/commit-lifecycle.ts +57 -0
- package/src/materializer/execution/plan-stream.ts +97 -0
- package/src/materializer/execution/run-correlation.ts +73 -0
- package/src/materializer/execution/work-executor.ts +143 -0
- package/src/materializer/execution/work-records.ts +186 -0
- package/src/materializer/index.ts +109 -0
- package/src/materializer/materializer.ts +64 -0
- package/src/materializer/projections/entry-validator.ts +162 -0
- package/src/materializer/projections/finish-run.ts +194 -0
- package/src/materializer/projections/replace.ts +447 -0
- package/src/materializer/projections/replacement-plan.ts +376 -0
- package/src/materializer/projections/source-materialization.ts +99 -0
- package/src/materializer/shared/abort.ts +7 -0
- package/src/materializer/shared/batching.ts +32 -0
- package/src/materializer/shared/chunking.ts +27 -0
- package/src/materializer/shared/identity.ts +141 -0
- package/src/materializer/shared/normalize.ts +527 -0
- package/src/materializer/shared/projection-run.ts +61 -0
- package/src/materializer/telemetry/append.ts +503 -0
- package/src/materializer/telemetry/plan.ts +363 -0
- package/src/objects/action/errors.ts +56 -0
- package/src/objects/action/index.ts +3 -0
- package/src/objects/action/request.ts +63 -0
- package/src/objects/context/index.ts +6 -0
- package/src/objects/context/resolve.ts +51 -0
- package/src/objects/context/types.ts +31 -0
- package/src/objects/contexts.ts +64 -0
- package/src/objects/errors.ts +7 -0
- package/src/objects/helpers.ts +18 -0
- package/src/objects/index.ts +26 -0
- package/src/objects/link/authorization.ts +26 -0
- package/src/objects/link/endpoints.ts +66 -0
- package/src/objects/link/index.ts +3 -0
- package/src/objects/link/remove.ts +42 -0
- package/src/objects/link/upsert-batch.ts +80 -0
- package/src/objects/link/upsert.ts +56 -0
- package/src/objects/materializer-adapter.ts +307 -0
- package/src/objects/object/delete.ts +47 -0
- package/src/objects/object/index.ts +3 -0
- package/src/objects/object/upsert-batch.ts +57 -0
- package/src/objects/object/upsert.ts +38 -0
- package/src/objects/query/errors.ts +55 -0
- package/src/objects/query/executor.ts +1345 -0
- package/src/objects/query/explain-format.ts +34 -0
- package/src/objects/query/explain.ts +215 -0
- package/src/objects/query/index.ts +77 -0
- package/src/objects/query/ir.ts +211 -0
- package/src/objects/query/normalize.ts +245 -0
- package/src/objects/query/planner.ts +538 -0
- package/src/objects/query/scalar-values.ts +100 -0
- package/src/objects/query/validate.ts +1276 -0
- package/src/objects/runtime-batch.ts +105 -0
- package/src/objects/sdk/index.ts +2 -0
- package/src/objects/sdk/object-handle.ts +139 -0
- package/src/objects/sdk/object-set.ts +224 -0
- package/src/objects/sdk/query-builder.ts +386 -0
- package/src/objects/sdk/query-executor.ts +62 -0
- package/src/objects/sdk/runtime-query-executor.ts +88 -0
- package/src/objects/sdk/telemetry-channel.ts +81 -0
- package/src/objects/sdk/where.ts +87 -0
- package/src/objects/service/action-service.ts +40 -0
- package/src/objects/service/index.ts +6 -0
- package/src/objects/service/link-service.ts +74 -0
- package/src/objects/service/list-service.ts +89 -0
- package/src/objects/service/object-service.ts +28 -0
- package/src/objects/service/telemetry-service.ts +17 -0
- package/src/objects/telemetry/append-batch.ts +74 -0
- package/src/objects/telemetry/history.ts +32 -0
- package/src/objects/telemetry/index.ts +4 -0
- package/src/objects/telemetry/write-batch.ts +52 -0
- package/src/ontology/builders.ts +695 -0
- package/src/ontology/decimal.ts +120 -0
- package/src/ontology/errors.ts +25 -0
- package/src/ontology/index.ts +80 -0
- package/src/ontology/inference/index.ts +215 -0
- package/src/ontology/internal.ts +3 -0
- package/src/ontology/json-schema.ts +123 -0
- package/src/ontology/refs.ts +80 -0
- package/src/ontology/registry.ts +417 -0
- package/src/ontology/tokens.ts +113 -0
- package/src/ontology/types.ts +436 -0
- package/src/ontology/units/index.ts +115 -0
- package/src/ontology/units/quantitative-types.ts +608 -0
- package/src/ontology/units/types.ts +27 -0
- package/src/ontology/validation/index.ts +36 -0
- package/src/ontology/validation/links.ts +126 -0
- package/src/ontology/validation/normalize.ts +215 -0
- package/src/ontology/validation/properties.ts +235 -0
- package/src/ontology/validation/query.ts +300 -0
- package/src/ontology/validation/schema.ts +174 -0
- package/src/ontology/validation/telemetry.ts +53 -0
- package/src/pipelines/builders.ts +155 -0
- package/src/pipelines/errors.ts +3 -0
- package/src/pipelines/index.ts +26 -0
- package/src/pipelines/request.ts +71 -0
- package/src/pipelines/types.ts +199 -0
- package/src/predicates/builders.ts +152 -0
- package/src/predicates/evaluate.ts +107 -0
- package/src/predicates/index.ts +28 -0
- package/src/predicates/types.ts +124 -0
- package/src/predicates/validation.ts +152 -0
- package/src/projections/builders.ts +770 -0
- package/src/projections/errors.ts +3 -0
- package/src/projections/index.ts +32 -0
- package/src/projections/internal.ts +75 -0
- package/src/projections/ownership.ts +134 -0
- package/src/projections/registry.ts +269 -0
- package/src/projections/revision.ts +245 -0
- package/src/projections/types.ts +165 -0
- package/src/projections/validation.ts +531 -0
- package/src/provider-scope.ts +11 -0
- package/src/query.ts +75 -0
- package/src/queues/errors.ts +6 -0
- package/src/queues/in-memory.ts +364 -0
- package/src/queues/index.ts +23 -0
- package/src/queues/types.ts +230 -0
- package/src/rules/builders.ts +126 -0
- package/src/rules/dependencies.ts +76 -0
- package/src/rules/errors.ts +11 -0
- package/src/rules/index.ts +30 -0
- package/src/rules/internal.ts +8 -0
- package/src/rules/types.ts +113 -0
- package/src/rules/validation.ts +153 -0
- package/src/runtime/create.ts +163 -0
- package/src/runtime/errors.ts +8 -0
- package/src/runtime/index.ts +67 -0
- package/src/runtime/internal.ts +7 -0
- package/src/runtime/ontology-mutations.ts +90 -0
- package/src/runtime/scoped.ts +436 -0
- package/src/runtime/sixb.ts +822 -0
- package/src/runtime/storage-readiness.ts +91 -0
- package/src/runtime/types.ts +1401 -0
- package/src/sandboxes/errors.ts +22 -0
- package/src/sandboxes/exec.ts +102 -0
- package/src/sandboxes/index.ts +19 -0
- package/src/sandboxes/sandbox.ts +124 -0
- package/src/scheduler/errors.ts +7 -0
- package/src/scheduler/index.ts +3 -0
- package/src/scheduler/runtime.ts +174 -0
- package/src/schedules/builders.ts +257 -0
- package/src/schedules/cron.ts +166 -0
- package/src/schedules/errors.ts +7 -0
- package/src/schedules/index.ts +44 -0
- package/src/schedules/next-occurrence.ts +217 -0
- package/src/schedules/runtime.ts +241 -0
- package/src/schedules/types.ts +212 -0
- package/src/schedules/validation.ts +398 -0
- package/src/security/applications.ts +11 -0
- package/src/security/builders.ts +128 -0
- package/src/security/errors.ts +3 -0
- package/src/security/every.ts +108 -0
- package/src/security/grants.ts +215 -0
- package/src/security/index.ts +51 -0
- package/src/security/membership-policies.ts +101 -0
- package/src/security/runtime.ts +101 -0
- package/src/security/types.ts +156 -0
- package/src/security/validation.ts +430 -0
- package/src/storage/action-runs/errors.ts +13 -0
- package/src/storage/action-runs/idempotency.ts +68 -0
- package/src/storage/action-runs/in-memory.ts +420 -0
- package/src/storage/action-runs/index.ts +31 -0
- package/src/storage/action-runs/types.ts +169 -0
- package/src/storage/agents/errors.ts +22 -0
- package/src/storage/agents/in-memory.ts +498 -0
- package/src/storage/agents/index.ts +42 -0
- package/src/storage/agents/types.ts +348 -0
- package/src/storage/auth/errors.ts +40 -0
- package/src/storage/auth/in-memory/access-tokens.ts +123 -0
- package/src/storage/auth/in-memory/auth-storage.ts +559 -0
- package/src/storage/auth/in-memory/group-memberships.ts +46 -0
- package/src/storage/auth/in-memory/identities.ts +66 -0
- package/src/storage/auth/in-memory/index.ts +1 -0
- package/src/storage/auth/in-memory/invitations.ts +165 -0
- package/src/storage/auth/in-memory/magic-links.ts +98 -0
- package/src/storage/auth/in-memory/oidc-attempts.ts +75 -0
- package/src/storage/auth/in-memory/service-account-group-memberships.ts +102 -0
- package/src/storage/auth/in-memory/service-accounts.ts +80 -0
- package/src/storage/auth/in-memory/sessions.ts +177 -0
- package/src/storage/auth/in-memory/shared.ts +602 -0
- package/src/storage/auth/in-memory/users.ts +139 -0
- package/src/storage/auth/in-memory.ts +1 -0
- package/src/storage/auth/index.ts +58 -0
- package/src/storage/auth/types.ts +639 -0
- package/src/storage/errors.ts +45 -0
- package/src/storage/file-upload-sessions/errors.ts +24 -0
- package/src/storage/file-upload-sessions/in-memory.ts +161 -0
- package/src/storage/file-upload-sessions/index.ts +19 -0
- package/src/storage/file-upload-sessions/types.ts +61 -0
- package/src/storage/file-upload-sessions/utils.ts +49 -0
- package/src/storage/in-memory/index.ts +297 -0
- package/src/storage/in-memory/testing.ts +21 -0
- package/src/storage/index.ts +489 -0
- package/src/storage/migrations/check-schema.ts +49 -0
- package/src/storage/migrations/index.ts +23 -0
- package/src/storage/migrations/migrate-storage.ts +24 -0
- package/src/storage/migrations/migration-set.ts +270 -0
- package/src/storage/migrations/types.ts +129 -0
- package/src/storage/objects/in-memory.ts +1154 -0
- package/src/storage/objects/index.ts +24 -0
- package/src/storage/objects/types.ts +244 -0
- package/src/storage/ontology/commits.ts +132 -0
- package/src/storage/ontology/in-memory/commits.ts +122 -0
- package/src/storage/ontology/in-memory/index.ts +94 -0
- package/src/storage/ontology/in-memory/materializations-finalization.ts +484 -0
- package/src/storage/ontology/in-memory/materializations-state.ts +183 -0
- package/src/storage/ontology/in-memory/materializations-work.ts +62 -0
- package/src/storage/ontology/in-memory/materializations.ts +1192 -0
- package/src/storage/ontology/in-memory/outbox.ts +227 -0
- package/src/storage/ontology/in-memory/shared-state.ts +161 -0
- package/src/storage/ontology/in-memory/sources.ts +566 -0
- package/src/storage/ontology/in-memory/testing.ts +29 -0
- package/src/storage/ontology/index.ts +119 -0
- package/src/storage/ontology/materializations.ts +414 -0
- package/src/storage/ontology/outbox.ts +79 -0
- package/src/storage/ontology/provider-header-validation.ts +173 -0
- package/src/storage/ontology/provider-validation.ts +36 -0
- package/src/storage/ontology/provider-work.ts +330 -0
- package/src/storage/ontology/provider.ts +852 -0
- package/src/storage/ontology/sources.ts +195 -0
- package/src/storage/operation-scope.ts +248 -0
- package/src/storage/pagination.ts +23 -0
- package/src/storage/pipeline-runs/errors.ts +6 -0
- package/src/storage/pipeline-runs/in-memory.ts +307 -0
- package/src/storage/pipeline-runs/index.ts +19 -0
- package/src/storage/pipeline-runs/types.ts +148 -0
- package/src/storage/projection-runs/errors.ts +15 -0
- package/src/storage/projection-runs/in-memory.ts +321 -0
- package/src/storage/projection-runs/index.ts +36 -0
- package/src/storage/projection-runs/lifecycle.ts +793 -0
- package/src/storage/projection-runs/types.ts +254 -0
- package/src/storage/rules/in-memory.ts +191 -0
- package/src/storage/rules/index.ts +12 -0
- package/src/storage/rules/types.ts +80 -0
- package/src/storage/run-listing.ts +107 -0
- package/src/storage/sync-runs/errors.ts +7 -0
- package/src/storage/sync-runs/in-memory.ts +181 -0
- package/src/storage/sync-runs/index.ts +14 -0
- package/src/storage/sync-runs/types.ts +93 -0
- package/src/storage/timeseries/index.ts +7 -0
- package/src/storage/timeseries/store.ts +214 -0
- package/src/storage/timeseries/types.ts +57 -0
- package/src/storage/transaction.ts +56 -0
- package/src/storage/types.ts +299 -0
- package/src/storage/webhook-deliveries/in-memory.ts +108 -0
- package/src/storage/webhook-deliveries/index.ts +9 -0
- package/src/storage/webhook-deliveries/types.ts +41 -0
- package/src/storage/webhook-runs/errors.ts +6 -0
- package/src/storage/webhook-runs/in-memory.ts +131 -0
- package/src/storage/webhook-runs/index.ts +12 -0
- package/src/storage/webhook-runs/types.ts +69 -0
- package/src/storage/workflow-interventions/errors.ts +6 -0
- package/src/storage/workflow-interventions/in-memory.ts +192 -0
- package/src/storage/workflow-interventions/index.ts +14 -0
- package/src/storage/workflow-interventions/types.ts +100 -0
- package/src/storage/workflow-runs/errors.ts +6 -0
- package/src/storage/workflow-runs/in-memory.ts +777 -0
- package/src/storage/workflow-runs/index.ts +45 -0
- package/src/storage/workflow-runs/types.ts +344 -0
- package/src/syncs/builders.ts +101 -0
- package/src/syncs/errors.ts +3 -0
- package/src/syncs/index.ts +22 -0
- package/src/syncs/request.ts +91 -0
- package/src/syncs/types.ts +136 -0
- package/src/testing/agent-storage-contract.ts +824 -0
- package/src/testing/auth-storage-contract.ts +1932 -0
- package/src/testing/blob-storage-contract.ts +108 -0
- package/src/testing/broker-contract.ts +819 -0
- package/src/testing/effective-storage-contract.ts +182 -0
- package/src/testing/index.ts +65 -0
- package/src/testing/lake-storage-contract.ts +699 -0
- package/src/testing/materialization-failure-contract.ts +66 -0
- package/src/testing/materializer-fixture.ts +119 -0
- package/src/testing/materializer-storage-contract.ts +389 -0
- package/src/testing/object-query-contract.ts +1205 -0
- package/src/testing/ontology-contract-fixture.ts +192 -0
- package/src/testing/ontology-storage-contract.ts +922 -0
- package/src/testing/projection-run-storage-contract.ts +372 -0
- package/src/testing/queues-contract.ts +634 -0
- package/src/testing/sandboxes-contract.ts +404 -0
- package/src/webhooks/builders.ts +154 -0
- package/src/webhooks/connector.ts +19 -0
- package/src/webhooks/errors.ts +3 -0
- package/src/webhooks/index.ts +25 -0
- package/src/webhooks/registry.ts +127 -0
- package/src/webhooks/types.ts +98 -0
- package/src/webhooks/unverified.ts +82 -0
- package/src/workers/errors.ts +25 -0
- package/src/workers/index.ts +6 -0
- package/src/workers/queue-delivery.ts +309 -0
- package/src/workers/queue-worker.ts +260 -0
- package/src/workers/worker.ts +87 -0
- package/src/workflows/builders.ts +471 -0
- package/src/workflows/errors.ts +13 -0
- package/src/workflows/index.ts +94 -0
- package/src/workflows/request.ts +161 -0
- package/src/workflows/runtime.ts +68 -0
- package/src/workflows/snapshot.ts +383 -0
- package/src/workflows/types.ts +781 -0
- package/src/workflows/validation.ts +572 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/testing/agent-storage-contract.ts", "../src/testing/auth-storage-contract.ts", "../src/testing/blob-storage-contract.ts", "../src/testing/broker-contract.ts", "../src/testing/effective-storage-contract.ts", "../src/testing/materializer-fixture.ts", "../src/testing/lake-storage-contract.ts", "../src/testing/materialization-failure-contract.ts", "../src/testing/ontology-contract-fixture.ts", "../src/testing/materializer-storage-contract.ts", "../src/testing/object-query-contract.ts", "../src/testing/ontology-storage-contract.ts", "../src/testing/projection-run-storage-contract.ts", "../src/testing/queues-contract.ts", "../src/testing/sandboxes-contract.ts"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { describe, expect, test } from \"bun:test\"\nimport { AGENT_MESSAGE_CONTENT_VERSION } from \"../agents/message\"\nimport type { Principal } from \"../auth\"\nimport {\n type AgentRunExecution,\n type AgentStorage,\n AgentStorageError,\n type AgentStorageErrorCode,\n type CreateAgentRunInput,\n type CreateAgentThreadInput,\n type StartAgentRunInput,\n} from \"../storage/agents\"\n\nexport interface AgentStorageContractSuiteOptions<TStorage extends AgentStorage = AgentStorage> {\n /** Factory that produces a fresh `AgentStorage` instance for each test case. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"project-a\"\nconst otherProjectId = \"project-b\"\nconst owner: Principal = { type: \"user\", id: \"usr_1\" }\nconst serviceAccount: Extract<Principal, { readonly type: \"serviceAccount\" }> = {\n type: \"serviceAccount\",\n id: \"svc_agent_sales\",\n}\n\nfunction at(value: string): Date {\n return new Date(value)\n}\n\nasync function expectAgentError(\n promise: Promise<unknown>,\n code: AgentStorageErrorCode\n): Promise<void> {\n await expect(promise).rejects.toBeInstanceOf(AgentStorageError)\n await expect(promise).rejects.toMatchObject({ code })\n}\n\nfunction threadInput(overrides: Partial<CreateAgentThreadInput> = {}): CreateAgentThreadInput {\n return {\n id: \"thr_1\",\n projectId,\n agentId: \"sales\",\n ownerPrincipal: owner,\n createdAt: at(\"2026-06-23T10:00:00.000Z\"),\n ...overrides,\n }\n}\n\nfunction execution(\n token: string,\n queueLeaseExpiresAt = at(\"2026-06-23T10:05:00.000Z\")\n): AgentRunExecution {\n return { token, queueLeaseExpiresAt }\n}\n\ntype TestRunInput = CreateAgentRunInput &\n Omit<StartAgentRunInput, \"id\" | \"projectId\"> & {\n readonly id: string\n readonly projectId: string\n }\n\nfunction runInput(overrides: Partial<TestRunInput> = {}): TestRunInput {\n return {\n id: \"run_1\",\n projectId,\n threadId: \"thr_1\",\n agentId: \"sales\",\n triggerMessageId: \"msg_user_1\",\n requestedByPrincipal: owner,\n execution: execution(\"exec_1\"),\n createdAt: at(\"2026-06-23T10:00:10.000Z\"),\n ...overrides,\n }\n}\n\nasync function createAndStartRun(\n storage: AgentStorage,\n input: TestRunInput\n): Promise<Awaited<ReturnType<AgentStorage[\"runs\"][\"start\"]>>> {\n await storage.runs.create(input)\n return storage.runs.start({\n id: input.id,\n projectId: input.projectId,\n executionPrincipal: input.executionPrincipal,\n modelId: input.modelId,\n execution: input.execution,\n startedAt: input.startedAt,\n })\n}\n\n/**\n * Runs the shared `AgentStorage` contract against any storage implementation.\n *\n * This is the storage-independent specification for Sixb agent persistence: thread lifecycle and\n * project isolation, single-flight run reservation, execution reclaim, run finalization with\n * execution metadata, and message append with thread-stats bookkeeping.\n */\nexport function runAgentStorageContractSuite<TStorage extends AgentStorage>(\n label: string,\n options: AgentStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await body(storage)\n } finally {\n await options.teardown?.(storage)\n }\n }\n\n describe(label, () => {\n // ── threads ───────────────────────────────────────────────────────────────────────────────\n\n test(\"creates threads, isolates projects, and rejects duplicate ids\", async () => {\n await withStorage(async (storage) => {\n const thread = await storage.threads.create(threadInput({ title: \"Q3 pipeline\" }))\n expect(thread).toMatchObject({\n id: \"thr_1\",\n agentId: \"sales\",\n title: \"Q3 pipeline\",\n status: \"active\",\n activeRunId: null,\n messageCount: 0,\n })\n expect(thread.ownerPrincipal).toEqual(owner)\n\n await expectAgentError(storage.threads.create(threadInput()), \"duplicate_id\")\n\n // Same id under a different project is allowed and isolated.\n await expect(\n storage.threads.create(threadInput({ projectId: otherProjectId }))\n ).resolves.toMatchObject({ projectId: otherProjectId })\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n title: \"Q3 pipeline\",\n })\n await expect(\n storage.threads.getById({ projectId: \"nope\", id: \"thr_1\" })\n ).resolves.toBeNull()\n })\n })\n\n test(\"lists threads with filters, ordering, and pagination\", async () => {\n await withStorage(async (storage) => {\n await storage.threads.create(\n threadInput({ id: \"thr_a\", agentId: \"sales\", createdAt: at(\"2026-06-23T10:00:00.000Z\") })\n )\n await storage.threads.create(\n threadInput({\n id: \"thr_b\",\n agentId: \"support\",\n createdAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n )\n await storage.threads.create(\n threadInput({\n id: \"thr_c\",\n agentId: \"sales\",\n status: \"archived\",\n createdAt: at(\"2026-06-23T10:02:00.000Z\"),\n })\n )\n await storage.threads.create(threadInput({ id: \"thr_other\", projectId: otherProjectId }))\n\n const all = await storage.threads.list({ projectId, order: \"asc\" })\n expect(all.threads.map((thread) => thread.id)).toEqual([\"thr_a\", \"thr_b\", \"thr_c\"])\n expect(all.total).toBe(3)\n expect(all.hasMore).toBe(false)\n\n const sales = await storage.threads.list({ projectId, agentId: \"sales\", order: \"asc\" })\n expect(sales.threads.map((thread) => thread.id)).toEqual([\"thr_a\", \"thr_c\"])\n\n const visibleAgents = await storage.threads.list({\n projectId,\n agentIds: [\"support\"],\n order: \"asc\",\n })\n expect(visibleAgents.threads.map((thread) => thread.id)).toEqual([\"thr_b\"])\n\n const salesVisibleAgents = await storage.threads.list({\n projectId,\n agentId: \"sales\",\n agentIds: [\"support\"],\n order: \"asc\",\n })\n expect(salesVisibleAgents.threads).toEqual([])\n expect(salesVisibleAgents.total).toBe(0)\n\n const active = await storage.threads.list({ projectId, statuses: [\"active\"], order: \"asc\" })\n expect(active.threads.map((thread) => thread.id)).toEqual([\"thr_a\", \"thr_b\"])\n\n const firstPage = await storage.threads.list({ projectId, order: \"asc\", limit: 2 })\n expect(firstPage.threads.map((thread) => thread.id)).toEqual([\"thr_a\", \"thr_b\"])\n expect(firstPage.hasMore).toBe(true)\n expect(firstPage.total).toBe(3)\n\n const secondPage = await storage.threads.list({\n projectId,\n order: \"asc\",\n limit: 2,\n offset: 2,\n })\n expect(secondPage.threads.map((thread) => thread.id)).toEqual([\"thr_c\"])\n expect(secondPage.hasMore).toBe(false)\n })\n })\n\n // ── durable queued runs ────────────────────────────────────────────────────────────────────\n\n test(\"creates a queued run before execution and claims the thread\", async () => {\n await withStorage(async (storage) => {\n await storage.threads.create(threadInput())\n\n const queued = await storage.runs.create(runInput({ id: \"run_1\" }))\n expect(queued).toMatchObject({ status: \"queued\", attempt: 0, threadId: \"thr_1\" })\n expect(queued.execution).toBeUndefined()\n expect(queued.startedAt).toBeUndefined()\n await expect(storage.runs.list({ projectId, statuses: [\"queued\"] })).resolves.toMatchObject(\n {\n runs: [{ id: \"run_1\", status: \"queued\" }],\n total: 1,\n }\n )\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n activeRunId: \"run_1\",\n })\n\n const started = await storage.runs.start({\n projectId,\n id: \"run_1\",\n executionPrincipal: serviceAccount,\n modelId: \"test-model\",\n execution: execution(\"exec_1\"),\n startedAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n expect(started).toMatchObject({ status: \"running\", attempt: 1, modelId: \"test-model\" })\n expect(started.execution).toEqual(execution(\"exec_1\"))\n expect(started.executionPrincipal).toEqual(serviceAccount)\n expect(started.startedAt?.toISOString()).toBe(\"2026-06-23T10:01:00.000Z\")\n })\n })\n\n test(\"finishes a queued run and releases the thread\", async () => {\n await withStorage(async (storage) => {\n await storage.threads.create(threadInput())\n await storage.runs.create(runInput({ id: \"run_1\" }))\n\n const cancelled = await storage.runs.finishQueued({\n projectId,\n id: \"run_1\",\n status: \"cancelled\",\n error: \"Cancelled before execution\",\n completedAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n expect(cancelled).toMatchObject({\n status: \"cancelled\",\n attempt: 0,\n error: \"Cancelled before execution\",\n })\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n activeRunId: null,\n })\n await expectAgentError(\n storage.runs.start({\n projectId,\n id: \"run_1\",\n execution: execution(\"exec_1\"),\n }),\n \"invalid_state\"\n )\n\n await storage.runs.create(runInput({ id: \"run_2\" }))\n await expect(\n storage.runs.finishQueued({\n projectId,\n id: \"run_2\",\n status: \"failed\",\n error: \"Agent is unavailable\",\n })\n ).resolves.toMatchObject({ status: \"failed\", attempt: 0, error: \"Agent is unavailable\" })\n })\n })\n\n // ── single-flight execution ─────────────────────────────────────────────────────────────────\n\n test(\"allows a single active run per thread\", async () => {\n await withStorage(async (storage) => {\n await storage.threads.create(threadInput())\n\n const run = await createAndStartRun(storage, runInput({ id: \"run_1\" }))\n expect(run).toMatchObject({ status: \"running\", attempt: 1, threadId: \"thr_1\" })\n expect(run.requestedByPrincipal).toEqual(owner)\n expect(run.execution?.token).toBe(\"exec_1\")\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n activeRunId: \"run_1\",\n })\n\n await expectAgentError(\n createAndStartRun(storage, runInput({ id: \"run_2\", execution: execution(\"exec_2\") })),\n \"active_run_exists\"\n )\n\n // Reservation against an unknown thread / duplicate run id.\n await expectAgentError(\n createAndStartRun(storage, runInput({ id: \"run_x\", threadId: \"ghost\" })),\n \"thread_not_found\"\n )\n })\n })\n\n test(\"never lets two concurrent queued runs both claim one thread\", async () => {\n await withStorage(async (storage) => {\n await storage.threads.create(threadInput())\n\n const results = await Promise.allSettled([\n createAndStartRun(storage, runInput({ id: \"run_a\", execution: execution(\"exec_a\") })),\n createAndStartRun(storage, runInput({ id: \"run_b\", execution: execution(\"exec_b\") })),\n ])\n const fulfilled = results.filter((result) => result.status === \"fulfilled\")\n const rejected = results.filter(\n (result): result is PromiseRejectedResult => result.status === \"rejected\"\n )\n expect(fulfilled).toHaveLength(1)\n expect(rejected).toHaveLength(1)\n expect(rejected[0].reason).toBeInstanceOf(AgentStorageError)\n expect(rejected[0].reason.code).toBe(\"active_run_exists\")\n })\n })\n\n // ── execution reclaim ───────────────────────────────────────────────────────────────────────\n\n test(\"reclaim rotates the execution token and bumps the attempt\", async () => {\n await withStorage(async (storage) => {\n await storage.threads.create(threadInput())\n await createAndStartRun(storage, runInput({ id: \"run_1\" }))\n\n const reclaimed = await storage.runs.reclaim({\n projectId,\n id: \"run_1\",\n execution: execution(\"exec_2\"),\n })\n expect(reclaimed).toMatchObject({ status: \"running\", attempt: 2 })\n expect(reclaimed.execution?.token).toBe(\"exec_2\")\n\n await expectAgentError(\n storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"succeeded\",\n }),\n \"execution_lost\"\n )\n })\n })\n\n test(\"projects confirmed queue ownership monotonically and fences stale executions\", async () => {\n await withStorage(async (storage) => {\n await storage.threads.create(threadInput())\n await createAndStartRun(\n storage,\n runInput({\n id: \"run_1\",\n execution: execution(\"exec_1\", at(\"2026-06-23T10:02:00.000Z\")),\n })\n )\n\n const confirmed = await storage.runs.confirmExecutionOwnership({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n queueLeaseExpiresAt: at(\"2026-06-23T10:03:00.000Z\"),\n })\n expect(confirmed.execution?.queueLeaseExpiresAt.toISOString()).toBe(\n \"2026-06-23T10:03:00.000Z\"\n )\n\n const older = await storage.runs.confirmExecutionOwnership({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n queueLeaseExpiresAt: at(\"2026-06-23T10:02:30.000Z\"),\n })\n expect(older.execution?.queueLeaseExpiresAt.toISOString()).toBe(\"2026-06-23T10:03:00.000Z\")\n\n await storage.runs.reclaim({\n projectId,\n id: \"run_1\",\n execution: execution(\"exec_2\", at(\"2026-06-23T10:04:00.000Z\")),\n })\n await expectAgentError(\n storage.runs.confirmExecutionOwnership({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n queueLeaseExpiresAt: at(\"2026-06-23T10:05:00.000Z\"),\n }),\n \"execution_lost\"\n )\n })\n })\n\n test(\"does not alias stored run records to callers\", async () => {\n await withStorage(async (storage) => {\n await storage.threads.create(threadInput())\n const run = await createAndStartRun(storage, runInput({ id: \"run_1\" }))\n\n const mutableExecution = run.execution as\n | { token: string; queueLeaseExpiresAt: Date }\n | undefined\n if (mutableExecution) {\n mutableExecution.token = \"mutated\"\n mutableExecution.queueLeaseExpiresAt.setTime(0)\n }\n const reread = await storage.runs.getById({ projectId, id: \"run_1\" })\n expect(reread?.execution?.token).toBe(\"exec_1\")\n })\n })\n\n // ── finalization ────────────────────────────────────────────────────────────────────────────\n\n test(\"releasing a run only clears its own thread's active pointer\", async () => {\n await withStorage(async (storage) => {\n await storage.threads.create(threadInput({ id: \"thr_1\" }))\n await storage.threads.create(threadInput({ id: \"thr_2\" }))\n await createAndStartRun(storage, runInput({ id: \"run_1\", threadId: \"thr_1\" }))\n await createAndStartRun(\n storage,\n runInput({\n id: \"run_2\",\n threadId: \"thr_2\",\n execution: execution(\"exec_2\"),\n })\n )\n\n await storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"succeeded\",\n })\n\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n activeRunId: null,\n })\n // thr_2's pointer is untouched — the release is scoped to the run's own thread + matching id.\n await expect(storage.threads.getById({ projectId, id: \"thr_2\" })).resolves.toMatchObject({\n activeRunId: \"run_2\",\n })\n })\n })\n\n test(\"finishes a run, records execution metadata, and releases the thread\", async () => {\n await withStorage(async (storage) => {\n await storage.threads.create(threadInput())\n await createAndStartRun(storage, runInput({ id: \"run_1\" }))\n\n const finished = await storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"succeeded\",\n modelId: \"claude-haiku-4-5\",\n finishReason: \"stop\",\n usage: { inputTokens: 120, outputTokens: 80, totalTokens: 200 },\n diagnostics: [\n {\n code: \"output_file_too_large\",\n severity: \"warning\",\n scope: \"output\",\n path: \"reports/full.csv\",\n message: \"This generated file was skipped.\",\n },\n ],\n completedAt: at(\"2026-06-23T10:07:00.000Z\"),\n })\n expect(finished).toMatchObject({\n status: \"succeeded\",\n modelId: \"claude-haiku-4-5\",\n finishReason: \"stop\",\n })\n expect(finished.usage).toEqual({ inputTokens: 120, outputTokens: 80, totalTokens: 200 })\n expect(finished.diagnostics).toEqual([\n {\n code: \"output_file_too_large\",\n severity: \"warning\",\n scope: \"output\",\n path: \"reports/full.csv\",\n message: \"This generated file was skipped.\",\n },\n ])\n await expect(\n storage.runs.getByIds({ projectId, ids: [\"run_1\", \"missing\", \"run_1\"] })\n ).resolves.toEqual([finished])\n expect(finished.execution).toBeUndefined()\n expect(finished.completedAt?.toISOString()).toBe(\"2026-06-23T10:07:00.000Z\")\n\n // The thread is released → a new queued run can be created and started.\n await expect(storage.threads.getById({ projectId, id: \"thr_1\" })).resolves.toMatchObject({\n activeRunId: null,\n })\n await expect(\n createAndStartRun(storage, runInput({ id: \"run_2\", execution: execution(\"exec_2\") }))\n ).resolves.toMatchObject({ status: \"running\" })\n })\n })\n\n test(\"records failure detail and rejects a non-running run or stale execution\", async () => {\n await withStorage(async (storage) => {\n await storage.threads.create(threadInput())\n await createAndStartRun(storage, runInput({ id: \"run_1\" }))\n\n await expectAgentError(\n storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"wrong\",\n status: \"failed\",\n error: \"boom\",\n }),\n \"execution_lost\"\n )\n\n const failed = await storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"failed\",\n error: \"ProviderError: boom\",\n completedAt: at(\"2026-06-23T10:08:00.000Z\"),\n })\n expect(failed.status).toBe(\"failed\")\n expect(failed.error).toBe(\"ProviderError: boom\")\n\n // Already terminal → cannot finish again.\n await expectAgentError(\n storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"succeeded\",\n }),\n \"invalid_state\"\n )\n })\n })\n\n test(\"lists runs with thread, status, and ordering filters\", async () => {\n await withStorage(async (storage) => {\n await storage.threads.create(threadInput({ id: \"thr_1\" }))\n await storage.threads.create(threadInput({ id: \"thr_2\" }))\n\n await createAndStartRun(\n storage,\n runInput({\n id: \"run_1\",\n threadId: \"thr_1\",\n createdAt: at(\"2026-06-23T10:00:00.000Z\"),\n })\n )\n await storage.runs.finish({\n projectId,\n id: \"run_1\",\n executionToken: \"exec_1\",\n status: \"succeeded\",\n })\n await createAndStartRun(\n storage,\n runInput({\n id: \"run_2\",\n threadId: \"thr_1\",\n execution: execution(\"exec_2\"),\n createdAt: at(\"2026-06-23T10:30:00.000Z\"),\n })\n )\n await createAndStartRun(\n storage,\n runInput({\n id: \"run_3\",\n threadId: \"thr_2\",\n execution: execution(\"exec_3\"),\n createdAt: at(\"2026-06-23T10:45:00.000Z\"),\n })\n )\n\n const forThread1 = await storage.runs.list({ projectId, threadId: \"thr_1\", order: \"asc\" })\n expect(forThread1.runs.map((run) => run.id)).toEqual([\"run_1\", \"run_2\"])\n\n const running = await storage.runs.list({ projectId, statuses: [\"running\"], order: \"asc\" })\n expect(running.runs.map((run) => run.id)).toEqual([\"run_2\", \"run_3\"])\n\n const all = await storage.runs.list({ projectId, order: \"desc\" })\n expect(all.runs.map((run) => run.id)).toEqual([\"run_3\", \"run_2\", \"run_1\"])\n })\n })\n\n test(\"filters queued runs by their effective created timestamp\", async () => {\n await withStorage(async (storage) => {\n await storage.threads.create(threadInput({ id: \"thr_before\" }))\n await storage.threads.create(threadInput({ id: \"thr_inside\" }))\n await storage.threads.create(threadInput({ id: \"thr_after\" }))\n\n await storage.runs.create(\n runInput({\n id: \"run_before\",\n threadId: \"thr_before\",\n createdAt: at(\"2026-06-23T10:00:00.000Z\"),\n })\n )\n await storage.runs.create(\n runInput({\n id: \"run_inside\",\n threadId: \"thr_inside\",\n createdAt: at(\"2026-06-23T11:00:00.000Z\"),\n })\n )\n await storage.runs.create(\n runInput({\n id: \"run_after\",\n threadId: \"thr_after\",\n createdAt: at(\"2026-06-23T12:00:00.000Z\"),\n })\n )\n\n const result = await storage.runs.list({\n projectId,\n statuses: [\"queued\"],\n startedAfter: at(\"2026-06-23T10:30:00.000Z\"),\n startedBefore: at(\"2026-06-23T11:30:00.000Z\"),\n order: \"asc\",\n })\n expect(result.runs.map((run) => run.id)).toEqual([\"run_inside\"])\n expect(result.total).toBe(1)\n expect(result.hasMore).toBe(false)\n })\n })\n\n // ── messages ──────────────────────────────────────────────────────────────────────────────\n\n test(\"appends messages, assigns seq, and bumps thread stats\", async () => {\n await withStorage(async (storage) => {\n await storage.threads.create(threadInput())\n\n const userMessage = await storage.messages.append({\n id: \"msg_user_1\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"Hello agent\" }],\n authorPrincipal: owner,\n createdAt: at(\"2026-06-23T10:00:30.000Z\"),\n })\n expect(userMessage).toMatchObject({\n seq: 1,\n role: \"user\",\n runId: null,\n contentVersion: AGENT_MESSAGE_CONTENT_VERSION,\n })\n expect(userMessage.authorPrincipal).toEqual(owner)\n\n const run = await createAndStartRun(\n storage,\n runInput({\n id: \"run_1\",\n executionPrincipal: serviceAccount,\n })\n )\n expect(run.executionPrincipal).toEqual(serviceAccount)\n const assistantMessage = await storage.messages.append({\n id: \"msg_asst_1\",\n projectId,\n threadId: \"thr_1\",\n runId: \"run_1\",\n role: \"assistant\",\n authorPrincipal: serviceAccount,\n parts: [\n { type: \"reasoning\", text: \"thinking about it\" },\n {\n type: \"tool-call\",\n toolCallId: \"call_1\",\n toolName: \"bash\",\n input: { cmd: \"ls\" },\n state: \"output-available\",\n output: \"file.txt\",\n },\n { type: \"text\", text: \"Here is the result\" },\n ],\n createdAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n expect(assistantMessage).toMatchObject({ seq: 2, role: \"assistant\", runId: \"run_1\" })\n expect(assistantMessage.authorPrincipal).toEqual(serviceAccount)\n\n const thread = await storage.threads.getById({ projectId, id: \"thr_1\" })\n expect(thread).toMatchObject({ messageCount: 2 })\n expect(thread?.lastMessageAt?.toISOString()).toBe(\"2026-06-23T10:01:00.000Z\")\n\n // The message's `parts` are the canonical content and round-trip verbatim through storage.\n const stored = await storage.messages.getById({ projectId, id: \"msg_asst_1\" })\n expect(stored?.seq).toBe(2)\n expect(stored?.parts).toEqual([\n { type: \"reasoning\", text: \"thinking about it\" },\n {\n type: \"tool-call\",\n toolCallId: \"call_1\",\n toolName: \"bash\",\n input: { cmd: \"ls\" },\n state: \"output-available\",\n output: \"file.txt\",\n },\n { type: \"text\", text: \"Here is the result\" },\n ])\n })\n })\n\n test(\"lists messages with role filter, ordering, and pagination\", async () => {\n await withStorage(async (storage) => {\n await storage.threads.create(threadInput())\n await storage.messages.append({\n id: \"m1\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"one\" }],\n createdAt: at(\"2026-06-23T10:00:00.000Z\"),\n })\n await createAndStartRun(storage, runInput({ id: \"run_1\" }))\n await storage.messages.append({\n id: \"m2\",\n projectId,\n threadId: \"thr_1\",\n runId: \"run_1\",\n role: \"assistant\",\n parts: [{ type: \"text\", text: \"two\" }],\n createdAt: at(\"2026-06-23T10:01:00.000Z\"),\n })\n await storage.messages.append({\n id: \"m3\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"three\" }],\n createdAt: at(\"2026-06-23T10:02:00.000Z\"),\n })\n\n const asc = await storage.messages.list({ projectId, threadId: \"thr_1\", order: \"asc\" })\n expect(asc.messages.map((message) => message.id)).toEqual([\"m1\", \"m2\", \"m3\"])\n expect(asc.total).toBe(3)\n\n const desc = await storage.messages.list({ projectId, threadId: \"thr_1\", order: \"desc\" })\n expect(desc.messages.map((message) => message.id)).toEqual([\"m3\", \"m2\", \"m1\"])\n\n const users = await storage.messages.list({\n projectId,\n threadId: \"thr_1\",\n roles: [\"user\"],\n order: \"asc\",\n })\n expect(users.messages.map((message) => message.id)).toEqual([\"m1\", \"m3\"])\n\n const firstPage = await storage.messages.list({\n projectId,\n threadId: \"thr_1\",\n order: \"asc\",\n limit: 2,\n })\n expect(firstPage.messages.map((message) => message.id)).toEqual([\"m1\", \"m2\"])\n expect(firstPage.hasMore).toBe(true)\n })\n })\n\n test(\"rejects appends to missing threads, duplicate messages, and unknown runs\", async () => {\n await withStorage(async (storage) => {\n await expectAgentError(\n storage.messages.append({\n id: \"m1\",\n projectId,\n threadId: \"ghost\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"hi\" }],\n }),\n \"thread_not_found\"\n )\n\n await storage.threads.create(threadInput())\n await storage.messages.append({\n id: \"m1\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"hi\" }],\n })\n await expectAgentError(\n storage.messages.append({\n id: \"m1\",\n projectId,\n threadId: \"thr_1\",\n runId: null,\n role: \"user\",\n parts: [{ type: \"text\", text: \"dup\" }],\n }),\n \"duplicate_id\"\n )\n await expectAgentError(\n storage.messages.append({\n id: \"m2\",\n projectId,\n threadId: \"thr_1\",\n runId: \"ghost-run\",\n role: \"assistant\",\n parts: [{ type: \"text\", text: \"hi\" }],\n }),\n \"run_not_found\"\n )\n })\n })\n })\n}\n",
|
|
6
|
+
"import { describe, expect, test } from \"bun:test\"\nimport type {\n AuthStorage,\n AuthStorageErrorCode,\n CompleteAuthSessionInput,\n UserRecord,\n} from \"../storage/auth\"\nimport { AuthStorageError } from \"../storage/auth\"\n\nexport interface AuthStorageContractSuiteOptions<TStorage extends AuthStorage = AuthStorage> {\n /** Factory that produces a fresh `AuthStorage` instance for each test case. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"project-a\"\nconst otherProjectId = \"project-b\"\n\nfunction at(value: string): Date {\n return new Date(value)\n}\n\nfunction sessionInput(\n id: string,\n tokenHash = `${id}-hash`,\n audience: CompleteAuthSessionInput[\"audience\"] = \"atlas\",\n absoluteExpiresAt?: Date\n): CompleteAuthSessionInput {\n return {\n id,\n audience,\n tokenHash,\n createdAt: at(\"2026-05-14T10:10:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:10:00.000Z\"),\n absoluteExpiresAt,\n }\n}\n\nasync function expectAuthError(\n promise: Promise<unknown>,\n code: AuthStorageErrorCode\n): Promise<void> {\n await expect(promise).rejects.toBeInstanceOf(AuthStorageError)\n await expect(promise).rejects.toMatchObject({ code })\n}\n\nasync function createUser(\n storage: AuthStorage,\n input: {\n readonly id?: string\n readonly email?: string\n readonly status?: UserRecord[\"status\"]\n readonly projectId?: string\n } = {}\n): Promise<UserRecord> {\n return storage.users.create({\n id: input.id ?? \"usr_1\",\n projectId: input.projectId ?? projectId,\n email: input.email ?? \"ava@acme.com\",\n status: input.status,\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n}\n\n/**\n * Runs the shared `AuthStorage` contract against any storage implementation.\n *\n * The suite is the storage-independent specification for Sixb auth state: users, identities,\n * sessions, invitations, group memberships, service accounts, access tokens,\n * magic links, OIDC attempts, and atomic sign-in completion.\n */\nexport function runAuthStorageContractSuite<TStorage extends AuthStorage>(\n label: string,\n options: AuthStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await body(storage)\n } finally {\n await options.teardown?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"creates users with normalized email and isolates projects\", async () => {\n await withStorage(async (storage) => {\n const user = await createUser(storage, {\n email: \" Ava@Acme.COM \",\n })\n\n expect(user.email).toBe(\"ava@acme.com\")\n await expectAuthError(\n storage.users.create({\n id: \"usr_duplicate\",\n projectId,\n email: \"ava@acme.com\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n }),\n \"duplicate_user\"\n )\n\n await expect(\n storage.users.create({\n id: \"usr_other\",\n projectId: otherProjectId,\n email: \"ava@acme.com\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n ).resolves.toMatchObject({\n projectId: otherProjectId,\n email: \"ava@acme.com\",\n })\n\n const page = await storage.users.list({ projectId, statuses: [\"active\"] })\n expect(page.users.map((row) => row.id)).toEqual([\"usr_1\"])\n })\n })\n\n test(\"upserts identities without mutating canonical user email\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { id: \"usr_oidc\", email: \"ava@acme.com\" })\n\n await storage.identities.upsert({\n projectId,\n strategyId: \"okta\",\n subject: \"00u1\",\n userId: \"usr_oidc\",\n claims: { email: \"ava@acme.com\" },\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n const updated = await storage.identities.upsert({\n projectId,\n strategyId: \"okta\",\n subject: \"00u1\",\n userId: \"usr_oidc\",\n claims: { email: \"ava.renamed@acme.com\" },\n updatedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n\n expect(updated.claims).toEqual({ email: \"ava.renamed@acme.com\" })\n await expect(storage.users.getById({ projectId, id: \"usr_oidc\" })).resolves.toMatchObject({\n email: \"ava@acme.com\",\n })\n })\n })\n\n test(\"keeps multiple concurrent sessions per user and never extends expiry on touch\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n const first = await storage.sessions.create({\n id: \"ses_1\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-1\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n const second = await storage.sessions.create({\n id: \"ses_2\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-2\",\n createdAt: at(\"2026-05-14T10:05:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:05:00.000Z\"),\n })\n\n // Creating a second session in the same audience no longer revokes the\n // first: both stay active and authenticate independently.\n expect(first.revokedAt).toBeUndefined()\n expect(second.revokedAt).toBeUndefined()\n const storedFirst = await storage.sessions.getById({ projectId, id: \"ses_1\" })\n expect(storedFirst?.revokedAt).toBeUndefined()\n\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_1\",\n audience: \"atlas\",\n tokenHash: \"hash-1\",\n now: at(\"2026-05-14T10:06:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"ses_1\" })\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_2\",\n audience: \"atlas\",\n tokenHash: \"hash-2\",\n now: at(\"2026-05-14T10:06:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"ses_2\" })\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_2\",\n audience: \"atlas\",\n tokenHash: \"wrong\",\n now: at(\"2026-05-14T10:06:00.000Z\"),\n })\n ).resolves.toBeNull()\n\n // getActiveByUserId returns the most recently created active session.\n await expect(\n storage.sessions.getActiveByUserId({\n projectId,\n userId: \"usr_1\",\n audience: \"atlas\",\n now: at(\"2026-05-14T10:06:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"ses_2\" })\n\n const touched = await storage.sessions.touch({\n projectId,\n id: second.id,\n lastSeenAt: at(\"2026-05-15T10:00:00.000Z\"),\n })\n expect(touched.lastSeenAt?.toISOString()).toBe(\"2026-05-15T10:00:00.000Z\")\n expect(touched.expiresAt.toISOString()).toBe(\"2026-05-21T10:05:00.000Z\")\n\n // A session in a different audience coexists and is cookie-scoped.\n const appSession = await storage.sessions.create({\n id: \"ses_app\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"app\",\n tokenHash: \"hash-app\",\n createdAt: at(\"2026-05-14T10:06:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:06:00.000Z\"),\n })\n expect(appSession.revokedAt).toBeUndefined()\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_app\",\n audience: \"atlas\",\n tokenHash: \"hash-app\",\n now: at(\"2026-05-14T10:07:00.000Z\"),\n })\n ).resolves.toBeNull()\n\n // Revoking a single session leaves the user's other sessions active.\n await storage.sessions.revoke({\n projectId,\n id: \"ses_1\",\n revokedAt: at(\"2026-05-14T10:08:00.000Z\"),\n })\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_1\",\n audience: \"atlas\",\n tokenHash: \"hash-1\",\n now: at(\"2026-05-14T10:09:00.000Z\"),\n })\n ).resolves.toBeNull()\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: \"ses_2\",\n audience: \"atlas\",\n tokenHash: \"hash-2\",\n now: at(\"2026-05-14T10:09:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"ses_2\" })\n\n // \"Sign out everywhere\": revokeActiveForUser clears every remaining\n // active session for the user, across audiences.\n const revoked = await storage.sessions.revokeActiveForUser({\n projectId,\n userId: \"usr_1\",\n revokedAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n expect(revoked.map((entry) => entry.id).sort()).toEqual([\"ses_2\", \"ses_app\"])\n await expect(\n storage.sessions.getActiveByUserId({\n projectId,\n userId: \"usr_1\",\n audience: \"atlas\",\n now: at(\"2026-05-14T10:11:00.000Z\"),\n })\n ).resolves.toBeNull()\n })\n })\n\n test(\"persists and enforces an optional absolute session deadline\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n const capped = await storage.sessions.create({\n id: \"ses_capped\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-capped\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n absoluteExpiresAt: at(\"2026-05-16T10:00:00.000Z\"),\n })\n const uncapped = await storage.sessions.create({\n id: \"ses-uncapped\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"app\",\n tokenHash: \"hash-uncapped\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:01:00.000Z\"),\n })\n\n expect(capped.absoluteExpiresAt?.toISOString()).toBe(\"2026-05-16T10:00:00.000Z\")\n expect(uncapped.absoluteExpiresAt).toBeUndefined()\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: capped.id,\n audience: \"atlas\",\n tokenHash: \"hash-capped\",\n now: at(\"2026-05-16T09:59:59.999Z\"),\n })\n ).resolves.toMatchObject({ id: capped.id })\n await expect(\n storage.sessions.findValidByTokenHash({\n projectId,\n id: capped.id,\n audience: \"atlas\",\n tokenHash: \"hash-capped\",\n now: at(\"2026-05-16T10:00:00.000Z\"),\n })\n ).resolves.toBeNull()\n const active = await storage.sessions.listActiveByUserId({\n projectId,\n userId: \"usr_1\",\n now: at(\"2026-05-16T10:00:00.000Z\"),\n })\n expect(active.map((session) => session.id)).toEqual([uncapped.id])\n await expect(\n storage.sessions.getActiveByUserId({\n projectId,\n userId: \"usr_1\",\n audience: \"atlas\",\n now: at(\"2026-05-16T10:00:00.000Z\"),\n })\n ).resolves.toBeNull()\n await expect(\n storage.sessions.revokeActiveForUser({\n projectId,\n userId: \"usr_1\",\n audience: \"atlas\",\n revokedAt: at(\"2026-05-16T10:00:00.000Z\"),\n })\n ).resolves.toEqual([])\n })\n })\n\n test(\"atomically renews valid sessions without exceeding the absolute deadline\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n await storage.sessions.create({\n id: \"ses_renew\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-renew\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-15T10:00:00.000Z\"),\n absoluteExpiresAt: at(\"2026-05-20T10:00:00.000Z\"),\n })\n\n const renewed = await storage.sessions.renewIfValid({\n projectId,\n id: \"ses_renew\",\n audience: \"atlas\",\n tokenHash: \"hash-renew\",\n now: at(\"2026-05-14T11:00:00.000Z\"),\n expiresAt: at(\"2026-05-25T10:00:00.000Z\"),\n })\n expect(renewed?.expiresAt.toISOString()).toBe(\"2026-05-20T10:00:00.000Z\")\n expect(renewed?.lastSeenAt?.toISOString()).toBe(\"2026-05-14T11:00:00.000Z\")\n\n const monotonic = await storage.sessions.renewIfValid({\n projectId,\n id: \"ses_renew\",\n audience: \"atlas\",\n tokenHash: \"hash-renew\",\n now: at(\"2026-05-14T12:00:00.000Z\"),\n expiresAt: at(\"2026-05-18T10:00:00.000Z\"),\n })\n expect(monotonic?.expiresAt.toISOString()).toBe(\"2026-05-20T10:00:00.000Z\")\n\n await expect(\n storage.sessions.renewIfValid({\n projectId,\n id: \"ses_renew\",\n audience: \"atlas\",\n tokenHash: \"wrong-hash\",\n now: at(\"2026-05-14T13:00:00.000Z\"),\n expiresAt: at(\"2026-05-19T10:00:00.000Z\"),\n })\n ).resolves.toBeNull()\n await expect(\n storage.sessions.renewIfValid({\n projectId,\n id: \"ses_renew\",\n audience: \"atlas\",\n tokenHash: \"hash-renew\",\n now: at(\"2026-05-20T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n ).resolves.toBeNull()\n\n await storage.sessions.create({\n id: \"ses_concurrent\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-concurrent\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-15T10:00:00.000Z\"),\n })\n await Promise.all([\n storage.sessions.renewIfValid({\n projectId,\n id: \"ses_concurrent\",\n audience: \"atlas\",\n tokenHash: \"hash-concurrent\",\n now: at(\"2026-05-14T11:00:00.000Z\"),\n expiresAt: at(\"2026-05-18T10:00:00.000Z\"),\n }),\n storage.sessions.renewIfValid({\n projectId,\n id: \"ses_concurrent\",\n audience: \"atlas\",\n tokenHash: \"hash-concurrent\",\n now: at(\"2026-05-14T11:00:00.000Z\"),\n expiresAt: at(\"2026-05-19T10:00:00.000Z\"),\n }),\n ])\n const concurrent = await storage.sessions.getById({ projectId, id: \"ses_concurrent\" })\n expect(concurrent?.expiresAt.toISOString()).toBe(\"2026-05-19T10:00:00.000Z\")\n })\n })\n\n test(\"persists best-effort device metadata on a session\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n const withDevice = await storage.sessions.create({\n id: \"ses_device\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-device\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n userAgent: \"Mozilla/5.0 (iPhone)\",\n ipAddress: \"203.0.113.7\",\n })\n expect(withDevice.userAgent).toBe(\"Mozilla/5.0 (iPhone)\")\n expect(withDevice.ipAddress).toBe(\"203.0.113.7\")\n await expect(\n storage.sessions.getById({ projectId, id: \"ses_device\" })\n ).resolves.toMatchObject({\n userAgent: \"Mozilla/5.0 (iPhone)\",\n ipAddress: \"203.0.113.7\",\n })\n\n // Device metadata is optional; omitting it round-trips as undefined.\n const withoutDevice = await storage.sessions.create({\n id: \"ses_plain\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-plain\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:01:00.000Z\"),\n })\n expect(withoutDevice.userAgent).toBeUndefined()\n expect(withoutDevice.ipAddress).toBeUndefined()\n })\n })\n\n test(\"lists a user's active sessions across audiences, newest activity first\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n await storage.sessions.create({\n id: \"ses_a\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-a\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.sessions.create({\n id: \"ses_b\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"app\",\n tokenHash: \"hash-b\",\n createdAt: at(\"2026-05-14T10:05:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:05:00.000Z\"),\n })\n\n // Revoked sessions are excluded.\n await storage.sessions.create({\n id: \"ses_revoked\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-revoked\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:01:00.000Z\"),\n })\n await storage.sessions.revoke({\n projectId,\n id: \"ses_revoked\",\n revokedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n\n // Another user's session must not leak in.\n await createUser(storage, { id: \"usr_2\", email: \"bo@acme.com\" })\n await storage.sessions.create({\n id: \"ses_other\",\n projectId,\n userId: \"usr_2\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-other\",\n createdAt: at(\"2026-05-14T10:03:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:03:00.000Z\"),\n })\n\n // ses_a is older than ses_b but has more recent activity, so it sorts first.\n await storage.sessions.touch({\n projectId,\n id: \"ses_a\",\n lastSeenAt: at(\"2026-05-15T10:00:00.000Z\"),\n })\n\n const active = await storage.sessions.listActiveByUserId({\n projectId,\n userId: \"usr_1\",\n now: at(\"2026-05-15T11:00:00.000Z\"),\n })\n expect(active.map((session) => session.id)).toEqual([\"ses_a\", \"ses_b\"])\n })\n })\n\n test(\"keeps one active invitation per normalized email\", async () => {\n await withStorage(async (storage) => {\n const first = await storage.invitations.createOrUpdateActive({\n id: \"inv_1\",\n projectId,\n email: \" Ava@Acme.COM \",\n groupIds: [\"commercial\"],\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n const updated = await storage.invitations.createOrUpdateActive({\n id: \"inv_2\",\n projectId,\n email: \"ava@acme.com\",\n groupIds: [\"finance\"],\n updatedAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-22T10:00:00.000Z\"),\n })\n\n expect(updated.id).toBe(first.id)\n expect(updated.groupIds).toEqual([\"finance\"])\n await expect(\n storage.invitations.getActiveByEmail({\n projectId,\n email: \"ava@acme.com\",\n now: at(\"2026-05-14T10:02:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"inv_1\" })\n\n await storage.invitations.revoke({\n projectId,\n id: \"inv_1\",\n revokedAt: at(\"2026-05-14T10:03:00.000Z\"),\n })\n await expect(\n storage.invitations.getActiveByEmail({\n projectId,\n email: \"ava@acme.com\",\n now: at(\"2026-05-14T10:04:00.000Z\"),\n })\n ).resolves.toBeNull()\n })\n })\n\n test(\"upserts group memberships idempotently and preserves source\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n await storage.groupMemberships.upsert({\n projectId,\n userId: \"usr_1\",\n groupId: \"commercial\",\n source: \"invitation\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n const repeated = await storage.groupMemberships.upsert({\n projectId,\n userId: \"usr_1\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n\n expect(repeated.source).toBe(\"invitation\")\n await expect(\n storage.groupMemberships.listForUser({ projectId, userId: \"usr_1\" })\n ).resolves.toHaveLength(1)\n })\n })\n\n test(\"rejects group memberships for missing users\", async () => {\n await withStorage(async (storage) => {\n await expectAuthError(\n storage.groupMemberships.upsert({\n projectId,\n userId: \"usr_missing\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n }),\n \"missing_user\"\n )\n })\n })\n\n test(\"removes group memberships and is idempotent for missing rows\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n await storage.groupMemberships.upsert({\n projectId,\n userId: \"usr_1\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n\n const removed = await storage.groupMemberships.remove({\n projectId,\n userId: \"usr_1\",\n groupId: \"commercial\",\n })\n expect(removed).toMatchObject({\n projectId,\n userId: \"usr_1\",\n groupId: \"commercial\",\n source: \"manual\",\n })\n await expect(\n storage.groupMemberships.listForUser({ projectId, userId: \"usr_1\" })\n ).resolves.toHaveLength(0)\n\n // Removing an already-removed membership is a no-op that returns null.\n await expect(\n storage.groupMemberships.remove({ projectId, userId: \"usr_1\", groupId: \"commercial\" })\n ).resolves.toBeNull()\n })\n })\n\n test(\"returns null when removing a membership for a missing user\", async () => {\n await withStorage(async (storage) => {\n await expect(\n storage.groupMemberships.remove({\n projectId,\n userId: \"usr_missing\",\n groupId: \"commercial\",\n })\n ).resolves.toBeNull()\n })\n })\n\n test(\"manages service accounts and their group memberships\", async () => {\n await withStorage(async (storage) => {\n const serviceAccount = await storage.serviceAccounts.create({\n id: \"svc_ingest\",\n projectId,\n name: \"Ingest worker\",\n description: \"Reads source data into Sixb.\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n expect(serviceAccount).toMatchObject({\n id: \"svc_ingest\",\n name: \"Ingest worker\",\n status: \"active\",\n })\n\n const membership = await storage.serviceAccountGroupMemberships.upsert({\n projectId,\n serviceAccountId: \"svc_ingest\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n expect(membership.groupId).toBe(\"commercial\")\n const repeated = await storage.serviceAccountGroupMemberships.upsert({\n projectId,\n serviceAccountId: \"svc_ingest\",\n groupId: \"commercial\",\n source: \"invitation\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n expect(repeated.source).toBe(\"manual\")\n\n await expect(\n storage.serviceAccountGroupMemberships.listForServiceAccount({\n projectId,\n serviceAccountId: \"svc_ingest\",\n })\n ).resolves.toHaveLength(1)\n await expect(\n storage.serviceAccountGroupMemberships.listForGroup({\n projectId,\n groupId: \"commercial\",\n })\n ).resolves.toMatchObject([{ serviceAccountId: \"svc_ingest\" }])\n\n const updated = await storage.serviceAccounts.update({\n projectId,\n id: \"svc_ingest\",\n name: \"Ingest worker v2\",\n status: \"suspended\",\n updatedAt: at(\"2026-05-14T10:03:00.000Z\"),\n })\n expect(updated).toMatchObject({ name: \"Ingest worker v2\", status: \"suspended\" })\n await expect(\n storage.serviceAccounts.list({ projectId, statuses: [\"suspended\"] })\n ).resolves.toMatchObject({\n serviceAccounts: [{ id: \"svc_ingest\" }],\n total: 1,\n })\n })\n })\n\n test(\"rejects service account memberships for missing service accounts\", async () => {\n await withStorage(async (storage) => {\n await expectAuthError(\n storage.serviceAccountGroupMemberships.upsert({\n projectId,\n serviceAccountId: \"svc_missing\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n }),\n \"missing_service_account\"\n )\n })\n })\n\n test(\"reconciles agent-managed service account memberships\", async () => {\n await withStorage(async (storage) => {\n await storage.serviceAccounts.create({\n id: \"svc_agent_ops\",\n projectId,\n name: \"Ops agent\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n await storage.serviceAccountGroupMemberships.upsert({\n projectId,\n serviceAccountId: \"svc_agent_ops\",\n groupId: \"manual-extra\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n await storage.serviceAccountGroupMemberships.upsert({\n projectId,\n serviceAccountId: \"svc_agent_ops\",\n groupId: \"stale-agent\",\n source: \"agent\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n\n const first = await storage.serviceAccountGroupMemberships.reconcileForServiceAccount({\n projectId,\n serviceAccountId: \"svc_agent_ops\",\n groupIds: [\"agent-runtime\", \"agent-runtime\", \"ops\"],\n source: \"agent\",\n updatedAt: at(\"2026-05-14T10:03:00.000Z\"),\n })\n expect(first.map((membership) => [membership.groupId, membership.source])).toEqual([\n [\"agent-runtime\", \"agent\"],\n [\"manual-extra\", \"manual\"],\n [\"ops\", \"agent\"],\n ])\n\n const second = await storage.serviceAccountGroupMemberships.reconcileForServiceAccount({\n projectId,\n serviceAccountId: \"svc_agent_ops\",\n groupIds: [\"ops\"],\n source: \"agent\",\n updatedAt: at(\"2026-05-14T10:04:00.000Z\"),\n })\n expect(second.map((membership) => [membership.groupId, membership.source])).toEqual([\n [\"manual-extra\", \"manual\"],\n [\"ops\", \"agent\"],\n ])\n })\n })\n\n test(\"creates, resolves, touches, lists, and revokes access tokens\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n await storage.serviceAccounts.create({\n id: \"svc_ingest\",\n projectId,\n name: \"Ingest worker\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n\n const personal = await storage.accessTokens.create({\n id: \"tok_personal\",\n projectId,\n name: \"Local CLI\",\n kind: \"personal\",\n subjectType: \"user\",\n subjectId: \"usr_1\",\n tokenHash: \"hash-personal\",\n groupIds: [\"commercial\", \"commercial\", \"finance\"],\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:01:00.000Z\"),\n })\n expect(personal.groupIds).toEqual([\"commercial\", \"finance\"])\n await expect(\n storage.accessTokens.findValidByTokenHash({\n projectId,\n id: \"tok_personal\",\n kind: \"personal\",\n tokenHash: \"hash-personal\",\n now: at(\"2026-05-14T10:02:00.000Z\"),\n })\n ).resolves.toMatchObject({ id: \"tok_personal\" })\n await expect(\n storage.accessTokens.findValidByTokenHash({\n projectId,\n id: \"tok_personal\",\n kind: \"personal\",\n tokenHash: \"wrong\",\n now: at(\"2026-05-14T10:02:00.000Z\"),\n })\n ).resolves.toBeNull()\n\n const touched = await storage.accessTokens.touch({\n projectId,\n id: \"tok_personal\",\n lastUsedAt: at(\"2026-05-14T10:03:00.000Z\"),\n userAgent: \"sixb-cli/0.1\",\n ipAddress: \"203.0.113.10\",\n })\n expect(touched.lastUsedAt?.toISOString()).toBe(\"2026-05-14T10:03:00.000Z\")\n expect(touched.lastUsedUserAgent).toBe(\"sixb-cli/0.1\")\n\n await storage.accessTokens.create({\n id: \"tok_service\",\n projectId,\n name: \"Sandbox agent\",\n kind: \"serviceAccount\",\n subjectType: \"serviceAccount\",\n subjectId: \"svc_ingest\",\n tokenHash: \"hash-service\",\n createdAt: at(\"2026-05-14T10:04:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:04:00.000Z\"),\n })\n await expect(\n storage.accessTokens.list({\n projectId,\n subjectType: \"serviceAccount\",\n subjectId: \"svc_ingest\",\n })\n ).resolves.toMatchObject({\n accessTokens: [{ id: \"tok_service\" }],\n total: 1,\n })\n\n await storage.accessTokens.revoke({\n projectId,\n id: \"tok_personal\",\n revokedAt: at(\"2026-05-14T10:05:00.000Z\"),\n })\n await expect(\n storage.accessTokens.findValidByTokenHash({\n projectId,\n id: \"tok_personal\",\n kind: \"personal\",\n tokenHash: \"hash-personal\",\n now: at(\"2026-05-14T10:06:00.000Z\"),\n })\n ).resolves.toBeNull()\n })\n })\n\n test(\"round-trips the creator principal for service accounts and access tokens\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { id: \"usr_creator\", email: \"creator@acme.com\" })\n await storage.serviceAccounts.create({\n id: \"svc_creator\",\n projectId,\n name: \"Creator service account\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n await storage.sessions.create({\n id: \"ses_creator\",\n projectId,\n userId: \"usr_creator\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-creator\",\n createdAt: at(\"2026-05-14T10:00:30.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:30.000Z\"),\n })\n\n const principals = [\n { type: \"user\", id: \"usr_creator\" },\n { type: \"serviceAccount\", id: \"svc_creator\" },\n { type: \"system\", id: \"scheduler\" },\n ] as const\n\n for (const [index, principal] of principals.entries()) {\n const accountId = `svc_by_${principal.type}`\n const createdAccount = await storage.serviceAccounts.create({\n id: accountId,\n projectId,\n name: `Service account by ${principal.type}`,\n createdByPrincipal: principal,\n createdBySessionId: \"ses_creator\",\n createdAt: at(`2026-05-14T10:1${index}:00.000Z`),\n })\n expect(createdAccount.createdByPrincipal).toEqual(principal)\n expect(createdAccount.createdBySessionId).toBe(\"ses_creator\")\n await expect(\n storage.serviceAccounts.getById({ projectId, id: accountId })\n ).resolves.toMatchObject({\n createdByPrincipal: principal,\n createdBySessionId: \"ses_creator\",\n })\n\n const tokenId = `tok_by_${principal.type}`\n const createdToken = await storage.accessTokens.create({\n id: tokenId,\n projectId,\n name: `Token by ${principal.type}`,\n kind: \"personal\",\n subjectType: \"user\",\n subjectId: \"usr_creator\",\n tokenHash: `hash-${tokenId}`,\n createdByPrincipal: principal,\n createdBySessionId: \"ses_creator\",\n createdAt: at(`2026-05-14T10:2${index}:00.000Z`),\n expiresAt: at(`2026-05-21T10:2${index}:00.000Z`),\n })\n expect(createdToken.createdByPrincipal).toEqual(principal)\n expect(createdToken.createdBySessionId).toBe(\"ses_creator\")\n await expect(\n storage.accessTokens.getById({ projectId, id: tokenId })\n ).resolves.toMatchObject({\n createdByPrincipal: principal,\n createdBySessionId: \"ses_creator\",\n })\n }\n\n // Omitting the creator round-trips as undefined on every backend.\n const anonymous = await storage.serviceAccounts.create({\n id: \"svc_anonymous\",\n projectId,\n name: \"Anonymous service account\",\n createdAt: at(\"2026-05-14T10:30:00.000Z\"),\n })\n expect(anonymous.createdByPrincipal).toBeUndefined()\n expect(anonymous.createdBySessionId).toBeUndefined()\n await expect(\n storage.serviceAccounts.getById({ projectId, id: \"svc_anonymous\" })\n ).resolves.toMatchObject({ id: \"svc_anonymous\" })\n })\n })\n\n test(\"touch preserves prior access-token metadata when omitted\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n await storage.accessTokens.create({\n id: \"tok_touch\",\n projectId,\n name: \"Touch token\",\n kind: \"personal\",\n subjectType: \"user\",\n subjectId: \"usr_1\",\n tokenHash: \"hash-touch\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n\n const first = await storage.accessTokens.touch({\n projectId,\n id: \"tok_touch\",\n lastUsedAt: at(\"2026-05-14T10:01:00.000Z\"),\n userAgent: \"sixb-cli/0.1\",\n ipAddress: \"203.0.113.10\",\n })\n expect(first.lastUsedUserAgent).toBe(\"sixb-cli/0.1\")\n expect(first.lastUsedIpAddress).toBe(\"203.0.113.10\")\n\n // A later touch without metadata advances lastUsedAt but keeps the\n // previously captured user agent and IP address.\n const second = await storage.accessTokens.touch({\n projectId,\n id: \"tok_touch\",\n lastUsedAt: at(\"2026-05-14T10:05:00.000Z\"),\n })\n expect(second.lastUsedAt?.toISOString()).toBe(\"2026-05-14T10:05:00.000Z\")\n expect(second.lastUsedUserAgent).toBe(\"sixb-cli/0.1\")\n expect(second.lastUsedIpAddress).toBe(\"203.0.113.10\")\n await expect(\n storage.accessTokens.getById({ projectId, id: \"tok_touch\" })\n ).resolves.toMatchObject({\n lastUsedUserAgent: \"sixb-cli/0.1\",\n lastUsedIpAddress: \"203.0.113.10\",\n })\n })\n })\n\n test(\"lists access tokens with revoked, order, and pagination parity\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n const ids = [\"tok_a\", \"tok_b\", \"tok_c\", \"tok_d\"]\n for (const [index, id] of ids.entries()) {\n await storage.accessTokens.create({\n id,\n projectId,\n name: `Token ${id}`,\n kind: \"personal\",\n subjectType: \"user\",\n subjectId: \"usr_1\",\n tokenHash: `hash-${id}`,\n createdAt: at(`2026-05-14T10:0${index}:00.000Z`),\n expiresAt: at(`2026-05-21T10:0${index}:00.000Z`),\n })\n }\n await storage.accessTokens.revoke({\n projectId,\n id: \"tok_b\",\n revokedAt: at(\"2026-05-14T11:00:00.000Z\"),\n })\n\n // includeRevoked defaults to false: the revoked token is hidden.\n const active = await storage.accessTokens.list({ projectId })\n expect(active.accessTokens.map((token) => token.id)).toEqual([\"tok_a\", \"tok_c\", \"tok_d\"])\n expect(active.total).toBe(3)\n expect(active.hasMore).toBe(false)\n\n // includeRevoked: true surfaces it again, default order is ascending.\n const all = await storage.accessTokens.list({ projectId, includeRevoked: true })\n expect(all.accessTokens.map((token) => token.id)).toEqual([\n \"tok_a\",\n \"tok_b\",\n \"tok_c\",\n \"tok_d\",\n ])\n expect(all.total).toBe(4)\n\n // order: \"desc\" reverses by createdAt.\n const descending = await storage.accessTokens.list({\n projectId,\n includeRevoked: true,\n order: \"desc\",\n })\n expect(descending.accessTokens.map((token) => token.id)).toEqual([\n \"tok_d\",\n \"tok_c\",\n \"tok_b\",\n \"tok_a\",\n ])\n\n // First page reports hasMore at the page boundary.\n const firstPage = await storage.accessTokens.list({\n projectId,\n includeRevoked: true,\n limit: 2,\n })\n expect(firstPage.accessTokens.map((token) => token.id)).toEqual([\"tok_a\", \"tok_b\"])\n expect(firstPage.total).toBe(4)\n expect(firstPage.hasMore).toBe(true)\n\n // Second page exhausts the result set.\n const secondPage = await storage.accessTokens.list({\n projectId,\n includeRevoked: true,\n limit: 2,\n offset: 2,\n })\n expect(secondPage.accessTokens.map((token) => token.id)).toEqual([\"tok_c\", \"tok_d\"])\n expect(secondPage.hasMore).toBe(false)\n\n // A page that exactly consumes the remainder reports no more.\n const exactBoundary = await storage.accessTokens.list({\n projectId,\n includeRevoked: true,\n limit: 4,\n })\n expect(exactBoundary.accessTokens.map((token) => token.id)).toEqual(ids)\n expect(exactBoundary.hasMore).toBe(false)\n })\n })\n\n test(\"lists service accounts with pagination parity\", async () => {\n await withStorage(async (storage) => {\n const ids = [\"svc_a\", \"svc_b\", \"svc_c\"]\n for (const [index, id] of ids.entries()) {\n await storage.serviceAccounts.create({\n id,\n projectId,\n name: `Service account ${id}`,\n createdAt: at(`2026-05-14T10:0${index}:00.000Z`),\n })\n }\n\n // Default order is ascending by createdAt across every backend.\n const all = await storage.serviceAccounts.list({ projectId })\n expect(all.serviceAccounts.map((account) => account.id)).toEqual(ids)\n expect(all.total).toBe(3)\n expect(all.hasMore).toBe(false)\n\n const firstPage = await storage.serviceAccounts.list({ projectId, limit: 2 })\n expect(firstPage.serviceAccounts.map((account) => account.id)).toEqual([\"svc_a\", \"svc_b\"])\n expect(firstPage.total).toBe(3)\n expect(firstPage.hasMore).toBe(true)\n\n const secondPage = await storage.serviceAccounts.list({\n projectId,\n limit: 2,\n offset: 2,\n })\n expect(secondPage.serviceAccounts.map((account) => account.id)).toEqual([\"svc_c\"])\n expect(secondPage.hasMore).toBe(false)\n })\n })\n\n test(\"rejects invalid access token subjects\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n\n await expectAuthError(\n storage.accessTokens.create({\n id: \"tok_bad_kind\",\n projectId,\n name: \"Bad kind\",\n kind: \"serviceAccount\",\n subjectType: \"user\",\n subjectId: \"usr_1\",\n tokenHash: \"hash\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n }),\n \"invalid_input\"\n )\n await expectAuthError(\n storage.accessTokens.create({\n id: \"tok_missing_subject\",\n projectId,\n name: \"Missing subject\",\n kind: \"serviceAccount\",\n subjectType: \"serviceAccount\",\n subjectId: \"svc_missing\",\n tokenHash: \"hash\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n }),\n \"missing_service_account\"\n )\n })\n })\n\n test(\"creates one active magic link per email and consumes it once\", async () => {\n await withStorage(async (storage) => {\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"hash-1\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:15:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_2\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \" ava@acme.com \",\n tokenHash: \"hash-2\",\n returnTo: \"/dashboard\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n await expect(storage.magicLinks.getById({ projectId, id: \"ml_1\" })).resolves.toMatchObject({\n revokedAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n await expectAuthError(\n storage.magicLinks.consume({\n projectId,\n id: \"ml_2\",\n tokenHash: \"wrong\",\n consumedAt: at(\"2026-05-14T10:02:00.000Z\"),\n }),\n \"invalid_magic_link\"\n )\n\n await expect(\n storage.magicLinks.consume({\n projectId,\n id: \"ml_2\",\n tokenHash: \"hash-2\",\n consumedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n ).resolves.toMatchObject({\n audience: \"atlas\",\n returnTo: \"/dashboard\",\n consumedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n await expectAuthError(\n storage.magicLinks.consume({\n projectId,\n id: \"ml_2\",\n tokenHash: \"hash-2\",\n consumedAt: at(\"2026-05-14T10:03:00.000Z\"),\n }),\n \"invalid_magic_link\"\n )\n })\n })\n\n test(\"stores OIDC attempts with one-time state consumption\", async () => {\n await withStorage(async (storage) => {\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_1\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"state-hash\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n returnTo: \"/objects\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n\n await expectAuthError(\n storage.oidcAuthorizationAttempts.consume({\n projectId,\n id: \"oidc_1\",\n stateHash: \"wrong\",\n consumedAt: at(\"2026-05-14T10:01:00.000Z\"),\n }),\n \"invalid_oidc_attempt\"\n )\n await expect(\n storage.oidcAuthorizationAttempts.consume({\n projectId,\n id: \"oidc_1\",\n stateHash: \"state-hash\",\n consumedAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n ).resolves.toMatchObject({\n audience: \"atlas\",\n codeVerifier: \"verifier\",\n consumedAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n await expectAuthError(\n storage.oidcAuthorizationAttempts.consume({\n projectId,\n id: \"oidc_1\",\n stateHash: \"state-hash\",\n consumedAt: at(\"2026-05-14T10:02:00.000Z\"),\n }),\n \"invalid_oidc_attempt\"\n )\n })\n })\n\n test(\"completes magic-link sign-in for an existing user\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n await storage.sessions.create({\n id: \"ses_old\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"old-hash\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n const result = await storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:02:00.000Z\"),\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_new\", \"session-hash\", \"atlas\", at(\"2026-06-21T10:10:00.000Z\")),\n })\n\n expect(result.user.id).toBe(\"usr_1\")\n expect(result.session).toMatchObject({\n id: \"ses_new\",\n strategyId: \"magic-link\",\n tokenHash: \"session-hash\",\n absoluteExpiresAt: at(\"2026-06-21T10:10:00.000Z\"),\n })\n // Signing in again keeps the user's existing session active; concurrent\n // sessions are allowed.\n const oldSession = await storage.sessions.getById({ projectId, id: \"ses_old\" })\n expect(oldSession?.revokedAt).toBeUndefined()\n await expectAuthError(\n storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_unused_2\",\n session: sessionInput(\"ses_replay\"),\n }),\n \"invalid_magic_link\"\n )\n })\n })\n\n test(\"creates invited users through magic-link completion and applies groups once\", async () => {\n await withStorage(async (storage) => {\n await storage.invitations.createOrUpdateActive({\n id: \"inv_1\",\n projectId,\n email: \"ava@acme.com\",\n groupIds: [\"commercial\", \"finance\"],\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:17:00.000Z\"),\n })\n\n const result = await storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_new\",\n manualGroupIds: [\"security-admins\"],\n session: sessionInput(\"ses_new\"),\n })\n\n expect(result.invitation).toMatchObject({\n id: \"inv_1\",\n status: \"accepted\",\n })\n const memberships = await storage.groupMemberships.listForUser({\n projectId,\n userId: \"usr_new\",\n })\n expect(memberships.map((membership) => [membership.groupId, membership.source])).toEqual([\n [\"commercial\", \"invitation\"],\n [\"finance\", \"invitation\"],\n [\"security-admins\", \"manual\"],\n ])\n })\n })\n\n test(\"preserves existing membership source when accepting an invitation\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { id: \"usr_existing\", email: \"ava@acme.com\" })\n await storage.invitations.createOrUpdateActive({\n id: \"inv_1\",\n projectId,\n email: \"ava@acme.com\",\n groupIds: [\"commercial\", \"finance\"],\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.groupMemberships.upsert({\n projectId,\n userId: \"usr_existing\",\n groupId: \"commercial\",\n source: \"manual\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:17:00.000Z\"),\n })\n\n await storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_existing\"),\n })\n\n const memberships = await storage.groupMemberships.listForUser({\n projectId,\n userId: \"usr_existing\",\n })\n expect(memberships.map((membership) => [membership.groupId, membership.source])).toEqual([\n [\"commercial\", \"manual\"],\n [\"finance\", \"invitation\"],\n ])\n })\n })\n\n test(\"does not create missing users when invitation eligibility disappeared\", async () => {\n await withStorage(async (storage) => {\n await storage.invitations.createOrUpdateActive({\n id: \"inv_1\",\n projectId,\n email: \"ava@acme.com\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n await storage.invitations.revoke({\n projectId,\n id: \"inv_1\",\n revokedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n\n await expectAuthError(\n storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_new\",\n session: sessionInput(\"ses_new\"),\n }),\n \"user_creation_not_allowed\"\n )\n await expect(\n storage.users.getByEmail({ projectId, email: \"ava@acme.com\" })\n ).resolves.toBeNull()\n await expect(storage.magicLinks.getById({ projectId, id: \"ml_1\" })).resolves.toMatchObject({\n consumedAt: at(\"2026-05-14T10:03:00.000Z\"),\n })\n })\n })\n\n test(\"allows explicit bootstrap creation through magic-link completion\", async () => {\n await withStorage(async (storage) => {\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"founder@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n const result = await storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_founder\",\n allowUserCreationWithoutInvitation: true,\n manualGroupIds: [\"security-admins\"],\n session: sessionInput(\"ses_founder\"),\n })\n\n expect(result.user).toMatchObject({\n id: \"usr_founder\",\n email: \"founder@acme.com\",\n })\n await expect(\n storage.groupMemberships.listForUser({ projectId, userId: \"usr_founder\" })\n ).resolves.toMatchObject([{ groupId: \"security-admins\", source: \"manual\" }])\n })\n })\n\n test(\"closes bootstrap user creation when an active user already exists\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, {\n id: \"usr_existing\",\n email: \"existing@acme.com\",\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"founder@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n await expectAuthError(\n storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_founder\",\n allowUserCreationWithoutInvitation: true,\n requireNoActiveUsersForUserCreation: true,\n session: sessionInput(\"ses_founder\"),\n }),\n \"user_creation_not_allowed\"\n )\n await expect(\n storage.users.getByEmail({ projectId, email: \"founder@acme.com\" })\n ).resolves.toBeNull()\n await expect(storage.magicLinks.getById({ projectId, id: \"ml_1\" })).resolves.toMatchObject({\n consumedAt: at(\"2026-05-14T10:03:00.000Z\"),\n })\n })\n })\n\n test(\"does not apply the bootstrap closure guard to invited user creation\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, {\n id: \"usr_existing\",\n email: \"existing@acme.com\",\n })\n await storage.invitations.createOrUpdateActive({\n id: \"inv_1\",\n projectId,\n email: \"invited@acme.com\",\n groupIds: [\"commercial\"],\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"invited@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n const result = await storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n newUserId: \"usr_invited\",\n requireNoActiveUsersForUserCreation: true,\n session: sessionInput(\"ses_invited\"),\n })\n\n expect(result.user).toMatchObject({\n id: \"usr_invited\",\n email: \"invited@acme.com\",\n })\n expect(result.invitation).toMatchObject({\n id: \"inv_1\",\n status: \"accepted\",\n })\n })\n })\n\n test(\"consumes valid magic links when an existing user is suspended\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { status: \"suspended\" })\n await storage.magicLinks.create({\n id: \"ml_1\",\n projectId,\n strategyId: \"magic-link\",\n audience: \"atlas\",\n email: \"ava@acme.com\",\n tokenHash: \"link-hash\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:16:00.000Z\"),\n })\n\n await expectAuthError(\n storage.completeMagicLinkSignIn({\n projectId,\n magicLinkId: \"ml_1\",\n tokenHash: \"link-hash\",\n completedAt: at(\"2026-05-14T10:02:00.000Z\"),\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_new\"),\n }),\n \"suspended_user\"\n )\n await expect(storage.magicLinks.getById({ projectId, id: \"ml_1\" })).resolves.toMatchObject({\n consumedAt: at(\"2026-05-14T10:02:00.000Z\"),\n })\n })\n })\n\n test(\"completes OIDC sign-in through an existing identity\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { id: \"usr_oidc\", email: \"ava@acme.com\" })\n await storage.identities.upsert({\n projectId,\n strategyId: \"okta\",\n subject: \"00u1\",\n userId: \"usr_oidc\",\n claims: { email: \"ava@acme.com\" },\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n })\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_1\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"state-hash\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:11:00.000Z\"),\n })\n\n const result = await storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_1\",\n stateHash: \"state-hash\",\n completedAt: at(\"2026-05-14T10:02:00.000Z\"),\n subject: \"00u1\",\n email: \"renamed@acme.com\",\n emailVerified: true,\n claims: { email: \"renamed@acme.com\" },\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_oidc\"),\n })\n\n expect(result.identity).toMatchObject({\n strategyId: \"okta\",\n subject: \"00u1\",\n userId: \"usr_oidc\",\n claims: { email: \"renamed@acme.com\" },\n })\n await expect(storage.users.getById({ projectId, id: \"usr_oidc\" })).resolves.toMatchObject({\n email: \"ava@acme.com\",\n })\n })\n })\n\n test(\"auto-links OIDC by verified email only when explicitly allowed\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage, { id: \"usr_existing\", email: \"ava@acme.com\" })\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_blocked\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"blocked-state\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n\n await expectAuthError(\n storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_blocked\",\n stateHash: \"blocked-state\",\n completedAt: at(\"2026-05-14T10:01:00.000Z\"),\n subject: \"00u1\",\n email: \"ava@acme.com\",\n emailVerified: false,\n autoLinkByVerifiedEmail: true,\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_blocked\"),\n }),\n \"email_link_not_allowed\"\n )\n\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_allowed\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"allowed-state\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:02:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:12:00.000Z\"),\n })\n const result = await storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_allowed\",\n stateHash: \"allowed-state\",\n completedAt: at(\"2026-05-14T10:03:00.000Z\"),\n subject: \"00u1\",\n email: \"ava@acme.com\",\n emailVerified: true,\n autoLinkByVerifiedEmail: true,\n newUserId: \"usr_unused\",\n session: sessionInput(\"ses_allowed\"),\n })\n\n expect(result.user.id).toBe(\"usr_existing\")\n expect(result.identity).toMatchObject({\n userId: \"usr_existing\",\n })\n })\n })\n\n test(\"creates new OIDC users through active invitations and applies groups\", async () => {\n await withStorage(async (storage) => {\n await storage.invitations.createOrUpdateActive({\n id: \"inv_oidc\",\n projectId,\n email: \"ava@acme.com\",\n groupIds: [\"commercial\"],\n createdAt: at(\"2026-05-14T09:59:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_1\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"state-hash\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n\n const result = await storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_1\",\n stateHash: \"state-hash\",\n completedAt: at(\"2026-05-14T10:01:00.000Z\"),\n subject: \"00u1\",\n email: \"ava@acme.com\",\n displayName: \"Ava Chen\",\n emailVerified: true,\n newUserId: \"usr_oidc\",\n session: sessionInput(\"ses_oidc\"),\n })\n\n expect(result.user).toMatchObject({\n id: \"usr_oidc\",\n email: \"ava@acme.com\",\n displayName: \"Ava Chen\",\n })\n expect(result.invitation).toMatchObject({\n id: \"inv_oidc\",\n status: \"accepted\",\n })\n expect(result.identity).toMatchObject({\n strategyId: \"okta\",\n subject: \"00u1\",\n userId: \"usr_oidc\",\n })\n await expect(\n storage.groupMemberships.listForUser({ projectId, userId: \"usr_oidc\" })\n ).resolves.toMatchObject([{ groupId: \"commercial\", source: \"invitation\" }])\n })\n })\n\n test(\"does not create new OIDC users without invitation or bootstrap eligibility\", async () => {\n await withStorage(async (storage) => {\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_1\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"state-hash\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n\n await expectAuthError(\n storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_1\",\n stateHash: \"state-hash\",\n completedAt: at(\"2026-05-14T10:01:00.000Z\"),\n subject: \"00u1\",\n email: \"ava@acme.com\",\n emailVerified: true,\n newUserId: \"usr_oidc\",\n session: sessionInput(\"ses_oidc\"),\n }),\n \"user_creation_not_allowed\"\n )\n await expect(\n storage.users.getByEmail({ projectId, email: \"ava@acme.com\" })\n ).resolves.toBeNull()\n })\n })\n\n test(\"allows first OIDC bootstrap user creation with manual groups\", async () => {\n await withStorage(async (storage) => {\n await storage.oidcAuthorizationAttempts.create({\n id: \"oidc_bootstrap\",\n projectId,\n strategyId: \"okta\",\n audience: \"atlas\",\n stateHash: \"bootstrap-state\",\n nonceHash: \"nonce-hash\",\n codeVerifier: \"verifier\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-14T10:10:00.000Z\"),\n })\n\n const result = await storage.completeOidcSignIn({\n projectId,\n oidcAuthorizationAttemptId: \"oidc_bootstrap\",\n stateHash: \"bootstrap-state\",\n completedAt: at(\"2026-05-14T10:01:00.000Z\"),\n subject: \"00u1\",\n email: \"founder@acme.com\",\n emailVerified: true,\n allowUserCreationWithoutInvitation: true,\n requireNoActiveUsersForUserCreation: true,\n manualGroupIds: [\"security-admins\"],\n newUserId: \"usr_founder\",\n session: sessionInput(\"ses_oidc_bootstrap\"),\n })\n\n expect(result.user).toMatchObject({\n id: \"usr_founder\",\n email: \"founder@acme.com\",\n })\n await expect(\n storage.groupMemberships.listForUser({ projectId, userId: \"usr_founder\" })\n ).resolves.toMatchObject([{ groupId: \"security-admins\", source: \"manual\" }])\n })\n })\n\n test(\"suspends users and revokes active sessions immediately\", async () => {\n await withStorage(async (storage) => {\n await createUser(storage)\n await storage.sessions.create({\n id: \"ses_1\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"atlas\",\n tokenHash: \"hash-1\",\n createdAt: at(\"2026-05-14T10:00:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:00:00.000Z\"),\n })\n await storage.sessions.create({\n id: \"ses_app\",\n projectId,\n userId: \"usr_1\",\n strategyId: \"magic-link\",\n audience: \"app\",\n tokenHash: \"hash-app\",\n createdAt: at(\"2026-05-14T10:01:00.000Z\"),\n expiresAt: at(\"2026-05-21T10:01:00.000Z\"),\n })\n\n const suspended = await storage.suspendUserAndRevokeSessions({\n projectId,\n userId: \"usr_1\",\n suspendedAt: at(\"2026-05-14T10:05:00.000Z\"),\n })\n\n expect(suspended.status).toBe(\"suspended\")\n await expect(storage.sessions.getById({ projectId, id: \"ses_1\" })).resolves.toMatchObject({\n revokedAt: at(\"2026-05-14T10:05:00.000Z\"),\n })\n await expect(storage.sessions.getById({ projectId, id: \"ses_app\" })).resolves.toMatchObject(\n {\n revokedAt: at(\"2026-05-14T10:05:00.000Z\"),\n }\n )\n })\n })\n })\n}\n",
|
|
7
|
+
"import { describe, expect, test } from \"bun:test\"\nimport { blobIdFromDigest, computeBlobDigest } from \"../blob-storage\"\nimport type { BlobStorage } from \"../blob-storage/types\"\n\nexport interface BlobStorageContractSuiteOptions<TStorage extends BlobStorage = BlobStorage> {\n /** Factory that produces an isolated storage instance for each test case. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (storage: TStorage) => void | Promise<void>\n}\n\n/** Runs the shared content, streaming, size-validation, and cancellation contract. */\nexport function runBlobStorageContractSuite<TStorage extends BlobStorage>(\n label: string,\n options: BlobStorageContractSuiteOptions<TStorage>\n): void {\n const encoder = new TextEncoder()\n\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await body(storage)\n } finally {\n await options.teardown?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"streams bodies into stable content-addressed references\", async () => {\n await withStorage(async (storage) => {\n const body = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(encoder.encode(\"streamed \"))\n controller.enqueue(encoder.encode(\"body\"))\n controller.close()\n },\n })\n\n const fileRef = await storage.put({\n body,\n expectedSizeBytes: 13,\n fileName: \"report.bin\",\n mediaType: \"application/octet-stream\",\n logicalPath: \"reports/report.bin\",\n })\n\n expect(fileRef.sizeBytes).toBe(13)\n expect(fileRef.blobId).toBe(blobIdFromDigest(fileRef.digest))\n expect(fileRef.fileName).toBe(\"report.bin\")\n expect(fileRef.mediaType).toBe(\"application/octet-stream\")\n expect(fileRef.logicalPath).toBe(\"reports/report.bin\")\n expect(await new Response(await storage.open(fileRef.blobId)).text()).toBe(\"streamed body\")\n })\n })\n\n test(\"rejects an expected size mismatch without publishing a blob\", async () => {\n await withStorage(async (storage) => {\n const bytes = encoder.encode(\"wrong size\")\n const blobId = blobIdFromDigest(computeBlobDigest(bytes))\n\n await expect(\n storage.put({ body: bytes, expectedSizeBytes: bytes.byteLength + 1 })\n ).rejects.toThrow(\n `Blob size mismatch: expected ${bytes.byteLength + 1} bytes, received ${bytes.byteLength}.`\n )\n await expect(storage.stat(blobId)).resolves.toBeNull()\n })\n })\n\n test(\"rejects invalid expected sizes\", async () => {\n await withStorage(async (storage) => {\n const body = new ReadableStream<Uint8Array>({\n pull(controller) {\n controller.close()\n },\n })\n\n await expect(storage.put({ body, expectedSizeBytes: -1 })).rejects.toThrow(\n \"expectedSizeBytes must be a non-negative safe integer\"\n )\n })\n })\n\n test(\"cancels an active body without publishing partial bytes\", async () => {\n await withStorage(async (storage) => {\n const abort = new AbortController()\n let bodyCancelled = false\n const firstChunk = encoder.encode(\"partial\")\n const blobId = blobIdFromDigest(computeBlobDigest(firstChunk))\n const body = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(firstChunk)\n },\n cancel() {\n bodyCancelled = true\n },\n })\n\n const put = storage.put({ body, signal: abort.signal })\n abort.abort(new Error(\"cancel blob put\"))\n\n await expect(put).rejects.toThrow(\"cancel blob put\")\n expect(bodyCancelled).toBe(true)\n await expect(storage.stat(blobId)).resolves.toBeNull()\n })\n })\n })\n}\n",
|
|
8
|
+
"import { describe, expect, test } from \"bun:test\"\nimport { BrokerError } from \"../broker/errors\"\nimport type {\n Broker,\n BrokerRecord,\n BrokerRecordInput,\n BrokerStreamDefinition,\n} from \"../broker/types\"\nimport type { JsonValue } from \"../json\"\n\nexport interface BrokerContractSuiteOptions<TBroker extends Broker = Broker> {\n /** Factory that produces a fresh `Broker` instance for each test case. */\n readonly createBroker: () => TBroker | Promise<TBroker>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (broker: TBroker) => void | Promise<void>\n /**\n * Retention age used by the maxAgeMs assertion. Defaults to 20ms.\n * Providers with coarse server-side retention can increase this in their own suite.\n */\n readonly maxAgeMs?: number\n /**\n * Time to wait for maxAgeMs retention to expire. Defaults to `maxAgeMs + 20`.\n */\n readonly maxAgeWaitMs?: number\n /**\n * Time to wait after registering a live subscription before appending records.\n * Defaults to 0 for synchronous providers.\n */\n readonly subscriptionSetupMs?: number\n /**\n * Time to wait for asynchronous subscription delivery. Defaults to 200ms.\n */\n readonly subscriptionDeliveryTimeoutMs?: number\n /**\n * Poll interval while waiting for asynchronous subscription delivery. Defaults to 10ms.\n */\n readonly subscriptionPollIntervalMs?: number\n}\n\nconst eventsStream: BrokerStreamDefinition = { id: \"__events\" }\nconst retainedStream: BrokerStreamDefinition = { id: \"__retained\", retention: { maxRecords: 2 } }\n\n/**\n * Runs the shared `Broker` contract against any provider.\n *\n * The contract intentionally stays small: append records, read retained records\n * by exclusive cursor, subscribe to retained/live streams, and apply portable\n * retention. Provider-specific administration and durable consumer identity\n * are outside the V1 broker surface.\n */\nexport function runBrokerContractSuite<TBroker extends Broker>(\n label: string,\n options: BrokerContractSuiteOptions<TBroker>\n): void {\n const maxAgeMs = options.maxAgeMs ?? 20\n const maxAgeWaitMs = options.maxAgeWaitMs ?? maxAgeMs + 20\n const subscriptionSetupMs = options.subscriptionSetupMs ?? 0\n const subscriptionDeliveryTimeoutMs = options.subscriptionDeliveryTimeoutMs ?? 200\n const subscriptionPollIntervalMs = options.subscriptionPollIntervalMs ?? 10\n\n const withBroker = async (body: (broker: TBroker) => Promise<void>): Promise<void> => {\n const broker = await options.createBroker()\n try {\n await body(broker)\n } finally {\n await options.teardown?.(broker)\n }\n }\n\n describe(label, () => {\n describe(\"append\", () => {\n test(\"returns stored records with cursors and timestamps\", async () => {\n await withBroker(async (broker) => {\n const before = Date.now()\n\n const records = await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n {\n name: \"test.record\",\n key: \"Room:room-1\",\n payload: { objectTypeId: \"Room\", primaryId: \"room-1\" },\n },\n ],\n })\n\n expect(records).toHaveLength(1)\n expect(records[0]).toMatchObject({\n streamId: eventsStream.id,\n name: \"test.record\",\n key: \"Room:room-1\",\n payload: { objectTypeId: \"Room\", primaryId: \"room-1\" },\n })\n expect(records[0]?.cursor).toBeTruthy()\n expect(Date.parse(records[0]!.publishedAt)).toBeGreaterThanOrEqual(before)\n })\n })\n\n test(\"snapshots appended payloads\", async () => {\n await withBroker(async (broker) => {\n const payload = { nested: { value: \"before\" } }\n\n const [record] = await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ payload }],\n })\n payload.nested.value = \"after\"\n\n expect(record?.payload).toEqual({ nested: { value: \"before\" } })\n const [readBack] = await readRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n })\n expect(readBack?.payload).toEqual({ nested: { value: \"before\" } })\n })\n })\n\n test(\"returns empty array for empty appends\", async () => {\n await withBroker(async (broker) => {\n const records = await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [],\n })\n\n expect(records).toEqual([])\n })\n })\n\n test(\"rejects empty projectId and stream id\", async () => {\n await withBroker(async (broker) => {\n await expect(\n appendRecords(broker, {\n projectId: \" \",\n stream: eventsStream,\n records: [{ payload: { ok: true } }],\n })\n ).rejects.toBeInstanceOf(BrokerError)\n\n await expect(\n appendRecords(broker, {\n projectId: \"project-a\",\n stream: { id: \" \" },\n records: [{ payload: { ok: true } }],\n })\n ).rejects.toBeInstanceOf(BrokerError)\n })\n })\n\n test(\"rejects payloads that are not JSON values\", async () => {\n await withBroker(async (broker) => {\n await expect(\n appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n {\n payload: {\n observedAt: new Date(\"2026-01-01T00:00:00.000Z\"),\n } as unknown as JsonValue,\n },\n ],\n })\n ).rejects.toBeInstanceOf(BrokerError)\n\n await expect(\n appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ payload: { value: Number.NaN } as unknown as JsonValue }],\n })\n ).rejects.toBeInstanceOf(BrokerError)\n })\n })\n\n test(\"requires streams to be ensured before appending records\", async () => {\n await withBroker(async (broker) => {\n await expect(\n broker.append({\n projectId: \"project-a\",\n streamId: \"missing\",\n records: [{ payload: \"one\" }],\n })\n ).rejects.toBeInstanceOf(BrokerError)\n })\n })\n })\n\n describe(\"read\", () => {\n test(\"reads records after an exclusive cursor\", async () => {\n await withBroker(async (broker) => {\n const [first] = await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n { name: \"one\", payload: { value: 1 } },\n { name: \"two\", payload: { value: 2 } },\n { name: \"three\", payload: { value: 3 } },\n ],\n })\n\n const records = await readRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n afterCursor: first?.cursor,\n })\n\n expect(records.map((record) => record.name)).toEqual([\"two\", \"three\"])\n })\n })\n\n test(\"limits matching records after applying name filters\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n { name: \"test.record\", payload: { id: \"room-1\" } },\n { name: \"telemetry.appended\", payload: { id: \"temp-1\" } },\n { name: \"test.record\", payload: { id: \"room-2\" } },\n ],\n })\n\n const records = await readRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n names: [\"test.record\"],\n limit: 2,\n })\n\n expect(records.map((record) => record.payload)).toEqual([\n { id: \"room-1\" },\n { id: \"room-2\" },\n ])\n })\n })\n\n test(\"returns empty array for missing streams and non-positive limits\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ name: \"test.record\", payload: { id: \"room-1\" } }],\n })\n\n expect(\n await broker.read({\n projectId: \"project-a\",\n streamId: \"missing\",\n })\n ).toEqual({ records: [], cursor: undefined, hasMore: false })\n expect(\n await readRecords(broker, { projectId: \"project-a\", stream: eventsStream, limit: 0 })\n ).toEqual([])\n expect(\n await readRecords(broker, { projectId: \"project-a\", stream: eventsStream, limit: -1 })\n ).toEqual([])\n })\n })\n\n test(\"isolates projects and streams\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: { id: \"stream-a\" },\n records: [{ payload: { value: \"a\" } }],\n })\n await appendRecords(broker, {\n projectId: \"project-b\",\n stream: { id: \"stream-a\" },\n records: [{ payload: { value: \"b\" } }],\n })\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: { id: \"stream-b\" },\n records: [{ payload: { value: \"c\" } }],\n })\n\n expect(\n await payloads(\n readRecords(broker, { projectId: \"project-a\", stream: { id: \"stream-a\" } })\n )\n ).toEqual([{ value: \"a\" }])\n expect(\n await payloads(\n readRecords(broker, { projectId: \"project-b\", stream: { id: \"stream-a\" } })\n )\n ).toEqual([{ value: \"b\" }])\n expect(\n await payloads(\n readRecords(broker, { projectId: \"project-a\", stream: { id: \"stream-b\" } })\n )\n ).toEqual([{ value: \"c\" }])\n })\n })\n\n test(\"advances the page cursor when filters match no records\", async () => {\n await withBroker(async (broker) => {\n const appended = await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n { name: \"one\", payload: 1 },\n { name: \"two\", payload: 2 },\n ],\n })\n\n const page = await broker.read({\n projectId: \"project-a\",\n streamId: eventsStream.id,\n names: [\"missing\"],\n limit: 1,\n })\n\n expect(page.records).toEqual([])\n expect(page.cursor).toBe(appended.at(-1)?.cursor)\n expect(page.hasMore).toBe(false)\n })\n })\n\n test(\"filters by record key before applying the page limit\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n { key: \"sync:a\", payload: \"a1\" },\n { key: \"sync:b\", payload: \"b\" },\n { key: \"sync:a\", payload: \"a2\" },\n ],\n })\n\n const page = await broker.read({\n projectId: \"project-a\",\n streamId: eventsStream.id,\n keys: [\"sync:a\"],\n limit: 2,\n })\n expect(page.records.map((record) => record.payload)).toEqual([\"a1\", \"a2\"])\n })\n })\n\n test(\"reports no forward page when only filtered-out records remain\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n { key: \"target\", payload: \"match\" },\n { key: \"other\", payload: \"filtered-one\" },\n { key: \"other\", payload: \"filtered-two\" },\n ],\n })\n\n const page = await broker.read({\n projectId: \"project-a\",\n streamId: eventsStream.id,\n keys: [\"target\"],\n limit: 1,\n })\n expect(page.records.map((record) => record.payload)).toEqual([\"match\"])\n expect(page.hasMore).toBe(false)\n })\n })\n\n test(\"reports no backward page when only filtered-out records remain\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n { key: \"other\", payload: \"filtered-one\" },\n { key: \"other\", payload: \"filtered-two\" },\n { key: \"target\", payload: \"match\" },\n ],\n })\n\n const page = await broker.tail({\n projectId: \"project-a\",\n streamId: eventsStream.id,\n keys: [\"target\"],\n limit: 1,\n })\n expect(page.records.map((record) => record.payload)).toEqual([\"match\"])\n expect(page.hasMore).toBe(false)\n })\n })\n\n test(\"tails recent records and paginates toward older history\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [1, 2, 3, 4, 5].map((payload) => ({ payload })),\n })\n\n const recent = await broker.tail({\n projectId: \"project-a\",\n streamId: eventsStream.id,\n limit: 2,\n })\n expect(recent.records.map((record) => record.payload)).toEqual([4, 5])\n expect(recent.hasMore).toBe(true)\n\n const older = await broker.tail({\n projectId: \"project-a\",\n streamId: eventsStream.id,\n beforeCursor: recent.cursor,\n limit: 2,\n })\n expect(older.records.map((record) => record.payload)).toEqual([2, 3])\n expect(older.hasMore).toBe(true)\n })\n })\n })\n\n describe(\"latestCursor\", () => {\n test(\"returns undefined for missing and empty streams\", async () => {\n await withBroker(async (broker) => {\n expect(\n await broker.latestCursor({ projectId: \"project-a\", streamId: \"missing\" })\n ).toBeUndefined()\n\n await broker.ensureStream({ projectId: \"project-a\", stream: eventsStream })\n expect(\n await broker.latestCursor({ projectId: \"project-a\", streamId: eventsStream.id })\n ).toBeUndefined()\n })\n })\n\n test(\"returns the newest retained record cursor\", async () => {\n await withBroker(async (broker) => {\n const records = await appendRecords(broker, {\n projectId: \"project-a\",\n stream: retainedStream,\n records: [{ payload: \"one\" }, { payload: \"two\" }, { payload: \"three\" }],\n })\n\n expect(\n await broker.latestCursor({ projectId: \"project-a\", streamId: retainedStream.id })\n ).toBe(records.at(-1)?.cursor)\n })\n })\n })\n\n describe(\"subscribe\", () => {\n test(\"requires streams to be ensured before subscribing\", async () => {\n await withBroker(async (broker) => {\n await expect(\n broker.subscribe({ projectId: \"project-a\", streamId: \"missing\" }, () => {})\n ).rejects.toBeInstanceOf(BrokerError)\n })\n })\n\n test(\"defaults to latest and receives only new records\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ name: \"before\", payload: { value: \"before\" } }],\n })\n\n const received: string[] = []\n await subscribeRecords(\n broker,\n { projectId: \"project-a\", stream: eventsStream },\n (records) => {\n received.push(...records.map((record) => String(record.payload)))\n }\n )\n if (subscriptionSetupMs > 0) {\n await Bun.sleep(subscriptionSetupMs)\n }\n\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ name: \"after\", payload: \"after\" }],\n })\n\n await waitUntil(() => received.length === 1, {\n timeoutMs: subscriptionDeliveryTimeoutMs,\n intervalMs: subscriptionPollIntervalMs,\n message: \"Broker subscription did not receive the appended record\",\n })\n expect(received).toEqual([\"after\"])\n })\n })\n\n test(\"can subscribe from earliest retained record\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n { name: \"one\", payload: \"one\" },\n { name: \"two\", payload: \"two\" },\n ],\n })\n\n const received: string[] = []\n await subscribeRecords(\n broker,\n { projectId: \"project-a\", stream: eventsStream, from: \"earliest\" },\n (records) => {\n received.push(...records.map((record) => String(record.payload)))\n }\n )\n if (subscriptionSetupMs > 0) {\n await Bun.sleep(subscriptionSetupMs)\n }\n\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ name: \"three\", payload: \"three\" }],\n })\n\n await waitUntil(() => received.length === 3, {\n timeoutMs: subscriptionDeliveryTimeoutMs,\n intervalMs: subscriptionPollIntervalMs,\n message: \"Broker subscription did not receive retained plus live records\",\n })\n expect(received).toEqual([\"one\", \"two\", \"three\"])\n })\n })\n\n test(\"can subscribe after a cursor and filter by name and key\", async () => {\n await withBroker(async (broker) => {\n const [first] = await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [\n { name: \"test.record\", key: \"other\", payload: \"one\" },\n { name: \"telemetry.appended\", key: \"target\", payload: \"two\" },\n { name: \"test.record\", key: \"target\", payload: \"three\" },\n ],\n })\n\n const received: string[] = []\n await subscribeRecords(\n broker,\n {\n projectId: \"project-a\",\n stream: eventsStream,\n afterCursor: first?.cursor,\n names: [\"test.record\"],\n keys: [\"target\"],\n },\n (records) => {\n received.push(...records.map((record) => String(record.payload)))\n }\n )\n\n await waitUntil(() => received.length === 1, {\n timeoutMs: subscriptionDeliveryTimeoutMs,\n intervalMs: subscriptionPollIntervalMs,\n message: \"Broker subscription did not replay matching records after cursor\",\n })\n expect(received).toEqual([\"three\"])\n })\n })\n\n test(\"unsubscribe stops delivery\", async () => {\n await withBroker(async (broker) => {\n const received: string[] = []\n const unsubscribe = await subscribeRecords(\n broker,\n { projectId: \"project-a\", stream: eventsStream },\n (records) => {\n received.push(...records.map((record) => String(record.payload)))\n }\n )\n if (subscriptionSetupMs > 0) {\n await Bun.sleep(subscriptionSetupMs)\n }\n\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ payload: \"one\" }],\n })\n\n await waitUntil(() => received.length === 1, {\n timeoutMs: subscriptionDeliveryTimeoutMs,\n intervalMs: subscriptionPollIntervalMs,\n message: \"Broker subscription did not receive the first record before unsubscribe\",\n })\n\n unsubscribe()\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ payload: \"two\" }],\n })\n await Bun.sleep(Math.min(250, subscriptionDeliveryTimeoutMs))\n\n expect(received).toEqual([\"one\"])\n })\n })\n\n test(\"swallows handler errors\", async () => {\n await withBroker(async (broker) => {\n const received: string[] = []\n await subscribeRecords(broker, { projectId: \"project-a\", stream: eventsStream }, () => {\n throw new Error(\"subscriber failed\")\n })\n await subscribeRecords(\n broker,\n { projectId: \"project-a\", stream: eventsStream },\n (records) => {\n received.push(...records.map((record) => String(record.payload)))\n }\n )\n if (subscriptionSetupMs > 0) {\n await Bun.sleep(subscriptionSetupMs)\n }\n\n await expect(\n appendRecords(broker, {\n projectId: \"project-a\",\n stream: eventsStream,\n records: [{ payload: \"one\" }],\n })\n ).resolves.toHaveLength(1)\n await waitUntil(() => received.length === 1, {\n timeoutMs: subscriptionDeliveryTimeoutMs,\n intervalMs: subscriptionPollIntervalMs,\n message: \"Broker subscription delivery stopped after another handler threw\",\n })\n expect(received).toEqual([\"one\"])\n })\n })\n })\n\n describe(\"retention\", () => {\n test(\"bounds retained history by bytes\", async () => {\n await withBroker(async (broker) => {\n const stream = { id: \"__byte_retained\", retention: { maxBytes: 1_024 } }\n await broker.ensureStream({ projectId: \"project-a\", stream })\n\n await broker.append({\n projectId: \"project-a\",\n streamId: stream.id,\n records: [\"one\", \"two\", \"three\"].map((label) => ({\n name: label,\n payload: { label, body: \"x\".repeat(600) },\n })),\n })\n\n const records = await broker.read({\n projectId: \"project-a\",\n streamId: stream.id,\n })\n expect(records.records.length).toBeGreaterThan(0)\n expect(records.records.length).toBeLessThan(3)\n expect(records.records.at(-1)?.name).toBe(\"three\")\n })\n })\n\n test(\"retains only the latest maxRecords\", async () => {\n await withBroker(async (broker) => {\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream: retainedStream,\n records: [{ payload: \"one\" }, { payload: \"two\" }, { payload: \"three\" }],\n })\n\n const records = await readRecords(broker, {\n projectId: \"project-a\",\n stream: retainedStream,\n })\n\n expect(records.map((record) => record.payload)).toEqual([\"two\", \"three\"])\n })\n })\n\n test(\"rejects reads when the requested cursor predates the retained range\", async () => {\n await withBroker(async (broker) => {\n const [first] = await appendRecords(broker, {\n projectId: \"project-a\",\n stream: retainedStream,\n records: [\n { payload: \"one\" },\n { payload: \"two\" },\n { payload: \"three\" },\n { payload: \"four\" },\n ],\n })\n\n await expect(\n readRecords(broker, {\n projectId: \"project-a\",\n stream: retainedStream,\n afterCursor: first?.cursor,\n })\n ).rejects.toBeInstanceOf(BrokerError)\n\n await expect(\n broker.tail({\n projectId: \"project-a\",\n streamId: retainedStream.id,\n beforeCursor: first?.cursor,\n })\n ).rejects.toBeInstanceOf(BrokerError)\n })\n })\n\n test(\"retains only records within maxAgeMs\", async () => {\n await withBroker(async (broker) => {\n const stream = { id: \"__age_retained\", retention: { maxAgeMs } }\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream,\n records: [{ payload: \"old\" }],\n })\n\n await Bun.sleep(maxAgeWaitMs)\n\n await appendRecords(broker, {\n projectId: \"project-a\",\n stream,\n records: [{ payload: \"new\" }],\n })\n\n const records = await readRecords(broker, { projectId: \"project-a\", stream })\n\n expect(records.map((record) => record.payload)).toEqual([\"new\"])\n })\n })\n })\n })\n}\n\nasync function payloads(records: Promise<readonly BrokerRecord[]>): Promise<readonly unknown[]> {\n return (await records).map((record) => record.payload)\n}\n\nasync function appendRecords(\n broker: Broker,\n params: {\n projectId: string\n stream: BrokerStreamDefinition\n records: readonly BrokerRecordInput[]\n }\n): Promise<readonly BrokerRecord[]> {\n await broker.ensureStream({ projectId: params.projectId, stream: params.stream })\n return broker.append({\n projectId: params.projectId,\n streamId: params.stream.id,\n records: params.records,\n })\n}\n\nasync function readRecords(\n broker: Broker,\n params: {\n projectId: string\n stream: BrokerStreamDefinition\n afterCursor?: string\n limit?: number\n names?: readonly string[]\n keys?: readonly string[]\n }\n): Promise<readonly BrokerRecord[]> {\n await broker.ensureStream({ projectId: params.projectId, stream: params.stream })\n return (\n await broker.read({\n projectId: params.projectId,\n streamId: params.stream.id,\n afterCursor: params.afterCursor,\n limit: params.limit,\n names: params.names,\n keys: params.keys,\n })\n ).records\n}\n\nasync function subscribeRecords(\n broker: Broker,\n params: {\n projectId: string\n stream: BrokerStreamDefinition\n from?: \"latest\" | \"earliest\"\n afterCursor?: string\n names?: readonly string[]\n keys?: readonly string[]\n },\n handler: (records: readonly BrokerRecord[]) => void\n): Promise<() => void> {\n await broker.ensureStream({ projectId: params.projectId, stream: params.stream })\n return broker.subscribe(\n {\n projectId: params.projectId,\n streamId: params.stream.id,\n from: params.from,\n afterCursor: params.afterCursor,\n names: params.names,\n keys: params.keys,\n },\n handler\n )\n}\n\nasync function waitUntil(\n predicate: () => boolean,\n options: { timeoutMs: number; intervalMs: number; message: string }\n): Promise<void> {\n const deadline = Date.now() + options.timeoutMs\n while (Date.now() < deadline) {\n if (predicate()) {\n return\n }\n await Bun.sleep(options.intervalMs)\n }\n throw new Error(`${options.message} within ${options.timeoutMs}ms`)\n}\n",
|
|
9
|
+
"import { describe, expect, test } from \"bun:test\"\nimport { defineObjectType, link, OntologyRegistry, prop } from \"../ontology\"\nimport type { Storage } from \"../storage\"\nimport { createMaterializerTestFixture } from \"./materializer-fixture\"\n\nexport interface EffectiveStorageContractSuiteOptions<TStorage extends Storage> {\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"effective-storage-contract\"\nconst Device = defineObjectType({\n id: \"EffectiveStorageDevice\",\n name: \"Device\",\n properties: [\n prop(\"id\", \"string\", { primary: true, required: true }),\n prop(\"name\", \"string\", { required: true }),\n prop(\"temperature\", \"double\", { mode: \"telemetry\" }),\n ],\n links: [link.self(\"peers\", { cardinality: \"many\" })],\n})\nconst ontology = new OntologyRegistry({ sources: [Device] })\n\nexport function runEffectiveStorageContractSuite<TStorage extends Storage>(\n name: string,\n provider: EffectiveStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await provider.createStorage()\n try {\n await seedEffectiveState(storage)\n await body(storage)\n } finally {\n await provider.cleanup?.(storage)\n }\n }\n\n describe(name, () => {\n test(\"reads Materializer-owned objects\", async () => {\n await withStorage(async (storage) => {\n const object = await storage.objects.getByPrimaryId({\n projectId,\n objectTypeId: Device.id,\n primaryId: \"a\",\n })\n expect(object).toMatchObject({\n properties: { id: \"a\", name: \"Alpha\", temperature: 22 },\n version: 2,\n })\n expect(typeof object?.lastCommitId).toBe(\"string\")\n\n const batch = await storage.objects.getByPrimaryIdBatch({\n projectId,\n items: [\n { objectTypeId: Device.id, primaryId: \"a\" },\n { objectTypeId: Device.id, primaryId: \"missing\" },\n ],\n })\n expect([...batch.keys()]).toEqual([`${Device.id}:a`])\n })\n })\n\n test(\"reads Materializer-owned links\", async () => {\n await withStorage(async (storage) => {\n const outgoing = await storage.objects.listLinks({\n projectId,\n objectTypeId: Device.id,\n objectId: \"a\",\n })\n expect(outgoing.map((row) => row.targetId).sort()).toEqual([\"b\", \"c\"])\n expect(outgoing.every((row) => row.lastCommitId.length > 0)).toBe(true)\n\n const incoming = await storage.objects.listIncidentLinksBatch({\n projectId,\n items: [{ objectTypeId: Device.id, objectId: \"b\" }],\n })\n expect(incoming).toHaveLength(1)\n expect(incoming[0]).toMatchObject({ sourceId: \"a\", targetId: \"b\" })\n\n const linksByScope = await storage.objects.listLinksBatch({\n projectId,\n items: [{ objectTypeId: Device.id, objectId: \"a\", linkId: \"peers\" }],\n })\n expect(linksByScope.get(`${Device.id}:a:peers`)).toHaveLength(2)\n })\n })\n\n test(\"pages Materializer-owned objects with a stable cursor\", async () => {\n await withStorage(async (storage) => {\n const firstPage = await storage.objects.listByPrimaryIdPage({\n projectId,\n objectTypeId: Device.id,\n limit: 2,\n })\n expect(firstPage.objects.map((row) => row.primaryId)).toEqual([\"a\", \"b\"])\n expect(firstPage.nextPrimaryId).toBe(\"b\")\n const secondPage = await storage.objects.listByPrimaryIdPage({\n projectId,\n objectTypeId: Device.id,\n afterPrimaryId: firstPage.nextPrimaryId,\n limit: 2,\n })\n expect(secondPage.objects.map((row) => row.primaryId)).toEqual([\"c\"])\n })\n })\n\n test(\"reads Materializer-owned telemetry\", async () => {\n await withStorage(async (storage) => {\n const descending = await storage.timeseries.getHistory({\n projectId,\n objectTypeId: Device.id,\n objectId: \"a\",\n propertyId: \"temperature\",\n from: new Date(\"2026-01-01T10:30:00.000Z\"),\n order: \"desc\",\n })\n expect(descending.map((point) => point.value)).toEqual([22])\n expect(typeof descending[0]?.lastCommitId).toBe(\"string\")\n\n const histories = await storage.timeseries.getHistoryBatch({\n projectId,\n series: [\n { objectTypeId: Device.id, objectId: \"a\", propertyId: \"temperature\" },\n { objectTypeId: Device.id, objectId: \"b\", propertyId: \"temperature\" },\n ],\n limitPerSeries: 1,\n order: \"desc\",\n })\n expect(histories.map((series) => series.points[0]?.value)).toEqual([22, 18])\n\n const latest = await storage.timeseries.getLatest({\n projectId,\n objectTypeId: Device.id,\n objectId: \"a\",\n propertyId: \"temperature\",\n })\n expect(latest).toMatchObject({ value: 22, at: new Date(\"2026-01-01T12:00:00.000Z\") })\n })\n })\n })\n}\n\nasync function seedEffectiveState(storage: Storage): Promise<void> {\n const fixture = createMaterializerTestFixture({ projectId, ontology, storage })\n await fixture.seed({\n objects: [device(\"a\", \"Alpha\"), device(\"b\", \"Beta\"), device(\"c\", \"Gamma\")],\n links: [peer(\"a\", \"b\"), peer(\"a\", \"c\")],\n telemetry: [\n temperature(\"a\", 20, \"2026-01-01T10:00:00.000Z\"),\n temperature(\"a\", 22, \"2026-01-01T12:00:00.000Z\"),\n temperature(\"b\", 18, \"2026-01-01T11:00:00.000Z\"),\n ],\n })\n}\n\nfunction device(primaryId: string, name: string) {\n return {\n ref: { objectTypeId: Device.id, primaryId },\n properties: { id: primaryId, name },\n }\n}\n\nfunction peer(sourceId: string, targetId: string) {\n return {\n ref: {\n source: { objectTypeId: Device.id, primaryId: sourceId },\n linkId: \"peers\",\n target: { objectTypeId: Device.id, primaryId: targetId },\n },\n }\n}\n\nfunction temperature(objectId: string, value: number, at: string) {\n return {\n series: {\n object: { objectTypeId: Device.id, primaryId: objectId },\n propertyId: \"temperature\",\n },\n value,\n at,\n }\n}\n",
|
|
10
|
+
"import type { JsonValue } from \"../json\"\nimport type {\n EditCommitResult,\n OntologyEditOperation,\n OntologyLinkRef,\n OntologyObjectRef,\n TelemetryCommitResult,\n TelemetryPointWrite,\n} from \"../materialization/model\"\nimport {\n createOntologyMaterializer,\n type OntologyMaterializer,\n type OntologyMaterializerDependencies,\n} from \"../materializer/materializer\"\nimport type { OntologyRegistry } from \"../ontology\"\nimport { ProjectionRegistry } from \"../projections/registry\"\nimport type { Storage } from \"../storage\"\n\nexport interface MaterializerFixtureObject {\n readonly ref: OntologyObjectRef\n readonly properties: Readonly<Record<string, JsonValue>>\n}\n\nexport interface MaterializerFixtureLink {\n readonly ref: OntologyLinkRef\n readonly properties?: Readonly<Record<string, JsonValue>>\n}\n\nexport interface MaterializerFixtureSeed {\n readonly objects?: readonly MaterializerFixtureObject[]\n readonly links?: readonly MaterializerFixtureLink[]\n readonly telemetry?: readonly TelemetryPointWrite[]\n}\n\nexport interface MaterializerTestFixture {\n readonly materializer: OntologyMaterializer\n commit(operations: readonly OntologyEditOperation[]): Promise<EditCommitResult>\n appendTelemetry(points: readonly TelemetryPointWrite[]): Promise<TelemetryCommitResult>\n seed(input: MaterializerFixtureSeed): Promise<void>\n}\n\n/**\n * Creates data for storage/query tests through the same validated Materializer path as production.\n * It intentionally exposes no direct storage writer.\n */\nexport function createMaterializerTestFixture(input: {\n readonly projectId: string\n readonly ontology: OntologyRegistry\n readonly storage: Storage\n readonly dependencies?: OntologyMaterializerDependencies\n}): MaterializerTestFixture {\n const projections = new ProjectionRegistry({\n projections: [],\n ontology: input.ontology,\n datasetsById: new Map(),\n })\n const materializer = createOntologyMaterializer({\n projectId: input.projectId,\n ontology: input.ontology,\n projections,\n storage: input.storage,\n dependencies: input.dependencies,\n })\n let requestOrdinal = 0\n\n function nextRequestId(kind: \"edit\" | \"telemetry\"): string {\n requestOrdinal += 1\n return `materializer-fixture:${kind}:${requestOrdinal}`\n }\n\n async function commit(operations: readonly OntologyEditOperation[]): Promise<EditCommitResult> {\n return materializer.edits.commit({\n mode: \"atomic\",\n source: { kind: \"runtime\", requestId: nextRequestId(\"edit\") },\n operations,\n expectedObjects: [],\n expectedLinks: [],\n expectedLinkScopes: [],\n })\n }\n\n async function appendTelemetry(\n points: readonly TelemetryPointWrite[]\n ): Promise<TelemetryCommitResult> {\n return materializer.telemetry.append({\n source: { kind: \"runtime\", requestId: nextRequestId(\"telemetry\") },\n points,\n })\n }\n\n return {\n materializer,\n commit,\n appendTelemetry,\n async seed(seed) {\n const operations: OntologyEditOperation[] = []\n for (const object of seed.objects ?? []) {\n operations.push({\n id: `seed-object:${operations.length}`,\n kind: \"object.upsert\",\n ref: object.ref,\n properties: object.properties,\n })\n }\n for (const link of seed.links ?? []) {\n operations.push({\n id: `seed-link:${operations.length}`,\n kind: \"link.upsert\",\n ref: link.ref,\n ...(link.properties === undefined ? {} : { properties: link.properties }),\n })\n }\n if (operations.length > 0) await commit(operations)\n if (seed.telemetry && seed.telemetry.length > 0) {\n await appendTelemetry(seed.telemetry)\n }\n },\n }\n}\n",
|
|
11
|
+
"import { describe, expect, test } from \"bun:test\"\nimport type { FileRef } from \"../blob-storage\"\nimport { col, defineDataset } from \"../datasets\"\nimport { LakeStorageError } from \"../lake-storage/errors\"\nimport type { DatasetRow, LakeStorage } from \"../lake-storage/types\"\n\nexport type LakeStorageSchemaEvolutionCapability = \"strict\" | \"addNullableColumns\"\n\nexport interface LakeStorageContractSuiteOptions<TStorage extends LakeStorage = LakeStorage> {\n /** Factory that produces a fresh `LakeStorage` instance for each test case. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (storage: TStorage) => void | Promise<void>\n /**\n * Dataset definition update policy supported by the provider. Defaults to\n * `strict`, which allows metadata-only merges but rejects schema evolution.\n */\n readonly schemaEvolution?: LakeStorageSchemaEvolutionCapability\n /**\n * Version id that is syntactically valid for the provider but should not\n * exist. Defaults to a generic id accepted by providers without format\n * restrictions.\n */\n readonly missingVersionId?: string\n}\n\nconst definitionDataset = defineDataset(\"contract.definitions.orders\", {\n schema: [col(\"orderId\", \"string\"), col(\"customerName\", \"string\")],\n description: \"Contract orders\",\n})\n\nconst reorderedDefinitionDataset = defineDataset(\"contract.definitions.orders\", {\n schema: [col(\"customerName\", \"string\"), col(\"orderId\", \"string\")],\n description: \"Contract orders\",\n})\n\nconst writeDataset = defineDataset(\"contract.writes.orders\", {\n schema: [col(\"orderId\", \"string\"), col(\"customerName\", \"string\")],\n})\n\nconst nullableWriteDataset = defineDataset(\"contract.writes.nullable_orders\", {\n schema: [col(\"orderId\", \"string\"), col(\"note\", \"string\", { nullable: true })],\n})\n\nconst decimalWriteDataset = defineDataset(\"contract.writes.decimals\", {\n schema: [col(\"id\", \"string\"), col(\"amount\", \"decimal\", { nullable: true })],\n})\n\nconst fileRefDataset = defineDataset(\"contract.files.documents\", {\n schema: [col(\"id\", \"string\"), col(\"attachment\", \"fileRef\", { nullable: true })],\n})\n\nconst invoiceRef: FileRef = {\n blobId: `blob_${\"a\".repeat(64)}`,\n digest: `sha256:${\"a\".repeat(64)}`,\n sizeBytes: 15,\n fileName: \"invoice.txt\",\n mediaType: \"text/plain\",\n logicalPath: \"invoices/invoice.txt\",\n}\n\n/**\n * Runs the shared `LakeStorage` contract against any provider.\n *\n * The suite covers provider-independent Lake semantics: definition\n * materialization and compatibility checks, versioned writes and reads,\n * optimistic commits, unchanged-write detection, write-session lifecycle,\n * and row validation.\n */\nexport function runLakeStorageContractSuite<TStorage extends LakeStorage>(\n label: string,\n options: LakeStorageContractSuiteOptions<TStorage>\n): void {\n const schemaEvolution = options.schemaEvolution ?? \"strict\"\n const missingVersionId = options.missingVersionId ?? \"missing-version\"\n\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await body(storage)\n } finally {\n await options.teardown?.(storage)\n }\n }\n\n describe(label, () => {\n describe(\"dataset definitions\", () => {\n test(\"creates, gets, lists, and reuses dataset definitions\", async () => {\n await withStorage(async (storage) => {\n expect(await storage.getDataset(definitionDataset.id)).toBeNull()\n\n const created = await storage.createDataset(definitionDataset)\n const repeated = await storage.createDataset(definitionDataset)\n\n expect(created).toEqual(definitionDataset)\n expect(repeated).toEqual(definitionDataset)\n expect(await storage.getDataset(definitionDataset.id)).toEqual(definitionDataset)\n expect(await storage.getDataset(\"missing.dataset\")).toBeNull()\n expect(await storage.listDatasets()).toEqual([definitionDataset])\n expect(await storage.listVersions(definitionDataset.id)).toEqual([])\n })\n })\n\n test(\"treats same-column declaration reorders as a no-op\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(definitionDataset)\n await storage.assertDatasetDefinitionsCompatible([reorderedDefinitionDataset])\n\n expect(await storage.getDataset(definitionDataset.id)).toEqual(definitionDataset)\n await expect(storage.createDataset(reorderedDefinitionDataset)).resolves.toEqual(\n definitionDataset\n )\n expect(await storage.listVersions(definitionDataset.id)).toEqual([])\n })\n })\n\n test(\"persists compatible metadata additions\", async () => {\n await withStorage(async (storage) => {\n const minimalDataset = defineDataset(\"contract.definitions.metadata\", {\n schema: [col(\"orderId\", \"string\"), col(\"orderDate\", \"date\")],\n })\n const documentedDataset = defineDataset(\"contract.definitions.metadata\", {\n schema: [col(\"orderId\", \"string\"), col(\"orderDate\", \"date\")],\n partitionBy: [\"orderDate\"],\n description: \"Contract metadata\",\n })\n\n await storage.createDataset(minimalDataset)\n await storage.assertDatasetDefinitionsCompatible([documentedDataset])\n\n expect(await storage.getDataset(minimalDataset.id)).toEqual(minimalDataset)\n await expect(storage.createDataset(documentedDataset)).resolves.toEqual(documentedDataset)\n expect(await storage.getDataset(minimalDataset.id)).toEqual(documentedDataset)\n })\n })\n\n test(\"rejects incompatible definition changes without mutating the stored definition\", async () => {\n await withStorage(async (storage) => {\n const changedDataset = defineDataset(definitionDataset.id, {\n schema: [col(\"orderId\", \"int64\"), col(\"customerName\", \"string\")],\n description: \"Contract orders\",\n })\n\n await storage.createDataset(definitionDataset)\n\n await expect(\n storage.assertDatasetDefinitionsCompatible([changedDataset])\n ).rejects.toThrow(\"changing column 'orderId' type\")\n await expect(storage.createDataset(changedDataset)).rejects.toBeInstanceOf(\n LakeStorageError\n )\n expect(await storage.getDataset(definitionDataset.id)).toEqual(definitionDataset)\n })\n })\n\n test(\"checks provider schema evolution policy\", async () => {\n await withStorage(async (storage) => {\n const initialDataset = defineDataset(\"contract.definitions.schema_evolution\", {\n schema: [col(\"invoiceId\", \"string\")],\n })\n const requestedDataset = defineDataset(\"contract.definitions.schema_evolution\", {\n schema: [col(\"currency\", \"string\", { nullable: true }), col(\"invoiceId\", \"string\")],\n })\n const storedDataset = defineDataset(\"contract.definitions.schema_evolution\", {\n schema: [col(\"invoiceId\", \"string\"), col(\"currency\", \"string\", { nullable: true })],\n })\n\n await storage.createDataset(initialDataset)\n\n if (schemaEvolution === \"strict\") {\n await expect(\n storage.assertDatasetDefinitionsCompatible([requestedDataset])\n ).rejects.toThrow(\"incompatible schema\")\n await expect(storage.createDataset(requestedDataset)).rejects.toThrow(\n \"incompatible schema\"\n )\n expect(await storage.getDataset(initialDataset.id)).toEqual(initialDataset)\n return\n }\n\n await storage.assertDatasetDefinitionsCompatible([requestedDataset])\n expect(await storage.getDataset(initialDataset.id)).toEqual(initialDataset)\n expect(await storage.listVersions(initialDataset.id)).toEqual([])\n\n await expect(storage.createDataset(requestedDataset)).resolves.toEqual(storedDataset)\n expect(await storage.getDataset(initialDataset.id)).toEqual(storedDataset)\n\n const [schemaVersion] = await storage.listVersions(initialDataset.id)\n expect(schemaVersion).toMatchObject({\n datasetId: initialDataset.id,\n mode: \"schema\",\n schema: storedDataset.schema,\n })\n })\n })\n\n test(\"keeps compatibility checks read-only for missing datasets\", async () => {\n await withStorage(async (storage) => {\n await storage.assertDatasetDefinitionsCompatible([definitionDataset])\n\n expect(await storage.getDataset(definitionDataset.id)).toBeNull()\n expect(await storage.listDatasets()).toEqual([])\n })\n })\n })\n\n describe(\"catalog state\", () => {\n test(\"reports materialized state and latest version summaries in bulk\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await write.writeRows([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n ])\n const commit = await write.commit()\n expect(commit.outcome).toBe(\"created\")\n const version = commit\n\n await storage.createDataset(definitionDataset)\n\n const state = await storage.listDatasetCatalogState([\n writeDataset.id,\n definitionDataset.id,\n \"contract.missing.dataset\",\n ])\n\n const byId = new Map(state.map((entry) => [entry.datasetId, entry]))\n\n expect(byId.get(writeDataset.id)).toMatchObject({\n datasetId: writeDataset.id,\n materialized: true,\n })\n expect(byId.get(writeDataset.id)?.latestVersion).toMatchObject({\n datasetId: writeDataset.id,\n versionId: version.versionId,\n mode: \"snapshot\",\n rowCount: 2,\n })\n\n // Created without a committed write: materialized, but no version.\n expect(byId.get(definitionDataset.id)).toEqual({\n datasetId: definitionDataset.id,\n materialized: true,\n latestVersion: null,\n })\n\n // Registered but never created.\n expect(byId.get(\"contract.missing.dataset\")).toEqual({\n datasetId: \"contract.missing.dataset\",\n materialized: false,\n latestVersion: null,\n })\n })\n })\n\n test(\"returns an empty result for an empty request\", async () => {\n await withStorage(async (storage) => {\n expect(await storage.listDatasetCatalogState([])).toEqual([])\n })\n })\n })\n\n describe(\"writes and reads\", () => {\n test(\"keeps immutable-version row order and offsets stable\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n const expected = [\n { orderId: \"ord_3\", customerName: \"Katherine\" },\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_5\", customerName: \"Margaret\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n { orderId: \"ord_4\", customerName: \"Dorothy\" },\n ]\n await write.writeRows(expected)\n const version = await write.commit()\n const pinned = { datasetId: writeDataset.id, versionId: version.versionId }\n\n await expect(collectRows(storage.readRows(pinned))).resolves.toEqual(expected)\n await expect(collectRows(storage.readRows(pinned))).resolves.toEqual(expected)\n for (const offset of [0, 2, expected.length, expected.length + 3]) {\n await expect(collectRows(storage.readRows({ ...pinned, offset }))).resolves.toEqual(\n expected.slice(offset)\n )\n }\n await expect(\n collectRows(storage.readRows({ ...pinned, columns: [\"orderId\"], offset: 1, limit: 2 }))\n ).resolves.toEqual([{ orderId: \"ord_1\" }, { orderId: \"ord_5\" }])\n })\n })\n\n test(\"rejects writes for unknown datasets\", async () => {\n await withStorage(async (storage) => {\n await expect(storage.beginWrite({ dataset: writeDataset })).rejects.toThrow(\n \"Unknown dataset\"\n )\n })\n })\n\n test(\"commits snapshot and append versions with versioned reads\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const snapshotWrite = await storage.beginWrite({\n dataset: writeDataset,\n mode: \"snapshot\",\n producer: { kind: \"sync\", id: \"contract-sync\", runId: \"run_1\" },\n })\n await snapshotWrite.writeRows([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n ])\n const snapshotCommit = await snapshotWrite.commit({ commitMessage: \"snapshot orders\" })\n expect(snapshotCommit.outcome).toBe(\"created\")\n const version1 = snapshotCommit\n\n expect(version1).toMatchObject({\n datasetId: writeDataset.id,\n mode: \"snapshot\",\n schema: writeDataset.schema,\n producer: { kind: \"sync\", id: \"contract-sync\", runId: \"run_1\" },\n rowCount: 2,\n })\n expect(version1.parentVersionId).toBeUndefined()\n expect(await storage.getLatestVersion(writeDataset.id)).toMatchObject({\n versionId: version1.versionId,\n })\n expect(await storage.getVersion(writeDataset.id, version1.versionId)).toMatchObject({\n datasetId: writeDataset.id,\n versionId: version1.versionId,\n mode: \"snapshot\",\n rowCount: 2,\n })\n\n await Bun.sleep(2)\n\n const appendWrite = await storage.beginWrite({\n dataset: writeDataset,\n mode: \"append\",\n inputs: [{ datasetId: writeDataset.id, versionId: version1.versionId }],\n })\n await appendWrite.writeRows([{ orderId: \"ord_3\", customerName: \"Katherine\" }])\n const appendCommit = await appendWrite.commit({\n expectedLatestVersionId: version1.versionId,\n })\n expect(appendCommit.outcome).toBe(\"created\")\n const version2 = appendCommit\n\n expect(version2).toMatchObject({\n datasetId: writeDataset.id,\n parentVersionId: version1.versionId,\n mode: \"append\",\n schema: writeDataset.schema,\n inputs: [{ datasetId: writeDataset.id, versionId: version1.versionId }],\n rowCount: 3,\n })\n expect(await storage.getLatestVersion(writeDataset.id)).toMatchObject({\n versionId: version2.versionId,\n })\n\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).resolves.toEqual([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n { orderId: \"ord_3\", customerName: \"Katherine\" },\n ])\n await expect(\n collectRows(\n storage.readRows({ datasetId: writeDataset.id, versionId: version1.versionId })\n )\n ).resolves.toEqual([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n ])\n await expect(\n collectRows(\n storage.readRows({\n datasetId: writeDataset.id,\n columns: [\"orderId\"],\n limit: 2,\n })\n )\n ).resolves.toEqual([{ orderId: \"ord_1\" }, { orderId: \"ord_2\" }])\n await expect(\n collectRows(\n storage.readRows({\n datasetId: writeDataset.id,\n columns: [\"orderId\"],\n limit: 1,\n offset: 1,\n })\n )\n ).resolves.toEqual([{ orderId: \"ord_2\" }])\n await expect(\n collectRows(\n storage.readRows({\n datasetId: writeDataset.id,\n columns: [\"orderId\"],\n offset: 1,\n })\n )\n ).resolves.toEqual([{ orderId: \"ord_2\" }, { orderId: \"ord_3\" }])\n\n expect(\n (await storage.listVersions(writeDataset.id)).map((version) => version.versionId)\n ).toEqual([version2.versionId, version1.versionId])\n expect(\n (await storage.listVersions(writeDataset.id, 1)).map((version) => version.versionId)\n ).toEqual([version2.versionId])\n expect(await storage.listVersions(\"missing.dataset\")).toEqual([])\n expect(await storage.getLatestVersion(\"missing.dataset\")).toBeNull()\n expect(await storage.getVersion(writeDataset.id, missingVersionId)).toBeNull()\n })\n })\n\n test(\"snapshot writes replace the visible latest rows\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const firstWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await firstWrite.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n const firstVersion = await firstWrite.commit()\n\n const replacementWrite = await storage.beginWrite({\n dataset: writeDataset,\n mode: \"snapshot\",\n })\n await replacementWrite.writeRows([{ orderId: \"ord_9\", customerName: \"Dorothy\" }])\n const replacementVersion = await replacementWrite.commit()\n\n expect(replacementVersion.versionId).not.toBe(firstVersion.versionId)\n expect(replacementVersion.parentVersionId).toBeUndefined()\n expect(replacementVersion.rowCount).toBe(1)\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).resolves.toEqual([{ orderId: \"ord_9\", customerName: \"Dorothy\" }])\n await expect(\n collectRows(\n storage.readRows({ datasetId: writeDataset.id, versionId: firstVersion.versionId })\n )\n ).resolves.toEqual([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n })\n })\n\n test(\"reuses the latest version when a snapshot commits identical content\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const seedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await seedWrite.writeRows([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Grace\" },\n ])\n const seedVersion = await seedWrite.commit()\n expect(seedVersion.outcome).toBe(\"created\")\n\n // Identical rows in a different order are the same snapshot content.\n const identicalWrite = await storage.beginWrite({\n dataset: writeDataset,\n mode: \"snapshot\",\n })\n await identicalWrite.writeRows([\n { orderId: \"ord_2\", customerName: \"Grace\" },\n { orderId: \"ord_1\", customerName: \"Ada\" },\n ])\n const identicalVersion = await identicalWrite.commit()\n\n expect(identicalVersion.outcome).toBe(\"unchanged\")\n expect(identicalVersion.versionId).toBe(seedVersion.versionId)\n expect(\n (await storage.listVersions(writeDataset.id)).map((version) => version.versionId)\n ).toEqual([seedVersion.versionId])\n expect(await storage.getLatestVersion(writeDataset.id)).toMatchObject({\n versionId: seedVersion.versionId,\n })\n\n await Bun.sleep(2)\n\n const changedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await changedWrite.writeRows([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_2\", customerName: \"Hopper\" },\n ])\n const changedVersion = await changedWrite.commit()\n\n expect(changedVersion.outcome).toBe(\"created\")\n expect(changedVersion.versionId).not.toBe(seedVersion.versionId)\n expect(\n (await storage.listVersions(writeDataset.id)).map((version) => version.versionId)\n ).toEqual([changedVersion.versionId, seedVersion.versionId])\n })\n })\n\n test(\"snapshot content comparison respects row multiplicities\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n const rowA = { orderId: \"ord_1\", customerName: \"Ada\" }\n const rowB = { orderId: \"ord_2\", customerName: \"Grace\" }\n\n const seedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await seedWrite.writeRows([rowA, rowA, rowB])\n const seedVersion = await seedWrite.commit()\n\n await Bun.sleep(2)\n\n // Same distinct rows and row count, but different duplicate counts:\n // this is new content, not a no-op.\n const shiftedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await shiftedWrite.writeRows([rowA, rowB, rowB])\n const shiftedVersion = await shiftedWrite.commit()\n\n expect(shiftedVersion.outcome).toBe(\"created\")\n expect(shiftedVersion.versionId).not.toBe(seedVersion.versionId)\n })\n })\n\n test(\"treats omitted and null nullable values as the same snapshot content\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(nullableWriteDataset)\n\n const seedWrite = await storage.beginWrite({\n dataset: nullableWriteDataset,\n mode: \"snapshot\",\n })\n await seedWrite.writeRows([{ orderId: \"ord_1\", note: null }])\n const seedVersion = await seedWrite.commit()\n\n const omittedWrite = await storage.beginWrite({\n dataset: nullableWriteDataset,\n mode: \"snapshot\",\n })\n await omittedWrite.writeRows([{ orderId: \"ord_1\" }])\n const omittedVersion = await omittedWrite.commit()\n\n expect(omittedVersion.outcome).toBe(\"unchanged\")\n expect(omittedVersion.versionId).toBe(seedVersion.versionId)\n })\n })\n\n test(\"reuses the latest version when an append commits zero rows\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const seedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await seedWrite.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n const seedVersion = await seedWrite.commit()\n\n const emptyAppend = await storage.beginWrite({ dataset: writeDataset, mode: \"append\" })\n const appendVersion = await emptyAppend.commit()\n\n expect(appendVersion.outcome).toBe(\"unchanged\")\n expect(appendVersion.versionId).toBe(seedVersion.versionId)\n expect(appendVersion.rowCount).toBe(1)\n expect(\n (await storage.listVersions(writeDataset.id)).map((version) => version.versionId)\n ).toEqual([seedVersion.versionId])\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).resolves.toEqual([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n })\n })\n\n test(\"fails stale optimistic commits\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const seedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await seedWrite.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n const initialVersion = await seedWrite.commit()\n\n const delayedWrite = await storage.beginWrite({ dataset: writeDataset, mode: \"append\" })\n await delayedWrite.writeRows([{ orderId: \"ord_2\", customerName: \"Grace\" }])\n\n const competingWrite = await storage.beginWrite({\n dataset: writeDataset,\n mode: \"append\",\n })\n await competingWrite.writeRows([{ orderId: \"ord_3\", customerName: \"Katherine\" }])\n await competingWrite.commit({ expectedLatestVersionId: initialVersion.versionId })\n\n await expect(\n delayedWrite.commit({ expectedLatestVersionId: initialVersion.versionId })\n ).rejects.toThrow(\"Optimistic commit failed\")\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).resolves.toEqual([\n { orderId: \"ord_1\", customerName: \"Ada\" },\n { orderId: \"ord_3\", customerName: \"Katherine\" },\n ])\n })\n })\n\n test(\"abort closes a write session without committing rows\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await write.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n await write.abort()\n await write.abort()\n\n expect(await storage.getLatestVersion(writeDataset.id)).toBeNull()\n expect(await storage.listVersions(writeDataset.id)).toEqual([])\n await expect(\n collectRows(storage.readRows({ datasetId: writeDataset.id }))\n ).rejects.toThrow(\"No committed version found\")\n })\n })\n\n test(\"commit closes a write session and leaves abort idempotent\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n await write.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\" }])\n await write.commit()\n await write.abort()\n\n await expect(write.writeRows([])).rejects.toThrow(\"already closed\")\n })\n })\n\n test(\"rejects rows that do not match the dataset schema\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(writeDataset)\n const write = await storage.beginWrite({ dataset: writeDataset, mode: \"snapshot\" })\n\n await expect(write.writeRows([{ orderId: \"ord_1\" }])).rejects.toThrow(\n \"missing required column\"\n )\n await expect(\n write.writeRows([{ orderId: \"ord_1\", customerName: \"Ada\", unexpected: true } as never])\n ).rejects.toThrow(\"unknown column\")\n await write.abort()\n })\n })\n\n test(\"round-trips exact decimal strings in eager and streaming reads\", async () => {\n await withStorage(async (storage) => {\n const exact = \"9007199254740993.123456789\"\n await storage.createDataset(decimalWriteDataset)\n\n const write = await storage.beginWrite({ dataset: decimalWriteDataset, mode: \"snapshot\" })\n await write.writeRows([\n { id: \"amount_1\", amount: exact },\n { id: \"amount_2\", amount: null },\n ])\n await write.commit()\n\n await expect(\n collectRows(storage.readRows({ datasetId: decimalWriteDataset.id }))\n ).resolves.toEqual([\n { id: \"amount_1\", amount: exact },\n { id: \"amount_2\", amount: null },\n ])\n await expect(\n collectRows(\n storage.readRows({\n datasetId: decimalWriteDataset.id,\n columns: [\"amount\"],\n limit: 1,\n })\n )\n ).resolves.toEqual([{ amount: exact }])\n })\n })\n\n test(\"round-trips fileRef row values\", async () => {\n await withStorage(async (storage) => {\n await storage.createDataset(fileRefDataset)\n\n const write = await storage.beginWrite({ dataset: fileRefDataset, mode: \"snapshot\" })\n await write.writeRows([\n { id: \"doc_1\", attachment: invoiceRef },\n { id: \"doc_2\", attachment: null },\n ])\n await write.commit()\n\n await expect(\n collectRows(storage.readRows({ datasetId: fileRefDataset.id }))\n ).resolves.toEqual([\n { id: \"doc_1\", attachment: invoiceRef },\n { id: \"doc_2\", attachment: null },\n ])\n })\n })\n })\n })\n}\n\nasync function collectRows(rows: AsyncIterable<DatasetRow>): Promise<DatasetRow[]> {\n const result: DatasetRow[] = []\n for await (const row of rows) {\n result.push(row)\n }\n return result\n}\n",
|
|
12
|
+
"import { describe, expect, test } from \"bun:test\"\nimport { commitExactObject, type OntologyContractStorage } from \"./ontology-contract-fixture\"\n\n/** Stable logical failure points exercised by the provider-independent exact-plan fixture. */\nexport type MaterializationFailureBoundary =\n | \"effective.object.upsert\"\n | \"outbox.insert\"\n | \"finalize\"\n\nexport interface MaterializationFailureContractSuiteOptions<\n TStorage extends OntologyContractStorage = OntologyContractStorage,\n TSnapshot = unknown,\n> {\n /** Factory that returns an isolated, transaction-capable storage facade for each test. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Optional provider setup invoked after the storage facade is created. */\n readonly setup?: (storage: TStorage) => void | Promise<void>\n /** Optional provider cleanup invoked after every test, including failed tests. */\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n /** Captures every provider state that must participate in materialization rollback. */\n readonly captureState: (storage: TStorage) => TSnapshot | Promise<TSnapshot>\n /** Arms one logical write boundary to throw the supplied failure. */\n readonly injectFailure: (\n storage: TStorage,\n boundary: MaterializationFailureBoundary,\n failure: Error\n ) => void | Promise<void>\n /** Clears provider hooks after an injected attempt. */\n readonly clearFailure?: (storage: TStorage) => void | Promise<void>\n /** Providers may omit a boundary only when their test adapter cannot expose it. */\n readonly boundaries?: readonly MaterializationFailureBoundary[]\n}\n\n/**\n * Verifies that failures in the exact-plan write path leave no partial object,\n * commit, or outbox state. The suite is opt-in because production adapters do\n * not need to expose failure injection.\n */\nexport function runMaterializationFailureContractSuite<\n TStorage extends OntologyContractStorage,\n TSnapshot,\n>(label: string, options: MaterializationFailureContractSuiteOptions<TStorage, TSnapshot>): void {\n const boundaries = options.boundaries ?? [\"effective.object.upsert\", \"outbox.insert\", \"finalize\"]\n\n describe(label, () => {\n for (const boundary of boundaries) {\n test(`rolls back the complete transaction when ${boundary} fails`, async () => {\n const storage = await options.createStorage()\n try {\n await options.setup?.(storage)\n const before = await options.captureState(storage)\n const failure = new Error(`contract injected ${boundary}`)\n await options.injectFailure(storage, boundary, failure)\n await expect(commitExactObject(storage, `failure-${boundary}`)).rejects.toThrow(\n failure.message\n )\n await options.clearFailure?.(storage)\n expect(await options.captureState(storage)).toEqual(before)\n } finally {\n await options.clearFailure?.(storage)\n await options.cleanup?.(storage)\n }\n })\n }\n })\n}\n",
|
|
13
|
+
"import { createEventId } from \"../materialization/identity\"\nimport type {\n MaterializationPlanHeader,\n MaterializationWorkRecord,\n OntologyMaterializationEvent,\n OntologyStorage,\n} from \"../storage/ontology\"\nimport type { Storage } from \"../storage/types\"\n\nexport interface OntologyContractStorage extends Storage {\n readonly ontology: OntologyStorage\n}\n\nconst emptyChunk = {\n overrides: { objectUpserts: [], objectDeletes: [], linkUpserts: [], linkDeletes: [] },\n effective: {\n objectUpserts: [],\n objectDeletes: [],\n linkUpserts: [],\n linkDeletes: [],\n },\n timeseries: { pointUpserts: [] },\n outbox: [],\n} as const\n\nexport function contractEditHeader(id: string): MaterializationPlanHeader {\n return {\n commit: {\n projectId: \"contract-project\",\n id,\n idempotencyKey: `runtime:${id}`,\n requestHash: `hash:${id}`,\n origin: { kind: \"runtime\", requestId: id },\n ontologyRevision: \"ontology-contract-revision\",\n intent: { kind: \"edit\", mode: \"atomic\", operationCount: 0 },\n committedAt: CONTRACT_COMMITTED_AT,\n },\n expected: {\n sources: [],\n objects: [],\n links: [],\n linkScopes: [],\n points: [],\n },\n }\n}\n\nexport const CONTRACT_COMMITTED_AT = \"2026-01-02T00:00:00.000Z\"\n\nexport function contractEditResult(commitId: string, eventCount = 0) {\n return {\n kind: \"edit\" as const,\n commitId,\n created: true,\n eventCount,\n committedAt: CONTRACT_COMMITTED_AT,\n outcomes: [],\n changes: { objects: [], links: [] },\n }\n}\n\nexport async function commitEmptyEdit(storage: OntologyContractStorage, id: string): Promise<void> {\n await storage.transaction(async (tx) => {\n const session = await tx.ontology.materializations.begin(contractEditHeader(id))\n await tx.ontology.materializations.finalize({\n session,\n finalization: { sourceActivations: [], result: contractEditResult(id) },\n })\n })\n}\n\n/**\n * Applies a provider-authored exact object row and matching outbox row. The\n * fixture contains no ontology merge or diff logic; all semantic decisions are\n * already represented by the exact plan.\n */\nexport async function commitExactObject(\n storage: OntologyContractStorage,\n id: string,\n options: {\n readonly primaryId?: string\n readonly omitFinalize?: boolean\n readonly throwAfterFinalize?: boolean\n } = {}\n): Promise<{ readonly eventId: string }> {\n const header = contractEditHeader(id)\n const ref = { objectTypeId: \"ContractDevice\", primaryId: options.primaryId ?? id }\n const row = {\n ref,\n properties: { name: id },\n version: 1,\n createdAt: header.commit.committedAt,\n updatedAt: header.commit.committedAt,\n lastCommitId: id,\n }\n const exactWrite = { row, expected: { ref, exists: false as const } }\n const draft = {\n schemaVersion: 1 as const,\n projectId: header.commit.projectId,\n occurredAt: header.commit.committedAt,\n origin: header.commit.origin,\n commitId: id,\n type: \"object.created\" as const,\n topic: \"objects\" as const,\n partitionKey: `${ref.objectTypeId}:${ref.primaryId}`,\n payload: {\n objectTypeId: ref.objectTypeId,\n primaryId: ref.primaryId,\n properties: row.properties,\n propertyChanges: {},\n },\n }\n const eventId = createEventId(header.commit.projectId, id, 0)\n const envelope: OntologyMaterializationEvent = {\n ...draft,\n id: eventId,\n commitOrdinal: 0,\n }\n const work: readonly MaterializationWorkRecord[] = [\n {\n kind: \"plan\",\n recordKey: `plan:${id}`,\n applyPhase: 4,\n sortKey: \"61\",\n item: { kind: \"object-upsert\", value: exactWrite },\n },\n {\n kind: \"event\",\n recordKey: `event:0:${id}`,\n eventKindRank: 0,\n sortKey: \"61\",\n draft,\n },\n ]\n\n await storage.transaction(async (tx) => {\n const materializations = tx.ontology.materializations\n const session = await materializations.begin(header)\n await materializations.stageWork({ session, records: work })\n\n const applyRecords = []\n for await (const page of materializations.streamWork({\n session,\n order: \"apply\",\n pageRows: 1,\n })) {\n applyRecords.push(...page.records)\n }\n const objectUpserts = applyRecords.flatMap((record) =>\n record.kind === \"plan\" && record.item.kind === \"object-upsert\" ? [record.item.value] : []\n )\n await materializations.applyChunk({\n session,\n chunk: {\n ...emptyChunk,\n effective: { ...emptyChunk.effective, objectUpserts },\n },\n })\n\n const eventRecords = []\n for await (const page of materializations.streamWork({\n session,\n order: \"event\",\n pageRows: 1,\n })) {\n eventRecords.push(...page.records)\n }\n await materializations.applyChunk({\n session,\n chunk: {\n ...emptyChunk,\n outbox: eventRecords.map((record) => {\n if (record.kind !== \"event\") throw new Error(\"Expected event work record.\")\n return {\n envelope,\n availableAt: header.commit.committedAt,\n createdAt: header.commit.committedAt,\n }\n }),\n },\n })\n if (!options.omitFinalize) {\n await materializations.finalize({\n session,\n finalization: { sourceActivations: [], result: contractEditResult(id, 1) },\n })\n }\n if (options.throwAfterFinalize) throw new Error(\"contract rollback\")\n })\n\n return { eventId }\n}\n",
|
|
14
|
+
"import { expect, test } from \"bun:test\"\nimport {\n col,\n type DatasetDefinition,\n defineDataset,\n defineObjectType,\n defineProjection,\n link,\n OntologyRegistry,\n prop,\n type Storage,\n} from \"..\"\nimport {\n createOntologyMaterializer,\n ProjectionRegistry,\n type ProjectionSourceEntry,\n} from \"../materializer\"\nimport type { ActionRunStorage, ProjectionRunStorage } from \"../storage\"\n\nexport interface MaterializerStorageContractProvider<TStorage extends Storage> {\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\ntype ContractStorage = Storage & {\n readonly actionRuns: ActionRunStorage\n readonly projectionRuns: ProjectionRunStorage\n}\n\nconst Device = defineObjectType({\n id: \"StorageContractDevice\",\n name: \"Device\",\n properties: [\n prop(\"id\", \"string\", { primary: true, required: true }),\n prop(\"name\", \"string\", { required: true }),\n prop(\"temperature\", \"double\", { mode: \"telemetry\" }),\n ],\n links: [link.self(\"parent\", { cardinality: \"one\" })],\n})\n\nconst devices = defineDataset(\"storage_contract_devices\", {\n schema: [\n col(\"id\", \"string\"),\n col(\"name\", \"string\"),\n col(\"parent_id\", \"string\", { nullable: true }),\n ],\n})\nconst readings = defineDataset(\"storage_contract_readings\", {\n schema: [col(\"device_id\", \"string\"), col(\"at\", \"timestamp\"), col(\"value\", \"float64\")],\n})\nconst deviceProjection = defineProjection(\"storage_contract_devices\", Device)\n .fromDataset(devices)\n .properties({ id: \"id\", name: \"name\" })\n .withLinks({\n parent: {\n link: Device.l.parent,\n sourceField: \"parent_id\",\n target: Device,\n },\n })\nconst temperatureProjection = defineProjection(\n \"storage_contract_temperatures\",\n Device.p.temperature\n)\n .fromDataset(readings)\n .points({ objectId: \"device_id\", at: \"at\", value: \"value\" })\n\nconst ontology = new OntologyRegistry({ sources: [Device] })\nconst projections = new ProjectionRegistry({\n projections: [deviceProjection, temperatureProjection],\n ontology,\n datasetsById: new Map<string, DatasetDefinition>([\n [devices.id, devices],\n [readings.id, readings],\n ]),\n})\n\nexport function runMaterializerStorageContractSuite<TStorage extends Storage>(\n name: string,\n provider: MaterializerStorageContractProvider<TStorage>\n): void {\n test(`${name} persists replacement, Action, and telemetry commits atomically`, async () => {\n const createdStorage = await provider.createStorage()\n const storage = requireContractStorage(createdStorage)\n let materializationOrdinal = 0\n const materializer = createOntologyMaterializer({\n projectId: \"materializer-storage-contract\",\n ontology,\n projections,\n storage,\n dependencies: {\n batching: { sourceStageRows: 1, statePageRows: 1, planChunkRows: 1 },\n clock: () => new Date(\"2026-02-01T12:00:00.000Z\"),\n materializationId: () => `storage-contract-candidate-${++materializationOrdinal}`,\n },\n })\n\n try {\n const firstVersion = {\n datasetId: devices.id,\n versionId: \"v1\",\n createdAt: \"2026-01-01T00:00:00.000Z\",\n }\n const firstExecution = await claim(storage, {\n runId: \"replacement-v1\",\n projectionId: deviceProjection.id,\n protocol: \"replacement\",\n datasetVersion: firstVersion,\n })\n const first = await materializer.projections.replace({\n source: { projectionId: deviceProjection.id },\n datasetVersion: firstVersion,\n execution: firstExecution,\n entries: entries([sourceEntry(\"one\", \"One\", \"two\"), sourceEntry(\"two\", \"Two\")]),\n })\n expect(first.counts).toMatchObject({ objectsCreated: 2, linksCreated: 1 })\n expect(\n await storage.objects.getByPrimaryId({\n projectId: \"materializer-storage-contract\",\n objectTypeId: Device.id,\n primaryId: \"one\",\n })\n ).toMatchObject({ properties: { id: \"one\", name: \"One\" }, lastCommitId: first.commitId })\n\n const secondVersion = {\n datasetId: devices.id,\n versionId: \"v2\",\n createdAt: \"2026-01-02T00:00:00.000Z\",\n }\n const secondExecution = await claim(storage, {\n runId: \"replacement-v2\",\n projectionId: deviceProjection.id,\n protocol: \"replacement\",\n datasetVersion: secondVersion,\n })\n const second = await materializer.projections.replace({\n source: { projectionId: deviceProjection.id },\n datasetVersion: secondVersion,\n execution: secondExecution,\n entries: entries([sourceEntry(\"one\", \"One updated\")]),\n })\n expect(second.counts).toMatchObject({\n objectsUpdated: 1,\n objectsDeleted: 1,\n linksDeleted: 1,\n })\n expect(\n await storage.objects.getByPrimaryId({\n projectId: \"materializer-storage-contract\",\n objectTypeId: Device.id,\n primaryId: \"two\",\n })\n ).toBeNull()\n\n await expect(\n materializer.edits.commit({\n mode: \"atomic\",\n source: { kind: \"action\", actionId: \"renameDevice\", runId: \"missing-action-run\" },\n operations: [\n {\n id: \"missing-run-rename\",\n kind: \"object.patch\",\n ref: { objectTypeId: Device.id, primaryId: \"one\" },\n set: { name: \"Must not persist\" },\n unset: [],\n reset: [],\n },\n ],\n expectedObjects: [],\n expectedLinks: [],\n expectedLinkScopes: [],\n })\n ).rejects.toThrow(\"missing-action-run\")\n\n await storage.actionRuns.queue({\n id: \"action-run\",\n projectId: \"materializer-storage-contract\",\n actionId: \"renameDevice\",\n subject: { kind: \"object\", objectTypeId: Device.id, primaryId: \"one\" },\n params: {},\n idempotencyKey: \"action-run\",\n })\n await storage.actionRuns.start({\n id: \"action-run\",\n projectId: \"materializer-storage-contract\",\n })\n const actionCommit = await materializer.edits.commit({\n mode: \"atomic\",\n source: { kind: \"action\", actionId: \"renameDevice\", runId: \"action-run\" },\n operations: [\n {\n id: \"rename\",\n kind: \"object.patch\",\n ref: { objectTypeId: Device.id, primaryId: \"one\" },\n set: { name: \"Managed name\" },\n unset: [],\n reset: [],\n },\n ],\n expectedObjects: [],\n expectedLinks: [],\n expectedLinkScopes: [],\n })\n expect(\n await storage.ontology.commits.getByOrigin({\n projectId: \"materializer-storage-contract\",\n origin: { kind: \"action\", actionRunId: \"action-run\" },\n })\n ).toMatchObject({ id: actionCommit.commitId })\n\n const telemetryVersion = {\n datasetId: readings.id,\n versionId: \"readings-v1\",\n createdAt: \"2026-01-03T00:00:00.000Z\",\n }\n await expect(\n materializer.telemetry.append({\n source: {\n kind: \"projection\",\n projection: { projectionId: temperatureProjection.id },\n datasetVersion: {\n datasetId: readings.id,\n versionId: \"missing-readings-run\",\n createdAt: \"2026-01-02T12:00:00.000Z\",\n },\n execution: {\n projectionRunId: \"missing-telemetry-run\",\n executionToken: \"missing-execution-token\",\n },\n batchOrdinal: 0,\n sourceRowCount: 1,\n sourceRowsSkipped: 0,\n inputExhausted: true,\n },\n points: [\n {\n series: {\n object: { objectTypeId: Device.id, primaryId: \"one\" },\n propertyId: \"temperature\",\n },\n value: 20,\n at: \"2026-01-02T13:00:00.000Z\",\n },\n ],\n })\n ).rejects.toThrow(\"missing-telemetry-run\")\n\n const telemetryExecution = await claim(storage, {\n runId: \"telemetry-v1\",\n projectionId: temperatureProjection.id,\n protocol: \"telemetry\",\n datasetVersion: telemetryVersion,\n fixedBatchSize: 1,\n })\n const telemetry = await materializer.telemetry.append({\n source: {\n kind: \"projection\",\n projection: { projectionId: temperatureProjection.id },\n datasetVersion: telemetryVersion,\n execution: telemetryExecution,\n batchOrdinal: 0,\n sourceRowCount: 1,\n sourceRowsSkipped: 0,\n inputExhausted: true,\n },\n points: [\n {\n series: {\n object: { objectTypeId: Device.id, primaryId: \"one\" },\n propertyId: \"temperature\",\n },\n value: 21.5,\n at: \"2026-01-03T01:00:00.000Z\",\n },\n ],\n })\n expect(telemetry).toMatchObject({ pointsCreated: 1, latestObjectsChanged: 1 })\n expect(\n await storage.timeseries.getLatest({\n projectId: \"materializer-storage-contract\",\n objectTypeId: Device.id,\n objectId: \"one\",\n propertyId: \"temperature\",\n })\n ).toMatchObject({ value: 21.5, lastCommitId: telemetry.commitId })\n } finally {\n await provider.cleanup?.(createdStorage)\n }\n })\n}\n\nfunction requireContractStorage(storage: Storage): ContractStorage {\n if (!storage.actionRuns) {\n throw new Error(\"[Sixb] Materializer storage contract requires Action materialization runs.\")\n }\n if (!storage.projectionRuns) {\n throw new Error(\n \"[Sixb] Materializer storage contract requires projection materialization runs.\"\n )\n }\n return storage as ContractStorage\n}\n\nfunction sourceEntry(id: string, name: string, parentId?: string): ProjectionSourceEntry {\n const ref = { objectTypeId: Device.id, primaryId: id }\n return {\n root: { kind: \"object\", ref },\n assertions: [\n { kind: \"object\", ref, properties: { name } },\n ...(parentId\n ? [\n {\n kind: \"link\" as const,\n ref: {\n source: ref,\n linkId: \"parent\",\n target: { objectTypeId: Device.id, primaryId: parentId },\n },\n },\n ]\n : []),\n ],\n }\n}\n\nasync function* entries(values: readonly ProjectionSourceEntry[]) {\n for (const value of values) yield value\n}\n\nasync function claim(\n storage: ContractStorage,\n input: {\n readonly runId: string\n readonly projectionId: string\n readonly protocol: \"replacement\" | \"telemetry\"\n readonly datasetVersion: {\n readonly datasetId: string\n readonly versionId: string\n readonly createdAt: string\n }\n readonly fixedBatchSize?: number\n }\n) {\n const resolved =\n input.protocol === \"replacement\"\n ? projections.resolveSource(input.projectionId)\n : projections.resolveTelemetry(input.projectionId)\n const definition = resolved.definition\n const identityBase = {\n projectionId: input.projectionId,\n datasetVersion: input.datasetVersion,\n ontologyRevision: projections.ontologyRevision,\n projectionRevision: resolved.projectionRevision,\n ownershipHash: resolved.ownershipHash,\n }\n const common = {\n id: input.runId,\n projectId: \"materializer-storage-contract\",\n } as const\n\n if (definition._tag === \"TelemetryProjectionDefinition\") {\n const claim = await storage.projectionRuns.startOrReclaim({\n ...common,\n identity: { ...identityBase, projectionKind: \"telemetry\", protocol: \"telemetry\" },\n target: { objectTypeId: definition.objectTypeId },\n fixedBatchSize: input.fixedBatchSize ?? 1,\n })\n return claim.execution\n }\n\n if (definition._tag === \"LinkProjectionDefinition\") {\n const claim = await storage.projectionRuns.startOrReclaim({\n ...common,\n identity: { ...identityBase, projectionKind: \"link\", protocol: \"replacement\" },\n target: {\n sourceObjectTypeId: definition.sourceObjectTypeId,\n targetObjectTypeId: definition.targetObjectTypeId,\n },\n })\n return claim.execution\n }\n\n const claim = await storage.projectionRuns.startOrReclaim({\n ...common,\n identity: { ...identityBase, projectionKind: \"object\", protocol: \"replacement\" },\n target: { objectTypeId: definition.objectTypeId },\n })\n return claim.execution\n}\n",
|
|
15
|
+
"import { describe, expect, test } from \"bun:test\"\nimport type { JsonValue } from \"../json\"\nimport {\n collectObjectQueryValidationIssues,\n countObjects,\n executeObjectQuery,\n existsObjects,\n facetObjects,\n normalizeObjectQuery,\n type ObjectQuery,\n ObjectQueryPlanningError,\n validateObjectQuery,\n} from \"../objects/query\"\nimport { defineObjectType, link, OntologyRegistry, prop, stringEnum } from \"../ontology\"\nimport type { ObjectStorage, QueryObjectsResult } from \"../storage/objects\"\nimport type { Storage } from \"../storage/types\"\nimport {\n createMaterializerTestFixture,\n type MaterializerFixtureLink,\n type MaterializerFixtureObject,\n type MaterializerTestFixture,\n} from \"./materializer-fixture\"\n\nexport interface ObjectQueryProviderContractSuiteOptions<TStorage extends Storage> {\n /** Factory that produces a fresh complete storage instance for each test case. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"object-query-contract\"\n\nconst Device = defineObjectType({\n id: \"ContractDevice\",\n name: \"Contract Device\",\n properties: [\n prop(\"id\", \"string\", {\n required: true,\n primary: true,\n query: { searchable: true, filterable: true, exact: true, sortable: true },\n }),\n prop(\"name\", \"string\", {\n query: { searchable: true, text: true, filterable: true, exact: true, sortable: true },\n }),\n ],\n search: { defaultText: [\"name\"] },\n})\n\nconst Room = defineObjectType({\n id: \"ContractRoom\",\n name: \"Contract Room\",\n properties: [\n prop(\"id\", \"string\", {\n required: true,\n primary: true,\n query: { searchable: true, filterable: true, exact: true, sortable: true },\n }),\n prop(\"name\", \"string\", {\n query: { searchable: true, text: true, filterable: true, exact: true, sortable: true },\n }),\n prop(\"description\", \"string\", {\n query: { searchable: true, text: true },\n }),\n prop(\"floor\", \"string\", {\n nullable: true,\n query: { searchable: true, filterable: true, exact: true, sortable: true },\n }),\n prop(\"capacity\", \"double\", {\n query: { searchable: true, filterable: true, sortable: true },\n }),\n prop(\"occupied\", \"boolean\", {\n query: { searchable: true, filterable: true, exact: true, facet: true },\n }),\n prop(\"status\", stringEnum([\"active\", \"paused\"]), {\n query: { searchable: true, filterable: true, exact: true, facet: true },\n }),\n prop(\n \"tags\",\n { type: \"array\", items: \"string\" },\n { query: { searchable: true, filterable: true } }\n ),\n prop(\n \"metadata\",\n { type: \"map\", keySchema: \"string\", valueSchema: \"string\" },\n { query: { searchable: true, filterable: true } }\n ),\n prop(\n \"embedding\",\n { type: \"array\", items: \"double\" },\n { query: { searchable: true, vector: true } }\n ),\n ],\n links: [link(\"hasDevice\", Device)],\n search: {\n defaultText: [\"name\", \"description\"],\n vector: { property: \"embedding\", source: [\"name\", \"description\"] },\n },\n})\n\nconst Zone = defineObjectType({\n id: \"ContractZone\",\n name: \"Contract Zone\",\n properties: [prop(\"id\", \"string\", { required: true, primary: true })],\n links: [link(\"hasDevice\", Device)],\n})\n\nconst Asset = defineObjectType({\n id: \"ContractAsset\",\n name: \"Contract Asset\",\n properties: [prop(\"id\", \"string\", { required: true, primary: true })],\n})\n\nconst LaptopAsset = defineObjectType({\n id: \"ContractLaptopAsset\",\n name: \"Contract Laptop Asset\",\n extends: Asset,\n properties: [],\n})\n\nconst DefaultTextBase = defineObjectType({\n id: \"ContractDefaultTextBase\",\n name: \"Contract Default Text Base\",\n properties: [\n prop(\"id\", \"string\", { required: true, primary: true }),\n prop(\"name\", \"string\", { query: { searchable: true, text: true } }),\n prop(\"alias\", \"string\"),\n ],\n search: { defaultText: [\"name\"] },\n})\n\nconst DefaultTextChild = defineObjectType({\n id: \"ContractDefaultTextChild\",\n name: \"Contract Default Text Child\",\n extends: DefaultTextBase,\n properties: [prop(\"alias\", \"string\", { query: { searchable: true, text: true } })],\n search: { defaultText: [\"alias\"] },\n})\n\nexport const objectQueryContractOntology = new OntologyRegistry({\n sources: [Room, Device, Zone, Asset, LaptopAsset, DefaultTextBase, DefaultTextChild],\n})\n\n/**\n * Runs the shared object-query provider contract against any ObjectStorage.\n *\n * The contract defines the portable V1 query surface: capability declarations,\n * validation/normalization handoff, provider pushdown, bounded fallback,\n * traversal, set operations, pagination, search profile defaults, and stable\n * structured rejections for features outside a provider's capability map.\n */\nexport function runObjectQueryProviderContractSuite<TStorage extends Storage>(\n label: string,\n options: ObjectQueryProviderContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (\n body: (context: {\n readonly objects: TStorage[\"objects\"]\n readonly fixture: MaterializerTestFixture\n }) => Promise<void>\n ): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await body({\n objects: storage.objects,\n fixture: createMaterializerTestFixture({\n projectId,\n ontology: objectQueryContractOntology,\n storage,\n }),\n })\n } finally {\n await options.teardown?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"normalizes query shape and resolves search profile defaults\", () => {\n const normalized = normalizeObjectQuery({\n kind: \"limit\",\n limit: 10,\n input: {\n kind: \"limit\",\n limit: 3,\n input: {\n kind: \"project\",\n properties: [\"id\", \"name\", \"id\"],\n input: {\n kind: \"text\",\n query: \"alpha\",\n fields: [\"name\", \"description\", \"name\"],\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n })\n\n expect(normalized.kind).toBe(\"limit\")\n if (normalized.kind !== \"limit\") return\n expect(normalized.limit).toBe(3)\n expect(normalized.input.kind).toBe(\"project\")\n if (normalized.input.kind !== \"project\") return\n expect(normalized.input.properties).toEqual([\"id\", \"name\"])\n expect(normalized.input.input.kind).toBe(\"text\")\n if (normalized.input.input.kind !== \"text\") return\n expect(normalized.input.input.fields).toEqual([\"name\", \"description\"])\n\n const validated = validateObjectQuery(\n { kind: \"text\", query: \"alpha\", input: { kind: \"start\", objectTypeId: Room.id } },\n { ontology: objectQueryContractOntology }\n )\n expect(validated.query.kind).toBe(\"text\")\n if (validated.query.kind === \"text\") {\n expect(validated.query.fields).toBeUndefined()\n expect(validated.query.fieldsByObjectType).toEqual({\n [Room.id]: [\"name\", \"description\"],\n })\n }\n })\n\n test(\"collects validation failures before provider planning\", () => {\n const issues = collectObjectQueryValidationIssues(\n {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"missing\", value: \"x\" },\n input: {\n kind: \"text\",\n query: \"alpha\",\n fields: [\"capacity\"],\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n { ontology: objectQueryContractOntology }\n )\n\n expect(issues.map((issue) => issue.code)).toEqual(\n expect.arrayContaining([\n \"unknown_property\",\n \"query_field_not_enabled\",\n \"text_field_not_string_like\",\n ])\n )\n })\n\n test(\"declares the portable V1 query capability surface\", async () => {\n await withStorage(async ({ objects: storage }) => {\n const capabilities = storage.queryCapabilities()\n\n expect(capabilities.queryObjects).toBe(true)\n expect(capabilities.countObjects).toBe(true)\n expect(capabilities.existsObjects).toBe(true)\n expect(capabilities.facetObjects).toBe(true)\n for (const node of [\n \"start\",\n \"filter\",\n \"text\",\n \"sort\",\n \"limit\",\n \"page\",\n \"traverse\",\n \"set\",\n \"project\",\n ] as const) {\n expect(capabilities.nodes?.[node]).toBe(true)\n }\n for (const op of [\n \"and\",\n \"or\",\n \"not\",\n \"eq\",\n \"neq\",\n \"lt\",\n \"lte\",\n \"gt\",\n \"gte\",\n \"in\",\n \"exists\",\n \"contains\",\n ] as const) {\n expect(capabilities.predicateOps?.[op]).toBe(true)\n }\n expect(capabilities.sortKinds?.property).toBe(true)\n expect(capabilities.traversalDirections?.outgoing).toBe(true)\n expect(capabilities.traversalDirections?.incoming).toBe(true)\n expect(capabilities.setOps?.union).toBe(true)\n expect(capabilities.setOps?.intersect).toBe(true)\n expect(capabilities.setOps?.subtract).toBe(true)\n })\n })\n\n test(\"pushes down scalar predicates, boolean groups, sorting, limits, and projections\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const result = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"project\",\n properties: [\"id\", \"name\", \"capacity\"],\n input: {\n kind: \"limit\",\n limit: 2,\n input: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"capacity\", direction: \"desc\" }],\n input: {\n kind: \"filter\",\n predicate: {\n op: \"and\",\n items: [\n { op: \"eq\", propertyId: \"status\", value: \"active\" },\n { op: \"neq\", propertyId: \"name\", value: \"Gamma Huddle\" },\n { op: \"gte\", propertyId: \"capacity\", value: 10 },\n { op: \"lte\", propertyId: \"capacity\", value: 30 },\n { op: \"in\", propertyId: \"floor\", values: [\"2\"] },\n { op: \"contains\", propertyId: \"tags\", value: \"lab\" },\n {\n op: \"or\",\n items: [\n { op: \"contains\", propertyId: \"name\", value: \"Alpha\" },\n { op: \"contains\", propertyId: \"metadata\", value: \"wing\" },\n ],\n },\n { op: \"not\", item: { op: \"eq\", propertyId: \"id\", value: \"missing\" } },\n ],\n },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(result.plan.mode).toBe(\"pushdown\")\n expect(ids(result)).toEqual([\"room-beta\", \"room-alpha\"])\n expect(result.objects[0]?.properties).toEqual({\n id: \"room-beta\",\n name: \"Beta Lab\",\n capacity: 30,\n })\n expect(result.total).toBe(2)\n expect(result.hasMore).toBe(false)\n })\n })\n\n test(\"matches null, missing, neq, in, and not predicate semantics\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const nullable = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"id\", direction: \"asc\" }],\n input: {\n kind: \"filter\",\n predicate: {\n op: \"or\",\n items: [\n { op: \"eq\", propertyId: \"floor\", value: null },\n { op: \"exists\", propertyId: \"floor\", value: false },\n ],\n },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const notTwoOrNull = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"id\", direction: \"asc\" }],\n input: {\n kind: \"filter\",\n predicate: {\n op: \"and\",\n items: [\n { op: \"neq\", propertyId: \"floor\", value: \"2\" },\n { op: \"in\", propertyId: \"floor\", values: [\"1\", null] },\n ],\n },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const notNullFloor = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"id\", direction: \"asc\" }],\n input: {\n kind: \"filter\",\n predicate: { op: \"neq\", propertyId: \"floor\", value: null },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const notFloorTwo = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"id\", direction: \"asc\" }],\n input: {\n kind: \"filter\",\n predicate: { op: \"not\", item: { op: \"eq\", propertyId: \"floor\", value: \"2\" } },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(ids(nullable)).toEqual([\"room-missing-floor\", \"room-null-floor\"])\n expect(ids(notTwoOrNull)).toEqual([\"room-gamma\", \"room-null-floor\"])\n expect(ids(notNullFloor)).toEqual([\n \"room-alpha\",\n \"room-beta\",\n \"room-gamma\",\n \"room-missing-floor\",\n ])\n expect(ids(notFloorTwo)).toEqual([\"room-gamma\", \"room-missing-floor\", \"room-null-floor\"])\n })\n })\n\n test(\"keeps page tokens stable when projection hides sorted cursor fields\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const input: ObjectQuery = {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"capacity\", direction: \"desc\" }],\n input: {\n kind: \"filter\",\n predicate: { op: \"exists\", propertyId: \"capacity\", value: true },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n }\n const page1 = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"project\",\n properties: [\"id\"],\n input: { kind: \"page\", pageSize: 2, input },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const page2 = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"project\",\n properties: [\"id\"],\n input: { kind: \"page\", pageSize: 2, pageToken: page1.nextPageToken, input },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(page1.plan.mode).toBe(\"pushdown\")\n expect(ids(page1)).toEqual([\"room-beta\", \"room-gamma\"])\n expect(page1.objects.map((row) => row.properties)).toEqual([\n { id: \"room-beta\" },\n { id: \"room-gamma\" },\n ])\n expect(page1.hasMore).toBe(true)\n expect(page1.nextPageToken).toBeTruthy()\n expect(ids(page2)).toEqual([\"room-alpha\"])\n })\n })\n\n test(\"omits totals when requested without losing hasMore\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const limited = await executeObjectQuery(\n {\n projectId,\n includeTotal: false,\n query: { kind: \"limit\", limit: 2, input: { kind: \"start\", objectTypeId: Room.id } },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const page = await executeObjectQuery(\n {\n projectId,\n includeTotal: false,\n query: { kind: \"page\", pageSize: 2, input: { kind: \"start\", objectTypeId: Room.id } },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const sortedLimited = await executeObjectQuery(\n {\n projectId,\n includeTotal: false,\n query: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"capacity\", direction: \"desc\" }],\n input: { kind: \"limit\", limit: 2, input: { kind: \"start\", objectTypeId: Room.id } },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(limited.plan.mode).toBe(\"pushdown\")\n expect(ids(limited)).toEqual([\"room-alpha\", \"room-beta\"])\n expect(limited.total).toBeUndefined()\n expect(limited.hasMore).toBe(true)\n expect(ids(page)).toEqual([\"room-alpha\", \"room-beta\"])\n expect(page.total).toBeUndefined()\n expect(page.hasMore).toBe(true)\n expect(page.nextPageToken).toBeTruthy()\n expect(ids(sortedLimited)).toEqual([\"room-beta\", \"room-alpha\"])\n expect(sortedLimited.total).toBeUndefined()\n expect(sortedLimited.hasMore).toBe(true)\n })\n })\n\n test(\"counts matching objects without returning rows\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const active = await countObjects(\n {\n projectId,\n query: {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"status\", value: \"active\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const limited = await countObjects(\n {\n projectId,\n query: { kind: \"limit\", limit: 2, input: { kind: \"start\", objectTypeId: Room.id } },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(active.plan.mode).toBe(\"pushdown\")\n expect(active.count).toBe(2)\n expect(limited.count).toBe(5)\n })\n })\n\n test(\"checks existence without returning rows\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const active = await existsObjects(\n {\n projectId,\n query: {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"status\", value: \"active\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const missing = await existsObjects(\n {\n projectId,\n query: {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"name\", value: \"No Such Room\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const limited = await existsObjects(\n {\n projectId,\n query: { kind: \"limit\", limit: 0, input: { kind: \"start\", objectTypeId: Room.id } },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(active.plan.mode).toBe(\"pushdown\")\n expect(active.exists).toBe(true)\n expect(missing.exists).toBe(false)\n expect(limited.exists).toBe(true)\n })\n })\n\n test(\"plans aggregate operations without outer row-shaping requirements\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n const query: ObjectQuery = {\n kind: \"sort\",\n fields: [{ kind: \"relevance\" }],\n input: {\n kind: \"text\",\n query: \"alpha\",\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n }\n\n const count = await countObjects(\n { projectId, query },\n { ontology: objectQueryContractOntology, storage }\n )\n const exists = await existsObjects(\n { projectId, query },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(count.plan.mode).toBe(\"pushdown\")\n if (count.plan.mode !== \"pushdown\") return\n expect(count.plan.query.kind).toBe(\"text\")\n expect(count.count).toBe(1)\n expect(exists.plan.mode).toBe(\"pushdown\")\n if (exists.plan.mode !== \"pushdown\") return\n expect(exists.plan.query.kind).toBe(\"text\")\n expect(exists.exists).toBe(true)\n })\n })\n\n test(\"counts matching objects by facetable properties without returning rows\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const status = await facetObjects(\n {\n projectId,\n query: { kind: \"start\", objectTypeId: Room.id },\n facets: [\n { propertyId: \"status\", limit: 10 },\n { propertyId: \"occupied\", limit: 10 },\n ],\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const limited = await facetObjects(\n {\n projectId,\n query: { kind: \"limit\", limit: 0, input: { kind: \"start\", objectTypeId: Room.id } },\n facets: [\n { propertyId: \"status\", limit: 10 },\n { propertyId: \"occupied\", limit: 10 },\n ],\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(status.plan.mode).toBe(\"pushdown\")\n expect(status.facets).toEqual([\n {\n propertyId: \"status\",\n buckets: [\n { value: \"paused\", count: 3 },\n { value: \"active\", count: 2 },\n ],\n },\n {\n propertyId: \"occupied\",\n buckets: [\n { value: false, count: 3 },\n { value: true, count: 2 },\n ],\n },\n ])\n expect(limited.facets).toEqual(status.facets)\n })\n })\n\n test(\"pushes down traversal and set operations\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const outgoing = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"traverse\",\n direction: \"outgoing\",\n linkId: \"hasDevice\",\n input: {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"status\", value: \"active\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const incoming = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"traverse\",\n direction: \"incoming\",\n linkId: \"hasDevice\",\n input: { kind: \"start\", objectTypeId: Device.id },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const incomingRooms = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"traverse\",\n direction: \"incoming\",\n linkId: \"hasDevice\",\n sourceObjectTypeId: Room.id,\n input: { kind: \"start\", objectTypeId: Device.id },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const incomingZones = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"traverse\",\n direction: \"incoming\",\n linkId: \"hasDevice\",\n sourceObjectTypeId: Zone.id,\n input: { kind: \"start\", objectTypeId: Device.id },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const intersect = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"set\",\n op: \"intersect\",\n inputs: [\n {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"status\", value: \"active\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n {\n kind: \"filter\",\n predicate: { op: \"contains\", propertyId: \"tags\", value: \"lab\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n ],\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n const subtract = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"set\",\n op: \"subtract\",\n inputs: [\n {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"status\", value: \"active\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n {\n kind: \"filter\",\n predicate: { op: \"contains\", propertyId: \"name\", value: \"Alpha\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n ],\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(outgoing.plan.mode).toBe(\"pushdown\")\n expect(incoming.plan.mode).toBe(\"pushdown\")\n expect(sortedIds(outgoing)).toEqual([\"device-projector\", \"device-sensor\"])\n expect(sortedIds(incoming)).toEqual([\"room-alpha\", \"room-beta\", \"zone-one\"])\n expect(incomingRooms.plan.mode).toBe(\"pushdown\")\n expect(sortedIds(incomingRooms)).toEqual([\"room-alpha\", \"room-beta\"])\n expect(sortedIds(incomingZones)).toEqual([\"zone-one\"])\n expect(sortedIds(intersect)).toEqual([\"room-alpha\", \"room-beta\"])\n expect(ids(subtract)).toEqual([\"room-beta\"])\n })\n })\n\n test(\"hydrates expand links identically via pushdown or bounded fallback\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const outgoing = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"expand\",\n expansions: [{ linkId: \"hasDevice\", direction: \"outgoing\" }],\n input: {\n kind: \"limit\",\n limit: 10,\n input: {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"status\", value: \"active\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n // A provider that declares expand pushdown hydrates links in-database;\n // otherwise the same links come back through the bounded fallback. Either\n // path must produce identical results.\n const expandMode = storage.queryCapabilities().nodes?.expand ? \"pushdown\" : \"fallback\"\n expect(outgoing.plan.mode).toBe(expandMode)\n expect(expandedIds(outgoing, \"room-alpha\", \"hasDevice\")).toEqual([\"device-projector\"])\n expect(expandedIds(outgoing, \"room-beta\", \"hasDevice\")).toEqual([\"device-sensor\"])\n\n const incoming = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"expand\",\n expansions: [{ linkId: \"hasDevice\", direction: \"incoming\" }],\n input: {\n kind: \"limit\",\n limit: 10,\n input: { kind: \"start\", objectTypeId: Device.id },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n // device-projector is linked from both a Room and a Zone.\n expect(incoming.plan.mode).toBe(expandMode)\n expect(expandedIds(incoming, \"device-projector\", \"hasDevice\")).toEqual([\n \"room-alpha\",\n \"zone-one\",\n ])\n expect(expandedIds(incoming, \"device-sensor\", \"hasDevice\")).toEqual([\"room-beta\"])\n })\n })\n\n test(\"expands includeSubtypes outside storage when the expanded query can push down\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const result = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"limit\",\n limit: 10,\n input: { kind: \"start\", objectTypeId: Asset.id, includeSubtypes: true },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(result.plan.mode).toBe(\"pushdown\")\n expect(sortedIds(result)).toEqual([\"asset-base\", \"laptop-1\"])\n })\n })\n\n test(\"pushes down basic text search using search profile defaults\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n\n const result = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"name\", direction: \"asc\" }],\n input: {\n kind: \"text\",\n query: \"alpha collaboration\",\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(result.plan.mode).toBe(\"pushdown\")\n expect(ids(result)).toEqual([\"room-alpha\"])\n })\n })\n\n test(\"scopes search profile defaults by object type for subtype text queries\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await fixture.seed({\n objects: [\n {\n ref: { objectTypeId: DefaultTextBase.id, primaryId: \"default-base\" },\n properties: { id: \"default-base\", name: \"ordinary\", alias: \"secret\" },\n },\n {\n ref: { objectTypeId: DefaultTextChild.id, primaryId: \"default-child\" },\n properties: { id: \"default-child\", name: \"ordinary\", alias: \"secret\" },\n },\n ],\n })\n\n const result = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"text\",\n query: \"secret\",\n input: {\n kind: \"start\",\n objectTypeId: DefaultTextBase.id,\n includeSubtypes: true,\n },\n },\n },\n { ontology: objectQueryContractOntology, storage }\n )\n\n expect(ids(result)).toEqual([\"default-child\"])\n })\n })\n\n test(\"executes or rejects relevance sorting according to provider capabilities\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n const query: ObjectQuery = {\n kind: \"sort\",\n fields: [{ kind: \"relevance\" }],\n input: {\n kind: \"text\",\n query: \"alpha\",\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n }\n\n if (storage.queryCapabilities().sortKinds?.relevance === true) {\n const result = await executeObjectQuery(\n { projectId, query },\n { ontology: objectQueryContractOntology, storage }\n )\n expect(result.plan.mode).toBe(\"pushdown\")\n expect(ids(result)).toEqual([\"room-alpha\"])\n return\n }\n\n await expectPlanningIssue(\n executeObjectQuery(\n { projectId, query },\n { ontology: objectQueryContractOntology, storage }\n ),\n \"sort_kind_not_supported\"\n )\n })\n })\n\n test(\"executes or rejects vector search according to provider capabilities\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n const query: ObjectQuery = {\n kind: \"vector\",\n propertyId: \"embedding\",\n vector: [1, 0],\n k: 2,\n input: { kind: \"start\", objectTypeId: Room.id },\n }\n\n if (storage.queryCapabilities().nodes?.vector === true) {\n const result = await executeObjectQuery(\n { projectId, query },\n { ontology: objectQueryContractOntology, storage }\n )\n expect(result.plan.mode).toBe(\"pushdown\")\n expect(ids(result)).toEqual([\"room-alpha\", \"room-beta\"])\n return\n }\n\n await expectPlanningIssue(\n executeObjectQuery(\n { projectId, query },\n { ontology: objectQueryContractOntology, storage }\n ),\n \"query_node_not_supported\"\n )\n })\n })\n\n test(\"executes bounded fallback when pushdown is disabled for a safe query\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n const fallbackStorage = withoutQueryPushdown(storage)\n\n const result = await executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"limit\",\n limit: 2,\n input: {\n kind: \"sort\",\n fields: [{ kind: \"property\", propertyId: \"name\", direction: \"asc\" }],\n input: {\n kind: \"filter\",\n predicate: { op: \"eq\", propertyId: \"status\", value: \"active\" },\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage: fallbackStorage, maxFallbackRows: 20 }\n )\n\n expect(result.plan.mode).toBe(\"fallback\")\n expect(ids(result)).toEqual([\"room-alpha\", \"room-beta\"])\n })\n })\n\n test(\"rejects fallback for unsupported query nodes when pushdown is disabled\", async () => {\n await withStorage(async ({ objects: storage, fixture }) => {\n await seedObjectQueryContractData(fixture)\n const fallbackStorage = withoutQueryPushdown(storage)\n\n await expectPlanningIssue(\n executeObjectQuery(\n {\n projectId,\n query: {\n kind: \"limit\",\n limit: 5,\n input: {\n kind: \"traverse\",\n direction: \"outgoing\",\n linkId: \"hasDevice\",\n input: { kind: \"start\", objectTypeId: Room.id },\n },\n },\n },\n { ontology: objectQueryContractOntology, storage: fallbackStorage, maxFallbackRows: 20 }\n ),\n \"fallback_node_not_supported\"\n )\n })\n })\n })\n}\n\nexport async function seedObjectQueryContractData(fixture: MaterializerTestFixture): Promise<void> {\n await fixture.seed({\n objects: [\n objectSeed(Room.id, \"room-alpha\", {\n id: \"room-alpha\",\n name: \"Alpha Conference\",\n description: \"north alpha collaboration\",\n floor: \"2\",\n capacity: 10,\n occupied: true,\n status: \"active\",\n tags: [\"lab\", \"video\"],\n metadata: { wing: \"north\" },\n embedding: [1, 0],\n }),\n objectSeed(Room.id, \"room-beta\", {\n id: \"room-beta\",\n name: \"Beta Lab\",\n description: \"south beta focus\",\n floor: \"2\",\n capacity: 30,\n occupied: false,\n status: \"active\",\n tags: [\"lab\"],\n metadata: { wing: \"south\" },\n embedding: [0.8, 0.2],\n }),\n objectSeed(Room.id, \"room-gamma\", {\n id: \"room-gamma\",\n name: \"Gamma Huddle\",\n description: \"quiet office\",\n floor: \"1\",\n capacity: 20,\n occupied: true,\n status: \"paused\",\n tags: [\"office\"],\n metadata: { zone: \"quiet\" },\n embedding: [0, 1],\n }),\n objectSeed(Room.id, \"room-null-floor\", {\n id: \"room-null-floor\",\n name: \"Null Floor\",\n description: \"nullable floor fixture\",\n floor: null,\n occupied: false,\n status: \"paused\",\n tags: [],\n metadata: {},\n embedding: [0, 0],\n }),\n objectSeed(Room.id, \"room-missing-floor\", {\n id: \"room-missing-floor\",\n name: \"Missing Floor\",\n description: \"missing floor fixture\",\n occupied: false,\n status: \"paused\",\n tags: [],\n metadata: {},\n embedding: [0, 0],\n }),\n objectSeed(Device.id, \"device-projector\", {\n id: \"device-projector\",\n name: \"Projector\",\n }),\n objectSeed(Device.id, \"device-sensor\", { id: \"device-sensor\", name: \"Sensor\" }),\n objectSeed(Asset.id, \"asset-base\", { id: \"asset-base\" }),\n objectSeed(LaptopAsset.id, \"laptop-1\", { id: \"laptop-1\" }),\n objectSeed(Zone.id, \"zone-one\", { id: \"zone-one\" }),\n ],\n links: [\n linkSeed(Room.id, \"room-alpha\", \"hasDevice\", Device.id, \"device-projector\"),\n linkSeed(Room.id, \"room-beta\", \"hasDevice\", Device.id, \"device-sensor\"),\n linkSeed(Zone.id, \"zone-one\", \"hasDevice\", Device.id, \"device-projector\"),\n ],\n })\n}\n\nfunction objectSeed(\n objectTypeId: string,\n primaryId: string,\n properties: Record<string, JsonValue>\n): MaterializerFixtureObject {\n return {\n ref: { objectTypeId, primaryId },\n properties,\n }\n}\n\nfunction linkSeed(\n sourceTypeId: string,\n sourceId: string,\n linkId: string,\n targetTypeId: string,\n targetId: string\n): MaterializerFixtureLink {\n return {\n ref: {\n source: { objectTypeId: sourceTypeId, primaryId: sourceId },\n linkId,\n target: { objectTypeId: targetTypeId, primaryId: targetId },\n },\n }\n}\n\nfunction ids(result: QueryObjectsResult): string[] {\n return result.objects.map((row) => row.primaryId)\n}\n\n// Sorted primaryIds of the objects hydrated under `linkId` on the parent row.\nfunction expandedIds(result: QueryObjectsResult, parentId: string, linkId: string): string[] {\n const parent = result.objects.find((row) => row.primaryId === parentId)\n if (!parent) throw new Error(`parent row '${parentId}' not found`)\n const value = parent.links?.[linkId]\n if (!Array.isArray(value)) throw new Error(`expected an array of links under '${linkId}'`)\n return value.map((linked) => linked.primaryId).sort()\n}\n\nfunction sortedIds(result: QueryObjectsResult): string[] {\n return [...ids(result)].sort()\n}\n\nfunction withoutQueryPushdown(storage: ObjectStorage): ObjectStorage {\n return new Proxy(storage, {\n get(target, property, receiver) {\n if (property === \"queryCapabilities\") return () => ({ queryObjects: false })\n if (property === \"queryObjects\") return undefined\n\n const value = Reflect.get(target, property, receiver)\n return typeof value === \"function\" ? value.bind(target) : value\n },\n })\n}\n\nasync function expectPlanningIssue(promise: Promise<unknown>, code: string): Promise<void> {\n try {\n await promise\n } catch (error) {\n expect(error).toBeInstanceOf(ObjectQueryPlanningError)\n if (error instanceof ObjectQueryPlanningError) {\n expect(error.issues.map((issue) => issue.code)).toContain(code)\n }\n return\n }\n\n throw new Error(`Expected ObjectQueryPlanningError with code '${code}'`)\n}\n",
|
|
16
|
+
"import { describe, expect, test } from \"bun:test\"\nimport type {\n ProjectionExecution,\n ProjectionMaterializationIdentity,\n} from \"../materialization/model\"\nimport type {\n MaterializationPlanFinalization,\n MaterializationPlanHeader,\n MaterializationSession,\n OntologySourceRecord,\n} from \"../storage/ontology\"\nimport type { ProjectionRunStorage } from \"../storage/projection-runs\"\nimport {\n commitEmptyEdit,\n commitExactObject,\n contractEditHeader,\n contractEditResult,\n type OntologyContractStorage,\n} from \"./ontology-contract-fixture\"\n\nexport interface OntologyStorageContractStorage extends OntologyContractStorage {\n readonly projectionRuns: ProjectionRunStorage\n}\n\nexport interface OntologyStorageContractSuiteOptions<\n TStorage extends OntologyStorageContractStorage = OntologyStorageContractStorage,\n> {\n /** Factory that returns a fresh, fully transaction-capable storage facade for each test. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n /** Optional provider setup invoked after the storage facade is created. */\n readonly setup?: (storage: TStorage) => void | Promise<void>\n /** Optional provider cleanup invoked after every test, including failed tests. */\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\nconst replacementIdentity = (\n versionId: string,\n projectionId = \"contract.devices\"\n): Extract<ProjectionMaterializationIdentity, { readonly projectionKind: \"object\" }> => ({\n projectionId,\n projectionKind: \"object\",\n protocol: \"replacement\",\n datasetVersion: {\n datasetId: \"contract.devices\",\n versionId,\n createdAt: `2026-01-${versionId.padStart(2, \"0\")}T00:00:00.000Z`,\n },\n ontologyRevision: \"ontology-contract-revision\",\n projectionRevision: \"projection-contract-revision\",\n ownershipHash: \"ownership-contract-hash\",\n})\n\nconst emptyProjectionCounts = {\n objectsCreated: 0,\n objectsUpdated: 0,\n objectsDeleted: 0,\n objectsUnchanged: 0,\n linksCreated: 0,\n linksUpdated: 0,\n linksDeleted: 0,\n linksUnchanged: 0,\n} as const\n\ninterface ReadyCandidate {\n readonly identity: Extract<\n ProjectionMaterializationIdentity,\n { readonly projectionKind: \"object\" }\n >\n readonly execution: ProjectionExecution\n readonly materializationId: string\n readonly source: { readonly projectionId: string }\n}\n\n/**\n * Runs provider-level ontology persistence contracts without asking the provider\n * to interpret ontology definitions, edits, or projection rows. Exact plans are\n * supplied directly and the suite checks durable lifecycle, CAS, outbox, and\n * cross-facade transaction behavior.\n */\nexport function runOntologyStorageContractSuite<TStorage extends OntologyStorageContractStorage>(\n label: string,\n options: OntologyStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await options.setup?.(storage)\n await body(storage)\n } finally {\n await options.cleanup?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"stores one authoritative commit and rejects duplicate commit identities\", async () => {\n await withStorage(async (storage) => {\n await commitEmptyEdit(storage, \"commit-one\")\n const stored = await storage.ontology.commits.getById({\n projectId: \"contract-project\",\n id: \"commit-one\",\n })\n expect(stored).toMatchObject({\n id: \"commit-one\",\n idempotencyKey: \"runtime:commit-one\",\n requestHash: \"hash:commit-one\",\n result: { commitId: \"commit-one\" },\n })\n expect(\n await storage.ontology.commits.getByIdempotencyKey({\n projectId: \"contract-project\",\n idempotencyKey: \"runtime:commit-one\",\n })\n ).toEqual(stored)\n\n await expect(commitEmptyEdit(storage, \"commit-one\")).rejects.toMatchObject({\n kind: \"idempotency\",\n })\n const divergent = structuredClone(contractEditHeader(\"different-id\"))\n ;(divergent.commit as { idempotencyKey: string }).idempotencyKey = \"runtime:commit-one\"\n ;(divergent.commit as { requestHash: string }).requestHash = \"different-hash\"\n await expect(\n storage.transaction(async (tx) => {\n await tx.ontology.materializations.begin(divergent)\n })\n ).rejects.toMatchObject({ kind: \"idempotency\" })\n\n const list = await storage.ontology.commits.list({\n projectId: \"contract-project\",\n limit: 1,\n offset: 0,\n })\n expect(list).toMatchObject({ total: 1, hasMore: false })\n expect(list.commits.map((commit) => commit.id)).toEqual([\"commit-one\"])\n })\n })\n\n test(\"rejects unfinished sessions and rolls back their authoritative writes\", async () => {\n await withStorage(async (storage) => {\n const header = contractEditHeader(\"session-contract\")\n await expect(storage.ontology.materializations.begin(header)).rejects.toThrow(\n \"active storage transaction\"\n )\n\n await expect(\n commitExactObject(storage, \"unfinished-session\", { omitFinalize: true })\n ).rejects.toThrow(\"unfinished materialization session\")\n expect(\n await storage.objects.getByPrimaryId({\n projectId: \"contract-project\",\n objectTypeId: \"ContractDevice\",\n primaryId: \"unfinished-session\",\n })\n ).toBeNull()\n expect(\n await storage.ontology.commits.getById({\n projectId: \"contract-project\",\n id: \"unfinished-session\",\n })\n ).toBeNull()\n expect(\n await storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2027-01-01T00:00:00.000Z\",\n limit: 10,\n leaseId: \"unfinished-session-check\",\n leaseExpiresAt: \"2027-01-01T01:00:00.000Z\",\n })\n ).toEqual([])\n\n let leakedSession: MaterializationSession | undefined\n await expect(\n storage.transaction(async (tx) => {\n leakedSession = await tx.ontology.materializations.begin(\n contractEditHeader(\"leaked-session\")\n )\n })\n ).rejects.toThrow(\"unfinished materialization session\")\n if (!leakedSession) throw new Error(\"Expected an unfinished session handle\")\n const staleSession = leakedSession\n await storage.transaction(async (tx) => {\n await expect(\n tx.ontology.materializations.finalize({\n session: staleSession,\n finalization: {\n sourceActivations: [],\n result: contractEditResult(\"leaked-session\"),\n },\n })\n ).rejects.toThrow(\"inactive\")\n })\n })\n })\n\n test(\"stages insert-only source rows, seals counts, and fences stale execution tokens\", async () => {\n await withStorage(async (storage) => {\n const identity = replacementIdentity(\"01\")\n const claimed = await storage.projectionRuns.startOrReclaim({\n id: \"staging-run\",\n projectId: \"contract-project\",\n identity,\n target: { objectTypeId: \"ContractDevice\" },\n })\n const execution = claimed.execution\n const source = { projectionId: identity.projectionId }\n await expect(\n storage.ontology.sources.beginMaterialization({\n projectId: \"contract-project\",\n source,\n materializationId: \"mismatched-candidate\",\n execution,\n projectionKind: \"link\",\n protocol: \"replacement\",\n datasetVersion: identity.datasetVersion,\n projectionRevision: identity.projectionRevision,\n ownershipHash: identity.ownershipHash,\n ontologyRevision: identity.ontologyRevision,\n createdAt: \"2026-01-01T00:00:00.000Z\",\n })\n ).rejects.toThrow(\"identity\")\n await storage.ontology.sources.beginMaterialization({\n projectId: \"contract-project\",\n source,\n materializationId: \"staging-candidate\",\n execution,\n projectionKind: \"object\",\n protocol: \"replacement\",\n datasetVersion: identity.datasetVersion,\n projectionRevision: identity.projectionRevision,\n ownershipHash: identity.ownershipHash,\n ontologyRevision: identity.ontologyRevision,\n createdAt: \"2026-01-01T00:00:00.000Z\",\n })\n expect(\n await storage.ontology.sources.getActive({ projectId: \"contract-project\", source })\n ).toBeNull()\n\n const row = {\n root: {\n kind: \"object\" as const,\n ref: { objectTypeId: \"ContractDevice\", primaryId: \"one\" },\n },\n assertion: {\n kind: \"object\" as const,\n ref: { objectTypeId: \"ContractDevice\", primaryId: \"one\" },\n properties: { name: \"one\" },\n },\n stagingOrdinal: 0,\n }\n expect(\n await storage.ontology.sources.stageRows({\n projectId: \"contract-project\",\n source,\n materializationId: \"staging-candidate\",\n execution,\n rows: [row],\n })\n ).toEqual({ inserted: 1, unchanged: 0 })\n expect(\n await storage.ontology.sources.stageRows({\n projectId: \"contract-project\",\n source,\n materializationId: \"staging-candidate\",\n execution,\n rows: [row],\n })\n ).toEqual({ inserted: 0, unchanged: 1 })\n await expect(\n storage.ontology.sources.stageRows({\n projectId: \"contract-project\",\n source,\n materializationId: \"staging-candidate\",\n execution,\n rows: [\n {\n ...row,\n assertion: { ...row.assertion, properties: { name: \"different\" } },\n },\n ],\n })\n ).rejects.toThrow()\n\n const ready = await storage.ontology.sources.markReady({\n projectId: \"contract-project\",\n source,\n materializationId: \"staging-candidate\",\n execution,\n rootCount: 1,\n assertionCount: 1,\n readyAt: \"2026-01-01T00:01:00.000Z\",\n })\n expect(ready).toMatchObject({ status: \"ready\", rootCount: 1, assertionCount: 1 })\n\n const reclaimed = await storage.projectionRuns.startOrReclaim({\n id: claimed.run.id,\n projectId: claimed.run.projectId,\n identity,\n target: { objectTypeId: \"ContractDevice\" },\n })\n await expect(\n storage.ontology.sources.stageRows({\n projectId: \"contract-project\",\n source,\n materializationId: \"staging-candidate\",\n execution,\n rows: [],\n })\n ).rejects.toMatchObject({ kind: \"execution-lost\" })\n await expect(\n storage.ontology.sources.markReady({\n projectId: \"contract-project\",\n source,\n materializationId: \"staging-candidate\",\n execution,\n rootCount: 1,\n assertionCount: 1,\n readyAt: \"2026-01-01T00:03:00.000Z\",\n })\n ).rejects.toMatchObject({ kind: \"execution-lost\" })\n await expect(\n storage.ontology.sources.abandon({\n kind: \"candidate\",\n projectId: \"contract-project\",\n source,\n materializationId: \"staging-candidate\",\n execution,\n abandonedAt: \"2026-01-01T00:03:00.000Z\",\n })\n ).rejects.toMatchObject({ kind: \"execution-lost\" })\n const abandoned = await storage.ontology.sources.abandon({\n kind: \"reclaim\",\n projectId: \"contract-project\",\n source,\n execution: reclaimed.execution,\n abandonedAt: \"2026-01-01T00:02:00.000Z\",\n })\n expect(abandoned).toMatchObject({ status: \"abandoned\", executionToken: null })\n expect(\n await storage.ontology.sources.summarizeTerminal({ projectId: \"contract-project\" })\n ).toEqual({ count: 1, oldestTerminalAt: \"2026-01-01T00:02:00.000Z\" })\n\n expect(\n await storage.ontology.sources.cleanupTerminal({\n projectId: \"contract-project\",\n terminalBefore: \"2026-02-01T00:00:00.000Z\",\n limit: 1,\n })\n ).toEqual({ rowsDeleted: 1, materializationsDeleted: 0 })\n expect(\n await storage.ontology.sources.cleanupTerminal({\n projectId: \"contract-project\",\n terminalBefore: \"2026-02-01T00:00:00.000Z\",\n limit: 1,\n })\n ).toEqual({ rowsDeleted: 0, materializationsDeleted: 1 })\n expect(\n await storage.ontology.sources.summarizeTerminal({ projectId: \"contract-project\" })\n ).toEqual({ count: 0, oldestTerminalAt: null })\n })\n })\n\n test(\"atomically activates explicit empty candidates and rejects competing stale heads\", async () => {\n await withStorage(async (storage) => {\n const first = await createReadyEmptyCandidate(storage, \"run-one\", \"candidate-one\", \"01\")\n await activateEmptyCandidate(\n storage,\n first,\n null,\n \"commit-source-one\",\n \"2026-01-03T00:00:00.000Z\"\n )\n const activeOne = await storage.ontology.sources.getActive({\n projectId: \"contract-project\",\n source: first.source,\n })\n expect(activeOne).toMatchObject({\n materializationId: first.materializationId,\n status: \"active\",\n rootCount: 0,\n assertionCount: 0,\n executionToken: null,\n })\n expect(\n await storage.ontology.commits.getByOrigin({\n projectId: \"contract-project\",\n origin: { kind: \"projection\", projectionRunId: first.execution.projectionRunId },\n })\n ).toMatchObject({ id: \"commit-source-one\" })\n await expect(\n activateEmptyCandidate(\n storage,\n first,\n activeOne,\n \"duplicate-projection-origin\",\n \"2026-01-03T01:00:00.000Z\"\n )\n ).rejects.toMatchObject({ kind: \"run-correlation\" })\n\n const left = await createReadyEmptyCandidate(storage, \"run-left\", \"candidate-left\", \"02\")\n const right = await createReadyEmptyCandidate(storage, \"run-right\", \"candidate-right\", \"03\")\n await activateEmptyCandidate(\n storage,\n left,\n activeOne!,\n \"commit-source-left\",\n \"2026-01-04T00:00:00.000Z\"\n )\n await expect(\n activateEmptyCandidate(\n storage,\n right,\n activeOne!,\n \"commit-source-right\",\n \"2026-01-05T00:00:00.000Z\"\n )\n ).rejects.toMatchObject({ kind: \"projection-fence\" })\n const currentActive = await storage.ontology.sources.getActive({\n projectId: \"contract-project\",\n source: first.source,\n })\n expect(currentActive).toMatchObject({ materializationId: left.materializationId })\n\n const stale = await createReadyEmptyCandidate(\n storage,\n \"run-stale-activation\",\n \"candidate-stale-activation\",\n \"04\"\n )\n const reclaimed = await storage.projectionRuns.startOrReclaim({\n id: stale.execution.projectionRunId,\n projectId: \"contract-project\",\n identity: stale.identity,\n target: { objectTypeId: \"ContractDevice\" },\n })\n await expect(\n activateEmptyCandidate(\n storage,\n stale,\n currentActive,\n \"commit-stale-activation\",\n \"2026-01-06T00:00:00.000Z\"\n )\n ).rejects.toThrow(\"execution token is stale\")\n await storage.ontology.sources.abandon({\n kind: \"reclaim\",\n projectId: \"contract-project\",\n source: stale.source,\n execution: reclaimed.execution,\n abandonedAt: \"2026-01-06T00:01:00.000Z\",\n })\n\n const cleanup = await storage.ontology.sources.cleanupTerminal({\n projectId: \"contract-project\",\n terminalBefore: \"2026-02-01T00:00:00.000Z\",\n limit: 10,\n })\n expect(cleanup.materializationsDeleted).toBeGreaterThanOrEqual(1)\n expect(\n await storage.ontology.sources.getActive({\n projectId: \"contract-project\",\n source: first.source,\n })\n ).toMatchObject({ materializationId: left.materializationId })\n expect(\n await storage.ontology.sources.abandon({\n kind: \"candidate\",\n projectId: \"contract-project\",\n source: right.source,\n materializationId: right.materializationId,\n execution: right.execution,\n abandonedAt: \"2026-02-02T00:00:00.000Z\",\n })\n ).toMatchObject({ status: \"abandoned\" })\n })\n })\n\n test(\"rolls back exact rows, commits, and outbox writes through one transaction facade\", async () => {\n await withStorage(async (storage) => {\n await expect(\n commitExactObject(storage, \"rolled-back\", { throwAfterFinalize: true })\n ).rejects.toThrow(\"contract rollback\")\n expect(\n await storage.objects.getByPrimaryId({\n projectId: \"contract-project\",\n objectTypeId: \"ContractDevice\",\n primaryId: \"rolled-back\",\n })\n ).toBeNull()\n expect(\n await storage.ontology.commits.getById({\n projectId: \"contract-project\",\n id: \"rolled-back\",\n })\n ).toBeNull()\n expect(\n await storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2027-01-01T00:00:00.000Z\",\n limit: 10,\n leaseId: \"rollback-check\",\n leaseExpiresAt: \"2027-01-01T01:00:00.000Z\",\n })\n ).toEqual([])\n\n await commitExactObject(storage, \"committed\")\n expect(\n await storage.objects.getByPrimaryId({\n projectId: \"contract-project\",\n objectTypeId: \"ContractDevice\",\n primaryId: \"committed\",\n })\n ).toMatchObject({ properties: { name: \"committed\" }, lastCommitId: \"committed\" })\n\n await expect(\n commitExactObject(storage, \"stale-object-cas\", { primaryId: \"committed\" })\n ).rejects.toThrow(\"to be absent\")\n expect(\n await storage.ontology.commits.getById({\n projectId: \"contract-project\",\n id: \"stale-object-cas\",\n })\n ).toBeNull()\n expect(\n await storage.objects.getByPrimaryId({\n projectId: \"contract-project\",\n objectTypeId: \"ContractDevice\",\n primaryId: \"committed\",\n })\n ).toMatchObject({ properties: { name: \"committed\" }, lastCommitId: \"committed\" })\n })\n })\n\n test(\"leases outbox rows exclusively, reclaims expiry, fences stale workers, and purges\", async () => {\n await withStorage(async (storage) => {\n const outboxB = await commitExactObject(storage, \"outbox-b\")\n const outboxA = await commitExactObject(storage, \"outbox-a\")\n await expect(\n storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2026-01-02T19:00:00-05:00\",\n limit: 1,\n leaseId: \"noncanonical-lease\",\n leaseExpiresAt: \"2026-01-03T01:00:00.000Z\",\n })\n ).rejects.toThrow(\"canonical UTC\")\n const first = await storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2026-01-03T00:00:00.000Z\",\n limit: 1,\n leaseId: \"lease-one\",\n leaseExpiresAt: \"2026-01-03T01:00:00.000Z\",\n })\n expect(first).toHaveLength(1)\n expect(first[0]).toMatchObject({ attempts: 1, leaseId: \"lease-one\" })\n expect(first[0].envelope.id).toBe([outboxA.eventId, outboxB.eventId].sort()[0])\n const concurrent = await storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2026-01-03T00:30:00.000Z\",\n limit: 10,\n leaseId: \"lease-concurrent\",\n leaseExpiresAt: \"2026-01-03T01:30:00.000Z\",\n })\n expect(concurrent).toHaveLength(1)\n expect(concurrent[0].envelope.id).not.toBe(first[0].envelope.id)\n\n const reclaimed = await storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2026-01-03T02:00:00.000Z\",\n limit: 1,\n leaseId: \"lease-two\",\n leaseExpiresAt: \"2026-01-03T03:00:00.000Z\",\n })\n expect(reclaimed[0].envelope.id).toBe(first[0].envelope.id)\n await expect(\n storage.ontology.outbox.markPublished({\n projectId: \"contract-project\",\n ids: [first[0].envelope.id],\n leaseId: \"lease-one\",\n publishedAt: \"2026-01-03T02:10:00.000Z\",\n })\n ).rejects.toThrow(\"lease does not match\")\n await storage.ontology.outbox.reschedule({\n projectId: \"contract-project\",\n ids: [reclaimed[0].envelope.id],\n leaseId: \"lease-two\",\n availableAt: \"2026-01-04T00:00:00.000Z\",\n error: \"broker unavailable\",\n })\n const retried = await storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2026-01-04T00:00:00.000Z\",\n limit: 1,\n leaseId: \"lease-three\",\n leaseExpiresAt: \"2026-01-04T01:00:00.000Z\",\n })\n expect(retried[0]).toMatchObject({ attempts: 3, lastError: \"broker unavailable\" })\n expect(\n await storage.ontology.outbox.summarize({ projectId: \"contract-project\" })\n ).toMatchObject({ pendingCount: 2, retryingCount: 2, maxAttempts: 3 })\n await storage.ontology.outbox.markPublished({\n projectId: \"contract-project\",\n ids: [retried[0].envelope.id],\n leaseId: \"lease-three\",\n publishedAt: \"2026-01-04T00:30:00.000Z\",\n })\n expect(\n await storage.ontology.outbox.purgePublished({\n projectId: \"contract-project\",\n publishedBefore: \"2026-01-05T00:00:00.000Z\",\n limit: 1,\n })\n ).toBe(1)\n })\n })\n\n test(\"keeps batch outbox settlement atomic when callers catch a stale lease\", async () => {\n await withStorage(async (storage) => {\n await commitExactObject(storage, \"lease-atomic-a\")\n await commitExactObject(storage, \"lease-atomic-b\")\n const claimed = await storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2026-01-03T00:00:00.000Z\",\n limit: 10,\n leaseId: \"lease-atomic-old\",\n leaseExpiresAt: \"2026-01-03T01:00:00.000Z\",\n })\n expect(claimed).toHaveLength(2)\n const [reclaimed] = await storage.ontology.outbox.claim({\n projectId: \"contract-project\",\n now: \"2026-01-03T02:00:00.000Z\",\n limit: 1,\n leaseId: \"lease-atomic-new\",\n leaseExpiresAt: \"2026-01-03T03:00:00.000Z\",\n })\n const untouched = claimed.find((row) => row.envelope.id !== reclaimed!.envelope.id)!\n\n let conflict: unknown\n await storage.transaction(async (tx) => {\n try {\n await tx.ontology.outbox.markPublished({\n projectId: \"contract-project\",\n ids: claimed.map((row) => row.envelope.id),\n leaseId: \"lease-atomic-old\",\n publishedAt: \"2026-01-03T02:10:00.000Z\",\n })\n } catch (error) {\n conflict = error\n }\n })\n expect(conflict).toMatchObject({ kind: \"outbox-lease\" })\n\n await storage.ontology.outbox.markPublished({\n projectId: \"contract-project\",\n ids: [untouched.envelope.id],\n leaseId: \"lease-atomic-old\",\n publishedAt: \"2026-01-03T02:20:00.000Z\",\n })\n })\n })\n\n test(\"rolls back a telemetry checkpoint with its authoritative ontology commit\", async () => {\n await withStorage(async (storage) => {\n const identity: ProjectionMaterializationIdentity = {\n projectionId: \"contract.telemetry\",\n projectionKind: \"telemetry\",\n protocol: \"telemetry\",\n datasetVersion: {\n datasetId: \"contract.readings\",\n versionId: \"telemetry-version\",\n createdAt: \"2026-01-01T00:00:00.000Z\",\n },\n ontologyRevision: \"ontology-contract-revision\",\n projectionRevision: \"telemetry-contract-revision\",\n ownershipHash: \"telemetry-contract-ownership\",\n }\n const run = await storage.projectionRuns.startOrReclaim({\n id: \"telemetry-run\",\n projectId: \"contract-project\",\n identity,\n target: { objectTypeId: \"ContractDevice\" },\n fixedBatchSize: 2,\n })\n const execute = async (throwAfter: boolean) => {\n await storage.transaction(async (tx) => {\n if (!tx.projectionRuns) {\n throw new Error(\"Contract transaction omitted required storage facades.\")\n }\n const header = telemetryHeader(identity, run.run.id)\n const session = await tx.ontology.materializations.begin(header)\n await tx.ontology.materializations.finalize({\n session,\n finalization: {\n sourceActivations: [],\n result: {\n kind: \"telemetry\",\n commitId: header.commit.id,\n created: true,\n eventCount: 0,\n committedAt: header.commit.committedAt,\n pointsCreated: 0,\n pointsUpdated: 0,\n pointsUnchanged: 0,\n latestObjectsChanged: 0,\n },\n },\n })\n await tx.projectionRuns.advanceTelemetryCheckpoint({\n id: run.run.id,\n projectId: run.run.projectId,\n identity,\n executionToken: run.execution.executionToken,\n batchOrdinal: 0,\n batchRowCount: 2,\n batchRowsSkipped: 2,\n inputExhausted: true,\n })\n if (throwAfter) throw new Error(\"telemetry rollback\")\n })\n }\n\n await expect(execute(true)).rejects.toThrow(\"telemetry rollback\")\n expect(\n await storage.ontology.commits.getByOrigin({\n projectId: \"contract-project\",\n origin: { kind: \"telemetry\", projectionRunId: run.run.id, batchOrdinal: 0 },\n })\n ).toBeNull()\n expect(\n await storage.projectionRuns.getById({ projectId: run.run.projectId, id: run.run.id })\n ).toMatchObject({\n telemetryCheckpoint: { nextBatchOrdinal: 0, nextRowOffset: 0, inputExhausted: false },\n })\n\n await execute(false)\n expect(\n await storage.ontology.commits.getByOrigin({\n projectId: \"contract-project\",\n origin: { kind: \"telemetry\", projectionRunId: run.run.id, batchOrdinal: 0 },\n })\n ).toMatchObject({ id: \"telemetry-commit\" })\n expect(\n await storage.projectionRuns.getById({ projectId: run.run.projectId, id: run.run.id })\n ).toMatchObject({\n telemetryCheckpoint: { nextBatchOrdinal: 1, nextRowOffset: 2, inputExhausted: true },\n })\n })\n })\n })\n}\n\nasync function createReadyEmptyCandidate(\n storage: OntologyStorageContractStorage,\n runId: string,\n materializationId: string,\n versionId: string\n): Promise<ReadyCandidate> {\n const identity = replacementIdentity(versionId)\n const run = await storage.projectionRuns.startOrReclaim({\n id: runId,\n projectId: \"contract-project\",\n identity,\n target: { objectTypeId: \"ContractDevice\" },\n })\n const execution = run.execution\n const source = { projectionId: identity.projectionId }\n await storage.ontology.sources.beginMaterialization({\n projectId: run.run.projectId,\n source,\n materializationId,\n execution,\n projectionKind: \"object\",\n protocol: \"replacement\",\n datasetVersion: identity.datasetVersion,\n projectionRevision: identity.projectionRevision,\n ownershipHash: identity.ownershipHash,\n ontologyRevision: identity.ontologyRevision,\n createdAt: identity.datasetVersion.createdAt,\n })\n await storage.ontology.sources.markReady({\n projectId: run.run.projectId,\n source,\n materializationId,\n execution,\n rootCount: 0,\n assertionCount: 0,\n readyAt: new Date(Date.parse(identity.datasetVersion.createdAt) + 1_000).toISOString(),\n })\n return { identity, execution, materializationId, source }\n}\n\nasync function activateEmptyCandidate(\n storage: OntologyStorageContractStorage,\n candidate: ReadyCandidate,\n expectedActive: OntologySourceRecord | null,\n commitId: string,\n committedAt: string\n): Promise<void> {\n const expected = {\n source: candidate.source,\n activeMaterializationId: expectedActive?.materializationId ?? null,\n lastCommitId: expectedActive?.lastCommitId ?? null,\n }\n const header: MaterializationPlanHeader = {\n commit: {\n projectId: \"contract-project\",\n id: commitId,\n idempotencyKey: `projection:${commitId}`,\n requestHash: `hash:${commitId}`,\n origin: {\n kind: \"projection\",\n projectionId: candidate.source.projectionId,\n projectionRunId: candidate.execution.projectionRunId,\n datasetId: candidate.identity.datasetVersion.datasetId,\n datasetVersionId: candidate.identity.datasetVersion.versionId,\n },\n ontologyRevision: candidate.identity.ontologyRevision,\n projectionRevision: candidate.identity.projectionRevision,\n ownershipHash: candidate.identity.ownershipHash,\n intent: {\n kind: \"projection\",\n source: candidate.source,\n datasetVersion: candidate.identity.datasetVersion,\n },\n committedAt,\n },\n expected: { sources: [expected], objects: [], links: [], linkScopes: [], points: [] },\n }\n const finalization: MaterializationPlanFinalization = {\n sourceActivations: [\n {\n source: candidate.source,\n materializationId: candidate.materializationId,\n execution: candidate.execution,\n projectionKind: \"object\",\n protocol: \"replacement\",\n datasetVersion: candidate.identity.datasetVersion,\n projectionRevision: candidate.identity.projectionRevision,\n ownershipHash: candidate.identity.ownershipHash,\n ontologyRevision: candidate.identity.ontologyRevision,\n expected,\n lastCommitId: commitId,\n updatedAt: committedAt,\n },\n ],\n result: {\n kind: \"projection\",\n commitId,\n created: true,\n eventCount: 0,\n committedAt,\n counts: emptyProjectionCounts,\n },\n }\n await storage.transaction(async (tx) => {\n if (!tx.projectionRuns) {\n throw new Error(\"Contract transaction omitted required storage facades.\")\n }\n await tx.projectionRuns.lockForMaterialization({\n id: candidate.execution.projectionRunId,\n projectId: header.commit.projectId,\n identity: candidate.identity,\n executionToken: candidate.execution.executionToken,\n })\n const session = await tx.ontology.materializations.begin(header)\n for (const entityKind of [\"object\", \"link\"] as const) {\n for await (const _page of tx.ontology.materializations.streamSourceReplacementState({\n session,\n source: candidate.source,\n candidateMaterializationId: candidate.materializationId,\n entityKind,\n pageRows: 1,\n })) {\n // Empty output intentionally has no classifications or exact writes.\n }\n }\n await tx.ontology.materializations.finalize({ session, finalization })\n })\n}\n\nfunction telemetryHeader(\n identity: ProjectionMaterializationIdentity,\n projectionRunId: string\n): MaterializationPlanHeader {\n if (identity.protocol !== \"telemetry\") throw new Error(\"Expected telemetry identity\")\n return {\n commit: {\n projectId: \"contract-project\",\n id: \"telemetry-commit\",\n idempotencyKey: \"telemetry:telemetry-run:0\",\n requestHash: \"hash:telemetry-run:0\",\n origin: {\n kind: \"telemetry\",\n source: {\n kind: \"projection\",\n projectionId: identity.projectionId,\n projectionRunId,\n datasetId: identity.datasetVersion.datasetId,\n datasetVersionId: identity.datasetVersion.versionId,\n batchOrdinal: 0,\n },\n },\n ontologyRevision: identity.ontologyRevision,\n projectionRevision: identity.projectionRevision,\n ownershipHash: identity.ownershipHash,\n intent: {\n kind: \"telemetry\",\n source: {\n kind: \"projection\",\n projection: { projectionId: identity.projectionId },\n datasetVersion: identity.datasetVersion,\n batchOrdinal: 0,\n sourceRowCount: 2,\n sourceRowsSkipped: 2,\n inputExhausted: true,\n },\n pointCount: 0,\n inputPointCount: 0,\n },\n committedAt: \"2026-01-02T00:00:00.000Z\",\n },\n expected: { sources: [], objects: [], links: [], linkScopes: [], points: [] },\n }\n}\n",
|
|
17
|
+
"import { describe, expect, test } from \"bun:test\"\nimport type { ProjectionMaterializationIdentity } from \"../materialization/model\"\nimport type { ProjectionRunClaim, ProjectionRunStorage } from \"../storage/projection-runs\"\n\nexport interface ProjectionRunStorageContractSuiteOptions<\n TStorage extends ProjectionRunStorage = ProjectionRunStorage,\n> {\n /** Factory that returns an isolated projection-run store for each test. */\n readonly createStorage: () => TStorage | Promise<TStorage>\n readonly setup?: (storage: TStorage) => void | Promise<void>\n readonly cleanup?: (storage: TStorage) => void | Promise<void>\n}\n\nconst projectId = \"contract-project\"\nconst objectTarget = { objectTypeId: \"Device\" } as const\n\nconst replacementIdentity = {\n projectionId: \"contract.devices\",\n projectionKind: \"object\",\n protocol: \"replacement\",\n datasetVersion: {\n datasetId: \"contract.devices\",\n versionId: \"version-1\",\n createdAt: \"2026-01-01T00:00:00.000Z\",\n },\n ontologyRevision: \"ontology-1\",\n projectionRevision: \"projection-1\",\n ownershipHash: \"ownership-1\",\n} as const satisfies ProjectionMaterializationIdentity\n\nconst telemetryIdentity = {\n projectionId: \"contract.temperatures\",\n projectionKind: \"telemetry\",\n protocol: \"telemetry\",\n datasetVersion: {\n datasetId: \"contract.readings\",\n versionId: \"version-1\",\n createdAt: \"2026-01-01T00:00:00.000Z\",\n },\n ontologyRevision: \"ontology-1\",\n projectionRevision: \"projection-telemetry-1\",\n ownershipHash: \"ownership-telemetry-1\",\n} as const satisfies ProjectionMaterializationIdentity\n\n/** Runs the single durable, fenced projection-run lifecycle against a provider. */\nexport function runProjectionRunStorageContractSuite<TStorage extends ProjectionRunStorage>(\n label: string,\n options: ProjectionRunStorageContractSuiteOptions<TStorage>\n): void {\n const withStorage = async (body: (storage: TStorage) => Promise<void>): Promise<void> => {\n const storage = await options.createStorage()\n try {\n await options.setup?.(storage)\n await body(storage)\n } finally {\n await options.cleanup?.(storage)\n }\n }\n\n describe(label, () => {\n test(\"keeps one run while reclaim rotates its execution\", async () => {\n await withStorage(async (storage) => {\n const input = replacementInput(\"replacement-run\")\n const first = await storage.startOrReclaim(input)\n const second = await storage.startOrReclaim(input)\n\n expect(first.run).toMatchObject({ id: input.id, attempt: 1, status: \"running\" })\n expect(second.run).toMatchObject({ id: input.id, attempt: 2, status: \"running\" })\n expect(second.execution.executionToken).not.toBe(first.execution.executionToken)\n expect(second.run).not.toHaveProperty(\"executionToken\")\n expect(await storage.getById({ projectId, id: input.id })).toMatchObject({\n identity: replacementIdentity,\n target: objectTarget,\n progress: { sourceRowsRead: 0, sourceRowsSkipped: 0 },\n })\n })\n })\n\n test(\"fences every stale lock, progress, and terminal write\", async () => {\n await withStorage(async (storage) => {\n const input = replacementInput(\"fenced-run\")\n const stale = await storage.startOrReclaim(input)\n const current = await storage.startOrReclaim(input)\n\n await expect(storage.lockForMaterialization(executionInput(stale))).rejects.toThrow(\n \"execution token is stale\"\n )\n await expect(\n storage.update({\n ...executionInput(stale),\n progress: { sourceRowsRead: 1 },\n })\n ).rejects.toThrow(\"execution token is stale\")\n await expect(\n storage.finish({\n ...executionInput(stale),\n protocol: \"replacement\",\n status: \"cancelled\",\n })\n ).rejects.toThrow(\"execution token is stale\")\n\n await expect(\n storage.update({\n ...executionInput(current),\n progress: { sourceRowsRead: 3 },\n })\n ).resolves.toMatchObject({ progress: { sourceRowsRead: 3 } })\n })\n })\n\n test(\"rejects immutable identity and target drift\", async () => {\n await withStorage(async (storage) => {\n const input = replacementInput(\"identity-run\")\n const claim = await storage.startOrReclaim(input)\n const changedIdentity = { ...replacementIdentity, ownershipHash: \"different-ownership\" }\n\n await expect(\n storage.startOrReclaim({ ...input, identity: changedIdentity })\n ).rejects.toThrow(\"identity does not match\")\n await expect(\n storage.startOrReclaim({ ...input, target: { objectTypeId: \"OtherDevice\" } })\n ).rejects.toThrow(\"target object types do not match\")\n await expect(\n storage.lockForMaterialization({\n ...executionInput(claim),\n identity: changedIdentity,\n })\n ).rejects.toThrow(\"identity does not match\")\n })\n })\n\n test(\"keeps physical progress monotone and internally consistent\", async () => {\n await withStorage(async (storage) => {\n const claim = await storage.startOrReclaim(replacementInput(\"progress-run\"))\n const execution = executionInput(claim)\n await expect(\n storage.update({\n ...execution,\n progress: { sourceRowsRead: 1, sourceRowsSkipped: 2 },\n })\n ).rejects.toThrow(\"sourceRowsSkipped must not exceed sourceRowsRead\")\n await storage.update({\n ...execution,\n progress: { sourceRowsRead: 5, sourceRowsSkipped: 1 },\n })\n await expect(\n storage.update({ ...execution, progress: { sourceRowsRead: 4 } })\n ).rejects.toThrow(\"must not decrease\")\n })\n })\n\n test(\"rejects immutable dataset-version metadata reuse\", async () => {\n await withStorage(async (storage) => {\n await storage.startOrReclaim(replacementInput(\"dataset-metadata-first\"))\n await expect(\n storage.startOrReclaim({\n ...replacementInput(\"dataset-metadata-conflict\"),\n identity: {\n ...replacementIdentity,\n datasetVersion: {\n ...replacementIdentity.datasetVersion,\n createdAt: \"2026-01-02T00:00:00.000Z\",\n },\n },\n })\n ).rejects.toThrow(\"immutable dataset version id with different metadata\")\n })\n })\n\n test(\"advances telemetry in contiguous fixed physical batches\", async () => {\n await withStorage(async (storage) => {\n const claim = await storage.startOrReclaim({\n id: \"telemetry-run\",\n projectId,\n identity: telemetryIdentity,\n target: objectTarget,\n fixedBatchSize: 3,\n })\n const execution = executionInput(claim)\n expect(claim.run).toMatchObject({\n telemetryCheckpoint: {\n fixedBatchSize: 3,\n nextBatchOrdinal: 0,\n nextRowOffset: 0,\n inputExhausted: false,\n },\n })\n await expect(\n storage.update({ ...execution, progress: { sourceRowsRead: 1 } })\n ).rejects.toThrow(\"can only advance with its checkpoint\")\n\n await storage.advanceTelemetryCheckpoint({\n ...execution,\n batchOrdinal: 0,\n batchRowCount: 3,\n batchRowsSkipped: 1,\n inputExhausted: false,\n })\n await expect(\n storage.advanceTelemetryCheckpoint({\n ...execution,\n batchOrdinal: 2,\n batchRowCount: 1,\n batchRowsSkipped: 0,\n inputExhausted: true,\n })\n ).rejects.toThrow(\"expected batch ordinal 1\")\n await expect(\n storage.advanceTelemetryCheckpoint({\n ...execution,\n batchOrdinal: 1,\n batchRowCount: 1,\n batchRowsSkipped: 0,\n inputExhausted: false,\n })\n ).rejects.toThrow(\"partial non-final batch\")\n\n const exhausted = await storage.advanceTelemetryCheckpoint({\n ...execution,\n batchOrdinal: 1,\n batchRowCount: 2,\n batchRowsSkipped: 1,\n inputExhausted: true,\n })\n expect(exhausted).toMatchObject({\n progress: { sourceRowsRead: 5, sourceRowsSkipped: 2 },\n telemetryCheckpoint: { nextBatchOrdinal: 2, nextRowOffset: 5, inputExhausted: true },\n })\n })\n })\n\n test(\"keeps a missing target until the batch it blocks commits\", async () => {\n await withStorage(async (storage) => {\n const claim = await storage.startOrReclaim({\n id: \"telemetry-missing-target-run\",\n projectId,\n identity: telemetryIdentity,\n target: objectTarget,\n fixedBatchSize: 2,\n })\n const execution = executionInput(claim)\n const firstSeenAt = new Date(\"2026-06-01T12:00:00.000Z\")\n const missingTarget = {\n objectTypeId: \"Device\",\n objectId: \"missing-device\",\n batchOrdinal: 0,\n firstSeenAt,\n }\n\n const waiting = await storage.recordMissingTarget({ ...execution, missingTarget })\n expect(waiting.missingTarget).toEqual(missingTarget)\n expect(\n (await storage.getById({ projectId, id: \"telemetry-missing-target-run\" }))?.missingTarget\n ).toEqual(missingTarget)\n\n // A wait anchored to a batch the run has already passed would outlive the progress that\n // resolved it, so it is refused rather than stored.\n await expect(\n storage.recordMissingTarget({\n ...execution,\n missingTarget: { ...missingTarget, batchOrdinal: 1 },\n })\n ).rejects.toThrow(\"cannot wait on batch 1\")\n\n // A run can only wait on the object type it writes: nothing else can appear in its\n // telemetry. Refused here so an adapter never has to rely on its own CHECK for it.\n await expect(\n storage.recordMissingTarget({\n ...execution,\n missingTarget: { ...missingTarget, objectTypeId: \"Building\" },\n })\n ).rejects.toThrow(\"cannot wait on 'Building'\")\n\n // The whole wait or none of it. A half-written one reads as waiting since the epoch, or\n // waiting for nothing, and both decide a run's fate.\n for (const partial of [\n { objectId: \"\" },\n { objectTypeId: \"\" },\n { firstSeenAt: new Date(Number.NaN) },\n ]) {\n await expect(\n storage.recordMissingTarget({\n ...execution,\n missingTarget: { ...missingTarget, ...partial },\n })\n ).rejects.toThrow()\n }\n\n // The write is last-wins; keeping the original start is the worker's rule, which only\n // records when the object or the batch changes. An adapter that merged instead would\n // make that rule unenforceable.\n const rerecorded = await storage.recordMissingTarget({\n ...execution,\n missingTarget: { ...missingTarget, firstSeenAt: new Date(\"2026-06-01T12:01:00.000Z\") },\n })\n expect(rerecorded.missingTarget?.firstSeenAt).toEqual(new Date(\"2026-06-01T12:01:00.000Z\"))\n\n const advanced = await storage.advanceTelemetryCheckpoint({\n ...execution,\n batchOrdinal: 0,\n batchRowCount: 2,\n batchRowsSkipped: 0,\n inputExhausted: true,\n })\n expect(advanced.missingTarget).toBeUndefined()\n })\n })\n\n test(\"requires and records explicit telemetry EOF with terminal success\", async () => {\n await withStorage(async (storage) => {\n const claim = await storage.startOrReclaim({\n id: \"empty-telemetry-run\",\n projectId,\n identity: telemetryIdentity,\n target: objectTarget,\n fixedBatchSize: 10,\n })\n\n await expect(\n storage.finish({\n ...executionInput(claim),\n protocol: \"telemetry\",\n status: \"succeeded\",\n } as Parameters<ProjectionRunStorage[\"finish\"]>[0])\n ).rejects.toThrow(\"cannot succeed before input exhaustion\")\n await expect(storage.getById({ projectId, id: claim.run.id })).resolves.toMatchObject({\n status: \"running\",\n telemetryCheckpoint: { inputExhausted: false },\n })\n\n const finished = await storage.finish({\n ...executionInput(claim),\n protocol: \"telemetry\",\n status: \"succeeded\",\n inputExhausted: true,\n })\n expect(finished).toMatchObject({\n status: \"succeeded\",\n progress: { sourceRowsRead: 0 },\n telemetryCheckpoint: { inputExhausted: true },\n })\n await expect(storage.lockForMaterialization(executionInput(claim))).rejects.toThrow(\n \"already terminal\"\n )\n })\n })\n\n test(\"keeps equal run ids isolated by project\", async () => {\n await withStorage(async (storage) => {\n await storage.startOrReclaim({ ...replacementInput(\"shared-id\"), projectId: \"project-a\" })\n await storage.startOrReclaim({ ...replacementInput(\"shared-id\"), projectId: \"project-b\" })\n\n expect(await storage.getById({ projectId: \"project-a\", id: \"shared-id\" })).not.toBeNull()\n expect(await storage.getById({ projectId: \"project-b\", id: \"shared-id\" })).not.toBeNull()\n expect(await storage.getById({ projectId: \"project-c\", id: \"shared-id\" })).toBeNull()\n })\n })\n })\n}\n\nfunction replacementInput(id: string) {\n return { id, projectId, identity: replacementIdentity, target: objectTarget } as const\n}\n\nfunction executionInput(claim: ProjectionRunClaim) {\n return {\n id: claim.run.id,\n projectId: claim.run.projectId,\n identity: claim.run.identity,\n executionToken: claim.execution.executionToken,\n }\n}\n",
|
|
18
|
+
"import { describe, expect, test } from \"bun:test\"\nimport { QueueError } from \"../queues/errors\"\nimport type { Queues } from \"../queues/types\"\n\nexport interface QueueContractSuiteOptions {\n /** Factory that produces a fresh `Queues` instance for each test case. */\n readonly createQueues: () => Queues | Promise<Queues>\n /** Optional cleanup invoked after every test case. */\n readonly teardown?: (queues: Queues) => void | Promise<void>\n /**\n * Lease duration used in lease-expiry redelivery assertions. Providers with a stalled-check\n * interval (e.g., BullMQ) need a larger value than in-memory providers. Defaults to 20ms.\n */\n readonly shortLeaseMs?: number\n /**\n * Time to wait for a claim to become re-visible after its lease expires. Defaults to\n * `shortLeaseMs + 10`; providers that rely on a periodic checker must add that interval.\n */\n readonly leaseExpiryRedeliveryMs?: number\n /**\n * Time to wait for a delayed retry to become visible again. Defaults to `shortLeaseMs + 15`.\n */\n readonly retryRedeliveryMs?: number\n}\n\n/**\n * Runs the shared `Queues` contract against any provider.\n *\n * Every provider must exhibit the same enqueue/claim/complete/retry/fail/renewLease behavior\n * described here, which is the authoritative specification for Sixb queues — each test is\n * written in Arrange/Act/Assert form, with timing parameters exposed for providers that need\n * them (short lease durations, periodic checker intervals).\n */\nexport function runQueueContractSuite(label: string, options: QueueContractSuiteOptions): void {\n const shortLeaseMs = options.shortLeaseMs ?? 20\n const leaseExpiryRedeliveryMs = options.leaseExpiryRedeliveryMs ?? shortLeaseMs + 10\n const retryRedeliveryMs = options.retryRedeliveryMs ?? shortLeaseMs + 15\n\n const withQueues = async (body: (queues: Queues) => Promise<void>): Promise<void> => {\n const queues = await options.createQueues()\n try {\n await body(queues)\n } finally {\n await options.teardown?.(queues)\n }\n }\n\n describe(label, () => {\n describe(\"enqueue\", () => {\n test(\"returns envelopes with generated id, createdAt, availableAt, attempt=0\", async () => {\n await withQueues(async (queues) => {\n const before = Date.now()\n\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [\n {\n type: \"sync.run.requested\",\n payload: { syncId: \"sync-1\", commitMessage: \"manual\" },\n },\n ],\n })\n\n expect(job?.id).toMatch(/^[0-9a-f-]{36}$/)\n expect(job?.projectId).toBe(\"project-a\")\n expect(job?.attempt).toBe(0)\n expect(job?.type).toBe(\"sync.run.requested\")\n expect(job?.payload.syncId).toBe(\"sync-1\")\n expect(Date.parse(job!.createdAt)).toBeGreaterThanOrEqual(before)\n expect(job?.availableAt).toBe(job?.createdAt)\n })\n })\n\n test(\"deduplicates repeated enqueue with a caller-supplied id\", async () => {\n await withQueues(async (queues) => {\n const input = {\n id: \"dispatch-run-1\",\n type: \"sync.run.requested\" as const,\n payload: { syncId: \"sync-1\" },\n }\n const [[first], [second]] = await Promise.all([\n queues.syncRuns.enqueue({ projectId: \"project-a\", jobs: [input] }),\n queues.syncRuns.enqueue({ projectId: \"project-a\", jobs: [input] }),\n ])\n\n expect(first?.id).toBe(input.id)\n expect(second?.id).toBe(input.id)\n await expect(\n queues.syncRuns.claim({ projectId: \"project-a\", workerId: \"worker-1\", limit: 2 })\n ).resolves.toHaveLength(1)\n })\n })\n\n test(\"treats caller-supplied ids as opaque across the job lifecycle\", async () => {\n await withQueues(async (queues) => {\n const id = \"workflow:review-meeting:node:0\"\n const input = {\n id,\n type: \"sync.run.requested\" as const,\n payload: { syncId: \"sync-1\" },\n }\n\n const [[first], [duplicate]] = await Promise.all([\n queues.syncRuns.enqueue({ projectId: \"project-a\", jobs: [input] }),\n queues.syncRuns.enqueue({ projectId: \"project-a\", jobs: [input] }),\n ])\n const [claimed] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n limit: 2,\n })\n\n expect(first?.id).toBe(id)\n expect(duplicate?.id).toBe(id)\n expect(claimed?.job.id).toBe(id)\n if (queues.syncRuns.renewLease) {\n await expect(\n queues.syncRuns.renewLease({\n projectId: \"project-a\",\n jobId: id,\n leaseId: claimed!.leaseId,\n leaseMs: shortLeaseMs * 10,\n })\n ).resolves.toMatchObject({ job: { id } })\n }\n await queues.syncRuns.complete({\n projectId: \"project-a\",\n jobId: id,\n leaseId: claimed!.leaseId,\n })\n await expect(\n queues.syncRuns.claim({ projectId: \"project-a\", workerId: \"worker-2\" })\n ).resolves.toHaveLength(0)\n })\n })\n\n test(\"returns empty array when no jobs are passed\", async () => {\n await withQueues(async (queues) => {\n const result = await queues.syncRuns.enqueue({ projectId: \"project-a\", jobs: [] })\n\n expect(result).toEqual([])\n })\n })\n\n test(\"rejects empty projectId with QueueError\", async () => {\n await withQueues(async (queues) => {\n await expect(\n queues.syncRuns.enqueue({\n projectId: \" \",\n jobs: [{ type: \"sync.run.requested\", payload: { syncId: \"sync-1\" } }],\n })\n ).rejects.toBeInstanceOf(QueueError)\n })\n })\n })\n\n describe(\"claim\", () => {\n test(\"increments attempt to 1 on first successful claim\", async () => {\n await withQueues(async (queues) => {\n await queues.pipelines.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"pipeline.run.requested\", payload: { pipelineId: \"p-1\" } }],\n })\n\n const [claimed] = await queues.pipelines.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n })\n\n expect(claimed?.job.attempt).toBe(1)\n expect(claimed?.job.payload.pipelineId).toBe(\"p-1\")\n expect(claimed?.leaseId).toBeTruthy()\n expect(Date.parse(claimed!.leaseExpiresAt)).toBeGreaterThan(\n Date.parse(claimed!.claimedAt)\n )\n })\n })\n\n test(\"returns empty array when limit is 0 or negative\", async () => {\n await withQueues(async (queues) => {\n await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { syncId: \"s-1\" } }],\n })\n\n const zero = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n limit: 0,\n })\n const negative = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n limit: -5,\n })\n\n expect(zero).toEqual([])\n expect(negative).toEqual([])\n })\n })\n\n test(\"rejects non-positive leaseMs with QueueError\", async () => {\n await withQueues(async (queues) => {\n await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { syncId: \"s-1\" } }],\n })\n\n await expect(\n queues.syncRuns.claim({ projectId: \"project-a\", workerId: \"w-1\", leaseMs: 0 })\n ).rejects.toBeInstanceOf(QueueError)\n await expect(\n queues.syncRuns.claim({ projectId: \"project-a\", workerId: \"w-1\", leaseMs: -1 })\n ).rejects.toBeInstanceOf(QueueError)\n })\n })\n\n test(\"respects delayed visibility via availableAt\", async () => {\n await withQueues(async (queues) => {\n const availableAt = new Date(Date.now() + shortLeaseMs + 20).toISOString()\n await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { syncId: \"s-1\" }, availableAt }],\n })\n\n const before = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n })\n await Bun.sleep(shortLeaseMs + 40)\n const after = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n })\n\n expect(before).toHaveLength(0)\n expect(after).toHaveLength(1)\n expect(after[0]?.job.availableAt).toBe(availableAt)\n })\n })\n\n test(\"isolates jobs across distinct projectIds\", async () => {\n await withQueues(async (queues) => {\n await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { syncId: \"a-1\" } }],\n })\n await queues.syncRuns.enqueue({\n projectId: \"project-b\",\n jobs: [{ type: \"sync.run.requested\", payload: { syncId: \"b-1\" } }],\n })\n\n const claimedB = await queues.syncRuns.claim({\n projectId: \"project-b\",\n workerId: \"worker-b\",\n limit: 10,\n })\n\n expect(claimedB).toHaveLength(1)\n expect(claimedB[0]?.job.payload.syncId).toBe(\"b-1\")\n expect(claimedB[0]?.job.projectId).toBe(\"project-b\")\n })\n })\n\n test(\"keeps syncRuns, pipelines, projections, workflows, and actions lanes independent\", async () => {\n await withQueues(async (queues) => {\n await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { syncId: \"s-1\" } }],\n })\n await queues.pipelines.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"pipeline.run.requested\", payload: { pipelineId: \"p-1\" } }],\n })\n await queues.projections.enqueue({\n projectId: \"project-a\",\n jobs: [\n {\n type: \"projection.run.requested\",\n payload: {\n projectionId: \"room-projection\",\n projectionKind: \"object\",\n protocol: \"replacement\",\n datasetVersion: {\n datasetId: \"canonical.rooms\",\n versionId: \"ver_1\",\n createdAt: \"2026-01-01T00:00:00.000Z\",\n },\n ontologyRevision: \"ontology-v1\",\n projectionRevision: \"projection-v1\",\n ownershipHash: \"ownership-v1\",\n },\n },\n ],\n })\n await queues.workflows.enqueue({\n projectId: \"project-a\",\n jobs: [\n {\n type: \"workflow.run.requested\",\n payload: {\n workflowId: \"reconcile-transaction\",\n input: {\n transaction: { objectTypeId: \"Transaction\", primaryId: \"txn_123\" },\n },\n },\n },\n ],\n })\n await queues.actions.enqueue({\n projectId: \"project-a\",\n jobs: [\n {\n type: \"action.run.requested\",\n payload: {\n actionId: \"mark-paid\",\n runId: \"act_1\",\n },\n },\n ],\n })\n\n const crossLane = await queues.pipelines.claim({\n projectId: \"project-a\",\n workerId: \"pipeline-worker-1\",\n limit: 10,\n })\n const projectionLane = await queues.projections.claim({\n projectId: \"project-a\",\n workerId: \"projection-worker-1\",\n limit: 10,\n })\n const workflowLane = await queues.workflows.claim({\n projectId: \"project-a\",\n workerId: \"workflow-worker-1\",\n limit: 10,\n })\n const actionLane = await queues.actions.claim({\n projectId: \"project-a\",\n workerId: \"action-worker-1\",\n limit: 10,\n })\n const sameLane = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"sync-worker-1\",\n limit: 10,\n })\n\n expect(crossLane).toHaveLength(1)\n expect(crossLane[0]?.job.payload.pipelineId).toBe(\"p-1\")\n expect(projectionLane).toHaveLength(1)\n expect(projectionLane[0]?.job.payload.projectionId).toBe(\"room-projection\")\n expect(workflowLane).toHaveLength(1)\n expect(workflowLane[0]?.job.payload.workflowId).toBe(\"reconcile-transaction\")\n expect(actionLane).toHaveLength(1)\n expect(actionLane[0]?.job.payload.actionId).toBe(\"mark-paid\")\n expect(sameLane).toHaveLength(1)\n })\n })\n })\n\n describe(\"complete\", () => {\n test(\"removes the job from the lane permanently\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { syncId: \"s-1\" } }],\n })\n const [claim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n })\n\n await queues.syncRuns.complete({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: claim!.leaseId,\n })\n\n const later = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-2\",\n limit: 10,\n })\n expect(later).toHaveLength(0)\n })\n })\n\n test(\"rejects a wrong leaseId with QueueError\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { syncId: \"s-1\" } }],\n })\n await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs * 10,\n })\n\n await expect(\n queues.syncRuns.complete({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: \"not-the-right-lease\",\n })\n ).rejects.toBeInstanceOf(QueueError)\n })\n })\n })\n\n describe(\"retry\", () => {\n test(\"reschedules the job and bumps attempt on next claim\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { syncId: \"s-1\" } }],\n })\n const [firstClaim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs,\n })\n\n const retryAt = new Date(Date.now() + retryRedeliveryMs).toISOString()\n await queues.syncRuns.retry({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: firstClaim!.leaseId,\n availableAt: retryAt,\n error: { message: \"try again\" },\n })\n await Bun.sleep(retryRedeliveryMs + 30)\n const [secondClaim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-2\",\n leaseMs: shortLeaseMs,\n })\n\n expect(secondClaim?.job.id).toBe(job?.id)\n expect(secondClaim?.job.attempt).toBe(2)\n })\n })\n\n test(\"rejects invalid availableAt with QueueError\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { syncId: \"s-1\" } }],\n })\n const [claim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs * 10,\n })\n\n await expect(\n queues.syncRuns.retry({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: claim!.leaseId,\n availableAt: \"not-a-timestamp\",\n })\n ).rejects.toBeInstanceOf(QueueError)\n })\n })\n })\n\n describe(\"fail\", () => {\n test(\"marks the job as terminally failed\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.pipelines.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"pipeline.run.requested\", payload: { pipelineId: \"p-1\" } }],\n })\n const [claim] = await queues.pipelines.claim({\n projectId: \"project-a\",\n workerId: \"pipeline-worker-1\",\n })\n\n await queues.pipelines.fail({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: claim!.leaseId,\n error: { message: \"boom\" },\n })\n\n const later = await queues.pipelines.claim({\n projectId: \"project-a\",\n workerId: \"pipeline-worker-2\",\n limit: 10,\n })\n expect(later).toHaveLength(0)\n })\n })\n })\n\n describe(\"renewLease\", () => {\n test(\"extends the lease and returns an updated claim\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { syncId: \"s-1\" } }],\n })\n const [claim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs + 20,\n })\n\n const renewed = await queues.syncRuns.renewLease?.({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: claim!.leaseId,\n leaseMs: shortLeaseMs * 5,\n })\n\n expect(renewed?.job.id).toBe(job?.id)\n expect(renewed?.leaseId).toBe(claim?.leaseId)\n expect(Date.parse(renewed!.leaseExpiresAt)).toBeGreaterThan(\n Date.parse(claim!.leaseExpiresAt)\n )\n })\n })\n\n test(\"returns null for unknown jobId\", async () => {\n await withQueues(async (queues) => {\n const result = await queues.syncRuns.renewLease?.({\n projectId: \"project-a\",\n jobId: \"00000000-0000-0000-0000-000000000000\",\n leaseId: \"no-such-lease\",\n leaseMs: shortLeaseMs,\n })\n\n expect(result).toBeNull()\n })\n })\n\n test(\"returns null when the leaseId does not match\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { syncId: \"s-1\" } }],\n })\n await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs * 10,\n })\n\n const renewed = await queues.syncRuns.renewLease?.({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: \"not-the-right-lease\",\n leaseMs: shortLeaseMs,\n })\n\n expect(renewed).toBeNull()\n })\n })\n })\n\n describe(\"redelivery\", () => {\n test(\"redelivers after lease expiry with attempt incremented\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { syncId: \"s-1\" } }],\n })\n const [first] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs,\n })\n\n await Bun.sleep(leaseExpiryRedeliveryMs)\n const [second] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-2\",\n leaseMs: shortLeaseMs,\n })\n\n expect(first?.job.attempt).toBe(1)\n expect(second?.job.id).toBe(job?.id)\n expect(second!.job.attempt).toBeGreaterThanOrEqual(2)\n })\n })\n\n test(\"rejects complete on an already-expired lease\", async () => {\n await withQueues(async (queues) => {\n const [job] = await queues.syncRuns.enqueue({\n projectId: \"project-a\",\n jobs: [{ type: \"sync.run.requested\", payload: { syncId: \"s-1\" } }],\n })\n const [claim] = await queues.syncRuns.claim({\n projectId: \"project-a\",\n workerId: \"worker-1\",\n leaseMs: shortLeaseMs,\n })\n\n await Bun.sleep(leaseExpiryRedeliveryMs)\n\n await expect(\n queues.syncRuns.complete({\n projectId: \"project-a\",\n jobId: job!.id,\n leaseId: claim!.leaseId,\n })\n ).rejects.toBeInstanceOf(QueueError)\n })\n })\n })\n\n describe(\"health\", () => {\n // `sixb check` reports its queues row from this call. While the method was absent, that row\n // was a literal the command printed green.\n test(\"resolves against a reachable backend\", async () => {\n await withQueues(async (queues) => {\n await expect(queues.health()).resolves.toBeUndefined()\n })\n })\n })\n\n describe(\"scope\", () => {\n // Asserted rather than left to the type checker: a provider that declares the wrong scope is\n // a deployment that looks healthy and claims nothing.\n test(\"declares whether it can be shared across processes\", async () => {\n await withQueues(async (queues) => {\n expect([\"process\", \"shared\"]).toContain(queues.scope)\n })\n })\n })\n })\n}\n",
|
|
19
|
+
"import { afterEach, beforeEach, describe, expect, test } from \"bun:test\"\nimport { realpath } from \"node:fs/promises\"\nimport { type SandboxFactory, SandboxNotRunningError } from \"../sandboxes\"\n\n/**\n * Capability flags letting a provider declare which contract slices are\n * meaningful for it. Tests gated by an unsupported capability are skipped.\n */\nexport interface SandboxesContractCapabilities {\n /** network.mode=\"none\" actually blocks outbound network access. */\n readonly networkBlocking?: boolean\n /** readOnlyPaths/readWritePaths actually restrict filesystem writes. */\n readonly readOnlyEnforcement?: boolean\n /** Strong isolation, such as process namespaces, is in effect. */\n readonly isolation?: boolean\n}\n\nexport interface SandboxesContractSuiteOptions {\n /** Factory under test. Called once per describe block. */\n readonly createFactory: () => SandboxFactory | Promise<SandboxFactory>\n /** Optional cleanup invoked once per test after factory-created sandboxes are destroyed. */\n readonly teardown?: (factory: SandboxFactory) => void | Promise<void>\n readonly capabilities?: SandboxesContractCapabilities\n /**\n * Timeout in milliseconds used by the timeout/abort tests. Bump on slow CI.\n * Default 200ms.\n */\n readonly shortTimeoutMs?: number\n}\n\nconst SLEEP_BUDGET_SECONDS = 5\n\n/**\n * Provider-independent contract for Sandbox and SandboxFactory. Concrete\n * providers wire this into their tests via runSandboxesContractSuite(...).\n */\nexport function runSandboxesContractSuite(\n label: string,\n options: SandboxesContractSuiteOptions\n): void {\n const shortTimeoutMs = options.shortTimeoutMs ?? 200\n const capabilities = options.capabilities ?? {}\n\n describe(label, () => {\n let factory: SandboxFactory\n\n beforeEach(async () => {\n factory = await options.createFactory()\n })\n\n afterEach(async () => {\n await options.teardown?.(factory)\n })\n\n describe(\"lifecycle\", () => {\n test(\"create returns a running sandbox with a non-empty id\", async () => {\n const sandbox = await factory.create()\n try {\n expect(sandbox.status).toBe(\"running\")\n expect(sandbox.id.length).toBeGreaterThan(0)\n expect(sandbox.workingDirectory.length).toBeGreaterThan(0)\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"runCommand returns exit code 0 and captured stdout for echo\", async () => {\n const sandbox = await factory.create()\n try {\n const result = await sandbox.runCommand(\"echo\", [\"hello\"])\n expect(result.exitCode).toBe(0)\n expect(result.stdout.trim()).toBe(\"hello\")\n expect(result.stderr).toBe(\"\")\n expect(result.durationMs).toBeGreaterThanOrEqual(0)\n expect(result.timedOut).not.toBe(true)\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"nonexistent binary resolves with non-zero exit code\", async () => {\n const sandbox = await factory.create()\n try {\n const result = await sandbox.runCommand(\"does-not-exist-xyz-sixb-test\", [])\n expect(result.exitCode).not.toBe(0)\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"captures stdout and stderr as separate streams\", async () => {\n const sandbox = await factory.create()\n try {\n const result = await sandbox.runCommand(\"/bin/sh\", [\n \"-c\",\n \"echo out-line; echo err-line >&2; exit 0\",\n ])\n expect(result.exitCode).toBe(0)\n expect(result.stdout).toContain(\"out-line\")\n expect(result.stderr).toContain(\"err-line\")\n expect(result.stdout).not.toContain(\"err-line\")\n expect(result.stderr).not.toContain(\"out-line\")\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"stop transitions status and rejects subsequent runCommand\", async () => {\n const sandbox = await factory.create()\n try {\n await sandbox.stop()\n expect(sandbox.status).toBe(\"stopped\")\n await expect(sandbox.runCommand(\"echo\", [\"nope\"])).rejects.toBeInstanceOf(\n SandboxNotRunningError\n )\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"destroy is idempotent\", async () => {\n const sandbox = await factory.create()\n await sandbox.destroy()\n await sandbox.destroy()\n await expect(sandbox.runCommand(\"echo\", [\"x\"])).rejects.toBeInstanceOf(\n SandboxNotRunningError\n )\n })\n })\n\n describe(\"working directory\", () => {\n test(\"pwd reflects the configured workingDirectory\", async () => {\n const sandbox = await factory.create()\n try {\n const result = await sandbox.runCommand(\"pwd\")\n const expected = await realpath(sandbox.workingDirectory)\n expect(result.exitCode).toBe(0)\n expect(result.stdout.trim()).toBe(expected)\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"per-call cwd overrides the sandbox-level workingDirectory\", async () => {\n const sandbox = await factory.create()\n try {\n const expected = await realpath(\"/tmp\")\n const result = await sandbox.runCommand(\"pwd\", [], { cwd: \"/tmp\" })\n expect(result.exitCode).toBe(0)\n expect(result.stdout.trim()).toBe(expected)\n } finally {\n await sandbox.destroy()\n }\n })\n })\n\n describe(\"env merging\", () => {\n test(\"sandbox-level env is visible to commands\", async () => {\n const sandbox = await factory.create({ env: { SIXB_TEST_A: \"alpha\" } })\n try {\n const result = await sandbox.runCommand(\"printenv\", [\"SIXB_TEST_A\"])\n expect(result.exitCode).toBe(0)\n expect(result.stdout.trim()).toBe(\"alpha\")\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"per-call env wins on collision and adds new keys\", async () => {\n const sandbox = await factory.create({\n env: { SIXB_TEST_A: \"alpha\", SIXB_TEST_B: \"beta\" },\n })\n try {\n const a = await sandbox.runCommand(\"printenv\", [\"SIXB_TEST_A\"], {\n env: { SIXB_TEST_A: \"alpha2\", SIXB_TEST_C: \"gamma\" },\n })\n const b = await sandbox.runCommand(\"printenv\", [\"SIXB_TEST_B\"], {\n env: { SIXB_TEST_A: \"alpha2\", SIXB_TEST_C: \"gamma\" },\n })\n const c = await sandbox.runCommand(\"printenv\", [\"SIXB_TEST_C\"], {\n env: { SIXB_TEST_A: \"alpha2\", SIXB_TEST_C: \"gamma\" },\n })\n expect(a.stdout.trim()).toBe(\"alpha2\")\n expect(b.stdout.trim()).toBe(\"beta\")\n expect(c.stdout.trim()).toBe(\"gamma\")\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"host secrets are not leaked into the sandbox\", async () => {\n const secretKey = \"SIXB_HOST_SECRET_DO_NOT_LEAK\"\n const previous = process.env[secretKey]\n process.env[secretKey] = \"host-only-value\"\n try {\n const sandbox = await factory.create()\n try {\n const result = await sandbox.runCommand(\"printenv\", [secretKey])\n expect(result.exitCode).not.toBe(0)\n expect(result.stdout).not.toContain(\"host-only-value\")\n } finally {\n await sandbox.destroy()\n }\n } finally {\n if (previous === undefined) {\n delete process.env[secretKey]\n } else {\n process.env[secretKey] = previous\n }\n }\n })\n })\n\n describe(\"timeout and abort\", () => {\n test(\"sleep beyond timeout marks the result timedOut and exits non-zero\", async () => {\n const sandbox = await factory.create()\n try {\n const start = Date.now()\n const result = await sandbox.runCommand(\"sleep\", [String(SLEEP_BUDGET_SECONDS)], {\n timeout: shortTimeoutMs,\n })\n const elapsed = Date.now() - start\n expect(result.timedOut).toBe(true)\n expect(result.exitCode).not.toBe(0)\n expect(elapsed).toBeLessThan(SLEEP_BUDGET_SECONDS * 1000)\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"abort signal aborts an in-flight command\", async () => {\n const sandbox = await factory.create()\n try {\n const ac = new AbortController()\n setTimeout(() => ac.abort(), shortTimeoutMs)\n const start = Date.now()\n const result = await sandbox.runCommand(\"sleep\", [String(SLEEP_BUDGET_SECONDS)], {\n signal: ac.signal,\n })\n const elapsed = Date.now() - start\n expect(result.exitCode).not.toBe(0)\n expect(elapsed).toBeLessThan(SLEEP_BUDGET_SECONDS * 1000)\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"per-call timeout overrides sandbox-level timeout\", async () => {\n const sandbox = await factory.create({ timeout: SLEEP_BUDGET_SECONDS * 1000 })\n try {\n const result = await sandbox.runCommand(\"sleep\", [String(SLEEP_BUDGET_SECONDS)], {\n timeout: shortTimeoutMs,\n })\n expect(result.timedOut).toBe(true)\n } finally {\n await sandbox.destroy()\n }\n })\n })\n\n describe(\"file materialization\", () => {\n test(\"writeFiles materializes files a subsequent command can read\", async () => {\n const sandbox = await factory.create()\n try {\n const flat = `${sandbox.workingDirectory}/materialized.txt`\n const nested = `${sandbox.workingDirectory}/nested/dir/deep.txt`\n await sandbox.writeFiles([\n { path: flat, contents: \"flat-contents\" },\n { path: nested, contents: \"nested-contents\" },\n ])\n\n const flatResult = await sandbox.runCommand(\"cat\", [flat])\n expect(flatResult.exitCode).toBe(0)\n expect(flatResult.stdout).toContain(\"flat-contents\")\n\n // A nested path proves writeFiles creates missing parent directories.\n const nestedResult = await sandbox.runCommand(\"cat\", [nested])\n expect(nestedResult.exitCode).toBe(0)\n expect(nestedResult.stdout).toContain(\"nested-contents\")\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"writeFiles round-trips binary contents faithfully\", async () => {\n const sandbox = await factory.create()\n try {\n const path = `${sandbox.workingDirectory}/binary.dat`\n const bytes = new Uint8Array([0x00, 0x01, 0xfe, 0xff, 0x0a, 0x7f])\n await sandbox.writeFiles([{ path, contents: bytes }])\n\n const size = await sandbox.runCommand(\"wc\", [\"-c\", path])\n expect(size.exitCode).toBe(0)\n expect(size.stdout.trim().split(/\\s+/)[0]).toBe(String(bytes.length))\n\n // od proves the exact bytes survived transport (e.g. a provider's base64 round-trip).\n const hex = await sandbox.runCommand(\"od\", [\"-An\", \"-v\", \"-tx1\", path])\n expect(hex.exitCode).toBe(0)\n expect(hex.stdout.replace(/\\s+/g, \" \").trim()).toBe(\"00 01 fe ff 0a 7f\")\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"writeFiles applies an explicit file mode\", async () => {\n const sandbox = await factory.create()\n try {\n const path = `${sandbox.workingDirectory}/run.sh`\n await sandbox.writeFiles([{ path, contents: \"#!/bin/sh\\necho ran\\n\", mode: 0o755 }])\n\n // The exec bit is observable, proving mode was honored (not silently dropped).\n const result = await sandbox.runCommand(\"/bin/sh\", [\"-c\", `test -x ${path} && echo yes`])\n expect(result.exitCode).toBe(0)\n expect(result.stdout).toContain(\"yes\")\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"writeFiles after stop rejects\", async () => {\n const sandbox = await factory.create()\n await sandbox.stop()\n try {\n await expect(\n sandbox.writeFiles([{ path: `${sandbox.workingDirectory}/x.txt`, contents: \"x\" }])\n ).rejects.toThrow(SandboxNotRunningError)\n } finally {\n await sandbox.destroy()\n }\n })\n })\n\n if (capabilities.networkBlocking) {\n describe(\"network isolation\", () => {\n test('network.mode=\"none\" blocks outbound DNS / TCP', async () => {\n const sandbox = await factory.create({ network: { mode: \"none\" } })\n try {\n const result = await sandbox.runCommand(\"curl\", [\n \"-sS\",\n \"--max-time\",\n \"2\",\n \"https://example.com\",\n ])\n expect(result.exitCode).not.toBe(0)\n } finally {\n await sandbox.destroy()\n }\n })\n\n test('network.mode=\"all\" permits outbound traffic', async () => {\n const sandbox = await factory.create({ network: { mode: \"all\" } })\n try {\n const result = await sandbox.runCommand(\"curl\", [\n \"-sS\",\n \"--max-time\",\n \"5\",\n \"https://example.com\",\n ])\n expect(result.exitCode).not.toBe(6)\n } finally {\n await sandbox.destroy()\n }\n })\n })\n }\n\n // Restricted per-origin egress is intentionally NOT covered here: the only provider that enforces\n // it (smolvm) can be verified only by a live in-VM network call, which needs a network-capable\n // guest image and outbound internet — infrastructure this suite deliberately avoids so it stays\n // hermetic. smolvm's allow-list flag construction is unit-tested in its network-argv tests\n // instead. Add a conformance slice here once a provider can enforce egress under hermetic tests.\n\n if (capabilities.readOnlyEnforcement) {\n describe(\"filesystem isolation\", () => {\n test(\"writing inside readWritePaths succeeds\", async () => {\n const sandbox = await factory.create()\n try {\n const result = await sandbox.runCommand(\"/bin/sh\", [\n \"-c\",\n `echo content > ${sandbox.workingDirectory}/probe.txt && cat ${sandbox.workingDirectory}/probe.txt`,\n ])\n expect(result.exitCode).toBe(0)\n expect(result.stdout.trim()).toBe(\"content\")\n } finally {\n await sandbox.destroy()\n }\n })\n\n test(\"writing outside readWritePaths fails\", async () => {\n const sandbox = await factory.create()\n try {\n const result = await sandbox.runCommand(\"/bin/sh\", [\n \"-c\",\n \"echo nope > /etc/sixb-sandbox-must-not-write\",\n ])\n expect(result.exitCode).not.toBe(0)\n } finally {\n await sandbox.destroy()\n }\n })\n })\n }\n })\n}\n"
|
|
20
|
+
],
|
|
21
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAoBA,IAAM,YAAY;AAClB,IAAM,iBAAiB;AACvB,IAAM,QAAmB,EAAE,MAAM,QAAQ,IAAI,QAAQ;AACrD,IAAM,iBAA0E;AAAA,EAC9E,MAAM;AAAA,EACN,IAAI;AACN;AAEA,SAAS,EAAE,CAAC,OAAqB;AAAA,EAC/B,OAAO,IAAI,KAAK,KAAK;AAAA;AAGvB,eAAe,gBAAgB,CAC7B,SACA,MACe;AAAA,EACf,MAAM,OAAO,OAAO,EAAE,QAAQ,eAAe,iBAAiB;AAAA,EAC9D,MAAM,OAAO,OAAO,EAAE,QAAQ,cAAc,EAAE,KAAK,CAAC;AAAA;AAGtD,SAAS,WAAW,CAAC,YAA6C,CAAC,GAA2B;AAAA,EAC5F,OAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,SAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,WAAW,GAAG,0BAA0B;AAAA,OACrC;AAAA,EACL;AAAA;AAGF,SAAS,SAAS,CAChB,OACA,sBAAsB,GAAG,0BAA0B,GAChC;AAAA,EACnB,OAAO,EAAE,OAAO,oBAAoB;AAAA;AAStC,SAAS,QAAQ,CAAC,YAAmC,CAAC,GAAiB;AAAA,EACrE,OAAO;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,UAAU;AAAA,IACV,SAAS;AAAA,IACT,kBAAkB;AAAA,IAClB,sBAAsB;AAAA,IACtB,WAAW,UAAU,QAAQ;AAAA,IAC7B,WAAW,GAAG,0BAA0B;AAAA,OACrC;AAAA,EACL;AAAA;AAGF,eAAe,iBAAiB,CAC9B,SACA,OAC6D;AAAA,EAC7D,MAAM,QAAQ,KAAK,OAAO,KAAK;AAAA,EAC/B,OAAO,QAAQ,KAAK,MAAM;AAAA,IACxB,IAAI,MAAM;AAAA,IACV,WAAW,MAAM;AAAA,IACjB,oBAAoB,MAAM;AAAA,IAC1B,SAAS,MAAM;AAAA,IACf,WAAW,MAAM;AAAA,IACjB,WAAW,MAAM;AAAA,EACnB,CAAC;AAAA;AAUI,SAAS,4BAA2D,CACzE,OACA,SACM;AAAA,EACN,MAAM,cAAc,OAAO,SAA8D;AAAA,IACvF,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,QAAQ,WAAW,OAAO;AAAA;AAAA;AAAA,EAIpC,SAAS,OAAO,MAAM;AAAA,IAGpB,KAAK,iEAAiE,YAAY;AAAA,MAChF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAS,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,OAAO,cAAc,CAAC,CAAC;AAAA,QACjF,OAAO,MAAM,EAAE,cAAc;AAAA,UAC3B,IAAI;AAAA,UACJ,SAAS;AAAA,UACT,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,aAAa;AAAA,UACb,cAAc;AAAA,QAChB,CAAC;AAAA,QACD,OAAO,OAAO,cAAc,EAAE,QAAQ,KAAK;AAAA,QAE3C,MAAM,iBAAiB,QAAQ,QAAQ,OAAO,YAAY,CAAC,GAAG,cAAc;AAAA,QAG5E,MAAM,OACJ,QAAQ,QAAQ,OAAO,YAAY,EAAE,WAAW,eAAe,CAAC,CAAC,CACnE,EAAE,SAAS,cAAc,EAAE,WAAW,eAAe,CAAC;AAAA,QACtD,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACvF,OAAO;AAAA,QACT,CAAC;AAAA,QACD,MAAM,OACJ,QAAQ,QAAQ,QAAQ,EAAE,WAAW,QAAQ,IAAI,QAAQ,CAAC,CAC5D,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,KAAK,wDAAwD,YAAY;AAAA,MACvE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OACpB,YAAY,EAAE,IAAI,SAAS,SAAS,SAAS,WAAW,GAAG,0BAA0B,EAAE,CAAC,CAC1F;AAAA,QACA,MAAM,QAAQ,QAAQ,OACpB,YAAY;AAAA,UACV,IAAI;AAAA,UACJ,SAAS;AAAA,UACT,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH;AAAA,QACA,MAAM,QAAQ,QAAQ,OACpB,YAAY;AAAA,UACV,IAAI;AAAA,UACJ,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH;AAAA,QACA,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,aAAa,WAAW,eAAe,CAAC,CAAC;AAAA,QAExF,MAAM,MAAM,MAAM,QAAQ,QAAQ,KAAK,EAAE,WAAW,OAAO,MAAM,CAAC;AAAA,QAClE,OAAO,IAAI,QAAQ,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,SAAS,OAAO,CAAC;AAAA,QAClF,OAAO,IAAI,KAAK,EAAE,KAAK,CAAC;AAAA,QACxB,OAAO,IAAI,OAAO,EAAE,KAAK,KAAK;AAAA,QAE9B,MAAM,QAAQ,MAAM,QAAQ,QAAQ,KAAK,EAAE,WAAW,SAAS,SAAS,OAAO,MAAM,CAAC;AAAA,QACtF,OAAO,MAAM,QAAQ,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,QAE3E,MAAM,gBAAgB,MAAM,QAAQ,QAAQ,KAAK;AAAA,UAC/C;AAAA,UACA,UAAU,CAAC,SAAS;AAAA,UACpB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,OAAO,cAAc,QAAQ,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;AAAA,QAE1E,MAAM,qBAAqB,MAAM,QAAQ,QAAQ,KAAK;AAAA,UACpD;AAAA,UACA,SAAS;AAAA,UACT,UAAU,CAAC,SAAS;AAAA,UACpB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,OAAO,mBAAmB,OAAO,EAAE,QAAQ,CAAC,CAAC;AAAA,QAC7C,OAAO,mBAAmB,KAAK,EAAE,KAAK,CAAC;AAAA,QAEvC,MAAM,SAAS,MAAM,QAAQ,QAAQ,KAAK,EAAE,WAAW,UAAU,CAAC,QAAQ,GAAG,OAAO,MAAM,CAAC;AAAA,QAC3F,OAAO,OAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,QAE5E,MAAM,YAAY,MAAM,QAAQ,QAAQ,KAAK,EAAE,WAAW,OAAO,OAAO,OAAO,EAAE,CAAC;AAAA,QAClF,OAAO,UAAU,QAAQ,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,QAC/E,OAAO,UAAU,OAAO,EAAE,KAAK,IAAI;AAAA,QACnC,OAAO,UAAU,KAAK,EAAE,KAAK,CAAC;AAAA,QAE9B,MAAM,aAAa,MAAM,QAAQ,QAAQ,KAAK;AAAA,UAC5C;AAAA,UACA,OAAO;AAAA,UACP,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,OAAO,WAAW,QAAQ,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;AAAA,QACvE,OAAO,WAAW,OAAO,EAAE,KAAK,KAAK;AAAA,OACtC;AAAA,KACF;AAAA,IAID,KAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAE1C,MAAM,SAAS,MAAM,QAAQ,KAAK,OAAO,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAClE,OAAO,MAAM,EAAE,cAAc,EAAE,QAAQ,UAAU,SAAS,GAAG,UAAU,QAAQ,CAAC;AAAA,QAChF,OAAO,OAAO,SAAS,EAAE,cAAc;AAAA,QACvC,OAAO,OAAO,SAAS,EAAE,cAAc;AAAA,QACvC,MAAM,OAAO,QAAQ,KAAK,KAAK,EAAE,WAAW,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,SAAS,cAC5E;AAAA,UACE,MAAM,CAAC,EAAE,IAAI,SAAS,QAAQ,SAAS,CAAC;AAAA,UACxC,OAAO;AAAA,QACT,CACF;AAAA,QACA,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACvF,aAAa;AAAA,QACf,CAAC;AAAA,QAED,MAAM,UAAU,MAAM,QAAQ,KAAK,MAAM;AAAA,UACvC;AAAA,UACA,IAAI;AAAA,UACJ,oBAAoB;AAAA,UACpB,SAAS;AAAA,UACT,WAAW,UAAU,QAAQ;AAAA,UAC7B,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,OAAO,OAAO,EAAE,cAAc,EAAE,QAAQ,WAAW,SAAS,GAAG,SAAS,aAAa,CAAC;AAAA,QACtF,OAAO,QAAQ,SAAS,EAAE,QAAQ,UAAU,QAAQ,CAAC;AAAA,QACrD,OAAO,QAAQ,kBAAkB,EAAE,QAAQ,cAAc;AAAA,QACzD,OAAO,QAAQ,WAAW,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,OACzE;AAAA,KACF;AAAA,IAED,KAAK,iDAAiD,YAAY;AAAA,MAChE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,QAAQ,KAAK,OAAO,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAEnD,MAAM,YAAY,MAAM,QAAQ,KAAK,aAAa;AAAA,UAChD;AAAA,UACA,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,aAAa,GAAG,0BAA0B;AAAA,QAC5C,CAAC;AAAA,QACD,OAAO,SAAS,EAAE,cAAc;AAAA,UAC9B,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,OAAO;AAAA,QACT,CAAC;AAAA,QACD,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACvF,aAAa;AAAA,QACf,CAAC;AAAA,QACD,MAAM,iBACJ,QAAQ,KAAK,MAAM;AAAA,UACjB;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,UAAU,QAAQ;AAAA,QAC/B,CAAC,GACD,eACF;AAAA,QAEA,MAAM,QAAQ,KAAK,OAAO,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QACnD,MAAM,OACJ,QAAQ,KAAK,aAAa;AAAA,UACxB;AAAA,UACA,IAAI;AAAA,UACJ,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,QAAQ,UAAU,SAAS,GAAG,OAAO,uBAAuB,CAAC;AAAA,OACzF;AAAA,KACF;AAAA,IAID,KAAK,yCAAyC,YAAY;AAAA,MACxD,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAE1C,MAAM,MAAM,MAAM,kBAAkB,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QACtE,OAAO,GAAG,EAAE,cAAc,EAAE,QAAQ,WAAW,SAAS,GAAG,UAAU,QAAQ,CAAC;AAAA,QAC9E,OAAO,IAAI,oBAAoB,EAAE,QAAQ,KAAK;AAAA,QAC9C,OAAO,IAAI,WAAW,KAAK,EAAE,KAAK,QAAQ;AAAA,QAC1C,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACvF,aAAa;AAAA,QACf,CAAC;AAAA,QAED,MAAM,iBACJ,kBAAkB,SAAS,SAAS,EAAE,IAAI,SAAS,WAAW,UAAU,QAAQ,EAAE,CAAC,CAAC,GACpF,mBACF;AAAA,QAGA,MAAM,iBACJ,kBAAkB,SAAS,SAAS,EAAE,IAAI,SAAS,UAAU,QAAQ,CAAC,CAAC,GACvE,kBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,KAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAE1C,MAAM,UAAU,MAAM,QAAQ,WAAW;AAAA,UACvC,kBAAkB,SAAS,SAAS,EAAE,IAAI,SAAS,WAAW,UAAU,QAAQ,EAAE,CAAC,CAAC;AAAA,UACpF,kBAAkB,SAAS,SAAS,EAAE,IAAI,SAAS,WAAW,UAAU,QAAQ,EAAE,CAAC,CAAC;AAAA,QACtF,CAAC;AAAA,QACD,MAAM,YAAY,QAAQ,OAAO,CAAC,WAAW,OAAO,WAAW,WAAW;AAAA,QAC1E,MAAM,WAAW,QAAQ,OACvB,CAAC,WAA4C,OAAO,WAAW,UACjE;AAAA,QACA,OAAO,SAAS,EAAE,aAAa,CAAC;AAAA,QAChC,OAAO,QAAQ,EAAE,aAAa,CAAC;AAAA,QAC/B,OAAO,SAAS,GAAG,MAAM,EAAE,eAAe,iBAAiB;AAAA,QAC3D,OAAO,SAAS,GAAG,OAAO,IAAI,EAAE,KAAK,mBAAmB;AAAA,OACzD;AAAA,KACF;AAAA,IAID,KAAK,6DAA6D,YAAY;AAAA,MAC5E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,kBAAkB,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAE1D,MAAM,YAAY,MAAM,QAAQ,KAAK,QAAQ;AAAA,UAC3C;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,UAAU,QAAQ;AAAA,QAC/B,CAAC;AAAA,QACD,OAAO,SAAS,EAAE,cAAc,EAAE,QAAQ,WAAW,SAAS,EAAE,CAAC;AAAA,QACjE,OAAO,UAAU,WAAW,KAAK,EAAE,KAAK,QAAQ;AAAA,QAEhD,MAAM,iBACJ,QAAQ,KAAK,OAAO;AAAA,UAClB;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC,GACD,gBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,KAAK,gFAAgF,YAAY;AAAA,MAC/F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,kBACJ,SACA,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,WAAW,UAAU,UAAU,GAAG,0BAA0B,CAAC;AAAA,QAC/D,CAAC,CACH;AAAA,QAEA,MAAM,YAAY,MAAM,QAAQ,KAAK,0BAA0B;AAAA,UAC7D;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,qBAAqB,GAAG,0BAA0B;AAAA,QACpD,CAAC;AAAA,QACD,OAAO,UAAU,WAAW,oBAAoB,YAAY,CAAC,EAAE,KAC7D,0BACF;AAAA,QAEA,MAAM,QAAQ,MAAM,QAAQ,KAAK,0BAA0B;AAAA,UACzD;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,qBAAqB,GAAG,0BAA0B;AAAA,QACpD,CAAC;AAAA,QACD,OAAO,MAAM,WAAW,oBAAoB,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QAE1F,MAAM,QAAQ,KAAK,QAAQ;AAAA,UACzB;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,UAAU,UAAU,GAAG,0BAA0B,CAAC;AAAA,QAC/D,CAAC;AAAA,QACD,MAAM,iBACJ,QAAQ,KAAK,0BAA0B;AAAA,UACrC;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,qBAAqB,GAAG,0BAA0B;AAAA,QACpD,CAAC,GACD,gBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,KAAK,gDAAgD,YAAY;AAAA,MAC/D,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,MAAM,MAAM,kBAAkB,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAEtE,MAAM,mBAAmB,IAAI;AAAA,QAG7B,IAAI,kBAAkB;AAAA,UACpB,iBAAiB,QAAQ;AAAA,UACzB,iBAAiB,oBAAoB,QAAQ,CAAC;AAAA,QAChD;AAAA,QACA,MAAM,SAAS,MAAM,QAAQ,KAAK,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC;AAAA,QACpE,OAAO,QAAQ,WAAW,KAAK,EAAE,KAAK,QAAQ;AAAA,OAC/C;AAAA,KACF;AAAA,IAID,KAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QACzD,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QACzD,MAAM,kBAAkB,SAAS,SAAS,EAAE,IAAI,SAAS,UAAU,QAAQ,CAAC,CAAC;AAAA,QAC7E,MAAM,kBACJ,SACA,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW,UAAU,QAAQ;AAAA,QAC/B,CAAC,CACH;AAAA,QAEA,MAAM,QAAQ,KAAK,OAAO;AAAA,UACxB;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC;AAAA,QAED,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACvF,aAAa;AAAA,QACf,CAAC;AAAA,QAED,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACvF,aAAa;AAAA,QACf,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,KAAK,uEAAuE,YAAY;AAAA,MACtF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,kBAAkB,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAE1D,MAAM,WAAW,MAAM,QAAQ,KAAK,OAAO;AAAA,UACzC;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,cAAc;AAAA,UACd,OAAO,EAAE,aAAa,KAAK,cAAc,IAAI,aAAa,IAAI;AAAA,UAC9D,aAAa;AAAA,YACX;AAAA,cACE,MAAM;AAAA,cACN,UAAU;AAAA,cACV,OAAO;AAAA,cACP,MAAM;AAAA,cACN,SAAS;AAAA,YACX;AAAA,UACF;AAAA,UACA,aAAa,GAAG,0BAA0B;AAAA,QAC5C,CAAC;AAAA,QACD,OAAO,QAAQ,EAAE,cAAc;AAAA,UAC7B,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,cAAc;AAAA,QAChB,CAAC;AAAA,QACD,OAAO,SAAS,KAAK,EAAE,QAAQ,EAAE,aAAa,KAAK,cAAc,IAAI,aAAa,IAAI,CAAC;AAAA,QACvF,OAAO,SAAS,WAAW,EAAE,QAAQ;AAAA,UACnC;AAAA,YACE,MAAM;AAAA,YACN,UAAU;AAAA,YACV,OAAO;AAAA,YACP,MAAM;AAAA,YACN,SAAS;AAAA,UACX;AAAA,QACF,CAAC;AAAA,QACD,MAAM,OACJ,QAAQ,KAAK,SAAS,EAAE,WAAW,KAAK,CAAC,SAAS,WAAW,OAAO,EAAE,CAAC,CACzE,EAAE,SAAS,QAAQ,CAAC,QAAQ,CAAC;AAAA,QAC7B,OAAO,SAAS,SAAS,EAAE,cAAc;AAAA,QACzC,OAAO,SAAS,aAAa,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QAG3E,MAAM,OAAO,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACvF,aAAa;AAAA,QACf,CAAC;AAAA,QACD,MAAM,OACJ,kBAAkB,SAAS,SAAS,EAAE,IAAI,SAAS,WAAW,UAAU,QAAQ,EAAE,CAAC,CAAC,CACtF,EAAE,SAAS,cAAc,EAAE,QAAQ,UAAU,CAAC;AAAA,OAC/C;AAAA,KACF;AAAA,IAED,KAAK,2EAA2E,YAAY;AAAA,MAC1F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,kBAAkB,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAE1D,MAAM,iBACJ,QAAQ,KAAK,OAAO;AAAA,UAClB;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,OAAO;AAAA,QACT,CAAC,GACD,gBACF;AAAA,QAEA,MAAM,SAAS,MAAM,QAAQ,KAAK,OAAO;AAAA,UACvC;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,UACR,OAAO;AAAA,UACP,aAAa,GAAG,0BAA0B;AAAA,QAC5C,CAAC;AAAA,QACD,OAAO,OAAO,MAAM,EAAE,KAAK,QAAQ;AAAA,QACnC,OAAO,OAAO,KAAK,EAAE,KAAK,qBAAqB;AAAA,QAG/C,MAAM,iBACJ,QAAQ,KAAK,OAAO;AAAA,UAClB;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC,GACD,eACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,KAAK,wDAAwD,YAAY;AAAA,MACvE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QACzD,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAEzD,MAAM,kBACJ,SACA,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH;AAAA,QACA,MAAM,QAAQ,KAAK,OAAO;AAAA,UACxB;AAAA,UACA,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,MAAM,kBACJ,SACA,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW,UAAU,QAAQ;AAAA,UAC7B,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH;AAAA,QACA,MAAM,kBACJ,SACA,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW,UAAU,QAAQ;AAAA,UAC7B,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH;AAAA,QAEA,MAAM,aAAa,MAAM,QAAQ,KAAK,KAAK,EAAE,WAAW,UAAU,SAAS,OAAO,MAAM,CAAC;AAAA,QACzF,OAAO,WAAW,KAAK,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,QAEvE,MAAM,UAAU,MAAM,QAAQ,KAAK,KAAK,EAAE,WAAW,UAAU,CAAC,SAAS,GAAG,OAAO,MAAM,CAAC;AAAA,QAC1F,OAAO,QAAQ,KAAK,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,QAEpE,MAAM,MAAM,MAAM,QAAQ,KAAK,KAAK,EAAE,WAAW,OAAO,OAAO,CAAC;AAAA,QAChE,OAAO,IAAI,KAAK,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,SAAS,OAAO,CAAC;AAAA,OAC1E;AAAA,KACF;AAAA,IAED,KAAK,4DAA4D,YAAY;AAAA,MAC3E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,aAAa,CAAC,CAAC;AAAA,QAC9D,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,aAAa,CAAC,CAAC;AAAA,QAC9D,MAAM,QAAQ,QAAQ,OAAO,YAAY,EAAE,IAAI,YAAY,CAAC,CAAC;AAAA,QAE7D,MAAM,QAAQ,KAAK,OACjB,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH;AAAA,QACA,MAAM,QAAQ,KAAK,OACjB,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH;AAAA,QACA,MAAM,QAAQ,KAAK,OACjB,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH;AAAA,QAEA,MAAM,SAAS,MAAM,QAAQ,KAAK,KAAK;AAAA,UACrC;AAAA,UACA,UAAU,CAAC,QAAQ;AAAA,UACnB,cAAc,GAAG,0BAA0B;AAAA,UAC3C,eAAe,GAAG,0BAA0B;AAAA,UAC5C,OAAO;AAAA,QACT,CAAC;AAAA,QACD,OAAO,OAAO,KAAK,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC;AAAA,QAC/D,OAAO,OAAO,KAAK,EAAE,KAAK,CAAC;AAAA,QAC3B,OAAO,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,OAClC;AAAA,KACF;AAAA,IAID,KAAK,yDAAyD,YAAY;AAAA,MACxE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAE1C,MAAM,cAAc,MAAM,QAAQ,SAAS,OAAO;AAAA,UAChD,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,cAAc,CAAC;AAAA,UAC7C,iBAAiB;AAAA,UACjB,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,OAAO,WAAW,EAAE,cAAc;AAAA,UAChC,KAAK;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,OAAO,YAAY,eAAe,EAAE,QAAQ,KAAK;AAAA,QAEjD,MAAM,MAAM,MAAM,kBAChB,SACA,SAAS;AAAA,UACP,IAAI;AAAA,UACJ,oBAAoB;AAAA,QACtB,CAAC,CACH;AAAA,QACA,OAAO,IAAI,kBAAkB,EAAE,QAAQ,cAAc;AAAA,QACrD,MAAM,mBAAmB,MAAM,QAAQ,SAAS,OAAO;AAAA,UACrD,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,iBAAiB;AAAA,UACjB,OAAO;AAAA,YACL,EAAE,MAAM,aAAa,MAAM,oBAAoB;AAAA,YAC/C;AAAA,cACE,MAAM;AAAA,cACN,YAAY;AAAA,cACZ,UAAU;AAAA,cACV,OAAO,EAAE,KAAK,KAAK;AAAA,cACnB,OAAO;AAAA,cACP,QAAQ;AAAA,YACV;AAAA,YACA,EAAE,MAAM,QAAQ,MAAM,qBAAqB;AAAA,UAC7C;AAAA,UACA,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,OAAO,gBAAgB,EAAE,cAAc,EAAE,KAAK,GAAG,MAAM,aAAa,OAAO,QAAQ,CAAC;AAAA,QACpF,OAAO,iBAAiB,eAAe,EAAE,QAAQ,cAAc;AAAA,QAE/D,MAAM,SAAS,MAAM,QAAQ,QAAQ,QAAQ,EAAE,WAAW,IAAI,QAAQ,CAAC;AAAA,QACvE,OAAO,MAAM,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC;AAAA,QAChD,OAAO,QAAQ,eAAe,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QAG5E,MAAM,SAAS,MAAM,QAAQ,SAAS,QAAQ,EAAE,WAAW,IAAI,aAAa,CAAC;AAAA,QAC7E,OAAO,QAAQ,GAAG,EAAE,KAAK,CAAC;AAAA,QAC1B,OAAO,QAAQ,KAAK,EAAE,QAAQ;AAAA,UAC5B,EAAE,MAAM,aAAa,MAAM,oBAAoB;AAAA,UAC/C;AAAA,YACE,MAAM;AAAA,YACN,YAAY;AAAA,YACZ,UAAU;AAAA,YACV,OAAO,EAAE,KAAK,KAAK;AAAA,YACnB,OAAO;AAAA,YACP,QAAQ;AAAA,UACV;AAAA,UACA,EAAE,MAAM,QAAQ,MAAM,qBAAqB;AAAA,QAC7C,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,KAAK,6DAA6D,YAAY;AAAA,MAC5E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,UACrC,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,kBAAkB,SAAS,SAAS,EAAE,IAAI,QAAQ,CAAC,CAAC;AAAA,QAC1D,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,UACrC,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,UACvC,WAAW,GAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,MAAM,MAAM,QAAQ,SAAS,KAAK,EAAE,WAAW,UAAU,SAAS,OAAO,MAAM,CAAC;AAAA,QACtF,OAAO,IAAI,SAAS,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,MAAM,IAAI,CAAC;AAAA,QAC5E,OAAO,IAAI,KAAK,EAAE,KAAK,CAAC;AAAA,QAExB,MAAM,OAAO,MAAM,QAAQ,SAAS,KAAK,EAAE,WAAW,UAAU,SAAS,OAAO,OAAO,CAAC;AAAA,QACxF,OAAO,KAAK,SAAS,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,MAAM,IAAI,CAAC;AAAA,QAE7E,MAAM,QAAQ,MAAM,QAAQ,SAAS,KAAK;AAAA,UACxC;AAAA,UACA,UAAU;AAAA,UACV,OAAO,CAAC,MAAM;AAAA,UACd,OAAO;AAAA,QACT,CAAC;AAAA,QACD,OAAO,MAAM,SAAS,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,QAExE,MAAM,YAAY,MAAM,QAAQ,SAAS,KAAK;AAAA,UAC5C;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,OAAO;AAAA,QACT,CAAC;AAAA,QACD,OAAO,UAAU,SAAS,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,QAC5E,OAAO,UAAU,OAAO,EAAE,KAAK,IAAI;AAAA,OACpC;AAAA,KACF;AAAA,IAED,KAAK,4EAA4E,YAAY;AAAA,MAC3F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,iBACJ,QAAQ,SAAS,OAAO;AAAA,UACtB,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,QACtC,CAAC,GACD,kBACF;AAAA,QAEA,MAAM,QAAQ,QAAQ,OAAO,YAAY,CAAC;AAAA,QAC1C,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,QACtC,CAAC;AAAA,QACD,MAAM,iBACJ,QAAQ,SAAS,OAAO;AAAA,UACtB,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,QACvC,CAAC,GACD,cACF;AAAA,QACA,MAAM,iBACJ,QAAQ,SAAS,OAAO;AAAA,UACtB,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,OAAO;AAAA,UACP,MAAM;AAAA,UACN,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,KAAK,CAAC;AAAA,QACtC,CAAC,GACD,eACF;AAAA,OACD;AAAA,KACF;AAAA,GACF;AAAA;;ACtzBH,qBAAS,qBAAU,iBAAQ;AAgB3B,IAAM,aAAY;AAClB,IAAM,kBAAiB;AAEvB,SAAS,GAAE,CAAC,OAAqB;AAAA,EAC/B,OAAO,IAAI,KAAK,KAAK;AAAA;AAGvB,SAAS,YAAY,CACnB,IACA,YAAY,GAAG,WACf,WAAiD,SACjD,mBAC0B;AAAA,EAC1B,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW,IAAG,0BAA0B;AAAA,IACxC,WAAW,IAAG,0BAA0B;AAAA,IACxC;AAAA,EACF;AAAA;AAGF,eAAe,eAAe,CAC5B,SACA,MACe;AAAA,EACf,MAAM,QAAO,OAAO,EAAE,QAAQ,eAAe,gBAAgB;AAAA,EAC7D,MAAM,QAAO,OAAO,EAAE,QAAQ,cAAc,EAAE,KAAK,CAAC;AAAA;AAGtD,eAAe,UAAU,CACvB,SACA,QAKI,CAAC,GACgB;AAAA,EACrB,OAAO,QAAQ,MAAM,OAAO;AAAA,IAC1B,IAAI,MAAM,MAAM;AAAA,IAChB,WAAW,MAAM,aAAa;AAAA,IAC9B,OAAO,MAAM,SAAS;AAAA,IACtB,QAAQ,MAAM;AAAA,IACd,WAAW,IAAG,0BAA0B;AAAA,EAC1C,CAAC;AAAA;AAUI,SAAS,2BAAyD,CACvE,OACA,SACM;AAAA,EACN,MAAM,cAAc,OAAO,SAA8D;AAAA,IACvF,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,QAAQ,WAAW,OAAO;AAAA;AAAA;AAAA,EAIpC,UAAS,OAAO,MAAM;AAAA,IACpB,MAAK,6DAA6D,YAAY;AAAA,MAC5E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,OAAO,MAAM,WAAW,SAAS;AAAA,UACrC,OAAO;AAAA,QACT,CAAC;AAAA,QAED,QAAO,KAAK,KAAK,EAAE,KAAK,cAAc;AAAA,QACtC,MAAM,gBACJ,QAAQ,MAAM,OAAO;AAAA,UACnB,IAAI;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,GACD,gBACF;AAAA,QAEA,MAAM,QACJ,QAAQ,MAAM,OAAO;AAAA,UACnB,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,OAAO;AAAA,UACP,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH,EAAE,SAAS,cAAc;AAAA,UACvB,WAAW;AAAA,UACX,OAAO;AAAA,QACT,CAAC;AAAA,QAED,MAAM,OAAO,MAAM,QAAQ,MAAM,KAAK,EAAE,uBAAW,UAAU,CAAC,QAAQ,EAAE,CAAC;AAAA,QACzE,QAAO,KAAK,MAAM,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;AAAA,OAC1D;AAAA,KACF;AAAA,IAED,MAAK,4DAA4D,YAAY;AAAA,MAC3E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,SAAS,EAAE,IAAI,YAAY,OAAO,eAAe,CAAC;AAAA,QAEnE,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B;AAAA,UACA,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ,EAAE,OAAO,eAAe;AAAA,UAChC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,UAAU,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9C;AAAA,UACA,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ,EAAE,OAAO,uBAAuB;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,QAAO,QAAQ,MAAM,EAAE,QAAQ,EAAE,OAAO,uBAAuB,CAAC;AAAA,QAChE,MAAM,QAAO,QAAQ,MAAM,QAAQ,EAAE,uBAAW,IAAI,WAAW,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACxF,OAAO;AAAA,QACT,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,iFAAiF,YAAY;AAAA,MAChG,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QAExB,MAAM,QAAQ,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC1C,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,SAAS,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC3C,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAID,QAAO,MAAM,SAAS,EAAE,cAAc;AAAA,QACtC,QAAO,OAAO,SAAS,EAAE,cAAc;AAAA,QACvC,MAAM,cAAc,MAAM,QAAQ,SAAS,QAAQ,EAAE,uBAAW,IAAI,QAAQ,CAAC;AAAA,QAC7E,QAAO,aAAa,SAAS,EAAE,cAAc;AAAA,QAE7C,MAAM,QACJ,QAAQ,SAAS,qBAAqB;AAAA,UACpC;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,IAAI,QAAQ,CAAC;AAAA,QACxC,MAAM,QACJ,QAAQ,SAAS,qBAAqB;AAAA,UACpC;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,IAAI,QAAQ,CAAC;AAAA,QACxC,MAAM,QACJ,QAAQ,SAAS,qBAAqB;AAAA,UACpC;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QAGpB,MAAM,QACJ,QAAQ,SAAS,kBAAkB;AAAA,UACjC;AAAA,UACA,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,IAAI,QAAQ,CAAC;AAAA,QAExC,MAAM,UAAU,MAAM,QAAQ,SAAS,MAAM;AAAA,UAC3C;AAAA,UACA,IAAI,OAAO;AAAA,UACX,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,QACD,QAAO,QAAQ,YAAY,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QACzE,QAAO,QAAQ,UAAU,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QAGvE,MAAM,aAAa,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC/C,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,WAAW,SAAS,EAAE,cAAc;AAAA,QAC3C,MAAM,QACJ,QAAQ,SAAS,qBAAqB;AAAA,UACpC;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QAGpB,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,SAAS,qBAAqB;AAAA,UACpC;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QACpB,MAAM,QACJ,QAAQ,SAAS,qBAAqB;AAAA,UACpC;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,IAAI,QAAQ,CAAC;AAAA,QAIxC,MAAM,UAAU,MAAM,QAAQ,SAAS,oBAAoB;AAAA,UACzD;AAAA,UACA,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,QAAQ,IAAI,CAAC,UAAU,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,SAAS,SAAS,CAAC;AAAA,QAC5E,MAAM,QACJ,QAAQ,SAAS,kBAAkB;AAAA,UACjC;AAAA,UACA,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,MAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QACxB,MAAM,SAAS,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC3C,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,UACxC,mBAAmB,IAAG,0BAA0B;AAAA,QAClD,CAAC;AAAA,QACD,MAAM,WAAW,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,QAAO,OAAO,mBAAmB,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QAC/E,QAAO,SAAS,iBAAiB,EAAE,cAAc;AAAA,QACjD,MAAM,QACJ,QAAQ,SAAS,qBAAqB;AAAA,UACpC;AAAA,UACA,IAAI,OAAO;AAAA,UACX,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,IAAI,OAAO,GAAG,CAAC;AAAA,QAC1C,MAAM,QACJ,QAAQ,SAAS,qBAAqB;AAAA,UACpC;AAAA,UACA,IAAI,OAAO;AAAA,UACX,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QACpB,MAAM,SAAS,MAAM,QAAQ,SAAS,mBAAmB;AAAA,UACvD;AAAA,UACA,QAAQ;AAAA,UACR,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC;AAAA,QACD,QAAO,OAAO,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,EAAE,CAAC;AAAA,QACjE,MAAM,QACJ,QAAQ,SAAS,kBAAkB;AAAA,UACjC;AAAA,UACA,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QACpB,MAAM,QACJ,QAAQ,SAAS,oBAAoB;AAAA,UACnC;AAAA,UACA,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,OACtB;AAAA,KACF;AAAA,IAED,MAAK,4EAA4E,YAAY;AAAA,MAC3F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QACxB,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,UACxC,mBAAmB,IAAG,0BAA0B;AAAA,QAClD,CAAC;AAAA,QAED,MAAM,UAAU,MAAM,QAAQ,SAAS,aAAa;AAAA,UAClD;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,UAClC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,SAAS,UAAU,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QACxE,QAAO,SAAS,YAAY,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QAE1E,MAAM,YAAY,MAAM,QAAQ,SAAS,aAAa;AAAA,UACpD;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,UAClC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,WAAW,UAAU,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QAE1E,MAAM,QACJ,QAAQ,SAAS,aAAa;AAAA,UAC5B;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,UAClC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QACpB,MAAM,QACJ,QAAQ,SAAS,aAAa;AAAA,UAC5B;AAAA,UACA,IAAI;AAAA,UACJ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,UAClC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QAEpB,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,IAAI;AAAA,UAChB,QAAQ,SAAS,aAAa;AAAA,YAC5B;AAAA,YACA,IAAI;AAAA,YACJ,UAAU;AAAA,YACV,WAAW;AAAA,YACX,KAAK,IAAG,0BAA0B;AAAA,YAClC,WAAW,IAAG,0BAA0B;AAAA,UAC1C,CAAC;AAAA,UACD,QAAQ,SAAS,aAAa;AAAA,YAC5B;AAAA,YACA,IAAI;AAAA,YACJ,UAAU;AAAA,YACV,WAAW;AAAA,YACX,KAAK,IAAG,0BAA0B;AAAA,YAClC,WAAW,IAAG,0BAA0B;AAAA,UAC1C,CAAC;AAAA,QACH,CAAC;AAAA,QACD,MAAM,aAAa,MAAM,QAAQ,SAAS,QAAQ,EAAE,uBAAW,IAAI,iBAAiB,CAAC;AAAA,QACrF,QAAO,YAAY,UAAU,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,OAC5E;AAAA,KACF;AAAA,IAED,MAAK,qDAAqD,YAAY;AAAA,MACpE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QAExB,MAAM,aAAa,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC/C,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW;AAAA,UACX,WAAW;AAAA,QACb,CAAC;AAAA,QACD,QAAO,WAAW,SAAS,EAAE,KAAK,sBAAsB;AAAA,QACxD,QAAO,WAAW,SAAS,EAAE,KAAK,aAAa;AAAA,QAC/C,MAAM,QACJ,QAAQ,SAAS,QAAQ,EAAE,uBAAW,IAAI,aAAa,CAAC,CAC1D,EAAE,SAAS,cAAc;AAAA,UACvB,WAAW;AAAA,UACX,WAAW;AAAA,QACb,CAAC;AAAA,QAGD,MAAM,gBAAgB,MAAM,QAAQ,SAAS,OAAO;AAAA,UAClD,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,cAAc,SAAS,EAAE,cAAc;AAAA,QAC9C,QAAO,cAAc,SAAS,EAAE,cAAc;AAAA,OAC/C;AAAA,KACF;AAAA,IAED,MAAK,0EAA0E,YAAY;AAAA,MACzF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QAExB,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAGD,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAGD,MAAM,WAAW,SAAS,EAAE,IAAI,SAAS,OAAO,cAAc,CAAC;AAAA,QAC/D,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAGD,MAAM,QAAQ,SAAS,MAAM;AAAA,UAC3B;AAAA,UACA,IAAI;AAAA,UACJ,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,SAAS,mBAAmB;AAAA,UACvD;AAAA,UACA,QAAQ;AAAA,UACR,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC;AAAA,QACD,QAAO,OAAO,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,OACvE;AAAA,KACF;AAAA,IAED,MAAK,oDAAoD,YAAY;AAAA,MACnE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,MAAM,QAAQ,YAAY,qBAAqB;AAAA,UAC3D,IAAI;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,UAAU,CAAC,YAAY;AAAA,UACvB,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,UAAU,MAAM,QAAQ,YAAY,qBAAqB;AAAA,UAC7D,IAAI;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,UAAU,CAAC,SAAS;AAAA,UACpB,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,QAAO,QAAQ,EAAE,EAAE,KAAK,MAAM,EAAE;AAAA,QAChC,QAAO,QAAQ,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC;AAAA,QAC5C,MAAM,QACJ,QAAQ,YAAY,iBAAiB;AAAA,UACnC;AAAA,UACA,OAAO;AAAA,UACP,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,IAAI,QAAQ,CAAC;AAAA,QAExC,MAAM,QAAQ,YAAY,OAAO;AAAA,UAC/B;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,YAAY,iBAAiB;AAAA,UACnC;AAAA,UACA,OAAO;AAAA,UACP,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,MAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QAExB,MAAM,QAAQ,iBAAiB,OAAO;AAAA,UACpC;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,WAAW,MAAM,QAAQ,iBAAiB,OAAO;AAAA,UACrD;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,QAAO,SAAS,MAAM,EAAE,KAAK,YAAY;AAAA,QACzC,MAAM,QACJ,QAAQ,iBAAiB,YAAY,EAAE,uBAAW,QAAQ,QAAQ,CAAC,CACrE,EAAE,SAAS,aAAa,CAAC;AAAA,OAC1B;AAAA,KACF;AAAA,IAED,MAAK,+CAA+C,YAAY;AAAA,MAC9D,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,gBACJ,QAAQ,iBAAiB,OAAO;AAAA,UAC9B;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,GACD,cACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,gEAAgE,YAAY;AAAA,MAC/E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QAExB,MAAM,QAAQ,iBAAiB,OAAO;AAAA,UACpC;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,UAAU,MAAM,QAAQ,iBAAiB,OAAO;AAAA,UACpD;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,QACX,CAAC;AAAA,QACD,QAAO,OAAO,EAAE,cAAc;AAAA,UAC5B;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,iBAAiB,YAAY,EAAE,uBAAW,QAAQ,QAAQ,CAAC,CACrE,EAAE,SAAS,aAAa,CAAC;AAAA,QAGzB,MAAM,QACJ,QAAQ,iBAAiB,OAAO,EAAE,uBAAW,QAAQ,SAAS,SAAS,aAAa,CAAC,CACvF,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,MAAK,8DAA8D,YAAY;AAAA,MAC7E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QACJ,QAAQ,iBAAiB,OAAO;AAAA,UAC9B;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,QACX,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,MAAK,wDAAwD,YAAY;AAAA,MACvE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,kBAAiB,MAAM,QAAQ,gBAAgB,OAAO;AAAA,UAC1D,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,aAAa;AAAA,UACb,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,eAAc,EAAE,cAAc;AAAA,UACnC,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,QAAQ;AAAA,QACV,CAAC;AAAA,QAED,MAAM,aAAa,MAAM,QAAQ,+BAA+B,OAAO;AAAA,UACrE;AAAA,UACA,kBAAkB;AAAA,UAClB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,WAAW,OAAO,EAAE,KAAK,YAAY;AAAA,QAC5C,MAAM,WAAW,MAAM,QAAQ,+BAA+B,OAAO;AAAA,UACnE;AAAA,UACA,kBAAkB;AAAA,UAClB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,SAAS,MAAM,EAAE,KAAK,QAAQ;AAAA,QAErC,MAAM,QACJ,QAAQ,+BAA+B,sBAAsB;AAAA,UAC3D;AAAA,UACA,kBAAkB;AAAA,QACpB,CAAC,CACH,EAAE,SAAS,aAAa,CAAC;AAAA,QACzB,MAAM,QACJ,QAAQ,+BAA+B,aAAa;AAAA,UAClD;AAAA,UACA,SAAS;AAAA,QACX,CAAC,CACH,EAAE,SAAS,cAAc,CAAC,EAAE,kBAAkB,aAAa,CAAC,CAAC;AAAA,QAE7D,MAAM,UAAU,MAAM,QAAQ,gBAAgB,OAAO;AAAA,UACnD;AAAA,UACA,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,QAAQ,YAAY,CAAC;AAAA,QAC/E,MAAM,QACJ,QAAQ,gBAAgB,KAAK,EAAE,uBAAW,UAAU,CAAC,WAAW,EAAE,CAAC,CACrE,EAAE,SAAS,cAAc;AAAA,UACvB,iBAAiB,CAAC,EAAE,IAAI,aAAa,CAAC;AAAA,UACtC,OAAO;AAAA,QACT,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,oEAAoE,YAAY;AAAA,MACnF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,gBACJ,QAAQ,+BAA+B,OAAO;AAAA,UAC5C;AAAA,UACA,kBAAkB;AAAA,UAClB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,GACD,yBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,wDAAwD,YAAY;AAAA,MACvE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,gBAAgB,OAAO;AAAA,UACnC,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,+BAA+B,OAAO;AAAA,UAClD;AAAA,UACA,kBAAkB;AAAA,UAClB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,+BAA+B,OAAO;AAAA,UAClD;AAAA,UACA,kBAAkB;AAAA,UAClB,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,QAAQ,MAAM,QAAQ,+BAA+B,2BAA2B;AAAA,UACpF;AAAA,UACA,kBAAkB;AAAA,UAClB,UAAU,CAAC,iBAAiB,iBAAiB,KAAK;AAAA,UAClD,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,MAAM,IAAI,CAAC,eAAe,CAAC,WAAW,SAAS,WAAW,MAAM,CAAC,CAAC,EAAE,QAAQ;AAAA,UACjF,CAAC,iBAAiB,OAAO;AAAA,UACzB,CAAC,gBAAgB,QAAQ;AAAA,UACzB,CAAC,OAAO,OAAO;AAAA,QACjB,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,+BAA+B,2BAA2B;AAAA,UACrF;AAAA,UACA,kBAAkB;AAAA,UAClB,UAAU,CAAC,KAAK;AAAA,UAChB,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,OAAO,IAAI,CAAC,eAAe,CAAC,WAAW,SAAS,WAAW,MAAM,CAAC,CAAC,EAAE,QAAQ;AAAA,UAClF,CAAC,gBAAgB,QAAQ;AAAA,UACzB,CAAC,OAAO,OAAO;AAAA,QACjB,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,gEAAgE,YAAY;AAAA,MAC/E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QACxB,MAAM,QAAQ,gBAAgB,OAAO;AAAA,UACnC,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,WAAW,MAAM,QAAQ,aAAa,OAAO;AAAA,UACjD,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,WAAW;AAAA,UACX,WAAW;AAAA,UACX,UAAU,CAAC,cAAc,cAAc,SAAS;AAAA,UAChD,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,SAAS,QAAQ,EAAE,QAAQ,CAAC,cAAc,SAAS,CAAC;AAAA,QAC3D,MAAM,QACJ,QAAQ,aAAa,qBAAqB;AAAA,UACxC;AAAA,UACA,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,IAAI,eAAe,CAAC;AAAA,QAC/C,MAAM,QACJ,QAAQ,aAAa,qBAAqB;AAAA,UACxC;AAAA,UACA,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,QAEpB,MAAM,UAAU,MAAM,QAAQ,aAAa,MAAM;AAAA,UAC/C;AAAA,UACA,IAAI;AAAA,UACJ,YAAY,IAAG,0BAA0B;AAAA,UACzC,WAAW;AAAA,UACX,WAAW;AAAA,QACb,CAAC;AAAA,QACD,QAAO,QAAQ,YAAY,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QACzE,QAAO,QAAQ,iBAAiB,EAAE,KAAK,cAAc;AAAA,QAErD,MAAM,QAAQ,aAAa,OAAO;AAAA,UAChC,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,WAAW;AAAA,UACX,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,aAAa,KAAK;AAAA,UACxB;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,QACb,CAAC,CACH,EAAE,SAAS,cAAc;AAAA,UACvB,cAAc,CAAC,EAAE,IAAI,cAAc,CAAC;AAAA,UACpC,OAAO;AAAA,QACT,CAAC;AAAA,QAED,MAAM,QAAQ,aAAa,OAAO;AAAA,UAChC;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,aAAa,qBAAqB;AAAA,UACxC;AAAA,UACA,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,WAAW;AAAA,UACX,KAAK,IAAG,0BAA0B;AAAA,QACpC,CAAC,CACH,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,MAAK,4EAA4E,YAAY;AAAA,MAC3F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,SAAS,EAAE,IAAI,eAAe,OAAO,mBAAmB,CAAC;AAAA,QAC1E,MAAM,QAAQ,gBAAgB,OAAO;AAAA,UACnC,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,aAAa;AAAA,UACjB,EAAE,MAAM,QAAQ,IAAI,cAAc;AAAA,UAClC,EAAE,MAAM,kBAAkB,IAAI,cAAc;AAAA,UAC5C,EAAE,MAAM,UAAU,IAAI,YAAY;AAAA,QACpC;AAAA,QAEA,YAAY,OAAO,cAAc,WAAW,QAAQ,GAAG;AAAA,UACrD,MAAM,YAAY,UAAU,UAAU;AAAA,UACtC,MAAM,iBAAiB,MAAM,QAAQ,gBAAgB,OAAO;AAAA,YAC1D,IAAI;AAAA,YACJ;AAAA,YACA,MAAM,sBAAsB,UAAU;AAAA,YACtC,oBAAoB;AAAA,YACpB,oBAAoB;AAAA,YACpB,WAAW,IAAG,kBAAkB,eAAe;AAAA,UACjD,CAAC;AAAA,UACD,QAAO,eAAe,kBAAkB,EAAE,QAAQ,SAAS;AAAA,UAC3D,QAAO,eAAe,kBAAkB,EAAE,KAAK,aAAa;AAAA,UAC5D,MAAM,QACJ,QAAQ,gBAAgB,QAAQ,EAAE,uBAAW,IAAI,UAAU,CAAC,CAC9D,EAAE,SAAS,cAAc;AAAA,YACvB,oBAAoB;AAAA,YACpB,oBAAoB;AAAA,UACtB,CAAC;AAAA,UAED,MAAM,UAAU,UAAU,UAAU;AAAA,UACpC,MAAM,eAAe,MAAM,QAAQ,aAAa,OAAO;AAAA,YACrD,IAAI;AAAA,YACJ;AAAA,YACA,MAAM,YAAY,UAAU;AAAA,YAC5B,MAAM;AAAA,YACN,aAAa;AAAA,YACb,WAAW;AAAA,YACX,WAAW,QAAQ;AAAA,YACnB,oBAAoB;AAAA,YACpB,oBAAoB;AAAA,YACpB,WAAW,IAAG,kBAAkB,eAAe;AAAA,YAC/C,WAAW,IAAG,kBAAkB,eAAe;AAAA,UACjD,CAAC;AAAA,UACD,QAAO,aAAa,kBAAkB,EAAE,QAAQ,SAAS;AAAA,UACzD,QAAO,aAAa,kBAAkB,EAAE,KAAK,aAAa;AAAA,UAC1D,MAAM,QACJ,QAAQ,aAAa,QAAQ,EAAE,uBAAW,IAAI,QAAQ,CAAC,CACzD,EAAE,SAAS,cAAc;AAAA,YACvB,oBAAoB;AAAA,YACpB,oBAAoB;AAAA,UACtB,CAAC;AAAA,QACH;AAAA,QAGA,MAAM,YAAY,MAAM,QAAQ,gBAAgB,OAAO;AAAA,UACrD,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,QAAO,UAAU,kBAAkB,EAAE,cAAc;AAAA,QACnD,QAAO,UAAU,kBAAkB,EAAE,cAAc;AAAA,QACnD,MAAM,QACJ,QAAQ,gBAAgB,QAAQ,EAAE,uBAAW,IAAI,gBAAgB,CAAC,CACpE,EAAE,SAAS,cAAc,EAAE,IAAI,gBAAgB,CAAC;AAAA,OACjD;AAAA,KACF;AAAA,IAED,MAAK,4DAA4D,YAAY;AAAA,MAC3E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QACxB,MAAM,QAAQ,aAAa,OAAO;AAAA,UAChC,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,WAAW;AAAA,UACX,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,QAAQ,MAAM,QAAQ,aAAa,MAAM;AAAA,UAC7C;AAAA,UACA,IAAI;AAAA,UACJ,YAAY,IAAG,0BAA0B;AAAA,UACzC,WAAW;AAAA,UACX,WAAW;AAAA,QACb,CAAC;AAAA,QACD,QAAO,MAAM,iBAAiB,EAAE,KAAK,cAAc;AAAA,QACnD,QAAO,MAAM,iBAAiB,EAAE,KAAK,cAAc;AAAA,QAInD,MAAM,SAAS,MAAM,QAAQ,aAAa,MAAM;AAAA,UAC9C;AAAA,UACA,IAAI;AAAA,UACJ,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,QACD,QAAO,OAAO,YAAY,YAAY,CAAC,EAAE,KAAK,0BAA0B;AAAA,QACxE,QAAO,OAAO,iBAAiB,EAAE,KAAK,cAAc;AAAA,QACpD,QAAO,OAAO,iBAAiB,EAAE,KAAK,cAAc;AAAA,QACpD,MAAM,QACJ,QAAQ,aAAa,QAAQ,EAAE,uBAAW,IAAI,YAAY,CAAC,CAC7D,EAAE,SAAS,cAAc;AAAA,UACvB,mBAAmB;AAAA,UACnB,mBAAmB;AAAA,QACrB,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,kEAAkE,YAAY;AAAA,MACjF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QAExB,MAAM,MAAM,CAAC,SAAS,SAAS,SAAS,OAAO;AAAA,QAC/C,YAAY,OAAO,OAAO,IAAI,QAAQ,GAAG;AAAA,UACvC,MAAM,QAAQ,aAAa,OAAO;AAAA,YAChC;AAAA,YACA;AAAA,YACA,MAAM,SAAS;AAAA,YACf,MAAM;AAAA,YACN,aAAa;AAAA,YACb,WAAW;AAAA,YACX,WAAW,QAAQ;AAAA,YACnB,WAAW,IAAG,kBAAkB,eAAe;AAAA,YAC/C,WAAW,IAAG,kBAAkB,eAAe;AAAA,UACjD,CAAC;AAAA,QACH;AAAA,QACA,MAAM,QAAQ,aAAa,OAAO;AAAA,UAChC;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAGD,MAAM,SAAS,MAAM,QAAQ,aAAa,KAAK,EAAE,sBAAU,CAAC;AAAA,QAC5D,QAAO,OAAO,aAAa,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,SAAS,OAAO,CAAC;AAAA,QACxF,QAAO,OAAO,KAAK,EAAE,KAAK,CAAC;AAAA,QAC3B,QAAO,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,QAGjC,MAAM,MAAM,MAAM,QAAQ,aAAa,KAAK,EAAE,uBAAW,gBAAgB,KAAK,CAAC;AAAA,QAC/E,QAAO,IAAI,aAAa,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,EAAE,QAAQ;AAAA,UACxD;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD,QAAO,IAAI,KAAK,EAAE,KAAK,CAAC;AAAA,QAGxB,MAAM,aAAa,MAAM,QAAQ,aAAa,KAAK;AAAA,UACjD;AAAA,UACA,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,QAAO,WAAW,aAAa,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,EAAE,QAAQ;AAAA,UAC/D;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QAGD,MAAM,YAAY,MAAM,QAAQ,aAAa,KAAK;AAAA,UAChD;AAAA,UACA,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,QAAO,UAAU,aAAa,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,QAClF,QAAO,UAAU,KAAK,EAAE,KAAK,CAAC;AAAA,QAC9B,QAAO,UAAU,OAAO,EAAE,KAAK,IAAI;AAAA,QAGnC,MAAM,aAAa,MAAM,QAAQ,aAAa,KAAK;AAAA,UACjD;AAAA,UACA,gBAAgB;AAAA,UAChB,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,QAAO,WAAW,aAAa,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,QACnF,QAAO,WAAW,OAAO,EAAE,KAAK,KAAK;AAAA,QAGrC,MAAM,gBAAgB,MAAM,QAAQ,aAAa,KAAK;AAAA,UACpD;AAAA,UACA,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,QAAO,cAAc,aAAa,IAAI,CAAC,UAAU,MAAM,EAAE,CAAC,EAAE,QAAQ,GAAG;AAAA,QACvE,QAAO,cAAc,OAAO,EAAE,KAAK,KAAK;AAAA,OACzC;AAAA,KACF;AAAA,IAED,MAAK,iDAAiD,YAAY;AAAA,MAChE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,MAAM,CAAC,SAAS,SAAS,OAAO;AAAA,QACtC,YAAY,OAAO,OAAO,IAAI,QAAQ,GAAG;AAAA,UACvC,MAAM,QAAQ,gBAAgB,OAAO;AAAA,YACnC;AAAA,YACA;AAAA,YACA,MAAM,mBAAmB;AAAA,YACzB,WAAW,IAAG,kBAAkB,eAAe;AAAA,UACjD,CAAC;AAAA,QACH;AAAA,QAGA,MAAM,MAAM,MAAM,QAAQ,gBAAgB,KAAK,EAAE,sBAAU,CAAC;AAAA,QAC5D,QAAO,IAAI,gBAAgB,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,GAAG;AAAA,QACpE,QAAO,IAAI,KAAK,EAAE,KAAK,CAAC;AAAA,QACxB,QAAO,IAAI,OAAO,EAAE,KAAK,KAAK;AAAA,QAE9B,MAAM,YAAY,MAAM,QAAQ,gBAAgB,KAAK,EAAE,uBAAW,OAAO,EAAE,CAAC;AAAA,QAC5E,QAAO,UAAU,gBAAgB,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,SAAS,OAAO,CAAC;AAAA,QACzF,QAAO,UAAU,KAAK,EAAE,KAAK,CAAC;AAAA,QAC9B,QAAO,UAAU,OAAO,EAAE,KAAK,IAAI;AAAA,QAEnC,MAAM,aAAa,MAAM,QAAQ,gBAAgB,KAAK;AAAA,UACpD;AAAA,UACA,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,QAAO,WAAW,gBAAgB,IAAI,CAAC,YAAY,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;AAAA,QACjF,QAAO,WAAW,OAAO,EAAE,KAAK,KAAK;AAAA,OACtC;AAAA,KACF;AAAA,IAED,MAAK,yCAAyC,YAAY;AAAA,MACxD,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QAExB,MAAM,gBACJ,QAAQ,aAAa,OAAO;AAAA,UAC1B,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,WAAW;AAAA,UACX,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,GACD,eACF;AAAA,QACA,MAAM,gBACJ,QAAQ,aAAa,OAAO;AAAA,UAC1B,IAAI;AAAA,UACJ;AAAA,UACA,MAAM;AAAA,UACN,MAAM;AAAA,UACN,aAAa;AAAA,UACb,WAAW;AAAA,UACX,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC,GACD,yBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,gEAAgE,YAAY;AAAA,MAC/E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,UAAU;AAAA,UACV,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,QAAO,QAAQ,WAAW,QAAQ,EAAE,uBAAW,IAAI,OAAO,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACzF,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,gBACJ,QAAQ,WAAW,QAAQ;AAAA,UACzB;AAAA,UACA,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC,GACD,oBACF;AAAA,QAEA,MAAM,QACJ,QAAQ,WAAW,QAAQ;AAAA,UACzB;AAAA,UACA,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC,CACH,EAAE,SAAS,cAAc;AAAA,UACvB,UAAU;AAAA,UACV,UAAU;AAAA,UACV,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,QACD,MAAM,gBACJ,QAAQ,WAAW,QAAQ;AAAA,UACzB;AAAA,UACA,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC,GACD,oBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,wDAAwD,YAAY;AAAA,MACvE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,0BAA0B,OAAO;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,UACd,UAAU;AAAA,UACV,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,gBACJ,QAAQ,0BAA0B,QAAQ;AAAA,UACxC;AAAA,UACA,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC,GACD,sBACF;AAAA,QACA,MAAM,QACJ,QAAQ,0BAA0B,QAAQ;AAAA,UACxC;AAAA,UACA,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC,CACH,EAAE,SAAS,cAAc;AAAA,UACvB,UAAU;AAAA,UACV,cAAc;AAAA,UACd,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,QACD,MAAM,gBACJ,QAAQ,0BAA0B,QAAQ;AAAA,UACxC;AAAA,UACA,IAAI;AAAA,UACJ,WAAW;AAAA,UACX,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC,GACD,sBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,qDAAqD,YAAY;AAAA,MACpE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QACxB,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,wBAAwB;AAAA,UACnD;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,SAAS,aAAa,WAAW,gBAAgB,SAAS,IAAG,0BAA0B,CAAC;AAAA,QAC1F,CAAC;AAAA,QAED,QAAO,OAAO,KAAK,EAAE,EAAE,KAAK,OAAO;AAAA,QACnC,QAAO,OAAO,OAAO,EAAE,cAAc;AAAA,UACnC,IAAI;AAAA,UACJ,YAAY;AAAA,UACZ,WAAW;AAAA,UACX,mBAAmB,IAAG,0BAA0B;AAAA,QAClD,CAAC;AAAA,QAGD,MAAM,aAAa,MAAM,QAAQ,SAAS,QAAQ,EAAE,uBAAW,IAAI,UAAU,CAAC;AAAA,QAC9E,QAAO,YAAY,SAAS,EAAE,cAAc;AAAA,QAC5C,MAAM,gBACJ,QAAQ,wBAAwB;AAAA,UAC9B;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,SAAS,aAAa,YAAY;AAAA,QACpC,CAAC,GACD,oBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,+EAA+E,YAAY;AAAA,MAC9F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,YAAY,qBAAqB;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,UAAU,CAAC,cAAc,SAAS;AAAA,UAClC,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,wBAAwB;AAAA,UACnD;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,gBAAgB,CAAC,iBAAiB;AAAA,UAClC,SAAS,aAAa,SAAS;AAAA,QACjC,CAAC;AAAA,QAED,QAAO,OAAO,UAAU,EAAE,cAAc;AAAA,UACtC,IAAI;AAAA,UACJ,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,MAAM,cAAc,MAAM,QAAQ,iBAAiB,YAAY;AAAA,UAC7D;AAAA,UACA,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,QAAO,YAAY,IAAI,CAAC,eAAe,CAAC,WAAW,SAAS,WAAW,MAAM,CAAC,CAAC,EAAE,QAAQ;AAAA,UACvF,CAAC,cAAc,YAAY;AAAA,UAC3B,CAAC,WAAW,YAAY;AAAA,UACxB,CAAC,mBAAmB,QAAQ;AAAA,QAC9B,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,qEAAqE,YAAY;AAAA,MACpF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,SAAS,EAAE,IAAI,gBAAgB,OAAO,eAAe,CAAC;AAAA,QACvE,MAAM,QAAQ,YAAY,qBAAqB;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,UAAU,CAAC,cAAc,SAAS;AAAA,UAClC,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,iBAAiB,OAAO;AAAA,UACpC;AAAA,UACA,QAAQ;AAAA,UACR,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,QAAQ,wBAAwB;AAAA,UACpC;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,SAAS,aAAa,cAAc;AAAA,QACtC,CAAC;AAAA,QAED,MAAM,cAAc,MAAM,QAAQ,iBAAiB,YAAY;AAAA,UAC7D;AAAA,UACA,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,QAAO,YAAY,IAAI,CAAC,eAAe,CAAC,WAAW,SAAS,WAAW,MAAM,CAAC,CAAC,EAAE,QAAQ;AAAA,UACvF,CAAC,cAAc,QAAQ;AAAA,UACvB,CAAC,WAAW,YAAY;AAAA,QAC1B,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,yEAAyE,YAAY;AAAA,MACxF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,YAAY,qBAAqB;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,YAAY,OAAO;AAAA,UAC/B;AAAA,UACA,IAAI;AAAA,UACJ,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,gBACJ,QAAQ,wBAAwB;AAAA,UAC9B;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,SAAS,aAAa,SAAS;AAAA,QACjC,CAAC,GACD,2BACF;AAAA,QACA,MAAM,QACJ,QAAQ,MAAM,WAAW,EAAE,uBAAW,OAAO,eAAe,CAAC,CAC/D,EAAE,SAAS,SAAS;AAAA,QACpB,MAAM,QAAO,QAAQ,WAAW,QAAQ,EAAE,uBAAW,IAAI,OAAO,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACzF,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,oEAAoE,YAAY;AAAA,MACnF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,wBAAwB;AAAA,UACnD;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,oCAAoC;AAAA,UACpC,gBAAgB,CAAC,iBAAiB;AAAA,UAClC,SAAS,aAAa,aAAa;AAAA,QACrC,CAAC;AAAA,QAED,QAAO,OAAO,IAAI,EAAE,cAAc;AAAA,UAChC,IAAI;AAAA,UACJ,OAAO;AAAA,QACT,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,iBAAiB,YAAY,EAAE,uBAAW,QAAQ,cAAc,CAAC,CAC3E,EAAE,SAAS,cAAc,CAAC,EAAE,SAAS,mBAAmB,QAAQ,SAAS,CAAC,CAAC;AAAA,OAC5E;AAAA,KACF;AAAA,IAED,MAAK,qEAAqE,YAAY;AAAA,MACpF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,SAAS;AAAA,UACxB,IAAI;AAAA,UACJ,OAAO;AAAA,QACT,CAAC;AAAA,QACD,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,gBACJ,QAAQ,wBAAwB;AAAA,UAC9B;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,oCAAoC;AAAA,UACpC,qCAAqC;AAAA,UACrC,SAAS,aAAa,aAAa;AAAA,QACrC,CAAC,GACD,2BACF;AAAA,QACA,MAAM,QACJ,QAAQ,MAAM,WAAW,EAAE,uBAAW,OAAO,mBAAmB,CAAC,CACnE,EAAE,SAAS,SAAS;AAAA,QACpB,MAAM,QAAO,QAAQ,WAAW,QAAQ,EAAE,uBAAW,IAAI,OAAO,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACzF,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,uEAAuE,YAAY;AAAA,MACtF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,SAAS;AAAA,UACxB,IAAI;AAAA,UACJ,OAAO;AAAA,QACT,CAAC;AAAA,QACD,MAAM,QAAQ,YAAY,qBAAqB;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,UAAU,CAAC,YAAY;AAAA,UACvB,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,wBAAwB;AAAA,UACnD;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,qCAAqC;AAAA,UACrC,SAAS,aAAa,aAAa;AAAA,QACrC,CAAC;AAAA,QAED,QAAO,OAAO,IAAI,EAAE,cAAc;AAAA,UAChC,IAAI;AAAA,UACJ,OAAO;AAAA,QACT,CAAC;AAAA,QACD,QAAO,OAAO,UAAU,EAAE,cAAc;AAAA,UACtC,IAAI;AAAA,UACJ,QAAQ;AAAA,QACV,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,iEAAiE,YAAY;AAAA,MAChF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,SAAS,EAAE,QAAQ,YAAY,CAAC;AAAA,QACjD,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,OAAO;AAAA,UACP,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,gBACJ,QAAQ,wBAAwB;AAAA,UAC9B;AAAA,UACA,aAAa;AAAA,UACb,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,WAAW;AAAA,UACX,SAAS,aAAa,SAAS;AAAA,QACjC,CAAC,GACD,gBACF;AAAA,QACA,MAAM,QAAO,QAAQ,WAAW,QAAQ,EAAE,uBAAW,IAAI,OAAO,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACzF,YAAY,IAAG,0BAA0B;AAAA,QAC3C,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,uDAAuD,YAAY;AAAA,MACtE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,SAAS,EAAE,IAAI,YAAY,OAAO,eAAe,CAAC;AAAA,QACnE,MAAM,QAAQ,WAAW,OAAO;AAAA,UAC9B;AAAA,UACA,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ,EAAE,OAAO,eAAe;AAAA,UAChC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,0BAA0B,OAAO;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,mBAAmB;AAAA,UAC9C;AAAA,UACA,4BAA4B;AAAA,UAC5B,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,SAAS;AAAA,UACT,OAAO;AAAA,UACP,eAAe;AAAA,UACf,QAAQ,EAAE,OAAO,mBAAmB;AAAA,UACpC,WAAW;AAAA,UACX,SAAS,aAAa,UAAU;AAAA,QAClC,CAAC;AAAA,QAED,QAAO,OAAO,QAAQ,EAAE,cAAc;AAAA,UACpC,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,QAAQ,EAAE,OAAO,mBAAmB;AAAA,QACtC,CAAC;AAAA,QACD,MAAM,QAAO,QAAQ,MAAM,QAAQ,EAAE,uBAAW,IAAI,WAAW,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACxF,OAAO;AAAA,QACT,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,kEAAkE,YAAY;AAAA,MACjF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,SAAS,EAAE,IAAI,gBAAgB,OAAO,eAAe,CAAC;AAAA,QACvE,MAAM,QAAQ,0BAA0B,OAAO;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,gBACJ,QAAQ,mBAAmB;AAAA,UACzB;AAAA,UACA,4BAA4B;AAAA,UAC5B,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,SAAS;AAAA,UACT,OAAO;AAAA,UACP,eAAe;AAAA,UACf,yBAAyB;AAAA,UACzB,WAAW;AAAA,UACX,SAAS,aAAa,aAAa;AAAA,QACrC,CAAC,GACD,wBACF;AAAA,QAEA,MAAM,QAAQ,0BAA0B,OAAO;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,SAAS,MAAM,QAAQ,mBAAmB;AAAA,UAC9C;AAAA,UACA,4BAA4B;AAAA,UAC5B,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,SAAS;AAAA,UACT,OAAO;AAAA,UACP,eAAe;AAAA,UACf,yBAAyB;AAAA,UACzB,WAAW;AAAA,UACX,SAAS,aAAa,aAAa;AAAA,QACrC,CAAC;AAAA,QAED,QAAO,OAAO,KAAK,EAAE,EAAE,KAAK,cAAc;AAAA,QAC1C,QAAO,OAAO,QAAQ,EAAE,cAAc;AAAA,UACpC,QAAQ;AAAA,QACV,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,MAAK,wEAAwE,YAAY;AAAA,MACvF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,YAAY,qBAAqB;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,OAAO;AAAA,UACP,UAAU,CAAC,YAAY;AAAA,UACvB,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,0BAA0B,OAAO;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,mBAAmB;AAAA,UAC9C;AAAA,UACA,4BAA4B;AAAA,UAC5B,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,SAAS;AAAA,UACT,OAAO;AAAA,UACP,aAAa;AAAA,UACb,eAAe;AAAA,UACf,WAAW;AAAA,UACX,SAAS,aAAa,UAAU;AAAA,QAClC,CAAC;AAAA,QAED,QAAO,OAAO,IAAI,EAAE,cAAc;AAAA,UAChC,IAAI;AAAA,UACJ,OAAO;AAAA,UACP,aAAa;AAAA,QACf,CAAC;AAAA,QACD,QAAO,OAAO,UAAU,EAAE,cAAc;AAAA,UACtC,IAAI;AAAA,UACJ,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,QAAO,OAAO,QAAQ,EAAE,cAAc;AAAA,UACpC,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,iBAAiB,YAAY,EAAE,uBAAW,QAAQ,WAAW,CAAC,CACxE,EAAE,SAAS,cAAc,CAAC,EAAE,SAAS,cAAc,QAAQ,aAAa,CAAC,CAAC;AAAA,OAC3E;AAAA,KACF;AAAA,IAED,MAAK,8EAA8E,YAAY;AAAA,MAC7F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,0BAA0B,OAAO;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,gBACJ,QAAQ,mBAAmB;AAAA,UACzB;AAAA,UACA,4BAA4B;AAAA,UAC5B,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,SAAS;AAAA,UACT,OAAO;AAAA,UACP,eAAe;AAAA,UACf,WAAW;AAAA,UACX,SAAS,aAAa,UAAU;AAAA,QAClC,CAAC,GACD,2BACF;AAAA,QACA,MAAM,QACJ,QAAQ,MAAM,WAAW,EAAE,uBAAW,OAAO,eAAe,CAAC,CAC/D,EAAE,SAAS,SAAS;AAAA,OACrB;AAAA,KACF;AAAA,IAED,MAAK,gEAAgE,YAAY;AAAA,MAC/E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,0BAA0B,OAAO;AAAA,UAC7C,IAAI;AAAA,UACJ;AAAA,UACA,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,QAAQ,mBAAmB;AAAA,UAC9C;AAAA,UACA,4BAA4B;AAAA,UAC5B,WAAW;AAAA,UACX,aAAa,IAAG,0BAA0B;AAAA,UAC1C,SAAS;AAAA,UACT,OAAO;AAAA,UACP,eAAe;AAAA,UACf,oCAAoC;AAAA,UACpC,qCAAqC;AAAA,UACrC,gBAAgB,CAAC,iBAAiB;AAAA,UAClC,WAAW;AAAA,UACX,SAAS,aAAa,oBAAoB;AAAA,QAC5C,CAAC;AAAA,QAED,QAAO,OAAO,IAAI,EAAE,cAAc;AAAA,UAChC,IAAI;AAAA,UACJ,OAAO;AAAA,QACT,CAAC;AAAA,QACD,MAAM,QACJ,QAAQ,iBAAiB,YAAY,EAAE,uBAAW,QAAQ,cAAc,CAAC,CAC3E,EAAE,SAAS,cAAc,CAAC,EAAE,SAAS,mBAAmB,QAAQ,SAAS,CAAC,CAAC;AAAA,OAC5E;AAAA,KACF;AAAA,IAED,MAAK,0DAA0D,YAAY;AAAA,MACzE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,OAAO;AAAA,QACxB,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAQ,SAAS,OAAO;AAAA,UAC5B,IAAI;AAAA,UACJ;AAAA,UACA,QAAQ;AAAA,UACR,YAAY;AAAA,UACZ,UAAU;AAAA,UACV,WAAW;AAAA,UACX,WAAW,IAAG,0BAA0B;AAAA,UACxC,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QAED,MAAM,YAAY,MAAM,QAAQ,6BAA6B;AAAA,UAC3D;AAAA,UACA,QAAQ;AAAA,UACR,aAAa,IAAG,0BAA0B;AAAA,QAC5C,CAAC;AAAA,QAED,QAAO,UAAU,MAAM,EAAE,KAAK,WAAW;AAAA,QACzC,MAAM,QAAO,QAAQ,SAAS,QAAQ,EAAE,uBAAW,IAAI,QAAQ,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACxF,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CAAC;AAAA,QACD,MAAM,QAAO,QAAQ,SAAS,QAAQ,EAAE,uBAAW,IAAI,UAAU,CAAC,CAAC,EAAE,SAAS,cAC5E;AAAA,UACE,WAAW,IAAG,0BAA0B;AAAA,QAC1C,CACF;AAAA,OACD;AAAA,KACF;AAAA,GACF;AAAA;;AC14DH,qBAAS,qBAAU,iBAAQ;AAYpB,SAAS,2BAAyD,CACvE,OACA,SACM;AAAA,EACN,MAAM,UAAU,IAAI;AAAA,EAEpB,MAAM,cAAc,OAAO,SAA8D;AAAA,IACvF,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,QAAQ,WAAW,OAAO;AAAA;AAAA;AAAA,EAIpC,UAAS,OAAO,MAAM;AAAA,IACpB,MAAK,2DAA2D,YAAY;AAAA,MAC1E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,OAAO,IAAI,eAA2B;AAAA,UAC1C,KAAK,CAAC,YAAY;AAAA,YAChB,WAAW,QAAQ,QAAQ,OAAO,WAAW,CAAC;AAAA,YAC9C,WAAW,QAAQ,QAAQ,OAAO,MAAM,CAAC;AAAA,YACzC,WAAW,MAAM;AAAA;AAAA,QAErB,CAAC;AAAA,QAED,MAAM,UAAU,MAAM,QAAQ,IAAI;AAAA,UAChC;AAAA,UACA,mBAAmB;AAAA,UACnB,UAAU;AAAA,UACV,WAAW;AAAA,UACX,aAAa;AAAA,QACf,CAAC;AAAA,QAED,QAAO,QAAQ,SAAS,EAAE,KAAK,EAAE;AAAA,QACjC,QAAO,QAAQ,MAAM,EAAE,KAAK,iBAAiB,QAAQ,MAAM,CAAC;AAAA,QAC5D,QAAO,QAAQ,QAAQ,EAAE,KAAK,YAAY;AAAA,QAC1C,QAAO,QAAQ,SAAS,EAAE,KAAK,0BAA0B;AAAA,QACzD,QAAO,QAAQ,WAAW,EAAE,KAAK,oBAAoB;AAAA,QACrD,QAAO,MAAM,IAAI,SAAS,MAAM,QAAQ,KAAK,QAAQ,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,KAAK,eAAe;AAAA,OAC3F;AAAA,KACF;AAAA,IAED,MAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,QAAQ,OAAO,YAAY;AAAA,QACzC,MAAM,SAAS,iBAAiB,kBAAkB,KAAK,CAAC;AAAA,QAExD,MAAM,QACJ,QAAQ,IAAI,EAAE,MAAM,OAAO,mBAAmB,MAAM,aAAa,EAAE,CAAC,CACtE,EAAE,QAAQ,QACR,gCAAgC,MAAM,aAAa,qBAAqB,MAAM,aAChF;AAAA,QACA,MAAM,QAAO,QAAQ,KAAK,MAAM,CAAC,EAAE,SAAS,SAAS;AAAA,OACtD;AAAA,KACF;AAAA,IAED,MAAK,kCAAkC,YAAY;AAAA,MACjD,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,OAAO,IAAI,eAA2B;AAAA,UAC1C,IAAI,CAAC,YAAY;AAAA,YACf,WAAW,MAAM;AAAA;AAAA,QAErB,CAAC;AAAA,QAED,MAAM,QAAO,QAAQ,IAAI,EAAE,MAAM,mBAAmB,GAAG,CAAC,CAAC,EAAE,QAAQ,QACjE,uDACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,2DAA2D,YAAY;AAAA,MAC1E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,IAAI;AAAA,QAClB,IAAI,gBAAgB;AAAA,QACpB,MAAM,aAAa,QAAQ,OAAO,SAAS;AAAA,QAC3C,MAAM,SAAS,iBAAiB,kBAAkB,UAAU,CAAC;AAAA,QAC7D,MAAM,OAAO,IAAI,eAA2B;AAAA,UAC1C,KAAK,CAAC,YAAY;AAAA,YAChB,WAAW,QAAQ,UAAU;AAAA;AAAA,UAE/B,MAAM,GAAG;AAAA,YACP,gBAAgB;AAAA;AAAA,QAEpB,CAAC;AAAA,QAED,MAAM,MAAM,QAAQ,IAAI,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,QACtD,MAAM,MAAM,IAAI,MAAM,iBAAiB,CAAC;AAAA,QAExC,MAAM,QAAO,GAAG,EAAE,QAAQ,QAAQ,iBAAiB;AAAA,QACnD,QAAO,aAAa,EAAE,KAAK,IAAI;AAAA,QAC/B,MAAM,QAAO,QAAQ,KAAK,MAAM,CAAC,EAAE,SAAS,SAAS;AAAA,OACtD;AAAA,KACF;AAAA,GACF;AAAA;;AC1GH,qBAAS,qBAAU,iBAAQ;AAuC3B,IAAM,eAAuC,EAAE,IAAI,WAAW;AAC9D,IAAM,iBAAyC,EAAE,IAAI,cAAc,WAAW,EAAE,YAAY,EAAE,EAAE;AAUzF,SAAS,sBAA8C,CAC5D,OACA,SACM;AAAA,EACN,MAAM,WAAW,QAAQ,YAAY;AAAA,EACrC,MAAM,eAAe,QAAQ,gBAAgB,WAAW;AAAA,EACxD,MAAM,sBAAsB,QAAQ,uBAAuB;AAAA,EAC3D,MAAM,gCAAgC,QAAQ,iCAAiC;AAAA,EAC/E,MAAM,6BAA6B,QAAQ,8BAA8B;AAAA,EAEzE,MAAM,aAAa,OAAO,SAA4D;AAAA,IACpF,MAAM,SAAS,MAAM,QAAQ,aAAa;AAAA,IAC1C,IAAI;AAAA,MACF,MAAM,KAAK,MAAM;AAAA,cACjB;AAAA,MACA,MAAM,QAAQ,WAAW,MAAM;AAAA;AAAA;AAAA,EAInC,UAAS,OAAO,MAAM;AAAA,IACpB,UAAS,UAAU,MAAM;AAAA,MACvB,MAAK,sDAAsD,YAAY;AAAA,QACrE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,SAAS,KAAK,IAAI;AAAA,UAExB,MAAM,UAAU,MAAM,cAAc,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,KAAK;AAAA,gBACL,SAAS,EAAE,cAAc,QAAQ,WAAW,SAAS;AAAA,cACvD;AAAA,YACF;AAAA,UACF,CAAC;AAAA,UAED,QAAO,OAAO,EAAE,aAAa,CAAC;AAAA,UAC9B,QAAO,QAAQ,EAAE,EAAE,cAAc;AAAA,YAC/B,UAAU,aAAa;AAAA,YACvB,MAAM;AAAA,YACN,KAAK;AAAA,YACL,SAAS,EAAE,cAAc,QAAQ,WAAW,SAAS;AAAA,UACvD,CAAC;AAAA,UACD,QAAO,QAAQ,IAAI,MAAM,EAAE,WAAW;AAAA,UACtC,QAAO,KAAK,MAAM,QAAQ,GAAI,WAAW,CAAC,EAAE,uBAAuB,MAAM;AAAA,SAC1E;AAAA,OACF;AAAA,MAED,MAAK,+BAA+B,YAAY;AAAA,QAC9C,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,UAAU,EAAE,QAAQ,EAAE,OAAO,SAAS,EAAE;AAAA,UAE9C,OAAO,UAAU,MAAM,cAAc,QAAQ;AAAA,YAC3C,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,QAAQ,CAAC;AAAA,UACvB,CAAC;AAAA,UACD,QAAQ,OAAO,QAAQ;AAAA,UAEvB,QAAO,QAAQ,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,SAAS,EAAE,CAAC;AAAA,UAC/D,OAAO,YAAY,MAAM,YAAY,QAAQ;AAAA,YAC3C,WAAW;AAAA,YACX,QAAQ;AAAA,UACV,CAAC;AAAA,UACD,QAAO,UAAU,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,SAAS,EAAE,CAAC;AAAA,SAClE;AAAA,OACF;AAAA,MAED,MAAK,yCAAyC,YAAY;AAAA,QACxD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,UAAU,MAAM,cAAc,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC;AAAA,UACZ,CAAC;AAAA,UAED,QAAO,OAAO,EAAE,QAAQ,CAAC,CAAC;AAAA,SAC3B;AAAA,OACF;AAAA,MAED,MAAK,yCAAyC,YAAY;AAAA,QACxD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,QACJ,cAAc,QAAQ;AAAA,YACpB,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,KAAK,EAAE,CAAC;AAAA,UACrC,CAAC,CACH,EAAE,QAAQ,eAAe,WAAW;AAAA,UAEpC,MAAM,QACJ,cAAc,QAAQ;AAAA,YACpB,WAAW;AAAA,YACX,QAAQ,EAAE,IAAI,KAAK;AAAA,YACnB,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,KAAK,EAAE,CAAC;AAAA,UACrC,CAAC,CACH,EAAE,QAAQ,eAAe,WAAW;AAAA,SACrC;AAAA,OACF;AAAA,MAED,MAAK,6CAA6C,YAAY;AAAA,QAC5D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,QACJ,cAAc,QAAQ;AAAA,YACpB,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP;AAAA,gBACE,SAAS;AAAA,kBACP,YAAY,IAAI,KAAK,0BAA0B;AAAA,gBACjD;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAC,CACH,EAAE,QAAQ,eAAe,WAAW;AAAA,UAEpC,MAAM,QACJ,cAAc,QAAQ;AAAA,YACpB,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,OAAO,IAAI,EAA0B,CAAC;AAAA,UACtE,CAAC,CACH,EAAE,QAAQ,eAAe,WAAW;AAAA,SACrC;AAAA,OACF;AAAA,MAED,MAAK,2DAA2D,YAAY;AAAA,QAC1E,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,QACJ,OAAO,OAAO;AAAA,YACZ,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS,CAAC,EAAE,SAAS,MAAM,CAAC;AAAA,UAC9B,CAAC,CACH,EAAE,QAAQ,eAAe,WAAW;AAAA,SACrC;AAAA,OACF;AAAA,KACF;AAAA,IAED,UAAS,QAAQ,MAAM;AAAA,MACrB,MAAK,2CAA2C,YAAY;AAAA,QAC1D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,SAAS,MAAM,cAAc,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,MAAM,OAAO,SAAS,EAAE,OAAO,EAAE,EAAE;AAAA,cACrC,EAAE,MAAM,OAAO,SAAS,EAAE,OAAO,EAAE,EAAE;AAAA,cACrC,EAAE,MAAM,SAAS,SAAS,EAAE,OAAO,EAAE,EAAE;AAAA,YACzC;AAAA,UACF,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,YAAY,QAAQ;AAAA,YACxC,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,aAAa,OAAO;AAAA,UACtB,CAAC;AAAA,UAED,QAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,IAAI,CAAC,EAAE,QAAQ,CAAC,OAAO,OAAO,CAAC;AAAA,SACtE;AAAA,OACF;AAAA,MAED,MAAK,uDAAuD,YAAY;AAAA,QACtE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,MAAM,eAAe,SAAS,EAAE,IAAI,SAAS,EAAE;AAAA,cACjD,EAAE,MAAM,sBAAsB,SAAS,EAAE,IAAI,SAAS,EAAE;AAAA,cACxD,EAAE,MAAM,eAAe,SAAS,EAAE,IAAI,SAAS,EAAE;AAAA,YACnD;AAAA,UACF,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,YAAY,QAAQ;AAAA,YACxC,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,OAAO,CAAC,aAAa;AAAA,YACrB,OAAO;AAAA,UACT,CAAC;AAAA,UAED,QAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC,EAAE,QAAQ;AAAA,YACtD,EAAE,IAAI,SAAS;AAAA,YACf,EAAE,IAAI,SAAS;AAAA,UACjB,CAAC;AAAA,SACF;AAAA,OACF;AAAA,MAED,MAAK,mEAAmE,YAAY;AAAA,QAClF,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,MAAM,eAAe,SAAS,EAAE,IAAI,SAAS,EAAE,CAAC;AAAA,UAC9D,CAAC;AAAA,UAED,QACE,MAAM,OAAO,KAAK;AAAA,YAChB,WAAW;AAAA,YACX,UAAU;AAAA,UACZ,CAAC,CACH,EAAE,QAAQ,EAAE,SAAS,CAAC,GAAG,QAAQ,WAAW,SAAS,MAAM,CAAC;AAAA,UAC5D,QACE,MAAM,YAAY,QAAQ,EAAE,WAAW,aAAa,QAAQ,cAAc,OAAO,EAAE,CAAC,CACtF,EAAE,QAAQ,CAAC,CAAC;AAAA,UACZ,QACE,MAAM,YAAY,QAAQ,EAAE,WAAW,aAAa,QAAQ,cAAc,OAAO,GAAG,CAAC,CACvF,EAAE,QAAQ,CAAC,CAAC;AAAA,SACb;AAAA,OACF;AAAA,MAED,MAAK,iCAAiC,YAAY;AAAA,QAChD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ,EAAE,IAAI,WAAW;AAAA,YACzB,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,IAAI,EAAE,CAAC;AAAA,UACvC,CAAC;AAAA,UACD,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ,EAAE,IAAI,WAAW;AAAA,YACzB,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,IAAI,EAAE,CAAC;AAAA,UACvC,CAAC;AAAA,UACD,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ,EAAE,IAAI,WAAW;AAAA,YACzB,SAAS,CAAC,EAAE,SAAS,EAAE,OAAO,IAAI,EAAE,CAAC;AAAA,UACvC,CAAC;AAAA,UAED,QACE,MAAM,SACJ,YAAY,QAAQ,EAAE,WAAW,aAAa,QAAQ,EAAE,IAAI,WAAW,EAAE,CAAC,CAC5E,CACF,EAAE,QAAQ,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;AAAA,UAC1B,QACE,MAAM,SACJ,YAAY,QAAQ,EAAE,WAAW,aAAa,QAAQ,EAAE,IAAI,WAAW,EAAE,CAAC,CAC5E,CACF,EAAE,QAAQ,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;AAAA,UAC1B,QACE,MAAM,SACJ,YAAY,QAAQ,EAAE,WAAW,aAAa,QAAQ,EAAE,IAAI,WAAW,EAAE,CAAC,CAC5E,CACF,EAAE,QAAQ,CAAC,EAAE,OAAO,IAAI,CAAC,CAAC;AAAA,SAC3B;AAAA,OACF;AAAA,MAED,MAAK,0DAA0D,YAAY;AAAA,QACzE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,WAAW,MAAM,cAAc,QAAQ;AAAA,YAC3C,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,MAAM,OAAO,SAAS,EAAE;AAAA,cAC1B,EAAE,MAAM,OAAO,SAAS,EAAE;AAAA,YAC5B;AAAA,UACF,CAAC;AAAA,UAED,MAAM,OAAO,MAAM,OAAO,KAAK;AAAA,YAC7B,WAAW;AAAA,YACX,UAAU,aAAa;AAAA,YACvB,OAAO,CAAC,SAAS;AAAA,YACjB,OAAO;AAAA,UACT,CAAC;AAAA,UAED,QAAO,KAAK,OAAO,EAAE,QAAQ,CAAC,CAAC;AAAA,UAC/B,QAAO,KAAK,MAAM,EAAE,KAAK,SAAS,GAAG,EAAE,GAAG,MAAM;AAAA,UAChD,QAAO,KAAK,OAAO,EAAE,KAAK,KAAK;AAAA,SAChC;AAAA,OACF;AAAA,MAED,MAAK,wDAAwD,YAAY;AAAA,QACvE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,KAAK,UAAU,SAAS,KAAK;AAAA,cAC/B,EAAE,KAAK,UAAU,SAAS,IAAI;AAAA,cAC9B,EAAE,KAAK,UAAU,SAAS,KAAK;AAAA,YACjC;AAAA,UACF,CAAC;AAAA,UAED,MAAM,OAAO,MAAM,OAAO,KAAK;AAAA,YAC7B,WAAW;AAAA,YACX,UAAU,aAAa;AAAA,YACvB,MAAM,CAAC,QAAQ;AAAA,YACf,OAAO;AAAA,UACT,CAAC;AAAA,UACD,QAAO,KAAK,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,IAAI,CAAC;AAAA,SAC1E;AAAA,OACF;AAAA,MAED,MAAK,iEAAiE,YAAY;AAAA,QAChF,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,KAAK,UAAU,SAAS,QAAQ;AAAA,cAClC,EAAE,KAAK,SAAS,SAAS,eAAe;AAAA,cACxC,EAAE,KAAK,SAAS,SAAS,eAAe;AAAA,YAC1C;AAAA,UACF,CAAC;AAAA,UAED,MAAM,OAAO,MAAM,OAAO,KAAK;AAAA,YAC7B,WAAW;AAAA,YACX,UAAU,aAAa;AAAA,YACvB,MAAM,CAAC,QAAQ;AAAA,YACf,OAAO;AAAA,UACT,CAAC;AAAA,UACD,QAAO,KAAK,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;AAAA,UACtE,QAAO,KAAK,OAAO,EAAE,KAAK,KAAK;AAAA,SAChC;AAAA,OACF;AAAA,MAED,MAAK,kEAAkE,YAAY;AAAA,QACjF,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,KAAK,SAAS,SAAS,eAAe;AAAA,cACxC,EAAE,KAAK,SAAS,SAAS,eAAe;AAAA,cACxC,EAAE,KAAK,UAAU,SAAS,QAAQ;AAAA,YACpC;AAAA,UACF,CAAC;AAAA,UAED,MAAM,OAAO,MAAM,OAAO,KAAK;AAAA,YAC7B,WAAW;AAAA,YACX,UAAU,aAAa;AAAA,YACvB,MAAM,CAAC,QAAQ;AAAA,YACf,OAAO;AAAA,UACT,CAAC;AAAA,UACD,QAAO,KAAK,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC;AAAA,UACtE,QAAO,KAAK,OAAO,EAAE,KAAK,KAAK;AAAA,SAChC;AAAA,OACF;AAAA,MAED,MAAK,2DAA2D,YAAY;AAAA,QAC1E,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,QAAQ,EAAE;AAAA,UACzD,CAAC;AAAA,UAED,MAAM,SAAS,MAAM,OAAO,KAAK;AAAA,YAC/B,WAAW;AAAA,YACX,UAAU,aAAa;AAAA,YACvB,OAAO;AAAA,UACT,CAAC;AAAA,UACD,QAAO,OAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;AAAA,UACrE,QAAO,OAAO,OAAO,EAAE,KAAK,IAAI;AAAA,UAEhC,MAAM,QAAQ,MAAM,OAAO,KAAK;AAAA,YAC9B,WAAW;AAAA,YACX,UAAU,aAAa;AAAA,YACvB,cAAc,OAAO;AAAA,YACrB,OAAO;AAAA,UACT,CAAC;AAAA,UACD,QAAO,MAAM,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC;AAAA,UACpE,QAAO,MAAM,OAAO,EAAE,KAAK,IAAI;AAAA,SAChC;AAAA,OACF;AAAA,KACF;AAAA,IAED,UAAS,gBAAgB,MAAM;AAAA,MAC7B,MAAK,mDAAmD,YAAY;AAAA,QAClE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,QACE,MAAM,OAAO,aAAa,EAAE,WAAW,aAAa,UAAU,UAAU,CAAC,CAC3E,EAAE,cAAc;AAAA,UAEhB,MAAM,OAAO,aAAa,EAAE,WAAW,aAAa,QAAQ,aAAa,CAAC;AAAA,UAC1E,QACE,MAAM,OAAO,aAAa,EAAE,WAAW,aAAa,UAAU,aAAa,GAAG,CAAC,CACjF,EAAE,cAAc;AAAA,SACjB;AAAA,OACF;AAAA,MAED,MAAK,6CAA6C,YAAY;AAAA,QAC5D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,UAAU,MAAM,cAAc,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,SAAS,MAAM,GAAG,EAAE,SAAS,MAAM,GAAG,EAAE,SAAS,QAAQ,CAAC;AAAA,UACxE,CAAC;AAAA,UAED,QACE,MAAM,OAAO,aAAa,EAAE,WAAW,aAAa,UAAU,eAAe,GAAG,CAAC,CACnF,EAAE,KAAK,QAAQ,GAAG,EAAE,GAAG,MAAM;AAAA,SAC9B;AAAA,OACF;AAAA,KACF;AAAA,IAED,UAAS,aAAa,MAAM;AAAA,MAC1B,MAAK,qDAAqD,YAAY;AAAA,QACpE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,QACJ,OAAO,UAAU,EAAE,WAAW,aAAa,UAAU,UAAU,GAAG,MAAM,EAAE,CAC5E,EAAE,QAAQ,eAAe,WAAW;AAAA,SACrC;AAAA,OACF;AAAA,MAED,MAAK,oDAAoD,YAAY;AAAA,QACnE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,MAAM,UAAU,SAAS,EAAE,OAAO,SAAS,EAAE,CAAC;AAAA,UAC5D,CAAC;AAAA,UAED,MAAM,WAAqB,CAAC;AAAA,UAC5B,MAAM,iBACJ,QACA,EAAE,WAAW,aAAa,QAAQ,aAAa,GAC/C,CAAC,YAAY;AAAA,YACX,SAAS,KAAK,GAAG,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,OAAO,CAAC,CAAC;AAAA,WAEpE;AAAA,UACA,IAAI,sBAAsB,GAAG;AAAA,YAC3B,MAAM,IAAI,MAAM,mBAAmB;AAAA,UACrC;AAAA,UAEA,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,MAAM,SAAS,SAAS,QAAQ,CAAC;AAAA,UAC/C,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,SAAS,WAAW,GAAG;AAAA,YAC3C,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,SAAS;AAAA,UACX,CAAC;AAAA,UACD,QAAO,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC;AAAA,SACnC;AAAA,OACF;AAAA,MAED,MAAK,+CAA+C,YAAY;AAAA,QAC9D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,MAAM,OAAO,SAAS,MAAM;AAAA,cAC9B,EAAE,MAAM,OAAO,SAAS,MAAM;AAAA,YAChC;AAAA,UACF,CAAC;AAAA,UAED,MAAM,WAAqB,CAAC;AAAA,UAC5B,MAAM,iBACJ,QACA,EAAE,WAAW,aAAa,QAAQ,cAAc,MAAM,WAAW,GACjE,CAAC,YAAY;AAAA,YACX,SAAS,KAAK,GAAG,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,OAAO,CAAC,CAAC;AAAA,WAEpE;AAAA,UACA,IAAI,sBAAsB,GAAG;AAAA,YAC3B,MAAM,IAAI,MAAM,mBAAmB;AAAA,UACrC;AAAA,UAEA,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,MAAM,SAAS,SAAS,QAAQ,CAAC;AAAA,UAC/C,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,SAAS,WAAW,GAAG;AAAA,YAC3C,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,SAAS;AAAA,UACX,CAAC;AAAA,UACD,QAAO,QAAQ,EAAE,QAAQ,CAAC,OAAO,OAAO,OAAO,CAAC;AAAA,SACjD;AAAA,OACF;AAAA,MAED,MAAK,2DAA2D,YAAY;AAAA,QAC1E,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,SAAS,MAAM,cAAc,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,MAAM,eAAe,KAAK,SAAS,SAAS,MAAM;AAAA,cACpD,EAAE,MAAM,sBAAsB,KAAK,UAAU,SAAS,MAAM;AAAA,cAC5D,EAAE,MAAM,eAAe,KAAK,UAAU,SAAS,QAAQ;AAAA,YACzD;AAAA,UACF,CAAC;AAAA,UAED,MAAM,WAAqB,CAAC;AAAA,UAC5B,MAAM,iBACJ,QACA;AAAA,YACE,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,aAAa,OAAO;AAAA,YACpB,OAAO,CAAC,aAAa;AAAA,YACrB,MAAM,CAAC,QAAQ;AAAA,UACjB,GACA,CAAC,YAAY;AAAA,YACX,SAAS,KAAK,GAAG,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,OAAO,CAAC,CAAC;AAAA,WAEpE;AAAA,UAEA,MAAM,UAAU,MAAM,SAAS,WAAW,GAAG;AAAA,YAC3C,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,SAAS;AAAA,UACX,CAAC;AAAA,UACD,QAAO,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC;AAAA,SACnC;AAAA,OACF;AAAA,MAED,MAAK,8BAA8B,YAAY;AAAA,QAC7C,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,WAAqB,CAAC;AAAA,UAC5B,MAAM,cAAc,MAAM,iBACxB,QACA,EAAE,WAAW,aAAa,QAAQ,aAAa,GAC/C,CAAC,YAAY;AAAA,YACX,SAAS,KAAK,GAAG,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,OAAO,CAAC,CAAC;AAAA,WAEpE;AAAA,UACA,IAAI,sBAAsB,GAAG;AAAA,YAC3B,MAAM,IAAI,MAAM,mBAAmB;AAAA,UACrC;AAAA,UAEA,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,SAAS,MAAM,CAAC;AAAA,UAC9B,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,SAAS,WAAW,GAAG;AAAA,YAC3C,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,SAAS;AAAA,UACX,CAAC;AAAA,UAED,YAAY;AAAA,UACZ,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,SAAS,MAAM,CAAC;AAAA,UAC9B,CAAC;AAAA,UACD,MAAM,IAAI,MAAM,KAAK,IAAI,KAAK,6BAA6B,CAAC;AAAA,UAE5D,QAAO,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC;AAAA,SACjC;AAAA,OACF;AAAA,MAED,MAAK,2BAA2B,YAAY;AAAA,QAC1C,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,WAAqB,CAAC;AAAA,UAC5B,MAAM,iBAAiB,QAAQ,EAAE,WAAW,aAAa,QAAQ,aAAa,GAAG,MAAM;AAAA,YACrF,MAAM,IAAI,MAAM,mBAAmB;AAAA,WACpC;AAAA,UACD,MAAM,iBACJ,QACA,EAAE,WAAW,aAAa,QAAQ,aAAa,GAC/C,CAAC,YAAY;AAAA,YACX,SAAS,KAAK,GAAG,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,OAAO,CAAC,CAAC;AAAA,WAEpE;AAAA,UACA,IAAI,sBAAsB,GAAG;AAAA,YAC3B,MAAM,IAAI,MAAM,mBAAmB;AAAA,UACrC;AAAA,UAEA,MAAM,QACJ,cAAc,QAAQ;AAAA,YACpB,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,SAAS,MAAM,CAAC;AAAA,UAC9B,CAAC,CACH,EAAE,SAAS,aAAa,CAAC;AAAA,UACzB,MAAM,UAAU,MAAM,SAAS,WAAW,GAAG;AAAA,YAC3C,WAAW;AAAA,YACX,YAAY;AAAA,YACZ,SAAS;AAAA,UACX,CAAC;AAAA,UACD,QAAO,QAAQ,EAAE,QAAQ,CAAC,KAAK,CAAC;AAAA,SACjC;AAAA,OACF;AAAA,KACF;AAAA,IAED,UAAS,aAAa,MAAM;AAAA,MAC1B,MAAK,oCAAoC,YAAY;AAAA,QACnD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,SAAS,EAAE,IAAI,mBAAmB,WAAW,EAAE,UAAU,KAAM,EAAE;AAAA,UACvE,MAAM,OAAO,aAAa,EAAE,WAAW,aAAa,OAAO,CAAC;AAAA,UAE5D,MAAM,OAAO,OAAO;AAAA,YAClB,WAAW;AAAA,YACX,UAAU,OAAO;AAAA,YACjB,SAAS,CAAC,OAAO,OAAO,OAAO,EAAE,IAAI,CAAC,YAAW;AAAA,cAC/C,MAAM;AAAA,cACN,SAAS,EAAE,eAAO,MAAM,IAAI,OAAO,GAAG,EAAE;AAAA,YAC1C,EAAE;AAAA,UACJ,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,OAAO,KAAK;AAAA,YAChC,WAAW;AAAA,YACX,UAAU,OAAO;AAAA,UACnB,CAAC;AAAA,UACD,QAAO,QAAQ,QAAQ,MAAM,EAAE,gBAAgB,CAAC;AAAA,UAChD,QAAO,QAAQ,QAAQ,MAAM,EAAE,aAAa,CAAC;AAAA,UAC7C,QAAO,QAAQ,QAAQ,GAAG,EAAE,GAAG,IAAI,EAAE,KAAK,OAAO;AAAA,SAClD;AAAA,OACF;AAAA,MAED,MAAK,sCAAsC,YAAY;AAAA,QACrD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS,CAAC,EAAE,SAAS,MAAM,GAAG,EAAE,SAAS,MAAM,GAAG,EAAE,SAAS,QAAQ,CAAC;AAAA,UACxE,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,YAAY,QAAQ;AAAA,YACxC,WAAW;AAAA,YACX,QAAQ;AAAA,UACV,CAAC;AAAA,UAED,QAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,OAAO,OAAO,CAAC;AAAA,SACzE;AAAA,OACF;AAAA,MAED,MAAK,uEAAuE,YAAY;AAAA,QACtF,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,SAAS,MAAM,cAAc,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,SAAS;AAAA,cACP,EAAE,SAAS,MAAM;AAAA,cACjB,EAAE,SAAS,MAAM;AAAA,cACjB,EAAE,SAAS,QAAQ;AAAA,cACnB,EAAE,SAAS,OAAO;AAAA,YACpB;AAAA,UACF,CAAC;AAAA,UAED,MAAM,QACJ,YAAY,QAAQ;AAAA,YAClB,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,aAAa,OAAO;AAAA,UACtB,CAAC,CACH,EAAE,QAAQ,eAAe,WAAW;AAAA,UAEpC,MAAM,QACJ,OAAO,KAAK;AAAA,YACV,WAAW;AAAA,YACX,UAAU,eAAe;AAAA,YACzB,cAAc,OAAO;AAAA,UACvB,CAAC,CACH,EAAE,QAAQ,eAAe,WAAW;AAAA,SACrC;AAAA,OACF;AAAA,MAED,MAAK,wCAAwC,YAAY;AAAA,QACvD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,SAAS,EAAE,IAAI,kBAAkB,WAAW,EAAE,SAAS,EAAE;AAAA,UAC/D,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX;AAAA,YACA,SAAS,CAAC,EAAE,SAAS,MAAM,CAAC;AAAA,UAC9B,CAAC;AAAA,UAED,MAAM,IAAI,MAAM,YAAY;AAAA,UAE5B,MAAM,cAAc,QAAQ;AAAA,YAC1B,WAAW;AAAA,YACX;AAAA,YACA,SAAS,CAAC,EAAE,SAAS,MAAM,CAAC;AAAA,UAC9B,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,YAAY,QAAQ,EAAE,WAAW,aAAa,OAAO,CAAC;AAAA,UAE5E,QAAO,QAAQ,IAAI,CAAC,WAAW,OAAO,OAAO,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC;AAAA,SAChE;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAAA;AAGH,eAAe,QAAQ,CAAC,SAAwE;AAAA,EAC9F,QAAQ,MAAM,SAAS,IAAI,CAAC,WAAW,OAAO,OAAO;AAAA;AAGvD,eAAe,aAAa,CAC1B,QACA,QAKkC;AAAA,EAClC,MAAM,OAAO,aAAa,EAAE,WAAW,OAAO,WAAW,QAAQ,OAAO,OAAO,CAAC;AAAA,EAChF,OAAO,OAAO,OAAO;AAAA,IACnB,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO,OAAO;AAAA,IACxB,SAAS,OAAO;AAAA,EAClB,CAAC;AAAA;AAGH,eAAe,WAAW,CACxB,QACA,QAQkC;AAAA,EAClC,MAAM,OAAO,aAAa,EAAE,WAAW,OAAO,WAAW,QAAQ,OAAO,OAAO,CAAC;AAAA,EAChF,QACE,MAAM,OAAO,KAAK;AAAA,IAChB,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO,OAAO;AAAA,IACxB,aAAa,OAAO;AAAA,IACpB,OAAO,OAAO;AAAA,IACd,OAAO,OAAO;AAAA,IACd,MAAM,OAAO;AAAA,EACf,CAAC,GACD;AAAA;AAGJ,eAAe,gBAAgB,CAC7B,QACA,QAQA,SACqB;AAAA,EACrB,MAAM,OAAO,aAAa,EAAE,WAAW,OAAO,WAAW,QAAQ,OAAO,OAAO,CAAC;AAAA,EAChF,OAAO,OAAO,UACZ;AAAA,IACE,WAAW,OAAO;AAAA,IAClB,UAAU,OAAO,OAAO;AAAA,IACxB,MAAM,OAAO;AAAA,IACb,aAAa,OAAO;AAAA,IACpB,OAAO,OAAO;AAAA,IACd,MAAM,OAAO;AAAA,EACf,GACA,OACF;AAAA;AAGF,eAAe,SAAS,CACtB,WACA,SACe;AAAA,EACf,MAAM,WAAW,KAAK,IAAI,IAAI,QAAQ;AAAA,EACtC,OAAO,KAAK,IAAI,IAAI,UAAU;AAAA,IAC5B,IAAI,UAAU,GAAG;AAAA,MACf;AAAA,IACF;AAAA,IACA,MAAM,IAAI,MAAM,QAAQ,UAAU;AAAA,EACpC;AAAA,EACA,MAAM,IAAI,MAAM,GAAG,QAAQ,kBAAkB,QAAQ,aAAa;AAAA;;ACjzBpE,qBAAS,qBAAU,iBAAQ;;;AC6CpB,SAAS,6BAA6B,CAAC,OAKlB;AAAA,EAC1B,MAAM,cAAc,IAAI,mBAAmB;AAAA,IACzC,aAAa,CAAC;AAAA,IACd,UAAU,MAAM;AAAA,IAChB,cAAc,IAAI;AAAA,EACpB,CAAC;AAAA,EACD,MAAM,eAAe,2BAA2B;AAAA,IAC9C,WAAW,MAAM;AAAA,IACjB,UAAU,MAAM;AAAA,IAChB;AAAA,IACA,SAAS,MAAM;AAAA,IACf,cAAc,MAAM;AAAA,EACtB,CAAC;AAAA,EACD,IAAI,iBAAiB;AAAA,EAErB,SAAS,aAAa,CAAC,MAAoC;AAAA,IACzD,kBAAkB;AAAA,IAClB,OAAO,wBAAwB,QAAQ;AAAA;AAAA,EAGzC,eAAe,MAAM,CAAC,YAAyE;AAAA,IAC7F,OAAO,aAAa,MAAM,OAAO;AAAA,MAC/B,MAAM;AAAA,MACN,QAAQ,EAAE,MAAM,WAAW,WAAW,cAAc,MAAM,EAAE;AAAA,MAC5D;AAAA,MACA,iBAAiB,CAAC;AAAA,MAClB,eAAe,CAAC;AAAA,MAChB,oBAAoB,CAAC;AAAA,IACvB,CAAC;AAAA;AAAA,EAGH,eAAe,eAAe,CAC5B,QACgC;AAAA,IAChC,OAAO,aAAa,UAAU,OAAO;AAAA,MACnC,QAAQ,EAAE,MAAM,WAAW,WAAW,cAAc,WAAW,EAAE;AAAA,MACjE;AAAA,IACF,CAAC;AAAA;AAAA,EAGH,OAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,SACM,KAAI,CAAC,MAAM;AAAA,MACf,MAAM,aAAsC,CAAC;AAAA,MAC7C,WAAW,UAAU,KAAK,WAAW,CAAC,GAAG;AAAA,QACvC,WAAW,KAAK;AAAA,UACd,IAAI,eAAe,WAAW;AAAA,UAC9B,MAAM;AAAA,UACN,KAAK,OAAO;AAAA,UACZ,YAAY,OAAO;AAAA,QACrB,CAAC;AAAA,MACH;AAAA,MACA,WAAW,SAAQ,KAAK,SAAS,CAAC,GAAG;AAAA,QACnC,WAAW,KAAK;AAAA,UACd,IAAI,aAAa,WAAW;AAAA,UAC5B,MAAM;AAAA,UACN,KAAK,MAAK;AAAA,aACN,MAAK,eAAe,YAAY,CAAC,IAAI,EAAE,YAAY,MAAK,WAAW;AAAA,QACzE,CAAC;AAAA,MACH;AAAA,MACA,IAAI,WAAW,SAAS;AAAA,QAAG,MAAM,OAAO,UAAU;AAAA,MAClD,IAAI,KAAK,aAAa,KAAK,UAAU,SAAS,GAAG;AAAA,QAC/C,MAAM,gBAAgB,KAAK,SAAS;AAAA,MACtC;AAAA;AAAA,EAEJ;AAAA;;;AD3GF,IAAM,aAAY;AAClB,IAAM,SAAS,iBAAiB;AAAA,EAC9B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,IACV,KAAK,MAAM,UAAU,EAAE,SAAS,MAAM,UAAU,KAAK,CAAC;AAAA,IACtD,KAAK,QAAQ,UAAU,EAAE,UAAU,KAAK,CAAC;AAAA,IACzC,KAAK,eAAe,UAAU,EAAE,MAAM,YAAY,CAAC;AAAA,EACrD;AAAA,EACA,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,aAAa,OAAO,CAAC,CAAC;AACrD,CAAC;AACD,IAAM,WAAW,IAAI,iBAAiB,EAAE,SAAS,CAAC,MAAM,EAAE,CAAC;AAEpD,SAAS,gCAA0D,CACxE,MACA,UACM;AAAA,EACN,MAAM,cAAc,OAAO,SAA8D;AAAA,IACvF,MAAM,UAAU,MAAM,SAAS,cAAc;AAAA,IAC7C,IAAI;AAAA,MACF,MAAM,mBAAmB,OAAO;AAAA,MAChC,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,SAAS,UAAU,OAAO;AAAA;AAAA;AAAA,EAIpC,UAAS,MAAM,MAAM;AAAA,IACnB,MAAK,oCAAoC,YAAY;AAAA,MACnD,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAS,MAAM,QAAQ,QAAQ,eAAe;AAAA,UAClD;AAAA,UACA,cAAc,OAAO;AAAA,UACrB,WAAW;AAAA,QACb,CAAC;AAAA,QACD,QAAO,MAAM,EAAE,cAAc;AAAA,UAC3B,YAAY,EAAE,IAAI,KAAK,MAAM,SAAS,aAAa,GAAG;AAAA,UACtD,SAAS;AAAA,QACX,CAAC;AAAA,QACD,QAAO,OAAO,QAAQ,YAAY,EAAE,KAAK,QAAQ;AAAA,QAEjD,MAAM,QAAQ,MAAM,QAAQ,QAAQ,oBAAoB;AAAA,UACtD;AAAA,UACA,OAAO;AAAA,YACL,EAAE,cAAc,OAAO,IAAI,WAAW,IAAI;AAAA,YAC1C,EAAE,cAAc,OAAO,IAAI,WAAW,UAAU;AAAA,UAClD;AAAA,QACF,CAAC;AAAA,QACD,QAAO,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,OAAO,MAAM,CAAC;AAAA,OACrD;AAAA,KACF;AAAA,IAED,MAAK,kCAAkC,YAAY;AAAA,MACjD,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,MAAM,QAAQ,QAAQ,UAAU;AAAA,UAC/C;AAAA,UACA,cAAc,OAAO;AAAA,UACrB,UAAU;AAAA,QACZ,CAAC;AAAA,QACD,QAAO,SAAS,IAAI,CAAC,QAAQ,IAAI,QAAQ,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC;AAAA,QACrE,QAAO,SAAS,MAAM,CAAC,QAAQ,IAAI,aAAa,SAAS,CAAC,CAAC,EAAE,KAAK,IAAI;AAAA,QAEtE,MAAM,WAAW,MAAM,QAAQ,QAAQ,uBAAuB;AAAA,UAC5D;AAAA,UACA,OAAO,CAAC,EAAE,cAAc,OAAO,IAAI,UAAU,IAAI,CAAC;AAAA,QACpD,CAAC;AAAA,QACD,QAAO,QAAQ,EAAE,aAAa,CAAC;AAAA,QAC/B,QAAO,SAAS,EAAE,EAAE,cAAc,EAAE,UAAU,KAAK,UAAU,IAAI,CAAC;AAAA,QAElE,MAAM,eAAe,MAAM,QAAQ,QAAQ,eAAe;AAAA,UACxD;AAAA,UACA,OAAO,CAAC,EAAE,cAAc,OAAO,IAAI,UAAU,KAAK,QAAQ,QAAQ,CAAC;AAAA,QACrE,CAAC;AAAA,QACD,QAAO,aAAa,IAAI,GAAG,OAAO,YAAY,CAAC,EAAE,aAAa,CAAC;AAAA,OAChE;AAAA,KACF;AAAA,IAED,MAAK,yDAAyD,YAAY;AAAA,MACxE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,YAAY,MAAM,QAAQ,QAAQ,oBAAoB;AAAA,UAC1D;AAAA,UACA,cAAc,OAAO;AAAA,UACrB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,QAAO,UAAU,QAAQ,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,CAAC;AAAA,QACxE,QAAO,UAAU,aAAa,EAAE,KAAK,GAAG;AAAA,QACxC,MAAM,aAAa,MAAM,QAAQ,QAAQ,oBAAoB;AAAA,UAC3D;AAAA,UACA,cAAc,OAAO;AAAA,UACrB,gBAAgB,UAAU;AAAA,UAC1B,OAAO;AAAA,QACT,CAAC;AAAA,QACD,QAAO,WAAW,QAAQ,IAAI,CAAC,QAAQ,IAAI,SAAS,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC;AAAA,OACrE;AAAA,KACF;AAAA,IAED,MAAK,sCAAsC,YAAY;AAAA,MACrD,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,aAAa,MAAM,QAAQ,WAAW,WAAW;AAAA,UACrD;AAAA,UACA,cAAc,OAAO;AAAA,UACrB,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,MAAM,IAAI,KAAK,0BAA0B;AAAA,UACzC,OAAO;AAAA,QACT,CAAC;AAAA,QACD,QAAO,WAAW,IAAI,CAAC,UAAU,MAAM,KAAK,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;AAAA,QAC3D,QAAO,OAAO,WAAW,IAAI,YAAY,EAAE,KAAK,QAAQ;AAAA,QAExD,MAAM,YAAY,MAAM,QAAQ,WAAW,gBAAgB;AAAA,UACzD;AAAA,UACA,QAAQ;AAAA,YACN,EAAE,cAAc,OAAO,IAAI,UAAU,KAAK,YAAY,cAAc;AAAA,YACpE,EAAE,cAAc,OAAO,IAAI,UAAU,KAAK,YAAY,cAAc;AAAA,UACtE;AAAA,UACA,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,QAAO,UAAU,IAAI,CAAC,WAAW,OAAO,OAAO,IAAI,KAAK,CAAC,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;AAAA,QAE3E,MAAM,SAAS,MAAM,QAAQ,WAAW,UAAU;AAAA,UAChD;AAAA,UACA,cAAc,OAAO;AAAA,UACrB,UAAU;AAAA,UACV,YAAY;AAAA,QACd,CAAC;AAAA,QACD,QAAO,MAAM,EAAE,cAAc,EAAE,OAAO,IAAI,IAAI,IAAI,KAAK,0BAA0B,EAAE,CAAC;AAAA,OACrF;AAAA,KACF;AAAA,GACF;AAAA;AAGH,eAAe,kBAAkB,CAAC,SAAiC;AAAA,EACjE,MAAM,UAAU,8BAA8B,EAAE,uBAAW,UAAU,QAAQ,CAAC;AAAA,EAC9E,MAAM,QAAQ,KAAK;AAAA,IACjB,SAAS,CAAC,OAAO,KAAK,OAAO,GAAG,OAAO,KAAK,MAAM,GAAG,OAAO,KAAK,OAAO,CAAC;AAAA,IACzE,OAAO,CAAC,KAAK,KAAK,GAAG,GAAG,KAAK,KAAK,GAAG,CAAC;AAAA,IACtC,WAAW;AAAA,MACT,YAAY,KAAK,IAAI,0BAA0B;AAAA,MAC/C,YAAY,KAAK,IAAI,0BAA0B;AAAA,MAC/C,YAAY,KAAK,IAAI,0BAA0B;AAAA,IACjD;AAAA,EACF,CAAC;AAAA;AAGH,SAAS,MAAM,CAAC,WAAmB,MAAc;AAAA,EAC/C,OAAO;AAAA,IACL,KAAK,EAAE,cAAc,OAAO,IAAI,UAAU;AAAA,IAC1C,YAAY,EAAE,IAAI,WAAW,KAAK;AAAA,EACpC;AAAA;AAGF,SAAS,IAAI,CAAC,UAAkB,UAAkB;AAAA,EAChD,OAAO;AAAA,IACL,KAAK;AAAA,MACH,QAAQ,EAAE,cAAc,OAAO,IAAI,WAAW,SAAS;AAAA,MACvD,QAAQ;AAAA,MACR,QAAQ,EAAE,cAAc,OAAO,IAAI,WAAW,SAAS;AAAA,IACzD;AAAA,EACF;AAAA;AAGF,SAAS,WAAW,CAAC,UAAkB,OAAe,KAAY;AAAA,EAChE,OAAO;AAAA,IACL,QAAQ;AAAA,MACN,QAAQ,EAAE,cAAc,OAAO,IAAI,WAAW,SAAS;AAAA,MACvD,YAAY;AAAA,IACd;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA;;AEpLF,qBAAS,qBAAU,iBAAQ;AA0B3B,IAAM,oBAAoB,cAAc,+BAA+B;AAAA,EACrE,QAAQ,CAAC,IAAI,WAAW,QAAQ,GAAG,IAAI,gBAAgB,QAAQ,CAAC;AAAA,EAChE,aAAa;AACf,CAAC;AAED,IAAM,6BAA6B,cAAc,+BAA+B;AAAA,EAC9E,QAAQ,CAAC,IAAI,gBAAgB,QAAQ,GAAG,IAAI,WAAW,QAAQ,CAAC;AAAA,EAChE,aAAa;AACf,CAAC;AAED,IAAM,eAAe,cAAc,0BAA0B;AAAA,EAC3D,QAAQ,CAAC,IAAI,WAAW,QAAQ,GAAG,IAAI,gBAAgB,QAAQ,CAAC;AAClE,CAAC;AAED,IAAM,uBAAuB,cAAc,mCAAmC;AAAA,EAC5E,QAAQ,CAAC,IAAI,WAAW,QAAQ,GAAG,IAAI,QAAQ,UAAU,EAAE,UAAU,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,IAAM,sBAAsB,cAAc,4BAA4B;AAAA,EACpE,QAAQ,CAAC,IAAI,MAAM,QAAQ,GAAG,IAAI,UAAU,WAAW,EAAE,UAAU,KAAK,CAAC,CAAC;AAC5E,CAAC;AAED,IAAM,iBAAiB,cAAc,4BAA4B;AAAA,EAC/D,QAAQ,CAAC,IAAI,MAAM,QAAQ,GAAG,IAAI,cAAc,WAAW,EAAE,UAAU,KAAK,CAAC,CAAC;AAChF,CAAC;AAED,IAAM,aAAsB;AAAA,EAC1B,QAAQ,QAAQ,IAAI,OAAO,EAAE;AAAA,EAC7B,QAAQ,UAAU,IAAI,OAAO,EAAE;AAAA,EAC/B,WAAW;AAAA,EACX,UAAU;AAAA,EACV,WAAW;AAAA,EACX,aAAa;AACf;AAUO,SAAS,2BAAyD,CACvE,OACA,SACM;AAAA,EACN,MAAM,kBAAkB,QAAQ,mBAAmB;AAAA,EACnD,MAAM,mBAAmB,QAAQ,oBAAoB;AAAA,EAErD,MAAM,cAAc,OAAO,SAA8D;AAAA,IACvF,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,QAAQ,WAAW,OAAO;AAAA;AAAA;AAAA,EAIpC,UAAS,OAAO,MAAM;AAAA,IACpB,UAAS,uBAAuB,MAAM;AAAA,MACpC,MAAK,wDAAwD,YAAY;AAAA,QACvE,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,QAAO,MAAM,QAAQ,WAAW,kBAAkB,EAAE,CAAC,EAAE,SAAS;AAAA,UAEhE,MAAM,UAAU,MAAM,QAAQ,cAAc,iBAAiB;AAAA,UAC7D,MAAM,WAAW,MAAM,QAAQ,cAAc,iBAAiB;AAAA,UAE9D,QAAO,OAAO,EAAE,QAAQ,iBAAiB;AAAA,UACzC,QAAO,QAAQ,EAAE,QAAQ,iBAAiB;AAAA,UAC1C,QAAO,MAAM,QAAQ,WAAW,kBAAkB,EAAE,CAAC,EAAE,QAAQ,iBAAiB;AAAA,UAChF,QAAO,MAAM,QAAQ,WAAW,iBAAiB,CAAC,EAAE,SAAS;AAAA,UAC7D,QAAO,MAAM,QAAQ,aAAa,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC;AAAA,UAChE,QAAO,MAAM,QAAQ,aAAa,kBAAkB,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,SACpE;AAAA,OACF;AAAA,MAED,MAAK,sDAAsD,YAAY;AAAA,QACrE,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,iBAAiB;AAAA,UAC7C,MAAM,QAAQ,mCAAmC,CAAC,0BAA0B,CAAC;AAAA,UAE7E,QAAO,MAAM,QAAQ,WAAW,kBAAkB,EAAE,CAAC,EAAE,QAAQ,iBAAiB;AAAA,UAChF,MAAM,QAAO,QAAQ,cAAc,0BAA0B,CAAC,EAAE,SAAS,QACvE,iBACF;AAAA,UACA,QAAO,MAAM,QAAQ,aAAa,kBAAkB,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,SACpE;AAAA,OACF;AAAA,MAED,MAAK,0CAA0C,YAAY;AAAA,QACzD,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,iBAAiB,cAAc,iCAAiC;AAAA,YACpE,QAAQ,CAAC,IAAI,WAAW,QAAQ,GAAG,IAAI,aAAa,MAAM,CAAC;AAAA,UAC7D,CAAC;AAAA,UACD,MAAM,oBAAoB,cAAc,iCAAiC;AAAA,YACvE,QAAQ,CAAC,IAAI,WAAW,QAAQ,GAAG,IAAI,aAAa,MAAM,CAAC;AAAA,YAC3D,aAAa,CAAC,WAAW;AAAA,YACzB,aAAa;AAAA,UACf,CAAC;AAAA,UAED,MAAM,QAAQ,cAAc,cAAc;AAAA,UAC1C,MAAM,QAAQ,mCAAmC,CAAC,iBAAiB,CAAC;AAAA,UAEpE,QAAO,MAAM,QAAQ,WAAW,eAAe,EAAE,CAAC,EAAE,QAAQ,cAAc;AAAA,UAC1E,MAAM,QAAO,QAAQ,cAAc,iBAAiB,CAAC,EAAE,SAAS,QAAQ,iBAAiB;AAAA,UACzF,QAAO,MAAM,QAAQ,WAAW,eAAe,EAAE,CAAC,EAAE,QAAQ,iBAAiB;AAAA,SAC9E;AAAA,OACF;AAAA,MAED,MAAK,kFAAkF,YAAY;AAAA,QACjG,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,iBAAiB,cAAc,kBAAkB,IAAI;AAAA,YACzD,QAAQ,CAAC,IAAI,WAAW,OAAO,GAAG,IAAI,gBAAgB,QAAQ,CAAC;AAAA,YAC/D,aAAa;AAAA,UACf,CAAC;AAAA,UAED,MAAM,QAAQ,cAAc,iBAAiB;AAAA,UAE7C,MAAM,QACJ,QAAQ,mCAAmC,CAAC,cAAc,CAAC,CAC7D,EAAE,QAAQ,QAAQ,gCAAgC;AAAA,UAClD,MAAM,QAAO,QAAQ,cAAc,cAAc,CAAC,EAAE,QAAQ,eAC1D,gBACF;AAAA,UACA,QAAO,MAAM,QAAQ,WAAW,kBAAkB,EAAE,CAAC,EAAE,QAAQ,iBAAiB;AAAA,SACjF;AAAA,OACF;AAAA,MAED,MAAK,2CAA2C,YAAY;AAAA,QAC1D,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,iBAAiB,cAAc,yCAAyC;AAAA,YAC5E,QAAQ,CAAC,IAAI,aAAa,QAAQ,CAAC;AAAA,UACrC,CAAC;AAAA,UACD,MAAM,mBAAmB,cAAc,yCAAyC;AAAA,YAC9E,QAAQ,CAAC,IAAI,YAAY,UAAU,EAAE,UAAU,KAAK,CAAC,GAAG,IAAI,aAAa,QAAQ,CAAC;AAAA,UACpF,CAAC;AAAA,UACD,MAAM,gBAAgB,cAAc,yCAAyC;AAAA,YAC3E,QAAQ,CAAC,IAAI,aAAa,QAAQ,GAAG,IAAI,YAAY,UAAU,EAAE,UAAU,KAAK,CAAC,CAAC;AAAA,UACpF,CAAC;AAAA,UAED,MAAM,QAAQ,cAAc,cAAc;AAAA,UAE1C,IAAI,oBAAoB,UAAU;AAAA,YAChC,MAAM,QACJ,QAAQ,mCAAmC,CAAC,gBAAgB,CAAC,CAC/D,EAAE,QAAQ,QAAQ,qBAAqB;AAAA,YACvC,MAAM,QAAO,QAAQ,cAAc,gBAAgB,CAAC,EAAE,QAAQ,QAC5D,qBACF;AAAA,YACA,QAAO,MAAM,QAAQ,WAAW,eAAe,EAAE,CAAC,EAAE,QAAQ,cAAc;AAAA,YAC1E;AAAA,UACF;AAAA,UAEA,MAAM,QAAQ,mCAAmC,CAAC,gBAAgB,CAAC;AAAA,UACnE,QAAO,MAAM,QAAQ,WAAW,eAAe,EAAE,CAAC,EAAE,QAAQ,cAAc;AAAA,UAC1E,QAAO,MAAM,QAAQ,aAAa,eAAe,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,UAEhE,MAAM,QAAO,QAAQ,cAAc,gBAAgB,CAAC,EAAE,SAAS,QAAQ,aAAa;AAAA,UACpF,QAAO,MAAM,QAAQ,WAAW,eAAe,EAAE,CAAC,EAAE,QAAQ,aAAa;AAAA,UAEzE,OAAO,iBAAiB,MAAM,QAAQ,aAAa,eAAe,EAAE;AAAA,UACpE,QAAO,aAAa,EAAE,cAAc;AAAA,YAClC,WAAW,eAAe;AAAA,YAC1B,MAAM;AAAA,YACN,QAAQ,cAAc;AAAA,UACxB,CAAC;AAAA,SACF;AAAA,OACF;AAAA,MAED,MAAK,6DAA6D,YAAY;AAAA,QAC5E,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,mCAAmC,CAAC,iBAAiB,CAAC;AAAA,UAEpE,QAAO,MAAM,QAAQ,WAAW,kBAAkB,EAAE,CAAC,EAAE,SAAS;AAAA,UAChE,QAAO,MAAM,QAAQ,aAAa,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,SAChD;AAAA,OACF;AAAA,KACF;AAAA,IAED,UAAS,iBAAiB,MAAM;AAAA,MAC9B,MAAK,mEAAmE,YAAY;AAAA,QAClF,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,YAAY;AAAA,UACxC,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAc,MAAM,WAAW,CAAC;AAAA,UAClF,MAAM,MAAM,UAAU;AAAA,YACpB,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,YACxC,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,UAC5C,CAAC;AAAA,UACD,MAAM,SAAS,MAAM,MAAM,OAAO;AAAA,UAClC,QAAO,OAAO,OAAO,EAAE,KAAK,SAAS;AAAA,UACrC,MAAM,UAAU;AAAA,UAEhB,MAAM,QAAQ,cAAc,iBAAiB;AAAA,UAE7C,MAAM,QAAQ,MAAM,QAAQ,wBAAwB;AAAA,YAClD,aAAa;AAAA,YACb,kBAAkB;AAAA,YAClB;AAAA,UACF,CAAC;AAAA,UAED,MAAM,OAAO,IAAI,IAAI,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,WAAW,KAAK,CAAC,CAAC;AAAA,UAEnE,QAAO,KAAK,IAAI,aAAa,EAAE,CAAC,EAAE,cAAc;AAAA,YAC9C,WAAW,aAAa;AAAA,YACxB,cAAc;AAAA,UAChB,CAAC;AAAA,UACD,QAAO,KAAK,IAAI,aAAa,EAAE,GAAG,aAAa,EAAE,cAAc;AAAA,YAC7D,WAAW,aAAa;AAAA,YACxB,WAAW,QAAQ;AAAA,YACnB,MAAM;AAAA,YACN,UAAU;AAAA,UACZ,CAAC;AAAA,UAGD,QAAO,KAAK,IAAI,kBAAkB,EAAE,CAAC,EAAE,QAAQ;AAAA,YAC7C,WAAW,kBAAkB;AAAA,YAC7B,cAAc;AAAA,YACd,eAAe;AAAA,UACjB,CAAC;AAAA,UAGD,QAAO,KAAK,IAAI,0BAA0B,CAAC,EAAE,QAAQ;AAAA,YACnD,WAAW;AAAA,YACX,cAAc;AAAA,YACd,eAAe;AAAA,UACjB,CAAC;AAAA,SACF;AAAA,OACF;AAAA,MAED,MAAK,gDAAgD,YAAY;AAAA,QAC/D,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,QAAO,MAAM,QAAQ,wBAAwB,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,SAC7D;AAAA,OACF;AAAA,KACF;AAAA,IAED,UAAS,oBAAoB,MAAM;AAAA,MACjC,MAAK,wDAAwD,YAAY;AAAA,QACvE,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,YAAY;AAAA,UACxC,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAc,MAAM,WAAW,CAAC;AAAA,UAClF,MAAM,WAAW;AAAA,YACf,EAAE,SAAS,SAAS,cAAc,YAAY;AAAA,YAC9C,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,YACxC,EAAE,SAAS,SAAS,cAAc,WAAW;AAAA,YAC7C,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,YAC1C,EAAE,SAAS,SAAS,cAAc,UAAU;AAAA,UAC9C;AAAA,UACA,MAAM,MAAM,UAAU,QAAQ;AAAA,UAC9B,MAAM,UAAU,MAAM,MAAM,OAAO;AAAA,UACnC,MAAM,SAAS,EAAE,WAAW,aAAa,IAAI,WAAW,QAAQ,UAAU;AAAA,UAE1E,MAAM,QAAO,YAAY,QAAQ,SAAS,MAAM,CAAC,CAAC,EAAE,SAAS,QAAQ,QAAQ;AAAA,UAC7E,MAAM,QAAO,YAAY,QAAQ,SAAS,MAAM,CAAC,CAAC,EAAE,SAAS,QAAQ,QAAQ;AAAA,UAC7E,WAAW,UAAU,CAAC,GAAG,GAAG,SAAS,QAAQ,SAAS,SAAS,CAAC,GAAG;AAAA,YACjE,MAAM,QAAO,YAAY,QAAQ,SAAS,KAAK,QAAQ,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,QAC1E,SAAS,MAAM,MAAM,CACvB;AAAA,UACF;AAAA,UACA,MAAM,QACJ,YAAY,QAAQ,SAAS,KAAK,QAAQ,SAAS,CAAC,SAAS,GAAG,QAAQ,GAAG,OAAO,EAAE,CAAC,CAAC,CACxF,EAAE,SAAS,QAAQ,CAAC,EAAE,SAAS,QAAQ,GAAG,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,SAChE;AAAA,OACF;AAAA,MAED,MAAK,uCAAuC,YAAY;AAAA,QACtD,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAO,QAAQ,WAAW,EAAE,SAAS,aAAa,CAAC,CAAC,EAAE,QAAQ,QAClE,iBACF;AAAA,SACD;AAAA,OACF;AAAA,MAED,MAAK,6DAA6D,YAAY;AAAA,QAC5E,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,YAAY;AAAA,UAExC,MAAM,gBAAgB,MAAM,QAAQ,WAAW;AAAA,YAC7C,SAAS;AAAA,YACT,MAAM;AAAA,YACN,UAAU,EAAE,MAAM,QAAQ,IAAI,iBAAiB,OAAO,QAAQ;AAAA,UAChE,CAAC;AAAA,UACD,MAAM,cAAc,UAAU;AAAA,YAC5B,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,YACxC,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,UAC5C,CAAC;AAAA,UACD,MAAM,iBAAiB,MAAM,cAAc,OAAO,EAAE,eAAe,kBAAkB,CAAC;AAAA,UACtF,QAAO,eAAe,OAAO,EAAE,KAAK,SAAS;AAAA,UAC7C,MAAM,WAAW;AAAA,UAEjB,QAAO,QAAQ,EAAE,cAAc;AAAA,YAC7B,WAAW,aAAa;AAAA,YACxB,MAAM;AAAA,YACN,QAAQ,aAAa;AAAA,YACrB,UAAU,EAAE,MAAM,QAAQ,IAAI,iBAAiB,OAAO,QAAQ;AAAA,YAC9D,UAAU;AAAA,UACZ,CAAC;AAAA,UACD,QAAO,SAAS,eAAe,EAAE,cAAc;AAAA,UAC/C,QAAO,MAAM,QAAQ,iBAAiB,aAAa,EAAE,CAAC,EAAE,cAAc;AAAA,YACpE,WAAW,SAAS;AAAA,UACtB,CAAC;AAAA,UACD,QAAO,MAAM,QAAQ,WAAW,aAAa,IAAI,SAAS,SAAS,CAAC,EAAE,cAAc;AAAA,YAClF,WAAW,aAAa;AAAA,YACxB,WAAW,SAAS;AAAA,YACpB,MAAM;AAAA,YACN,UAAU;AAAA,UACZ,CAAC;AAAA,UAED,MAAM,IAAI,MAAM,CAAC;AAAA,UAEjB,MAAM,cAAc,MAAM,QAAQ,WAAW;AAAA,YAC3C,SAAS;AAAA,YACT,MAAM;AAAA,YACN,QAAQ,CAAC,EAAE,WAAW,aAAa,IAAI,WAAW,SAAS,UAAU,CAAC;AAAA,UACxE,CAAC;AAAA,UACD,MAAM,YAAY,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,YAAY,CAAC,CAAC;AAAA,UAC7E,MAAM,eAAe,MAAM,YAAY,OAAO;AAAA,YAC5C,yBAAyB,SAAS;AAAA,UACpC,CAAC;AAAA,UACD,QAAO,aAAa,OAAO,EAAE,KAAK,SAAS;AAAA,UAC3C,MAAM,WAAW;AAAA,UAEjB,QAAO,QAAQ,EAAE,cAAc;AAAA,YAC7B,WAAW,aAAa;AAAA,YACxB,iBAAiB,SAAS;AAAA,YAC1B,MAAM;AAAA,YACN,QAAQ,aAAa;AAAA,YACrB,QAAQ,CAAC,EAAE,WAAW,aAAa,IAAI,WAAW,SAAS,UAAU,CAAC;AAAA,YACtE,UAAU;AAAA,UACZ,CAAC;AAAA,UACD,QAAO,MAAM,QAAQ,iBAAiB,aAAa,EAAE,CAAC,EAAE,cAAc;AAAA,YACpE,WAAW,SAAS;AAAA,UACtB,CAAC;AAAA,UAED,MAAM,QACJ,YAAY,QAAQ,SAAS,EAAE,WAAW,aAAa,GAAG,CAAC,CAAC,CAC9D,EAAE,SAAS,QAAQ;AAAA,YACjB,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,YACxC,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,YAC1C,EAAE,SAAS,SAAS,cAAc,YAAY;AAAA,UAChD,CAAC;AAAA,UACD,MAAM,QACJ,YACE,QAAQ,SAAS,EAAE,WAAW,aAAa,IAAI,WAAW,SAAS,UAAU,CAAC,CAChF,CACF,EAAE,SAAS,QAAQ;AAAA,YACjB,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,YACxC,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,UAC5C,CAAC;AAAA,UACD,MAAM,QACJ,YACE,QAAQ,SAAS;AAAA,YACf,WAAW,aAAa;AAAA,YACxB,SAAS,CAAC,SAAS;AAAA,YACnB,OAAO;AAAA,UACT,CAAC,CACH,CACF,EAAE,SAAS,QAAQ,CAAC,EAAE,SAAS,QAAQ,GAAG,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,UAC/D,MAAM,QACJ,YACE,QAAQ,SAAS;AAAA,YACf,WAAW,aAAa;AAAA,YACxB,SAAS,CAAC,SAAS;AAAA,YACnB,OAAO;AAAA,YACP,QAAQ;AAAA,UACV,CAAC,CACH,CACF,EAAE,SAAS,QAAQ,CAAC,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,UACzC,MAAM,QACJ,YACE,QAAQ,SAAS;AAAA,YACf,WAAW,aAAa;AAAA,YACxB,SAAS,CAAC,SAAS;AAAA,YACnB,QAAQ;AAAA,UACV,CAAC,CACH,CACF,EAAE,SAAS,QAAQ,CAAC,EAAE,SAAS,QAAQ,GAAG,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,UAE/D,SACG,MAAM,QAAQ,aAAa,aAAa,EAAE,GAAG,IAAI,CAAC,YAAY,QAAQ,SAAS,CAClF,EAAE,QAAQ,CAAC,SAAS,WAAW,SAAS,SAAS,CAAC;AAAA,UAClD,SACG,MAAM,QAAQ,aAAa,aAAa,IAAI,CAAC,GAAG,IAAI,CAAC,YAAY,QAAQ,SAAS,CACrF,EAAE,QAAQ,CAAC,SAAS,SAAS,CAAC;AAAA,UAC9B,QAAO,MAAM,QAAQ,aAAa,iBAAiB,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,UAChE,QAAO,MAAM,QAAQ,iBAAiB,iBAAiB,CAAC,EAAE,SAAS;AAAA,UACnE,QAAO,MAAM,QAAQ,WAAW,aAAa,IAAI,gBAAgB,CAAC,EAAE,SAAS;AAAA,SAC9E;AAAA,OACF;AAAA,MAED,MAAK,mDAAmD,YAAY;AAAA,QAClE,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,YAAY;AAAA,UAExC,MAAM,aAAa,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAc,MAAM,WAAW,CAAC;AAAA,UACvF,MAAM,WAAW,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC,CAAC;AAAA,UACtE,MAAM,eAAe,MAAM,WAAW,OAAO;AAAA,UAE7C,MAAM,mBAAmB,MAAM,QAAQ,WAAW;AAAA,YAChD,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,UACD,MAAM,iBAAiB,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,UAAU,CAAC,CAAC;AAAA,UAChF,MAAM,qBAAqB,MAAM,iBAAiB,OAAO;AAAA,UAEzD,QAAO,mBAAmB,SAAS,EAAE,IAAI,KAAK,aAAa,SAAS;AAAA,UACpE,QAAO,mBAAmB,eAAe,EAAE,cAAc;AAAA,UACzD,QAAO,mBAAmB,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC1C,MAAM,QACJ,YAAY,QAAQ,SAAS,EAAE,WAAW,aAAa,GAAG,CAAC,CAAC,CAC9D,EAAE,SAAS,QAAQ,CAAC,EAAE,SAAS,SAAS,cAAc,UAAU,CAAC,CAAC;AAAA,UAClE,MAAM,QACJ,YACE,QAAQ,SAAS,EAAE,WAAW,aAAa,IAAI,WAAW,aAAa,UAAU,CAAC,CACpF,CACF,EAAE,SAAS,QAAQ,CAAC,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC,CAAC;AAAA,SAC/D;AAAA,OACF;AAAA,MAED,MAAK,uEAAuE,YAAY;AAAA,QACtF,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,YAAY;AAAA,UAExC,MAAM,YAAY,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAc,MAAM,WAAW,CAAC;AAAA,UACtF,MAAM,UAAU,UAAU;AAAA,YACxB,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,YACxC,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,UAC5C,CAAC;AAAA,UACD,MAAM,cAAc,MAAM,UAAU,OAAO;AAAA,UAC3C,QAAO,YAAY,OAAO,EAAE,KAAK,SAAS;AAAA,UAG1C,MAAM,iBAAiB,MAAM,QAAQ,WAAW;AAAA,YAC9C,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,UACD,MAAM,eAAe,UAAU;AAAA,YAC7B,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,YAC1C,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,UAC1C,CAAC;AAAA,UACD,MAAM,mBAAmB,MAAM,eAAe,OAAO;AAAA,UAErD,QAAO,iBAAiB,OAAO,EAAE,KAAK,WAAW;AAAA,UACjD,QAAO,iBAAiB,SAAS,EAAE,KAAK,YAAY,SAAS;AAAA,UAC7D,SACG,MAAM,QAAQ,aAAa,aAAa,EAAE,GAAG,IAAI,CAAC,YAAY,QAAQ,SAAS,CAClF,EAAE,QAAQ,CAAC,YAAY,SAAS,CAAC;AAAA,UACjC,QAAO,MAAM,QAAQ,iBAAiB,aAAa,EAAE,CAAC,EAAE,cAAc;AAAA,YACpE,WAAW,YAAY;AAAA,UACzB,CAAC;AAAA,UAED,MAAM,IAAI,MAAM,CAAC;AAAA,UAEjB,MAAM,eAAe,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAc,MAAM,WAAW,CAAC;AAAA,UACzF,MAAM,aAAa,UAAU;AAAA,YAC3B,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,YACxC,EAAE,SAAS,SAAS,cAAc,SAAS;AAAA,UAC7C,CAAC;AAAA,UACD,MAAM,iBAAiB,MAAM,aAAa,OAAO;AAAA,UAEjD,QAAO,eAAe,OAAO,EAAE,KAAK,SAAS;AAAA,UAC7C,QAAO,eAAe,SAAS,EAAE,IAAI,KAAK,YAAY,SAAS;AAAA,UAC/D,SACG,MAAM,QAAQ,aAAa,aAAa,EAAE,GAAG,IAAI,CAAC,YAAY,QAAQ,SAAS,CAClF,EAAE,QAAQ,CAAC,eAAe,WAAW,YAAY,SAAS,CAAC;AAAA,SAC5D;AAAA,OACF;AAAA,MAED,MAAK,2DAA2D,YAAY;AAAA,QAC1E,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,YAAY;AAAA,UACxC,MAAM,OAAO,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,UACrD,MAAM,OAAO,EAAE,SAAS,SAAS,cAAc,QAAQ;AAAA,UAEvD,MAAM,YAAY,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAc,MAAM,WAAW,CAAC;AAAA,UACtF,MAAM,UAAU,UAAU,CAAC,MAAM,MAAM,IAAI,CAAC;AAAA,UAC5C,MAAM,cAAc,MAAM,UAAU,OAAO;AAAA,UAE3C,MAAM,IAAI,MAAM,CAAC;AAAA,UAIjB,MAAM,eAAe,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAc,MAAM,WAAW,CAAC;AAAA,UACzF,MAAM,aAAa,UAAU,CAAC,MAAM,MAAM,IAAI,CAAC;AAAA,UAC/C,MAAM,iBAAiB,MAAM,aAAa,OAAO;AAAA,UAEjD,QAAO,eAAe,OAAO,EAAE,KAAK,SAAS;AAAA,UAC7C,QAAO,eAAe,SAAS,EAAE,IAAI,KAAK,YAAY,SAAS;AAAA,SAChE;AAAA,OACF;AAAA,MAED,MAAK,wEAAwE,YAAY;AAAA,QACvF,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,oBAAoB;AAAA,UAEhD,MAAM,YAAY,MAAM,QAAQ,WAAW;AAAA,YACzC,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,UACD,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,SAAS,MAAM,KAAK,CAAC,CAAC;AAAA,UAC5D,MAAM,cAAc,MAAM,UAAU,OAAO;AAAA,UAE3C,MAAM,eAAe,MAAM,QAAQ,WAAW;AAAA,YAC5C,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,UACD,MAAM,aAAa,UAAU,CAAC,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,UACnD,MAAM,iBAAiB,MAAM,aAAa,OAAO;AAAA,UAEjD,QAAO,eAAe,OAAO,EAAE,KAAK,WAAW;AAAA,UAC/C,QAAO,eAAe,SAAS,EAAE,KAAK,YAAY,SAAS;AAAA,SAC5D;AAAA,OACF;AAAA,MAED,MAAK,8DAA8D,YAAY;AAAA,QAC7E,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,YAAY;AAAA,UAExC,MAAM,YAAY,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAc,MAAM,WAAW,CAAC;AAAA,UACtF,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC,CAAC;AAAA,UACrE,MAAM,cAAc,MAAM,UAAU,OAAO;AAAA,UAE3C,MAAM,cAAc,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAc,MAAM,SAAS,CAAC;AAAA,UACtF,MAAM,gBAAgB,MAAM,YAAY,OAAO;AAAA,UAE/C,QAAO,cAAc,OAAO,EAAE,KAAK,WAAW;AAAA,UAC9C,QAAO,cAAc,SAAS,EAAE,KAAK,YAAY,SAAS;AAAA,UAC1D,QAAO,cAAc,QAAQ,EAAE,KAAK,CAAC;AAAA,UACrC,SACG,MAAM,QAAQ,aAAa,aAAa,EAAE,GAAG,IAAI,CAAC,YAAY,QAAQ,SAAS,CAClF,EAAE,QAAQ,CAAC,YAAY,SAAS,CAAC;AAAA,UACjC,MAAM,QACJ,YAAY,QAAQ,SAAS,EAAE,WAAW,aAAa,GAAG,CAAC,CAAC,CAC9D,EAAE,SAAS,QAAQ,CAAC,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC,CAAC;AAAA,SAC/D;AAAA,OACF;AAAA,MAED,MAAK,kCAAkC,YAAY;AAAA,QACjD,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,YAAY;AAAA,UAExC,MAAM,YAAY,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAc,MAAM,WAAW,CAAC;AAAA,UACtF,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC,CAAC;AAAA,UACrE,MAAM,iBAAiB,MAAM,UAAU,OAAO;AAAA,UAE9C,MAAM,eAAe,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAc,MAAM,SAAS,CAAC;AAAA,UACvF,MAAM,aAAa,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,QAAQ,CAAC,CAAC;AAAA,UAE1E,MAAM,iBAAiB,MAAM,QAAQ,WAAW;AAAA,YAC9C,SAAS;AAAA,YACT,MAAM;AAAA,UACR,CAAC;AAAA,UACD,MAAM,eAAe,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,YAAY,CAAC,CAAC;AAAA,UAChF,MAAM,eAAe,OAAO,EAAE,yBAAyB,eAAe,UAAU,CAAC;AAAA,UAEjF,MAAM,QACJ,aAAa,OAAO,EAAE,yBAAyB,eAAe,UAAU,CAAC,CAC3E,EAAE,QAAQ,QAAQ,0BAA0B;AAAA,UAC5C,MAAM,QACJ,YAAY,QAAQ,SAAS,EAAE,WAAW,aAAa,GAAG,CAAC,CAAC,CAC9D,EAAE,SAAS,QAAQ;AAAA,YACjB,EAAE,SAAS,SAAS,cAAc,MAAM;AAAA,YACxC,EAAE,SAAS,SAAS,cAAc,YAAY;AAAA,UAChD,CAAC;AAAA,SACF;AAAA,OACF;AAAA,MAED,MAAK,wDAAwD,YAAY;AAAA,QACvE,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,YAAY;AAAA,UAExC,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAc,MAAM,WAAW,CAAC;AAAA,UAClF,MAAM,MAAM,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC,CAAC;AAAA,UACjE,MAAM,MAAM,MAAM;AAAA,UAClB,MAAM,MAAM,MAAM;AAAA,UAElB,QAAO,MAAM,QAAQ,iBAAiB,aAAa,EAAE,CAAC,EAAE,SAAS;AAAA,UACjE,QAAO,MAAM,QAAQ,aAAa,aAAa,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,UAC9D,MAAM,QACJ,YAAY,QAAQ,SAAS,EAAE,WAAW,aAAa,GAAG,CAAC,CAAC,CAC9D,EAAE,QAAQ,QAAQ,4BAA4B;AAAA,SAC/C;AAAA,OACF;AAAA,MAED,MAAK,6DAA6D,YAAY;AAAA,QAC5E,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,YAAY;AAAA,UAExC,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAc,MAAM,WAAW,CAAC;AAAA,UAClF,MAAM,MAAM,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,MAAM,CAAC,CAAC;AAAA,UACjE,MAAM,MAAM,OAAO;AAAA,UACnB,MAAM,MAAM,MAAM;AAAA,UAElB,MAAM,QAAO,MAAM,UAAU,CAAC,CAAC,CAAC,EAAE,QAAQ,QAAQ,gBAAgB;AAAA,SACnE;AAAA,OACF;AAAA,MAED,MAAK,qDAAqD,YAAY;AAAA,QACpE,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,YAAY;AAAA,UACxC,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,cAAc,MAAM,WAAW,CAAC;AAAA,UAElF,MAAM,QAAO,MAAM,UAAU,CAAC,EAAE,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,QAC5D,yBACF;AAAA,UACA,MAAM,QACJ,MAAM,UAAU,CAAC,EAAE,SAAS,SAAS,cAAc,OAAO,YAAY,KAAK,CAAU,CAAC,CACxF,EAAE,QAAQ,QAAQ,gBAAgB;AAAA,UAClC,MAAM,MAAM,MAAM;AAAA,SACnB;AAAA,OACF;AAAA,MAED,MAAK,kEAAkE,YAAY;AAAA,QACjF,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ;AAAA,UACd,MAAM,QAAQ,cAAc,mBAAmB;AAAA,UAE/C,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,qBAAqB,MAAM,WAAW,CAAC;AAAA,UACzF,MAAM,MAAM,UAAU;AAAA,YACpB,EAAE,IAAI,YAAY,QAAQ,MAAM;AAAA,YAChC,EAAE,IAAI,YAAY,QAAQ,KAAK;AAAA,UACjC,CAAC;AAAA,UACD,MAAM,MAAM,OAAO;AAAA,UAEnB,MAAM,QACJ,YAAY,QAAQ,SAAS,EAAE,WAAW,oBAAoB,GAAG,CAAC,CAAC,CACrE,EAAE,SAAS,QAAQ;AAAA,YACjB,EAAE,IAAI,YAAY,QAAQ,MAAM;AAAA,YAChC,EAAE,IAAI,YAAY,QAAQ,KAAK;AAAA,UACjC,CAAC;AAAA,UACD,MAAM,QACJ,YACE,QAAQ,SAAS;AAAA,YACf,WAAW,oBAAoB;AAAA,YAC/B,SAAS,CAAC,QAAQ;AAAA,YAClB,OAAO;AAAA,UACT,CAAC,CACH,CACF,EAAE,SAAS,QAAQ,CAAC,EAAE,QAAQ,MAAM,CAAC,CAAC;AAAA,SACvC;AAAA,OACF;AAAA,MAED,MAAK,kCAAkC,YAAY;AAAA,QACjD,MAAM,YAAY,OAAO,YAAY;AAAA,UACnC,MAAM,QAAQ,cAAc,cAAc;AAAA,UAE1C,MAAM,QAAQ,MAAM,QAAQ,WAAW,EAAE,SAAS,gBAAgB,MAAM,WAAW,CAAC;AAAA,UACpF,MAAM,MAAM,UAAU;AAAA,YACpB,EAAE,IAAI,SAAS,YAAY,WAAW;AAAA,YACtC,EAAE,IAAI,SAAS,YAAY,KAAK;AAAA,UAClC,CAAC;AAAA,UACD,MAAM,MAAM,OAAO;AAAA,UAEnB,MAAM,QACJ,YAAY,QAAQ,SAAS,EAAE,WAAW,eAAe,GAAG,CAAC,CAAC,CAChE,EAAE,SAAS,QAAQ;AAAA,YACjB,EAAE,IAAI,SAAS,YAAY,WAAW;AAAA,YACtC,EAAE,IAAI,SAAS,YAAY,KAAK;AAAA,UAClC,CAAC;AAAA,SACF;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAAA;AAGH,eAAe,WAAW,CAAC,MAAwD;AAAA,EACjF,MAAM,SAAuB,CAAC;AAAA,EAC9B,iBAAiB,OAAO,MAAM;AAAA,IAC5B,OAAO,KAAK,GAAG;AAAA,EACjB;AAAA,EACA,OAAO;AAAA;;ACzrBT,qBAAS,qBAAU,iBAAQ;;;ACa3B,IAAM,aAAa;AAAA,EACjB,WAAW,EAAE,eAAe,CAAC,GAAG,eAAe,CAAC,GAAG,aAAa,CAAC,GAAG,aAAa,CAAC,EAAE;AAAA,EACpF,WAAW;AAAA,IACT,eAAe,CAAC;AAAA,IAChB,eAAe,CAAC;AAAA,IAChB,aAAa,CAAC;AAAA,IACd,aAAa,CAAC;AAAA,EAChB;AAAA,EACA,YAAY,EAAE,cAAc,CAAC,EAAE;AAAA,EAC/B,QAAQ,CAAC;AACX;AAEO,SAAS,kBAAkB,CAAC,IAAuC;AAAA,EACxE,OAAO;AAAA,IACL,QAAQ;AAAA,MACN,WAAW;AAAA,MACX;AAAA,MACA,gBAAgB,WAAW;AAAA,MAC3B,aAAa,QAAQ;AAAA,MACrB,QAAQ,EAAE,MAAM,WAAW,WAAW,GAAG;AAAA,MACzC,kBAAkB;AAAA,MAClB,QAAQ,EAAE,MAAM,QAAQ,MAAM,UAAU,gBAAgB,EAAE;AAAA,MAC1D,aAAa;AAAA,IACf;AAAA,IACA,UAAU;AAAA,MACR,SAAS,CAAC;AAAA,MACV,SAAS,CAAC;AAAA,MACV,OAAO,CAAC;AAAA,MACR,YAAY,CAAC;AAAA,MACb,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AAAA;AAGK,IAAM,wBAAwB;AAE9B,SAAS,kBAAkB,CAAC,UAAkB,aAAa,GAAG;AAAA,EACnE,OAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA,SAAS;AAAA,IACT;AAAA,IACA,aAAa;AAAA,IACb,UAAU,CAAC;AAAA,IACX,SAAS,EAAE,SAAS,CAAC,GAAG,OAAO,CAAC,EAAE;AAAA,EACpC;AAAA;AAGF,eAAsB,eAAe,CAAC,SAAkC,IAA2B;AAAA,EACjG,MAAM,QAAQ,YAAY,OAAO,OAAO;AAAA,IACtC,MAAM,UAAU,MAAM,GAAG,SAAS,iBAAiB,MAAM,mBAAmB,EAAE,CAAC;AAAA,IAC/E,MAAM,GAAG,SAAS,iBAAiB,SAAS;AAAA,MAC1C;AAAA,MACA,cAAc,EAAE,mBAAmB,CAAC,GAAG,QAAQ,mBAAmB,EAAE,EAAE;AAAA,IACxE,CAAC;AAAA,GACF;AAAA;AAQH,eAAsB,iBAAiB,CACrC,SACA,IACA,UAII,CAAC,GACkC;AAAA,EACvC,MAAM,SAAS,mBAAmB,EAAE;AAAA,EACpC,MAAM,MAAM,EAAE,cAAc,kBAAkB,WAAW,QAAQ,aAAa,GAAG;AAAA,EACjF,MAAM,MAAM;AAAA,IACV;AAAA,IACA,YAAY,EAAE,MAAM,GAAG;AAAA,IACvB,SAAS;AAAA,IACT,WAAW,OAAO,OAAO;AAAA,IACzB,WAAW,OAAO,OAAO;AAAA,IACzB,cAAc;AAAA,EAChB;AAAA,EACA,MAAM,aAAa,EAAE,KAAK,UAAU,EAAE,KAAK,QAAQ,MAAe,EAAE;AAAA,EACpE,MAAM,QAAQ;AAAA,IACZ,eAAe;AAAA,IACf,WAAW,OAAO,OAAO;AAAA,IACzB,YAAY,OAAO,OAAO;AAAA,IAC1B,QAAQ,OAAO,OAAO;AAAA,IACtB,UAAU;AAAA,IACV,MAAM;AAAA,IACN,OAAO;AAAA,IACP,cAAc,GAAG,IAAI,gBAAgB,IAAI;AAAA,IACzC,SAAS;AAAA,MACP,cAAc,IAAI;AAAA,MAClB,WAAW,IAAI;AAAA,MACf,YAAY,IAAI;AAAA,MAChB,iBAAiB,CAAC;AAAA,IACpB;AAAA,EACF;AAAA,EACA,MAAM,UAAU,cAAc,OAAO,OAAO,WAAW,IAAI,CAAC;AAAA,EAC5D,MAAM,WAAyC;AAAA,OAC1C;AAAA,IACH,IAAI;AAAA,IACJ,eAAe;AAAA,EACjB;AAAA,EACA,MAAM,OAA6C;AAAA,IACjD;AAAA,MACE,MAAM;AAAA,MACN,WAAW,QAAQ;AAAA,MACnB,YAAY;AAAA,MACZ,SAAS;AAAA,MACT,MAAM,EAAE,MAAM,iBAAiB,OAAO,WAAW;AAAA,IACnD;AAAA,IACA;AAAA,MACE,MAAM;AAAA,MACN,WAAW,WAAW;AAAA,MACtB,eAAe;AAAA,MACf,SAAS;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,YAAY,OAAO,OAAO;AAAA,IACtC,MAAM,mBAAmB,GAAG,SAAS;AAAA,IACrC,MAAM,UAAU,MAAM,iBAAiB,MAAM,MAAM;AAAA,IACnD,MAAM,iBAAiB,UAAU,EAAE,SAAS,SAAS,KAAK,CAAC;AAAA,IAE3D,MAAM,eAAe,CAAC;AAAA,IACtB,iBAAiB,QAAQ,iBAAiB,WAAW;AAAA,MACnD;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,CAAC,GAAG;AAAA,MACF,aAAa,KAAK,GAAG,KAAK,OAAO;AAAA,IACnC;AAAA,IACA,MAAM,gBAAgB,aAAa,QAAQ,CAAC,WAC1C,OAAO,SAAS,UAAU,OAAO,KAAK,SAAS,kBAAkB,CAAC,OAAO,KAAK,KAAK,IAAI,CAAC,CAC1F;AAAA,IACA,MAAM,iBAAiB,WAAW;AAAA,MAChC;AAAA,MACA,OAAO;AAAA,WACF;AAAA,QACH,WAAW,KAAK,WAAW,WAAW,cAAc;AAAA,MACtD;AAAA,IACF,CAAC;AAAA,IAED,MAAM,eAAe,CAAC;AAAA,IACtB,iBAAiB,QAAQ,iBAAiB,WAAW;AAAA,MACnD;AAAA,MACA,OAAO;AAAA,MACP,UAAU;AAAA,IACZ,CAAC,GAAG;AAAA,MACF,aAAa,KAAK,GAAG,KAAK,OAAO;AAAA,IACnC;AAAA,IACA,MAAM,iBAAiB,WAAW;AAAA,MAChC;AAAA,MACA,OAAO;AAAA,WACF;AAAA,QACH,QAAQ,aAAa,IAAI,CAAC,WAAW;AAAA,UACnC,IAAI,OAAO,SAAS;AAAA,YAAS,MAAM,IAAI,MAAM,6BAA6B;AAAA,UAC1E,OAAO;AAAA,YACL;AAAA,YACA,aAAa,OAAO,OAAO;AAAA,YAC3B,WAAW,OAAO,OAAO;AAAA,UAC3B;AAAA,SACD;AAAA,MACH;AAAA,IACF,CAAC;AAAA,IACD,IAAI,CAAC,QAAQ,cAAc;AAAA,MACzB,MAAM,iBAAiB,SAAS;AAAA,QAC9B;AAAA,QACA,cAAc,EAAE,mBAAmB,CAAC,GAAG,QAAQ,mBAAmB,IAAI,CAAC,EAAE;AAAA,MAC3E,CAAC;AAAA,IACH;AAAA,IACA,IAAI,QAAQ;AAAA,MAAoB,MAAM,IAAI,MAAM,mBAAmB;AAAA,GACpE;AAAA,EAED,OAAO,EAAE,QAAQ;AAAA;;;ADxJZ,SAAS,sCAGf,CAAC,OAAe,SAAgF;AAAA,EAC/F,MAAM,aAAa,QAAQ,cAAc,CAAC,2BAA2B,iBAAiB,UAAU;AAAA,EAEhG,UAAS,OAAO,MAAM;AAAA,IACpB,WAAW,YAAY,YAAY;AAAA,MACjC,MAAK,4CAA4C,kBAAkB,YAAY;AAAA,QAC7E,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,QAC5C,IAAI;AAAA,UACF,MAAM,QAAQ,QAAQ,OAAO;AAAA,UAC7B,MAAM,SAAS,MAAM,QAAQ,aAAa,OAAO;AAAA,UACjD,MAAM,UAAU,IAAI,MAAM,qBAAqB,UAAU;AAAA,UACzD,MAAM,QAAQ,cAAc,SAAS,UAAU,OAAO;AAAA,UACtD,MAAM,QAAO,kBAAkB,SAAS,WAAW,UAAU,CAAC,EAAE,QAAQ,QACtE,QAAQ,OACV;AAAA,UACA,MAAM,QAAQ,eAAe,OAAO;AAAA,UACpC,QAAO,MAAM,QAAQ,aAAa,OAAO,CAAC,EAAE,QAAQ,MAAM;AAAA,kBAC1D;AAAA,UACA,MAAM,QAAQ,eAAe,OAAO;AAAA,UACpC,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA,OAElC;AAAA,IACH;AAAA,GACD;AAAA;;AEhEH,mBAAS,iBAAQ;AA6BjB,IAAM,UAAS,iBAAiB;AAAA,EAC9B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,IACV,KAAK,MAAM,UAAU,EAAE,SAAS,MAAM,UAAU,KAAK,CAAC;AAAA,IACtD,KAAK,QAAQ,UAAU,EAAE,UAAU,KAAK,CAAC;AAAA,IACzC,KAAK,eAAe,UAAU,EAAE,MAAM,YAAY,CAAC;AAAA,EACrD;AAAA,EACA,OAAO,CAAC,KAAK,KAAK,UAAU,EAAE,aAAa,MAAM,CAAC,CAAC;AACrD,CAAC;AAED,IAAM,UAAU,cAAc,4BAA4B;AAAA,EACxD,QAAQ;AAAA,IACN,IAAI,MAAM,QAAQ;AAAA,IAClB,IAAI,QAAQ,QAAQ;AAAA,IACpB,IAAI,aAAa,UAAU,EAAE,UAAU,KAAK,CAAC;AAAA,EAC/C;AACF,CAAC;AACD,IAAM,WAAW,cAAc,6BAA6B;AAAA,EAC1D,QAAQ,CAAC,IAAI,aAAa,QAAQ,GAAG,IAAI,MAAM,WAAW,GAAG,IAAI,SAAS,SAAS,CAAC;AACtF,CAAC;AACD,IAAM,mBAAmB,iBAAiB,4BAA4B,OAAM,EACzE,YAAY,OAAO,EACnB,WAAW,EAAE,IAAI,MAAM,MAAM,OAAO,CAAC,EACrC,UAAU;AAAA,EACT,QAAQ;AAAA,IACN,MAAM,QAAO,EAAE;AAAA,IACf,aAAa;AAAA,IACb,QAAQ;AAAA,EACV;AACF,CAAC;AACH,IAAM,wBAAwB,iBAC5B,iCACA,QAAO,EAAE,WACX,EACG,YAAY,QAAQ,EACpB,OAAO,EAAE,UAAU,aAAa,IAAI,MAAM,OAAO,QAAQ,CAAC;AAE7D,IAAM,YAAW,IAAI,iBAAiB,EAAE,SAAS,CAAC,OAAM,EAAE,CAAC;AAC3D,IAAM,cAAc,IAAI,mBAAmB;AAAA,EACzC,aAAa,CAAC,kBAAkB,qBAAqB;AAAA,EACrD;AAAA,EACA,cAAc,IAAI,IAA+B;AAAA,IAC/C,CAAC,QAAQ,IAAI,OAAO;AAAA,IACpB,CAAC,SAAS,IAAI,QAAQ;AAAA,EACxB,CAAC;AACH,CAAC;AAEM,SAAS,mCAA6D,CAC3E,MACA,UACM;AAAA,EACN,MAAK,GAAG,uEAAuE,YAAY;AAAA,IACzF,MAAM,iBAAiB,MAAM,SAAS,cAAc;AAAA,IACpD,MAAM,UAAU,uBAAuB,cAAc;AAAA,IACrD,IAAI,yBAAyB;AAAA,IAC7B,MAAM,eAAe,2BAA2B;AAAA,MAC9C,WAAW;AAAA,MACX;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc;AAAA,QACZ,UAAU,EAAE,iBAAiB,GAAG,eAAe,GAAG,eAAe,EAAE;AAAA,QACnE,OAAO,MAAM,IAAI,KAAK,0BAA0B;AAAA,QAChD,mBAAmB,MAAM,8BAA8B,EAAE;AAAA,MAC3D;AAAA,IACF,CAAC;AAAA,IAED,IAAI;AAAA,MACF,MAAM,eAAe;AAAA,QACnB,WAAW,QAAQ;AAAA,QACnB,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,MACA,MAAM,iBAAiB,MAAM,MAAM,SAAS;AAAA,QAC1C,OAAO;AAAA,QACP,cAAc,iBAAiB;AAAA,QAC/B,UAAU;AAAA,QACV,gBAAgB;AAAA,MAClB,CAAC;AAAA,MACD,MAAM,QAAQ,MAAM,aAAa,YAAY,QAAQ;AAAA,QACnD,QAAQ,EAAE,cAAc,iBAAiB,GAAG;AAAA,QAC5C,gBAAgB;AAAA,QAChB,WAAW;AAAA,QACX,SAAS,QAAQ,CAAC,YAAY,OAAO,OAAO,KAAK,GAAG,YAAY,OAAO,KAAK,CAAC,CAAC;AAAA,MAChF,CAAC;AAAA,MACD,QAAO,MAAM,MAAM,EAAE,cAAc,EAAE,gBAAgB,GAAG,cAAc,EAAE,CAAC;AAAA,MACzE,QACE,MAAM,QAAQ,QAAQ,eAAe;AAAA,QACnC,WAAW;AAAA,QACX,cAAc,QAAO;AAAA,QACrB,WAAW;AAAA,MACb,CAAC,CACH,EAAE,cAAc,EAAE,YAAY,EAAE,IAAI,OAAO,MAAM,MAAM,GAAG,cAAc,MAAM,SAAS,CAAC;AAAA,MAExF,MAAM,gBAAgB;AAAA,QACpB,WAAW,QAAQ;AAAA,QACnB,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,MACA,MAAM,kBAAkB,MAAM,MAAM,SAAS;AAAA,QAC3C,OAAO;AAAA,QACP,cAAc,iBAAiB;AAAA,QAC/B,UAAU;AAAA,QACV,gBAAgB;AAAA,MAClB,CAAC;AAAA,MACD,MAAM,SAAS,MAAM,aAAa,YAAY,QAAQ;AAAA,QACpD,QAAQ,EAAE,cAAc,iBAAiB,GAAG;AAAA,QAC5C,gBAAgB;AAAA,QAChB,WAAW;AAAA,QACX,SAAS,QAAQ,CAAC,YAAY,OAAO,aAAa,CAAC,CAAC;AAAA,MACtD,CAAC;AAAA,MACD,QAAO,OAAO,MAAM,EAAE,cAAc;AAAA,QAClC,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,QAChB,cAAc;AAAA,MAChB,CAAC;AAAA,MACD,QACE,MAAM,QAAQ,QAAQ,eAAe;AAAA,QACnC,WAAW;AAAA,QACX,cAAc,QAAO;AAAA,QACrB,WAAW;AAAA,MACb,CAAC,CACH,EAAE,SAAS;AAAA,MAEX,MAAM,QACJ,aAAa,MAAM,OAAO;AAAA,QACxB,MAAM;AAAA,QACN,QAAQ,EAAE,MAAM,UAAU,UAAU,gBAAgB,OAAO,qBAAqB;AAAA,QAChF,YAAY;AAAA,UACV;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,KAAK,EAAE,cAAc,QAAO,IAAI,WAAW,MAAM;AAAA,YACjD,KAAK,EAAE,MAAM,mBAAmB;AAAA,YAChC,OAAO,CAAC;AAAA,YACR,OAAO,CAAC;AAAA,UACV;AAAA,QACF;AAAA,QACA,iBAAiB,CAAC;AAAA,QAClB,eAAe,CAAC;AAAA,QAChB,oBAAoB,CAAC;AAAA,MACvB,CAAC,CACH,EAAE,QAAQ,QAAQ,oBAAoB;AAAA,MAEtC,MAAM,QAAQ,WAAW,MAAM;AAAA,QAC7B,IAAI;AAAA,QACJ,WAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS,EAAE,MAAM,UAAU,cAAc,QAAO,IAAI,WAAW,MAAM;AAAA,QACrE,QAAQ,CAAC;AAAA,QACT,gBAAgB;AAAA,MAClB,CAAC;AAAA,MACD,MAAM,QAAQ,WAAW,MAAM;AAAA,QAC7B,IAAI;AAAA,QACJ,WAAW;AAAA,MACb,CAAC;AAAA,MACD,MAAM,eAAe,MAAM,aAAa,MAAM,OAAO;AAAA,QACnD,MAAM;AAAA,QACN,QAAQ,EAAE,MAAM,UAAU,UAAU,gBAAgB,OAAO,aAAa;AAAA,QACxE,YAAY;AAAA,UACV;AAAA,YACE,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,KAAK,EAAE,cAAc,QAAO,IAAI,WAAW,MAAM;AAAA,YACjD,KAAK,EAAE,MAAM,eAAe;AAAA,YAC5B,OAAO,CAAC;AAAA,YACR,OAAO,CAAC;AAAA,UACV;AAAA,QACF;AAAA,QACA,iBAAiB,CAAC;AAAA,QAClB,eAAe,CAAC;AAAA,QAChB,oBAAoB,CAAC;AAAA,MACvB,CAAC;AAAA,MACD,QACE,MAAM,QAAQ,SAAS,QAAQ,YAAY;AAAA,QACzC,WAAW;AAAA,QACX,QAAQ,EAAE,MAAM,UAAU,aAAa,aAAa;AAAA,MACtD,CAAC,CACH,EAAE,cAAc,EAAE,IAAI,aAAa,SAAS,CAAC;AAAA,MAE7C,MAAM,mBAAmB;AAAA,QACvB,WAAW,SAAS;AAAA,QACpB,WAAW;AAAA,QACX,WAAW;AAAA,MACb;AAAA,MACA,MAAM,QACJ,aAAa,UAAU,OAAO;AAAA,QAC5B,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,YAAY,EAAE,cAAc,sBAAsB,GAAG;AAAA,UACrD,gBAAgB;AAAA,YACd,WAAW,SAAS;AAAA,YACpB,WAAW;AAAA,YACX,WAAW;AAAA,UACb;AAAA,UACA,WAAW;AAAA,YACT,iBAAiB;AAAA,YACjB,gBAAgB;AAAA,UAClB;AAAA,UACA,cAAc;AAAA,UACd,gBAAgB;AAAA,UAChB,mBAAmB;AAAA,UACnB,gBAAgB;AAAA,QAClB;AAAA,QACA,QAAQ;AAAA,UACN;AAAA,YACE,QAAQ;AAAA,cACN,QAAQ,EAAE,cAAc,QAAO,IAAI,WAAW,MAAM;AAAA,cACpD,YAAY;AAAA,YACd;AAAA,YACA,OAAO;AAAA,YACP,IAAI;AAAA,UACN;AAAA,QACF;AAAA,MACF,CAAC,CACH,EAAE,QAAQ,QAAQ,uBAAuB;AAAA,MAEzC,MAAM,qBAAqB,MAAM,MAAM,SAAS;AAAA,QAC9C,OAAO;AAAA,QACP,cAAc,sBAAsB;AAAA,QACpC,UAAU;AAAA,QACV,gBAAgB;AAAA,QAChB,gBAAgB;AAAA,MAClB,CAAC;AAAA,MACD,MAAM,YAAY,MAAM,aAAa,UAAU,OAAO;AAAA,QACpD,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,YAAY,EAAE,cAAc,sBAAsB,GAAG;AAAA,UACrD,gBAAgB;AAAA,UAChB,WAAW;AAAA,UACX,cAAc;AAAA,UACd,gBAAgB;AAAA,UAChB,mBAAmB;AAAA,UACnB,gBAAgB;AAAA,QAClB;AAAA,QACA,QAAQ;AAAA,UACN;AAAA,YACE,QAAQ;AAAA,cACN,QAAQ,EAAE,cAAc,QAAO,IAAI,WAAW,MAAM;AAAA,cACpD,YAAY;AAAA,YACd;AAAA,YACA,OAAO;AAAA,YACP,IAAI;AAAA,UACN;AAAA,QACF;AAAA,MACF,CAAC;AAAA,MACD,QAAO,SAAS,EAAE,cAAc,EAAE,eAAe,GAAG,sBAAsB,EAAE,CAAC;AAAA,MAC7E,QACE,MAAM,QAAQ,WAAW,UAAU;AAAA,QACjC,WAAW;AAAA,QACX,cAAc,QAAO;AAAA,QACrB,UAAU;AAAA,QACV,YAAY;AAAA,MACd,CAAC,CACH,EAAE,cAAc,EAAE,OAAO,MAAM,cAAc,UAAU,SAAS,CAAC;AAAA,cACjE;AAAA,MACA,MAAM,SAAS,UAAU,cAAc;AAAA;AAAA,GAE1C;AAAA;AAGH,SAAS,sBAAsB,CAAC,SAAmC;AAAA,EACjE,IAAI,CAAC,QAAQ,YAAY;AAAA,IACvB,MAAM,IAAI,MAAM,4EAA4E;AAAA,EAC9F;AAAA,EACA,IAAI,CAAC,QAAQ,gBAAgB;AAAA,IAC3B,MAAM,IAAI,MACR,gFACF;AAAA,EACF;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,WAAW,CAAC,IAAY,MAAc,UAA0C;AAAA,EACvF,MAAM,MAAM,EAAE,cAAc,QAAO,IAAI,WAAW,GAAG;AAAA,EACrD,OAAO;AAAA,IACL,MAAM,EAAE,MAAM,UAAU,IAAI;AAAA,IAC5B,YAAY;AAAA,MACV,EAAE,MAAM,UAAU,KAAK,YAAY,EAAE,KAAK,EAAE;AAAA,MAC5C,GAAI,WACA;AAAA,QACE;AAAA,UACE,MAAM;AAAA,UACN,KAAK;AAAA,YACH,QAAQ;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ,EAAE,cAAc,QAAO,IAAI,WAAW,SAAS;AAAA,UACzD;AAAA,QACF;AAAA,MACF,IACA,CAAC;AAAA,IACP;AAAA,EACF;AAAA;AAGF,gBAAgB,OAAO,CAAC,QAA0C;AAAA,EAChE,WAAW,SAAS;AAAA,IAAQ,MAAM;AAAA;AAGpC,eAAe,KAAK,CAClB,SACA,OAWA;AAAA,EACA,MAAM,WACJ,MAAM,aAAa,gBACf,YAAY,cAAc,MAAM,YAAY,IAC5C,YAAY,iBAAiB,MAAM,YAAY;AAAA,EACrD,MAAM,aAAa,SAAS;AAAA,EAC5B,MAAM,eAAe;AAAA,IACnB,cAAc,MAAM;AAAA,IACpB,gBAAgB,MAAM;AAAA,IACtB,kBAAkB,YAAY;AAAA,IAC9B,oBAAoB,SAAS;AAAA,IAC7B,eAAe,SAAS;AAAA,EAC1B;AAAA,EACA,MAAM,SAAS;AAAA,IACb,IAAI,MAAM;AAAA,IACV,WAAW;AAAA,EACb;AAAA,EAEA,IAAI,WAAW,SAAS,iCAAiC;AAAA,IACvD,MAAM,SAAQ,MAAM,QAAQ,eAAe,eAAe;AAAA,SACrD;AAAA,MACH,UAAU,KAAK,cAAc,gBAAgB,aAAa,UAAU,YAAY;AAAA,MAChF,QAAQ,EAAE,cAAc,WAAW,aAAa;AAAA,MAChD,gBAAgB,MAAM,kBAAkB;AAAA,IAC1C,CAAC;AAAA,IACD,OAAO,OAAM;AAAA,EACf;AAAA,EAEA,IAAI,WAAW,SAAS,4BAA4B;AAAA,IAClD,MAAM,SAAQ,MAAM,QAAQ,eAAe,eAAe;AAAA,SACrD;AAAA,MACH,UAAU,KAAK,cAAc,gBAAgB,QAAQ,UAAU,cAAc;AAAA,MAC7E,QAAQ;AAAA,QACN,oBAAoB,WAAW;AAAA,QAC/B,oBAAoB,WAAW;AAAA,MACjC;AAAA,IACF,CAAC;AAAA,IACD,OAAO,OAAM;AAAA,EACf;AAAA,EAEA,MAAM,SAAQ,MAAM,QAAQ,eAAe,eAAe;AAAA,OACrD;AAAA,IACH,UAAU,KAAK,cAAc,gBAAgB,UAAU,UAAU,cAAc;AAAA,IAC/E,QAAQ,EAAE,cAAc,WAAW,aAAa;AAAA,EAClD,CAAC;AAAA,EACD,OAAO,OAAM;AAAA;;ACnYf,qBAAS,qBAAU,iBAAQ;AA8B3B,IAAM,aAAY;AAElB,IAAM,UAAS,iBAAiB;AAAA,EAC9B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,IACV,KAAK,MAAM,UAAU;AAAA,MACnB,UAAU;AAAA,MACV,SAAS;AAAA,MACT,OAAO,EAAE,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,UAAU,KAAK;AAAA,IAC3E,CAAC;AAAA,IACD,KAAK,QAAQ,UAAU;AAAA,MACrB,OAAO,EAAE,YAAY,MAAM,MAAM,MAAM,YAAY,MAAM,OAAO,MAAM,UAAU,KAAK;AAAA,IACvF,CAAC;AAAA,EACH;AAAA,EACA,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE;AAClC,CAAC;AAED,IAAM,OAAO,iBAAiB;AAAA,EAC5B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,IACV,KAAK,MAAM,UAAU;AAAA,MACnB,UAAU;AAAA,MACV,SAAS;AAAA,MACT,OAAO,EAAE,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,UAAU,KAAK;AAAA,IAC3E,CAAC;AAAA,IACD,KAAK,QAAQ,UAAU;AAAA,MACrB,OAAO,EAAE,YAAY,MAAM,MAAM,MAAM,YAAY,MAAM,OAAO,MAAM,UAAU,KAAK;AAAA,IACvF,CAAC;AAAA,IACD,KAAK,eAAe,UAAU;AAAA,MAC5B,OAAO,EAAE,YAAY,MAAM,MAAM,KAAK;AAAA,IACxC,CAAC;AAAA,IACD,KAAK,SAAS,UAAU;AAAA,MACtB,UAAU;AAAA,MACV,OAAO,EAAE,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,UAAU,KAAK;AAAA,IAC3E,CAAC;AAAA,IACD,KAAK,YAAY,UAAU;AAAA,MACzB,OAAO,EAAE,YAAY,MAAM,YAAY,MAAM,UAAU,KAAK;AAAA,IAC9D,CAAC;AAAA,IACD,KAAK,YAAY,WAAW;AAAA,MAC1B,OAAO,EAAE,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,OAAO,KAAK;AAAA,IACxE,CAAC;AAAA,IACD,KAAK,UAAU,WAAW,CAAC,UAAU,QAAQ,CAAC,GAAG;AAAA,MAC/C,OAAO,EAAE,YAAY,MAAM,YAAY,MAAM,OAAO,MAAM,OAAO,KAAK;AAAA,IACxE,CAAC;AAAA,IACD,KACE,QACA,EAAE,MAAM,SAAS,OAAO,SAAS,GACjC,EAAE,OAAO,EAAE,YAAY,MAAM,YAAY,KAAK,EAAE,CAClD;AAAA,IACA,KACE,YACA,EAAE,MAAM,OAAO,WAAW,UAAU,aAAa,SAAS,GAC1D,EAAE,OAAO,EAAE,YAAY,MAAM,YAAY,KAAK,EAAE,CAClD;AAAA,IACA,KACE,aACA,EAAE,MAAM,SAAS,OAAO,SAAS,GACjC,EAAE,OAAO,EAAE,YAAY,MAAM,QAAQ,KAAK,EAAE,CAC9C;AAAA,EACF;AAAA,EACA,OAAO,CAAC,KAAK,aAAa,OAAM,CAAC;AAAA,EACjC,QAAQ;AAAA,IACN,aAAa,CAAC,QAAQ,aAAa;AAAA,IACnC,QAAQ,EAAE,UAAU,aAAa,QAAQ,CAAC,QAAQ,aAAa,EAAE;AAAA,EACnE;AACF,CAAC;AAED,IAAM,OAAO,iBAAiB;AAAA,EAC5B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY,CAAC,KAAK,MAAM,UAAU,EAAE,UAAU,MAAM,SAAS,KAAK,CAAC,CAAC;AAAA,EACpE,OAAO,CAAC,KAAK,aAAa,OAAM,CAAC;AACnC,CAAC;AAED,IAAM,QAAQ,iBAAiB;AAAA,EAC7B,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY,CAAC,KAAK,MAAM,UAAU,EAAE,UAAU,MAAM,SAAS,KAAK,CAAC,CAAC;AACtE,CAAC;AAED,IAAM,cAAc,iBAAiB;AAAA,EACnC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,YAAY,CAAC;AACf,CAAC;AAED,IAAM,kBAAkB,iBAAiB;AAAA,EACvC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,YAAY;AAAA,IACV,KAAK,MAAM,UAAU,EAAE,UAAU,MAAM,SAAS,KAAK,CAAC;AAAA,IACtD,KAAK,QAAQ,UAAU,EAAE,OAAO,EAAE,YAAY,MAAM,MAAM,KAAK,EAAE,CAAC;AAAA,IAClE,KAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EACA,QAAQ,EAAE,aAAa,CAAC,MAAM,EAAE;AAClC,CAAC;AAED,IAAM,mBAAmB,iBAAiB;AAAA,EACxC,IAAI;AAAA,EACJ,MAAM;AAAA,EACN,SAAS;AAAA,EACT,YAAY,CAAC,KAAK,SAAS,UAAU,EAAE,OAAO,EAAE,YAAY,MAAM,MAAM,KAAK,EAAE,CAAC,CAAC;AAAA,EACjF,QAAQ,EAAE,aAAa,CAAC,OAAO,EAAE;AACnC,CAAC;AAEM,IAAM,8BAA8B,IAAI,iBAAiB;AAAA,EAC9D,SAAS,CAAC,MAAM,SAAQ,MAAM,OAAO,aAAa,iBAAiB,gBAAgB;AACrF,CAAC;AAUM,SAAS,mCAA6D,CAC3E,OACA,SACM;AAAA,EACN,MAAM,cAAc,OAClB,SAIkB;AAAA,IAClB,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,KAAK;AAAA,QACT,SAAS,QAAQ;AAAA,QACjB,SAAS,8BAA8B;AAAA,UACrC;AAAA,UACA,UAAU;AAAA,UACV;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,cACD;AAAA,MACA,MAAM,QAAQ,WAAW,OAAO;AAAA;AAAA;AAAA,EAIpC,UAAS,OAAO,MAAM;AAAA,IACpB,MAAK,+DAA+D,MAAM;AAAA,MACxE,MAAM,aAAa,qBAAqB;AAAA,QACtC,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,CAAC,MAAM,QAAQ,IAAI;AAAA,YAC/B,OAAO;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,QAAQ,CAAC,QAAQ,eAAe,MAAM;AAAA,cACtC,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,YAChD;AAAA,UACF;AAAA,QACF;AAAA,MACF,CAAC;AAAA,MAED,QAAO,WAAW,IAAI,EAAE,KAAK,OAAO;AAAA,MACpC,IAAI,WAAW,SAAS;AAAA,QAAS;AAAA,MACjC,QAAO,WAAW,KAAK,EAAE,KAAK,CAAC;AAAA,MAC/B,QAAO,WAAW,MAAM,IAAI,EAAE,KAAK,SAAS;AAAA,MAC5C,IAAI,WAAW,MAAM,SAAS;AAAA,QAAW;AAAA,MACzC,QAAO,WAAW,MAAM,UAAU,EAAE,QAAQ,CAAC,MAAM,MAAM,CAAC;AAAA,MAC1D,QAAO,WAAW,MAAM,MAAM,IAAI,EAAE,KAAK,MAAM;AAAA,MAC/C,IAAI,WAAW,MAAM,MAAM,SAAS;AAAA,QAAQ;AAAA,MAC5C,QAAO,WAAW,MAAM,MAAM,MAAM,EAAE,QAAQ,CAAC,QAAQ,aAAa,CAAC;AAAA,MAErE,MAAM,YAAY,oBAChB,EAAE,MAAM,QAAQ,OAAO,SAAS,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG,EAAE,GAChF,EAAE,UAAU,4BAA4B,CAC1C;AAAA,MACA,QAAO,UAAU,MAAM,IAAI,EAAE,KAAK,MAAM;AAAA,MACxC,IAAI,UAAU,MAAM,SAAS,QAAQ;AAAA,QACnC,QAAO,UAAU,MAAM,MAAM,EAAE,cAAc;AAAA,QAC7C,QAAO,UAAU,MAAM,kBAAkB,EAAE,QAAQ;AAAA,WAChD,KAAK,KAAK,CAAC,QAAQ,aAAa;AAAA,QACnC,CAAC;AAAA,MACH;AAAA,KACD;AAAA,IAED,MAAK,yDAAyD,MAAM;AAAA,MAClE,MAAM,SAAS,mCACb;AAAA,QACE,MAAM;AAAA,QACN,WAAW,EAAE,IAAI,MAAM,YAAY,WAAW,OAAO,IAAI;AAAA,QACzD,OAAO;AAAA,UACL,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ,CAAC,UAAU;AAAA,UACnB,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,QAChD;AAAA,MACF,GACA,EAAE,UAAU,4BAA4B,CAC1C;AAAA,MAEA,QAAO,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,EAAE,QACxC,QAAO,gBAAgB;AAAA,QACrB;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC,CACH;AAAA,KACD;AAAA,IAED,MAAK,qDAAqD,YAAY;AAAA,MACpE,MAAM,YAAY,SAAS,SAAS,cAAc;AAAA,QAChD,MAAM,eAAe,QAAQ,kBAAkB;AAAA,QAE/C,QAAO,aAAa,YAAY,EAAE,KAAK,IAAI;AAAA,QAC3C,QAAO,aAAa,YAAY,EAAE,KAAK,IAAI;AAAA,QAC3C,QAAO,aAAa,aAAa,EAAE,KAAK,IAAI;AAAA,QAC5C,QAAO,aAAa,YAAY,EAAE,KAAK,IAAI;AAAA,QAC3C,WAAW,QAAQ;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,GAAY;AAAA,UACV,QAAO,aAAa,QAAQ,KAAK,EAAE,KAAK,IAAI;AAAA,QAC9C;AAAA,QACA,WAAW,MAAM;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,GAAY;AAAA,UACV,QAAO,aAAa,eAAe,GAAG,EAAE,KAAK,IAAI;AAAA,QACnD;AAAA,QACA,QAAO,aAAa,WAAW,QAAQ,EAAE,KAAK,IAAI;AAAA,QAClD,QAAO,aAAa,qBAAqB,QAAQ,EAAE,KAAK,IAAI;AAAA,QAC5D,QAAO,aAAa,qBAAqB,QAAQ,EAAE,KAAK,IAAI;AAAA,QAC5D,QAAO,aAAa,QAAQ,KAAK,EAAE,KAAK,IAAI;AAAA,QAC5C,QAAO,aAAa,QAAQ,SAAS,EAAE,KAAK,IAAI;AAAA,QAChD,QAAO,aAAa,QAAQ,QAAQ,EAAE,KAAK,IAAI;AAAA,OAChD;AAAA,KACF;AAAA,IAED,MAAK,mFAAmF,YAAY;AAAA,MAClG,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,SAAS,MAAM,mBACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,CAAC,MAAM,QAAQ,UAAU;AAAA,YACrC,OAAO;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,YAAY,WAAW,OAAO,CAAC;AAAA,gBACxE,OAAO;AAAA,kBACL,MAAM;AAAA,kBACN,WAAW;AAAA,oBACT,IAAI;AAAA,oBACJ,OAAO;AAAA,sBACL,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,SAAS;AAAA,sBAClD,EAAE,IAAI,OAAO,YAAY,QAAQ,OAAO,eAAe;AAAA,sBACvD,EAAE,IAAI,OAAO,YAAY,YAAY,OAAO,GAAG;AAAA,sBAC/C,EAAE,IAAI,OAAO,YAAY,YAAY,OAAO,GAAG;AAAA,sBAC/C,EAAE,IAAI,MAAM,YAAY,SAAS,QAAQ,CAAC,GAAG,EAAE;AAAA,sBAC/C,EAAE,IAAI,YAAY,YAAY,QAAQ,OAAO,MAAM;AAAA,sBACnD;AAAA,wBACE,IAAI;AAAA,wBACJ,OAAO;AAAA,0BACL,EAAE,IAAI,YAAY,YAAY,QAAQ,OAAO,QAAQ;AAAA,0BACrD,EAAE,IAAI,YAAY,YAAY,YAAY,OAAO,OAAO;AAAA,wBAC1D;AAAA,sBACF;AAAA,sBACA,EAAE,IAAI,OAAO,MAAM,EAAE,IAAI,MAAM,YAAY,MAAM,OAAO,UAAU,EAAE;AAAA,oBACtE;AAAA,kBACF;AAAA,kBACA,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,gBAChD;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,QAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACxC,QAAO,IAAI,MAAM,CAAC,EAAE,QAAQ,CAAC,aAAa,YAAY,CAAC;AAAA,QACvD,QAAO,OAAO,QAAQ,IAAI,UAAU,EAAE,QAAQ;AAAA,UAC5C,IAAI;AAAA,UACJ,MAAM;AAAA,UACN,UAAU;AAAA,QACZ,CAAC;AAAA,QACD,QAAO,OAAO,KAAK,EAAE,KAAK,CAAC;AAAA,QAC3B,QAAO,OAAO,OAAO,EAAE,KAAK,KAAK;AAAA,OAClC;AAAA,KACF;AAAA,IAED,MAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,WAAW,MAAM,mBACrB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,MAAM,WAAW,MAAM,CAAC;AAAA,YACjE,OAAO;AAAA,cACL,MAAM;AAAA,cACN,WAAW;AAAA,gBACT,IAAI;AAAA,gBACJ,OAAO;AAAA,kBACL,EAAE,IAAI,MAAM,YAAY,SAAS,OAAO,KAAK;AAAA,kBAC7C,EAAE,IAAI,UAAU,YAAY,SAAS,OAAO,MAAM;AAAA,gBACpD;AAAA,cACF;AAAA,cACA,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,YAChD;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,eAAe,MAAM,mBACzB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,MAAM,WAAW,MAAM,CAAC;AAAA,YACjE,OAAO;AAAA,cACL,MAAM;AAAA,cACN,WAAW;AAAA,gBACT,IAAI;AAAA,gBACJ,OAAO;AAAA,kBACL,EAAE,IAAI,OAAO,YAAY,SAAS,OAAO,IAAI;AAAA,kBAC7C,EAAE,IAAI,MAAM,YAAY,SAAS,QAAQ,CAAC,KAAK,IAAI,EAAE;AAAA,gBACvD;AAAA,cACF;AAAA,cACA,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,YAChD;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,eAAe,MAAM,mBACzB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,MAAM,WAAW,MAAM,CAAC;AAAA,YACjE,OAAO;AAAA,cACL,MAAM;AAAA,cACN,WAAW,EAAE,IAAI,OAAO,YAAY,SAAS,OAAO,KAAK;AAAA,cACzD,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,YAChD;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,cAAc,MAAM,mBACxB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,MAAM,WAAW,MAAM,CAAC;AAAA,YACjE,OAAO;AAAA,cACL,MAAM;AAAA,cACN,WAAW,EAAE,IAAI,OAAO,MAAM,EAAE,IAAI,MAAM,YAAY,SAAS,OAAO,IAAI,EAAE;AAAA,cAC5E,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,YAChD;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,QAAO,IAAI,QAAQ,CAAC,EAAE,QAAQ,CAAC,sBAAsB,iBAAiB,CAAC;AAAA,QACvE,QAAO,IAAI,YAAY,CAAC,EAAE,QAAQ,CAAC,cAAc,iBAAiB,CAAC;AAAA,QACnE,QAAO,IAAI,YAAY,CAAC,EAAE,QAAQ;AAAA,UAChC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD,QAAO,IAAI,WAAW,CAAC,EAAE,QAAQ,CAAC,cAAc,sBAAsB,iBAAiB,CAAC;AAAA,OACzF;AAAA,KACF;AAAA,IAED,MAAK,uEAAuE,YAAY;AAAA,MACtF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,QAAqB;AAAA,UACzB,MAAM;AAAA,UACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,YAAY,WAAW,OAAO,CAAC;AAAA,UACxE,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW,EAAE,IAAI,UAAU,YAAY,YAAY,OAAO,KAAK;AAAA,YAC/D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,UAChD;AAAA,QACF;AAAA,QACA,MAAM,QAAQ,MAAM,mBAClB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,CAAC,IAAI;AAAA,YACjB,OAAO,EAAE,MAAM,QAAQ,UAAU,GAAG,MAAM;AAAA,UAC5C;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,QAAQ,MAAM,mBAClB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,CAAC,IAAI;AAAA,YACjB,OAAO,EAAE,MAAM,QAAQ,UAAU,GAAG,WAAW,MAAM,eAAe,MAAM;AAAA,UAC5E;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,QAAO,MAAM,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACvC,QAAO,IAAI,KAAK,CAAC,EAAE,QAAQ,CAAC,aAAa,YAAY,CAAC;AAAA,QACtD,QAAO,MAAM,QAAQ,IAAI,CAAC,QAAQ,IAAI,UAAU,CAAC,EAAE,QAAQ;AAAA,UACzD,EAAE,IAAI,YAAY;AAAA,UAClB,EAAE,IAAI,aAAa;AAAA,QACrB,CAAC;AAAA,QACD,QAAO,MAAM,OAAO,EAAE,KAAK,IAAI;AAAA,QAC/B,QAAO,MAAM,aAAa,EAAE,WAAW;AAAA,QACvC,QAAO,IAAI,KAAK,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC;AAAA,OAC1C;AAAA,KACF;AAAA,IAED,MAAK,sDAAsD,YAAY;AAAA,MACrE,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,UAAU,MAAM,mBACpB;AAAA,UACE;AAAA,UACA,cAAc;AAAA,UACd,OAAO,EAAE,MAAM,SAAS,OAAO,GAAG,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG,EAAE;AAAA,QACpF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,OAAO,MAAM,mBACjB;AAAA,UACE;AAAA,UACA,cAAc;AAAA,UACd,OAAO,EAAE,MAAM,QAAQ,UAAU,GAAG,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG,EAAE;AAAA,QACtF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,gBAAgB,MAAM,mBAC1B;AAAA,UACE;AAAA,UACA,cAAc;AAAA,UACd,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,YAAY,WAAW,OAAO,CAAC;AAAA,YACxE,OAAO,EAAE,MAAM,SAAS,OAAO,GAAG,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG,EAAE;AAAA,UACpF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,QAAO,QAAQ,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACzC,QAAO,IAAI,OAAO,CAAC,EAAE,QAAQ,CAAC,cAAc,WAAW,CAAC;AAAA,QACxD,QAAO,QAAQ,KAAK,EAAE,cAAc;AAAA,QACpC,QAAO,QAAQ,OAAO,EAAE,KAAK,IAAI;AAAA,QACjC,QAAO,IAAI,IAAI,CAAC,EAAE,QAAQ,CAAC,cAAc,WAAW,CAAC;AAAA,QACrD,QAAO,KAAK,KAAK,EAAE,cAAc;AAAA,QACjC,QAAO,KAAK,OAAO,EAAE,KAAK,IAAI;AAAA,QAC9B,QAAO,KAAK,aAAa,EAAE,WAAW;AAAA,QACtC,QAAO,IAAI,aAAa,CAAC,EAAE,QAAQ,CAAC,aAAa,YAAY,CAAC;AAAA,QAC9D,QAAO,cAAc,KAAK,EAAE,cAAc;AAAA,QAC1C,QAAO,cAAc,OAAO,EAAE,KAAK,IAAI;AAAA,OACxC;AAAA,KACF;AAAA,IAED,MAAK,kDAAkD,YAAY;AAAA,MACjE,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,SAAS,MAAM,aACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,SAAS;AAAA,YAC7D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,UAChD;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,UAAU,MAAM,aACpB;AAAA,UACE;AAAA,UACA,OAAO,EAAE,MAAM,SAAS,OAAO,GAAG,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG,EAAE;AAAA,QACpF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,QAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACxC,QAAO,OAAO,KAAK,EAAE,KAAK,CAAC;AAAA,QAC3B,QAAO,QAAQ,KAAK,EAAE,KAAK,CAAC;AAAA,OAC7B;AAAA,KACF;AAAA,IAED,MAAK,2CAA2C,YAAY;AAAA,MAC1D,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,SAAS,MAAM,cACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,SAAS;AAAA,YAC7D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,UAChD;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,UAAU,MAAM,cACpB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW,EAAE,IAAI,MAAM,YAAY,QAAQ,OAAO,eAAe;AAAA,YACjE,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,UAChD;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,UAAU,MAAM,cACpB;AAAA,UACE;AAAA,UACA,OAAO,EAAE,MAAM,SAAS,OAAO,GAAG,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG,EAAE;AAAA,QACpF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,QAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACxC,QAAO,OAAO,MAAM,EAAE,KAAK,IAAI;AAAA,QAC/B,QAAO,QAAQ,MAAM,EAAE,KAAK,KAAK;AAAA,QACjC,QAAO,QAAQ,MAAM,EAAE,KAAK,IAAI;AAAA,OACjC;AAAA,KACF;AAAA,IAED,MAAK,qEAAqE,YAAY;AAAA,MACpF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QACzC,MAAM,QAAqB;AAAA,UACzB,MAAM;AAAA,UACN,QAAQ,CAAC,EAAE,MAAM,YAAY,CAAC;AAAA,UAC9B,OAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,UAChD;AAAA,QACF;AAAA,QAEA,MAAM,QAAQ,MAAM,aAClB,EAAE,uBAAW,MAAM,GACnB,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,SAAS,MAAM,cACnB,EAAE,uBAAW,MAAM,GACnB,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,QAAO,MAAM,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACvC,IAAI,MAAM,KAAK,SAAS;AAAA,UAAY;AAAA,QACpC,QAAO,MAAM,KAAK,MAAM,IAAI,EAAE,KAAK,MAAM;AAAA,QACzC,QAAO,MAAM,KAAK,EAAE,KAAK,CAAC;AAAA,QAC1B,QAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACxC,IAAI,OAAO,KAAK,SAAS;AAAA,UAAY;AAAA,QACrC,QAAO,OAAO,KAAK,MAAM,IAAI,EAAE,KAAK,MAAM;AAAA,QAC1C,QAAO,OAAO,MAAM,EAAE,KAAK,IAAI;AAAA,OAChC;AAAA,KACF;AAAA,IAED,MAAK,0EAA0E,YAAY;AAAA,MACzF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,SAAS,MAAM,aACnB;AAAA,UACE;AAAA,UACA,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,UAC9C,QAAQ;AAAA,YACN,EAAE,YAAY,UAAU,OAAO,GAAG;AAAA,YAClC,EAAE,YAAY,YAAY,OAAO,GAAG;AAAA,UACtC;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,UAAU,MAAM,aACpB;AAAA,UACE;AAAA,UACA,OAAO,EAAE,MAAM,SAAS,OAAO,GAAG,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG,EAAE;AAAA,UAClF,QAAQ;AAAA,YACN,EAAE,YAAY,UAAU,OAAO,GAAG;AAAA,YAClC,EAAE,YAAY,YAAY,OAAO,GAAG;AAAA,UACtC;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,QAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACxC,QAAO,OAAO,MAAM,EAAE,QAAQ;AAAA,UAC5B;AAAA,YACE,YAAY;AAAA,YACZ,SAAS;AAAA,cACP,EAAE,OAAO,UAAU,OAAO,EAAE;AAAA,cAC5B,EAAE,OAAO,UAAU,OAAO,EAAE;AAAA,YAC9B;AAAA,UACF;AAAA,UACA;AAAA,YACE,YAAY;AAAA,YACZ,SAAS;AAAA,cACP,EAAE,OAAO,OAAO,OAAO,EAAE;AAAA,cACzB,EAAE,OAAO,MAAM,OAAO,EAAE;AAAA,YAC1B;AAAA,UACF;AAAA,QACF,CAAC;AAAA,QACD,QAAO,QAAQ,MAAM,EAAE,QAAQ,OAAO,MAAM;AAAA,OAC7C;AAAA,KACF;AAAA,IAED,MAAK,4CAA4C,YAAY;AAAA,MAC3D,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,WAAW,MAAM,mBACrB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,OAAO;AAAA,cACL,MAAM;AAAA,cACN,WAAW,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,SAAS;AAAA,cAC7D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,YAChD;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,WAAW,MAAM,mBACrB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,OAAO,EAAE,MAAM,SAAS,cAAc,QAAO,GAAG;AAAA,UAClD;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,gBAAgB,MAAM,mBAC1B;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,oBAAoB,KAAK;AAAA,YACzB,OAAO,EAAE,MAAM,SAAS,cAAc,QAAO,GAAG;AAAA,UAClD;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,gBAAgB,MAAM,mBAC1B;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,WAAW;AAAA,YACX,QAAQ;AAAA,YACR,oBAAoB,KAAK;AAAA,YACzB,OAAO,EAAE,MAAM,SAAS,cAAc,QAAO,GAAG;AAAA,UAClD;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,YAAY,MAAM,mBACtB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,QAAQ;AAAA,cACN;AAAA,gBACE,MAAM;AAAA,gBACN,WAAW,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,SAAS;AAAA,gBAC7D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,cAChD;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,gBACN,WAAW,EAAE,IAAI,YAAY,YAAY,QAAQ,OAAO,MAAM;AAAA,gBAC9D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,cAChD;AAAA,YACF;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QACA,MAAM,WAAW,MAAM,mBACrB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,IAAI;AAAA,YACJ,QAAQ;AAAA,cACN;AAAA,gBACE,MAAM;AAAA,gBACN,WAAW,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,SAAS;AAAA,gBAC7D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,cAChD;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,gBACN,WAAW,EAAE,IAAI,YAAY,YAAY,QAAQ,OAAO,QAAQ;AAAA,gBAChE,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,cAChD;AAAA,YACF;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,QAAO,SAAS,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QAC1C,QAAO,SAAS,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QAC1C,QAAO,UAAU,QAAQ,CAAC,EAAE,QAAQ,CAAC,oBAAoB,eAAe,CAAC;AAAA,QACzE,QAAO,UAAU,QAAQ,CAAC,EAAE,QAAQ,CAAC,cAAc,aAAa,UAAU,CAAC;AAAA,QAC3E,QAAO,cAAc,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QAC/C,QAAO,UAAU,aAAa,CAAC,EAAE,QAAQ,CAAC,cAAc,WAAW,CAAC;AAAA,QACpE,QAAO,UAAU,aAAa,CAAC,EAAE,QAAQ,CAAC,UAAU,CAAC;AAAA,QACrD,QAAO,UAAU,SAAS,CAAC,EAAE,QAAQ,CAAC,cAAc,WAAW,CAAC;AAAA,QAChE,QAAO,IAAI,QAAQ,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC;AAAA,OAC5C;AAAA,KACF;AAAA,IAED,MAAK,sEAAsE,YAAY;AAAA,MACrF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,WAAW,MAAM,mBACrB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,CAAC,EAAE,QAAQ,aAAa,WAAW,WAAW,CAAC;AAAA,YAC3D,OAAO;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,WAAW,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,SAAS;AAAA,gBAC7D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,cAChD;AAAA,YACF;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAKA,MAAM,aAAa,QAAQ,kBAAkB,EAAE,OAAO,SAAS,aAAa;AAAA,QAC5E,QAAO,SAAS,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QAC1C,QAAO,YAAY,UAAU,cAAc,WAAW,CAAC,EAAE,QAAQ,CAAC,kBAAkB,CAAC;AAAA,QACrF,QAAO,YAAY,UAAU,aAAa,WAAW,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;AAAA,QAEjF,MAAM,WAAW,MAAM,mBACrB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,YAAY,CAAC,EAAE,QAAQ,aAAa,WAAW,WAAW,CAAC;AAAA,YAC3D,OAAO;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,OAAO,EAAE,MAAM,SAAS,cAAc,QAAO,GAAG;AAAA,YAClD;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAGA,QAAO,SAAS,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QAC1C,QAAO,YAAY,UAAU,oBAAoB,WAAW,CAAC,EAAE,QAAQ;AAAA,UACrE;AAAA,UACA;AAAA,QACF,CAAC;AAAA,QACD,QAAO,YAAY,UAAU,iBAAiB,WAAW,CAAC,EAAE,QAAQ,CAAC,WAAW,CAAC;AAAA,OAClF;AAAA,KACF;AAAA,IAED,MAAK,iFAAiF,YAAY;AAAA,MAChG,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,SAAS,MAAM,mBACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,OAAO,EAAE,MAAM,SAAS,cAAc,MAAM,IAAI,iBAAiB,KAAK;AAAA,UACxE;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,QAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACxC,QAAO,UAAU,MAAM,CAAC,EAAE,QAAQ,CAAC,cAAc,UAAU,CAAC;AAAA,OAC7D;AAAA,KACF;AAAA,IAED,MAAK,+DAA+D,YAAY;AAAA,MAC9E,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QAEzC,MAAM,SAAS,MAAM,mBACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,QAAQ,WAAW,MAAM,CAAC;AAAA,YACnE,OAAO;AAAA,cACL,MAAM;AAAA,cACN,OAAO;AAAA,cACP,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,YAChD;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,QAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACxC,QAAO,IAAI,MAAM,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC;AAAA,OAC3C;AAAA,KACF;AAAA,IAED,MAAK,0EAA0E,YAAY;AAAA,MACzF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,QAAQ,KAAK;AAAA,UACjB,SAAS;AAAA,YACP;AAAA,cACE,KAAK,EAAE,cAAc,gBAAgB,IAAI,WAAW,eAAe;AAAA,cACnE,YAAY,EAAE,IAAI,gBAAgB,MAAM,YAAY,OAAO,SAAS;AAAA,YACtE;AAAA,YACA;AAAA,cACE,KAAK,EAAE,cAAc,iBAAiB,IAAI,WAAW,gBAAgB;AAAA,cACrE,YAAY,EAAE,IAAI,iBAAiB,MAAM,YAAY,OAAO,SAAS;AAAA,YACvE;AAAA,UACF;AAAA,QACF,CAAC;AAAA,QAED,MAAM,SAAS,MAAM,mBACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,OAAO;AAAA,cACL,MAAM;AAAA,cACN,cAAc,gBAAgB;AAAA,cAC9B,iBAAiB;AAAA,YACnB;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,QAEA,QAAO,IAAI,MAAM,CAAC,EAAE,QAAQ,CAAC,eAAe,CAAC;AAAA,OAC9C;AAAA,KACF;AAAA,IAED,MAAK,4EAA4E,YAAY;AAAA,MAC3F,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QACzC,MAAM,QAAqB;AAAA,UACzB,MAAM;AAAA,UACN,QAAQ,CAAC,EAAE,MAAM,YAAY,CAAC;AAAA,UAC9B,OAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,UAChD;AAAA,QACF;AAAA,QAEA,IAAI,QAAQ,kBAAkB,EAAE,WAAW,cAAc,MAAM;AAAA,UAC7D,MAAM,SAAS,MAAM,mBACnB,EAAE,uBAAW,MAAM,GACnB,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,UACA,QAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,UACxC,QAAO,IAAI,MAAM,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC;AAAA,UAC1C;AAAA,QACF;AAAA,QAEA,MAAM,oBACJ,mBACE,EAAE,uBAAW,MAAM,GACnB,EAAE,UAAU,6BAA6B,QAAQ,CACnD,GACA,yBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,wEAAwE,YAAY;AAAA,MACvF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QACzC,MAAM,QAAqB;AAAA,UACzB,MAAM;AAAA,UACN,YAAY;AAAA,UACZ,QAAQ,CAAC,GAAG,CAAC;AAAA,UACb,GAAG;AAAA,UACH,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,QAChD;AAAA,QAEA,IAAI,QAAQ,kBAAkB,EAAE,OAAO,WAAW,MAAM;AAAA,UACtD,MAAM,SAAS,MAAM,mBACnB,EAAE,uBAAW,MAAM,GACnB,EAAE,UAAU,6BAA6B,QAAQ,CACnD;AAAA,UACA,QAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,UACxC,QAAO,IAAI,MAAM,CAAC,EAAE,QAAQ,CAAC,cAAc,WAAW,CAAC;AAAA,UACvD;AAAA,QACF;AAAA,QAEA,MAAM,oBACJ,mBACE,EAAE,uBAAW,MAAM,GACnB,EAAE,UAAU,6BAA6B,QAAQ,CACnD,GACA,0BACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,MAAK,wEAAwE,YAAY;AAAA,MACvF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QACzC,MAAM,kBAAkB,qBAAqB,OAAO;AAAA,QAEpD,MAAM,SAAS,MAAM,mBACnB;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,OAAO;AAAA,cACL,MAAM;AAAA,cACN,QAAQ,CAAC,EAAE,MAAM,YAAY,YAAY,QAAQ,WAAW,MAAM,CAAC;AAAA,cACnE,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN,WAAW,EAAE,IAAI,MAAM,YAAY,UAAU,OAAO,SAAS;AAAA,gBAC7D,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,cAChD;AAAA,YACF;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,SAAS,iBAAiB,iBAAiB,GAAG,CACzF;AAAA,QAEA,QAAO,OAAO,KAAK,IAAI,EAAE,KAAK,UAAU;AAAA,QACxC,QAAO,IAAI,MAAM,CAAC,EAAE,QAAQ,CAAC,cAAc,WAAW,CAAC;AAAA,OACxD;AAAA,KACF;AAAA,IAED,MAAK,0EAA0E,YAAY;AAAA,MACzF,MAAM,YAAY,SAAS,SAAS,SAAS,cAAc;AAAA,QACzD,MAAM,4BAA4B,OAAO;AAAA,QACzC,MAAM,kBAAkB,qBAAqB,OAAO;AAAA,QAEpD,MAAM,oBACJ,mBACE;AAAA,UACE;AAAA,UACA,OAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,YACP,OAAO;AAAA,cACL,MAAM;AAAA,cACN,WAAW;AAAA,cACX,QAAQ;AAAA,cACR,OAAO,EAAE,MAAM,SAAS,cAAc,KAAK,GAAG;AAAA,YAChD;AAAA,UACF;AAAA,QACF,GACA,EAAE,UAAU,6BAA6B,SAAS,iBAAiB,iBAAiB,GAAG,CACzF,GACA,6BACF;AAAA,OACD;AAAA,KACF;AAAA,GACF;AAAA;AAGH,eAAsB,2BAA2B,CAAC,SAAiD;AAAA,EACjG,MAAM,QAAQ,KAAK;AAAA,IACjB,SAAS;AAAA,MACP,WAAW,KAAK,IAAI,cAAc;AAAA,QAChC,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM,CAAC,OAAO,OAAO;AAAA,QACrB,UAAU,EAAE,MAAM,QAAQ;AAAA,QAC1B,WAAW,CAAC,GAAG,CAAC;AAAA,MAClB,CAAC;AAAA,MACD,WAAW,KAAK,IAAI,aAAa;AAAA,QAC/B,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM,CAAC,KAAK;AAAA,QACZ,UAAU,EAAE,MAAM,QAAQ;AAAA,QAC1B,WAAW,CAAC,KAAK,GAAG;AAAA,MACtB,CAAC;AAAA,MACD,WAAW,KAAK,IAAI,cAAc;AAAA,QAChC,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,OAAO;AAAA,QACP,UAAU;AAAA,QACV,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM,CAAC,QAAQ;AAAA,QACf,UAAU,EAAE,MAAM,QAAQ;AAAA,QAC1B,WAAW,CAAC,GAAG,CAAC;AAAA,MAClB,CAAC;AAAA,MACD,WAAW,KAAK,IAAI,mBAAmB;AAAA,QACrC,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,OAAO;AAAA,QACP,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM,CAAC;AAAA,QACP,UAAU,CAAC;AAAA,QACX,WAAW,CAAC,GAAG,CAAC;AAAA,MAClB,CAAC;AAAA,MACD,WAAW,KAAK,IAAI,sBAAsB;AAAA,QACxC,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,MAAM,CAAC;AAAA,QACP,UAAU,CAAC;AAAA,QACX,WAAW,CAAC,GAAG,CAAC;AAAA,MAClB,CAAC;AAAA,MACD,WAAW,QAAO,IAAI,oBAAoB;AAAA,QACxC,IAAI;AAAA,QACJ,MAAM;AAAA,MACR,CAAC;AAAA,MACD,WAAW,QAAO,IAAI,iBAAiB,EAAE,IAAI,iBAAiB,MAAM,SAAS,CAAC;AAAA,MAC9E,WAAW,MAAM,IAAI,cAAc,EAAE,IAAI,aAAa,CAAC;AAAA,MACvD,WAAW,YAAY,IAAI,YAAY,EAAE,IAAI,WAAW,CAAC;AAAA,MACzD,WAAW,KAAK,IAAI,YAAY,EAAE,IAAI,WAAW,CAAC;AAAA,IACpD;AAAA,IACA,OAAO;AAAA,MACL,SAAS,KAAK,IAAI,cAAc,aAAa,QAAO,IAAI,kBAAkB;AAAA,MAC1E,SAAS,KAAK,IAAI,aAAa,aAAa,QAAO,IAAI,eAAe;AAAA,MACtE,SAAS,KAAK,IAAI,YAAY,aAAa,QAAO,IAAI,kBAAkB;AAAA,IAC1E;AAAA,EACF,CAAC;AAAA;AAGH,SAAS,UAAU,CACjB,cACA,WACA,YAC2B;AAAA,EAC3B,OAAO;AAAA,IACL,KAAK,EAAE,cAAc,UAAU;AAAA,IAC/B;AAAA,EACF;AAAA;AAGF,SAAS,QAAQ,CACf,cACA,UACA,QACA,cACA,UACyB;AAAA,EACzB,OAAO;AAAA,IACL,KAAK;AAAA,MACH,QAAQ,EAAE,cAAc,cAAc,WAAW,SAAS;AAAA,MAC1D;AAAA,MACA,QAAQ,EAAE,cAAc,cAAc,WAAW,SAAS;AAAA,IAC5D;AAAA,EACF;AAAA;AAGF,SAAS,GAAG,CAAC,QAAsC;AAAA,EACjD,OAAO,OAAO,QAAQ,IAAI,CAAC,QAAQ,IAAI,SAAS;AAAA;AAIlD,SAAS,WAAW,CAAC,QAA4B,UAAkB,QAA0B;AAAA,EAC3F,MAAM,SAAS,OAAO,QAAQ,KAAK,CAAC,QAAQ,IAAI,cAAc,QAAQ;AAAA,EACtE,IAAI,CAAC;AAAA,IAAQ,MAAM,IAAI,MAAM,eAAe,qBAAqB;AAAA,EACjE,MAAM,QAAQ,OAAO,QAAQ;AAAA,EAC7B,IAAI,CAAC,MAAM,QAAQ,KAAK;AAAA,IAAG,MAAM,IAAI,MAAM,qCAAqC,SAAS;AAAA,EACzF,OAAO,MAAM,IAAI,CAAC,WAAW,OAAO,SAAS,EAAE,KAAK;AAAA;AAGtD,SAAS,SAAS,CAAC,QAAsC;AAAA,EACvD,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,KAAK;AAAA;AAG/B,SAAS,oBAAoB,CAAC,SAAuC;AAAA,EACnE,OAAO,IAAI,MAAM,SAAS;AAAA,IACxB,GAAG,CAAC,QAAQ,UAAU,UAAU;AAAA,MAC9B,IAAI,aAAa;AAAA,QAAqB,OAAO,OAAO,EAAE,cAAc,MAAM;AAAA,MAC1E,IAAI,aAAa;AAAA,QAAgB;AAAA,MAEjC,MAAM,QAAQ,QAAQ,IAAI,QAAQ,UAAU,QAAQ;AAAA,MACpD,OAAO,OAAO,UAAU,aAAa,MAAM,KAAK,MAAM,IAAI;AAAA;AAAA,EAE9D,CAAC;AAAA;AAGH,eAAe,mBAAmB,CAAC,SAA2B,MAA6B;AAAA,EACzF,IAAI;AAAA,IACF,MAAM;AAAA,IACN,OAAO,OAAO;AAAA,IACd,QAAO,KAAK,EAAE,eAAe,wBAAwB;AAAA,IACrD,IAAI,iBAAiB,0BAA0B;AAAA,MAC7C,QAAO,MAAM,OAAO,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC,EAAE,UAAU,IAAI;AAAA,IAChE;AAAA,IACA;AAAA;AAAA,EAGF,MAAM,IAAI,MAAM,gDAAgD,OAAO;AAAA;;ACnrCzE,qBAAS,qBAAU,kBAAQ;AAmC3B,IAAM,sBAAsB,CAC1B,WACA,eAAe,wBACwE;AAAA,EACvF;AAAA,EACA,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,gBAAgB;AAAA,IACd,WAAW;AAAA,IACX;AAAA,IACA,WAAW,WAAW,UAAU,SAAS,GAAG,GAAG;AAAA,EACjD;AAAA,EACA,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,eAAe;AACjB;AAEA,IAAM,wBAAwB;AAAA,EAC5B,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,gBAAgB;AAAA,EAChB,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,cAAc;AAAA,EACd,cAAc;AAAA,EACd,gBAAgB;AAClB;AAkBO,SAAS,+BAAgF,CAC9F,OACA,SACM;AAAA,EACN,MAAM,cAAc,OAAO,SAA8D;AAAA,IACvF,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,QAAQ,QAAQ,OAAO;AAAA,MAC7B,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA;AAAA,EAInC,UAAS,OAAO,MAAM;AAAA,IACpB,OAAK,2EAA2E,YAAY;AAAA,MAC1F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,gBAAgB,SAAS,YAAY;AAAA,QAC3C,MAAM,SAAS,MAAM,QAAQ,SAAS,QAAQ,QAAQ;AAAA,UACpD,WAAW;AAAA,UACX,IAAI;AAAA,QACN,CAAC;AAAA,QACD,SAAO,MAAM,EAAE,cAAc;AAAA,UAC3B,IAAI;AAAA,UACJ,gBAAgB;AAAA,UAChB,aAAa;AAAA,UACb,QAAQ,EAAE,UAAU,aAAa;AAAA,QACnC,CAAC;AAAA,QACD,SACE,MAAM,QAAQ,SAAS,QAAQ,oBAAoB;AAAA,UACjD,WAAW;AAAA,UACX,gBAAgB;AAAA,QAClB,CAAC,CACH,EAAE,QAAQ,MAAM;AAAA,QAEhB,MAAM,SAAO,gBAAgB,SAAS,YAAY,CAAC,EAAE,QAAQ,cAAc;AAAA,UACzE,MAAM;AAAA,QACR,CAAC;AAAA,QACD,MAAM,YAAY,gBAAgB,mBAAmB,cAAc,CAAC;AAAA,QAClE,UAAU,OAAsC,iBAAiB;AAAA,QACjE,UAAU,OAAmC,cAAc;AAAA,QAC7D,MAAM,SACJ,QAAQ,YAAY,OAAO,OAAO;AAAA,UAChC,MAAM,GAAG,SAAS,iBAAiB,MAAM,SAAS;AAAA,SACnD,CACH,EAAE,QAAQ,cAAc,EAAE,MAAM,cAAc,CAAC;AAAA,QAE/C,MAAM,OAAO,MAAM,QAAQ,SAAS,QAAQ,KAAK;AAAA,UAC/C,WAAW;AAAA,UACX,OAAO;AAAA,UACP,QAAQ;AAAA,QACV,CAAC;AAAA,QACD,SAAO,IAAI,EAAE,cAAc,EAAE,OAAO,GAAG,SAAS,MAAM,CAAC;AAAA,QACvD,SAAO,KAAK,QAAQ,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,EAAE,QAAQ,CAAC,YAAY,CAAC;AAAA,OACvE;AAAA,KACF;AAAA,IAED,OAAK,yEAAyE,YAAY;AAAA,MACxF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAS,mBAAmB,kBAAkB;AAAA,QACpD,MAAM,SAAO,QAAQ,SAAS,iBAAiB,MAAM,MAAM,CAAC,EAAE,QAAQ,QACpE,4BACF;AAAA,QAEA,MAAM,SACJ,kBAAkB,SAAS,sBAAsB,EAAE,cAAc,KAAK,CAAC,CACzE,EAAE,QAAQ,QAAQ,oCAAoC;AAAA,QACtD,SACE,MAAM,QAAQ,QAAQ,eAAe;AAAA,UACnC,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW;AAAA,QACb,CAAC,CACH,EAAE,SAAS;AAAA,QACX,SACE,MAAM,QAAQ,SAAS,QAAQ,QAAQ;AAAA,UACrC,WAAW;AAAA,UACX,IAAI;AAAA,QACN,CAAC,CACH,EAAE,SAAS;AAAA,QACX,SACE,MAAM,QAAQ,SAAS,OAAO,MAAM;AAAA,UAClC,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC,CACH,EAAE,QAAQ,CAAC,CAAC;AAAA,QAEZ,IAAI;AAAA,QACJ,MAAM,SACJ,QAAQ,YAAY,OAAO,OAAO;AAAA,UAChC,gBAAgB,MAAM,GAAG,SAAS,iBAAiB,MACjD,mBAAmB,gBAAgB,CACrC;AAAA,SACD,CACH,EAAE,QAAQ,QAAQ,oCAAoC;AAAA,QACtD,IAAI,CAAC;AAAA,UAAe,MAAM,IAAI,MAAM,uCAAuC;AAAA,QAC3E,MAAM,eAAe;AAAA,QACrB,MAAM,QAAQ,YAAY,OAAO,OAAO;AAAA,UACtC,MAAM,SACJ,GAAG,SAAS,iBAAiB,SAAS;AAAA,YACpC,SAAS;AAAA,YACT,cAAc;AAAA,cACZ,mBAAmB,CAAC;AAAA,cACpB,QAAQ,mBAAmB,gBAAgB;AAAA,YAC7C;AAAA,UACF,CAAC,CACH,EAAE,QAAQ,QAAQ,UAAU;AAAA,SAC7B;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,mFAAmF,YAAY;AAAA,MAClG,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAAW,oBAAoB,IAAI;AAAA,QACzC,MAAM,UAAU,MAAM,QAAQ,eAAe,eAAe;AAAA,UAC1D,IAAI;AAAA,UACJ,WAAW;AAAA,UACX;AAAA,UACA,QAAQ,EAAE,cAAc,iBAAiB;AAAA,QAC3C,CAAC;AAAA,QACD,MAAM,aAAY,QAAQ;AAAA,QAC1B,MAAM,SAAS,EAAE,cAAc,SAAS,aAAa;AAAA,QACrD,MAAM,SACJ,QAAQ,SAAS,QAAQ,qBAAqB;AAAA,UAC5C,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,gBAAgB;AAAA,UAChB,UAAU;AAAA,UACV,gBAAgB,SAAS;AAAA,UACzB,oBAAoB,SAAS;AAAA,UAC7B,eAAe,SAAS;AAAA,UACxB,kBAAkB,SAAS;AAAA,UAC3B,WAAW;AAAA,QACb,CAAC,CACH,EAAE,QAAQ,QAAQ,UAAU;AAAA,QAC5B,MAAM,QAAQ,SAAS,QAAQ,qBAAqB;AAAA,UAClD,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,gBAAgB;AAAA,UAChB,UAAU;AAAA,UACV,gBAAgB,SAAS;AAAA,UACzB,oBAAoB,SAAS;AAAA,UAC7B,eAAe,SAAS;AAAA,UACxB,kBAAkB,SAAS;AAAA,UAC3B,WAAW;AAAA,QACb,CAAC;AAAA,QACD,SACE,MAAM,QAAQ,SAAS,QAAQ,UAAU,EAAE,WAAW,oBAAoB,OAAO,CAAC,CACpF,EAAE,SAAS;AAAA,QAEX,MAAM,MAAM;AAAA,UACV,MAAM;AAAA,YACJ,MAAM;AAAA,YACN,KAAK,EAAE,cAAc,kBAAkB,WAAW,MAAM;AAAA,UAC1D;AAAA,UACA,WAAW;AAAA,YACT,MAAM;AAAA,YACN,KAAK,EAAE,cAAc,kBAAkB,WAAW,MAAM;AAAA,YACxD,YAAY,EAAE,MAAM,MAAM;AAAA,UAC5B;AAAA,UACA,gBAAgB;AAAA,QAClB;AAAA,QACA,SACE,MAAM,QAAQ,SAAS,QAAQ,UAAU;AAAA,UACvC,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,MAAM,CAAC,GAAG;AAAA,QACZ,CAAC,CACH,EAAE,QAAQ,EAAE,UAAU,GAAG,WAAW,EAAE,CAAC;AAAA,QACvC,SACE,MAAM,QAAQ,SAAS,QAAQ,UAAU;AAAA,UACvC,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,MAAM,CAAC,GAAG;AAAA,QACZ,CAAC,CACH,EAAE,QAAQ,EAAE,UAAU,GAAG,WAAW,EAAE,CAAC;AAAA,QACvC,MAAM,SACJ,QAAQ,SAAS,QAAQ,UAAU;AAAA,UACjC,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,MAAM;AAAA,YACJ;AAAA,iBACK;AAAA,cACH,WAAW,KAAK,IAAI,WAAW,YAAY,EAAE,MAAM,YAAY,EAAE;AAAA,YACnE;AAAA,UACF;AAAA,QACF,CAAC,CACH,EAAE,QAAQ,QAAQ;AAAA,QAElB,MAAM,QAAQ,MAAM,QAAQ,SAAS,QAAQ,UAAU;AAAA,UACrD,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,SAAS;AAAA,QACX,CAAC;AAAA,QACD,SAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,SAAS,WAAW,GAAG,gBAAgB,EAAE,CAAC;AAAA,QAEhF,MAAM,YAAY,MAAM,QAAQ,eAAe,eAAe;AAAA,UAC5D,IAAI,QAAQ,IAAI;AAAA,UAChB,WAAW,QAAQ,IAAI;AAAA,UACvB;AAAA,UACA,QAAQ,EAAE,cAAc,iBAAiB;AAAA,QAC3C,CAAC;AAAA,QACD,MAAM,SACJ,QAAQ,SAAS,QAAQ,UAAU;AAAA,UACjC,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,MAAM,CAAC;AAAA,QACT,CAAC,CACH,EAAE,QAAQ,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAAA,QAClD,MAAM,SACJ,QAAQ,SAAS,QAAQ,UAAU;AAAA,UACjC,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,SAAS;AAAA,QACX,CAAC,CACH,EAAE,QAAQ,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAAA,QAClD,MAAM,SACJ,QAAQ,SAAS,QAAQ,QAAQ;AAAA,UAC/B,MAAM;AAAA,UACN,WAAW;AAAA,UACX;AAAA,UACA,mBAAmB;AAAA,UACnB;AAAA,UACA,aAAa;AAAA,QACf,CAAC,CACH,EAAE,QAAQ,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAAA,QAClD,MAAM,YAAY,MAAM,QAAQ,SAAS,QAAQ,QAAQ;AAAA,UACvD,MAAM;AAAA,UACN,WAAW;AAAA,UACX;AAAA,UACA,WAAW,UAAU;AAAA,UACrB,aAAa;AAAA,QACf,CAAC;AAAA,QACD,SAAO,SAAS,EAAE,cAAc,EAAE,QAAQ,aAAa,gBAAgB,KAAK,CAAC;AAAA,QAC7E,SACE,MAAM,QAAQ,SAAS,QAAQ,kBAAkB,EAAE,WAAW,mBAAmB,CAAC,CACpF,EAAE,QAAQ,EAAE,OAAO,GAAG,kBAAkB,2BAA2B,CAAC;AAAA,QAEpE,SACE,MAAM,QAAQ,SAAS,QAAQ,gBAAgB;AAAA,UAC7C,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT,CAAC,CACH,EAAE,QAAQ,EAAE,aAAa,GAAG,yBAAyB,EAAE,CAAC;AAAA,QACxD,SACE,MAAM,QAAQ,SAAS,QAAQ,gBAAgB;AAAA,UAC7C,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT,CAAC,CACH,EAAE,QAAQ,EAAE,aAAa,GAAG,yBAAyB,EAAE,CAAC;AAAA,QACxD,SACE,MAAM,QAAQ,SAAS,QAAQ,kBAAkB,EAAE,WAAW,mBAAmB,CAAC,CACpF,EAAE,QAAQ,EAAE,OAAO,GAAG,kBAAkB,KAAK,CAAC;AAAA,OAC/C;AAAA,KACF;AAAA,IAED,OAAK,oFAAoF,YAAY;AAAA,MACnG,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,MAAM,0BAA0B,SAAS,WAAW,iBAAiB,IAAI;AAAA,QACvF,MAAM,uBACJ,SACA,OACA,MACA,qBACA,0BACF;AAAA,QACA,MAAM,YAAY,MAAM,QAAQ,SAAS,QAAQ,UAAU;AAAA,UACzD,WAAW;AAAA,UACX,QAAQ,MAAM;AAAA,QAChB,CAAC;AAAA,QACD,SAAO,SAAS,EAAE,cAAc;AAAA,UAC9B,mBAAmB,MAAM;AAAA,UACzB,QAAQ;AAAA,UACR,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SACE,MAAM,QAAQ,SAAS,QAAQ,YAAY;AAAA,UACzC,WAAW;AAAA,UACX,QAAQ,EAAE,MAAM,cAAc,iBAAiB,MAAM,UAAU,gBAAgB;AAAA,QACjF,CAAC,CACH,EAAE,cAAc,EAAE,IAAI,oBAAoB,CAAC;AAAA,QAC3C,MAAM,SACJ,uBACE,SACA,OACA,WACA,+BACA,0BACF,CACF,EAAE,QAAQ,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAAA,QAEnD,MAAM,OAAO,MAAM,0BAA0B,SAAS,YAAY,kBAAkB,IAAI;AAAA,QACxF,MAAM,QAAQ,MAAM,0BAA0B,SAAS,aAAa,mBAAmB,IAAI;AAAA,QAC3F,MAAM,uBACJ,SACA,MACA,WACA,sBACA,0BACF;AAAA,QACA,MAAM,SACJ,uBACE,SACA,OACA,WACA,uBACA,0BACF,CACF,EAAE,QAAQ,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAAA,QACpD,MAAM,gBAAgB,MAAM,QAAQ,SAAS,QAAQ,UAAU;AAAA,UAC7D,WAAW;AAAA,UACX,QAAQ,MAAM;AAAA,QAChB,CAAC;AAAA,QACD,SAAO,aAAa,EAAE,cAAc,EAAE,mBAAmB,KAAK,kBAAkB,CAAC;AAAA,QAEjF,MAAM,QAAQ,MAAM,0BAClB,SACA,wBACA,8BACA,IACF;AAAA,QACA,MAAM,YAAY,MAAM,QAAQ,eAAe,eAAe;AAAA,UAC5D,IAAI,MAAM,UAAU;AAAA,UACpB,WAAW;AAAA,UACX,UAAU,MAAM;AAAA,UAChB,QAAQ,EAAE,cAAc,iBAAiB;AAAA,QAC3C,CAAC;AAAA,QACD,MAAM,SACJ,uBACE,SACA,OACA,eACA,2BACA,0BACF,CACF,EAAE,QAAQ,QAAQ,0BAA0B;AAAA,QAC5C,MAAM,QAAQ,SAAS,QAAQ,QAAQ;AAAA,UACrC,MAAM;AAAA,UACN,WAAW;AAAA,UACX,QAAQ,MAAM;AAAA,UACd,WAAW,UAAU;AAAA,UACrB,aAAa;AAAA,QACf,CAAC;AAAA,QAED,MAAM,UAAU,MAAM,QAAQ,SAAS,QAAQ,gBAAgB;AAAA,UAC7D,WAAW;AAAA,UACX,gBAAgB;AAAA,UAChB,OAAO;AAAA,QACT,CAAC;AAAA,QACD,SAAO,QAAQ,uBAAuB,EAAE,uBAAuB,CAAC;AAAA,QAChE,SACE,MAAM,QAAQ,SAAS,QAAQ,UAAU;AAAA,UACvC,WAAW;AAAA,UACX,QAAQ,MAAM;AAAA,QAChB,CAAC,CACH,EAAE,cAAc,EAAE,mBAAmB,KAAK,kBAAkB,CAAC;AAAA,QAC7D,SACE,MAAM,QAAQ,SAAS,QAAQ,QAAQ;AAAA,UACrC,MAAM;AAAA,UACN,WAAW;AAAA,UACX,QAAQ,MAAM;AAAA,UACd,mBAAmB,MAAM;AAAA,UACzB,WAAW,MAAM;AAAA,UACjB,aAAa;AAAA,QACf,CAAC,CACH,EAAE,cAAc,EAAE,QAAQ,YAAY,CAAC;AAAA,OACxC;AAAA,KACF;AAAA,IAED,OAAK,oFAAoF,YAAY;AAAA,MACnG,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SACJ,kBAAkB,SAAS,eAAe,EAAE,oBAAoB,KAAK,CAAC,CACxE,EAAE,QAAQ,QAAQ,mBAAmB;AAAA,QACrC,SACE,MAAM,QAAQ,QAAQ,eAAe;AAAA,UACnC,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW;AAAA,QACb,CAAC,CACH,EAAE,SAAS;AAAA,QACX,SACE,MAAM,QAAQ,SAAS,QAAQ,QAAQ;AAAA,UACrC,WAAW;AAAA,UACX,IAAI;AAAA,QACN,CAAC,CACH,EAAE,SAAS;AAAA,QACX,SACE,MAAM,QAAQ,SAAS,OAAO,MAAM;AAAA,UAClC,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC,CACH,EAAE,QAAQ,CAAC,CAAC;AAAA,QAEZ,MAAM,kBAAkB,SAAS,WAAW;AAAA,QAC5C,SACE,MAAM,QAAQ,QAAQ,eAAe;AAAA,UACnC,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW;AAAA,QACb,CAAC,CACH,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,GAAG,cAAc,YAAY,CAAC;AAAA,QAEhF,MAAM,SACJ,kBAAkB,SAAS,oBAAoB,EAAE,WAAW,YAAY,CAAC,CAC3E,EAAE,QAAQ,QAAQ,cAAc;AAAA,QAChC,SACE,MAAM,QAAQ,SAAS,QAAQ,QAAQ;AAAA,UACrC,WAAW;AAAA,UACX,IAAI;AAAA,QACN,CAAC,CACH,EAAE,SAAS;AAAA,QACX,SACE,MAAM,QAAQ,QAAQ,eAAe;AAAA,UACnC,WAAW;AAAA,UACX,cAAc;AAAA,UACd,WAAW;AAAA,QACb,CAAC,CACH,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,GAAG,cAAc,YAAY,CAAC;AAAA,OACjF;AAAA,KACF;AAAA,IAED,OAAK,qFAAqF,YAAY;AAAA,MACpG,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,UAAU,MAAM,kBAAkB,SAAS,UAAU;AAAA,QAC3D,MAAM,UAAU,MAAM,kBAAkB,SAAS,UAAU;AAAA,QAC3D,MAAM,SACJ,QAAQ,SAAS,OAAO,MAAM;AAAA,UAC5B,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC,CACH,EAAE,QAAQ,QAAQ,eAAe;AAAA,QACjC,MAAM,QAAQ,MAAM,QAAQ,SAAS,OAAO,MAAM;AAAA,UAChD,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,KAAK,EAAE,aAAa,CAAC;AAAA,QAC5B,SAAO,MAAM,EAAE,EAAE,cAAc,EAAE,UAAU,GAAG,SAAS,YAAY,CAAC;AAAA,QACpE,SAAO,MAAM,GAAG,SAAS,EAAE,EAAE,KAAK,CAAC,QAAQ,SAAS,QAAQ,OAAO,EAAE,KAAK,EAAE,EAAE;AAAA,QAC9E,MAAM,aAAa,MAAM,QAAQ,SAAS,OAAO,MAAM;AAAA,UACrD,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,UAAU,EAAE,aAAa,CAAC;AAAA,QACjC,SAAO,WAAW,GAAG,SAAS,EAAE,EAAE,IAAI,KAAK,MAAM,GAAG,SAAS,EAAE;AAAA,QAE/D,MAAM,YAAY,MAAM,QAAQ,SAAS,OAAO,MAAM;AAAA,UACpD,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,UAAU,GAAG,SAAS,EAAE,EAAE,KAAK,MAAM,GAAG,SAAS,EAAE;AAAA,QAC1D,MAAM,SACJ,QAAQ,SAAS,OAAO,cAAc;AAAA,UACpC,WAAW;AAAA,UACX,KAAK,CAAC,MAAM,GAAG,SAAS,EAAE;AAAA,UAC1B,SAAS;AAAA,UACT,aAAa;AAAA,QACf,CAAC,CACH,EAAE,QAAQ,QAAQ,sBAAsB;AAAA,QACxC,MAAM,QAAQ,SAAS,OAAO,WAAW;AAAA,UACvC,WAAW;AAAA,UACX,KAAK,CAAC,UAAU,GAAG,SAAS,EAAE;AAAA,UAC9B,SAAS;AAAA,UACT,aAAa;AAAA,UACb,OAAO;AAAA,QACT,CAAC;AAAA,QACD,MAAM,UAAU,MAAM,QAAQ,SAAS,OAAO,MAAM;AAAA,UAClD,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,QAAQ,EAAE,EAAE,cAAc,EAAE,UAAU,GAAG,WAAW,qBAAqB,CAAC;AAAA,QACjF,SACE,MAAM,QAAQ,SAAS,OAAO,UAAU,EAAE,WAAW,mBAAmB,CAAC,CAC3E,EAAE,cAAc,EAAE,cAAc,GAAG,eAAe,GAAG,aAAa,EAAE,CAAC;AAAA,QACrE,MAAM,QAAQ,SAAS,OAAO,cAAc;AAAA,UAC1C,WAAW;AAAA,UACX,KAAK,CAAC,QAAQ,GAAG,SAAS,EAAE;AAAA,UAC5B,SAAS;AAAA,UACT,aAAa;AAAA,QACf,CAAC;AAAA,QACD,SACE,MAAM,QAAQ,SAAS,OAAO,eAAe;AAAA,UAC3C,WAAW;AAAA,UACX,iBAAiB;AAAA,UACjB,OAAO;AAAA,QACT,CAAC,CACH,EAAE,KAAK,CAAC;AAAA,OACT;AAAA,KACF;AAAA,IAED,OAAK,yEAAyE,YAAY;AAAA,MACxF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,kBAAkB,SAAS,gBAAgB;AAAA,QACjD,MAAM,kBAAkB,SAAS,gBAAgB;AAAA,QACjD,MAAM,UAAU,MAAM,QAAQ,SAAS,OAAO,MAAM;AAAA,UAClD,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,OAAO,EAAE,aAAa,CAAC;AAAA,QAC9B,OAAO,aAAa,MAAM,QAAQ,SAAS,OAAO,MAAM;AAAA,UACtD,WAAW;AAAA,UACX,KAAK;AAAA,UACL,OAAO;AAAA,UACP,SAAS;AAAA,UACT,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,MAAM,YAAY,QAAQ,KAAK,CAAC,QAAQ,IAAI,SAAS,OAAO,UAAW,SAAS,EAAE;AAAA,QAElF,IAAI;AAAA,QACJ,MAAM,QAAQ,YAAY,OAAO,OAAO;AAAA,UACtC,IAAI;AAAA,YACF,MAAM,GAAG,SAAS,OAAO,cAAc;AAAA,cACrC,WAAW;AAAA,cACX,KAAK,QAAQ,IAAI,CAAC,QAAQ,IAAI,SAAS,EAAE;AAAA,cACzC,SAAS;AAAA,cACT,aAAa;AAAA,YACf,CAAC;AAAA,YACD,OAAO,OAAO;AAAA,YACd,WAAW;AAAA;AAAA,SAEd;AAAA,QACD,SAAO,QAAQ,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAAA,QAEvD,MAAM,QAAQ,SAAS,OAAO,cAAc;AAAA,UAC1C,WAAW;AAAA,UACX,KAAK,CAAC,UAAU,SAAS,EAAE;AAAA,UAC3B,SAAS;AAAA,UACT,aAAa;AAAA,QACf,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,4EAA4E,YAAY;AAAA,MAC3F,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,WAA8C;AAAA,UAClD,cAAc;AAAA,UACd,gBAAgB;AAAA,UAChB,UAAU;AAAA,UACV,gBAAgB;AAAA,YACd,WAAW;AAAA,YACX,WAAW;AAAA,YACX,WAAW;AAAA,UACb;AAAA,UACA,kBAAkB;AAAA,UAClB,oBAAoB;AAAA,UACpB,eAAe;AAAA,QACjB;AAAA,QACA,MAAM,MAAM,MAAM,QAAQ,eAAe,eAAe;AAAA,UACtD,IAAI;AAAA,UACJ,WAAW;AAAA,UACX;AAAA,UACA,QAAQ,EAAE,cAAc,iBAAiB;AAAA,UACzC,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,MAAM,UAAU,OAAO,eAAwB;AAAA,UAC7C,MAAM,QAAQ,YAAY,OAAO,OAAO;AAAA,YACtC,IAAI,CAAC,GAAG,gBAAgB;AAAA,cACtB,MAAM,IAAI,MAAM,wDAAwD;AAAA,YAC1E;AAAA,YACA,MAAM,SAAS,gBAAgB,UAAU,IAAI,IAAI,EAAE;AAAA,YACnD,MAAM,UAAU,MAAM,GAAG,SAAS,iBAAiB,MAAM,MAAM;AAAA,YAC/D,MAAM,GAAG,SAAS,iBAAiB,SAAS;AAAA,cAC1C;AAAA,cACA,cAAc;AAAA,gBACZ,mBAAmB,CAAC;AAAA,gBACpB,QAAQ;AAAA,kBACN,MAAM;AAAA,kBACN,UAAU,OAAO,OAAO;AAAA,kBACxB,SAAS;AAAA,kBACT,YAAY;AAAA,kBACZ,aAAa,OAAO,OAAO;AAAA,kBAC3B,eAAe;AAAA,kBACf,eAAe;AAAA,kBACf,iBAAiB;AAAA,kBACjB,sBAAsB;AAAA,gBACxB;AAAA,cACF;AAAA,YACF,CAAC;AAAA,YACD,MAAM,GAAG,eAAe,2BAA2B;AAAA,cACjD,IAAI,IAAI,IAAI;AAAA,cACZ,WAAW,IAAI,IAAI;AAAA,cACnB;AAAA,cACA,gBAAgB,IAAI,UAAU;AAAA,cAC9B,cAAc;AAAA,cACd,eAAe;AAAA,cACf,kBAAkB;AAAA,cAClB,gBAAgB;AAAA,YAClB,CAAC;AAAA,YACD,IAAI;AAAA,cAAY,MAAM,IAAI,MAAM,oBAAoB;AAAA,WACrD;AAAA;AAAA,QAGH,MAAM,SAAO,QAAQ,IAAI,CAAC,EAAE,QAAQ,QAAQ,oBAAoB;AAAA,QAChE,SACE,MAAM,QAAQ,SAAS,QAAQ,YAAY;AAAA,UACzC,WAAW;AAAA,UACX,QAAQ,EAAE,MAAM,aAAa,iBAAiB,IAAI,IAAI,IAAI,cAAc,EAAE;AAAA,QAC5E,CAAC,CACH,EAAE,SAAS;AAAA,QACX,SACE,MAAM,QAAQ,eAAe,QAAQ,EAAE,WAAW,IAAI,IAAI,WAAW,IAAI,IAAI,IAAI,GAAG,CAAC,CACvF,EAAE,cAAc;AAAA,UACd,qBAAqB,EAAE,kBAAkB,GAAG,eAAe,GAAG,gBAAgB,MAAM;AAAA,QACtF,CAAC;AAAA,QAED,MAAM,QAAQ,KAAK;AAAA,QACnB,SACE,MAAM,QAAQ,SAAS,QAAQ,YAAY;AAAA,UACzC,WAAW;AAAA,UACX,QAAQ,EAAE,MAAM,aAAa,iBAAiB,IAAI,IAAI,IAAI,cAAc,EAAE;AAAA,QAC5E,CAAC,CACH,EAAE,cAAc,EAAE,IAAI,mBAAmB,CAAC;AAAA,QAC1C,SACE,MAAM,QAAQ,eAAe,QAAQ,EAAE,WAAW,IAAI,IAAI,WAAW,IAAI,IAAI,IAAI,GAAG,CAAC,CACvF,EAAE,cAAc;AAAA,UACd,qBAAqB,EAAE,kBAAkB,GAAG,eAAe,GAAG,gBAAgB,KAAK;AAAA,QACrF,CAAC;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAAA;AAGH,eAAe,yBAAyB,CACtC,SACA,OACA,mBACA,WACyB;AAAA,EACzB,MAAM,WAAW,oBAAoB,SAAS;AAAA,EAC9C,MAAM,MAAM,MAAM,QAAQ,eAAe,eAAe;AAAA,IACtD,IAAI;AAAA,IACJ,WAAW;AAAA,IACX;AAAA,IACA,QAAQ,EAAE,cAAc,iBAAiB;AAAA,EAC3C,CAAC;AAAA,EACD,MAAM,aAAY,IAAI;AAAA,EACtB,MAAM,SAAS,EAAE,cAAc,SAAS,aAAa;AAAA,EACrD,MAAM,QAAQ,SAAS,QAAQ,qBAAqB;AAAA,IAClD,WAAW,IAAI,IAAI;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB,UAAU;AAAA,IACV,gBAAgB,SAAS;AAAA,IACzB,oBAAoB,SAAS;AAAA,IAC7B,eAAe,SAAS;AAAA,IACxB,kBAAkB,SAAS;AAAA,IAC3B,WAAW,SAAS,eAAe;AAAA,EACrC,CAAC;AAAA,EACD,MAAM,QAAQ,SAAS,QAAQ,UAAU;AAAA,IACvC,WAAW,IAAI,IAAI;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,SAAS,IAAI,KAAK,KAAK,MAAM,SAAS,eAAe,SAAS,IAAI,IAAK,EAAE,YAAY;AAAA,EACvF,CAAC;AAAA,EACD,OAAO,EAAE,UAAU,uBAAW,mBAAmB,OAAO;AAAA;AAG1D,eAAe,sBAAsB,CACnC,SACA,WACA,gBACA,UACA,aACe;AAAA,EACf,MAAM,WAAW;AAAA,IACf,QAAQ,UAAU;AAAA,IAClB,yBAAyB,gBAAgB,qBAAqB;AAAA,IAC9D,cAAc,gBAAgB,gBAAgB;AAAA,EAChD;AAAA,EACA,MAAM,SAAoC;AAAA,IACxC,QAAQ;AAAA,MACN,WAAW;AAAA,MACX,IAAI;AAAA,MACJ,gBAAgB,cAAc;AAAA,MAC9B,aAAa,QAAQ;AAAA,MACrB,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,cAAc,UAAU,OAAO;AAAA,QAC/B,iBAAiB,UAAU,UAAU;AAAA,QACrC,WAAW,UAAU,SAAS,eAAe;AAAA,QAC7C,kBAAkB,UAAU,SAAS,eAAe;AAAA,MACtD;AAAA,MACA,kBAAkB,UAAU,SAAS;AAAA,MACrC,oBAAoB,UAAU,SAAS;AAAA,MACvC,eAAe,UAAU,SAAS;AAAA,MAClC,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,QAAQ,UAAU;AAAA,QAClB,gBAAgB,UAAU,SAAS;AAAA,MACrC;AAAA,MACA;AAAA,IACF;AAAA,IACA,UAAU,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,YAAY,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EACtF;AAAA,EACA,MAAM,eAAgD;AAAA,IACpD,mBAAmB;AAAA,MACjB;AAAA,QACE,QAAQ,UAAU;AAAA,QAClB,mBAAmB,UAAU;AAAA,QAC7B,WAAW,UAAU;AAAA,QACrB,gBAAgB;AAAA,QAChB,UAAU;AAAA,QACV,gBAAgB,UAAU,SAAS;AAAA,QACnC,oBAAoB,UAAU,SAAS;AAAA,QACvC,eAAe,UAAU,SAAS;AAAA,QAClC,kBAAkB,UAAU,SAAS;AAAA,QACrC;AAAA,QACA,cAAc;AAAA,QACd,WAAW;AAAA,MACb;AAAA,IACF;AAAA,IACA,QAAQ;AAAA,MACN,MAAM;AAAA,MACN;AAAA,MACA,SAAS;AAAA,MACT,YAAY;AAAA,MACZ;AAAA,MACA,QAAQ;AAAA,IACV;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,YAAY,OAAO,OAAO;AAAA,IACtC,IAAI,CAAC,GAAG,gBAAgB;AAAA,MACtB,MAAM,IAAI,MAAM,wDAAwD;AAAA,IAC1E;AAAA,IACA,MAAM,GAAG,eAAe,uBAAuB;AAAA,MAC7C,IAAI,UAAU,UAAU;AAAA,MACxB,WAAW,OAAO,OAAO;AAAA,MACzB,UAAU,UAAU;AAAA,MACpB,gBAAgB,UAAU,UAAU;AAAA,IACtC,CAAC;AAAA,IACD,MAAM,UAAU,MAAM,GAAG,SAAS,iBAAiB,MAAM,MAAM;AAAA,IAC/D,WAAW,cAAc,CAAC,UAAU,MAAM,GAAY;AAAA,MACpD,iBAAiB,SAAS,GAAG,SAAS,iBAAiB,6BAA6B;AAAA,QAClF;AAAA,QACA,QAAQ,UAAU;AAAA,QAClB,4BAA4B,UAAU;AAAA,QACtC;AAAA,QACA,UAAU;AAAA,MACZ,CAAC,GAAG,CAEJ;AAAA,IACF;AAAA,IACA,MAAM,GAAG,SAAS,iBAAiB,SAAS,EAAE,SAAS,aAAa,CAAC;AAAA,GACtE;AAAA;AAGH,SAAS,eAAe,CACtB,UACA,iBAC2B;AAAA,EAC3B,IAAI,SAAS,aAAa;AAAA,IAAa,MAAM,IAAI,MAAM,6BAA6B;AAAA,EACpF,OAAO;AAAA,IACL,QAAQ;AAAA,MACN,WAAW;AAAA,MACX,IAAI;AAAA,MACJ,gBAAgB;AAAA,MAChB,aAAa;AAAA,MACb,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,cAAc,SAAS;AAAA,UACvB;AAAA,UACA,WAAW,SAAS,eAAe;AAAA,UACnC,kBAAkB,SAAS,eAAe;AAAA,UAC1C,cAAc;AAAA,QAChB;AAAA,MACF;AAAA,MACA,kBAAkB,SAAS;AAAA,MAC3B,oBAAoB,SAAS;AAAA,MAC7B,eAAe,SAAS;AAAA,MACxB,QAAQ;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,YAAY,EAAE,cAAc,SAAS,aAAa;AAAA,UAClD,gBAAgB,SAAS;AAAA,UACzB,cAAc;AAAA,UACd,gBAAgB;AAAA,UAChB,mBAAmB;AAAA,UACnB,gBAAgB;AAAA,QAClB;AAAA,QACA,YAAY;AAAA,QACZ,iBAAiB;AAAA,MACnB;AAAA,MACA,aAAa;AAAA,IACf;AAAA,IACA,UAAU,EAAE,SAAS,CAAC,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC,GAAG,YAAY,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EAC9E;AAAA;;ACx5BF,qBAAS,sBAAU,kBAAQ;AAa3B,IAAM,aAAY;AAClB,IAAM,eAAe,EAAE,cAAc,SAAS;AAE9C,IAAM,uBAAsB;AAAA,EAC1B,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,gBAAgB;AAAA,IACd,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AAAA,EACA,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,eAAe;AACjB;AAEA,IAAM,oBAAoB;AAAA,EACxB,cAAc;AAAA,EACd,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,gBAAgB;AAAA,IACd,WAAW;AAAA,IACX,WAAW;AAAA,IACX,WAAW;AAAA,EACb;AAAA,EACA,kBAAkB;AAAA,EAClB,oBAAoB;AAAA,EACpB,eAAe;AACjB;AAGO,SAAS,oCAA2E,CACzF,OACA,SACM;AAAA,EACN,MAAM,cAAc,OAAO,SAA8D;AAAA,IACvF,MAAM,UAAU,MAAM,QAAQ,cAAc;AAAA,IAC5C,IAAI;AAAA,MACF,MAAM,QAAQ,QAAQ,OAAO;AAAA,MAC7B,MAAM,KAAK,OAAO;AAAA,cAClB;AAAA,MACA,MAAM,QAAQ,UAAU,OAAO;AAAA;AAAA;AAAA,EAInC,WAAS,OAAO,MAAM;AAAA,IACpB,OAAK,qDAAqD,YAAY;AAAA,MACpE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,iBAAiB,iBAAiB;AAAA,QAChD,MAAM,QAAQ,MAAM,QAAQ,eAAe,KAAK;AAAA,QAChD,MAAM,SAAS,MAAM,QAAQ,eAAe,KAAK;AAAA,QAEjD,SAAO,MAAM,GAAG,EAAE,cAAc,EAAE,IAAI,MAAM,IAAI,SAAS,GAAG,QAAQ,UAAU,CAAC;AAAA,QAC/E,SAAO,OAAO,GAAG,EAAE,cAAc,EAAE,IAAI,MAAM,IAAI,SAAS,GAAG,QAAQ,UAAU,CAAC;AAAA,QAChF,SAAO,OAAO,UAAU,cAAc,EAAE,IAAI,KAAK,MAAM,UAAU,cAAc;AAAA,QAC/E,SAAO,OAAO,GAAG,EAAE,IAAI,eAAe,gBAAgB;AAAA,QACtD,SAAO,MAAM,QAAQ,QAAQ,EAAE,uBAAW,IAAI,MAAM,GAAG,CAAC,CAAC,EAAE,cAAc;AAAA,UACvE,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,UAAU,EAAE,gBAAgB,GAAG,mBAAmB,EAAE;AAAA,QACtD,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,yDAAyD,YAAY;AAAA,MACxE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,iBAAiB,YAAY;AAAA,QAC3C,MAAM,QAAQ,MAAM,QAAQ,eAAe,KAAK;AAAA,QAChD,MAAM,UAAU,MAAM,QAAQ,eAAe,KAAK;AAAA,QAElD,MAAM,SAAO,QAAQ,uBAAuB,eAAe,KAAK,CAAC,CAAC,EAAE,QAAQ,QAC1E,0BACF;AAAA,QACA,MAAM,SACJ,QAAQ,OAAO;AAAA,aACV,eAAe,KAAK;AAAA,UACvB,UAAU,EAAE,gBAAgB,EAAE;AAAA,QAChC,CAAC,CACH,EAAE,QAAQ,QAAQ,0BAA0B;AAAA,QAC5C,MAAM,SACJ,QAAQ,OAAO;AAAA,aACV,eAAe,KAAK;AAAA,UACvB,UAAU;AAAA,UACV,QAAQ;AAAA,QACV,CAAC,CACH,EAAE,QAAQ,QAAQ,0BAA0B;AAAA,QAE5C,MAAM,SACJ,QAAQ,OAAO;AAAA,aACV,eAAe,OAAO;AAAA,UACzB,UAAU,EAAE,gBAAgB,EAAE;AAAA,QAChC,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,UAAU,EAAE,gBAAgB,EAAE,EAAE,CAAC;AAAA,OAC7D;AAAA,KACF;AAAA,IAED,OAAK,+CAA+C,YAAY;AAAA,MAC9D,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,iBAAiB,cAAc;AAAA,QAC7C,MAAM,SAAQ,MAAM,QAAQ,eAAe,KAAK;AAAA,QAChD,MAAM,kBAAkB,KAAK,sBAAqB,eAAe,sBAAsB;AAAA,QAEvF,MAAM,SACJ,QAAQ,eAAe,KAAK,OAAO,UAAU,gBAAgB,CAAC,CAChE,EAAE,QAAQ,QAAQ,yBAAyB;AAAA,QAC3C,MAAM,SACJ,QAAQ,eAAe,KAAK,OAAO,QAAQ,EAAE,cAAc,cAAc,EAAE,CAAC,CAC9E,EAAE,QAAQ,QAAQ,kCAAkC;AAAA,QACpD,MAAM,SACJ,QAAQ,uBAAuB;AAAA,aAC1B,eAAe,MAAK;AAAA,UACvB,UAAU;AAAA,QACZ,CAAC,CACH,EAAE,QAAQ,QAAQ,yBAAyB;AAAA,OAC5C;AAAA,KACF;AAAA,IAED,OAAK,8DAA8D,YAAY;AAAA,MAC7E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAQ,MAAM,QAAQ,eAAe,iBAAiB,cAAc,CAAC;AAAA,QAC3E,MAAM,aAAY,eAAe,MAAK;AAAA,QACtC,MAAM,SACJ,QAAQ,OAAO;AAAA,aACV;AAAA,UACH,UAAU,EAAE,gBAAgB,GAAG,mBAAmB,EAAE;AAAA,QACtD,CAAC,CACH,EAAE,QAAQ,QAAQ,kDAAkD;AAAA,QACpE,MAAM,QAAQ,OAAO;AAAA,aAChB;AAAA,UACH,UAAU,EAAE,gBAAgB,GAAG,mBAAmB,EAAE;AAAA,QACtD,CAAC;AAAA,QACD,MAAM,SACJ,QAAQ,OAAO,KAAK,YAAW,UAAU,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAClE,EAAE,QAAQ,QAAQ,mBAAmB;AAAA,OACtC;AAAA,KACF;AAAA,IAED,OAAK,oDAAoD,YAAY;AAAA,MACnE,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,eAAe,iBAAiB,wBAAwB,CAAC;AAAA,QACvE,MAAM,SACJ,QAAQ,eAAe;AAAA,aAClB,iBAAiB,2BAA2B;AAAA,UAC/C,UAAU;AAAA,eACL;AAAA,YACH,gBAAgB;AAAA,iBACX,qBAAoB;AAAA,cACvB,WAAW;AAAA,YACb;AAAA,UACF;AAAA,QACF,CAAC,CACH,EAAE,QAAQ,QAAQ,sDAAsD;AAAA,OACzE;AAAA,KACF;AAAA,IAED,OAAK,2DAA2D,YAAY;AAAA,MAC1E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAQ,MAAM,QAAQ,eAAe;AAAA,UACzC,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,MAAM,aAAY,eAAe,MAAK;AAAA,QACtC,SAAO,OAAM,GAAG,EAAE,cAAc;AAAA,UAC9B,qBAAqB;AAAA,YACnB,gBAAgB;AAAA,YAChB,kBAAkB;AAAA,YAClB,eAAe;AAAA,YACf,gBAAgB;AAAA,UAClB;AAAA,QACF,CAAC;AAAA,QACD,MAAM,SACJ,QAAQ,OAAO,KAAK,YAAW,UAAU,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAClE,EAAE,QAAQ,QAAQ,sCAAsC;AAAA,QAExD,MAAM,QAAQ,2BAA2B;AAAA,aACpC;AAAA,UACH,cAAc;AAAA,UACd,eAAe;AAAA,UACf,kBAAkB;AAAA,UAClB,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,MAAM,SACJ,QAAQ,2BAA2B;AAAA,aAC9B;AAAA,UACH,cAAc;AAAA,UACd,eAAe;AAAA,UACf,kBAAkB;AAAA,UAClB,gBAAgB;AAAA,QAClB,CAAC,CACH,EAAE,QAAQ,QAAQ,0BAA0B;AAAA,QAC5C,MAAM,SACJ,QAAQ,2BAA2B;AAAA,aAC9B;AAAA,UACH,cAAc;AAAA,UACd,eAAe;AAAA,UACf,kBAAkB;AAAA,UAClB,gBAAgB;AAAA,QAClB,CAAC,CACH,EAAE,QAAQ,QAAQ,yBAAyB;AAAA,QAE3C,MAAM,YAAY,MAAM,QAAQ,2BAA2B;AAAA,aACtD;AAAA,UACH,cAAc;AAAA,UACd,eAAe;AAAA,UACf,kBAAkB;AAAA,UAClB,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,SAAS,EAAE,cAAc;AAAA,UAC9B,UAAU,EAAE,gBAAgB,GAAG,mBAAmB,EAAE;AAAA,UACpD,qBAAqB,EAAE,kBAAkB,GAAG,eAAe,GAAG,gBAAgB,KAAK;AAAA,QACrF,CAAC;AAAA,OACF;AAAA,KACF;AAAA,IAED,OAAK,4DAA4D,YAAY;AAAA,MAC3E,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAQ,MAAM,QAAQ,eAAe;AAAA,UACzC,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,MAAM,aAAY,eAAe,MAAK;AAAA,QACtC,MAAM,cAAc,IAAI,KAAK,0BAA0B;AAAA,QACvD,MAAM,gBAAgB;AAAA,UACpB,cAAc;AAAA,UACd,UAAU;AAAA,UACV,cAAc;AAAA,UACd;AAAA,QACF;AAAA,QAEA,MAAM,UAAU,MAAM,QAAQ,oBAAoB,KAAK,YAAW,cAAc,CAAC;AAAA,QACjF,SAAO,QAAQ,aAAa,EAAE,QAAQ,aAAa;AAAA,QACnD,UACG,MAAM,QAAQ,QAAQ,EAAE,uBAAW,IAAI,+BAA+B,CAAC,IAAI,aAC9E,EAAE,QAAQ,aAAa;AAAA,QAIvB,MAAM,SACJ,QAAQ,oBAAoB;AAAA,aACvB;AAAA,UACH,eAAe,KAAK,eAAe,cAAc,EAAE;AAAA,QACrD,CAAC,CACH,EAAE,QAAQ,QAAQ,wBAAwB;AAAA,QAI1C,MAAM,SACJ,QAAQ,oBAAoB;AAAA,aACvB;AAAA,UACH,eAAe,KAAK,eAAe,cAAc,WAAW;AAAA,QAC9D,CAAC,CACH,EAAE,QAAQ,QAAQ,2BAA2B;AAAA,QAI7C,WAAW,WAAW;AAAA,UACpB,EAAE,UAAU,GAAG;AAAA,UACf,EAAE,cAAc,GAAG;AAAA,UACnB,EAAE,aAAa,IAAI,KAAK,OAAO,GAAG,EAAE;AAAA,QACtC,GAAG;AAAA,UACD,MAAM,SACJ,QAAQ,oBAAoB;AAAA,eACvB;AAAA,YACH,eAAe,KAAK,kBAAkB,QAAQ;AAAA,UAChD,CAAC,CACH,EAAE,QAAQ,QAAQ;AAAA,QACpB;AAAA,QAKA,MAAM,aAAa,MAAM,QAAQ,oBAAoB;AAAA,aAChD;AAAA,UACH,eAAe,KAAK,eAAe,aAAa,IAAI,KAAK,0BAA0B,EAAE;AAAA,QACvF,CAAC;AAAA,QACD,SAAO,WAAW,eAAe,WAAW,EAAE,QAAQ,IAAI,KAAK,0BAA0B,CAAC;AAAA,QAE1F,MAAM,WAAW,MAAM,QAAQ,2BAA2B;AAAA,aACrD;AAAA,UACH,cAAc;AAAA,UACd,eAAe;AAAA,UACf,kBAAkB;AAAA,UAClB,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,SAAS,aAAa,EAAE,cAAc;AAAA,OAC9C;AAAA,KACF;AAAA,IAED,OAAK,qEAAqE,YAAY;AAAA,MACpF,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,SAAQ,MAAM,QAAQ,eAAe;AAAA,UACzC,IAAI;AAAA,UACJ;AAAA,UACA,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,gBAAgB;AAAA,QAClB,CAAC;AAAA,QAED,MAAM,SACJ,QAAQ,OAAO;AAAA,aACV,eAAe,MAAK;AAAA,UACvB,UAAU;AAAA,UACV,QAAQ;AAAA,QACV,CAAkD,CACpD,EAAE,QAAQ,QAAQ,wCAAwC;AAAA,QAC1D,MAAM,SAAO,QAAQ,QAAQ,EAAE,uBAAW,IAAI,OAAM,IAAI,GAAG,CAAC,CAAC,EAAE,SAAS,cAAc;AAAA,UACpF,QAAQ;AAAA,UACR,qBAAqB,EAAE,gBAAgB,MAAM;AAAA,QAC/C,CAAC;AAAA,QAED,MAAM,WAAW,MAAM,QAAQ,OAAO;AAAA,aACjC,eAAe,MAAK;AAAA,UACvB,UAAU;AAAA,UACV,QAAQ;AAAA,UACR,gBAAgB;AAAA,QAClB,CAAC;AAAA,QACD,SAAO,QAAQ,EAAE,cAAc;AAAA,UAC7B,QAAQ;AAAA,UACR,UAAU,EAAE,gBAAgB,EAAE;AAAA,UAC9B,qBAAqB,EAAE,gBAAgB,KAAK;AAAA,QAC9C,CAAC;AAAA,QACD,MAAM,SAAO,QAAQ,uBAAuB,eAAe,MAAK,CAAC,CAAC,EAAE,QAAQ,QAC1E,kBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,OAAK,2CAA2C,YAAY;AAAA,MAC1D,MAAM,YAAY,OAAO,YAAY;AAAA,QACnC,MAAM,QAAQ,eAAe,KAAK,iBAAiB,WAAW,GAAG,WAAW,YAAY,CAAC;AAAA,QACzF,MAAM,QAAQ,eAAe,KAAK,iBAAiB,WAAW,GAAG,WAAW,YAAY,CAAC;AAAA,QAEzF,SAAO,MAAM,QAAQ,QAAQ,EAAE,WAAW,aAAa,IAAI,YAAY,CAAC,CAAC,EAAE,IAAI,SAAS;AAAA,QACxF,SAAO,MAAM,QAAQ,QAAQ,EAAE,WAAW,aAAa,IAAI,YAAY,CAAC,CAAC,EAAE,IAAI,SAAS;AAAA,QACxF,SAAO,MAAM,QAAQ,QAAQ,EAAE,WAAW,aAAa,IAAI,YAAY,CAAC,CAAC,EAAE,SAAS;AAAA,OACrF;AAAA,KACF;AAAA,GACF;AAAA;AAGH,SAAS,gBAAgB,CAAC,IAAY;AAAA,EACpC,OAAO,EAAE,IAAI,uBAAW,UAAU,sBAAqB,QAAQ,aAAa;AAAA;AAG9E,SAAS,cAAc,CAAC,QAA2B;AAAA,EACjD,OAAO;AAAA,IACL,IAAI,OAAM,IAAI;AAAA,IACd,WAAW,OAAM,IAAI;AAAA,IACrB,UAAU,OAAM,IAAI;AAAA,IACpB,gBAAgB,OAAM,UAAU;AAAA,EAClC;AAAA;;AClXF,qBAAS,sBAAU,kBAAQ;AAiCpB,SAAS,qBAAqB,CAAC,OAAe,SAA0C;AAAA,EAC7F,MAAM,eAAe,QAAQ,gBAAgB;AAAA,EAC7C,MAAM,0BAA0B,QAAQ,2BAA2B,eAAe;AAAA,EAClF,MAAM,oBAAoB,QAAQ,qBAAqB,eAAe;AAAA,EAEtE,MAAM,aAAa,OAAO,SAA2D;AAAA,IACnF,MAAM,SAAS,MAAM,QAAQ,aAAa;AAAA,IAC1C,IAAI;AAAA,MACF,MAAM,KAAK,MAAM;AAAA,cACjB;AAAA,MACA,MAAM,QAAQ,WAAW,MAAM;AAAA;AAAA;AAAA,EAInC,WAAS,OAAO,MAAM;AAAA,IACpB,WAAS,WAAW,MAAM;AAAA,MACxB,OAAK,0EAA0E,YAAY;AAAA,QACzF,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,SAAS,KAAK,IAAI;AAAA,UAExB,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,MAAM;AAAA,gBACN,SAAS,EAAE,QAAQ,UAAU,eAAe,SAAS;AAAA,cACvD;AAAA,YACF;AAAA,UACF,CAAC;AAAA,UAED,SAAO,KAAK,EAAE,EAAE,QAAQ,iBAAiB;AAAA,UACzC,SAAO,KAAK,SAAS,EAAE,KAAK,WAAW;AAAA,UACvC,SAAO,KAAK,OAAO,EAAE,KAAK,CAAC;AAAA,UAC3B,SAAO,KAAK,IAAI,EAAE,KAAK,oBAAoB;AAAA,UAC3C,SAAO,KAAK,QAAQ,MAAM,EAAE,KAAK,QAAQ;AAAA,UACzC,SAAO,KAAK,MAAM,IAAK,SAAS,CAAC,EAAE,uBAAuB,MAAM;AAAA,UAChE,SAAO,KAAK,WAAW,EAAE,KAAK,KAAK,SAAS;AAAA,SAC7C;AAAA,OACF;AAAA,MAED,OAAK,2DAA2D,YAAY;AAAA,QAC1E,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,QAAQ;AAAA,YACZ,IAAI;AAAA,YACJ,MAAM;AAAA,YACN,SAAS,EAAE,QAAQ,SAAS;AAAA,UAC9B;AAAA,UACA,QAAQ,SAAS,WAAW,MAAM,QAAQ,IAAI;AAAA,YAC5C,OAAO,SAAS,QAAQ,EAAE,WAAW,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC;AAAA,YACjE,OAAO,SAAS,QAAQ,EAAE,WAAW,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC;AAAA,UACnE,CAAC;AAAA,UAED,SAAO,OAAO,EAAE,EAAE,KAAK,MAAM,EAAE;AAAA,UAC/B,SAAO,QAAQ,EAAE,EAAE,KAAK,MAAM,EAAE;AAAA,UAChC,MAAM,SACJ,OAAO,SAAS,MAAM,EAAE,WAAW,aAAa,UAAU,YAAY,OAAO,EAAE,CAAC,CAClF,EAAE,SAAS,aAAa,CAAC;AAAA,SAC1B;AAAA,OACF;AAAA,MAED,OAAK,iEAAiE,YAAY;AAAA,QAChF,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,KAAK;AAAA,UACX,MAAM,QAAQ;AAAA,YACZ;AAAA,YACA,MAAM;AAAA,YACN,SAAS,EAAE,QAAQ,SAAS;AAAA,UAC9B;AAAA,UAEA,QAAQ,SAAS,cAAc,MAAM,QAAQ,IAAI;AAAA,YAC/C,OAAO,SAAS,QAAQ,EAAE,WAAW,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC;AAAA,YACjE,OAAO,SAAS,QAAQ,EAAE,WAAW,aAAa,MAAM,CAAC,KAAK,EAAE,CAAC;AAAA,UACnE,CAAC;AAAA,UACD,OAAO,WAAW,MAAM,OAAO,SAAS,MAAM;AAAA,YAC5C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UAED,SAAO,OAAO,EAAE,EAAE,KAAK,EAAE;AAAA,UACzB,SAAO,WAAW,EAAE,EAAE,KAAK,EAAE;AAAA,UAC7B,SAAO,SAAS,IAAI,EAAE,EAAE,KAAK,EAAE;AAAA,UAC/B,IAAI,OAAO,SAAS,YAAY;AAAA,YAC9B,MAAM,SACJ,OAAO,SAAS,WAAW;AAAA,cACzB,WAAW;AAAA,cACX,OAAO;AAAA,cACP,SAAS,QAAS;AAAA,cAClB,SAAS,eAAe;AAAA,YAC1B,CAAC,CACH,EAAE,SAAS,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAAA,UAC1C;AAAA,UACA,MAAM,OAAO,SAAS,SAAS;AAAA,YAC7B,WAAW;AAAA,YACX,OAAO;AAAA,YACP,SAAS,QAAS;AAAA,UACpB,CAAC;AAAA,UACD,MAAM,SACJ,OAAO,SAAS,MAAM,EAAE,WAAW,aAAa,UAAU,WAAW,CAAC,CACxE,EAAE,SAAS,aAAa,CAAC;AAAA,SAC1B;AAAA,OACF;AAAA,MAED,OAAK,+CAA+C,YAAY;AAAA,QAC9D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,SAAS,MAAM,OAAO,SAAS,QAAQ,EAAE,WAAW,aAAa,MAAM,CAAC,EAAE,CAAC;AAAA,UAEjF,SAAO,MAAM,EAAE,QAAQ,CAAC,CAAC;AAAA,SAC1B;AAAA,OACF;AAAA,MAED,OAAK,2CAA2C,YAAY;AAAA,QAC1D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,SACJ,OAAO,SAAS,QAAQ;AAAA,YACtB,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,QAAQ,SAAS,EAAE,CAAC;AAAA,UACtE,CAAC,CACH,EAAE,QAAQ,eAAe,UAAU;AAAA,SACpC;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,SAAS,MAAM;AAAA,MACtB,OAAK,qDAAqD,YAAY;AAAA,QACpE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,OAAO,UAAU,QAAQ;AAAA,YAC7B,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,0BAA0B,SAAS,EAAE,YAAY,MAAM,EAAE,CAAC;AAAA,UAC3E,CAAC;AAAA,UAED,OAAO,WAAW,MAAM,OAAO,UAAU,MAAM;AAAA,YAC7C,WAAW;AAAA,YACX,UAAU;AAAA,UACZ,CAAC;AAAA,UAED,SAAO,SAAS,IAAI,OAAO,EAAE,KAAK,CAAC;AAAA,UACnC,SAAO,SAAS,IAAI,QAAQ,UAAU,EAAE,KAAK,KAAK;AAAA,UAClD,SAAO,SAAS,OAAO,EAAE,WAAW;AAAA,UACpC,SAAO,KAAK,MAAM,QAAS,cAAc,CAAC,EAAE,gBAC1C,KAAK,MAAM,QAAS,SAAS,CAC/B;AAAA,SACD;AAAA,OACF;AAAA,MAED,OAAK,mDAAmD,YAAY;AAAA,QAClE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC5B,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,UACnE,CAAC;AAAA,UAED,MAAM,OAAO,MAAM,OAAO,SAAS,MAAM;AAAA,YACvC,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UACD,MAAM,WAAW,MAAM,OAAO,SAAS,MAAM;AAAA,YAC3C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UAED,SAAO,IAAI,EAAE,QAAQ,CAAC,CAAC;AAAA,UACvB,SAAO,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAAA,SAC5B;AAAA,OACF;AAAA,MAED,OAAK,gDAAgD,YAAY;AAAA,QAC/D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC5B,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,UACnE,CAAC;AAAA,UAED,MAAM,SACJ,OAAO,SAAS,MAAM,EAAE,WAAW,aAAa,UAAU,OAAO,SAAS,EAAE,CAAC,CAC/E,EAAE,QAAQ,eAAe,UAAU;AAAA,UACnC,MAAM,SACJ,OAAO,SAAS,MAAM,EAAE,WAAW,aAAa,UAAU,OAAO,SAAS,GAAG,CAAC,CAChF,EAAE,QAAQ,eAAe,UAAU;AAAA,SACpC;AAAA,OACF;AAAA,MAED,OAAK,+CAA+C,YAAY;AAAA,QAC9D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,cAAc,IAAI,KAAK,KAAK,IAAI,IAAI,eAAe,EAAE,EAAE,YAAY;AAAA,UACzE,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC5B,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,QAAQ,MAAM,GAAG,YAAY,CAAC;AAAA,UAChF,CAAC;AAAA,UAED,MAAM,SAAS,MAAM,OAAO,SAAS,MAAM;AAAA,YACzC,WAAW;AAAA,YACX,UAAU;AAAA,UACZ,CAAC;AAAA,UACD,MAAM,IAAI,MAAM,eAAe,EAAE;AAAA,UACjC,MAAM,QAAQ,MAAM,OAAO,SAAS,MAAM;AAAA,YACxC,WAAW;AAAA,YACX,UAAU;AAAA,UACZ,CAAC;AAAA,UAED,SAAO,MAAM,EAAE,aAAa,CAAC;AAAA,UAC7B,SAAO,KAAK,EAAE,aAAa,CAAC;AAAA,UAC5B,SAAO,MAAM,IAAI,IAAI,WAAW,EAAE,KAAK,WAAW;AAAA,SACnD;AAAA,OACF;AAAA,MAED,OAAK,4CAA4C,YAAY;AAAA,QAC3D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC5B,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,UACnE,CAAC;AAAA,UACD,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC5B,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,UACnE,CAAC;AAAA,UAED,MAAM,WAAW,MAAM,OAAO,SAAS,MAAM;AAAA,YAC3C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UAED,SAAO,QAAQ,EAAE,aAAa,CAAC;AAAA,UAC/B,SAAO,SAAS,IAAI,IAAI,QAAQ,MAAM,EAAE,KAAK,KAAK;AAAA,UAClD,SAAO,SAAS,IAAI,IAAI,SAAS,EAAE,KAAK,WAAW;AAAA,SACpD;AAAA,OACF;AAAA,MAED,OAAK,oFAAoF,YAAY;AAAA,QACnG,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC5B,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,UACnE,CAAC;AAAA,UACD,MAAM,OAAO,UAAU,QAAQ;AAAA,YAC7B,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,0BAA0B,SAAS,EAAE,YAAY,MAAM,EAAE,CAAC;AAAA,UAC3E,CAAC;AAAA,UACD,MAAM,OAAO,YAAY,QAAQ;AAAA,YAC/B,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,MAAM;AAAA,gBACN,SAAS;AAAA,kBACP,cAAc;AAAA,kBACd,gBAAgB;AAAA,kBAChB,UAAU;AAAA,kBACV,gBAAgB;AAAA,oBACd,WAAW;AAAA,oBACX,WAAW;AAAA,oBACX,WAAW;AAAA,kBACb;AAAA,kBACA,kBAAkB;AAAA,kBAClB,oBAAoB;AAAA,kBACpB,eAAe;AAAA,gBACjB;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAC;AAAA,UACD,MAAM,OAAO,UAAU,QAAQ;AAAA,YAC7B,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,MAAM;AAAA,gBACN,SAAS;AAAA,kBACP,YAAY;AAAA,kBACZ,OAAO;AAAA,oBACL,aAAa,EAAE,cAAc,eAAe,WAAW,UAAU;AAAA,kBACnE;AAAA,gBACF;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAC;AAAA,UACD,MAAM,OAAO,QAAQ,QAAQ;AAAA,YAC3B,WAAW;AAAA,YACX,MAAM;AAAA,cACJ;AAAA,gBACE,MAAM;AAAA,gBACN,SAAS;AAAA,kBACP,UAAU;AAAA,kBACV,OAAO;AAAA,gBACT;AAAA,cACF;AAAA,YACF;AAAA,UACF,CAAC;AAAA,UAED,MAAM,YAAY,MAAM,OAAO,UAAU,MAAM;AAAA,YAC7C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UACD,MAAM,iBAAiB,MAAM,OAAO,YAAY,MAAM;AAAA,YACpD,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UACD,MAAM,eAAe,MAAM,OAAO,UAAU,MAAM;AAAA,YAChD,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UACD,MAAM,aAAa,MAAM,OAAO,QAAQ,MAAM;AAAA,YAC5C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UACD,MAAM,WAAW,MAAM,OAAO,SAAS,MAAM;AAAA,YAC3C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UAED,SAAO,SAAS,EAAE,aAAa,CAAC;AAAA,UAChC,SAAO,UAAU,IAAI,IAAI,QAAQ,UAAU,EAAE,KAAK,KAAK;AAAA,UACvD,SAAO,cAAc,EAAE,aAAa,CAAC;AAAA,UACrC,SAAO,eAAe,IAAI,IAAI,QAAQ,YAAY,EAAE,KAAK,iBAAiB;AAAA,UAC1E,SAAO,YAAY,EAAE,aAAa,CAAC;AAAA,UACnC,SAAO,aAAa,IAAI,IAAI,QAAQ,UAAU,EAAE,KAAK,uBAAuB;AAAA,UAC5E,SAAO,UAAU,EAAE,aAAa,CAAC;AAAA,UACjC,SAAO,WAAW,IAAI,IAAI,QAAQ,QAAQ,EAAE,KAAK,WAAW;AAAA,UAC5D,SAAO,QAAQ,EAAE,aAAa,CAAC;AAAA,SAChC;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,YAAY,MAAM;AAAA,MACzB,OAAK,6CAA6C,YAAY;AAAA,QAC5D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,UACnE,CAAC;AAAA,UACD,OAAO,UAAS,MAAM,OAAO,SAAS,MAAM;AAAA,YAC1C,WAAW;AAAA,YACX,UAAU;AAAA,UACZ,CAAC;AAAA,UAED,MAAM,OAAO,SAAS,SAAS;AAAA,YAC7B,WAAW;AAAA,YACX,OAAO,IAAK;AAAA,YACZ,SAAS,OAAO;AAAA,UAClB,CAAC;AAAA,UAED,MAAM,QAAQ,MAAM,OAAO,SAAS,MAAM;AAAA,YACxC,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UACD,SAAO,KAAK,EAAE,aAAa,CAAC;AAAA,SAC7B;AAAA,OACF;AAAA,MAED,OAAK,2CAA2C,YAAY;AAAA,QAC1D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,UACnE,CAAC;AAAA,UACD,MAAM,OAAO,SAAS,MAAM;AAAA,YAC1B,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS,eAAe;AAAA,UAC1B,CAAC;AAAA,UAED,MAAM,SACJ,OAAO,SAAS,SAAS;AAAA,YACvB,WAAW;AAAA,YACX,OAAO,IAAK;AAAA,YACZ,SAAS;AAAA,UACX,CAAC,CACH,EAAE,QAAQ,eAAe,UAAU;AAAA,SACpC;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,SAAS,MAAM;AAAA,MACtB,OAAK,uDAAuD,YAAY;AAAA,QACtE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,UACnE,CAAC;AAAA,UACD,OAAO,cAAc,MAAM,OAAO,SAAS,MAAM;AAAA,YAC/C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS;AAAA,UACX,CAAC;AAAA,UAED,MAAM,UAAU,IAAI,KAAK,KAAK,IAAI,IAAI,iBAAiB,EAAE,YAAY;AAAA,UACrE,MAAM,OAAO,SAAS,MAAM;AAAA,YAC1B,WAAW;AAAA,YACX,OAAO,IAAK;AAAA,YACZ,SAAS,WAAY;AAAA,YACrB,aAAa;AAAA,YACb,OAAO,EAAE,SAAS,YAAY;AAAA,UAChC,CAAC;AAAA,UACD,MAAM,IAAI,MAAM,oBAAoB,EAAE;AAAA,UACtC,OAAO,eAAe,MAAM,OAAO,SAAS,MAAM;AAAA,YAChD,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS;AAAA,UACX,CAAC;AAAA,UAED,SAAO,aAAa,IAAI,EAAE,EAAE,KAAK,KAAK,EAAE;AAAA,UACxC,SAAO,aAAa,IAAI,OAAO,EAAE,KAAK,CAAC;AAAA,SACxC;AAAA,OACF;AAAA,MAED,OAAK,+CAA+C,YAAY;AAAA,QAC9D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,UACnE,CAAC;AAAA,UACD,OAAO,UAAS,MAAM,OAAO,SAAS,MAAM;AAAA,YAC1C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS,eAAe;AAAA,UAC1B,CAAC;AAAA,UAED,MAAM,SACJ,OAAO,SAAS,MAAM;AAAA,YACpB,WAAW;AAAA,YACX,OAAO,IAAK;AAAA,YACZ,SAAS,OAAO;AAAA,YAChB,aAAa;AAAA,UACf,CAAC,CACH,EAAE,QAAQ,eAAe,UAAU;AAAA,SACpC;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,QAAQ,MAAM;AAAA,MACrB,OAAK,sCAAsC,YAAY;AAAA,QACrD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,UAAU,QAAQ;AAAA,YAC3C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,0BAA0B,SAAS,EAAE,YAAY,MAAM,EAAE,CAAC;AAAA,UAC3E,CAAC;AAAA,UACD,OAAO,UAAS,MAAM,OAAO,UAAU,MAAM;AAAA,YAC3C,WAAW;AAAA,YACX,UAAU;AAAA,UACZ,CAAC;AAAA,UAED,MAAM,OAAO,UAAU,KAAK;AAAA,YAC1B,WAAW;AAAA,YACX,OAAO,IAAK;AAAA,YACZ,SAAS,OAAO;AAAA,YAChB,OAAO,EAAE,SAAS,OAAO;AAAA,UAC3B,CAAC;AAAA,UAED,MAAM,QAAQ,MAAM,OAAO,UAAU,MAAM;AAAA,YACzC,WAAW;AAAA,YACX,UAAU;AAAA,YACV,OAAO;AAAA,UACT,CAAC;AAAA,UACD,SAAO,KAAK,EAAE,aAAa,CAAC;AAAA,SAC7B;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,cAAc,MAAM;AAAA,MAC3B,OAAK,kDAAkD,YAAY;AAAA,QACjE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,UACnE,CAAC;AAAA,UACD,OAAO,UAAS,MAAM,OAAO,SAAS,MAAM;AAAA,YAC1C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS,eAAe;AAAA,UAC1B,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,OAAO,SAAS,aAAa;AAAA,YACjD,WAAW;AAAA,YACX,OAAO,IAAK;AAAA,YACZ,SAAS,OAAO;AAAA,YAChB,SAAS,eAAe;AAAA,UAC1B,CAAC;AAAA,UAED,SAAO,SAAS,IAAI,EAAE,EAAE,KAAK,KAAK,EAAE;AAAA,UACpC,SAAO,SAAS,OAAO,EAAE,KAAK,QAAO,OAAO;AAAA,UAC5C,SAAO,KAAK,MAAM,QAAS,cAAc,CAAC,EAAE,gBAC1C,KAAK,MAAM,OAAO,cAAc,CAClC;AAAA,SACD;AAAA,OACF;AAAA,MAED,OAAK,kCAAkC,YAAY;AAAA,QACjD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,SAAS,MAAM,OAAO,SAAS,aAAa;AAAA,YAChD,WAAW;AAAA,YACX,OAAO;AAAA,YACP,SAAS;AAAA,YACT,SAAS;AAAA,UACX,CAAC;AAAA,UAED,SAAO,MAAM,EAAE,SAAS;AAAA,SACzB;AAAA,OACF;AAAA,MAED,OAAK,gDAAgD,YAAY;AAAA,QAC/D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,UACnE,CAAC;AAAA,UACD,MAAM,OAAO,SAAS,MAAM;AAAA,YAC1B,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS,eAAe;AAAA,UAC1B,CAAC;AAAA,UAED,MAAM,UAAU,MAAM,OAAO,SAAS,aAAa;AAAA,YACjD,WAAW;AAAA,YACX,OAAO,IAAK;AAAA,YACZ,SAAS;AAAA,YACT,SAAS;AAAA,UACX,CAAC;AAAA,UAED,SAAO,OAAO,EAAE,SAAS;AAAA,SAC1B;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,cAAc,MAAM;AAAA,MAC3B,OAAK,0DAA0D,YAAY;AAAA,QACzE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,UACnE,CAAC;AAAA,UACD,OAAO,SAAS,MAAM,OAAO,SAAS,MAAM;AAAA,YAC1C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS;AAAA,UACX,CAAC;AAAA,UAED,MAAM,IAAI,MAAM,uBAAuB;AAAA,UACvC,OAAO,UAAU,MAAM,OAAO,SAAS,MAAM;AAAA,YAC3C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS;AAAA,UACX,CAAC;AAAA,UAED,SAAO,OAAO,IAAI,OAAO,EAAE,KAAK,CAAC;AAAA,UACjC,SAAO,QAAQ,IAAI,EAAE,EAAE,KAAK,KAAK,EAAE;AAAA,UACnC,SAAO,OAAQ,IAAI,OAAO,EAAE,uBAAuB,CAAC;AAAA,SACrD;AAAA,OACF;AAAA,MAED,OAAK,gDAAgD,YAAY;AAAA,QAC/D,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,OAAO,OAAO,MAAM,OAAO,SAAS,QAAQ;AAAA,YAC1C,WAAW;AAAA,YACX,MAAM,CAAC,EAAE,MAAM,sBAAsB,SAAS,EAAE,QAAQ,MAAM,EAAE,CAAC;AAAA,UACnE,CAAC;AAAA,UACD,OAAO,UAAS,MAAM,OAAO,SAAS,MAAM;AAAA,YAC1C,WAAW;AAAA,YACX,UAAU;AAAA,YACV,SAAS;AAAA,UACX,CAAC;AAAA,UAED,MAAM,IAAI,MAAM,uBAAuB;AAAA,UAEvC,MAAM,SACJ,OAAO,SAAS,SAAS;AAAA,YACvB,WAAW;AAAA,YACX,OAAO,IAAK;AAAA,YACZ,SAAS,OAAO;AAAA,UAClB,CAAC,CACH,EAAE,QAAQ,eAAe,UAAU;AAAA,SACpC;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,UAAU,MAAM;AAAA,MAGvB,OAAK,wCAAwC,YAAY;AAAA,QACvD,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,MAAM,SAAO,OAAO,OAAO,CAAC,EAAE,SAAS,cAAc;AAAA,SACtD;AAAA,OACF;AAAA,KACF;AAAA,IAED,WAAS,SAAS,MAAM;AAAA,MAGtB,OAAK,sDAAsD,YAAY;AAAA,QACrE,MAAM,WAAW,OAAO,WAAW;AAAA,UACjC,SAAO,CAAC,WAAW,QAAQ,CAAC,EAAE,UAAU,OAAO,KAAK;AAAA,SACrD;AAAA,OACF;AAAA,KACF;AAAA,GACF;AAAA;;ACxnBH,4CAAgC,sBAAU,kBAAQ;AAClD;AA6BA,IAAM,uBAAuB;AAMtB,SAAS,yBAAyB,CACvC,OACA,SACM;AAAA,EACN,MAAM,iBAAiB,QAAQ,kBAAkB;AAAA,EACjD,MAAM,eAAe,QAAQ,gBAAgB,CAAC;AAAA,EAE9C,WAAS,OAAO,MAAM;AAAA,IACpB,IAAI;AAAA,IAEJ,WAAW,YAAY;AAAA,MACrB,UAAU,MAAM,QAAQ,cAAc;AAAA,KACvC;AAAA,IAED,UAAU,YAAY;AAAA,MACpB,MAAM,QAAQ,WAAW,OAAO;AAAA,KACjC;AAAA,IAED,WAAS,aAAa,MAAM;AAAA,MAC1B,OAAK,wDAAwD,YAAY;AAAA,QACvE,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,SAAO,QAAQ,MAAM,EAAE,KAAK,SAAS;AAAA,UACrC,SAAO,QAAQ,GAAG,MAAM,EAAE,gBAAgB,CAAC;AAAA,UAC3C,SAAO,QAAQ,iBAAiB,MAAM,EAAE,gBAAgB,CAAC;AAAA,kBACzD;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,+DAA+D,YAAY;AAAA,QAC9E,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,SAAS,MAAM,QAAQ,WAAW,QAAQ,CAAC,OAAO,CAAC;AAAA,UACzD,SAAO,OAAO,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC9B,SAAO,OAAO,OAAO,KAAK,CAAC,EAAE,KAAK,OAAO;AAAA,UACzC,SAAO,OAAO,MAAM,EAAE,KAAK,EAAE;AAAA,UAC7B,SAAO,OAAO,UAAU,EAAE,uBAAuB,CAAC;AAAA,UAClD,SAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,IAAI;AAAA,kBACrC;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,uDAAuD,YAAY;AAAA,QACtE,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,SAAS,MAAM,QAAQ,WAAW,gCAAgC,CAAC,CAAC;AAAA,UAC1E,SAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,CAAC;AAAA,kBAClC;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,kDAAkD,YAAY;AAAA,QACjE,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,SAAS,MAAM,QAAQ,WAAW,WAAW;AAAA,YACjD;AAAA,YACA;AAAA,UACF,CAAC;AAAA,UACD,SAAO,OAAO,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC9B,SAAO,OAAO,MAAM,EAAE,UAAU,UAAU;AAAA,UAC1C,SAAO,OAAO,MAAM,EAAE,UAAU,UAAU;AAAA,UAC1C,SAAO,OAAO,MAAM,EAAE,IAAI,UAAU,UAAU;AAAA,UAC9C,SAAO,OAAO,MAAM,EAAE,IAAI,UAAU,UAAU;AAAA,kBAC9C;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,6DAA6D,YAAY;AAAA,QAC5E,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,QAAQ,KAAK;AAAA,UACnB,SAAO,QAAQ,MAAM,EAAE,KAAK,SAAS;AAAA,UACrC,MAAM,SAAO,QAAQ,WAAW,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,eACzD,sBACF;AAAA,kBACA;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,yBAAyB,YAAY;AAAA,QACxC,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,MAAM,QAAQ,QAAQ;AAAA,QACtB,MAAM,QAAQ,QAAQ;AAAA,QACtB,MAAM,SAAO,QAAQ,WAAW,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,eACtD,sBACF;AAAA,OACD;AAAA,KACF;AAAA,IAED,WAAS,qBAAqB,MAAM;AAAA,MAClC,OAAK,gDAAgD,YAAY;AAAA,QAC/D,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,SAAS,MAAM,QAAQ,WAAW,KAAK;AAAA,UAC7C,MAAM,WAAW,MAAM,SAAS,QAAQ,gBAAgB;AAAA,UACxD,SAAO,OAAO,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC9B,SAAO,OAAO,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;AAAA,kBAC1C;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,6DAA6D,YAAY;AAAA,QAC5E,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,WAAW,MAAM,SAAS,MAAM;AAAA,UACtC,MAAM,SAAS,MAAM,QAAQ,WAAW,OAAO,CAAC,GAAG,EAAE,KAAK,OAAO,CAAC;AAAA,UAClE,SAAO,OAAO,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC9B,SAAO,OAAO,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;AAAA,kBAC1C;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,KACF;AAAA,IAED,WAAS,eAAe,MAAM;AAAA,MAC5B,OAAK,4CAA4C,YAAY;AAAA,QAC3D,MAAM,UAAU,MAAM,QAAQ,OAAO,EAAE,KAAK,EAAE,aAAa,QAAQ,EAAE,CAAC;AAAA,QACtE,IAAI;AAAA,UACF,MAAM,SAAS,MAAM,QAAQ,WAAW,YAAY,CAAC,aAAa,CAAC;AAAA,UACnE,SAAO,OAAO,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC9B,SAAO,OAAO,OAAO,KAAK,CAAC,EAAE,KAAK,OAAO;AAAA,kBACzC;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,oDAAoD,YAAY;AAAA,QACnE,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,UACnC,KAAK,EAAE,aAAa,SAAS,aAAa,OAAO;AAAA,QACnD,CAAC;AAAA,QACD,IAAI;AAAA,UACF,MAAM,IAAI,MAAM,QAAQ,WAAW,YAAY,CAAC,aAAa,GAAG;AAAA,YAC9D,KAAK,EAAE,aAAa,UAAU,aAAa,QAAQ;AAAA,UACrD,CAAC;AAAA,UACD,MAAM,IAAI,MAAM,QAAQ,WAAW,YAAY,CAAC,aAAa,GAAG;AAAA,YAC9D,KAAK,EAAE,aAAa,UAAU,aAAa,QAAQ;AAAA,UACrD,CAAC;AAAA,UACD,MAAM,IAAI,MAAM,QAAQ,WAAW,YAAY,CAAC,aAAa,GAAG;AAAA,YAC9D,KAAK,EAAE,aAAa,UAAU,aAAa,QAAQ;AAAA,UACrD,CAAC;AAAA,UACD,SAAO,EAAE,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ;AAAA,UACrC,SAAO,EAAE,OAAO,KAAK,CAAC,EAAE,KAAK,MAAM;AAAA,UACnC,SAAO,EAAE,OAAO,KAAK,CAAC,EAAE,KAAK,OAAO;AAAA,kBACpC;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,gDAAgD,YAAY;AAAA,QAC/D,MAAM,YAAY;AAAA,QAClB,MAAM,WAAW,QAAQ,IAAI;AAAA,QAC7B,QAAQ,IAAI,aAAa;AAAA,QACzB,IAAI;AAAA,UACF,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,UACrC,IAAI;AAAA,YACF,MAAM,SAAS,MAAM,QAAQ,WAAW,YAAY,CAAC,SAAS,CAAC;AAAA,YAC/D,SAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,CAAC;AAAA,YAClC,SAAO,OAAO,MAAM,EAAE,IAAI,UAAU,iBAAiB;AAAA,oBACrD;AAAA,YACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,kBAExB;AAAA,UACA,IAAI,aAAa,WAAW;AAAA,YAC1B,OAAO,QAAQ,IAAI;AAAA,UACrB,EAAO;AAAA,YACL,QAAQ,IAAI,aAAa;AAAA;AAAA;AAAA,OAG9B;AAAA,KACF;AAAA,IAED,WAAS,qBAAqB,MAAM;AAAA,MAClC,OAAK,qEAAqE,YAAY;AAAA,QACpF,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,QAAQ,KAAK,IAAI;AAAA,UACvB,MAAM,SAAS,MAAM,QAAQ,WAAW,SAAS,CAAC,OAAO,oBAAoB,CAAC,GAAG;AAAA,YAC/E,SAAS;AAAA,UACX,CAAC;AAAA,UACD,MAAM,UAAU,KAAK,IAAI,IAAI;AAAA,UAC7B,SAAO,OAAO,QAAQ,EAAE,KAAK,IAAI;AAAA,UACjC,SAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,CAAC;AAAA,UAClC,SAAO,OAAO,EAAE,aAAa,uBAAuB,IAAI;AAAA,kBACxD;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,4CAA4C,YAAY;AAAA,QAC3D,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,KAAK,IAAI;AAAA,UACf,WAAW,MAAM,GAAG,MAAM,GAAG,cAAc;AAAA,UAC3C,MAAM,QAAQ,KAAK,IAAI;AAAA,UACvB,MAAM,SAAS,MAAM,QAAQ,WAAW,SAAS,CAAC,OAAO,oBAAoB,CAAC,GAAG;AAAA,YAC/E,QAAQ,GAAG;AAAA,UACb,CAAC;AAAA,UACD,MAAM,UAAU,KAAK,IAAI,IAAI;AAAA,UAC7B,SAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,CAAC;AAAA,UAClC,SAAO,OAAO,EAAE,aAAa,uBAAuB,IAAI;AAAA,kBACxD;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,oDAAoD,YAAY;AAAA,QACnE,MAAM,UAAU,MAAM,QAAQ,OAAO,EAAE,SAAS,uBAAuB,KAAK,CAAC;AAAA,QAC7E,IAAI;AAAA,UACF,MAAM,SAAS,MAAM,QAAQ,WAAW,SAAS,CAAC,OAAO,oBAAoB,CAAC,GAAG;AAAA,YAC/E,SAAS;AAAA,UACX,CAAC;AAAA,UACD,SAAO,OAAO,QAAQ,EAAE,KAAK,IAAI;AAAA,kBACjC;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,KACF;AAAA,IAED,WAAS,wBAAwB,MAAM;AAAA,MACrC,OAAK,+DAA+D,YAAY;AAAA,QAC9E,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,OAAO,GAAG,QAAQ;AAAA,UACxB,MAAM,SAAS,GAAG,QAAQ;AAAA,UAC1B,MAAM,QAAQ,WAAW;AAAA,YACvB,EAAE,MAAM,MAAM,UAAU,gBAAgB;AAAA,YACxC,EAAE,MAAM,QAAQ,UAAU,kBAAkB;AAAA,UAC9C,CAAC;AAAA,UAED,MAAM,aAAa,MAAM,QAAQ,WAAW,OAAO,CAAC,IAAI,CAAC;AAAA,UACzD,SAAO,WAAW,QAAQ,EAAE,KAAK,CAAC;AAAA,UAClC,SAAO,WAAW,MAAM,EAAE,UAAU,eAAe;AAAA,UAGnD,MAAM,eAAe,MAAM,QAAQ,WAAW,OAAO,CAAC,MAAM,CAAC;AAAA,UAC7D,SAAO,aAAa,QAAQ,EAAE,KAAK,CAAC;AAAA,UACpC,SAAO,aAAa,MAAM,EAAE,UAAU,iBAAiB;AAAA,kBACvD;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,qDAAqD,YAAY;AAAA,QACpE,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,OAAO,GAAG,QAAQ;AAAA,UACxB,MAAM,QAAQ,IAAI,WAAW,CAAC,GAAM,GAAM,KAAM,KAAM,IAAM,GAAI,CAAC;AAAA,UACjE,MAAM,QAAQ,WAAW,CAAC,EAAE,MAAM,UAAU,MAAM,CAAC,CAAC;AAAA,UAEpD,MAAM,OAAO,MAAM,QAAQ,WAAW,MAAM,CAAC,MAAM,IAAI,CAAC;AAAA,UACxD,SAAO,KAAK,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC5B,SAAO,KAAK,OAAO,KAAK,EAAE,MAAM,KAAK,EAAE,EAAE,EAAE,KAAK,OAAO,MAAM,MAAM,CAAC;AAAA,UAGpE,MAAM,MAAM,MAAM,QAAQ,WAAW,MAAM,CAAC,OAAO,MAAM,QAAQ,IAAI,CAAC;AAAA,UACtE,SAAO,IAAI,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC3B,SAAO,IAAI,OAAO,QAAQ,QAAQ,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,mBAAmB;AAAA,kBACvE;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,4CAA4C,YAAY;AAAA,QAC3D,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,IAAI;AAAA,UACF,MAAM,OAAO,GAAG,QAAQ;AAAA,UACxB,MAAM,QAAQ,WAAW,CAAC,EAAE,MAAM,UAAU;AAAA;AAAA,GAAyB,MAAM,IAAM,CAAC,CAAC;AAAA,UAGnF,MAAM,SAAS,MAAM,QAAQ,WAAW,WAAW,CAAC,MAAM,WAAW,kBAAkB,CAAC;AAAA,UACxF,SAAO,OAAO,QAAQ,EAAE,KAAK,CAAC;AAAA,UAC9B,SAAO,OAAO,MAAM,EAAE,UAAU,KAAK;AAAA,kBACrC;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,MAED,OAAK,iCAAiC,YAAY;AAAA,QAChD,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,QACrC,MAAM,QAAQ,KAAK;AAAA,QACnB,IAAI;AAAA,UACF,MAAM,SACJ,QAAQ,WAAW,CAAC,EAAE,MAAM,GAAG,QAAQ,0BAA0B,UAAU,IAAI,CAAC,CAAC,CACnF,EAAE,QAAQ,QAAQ,sBAAsB;AAAA,kBACxC;AAAA,UACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,OAEzB;AAAA,KACF;AAAA,IAED,IAAI,aAAa,iBAAiB;AAAA,MAChC,WAAS,qBAAqB,MAAM;AAAA,QAClC,OAAK,iDAAiD,YAAY;AAAA,UAChE,MAAM,UAAU,MAAM,QAAQ,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,EAAE,CAAC;AAAA,UAClE,IAAI;AAAA,YACF,MAAM,SAAS,MAAM,QAAQ,WAAW,QAAQ;AAAA,cAC9C;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAAA,YACD,SAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,CAAC;AAAA,oBAClC;AAAA,YACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,SAEzB;AAAA,QAED,OAAK,+CAA+C,YAAY;AAAA,UAC9D,MAAM,UAAU,MAAM,QAAQ,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,EAAE,CAAC;AAAA,UACjE,IAAI;AAAA,YACF,MAAM,SAAS,MAAM,QAAQ,WAAW,QAAQ;AAAA,cAC9C;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF,CAAC;AAAA,YACD,SAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,CAAC;AAAA,oBAClC;AAAA,YACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,SAEzB;AAAA,OACF;AAAA,IACH;AAAA,IAQA,IAAI,aAAa,qBAAqB;AAAA,MACpC,WAAS,wBAAwB,MAAM;AAAA,QACrC,OAAK,0CAA0C,YAAY;AAAA,UACzD,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,UACrC,IAAI;AAAA,YACF,MAAM,SAAS,MAAM,QAAQ,WAAW,WAAW;AAAA,cACjD;AAAA,cACA,kBAAkB,QAAQ,qCAAqC,QAAQ;AAAA,YACzE,CAAC;AAAA,YACD,SAAO,OAAO,QAAQ,EAAE,KAAK,CAAC;AAAA,YAC9B,SAAO,OAAO,OAAO,KAAK,CAAC,EAAE,KAAK,SAAS;AAAA,oBAC3C;AAAA,YACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,SAEzB;AAAA,QAED,OAAK,wCAAwC,YAAY;AAAA,UACvD,MAAM,UAAU,MAAM,QAAQ,OAAO;AAAA,UACrC,IAAI;AAAA,YACF,MAAM,SAAS,MAAM,QAAQ,WAAW,WAAW;AAAA,cACjD;AAAA,cACA;AAAA,YACF,CAAC;AAAA,YACD,SAAO,OAAO,QAAQ,EAAE,IAAI,KAAK,CAAC;AAAA,oBAClC;AAAA,YACA,MAAM,QAAQ,QAAQ;AAAA;AAAA,SAEzB;AAAA,OACF;AAAA,IACH;AAAA,GACD;AAAA;",
|
|
22
|
+
"debugId": "8890E73064CEA99D64756E2164756E21",
|
|
23
|
+
"names": []
|
|
24
|
+
}
|