@sunshaobei/dsh-workflow 0.0.0-stage → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -2
- package/cordis.patch.yml +17 -0
- package/lib/client.js +14708 -0
- package/lib/core.js +137 -0
- package/lib/engine-adapter.js +1387 -0
- package/lib/host-driver.js +298 -0
- package/lib/index.js +536 -0
- package/lib/projection.js +159 -0
- package/lib/registry.js +218 -0
- package/lib/session-records.js +54 -0
- package/lib/submission-commit.js +34 -0
- package/lib/world-driver.js +275 -0
- package/package.json +64 -4
- package/vendor/PROVENANCE.md +9 -0
- package/vendor/dynamic-workflow/analysis/actor-graph.d.ts +47 -0
- package/vendor/dynamic-workflow/analysis/actor-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/actor-graph.js +95 -0
- package/vendor/dynamic-workflow/analysis/actor-models.d.ts +60 -0
- package/vendor/dynamic-workflow/analysis/actor-models.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/actor-models.js +208 -0
- package/vendor/dynamic-workflow/analysis/actor-names.d.ts +56 -0
- package/vendor/dynamic-workflow/analysis/actor-names.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/actor-names.js +155 -0
- package/vendor/dynamic-workflow/analysis/analyze.d.ts +63 -0
- package/vendor/dynamic-workflow/analysis/analyze.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/analyze.js +92 -0
- package/vendor/dynamic-workflow/analysis/array-methods.d.ts +21 -0
- package/vendor/dynamic-workflow/analysis/array-methods.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/array-methods.js +132 -0
- package/vendor/dynamic-workflow/analysis/artifact-types.d.ts +39 -0
- package/vendor/dynamic-workflow/analysis/artifact-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/artifact-types.js +114 -0
- package/vendor/dynamic-workflow/analysis/artifacts.d.ts +67 -0
- package/vendor/dynamic-workflow/analysis/artifacts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/artifacts.js +263 -0
- package/vendor/dynamic-workflow/analysis/assign.d.ts +42 -0
- package/vendor/dynamic-workflow/analysis/assign.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/assign.js +287 -0
- package/vendor/dynamic-workflow/analysis/callbacks.d.ts +71 -0
- package/vendor/dynamic-workflow/analysis/callbacks.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/callbacks.js +133 -0
- package/vendor/dynamic-workflow/analysis/calls.d.ts +40 -0
- package/vendor/dynamic-workflow/analysis/calls.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/calls.js +495 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-lanes.d.ts +25 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-lanes.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-lanes.js +161 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-types.d.ts +163 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-graph-types.js +8 -0
- package/vendor/dynamic-workflow/analysis/causality-graph.d.ts +39 -0
- package/vendor/dynamic-workflow/analysis/causality-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-graph.js +530 -0
- package/vendor/dynamic-workflow/analysis/causality-order-calls.d.ts +29 -0
- package/vendor/dynamic-workflow/analysis/causality-order-calls.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-calls.js +266 -0
- package/vendor/dynamic-workflow/analysis/causality-order-functions.d.ts +26 -0
- package/vendor/dynamic-workflow/analysis/causality-order-functions.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-functions.js +116 -0
- package/vendor/dynamic-workflow/analysis/causality-order-loops.d.ts +5 -0
- package/vendor/dynamic-workflow/analysis/causality-order-loops.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-loops.js +148 -0
- package/vendor/dynamic-workflow/analysis/causality-order-settle.d.ts +39 -0
- package/vendor/dynamic-workflow/analysis/causality-order-settle.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-settle.js +263 -0
- package/vendor/dynamic-workflow/analysis/causality-order-state.d.ts +110 -0
- package/vendor/dynamic-workflow/analysis/causality-order-state.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-state.js +162 -0
- package/vendor/dynamic-workflow/analysis/causality-order-strands.d.ts +79 -0
- package/vendor/dynamic-workflow/analysis/causality-order-strands.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-strands.js +154 -0
- package/vendor/dynamic-workflow/analysis/causality-order-types.d.ts +174 -0
- package/vendor/dynamic-workflow/analysis/causality-order-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-types.js +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-walk.d.ts +17 -0
- package/vendor/dynamic-workflow/analysis/causality-order-walk.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order-walk.js +282 -0
- package/vendor/dynamic-workflow/analysis/causality-order.d.ts +60 -0
- package/vendor/dynamic-workflow/analysis/causality-order.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-order.js +110 -0
- package/vendor/dynamic-workflow/analysis/causality-reduce.d.ts +60 -0
- package/vendor/dynamic-workflow/analysis/causality-reduce.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/causality-reduce.js +198 -0
- package/vendor/dynamic-workflow/analysis/classes.d.ts +47 -0
- package/vendor/dynamic-workflow/analysis/classes.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/classes.js +264 -0
- package/vendor/dynamic-workflow/analysis/constants.d.ts +35 -0
- package/vendor/dynamic-workflow/analysis/constants.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/constants.js +23 -0
- package/vendor/dynamic-workflow/analysis/control-flow.d.ts +26 -0
- package/vendor/dynamic-workflow/analysis/control-flow.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/control-flow.js +132 -0
- package/vendor/dynamic-workflow/analysis/core-json.d.ts +45 -0
- package/vendor/dynamic-workflow/analysis/core-json.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/core-json.js +49 -0
- package/vendor/dynamic-workflow/analysis/core.d.ts +194 -0
- package/vendor/dynamic-workflow/analysis/core.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/core.js +204 -0
- package/vendor/dynamic-workflow/analysis/domain.d.ts +269 -0
- package/vendor/dynamic-workflow/analysis/domain.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/domain.js +523 -0
- package/vendor/dynamic-workflow/analysis/facade-misuse.d.ts +56 -0
- package/vendor/dynamic-workflow/analysis/facade-misuse.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/facade-misuse.js +350 -0
- package/vendor/dynamic-workflow/analysis/fanout-cardinality.d.ts +11 -0
- package/vendor/dynamic-workflow/analysis/fanout-cardinality.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/fanout-cardinality.js +121 -0
- package/vendor/dynamic-workflow/analysis/flow-graph.d.ts +113 -0
- package/vendor/dynamic-workflow/analysis/flow-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/flow-graph.js +411 -0
- package/vendor/dynamic-workflow/analysis/flow-phase.d.ts +28 -0
- package/vendor/dynamic-workflow/analysis/flow-phase.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/flow-phase.js +104 -0
- package/vendor/dynamic-workflow/analysis/flow-strands.d.ts +39 -0
- package/vendor/dynamic-workflow/analysis/flow-strands.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/flow-strands.js +47 -0
- package/vendor/dynamic-workflow/analysis/flow-tree.d.ts +35 -0
- package/vendor/dynamic-workflow/analysis/flow-tree.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/flow-tree.js +33 -0
- package/vendor/dynamic-workflow/analysis/graph.d.ts +5 -0
- package/vendor/dynamic-workflow/analysis/graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/graph.js +199 -0
- package/vendor/dynamic-workflow/analysis/handoff-graph.d.ts +48 -0
- package/vendor/dynamic-workflow/analysis/handoff-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/handoff-graph.js +0 -0
- package/vendor/dynamic-workflow/analysis/heap-ops.d.ts +14 -0
- package/vendor/dynamic-workflow/analysis/heap-ops.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/heap-ops.js +70 -0
- package/vendor/dynamic-workflow/analysis/hole-id.d.ts +28 -0
- package/vendor/dynamic-workflow/analysis/hole-id.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/hole-id.js +41 -0
- package/vendor/dynamic-workflow/analysis/hole-sites.d.ts +32 -0
- package/vendor/dynamic-workflow/analysis/hole-sites.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/hole-sites.js +215 -0
- package/vendor/dynamic-workflow/analysis/hole-splice.d.ts +45 -0
- package/vendor/dynamic-workflow/analysis/hole-splice.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/hole-splice.js +100 -0
- package/vendor/dynamic-workflow/analysis/interpret.d.ts +26 -0
- package/vendor/dynamic-workflow/analysis/interpret.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/interpret.js +200 -0
- package/vendor/dynamic-workflow/analysis/literals.d.ts +18 -0
- package/vendor/dynamic-workflow/analysis/literals.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/literals.js +125 -0
- package/vendor/dynamic-workflow/analysis/mermaid.d.ts +60 -0
- package/vendor/dynamic-workflow/analysis/mermaid.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/mermaid.js +477 -0
- package/vendor/dynamic-workflow/analysis/patterns.d.ts +31 -0
- package/vendor/dynamic-workflow/analysis/patterns.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/patterns.js +94 -0
- package/vendor/dynamic-workflow/analysis/phase-graph.d.ts +47 -0
- package/vendor/dynamic-workflow/analysis/phase-graph.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/phase-graph.js +334 -0
- package/vendor/dynamic-workflow/analysis/phases.d.ts +24 -0
- package/vendor/dynamic-workflow/analysis/phases.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/phases.js +54 -0
- package/vendor/dynamic-workflow/analysis/promise-ops.d.ts +52 -0
- package/vendor/dynamic-workflow/analysis/promise-ops.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/promise-ops.js +123 -0
- package/vendor/dynamic-workflow/analysis/relays.d.ts +12 -0
- package/vendor/dynamic-workflow/analysis/relays.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/relays.js +78 -0
- package/vendor/dynamic-workflow/analysis/serialize.d.ts +125 -0
- package/vendor/dynamic-workflow/analysis/serialize.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/serialize.js +321 -0
- package/vendor/dynamic-workflow/analysis/site-phases.d.ts +32 -0
- package/vendor/dynamic-workflow/analysis/site-phases.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/site-phases.js +69 -0
- package/vendor/dynamic-workflow/analysis/sites-labels.d.ts +71 -0
- package/vendor/dynamic-workflow/analysis/sites-labels.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/sites-labels.js +189 -0
- package/vendor/dynamic-workflow/analysis/sites.d.ts +267 -0
- package/vendor/dynamic-workflow/analysis/sites.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/sites.js +225 -0
- package/vendor/dynamic-workflow/analysis/state.d.ts +254 -0
- package/vendor/dynamic-workflow/analysis/state.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/state.js +569 -0
- package/vendor/dynamic-workflow/analysis/taint.d.ts +97 -0
- package/vendor/dynamic-workflow/analysis/taint.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/taint.js +649 -0
- package/vendor/dynamic-workflow/analysis/types.d.ts +100 -0
- package/vendor/dynamic-workflow/analysis/types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/types.js +1 -0
- package/vendor/dynamic-workflow/analysis/world-run.d.ts +27 -0
- package/vendor/dynamic-workflow/analysis/world-run.d.ts.map +1 -0
- package/vendor/dynamic-workflow/analysis/world-run.js +44 -0
- package/vendor/dynamic-workflow/compiler/compile.d.ts +59 -0
- package/vendor/dynamic-workflow/compiler/compile.d.ts.map +1 -0
- package/vendor/dynamic-workflow/compiler/compile.js +159 -0
- package/vendor/dynamic-workflow/compiler/libs.generated.d.ts +3 -0
- package/vendor/dynamic-workflow/compiler/libs.generated.d.ts.map +1 -0
- package/vendor/dynamic-workflow/compiler/libs.generated.js +64 -0
- package/vendor/dynamic-workflow/engine/artifact-spec.d.ts +26 -0
- package/vendor/dynamic-workflow/engine/artifact-spec.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/artifact-spec.js +173 -0
- package/vendor/dynamic-workflow/engine/ask-observation-types.d.ts +54 -0
- package/vendor/dynamic-workflow/engine/ask-observation-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/ask-observation-types.js +19 -0
- package/vendor/dynamic-workflow/engine/cached-ask-facts.d.ts +28 -0
- package/vendor/dynamic-workflow/engine/cached-ask-facts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/cached-ask-facts.js +35 -0
- package/vendor/dynamic-workflow/engine/concurrency.d.ts +151 -0
- package/vendor/dynamic-workflow/engine/concurrency.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/concurrency.js +282 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts-primary.d.ts +17 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts-primary.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts-primary.js +29 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts.d.ts +55 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-artifacts.js +367 -0
- package/vendor/dynamic-workflow/engine/engine-config.d.ts +90 -0
- package/vendor/dynamic-workflow/engine/engine-config.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-config.js +6 -0
- package/vendor/dynamic-workflow/engine/engine-holes.d.ts +116 -0
- package/vendor/dynamic-workflow/engine/engine-holes.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-holes.js +142 -0
- package/vendor/dynamic-workflow/engine/engine-launch.d.ts +34 -0
- package/vendor/dynamic-workflow/engine/engine-launch.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-launch.js +26 -0
- package/vendor/dynamic-workflow/engine/engine-phase-stamp.d.ts +35 -0
- package/vendor/dynamic-workflow/engine/engine-phase-stamp.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-phase-stamp.js +74 -0
- package/vendor/dynamic-workflow/engine/engine-report.d.ts +27 -0
- package/vendor/dynamic-workflow/engine/engine-report.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-report.js +151 -0
- package/vendor/dynamic-workflow/engine/engine-resume.d.ts +18 -0
- package/vendor/dynamic-workflow/engine/engine-resume.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-resume.js +38 -0
- package/vendor/dynamic-workflow/engine/engine-settlement.d.ts +30 -0
- package/vendor/dynamic-workflow/engine/engine-settlement.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-settlement.js +79 -0
- package/vendor/dynamic-workflow/engine/engine-state.d.ts +99 -0
- package/vendor/dynamic-workflow/engine/engine-state.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-state.js +13 -0
- package/vendor/dynamic-workflow/engine/engine-world.d.ts +36 -0
- package/vendor/dynamic-workflow/engine/engine-world.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine-world.js +189 -0
- package/vendor/dynamic-workflow/engine/engine.d.ts +263 -0
- package/vendor/dynamic-workflow/engine/engine.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/engine.js +602 -0
- package/vendor/dynamic-workflow/engine/errors.d.ts +87 -0
- package/vendor/dynamic-workflow/engine/errors.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/errors.js +56 -0
- package/vendor/dynamic-workflow/engine/hash-mismatch.d.ts +10 -0
- package/vendor/dynamic-workflow/engine/hash-mismatch.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/hash-mismatch.js +15 -0
- package/vendor/dynamic-workflow/engine/hash.d.ts +16 -0
- package/vendor/dynamic-workflow/engine/hash.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/hash.js +48 -0
- package/vendor/dynamic-workflow/engine/imported-cache-types.d.ts +96 -0
- package/vendor/dynamic-workflow/engine/imported-cache-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/imported-cache-types.js +6 -0
- package/vendor/dynamic-workflow/engine/imported-cache.d.ts +127 -0
- package/vendor/dynamic-workflow/engine/imported-cache.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/imported-cache.js +244 -0
- package/vendor/dynamic-workflow/engine/index.d.ts +11 -0
- package/vendor/dynamic-workflow/engine/index.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/index.js +10 -0
- package/vendor/dynamic-workflow/engine/journal-memory.d.ts +32 -0
- package/vendor/dynamic-workflow/engine/journal-memory.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/journal-memory.js +243 -0
- package/vendor/dynamic-workflow/engine/journal-read-types.d.ts +72 -0
- package/vendor/dynamic-workflow/engine/journal-read-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/journal-read-types.js +28 -0
- package/vendor/dynamic-workflow/engine/persona.d.ts +20 -0
- package/vendor/dynamic-workflow/engine/persona.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/persona.js +43 -0
- package/vendor/dynamic-workflow/engine/replay-order.d.ts +96 -0
- package/vendor/dynamic-workflow/engine/replay-order.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/replay-order.js +229 -0
- package/vendor/dynamic-workflow/engine/run-terminal.d.ts +35 -0
- package/vendor/dynamic-workflow/engine/run-terminal.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/run-terminal.js +7 -0
- package/vendor/dynamic-workflow/engine/scheduler-submit.d.ts +22 -0
- package/vendor/dynamic-workflow/engine/scheduler-submit.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/scheduler-submit.js +84 -0
- package/vendor/dynamic-workflow/engine/scheduler-types.d.ts +105 -0
- package/vendor/dynamic-workflow/engine/scheduler-types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/scheduler-types.js +17 -0
- package/vendor/dynamic-workflow/engine/scheduler.d.ts +113 -0
- package/vendor/dynamic-workflow/engine/scheduler.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/scheduler.js +484 -0
- package/vendor/dynamic-workflow/engine/types.d.ts +979 -0
- package/vendor/dynamic-workflow/engine/types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/types.js +26 -0
- package/vendor/dynamic-workflow/engine/world-read-input.d.ts +10 -0
- package/vendor/dynamic-workflow/engine/world-read-input.d.ts.map +1 -0
- package/vendor/dynamic-workflow/engine/world-read-input.js +55 -0
- package/vendor/dynamic-workflow/facade/artifact-caps.d.ts +48 -0
- package/vendor/dynamic-workflow/facade/artifact-caps.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/artifact-caps.js +47 -0
- package/vendor/dynamic-workflow/facade/dts-hole.d.ts +16 -0
- package/vendor/dynamic-workflow/facade/dts-hole.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/dts-hole.js +26 -0
- package/vendor/dynamic-workflow/facade/dts-model.d.ts +11 -0
- package/vendor/dynamic-workflow/facade/dts-model.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/dts-model.js +18 -0
- package/vendor/dynamic-workflow/facade/dts-stream.d.ts +15 -0
- package/vendor/dynamic-workflow/facade/dts-stream.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/dts-stream.js +41 -0
- package/vendor/dynamic-workflow/facade/dts.d.ts +29 -0
- package/vendor/dynamic-workflow/facade/dts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/dts.js +324 -0
- package/vendor/dynamic-workflow/facade/registry.d.ts +218 -0
- package/vendor/dynamic-workflow/facade/registry.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/registry.js +203 -0
- package/vendor/dynamic-workflow/facade/report-caps.d.ts +40 -0
- package/vendor/dynamic-workflow/facade/report-caps.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/report-caps.js +39 -0
- package/vendor/dynamic-workflow/facade/world-read-caps.d.ts +37 -0
- package/vendor/dynamic-workflow/facade/world-read-caps.d.ts.map +1 -0
- package/vendor/dynamic-workflow/facade/world-read-caps.js +36 -0
- package/vendor/dynamic-workflow/index.d.ts +41 -0
- package/vendor/dynamic-workflow/index.d.ts.map +1 -0
- package/vendor/dynamic-workflow/index.js +51 -0
- package/vendor/dynamic-workflow/lowering/index.d.ts +2 -0
- package/vendor/dynamic-workflow/lowering/index.d.ts.map +1 -0
- package/vendor/dynamic-workflow/lowering/index.js +1 -0
- package/vendor/dynamic-workflow/lowering/lower-hole.d.ts +16 -0
- package/vendor/dynamic-workflow/lowering/lower-hole.d.ts.map +1 -0
- package/vendor/dynamic-workflow/lowering/lower-hole.js +63 -0
- package/vendor/dynamic-workflow/lowering/lower.d.ts +82 -0
- package/vendor/dynamic-workflow/lowering/lower.d.ts.map +1 -0
- package/vendor/dynamic-workflow/lowering/lower.js +333 -0
- package/vendor/dynamic-workflow/projections.d.ts +26 -0
- package/vendor/dynamic-workflow/projections.d.ts.map +1 -0
- package/vendor/dynamic-workflow/projections.js +23 -0
- package/vendor/dynamic-workflow/schema/actor-submit-profiles.d.ts +49 -0
- package/vendor/dynamic-workflow/schema/actor-submit-profiles.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/actor-submit-profiles.js +69 -0
- package/vendor/dynamic-workflow/schema/emit.d.ts +55 -0
- package/vendor/dynamic-workflow/schema/emit.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/emit.js +325 -0
- package/vendor/dynamic-workflow/schema/jsdoc.d.ts +10 -0
- package/vendor/dynamic-workflow/schema/jsdoc.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/jsdoc.js +83 -0
- package/vendor/dynamic-workflow/schema/serialize.d.ts +8 -0
- package/vendor/dynamic-workflow/schema/serialize.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/serialize.js +20 -0
- package/vendor/dynamic-workflow/schema/synthesize.d.ts +48 -0
- package/vendor/dynamic-workflow/schema/synthesize.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/synthesize.js +138 -0
- package/vendor/dynamic-workflow/schema/types.d.ts +67 -0
- package/vendor/dynamic-workflow/schema/types.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/types.js +18 -0
- package/vendor/dynamic-workflow/schema/validate.d.ts +15 -0
- package/vendor/dynamic-workflow/schema/validate.d.ts.map +1 -0
- package/vendor/dynamic-workflow/schema/validate.js +213 -0
- package/vendor/dynamic-workflow/testing/index.d.ts +6 -0
- package/vendor/dynamic-workflow/testing/index.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/index.js +5 -0
- package/vendor/dynamic-workflow/testing/journal-contract-artifacts.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-artifacts.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-artifacts.js +195 -0
- package/vendor/dynamic-workflow/testing/journal-contract-events.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-events.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-events.js +163 -0
- package/vendor/dynamic-workflow/testing/journal-contract-helpers.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-helpers.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-helpers.js +12 -0
- package/vendor/dynamic-workflow/testing/journal-contract-isolation.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-isolation.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-isolation.js +46 -0
- package/vendor/dynamic-workflow/testing/journal-contract-nodes.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-nodes.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-nodes.js +234 -0
- package/vendor/dynamic-workflow/testing/journal-contract-reads.d.ts +11 -0
- package/vendor/dynamic-workflow/testing/journal-contract-reads.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-reads.js +281 -0
- package/vendor/dynamic-workflow/testing/journal-contract-runs.d.ts +9 -0
- package/vendor/dynamic-workflow/testing/journal-contract-runs.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-runs.js +396 -0
- package/vendor/dynamic-workflow/testing/journal-contract-script.d.ts +12 -0
- package/vendor/dynamic-workflow/testing/journal-contract-script.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract-script.js +82 -0
- package/vendor/dynamic-workflow/testing/journal-contract.d.ts +15 -0
- package/vendor/dynamic-workflow/testing/journal-contract.d.ts.map +1 -0
- package/vendor/dynamic-workflow/testing/journal-contract.js +31 -0
- package/vendor/dynamic-workflow-runtime/child-cell-streams.js +128 -0
- package/vendor/dynamic-workflow-runtime/child-entry-file.js +43 -0
- package/vendor/dynamic-workflow-runtime/child-source.js +299 -0
- package/vendor/dynamic-workflow-runtime/harness.js +302 -0
- package/vendor/dynamic-workflow-runtime/index.js +4 -0
- package/vendor/dynamic-workflow-runtime/protocol.js +2 -0
- package/vendor/mcode-host/dynamic-workflow-import.js +269 -0
- package/vendor/mcode-host/workflow-git-world-read.js +183 -0
- package/vendor/mcode-host/workflow-world-read.js +282 -0
|
@@ -0,0 +1,569 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import { addOcc, addPlaceholder, collapse, emptyValue, isActorSite, isFunctionLike, mergeInto, phKey, provisionalFanoutId, } from "./domain.js";
|
|
3
|
+
import { findWorkflowBody } from "./domain.js";
|
|
4
|
+
export class TaintState {
|
|
5
|
+
table;
|
|
6
|
+
checker;
|
|
7
|
+
program;
|
|
8
|
+
scriptFile;
|
|
9
|
+
body;
|
|
10
|
+
// Site lookups keyed by their raw AST nodes (the table resolved them via the checker).
|
|
11
|
+
askByCall = new Map();
|
|
12
|
+
askSites = new Map();
|
|
13
|
+
worldByCall = new Map();
|
|
14
|
+
joinByCall = new Map();
|
|
15
|
+
actorByCall = new Map();
|
|
16
|
+
/** 留白调用 → 站点(开放与已补全都在;transfer 规则按有无 body 分派)。 */
|
|
17
|
+
holeByCall = new Map();
|
|
18
|
+
/** Per-element callback calls (`xs.map(fn)`, `Array.from(xs, fn)`, …), keyed by the CALL. */
|
|
19
|
+
candByCall = new Map();
|
|
20
|
+
candByForOf = new Map();
|
|
21
|
+
/**
|
|
22
|
+
* THE CALL ORACLE: for every call / `new` /
|
|
23
|
+
* tagged-template node, the script-local functions this pass applied there and HOW —
|
|
24
|
+
* `callee` (the node's callee value held the function: direct call, through a parameter,
|
|
25
|
+
* a field, a class member) or `argument` (the node handed the function to a library callee
|
|
26
|
+
* that may invoke it: a registry entry or the keystone rule). Monotone like every other
|
|
27
|
+
* accumulator; read after convergence by the ordering walk, which inlines exactly these
|
|
28
|
+
* bodies at exactly these sites instead of guessing from syntax.
|
|
29
|
+
*/
|
|
30
|
+
applications = new Map();
|
|
31
|
+
/**
|
|
32
|
+
* The live abstract result of each `Promise.all` join call, keyed by the join CALL NODE
|
|
33
|
+
* and PERSISTENT across fixpoint passes (see {@link joinResultOf}). A join result IS a
|
|
34
|
+
* place whose element fields carry may-alias back-references to the (place) inputs, so
|
|
35
|
+
* resolvePlace returns it — letting `const [a, b] = await Promise.all([…])`
|
|
36
|
+
* destructure-alias the elements and a write through `res[k]` reach the original input.
|
|
37
|
+
*/
|
|
38
|
+
joinResults = new Map();
|
|
39
|
+
/**
|
|
40
|
+
* The live abstract place of each conditional expression used as a place
|
|
41
|
+
* (`flag ? box1 : box2`), keyed by the ConditionalExpression NODE and persistent across
|
|
42
|
+
* passes (see {@link condPlaceOf}). Same canonical-heap requirement as {@link joinResults}.
|
|
43
|
+
*/
|
|
44
|
+
condPlaces = new Map();
|
|
45
|
+
/** Allocation-site places of container literals; see {@link literalPlaceOf}. */
|
|
46
|
+
literalPlaces = new Map();
|
|
47
|
+
// Script-local functions (excluding iteration callbacks, handled inline).
|
|
48
|
+
fnId = new Map();
|
|
49
|
+
fnParamSymbols = new Map();
|
|
50
|
+
functions = [];
|
|
51
|
+
callbackNodes = new Set();
|
|
52
|
+
/**
|
|
53
|
+
* Object-literal set accessors, keyed by property name -> setter fn ids. Crude but
|
|
54
|
+
* sound: an assignment to ANY property of that name (on any object) records the
|
|
55
|
+
* assigned value as the setter's param-0 actual, so the setter body's flow is seen.
|
|
56
|
+
*/
|
|
57
|
+
settersByProp = new Map();
|
|
58
|
+
/**
|
|
59
|
+
* One shared abstract instance per class declaration/expression, keyed by the class
|
|
60
|
+
* node. Static AND instance members conflate into this ONE value (a deliberate sound
|
|
61
|
+
* over-approximation: per-instance and static/instance precision are out of scope, so
|
|
62
|
+
* a write through any instance, through `this`, or through the class name is visible
|
|
63
|
+
* through every other). Persistent across fixpoint passes — growth is signalled like
|
|
64
|
+
* any env slot.
|
|
65
|
+
*/
|
|
66
|
+
classInstances = new Map();
|
|
67
|
+
/** Class declarations/expressions in the workflow body, in discovery order. */
|
|
68
|
+
classes = [];
|
|
69
|
+
// Persistent fixpoint state.
|
|
70
|
+
env = new Map();
|
|
71
|
+
summaries = new Map();
|
|
72
|
+
paramActuals = new Map();
|
|
73
|
+
/**
|
|
74
|
+
* Per-placeholder-parameter set of values that MAY be passed to an INVOCATION of that
|
|
75
|
+
* parameter (keyed by `${fnId}:${param}`). Two capture sites (calls.ts handleUnknownCall):
|
|
76
|
+
* a direct call of a placeholder callee (`resolve(draft)` — resolve is param 0), and a
|
|
77
|
+
* placeholder-valued argument to an unknown call (`draft.then(onOk)` — the unknown `.then`
|
|
78
|
+
* may invoke onOk with the receiver pot). Consumed by the promise machinery: `new
|
|
79
|
+
* Unknown(fn)` and `await thenable` resolve to whatever fn's / then's callback params
|
|
80
|
+
* receive (the resolve/reject/continuation pattern). Distinct from {@link paramActuals},
|
|
81
|
+
* which records what a function receives when IT is called.
|
|
82
|
+
*/
|
|
83
|
+
phCallActuals = new Map();
|
|
84
|
+
reachSet = new Set();
|
|
85
|
+
calledFns = new Map();
|
|
86
|
+
promotedOrders = new Set();
|
|
87
|
+
/**
|
|
88
|
+
* Per-`reduce`-candidate accumulator taint (keyed by candidate `order`), carried
|
|
89
|
+
* ACROSS fixpoint passes. The callback-return value that reduce threads into the
|
|
90
|
+
* accumulator param is a fresh local each pass, so binding the param from it
|
|
91
|
+
* directly never observed the return taint; this persistent slot fixes that.
|
|
92
|
+
*/
|
|
93
|
+
reduceAcc = new Map();
|
|
94
|
+
// Sink accumulators (may contain placeholders; resolved at emission).
|
|
95
|
+
askInstr = new Map();
|
|
96
|
+
askRecv = new Map();
|
|
97
|
+
worldRead = new Map();
|
|
98
|
+
/** 开放留白的提示 sink(docs/analysis.md「Sites」:提示流入留白,如 ask 的 instructions)。 */
|
|
99
|
+
holePrompt = new Map();
|
|
100
|
+
joinInByPort = new Map();
|
|
101
|
+
fanoutInVal = new Map();
|
|
102
|
+
/**
|
|
103
|
+
* The ORACLE accumulators, keyed by source START OFFSET rather than by site id: the
|
|
104
|
+
* value each `await` operand carries, and the value each guard expression reads. They
|
|
105
|
+
* feed {@link emitOracle}, which only the temporal walk (causality-order.ts) consumes —
|
|
106
|
+
* nothing here changes a transfer rule, and a position keys nothing in the site
|
|
107
|
+
* vocabulary, which is what keeps the site-id stability rule untouched: no `order`
|
|
108
|
+
* counter and no per-kind counter is consulted.
|
|
109
|
+
*/
|
|
110
|
+
awaitVal = new Map();
|
|
111
|
+
guardVal = new Map();
|
|
112
|
+
returnVal = emptyValue();
|
|
113
|
+
/**
|
|
114
|
+
* One script-global thrown-value set: every `throw` joins its operand into it and
|
|
115
|
+
* every `catch` binding reads all of it. A flow-insensitive over-approximation of
|
|
116
|
+
* exception routing — sound under gen-only, deliberately imprecise across disjoint
|
|
117
|
+
* `try` blocks. Persistent across passes so throws in one iteration reach catches
|
|
118
|
+
* in the next (fixpoint-safe).
|
|
119
|
+
*/
|
|
120
|
+
thrownVal = emptyValue();
|
|
121
|
+
changed = false;
|
|
122
|
+
constructor(workflow, table) {
|
|
123
|
+
this.table = table;
|
|
124
|
+
this.checker = workflow.program.getTypeChecker();
|
|
125
|
+
this.program = workflow.program;
|
|
126
|
+
this.scriptFile = workflow.scriptFile;
|
|
127
|
+
this.body = findWorkflowBody(workflow.scriptFile);
|
|
128
|
+
this.buildLookups();
|
|
129
|
+
this.collectFunctions();
|
|
130
|
+
}
|
|
131
|
+
buildLookups() {
|
|
132
|
+
for (const site of this.table.asks) {
|
|
133
|
+
this.askByCall.set(site.call, site.id);
|
|
134
|
+
this.askSites.set(site.id, { instructions: site.instructions, receiver: site.receiver });
|
|
135
|
+
}
|
|
136
|
+
for (const site of this.table.worldReads)
|
|
137
|
+
this.worldByCall.set(site.call, { args: site.args, id: site.id });
|
|
138
|
+
for (const site of this.table.joins)
|
|
139
|
+
this.joinByCall.set(site.call, { arg: site.arg, id: site.id });
|
|
140
|
+
for (const site of this.table.actors)
|
|
141
|
+
this.actorByCall.set(site.call, site.id);
|
|
142
|
+
for (const site of this.table.holes)
|
|
143
|
+
this.holeByCall.set(site.call, site);
|
|
144
|
+
for (const cand of this.table.iterations) {
|
|
145
|
+
if (cand.form === "array-method" && cand.call !== undefined) {
|
|
146
|
+
this.candByCall.set(cand.call, cand);
|
|
147
|
+
// An inline callback literal is evaluated in place (array-methods.ts), never as a
|
|
148
|
+
// tracked function; a non-literal callback's functions are tracked and applied.
|
|
149
|
+
if (cand.callback !== undefined)
|
|
150
|
+
this.callbackNodes.add(cand.callback);
|
|
151
|
+
}
|
|
152
|
+
else if (cand.form === "for-of") {
|
|
153
|
+
// candidate.body === ForOfStatement.statement, so body.parent is the for-of.
|
|
154
|
+
this.candByForOf.set(cand.body.parent, cand);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
collectFunctions() {
|
|
159
|
+
const visit = (node) => {
|
|
160
|
+
// One shared abstract instance per class (declaration or expression); constructors,
|
|
161
|
+
// methods and accessors are collected as tracked functions below (isFunctionLike
|
|
162
|
+
// covers them), so their bodies get summaries like any other function.
|
|
163
|
+
if (ts.isClassDeclaration(node) || ts.isClassExpression(node)) {
|
|
164
|
+
this.classInstances.set(node, emptyValue());
|
|
165
|
+
this.classes.push(node);
|
|
166
|
+
}
|
|
167
|
+
if (isFunctionLike(node) && !this.callbackNodes.has(node)) {
|
|
168
|
+
const id = this.functions.length;
|
|
169
|
+
this.fnId.set(node, id);
|
|
170
|
+
this.functions.push(node);
|
|
171
|
+
const decl = node;
|
|
172
|
+
this.fnParamSymbols.set(id, decl.parameters.map((p) => ts.isIdentifier(p.name) ? this.checker.getSymbolAtLocation(p.name) : undefined));
|
|
173
|
+
// Object-literal set accessor: index it by property name so property writes
|
|
174
|
+
// can feed the setter's param (see settersByProp).
|
|
175
|
+
if (ts.isSetAccessorDeclaration(node) && !ts.isComputedPropertyName(node.name)) {
|
|
176
|
+
const name = node.name.getText(this.scriptFile);
|
|
177
|
+
const list = this.settersByProp.get(name);
|
|
178
|
+
if (list === undefined)
|
|
179
|
+
this.settersByProp.set(name, [id]);
|
|
180
|
+
else
|
|
181
|
+
list.push(id);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
ts.forEachChild(node, visit);
|
|
185
|
+
};
|
|
186
|
+
for (const stmt of this.body.statements)
|
|
187
|
+
visit(stmt);
|
|
188
|
+
}
|
|
189
|
+
// -- monotone update primitives ------------------------------------------
|
|
190
|
+
/**
|
|
191
|
+
* Bind a symbol to an abstract value. A FRESH symbol ADOPTS the value object by
|
|
192
|
+
* reference (`env[sym] === value`); an already-bound slot weak-merges (sound smear).
|
|
193
|
+
* Adoption is what makes bindings alias rather than snapshot: passing a live place (env slot / live field) shares it, so a later
|
|
194
|
+
* write through any alias is visible through every other. Callers that must NOT
|
|
195
|
+
* alias pass a fresh clone/collapse (reads already return snapshots).
|
|
196
|
+
*/
|
|
197
|
+
bindSymbol(sym, value) {
|
|
198
|
+
const existing = this.env.get(sym);
|
|
199
|
+
if (existing === undefined) {
|
|
200
|
+
this.env.set(sym, value);
|
|
201
|
+
this.changed = true;
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (existing !== value && mergeInto(existing, value))
|
|
205
|
+
this.changed = true;
|
|
206
|
+
}
|
|
207
|
+
envSlot(sym) {
|
|
208
|
+
let slot = this.env.get(sym);
|
|
209
|
+
if (slot === undefined) {
|
|
210
|
+
slot = emptyValue();
|
|
211
|
+
this.env.set(sym, slot);
|
|
212
|
+
}
|
|
213
|
+
return slot;
|
|
214
|
+
}
|
|
215
|
+
summaryOf(id) {
|
|
216
|
+
let slot = this.summaries.get(id);
|
|
217
|
+
if (slot === undefined) {
|
|
218
|
+
slot = emptyValue();
|
|
219
|
+
this.summaries.set(id, slot);
|
|
220
|
+
}
|
|
221
|
+
return slot;
|
|
222
|
+
}
|
|
223
|
+
/** The shared abstract instance of a class node, created empty on demand (persistent). */
|
|
224
|
+
instanceOf(cls) {
|
|
225
|
+
let inst = this.classInstances.get(cls);
|
|
226
|
+
if (inst === undefined) {
|
|
227
|
+
inst = emptyValue();
|
|
228
|
+
this.classInstances.set(cls, inst);
|
|
229
|
+
}
|
|
230
|
+
return inst;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* The shared abstract result of a join call, created empty on demand (persistent).
|
|
234
|
+
*
|
|
235
|
+
* THE CANONICAL-HEAP INVARIANT: every value that models runtime storage — anything that
|
|
236
|
+
* can be aliased, written through, or referenced from a `mayAlias` set — is keyed by a
|
|
237
|
+
* static program point and lives across fixpoint passes; per-pass temporaries are
|
|
238
|
+
* snapshots only. handleJoin used to mint a FRESH result value each pass, so
|
|
239
|
+
* `Promise.all([Promise.all([…])])` added a never-before-seen object to the outer
|
|
240
|
+
* element's `mayAlias` set every pass. That set dedups by IDENTITY (domain.ts), so
|
|
241
|
+
* `changed` stayed true forever and the fixpoint hit ITERATION_CAP. Keying the result by
|
|
242
|
+
* the call node makes the identity stable, so the union saturates.
|
|
243
|
+
*/
|
|
244
|
+
joinResultOf(call) {
|
|
245
|
+
let result = this.joinResults.get(call);
|
|
246
|
+
if (result === undefined) {
|
|
247
|
+
result = emptyValue();
|
|
248
|
+
this.joinResults.set(call, result);
|
|
249
|
+
}
|
|
250
|
+
return result;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* The shared abstract place of a conditional expression, created empty on demand
|
|
254
|
+
* (persistent). Same canonical-heap invariant as {@link joinResultOf}: a per-pass
|
|
255
|
+
* wrapper for `flag ? box1 : box2` diverged the fixpoint as soon as it became a
|
|
256
|
+
* `mayAlias` target — which a SYNTACTICALLY NESTED ternary place
|
|
257
|
+
* (`f2 ? (f ? box1 : box2) : box3`) does on every pass.
|
|
258
|
+
*/
|
|
259
|
+
condPlaceOf(node) {
|
|
260
|
+
let place = this.condPlaces.get(node);
|
|
261
|
+
if (place === undefined) {
|
|
262
|
+
place = emptyValue();
|
|
263
|
+
this.condPlaces.set(node, place);
|
|
264
|
+
}
|
|
265
|
+
return place;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* The allocation-site place of a container literal (`{…}` / `[…]`): the value its first
|
|
269
|
+
* evaluation produced, kept across passes and weak-merged with every re-evaluation
|
|
270
|
+
* (persistent). Same canonical-heap invariant as {@link joinResultOf}: a literal IS runtime
|
|
271
|
+
* storage — a callee writes through it (`fill([], v)`, `tag({ name }, t)` with
|
|
272
|
+
* `box.note = t`), a binding adopts it, a spread shares its fields — so a value recreated
|
|
273
|
+
* every pass can never settle once something persistent merges INTO it. The
|
|
274
|
+
* parameter write-back targeted the per-pass fresh literal, reported a change on every pass
|
|
275
|
+
* (the note it had just added was gone again), and the fixpoint hit ITERATION_CAP with no
|
|
276
|
+
* state growing at all. Any `f({ … })` whose callee mutates its parameter was affected.
|
|
277
|
+
*
|
|
278
|
+
* Adopting the first evaluation (rather than minting an empty slot) keeps the literal's
|
|
279
|
+
* aliasing: a field that stores a live place (`{ box }`, `[obj]`) keeps pointing at that
|
|
280
|
+
* slot, and later passes merge the same slot into itself — an identity no-op. Snapshot
|
|
281
|
+
* fields accumulate monotonically, exactly as an env slot bound to the literal always did.
|
|
282
|
+
*/
|
|
283
|
+
literalPlaceOf(node, fresh) {
|
|
284
|
+
const place = this.literalPlaces.get(node);
|
|
285
|
+
if (place === undefined) {
|
|
286
|
+
this.literalPlaces.set(node, fresh);
|
|
287
|
+
return fresh;
|
|
288
|
+
}
|
|
289
|
+
if (mergeInto(place, fresh))
|
|
290
|
+
this.changed = true;
|
|
291
|
+
return place;
|
|
292
|
+
}
|
|
293
|
+
mergeReturn(value) {
|
|
294
|
+
if (mergeInto(this.returnVal, value))
|
|
295
|
+
this.changed = true;
|
|
296
|
+
}
|
|
297
|
+
/** Join a thrown operand into the script-global thrown-value set. */
|
|
298
|
+
mergeThrown(value) {
|
|
299
|
+
if (mergeInto(this.thrownVal, value))
|
|
300
|
+
this.changed = true;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Weak-merge into a keyed sink accumulator. Generic in the key so the oracle
|
|
304
|
+
* accumulators ({@link awaitVal} / {@link guardVal}), which are keyed by source offset
|
|
305
|
+
* rather than site id, share the one monotone update path every other sink uses.
|
|
306
|
+
*/
|
|
307
|
+
mergeSink(map, id, value) {
|
|
308
|
+
let slot = map.get(id);
|
|
309
|
+
if (slot === undefined) {
|
|
310
|
+
slot = emptyValue();
|
|
311
|
+
map.set(id, slot);
|
|
312
|
+
}
|
|
313
|
+
if (mergeInto(slot, value))
|
|
314
|
+
this.changed = true;
|
|
315
|
+
}
|
|
316
|
+
mergeJoinIn(id, port, value) {
|
|
317
|
+
let ports = this.joinInByPort.get(id);
|
|
318
|
+
if (ports === undefined) {
|
|
319
|
+
ports = new Map();
|
|
320
|
+
this.joinInByPort.set(id, ports);
|
|
321
|
+
}
|
|
322
|
+
let slot = ports.get(port);
|
|
323
|
+
if (slot === undefined) {
|
|
324
|
+
slot = emptyValue();
|
|
325
|
+
ports.set(port, slot);
|
|
326
|
+
}
|
|
327
|
+
if (mergeInto(slot, value))
|
|
328
|
+
this.changed = true;
|
|
329
|
+
}
|
|
330
|
+
addParamActual(id, param, value) {
|
|
331
|
+
const key = `${id}:${param}`;
|
|
332
|
+
let slot = this.paramActuals.get(key);
|
|
333
|
+
if (slot === undefined) {
|
|
334
|
+
slot = emptyValue();
|
|
335
|
+
this.paramActuals.set(key, slot);
|
|
336
|
+
}
|
|
337
|
+
if (mergeInto(slot, value))
|
|
338
|
+
this.changed = true;
|
|
339
|
+
}
|
|
340
|
+
/** Record a value that may reach an invocation of the placeholder-parameter `key`. */
|
|
341
|
+
recordPhCall(key, value) {
|
|
342
|
+
let slot = this.phCallActuals.get(key);
|
|
343
|
+
if (slot === undefined) {
|
|
344
|
+
slot = emptyValue();
|
|
345
|
+
this.phCallActuals.set(key, slot);
|
|
346
|
+
}
|
|
347
|
+
if (mergeInto(slot, value))
|
|
348
|
+
this.changed = true;
|
|
349
|
+
}
|
|
350
|
+
/** The taint fed to invocations of a function's parameter `param`, if any. */
|
|
351
|
+
phCallActualsOf(id, param) {
|
|
352
|
+
return this.phCallActuals.get(`${id}:${param}`);
|
|
353
|
+
}
|
|
354
|
+
/** The persistent accumulator taint for a `reduce` candidate (empty until seeded). */
|
|
355
|
+
reduceAccOf(order) {
|
|
356
|
+
let slot = this.reduceAcc.get(order);
|
|
357
|
+
if (slot === undefined) {
|
|
358
|
+
slot = emptyValue();
|
|
359
|
+
this.reduceAcc.set(order, slot);
|
|
360
|
+
}
|
|
361
|
+
return slot;
|
|
362
|
+
}
|
|
363
|
+
/** Merge a pass's callback-return taint into a `reduce` candidate's accumulator. */
|
|
364
|
+
mergeReduceAcc(order, value) {
|
|
365
|
+
if (mergeInto(this.reduceAccOf(order), value))
|
|
366
|
+
this.changed = true;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Record a call against EVERY enclosing region, mirroring {@link markFacade}.
|
|
370
|
+
* Recording only the innermost region left a caller function `fn@f`
|
|
371
|
+
* unmarked when its call to `g` happened inside an iteration candidate's callback
|
|
372
|
+
* (region `cand@N`). Reachability then never propagated `fn@f`, so a sibling
|
|
373
|
+
* candidate whose callback calls `f` failed to promote to a fan-out — an
|
|
374
|
+
* under-approximation (a dropped may-flow), which this analysis must never do.
|
|
375
|
+
*/
|
|
376
|
+
markCalled(regionStack, id) {
|
|
377
|
+
for (const region of regionStack) {
|
|
378
|
+
let called = this.calledFns.get(region);
|
|
379
|
+
if (called === undefined) {
|
|
380
|
+
called = new Set();
|
|
381
|
+
this.calledFns.set(region, called);
|
|
382
|
+
}
|
|
383
|
+
if (!called.has(id)) {
|
|
384
|
+
called.add(id);
|
|
385
|
+
this.changed = true;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
/** Record that `fn` was applied at `site` (see {@link applications}). Not a fixpoint
|
|
390
|
+
* signal: applications feed no transfer rule, and the final pass re-records them all. */
|
|
391
|
+
recordApplication(site, fn, via) {
|
|
392
|
+
let applied = this.applications.get(site);
|
|
393
|
+
if (applied === undefined) {
|
|
394
|
+
applied = new Map();
|
|
395
|
+
this.applications.set(site, applied);
|
|
396
|
+
}
|
|
397
|
+
// `callee` wins over `argument` for one function at one site (both can happen for a
|
|
398
|
+
// function passed to itself; the callee reading is the one that surely runs).
|
|
399
|
+
if (applied.get(fn) !== "callee")
|
|
400
|
+
applied.set(fn, via);
|
|
401
|
+
}
|
|
402
|
+
/** Mark every enclosing region as reaching a facade site. */
|
|
403
|
+
markFacade(regionStack) {
|
|
404
|
+
for (const region of regionStack) {
|
|
405
|
+
if (!this.reachSet.has(region)) {
|
|
406
|
+
this.reachSet.add(region);
|
|
407
|
+
this.changed = true;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
/** Propagate reachability across the call graph until it stops growing. */
|
|
412
|
+
propagateReachability() {
|
|
413
|
+
let grew = true;
|
|
414
|
+
while (grew) {
|
|
415
|
+
grew = false;
|
|
416
|
+
for (const [region, fns] of this.calledFns) {
|
|
417
|
+
if (this.reachSet.has(region))
|
|
418
|
+
continue;
|
|
419
|
+
for (const id of fns) {
|
|
420
|
+
if (this.reachSet.has(`fn@${id}`)) {
|
|
421
|
+
this.reachSet.add(region);
|
|
422
|
+
this.changed = true;
|
|
423
|
+
grew = true;
|
|
424
|
+
break;
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
/** Promote iteration candidates whose body region reaches a facade site. */
|
|
431
|
+
recomputePromotion() {
|
|
432
|
+
for (const cand of this.table.iterations) {
|
|
433
|
+
if (this.promotedOrders.has(cand.order))
|
|
434
|
+
continue;
|
|
435
|
+
if (this.reachSet.has(`cand@${cand.order}`)) {
|
|
436
|
+
this.promotedOrders.add(cand.order);
|
|
437
|
+
this.changed = true;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
// -- emission ------------------------------------------------------------
|
|
442
|
+
emitFacts() {
|
|
443
|
+
const askData = new Map();
|
|
444
|
+
const askActor = new Map();
|
|
445
|
+
const worldReadData = new Map();
|
|
446
|
+
const joinIn = new Map();
|
|
447
|
+
const fanoutIn = new Map();
|
|
448
|
+
for (const [id, value] of this.askInstr)
|
|
449
|
+
askData.set(id, this.resolveArtifact(value));
|
|
450
|
+
for (const [id, value] of this.askRecv)
|
|
451
|
+
askActor.set(id, this.resolveActor(value));
|
|
452
|
+
for (const [id, value] of this.worldRead)
|
|
453
|
+
worldReadData.set(id, this.resolveArtifact(value));
|
|
454
|
+
const holeData = new Map();
|
|
455
|
+
for (const [id, value] of this.holePrompt)
|
|
456
|
+
holeData.set(id, this.resolveArtifact(value));
|
|
457
|
+
for (const [id, ports] of this.joinInByPort) {
|
|
458
|
+
const occs = [];
|
|
459
|
+
for (const [port, value] of ports) {
|
|
460
|
+
for (const occ of this.resolveArtifact(value)) {
|
|
461
|
+
occs.push({ exact: occ.exact, site: occ.site, ...(port >= 0 ? { port } : {}) });
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
joinIn.set(id, occs);
|
|
465
|
+
}
|
|
466
|
+
for (const [id, value] of this.fanoutInVal)
|
|
467
|
+
fanoutIn.set(id, this.resolveArtifact(value));
|
|
468
|
+
const promoted = this.table.iterations
|
|
469
|
+
.filter((cand) => this.promotedOrders.has(cand.order))
|
|
470
|
+
.sort((a, b) => a.order - b.order)
|
|
471
|
+
.map((cand) => ({ id: provisionalFanoutId(cand.order), label: "fan-out", loc: cand.loc, order: cand.order }));
|
|
472
|
+
return {
|
|
473
|
+
askActor,
|
|
474
|
+
askData,
|
|
475
|
+
fanoutIn,
|
|
476
|
+
holeData,
|
|
477
|
+
joinIn,
|
|
478
|
+
promoted,
|
|
479
|
+
returnData: this.resolveArtifact(this.returnVal),
|
|
480
|
+
worldReadData,
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
/**
|
|
484
|
+
* The ordering walk's oracle view, resolved directly off the CONVERGED interpreter
|
|
485
|
+
* state — the fused pass's replacement for the `awaitSettles`/`guardReads` members
|
|
486
|
+
* TaintFacts used to carry.
|
|
487
|
+
* Same keying (`node.getStart(scriptFile)` of the awaited/guard expression) and the
|
|
488
|
+
* SAME resolution pipeline as every artifact sink (placeholders expanded, collapsed,
|
|
489
|
+
* actor labels filtered) — so an awaited parameter still resolves to the union of the
|
|
490
|
+
* promises its callers passed in, across all call sites. That union is normative: the
|
|
491
|
+
* temporal walk must see today's context-INsensitive values bit-for-bit; caller-context
|
|
492
|
+
* precision is explicitly out of scope.
|
|
493
|
+
*
|
|
494
|
+
* Only meaningful after the fixpoint has converged; interpret.ts is the one caller.
|
|
495
|
+
*/
|
|
496
|
+
emitOracle() {
|
|
497
|
+
const awaitSettles = new Map();
|
|
498
|
+
for (const [pos, value] of this.awaitVal)
|
|
499
|
+
awaitSettles.set(pos, this.resolveArtifact(value));
|
|
500
|
+
const guardReads = new Map();
|
|
501
|
+
for (const [pos, value] of this.guardVal)
|
|
502
|
+
guardReads.set(pos, this.resolveArtifact(value));
|
|
503
|
+
return { applications: this.applications, awaitSettles, guardReads };
|
|
504
|
+
}
|
|
505
|
+
resolveArtifact(value) {
|
|
506
|
+
return this.resolveOccs(value).filter((occ) => !isActorSite(occ.site));
|
|
507
|
+
}
|
|
508
|
+
resolveActor(value) {
|
|
509
|
+
return this.resolveOccs(value).filter((occ) => isActorSite(occ.site));
|
|
510
|
+
}
|
|
511
|
+
resolveOccs(value) {
|
|
512
|
+
return [...collapse(this.resolvePlaceholders(value, new Set())).occs.values()];
|
|
513
|
+
}
|
|
514
|
+
/** Expand parameter placeholders to the union of actual arguments across all calls. */
|
|
515
|
+
resolvePlaceholders(value, visiting, seen = new Set()) {
|
|
516
|
+
if (seen.has(value))
|
|
517
|
+
return emptyValue(); // cycle-safe: a shared field contributes once
|
|
518
|
+
seen.add(value);
|
|
519
|
+
const out = emptyValue();
|
|
520
|
+
for (const occ of value.occs.values())
|
|
521
|
+
addOcc(out, occ);
|
|
522
|
+
for (const ph of value.phs.values())
|
|
523
|
+
this.resolvePlaceholder(out, ph, visiting);
|
|
524
|
+
for (const [key, field] of value.fields)
|
|
525
|
+
out.fields.set(key, this.resolvePlaceholders(field, visiting, seen));
|
|
526
|
+
// A bound function reaching an emission point (e.g. a returned bound function) must not
|
|
527
|
+
// drop its prefix's taint; fold each resolved prefix arg in (collapsed at emission).
|
|
528
|
+
for (const el of value.bound ?? [])
|
|
529
|
+
mergeInto(out, this.resolvePlaceholders(el, visiting, seen));
|
|
530
|
+
return out;
|
|
531
|
+
}
|
|
532
|
+
resolvePlaceholder(out, ph, visiting) {
|
|
533
|
+
if (ph.rest === true) {
|
|
534
|
+
// A rest formal gathers every actual recorded at index >= ph.param (calls
|
|
535
|
+
// record actuals positionally, so a rest param has many keyed slots).
|
|
536
|
+
for (const [key, actual] of this.paramActuals) {
|
|
537
|
+
const sep = key.indexOf(":");
|
|
538
|
+
if (Number(key.slice(0, sep)) !== ph.fnId || Number(key.slice(sep + 1)) < ph.param)
|
|
539
|
+
continue;
|
|
540
|
+
if (visiting.has(key))
|
|
541
|
+
continue;
|
|
542
|
+
visiting.add(key);
|
|
543
|
+
mergeInto(out, this.resolvePlaceholders(actual, visiting));
|
|
544
|
+
visiting.delete(key);
|
|
545
|
+
}
|
|
546
|
+
return;
|
|
547
|
+
}
|
|
548
|
+
const key = phKey(ph);
|
|
549
|
+
if (visiting.has(key))
|
|
550
|
+
return; // recursion → bottom
|
|
551
|
+
const actual = this.paramActuals.get(key);
|
|
552
|
+
if (actual === undefined)
|
|
553
|
+
return;
|
|
554
|
+
visiting.add(key);
|
|
555
|
+
mergeInto(out, this.resolvePlaceholders(actual, visiting));
|
|
556
|
+
visiting.delete(key);
|
|
557
|
+
}
|
|
558
|
+
bindPlaceholderParams(fn, id) {
|
|
559
|
+
const params = fn.parameters;
|
|
560
|
+
(this.fnParamSymbols.get(id) ?? []).forEach((sym, param) => {
|
|
561
|
+
if (sym === undefined)
|
|
562
|
+
return;
|
|
563
|
+
const val = emptyValue();
|
|
564
|
+
const rest = params[param]?.dotDotDotToken !== undefined;
|
|
565
|
+
addPlaceholder(val, { fnId: id, param, ...(rest ? { rest: true } : {}) });
|
|
566
|
+
this.bindSymbol(sym, val);
|
|
567
|
+
});
|
|
568
|
+
}
|
|
569
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import ts from "typescript";
|
|
2
|
+
import type { WorkflowProgram } from "../compiler/compile.js";
|
|
3
|
+
import type { SiteTable } from "./sites.js";
|
|
4
|
+
import { type AbstractValue } from "./domain.js";
|
|
5
|
+
import { TaintState } from "./state.js";
|
|
6
|
+
export interface EvalContext {
|
|
7
|
+
/** Enclosing dataflow regions, innermost last: "top", `fn@<id>`, `cand@<order>`. */
|
|
8
|
+
regionStack: string[];
|
|
9
|
+
/** Sink for `return` statements in this region. */
|
|
10
|
+
onReturn: (value: AbstractValue) => void;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* The taint half of the fused interpreter:
|
|
14
|
+
* drive the whole-script transfer to a fixpoint. Emission is the caller's business —
|
|
15
|
+
* interpret.ts reads the converged state through `emitFacts` / `emitOracle` and runs
|
|
16
|
+
* the temporal walk over the same state.
|
|
17
|
+
*/
|
|
18
|
+
export declare class Evaluator {
|
|
19
|
+
readonly s: TaintState;
|
|
20
|
+
readonly checker: ts.TypeChecker;
|
|
21
|
+
constructor(workflow: WorkflowProgram, table: SiteTable);
|
|
22
|
+
converge(): void;
|
|
23
|
+
private iterate;
|
|
24
|
+
private evalFunction;
|
|
25
|
+
/**
|
|
26
|
+
* Record a guard expression's value as the control-dependence oracle, keyed by the
|
|
27
|
+
* guard node's START OFFSET — the same node `traceOrder` hands to `controllersOf`, so a
|
|
28
|
+
* parenthesized guard is keyed by its ParenthesizedExpression. This is a SINK, not a
|
|
29
|
+
* flow: the value is recorded and not joined into anything, because a condition does not
|
|
30
|
+
* join the data contract (see the ConditionalExpression case in evalExpr). Consumed only
|
|
31
|
+
* by the causality graph.
|
|
32
|
+
*/
|
|
33
|
+
recordGuard(node: ts.Expression, value: AbstractValue): void;
|
|
34
|
+
visit(node: ts.Node, ctx: EvalContext): void;
|
|
35
|
+
handleDeclaration(decl: ts.VariableDeclaration, ctx: EvalContext): void;
|
|
36
|
+
/**
|
|
37
|
+
* The LIVE (shared, unclonable) abstract value a *place expression* denotes, or
|
|
38
|
+
* undefined for non-places (calls, literals, computed access, operators). A place is
|
|
39
|
+
* an identifier (its env slot) or a chain of static property / literal-index element
|
|
40
|
+
* accesses rooted at a place. Value-preserving wrappers (parens / `as` / `satisfies` /
|
|
41
|
+
* non-null / type assertion) are peeled at every level. This is the single primitive
|
|
42
|
+
* behind aliasing: bindings, container-literal fields, write receivers and param
|
|
43
|
+
* write-back all resolve places through it. Reads must NOT call this (they clone).
|
|
44
|
+
*
|
|
45
|
+
* `create` governs missing field slots. WRITE receivers create empty fields on demand
|
|
46
|
+
* (`arr[0].f = t` materializes `arr[0]`). Read-side callers (aliasing binds,
|
|
47
|
+
* container-literal embedding, write-back actuals) pass `create=false`: an absent field
|
|
48
|
+
* returns undefined so the caller falls back to value semantics (readField's collapse),
|
|
49
|
+
* which correctly surfaces the container's own occurrences. Fabricating an empty field
|
|
50
|
+
* there would alias to a phantom and DROP the opaque container's taint (e.g. reading
|
|
51
|
+
* `review.feedback` off an opaque ask result must yield collapse(review), not ∅).
|
|
52
|
+
*/
|
|
53
|
+
resolvePlace(expr: ts.Expression, create?: boolean): AbstractValue | undefined;
|
|
54
|
+
private placeField;
|
|
55
|
+
/**
|
|
56
|
+
* The parameter write-back target for an actual argument `arg` whose evaluated value is
|
|
57
|
+
* `value`. A place actual resolves to its live slot (write-back aliases through it, as
|
|
58
|
+
* before). An object/array LITERAL's evaluated value IS its allocation-site place
|
|
59
|
+
* (state.literalPlaceOf), and its FIELDS hold live places (`poke({ box })` — the literal's
|
|
60
|
+
* `box` field IS the box slot), so that value is the write-back target: `mergeHeapEffects`
|
|
61
|
+
* descends into it and a field the callee wrote through `p.box` lands on the shared `box`
|
|
62
|
+
* slot, while a field written on the literal itself (`tag({ name }, t)` → `box.note = t`)
|
|
63
|
+
* persists on the place and reaches whoever the callee hands the object to.
|
|
64
|
+
* A literal argument once skipped write-back entirely, so mutations through its live
|
|
65
|
+
* sub-objects were invisible to the caller; and when the literal was a per-pass fresh
|
|
66
|
+
* value, that write-back re-reported a change on every pass and the fixpoint never
|
|
67
|
+
* settled.
|
|
68
|
+
*/
|
|
69
|
+
argWriteBackPlace(arg: ts.Expression, value: AbstractValue): AbstractValue | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* Bind a destructuring pattern (or a single name). See {@link bindPattern} in patterns.ts;
|
|
72
|
+
* exposed as a thin method because the aliasing-bind machinery is used across modules.
|
|
73
|
+
*/
|
|
74
|
+
bindPattern(name: ts.BindingName, value: AbstractValue, ctx: EvalContext, sourcePlace?: AbstractValue): void;
|
|
75
|
+
/** The live field at `key` of a place, for destructuring aliasing (see patterns.ts). */
|
|
76
|
+
extractField(container: AbstractValue, key: string): AbstractValue;
|
|
77
|
+
/** Read a statically-known field with smear-on-read, else collapse (see patterns.ts). */
|
|
78
|
+
selectField(value: AbstractValue, key: string): AbstractValue;
|
|
79
|
+
evalExpr(node: ts.Expression, ctx: EvalContext): AbstractValue;
|
|
80
|
+
private evalIdentifier;
|
|
81
|
+
/**
|
|
82
|
+
* The implicit `arguments` object as a rest-like placeholder gathering every actual of
|
|
83
|
+
* the nearest enclosing NON-arrow function (param index 0, rest). `arguments[i]` then
|
|
84
|
+
* reads a field of it → collapse keeps the placeholder → emission expands it to all
|
|
85
|
+
* recorded actuals (a sound over-approximation: `arguments[0]` yields the whole list).
|
|
86
|
+
* Arrow functions have no own `arguments`, so the ancestor walk skips them and binds the
|
|
87
|
+
* enclosing function's — matching JS's lexical `arguments`. Previously `arguments`
|
|
88
|
+
* resolved to the lib symbol with no env slot, so `arguments[0]` dropped every
|
|
89
|
+
* actual's taint.
|
|
90
|
+
*/
|
|
91
|
+
private argumentsValue;
|
|
92
|
+
private evalBinary;
|
|
93
|
+
private evalPropertyAccess;
|
|
94
|
+
private evalElementAccess;
|
|
95
|
+
receiverSymbol(expr: ts.Expression): ts.Symbol | undefined;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=taint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taint.d.ts","sourceRoot":"","sources":["../../src/analysis/taint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAeL,KAAK,aAAa,EACnB,MAAM,aAAa,CAAC;AAgBrB,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA2BxC,MAAM,WAAW,WAAW;IAC1B,oFAAoF;IACpF,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,mDAAmD;IACnD,QAAQ,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;CAC1C;AAED;;;;;GAKG;AACH,qBAAa,SAAS;IACpB,QAAQ,CAAC,CAAC,EAAE,UAAU,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAC;gBAErB,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS;IAKvD,QAAQ,IAAI,IAAI;IAchB,OAAO,CAAC,OAAO;IA4Bf,OAAO,CAAC,YAAY;IAyCpB;;;;;;;OAOG;IACH,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,aAAa,GAAG,IAAI;IAM5D,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI;IA4D5C,iBAAiB,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE,WAAW,GAAG,IAAI;IAqCvE;;;;;;;;;;;;;;;;OAgBG;IACH,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,EAAE,MAAM,UAAQ,GAAG,aAAa,GAAG,SAAS;IAgG5E,OAAO,CAAC,UAAU;IAMlB;;;;;;;;;;;;;OAaG;IACH,iBAAiB,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,aAAa,GAAG,aAAa,GAAG,SAAS;IAOtF;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,WAAW,EAAE,WAAW,CAAC,EAAE,aAAa,GAAG,IAAI;IAI5G,wFAAwF;IACxF,YAAY,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa;IAIlE,yFAAyF;IACzF,WAAW,CAAC,KAAK,EAAE,aAAa,EAAE,GAAG,EAAE,MAAM,GAAG,aAAa;IAM7D,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,EAAE,GAAG,EAAE,WAAW,GAAG,aAAa;IAgI9D,OAAO,CAAC,cAAc;IAetB;;;;;;;;;OASG;IACH,OAAO,CAAC,cAAc;IAUtB,OAAO,CAAC,UAAU;IA+BlB,OAAO,CAAC,kBAAkB;IAO1B,OAAO,CAAC,iBAAiB;IAYzB,cAAc,CAAC,IAAI,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,MAAM,GAAG,SAAS;CAG3D"}
|