footprintjs 9.48.2 → 10.0.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/AGENTS.md +12 -10
- package/CLAUDE.md +21 -23
- package/README.md +1 -1
- package/dist/advanced.js +71 -128
- package/dist/esm/advanced.d.ts +24 -58
- package/dist/esm/advanced.js +13 -51
- package/dist/esm/index.d.ts +5 -8
- package/dist/esm/index.js +3 -3
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +1 -1
- package/dist/esm/lib/builder/FlowChartBuilder.js +3 -3
- package/dist/esm/lib/builder/structure/StructureRecorder.d.ts +1 -1
- package/dist/esm/lib/builder/structure/StructureRecorder.js +1 -1
- package/dist/esm/lib/capture/index.d.ts +0 -1
- package/dist/esm/lib/capture/index.js +1 -2
- package/dist/esm/lib/engine/graph/prefixNodeTree.js +2 -2
- package/dist/esm/lib/engine/handlers/ResumeEntry.d.ts +3 -3
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +4 -4
- package/dist/esm/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +4 -8
- package/dist/esm/lib/engine/index.d.ts +1 -1
- package/dist/esm/lib/engine/index.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
- package/dist/esm/lib/engine/narrative/index.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/index.js +1 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +1 -11
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +4 -6
- package/dist/esm/lib/engine/traversalContext.d.ts +1 -1
- package/dist/esm/lib/engine/traversalContext.js +2 -2
- package/dist/esm/lib/engine/types.d.ts +2 -10
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/engine/walkSubflowSpec.js +2 -2
- package/dist/esm/lib/ids/reservedIds.js +2 -2
- package/dist/esm/lib/memory/DiagnosticCollector.js +2 -2
- package/dist/esm/lib/memory/StageContext.d.ts +2 -4
- package/dist/esm/lib/memory/StageContext.js +2 -2
- package/dist/esm/lib/memory/borrowedMutation.js +2 -2
- package/dist/esm/lib/memory/index.d.ts +6 -21
- package/dist/esm/lib/memory/index.js +4 -22
- package/dist/esm/lib/memory/redaction.d.ts +1 -1
- package/dist/esm/lib/memory/redaction.js +2 -2
- package/dist/esm/lib/memory/runPolicy.d.ts +3 -2
- package/dist/esm/lib/memory/runPolicy.js +1 -1
- package/dist/esm/lib/reactive/createTypedScope.js +2 -2
- package/dist/esm/lib/reactive/writeTraps.js +2 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +3 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.js +3 -2
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +1 -1
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +2 -2
- package/dist/esm/lib/recorder/qualityTrace.d.ts +1 -1
- package/dist/esm/lib/recorder/qualityTrace.js +2 -2
- package/dist/esm/lib/runner/DeferredObserverTier.js +2 -2
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +4 -5
- package/dist/esm/lib/runner/ExecutionRuntime.js +2 -5
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/esm/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -4
- package/dist/esm/lib/runner/resume.js +2 -2
- package/dist/esm/lib/runner/snapshot.js +3 -2
- package/dist/esm/lib/scope/ScopeFacade.js +2 -2
- package/dist/esm/lib/scope/state/zod/scopeFactory.js +2 -2
- package/dist/esm/recorders.d.ts +2 -3
- package/dist/esm/recorders.js +1 -1
- package/dist/esm/trace.d.ts +11 -57
- package/dist/esm/trace.js +10 -68
- package/dist/index.js +3 -3
- package/dist/lib/builder/FlowChartBuilder.js +5 -5
- package/dist/lib/builder/structure/StructureRecorder.js +1 -1
- package/dist/lib/capture/index.js +2 -4
- package/dist/lib/engine/graph/prefixNodeTree.js +5 -5
- package/dist/lib/engine/handlers/ResumeEntry.js +4 -4
- package/dist/lib/engine/handlers/SubflowExecutor.js +5 -9
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +1 -1
- package/dist/lib/engine/narrative/index.js +1 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +8 -10
- package/dist/lib/engine/traversalContext.js +4 -4
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/engine/walkSubflowSpec.js +3 -3
- package/dist/lib/ids/reservedIds.js +5 -5
- package/dist/lib/memory/DiagnosticCollector.js +3 -3
- package/dist/lib/memory/StageContext.js +3 -3
- package/dist/lib/memory/borrowedMutation.js +3 -3
- package/dist/lib/memory/index.js +7 -42
- package/dist/lib/memory/redaction.js +3 -3
- package/dist/lib/memory/runPolicy.js +1 -1
- package/dist/lib/reactive/createTypedScope.js +3 -3
- package/dist/lib/reactive/writeTraps.js +4 -4
- package/dist/lib/recorder/ControlDepRecorder.js +3 -2
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/InOutRecorder.js +3 -3
- package/dist/lib/recorder/qualityTrace.js +4 -4
- package/dist/lib/runner/DeferredObserverTier.js +3 -3
- package/dist/lib/runner/ExecutionRuntime.js +6 -9
- package/dist/lib/runner/FlowChartExecutor.js +1 -1
- package/dist/lib/runner/getSubtreeSnapshot.js +6 -6
- package/dist/lib/runner/resume.js +3 -3
- package/dist/lib/runner/snapshot.js +6 -5
- package/dist/lib/scope/ScopeFacade.js +3 -3
- package/dist/lib/scope/state/zod/scopeFactory.js +4 -4
- package/dist/recorders.js +1 -1
- package/dist/trace.js +18 -120
- package/dist/types/advanced.d.ts +24 -58
- package/dist/types/index.d.ts +5 -8
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +1 -1
- package/dist/types/lib/builder/structure/StructureRecorder.d.ts +1 -1
- package/dist/types/lib/capture/index.d.ts +0 -1
- package/dist/types/lib/engine/handlers/ResumeEntry.d.ts +3 -3
- package/dist/types/lib/engine/handlers/SubflowExecutor.d.ts +1 -2
- package/dist/types/lib/engine/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +4 -4
- package/dist/types/lib/engine/narrative/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +1 -11
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +2 -10
- package/dist/types/lib/engine/traversalContext.d.ts +1 -1
- package/dist/types/lib/engine/types.d.ts +2 -10
- package/dist/types/lib/memory/StageContext.d.ts +2 -4
- package/dist/types/lib/memory/index.d.ts +6 -21
- package/dist/types/lib/memory/redaction.d.ts +1 -1
- package/dist/types/lib/memory/runPolicy.d.ts +3 -2
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +3 -2
- package/dist/types/lib/recorder/EmitRecorder.d.ts +1 -1
- package/dist/types/lib/recorder/qualityTrace.d.ts +1 -1
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +4 -5
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +1 -1
- package/dist/types/lib/runner/getSubtreeSnapshot.d.ts +1 -1
- package/dist/types/recorders.d.ts +2 -3
- package/dist/types/trace.d.ts +11 -57
- package/package.json +6 -15
- package/dist/esm/lib/capture/freeze.d.ts +0 -91
- package/dist/esm/lib/capture/freeze.js +0 -314
- package/dist/esm/lib/capture/ownData.d.ts +0 -7
- package/dist/esm/lib/capture/ownData.js +0 -15
- package/dist/esm/lib/capture/valueKinds.d.ts +0 -57
- package/dist/esm/lib/capture/valueKinds.js +0 -142
- package/dist/esm/lib/ids/runtimeStageId.d.ts +0 -173
- package/dist/esm/lib/ids/runtimeStageId.js +0 -194
- package/dist/esm/lib/memory/EventLog.d.ts +0 -105
- package/dist/esm/lib/memory/EventLog.js +0 -148
- package/dist/esm/lib/memory/RecordFrame.d.ts +0 -232
- package/dist/esm/lib/memory/RecordFrame.js +0 -296
- package/dist/esm/lib/memory/SharedMemory.d.ts +0 -46
- package/dist/esm/lib/memory/SharedMemory.js +0 -88
- package/dist/esm/lib/memory/TransactionBuffer.d.ts +0 -521
- package/dist/esm/lib/memory/TransactionBuffer.js +0 -946
- package/dist/esm/lib/memory/admission.d.ts +0 -81
- package/dist/esm/lib/memory/admission.js +0 -153
- package/dist/esm/lib/memory/backtrack.d.ts +0 -286
- package/dist/esm/lib/memory/backtrack.js +0 -457
- package/dist/esm/lib/memory/commitLogUtils.d.ts +0 -217
- package/dist/esm/lib/memory/commitLogUtils.js +0 -384
- package/dist/esm/lib/memory/deltaEncoding.d.ts +0 -66
- package/dist/esm/lib/memory/deltaEncoding.js +0 -122
- package/dist/esm/lib/memory/equality.d.ts +0 -93
- package/dist/esm/lib/memory/equality.js +0 -262
- package/dist/esm/lib/memory/eventPosition.d.ts +0 -18
- package/dist/esm/lib/memory/eventPosition.js +0 -2
- package/dist/esm/lib/memory/honesty.d.ts +0 -93
- package/dist/esm/lib/memory/honesty.js +0 -92
- package/dist/esm/lib/memory/keyPaths.d.ts +0 -125
- package/dist/esm/lib/memory/keyPaths.js +0 -227
- package/dist/esm/lib/memory/logModel.d.ts +0 -76
- package/dist/esm/lib/memory/logModel.js +0 -364
- package/dist/esm/lib/memory/merge.d.ts +0 -26
- package/dist/esm/lib/memory/merge.js +0 -60
- package/dist/esm/lib/memory/pathOps.d.ts +0 -115
- package/dist/esm/lib/memory/pathOps.js +0 -290
- package/dist/esm/lib/memory/paths.d.ts +0 -52
- package/dist/esm/lib/memory/paths.js +0 -57
- package/dist/esm/lib/memory/placeholders.d.ts +0 -39
- package/dist/esm/lib/memory/placeholders.js +0 -40
- package/dist/esm/lib/memory/recordCommit.d.ts +0 -45
- package/dist/esm/lib/memory/recordCommit.js +0 -61
- package/dist/esm/lib/memory/scrub.d.ts +0 -53
- package/dist/esm/lib/memory/scrub.js +0 -74
- package/dist/esm/lib/memory/types.d.ts +0 -209
- package/dist/esm/lib/memory/types.js +0 -10
- package/dist/esm/lib/memory/utils.d.ts +0 -73
- package/dist/esm/lib/memory/utils.js +0 -159
- package/dist/esm/lib/memory/verbs.d.ts +0 -333
- package/dist/esm/lib/memory/verbs.js +0 -427
- package/dist/esm/lib/recorder/CommitRangeIndex.d.ts +0 -147
- package/dist/esm/lib/recorder/CommitRangeIndex.js +0 -207
- package/dist/esm/lib/scope/detectCircular.d.ts +0 -13
- package/dist/esm/lib/scope/detectCircular.js +0 -14
- package/dist/esm/lib/scope/recorders/summarizeValue.d.ts +0 -5
- package/dist/esm/lib/scope/recorders/summarizeValue.js +0 -6
- package/dist/esm/lib/slice/elementProvenance.d.ts +0 -81
- package/dist/esm/lib/slice/elementProvenance.js +0 -190
- package/dist/esm/lib/slice/forwardSliceForKey.d.ts +0 -88
- package/dist/esm/lib/slice/forwardSliceForKey.js +0 -243
- package/dist/esm/lib/slice/index.d.ts +0 -25
- package/dist/esm/lib/slice/index.js +0 -25
- package/dist/esm/lib/slice/keyIndex.d.ts +0 -137
- package/dist/esm/lib/slice/keyIndex.js +0 -293
- package/dist/esm/lib/slice/keyTimeline.d.ts +0 -49
- package/dist/esm/lib/slice/keyTimeline.js +0 -113
- package/dist/esm/lib/slice/keysReadSources.d.ts +0 -51
- package/dist/esm/lib/slice/keysReadSources.js +0 -95
- package/dist/esm/lib/slice/serialize.d.ts +0 -78
- package/dist/esm/lib/slice/serialize.js +0 -278
- package/dist/esm/lib/slice/sliceForKey.d.ts +0 -47
- package/dist/esm/lib/slice/sliceForKey.js +0 -88
- package/dist/esm/lib/slice/types.d.ts +0 -567
- package/dist/esm/lib/slice/types.js +0 -25
- package/dist/esm/lib/time-travel/axis.d.ts +0 -119
- package/dist/esm/lib/time-travel/axis.js +0 -179
- package/dist/esm/lib/time-travel/bundles.d.ts +0 -77
- package/dist/esm/lib/time-travel/bundles.js +0 -136
- package/dist/esm/lib/time-travel/chain.d.ts +0 -93
- package/dist/esm/lib/time-travel/chain.js +0 -188
- package/dist/esm/lib/time-travel/commitStops.d.ts +0 -55
- package/dist/esm/lib/time-travel/commitStops.js +0 -202
- package/dist/esm/lib/time-travel/index.d.ts +0 -22
- package/dist/esm/lib/time-travel/index.js +0 -21
- package/dist/esm/lib/time-travel/stateAt.d.ts +0 -102
- package/dist/esm/lib/time-travel/stateAt.js +0 -153
- package/dist/esm/lib/time-travel/tagStops.d.ts +0 -72
- package/dist/esm/lib/time-travel/tagStops.js +0 -102
- package/dist/esm/lib/time-travel/timeTravel.d.ts +0 -70
- package/dist/esm/lib/time-travel/timeTravel.js +0 -360
- package/dist/esm/lib/time-travel/types.d.ts +0 -470
- package/dist/esm/lib/time-travel/types.js +0 -23
- package/dist/esm/write.d.ts +0 -47
- package/dist/esm/write.js +0 -46
- package/dist/lib/capture/freeze.js +0 -320
- package/dist/lib/capture/ownData.js +0 -19
- package/dist/lib/capture/valueKinds.js +0 -146
- package/dist/lib/ids/runtimeStageId.js +0 -210
- package/dist/lib/memory/EventLog.js +0 -152
- package/dist/lib/memory/RecordFrame.js +0 -300
- package/dist/lib/memory/SharedMemory.js +0 -92
- package/dist/lib/memory/TransactionBuffer.js +0 -950
- package/dist/lib/memory/admission.js +0 -159
- package/dist/lib/memory/backtrack.js +0 -463
- package/dist/lib/memory/commitLogUtils.js +0 -399
- package/dist/lib/memory/deltaEncoding.js +0 -128
- package/dist/lib/memory/equality.js +0 -266
- package/dist/lib/memory/eventPosition.js +0 -3
- package/dist/lib/memory/honesty.js +0 -95
- package/dist/lib/memory/keyPaths.js +0 -243
- package/dist/lib/memory/logModel.js +0 -372
- package/dist/lib/memory/merge.js +0 -64
- package/dist/lib/memory/pathOps.js +0 -306
- package/dist/lib/memory/paths.js +0 -62
- package/dist/lib/memory/placeholders.js +0 -43
- package/dist/lib/memory/recordCommit.js +0 -65
- package/dist/lib/memory/scrub.js +0 -79
- package/dist/lib/memory/types.js +0 -11
- package/dist/lib/memory/utils.js +0 -178
- package/dist/lib/memory/verbs.js +0 -444
- package/dist/lib/recorder/CommitRangeIndex.js +0 -211
- package/dist/lib/scope/detectCircular.js +0 -21
- package/dist/lib/scope/recorders/summarizeValue.js +0 -10
- package/dist/lib/slice/elementProvenance.js +0 -195
- package/dist/lib/slice/forwardSliceForKey.js +0 -247
- package/dist/lib/slice/index.js +0 -42
- package/dist/lib/slice/keyIndex.js +0 -313
- package/dist/lib/slice/keyTimeline.js +0 -117
- package/dist/lib/slice/keysReadSources.js +0 -101
- package/dist/lib/slice/serialize.js +0 -286
- package/dist/lib/slice/sliceForKey.js +0 -93
- package/dist/lib/slice/types.js +0 -26
- package/dist/lib/time-travel/axis.js +0 -184
- package/dist/lib/time-travel/bundles.js +0 -144
- package/dist/lib/time-travel/chain.js +0 -193
- package/dist/lib/time-travel/commitStops.js +0 -206
- package/dist/lib/time-travel/index.js +0 -32
- package/dist/lib/time-travel/stateAt.js +0 -160
- package/dist/lib/time-travel/tagStops.js +0 -106
- package/dist/lib/time-travel/timeTravel.js +0 -364
- package/dist/lib/time-travel/types.js +0 -24
- package/dist/types/lib/capture/freeze.d.ts +0 -91
- package/dist/types/lib/capture/ownData.d.ts +0 -7
- package/dist/types/lib/capture/valueKinds.d.ts +0 -57
- package/dist/types/lib/ids/runtimeStageId.d.ts +0 -173
- package/dist/types/lib/memory/EventLog.d.ts +0 -105
- package/dist/types/lib/memory/RecordFrame.d.ts +0 -232
- package/dist/types/lib/memory/SharedMemory.d.ts +0 -46
- package/dist/types/lib/memory/TransactionBuffer.d.ts +0 -521
- package/dist/types/lib/memory/admission.d.ts +0 -81
- package/dist/types/lib/memory/backtrack.d.ts +0 -286
- package/dist/types/lib/memory/commitLogUtils.d.ts +0 -217
- package/dist/types/lib/memory/deltaEncoding.d.ts +0 -66
- package/dist/types/lib/memory/equality.d.ts +0 -93
- package/dist/types/lib/memory/eventPosition.d.ts +0 -18
- package/dist/types/lib/memory/honesty.d.ts +0 -93
- package/dist/types/lib/memory/keyPaths.d.ts +0 -125
- package/dist/types/lib/memory/logModel.d.ts +0 -76
- package/dist/types/lib/memory/merge.d.ts +0 -26
- package/dist/types/lib/memory/pathOps.d.ts +0 -115
- package/dist/types/lib/memory/paths.d.ts +0 -52
- package/dist/types/lib/memory/placeholders.d.ts +0 -39
- package/dist/types/lib/memory/recordCommit.d.ts +0 -45
- package/dist/types/lib/memory/scrub.d.ts +0 -53
- package/dist/types/lib/memory/types.d.ts +0 -209
- package/dist/types/lib/memory/utils.d.ts +0 -73
- package/dist/types/lib/memory/verbs.d.ts +0 -333
- package/dist/types/lib/recorder/CommitRangeIndex.d.ts +0 -147
- package/dist/types/lib/scope/detectCircular.d.ts +0 -13
- package/dist/types/lib/scope/recorders/summarizeValue.d.ts +0 -5
- package/dist/types/lib/slice/elementProvenance.d.ts +0 -81
- package/dist/types/lib/slice/forwardSliceForKey.d.ts +0 -88
- package/dist/types/lib/slice/index.d.ts +0 -25
- package/dist/types/lib/slice/keyIndex.d.ts +0 -137
- package/dist/types/lib/slice/keyTimeline.d.ts +0 -49
- package/dist/types/lib/slice/keysReadSources.d.ts +0 -51
- package/dist/types/lib/slice/serialize.d.ts +0 -78
- package/dist/types/lib/slice/sliceForKey.d.ts +0 -47
- package/dist/types/lib/slice/types.d.ts +0 -567
- package/dist/types/lib/time-travel/axis.d.ts +0 -119
- package/dist/types/lib/time-travel/bundles.d.ts +0 -77
- package/dist/types/lib/time-travel/chain.d.ts +0 -93
- package/dist/types/lib/time-travel/commitStops.d.ts +0 -55
- package/dist/types/lib/time-travel/index.d.ts +0 -22
- package/dist/types/lib/time-travel/stateAt.d.ts +0 -102
- package/dist/types/lib/time-travel/tagStops.d.ts +0 -72
- package/dist/types/lib/time-travel/timeTravel.d.ts +0 -70
- package/dist/types/lib/time-travel/types.d.ts +0 -470
- package/dist/types/write.d.ts +0 -47
- package/dist/write.js +0 -52
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* runtimeStageId — unique identifier for each execution step during traversal.
|
|
4
|
-
*
|
|
5
|
-
* Format: [subflowPath/]stageId#executionIndex
|
|
6
|
-
*
|
|
7
|
-
* Components:
|
|
8
|
-
* stageId — stable node ID from the builder ('call-llm', 'seed')
|
|
9
|
-
* executionIndex — monotonic counter incremented per stage execution (0, 1, 2...)
|
|
10
|
-
* subflowPath — optional path for subflow stages ('sf-tools', 'sf-outer/sf-inner')
|
|
11
|
-
*
|
|
12
|
-
* Properties:
|
|
13
|
-
* - Unique within a run (executionIndex never repeats)
|
|
14
|
-
* - Execution-ordered (sort by executionIndex = execution order)
|
|
15
|
-
* - Human-readable ('sf-tools/execute-tool-calls#8')
|
|
16
|
-
* - Parseable (split on '#' for stageId and index, split stageId on '/' for subflow path)
|
|
17
|
-
*
|
|
18
|
-
* Naming-collision warning
|
|
19
|
-
* ────────────────────────
|
|
20
|
-
* The parsed-output `.stageId` field below is the LOCAL form (segment
|
|
21
|
-
* after the last '/'). This is NOT the same as `spec.id` / `node.id`
|
|
22
|
-
* for subflow-nested stages, which carry the FULL prefixed form
|
|
23
|
-
* (`'sf-tools/execute-tool-calls'`). To compare safely, use
|
|
24
|
-
* `splitStageId(spec.id)` to decompose the prefixed form the same
|
|
25
|
-
* way `parseRuntimeStageId` decomposes a runtimeStageId.
|
|
26
|
-
*
|
|
27
|
-
* @example
|
|
28
|
-
* ```
|
|
29
|
-
* buildRuntimeStageId('call-llm', 5) // 'call-llm#5'
|
|
30
|
-
* buildRuntimeStageId('execute-tool-calls', 8, 'sf-tools') // 'sf-tools/execute-tool-calls#8'
|
|
31
|
-
* buildRuntimeStageId('validate', 3, 'sf-outer/sf-inner') // 'sf-outer/sf-inner/validate#3'
|
|
32
|
-
* ```
|
|
33
|
-
*
|
|
34
|
-
* ## The one owner (F7, 9.37.0)
|
|
35
|
-
*
|
|
36
|
-
* This module is the ONE place the grammar is spelled. Every reader asks it —
|
|
37
|
-
* `isExecutionKey`, `stageIdOf`, `subflowPathOf`, `subflowSegmentsOf`,
|
|
38
|
-
* `lastSegmentOf`, `isWithinSubflow` — and every composer joins through
|
|
39
|
-
* `joinPath` / `buildRuntimeStageId`; no other file splits on `#` or `/`.
|
|
40
|
-
* It builds, parses and reads ids, and imports nothing: it is the record's
|
|
41
|
-
* (C6). The delimiters are RESERVED (RFC 3986 §2.2 style): the engine's id
|
|
42
|
-
* doors refuse them in user-authored ids through ONE function,
|
|
43
|
-
* `reservedIds.ts · refuseReservedId`, which reads them here — so
|
|
44
|
-
* last-delimiter parsing is sound by construction rather than by hope. Stores
|
|
45
|
-
* and the prefixer never refuse — they hold runtime ids and prefixed ids,
|
|
46
|
-
* which carry the delimiters on purpose.
|
|
47
|
-
*/
|
|
48
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
49
|
-
exports.createExecutionCounter = exports.isWithinSubflow = exports.joinPath = exports.lastSegmentOf = exports.pathSegments = exports.subflowSegmentsOf = exports.subflowPathOf = exports.executionIndexOf = exports.stageIdOf = exports.isExecutionKey = exports.splitStageId = exports.parseRuntimeStageId = exports.buildRuntimeStageId = exports.EXECUTION_DELIMITER = exports.PATH_DELIMITER = void 0;
|
|
50
|
-
/** Separates subflow path segments from each other and from the stage id. */
|
|
51
|
-
exports.PATH_DELIMITER = '/';
|
|
52
|
-
/** Separates the (prefixed) stage id from the execution index. */
|
|
53
|
-
exports.EXECUTION_DELIMITER = '#';
|
|
54
|
-
/**
|
|
55
|
-
* Build a runtimeStageId from its components.
|
|
56
|
-
*
|
|
57
|
-
* Note: The traverser does NOT use the subflowPath parameter — node.id already
|
|
58
|
-
* includes the subflow prefix from the builder. This parameter exists for external
|
|
59
|
-
* consumers constructing IDs from parsed components (round-trip via parseRuntimeStageId).
|
|
60
|
-
*/
|
|
61
|
-
function buildRuntimeStageId(stageId, executionIndex, subflowPath) {
|
|
62
|
-
const prefix = subflowPath ? `${subflowPath}${exports.PATH_DELIMITER}` : '';
|
|
63
|
-
return `${prefix}${stageId}${exports.EXECUTION_DELIMITER}${executionIndex}`;
|
|
64
|
-
}
|
|
65
|
-
exports.buildRuntimeStageId = buildRuntimeStageId;
|
|
66
|
-
/**
|
|
67
|
-
* Parse a runtimeStageId into its components.
|
|
68
|
-
*
|
|
69
|
-
* IMPORTANT — naming collision: the returned `stageId` is the LOCAL
|
|
70
|
-
* form (the segment between the last '/' and the '#'). This is NOT
|
|
71
|
-
* the same as `spec.id` or `node.id` for subflow-nested stages,
|
|
72
|
-
* which contain the FULL prefixed form.
|
|
73
|
-
*
|
|
74
|
-
* parseRuntimeStageId('sf-tools/execute-tool-calls#8').stageId
|
|
75
|
-
* // → 'execute-tool-calls' (LOCAL)
|
|
76
|
-
*
|
|
77
|
-
* node.id // (post-mount, in a spec that contains subflows)
|
|
78
|
-
* // → 'sf-tools/execute-tool-calls' (FULL prefixed)
|
|
79
|
-
*
|
|
80
|
-
* To compare these two safely, use `splitStageId(node.id)` to get
|
|
81
|
-
* the local form, OR reconstruct the full form via
|
|
82
|
-
* `(subflowPath ? subflowPath + '/' : '') + stageId`.
|
|
83
|
-
*/
|
|
84
|
-
function parseRuntimeStageId(runtimeStageId) {
|
|
85
|
-
const hashIdx = runtimeStageId.lastIndexOf(exports.EXECUTION_DELIMITER);
|
|
86
|
-
if (hashIdx === -1) {
|
|
87
|
-
return { stageId: runtimeStageId, executionIndex: 0, subflowPath: undefined };
|
|
88
|
-
}
|
|
89
|
-
const beforeHash = runtimeStageId.slice(0, hashIdx);
|
|
90
|
-
const executionIndex = parseInt(runtimeStageId.slice(hashIdx + 1), 10);
|
|
91
|
-
const lastSlash = beforeHash.lastIndexOf(exports.PATH_DELIMITER);
|
|
92
|
-
if (lastSlash === -1) {
|
|
93
|
-
return { stageId: beforeHash, executionIndex, subflowPath: undefined };
|
|
94
|
-
}
|
|
95
|
-
return {
|
|
96
|
-
stageId: beforeHash.slice(lastSlash + 1),
|
|
97
|
-
executionIndex,
|
|
98
|
-
subflowPath: beforeHash.slice(0, lastSlash),
|
|
99
|
-
};
|
|
100
|
-
}
|
|
101
|
-
exports.parseRuntimeStageId = parseRuntimeStageId;
|
|
102
|
-
/**
|
|
103
|
-
* Decompose a (possibly prefixed) stage id into its components.
|
|
104
|
-
*
|
|
105
|
-
* Use this when you have an id WITHOUT the `#N` execution suffix and
|
|
106
|
-
* need the local stage name and/or the subflow path. Common sources
|
|
107
|
-
* of such ids:
|
|
108
|
-
* - `spec.id` (post-mount the id includes any subflow prefix)
|
|
109
|
-
* - `CommitBundle.stageId` (post-mount id)
|
|
110
|
-
* - `node.id` from xyflow nodes built off the spec
|
|
111
|
-
* - the segment of `runtimeStageId` BEFORE the `#` (use
|
|
112
|
-
* `parseRuntimeStageId` directly for full runtimeStageId strings)
|
|
113
|
-
*
|
|
114
|
-
* Mirrors the decomposition `parseRuntimeStageId` performs on the
|
|
115
|
-
* stageId portion of a runtimeStageId, so the two helpers stay in
|
|
116
|
-
* lockstep on naming and behavior.
|
|
117
|
-
*
|
|
118
|
-
* @example
|
|
119
|
-
* splitStageId('sf-tools/execute-tool-calls')
|
|
120
|
-
* // → { localStageId: 'execute-tool-calls', subflowPath: 'sf-tools' }
|
|
121
|
-
*
|
|
122
|
-
* splitStageId('execute-tool-calls')
|
|
123
|
-
* // → { localStageId: 'execute-tool-calls', subflowPath: undefined }
|
|
124
|
-
*
|
|
125
|
-
* splitStageId('sf-outer/sf-inner/validate')
|
|
126
|
-
* // → { localStageId: 'validate', subflowPath: 'sf-outer/sf-inner' }
|
|
127
|
-
*/
|
|
128
|
-
function splitStageId(prefixedStageId) {
|
|
129
|
-
const lastSlash = prefixedStageId.lastIndexOf(exports.PATH_DELIMITER);
|
|
130
|
-
if (lastSlash === -1) {
|
|
131
|
-
return { localStageId: prefixedStageId, subflowPath: undefined };
|
|
132
|
-
}
|
|
133
|
-
return {
|
|
134
|
-
localStageId: prefixedStageId.slice(lastSlash + 1),
|
|
135
|
-
subflowPath: prefixedStageId.slice(0, lastSlash),
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
exports.splitStageId = splitStageId;
|
|
139
|
-
/**
|
|
140
|
-
* True when `key` names one EXECUTION (`…#N`) rather than a stage or a subflow
|
|
141
|
-
* path. Its presence alone decides: the delimiter is reserved in every
|
|
142
|
-
* user-authored id (`reservedIds.ts · refuseReservedId`), so only the grammar
|
|
143
|
-
* puts it there.
|
|
144
|
-
*
|
|
145
|
-
* Asked where a map is keyed by both — `subflowResults` is dual-keyed by
|
|
146
|
-
* subflow path AND by mount runtimeStageId.
|
|
147
|
-
*/
|
|
148
|
-
function isExecutionKey(key) {
|
|
149
|
-
return key.includes(exports.EXECUTION_DELIMITER);
|
|
150
|
-
}
|
|
151
|
-
exports.isExecutionKey = isExecutionKey;
|
|
152
|
-
/**
|
|
153
|
-
* The FULL (subflow-prefixed) stage id of a runtimeStageId — everything before
|
|
154
|
-
* the last `#`, i.e. what `node.id` / `CommitBundle.stageId` hold. A string
|
|
155
|
-
* with no `#` is returned whole.
|
|
156
|
-
*
|
|
157
|
-
* @example stageIdOf('sf-tools/execute#8') // 'sf-tools/execute'
|
|
158
|
-
*/
|
|
159
|
-
function stageIdOf(runtimeStageId) {
|
|
160
|
-
const hashIdx = runtimeStageId.lastIndexOf(exports.EXECUTION_DELIMITER);
|
|
161
|
-
return hashIdx === -1 ? runtimeStageId : runtimeStageId.slice(0, hashIdx);
|
|
162
|
-
}
|
|
163
|
-
exports.stageIdOf = stageIdOf;
|
|
164
|
-
/** The execution index of a runtimeStageId, or `NaN` when it carries none. */
|
|
165
|
-
function executionIndexOf(runtimeStageId) {
|
|
166
|
-
const hashIdx = runtimeStageId.lastIndexOf(exports.EXECUTION_DELIMITER);
|
|
167
|
-
return hashIdx === -1 ? NaN : Number.parseInt(runtimeStageId.slice(hashIdx + 1), 10);
|
|
168
|
-
}
|
|
169
|
-
exports.executionIndexOf = executionIndexOf;
|
|
170
|
-
/**
|
|
171
|
-
* The subflow path a runtimeStageId executes in (`'sf-a/sf-b'`), or
|
|
172
|
-
* `undefined` at the top level. Reads the stage-id part, so it agrees with
|
|
173
|
-
* `splitStageId(stageIdOf(rid)).subflowPath`.
|
|
174
|
-
*/
|
|
175
|
-
function subflowPathOf(runtimeStageId) {
|
|
176
|
-
return splitStageId(stageIdOf(runtimeStageId)).subflowPath;
|
|
177
|
-
}
|
|
178
|
-
exports.subflowPathOf = subflowPathOf;
|
|
179
|
-
/** The subflow path of a runtimeStageId as segments (`['sf-a', 'sf-b']`); `[]` at the top level. */
|
|
180
|
-
function subflowSegmentsOf(runtimeStageId) {
|
|
181
|
-
const path = subflowPathOf(runtimeStageId);
|
|
182
|
-
return path === undefined ? [] : path.split(exports.PATH_DELIMITER);
|
|
183
|
-
}
|
|
184
|
-
exports.subflowSegmentsOf = subflowSegmentsOf;
|
|
185
|
-
/** The non-empty segments of a subflow path or prefixed id (`'a//b/'` → `['a', 'b']`). */
|
|
186
|
-
function pathSegments(path) {
|
|
187
|
-
return path.split(exports.PATH_DELIMITER).filter((s) => s.length > 0);
|
|
188
|
-
}
|
|
189
|
-
exports.pathSegments = pathSegments;
|
|
190
|
-
/** The last segment of a path or prefixed id (`'sf-a/sf-b'` → `'sf-b'`); the whole string when it has none. */
|
|
191
|
-
function lastSegmentOf(path) {
|
|
192
|
-
return path.slice(path.lastIndexOf(exports.PATH_DELIMITER) + 1);
|
|
193
|
-
}
|
|
194
|
-
exports.lastSegmentOf = lastSegmentOf;
|
|
195
|
-
/** Join path segments with the grammar's delimiter (`joinPath('sf', 'stage')` → `'sf/stage'`). */
|
|
196
|
-
function joinPath(...segments) {
|
|
197
|
-
return segments.join(exports.PATH_DELIMITER);
|
|
198
|
-
}
|
|
199
|
-
exports.joinPath = joinPath;
|
|
200
|
-
/** True when the (prefixed) id `id` sits INSIDE the subflow at `path` — at any depth below it. */
|
|
201
|
-
function isWithinSubflow(id, path) {
|
|
202
|
-
return id.startsWith(`${path}${exports.PATH_DELIMITER}`);
|
|
203
|
-
}
|
|
204
|
-
exports.isWithinSubflow = isWithinSubflow;
|
|
205
|
-
/** Create a new execution counter starting at 0. */
|
|
206
|
-
function createExecutionCounter() {
|
|
207
|
-
return { value: 0 };
|
|
208
|
-
}
|
|
209
|
-
exports.createExecutionCounter = createExecutionCounter;
|
|
210
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZVN0YWdlSWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2lkcy9ydW50aW1lU3RhZ2VJZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZDRzs7O0FBRUgsNkVBQTZFO0FBQ2hFLFFBQUEsY0FBYyxHQUFHLEdBQUcsQ0FBQztBQUNsQyxrRUFBa0U7QUFDckQsUUFBQSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7QUFldkM7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsT0FBZSxFQUFFLGNBQXNCLEVBQUUsV0FBb0I7SUFDL0YsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsR0FBRyxzQkFBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNwRSxPQUFPLEdBQUcsTUFBTSxHQUFHLE9BQU8sR0FBRywyQkFBbUIsR0FBRyxjQUFjLEVBQW9CLENBQUM7QUFDeEYsQ0FBQztBQUhELGtEQUdDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsY0FBc0I7SUFLeEQsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQywyQkFBbUIsQ0FBQyxDQUFDO0lBQ2hFLElBQUksT0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkIsT0FBTyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsY0FBYyxFQUFFLENBQW1CLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ2xHLENBQUM7SUFFRCxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNwRCxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFtQixDQUFDO0lBRXpGLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUMsc0JBQWMsQ0FBQyxDQUFDO0lBQ3pELElBQUksU0FBUyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckIsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUN6RSxDQUFDO0lBRUQsT0FBTztRQUNMLE9BQU8sRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDeEMsY0FBYztRQUNkLFdBQVcsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUM7S0FDNUMsQ0FBQztBQUNKLENBQUM7QUF2QkQsa0RBdUJDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFDSCxTQUFnQixZQUFZLENBQUMsZUFBdUI7SUFJbEQsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLFdBQVcsQ0FBQyxzQkFBYyxDQUFDLENBQUM7SUFDOUQsSUFBSSxTQUFTLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNyQixPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLENBQUM7SUFDbkUsQ0FBQztJQUNELE9BQU87UUFDTCxZQUFZLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ2xELFdBQVcsRUFBRSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUM7S0FDakQsQ0FBQztBQUNKLENBQUM7QUFaRCxvQ0FZQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsU0FBZ0IsY0FBYyxDQUFDLEdBQVc7SUFDeEMsT0FBTyxHQUFHLENBQUMsUUFBUSxDQUFDLDJCQUFtQixDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUZELHdDQUVDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLGNBQXNCO0lBQzlDLE1BQU0sT0FBTyxHQUFHLGNBQWMsQ0FBQyxXQUFXLENBQUMsMkJBQW1CLENBQUMsQ0FBQztJQUNoRSxPQUFPLE9BQU8sS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBSEQsOEJBR0M7QUFFRCw4RUFBOEU7QUFDOUUsU0FBZ0IsZ0JBQWdCLENBQUMsY0FBc0I7SUFDckQsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLFdBQVcsQ0FBQywyQkFBbUIsQ0FBQyxDQUFDO0lBQ2hFLE9BQU8sT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdkYsQ0FBQztBQUhELDRDQUdDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGFBQWEsQ0FBQyxjQUFzQjtJQUNsRCxPQUFPLFlBQVksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7QUFDN0QsQ0FBQztBQUZELHNDQUVDO0FBRUQsb0dBQW9HO0FBQ3BHLFNBQWdCLGlCQUFpQixDQUFDLGNBQXNCO0lBQ3RELE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMzQyxPQUFPLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBYyxDQUFDLENBQUM7QUFDOUQsQ0FBQztBQUhELDhDQUdDO0FBRUQsMEZBQTBGO0FBQzFGLFNBQWdCLFlBQVksQ0FBQyxJQUFZO0lBQ3ZDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxzQkFBYyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFGRCxvQ0FFQztBQUVELCtHQUErRztBQUMvRyxTQUFnQixhQUFhLENBQUMsSUFBWTtJQUN4QyxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxzQkFBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUZELHNDQUVDO0FBRUQsa0dBQWtHO0FBQ2xHLFNBQWdCLFFBQVEsQ0FBQyxHQUFHLFFBQTJCO0lBQ3JELE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxzQkFBYyxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUZELDRCQUVDO0FBRUQsa0dBQWtHO0FBQ2xHLFNBQWdCLGVBQWUsQ0FBQyxFQUFVLEVBQUUsSUFBWTtJQUN0RCxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLEdBQUcsc0JBQWMsRUFBRSxDQUFDLENBQUM7QUFDbkQsQ0FBQztBQUZELDBDQUVDO0FBV0Qsb0RBQW9EO0FBQ3BELFNBQWdCLHNCQUFzQjtJQUNwQyxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0FBQ3RCLENBQUM7QUFGRCx3REFFQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcnVudGltZVN0YWdlSWQg4oCUIHVuaXF1ZSBpZGVudGlmaWVyIGZvciBlYWNoIGV4ZWN1dGlvbiBzdGVwIGR1cmluZyB0cmF2ZXJzYWwuXG4gKlxuICogRm9ybWF0OiBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXhcbiAqXG4gKiBDb21wb25lbnRzOlxuICogICBzdGFnZUlkICAgICAgICDigJQgc3RhYmxlIG5vZGUgSUQgZnJvbSB0aGUgYnVpbGRlciAoJ2NhbGwtbGxtJywgJ3NlZWQnKVxuICogICBleGVjdXRpb25JbmRleCDigJQgbW9ub3RvbmljIGNvdW50ZXIgaW5jcmVtZW50ZWQgcGVyIHN0YWdlIGV4ZWN1dGlvbiAoMCwgMSwgMi4uLilcbiAqICAgc3ViZmxvd1BhdGggICAg4oCUIG9wdGlvbmFsIHBhdGggZm9yIHN1YmZsb3cgc3RhZ2VzICgnc2YtdG9vbHMnLCAnc2Ytb3V0ZXIvc2YtaW5uZXInKVxuICpcbiAqIFByb3BlcnRpZXM6XG4gKiAgIC0gVW5pcXVlIHdpdGhpbiBhIHJ1biAoZXhlY3V0aW9uSW5kZXggbmV2ZXIgcmVwZWF0cylcbiAqICAgLSBFeGVjdXRpb24tb3JkZXJlZCAoc29ydCBieSBleGVjdXRpb25JbmRleCA9IGV4ZWN1dGlvbiBvcmRlcilcbiAqICAgLSBIdW1hbi1yZWFkYWJsZSAoJ3NmLXRvb2xzL2V4ZWN1dGUtdG9vbC1jYWxscyM4JylcbiAqICAgLSBQYXJzZWFibGUgKHNwbGl0IG9uICcjJyBmb3Igc3RhZ2VJZCBhbmQgaW5kZXgsIHNwbGl0IHN0YWdlSWQgb24gJy8nIGZvciBzdWJmbG93IHBhdGgpXG4gKlxuICogTmFtaW5nLWNvbGxpc2lvbiB3YXJuaW5nXG4gKiDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAqICAgVGhlIHBhcnNlZC1vdXRwdXQgYC5zdGFnZUlkYCBmaWVsZCBiZWxvdyBpcyB0aGUgTE9DQUwgZm9ybSAoc2VnbWVudFxuICogICBhZnRlciB0aGUgbGFzdCAnLycpLiBUaGlzIGlzIE5PVCB0aGUgc2FtZSBhcyBgc3BlYy5pZGAgLyBgbm9kZS5pZGBcbiAqICAgZm9yIHN1YmZsb3ctbmVzdGVkIHN0YWdlcywgd2hpY2ggY2FycnkgdGhlIEZVTEwgcHJlZml4ZWQgZm9ybVxuICogICAoYCdzZi10b29scy9leGVjdXRlLXRvb2wtY2FsbHMnYCkuIFRvIGNvbXBhcmUgc2FmZWx5LCB1c2VcbiAqICAgYHNwbGl0U3RhZ2VJZChzcGVjLmlkKWAgdG8gZGVjb21wb3NlIHRoZSBwcmVmaXhlZCBmb3JtIHRoZSBzYW1lXG4gKiAgIHdheSBgcGFyc2VSdW50aW1lU3RhZ2VJZGAgZGVjb21wb3NlcyBhIHJ1bnRpbWVTdGFnZUlkLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGBcbiAqIGJ1aWxkUnVudGltZVN0YWdlSWQoJ2NhbGwtbGxtJywgNSkgICAgICAgICAgICAgICAgICAgIC8vICdjYWxsLWxsbSM1J1xuICogYnVpbGRSdW50aW1lU3RhZ2VJZCgnZXhlY3V0ZS10b29sLWNhbGxzJywgOCwgJ3NmLXRvb2xzJykgLy8gJ3NmLXRvb2xzL2V4ZWN1dGUtdG9vbC1jYWxscyM4J1xuICogYnVpbGRSdW50aW1lU3RhZ2VJZCgndmFsaWRhdGUnLCAzLCAnc2Ytb3V0ZXIvc2YtaW5uZXInKSAgLy8gJ3NmLW91dGVyL3NmLWlubmVyL3ZhbGlkYXRlIzMnXG4gKiBgYGBcbiAqXG4gKiAjIyBUaGUgb25lIG93bmVyIChGNywgOS4zNy4wKVxuICpcbiAqIFRoaXMgbW9kdWxlIGlzIHRoZSBPTkUgcGxhY2UgdGhlIGdyYW1tYXIgaXMgc3BlbGxlZC4gRXZlcnkgcmVhZGVyIGFza3MgaXQg4oCUXG4gKiBgaXNFeGVjdXRpb25LZXlgLCBgc3RhZ2VJZE9mYCwgYHN1YmZsb3dQYXRoT2ZgLCBgc3ViZmxvd1NlZ21lbnRzT2ZgLFxuICogYGxhc3RTZWdtZW50T2ZgLCBgaXNXaXRoaW5TdWJmbG93YCDigJQgYW5kIGV2ZXJ5IGNvbXBvc2VyIGpvaW5zIHRocm91Z2hcbiAqIGBqb2luUGF0aGAgLyBgYnVpbGRSdW50aW1lU3RhZ2VJZGA7IG5vIG90aGVyIGZpbGUgc3BsaXRzIG9uIGAjYCBvciBgL2AuXG4gKiBJdCBidWlsZHMsIHBhcnNlcyBhbmQgcmVhZHMgaWRzLCBhbmQgaW1wb3J0cyBub3RoaW5nOiBpdCBpcyB0aGUgcmVjb3JkJ3NcbiAqIChDNikuIFRoZSBkZWxpbWl0ZXJzIGFyZSBSRVNFUlZFRCAoUkZDIDM5ODYgwqcyLjIgc3R5bGUpOiB0aGUgZW5naW5lJ3MgaWRcbiAqIGRvb3JzIHJlZnVzZSB0aGVtIGluIHVzZXItYXV0aG9yZWQgaWRzIHRocm91Z2ggT05FIGZ1bmN0aW9uLFxuICogYHJlc2VydmVkSWRzLnRzIMK3IHJlZnVzZVJlc2VydmVkSWRgLCB3aGljaCByZWFkcyB0aGVtIGhlcmUg4oCUIHNvXG4gKiBsYXN0LWRlbGltaXRlciBwYXJzaW5nIGlzIHNvdW5kIGJ5IGNvbnN0cnVjdGlvbiByYXRoZXIgdGhhbiBieSBob3BlLiBTdG9yZXNcbiAqIGFuZCB0aGUgcHJlZml4ZXIgbmV2ZXIgcmVmdXNlIOKAlCB0aGV5IGhvbGQgcnVudGltZSBpZHMgYW5kIHByZWZpeGVkIGlkcyxcbiAqIHdoaWNoIGNhcnJ5IHRoZSBkZWxpbWl0ZXJzIG9uIHB1cnBvc2UuXG4gKi9cblxuLyoqIFNlcGFyYXRlcyBzdWJmbG93IHBhdGggc2VnbWVudHMgZnJvbSBlYWNoIG90aGVyIGFuZCBmcm9tIHRoZSBzdGFnZSBpZC4gKi9cbmV4cG9ydCBjb25zdCBQQVRIX0RFTElNSVRFUiA9ICcvJztcbi8qKiBTZXBhcmF0ZXMgdGhlIChwcmVmaXhlZCkgc3RhZ2UgaWQgZnJvbSB0aGUgZXhlY3V0aW9uIGluZGV4LiAqL1xuZXhwb3J0IGNvbnN0IEVYRUNVVElPTl9ERUxJTUlURVIgPSAnIyc7XG5cbi8vIOKUgOKUgCBCcmFuZHMgKHR5cGVzIG9ubHkg4oCUIFJ1c3QtbmV3dHlwZSBzdHlsZTsgbm8gcnVudGltZSBjb3N0KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZGVjbGFyZSBjb25zdCBSVU5USU1FX1NUQUdFX0lEOiB1bmlxdWUgc3ltYm9sO1xuZGVjbGFyZSBjb25zdCBFWEVDVVRJT05fSU5ERVg6IHVuaXF1ZSBzeW1ib2w7XG5kZWNsYXJlIGNvbnN0IENPTU1JVF9JRFg6IHVuaXF1ZSBzeW1ib2w7XG5cbi8qKiBBIGBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjZXhlY3V0aW9uSW5kZXhgIHN0cmluZyB0aGUgZ3JhbW1hciBwcm9kdWNlZC4gQXNzaWduYWJsZSB0byBgc3RyaW5nYC4gKi9cbmV4cG9ydCB0eXBlIFJ1bnRpbWVTdGFnZUlkID0gc3RyaW5nICYgeyByZWFkb25seSBbUlVOVElNRV9TVEFHRV9JRF06IHRydWUgfTtcbi8qKiBUaGUgcnVuLWdsb2JhbCwgbW9ub3RvbmljIHBvc2l0aW9uIG9mIG9uZSBzdGFnZSBleGVjdXRpb24gKHRoZSBgI05gKS4gQXNzaWduYWJsZSB0byBgbnVtYmVyYC4gKi9cbmV4cG9ydCB0eXBlIEV4ZWN1dGlvbkluZGV4ID0gbnVtYmVyICYgeyByZWFkb25seSBbRVhFQ1VUSU9OX0lOREVYXTogdHJ1ZSB9O1xuLyoqIEEgYnVuZGxlJ3MgcG9zaXRpb24gaW4gYSBjb21taXQgbG9nIChgYnVuZGxlLmlkeGApLiBBc3NpZ25hYmxlIHRvIGBudW1iZXJgLiAqL1xuZXhwb3J0IHR5cGUgQ29tbWl0SWR4ID0gbnVtYmVyICYgeyByZWFkb25seSBbQ09NTUlUX0lEWF06IHRydWUgfTtcblxuLyoqXG4gKiBCdWlsZCBhIHJ1bnRpbWVTdGFnZUlkIGZyb20gaXRzIGNvbXBvbmVudHMuXG4gKlxuICogTm90ZTogVGhlIHRyYXZlcnNlciBkb2VzIE5PVCB1c2UgdGhlIHN1YmZsb3dQYXRoIHBhcmFtZXRlciDigJQgbm9kZS5pZCBhbHJlYWR5XG4gKiBpbmNsdWRlcyB0aGUgc3ViZmxvdyBwcmVmaXggZnJvbSB0aGUgYnVpbGRlci4gVGhpcyBwYXJhbWV0ZXIgZXhpc3RzIGZvciBleHRlcm5hbFxuICogY29uc3VtZXJzIGNvbnN0cnVjdGluZyBJRHMgZnJvbSBwYXJzZWQgY29tcG9uZW50cyAocm91bmQtdHJpcCB2aWEgcGFyc2VSdW50aW1lU3RhZ2VJZCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFJ1bnRpbWVTdGFnZUlkKHN0YWdlSWQ6IHN0cmluZywgZXhlY3V0aW9uSW5kZXg6IG51bWJlciwgc3ViZmxvd1BhdGg/OiBzdHJpbmcpOiBSdW50aW1lU3RhZ2VJZCB7XG4gIGNvbnN0IHByZWZpeCA9IHN1YmZsb3dQYXRoID8gYCR7c3ViZmxvd1BhdGh9JHtQQVRIX0RFTElNSVRFUn1gIDogJyc7XG4gIHJldHVybiBgJHtwcmVmaXh9JHtzdGFnZUlkfSR7RVhFQ1VUSU9OX0RFTElNSVRFUn0ke2V4ZWN1dGlvbkluZGV4fWAgYXMgUnVudGltZVN0YWdlSWQ7XG59XG5cbi8qKlxuICogUGFyc2UgYSBydW50aW1lU3RhZ2VJZCBpbnRvIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIElNUE9SVEFOVCDigJQgbmFtaW5nIGNvbGxpc2lvbjogdGhlIHJldHVybmVkIGBzdGFnZUlkYCBpcyB0aGUgTE9DQUxcbiAqIGZvcm0gKHRoZSBzZWdtZW50IGJldHdlZW4gdGhlIGxhc3QgJy8nIGFuZCB0aGUgJyMnKS4gVGhpcyBpcyBOT1RcbiAqIHRoZSBzYW1lIGFzIGBzcGVjLmlkYCBvciBgbm9kZS5pZGAgZm9yIHN1YmZsb3ctbmVzdGVkIHN0YWdlcyxcbiAqIHdoaWNoIGNvbnRhaW4gdGhlIEZVTEwgcHJlZml4ZWQgZm9ybS5cbiAqXG4gKiAgIHBhcnNlUnVudGltZVN0YWdlSWQoJ3NmLXRvb2xzL2V4ZWN1dGUtdG9vbC1jYWxscyM4Jykuc3RhZ2VJZFxuICogICAvLyDihpIgJ2V4ZWN1dGUtdG9vbC1jYWxscycgICAoTE9DQUwpXG4gKlxuICogICBub2RlLmlkICAvLyAocG9zdC1tb3VudCwgaW4gYSBzcGVjIHRoYXQgY29udGFpbnMgc3ViZmxvd3MpXG4gKiAgIC8vIOKGkiAnc2YtdG9vbHMvZXhlY3V0ZS10b29sLWNhbGxzJyAgIChGVUxMIHByZWZpeGVkKVxuICpcbiAqIFRvIGNvbXBhcmUgdGhlc2UgdHdvIHNhZmVseSwgdXNlIGBzcGxpdFN0YWdlSWQobm9kZS5pZClgIHRvIGdldFxuICogdGhlIGxvY2FsIGZvcm0sIE9SIHJlY29uc3RydWN0IHRoZSBmdWxsIGZvcm0gdmlhXG4gKiBgKHN1YmZsb3dQYXRoID8gc3ViZmxvd1BhdGggKyAnLycgOiAnJykgKyBzdGFnZUlkYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUnVudGltZVN0YWdlSWQocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IHtcbiAgc3RhZ2VJZDogc3RyaW5nO1xuICBleGVjdXRpb25JbmRleDogRXhlY3V0aW9uSW5kZXg7XG4gIHN1YmZsb3dQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59IHtcbiAgY29uc3QgaGFzaElkeCA9IHJ1bnRpbWVTdGFnZUlkLmxhc3RJbmRleE9mKEVYRUNVVElPTl9ERUxJTUlURVIpO1xuICBpZiAoaGFzaElkeCA9PT0gLTEpIHtcbiAgICByZXR1cm4geyBzdGFnZUlkOiBydW50aW1lU3RhZ2VJZCwgZXhlY3V0aW9uSW5kZXg6IDAgYXMgRXhlY3V0aW9uSW5kZXgsIHN1YmZsb3dQYXRoOiB1bmRlZmluZWQgfTtcbiAgfVxuXG4gIGNvbnN0IGJlZm9yZUhhc2ggPSBydW50aW1lU3RhZ2VJZC5zbGljZSgwLCBoYXNoSWR4KTtcbiAgY29uc3QgZXhlY3V0aW9uSW5kZXggPSBwYXJzZUludChydW50aW1lU3RhZ2VJZC5zbGljZShoYXNoSWR4ICsgMSksIDEwKSBhcyBFeGVjdXRpb25JbmRleDtcblxuICBjb25zdCBsYXN0U2xhc2ggPSBiZWZvcmVIYXNoLmxhc3RJbmRleE9mKFBBVEhfREVMSU1JVEVSKTtcbiAgaWYgKGxhc3RTbGFzaCA9PT0gLTEpIHtcbiAgICByZXR1cm4geyBzdGFnZUlkOiBiZWZvcmVIYXNoLCBleGVjdXRpb25JbmRleCwgc3ViZmxvd1BhdGg6IHVuZGVmaW5lZCB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdGFnZUlkOiBiZWZvcmVIYXNoLnNsaWNlKGxhc3RTbGFzaCArIDEpLFxuICAgIGV4ZWN1dGlvbkluZGV4LFxuICAgIHN1YmZsb3dQYXRoOiBiZWZvcmVIYXNoLnNsaWNlKDAsIGxhc3RTbGFzaCksXG4gIH07XG59XG5cbi8qKlxuICogRGVjb21wb3NlIGEgKHBvc3NpYmx5IHByZWZpeGVkKSBzdGFnZSBpZCBpbnRvIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIFVzZSB0aGlzIHdoZW4geW91IGhhdmUgYW4gaWQgV0lUSE9VVCB0aGUgYCNOYCBleGVjdXRpb24gc3VmZml4IGFuZFxuICogbmVlZCB0aGUgbG9jYWwgc3RhZ2UgbmFtZSBhbmQvb3IgdGhlIHN1YmZsb3cgcGF0aC4gQ29tbW9uIHNvdXJjZXNcbiAqIG9mIHN1Y2ggaWRzOlxuICogICAtIGBzcGVjLmlkYCAocG9zdC1tb3VudCB0aGUgaWQgaW5jbHVkZXMgYW55IHN1YmZsb3cgcHJlZml4KVxuICogICAtIGBDb21taXRCdW5kbGUuc3RhZ2VJZGAgKHBvc3QtbW91bnQgaWQpXG4gKiAgIC0gYG5vZGUuaWRgIGZyb20geHlmbG93IG5vZGVzIGJ1aWx0IG9mZiB0aGUgc3BlY1xuICogICAtIHRoZSBzZWdtZW50IG9mIGBydW50aW1lU3RhZ2VJZGAgQkVGT1JFIHRoZSBgI2AgKHVzZVxuICogICAgIGBwYXJzZVJ1bnRpbWVTdGFnZUlkYCBkaXJlY3RseSBmb3IgZnVsbCBydW50aW1lU3RhZ2VJZCBzdHJpbmdzKVxuICpcbiAqIE1pcnJvcnMgdGhlIGRlY29tcG9zaXRpb24gYHBhcnNlUnVudGltZVN0YWdlSWRgIHBlcmZvcm1zIG9uIHRoZVxuICogc3RhZ2VJZCBwb3J0aW9uIG9mIGEgcnVudGltZVN0YWdlSWQsIHNvIHRoZSB0d28gaGVscGVycyBzdGF5IGluXG4gKiBsb2Nrc3RlcCBvbiBuYW1pbmcgYW5kIGJlaGF2aW9yLlxuICpcbiAqIEBleGFtcGxlXG4gKiBzcGxpdFN0YWdlSWQoJ3NmLXRvb2xzL2V4ZWN1dGUtdG9vbC1jYWxscycpXG4gKiAvLyDihpIgeyBsb2NhbFN0YWdlSWQ6ICdleGVjdXRlLXRvb2wtY2FsbHMnLCBzdWJmbG93UGF0aDogJ3NmLXRvb2xzJyB9XG4gKlxuICogc3BsaXRTdGFnZUlkKCdleGVjdXRlLXRvb2wtY2FsbHMnKVxuICogLy8g4oaSIHsgbG9jYWxTdGFnZUlkOiAnZXhlY3V0ZS10b29sLWNhbGxzJywgc3ViZmxvd1BhdGg6IHVuZGVmaW5lZCB9XG4gKlxuICogc3BsaXRTdGFnZUlkKCdzZi1vdXRlci9zZi1pbm5lci92YWxpZGF0ZScpXG4gKiAvLyDihpIgeyBsb2NhbFN0YWdlSWQ6ICd2YWxpZGF0ZScsIHN1YmZsb3dQYXRoOiAnc2Ytb3V0ZXIvc2YtaW5uZXInIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0U3RhZ2VJZChwcmVmaXhlZFN0YWdlSWQ6IHN0cmluZyk6IHtcbiAgbG9jYWxTdGFnZUlkOiBzdHJpbmc7XG4gIHN1YmZsb3dQYXRoOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59IHtcbiAgY29uc3QgbGFzdFNsYXNoID0gcHJlZml4ZWRTdGFnZUlkLmxhc3RJbmRleE9mKFBBVEhfREVMSU1JVEVSKTtcbiAgaWYgKGxhc3RTbGFzaCA9PT0gLTEpIHtcbiAgICByZXR1cm4geyBsb2NhbFN0YWdlSWQ6IHByZWZpeGVkU3RhZ2VJZCwgc3ViZmxvd1BhdGg6IHVuZGVmaW5lZCB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgbG9jYWxTdGFnZUlkOiBwcmVmaXhlZFN0YWdlSWQuc2xpY2UobGFzdFNsYXNoICsgMSksXG4gICAgc3ViZmxvd1BhdGg6IHByZWZpeGVkU3RhZ2VJZC5zbGljZSgwLCBsYXN0U2xhc2gpLFxuICB9O1xufVxuXG4vKipcbiAqIFRydWUgd2hlbiBga2V5YCBuYW1lcyBvbmUgRVhFQ1VUSU9OIChg4oCmI05gKSByYXRoZXIgdGhhbiBhIHN0YWdlIG9yIGEgc3ViZmxvd1xuICogcGF0aC4gSXRzIHByZXNlbmNlIGFsb25lIGRlY2lkZXM6IHRoZSBkZWxpbWl0ZXIgaXMgcmVzZXJ2ZWQgaW4gZXZlcnlcbiAqIHVzZXItYXV0aG9yZWQgaWQgKGByZXNlcnZlZElkcy50cyDCtyByZWZ1c2VSZXNlcnZlZElkYCksIHNvIG9ubHkgdGhlIGdyYW1tYXJcbiAqIHB1dHMgaXQgdGhlcmUuXG4gKlxuICogQXNrZWQgd2hlcmUgYSBtYXAgaXMga2V5ZWQgYnkgYm90aCDigJQgYHN1YmZsb3dSZXN1bHRzYCBpcyBkdWFsLWtleWVkIGJ5XG4gKiBzdWJmbG93IHBhdGggQU5EIGJ5IG1vdW50IHJ1bnRpbWVTdGFnZUlkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFeGVjdXRpb25LZXkoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIGtleS5pbmNsdWRlcyhFWEVDVVRJT05fREVMSU1JVEVSKTtcbn1cblxuLyoqXG4gKiBUaGUgRlVMTCAoc3ViZmxvdy1wcmVmaXhlZCkgc3RhZ2UgaWQgb2YgYSBydW50aW1lU3RhZ2VJZCDigJQgZXZlcnl0aGluZyBiZWZvcmVcbiAqIHRoZSBsYXN0IGAjYCwgaS5lLiB3aGF0IGBub2RlLmlkYCAvIGBDb21taXRCdW5kbGUuc3RhZ2VJZGAgaG9sZC4gQSBzdHJpbmdcbiAqIHdpdGggbm8gYCNgIGlzIHJldHVybmVkIHdob2xlLlxuICpcbiAqIEBleGFtcGxlIHN0YWdlSWRPZignc2YtdG9vbHMvZXhlY3V0ZSM4JykgLy8gJ3NmLXRvb2xzL2V4ZWN1dGUnXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFnZUlkT2YocnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGhhc2hJZHggPSBydW50aW1lU3RhZ2VJZC5sYXN0SW5kZXhPZihFWEVDVVRJT05fREVMSU1JVEVSKTtcbiAgcmV0dXJuIGhhc2hJZHggPT09IC0xID8gcnVudGltZVN0YWdlSWQgOiBydW50aW1lU3RhZ2VJZC5zbGljZSgwLCBoYXNoSWR4KTtcbn1cblxuLyoqIFRoZSBleGVjdXRpb24gaW5kZXggb2YgYSBydW50aW1lU3RhZ2VJZCwgb3IgYE5hTmAgd2hlbiBpdCBjYXJyaWVzIG5vbmUuICovXG5leHBvcnQgZnVuY3Rpb24gZXhlY3V0aW9uSW5kZXhPZihydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogbnVtYmVyIHtcbiAgY29uc3QgaGFzaElkeCA9IHJ1bnRpbWVTdGFnZUlkLmxhc3RJbmRleE9mKEVYRUNVVElPTl9ERUxJTUlURVIpO1xuICByZXR1cm4gaGFzaElkeCA9PT0gLTEgPyBOYU4gOiBOdW1iZXIucGFyc2VJbnQocnVudGltZVN0YWdlSWQuc2xpY2UoaGFzaElkeCArIDEpLCAxMCk7XG59XG5cbi8qKlxuICogVGhlIHN1YmZsb3cgcGF0aCBhIHJ1bnRpbWVTdGFnZUlkIGV4ZWN1dGVzIGluIChgJ3NmLWEvc2YtYidgKSwgb3JcbiAqIGB1bmRlZmluZWRgIGF0IHRoZSB0b3AgbGV2ZWwuIFJlYWRzIHRoZSBzdGFnZS1pZCBwYXJ0LCBzbyBpdCBhZ3JlZXMgd2l0aFxuICogYHNwbGl0U3RhZ2VJZChzdGFnZUlkT2YocmlkKSkuc3ViZmxvd1BhdGhgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3ViZmxvd1BhdGhPZihydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNwbGl0U3RhZ2VJZChzdGFnZUlkT2YocnVudGltZVN0YWdlSWQpKS5zdWJmbG93UGF0aDtcbn1cblxuLyoqIFRoZSBzdWJmbG93IHBhdGggb2YgYSBydW50aW1lU3RhZ2VJZCBhcyBzZWdtZW50cyAoYFsnc2YtYScsICdzZi1iJ11gKTsgYFtdYCBhdCB0aGUgdG9wIGxldmVsLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN1YmZsb3dTZWdtZW50c09mKHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IHBhdGggPSBzdWJmbG93UGF0aE9mKHJ1bnRpbWVTdGFnZUlkKTtcbiAgcmV0dXJuIHBhdGggPT09IHVuZGVmaW5lZCA/IFtdIDogcGF0aC5zcGxpdChQQVRIX0RFTElNSVRFUik7XG59XG5cbi8qKiBUaGUgbm9uLWVtcHR5IHNlZ21lbnRzIG9mIGEgc3ViZmxvdyBwYXRoIG9yIHByZWZpeGVkIGlkIChgJ2EvL2IvJ2Ag4oaSIGBbJ2EnLCAnYiddYCkuICovXG5leHBvcnQgZnVuY3Rpb24gcGF0aFNlZ21lbnRzKHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIHBhdGguc3BsaXQoUEFUSF9ERUxJTUlURVIpLmZpbHRlcigocykgPT4gcy5sZW5ndGggPiAwKTtcbn1cblxuLyoqIFRoZSBsYXN0IHNlZ21lbnQgb2YgYSBwYXRoIG9yIHByZWZpeGVkIGlkIChgJ3NmLWEvc2YtYidgIOKGkiBgJ3NmLWInYCk7IHRoZSB3aG9sZSBzdHJpbmcgd2hlbiBpdCBoYXMgbm9uZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXN0U2VnbWVudE9mKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLnNsaWNlKHBhdGgubGFzdEluZGV4T2YoUEFUSF9ERUxJTUlURVIpICsgMSk7XG59XG5cbi8qKiBKb2luIHBhdGggc2VnbWVudHMgd2l0aCB0aGUgZ3JhbW1hcidzIGRlbGltaXRlciAoYGpvaW5QYXRoKCdzZicsICdzdGFnZScpYCDihpIgYCdzZi9zdGFnZSdgKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBqb2luUGF0aCguLi5zZWdtZW50czogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmcge1xuICByZXR1cm4gc2VnbWVudHMuam9pbihQQVRIX0RFTElNSVRFUik7XG59XG5cbi8qKiBUcnVlIHdoZW4gdGhlIChwcmVmaXhlZCkgaWQgYGlkYCBzaXRzIElOU0lERSB0aGUgc3ViZmxvdyBhdCBgcGF0aGAg4oCUIGF0IGFueSBkZXB0aCBiZWxvdyBpdC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1dpdGhpblN1YmZsb3coaWQ6IHN0cmluZywgcGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpZC5zdGFydHNXaXRoKGAke3BhdGh9JHtQQVRIX0RFTElNSVRFUn1gKTtcbn1cblxuLyoqXG4gKiBTaGFyZWQgbXV0YWJsZSBjb3VudGVyIGZvciBleGVjdXRpb24gaW5kZXguXG4gKiBQYXNzZWQgYnkgcmVmZXJlbmNlIHRvIGNoaWxkIHRyYXZlcnNlcnMgKHN1YmZsb3dzKSBzbyB0aGV5XG4gKiBjb250aW51ZSB0aGUgZ2xvYmFsIG51bWJlcmluZyBpbnN0ZWFkIG9mIHJlc3RhcnRpbmcgYXQgMC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25Db3VudGVyIHtcbiAgdmFsdWU6IG51bWJlcjtcbn1cblxuLyoqIENyZWF0ZSBhIG5ldyBleGVjdXRpb24gY291bnRlciBzdGFydGluZyBhdCAwLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV4ZWN1dGlvbkNvdW50ZXIoKTogRXhlY3V0aW9uQ291bnRlciB7XG4gIHJldHVybiB7IHZhbHVlOiAwIH07XG59XG4iXX0=
|
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* EventLog — Time-travel snapshot storage for flowchart execution
|
|
4
|
-
*
|
|
5
|
-
* Like git history: stores commit bundles (diffs), not full snapshots.
|
|
6
|
-
*
|
|
7
|
-
* THE RECORD IS IMMUTABLE FROM `record` (F3, ruling R3). Every bundle is deep-frozen as it is
|
|
8
|
-
* recorded — the bundle, `overwrite` and `updates` at every depth, the trace and each row, the
|
|
9
|
-
* row's `readKeys`, `redactedPaths`, `tags`, `untrackedSources` — so a holder of a snapshot can no
|
|
10
|
-
* longer rewrite the history every later answer is folded from: an assignment into a bundle throws
|
|
11
|
-
* a `TypeError` in strict code. Safe because nothing outside the log holds a bundle's containers:
|
|
12
|
-
* the log's payload is the commit's own copy (`recordCommit` hands it the output of
|
|
13
|
-
* `scrubPatch`), and live state, the redacted mirror and write retention each take their own copy
|
|
14
|
-
* (`verbs.ts · foldRows` detaches, `StageContext · retainedForm` clones) — pinned by
|
|
15
|
-
* test/lib/memory/property/record-reachability.property.test.ts.
|
|
16
|
-
*
|
|
17
|
-
* What `Object.freeze` cannot seal — a Date's time, a Map's or Set's entries, a buffer's bytes, a
|
|
18
|
-
* RegExp, an Error's stack — is never handed out to a reader (9.44.2): `record` remembers that a
|
|
19
|
-
* bundle holds such a value (`capture/freeze.ts · freezeRecord`), and `list()` — like the public
|
|
20
|
-
* snapshot, `runner/snapshot.ts · servedSnapshot` — serves that bundle as a copy of its open paths
|
|
21
|
-
* (`serveRecord`, mapped at its first serve): fresh frozen containers down to each such value, a
|
|
22
|
-
* fresh copy of it, every other part the log's own. A reader edits only its own copy; every later
|
|
23
|
-
* serve reads the record as recorded. `recorded()` is the engine's own, unserved read. Named holes: an object hung on an array EXPANDO (arrays are walked
|
|
24
|
-
* by index — the `'indices'` walk, which keeps the freeze inside its budget; an expando is out of
|
|
25
|
-
* contract for state) and a `SharedArrayBuffer` (every copy shares its memory). A frozen RegExp's
|
|
26
|
-
* `lastIndex` is read-only, so a `/g` or `/y` regex read from a bundle throws when `exec` or
|
|
27
|
-
* `replace` advance it.
|
|
28
|
-
*/
|
|
29
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
30
|
-
exports.EventLog = void 0;
|
|
31
|
-
const freeze_js_1 = require("../capture/freeze.js");
|
|
32
|
-
const utils_js_1 = require("./utils.js");
|
|
33
|
-
class EventLog {
|
|
34
|
-
/** Base snapshot BEFORE the first stage mutates anything. */
|
|
35
|
-
base;
|
|
36
|
-
/** Ordered list of commit bundles. */
|
|
37
|
-
steps = [];
|
|
38
|
-
sourceAddress;
|
|
39
|
-
sourceAddressRetired = false;
|
|
40
|
-
constructor(initialMemory) {
|
|
41
|
-
// Normalised to an object: the base is a STATE, and every fold over it
|
|
42
|
-
// (`materialise`, `stateAt`) applies path writes to it. `undefined` —
|
|
43
|
-
// what a run with no `initialContext` used to store here — made every
|
|
44
|
-
// one of those folds throw on the first `set`.
|
|
45
|
-
this.base = initialMemory === undefined ? {} : structuredClone(initialMemory);
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* The fold BASE — the state as it stood before the first commit.
|
|
49
|
-
*
|
|
50
|
-
* This is the other half of the commit log: bundles are DIFFS, so a log
|
|
51
|
-
* alone cannot reconstruct state that was seeded before the run (an
|
|
52
|
-
* executor `initialContext`, `defaultValuesForContext`, a resume's
|
|
53
|
-
* `checkpoint.sharedState`, a subflow's `inputMapper` seed). Travelling
|
|
54
|
-
* with the log — `RuntimeSnapshot.initialState` — is what lets an OFFLINE
|
|
55
|
-
* consumer fold; without it the honest answer is a partial one
|
|
56
|
-
* (`stateAt`'s `basis: 'log-only'`).
|
|
57
|
-
*
|
|
58
|
-
* Returns a fresh detached clone on every call — the caller owns it.
|
|
59
|
-
*/
|
|
60
|
-
getInitialState() {
|
|
61
|
-
return structuredClone(this.base);
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Reconstructs the full state at any given step.
|
|
65
|
-
* Replays commits from the beginning — O(n) but low memory footprint.
|
|
66
|
-
*
|
|
67
|
-
* INDEX CONVENTION — `stepIdx` is EXCLUSIVE: `materialise(3)` folds commits
|
|
68
|
-
* 0, 1 and 2. `stateAt(source, commitIdx)` (footprintjs/trace) folds the
|
|
69
|
-
* same log but its `commitIdx` is INCLUSIVE, because a reader's cursor asks
|
|
70
|
-
* "the state AT this stop", which must include that stop's own commit. Two
|
|
71
|
-
* folds over one log with opposite conventions: check which one you hold.
|
|
72
|
-
*
|
|
73
|
-
* One clone of the base per call, then every bundle replayed INTO that
|
|
74
|
-
* private copy (`applySmartMergeInto` — the live commit's copy-on-write law
|
|
75
|
-
* below the root, 9.29.0, so the fold and the live state agree at every
|
|
76
|
-
* path). The result is the caller's: it shares nothing with the base or
|
|
77
|
-
* the log.
|
|
78
|
-
*
|
|
79
|
-
* @deprecated Since 9.33.0 — use `stateAt` from `footprintjs/trace`, which folds the same log
|
|
80
|
-
* from the same base (`RuntimeSnapshot.initialState`) and says how it was derived (`basis`).
|
|
81
|
-
* Nothing in the library calls this; it stays for one minor and is then removed. Mind the
|
|
82
|
-
* index: `materialise(n)` folds commits `0..n-1`, `stateAt(source, n - 1)` the same commits.
|
|
83
|
-
*/
|
|
84
|
-
materialise(stepIdx = this.steps.length) {
|
|
85
|
-
const out = structuredClone(this.base);
|
|
86
|
-
for (let i = 0; i < stepIdx; i++) {
|
|
87
|
-
const { overwrite, updates, trace } = this.steps[i];
|
|
88
|
-
(0, utils_js_1.applySmartMergeInto)(out, updates, overwrite, trace);
|
|
89
|
-
}
|
|
90
|
-
return out;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Persists a commit bundle for a finished stage, and FREEZES it (see the module doc): the bundle
|
|
94
|
-
* is stamped with its position, then deep-frozen, then appended. The engine hands it a bundle
|
|
95
|
-
* built for the log alone; a caller of this class (`footprintjs/write`) hands over a bundle it
|
|
96
|
-
* will no longer edit — its own object is the one frozen.
|
|
97
|
-
*/
|
|
98
|
-
record(bundle) {
|
|
99
|
-
bundle.idx = this.steps.length;
|
|
100
|
-
(0, freeze_js_1.freezeRecord)(bundle, 'indices');
|
|
101
|
-
this.steps.push(bundle);
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Every recorded commit bundle, AS SERVED (9.44.2): a new array each call; a bundle freezing sealed
|
|
105
|
-
* whole is the log's own (frozen) object, one holding a Date, Map, buffer … is a copy of its open
|
|
106
|
-
* paths (`capture/freeze.ts · serveRecord`) — the reader's own, so no edit reaches the log.
|
|
107
|
-
*/
|
|
108
|
-
list() {
|
|
109
|
-
return this.steps.map(freeze_js_1.serveRecord);
|
|
110
|
-
}
|
|
111
|
-
/**
|
|
112
|
-
* @internal The bundles as the log holds them — each frozen, NOT served — in a new array, so a holder's
|
|
113
|
-
* `splice` reaches only its own. For the engine's own snapshot (`ExecutionRuntime · getSnapshot`, which
|
|
114
|
-
* a subflow mount takes once per mount), so the run serves nothing; a reader is served by `list()` and
|
|
115
|
-
* `getSnapshot().commitLog`. A known open door (CHANGELOG 9.44.2): a holder of these bundles can still
|
|
116
|
-
* edit a Date, Map or buffer inside them.
|
|
117
|
-
*/
|
|
118
|
-
recorded() {
|
|
119
|
-
return this.steps.slice();
|
|
120
|
-
}
|
|
121
|
-
/** Number of recorded commits. */
|
|
122
|
-
get length() {
|
|
123
|
-
return this.steps.length;
|
|
124
|
-
}
|
|
125
|
-
/** Immutable identity of this log, absent until the engine binds it. */
|
|
126
|
-
get address() {
|
|
127
|
-
return this.sourceAddress;
|
|
128
|
-
}
|
|
129
|
-
/** @internal Bind once; resuming the same log must not rename its earlier positions. */
|
|
130
|
-
bindAddress(logRunId, drillPath) {
|
|
131
|
-
if (this.sourceAddressRetired)
|
|
132
|
-
return;
|
|
133
|
-
this.sourceAddress ??= Object.freeze({ logRunId, drillPath: Object.freeze([...drillPath]) });
|
|
134
|
-
}
|
|
135
|
-
/** O(1) source-time capture. No counter, observer bookkeeping, or future commit prediction. */
|
|
136
|
-
capturePosition(runId) {
|
|
137
|
-
if (!this.sourceAddress)
|
|
138
|
-
return undefined;
|
|
139
|
-
return Object.freeze({ runId, ...this.sourceAddress, committedThroughIdx: this.steps.length - 1 });
|
|
140
|
-
}
|
|
141
|
-
/** Wipes history (useful for test resets). */
|
|
142
|
-
clear() {
|
|
143
|
-
this.steps = [];
|
|
144
|
-
// A reset prefix cannot reuse old coordinates, even if another stage of
|
|
145
|
-
// the SAME leg binds it again. Keep clear's data behavior, but retire
|
|
146
|
-
// addressing for this log; known coordinates require a fresh EventLog.
|
|
147
|
-
this.sourceAddress = undefined;
|
|
148
|
-
this.sourceAddressRetired = true;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
exports.EventLog = EventLog;
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXZlbnRMb2cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL21lbW9yeS9FdmVudExvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHOzs7QUFFSCxvREFBaUU7QUFHakUseUNBQWlEO0FBRWpELE1BQWEsUUFBUTtJQUNuQiw2REFBNkQ7SUFDckQsSUFBSSxDQUFNO0lBQ2xCLHNDQUFzQztJQUM5QixLQUFLLEdBQW1CLEVBQUUsQ0FBQztJQUMzQixhQUFhLENBQWM7SUFDM0Isb0JBQW9CLEdBQUcsS0FBSyxDQUFDO0lBRXJDLFlBQVksYUFBa0I7UUFDNUIsdUVBQXVFO1FBQ3ZFLHNFQUFzRTtRQUN0RSxzRUFBc0U7UUFDdEUsK0NBQStDO1FBQy9DLElBQUksQ0FBQyxJQUFJLEdBQUcsYUFBYSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILGVBQWU7UUFDYixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW9CRztJQUNILFdBQVcsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNO1FBQ3JDLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEQsSUFBQSw4QkFBbUIsRUFBQyxHQUFHLEVBQUUsT0FBc0IsRUFBRSxTQUF3QixFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxNQUFvQjtRQUN6QixNQUFNLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO1FBQy9CLElBQUEsd0JBQVksRUFBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxJQUFJO1FBQ0YsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyx1QkFBVyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILFFBQVE7UUFDTixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVELGtDQUFrQztJQUNsQyxJQUFJLE1BQU07UUFDUixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzNCLENBQUM7SUFFRCx3RUFBd0U7SUFDeEUsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDO0lBQzVCLENBQUM7SUFFRCx3RkFBd0Y7SUFDeEYsV0FBVyxDQUFDLFFBQWdCLEVBQUUsU0FBNEI7UUFDeEQsSUFBSSxJQUFJLENBQUMsb0JBQW9CO1lBQUUsT0FBTztRQUN0QyxJQUFJLENBQUMsYUFBYSxLQUFLLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9GLENBQUM7SUFFRCwrRkFBK0Y7SUFDL0YsZUFBZSxDQUFDLEtBQWE7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDMUMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ3JHLENBQUM7SUFFRCw4Q0FBOEM7SUFDOUMsS0FBSztRQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLHdFQUF3RTtRQUN4RSxzRUFBc0U7UUFDdEUsdUVBQXVFO1FBQ3ZFLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO1FBQy9CLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUM7SUFDbkMsQ0FBQztDQUNGO0FBOUhELDRCQThIQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRXZlbnRMb2cg4oCUIFRpbWUtdHJhdmVsIHNuYXBzaG90IHN0b3JhZ2UgZm9yIGZsb3djaGFydCBleGVjdXRpb25cbiAqXG4gKiBMaWtlIGdpdCBoaXN0b3J5OiBzdG9yZXMgY29tbWl0IGJ1bmRsZXMgKGRpZmZzKSwgbm90IGZ1bGwgc25hcHNob3RzLlxuICpcbiAqIFRIRSBSRUNPUkQgSVMgSU1NVVRBQkxFIEZST00gYHJlY29yZGAgKEYzLCBydWxpbmcgUjMpLiBFdmVyeSBidW5kbGUgaXMgZGVlcC1mcm96ZW4gYXMgaXQgaXNcbiAqIHJlY29yZGVkIOKAlCB0aGUgYnVuZGxlLCBgb3ZlcndyaXRlYCBhbmQgYHVwZGF0ZXNgIGF0IGV2ZXJ5IGRlcHRoLCB0aGUgdHJhY2UgYW5kIGVhY2ggcm93LCB0aGVcbiAqIHJvdydzIGByZWFkS2V5c2AsIGByZWRhY3RlZFBhdGhzYCwgYHRhZ3NgLCBgdW50cmFja2VkU291cmNlc2Ag4oCUIHNvIGEgaG9sZGVyIG9mIGEgc25hcHNob3QgY2FuIG5vXG4gKiBsb25nZXIgcmV3cml0ZSB0aGUgaGlzdG9yeSBldmVyeSBsYXRlciBhbnN3ZXIgaXMgZm9sZGVkIGZyb206IGFuIGFzc2lnbm1lbnQgaW50byBhIGJ1bmRsZSB0aHJvd3NcbiAqIGEgYFR5cGVFcnJvcmAgaW4gc3RyaWN0IGNvZGUuIFNhZmUgYmVjYXVzZSBub3RoaW5nIG91dHNpZGUgdGhlIGxvZyBob2xkcyBhIGJ1bmRsZSdzIGNvbnRhaW5lcnM6XG4gKiB0aGUgbG9nJ3MgcGF5bG9hZCBpcyB0aGUgY29tbWl0J3Mgb3duIGNvcHkgKGByZWNvcmRDb21taXRgIGhhbmRzIGl0IHRoZSBvdXRwdXQgb2ZcbiAqIGBzY3J1YlBhdGNoYCksIGFuZCBsaXZlIHN0YXRlLCB0aGUgcmVkYWN0ZWQgbWlycm9yIGFuZCB3cml0ZSByZXRlbnRpb24gZWFjaCB0YWtlIHRoZWlyIG93biBjb3B5XG4gKiAoYHZlcmJzLnRzIMK3IGZvbGRSb3dzYCBkZXRhY2hlcywgYFN0YWdlQ29udGV4dCDCtyByZXRhaW5lZEZvcm1gIGNsb25lcykg4oCUIHBpbm5lZCBieVxuICogdGVzdC9saWIvbWVtb3J5L3Byb3BlcnR5L3JlY29yZC1yZWFjaGFiaWxpdHkucHJvcGVydHkudGVzdC50cy5cbiAqXG4gKiBXaGF0IGBPYmplY3QuZnJlZXplYCBjYW5ub3Qgc2VhbCDigJQgYSBEYXRlJ3MgdGltZSwgYSBNYXAncyBvciBTZXQncyBlbnRyaWVzLCBhIGJ1ZmZlcidzIGJ5dGVzLCBhXG4gKiBSZWdFeHAsIGFuIEVycm9yJ3Mgc3RhY2sg4oCUIGlzIG5ldmVyIGhhbmRlZCBvdXQgdG8gYSByZWFkZXIgKDkuNDQuMik6IGByZWNvcmRgIHJlbWVtYmVycyB0aGF0IGFcbiAqIGJ1bmRsZSBob2xkcyBzdWNoIGEgdmFsdWUgKGBjYXB0dXJlL2ZyZWV6ZS50cyDCtyBmcmVlemVSZWNvcmRgKSwgYW5kIGBsaXN0KClgIOKAlCBsaWtlIHRoZSBwdWJsaWNcbiAqIHNuYXBzaG90LCBgcnVubmVyL3NuYXBzaG90LnRzIMK3IHNlcnZlZFNuYXBzaG90YCDigJQgc2VydmVzIHRoYXQgYnVuZGxlIGFzIGEgY29weSBvZiBpdHMgb3BlbiBwYXRoc1xuICogKGBzZXJ2ZVJlY29yZGAsIG1hcHBlZCBhdCBpdHMgZmlyc3Qgc2VydmUpOiBmcmVzaCBmcm96ZW4gY29udGFpbmVycyBkb3duIHRvIGVhY2ggc3VjaCB2YWx1ZSwgYVxuICogZnJlc2ggY29weSBvZiBpdCwgZXZlcnkgb3RoZXIgcGFydCB0aGUgbG9nJ3Mgb3duLiBBIHJlYWRlciBlZGl0cyBvbmx5IGl0cyBvd24gY29weTsgZXZlcnkgbGF0ZXJcbiAqIHNlcnZlIHJlYWRzIHRoZSByZWNvcmQgYXMgcmVjb3JkZWQuIGByZWNvcmRlZCgpYCBpcyB0aGUgZW5naW5lJ3Mgb3duLCB1bnNlcnZlZCByZWFkLiBOYW1lZCBob2xlczogYW4gb2JqZWN0IGh1bmcgb24gYW4gYXJyYXkgRVhQQU5ETyAoYXJyYXlzIGFyZSB3YWxrZWRcbiAqIGJ5IGluZGV4IOKAlCB0aGUgYCdpbmRpY2VzJ2Agd2Fsaywgd2hpY2gga2VlcHMgdGhlIGZyZWV6ZSBpbnNpZGUgaXRzIGJ1ZGdldDsgYW4gZXhwYW5kbyBpcyBvdXQgb2ZcbiAqIGNvbnRyYWN0IGZvciBzdGF0ZSkgYW5kIGEgYFNoYXJlZEFycmF5QnVmZmVyYCAoZXZlcnkgY29weSBzaGFyZXMgaXRzIG1lbW9yeSkuIEEgZnJvemVuIFJlZ0V4cCdzXG4gKiBgbGFzdEluZGV4YCBpcyByZWFkLW9ubHksIHNvIGEgYC9nYCBvciBgL3lgIHJlZ2V4IHJlYWQgZnJvbSBhIGJ1bmRsZSB0aHJvd3Mgd2hlbiBgZXhlY2Agb3JcbiAqIGByZXBsYWNlYCBhZHZhbmNlIGl0LlxuICovXG5cbmltcG9ydCB7IGZyZWV6ZVJlY29yZCwgc2VydmVSZWNvcmQgfSBmcm9tICcuLi9jYXB0dXJlL2ZyZWV6ZS5qcyc7XG5pbXBvcnQgdHlwZSB7IEVtaXRTb3VyY2VQb3NpdGlvbiwgTG9nQWRkcmVzcyB9IGZyb20gJy4vZXZlbnRQb3NpdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbW1pdEJ1bmRsZSwgTWVtb3J5UGF0Y2ggfSBmcm9tICcuL3R5cGVzLmpzJztcbmltcG9ydCB7IGFwcGx5U21hcnRNZXJnZUludG8gfSBmcm9tICcuL3V0aWxzLmpzJztcblxuZXhwb3J0IGNsYXNzIEV2ZW50TG9nIHtcbiAgLyoqIEJhc2Ugc25hcHNob3QgQkVGT1JFIHRoZSBmaXJzdCBzdGFnZSBtdXRhdGVzIGFueXRoaW5nLiAqL1xuICBwcml2YXRlIGJhc2U6IGFueTtcbiAgLyoqIE9yZGVyZWQgbGlzdCBvZiBjb21taXQgYnVuZGxlcy4gKi9cbiAgcHJpdmF0ZSBzdGVwczogQ29tbWl0QnVuZGxlW10gPSBbXTtcbiAgcHJpdmF0ZSBzb3VyY2VBZGRyZXNzPzogTG9nQWRkcmVzcztcbiAgcHJpdmF0ZSBzb3VyY2VBZGRyZXNzUmV0aXJlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKGluaXRpYWxNZW1vcnk6IGFueSkge1xuICAgIC8vIE5vcm1hbGlzZWQgdG8gYW4gb2JqZWN0OiB0aGUgYmFzZSBpcyBhIFNUQVRFLCBhbmQgZXZlcnkgZm9sZCBvdmVyIGl0XG4gICAgLy8gKGBtYXRlcmlhbGlzZWAsIGBzdGF0ZUF0YCkgYXBwbGllcyBwYXRoIHdyaXRlcyB0byBpdC4gYHVuZGVmaW5lZGAg4oCUXG4gICAgLy8gd2hhdCBhIHJ1biB3aXRoIG5vIGBpbml0aWFsQ29udGV4dGAgdXNlZCB0byBzdG9yZSBoZXJlIOKAlCBtYWRlIGV2ZXJ5XG4gICAgLy8gb25lIG9mIHRob3NlIGZvbGRzIHRocm93IG9uIHRoZSBmaXJzdCBgc2V0YC5cbiAgICB0aGlzLmJhc2UgPSBpbml0aWFsTWVtb3J5ID09PSB1bmRlZmluZWQgPyB7fSA6IHN0cnVjdHVyZWRDbG9uZShpbml0aWFsTWVtb3J5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZm9sZCBCQVNFIOKAlCB0aGUgc3RhdGUgYXMgaXQgc3Rvb2QgYmVmb3JlIHRoZSBmaXJzdCBjb21taXQuXG4gICAqXG4gICAqIFRoaXMgaXMgdGhlIG90aGVyIGhhbGYgb2YgdGhlIGNvbW1pdCBsb2c6IGJ1bmRsZXMgYXJlIERJRkZTLCBzbyBhIGxvZ1xuICAgKiBhbG9uZSBjYW5ub3QgcmVjb25zdHJ1Y3Qgc3RhdGUgdGhhdCB3YXMgc2VlZGVkIGJlZm9yZSB0aGUgcnVuIChhblxuICAgKiBleGVjdXRvciBgaW5pdGlhbENvbnRleHRgLCBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgLCBhIHJlc3VtZSdzXG4gICAqIGBjaGVja3BvaW50LnNoYXJlZFN0YXRlYCwgYSBzdWJmbG93J3MgYGlucHV0TWFwcGVyYCBzZWVkKS4gVHJhdmVsbGluZ1xuICAgKiB3aXRoIHRoZSBsb2cg4oCUIGBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlYCDigJQgaXMgd2hhdCBsZXRzIGFuIE9GRkxJTkVcbiAgICogY29uc3VtZXIgZm9sZDsgd2l0aG91dCBpdCB0aGUgaG9uZXN0IGFuc3dlciBpcyBhIHBhcnRpYWwgb25lXG4gICAqIChgc3RhdGVBdGAncyBgYmFzaXM6ICdsb2ctb25seSdgKS5cbiAgICpcbiAgICogUmV0dXJucyBhIGZyZXNoIGRldGFjaGVkIGNsb25lIG9uIGV2ZXJ5IGNhbGwg4oCUIHRoZSBjYWxsZXIgb3ducyBpdC5cbiAgICovXG4gIGdldEluaXRpYWxTdGF0ZSgpOiBhbnkge1xuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5iYXNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbnN0cnVjdHMgdGhlIGZ1bGwgc3RhdGUgYXQgYW55IGdpdmVuIHN0ZXAuXG4gICAqIFJlcGxheXMgY29tbWl0cyBmcm9tIHRoZSBiZWdpbm5pbmcg4oCUIE8obikgYnV0IGxvdyBtZW1vcnkgZm9vdHByaW50LlxuICAgKlxuICAgKiBJTkRFWCBDT05WRU5USU9OIOKAlCBgc3RlcElkeGAgaXMgRVhDTFVTSVZFOiBgbWF0ZXJpYWxpc2UoMylgIGZvbGRzIGNvbW1pdHNcbiAgICogMCwgMSBhbmQgMi4gYHN0YXRlQXQoc291cmNlLCBjb21taXRJZHgpYCAoZm9vdHByaW50anMvdHJhY2UpIGZvbGRzIHRoZVxuICAgKiBzYW1lIGxvZyBidXQgaXRzIGBjb21taXRJZHhgIGlzIElOQ0xVU0lWRSwgYmVjYXVzZSBhIHJlYWRlcidzIGN1cnNvciBhc2tzXG4gICAqIFwidGhlIHN0YXRlIEFUIHRoaXMgc3RvcFwiLCB3aGljaCBtdXN0IGluY2x1ZGUgdGhhdCBzdG9wJ3Mgb3duIGNvbW1pdC4gVHdvXG4gICAqIGZvbGRzIG92ZXIgb25lIGxvZyB3aXRoIG9wcG9zaXRlIGNvbnZlbnRpb25zOiBjaGVjayB3aGljaCBvbmUgeW91IGhvbGQuXG4gICAqXG4gICAqIE9uZSBjbG9uZSBvZiB0aGUgYmFzZSBwZXIgY2FsbCwgdGhlbiBldmVyeSBidW5kbGUgcmVwbGF5ZWQgSU5UTyB0aGF0XG4gICAqIHByaXZhdGUgY29weSAoYGFwcGx5U21hcnRNZXJnZUludG9gIOKAlCB0aGUgbGl2ZSBjb21taXQncyBjb3B5LW9uLXdyaXRlIGxhd1xuICAgKiBiZWxvdyB0aGUgcm9vdCwgOS4yOS4wLCBzbyB0aGUgZm9sZCBhbmQgdGhlIGxpdmUgc3RhdGUgYWdyZWUgYXQgZXZlcnlcbiAgICogcGF0aCkuIFRoZSByZXN1bHQgaXMgdGhlIGNhbGxlcidzOiBpdCBzaGFyZXMgbm90aGluZyB3aXRoIHRoZSBiYXNlIG9yXG4gICAqIHRoZSBsb2cuXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIFNpbmNlIDkuMzMuMCDigJQgdXNlIGBzdGF0ZUF0YCBmcm9tIGBmb290cHJpbnRqcy90cmFjZWAsIHdoaWNoIGZvbGRzIHRoZSBzYW1lIGxvZ1xuICAgKiBmcm9tIHRoZSBzYW1lIGJhc2UgKGBSdW50aW1lU25hcHNob3QuaW5pdGlhbFN0YXRlYCkgYW5kIHNheXMgaG93IGl0IHdhcyBkZXJpdmVkIChgYmFzaXNgKS5cbiAgICogTm90aGluZyBpbiB0aGUgbGlicmFyeSBjYWxscyB0aGlzOyBpdCBzdGF5cyBmb3Igb25lIG1pbm9yIGFuZCBpcyB0aGVuIHJlbW92ZWQuIE1pbmQgdGhlXG4gICAqIGluZGV4OiBgbWF0ZXJpYWxpc2UobilgIGZvbGRzIGNvbW1pdHMgYDAuLm4tMWAsIGBzdGF0ZUF0KHNvdXJjZSwgbiAtIDEpYCB0aGUgc2FtZSBjb21taXRzLlxuICAgKi9cbiAgbWF0ZXJpYWxpc2Uoc3RlcElkeCA9IHRoaXMuc3RlcHMubGVuZ3RoKTogYW55IHtcbiAgICBjb25zdCBvdXQgPSBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5iYXNlKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ZXBJZHg7IGkrKykge1xuICAgICAgY29uc3QgeyBvdmVyd3JpdGUsIHVwZGF0ZXMsIHRyYWNlIH0gPSB0aGlzLnN0ZXBzW2ldO1xuICAgICAgYXBwbHlTbWFydE1lcmdlSW50byhvdXQsIHVwZGF0ZXMgYXMgTWVtb3J5UGF0Y2gsIG92ZXJ3cml0ZSBhcyBNZW1vcnlQYXRjaCwgdHJhY2UpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcnNpc3RzIGEgY29tbWl0IGJ1bmRsZSBmb3IgYSBmaW5pc2hlZCBzdGFnZSwgYW5kIEZSRUVaRVMgaXQgKHNlZSB0aGUgbW9kdWxlIGRvYyk6IHRoZSBidW5kbGVcbiAgICogaXMgc3RhbXBlZCB3aXRoIGl0cyBwb3NpdGlvbiwgdGhlbiBkZWVwLWZyb3plbiwgdGhlbiBhcHBlbmRlZC4gVGhlIGVuZ2luZSBoYW5kcyBpdCBhIGJ1bmRsZVxuICAgKiBidWlsdCBmb3IgdGhlIGxvZyBhbG9uZTsgYSBjYWxsZXIgb2YgdGhpcyBjbGFzcyAoYGZvb3RwcmludGpzL3dyaXRlYCkgaGFuZHMgb3ZlciBhIGJ1bmRsZSBpdFxuICAgKiB3aWxsIG5vIGxvbmdlciBlZGl0IOKAlCBpdHMgb3duIG9iamVjdCBpcyB0aGUgb25lIGZyb3plbi5cbiAgICovXG4gIHJlY29yZChidW5kbGU6IENvbW1pdEJ1bmRsZSk6IHZvaWQge1xuICAgIGJ1bmRsZS5pZHggPSB0aGlzLnN0ZXBzLmxlbmd0aDtcbiAgICBmcmVlemVSZWNvcmQoYnVuZGxlLCAnaW5kaWNlcycpO1xuICAgIHRoaXMuc3RlcHMucHVzaChidW5kbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV2ZXJ5IHJlY29yZGVkIGNvbW1pdCBidW5kbGUsIEFTIFNFUlZFRCAoOS40NC4yKTogYSBuZXcgYXJyYXkgZWFjaCBjYWxsOyBhIGJ1bmRsZSBmcmVlemluZyBzZWFsZWRcbiAgICogd2hvbGUgaXMgdGhlIGxvZydzIG93biAoZnJvemVuKSBvYmplY3QsIG9uZSBob2xkaW5nIGEgRGF0ZSwgTWFwLCBidWZmZXIg4oCmIGlzIGEgY29weSBvZiBpdHMgb3BlblxuICAgKiBwYXRocyAoYGNhcHR1cmUvZnJlZXplLnRzIMK3IHNlcnZlUmVjb3JkYCkg4oCUIHRoZSByZWFkZXIncyBvd24sIHNvIG5vIGVkaXQgcmVhY2hlcyB0aGUgbG9nLlxuICAgKi9cbiAgbGlzdCgpOiBDb21taXRCdW5kbGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3RlcHMubWFwKHNlcnZlUmVjb3JkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWwgVGhlIGJ1bmRsZXMgYXMgdGhlIGxvZyBob2xkcyB0aGVtIOKAlCBlYWNoIGZyb3plbiwgTk9UIHNlcnZlZCDigJQgaW4gYSBuZXcgYXJyYXksIHNvIGEgaG9sZGVyJ3NcbiAgICogYHNwbGljZWAgcmVhY2hlcyBvbmx5IGl0cyBvd24uIEZvciB0aGUgZW5naW5lJ3Mgb3duIHNuYXBzaG90IChgRXhlY3V0aW9uUnVudGltZSDCtyBnZXRTbmFwc2hvdGAsIHdoaWNoXG4gICAqIGEgc3ViZmxvdyBtb3VudCB0YWtlcyBvbmNlIHBlciBtb3VudCksIHNvIHRoZSBydW4gc2VydmVzIG5vdGhpbmc7IGEgcmVhZGVyIGlzIHNlcnZlZCBieSBgbGlzdCgpYCBhbmRcbiAgICogYGdldFNuYXBzaG90KCkuY29tbWl0TG9nYC4gQSBrbm93biBvcGVuIGRvb3IgKENIQU5HRUxPRyA5LjQ0LjIpOiBhIGhvbGRlciBvZiB0aGVzZSBidW5kbGVzIGNhbiBzdGlsbFxuICAgKiBlZGl0IGEgRGF0ZSwgTWFwIG9yIGJ1ZmZlciBpbnNpZGUgdGhlbS5cbiAgICovXG4gIHJlY29yZGVkKCk6IENvbW1pdEJ1bmRsZVtdIHtcbiAgICByZXR1cm4gdGhpcy5zdGVwcy5zbGljZSgpO1xuICB9XG5cbiAgLyoqIE51bWJlciBvZiByZWNvcmRlZCBjb21taXRzLiAqL1xuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc3RlcHMubGVuZ3RoO1xuICB9XG5cbiAgLyoqIEltbXV0YWJsZSBpZGVudGl0eSBvZiB0aGlzIGxvZywgYWJzZW50IHVudGlsIHRoZSBlbmdpbmUgYmluZHMgaXQuICovXG4gIGdldCBhZGRyZXNzKCk6IExvZ0FkZHJlc3MgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnNvdXJjZUFkZHJlc3M7XG4gIH1cblxuICAvKiogQGludGVybmFsIEJpbmQgb25jZTsgcmVzdW1pbmcgdGhlIHNhbWUgbG9nIG11c3Qgbm90IHJlbmFtZSBpdHMgZWFybGllciBwb3NpdGlvbnMuICovXG4gIGJpbmRBZGRyZXNzKGxvZ1J1bklkOiBzdHJpbmcsIGRyaWxsUGF0aDogcmVhZG9ubHkgc3RyaW5nW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5zb3VyY2VBZGRyZXNzUmV0aXJlZCkgcmV0dXJuO1xuICAgIHRoaXMuc291cmNlQWRkcmVzcyA/Pz0gT2JqZWN0LmZyZWV6ZSh7IGxvZ1J1bklkLCBkcmlsbFBhdGg6IE9iamVjdC5mcmVlemUoWy4uLmRyaWxsUGF0aF0pIH0pO1xuICB9XG5cbiAgLyoqIE8oMSkgc291cmNlLXRpbWUgY2FwdHVyZS4gTm8gY291bnRlciwgb2JzZXJ2ZXIgYm9va2tlZXBpbmcsIG9yIGZ1dHVyZSBjb21taXQgcHJlZGljdGlvbi4gKi9cbiAgY2FwdHVyZVBvc2l0aW9uKHJ1bklkOiBzdHJpbmcpOiBFbWl0U291cmNlUG9zaXRpb24gfCB1bmRlZmluZWQge1xuICAgIGlmICghdGhpcy5zb3VyY2VBZGRyZXNzKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHsgcnVuSWQsIC4uLnRoaXMuc291cmNlQWRkcmVzcywgY29tbWl0dGVkVGhyb3VnaElkeDogdGhpcy5zdGVwcy5sZW5ndGggLSAxIH0pO1xuICB9XG5cbiAgLyoqIFdpcGVzIGhpc3RvcnkgKHVzZWZ1bCBmb3IgdGVzdCByZXNldHMpLiAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICB0aGlzLnN0ZXBzID0gW107XG4gICAgLy8gQSByZXNldCBwcmVmaXggY2Fubm90IHJldXNlIG9sZCBjb29yZGluYXRlcywgZXZlbiBpZiBhbm90aGVyIHN0YWdlIG9mXG4gICAgLy8gdGhlIFNBTUUgbGVnIGJpbmRzIGl0IGFnYWluLiBLZWVwIGNsZWFyJ3MgZGF0YSBiZWhhdmlvciwgYnV0IHJldGlyZVxuICAgIC8vIGFkZHJlc3NpbmcgZm9yIHRoaXMgbG9nOyBrbm93biBjb29yZGluYXRlcyByZXF1aXJlIGEgZnJlc2ggRXZlbnRMb2cuXG4gICAgdGhpcy5zb3VyY2VBZGRyZXNzID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuc291cmNlQWRkcmVzc1JldGlyZWQgPSB0cnVlO1xuICB9XG59XG4iXX0=
|