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,364 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* timeTravel — a reader's cursor over a finished trace.
|
|
4
|
-
*
|
|
5
|
-
* The five laws this file implements (and the folder README states with an
|
|
6
|
-
* example each):
|
|
7
|
-
*
|
|
8
|
-
* 1. ONE cursor. This object holds the only position. `drill()` returns a
|
|
9
|
-
* separate cursor over a separate log, never a second position here.
|
|
10
|
-
* 2. A miss never moves. Every refusal returns the reason and leaves the
|
|
11
|
-
* cursor exactly where it was.
|
|
12
|
-
* 3. A fold result is detached. `stateAt` returns frozen, cloned state that
|
|
13
|
-
* shares nothing with the engine.
|
|
14
|
-
* 4. Marks live beside the log. They are the reader's notes, never written
|
|
15
|
-
* into the run's record.
|
|
16
|
-
* 5. Stops are DERIVED from the recorded log — read-time queries over
|
|
17
|
-
* collected data, never a re-walk that invents what was not recorded.
|
|
18
|
-
*
|
|
19
|
-
* A CHAIN (9.18.0) does not add a sixth law and does not bend these five: it
|
|
20
|
-
* is still one cursor, over sources that are still only read. What it adds is
|
|
21
|
-
* that the STEPS run across a pause/resume — see `chain.ts` for the ordering
|
|
22
|
-
* and lineage checks, and for why commit indices stay run-local.
|
|
23
|
-
*/
|
|
24
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
-
exports.timeTravel = void 0;
|
|
26
|
-
const runtimeStageId_js_1 = require("../ids/runtimeStageId.js");
|
|
27
|
-
const bundles_js_1 = require("./bundles.js");
|
|
28
|
-
const chain_js_1 = require("./chain.js");
|
|
29
|
-
const commitStops_js_1 = require("./commitStops.js");
|
|
30
|
-
const stateAt_js_1 = require("./stateAt.js");
|
|
31
|
-
class Cursor {
|
|
32
|
-
stops;
|
|
33
|
-
path;
|
|
34
|
-
mountRuntimeStageId;
|
|
35
|
-
parent;
|
|
36
|
-
sourceCount;
|
|
37
|
-
legs;
|
|
38
|
-
sources;
|
|
39
|
-
options;
|
|
40
|
-
_marks;
|
|
41
|
-
step;
|
|
42
|
-
/** The last fold's working copy, so a step forward applies one bundle (9.25.0). */
|
|
43
|
-
foldMemo;
|
|
44
|
-
constructor(sources, options, path, parent, mountRuntimeStageId) {
|
|
45
|
-
this.sources = sources;
|
|
46
|
-
this.options = options;
|
|
47
|
-
this.path = path;
|
|
48
|
-
this.parent = parent;
|
|
49
|
-
this.mountRuntimeStageId = mountRuntimeStageId;
|
|
50
|
-
this.legs = sources.map((source) => (0, stateAt_js_1.readSource)(source));
|
|
51
|
-
this.sourceCount = sources.length;
|
|
52
|
-
// The shipped strategy has no vocabulary of its own (`meta` is never set),
|
|
53
|
-
// so it serves any `TMeta` a caller asked for.
|
|
54
|
-
const strategy = options.strategy ?? commitStops_js_1.commitStopsStrategy;
|
|
55
|
-
// ONE CALL PER SOURCE, with that source's own log and tree: a strategy
|
|
56
|
-
// never has to know it is part of a chain, and its indices stay local to
|
|
57
|
-
// the leg it was handed.
|
|
58
|
-
const perSource = this.legs.map((leg, i) => strategy.stopsFor(leg.log, (0, bundles_js_1.readTree)(sources[i].executionTree), sources[i].subflowResults));
|
|
59
|
-
this.stops = Object.freeze(sources.length === 1 ? perSource[0] : chainStops(perSource));
|
|
60
|
-
this._marks = [...(options.marks ?? [])];
|
|
61
|
-
this.step = 0;
|
|
62
|
-
}
|
|
63
|
-
// ── Position ─────────────────────────────────────────────────────────────
|
|
64
|
-
at() {
|
|
65
|
-
return this.stops[this.step];
|
|
66
|
-
}
|
|
67
|
-
moveTo(step) {
|
|
68
|
-
const from = this.at();
|
|
69
|
-
this.step = step;
|
|
70
|
-
return { moved: true, from, to: this.stops[step] };
|
|
71
|
-
}
|
|
72
|
-
/** Law 2: a refusal never touches `this.step`. */
|
|
73
|
-
refuse(reason, nearest) {
|
|
74
|
-
const at = this.at();
|
|
75
|
-
return nearest ? { moved: false, reason, at, nearest } : { moved: false, reason, at };
|
|
76
|
-
}
|
|
77
|
-
first() {
|
|
78
|
-
if (this.stops.length === 0)
|
|
79
|
-
return this.refuse('empty');
|
|
80
|
-
if (this.step === 0)
|
|
81
|
-
return this.refuse('clamped');
|
|
82
|
-
return this.moveTo(0);
|
|
83
|
-
}
|
|
84
|
-
last() {
|
|
85
|
-
if (this.stops.length === 0)
|
|
86
|
-
return this.refuse('empty');
|
|
87
|
-
const end = this.stops.length - 1;
|
|
88
|
-
if (this.step === end)
|
|
89
|
-
return this.refuse('clamped');
|
|
90
|
-
return this.moveTo(end);
|
|
91
|
-
}
|
|
92
|
-
prev() {
|
|
93
|
-
if (this.stops.length === 0)
|
|
94
|
-
return this.refuse('empty');
|
|
95
|
-
if (this.step === 0)
|
|
96
|
-
return this.refuse('clamped');
|
|
97
|
-
return this.moveTo(this.step - 1);
|
|
98
|
-
}
|
|
99
|
-
next() {
|
|
100
|
-
if (this.stops.length === 0)
|
|
101
|
-
return this.refuse('empty');
|
|
102
|
-
if (this.step >= this.stops.length - 1)
|
|
103
|
-
return this.refuse('clamped');
|
|
104
|
-
return this.moveTo(this.step + 1);
|
|
105
|
-
}
|
|
106
|
-
jumpTo(target) {
|
|
107
|
-
if (this.stops.length === 0)
|
|
108
|
-
return this.refuse('empty');
|
|
109
|
-
if (typeof target === 'number') {
|
|
110
|
-
const step = Math.trunc(target);
|
|
111
|
-
if (Number.isNaN(step))
|
|
112
|
-
return this.refuse('miss');
|
|
113
|
-
if (step < 0)
|
|
114
|
-
return this.refuse('clamped', this.stops[0]);
|
|
115
|
-
if (step > this.stops.length - 1)
|
|
116
|
-
return this.refuse('clamped', this.stops[this.stops.length - 1]);
|
|
117
|
-
if (step === this.step)
|
|
118
|
-
return this.refuse('clamped');
|
|
119
|
-
return this.moveTo(step);
|
|
120
|
-
}
|
|
121
|
-
// `''` is not an address: it is what the bookends and any pre-stage
|
|
122
|
-
// root commit carry. Those are reached by step, never by id.
|
|
123
|
-
if (target === '')
|
|
124
|
-
return this.refuse('miss');
|
|
125
|
-
const hit = this.stops.find((stop) => stop.runtimeStageId === target);
|
|
126
|
-
if (!hit)
|
|
127
|
-
return this.refuse('miss', this.nearestTo(target));
|
|
128
|
-
if (hit.step === this.step)
|
|
129
|
-
return this.refuse('clamped');
|
|
130
|
-
return this.moveTo(hit.step);
|
|
131
|
-
}
|
|
132
|
-
/**
|
|
133
|
-
* The closest namable stop for a `runtimeStageId` that is not on this axis:
|
|
134
|
-
* the last stop of the same STAGE (a different iteration of the same node),
|
|
135
|
-
* else the last stop whose commit precedes the missed id's execution index.
|
|
136
|
-
* Naming a neighbour is a courtesy for the UI — it never moves the cursor.
|
|
137
|
-
*/
|
|
138
|
-
nearestTo(runtimeStageId) {
|
|
139
|
-
if (!(0, runtimeStageId_js_1.isExecutionKey)(runtimeStageId))
|
|
140
|
-
return undefined;
|
|
141
|
-
const stagePart = (0, runtimeStageId_js_1.stageIdOf)(runtimeStageId);
|
|
142
|
-
const wanted = (0, runtimeStageId_js_1.executionIndexOf)(runtimeStageId);
|
|
143
|
-
let sameStage;
|
|
144
|
-
let byIndex;
|
|
145
|
-
for (const stop of this.stops) {
|
|
146
|
-
if (!(0, runtimeStageId_js_1.isExecutionKey)(stop.runtimeStageId))
|
|
147
|
-
continue;
|
|
148
|
-
if ((0, runtimeStageId_js_1.stageIdOf)(stop.runtimeStageId) === stagePart)
|
|
149
|
-
sameStage = stop;
|
|
150
|
-
if (!Number.isNaN(wanted)) {
|
|
151
|
-
const idx = (0, runtimeStageId_js_1.executionIndexOf)(stop.runtimeStageId);
|
|
152
|
-
if (!Number.isNaN(idx) && idx <= wanted)
|
|
153
|
-
byIndex = stop;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
return sameStage ?? byIndex;
|
|
157
|
-
}
|
|
158
|
-
// ── Reading ──────────────────────────────────────────────────────────────
|
|
159
|
-
stateAt(stop) {
|
|
160
|
-
const target = stop ?? this.at();
|
|
161
|
-
const leg = target?.sourceIdx ?? 0;
|
|
162
|
-
const fold = (0, stateAt_js_1.foldLegsFrom)(this.legs, leg, target ? target.lastCommitIdx : -1, this.foldMemo);
|
|
163
|
-
this.foldMemo = fold.memo;
|
|
164
|
-
const folded = fold.folded;
|
|
165
|
-
// Which leg the index belongs to, but only when there is more than one —
|
|
166
|
-
// a single-source fold keeps the 9.17.0 shape exactly.
|
|
167
|
-
return this.legs.length > 1 ? { ...folded, sourceIdx: leg } : folded;
|
|
168
|
-
}
|
|
169
|
-
changedSince(from) {
|
|
170
|
-
const to = this.at();
|
|
171
|
-
if (!to)
|
|
172
|
-
return Object.freeze([]);
|
|
173
|
-
const start = from ?? this.stops[this.step - 1];
|
|
174
|
-
// No earlier stop (we are at `'start'`) ⇒ everything up to here: nothing
|
|
175
|
-
// on a run cursor, and the subflow's `inputMapper` seed on a drilled one
|
|
176
|
-
// (the start bookend covers the seed that precedes stage one — `commitStops`).
|
|
177
|
-
const toLeg = to.sourceIdx ?? 0;
|
|
178
|
-
const fromLeg = start ? start.sourceIdx ?? 0 : toLeg;
|
|
179
|
-
const afterIdx = start ? start.lastCommitIdx : -1;
|
|
180
|
-
const keys = new Set();
|
|
181
|
-
// A range that crosses a chain seam is walked leg by leg: the tail of the
|
|
182
|
-
// leg it started in, every leg in between whole, then the head of the leg
|
|
183
|
-
// it ends in. Backwards ranges walk nothing and give `[]`, as before.
|
|
184
|
-
for (let leg = fromLeg; leg <= toLeg && leg < this.legs.length; leg++) {
|
|
185
|
-
const log = this.legs[leg].log;
|
|
186
|
-
const lo = leg === fromLeg ? afterIdx + 1 : 0;
|
|
187
|
-
const hi = leg === toLeg ? to.lastCommitIdx : log.length - 1;
|
|
188
|
-
for (let i = lo; i <= hi; i++) {
|
|
189
|
-
const bundle = log[i];
|
|
190
|
-
if (!bundle)
|
|
191
|
-
continue;
|
|
192
|
-
for (const entry of bundle.trace)
|
|
193
|
-
keys.add(entry.path);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
return Object.freeze([...keys].sort());
|
|
197
|
-
}
|
|
198
|
-
// ── Marks (law 4: beside the log, never in it) ───────────────────────────
|
|
199
|
-
mark(name, stop) {
|
|
200
|
-
const target = stop ?? this.at();
|
|
201
|
-
if (!target)
|
|
202
|
-
return undefined;
|
|
203
|
-
const entry = Object.freeze({ name, runtimeStageId: target.runtimeStageId, step: target.step });
|
|
204
|
-
const existing = this._marks.findIndex((m) => m.name === name);
|
|
205
|
-
if (existing >= 0)
|
|
206
|
-
this._marks[existing] = entry;
|
|
207
|
-
else
|
|
208
|
-
this._marks.push(entry);
|
|
209
|
-
return entry;
|
|
210
|
-
}
|
|
211
|
-
marks() {
|
|
212
|
-
return Object.freeze([...this._marks]);
|
|
213
|
-
}
|
|
214
|
-
jumpToMark(name) {
|
|
215
|
-
if (this.stops.length === 0)
|
|
216
|
-
return this.refuse('empty');
|
|
217
|
-
const entry = this._marks.find((m) => m.name === name);
|
|
218
|
-
if (!entry)
|
|
219
|
-
return this.refuse('miss');
|
|
220
|
-
// Resolve by runtimeStageId first — the address that survives a change of
|
|
221
|
-
// strategy — and fall back to the remembered step only for the bookends,
|
|
222
|
-
// which have no stage id of their own.
|
|
223
|
-
const byId = entry.runtimeStageId
|
|
224
|
-
? this.stops.find((stop) => stop.runtimeStageId === entry.runtimeStageId)
|
|
225
|
-
: this.stops[entry.step];
|
|
226
|
-
if (!byId)
|
|
227
|
-
return this.refuse('miss', this.nearestTo(entry.runtimeStageId));
|
|
228
|
-
if (byId.step === this.step)
|
|
229
|
-
return this.refuse('clamped');
|
|
230
|
-
return this.moveTo(byId.step);
|
|
231
|
-
}
|
|
232
|
-
// ── Drilling (law 1: a separate cursor, not a second position) ───────────
|
|
233
|
-
drill(mountRuntimeStageId) {
|
|
234
|
-
// On a chain, the mount is looked for in every leg — a subflow that ran
|
|
235
|
-
// before the pause is in the first snapshot's results, one that ran after
|
|
236
|
-
// is in the second's. Ids are unique across a sound chain (chain.ts
|
|
237
|
-
// refuses one where they are not), so the first hit is the only hit.
|
|
238
|
-
let results;
|
|
239
|
-
let result;
|
|
240
|
-
for (const source of this.sources) {
|
|
241
|
-
// A stored recording's results are parsed JSON: read them as a map only
|
|
242
|
-
// when they are one, and as "no subflows" otherwise.
|
|
243
|
-
if (!(0, bundles_js_1.isPlainish)(source.subflowResults))
|
|
244
|
-
continue;
|
|
245
|
-
const hit = source.subflowResults[mountRuntimeStageId];
|
|
246
|
-
if (hit) {
|
|
247
|
-
results = source.subflowResults;
|
|
248
|
-
result = hit;
|
|
249
|
-
break;
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
const tree = result?.treeContext;
|
|
253
|
-
if (!results || !result || !tree || !Array.isArray(tree.history))
|
|
254
|
-
return undefined;
|
|
255
|
-
// `path` is the subflow PATH — the same string for every iteration of a
|
|
256
|
-
// mount inside a loop. `mountRuntimeStageId` is the iteration actually
|
|
257
|
-
// opened, so a UI can label and key three drill panels over `sfx#2`,
|
|
258
|
-
// `sfx#8`, `sfx#14` apart instead of calling all three 'sfx'.
|
|
259
|
-
const childPath = result.subflowId ?? mountRuntimeStageId;
|
|
260
|
-
const child = {
|
|
261
|
-
// Rows are narrowed per bundle when the child reads them — a stored
|
|
262
|
-
// recording's inner history needs no cast either.
|
|
263
|
-
commitLog: tree.history,
|
|
264
|
-
initialState: tree.initialState,
|
|
265
|
-
executionTree: tree.stageContexts,
|
|
266
|
-
// Nested subflow results are merged UP into one flat, dual-keyed map, so
|
|
267
|
-
// the child can drill further through the same map.
|
|
268
|
-
subflowResults: results,
|
|
269
|
-
};
|
|
270
|
-
return new Cursor([child], { strategy: this.options.strategy }, childPath, this, mountRuntimeStageId);
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* Re-step per-source stops into ONE axis.
|
|
275
|
-
*
|
|
276
|
-
* The INTERIOR bookends go: a `'start'` on any leg but the first, and an
|
|
277
|
-
* `'end'` on any leg but the last, are bookends of a leg and not of the run —
|
|
278
|
-
* keeping them would put "the run is over" in the middle of the axis. The
|
|
279
|
-
* commits they covered are not orphaned: a fold always replays its leg from
|
|
280
|
-
* that leg's own base, and `changedSince` walks a seam-crossing range leg by
|
|
281
|
-
* leg (including the head of the leg it ends in). The stops' `commitIdx` /
|
|
282
|
-
* `lastCommitIdx` ranges PARTITION EACH LEG, never span the seam: a stop's
|
|
283
|
-
* range ends at its own leg's last index, and the next leg's first stop opens
|
|
284
|
-
* at that leg's 0.
|
|
285
|
-
*/
|
|
286
|
-
function chainStops(perSource) {
|
|
287
|
-
// "Interior" is measured against the legs that actually CONTRIBUTE stops: a
|
|
288
|
-
// leg whose log was empty has no bookends to drop and must not make its
|
|
289
|
-
// neighbour's `'start'` or `'end'` interior — the chained axis still opens
|
|
290
|
-
// with the first stop that exists and closes with the last.
|
|
291
|
-
const contributing = perSource.map((stops) => stops.length > 0);
|
|
292
|
-
const firstLeg = contributing.indexOf(true);
|
|
293
|
-
const lastLeg = contributing.lastIndexOf(true);
|
|
294
|
-
const out = [];
|
|
295
|
-
for (const [sourceIdx, stops] of perSource.entries()) {
|
|
296
|
-
for (const stop of stops) {
|
|
297
|
-
if (sourceIdx > firstLeg && stop.kind === 'start')
|
|
298
|
-
continue;
|
|
299
|
-
if (sourceIdx < lastLeg && stop.kind === 'end')
|
|
300
|
-
continue;
|
|
301
|
-
out.push({ ...stop, step: out.length, sourceIdx });
|
|
302
|
-
}
|
|
303
|
-
}
|
|
304
|
-
return out;
|
|
305
|
-
}
|
|
306
|
-
/**
|
|
307
|
-
* Open a reader's cursor over a finished run.
|
|
308
|
-
*
|
|
309
|
-
* Nothing here executes anything: `snapshot` is a record of a run that already
|
|
310
|
-
* happened, and every question is answered by reading it. A stored JSON
|
|
311
|
-
* snapshot works exactly like a live one — since 9.18.0 its `commitLog` may be
|
|
312
|
-
* an unvalidated `unknown[]`, narrowed per bundle where the fold reads it, so
|
|
313
|
-
* a replayed recording needs no cast.
|
|
314
|
-
*
|
|
315
|
-
* @param snapshot `executor.getSnapshot()`, or any object with the same
|
|
316
|
-
* shape — including one round-tripped through JSON, or a subflow subtree
|
|
317
|
-
* (`getSubtreeSnapshot()`, whose log is spelled `history`). An ARRAY of them
|
|
318
|
-
* is a CHAIN: a pause and its resume read as one axis (see below).
|
|
319
|
-
* @param options `strategy` chooses how stops are derived (default:
|
|
320
|
-
* `commitStops`, one stop per executed stage); `marks` seeds the cursor with
|
|
321
|
-
* bookmarks, e.g. restored from a saved reading session.
|
|
322
|
-
*
|
|
323
|
-
* @throws when a chain is not in run order, or its legs are not from one
|
|
324
|
-
* lineage — three checks, each with its own reason (see `chain.ts`):
|
|
325
|
-
* no `runtimeStageId` may appear in two legs; each leg's first execution
|
|
326
|
-
* index must be past the previous leg's last (the engine never resets the
|
|
327
|
-
* counter across a resume); and each leg's `initialState` must deep-equal
|
|
328
|
-
* the state the legs before it fold to — on a resume that base IS the state
|
|
329
|
-
* at the pause, so a foreign leg whose indices merely happen to be higher
|
|
330
|
-
* is refused too. The third check runs only where the record allows it: the
|
|
331
|
-
* later leg must carry an `initialState` and the earlier legs must fold from
|
|
332
|
-
* a real base with no unreadable rows; otherwise (an older recording with
|
|
333
|
-
* no base) the chain rests on the two index checks alone, and the fold's
|
|
334
|
-
* `basis` says what it stood on.
|
|
335
|
-
*
|
|
336
|
-
* @example
|
|
337
|
-
* ```typescript
|
|
338
|
-
* const tt = timeTravel(executor.getSnapshot());
|
|
339
|
-
* tt.jumpTo('score-risk#4');
|
|
340
|
-
* console.log(tt.changedSince()); // ['riskScore', 'tier']
|
|
341
|
-
* console.log(tt.stateAt().state); // state as that stage left it
|
|
342
|
-
* tt.mark('the bad one');
|
|
343
|
-
* const inner = tt.drill('sf-payment#7'); // a separate cursor, its own log
|
|
344
|
-
*
|
|
345
|
-
* // A pause and its resume, read as ONE axis:
|
|
346
|
-
* const chained = timeTravel([pausedSnapshot, resumedSnapshot]);
|
|
347
|
-
* chained.last(); // the run's real end
|
|
348
|
-
* chained.at()!.sourceIdx; // 1 — which leg the indices are in
|
|
349
|
-
* chained.jumpTo('approve#3'); // finds it in either leg
|
|
350
|
-
* ```
|
|
351
|
-
*/
|
|
352
|
-
function timeTravel(snapshot, options = {}) {
|
|
353
|
-
const sources = Array.isArray(snapshot) ? snapshot : [snapshot];
|
|
354
|
-
// A one-element array is not a chain: it is the plain cursor, and skips the
|
|
355
|
-
// lineage checks a single source cannot fail.
|
|
356
|
-
if (sources.length !== 1) {
|
|
357
|
-
const refusal = (0, chain_js_1.refuseChain)(sources.map((source) => (0, stateAt_js_1.readSource)(source)));
|
|
358
|
-
if (refusal)
|
|
359
|
-
throw new Error(refusal);
|
|
360
|
-
}
|
|
361
|
-
return new Cursor(sources, options);
|
|
362
|
-
}
|
|
363
|
-
exports.timeTravel = timeTravel;
|
|
364
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZVRyYXZlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdGltZS10cmF2ZWwvdGltZVRyYXZlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRzs7O0FBRUgsZ0VBQXVGO0FBQ3ZGLDZDQUFvRDtBQUNwRCx5Q0FBeUM7QUFDekMscURBQXVEO0FBQ3ZELDZDQUF3RjtBQXNCeEYsTUFBTSxNQUFNO0lBQ0QsS0FBSyxDQUF5QjtJQUM5QixJQUFJLENBQXFCO0lBQ3pCLG1CQUFtQixDQUFxQjtJQUN4QyxNQUFNLENBQWdDO0lBQ3RDLFdBQVcsQ0FBUztJQUVaLElBQUksQ0FBd0I7SUFDNUIsT0FBTyxDQUE4QjtJQUNyQyxPQUFPLENBQTJCO0lBQ2xDLE1BQU0sQ0FBUztJQUN4QixJQUFJLENBQVM7SUFDckIsbUZBQW1GO0lBQzNFLFFBQVEsQ0FBdUI7SUFFdkMsWUFDRSxPQUFvQyxFQUNwQyxPQUFpQyxFQUNqQyxJQUFhLEVBQ2IsTUFBMEIsRUFDMUIsbUJBQTRCO1FBRTVCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQztRQUMvQyxJQUFJLENBQUMsSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUEsdUJBQVUsRUFBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUksQ0FBQyxXQUFXLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUVsQywyRUFBMkU7UUFDM0UsK0NBQStDO1FBQy9DLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUssb0NBQWlELENBQUM7UUFDeEYsdUVBQXVFO1FBQ3ZFLHlFQUF5RTtRQUN6RSx5QkFBeUI7UUFDekIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDekMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUEscUJBQVEsRUFBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUMxRixDQUFDO1FBQ0YsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ3hGLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLENBQUM7SUFFRCw0RUFBNEU7SUFFNUUsRUFBRTtRQUNBLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVPLE1BQU0sQ0FBQyxJQUFZO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUNyRCxDQUFDO0lBRUQsa0RBQWtEO0lBQzFDLE1BQU0sQ0FBQyxNQUFvQyxFQUFFLE9BQXFCO1FBQ3hFLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQixPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFLENBQUM7SUFDeEYsQ0FBQztJQUVELEtBQUs7UUFDSCxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFFRCxJQUFJO1FBQ0YsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3pELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssR0FBRztZQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELElBQUk7UUFDRixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDbkQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELElBQUk7UUFDRixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekQsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdEUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVELE1BQU0sQ0FBQyxNQUF1QjtRQUM1QixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFekQsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUMvQixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hDLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ25ELElBQUksSUFBSSxHQUFHLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDM0QsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRyxJQUFJLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSTtnQkFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdEQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCxvRUFBb0U7UUFDcEUsNkRBQTZEO1FBQzdELElBQUksTUFBTSxLQUFLLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxjQUFjLEtBQUssTUFBTSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLEdBQUc7WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM3RCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDMUQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyxTQUFTLENBQUMsY0FBc0I7UUFDdEMsSUFBSSxDQUFDLElBQUEsa0NBQWMsRUFBQyxjQUFjLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUN0RCxNQUFNLFNBQVMsR0FBRyxJQUFBLDZCQUFTLEVBQUMsY0FBYyxDQUFDLENBQUM7UUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBQSxvQ0FBZ0IsRUFBQyxjQUFjLENBQUMsQ0FBQztRQUVoRCxJQUFJLFNBQWtDLENBQUM7UUFDdkMsSUFBSSxPQUFnQyxDQUFDO1FBQ3JDLEtBQUssTUFBTSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxJQUFBLGtDQUFjLEVBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQztnQkFBRSxTQUFTO1lBQ25ELElBQUksSUFBQSw2QkFBUyxFQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxTQUFTO2dCQUFFLFNBQVMsR0FBRyxJQUFJLENBQUM7WUFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDMUIsTUFBTSxHQUFHLEdBQUcsSUFBQSxvQ0FBZ0IsRUFBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7Z0JBQ2xELElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxNQUFNO29CQUFFLE9BQU8sR0FBRyxJQUFJLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLFNBQVMsSUFBSSxPQUFPLENBQUM7SUFDOUIsQ0FBQztJQUVELDRFQUE0RTtJQUU1RSxPQUFPLENBQUMsSUFBa0I7UUFDeEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNqQyxNQUFNLEdBQUcsR0FBRyxNQUFNLEVBQUUsU0FBUyxJQUFJLENBQUMsQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxJQUFBLHlCQUFZLEVBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0YsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzFCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDM0IseUVBQXlFO1FBQ3pFLHVEQUF1RDtRQUN2RCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUN2RSxDQUFDO0lBRUQsWUFBWSxDQUFDLElBQWtCO1FBQzdCLE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsRUFBRTtZQUFFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2hELHlFQUF5RTtRQUN6RSx5RUFBeUU7UUFDekUsK0VBQStFO1FBQy9FLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNyRCxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELE1BQU0sSUFBSSxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDL0IsMEVBQTBFO1FBQzFFLDBFQUEwRTtRQUMxRSxzRUFBc0U7UUFDdEUsS0FBSyxJQUFJLEdBQUcsR0FBRyxPQUFPLEVBQUUsR0FBRyxJQUFJLEtBQUssSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUN0RSxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQztZQUMvQixNQUFNLEVBQUUsR0FBRyxHQUFHLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDOUMsTUFBTSxFQUFFLEdBQUcsR0FBRyxLQUFLLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDN0QsS0FBSyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO2dCQUM5QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RCLElBQUksQ0FBQyxNQUFNO29CQUFFLFNBQVM7Z0JBQ3RCLEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUs7b0JBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDekQsQ0FBQztRQUNILENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELDRFQUE0RTtJQUU1RSxJQUFJLENBQUMsSUFBWSxFQUFFLElBQWtCO1FBQ25DLE1BQU0sTUFBTSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDakMsSUFBSSxDQUFDLE1BQU07WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUM5QixNQUFNLEtBQUssR0FBUyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxNQUFNLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0RyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQztRQUMvRCxJQUFJLFFBQVEsSUFBSSxDQUFDO1lBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxLQUFLLENBQUM7O1lBQzVDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdCLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELEtBQUs7UUFDSCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRCxVQUFVLENBQUMsSUFBWTtRQUNyQixJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLENBQUM7UUFDdkQsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkMsMEVBQTBFO1FBQzFFLHlFQUF5RTtRQUN6RSx1Q0FBdUM7UUFDdkMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLGNBQWM7WUFDL0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxLQUFLLEtBQUssQ0FBQyxjQUFjLENBQUM7WUFDekUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsSUFBSTtZQUFFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMzRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRCw0RUFBNEU7SUFFNUUsS0FBSyxDQUFDLG1CQUEyQjtRQUMvQix3RUFBd0U7UUFDeEUsMEVBQTBFO1FBQzFFLG9FQUFvRTtRQUNwRSxxRUFBcUU7UUFDckUsSUFBSSxPQUE0QyxDQUFDO1FBQ2pELElBQUksTUFBc0MsQ0FBQztRQUMzQyxLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQyx3RUFBd0U7WUFDeEUscURBQXFEO1lBQ3JELElBQUksQ0FBQyxJQUFBLHVCQUFVLEVBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQztnQkFBRSxTQUFTO1lBQ2pELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQW1DLENBQUM7WUFDekYsSUFBSSxHQUFHLEVBQUUsQ0FBQztnQkFDUixPQUFPLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztnQkFDaEMsTUFBTSxHQUFHLEdBQUcsQ0FBQztnQkFDYixNQUFNO1lBQ1IsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLEVBQUUsV0FBVyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUVuRix3RUFBd0U7UUFDeEUsdUVBQXVFO1FBQ3ZFLHFFQUFxRTtRQUNyRSw4REFBOEQ7UUFDOUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsSUFBSSxtQkFBbUIsQ0FBQztRQUMxRCxNQUFNLEtBQUssR0FBcUI7WUFDOUIsb0VBQW9FO1lBQ3BFLGtEQUFrRDtZQUNsRCxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDdkIsWUFBWSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQy9CLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyx5RUFBeUU7WUFDekUsb0RBQW9EO1lBQ3BELGNBQWMsRUFBRSxPQUFPO1NBQ3hCLENBQUM7UUFDRixPQUFPLElBQUksTUFBTSxDQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDL0csQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxVQUFVLENBQVEsU0FBbUM7SUFDNUQsNEVBQTRFO0lBQzVFLHdFQUF3RTtJQUN4RSwyRUFBMkU7SUFDM0UsNERBQTREO0lBQzVELE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM1QyxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9DLE1BQU0sR0FBRyxHQUFrQixFQUFFLENBQUM7SUFDOUIsS0FBSyxNQUFNLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1FBQ3JELEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7WUFDekIsSUFBSSxTQUFTLEdBQUcsUUFBUSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssT0FBTztnQkFBRSxTQUFTO1lBQzVELElBQUksU0FBUyxHQUFHLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLEtBQUs7Z0JBQUUsU0FBUztZQUN6RCxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Q0c7QUFDSCxTQUFnQixVQUFVLENBQ3hCLFFBQXdELEVBQ3hELFVBQW9DLEVBQUU7SUFFdEMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUUsUUFBd0MsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUE0QixDQUFDLENBQUM7SUFDckgsNEVBQTRFO0lBQzVFLDhDQUE4QztJQUM5QyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekIsTUFBTSxPQUFPLEdBQUcsSUFBQSxzQkFBVyxFQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUEsdUJBQVUsRUFBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekUsSUFBSSxPQUFPO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsT0FBTyxJQUFJLE1BQU0sQ0FBUSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQVpELGdDQVlDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiB0aW1lVHJhdmVsIOKAlCBhIHJlYWRlcidzIGN1cnNvciBvdmVyIGEgZmluaXNoZWQgdHJhY2UuXG4gKlxuICogVGhlIGZpdmUgbGF3cyB0aGlzIGZpbGUgaW1wbGVtZW50cyAoYW5kIHRoZSBmb2xkZXIgUkVBRE1FIHN0YXRlcyB3aXRoIGFuXG4gKiBleGFtcGxlIGVhY2gpOlxuICpcbiAqICAgMS4gT05FIGN1cnNvci4gVGhpcyBvYmplY3QgaG9sZHMgdGhlIG9ubHkgcG9zaXRpb24uIGBkcmlsbCgpYCByZXR1cm5zIGFcbiAqICAgICAgc2VwYXJhdGUgY3Vyc29yIG92ZXIgYSBzZXBhcmF0ZSBsb2csIG5ldmVyIGEgc2Vjb25kIHBvc2l0aW9uIGhlcmUuXG4gKiAgIDIuIEEgbWlzcyBuZXZlciBtb3Zlcy4gRXZlcnkgcmVmdXNhbCByZXR1cm5zIHRoZSByZWFzb24gYW5kIGxlYXZlcyB0aGVcbiAqICAgICAgY3Vyc29yIGV4YWN0bHkgd2hlcmUgaXQgd2FzLlxuICogICAzLiBBIGZvbGQgcmVzdWx0IGlzIGRldGFjaGVkLiBgc3RhdGVBdGAgcmV0dXJucyBmcm96ZW4sIGNsb25lZCBzdGF0ZSB0aGF0XG4gKiAgICAgIHNoYXJlcyBub3RoaW5nIHdpdGggdGhlIGVuZ2luZS5cbiAqICAgNC4gTWFya3MgbGl2ZSBiZXNpZGUgdGhlIGxvZy4gVGhleSBhcmUgdGhlIHJlYWRlcidzIG5vdGVzLCBuZXZlciB3cml0dGVuXG4gKiAgICAgIGludG8gdGhlIHJ1bidzIHJlY29yZC5cbiAqICAgNS4gU3RvcHMgYXJlIERFUklWRUQgZnJvbSB0aGUgcmVjb3JkZWQgbG9nIOKAlCByZWFkLXRpbWUgcXVlcmllcyBvdmVyXG4gKiAgICAgIGNvbGxlY3RlZCBkYXRhLCBuZXZlciBhIHJlLXdhbGsgdGhhdCBpbnZlbnRzIHdoYXQgd2FzIG5vdCByZWNvcmRlZC5cbiAqXG4gKiBBIENIQUlOICg5LjE4LjApIGRvZXMgbm90IGFkZCBhIHNpeHRoIGxhdyBhbmQgZG9lcyBub3QgYmVuZCB0aGVzZSBmaXZlOiBpdFxuICogaXMgc3RpbGwgb25lIGN1cnNvciwgb3ZlciBzb3VyY2VzIHRoYXQgYXJlIHN0aWxsIG9ubHkgcmVhZC4gV2hhdCBpdCBhZGRzIGlzXG4gKiB0aGF0IHRoZSBTVEVQUyBydW4gYWNyb3NzIGEgcGF1c2UvcmVzdW1lIOKAlCBzZWUgYGNoYWluLnRzYCBmb3IgdGhlIG9yZGVyaW5nXG4gKiBhbmQgbGluZWFnZSBjaGVja3MsIGFuZCBmb3Igd2h5IGNvbW1pdCBpbmRpY2VzIHN0YXkgcnVuLWxvY2FsLlxuICovXG5cbmltcG9ydCB7IGV4ZWN1dGlvbkluZGV4T2YsIGlzRXhlY3V0aW9uS2V5LCBzdGFnZUlkT2YgfSBmcm9tICcuLi9pZHMvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHsgaXNQbGFpbmlzaCwgcmVhZFRyZWUgfSBmcm9tICcuL2J1bmRsZXMuanMnO1xuaW1wb3J0IHsgcmVmdXNlQ2hhaW4gfSBmcm9tICcuL2NoYWluLmpzJztcbmltcG9ydCB7IGNvbW1pdFN0b3BzU3RyYXRlZ3kgfSBmcm9tICcuL2NvbW1pdFN0b3BzLmpzJztcbmltcG9ydCB7IHR5cGUgRm9sZE1lbW8sIHR5cGUgUmVhZFNvdXJjZSwgZm9sZExlZ3NGcm9tLCByZWFkU291cmNlIH0gZnJvbSAnLi9zdGF0ZUF0LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgRm9sZGVkU3RhdGUsXG4gIE1hcmssXG4gIE1vdmUsXG4gIFN0b3AsXG4gIFRpbWVUcmF2ZWwsXG4gIFRpbWVUcmF2ZWxPcHRpb25zLFxuICBUaW1lVHJhdmVsU291cmNlLFxuICBUaW1lVHJhdmVsU3RyYXRlZ3ksXG59IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vKiogQSBzdWJmbG93IHJlc3VsdCBhcyB0aGlzIG1vZHVsZSBuZWVkcyB0byByZWFkIGl0IOKAlCBkdWNrLXR5cGVkIG9uIHB1cnBvc2UuICovXG5pbnRlcmZhY2UgU3ViZmxvd1Jlc3VsdFNoYXBlIHtcbiAgc3ViZmxvd0lkPzogc3RyaW5nO1xuICB0cmVlQ29udGV4dD86IHtcbiAgICBoaXN0b3J5PzogdW5rbm93bltdO1xuICAgIGluaXRpYWxTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIHN0YWdlQ29udGV4dHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfTtcbn1cblxuY2xhc3MgQ3Vyc29yPFRNZXRhPiBpbXBsZW1lbnRzIFRpbWVUcmF2ZWw8VE1ldGE+IHtcbiAgcmVhZG9ubHkgc3RvcHM6IHJlYWRvbmx5IFN0b3A8VE1ldGE+W107XG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgbW91bnRSdW50aW1lU3RhZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBwYXJlbnQ6IFRpbWVUcmF2ZWw8VE1ldGE+IHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBzb3VyY2VDb3VudDogbnVtYmVyO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgbGVnczogcmVhZG9ubHkgUmVhZFNvdXJjZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHNvdXJjZXM6IHJlYWRvbmx5IFRpbWVUcmF2ZWxTb3VyY2VbXTtcbiAgcHJpdmF0ZSByZWFkb25seSBvcHRpb25zOiBUaW1lVHJhdmVsT3B0aW9uczxUTWV0YT47XG4gIHByaXZhdGUgcmVhZG9ubHkgX21hcmtzOiBNYXJrW107XG4gIHByaXZhdGUgc3RlcDogbnVtYmVyO1xuICAvKiogVGhlIGxhc3QgZm9sZCdzIHdvcmtpbmcgY29weSwgc28gYSBzdGVwIGZvcndhcmQgYXBwbGllcyBvbmUgYnVuZGxlICg5LjI1LjApLiAqL1xuICBwcml2YXRlIGZvbGRNZW1vOiBGb2xkTWVtbyB8IHVuZGVmaW5lZDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBzb3VyY2VzOiByZWFkb25seSBUaW1lVHJhdmVsU291cmNlW10sXG4gICAgb3B0aW9uczogVGltZVRyYXZlbE9wdGlvbnM8VE1ldGE+LFxuICAgIHBhdGg/OiBzdHJpbmcsXG4gICAgcGFyZW50PzogVGltZVRyYXZlbDxUTWV0YT4sXG4gICAgbW91bnRSdW50aW1lU3RhZ2VJZD86IHN0cmluZyxcbiAgKSB7XG4gICAgdGhpcy5zb3VyY2VzID0gc291cmNlcztcbiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgdGhpcy5tb3VudFJ1bnRpbWVTdGFnZUlkID0gbW91bnRSdW50aW1lU3RhZ2VJZDtcbiAgICB0aGlzLmxlZ3MgPSBzb3VyY2VzLm1hcCgoc291cmNlKSA9PiByZWFkU291cmNlKHNvdXJjZSkpO1xuICAgIHRoaXMuc291cmNlQ291bnQgPSBzb3VyY2VzLmxlbmd0aDtcblxuICAgIC8vIFRoZSBzaGlwcGVkIHN0cmF0ZWd5IGhhcyBubyB2b2NhYnVsYXJ5IG9mIGl0cyBvd24gKGBtZXRhYCBpcyBuZXZlciBzZXQpLFxuICAgIC8vIHNvIGl0IHNlcnZlcyBhbnkgYFRNZXRhYCBhIGNhbGxlciBhc2tlZCBmb3IuXG4gICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zLnN0cmF0ZWd5ID8/IChjb21taXRTdG9wc1N0cmF0ZWd5IGFzIFRpbWVUcmF2ZWxTdHJhdGVneTxUTWV0YT4pO1xuICAgIC8vIE9ORSBDQUxMIFBFUiBTT1VSQ0UsIHdpdGggdGhhdCBzb3VyY2UncyBvd24gbG9nIGFuZCB0cmVlOiBhIHN0cmF0ZWd5XG4gICAgLy8gbmV2ZXIgaGFzIHRvIGtub3cgaXQgaXMgcGFydCBvZiBhIGNoYWluLCBhbmQgaXRzIGluZGljZXMgc3RheSBsb2NhbCB0b1xuICAgIC8vIHRoZSBsZWcgaXQgd2FzIGhhbmRlZC5cbiAgICBjb25zdCBwZXJTb3VyY2UgPSB0aGlzLmxlZ3MubWFwKChsZWcsIGkpID0+XG4gICAgICBzdHJhdGVneS5zdG9wc0ZvcihsZWcubG9nLCByZWFkVHJlZShzb3VyY2VzW2ldLmV4ZWN1dGlvblRyZWUpLCBzb3VyY2VzW2ldLnN1YmZsb3dSZXN1bHRzKSxcbiAgICApO1xuICAgIHRoaXMuc3RvcHMgPSBPYmplY3QuZnJlZXplKHNvdXJjZXMubGVuZ3RoID09PSAxID8gcGVyU291cmNlWzBdIDogY2hhaW5TdG9wcyhwZXJTb3VyY2UpKTtcbiAgICB0aGlzLl9tYXJrcyA9IFsuLi4ob3B0aW9ucy5tYXJrcyA/PyBbXSldO1xuICAgIHRoaXMuc3RlcCA9IDA7XG4gIH1cblxuICAvLyDilIDilIAgUG9zaXRpb24g4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgYXQoKTogU3RvcDxUTWV0YT4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnN0b3BzW3RoaXMuc3RlcF07XG4gIH1cblxuICBwcml2YXRlIG1vdmVUbyhzdGVwOiBudW1iZXIpOiBNb3ZlPFRNZXRhPiB7XG4gICAgY29uc3QgZnJvbSA9IHRoaXMuYXQoKTtcbiAgICB0aGlzLnN0ZXAgPSBzdGVwO1xuICAgIHJldHVybiB7IG1vdmVkOiB0cnVlLCBmcm9tLCB0bzogdGhpcy5zdG9wc1tzdGVwXSB9O1xuICB9XG5cbiAgLyoqIExhdyAyOiBhIHJlZnVzYWwgbmV2ZXIgdG91Y2hlcyBgdGhpcy5zdGVwYC4gKi9cbiAgcHJpdmF0ZSByZWZ1c2UocmVhc29uOiAnY2xhbXBlZCcgfCAnbWlzcycgfCAnZW1wdHknLCBuZWFyZXN0PzogU3RvcDxUTWV0YT4pOiBNb3ZlPFRNZXRhPiB7XG4gICAgY29uc3QgYXQgPSB0aGlzLmF0KCk7XG4gICAgcmV0dXJuIG5lYXJlc3QgPyB7IG1vdmVkOiBmYWxzZSwgcmVhc29uLCBhdCwgbmVhcmVzdCB9IDogeyBtb3ZlZDogZmFsc2UsIHJlYXNvbiwgYXQgfTtcbiAgfVxuXG4gIGZpcnN0KCk6IE1vdmU8VE1ldGE+IHtcbiAgICBpZiAodGhpcy5zdG9wcy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLnJlZnVzZSgnZW1wdHknKTtcbiAgICBpZiAodGhpcy5zdGVwID09PSAwKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ2NsYW1wZWQnKTtcbiAgICByZXR1cm4gdGhpcy5tb3ZlVG8oMCk7XG4gIH1cblxuICBsYXN0KCk6IE1vdmU8VE1ldGE+IHtcbiAgICBpZiAodGhpcy5zdG9wcy5sZW5ndGggPT09IDApIHJldHVybiB0aGlzLnJlZnVzZSgnZW1wdHknKTtcbiAgICBjb25zdCBlbmQgPSB0aGlzLnN0b3BzLmxlbmd0aCAtIDE7XG4gICAgaWYgKHRoaXMuc3RlcCA9PT0gZW5kKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ2NsYW1wZWQnKTtcbiAgICByZXR1cm4gdGhpcy5tb3ZlVG8oZW5kKTtcbiAgfVxuXG4gIHByZXYoKTogTW92ZTxUTWV0YT4ge1xuICAgIGlmICh0aGlzLnN0b3BzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRoaXMucmVmdXNlKCdlbXB0eScpO1xuICAgIGlmICh0aGlzLnN0ZXAgPT09IDApIHJldHVybiB0aGlzLnJlZnVzZSgnY2xhbXBlZCcpO1xuICAgIHJldHVybiB0aGlzLm1vdmVUbyh0aGlzLnN0ZXAgLSAxKTtcbiAgfVxuXG4gIG5leHQoKTogTW92ZTxUTWV0YT4ge1xuICAgIGlmICh0aGlzLnN0b3BzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRoaXMucmVmdXNlKCdlbXB0eScpO1xuICAgIGlmICh0aGlzLnN0ZXAgPj0gdGhpcy5zdG9wcy5sZW5ndGggLSAxKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ2NsYW1wZWQnKTtcbiAgICByZXR1cm4gdGhpcy5tb3ZlVG8odGhpcy5zdGVwICsgMSk7XG4gIH1cblxuICBqdW1wVG8odGFyZ2V0OiBudW1iZXIgfCBzdHJpbmcpOiBNb3ZlPFRNZXRhPiB7XG4gICAgaWYgKHRoaXMuc3RvcHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ2VtcHR5Jyk7XG5cbiAgICBpZiAodHlwZW9mIHRhcmdldCA9PT0gJ251bWJlcicpIHtcbiAgICAgIGNvbnN0IHN0ZXAgPSBNYXRoLnRydW5jKHRhcmdldCk7XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHN0ZXApKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ21pc3MnKTtcbiAgICAgIGlmIChzdGVwIDwgMCkgcmV0dXJuIHRoaXMucmVmdXNlKCdjbGFtcGVkJywgdGhpcy5zdG9wc1swXSk7XG4gICAgICBpZiAoc3RlcCA+IHRoaXMuc3RvcHMubGVuZ3RoIC0gMSkgcmV0dXJuIHRoaXMucmVmdXNlKCdjbGFtcGVkJywgdGhpcy5zdG9wc1t0aGlzLnN0b3BzLmxlbmd0aCAtIDFdKTtcbiAgICAgIGlmIChzdGVwID09PSB0aGlzLnN0ZXApIHJldHVybiB0aGlzLnJlZnVzZSgnY2xhbXBlZCcpO1xuICAgICAgcmV0dXJuIHRoaXMubW92ZVRvKHN0ZXApO1xuICAgIH1cblxuICAgIC8vIGAnJ2AgaXMgbm90IGFuIGFkZHJlc3M6IGl0IGlzIHdoYXQgdGhlIGJvb2tlbmRzIGFuZCBhbnkgcHJlLXN0YWdlXG4gICAgLy8gcm9vdCBjb21taXQgY2FycnkuIFRob3NlIGFyZSByZWFjaGVkIGJ5IHN0ZXAsIG5ldmVyIGJ5IGlkLlxuICAgIGlmICh0YXJnZXQgPT09ICcnKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ21pc3MnKTtcbiAgICBjb25zdCBoaXQgPSB0aGlzLnN0b3BzLmZpbmQoKHN0b3ApID0+IHN0b3AucnVudGltZVN0YWdlSWQgPT09IHRhcmdldCk7XG4gICAgaWYgKCFoaXQpIHJldHVybiB0aGlzLnJlZnVzZSgnbWlzcycsIHRoaXMubmVhcmVzdFRvKHRhcmdldCkpO1xuICAgIGlmIChoaXQuc3RlcCA9PT0gdGhpcy5zdGVwKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ2NsYW1wZWQnKTtcbiAgICByZXR1cm4gdGhpcy5tb3ZlVG8oaGl0LnN0ZXApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjbG9zZXN0IG5hbWFibGUgc3RvcCBmb3IgYSBgcnVudGltZVN0YWdlSWRgIHRoYXQgaXMgbm90IG9uIHRoaXMgYXhpczpcbiAgICogdGhlIGxhc3Qgc3RvcCBvZiB0aGUgc2FtZSBTVEFHRSAoYSBkaWZmZXJlbnQgaXRlcmF0aW9uIG9mIHRoZSBzYW1lIG5vZGUpLFxuICAgKiBlbHNlIHRoZSBsYXN0IHN0b3Agd2hvc2UgY29tbWl0IHByZWNlZGVzIHRoZSBtaXNzZWQgaWQncyBleGVjdXRpb24gaW5kZXguXG4gICAqIE5hbWluZyBhIG5laWdoYm91ciBpcyBhIGNvdXJ0ZXN5IGZvciB0aGUgVUkg4oCUIGl0IG5ldmVyIG1vdmVzIHRoZSBjdXJzb3IuXG4gICAqL1xuICBwcml2YXRlIG5lYXJlc3RUbyhydW50aW1lU3RhZ2VJZDogc3RyaW5nKTogU3RvcDxUTWV0YT4gfCB1bmRlZmluZWQge1xuICAgIGlmICghaXNFeGVjdXRpb25LZXkocnVudGltZVN0YWdlSWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHN0YWdlUGFydCA9IHN0YWdlSWRPZihydW50aW1lU3RhZ2VJZCk7XG4gICAgY29uc3Qgd2FudGVkID0gZXhlY3V0aW9uSW5kZXhPZihydW50aW1lU3RhZ2VJZCk7XG5cbiAgICBsZXQgc2FtZVN0YWdlOiBTdG9wPFRNZXRhPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgYnlJbmRleDogU3RvcDxUTWV0YT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBzdG9wIG9mIHRoaXMuc3RvcHMpIHtcbiAgICAgIGlmICghaXNFeGVjdXRpb25LZXkoc3RvcC5ydW50aW1lU3RhZ2VJZCkpIGNvbnRpbnVlO1xuICAgICAgaWYgKHN0YWdlSWRPZihzdG9wLnJ1bnRpbWVTdGFnZUlkKSA9PT0gc3RhZ2VQYXJ0KSBzYW1lU3RhZ2UgPSBzdG9wO1xuICAgICAgaWYgKCFOdW1iZXIuaXNOYU4od2FudGVkKSkge1xuICAgICAgICBjb25zdCBpZHggPSBleGVjdXRpb25JbmRleE9mKHN0b3AucnVudGltZVN0YWdlSWQpO1xuICAgICAgICBpZiAoIU51bWJlci5pc05hTihpZHgpICYmIGlkeCA8PSB3YW50ZWQpIGJ5SW5kZXggPSBzdG9wO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc2FtZVN0YWdlID8/IGJ5SW5kZXg7XG4gIH1cblxuICAvLyDilIDilIAgUmVhZGluZyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICBzdGF0ZUF0KHN0b3A/OiBTdG9wPFRNZXRhPik6IEZvbGRlZFN0YXRlIHtcbiAgICBjb25zdCB0YXJnZXQgPSBzdG9wID8/IHRoaXMuYXQoKTtcbiAgICBjb25zdCBsZWcgPSB0YXJnZXQ/LnNvdXJjZUlkeCA/PyAwO1xuICAgIGNvbnN0IGZvbGQgPSBmb2xkTGVnc0Zyb20odGhpcy5sZWdzLCBsZWcsIHRhcmdldCA/IHRhcmdldC5sYXN0Q29tbWl0SWR4IDogLTEsIHRoaXMuZm9sZE1lbW8pO1xuICAgIHRoaXMuZm9sZE1lbW8gPSBmb2xkLm1lbW87XG4gICAgY29uc3QgZm9sZGVkID0gZm9sZC5mb2xkZWQ7XG4gICAgLy8gV2hpY2ggbGVnIHRoZSBpbmRleCBiZWxvbmdzIHRvLCBidXQgb25seSB3aGVuIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUg4oCUXG4gICAgLy8gYSBzaW5nbGUtc291cmNlIGZvbGQga2VlcHMgdGhlIDkuMTcuMCBzaGFwZSBleGFjdGx5LlxuICAgIHJldHVybiB0aGlzLmxlZ3MubGVuZ3RoID4gMSA/IHsgLi4uZm9sZGVkLCBzb3VyY2VJZHg6IGxlZyB9IDogZm9sZGVkO1xuICB9XG5cbiAgY2hhbmdlZFNpbmNlKGZyb20/OiBTdG9wPFRNZXRhPik6IHJlYWRvbmx5IHN0cmluZ1tdIHtcbiAgICBjb25zdCB0byA9IHRoaXMuYXQoKTtcbiAgICBpZiAoIXRvKSByZXR1cm4gT2JqZWN0LmZyZWV6ZShbXSk7XG4gICAgY29uc3Qgc3RhcnQgPSBmcm9tID8/IHRoaXMuc3RvcHNbdGhpcy5zdGVwIC0gMV07XG4gICAgLy8gTm8gZWFybGllciBzdG9wICh3ZSBhcmUgYXQgYCdzdGFydCdgKSDih5IgZXZlcnl0aGluZyB1cCB0byBoZXJlOiBub3RoaW5nXG4gICAgLy8gb24gYSBydW4gY3Vyc29yLCBhbmQgdGhlIHN1YmZsb3cncyBgaW5wdXRNYXBwZXJgIHNlZWQgb24gYSBkcmlsbGVkIG9uZVxuICAgIC8vICh0aGUgc3RhcnQgYm9va2VuZCBjb3ZlcnMgdGhlIHNlZWQgdGhhdCBwcmVjZWRlcyBzdGFnZSBvbmUg4oCUIGBjb21taXRTdG9wc2ApLlxuICAgIGNvbnN0IHRvTGVnID0gdG8uc291cmNlSWR4ID8/IDA7XG4gICAgY29uc3QgZnJvbUxlZyA9IHN0YXJ0ID8gc3RhcnQuc291cmNlSWR4ID8/IDAgOiB0b0xlZztcbiAgICBjb25zdCBhZnRlcklkeCA9IHN0YXJ0ID8gc3RhcnQubGFzdENvbW1pdElkeCA6IC0xO1xuICAgIGNvbnN0IGtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAvLyBBIHJhbmdlIHRoYXQgY3Jvc3NlcyBhIGNoYWluIHNlYW0gaXMgd2Fsa2VkIGxlZyBieSBsZWc6IHRoZSB0YWlsIG9mIHRoZVxuICAgIC8vIGxlZyBpdCBzdGFydGVkIGluLCBldmVyeSBsZWcgaW4gYmV0d2VlbiB3aG9sZSwgdGhlbiB0aGUgaGVhZCBvZiB0aGUgbGVnXG4gICAgLy8gaXQgZW5kcyBpbi4gQmFja3dhcmRzIHJhbmdlcyB3YWxrIG5vdGhpbmcgYW5kIGdpdmUgYFtdYCwgYXMgYmVmb3JlLlxuICAgIGZvciAobGV0IGxlZyA9IGZyb21MZWc7IGxlZyA8PSB0b0xlZyAmJiBsZWcgPCB0aGlzLmxlZ3MubGVuZ3RoOyBsZWcrKykge1xuICAgICAgY29uc3QgbG9nID0gdGhpcy5sZWdzW2xlZ10ubG9nO1xuICAgICAgY29uc3QgbG8gPSBsZWcgPT09IGZyb21MZWcgPyBhZnRlcklkeCArIDEgOiAwO1xuICAgICAgY29uc3QgaGkgPSBsZWcgPT09IHRvTGVnID8gdG8ubGFzdENvbW1pdElkeCA6IGxvZy5sZW5ndGggLSAxO1xuICAgICAgZm9yIChsZXQgaSA9IGxvOyBpIDw9IGhpOyBpKyspIHtcbiAgICAgICAgY29uc3QgYnVuZGxlID0gbG9nW2ldO1xuICAgICAgICBpZiAoIWJ1bmRsZSkgY29udGludWU7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgYnVuZGxlLnRyYWNlKSBrZXlzLmFkZChlbnRyeS5wYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIE9iamVjdC5mcmVlemUoWy4uLmtleXNdLnNvcnQoKSk7XG4gIH1cblxuICAvLyDilIDilIAgTWFya3MgKGxhdyA0OiBiZXNpZGUgdGhlIGxvZywgbmV2ZXIgaW4gaXQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIG1hcmsobmFtZTogc3RyaW5nLCBzdG9wPzogU3RvcDxUTWV0YT4pOiBNYXJrIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCB0YXJnZXQgPSBzdG9wID8/IHRoaXMuYXQoKTtcbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBjb25zdCBlbnRyeTogTWFyayA9IE9iamVjdC5mcmVlemUoeyBuYW1lLCBydW50aW1lU3RhZ2VJZDogdGFyZ2V0LnJ1bnRpbWVTdGFnZUlkLCBzdGVwOiB0YXJnZXQuc3RlcCB9KTtcbiAgICBjb25zdCBleGlzdGluZyA9IHRoaXMuX21hcmtzLmZpbmRJbmRleCgobSkgPT4gbS5uYW1lID09PSBuYW1lKTtcbiAgICBpZiAoZXhpc3RpbmcgPj0gMCkgdGhpcy5fbWFya3NbZXhpc3RpbmddID0gZW50cnk7XG4gICAgZWxzZSB0aGlzLl9tYXJrcy5wdXNoKGVudHJ5KTtcbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICBtYXJrcygpOiByZWFkb25seSBNYXJrW10ge1xuICAgIHJldHVybiBPYmplY3QuZnJlZXplKFsuLi50aGlzLl9tYXJrc10pO1xuICB9XG5cbiAganVtcFRvTWFyayhuYW1lOiBzdHJpbmcpOiBNb3ZlPFRNZXRhPiB7XG4gICAgaWYgKHRoaXMuc3RvcHMubGVuZ3RoID09PSAwKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ2VtcHR5Jyk7XG4gICAgY29uc3QgZW50cnkgPSB0aGlzLl9tYXJrcy5maW5kKChtKSA9PiBtLm5hbWUgPT09IG5hbWUpO1xuICAgIGlmICghZW50cnkpIHJldHVybiB0aGlzLnJlZnVzZSgnbWlzcycpO1xuICAgIC8vIFJlc29sdmUgYnkgcnVudGltZVN0YWdlSWQgZmlyc3Qg4oCUIHRoZSBhZGRyZXNzIHRoYXQgc3Vydml2ZXMgYSBjaGFuZ2Ugb2ZcbiAgICAvLyBzdHJhdGVneSDigJQgYW5kIGZhbGwgYmFjayB0byB0aGUgcmVtZW1iZXJlZCBzdGVwIG9ubHkgZm9yIHRoZSBib29rZW5kcyxcbiAgICAvLyB3aGljaCBoYXZlIG5vIHN0YWdlIGlkIG9mIHRoZWlyIG93bi5cbiAgICBjb25zdCBieUlkID0gZW50cnkucnVudGltZVN0YWdlSWRcbiAgICAgID8gdGhpcy5zdG9wcy5maW5kKChzdG9wKSA9PiBzdG9wLnJ1bnRpbWVTdGFnZUlkID09PSBlbnRyeS5ydW50aW1lU3RhZ2VJZClcbiAgICAgIDogdGhpcy5zdG9wc1tlbnRyeS5zdGVwXTtcbiAgICBpZiAoIWJ5SWQpIHJldHVybiB0aGlzLnJlZnVzZSgnbWlzcycsIHRoaXMubmVhcmVzdFRvKGVudHJ5LnJ1bnRpbWVTdGFnZUlkKSk7XG4gICAgaWYgKGJ5SWQuc3RlcCA9PT0gdGhpcy5zdGVwKSByZXR1cm4gdGhpcy5yZWZ1c2UoJ2NsYW1wZWQnKTtcbiAgICByZXR1cm4gdGhpcy5tb3ZlVG8oYnlJZC5zdGVwKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBEcmlsbGluZyAobGF3IDE6IGEgc2VwYXJhdGUgY3Vyc29yLCBub3QgYSBzZWNvbmQgcG9zaXRpb24pIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIGRyaWxsKG1vdW50UnVudGltZVN0YWdlSWQ6IHN0cmluZyk6IFRpbWVUcmF2ZWw8VE1ldGE+IHwgdW5kZWZpbmVkIHtcbiAgICAvLyBPbiBhIGNoYWluLCB0aGUgbW91bnQgaXMgbG9va2VkIGZvciBpbiBldmVyeSBsZWcg4oCUIGEgc3ViZmxvdyB0aGF0IHJhblxuICAgIC8vIGJlZm9yZSB0aGUgcGF1c2UgaXMgaW4gdGhlIGZpcnN0IHNuYXBzaG90J3MgcmVzdWx0cywgb25lIHRoYXQgcmFuIGFmdGVyXG4gICAgLy8gaXMgaW4gdGhlIHNlY29uZCdzLiBJZHMgYXJlIHVuaXF1ZSBhY3Jvc3MgYSBzb3VuZCBjaGFpbiAoY2hhaW4udHNcbiAgICAvLyByZWZ1c2VzIG9uZSB3aGVyZSB0aGV5IGFyZSBub3QpLCBzbyB0aGUgZmlyc3QgaGl0IGlzIHRoZSBvbmx5IGhpdC5cbiAgICBsZXQgcmVzdWx0czogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlc3VsdDogU3ViZmxvd1Jlc3VsdFNoYXBlIHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3Qgc291cmNlIG9mIHRoaXMuc291cmNlcykge1xuICAgICAgLy8gQSBzdG9yZWQgcmVjb3JkaW5nJ3MgcmVzdWx0cyBhcmUgcGFyc2VkIEpTT046IHJlYWQgdGhlbSBhcyBhIG1hcCBvbmx5XG4gICAgICAvLyB3aGVuIHRoZXkgYXJlIG9uZSwgYW5kIGFzIFwibm8gc3ViZmxvd3NcIiBvdGhlcndpc2UuXG4gICAgICBpZiAoIWlzUGxhaW5pc2goc291cmNlLnN1YmZsb3dSZXN1bHRzKSkgY29udGludWU7XG4gICAgICBjb25zdCBoaXQgPSBzb3VyY2Uuc3ViZmxvd1Jlc3VsdHNbbW91bnRSdW50aW1lU3RhZ2VJZF0gYXMgU3ViZmxvd1Jlc3VsdFNoYXBlIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKGhpdCkge1xuICAgICAgICByZXN1bHRzID0gc291cmNlLnN1YmZsb3dSZXN1bHRzO1xuICAgICAgICByZXN1bHQgPSBoaXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCB0cmVlID0gcmVzdWx0Py50cmVlQ29udGV4dDtcbiAgICBpZiAoIXJlc3VsdHMgfHwgIXJlc3VsdCB8fCAhdHJlZSB8fCAhQXJyYXkuaXNBcnJheSh0cmVlLmhpc3RvcnkpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgLy8gYHBhdGhgIGlzIHRoZSBzdWJmbG93IFBBVEgg4oCUIHRoZSBzYW1lIHN0cmluZyBmb3IgZXZlcnkgaXRlcmF0aW9uIG9mIGFcbiAgICAvLyBtb3VudCBpbnNpZGUgYSBsb29wLiBgbW91bnRSdW50aW1lU3RhZ2VJZGAgaXMgdGhlIGl0ZXJhdGlvbiBhY3R1YWxseVxuICAgIC8vIG9wZW5lZCwgc28gYSBVSSBjYW4gbGFiZWwgYW5kIGtleSB0aHJlZSBkcmlsbCBwYW5lbHMgb3ZlciBgc2Z4IzJgLFxuICAgIC8vIGBzZngjOGAsIGBzZngjMTRgIGFwYXJ0IGluc3RlYWQgb2YgY2FsbGluZyBhbGwgdGhyZWUgJ3NmeCcuXG4gICAgY29uc3QgY2hpbGRQYXRoID0gcmVzdWx0LnN1YmZsb3dJZCA/PyBtb3VudFJ1bnRpbWVTdGFnZUlkO1xuICAgIGNvbnN0IGNoaWxkOiBUaW1lVHJhdmVsU291cmNlID0ge1xuICAgICAgLy8gUm93cyBhcmUgbmFycm93ZWQgcGVyIGJ1bmRsZSB3aGVuIHRoZSBjaGlsZCByZWFkcyB0aGVtIOKAlCBhIHN0b3JlZFxuICAgICAgLy8gcmVjb3JkaW5nJ3MgaW5uZXIgaGlzdG9yeSBuZWVkcyBubyBjYXN0IGVpdGhlci5cbiAgICAgIGNvbW1pdExvZzogdHJlZS5oaXN0b3J5LFxuICAgICAgaW5pdGlhbFN0YXRlOiB0cmVlLmluaXRpYWxTdGF0ZSxcbiAgICAgIGV4ZWN1dGlvblRyZWU6IHRyZWUuc3RhZ2VDb250ZXh0cyxcbiAgICAgIC8vIE5lc3RlZCBzdWJmbG93IHJlc3VsdHMgYXJlIG1lcmdlZCBVUCBpbnRvIG9uZSBmbGF0LCBkdWFsLWtleWVkIG1hcCwgc29cbiAgICAgIC8vIHRoZSBjaGlsZCBjYW4gZHJpbGwgZnVydGhlciB0aHJvdWdoIHRoZSBzYW1lIG1hcC5cbiAgICAgIHN1YmZsb3dSZXN1bHRzOiByZXN1bHRzLFxuICAgIH07XG4gICAgcmV0dXJuIG5ldyBDdXJzb3I8VE1ldGE+KFtjaGlsZF0sIHsgc3RyYXRlZ3k6IHRoaXMub3B0aW9ucy5zdHJhdGVneSB9LCBjaGlsZFBhdGgsIHRoaXMsIG1vdW50UnVudGltZVN0YWdlSWQpO1xuICB9XG59XG5cbi8qKlxuICogUmUtc3RlcCBwZXItc291cmNlIHN0b3BzIGludG8gT05FIGF4aXMuXG4gKlxuICogVGhlIElOVEVSSU9SIGJvb2tlbmRzIGdvOiBhIGAnc3RhcnQnYCBvbiBhbnkgbGVnIGJ1dCB0aGUgZmlyc3QsIGFuZCBhblxuICogYCdlbmQnYCBvbiBhbnkgbGVnIGJ1dCB0aGUgbGFzdCwgYXJlIGJvb2tlbmRzIG9mIGEgbGVnIGFuZCBub3Qgb2YgdGhlIHJ1biDigJRcbiAqIGtlZXBpbmcgdGhlbSB3b3VsZCBwdXQgXCJ0aGUgcnVuIGlzIG92ZXJcIiBpbiB0aGUgbWlkZGxlIG9mIHRoZSBheGlzLiBUaGVcbiAqIGNvbW1pdHMgdGhleSBjb3ZlcmVkIGFyZSBub3Qgb3JwaGFuZWQ6IGEgZm9sZCBhbHdheXMgcmVwbGF5cyBpdHMgbGVnIGZyb21cbiAqIHRoYXQgbGVnJ3Mgb3duIGJhc2UsIGFuZCBgY2hhbmdlZFNpbmNlYCB3YWxrcyBhIHNlYW0tY3Jvc3NpbmcgcmFuZ2UgbGVnIGJ5XG4gKiBsZWcgKGluY2x1ZGluZyB0aGUgaGVhZCBvZiB0aGUgbGVnIGl0IGVuZHMgaW4pLiBUaGUgc3RvcHMnIGBjb21taXRJZHhgIC9cbiAqIGBsYXN0Q29tbWl0SWR4YCByYW5nZXMgUEFSVElUSU9OIEVBQ0ggTEVHLCBuZXZlciBzcGFuIHRoZSBzZWFtOiBhIHN0b3Anc1xuICogcmFuZ2UgZW5kcyBhdCBpdHMgb3duIGxlZydzIGxhc3QgaW5kZXgsIGFuZCB0aGUgbmV4dCBsZWcncyBmaXJzdCBzdG9wIG9wZW5zXG4gKiBhdCB0aGF0IGxlZydzIDAuXG4gKi9cbmZ1bmN0aW9uIGNoYWluU3RvcHM8VE1ldGE+KHBlclNvdXJjZTogcmVhZG9ubHkgU3RvcDxUTWV0YT5bXVtdKTogU3RvcDxUTWV0YT5bXSB7XG4gIC8vIFwiSW50ZXJpb3JcIiBpcyBtZWFzdXJlZCBhZ2FpbnN0IHRoZSBsZWdzIHRoYXQgYWN0dWFsbHkgQ09OVFJJQlVURSBzdG9wczogYVxuICAvLyBsZWcgd2hvc2UgbG9nIHdhcyBlbXB0eSBoYXMgbm8gYm9va2VuZHMgdG8gZHJvcCBhbmQgbXVzdCBub3QgbWFrZSBpdHNcbiAgLy8gbmVpZ2hib3VyJ3MgYCdzdGFydCdgIG9yIGAnZW5kJ2AgaW50ZXJpb3Ig4oCUIHRoZSBjaGFpbmVkIGF4aXMgc3RpbGwgb3BlbnNcbiAgLy8gd2l0aCB0aGUgZmlyc3Qgc3RvcCB0aGF0IGV4aXN0cyBhbmQgY2xvc2VzIHdpdGggdGhlIGxhc3QuXG4gIGNvbnN0IGNvbnRyaWJ1dGluZyA9IHBlclNvdXJjZS5tYXAoKHN0b3BzKSA9PiBzdG9wcy5sZW5ndGggPiAwKTtcbiAgY29uc3QgZmlyc3RMZWcgPSBjb250cmlidXRpbmcuaW5kZXhPZih0cnVlKTtcbiAgY29uc3QgbGFzdExlZyA9IGNvbnRyaWJ1dGluZy5sYXN0SW5kZXhPZih0cnVlKTtcbiAgY29uc3Qgb3V0OiBTdG9wPFRNZXRhPltdID0gW107XG4gIGZvciAoY29uc3QgW3NvdXJjZUlkeCwgc3RvcHNdIG9mIHBlclNvdXJjZS5lbnRyaWVzKCkpIHtcbiAgICBmb3IgKGNvbnN0IHN0b3Agb2Ygc3RvcHMpIHtcbiAgICAgIGlmIChzb3VyY2VJZHggPiBmaXJzdExlZyAmJiBzdG9wLmtpbmQgPT09ICdzdGFydCcpIGNvbnRpbnVlO1xuICAgICAgaWYgKHNvdXJjZUlkeCA8IGxhc3RMZWcgJiYgc3RvcC5raW5kID09PSAnZW5kJykgY29udGludWU7XG4gICAgICBvdXQucHVzaCh7IC4uLnN0b3AsIHN0ZXA6IG91dC5sZW5ndGgsIHNvdXJjZUlkeCB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqXG4gKiBPcGVuIGEgcmVhZGVyJ3MgY3Vyc29yIG92ZXIgYSBmaW5pc2hlZCBydW4uXG4gKlxuICogTm90aGluZyBoZXJlIGV4ZWN1dGVzIGFueXRoaW5nOiBgc25hcHNob3RgIGlzIGEgcmVjb3JkIG9mIGEgcnVuIHRoYXQgYWxyZWFkeVxuICogaGFwcGVuZWQsIGFuZCBldmVyeSBxdWVzdGlvbiBpcyBhbnN3ZXJlZCBieSByZWFkaW5nIGl0LiBBIHN0b3JlZCBKU09OXG4gKiBzbmFwc2hvdCB3b3JrcyBleGFjdGx5IGxpa2UgYSBsaXZlIG9uZSDigJQgc2luY2UgOS4xOC4wIGl0cyBgY29tbWl0TG9nYCBtYXkgYmVcbiAqIGFuIHVudmFsaWRhdGVkIGB1bmtub3duW11gLCBuYXJyb3dlZCBwZXIgYnVuZGxlIHdoZXJlIHRoZSBmb2xkIHJlYWRzIGl0LCBzb1xuICogYSByZXBsYXllZCByZWNvcmRpbmcgbmVlZHMgbm8gY2FzdC5cbiAqXG4gKiBAcGFyYW0gc25hcHNob3QgYGV4ZWN1dG9yLmdldFNuYXBzaG90KClgLCBvciBhbnkgb2JqZWN0IHdpdGggdGhlIHNhbWVcbiAqICAgc2hhcGUg4oCUIGluY2x1ZGluZyBvbmUgcm91bmQtdHJpcHBlZCB0aHJvdWdoIEpTT04sIG9yIGEgc3ViZmxvdyBzdWJ0cmVlXG4gKiAgIChgZ2V0U3VidHJlZVNuYXBzaG90KClgLCB3aG9zZSBsb2cgaXMgc3BlbGxlZCBgaGlzdG9yeWApLiBBbiBBUlJBWSBvZiB0aGVtXG4gKiAgIGlzIGEgQ0hBSU46IGEgcGF1c2UgYW5kIGl0cyByZXN1bWUgcmVhZCBhcyBvbmUgYXhpcyAoc2VlIGJlbG93KS5cbiAqIEBwYXJhbSBvcHRpb25zIGBzdHJhdGVneWAgY2hvb3NlcyBob3cgc3RvcHMgYXJlIGRlcml2ZWQgKGRlZmF1bHQ6XG4gKiAgIGBjb21taXRTdG9wc2AsIG9uZSBzdG9wIHBlciBleGVjdXRlZCBzdGFnZSk7IGBtYXJrc2Agc2VlZHMgdGhlIGN1cnNvciB3aXRoXG4gKiAgIGJvb2ttYXJrcywgZS5nLiByZXN0b3JlZCBmcm9tIGEgc2F2ZWQgcmVhZGluZyBzZXNzaW9uLlxuICpcbiAqIEB0aHJvd3Mgd2hlbiBhIGNoYWluIGlzIG5vdCBpbiBydW4gb3JkZXIsIG9yIGl0cyBsZWdzIGFyZSBub3QgZnJvbSBvbmVcbiAqICAgbGluZWFnZSDigJQgdGhyZWUgY2hlY2tzLCBlYWNoIHdpdGggaXRzIG93biByZWFzb24gKHNlZSBgY2hhaW4udHNgKTpcbiAqICAgbm8gYHJ1bnRpbWVTdGFnZUlkYCBtYXkgYXBwZWFyIGluIHR3byBsZWdzOyBlYWNoIGxlZydzIGZpcnN0IGV4ZWN1dGlvblxuICogICBpbmRleCBtdXN0IGJlIHBhc3QgdGhlIHByZXZpb3VzIGxlZydzIGxhc3QgKHRoZSBlbmdpbmUgbmV2ZXIgcmVzZXRzIHRoZVxuICogICBjb3VudGVyIGFjcm9zcyBhIHJlc3VtZSk7IGFuZCBlYWNoIGxlZydzIGBpbml0aWFsU3RhdGVgIG11c3QgZGVlcC1lcXVhbFxuICogICB0aGUgc3RhdGUgdGhlIGxlZ3MgYmVmb3JlIGl0IGZvbGQgdG8g4oCUIG9uIGEgcmVzdW1lIHRoYXQgYmFzZSBJUyB0aGUgc3RhdGVcbiAqICAgYXQgdGhlIHBhdXNlLCBzbyBhIGZvcmVpZ24gbGVnIHdob3NlIGluZGljZXMgbWVyZWx5IGhhcHBlbiB0byBiZSBoaWdoZXJcbiAqICAgaXMgcmVmdXNlZCB0b28uIFRoZSB0aGlyZCBjaGVjayBydW5zIG9ubHkgd2hlcmUgdGhlIHJlY29yZCBhbGxvd3MgaXQ6IHRoZVxuICogICBsYXRlciBsZWcgbXVzdCBjYXJyeSBhbiBgaW5pdGlhbFN0YXRlYCBhbmQgdGhlIGVhcmxpZXIgbGVncyBtdXN0IGZvbGQgZnJvbVxuICogICBhIHJlYWwgYmFzZSB3aXRoIG5vIHVucmVhZGFibGUgcm93czsgb3RoZXJ3aXNlIChhbiBvbGRlciByZWNvcmRpbmcgd2l0aFxuICogICBubyBiYXNlKSB0aGUgY2hhaW4gcmVzdHMgb24gdGhlIHR3byBpbmRleCBjaGVja3MgYWxvbmUsIGFuZCB0aGUgZm9sZCdzXG4gKiAgIGBiYXNpc2Agc2F5cyB3aGF0IGl0IHN0b29kIG9uLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCB0dCA9IHRpbWVUcmF2ZWwoZXhlY3V0b3IuZ2V0U25hcHNob3QoKSk7XG4gKiB0dC5qdW1wVG8oJ3Njb3JlLXJpc2sjNCcpO1xuICogY29uc29sZS5sb2codHQuY2hhbmdlZFNpbmNlKCkpOyAgICAgICAgLy8gWydyaXNrU2NvcmUnLCAndGllciddXG4gKiBjb25zb2xlLmxvZyh0dC5zdGF0ZUF0KCkuc3RhdGUpOyAgICAgICAvLyBzdGF0ZSBhcyB0aGF0IHN0YWdlIGxlZnQgaXRcbiAqIHR0Lm1hcmsoJ3RoZSBiYWQgb25lJyk7XG4gKiBjb25zdCBpbm5lciA9IHR0LmRyaWxsKCdzZi1wYXltZW50IzcnKTsgLy8gYSBzZXBhcmF0ZSBjdXJzb3IsIGl0cyBvd24gbG9nXG4gKlxuICogLy8gQSBwYXVzZSBhbmQgaXRzIHJlc3VtZSwgcmVhZCBhcyBPTkUgYXhpczpcbiAqIGNvbnN0IGNoYWluZWQgPSB0aW1lVHJhdmVsKFtwYXVzZWRTbmFwc2hvdCwgcmVzdW1lZFNuYXBzaG90XSk7XG4gKiBjaGFpbmVkLmxhc3QoKTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJ1bidzIHJlYWwgZW5kXG4gKiBjaGFpbmVkLmF0KCkhLnNvdXJjZUlkeDsgICAgICAgICAgICAgICAgLy8gMSDigJQgd2hpY2ggbGVnIHRoZSBpbmRpY2VzIGFyZSBpblxuICogY2hhaW5lZC5qdW1wVG8oJ2FwcHJvdmUjMycpOyAgICAgICAgICAgIC8vIGZpbmRzIGl0IGluIGVpdGhlciBsZWdcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gdGltZVRyYXZlbDxUTWV0YSA9IHVua25vd24+KFxuICBzbmFwc2hvdDogVGltZVRyYXZlbFNvdXJjZSB8IHJlYWRvbmx5IFRpbWVUcmF2ZWxTb3VyY2VbXSxcbiAgb3B0aW9uczogVGltZVRyYXZlbE9wdGlvbnM8VE1ldGE+ID0ge30sXG4pOiBUaW1lVHJhdmVsPFRNZXRhPiB7XG4gIGNvbnN0IHNvdXJjZXMgPSBBcnJheS5pc0FycmF5KHNuYXBzaG90KSA/IChzbmFwc2hvdCBhcyByZWFkb25seSBUaW1lVHJhdmVsU291cmNlW10pIDogW3NuYXBzaG90IGFzIFRpbWVUcmF2ZWxTb3VyY2VdO1xuICAvLyBBIG9uZS1lbGVtZW50IGFycmF5IGlzIG5vdCBhIGNoYWluOiBpdCBpcyB0aGUgcGxhaW4gY3Vyc29yLCBhbmQgc2tpcHMgdGhlXG4gIC8vIGxpbmVhZ2UgY2hlY2tzIGEgc2luZ2xlIHNvdXJjZSBjYW5ub3QgZmFpbC5cbiAgaWYgKHNvdXJjZXMubGVuZ3RoICE9PSAxKSB7XG4gICAgY29uc3QgcmVmdXNhbCA9IHJlZnVzZUNoYWluKHNvdXJjZXMubWFwKChzb3VyY2UpID0+IHJlYWRTb3VyY2Uoc291cmNlKSkpO1xuICAgIGlmIChyZWZ1c2FsKSB0aHJvdyBuZXcgRXJyb3IocmVmdXNhbCk7XG4gIH1cbiAgcmV0dXJuIG5ldyBDdXJzb3I8VE1ldGE+KHNvdXJjZXMsIG9wdGlvbnMpO1xufVxuIl19
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* time-travel/types.ts — the shapes of the reader's cursor.
|
|
4
|
-
*
|
|
5
|
-
* WHY THIS MODULE EXISTS (context for future readers, human or LLM):
|
|
6
|
-
* Time travel in footprintjs is a READER'S cursor over a FINISHED trace, with
|
|
7
|
-
* a fold at each stop. It is not the Walker — the engine's traversal — and it
|
|
8
|
-
* must never become a second live cursor: nothing here can move, re-run or
|
|
9
|
-
* mutate an execution. Every consumer (a why-panel, a flow view, a chart
|
|
10
|
-
* dashboard) was writing the same commit-index arithmetic by hand, from the
|
|
11
|
-
* same commit log, and disagreeing about the answers. This is that arithmetic,
|
|
12
|
-
* once, in the library that owns the substrate.
|
|
13
|
-
*
|
|
14
|
-
* DAG position: memory ← time-travel. Every file here is a record file
|
|
15
|
-
* (`RECORD_FILES`, scripts/layering.config.cjs, C6): it may import only record
|
|
16
|
-
* files — memory/, the id grammar (`ids/runtimeStageId`), and the record's two
|
|
17
|
-
* capture/ leaves (`freeze`, `valueKinds`). Recorders, traversal and runner
|
|
18
|
-
* must never be imported here; the snapshot arrives as a plain structural
|
|
19
|
-
* shape ({@link FoldSource}, {@link TimeTravelSource}, the record's own
|
|
20
|
-
* `ExecutionTree` for the tree) so a stored JSON trace works exactly like a
|
|
21
|
-
* live `getSnapshot()`.
|
|
22
|
-
*/
|
|
23
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3RpbWUtdHJhdmVsL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkciLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHRpbWUtdHJhdmVsL3R5cGVzLnRzIOKAlCB0aGUgc2hhcGVzIG9mIHRoZSByZWFkZXIncyBjdXJzb3IuXG4gKlxuICogV0hZIFRISVMgTU9EVUxFIEVYSVNUUyAoY29udGV4dCBmb3IgZnV0dXJlIHJlYWRlcnMsIGh1bWFuIG9yIExMTSk6XG4gKiBUaW1lIHRyYXZlbCBpbiBmb290cHJpbnRqcyBpcyBhIFJFQURFUidTIGN1cnNvciBvdmVyIGEgRklOSVNIRUQgdHJhY2UsIHdpdGhcbiAqIGEgZm9sZCBhdCBlYWNoIHN0b3AuIEl0IGlzIG5vdCB0aGUgV2Fsa2VyIOKAlCB0aGUgZW5naW5lJ3MgdHJhdmVyc2FsIOKAlCBhbmQgaXRcbiAqIG11c3QgbmV2ZXIgYmVjb21lIGEgc2Vjb25kIGxpdmUgY3Vyc29yOiBub3RoaW5nIGhlcmUgY2FuIG1vdmUsIHJlLXJ1biBvclxuICogbXV0YXRlIGFuIGV4ZWN1dGlvbi4gRXZlcnkgY29uc3VtZXIgKGEgd2h5LXBhbmVsLCBhIGZsb3cgdmlldywgYSBjaGFydFxuICogZGFzaGJvYXJkKSB3YXMgd3JpdGluZyB0aGUgc2FtZSBjb21taXQtaW5kZXggYXJpdGhtZXRpYyBieSBoYW5kLCBmcm9tIHRoZVxuICogc2FtZSBjb21taXQgbG9nLCBhbmQgZGlzYWdyZWVpbmcgYWJvdXQgdGhlIGFuc3dlcnMuIFRoaXMgaXMgdGhhdCBhcml0aG1ldGljLFxuICogb25jZSwgaW4gdGhlIGxpYnJhcnkgdGhhdCBvd25zIHRoZSBzdWJzdHJhdGUuXG4gKlxuICogREFHIHBvc2l0aW9uOiBtZW1vcnkg4oaQIHRpbWUtdHJhdmVsLiBFdmVyeSBmaWxlIGhlcmUgaXMgYSByZWNvcmQgZmlsZVxuICogKGBSRUNPUkRfRklMRVNgLCBzY3JpcHRzL2xheWVyaW5nLmNvbmZpZy5janMsIEM2KTogaXQgbWF5IGltcG9ydCBvbmx5IHJlY29yZFxuICogZmlsZXMg4oCUIG1lbW9yeS8sIHRoZSBpZCBncmFtbWFyIChgaWRzL3J1bnRpbWVTdGFnZUlkYCksIGFuZCB0aGUgcmVjb3JkJ3MgdHdvXG4gKiBjYXB0dXJlLyBsZWF2ZXMgKGBmcmVlemVgLCBgdmFsdWVLaW5kc2ApLiBSZWNvcmRlcnMsIHRyYXZlcnNhbCBhbmQgcnVubmVyXG4gKiBtdXN0IG5ldmVyIGJlIGltcG9ydGVkIGhlcmU7IHRoZSBzbmFwc2hvdCBhcnJpdmVzIGFzIGEgcGxhaW4gc3RydWN0dXJhbFxuICogc2hhcGUgKHtAbGluayBGb2xkU291cmNlfSwge0BsaW5rIFRpbWVUcmF2ZWxTb3VyY2V9LCB0aGUgcmVjb3JkJ3Mgb3duXG4gKiBgRXhlY3V0aW9uVHJlZWAgZm9yIHRoZSB0cmVlKSBzbyBhIHN0b3JlZCBKU09OIHRyYWNlIHdvcmtzIGV4YWN0bHkgbGlrZSBhXG4gKiBsaXZlIGBnZXRTbmFwc2hvdCgpYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFJlZ2lzdGVyZWRDb2RlIH0gZnJvbSAnLi4vbWVtb3J5L2hvbmVzdHkuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRCdW5kbGUsIEV4ZWN1dGlvblRyZWUgfSBmcm9tICcuLi9tZW1vcnkvdHlwZXMuanMnO1xuXG4vLyDilIDilIAgU291cmNlcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBBbnl0aGluZyB0aGF0IGNhcnJpZXMgYSBjb21taXQgbG9nIGFuZCAoaWRlYWxseSkgaXRzIGZvbGQgYmFzZS5cbiAqXG4gKiBUd28gZmllbGQgc3BlbGxpbmdzLCBiZWNhdXNlIHRoZSBsaWJyYXJ5IGFscmVhZHkgaGFzIHR3bzogdGhlIHJ1bidzIGxvZyBpc1xuICogYGNvbW1pdExvZ2AgKGBnZXRTbmFwc2hvdCgpYCksIGEgc3ViZmxvdydzIGlzIGBoaXN0b3J5YFxuICogKGBnZXRTdWJ0cmVlU25hcHNob3QoKWAgLyBgc3ViZmxvd1Jlc3VsdHNbLi4uXS50cmVlQ29udGV4dGApLiBCb3RoIGFyZVxuICogYWNjZXB0ZWQgc28gYSBjYWxsZXIgbmV2ZXIgaGFzIHRvIHJlc2hhcGUgYSBzbmFwc2hvdCB0byBhc2sgYSBxdWVzdGlvbi5cbiAqXG4gKiBCT1RIIFNQRUxMSU5HUyBUQUtFIGByZWFkb25seSB1bmtub3duW11gICg5LjE4LjApLiBBIGxpdmUgc25hcHNob3QgaGFuZHNcbiAqIG92ZXIgcmVhbCB7QGxpbmsgQ29tbWl0QnVuZGxlfXMgYW5kIGlzIGFzc2lnbmFibGUgZXhhY3RseSBhcyBiZWZvcmU7IGFcbiAqIFNUT1JFRCByZWNvcmRpbmcgaXMgcGFyc2VkIEpTT04sIGFuZCBhIGNhcmVmdWwgY29uc3VtZXIgd2lsbCBub3QgY2xhaW0gdGhhdFxuICogd2hhdCBjYW1lIGJhY2sgb2ZmIGRpc2sgaXMgYSBgQ29tbWl0QnVuZGxlYC4gVGhlIG5hcnJvd2luZyB0aGVyZWZvcmUgaGFwcGVuc1xuICogSEVSRSwgcGVyIGJ1bmRsZSwgd2hlcmUgdGhlIGZvbGQgYWN0dWFsbHkgcmVhZHMgb25lIOKAlCB0aGUgb25seSBwbGFjZSB0aGF0XG4gKiBjYW4gaG9uZXN0bHkgZG8gaXQuIEFuIGVudHJ5IHRoYXQgaXMgbm90IGEgYnVuZGxlIGJlY29tZXMgYSBHQVA6IGl0IGtlZXBzXG4gKiBpdHMgaW5kZXggKHNvIGV2ZXJ5IGBjb21taXRJZHhgIHN0aWxsIGFkZHJlc3NlcyB0aGUgc2FtZSBwb3NpdGlvbiksIGl0XG4gKiBjb250cmlidXRlcyBubyBzdGF0ZSwgaXQgZ2V0cyBubyBzdG9wLCBhbmQgYW55IGZvbGQgdGhhdCBjcm9zc2VzIGl0IHJlcG9ydHNcbiAqIGl0IGluIHtAbGluayBGb2xkZWRTdGF0ZS5za2lwcGVkfSB3aXRoIHRoZSBpbmRleCBhbmQgdGhlIHJlYXNvbi5cbiAqXG4gKiBFVkVSWSBGSUVMRCBJUyBPUFRJT05BTCwgZGVsaWJlcmF0ZWx5IHRoZSBzYW1lIHNoYXBlIHtAbGluayBUaW1lVHJhdmVsU291cmNlfVxuICogaGFzOiBhIGNvbnN1bWVyJ3Mgc3RvcmVkLXJlY29yZGluZyB0eXBlIChgY29tbWl0TG9nPzogcmVhZG9ubHkgdW5rbm93bltdYClcbiAqIGRyaXZlcyBgc3RhdGVBdGAgYW5kIGB0aW1lVHJhdmVsYCBhbGlrZSwgd2l0aCBubyBjYXN0IGF0IGVpdGhlci4gQSBzb3VyY2VcbiAqIHdpdGggbmVpdGhlciBzcGVsbGluZyBwcmVzZW50IGZvbGRzIHRvIGl0cyBiYXNlIGFuZCByZXBvcnRzXG4gKiBgdGhyb3VnaENvbW1pdElkeDogLTFgIOKAlCB0aGUgdHJ1dGhmdWwgYW5zd2VyIGZvciBhIGxvZyB0aGF0IHdhcyBub3QgdGhlcmUuXG4gKlxuICogVEhJUyBJUyBBTiBJTlBVVCBTSEFQRS4gTm90aGluZyB0eXBlZCBhcyBhIGBGb2xkU291cmNlYCBwcm9taXNlcyB0aGF0IGl0c1xuICogcm93cyBhcmUgYnVuZGxlczsgY29kZSB0aGF0IHdhbnRzIHRvIHJlYWQgYENvbW1pdEJ1bmRsZWAgZmllbGRzIGJhY2sgT1VUIG9mXG4gKiBvbmUgbXVzdCBuYXJyb3cgZWFjaCByb3cgd2l0aCBgaXNDb21taXRCdW5kbGVgIGZpcnN0LlxuICovXG5leHBvcnQgdHlwZSBGb2xkU291cmNlID0ge1xuICAvKiogVGhlIHJ1bidzIGNvbW1pdCBsb2cuIE1heSBiZSBBQlNFTlQgKGEgc3RvcmVkIHJlY29yZGluZydzIG9wdGlvbmFsIGZpZWxkKTogYW4gYWJzZW50IGxvZyBmb2xkcyB0byB0aGUgYmFzZS4gKi9cbiAgcmVhZG9ubHkgY29tbWl0TG9nPzogcmVhZG9ubHkgdW5rbm93bltdO1xuICAvKiogQSBzdWJmbG93IHN1YnRyZWUncyBvd24gbG9nIOKAlCB0aGUgc2FtZSB0aGluZyB1bmRlciBpdHMgb3RoZXIgbmFtZS4gKi9cbiAgcmVhZG9ubHkgaGlzdG9yeT86IHJlYWRvbmx5IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG59O1xuXG4vKipcbiAqIEEgc25hcHNob3Qtc2hhcGVkIHNvdXJjZSBmb3Ige0BsaW5rIHRpbWVUcmF2ZWx9LlxuICpcbiAqIEV2ZXJ5IGZpZWxkIGlzIG9wdGlvbmFsIGFuZCB0aGUgc3RydWN0dXJhbCBvbmVzIGFyZSBgdW5rbm93bmAgKDkuMTguMCksIHNvXG4gKiBhIGxpdmUgYGdldFNuYXBzaG90KClgIGlzIGFzc2lnbmFibGUgZXhhY3RseSBhcyBpdCB3YXMgQU5EIHNvIGlzIGEgc3RvcmVkXG4gKiByZWNvcmRpbmcgYSBjb25zdW1lciB0eXBlZCBob25lc3RseSDigJQgYGNvbW1pdExvZzogcmVhZG9ubHkgdW5rbm93bltdYCxcbiAqIGBleGVjdXRpb25UcmVlOiB1bmtub3duYCDigJQgYmVjYXVzZSBwYXJzZWQgSlNPTiBpcyBub3QgYW4gZXhlY3V0aW9uIHRyZWVcbiAqIHVudGlsIHNvbWV0aGluZyBzYXlzIHNvLiBUaGUgbmFycm93aW5nIGhhcHBlbnMgaW5zaWRlOiByb3dzIHBlciBidW5kbGVcbiAqIChzZWUge0BsaW5rIEZvbGRTb3VyY2V9KSwgdGhlIHRyZWUgYW5kIHRoZSBzdWJmbG93IHJlc3VsdHMgYXMgcGxhaW5cbiAqIG9iamVjdHMsIGFueXRoaW5nIGVsc2UgcmVhZCBhcyBhYnNlbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZVRyYXZlbFNvdXJjZSB7XG4gIC8qKiBUaGUgcnVuJ3MgY29tbWl0IGxvZy4gU2VlIHtAbGluayBGb2xkU291cmNlfSBvbiB3aHkgdGhpcyBpcyBgdW5rbm93bltdYC4gKi9cbiAgcmVhZG9ubHkgY29tbWl0TG9nPzogcmVhZG9ubHkgdW5rbm93bltdO1xuICAvKiogQSBzdWJmbG93IHN1YnRyZWUncyBvd24gbG9nIOKAlCB0aGUgc2FtZSB0aGluZyB1bmRlciBpdHMgb3RoZXIgbmFtZS4gKi9cbiAgcmVhZG9ubHkgaGlzdG9yeT86IHJlYWRvbmx5IHVua25vd25bXTtcbiAgcmVhZG9ubHkgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKlxuICAgKiBUaGUgcnVuJ3MgZXhlY3V0aW9uIHRyZWUgKGBnZXRTbmFwc2hvdCgpLmV4ZWN1dGlvblRyZWVgKSDigJQgd2hhdCBtYWtlcyBhXG4gICAqIG1vdW50IHN0b3Agc2F5IGBraW5kOiAnbW91bnQnYCBhdXRob3JpdGF0aXZlbHkgaW5zdGVhZCBvZiBieSBzaGFwZS4gQSBsaXZlXG4gICAqIHNuYXBzaG90IGhhbmRzIGl0cyBgU3RhZ2VTbmFwc2hvdGAgdHJlZSwgd2hpY2ggaXMgYW4ge0BsaW5rIEV4ZWN1dGlvblRyZWV9O1xuICAgKiBhIHN0b3JlZCBvbmUgaGFuZHMgcGFyc2VkIEpTT04sIHdoaWNoIGlzIHJlYWQgYXMgYSB0cmVlIHdoZW4gaXQgaXMgYSBwbGFpblxuICAgKiBvYmplY3QgYW5kIGlnbm9yZWQgb3RoZXJ3aXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZXhlY3V0aW9uVHJlZT86IEV4ZWN1dGlvblRyZWUgfCB1bmtub3duO1xuICAvKipcbiAgICogRHVhbC1rZXllZCBzdWJmbG93IHJlc3VsdHMgKGBnZXRTbmFwc2hvdCgpLnN1YmZsb3dSZXN1bHRzYCkg4oCUIHdoYXRcbiAgICoge0BsaW5rIFRpbWVUcmF2ZWwuZHJpbGx9IG5hdmlnYXRlcy4gQWJzZW50LCBvciBub3QgYSBwbGFpbiBvYmplY3Qg4oeSXG4gICAqIGBkcmlsbGAgYWx3YXlzIHJldHVybnMgYHVuZGVmaW5lZGAsIHdoaWNoIGlzIHRoZSBob25lc3QgYW5zd2VyIGZvciBhIHJ1blxuICAgKiB3aXRoIG5vIHN1YmZsb3dzLlxuICAgKi9cbiAgcmVhZG9ubHkgc3ViZmxvd1Jlc3VsdHM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVua25vd247XG59XG5cbi8qKlxuICogT25lIGVudHJ5IG9mIGEgc291cmNlJ3MgbG9nIHRoYXQgY291bGQgbm90IGJlIHJlYWQgYXMgYSB7QGxpbmsgQ29tbWl0QnVuZGxlfS5cbiAqXG4gKiBSZXBvcnRlZCByYXRoZXIgdGhhbiB0aHJvd246IGEgc3RvcmVkIHJlY29yZGluZyB3aXRoIG9uZSBjb3JydXB0IHJvdyBpc1xuICogc3RpbGwgd29ydGggcmVhZGluZywgYW5kIGEgcmVhZGVyIHRoYXQgaXMgdG9sZCBXSElDSCBpbmRleCBpdCBsb3N0IGNhbiBzYXlcbiAqIHNvIG9uIHNjcmVlbi4gYGluZGV4YCBpcyB0aGUgcG9zaXRpb24gaW4gdGhhdCBzb3VyY2UncyBvd24gbG9nLlxuICpcbiAqIFJlZ2lzdHJ5IGNvZGU6IGAnbG9nLWdhcCdgIChgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2AsIHNlcnZlZCBvblxuICogYGZvb3RwcmludGpzL3RyYWNlYCkgc2F5cyB3aGF0IGEgZ2FwIG1lYW5zLiBBIGdhcCBjYXJyaWVzIG5vIGBjb2RlYCBmaWVsZCDigJRcbiAqIGl0IGlzIHJlZ2lzdGVyZWQgc28gYSByZWFkZXIgZXhwbGFpbnMgaXQgZnJvbSB0aGUgc2FtZSBwbGFjZSBhcyB0aGUgb3RoZXJcbiAqIGhvbmVzdHkgc2lnbmFscy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dHYXAge1xuICAvKiogQVJSQVkgSU5ERVggaW4gdGhlIHNvdXJjZSdzIGxvZyDigJQgdGhlIGFkZHJlc3MgdGhlIGdhcCBvY2N1cGllcy4gKi9cbiAgcmVhZG9ubHkgaW5kZXg6IG51bWJlcjtcbiAgLyoqIFdoeSBpdCBpcyBub3QgYSBidW5kbGUsIGluIHdvcmRzIGEgVUkgY2FuIHByaW50LiAqL1xuICByZWFkb25seSByZWFzb246IHN0cmluZztcbn1cblxuLy8g4pSA4pSAIFN0b3BzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFdoYXQga2luZCBvZiBwb3NpdGlvbiBhIHN0b3AgaXMuXG4gKlxuICogLSBgJ2NvbW1pdCdgIOKAlCBvbmUgZXhlY3V0ZWQgc3RhZ2UuXG4gKiAtIGAnbW91bnQnYCAg4oCUIGEgc3ViZmxvdyBtb3VudDogdGhlIGJvdW5kYXJ5IHdob3NlIGlubmVyIHN0YWdlcyBsaXZlIGluIHRoZVxuICogICBzdWJmbG93J3MgT1dOIGxvZyAoZHJpbGwgaW50byBpdCB3aXRoIHtAbGluayBUaW1lVHJhdmVsLmRyaWxsfSkuXG4gKiAtIGAnc3RhcnQnYCAg4oCUIHRoZSBib29rZW5kIEJFRk9SRSB0aGUgZmlyc3Qgc3RvcCBvZiBUSElTIGF4aXMuIFdoYXQgaXQgZm9sZHNcbiAqICAgZGVwZW5kcyBvbiB0aGUgc3RyYXRlZ3ksIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyBsb2FkLWJlYXJpbmc6XG4gKiAgIC0gb24gYSBzdHJhdGVneSB0aGF0IGtlZXBzIGV2ZXJ5IHN0YWdlIChgY29tbWl0U3RvcHNgLCB0aGUgb25lIHNoaXBwZWQpXG4gKiAgICAgaXQgaXMgdGhlIHJ1bidzIGZvbGQgQkFTRSDigJQgdGhlIHN0YXRlIG5vIGNvbW1pdCBpbmRleCBjYW4gcmVhY2gg4oCUIHBsdXNcbiAqICAgICB0aGUgc3ViZmxvdydzIGBpbnB1dE1hcHBlcmAgc2VlZCB3aGVuIHRoZSBsb2cgb3BlbnMgd2l0aCBvbmUgKHRoZVxuICogICAgIG1vdW50J3MgY29tbWl0LCBzdGFtcGVkIHdpdGggdGhlIG1vdW50J3MgcnVudGltZVN0YWdlSWQgc2luY2UgUjEzIGFuZFxuICogICAgIHdpdGggYCcnYCB0aHJvdWdoIDkuMzMuMCkuIFNvIG9uIGEgZHJpbGxlZCBjdXJzb3IgaXQgaXMgZXhhY3RseSBcInRoZVxuICogICAgIGlucHV0IHRoaXMgc3ViZmxvdyBiZWdhbiB3aXRoXCIuXG4gKiAgIC0gb24gYSBzdHJhdGVneSB0aGF0IEZJTFRFUlMgc3RhZ2VzIG91dCwgdGhlIGNvbW1pdHMgb2YgdGhlIGRyb3BwZWRcbiAqICAgICBzdGFnZXMgdGhhdCByYW4gQkVGT1JFIHRoZSBmaXJzdCBzdXJ2aXZpbmcgc3RvcCBoYXZlIHRvIGZvbGQgc29tZXdoZXJlLFxuICogICAgIGFuZCBgJ3N0YXJ0J2AgaXMgdGhlIG9ubHkgcGxhY2UgdGhleSBjYW4gZ28gd2l0aG91dCBvcnBoYW5pbmcgdGhlbS4gSXRzXG4gKiAgICAgZm9sZCBpcyB0aGVuIHRoZSBiYXNlIFBMVVMgdGhhdCBwcm9sb2d1ZSDigJQgdGhlIHN0YXRlIHRoZSBmaXJzdCBzdG9wXG4gKiAgICAgUkVBRCwgbm90IHRoZSBydW4ncyByYXcgYmFzZS4gU3VjaCBhIHN0YXJ0IE1VU1Qgc2F5IHNvIGJ5IHNldHRpbmdcbiAqICAgICB7QGxpbmsgU3RvcC5wcm9sb2d1ZX07IGEgcmVuZGVyZXIgdGhhdCBtZWFucyBcInRoZSBydW4ncyByYXcgYmFzZVwiIHJlYWRzXG4gKiAgICAgYGtpbmQgPT09ICdzdGFydCcgJiYgIXN0b3AucHJvbG9ndWVgLCBhbmQgZ2V0cyBhIHRydWUgYW5zd2VyIG9uIGV2ZXJ5XG4gKiAgICAgYXhpcyBpbnN0ZWFkIG9mIG9uZSB0aGF0IGlzIHRydWUgb25seSBvbiB0aGUgbGlicmFyeSdzIG93bi5cbiAqIC0gYCdlbmQnYCAgICDigJQgdGhlIGJvb2tlbmQgYWZ0ZXIgdGhlIGxhc3QgY29tbWl0OiBcInRoZSBydW4gaXMgb3ZlclwiLiBJdHNcbiAqICAgZm9sZCBlcXVhbHMgdGhlIGZpbmFsIHN0YWdlJ3MgYnkgY29uc3RydWN0aW9uOyB0aGUgdHdvIGFyZSBkaWZmZXJlbnRcbiAqICAgcXVlc3Rpb25zLCBub3QgYSBkdXBsaWNhdGVkIGFuc3dlci5cbiAqXG4gKiBOT1QgV0lERU5FRCwgREVMSUJFUkFURUxZLiBBIGZpbHRlcmluZyBzdHJhdGVneSdzIHN0YXJ0IGNvdWxkIGhhdmUgYmVlbiBhXG4gKiBmaWZ0aCBraW5kIChgJ3Byb2xvZ3VlJ2ApLCBidXQgYWRkaW5nIGEgbWVtYmVyIHRvIHRoaXMgdW5pb24gYnJlYWtzIGV2ZXJ5XG4gKiBjb25zdW1lciB3aXRoIGFuIGV4aGF1c3RpdmUgYHN3aXRjaGAgb3ZlciBpdCDigJQgYSBjb21waWxlIGVycm9yIGhhbmRlZCB0b1xuICogcmVhZGVycyB3aG8gZGlkIG5vdGhpbmcgd3JvbmcuIEEgZmxhZyBvbiB0aGUgc3RvcCBzYXlzIHRoZSBzYW1lIHRoaW5nIGFuZFxuICogY29zdHMgYW4gZXhpc3RpbmcgcmVhZGVyIG5vdGhpbmcuXG4gKi9cbmV4cG9ydCB0eXBlIFN0b3BLaW5kID0gJ2NvbW1pdCcgfCAnbW91bnQnIHwgJ3N0YXJ0JyB8ICdlbmQnO1xuXG4vKipcbiAqIE9uZSBwb3NpdGlvbiBhIHJlYWRlcidzIGN1cnNvciBjYW4gcmVzdCBhdC5cbiAqXG4gKiBAdHlwZVBhcmFtIFRNZXRhIHRoZSBTVFJBVEVHWSdTIG93biB2b2NhYnVsYXJ5LCBjYXJyaWVkIG9wYXF1ZWx5IGluXG4gKiAgIHtAbGluayBTdG9wLm1ldGF9LiBEZWZhdWx0cyB0byBgdW5rbm93bmAsIHNvIGV2ZXJ5IHByZS05LjE4IGBTdG9wYCBzdGlsbFxuICogICBtZWFucyB3aGF0IGl0IG1lYW50LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFN0b3A8VE1ldGEgPSB1bmtub3duPiB7XG4gIC8qKiBQb3NpdGlvbiBpbiBgVGltZVRyYXZlbC5zdG9wc2Ag4oCUIDAtYmFzZWQsIHRoZSBjdXJzb3IncyBzdGVwIG51bWJlci4gKi9cbiAgcmVhZG9ubHkgc3RlcDogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIHN0YWdlIHRoaXMgc3RvcCBpczogYFtzdWJmbG93UGF0aC9dc3RhZ2VJZCNleGVjdXRpb25JbmRleGAuXG4gICAqIGAnJ2AgZm9yIHRoZSBgJ3N0YXJ0J2AgLyBgJ2VuZCdgIGJvb2tlbmRzLCB3aGljaCBhcmUgbm90IHN0YWdlcy5cbiAgICovXG4gIHJlYWRvbmx5IHJ1bnRpbWVTdGFnZUlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBBUlJBWSBJTkRFWCBvZiB0aGlzIHN0b3AncyBGSVJTVCBjb21taXQgYnVuZGxlOyBgLTFgIGF0IGAnc3RhcnQnYC5cbiAgICogVGhpcyBpcyB0aGUgc3RvcCdzIGFkZHJlc3Mgb24gdGhlIGNvbW1pdCBheGlzLlxuICAgKlxuICAgKiBJbmRpY2VzIGFyZSBTT1VSQ0UtTE9DQUwuIE9uIGEgY2hhaW5lZCBjdXJzb3IgKHNlZVxuICAgKiB7QGxpbmsgdGltZVRyYXZlbH0pIHRoZXkgaW5kZXggdGhlIGxvZyBvZiB7QGxpbmsgU3RvcC5zb3VyY2VJZHh9LCBuZXZlciBhXG4gICAqIGNvbmNhdGVuYXRpb24g4oCUIGNvbW1pdCBpbmRpY2VzIGFyZSBydW4tbG9jYWwgYW5kIHRoZSBsaWJyYXJ5IHdpbGwgbm90XG4gICAqIGludmVudCBhIGdsb2JhbCBvbmUuXG4gICAqL1xuICByZWFkb25seSBjb21taXRJZHg6IG51bWJlcjtcbiAgLyoqXG4gICAqIEFSUkFZIElOREVYIG9mIHRoZSBMQVNUIGNvbW1pdCBidW5kbGUgZm9sZGVkIGF0IHRoaXMgc3RvcCDigJQgdGhlIGVuZCBvZlxuICAgKiB0aGlzIHN0b3AncyBzbGljZSBvZiB0aGUgbG9nLiBTdG9wcyBQQVJUSVRJT04gdGhlIGxvZywgc28gdGhpcyBpcyB0aGVcbiAgICogaW5kZXgganVzdCBiZWZvcmUgdGhlIG5leHQgc3RvcCBiZWdpbnM7IGl0IGlzIGdyZWF0ZXIgdGhhblxuICAgKiB7QGxpbmsgY29tbWl0SWR4fSB3aGVuZXZlciBhIHN0YWdlIGNvbW1pdHRlZCBtb3JlIHRoYW4gb25lIGJ1bmRsZSAoYVxuICAgKiBzdWJmbG93IG1vdW50J3Mgb3V0cHV0LW1hcHBpbmcgKyBleGl0IHBhaXIsIGEgZm9yayBjaGlsZCdzIGVtcHR5IHJlcGVhdCksXG4gICAqIGFuZCBncmVhdGVyIGFnYWluIG9uIGEgZmlsdGVyaW5nIHN0cmF0ZWd5LCB3aGljaCBhYnNvcmJzIHRoZSBjb21taXRzIG9mXG4gICAqIHRoZSBzdGFnZXMgaXQgZHJvcHBlZC4gRm9sZGluZyB0aHJvdWdoIHRoaXMgaW5kZXgg4oCUIG5vdCB0aHJvdWdoXG4gICAqIGBjb21taXRJZHhgIOKAlCBpcyB3aGF0IG1ha2VzIGBzdGF0ZUF0KHN0b3ApYCBlcXVhbCB0aGUgc3RhdGUgdGhlIG5leHRcbiAgICogc3RhZ2Ugc3RhcnRlZCBmcm9tLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFzdENvbW1pdElkeDogbnVtYmVyO1xuICAvKiogU3RhYmxlIHN0YWdlIGlkIGZyb20gdGhlIGJ1aWxkZXIgKHRoZSBwb3N0LW1vdW50LCBwcmVmaXhlZCBmb3JtKS4gKi9cbiAgcmVhZG9ubHkgc3RhZ2VJZDogc3RyaW5nO1xuICAvKiogU3ViZmxvdyBwYXRoIHRoaXMgc3RhZ2UgcmFuIHVuZGVyLCB3aGVuIGl0IHJhbiBpbnNpZGUgb25lLiAqL1xuICByZWFkb25seSBzdWJmbG93UGF0aD86IHN0cmluZztcbiAgLyoqIEh1bWFuLXJlYWRhYmxlIHN0YWdlIG5hbWUg4oCUIHdoYXQgYSBVSSBwdXRzIG9uIHRoZSBheGlzIHRpY2suICovXG4gIHJlYWRvbmx5IGxhYmVsOiBzdHJpbmc7XG4gIHJlYWRvbmx5IGtpbmQ6IFN0b3BLaW5kO1xuICAvKipcbiAgICogVEhFIFNUUkFURUdZJ1MgT1dOIFZPQ0FCVUxBUlksIGNhcnJpZWQgdmVyYmF0aW0uIFRoZSBwb3J0IGFzc2lnbnMgaXQgTk9cbiAgICogbWVhbmluZzogaXQgbmV2ZXIgcmVhZHMgaXQsIG5ldmVyIHZhbGlkYXRlcyBpdCwgbmV2ZXIgYnJhbmNoZXMgb24gaXQsIGFuZFxuICAgKiBwYXNzZXMgaXQgdGhyb3VnaCBgdGltZVRyYXZlbGAsIGBqdW1wVG9gLCBgZHJpbGxgIGFuZCBtYXJrcyBCWSBSRUZFUkVOQ0VcbiAgICog4oCUIG5ldmVyIGNsb25lZCwgbmV2ZXIgZnJvemVuLiBUaGUgc3RvcCBob2xkcyB0aGUgdmVyeSBvYmplY3QgdGhlIHN0cmF0ZWd5XG4gICAqIHB1dCB0aGVyZSwgc28gYSBtdXRhdGlvbiB0aHJvdWdoIG9uZSBob2xkZXIgaXMgdmlzaWJsZSB0byBldmVyeSBvdGhlci5cbiAgICpcbiAgICogV0hZIElUIEVYSVNUUy4ge0BsaW5rIGtpbmR9IGlzIHRoZSBQT1JUJ3Mgdm9jYWJ1bGFyeSDigJQgdGhlIGZvdXIgcG9zaXRpb25zXG4gICAqIHRoZSBzdWJzdHJhdGUgaXRzZWxmIGtub3dzLiBBIGRvbWFpbiBzdHJhdGVneSBjbGFzc2lmaWVzIHN0YWdlcyBpbiBpdHMgb3duXG4gICAqIHRlcm1zIChhIG1pbGVzdG9uZSwgYSB0dXJuLCBhIHRvb2wgY2FsbCwgYSBiZWF0KSBhbmQgaGFkIG5vd2hlcmUgdG8gcHV0XG4gICAqIHRoYXQsIHNvIHRoZSBhbnN3ZXIgdHJhdmVsbGVkIGJ5IHJlLWRlcml2aW5nIGl0IGZyb20gYHJ1bnRpbWVTdGFnZUlkYCBhdFxuICAgKiBldmVyeSByZWFkOiBhIHNlY29uZCBydW4gb2YgdGhlIGNsYXNzaWZpZXIgdGhhdCBqdXN0IHJhbiwgYW5kIGEgc2Vjb25kXG4gICAqIGNoYW5jZSB0byBkaXNhZ3JlZSB3aXRoIGl0LiBBIHN0b3Agbm93IGNhcnJpZXMgd2hhdCBpdHMgc3RyYXRlZ3kga25ldy5cbiAgICpcbiAgICogQWJzZW50IG9uIGV2ZXJ5IHN0b3AgYGNvbW1pdFN0b3BzYCBwcm9kdWNlcyDigJQgdGhlIHNoaXBwZWQgc3RyYXRlZ3kgaGFzIG5vXG4gICAqIHZvY2FidWxhcnkgYmV5b25kIGBraW5kYCwgYW5kIHNheXMgc28gYnkgb21pc3Npb24gcmF0aGVyIHRoYW4gYnkgYG51bGxgLlxuICAgKi9cbiAgcmVhZG9ubHkgbWV0YT86IFRNZXRhO1xuICAvKipcbiAgICogT25seSBtZWFuaW5nZnVsIG9uIGBraW5kOiAnc3RhcnQnYC4gYHRydWVgIHdoZW4gdGhpcyBzdGFydCBmb2xkcyB0aGVcbiAgICogY29tbWl0cyBvZiBTVEFHRVMgVEhJUyBBWElTIERPRVMgTk9UIFNIT1cg4oCUIHRoZSBwcm9sb2d1ZSBhIGZpbHRlcmluZ1xuICAgKiBzdHJhdGVneSBtdXN0IHB1dCBzb21ld2hlcmUuIEFic2VudCAobmV2ZXIgYGZhbHNlYCkgb24gYW4gYXhpcyB3aG9zZSBzdGFydFxuICAgKiBpcyB0aGUgcnVuJ3MgcmF3IGZvbGQgYmFzZS5cbiAgICpcbiAgICogQSByZWFkZXIgdGhhdCB3YW50cyBcInRoZSBzdGF0ZSBiZWZvcmUgYW55dGhpbmcgcmFuXCIgY2hlY2tzXG4gICAqIGBraW5kID09PSAnc3RhcnQnICYmICFwcm9sb2d1ZWA7IG9uZSB0aGF0IHdhbnRzIFwidGhlIHN0YXRlIHRoZSBmaXJzdCBzdG9wXG4gICAqIHJlYWRcIiBqdXN0IGZvbGRzIHRoZSBzdGFydC4gU2VlIHtAbGluayBTdG9wS2luZH0uXG4gICAqL1xuICByZWFkb25seSBwcm9sb2d1ZT86IHRydWU7XG4gIC8qKlxuICAgKiBXaGljaCBTT1VSQ0UgdGhpcyBzdG9wJ3MgY29tbWl0IGluZGljZXMgYmVsb25nIHRvLCBvbiBhIGNoYWluZWQgY3Vyc29yIOKAlFxuICAgKiB0aGUgcG9zaXRpb24gaW4gdGhlIGFycmF5IGhhbmRlZCB0byB7QGxpbmsgdGltZVRyYXZlbH0uIEFic2VudCBvbiBhIGN1cnNvclxuICAgKiBvdmVyIGEgc2luZ2xlIHNvdXJjZSwgd2hpY2ggaXMgZXZlcnkgY3Vyc29yIGJ1aWx0IGJlZm9yZSA5LjE4LjAuXG4gICAqL1xuICByZWFkb25seSBzb3VyY2VJZHg/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGBbc3RhcnQsIOKApnN0YWdlcywgZW5kXWAgc2hhcGUgYGNvbW1pdFN0b3BzYCByZXR1cm5zIGZvciBhIE5PTi1FTVBUWSBsb2dcbiAqIOKAlCBzcGxpdCBvdXQsIHNvIGEgc3RyYXRlZ3kgdGhhdCBjb21wb3NlcyBpdCBzdG9wcyB3cml0aW5nIGl0cyBvd24gZ3VhcmQuXG4gKlxuICogU2VlIHtAbGluayBzcGxpdEF4aXN9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEJvb2tlbmRlZEF4aXM8VE1ldGEgPSB1bmtub3duPiB7XG4gIC8qKiBUaGUgYCdzdGFydCdgIGJvb2tlbmQg4oCUIHRoZSBvbmx5IHN0b3AgdGhhdCBtYXkgb3BlbiBhdCBgY29tbWl0SWR4OiAtMWAuICovXG4gIHJlYWRvbmx5IHN0YXJ0OiBTdG9wPFRNZXRhPjtcbiAgLyoqIEV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGUgYm9va2VuZHMsIGluIGV4ZWN1dGlvbiBvcmRlci4gTWF5IGJlIGVtcHR5LiAqL1xuICByZWFkb25seSBzdGFnZXM6IHJlYWRvbmx5IFN0b3A8VE1ldGE+W107XG4gIC8qKiBUaGUgYCdlbmQnYCBib29rZW5kIOKAlCB0aGUgb25seSBzdG9wIHRoYXQgZm9sZHMgdGhlIHdob2xlIGxvZy4gKi9cbiAgcmVhZG9ubHkgZW5kOiBTdG9wPFRNZXRhPjtcbn1cblxuLyoqXG4gKiBXaGF0IHtAbGluayBzcGxpdEF4aXN9IGFuc3dlcnMgd2hlbiB0aGVyZSBpcyBubyBib29rZW5kZWQgYXhpcyB0byBzcGxpdC5cbiAqXG4gKiAtIGAnZW1wdHknYCDigJQgbm8gc3RvcHMgYXQgYWxsLiBUaGUgbG9nIGl0c2VsZiB3YXMgZW1wdHk7IGEgdHJ1dGhmdWwgYXhpc1xuICogICB3aXRoIG5vd2hlcmUgdG8gc3RhbmQsIE5PVCBhIGJyb2tlbiBvbmUuXG4gKiAtIGAnbm90LWJvb2tlbmRlZCdgIOKAlCBzdG9wcyBleGlzdCBidXQgdGhlIGZpcnN0IGlzIG5vdCBhIGAnc3RhcnQnYCBvciB0aGVcbiAqICAgbGFzdCBpcyBub3QgYW4gYCdlbmQnYC4gT25seSBhIHN0cmF0ZWd5IGNhbiBjYXVzZSB0aGlzOyBhIHJ1biBjYW5ub3QuXG4gKi9cbmV4cG9ydCB0eXBlIEF4aXNSZWZ1c2FsID0gJ2VtcHR5JyB8ICdub3QtYm9va2VuZGVkJztcblxuLyoqIFRoZSByZXN1bHQgb2Yge0BsaW5rIHNwbGl0QXhpc306IHRoZSBheGlzLCBvciB3aHkgdGhlcmUgaXMgbm9uZS4gKi9cbmV4cG9ydCB0eXBlIEF4aXNTcGxpdDxUTWV0YSA9IHVua25vd24+ID1cbiAgfCAoeyByZWFkb25seSBvazogdHJ1ZSB9ICYgQm9va2VuZGVkQXhpczxUTWV0YT4pXG4gIHwge1xuICAgICAgcmVhZG9ubHkgb2s6IGZhbHNlO1xuICAgICAgcmVhZG9ubHkgcmVhc29uOiBBeGlzUmVmdXNhbDtcbiAgICAgIC8qKiBUaGUga2luZHMgdGhhdCB3ZXJlIGFjdHVhbGx5IHRoZXJlIOKAlCB3aGF0IHRvIHByaW50IGluIHRoZSByZWZ1c2FsLiAqL1xuICAgICAgcmVhZG9ubHkga2luZHM6IHJlYWRvbmx5IFN0b3BLaW5kW107XG4gICAgfTtcblxuLy8g4pSA4pSAIFRoZSBmb2xkIHJlc3VsdCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBIb3cgYSBmb2xkZWQgc3RhdGUgd2FzIGRlcml2ZWQg4oCUIHRoZSBob25lc3R5IGZpZWxkIChgJ2luaXRpYWwrbG9nJ2Agb3JcbiAqIGAnbG9nLW9ubHknYCkuIEEgcGFydGlhbCBhbnN3ZXIgc2F5cyBpdCBpcyBwYXJ0aWFsLCBuZXZlciBhIHNpbGVudCBvbmUuXG4gKlxuICogV2hhdCBlYWNoIHZhbHVlIG1lYW5zIGlzIHJlZ2lzdGVyZWQgT05DRSwgd2l0aCB0aGUgb3RoZXIgaG9uZXN0eSBzaWduYWxzLCBpblxuICogYG1lbW9yeS9ob25lc3R5LnRzIMK3IEhPTkVTVFlfQ09ERVNgIChzZXJ2ZWQgYXMgYEhPTkVTVFlfQ09ERVNgIG9uXG4gKiBgZm9vdHByaW50anMvdHJhY2VgKTsgdGhpcyB1bmlvbiBkZWNsYXJlcyBpdHMgbWVtYmVycyB0aHJvdWdoXG4gKiBgUmVnaXN0ZXJlZENvZGVgLCBzbyBhIGNvZGUgdGhlIHJlZ2lzdHJ5IGRvZXMgbm90IGhvbGQgZG9lcyBub3QgY29tcGlsZS5cbiAqL1xuZXhwb3J0IHR5cGUgRm9sZEJhc2lzID0gUmVnaXN0ZXJlZENvZGU8J2luaXRpYWwrbG9nJyB8ICdsb2ctb25seSc+O1xuXG4vKiogQSBkZXRhY2hlZCBmb2xkIG9mIHRoZSBsb2cgdXAgdG8gb25lIHN0b3AuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvbGRlZFN0YXRlIHtcbiAgLyoqIFRoZSBzdGF0ZSwgZGVlcGx5IGZyb3plbiBhbmQgZnVsbHkgZGV0YWNoZWQgZnJvbSB0aGUgZW5naW5lLiAqL1xuICByZWFkb25seSBzdGF0ZTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBIb3cgaXQgd2FzIGRlcml2ZWQg4oCUIHNlZSB7QGxpbmsgRm9sZEJhc2lzfS4gKi9cbiAgcmVhZG9ubHkgYmFzaXM6IEZvbGRCYXNpcztcbiAgLyoqXG4gICAqIGB0cnVlYCB3aGVuIGFueSBjb21taXQgZm9sZGVkIGluIGRlY2xhcmVkIHJlZGFjdGVkIHBhdGhzLCBzbyB0aGlzIHN0YXRlXG4gICAqIGNhcnJpZXMgYCdSRURBQ1RFRCdgIHBsYWNlaG9sZGVycyB3aGVyZSB0aGUgZW5naW5lIHNjcnViYmVkIHZhbHVlcyBhdFxuICAgKiB3cml0ZSB0aW1lLiBUaGUgbG9nIGlzIHJlZGFjdGVkIHdoZXJlIGl0IHdhcyB3cml0dGVuOyBhIGZvbGQgbXVzdCBTQVkgc29cbiAgICogcmF0aGVyIHRoYW4gcHJlc2VudCBhIHNjcnViYmVkIHZhbHVlIGFzIHRoZSByZWFsIG9uZS5cbiAgICpcbiAgICogUmVnaXN0cnkgY29kZTogYCdyZWRhY3RlZCdgIChgbWVtb3J5L2hvbmVzdHkudHMgwrcgSE9ORVNUWV9DT0RFU2AsIHNlcnZlZCBvblxuICAgKiBgZm9vdHByaW50anMvdHJhY2VgKSBzYXlzIHdoYXQgdGhpcyBmaWVsZCBhbmQge0BsaW5rIEZvbGRlZFN0YXRlLnJlZGFjdGVkUGF0aHN9IG1lYW47XG4gICAqIG5laXRoZXIgY2FycmllcyBhIGBjb2RlYC4gVGhlIHBsYWNlaG9sZGVyIGlzIHRoZSBsb2cncyBzdHJpbmcsXG4gICAqIGBtZW1vcnkvcGxhY2Vob2xkZXJzLnRzIMK3IExPR19QTEFDRUhPTERFUmAuXG4gICAqL1xuICByZWFkb25seSByZWRhY3RlZDogYm9vbGVhbjtcbiAgLyoqIFRoZSByZWRhY3RlZCBwYXRocyBzZWVuIGFjcm9zcyB0aGUgZm9sZGVkIHByZWZpeCDigJQgc29ydGVkLCBkZWR1cGVkLiAqL1xuICByZWFkb25seSByZWRhY3RlZFBhdGhzOiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqIFRoZSBsYXN0IGNvbW1pdCBpbmRleCBmb2xkZWQgaW47IGAtMWAgd2hlbiBub3RoaW5nIHdhcyBmb2xkZWQuICovXG4gIHJlYWRvbmx5IHRocm91Z2hDb21taXRJZHg6IG51bWJlcjtcbiAgLyoqXG4gICAqIEVudHJpZXMgb2YgdGhlIGZvbGRlZCBwcmVmaXggdGhhdCB3ZXJlIG5vdCBjb21taXQgYnVuZGxlcywgd2l0aCB0aGUgaW5kZXhcbiAgICogYW5kIHRoZSByZWFzb24uIEFCU0VOVCB3aGVuIG5vdGhpbmcgd2FzIHNraXBwZWQsIHdoaWNoIGlzIGV2ZXJ5IGZvbGQgb3ZlclxuICAgKiBhIGxpdmUgc25hcHNob3Qg4oCUIGEgY2xlYW4gZm9sZCdzIHNoYXBlIGlzIGJ5dGUtaWRlbnRpY2FsIHRvIDkuMTcuMCdzLlxuICAgKlxuICAgKiBBIGdhcCBjb250cmlidXRlcyBubyBzdGF0ZSwgc28gYSBmb2xkIHRoYXQgcmVwb3J0cyBvbmUgaXMgSU5DT01QTEVURSBhdFxuICAgKiBleGFjdGx5IHRoZSBwbGFjZXMgaXQgbmFtZXMuXG4gICAqL1xuICByZWFkb25seSBza2lwcGVkPzogcmVhZG9ubHkgTG9nR2FwW107XG4gIC8qKlxuICAgKiBXaGljaCBzb3VyY2Ugb2YgYSBDSEFJTiB0aGlzIGZvbGQgZW5kZWQgaW4g4oCUIGB0aHJvdWdoQ29tbWl0SWR4YCBpbmRleGVzXG4gICAqIHRoYXQgc291cmNlJ3MgbG9nLiBBYnNlbnQgb24gYSBzaW5nbGUtc291cmNlIGN1cnNvci5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUlkeD86IG51bWJlcjtcbn1cblxuLy8g4pSA4pSAIE1vdmVtZW50IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIFdoeSBhIG1vdmUgZGlkIG5vdCBoYXBwZW4uXG4gKlxuICogLSBgJ2NsYW1wZWQnYCDigJQgdGhlIG1vdmUgd291bGQgbGFuZCBPVVRTSURFIHRoZSBheGlzIChgcHJldigpYCBhdCB0aGUgZmlyc3RcbiAqICAgc3RvcCwgYG5leHQoKWAgYXQgdGhlIGxhc3QsIGEgc3RlcCBudW1iZXIgYmVsb3cgMCBvciBwYXN0IHRoZSBlbmQpLCBvciBvblxuICogICB0aGUgdmVyeSBzdG9wIHRoZSBjdXJzb3IgYWxyZWFkeSBzdGFuZHMgb24uIEVpdGhlciB3YXkgbm90aGluZyBtb3ZlZC4gV2hlblxuICogICB0aGUgdGFyZ2V0IHdhcyBvdXQgb2YgcmFuZ2UsIGBuZWFyZXN0YCBuYW1lcyB0aGUgZW5kIHRoYXQgd2FzIGhpdCDigJQgdGhlXG4gKiAgIGN1cnNvciBpdHNlbGYgbWF5IGJlIG5vd2hlcmUgbmVhciBpdC5cbiAqIC0gYCdtaXNzJ2Ag4oCUIHRoZSB0YXJnZXQgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyBheGlzLlxuICogLSBgJ2VtcHR5J2Ag4oCUIHRoaXMgY3Vyc29yIGhhcyBubyBzdG9wcyBhdCBhbGwgKGFuIGVtcHR5IGxvZykuXG4gKi9cbmV4cG9ydCB0eXBlIE1vdmVSZWZ1c2FsID0gJ2NsYW1wZWQnIHwgJ21pc3MnIHwgJ2VtcHR5JztcblxuLyoqXG4gKiBUaGUgcmVzdWx0IG9mIGFza2luZyB0aGUgY3Vyc29yIHRvIG1vdmUuXG4gKlxuICogQSByZWZ1c2VkIG1vdmUgTkVWRVIgbW92ZXMgdGhlIGN1cnNvci4gVGhhdCBpcyB0aGUgbGF3IGEgcmVhZGVyJ3MgVUkgcmVzdHNcbiAqIG9uOiBhIG1pc3R5cGVkIGlkIG9yIGEgc3RlcCBwYXN0IHRoZSBlbmQgbGVhdmVzIHRoZSBwYW5lbCBzaG93aW5nIGV4YWN0bHlcbiAqIHdoYXQgaXQgc2hvd2VkIGJlZm9yZSwgd2l0aCBhIHJlYXNvbiB0byBkaXNwbGF5IOKAlCBuZXZlciBhIHNpbGVudCBqdW1wIHRvXG4gKiBzb21ld2hlcmUgdGhlIHVzZXIgZGlkIG5vdCBhc2sgZm9yLlxuICovXG5leHBvcnQgdHlwZSBNb3ZlPFRNZXRhID0gdW5rbm93bj4gPVxuICB8IHsgcmVhZG9ubHkgbW92ZWQ6IHRydWU7IHJlYWRvbmx5IGZyb206IFN0b3A8VE1ldGE+IHwgdW5kZWZpbmVkOyByZWFkb25seSB0bzogU3RvcDxUTWV0YT4gfVxuICB8IHtcbiAgICAgIHJlYWRvbmx5IG1vdmVkOiBmYWxzZTtcbiAgICAgIHJlYWRvbmx5IHJlYXNvbjogTW92ZVJlZnVzYWw7XG4gICAgICAvKiogV2hlcmUgdGhlIGN1cnNvciBzdGlsbCBpcyAoYWJzZW50IG9ubHkgd2hlbiB0aGVyZSBhcmUgbm8gc3RvcHMpLiAqL1xuICAgICAgcmVhZG9ubHkgYXQ/OiBTdG9wPFRNZXRhPjtcbiAgICAgIC8qKiBUaGUgY2xvc2VzdCBzdG9wIHRvIHdoYXQgd2FzIGFza2VkIGZvciwgd2hlbiBvbmUgY2FuIGJlIG5hbWVkLiAqL1xuICAgICAgcmVhZG9ubHkgbmVhcmVzdD86IFN0b3A8VE1ldGE+O1xuICAgIH07XG5cbi8vIOKUgOKUgCBNYXJrcyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuLyoqXG4gKiBBIHJlYWRlcidzIGJvb2ttYXJrLiBMaXZlcyBCRVNJREUgdGhlIGxvZywgaW4gdGhlIHtAbGluayBUaW1lVHJhdmVsfVxuICogaW5zdGFuY2Ug4oCUIG5ldmVyIHdyaXR0ZW4gaW50byB0aGUgY29tbWl0IGxvZyBvciB0aGUgc25hcHNob3QsIHdoaWNoIGFyZSB0aGVcbiAqIHJ1bidzIHJlY29yZCBhbmQgbm90IHRoZSByZWFkZXIncyBub3Rlcy5cbiAqXG4gKiBBIG1hcmsgbmFtZXMgaXRzIHN0b3AgYnkgYHJ1bnRpbWVTdGFnZUlkYCwgbm90IGJ5IHN0ZXAgbnVtYmVyOiBzdGVwIG51bWJlcnNcbiAqIGJlbG9uZyB0byBvbmUgc3RyYXRlZ3kncyBheGlzLCBgcnVudGltZVN0YWdlSWRgIGlzIHRoZSBzYW1lIHN0YWdlIG9uIGV2ZXJ5XG4gKiBheGlzLCBzbyBhIG1hcmsgc3Vydml2ZXMgYSBjaGFuZ2Ugb2Ygc3RyYXRlZ3kgYW5kIGEgcmUtZGVyaXZhdGlvbiBvZiBzdG9wcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNYXJrIHtcbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuICByZWFkb25seSBydW50aW1lU3RhZ2VJZDogc3RyaW5nO1xuICAvKiogVGhlIHN0ZXAgdGhlIG1hcmsgd2FzIHBsYWNlZCBhdCwgb24gdGhlIGF4aXMgaW4gZm9yY2UgYXQgdGhlIHRpbWUuICovXG4gIHJlYWRvbmx5IHN0ZXA6IG51bWJlcjtcbn1cblxuLy8g4pSA4pSAIFRoZSBzdHJhdGVneSBzZWFtIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4vKipcbiAqIEhvdyBzdG9wcyBhcmUgREVSSVZFRCBmcm9tIGEgcmVjb3JkZWQgbG9nLiBUaGUgc2VhbS5cbiAqXG4gKiBmb290cHJpbnRqcyBzaGlwcyBvbmUgc3RyYXRlZ3kg4oCUIGBjb21taXRTdG9wc2AsIG9uZSBzdG9wIHBlciBleGVjdXRlZCBzdGFnZVxuICog4oCUIGJlY2F1c2UgdGhhdCBpcyB0aGUgb25seSBzdG9wIGdyYW1tYXIgdGhlIHN1YnN0cmF0ZSBpdHNlbGYga25vd3MuIEFcbiAqIGNvbnN1bWVyIHdpdGggYSByaWNoZXIgdm9jYWJ1bGFyeSAobWlsZXN0b25lcywgdG9vbCBjYWxscywgdHVybnMpIHN1cHBsaWVzXG4gKiBpdHMgb3duIGFuZCBnZXRzIHRoZSBzYW1lIGN1cnNvciBvdmVyIGl0LCBhbmQgcHV0cyB0aGF0IHZvY2FidWxhcnkgb25cbiAqIHtAbGluayBTdG9wLm1ldGF9IHJhdGhlciB0aGFuIHJlLWRlcml2aW5nIGl0IGF0IGV2ZXJ5IHJlYWQuXG4gKlxuICogVGhlIGxhdyBhIHN0cmF0ZWd5IG11c3Qga2VlcDogc3RvcHMgYXJlIERFUklWRUQgRlJPTSBUSEUgUkVDT1JERUQgTE9HLlxuICogQSBzdHJhdGVneSBtYXkgZ3JvdXAsIGZpbHRlciwgbGFiZWwgYW5kIG9yZGVyIHdoYXQgd2FzIHJlY29yZGVkLiBJdCBtYXkgbm90XG4gKiByZS13YWxrIHRoZSBleGVjdXRpb24gdHJlZSB0byBzeW50aGVzaXplIGEgc3RvcCBmb3Igc29tZXRoaW5nIHRoYXQgd2FzIG5ldmVyXG4gKiBjb21taXR0ZWQg4oCUIGEgY3Vyc29yIHRoYXQgc3RvcHMgd2hlcmUgbm8gZXZpZGVuY2UgZXhpc3RzIGlzIHRlbGxpbmcgYSBzdG9yeSxcbiAqIG5vdCByZWFkaW5nIG9uZS5cbiAqXG4gKiBPTiBBIENIQUlOLCBgc3RvcHNGb3JgIGlzIGNhbGxlZCBPTkNFIFBFUiBTT1VSQ0Ugd2l0aCB0aGF0IHNvdXJjZSdzIG93biBsb2dcbiAqIGFuZCB0cmVlLCBhbmQgdGhlIGN1cnNvciByZS1zdGVwcyB0aGUgcmVzdWx0cyBpbnRvIG9uZSBheGlzLiBTbyBhIHN0cmF0ZWd5XG4gKiBuZXZlciBoYXMgdG8ga25vdyBpdCBpcyBwYXJ0IG9mIGEgY2hhaW4sIGFuZCBpdHMgYGNvbW1pdElkeGAvYGxhc3RDb21taXRJZHhgXG4gKiBzdGF5IHNvdXJjZS1sb2NhbCDigJQgd2hpY2ggaXMgd2hhdCB0aGV5IGFsd2F5cyB3ZXJlLlxuICpcbiAqIGBzdWJmbG93UmVzdWx0c2AgKDkuMzkuMCkgaXMgdGhlIHNvdXJjZSdzIG93biBgc3ViZmxvd1Jlc3VsdHNgLCBhcyBzdG9yZWRcbiAqICh1bnR5cGVkKSDigJQgYSBtb3VudCdzIHBlci1leGVjdXRpb24ga2V5IG5hbWVzIGl0IGEgbW91bnQgd2hlbiBubyB0cmVlIGNhbWVcbiAqIHdpdGggdGhlIGxvZy4gQSBzdHJhdGVneSBtYXkgaWdub3JlIGl0LlxuICpcbiAqIGBleGVjdXRpb25UcmVlYCBpcyBhbiB7QGxpbmsgRXhlY3V0aW9uVHJlZX0gKDkuNDguMDsgYSBgU3RhZ2VTbmFwc2hvdGBcbiAqIGJlZm9yZSk6IHRoZSBmaWVsZHMgdGhlIHJlY29yZCdzIHJlYWRlcnMgcmVhZC4gQSBzdHJhdGVneSB3cml0dGVuIGJlZm9yZVxuICogOS40OC4wIHRoYXQgYW5ub3RhdGVzIHRoZSBwYXJhbWV0ZXIgYFN0YWdlU25hcHNob3RgIHN0aWxsIGNvbXBpbGVzIOKAlCBhXG4gKiBtZXRob2QncyBwYXJhbWV0ZXJzIGFyZSBjb21wYXJlZCBib3RoIHdheXMg4oCUIGJ1dCB0aGUgYW5ub3RhdGlvbiBpcyBhIGNsYWltXG4gKiBub3RoaW5nIGNoZWNrczogYHRpbWVUcmF2ZWxgIGhhbmRzIGEgc3RvcmVkIHJlY29yZGluZydzIHRyZWUgb3ZlciBhcyBwYXJzZWQsXG4gKiBzbyBhIGZpZWxkIGJleW9uZCB0aGVzZSBpcyByZWFkIGRlZmVuc2l2ZWx5LiBPbmUgbGVmdCB1bmFubm90YXRlZCBpcyB0eXBlZFxuICogYnkgdGhpcyBzaWduYXR1cmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZVRyYXZlbFN0cmF0ZWd5PFRNZXRhID0gdW5rbm93bj4ge1xuICBzdG9wc0Zvcihjb21taXRMb2c6IHJlYWRvbmx5IENvbW1pdEJ1bmRsZVtdLCBleGVjdXRpb25UcmVlPzogRXhlY3V0aW9uVHJlZSwgc3ViZmxvd1Jlc3VsdHM/OiB1bmtub3duKTogU3RvcDxUTWV0YT5bXTtcbn1cblxuLy8g4pSA4pSAIFRoZSBjdXJzb3Ig4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbi8qKlxuICogQSByZWFkZXIncyBjdXJzb3Igb3ZlciBvbmUgZmluaXNoZWQgbG9nLCB3aXRoIGEgZm9sZCBhdCBlYWNoIHN0b3AuXG4gKlxuICogT05FIGN1cnNvcjogdGhpcyBvYmplY3QgaG9sZHMgdGhlIG9ubHkgcG9zaXRpb24uIEV2ZXJ5IHF1ZXN0aW9uIGEgcmVhZGVyXG4gKiBhc2tzIOKAlCB3aGF0IGNoYW5nZWQgaGVyZSwgd2hhdCBkaWQgc3RhdGUgbG9vayBsaWtlLCB3aGF0IGlzIGluc2lkZSB0aGlzXG4gKiBtb3VudCDigJQgaXMgYW5zd2VyZWQgcmVsYXRpdmUgdG8gaXQuIGBkcmlsbCgpYCByZXR1cm5zIGEgU0VQQVJBVEUgY3Vyc29yIG92ZXJcbiAqIGEgc2VwYXJhdGUgbG9nIChhIHN1YmZsb3cncyBvd24pLCBuZXZlciBhIHNlY29uZCBwb3NpdGlvbiBvbiB0aGlzIG9uZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUaW1lVHJhdmVsPFRNZXRhID0gdW5rbm93bj4ge1xuICAvKiogVGhlIGF4aXMsIGluIGV4ZWN1dGlvbiBvcmRlci4gRW1wdHkgd2hlbiB0aGUgbG9nIGlzIGVtcHR5LiAqL1xuICByZWFkb25seSBzdG9wczogcmVhZG9ubHkgU3RvcDxUTWV0YT5bXTtcbiAgLyoqIFRoZSBzdWJmbG93IHBhdGggdGhpcyBjdXJzb3IgY292ZXJzOyBgdW5kZWZpbmVkYCBmb3IgdGhlIHJ1biBpdHNlbGYuICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIFRoZSBtb3VudCB0aGlzIGN1cnNvciB3YXMgZHJpbGxlZCBvdXQgb2Yg4oCUIGBbc3ViZmxvd1BhdGgvXXN0YWdlSWQjaWR4YC5cbiAgICogYHVuZGVmaW5lZGAgb24gYSBydW4ncyBvd24gY3Vyc29yLlxuICAgKlxuICAgKiBXSFkgQk9USDogYSBzdWJmbG93IG1vdW50ZWQgaW5zaWRlIGEgbG9vcCBydW5zIHNldmVyYWwgdGltZXMsIGFuZCBldmVyeVxuICAgKiBpdGVyYXRpb24gc2hhcmVzIG9uZSB7QGxpbmsgcGF0aH0uIFRoaXMgaXMgdGhlIGl0ZXJhdGlvbiB0aGF0IHdhcyBhY3R1YWxseVxuICAgKiBvcGVuZWQsIHNvIHRocmVlIGRyaWxsIHBhbmVscyBvdmVyIGBzZngjMmAsIGBzZngjOGAgYW5kIGBzZngjMTRgIGNhbiBiZVxuICAgKiBsYWJlbGxlZCBhbmQga2V5ZWQgYXBhcnQgaW5zdGVhZCBvZiBhbGwgcmVhZGluZyBgc2Z4YC5cbiAgICovXG4gIHJlYWRvbmx5IG1vdW50UnVudGltZVN0YWdlSWQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoZSBjdXJzb3IgdGhpcyBvbmUgd2FzIGRyaWxsZWQgb3V0IG9mLCBpZiBhbnkuICovXG4gIHJlYWRvbmx5IHBhcmVudDogVGltZVRyYXZlbDxUTWV0YT4gfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBIb3cgbWFueSBTT1VSQ0VTIHRoaXMgY3Vyc29yIHJlYWRzIOKAlCBgMWAgZm9yIGEgbm9ybWFsIGN1cnNvciwgbW9yZSBmb3IgYVxuICAgKiBjaGFpbmVkIG9uZSAoYSBwYXVzZS9yZXN1bWUgcmVhZCBhcyBvbmUgYXhpcykuIEV2ZXJ5IHN0b3Agb2YgYSBjaGFpbmVkXG4gICAqIGN1cnNvciBjYXJyaWVzIHRoZSB7QGxpbmsgU3RvcC5zb3VyY2VJZHh9IGl0cyBpbmRpY2VzIGJlbG9uZyB0by5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZUNvdW50OiBudW1iZXI7XG5cbiAgLyoqIFdoZXJlIHRoZSBjdXJzb3IgaXM7IGB1bmRlZmluZWRgIG9ubHkgd2hlbiB0aGVyZSBhcmUgbm8gc3RvcHMuICovXG4gIGF0KCk6IFN0b3A8VE1ldGE+IHwgdW5kZWZpbmVkO1xuXG4gIGZpcnN0KCk6IE1vdmU8VE1ldGE+O1xuICBsYXN0KCk6IE1vdmU8VE1ldGE+O1xuICBwcmV2KCk6IE1vdmU8VE1ldGE+O1xuICBuZXh0KCk6IE1vdmU8VE1ldGE+O1xuXG4gIC8qKlxuICAgKiBNb3ZlIHRvIGEgc3RlcCBudW1iZXIgb3IgdG8gYSBgcnVudGltZVN0YWdlSWRgLlxuICAgKiBBIG1pc3MgcmVmdXNlcyBhbmQgbmFtZXMgdGhlIGBuZWFyZXN0YCBzdG9wIGl0IGNvdWxkIGZpbmQuXG4gICAqL1xuICBqdW1wVG8odGFyZ2V0OiBudW1iZXIgfCBzdHJpbmcpOiBNb3ZlPFRNZXRhPjtcblxuICAvKipcbiAgICogRm9sZCBvZiB0aGUgbG9nIHRocm91Z2ggYHN0b3BgIChkZWZhdWx0OiB0aGUgY3VycmVudCBzdG9wKS4gRGV0YWNoZWQuXG4gICAqXG4gICAqIGBzdG9wYCBtdXN0IGNvbWUgZnJvbSBUSElTIGN1cnNvcidzIGF4aXM6IGl0cyBgbGFzdENvbW1pdElkeGAgYW5kXG4gICAqIGBzb3VyY2VJZHhgIGFyZSByZWFkIGFzIGFkZHJlc3NlcyBpbnRvIHRoaXMgY3Vyc29yJ3Mgb3duIGxlZ3MsIHNvIGEgc3RvcFxuICAgKiBmcm9tIGFub3RoZXIgY3Vyc29yIGlzIGZvbGRlZCBhdCB3aGF0ZXZlciB0aG9zZSBudW1iZXJzIG1lYW4gaGVyZSDigJQgb24gYVxuICAgKiBjaGFpbiwgYSBmb3JlaWduIHN0b3Agd2l0aCBubyBgc291cmNlSWR4YCBmb2xkcyBsZWcgMC5cbiAgICovXG4gIHN0YXRlQXQoc3RvcD86IFN0b3A8VE1ldGE+KTogRm9sZGVkU3RhdGU7XG5cbiAgLyoqXG4gICAqIFRoZSBzdGF0ZSBrZXlzIHdyaXR0ZW4gYmV0d2VlbiB0d28gc3RvcHMg4oCUIHJlYWQgc3RyYWlnaHQgb2ZmIHRoZSBidW5kbGVzJ1xuICAgKiB0cmFjZXMsIHNvIGl0IGNvc3RzIG5vIGZvbGQgYXQgYWxsLlxuICAgKlxuICAgKiBXaXRoIG5vIGFyZ3VtZW50OiB3aGF0IHRoZSBDVVJSRU5UIHN0b3AgY2hhbmdlZCAoaS5lLiBzaW5jZSB0aGUgc3RvcFxuICAgKiBiZWZvcmUgaXQpLiBXaXRoIGEgYGZyb21gIHN0b3A6IGV2ZXJ5dGhpbmcgd3JpdHRlbiBhZnRlciBgZnJvbWAgdXAgdG8gYW5kXG4gICAqIGluY2x1ZGluZyB0aGUgY3VycmVudCBzdG9wLiBCYWNrd2FyZHMgb3IgZXF1YWwgcmFuZ2VzIGdpdmUgYFtdYC4gT24gYVxuICAgKiBjaGFpbmVkIGN1cnNvciBhIHJhbmdlIHRoYXQgY3Jvc3NlcyB0aGUgc2VhbSBpcyB3YWxrZWQgc291cmNlIGJ5IHNvdXJjZS5cbiAgICovXG4gIGNoYW5nZWRTaW5jZShmcm9tPzogU3RvcDxUTWV0YT4pOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogQm9va21hcmsgYSBzdG9wIChkZWZhdWx0OiB0aGUgY3VycmVudCBvbmUpLiBSZXR1cm5zIHRoZSBtYXJrLCBvclxuICAgKiAgYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBpcyBubyBzdG9wIHRvIG5hbWUuICovXG4gIG1hcmsobmFtZTogc3RyaW5nLCBzdG9wPzogU3RvcDxUTWV0YT4pOiBNYXJrIHwgdW5kZWZpbmVkO1xuICAvKiogQSBkZXRhY2hlZCBjb3B5IG9mIHRoaXMgY3Vyc29yJ3MgbWFya3MsIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgcGxhY2VkLiAqL1xuICBtYXJrcygpOiByZWFkb25seSBNYXJrW107XG4gIC8qKiBNb3ZlIHRvIGEgbWFyaydzIHN0b3AuIEEgbWFyayB3aG9zZSBzdGFnZSBpcyBub3Qgb24gdGhpcyBheGlzIG1pc3Nlcy4gKi9cbiAganVtcFRvTWFyayhuYW1lOiBzdHJpbmcpOiBNb3ZlPFRNZXRhPjtcblxuICAvKipcbiAgICogQSBjdXJzb3Igb3ZlciB0aGUgc3ViZmxvdyBtb3VudGVkIGF0IGBtb3VudFJ1bnRpbWVTdGFnZUlkYCDigJQgdGhlIHNhbWVcbiAgICogaW50ZXJmYWNlLCBpdHMgb3duIGxvZywgaXRzIG93biBmb2xkIGJhc2UuIGB1bmRlZmluZWRgIHdoZW4gdGhhdCBtb3VudCBpc1xuICAgKiBub3QgaW4gdGhpcyBydW4ncyBzdWJmbG93IHJlc3VsdHMuXG4gICAqXG4gICAqIEEgc3RvcCBpbnNpZGUgYSBzdWJmbG93IGlzIE5PVCBhIHN0b3Agb2YgdGhpcyBjdXJzb3I6IHN1YmZsb3dzIHJ1biBpblxuICAgKiBpc29sYXRlZCBydW50aW1lcyBhbmQgY29tbWl0IHRvIHRoZWlyIG93biBsb2csIHNvIHRoZSBvdXRlciBheGlzIGhvbGRzXG4gICAqIG9ubHkgdGhlIG1vdW50IGJvdW5kYXJ5LiBEcmlsbGluZyBpcyBob3cgeW91IGdldCBpbnNpZGU7IHRoZXJlIGlzIG5vIHdheVxuICAgKiB0byBiZSBpbiB0d28gcGxhY2VzIGF0IG9uY2UuXG4gICAqL1xuICBkcmlsbChtb3VudFJ1bnRpbWVTdGFnZUlkOiBzdHJpbmcpOiBUaW1lVHJhdmVsPFRNZXRhPiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayB0aW1lVHJhdmVsfS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGltZVRyYXZlbE9wdGlvbnM8VE1ldGEgPSB1bmtub3duPiB7XG4gIC8qKiBIb3cgc3RvcHMgYXJlIGRlcml2ZWQuIERlZmF1bHQ6IGBjb21taXRTdG9wc2AuICovXG4gIHJlYWRvbmx5IHN0cmF0ZWd5PzogVGltZVRyYXZlbFN0cmF0ZWd5PFRNZXRhPjtcbiAgLyoqIE1hcmtzIHRvIHNlZWQgdGhlIGN1cnNvciB3aXRoIOKAlCBlLmcuIHJlc3RvcmVkIGZyb20gYSBzYXZlZCBzZXNzaW9uLiAqL1xuICByZWFkb25seSBtYXJrcz86IHJlYWRvbmx5IE1hcmtbXTtcbn1cbiJdfQ==
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* freeze.ts — the ONE deep-freeze walk (moved here from `scope/protection/readonlyInput.ts` in F3),
|
|
3
|
-
* and the serve-time law for the commit log (9.44.2).
|
|
4
|
-
*
|
|
5
|
-
* WHY HERE. Saved trees freeze through this walk: the fold base served as
|
|
6
|
-
* `initialState` (`ExecutionRuntime · getFoldBase`), the
|
|
7
|
-
* dev-mode snapshot (`runner/snapshot.ts · servedSnapshot`), every state `stateAt` hands out
|
|
8
|
-
* (`time-travel/stateAt.ts`) and, since F3, every commit bundle (`EventLog · record`). `memory/` must
|
|
9
|
-
* not import `scope/` (that edge closed the memory ⇄ scope ⇄ recorder module cycle F0 removed), so the
|
|
10
|
-
* walk lives in this leaf folder, which imports nothing outside itself. Args use an ownership snapshot
|
|
11
|
-
* instead (`scope/protection/readonlyInput.ts · createFrozenArgs`): never freeze borrowed caller values.
|
|
12
|
-
*
|
|
13
|
-
* FREEZE WHAT CAN BE FROZEN, COPY WHAT CAN'T (9.44.2). `Object.freeze` cannot seal a Date's time, a
|
|
14
|
-
* Map's or Set's entries, a buffer's bytes, a RegExp (`compile()` rewrites a frozen one) or an Error
|
|
15
|
-
* (V8's own `stack` accessor writes through a frozen one). A fresh tree handed to one caller (a `stateAt`
|
|
16
|
-
* state, the dev-mode snapshot) is that caller's own, so freezing it is a guard and nothing more. The
|
|
17
|
-
* COMMIT LOG — each bundle, and the fold base — is served to every reader, so {@link freezeRecord}
|
|
18
|
-
* remembers that a record holds such a value, its first serve maps the containers on the way to each
|
|
19
|
-
* one (its open PATHS), and {@link serveRecord} hands a reader a copy of those paths only: a fresh copy
|
|
20
|
-
* of each such value, fresh frozen containers on the way to it, and every other part shared, frozen, as
|
|
21
|
-
* it is. Until 9.44.2 `snapshot.commitLog[i].overwrite.when.setTime(0)` rewrote every later snapshot,
|
|
22
|
-
* `stateAt`, `commitValueAt`, slice and cursor answer.
|
|
23
|
-
*
|
|
24
|
-
* Every walk here is ITERATIVE (an explicit stack): a record's depth is not bounded by the call stack.
|
|
25
|
-
*
|
|
26
|
-
* @example
|
|
27
|
-
* ```typescript
|
|
28
|
-
* import { deepFreeze, freezeRecord, serveRecord } from './freeze.js';
|
|
29
|
-
*
|
|
30
|
-
* const args = deepFreeze({ order: { lines: [{ sku: 'A' }] }, bytes: new Uint8Array([1]) });
|
|
31
|
-
* Object.isFrozen(args.order.lines[0]); // true
|
|
32
|
-
* Object.isFrozen(args.bytes); // false — a typed array cannot be frozen; it is skipped
|
|
33
|
-
*
|
|
34
|
-
* const record = freezeRecord({ when: new Date(0), tags: ['a'] });
|
|
35
|
-
* const served = serveRecord(record);
|
|
36
|
-
* served.when.setTime(5); // changes the reader's copy
|
|
37
|
-
* serveRecord(record).when.getTime(); // 0 — every serve is the record as recorded
|
|
38
|
-
* served.tags === record.tags; // true — the sealed part is shared, not copied
|
|
39
|
-
* serveRecord(freezeRecord({ n: 1 })); // a record freezing sealed whole: served as itself
|
|
40
|
-
* ```
|
|
41
|
-
*/
|
|
42
|
-
/**
|
|
43
|
-
* How {@link deepFreeze} walks an ARRAY.
|
|
44
|
-
*
|
|
45
|
-
* - `'every-key'` (the default) — every own property, as for any other object: the index elements
|
|
46
|
-
* AND any expando (`arr.note = { … }`). The dev-mode snapshot relies on this contract.
|
|
47
|
-
* - `'indices'` — the index elements only, so no key string is allocated per element; this is what
|
|
48
|
-
* keeps freezing a 10,000-element commit inside its budget (`bench/element-writes.ts`). An object
|
|
49
|
-
* hung on an array EXPANDO is then left unfrozen, and unseen by {@link serveRecord} — the commit
|
|
50
|
-
* log's named hole (`EventLog · record`; an array expando is out of contract for state).
|
|
51
|
-
*/
|
|
52
|
-
export type ArrayWalk = 'every-key' | 'indices';
|
|
53
|
-
/**
|
|
54
|
-
* Freezes `obj` and every object reachable through its own properties, and returns `obj`.
|
|
55
|
-
*
|
|
56
|
-
* - An object that is ALREADY frozen is left as it is, and not descended — 9.32.0's contract, kept:
|
|
57
|
-
* args may hold a caller's frozen object with live parts inside (a class instance a stage calls),
|
|
58
|
-
* and freezing past it would break them. It is also what ends a cycle. The commit log never meets
|
|
59
|
-
* one: its payloads are fresh `structuredClone`s.
|
|
60
|
-
* - ArrayBuffer views (typed arrays, `DataView`) are skipped: `Object.freeze` throws on a non-empty
|
|
61
|
-
* typed array, so a `Uint8Array` in state, args or the fold base used to fail the run or the
|
|
62
|
-
* snapshot here.
|
|
63
|
-
* - What `Object.freeze` cannot reach stays mutable — Map and Set contents, a Date's time, the
|
|
64
|
-
* bytes behind a buffer. A frozen RegExp's `lastIndex` is read-only, so a `/g` or `/y` regex
|
|
65
|
-
* taken from a frozen tree throws when `exec` or `replace` advance it. The commit log goes through
|
|
66
|
-
* {@link freezeRecord} and {@link serveRecord} instead.
|
|
67
|
-
* - Functions are not descended (they are not values the engine stores).
|
|
68
|
-
*/
|
|
69
|
-
export declare function deepFreeze<T>(obj: T, arrays?: ArrayWalk): T;
|
|
70
|
-
/**
|
|
71
|
-
* {@link deepFreeze} for a record many readers are SERVED (a commit bundle, the fold base), and two more
|
|
72
|
-
* things on the same walk:
|
|
73
|
-
*
|
|
74
|
-
* - it remembers THAT the record holds a value freezing cannot seal — one flag; the record's first
|
|
75
|
-
* serve maps WHERE (the containers on the way to each such value, its open paths), so the run pays
|
|
76
|
-
* nothing more and {@link serveRecord} copies those paths and nothing else;
|
|
77
|
-
* - a typed array or `DataView` that views a SLICE of a bigger buffer (a Node `Buffer` views its
|
|
78
|
-
* shared pool) is replaced, in the record, by a copy of the bytes it views — the record keeps the
|
|
79
|
-
* view's bytes, never the rest of the buffer (a resizable or shared buffer is kept as it is).
|
|
80
|
-
*
|
|
81
|
-
* A part frozen before is not frozen past (deepFreeze's contract) but is looked through, so a value
|
|
82
|
-
* freezing cannot seal inside it still opens the record. Returns `record`.
|
|
83
|
-
*/
|
|
84
|
-
export declare function freezeRecord<T extends object>(record: T, arrays?: ArrayWalk): T;
|
|
85
|
-
/**
|
|
86
|
-
* The record as a reader may hold it — THE serve-time law: a record freezing sealed whole is served as
|
|
87
|
-
* itself (shared, no cost); any other as a copy of its open paths ({@link freezeRecord}): fresh frozen
|
|
88
|
-
* containers down to each value freezing cannot seal, a fresh copy of that value, and every other part
|
|
89
|
-
* shared, frozen, as it is. A copy is served the same way again.
|
|
90
|
-
*/
|
|
91
|
-
export declare function serveRecord<T>(record: T): T;
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* `target[name] = value`, preserving existing own-slot behavior while making
|
|
3
|
-
* a missing inherited name an OWN data property. Payload names such as
|
|
4
|
-
* `__proto__` are data, not setters or selector instructions. Shared by the
|
|
5
|
-
* record-serving and copy-on-write copies; this is not a public helper.
|
|
6
|
-
*/
|
|
7
|
-
export declare function putOwn(target: Record<string, unknown>, name: string, value: unknown): void;
|