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
|
@@ -581,4 +581,4 @@ class FlowChartExecutor {
|
|
|
581
581
|
}
|
|
582
582
|
}
|
|
583
583
|
exports.FlowChartExecutor = FlowChartExecutor;
|
|
584
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7OztBQUdILGlEQUFvSDtBQUtwSCxtR0FBNkY7QUFFN0YscUZBQStFO0FBQy9FLGlEQVM0QjtBQUU1Qix5REFBdUQ7QUFDdkQseURBQW1EO0FBR25ELGdEQUFrRDtBQUlsRCwyQ0FBMkM7QUFDM0MsbURBQXVEO0FBRXZELCtEQUErRTtBQUMvRSw2Q0FBcUc7QUFDckcsMkNBQXVFO0FBQ3ZFLHlDQUEyQztBQUMzQywrQ0FBK0M7QUFDL0MseURBQW1EO0FBRW5ELE1BQWEsaUJBQWlCO0lBQ3BCLFNBQVMsQ0FBbUM7SUFDcEQ7MkZBQ3VGO0lBQy9FLGlCQUFpQixHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ2pDLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUNqRCx5RkFBeUY7SUFDakYsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUMzQixtRkFBbUY7SUFDbEUsU0FBUyxHQUFHLElBQUksd0JBQVksRUFBRSxDQUFDO0lBQ3hDLGVBQWUsQ0FBOEI7SUFDckQsaUZBQWlGO0lBQ3pFLGFBQWEsR0FBRyxJQUFJLDRCQUFhLEVBQUUsQ0FBQztJQUNwQyxjQUFjLENBQWtDO0lBQ3hEOzs7OztPQUtHO0lBQ0ssYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM5Qjs7OztPQUlHO0lBQ0ssWUFBWSxHQUFHLEtBQUssQ0FBQztJQUVaLGFBQWEsQ0FBNkI7SUFFM0Q7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsWUFDRSxTQUFrQyxFQUNsQyxnQkFBMEU7UUFFMUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFBLGdDQUFtQixFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RF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Y3V0b3Ig4oCUIFB1YmxpYyBBUEkgZm9yIGV4ZWN1dGluZyBhIGNvbXBpbGVkIEZsb3dDaGFydC5cbiAqXG4gKiBXcmFwcyBGbG93Y2hhcnRUcmF2ZXJzZXIuIEJ1aWxkIGEgY2hhcnQgd2l0aCBmbG93Q2hhcnQoKSBhbmQgcGFzcyB0aGUgcmVzdWx0IGhlcmU6XG4gKlxuICogICBjb25zdCBjaGFydCA9IGZsb3dDaGFydCgnZW50cnknLCBlbnRyeUZuKS5hZGRGdW5jdGlvbigncHJvY2VzcycsIHByb2Nlc3NGbikuYnVpbGQoKTtcbiAqXG4gKiAgIC8vIE5vLW9wdGlvbnMgZm9ybSAodXNlcyBhdXRvLWRldGVjdGVkIFR5cGVkU2NvcGUgZmFjdG9yeSBmcm9tIHRoZSBjaGFydCk6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAqXG4gKiAgIC8vIE9wdGlvbnMtb2JqZWN0IGZvcm0gKHByZWZlcnJlZCB3aGVuIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBiZWhhdmlvcik6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHNjb3BlRmFjdG9yeTogbXlGYWN0b3J5IH0pO1xuICpcbiAqICAgLy8gMi1wYXJhbSBmb3JtIChhY2NlcHRzIGEgU2NvcGVGYWN0b3J5IGRpcmVjdGx5LCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSk6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCBteUZhY3RvcnkpO1xuICpcbiAqXG4gKiBUaGUgZXhlY3V0b3IgY29tcG9zZXMgZm91ciBtb2R1bGVzLCBvbmUgam9iIGVhY2ggKEY5KTogYGF0dGFjaC50c2AgKHdob1xuICogb2JzZXJ2ZXMgYSBydW4pLCBgcmVzdW1lLnRzYCAocGxhbiBhbmQgYW5ub3VuY2UgYSByZS1lbnRyeSksIGBjaGVja3BvaW50LnRzYFxuICogKHRoZSBwYXVzZSBjaGVja3BvaW50KSwgYHNuYXBzaG90LnRzYCAod2hhdCBgZ2V0U25hcHNob3QoKWAgc2VydmVzKS4gV2hhdFxuICogc3RheXMgaGVyZSBpcyB0aGUgcGVyLXJ1biBzdGF0ZSBhbmQgdGhlIHJ1biBsaWZlY3ljbGUgdGhhdCB0aHJlYWRzIGl0LlxuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dDogZGF0YSwgZW52OiB7IHRyYWNlSWQ6ICdyZXEtMTIzJyB9IH0pO1xuICovXG5cbmltcG9ydCB0eXBlIHsgRmxvd0NoYXJ0IH0gZnJvbSAnLi4vYnVpbGRlci90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZXRhY2hBbmRGb3JnZXQgYXMgX2RldGFjaEFuZEZvcmdldCwgZGV0YWNoQW5kSm9pbkxhdGVyIGFzIF9kZXRhY2hBbmRKb2luTGF0ZXIgfSBmcm9tICcuLi9kZXRhY2gvc3Bhd24uanMnO1xuaW1wb3J0IHR5cGUgeyBSZXN1bWVFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9oYW5kbGVycy9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvbmFycmF0aXZlVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdEVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9yZWNvcmRlcnMvTWFuaWZlc3RGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgTWFuaWZlc3RGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3JlY29yZGVycy9NYW5pZmVzdEZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgRmxvd2NoYXJ0VHJhdmVyc2VyIH0gZnJvbSAnLi4vZW5naW5lL3RyYXZlcnNhbC9GbG93Y2hhcnRUcmF2ZXJzZXIuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBFeGVjdXRvclJlc3VsdCxcbiAgdHlwZSBQYXVzZWRSZXN1bHQsXG4gIHR5cGUgUnVuT3B0aW9ucyxcbiAgdHlwZSBTY29wZUZhY3RvcnksXG4gIHR5cGUgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICB0eXBlIFN0YWdlTm9kZSxcbiAgdHlwZSBTdWJmbG93UmVzdWx0LFxuICBkZWZhdWx0TG9nZ2VyLFxufSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWFkVHJhY2tpbmdNb2RlLCBXcml0ZVRyYWNraW5nTW9kZSB9IGZyb20gJy4uL21lbW9yeS9mcmFtZVR5cGVzLmpzJztcbmltcG9ydCB7IFJlZGFjdGlvblJ1bGUgfSBmcm9tICcuLi9tZW1vcnkvcmVkYWN0aW9uLmpzJztcbmltcG9ydCB7IHJ1blBvbGljeSB9IGZyb20gJy4uL21lbW9yeS9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21taXRWYWx1ZXNNb2RlIH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd2NoYXJ0Q2hlY2twb2ludCwgUmVkYWN0aW9uTWFya3MgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnLi4vcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVtaXRSZWNvcmRlciB9IGZyb20gJy4uL3JlY29yZGVyL0VtaXRSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvblBvbGljeSwgUmVkYWN0aW9uUmVwb3J0LCBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHsgUnVuT2JzZXJ2ZXJzIH0gZnJvbSAnLi9hdHRhY2guanMnO1xuaW1wb3J0IHsgYnVpbGRQYXVzZUNoZWNrcG9pbnQgfSBmcm9tICcuL2NoZWNrcG9pbnQuanMnO1xuaW1wb3J0IHR5cGUgeyBBdHRhY2hSZWNvcmRlck9wdGlvbnMsIE9ic2VydmVyRHJhaW5SZXN1bHQgfSBmcm9tICcuL0RlZmVycmVkT2JzZXJ2ZXJUaWVyLmpzJztcbmltcG9ydCB7IHR5cGUgUnVudGltZVNuYXBzaG90LCBFeGVjdXRpb25SdW50aW1lIH0gZnJvbSAnLi9FeGVjdXRpb25SdW50aW1lLmpzJztcbmltcG9ydCB7IHR5cGUgRXhlY3V0b3JBcmdzLCB0eXBlIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucywgcmVzb2x2ZUV4ZWN1dG9yQXJncyB9IGZyb20gJy4vb3B0aW9ucy5qcyc7XG5pbXBvcnQgeyBhbm5vdW5jZVJlc3VtZSwgcGxhblJlc3VtZSwgc2VlZENvdW50ZXJzIH0gZnJvbSAnLi9yZXN1bWUuanMnO1xuaW1wb3J0IHsgZ2VuZXJhdGVSdW5JZCB9IGZyb20gJy4vcnVuSWQuanMnO1xuaW1wb3J0IHsgc2VydmVkU25hcHNob3QgfSBmcm9tICcuL3NuYXBzaG90LmpzJztcbmltcG9ydCB7IHZhbGlkYXRlSW5wdXQgfSBmcm9tICcuL3ZhbGlkYXRlSW5wdXQuanMnO1xuXG5leHBvcnQgY2xhc3MgRmxvd0NoYXJ0RXhlY3V0b3I8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgdHJhdmVyc2VyOiBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPjtcbiAgLyoqIFNoYXJlZCBleGVjdXRpb24gY291bnRlciBhbmQgcGVyLXN0YWdlIHZpc2l0IGNvdW50cyAobG9vcEl0ZXJhdGlvbikg4oCUIHNoYXJlZCBCWVxuICAgKiAgUkVGRVJFTkNFIHdpdGggZXZlcnkgdHJhdmVyc2VyIG9mIHRoZSBydW47IHN1cnZpdmUgcGF1c2UvcmVzdW1lLCByZXNldCBvbiBydW4oKS4gKi9cbiAgcHJpdmF0ZSBfZXhlY3V0aW9uQ291bnRlciA9IHsgdmFsdWU6IDAgfTtcbiAgcHJpdmF0ZSBfdmlzaXRDb3VudHMgPSBuZXcgTWFwPHN0cmluZywgbnVtYmVyPigpO1xuICAvKiogRnJlc2ggcGVyIHJ1bigpIGFuZCBwZXIgcmVzdW1lKCkg4oCUIHN0YW1wZWQgb24gZXZlcnkgVHJhdmVyc2FsQ29udGV4dCAoYHJ1bklkLnRzYCkuICovXG4gIHByaXZhdGUgX2N1cnJlbnRSdW5JZCA9ICcnO1xuICAvKiogV2hvIG9ic2VydmVzIHRoZSBydW4g4oCUIG5hcnJhdGl2ZSwgaW5saW5lIGxpc3RzLCBkZWZlcnJlZCB0aWVyIChgYXR0YWNoLnRzYCkuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgb2JzZXJ2ZXJzID0gbmV3IFJ1bk9ic2VydmVycygpO1xuICBwcml2YXRlIHJlZGFjdGlvblBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkO1xuICAvKiogVGhlIHJ1bidzIE9ORSByZWRhY3Rpb24gcnVsZSAoYG1lbW9yeS9yZWRhY3Rpb24udHNgKSwgYnVpbHQgZnJlc2ggcGVyIGxlZy4gKi9cbiAgcHJpdmF0ZSByZWRhY3Rpb25SdWxlID0gbmV3IFJlZGFjdGlvblJ1bGUoKTtcbiAgcHJpdmF0ZSBsYXN0Q2hlY2twb2ludDogRmxvd2NoYXJ0Q2hlY2twb2ludCB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIGB0cnVlYCBvbmNlIHJ1bigpIChvciBhIHJlc3VtZSkgZXhlY3V0ZWQgaGVyZS4gYHJlc3VtZSgpYCBicmFuY2hlcyBvbiBpdDpcbiAgICogdHJ1ZSDihpIgcmV1c2UgdGhlIHJ1bnRpbWUgKGV4ZWN1dGlvbiB0cmVlLCByZWNvcmRlcnMsIG5hcnJhdGl2ZSBhY2N1bXVsYXRlKTtcbiAgICogZmFsc2Ug4oaSIHNlZWQgYSBmcmVzaCBydW50aW1lIGZyb20gYGNoZWNrcG9pbnQuc2hhcmVkU3RhdGVgIChjcm9zcy1leGVjdXRvclxuICAgKiByZXN1bWUpLiBTZWUgYHRlc3QvbGliL3BhdXNlL2Nyb3NzLWV4ZWN1dG9yLXJlc3VtZS50ZXN0LnRzYC5cbiAgICovXG4gIHByaXZhdGUgX2hhc1J1bkJlZm9yZSA9IGZhbHNlO1xuICAvKipcbiAgICogUmUtZW50cmFuY3kgZ3VhcmQ6IHJ1bigpL3Jlc3VtZSgpIG11dGF0ZSBwZXItcnVuIHN0YXRlICh0cmF2ZXJzZXIsIHJ1bklkLFxuICAgKiBjb3VudGVycywgY2hlY2twb2ludCwgcmVjb3JkZXJzKSDigJQgb25lIGV4ZWN1dG9yID0gb25lIGluLWZsaWdodCBleGVjdXRpb24uXG4gICAqIFNlZSBkb2NzL2d1aWRlcy9leGVjdXRpb24tbW9kZWwubWQuXG4gICAqL1xuICBwcml2YXRlIF9pc0V4ZWN1dGluZyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvd0NoYXJ0QXJnczogRXhlY3V0b3JBcmdzPFRPdXQsIFRTY29wZT47XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIEZsb3dDaGFydEV4ZWN1dG9yLlxuICAgKlxuICAgKiAqKk9wdGlvbnMgb2JqZWN0IGZvcm0qKiAocHJlZmVycmVkKTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2NvcGVGYWN0b3J5LCBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dCB9KVxuICAgKiBgYGBcbiAgICpcbiAgICogKioyLXBhcmFtIGZvcm0qKiAoYWxzbyBzdXBwb3J0ZWQpOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgc2NvcGVGYWN0b3J5KVxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGZsb3dDaGFydCAtIFRoZSBjb21waWxlZCBGbG93Q2hhcnQgcmV0dXJuZWQgYnkgYGZsb3dDaGFydCguLi4pLmJ1aWxkKClgXG4gICAqIEBwYXJhbSBmYWN0b3J5T3JPcHRpb25zIC0gQSBgU2NvcGVGYWN0b3J5PFRTY29wZT5gIE9SIGEgYEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGU+YCBvcHRpb25zIG9iamVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGZsb3dDaGFydDogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4sXG4gICAgZmFjdG9yeU9yT3B0aW9ucz86IFNjb3BlRmFjdG9yeTxUU2NvcGU+IHwgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zPFRTY29wZT4sXG4gICkge1xuICAgIHRoaXMuZmxvd0NoYXJ0QXJncyA9IHJlc29sdmVFeGVjdXRvckFyZ3MoZmxvd0NoYXJ0LCBmYWN0b3J5T3JPcHRpb25zKTtcbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRyYXZlcnNlcihcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICByZWFkT25seUNvbnRleHRPdmVycmlkZT86IHVua25vd24sXG4gICAgZW52PzogaW1wb3J0KCcuLi9lbmdpbmUvdHlwZXMuanMnKS5FeGVjdXRpb25FbnYsXG4gICAgbWF4RGVwdGg/OiBudW1iZXIsXG4gICAgbWF4SXRlcmF0aW9ucz86IG51bWJlcixcbiAgICBvdmVycmlkZXM/OiB7XG4gICAgICBpbml0aWFsQ29udGV4dD86IHVua25vd247XG4gICAgICBwcmVzZXJ2ZVJlY29yZGVycz86IGJvb2xlYW47XG4gICAgICBleGlzdGluZ1J1bnRpbWU/OiBJbnN0YW5jZVR5cGU8dHlwZW9mIEV4ZWN1dGlvblJ1bnRpbWU+O1xuICAgICAgLyoqIFRoZSByZXN1bWUncyBvbmUtc2hvdCByZS1lbnRyeSAoYHJlc3VtZS50c2ApOyB0aGUgdHJhdmVyc2VyIHN0aWxsIHdhbGtzIHRoZSBSRUFMIGNoYXJ0LiAqL1xuICAgICAgcmVzdW1lPzogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPjtcbiAgICAgIC8qKiBUaGUgcmVkYWN0aW9uIHRoZSBwYXVzZWQgcnVuIGhhZCBtYWRlIChuYW1lcyBvbmx5KSDigJQgdGhlIHJlc3VtZWQgbGVnJ3MgcnVsZSBzdGFydHMgZnJvbSBpdC4gKi9cbiAgICAgIHJlZGFjdGlvbk1hcmtzPzogUmVkYWN0aW9uTWFya3M7XG4gICAgfSxcbiAgKTogRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmZsb3dDaGFydEFyZ3M7XG4gICAgY29uc3QgZmMgPSBhcmdzLmZsb3dDaGFydDtcbiAgICBjb25zdCBuYXJyYXRpdmVGbGFnID0gdGhpcy5vYnNlcnZlcnMuc3RhcnRMZWcoZmMuZW5hYmxlTmFycmF0aXZlID8/IGZhbHNlLCBvdmVycmlkZXM/LnByZXNlcnZlUmVjb3JkZXJzID09PSB0cnVlKTtcblxuICAgIHRoaXMucmVkYWN0aW9uUnVsZSA9IG5ldyBSZWRhY3Rpb25SdWxlKHRoaXMucmVkYWN0aW9uUG9saWN5KTtcbiAgICAvLyBBIHJlc3VtZSBjb250aW51ZXMgdGhlIHBhdXNlZCBydW4ncyByZWRhY3Rpb246IGEgY29weSBtYXNrZWQgYmVmb3JlIHRoZSBwYXVzZSBzdGF5cyBtYXNrZWQuXG4gICAgaWYgKG92ZXJyaWRlcz8ucmVkYWN0aW9uTWFya3MpIHRoaXMucmVkYWN0aW9uUnVsZS5yZXN0b3JlTWFya3Mob3ZlcnJpZGVzLnJlZGFjdGlvbk1hcmtzKTtcbiAgICAvLyBPTkUgZmFjdG9yeTogdGhlIGJhc2UgZmFjdG9yeSwgdGhlbiBldmVyeSBzY29wZSBtb2RpZmllciAocmVjb3JkZXJzLFxuICAgIC8vIGRlZmVycmVkIHRhcCwgcmVkYWN0aW9uKSBpbiBhIGZsYXQgcGFzcyDigJQgc2VlIGBSdW5PYnNlcnZlcnNgLlxuICAgIGNvbnN0IHNjb3BlRmFjdG9yeSA9IHRoaXMub2JzZXJ2ZXJzLmNvbXBvc2VTY29wZUZhY3RvcnkoXG4gICAgICBhcmdzLnNjb3BlRmFjdG9yeSxcbiAgICAgIHRoaXMucmVkYWN0aW9uUG9saWN5LFxuICAgICAgdGhpcy5yZWRhY3Rpb25SdWxlLm1hcmtlZEtleXMoKSxcbiAgICApO1xuXG4gICAgLy8gVGhlIGZpcnN0IHN0YWdlIHRoaXMgdHJhdmVyc2FsIHJ1bnM6IHRoZSByZXN1bWUncyBlbnRyeSwgZWxzZSB0aGUgY2hhcnQgcm9vdC5cbiAgICBjb25zdCBlZmZlY3RpdmVSb290ID0gb3ZlcnJpZGVzPy5yZXN1bWU/LnN0YXJ0ID8/IGZjLnJvb3Q7XG4gICAgY29uc3QgZWZmZWN0aXZlSW5pdGlhbENvbnRleHQgPSBvdmVycmlkZXM/LmluaXRpYWxDb250ZXh0ID8/IGFyZ3MuaW5pdGlhbENvbnRleHQ7XG5cbiAgICAvLyBUaGUgcnVuJ3MgcG9saWN5IChGNSk6IHRoZSBkaWFscywgdGhlIHJ1bGUgKGluc3RhbGxlZCBldmVuIHdpdGhvdXQgYVxuICAgIC8vIHBvbGljeSDigJQgcGVyLWNhbGwgYHNldFZhbHVlKGssIHYsIHRydWUpYCBtYXJrcyBsaXZlIG9uIGl0KSBhbmQgdGhlIG1pcnJvclxuICAgIC8vIGZsYWcgKGEgcmVkYWN0ZWQgaGVhcCwga2VwdCBvbmx5IHVuZGVyIGEgcG9saWN5KSwgT05FIGZyb3plbiBvYmplY3QgcGVyXG4gICAgLy8gbGVnIHRoYXQgZXZlcnkgZnJhbWUgb2YgdGhlIHJ1biBob2xkcyBieSByZWZlcmVuY2UuXG4gICAgY29uc3QgcG9saWN5ID0gcnVuUG9saWN5KGFyZ3MuZGlhbHMsIHRoaXMucmVkYWN0aW9uUnVsZSwgdGhpcy5yZWRhY3Rpb25Qb2xpY3kgIT09IHVuZGVmaW5lZCk7XG5cbiAgICBsZXQgcnVudGltZTogRXhlY3V0aW9uUnVudGltZTtcbiAgICBpZiAob3ZlcnJpZGVzPy5leGlzdGluZ1J1bnRpbWUpIHtcbiAgICAgIC8vIFNhbWUtZXhlY3V0b3IgcmVzdW1lOiB0aGUgdHJlZSBjb250aW51ZXMgZnJvbSB0aGUgbGVhZjsgZ2V0U25hcHNob3QoKSBrZWVwcyB0aGUgZnVsbCB0cmVlLlxuICAgICAgcnVudGltZSA9IG92ZXJyaWRlcy5leGlzdGluZ1J1bnRpbWU7XG4gICAgICBydW50aW1lLnByZXNlcnZlU25hcHNob3RSb290KCk7XG4gICAgICBsZXQgbGVhZiA9IHJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcbiAgICAgIHdoaWxlIChsZWFmLm5leHQpIGxlYWYgPSBsZWFmLm5leHQ7XG4gICAgICBydW50aW1lLnJvb3RTdGFnZUNvbnRleHQgPSBsZWFmLmNyZWF0ZU5leHQoJycsIGVmZmVjdGl2ZVJvb3QubmFtZSwgZWZmZWN0aXZlUm9vdC5pZCk7XG4gICAgICBydW50aW1lLnVzZVBvbGljeShwb2xpY3kpO1xuICAgIH0gZWxzZSB7XG4gICAgICBydW50aW1lID0gbmV3IEV4ZWN1dGlvblJ1bnRpbWUoXG4gICAgICAgIGVmZmVjdGl2ZVJvb3QubmFtZSxcbiAgICAgICAgZWZmZWN0aXZlUm9vdC5pZCxcbiAgICAgICAgYXJncy5kZWZhdWx0VmFsdWVzRm9yQ29udGV4dCxcbiAgICAgICAgZWZmZWN0aXZlSW5pdGlhbENvbnRleHQsXG4gICAgICAgIHBvbGljeSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPih7XG4gICAgICAvLyBBbHdheXMgdGhlIFJFQUwgY2hhcnQ7IGEgcmVzdW1lIG9ubHkgbW92ZXMgd2hlcmUgdGhlIHRyYXZlcnNhbCBTVEFSVFMsIG9uY2UuXG4gICAgICByb290OiBmYy5yb290LFxuICAgICAgLi4uKG92ZXJyaWRlcz8ucmVzdW1lPy5zdGFydCAmJiB7IGVudHJ5OiBvdmVycmlkZXMucmVzdW1lLnN0YXJ0IH0pLFxuICAgICAgLi4uKG92ZXJyaWRlcz8ucmVzdW1lPy5zdGFydFBlbmRpbmdQYXVzZXMgJiYgeyBwZW5kaW5nUGF1c2VzOiBvdmVycmlkZXMucmVzdW1lLnN0YXJ0UGVuZGluZ1BhdXNlcyB9KSxcbiAgICAgIC4uLihvdmVycmlkZXM/LnJlc3VtZSAmJiB7IHJlc3VtZTogb3ZlcnJpZGVzLnJlc3VtZSB9KSxcbiAgICAgIHN0YWdlTWFwOiBmYy5zdGFnZU1hcCxcbiAgICAgIHNjb3BlRmFjdG9yeSxcbiAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHJ1bnRpbWUsXG4gICAgICByZWFkT25seUNvbnRleHQ6IHJlYWRPbmx5Q29udGV4dE92ZXJyaWRlID8/IGFyZ3MucmVhZE9ubHlDb250ZXh0LFxuICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogYXJncy50aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgc3RyZWFtSGFuZGxlcnM6IGFyZ3Muc3RyZWFtSGFuZGxlcnMsXG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBhcmdzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICBzdWJmbG93czogZmMuc3ViZmxvd3MsXG4gICAgICBuYXJyYXRpdmVFbmFibGVkOiBuYXJyYXRpdmVGbGFnLFxuICAgICAgYnVpbGRUaW1lU3RydWN0dXJlOiBmYy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICBsb2dnZXI6IGZjLmxvZ2dlciA/PyBkZWZhdWx0TG9nZ2VyLFxuICAgICAgc2lnbmFsLFxuICAgICAgZXhlY3V0aW9uRW52OiBlbnYsXG4gICAgICBmbG93UmVjb3JkZXJzOiB0aGlzLm9ic2VydmVycy5mbG93UmVjb3JkZXJzTGlzdCgpLFxuICAgICAgZXhlY3V0aW9uQ291bnRlcjogdGhpcy5fZXhlY3V0aW9uQ291bnRlcixcbiAgICAgIHZpc2l0Q291bnRzOiB0aGlzLl92aXNpdENvdW50cyxcbiAgICAgIHJ1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsXG4gICAgICAuLi4obWF4RGVwdGggIT09IHVuZGVmaW5lZCAmJiB7IG1heERlcHRoIH0pLFxuICAgICAgLi4uKG1heEl0ZXJhdGlvbnMgIT09IHVuZGVmaW5lZCAmJiB7IG1heEl0ZXJhdGlvbnMgfSksXG4gICAgfSk7XG4gIH1cblxuICBlbmFibGVOYXJyYXRpdmUob3B0aW9ucz86IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlcnMuZW5hYmxlTmFycmF0aXZlKG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGRlY2xhcmF0aXZlIHJlZGFjdGlvbiBwb2xpY3kgdGhhdCBhcHBsaWVzIHRvIGFsbCBzdGFnZXMuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS5cbiAgICovXG4gIHNldFJlZGFjdGlvblBvbGljeShwb2xpY3k6IFJlZGFjdGlvblBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucmVkYWN0aW9uUG9saWN5ID0gcG9saWN5O1xuICAgIHRoaXMucmVkYWN0aW9uUnVsZSA9IG5ldyBSZWRhY3Rpb25SdWxlKHBvbGljeSk7XG4gIH1cblxuICAvKiogVGhlIGByZWFkVHJhY2tpbmdgIGRpYWwgKHNlZSB7QGxpbmsgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zLnJlYWRUcmFja2luZ30pLiBDYWxsIGJlZm9yZSBydW4oKS4gKi9cbiAgc2V0UmVhZFRyYWNraW5nKG1vZGU6IFJlYWRUcmFja2luZ01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dDaGFydEFyZ3MuZGlhbHMgPSB7IC4uLnRoaXMuZmxvd0NoYXJ0QXJncy5kaWFscywgcmVhZFRyYWNraW5nOiBtb2RlIH07XG4gIH1cblxuICAvKiogVGhlIGB3cml0ZVRyYWNraW5nYCBkaWFsIChzZWUge0BsaW5rIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucy53cml0ZVRyYWNraW5nfSkuIENhbGwgYmVmb3JlIHJ1bigpLiAqL1xuICBzZXRXcml0ZVRyYWNraW5nKG1vZGU6IFdyaXRlVHJhY2tpbmdNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5mbG93Q2hhcnRBcmdzLmRpYWxzID0geyAuLi50aGlzLmZsb3dDaGFydEFyZ3MuZGlhbHMsIHdyaXRlVHJhY2tpbmc6IG1vZGUgfTtcbiAgfVxuXG4gIC8qKiBUaGUgYGNvbW1pdFZhbHVlc2AgZGlhbCAoc2VlIHtAbGluayBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMuY29tbWl0VmFsdWVzfSkuIENhbGwgYmVmb3JlIHJ1bigpLiAqL1xuICBzZXRDb21taXRWYWx1ZXMobW9kZTogQ29tbWl0VmFsdWVzTW9kZSk6IHZvaWQge1xuICAgIHRoaXMuZmxvd0NoYXJ0QXJncy5kaWFscyA9IHsgLi4udGhpcy5mbG93Q2hhcnRBcmdzLmRpYWxzLCBjb21taXRWYWx1ZXM6IG1vZGUgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29tcGxpYW5jZS1mcmllbmRseSByZXBvcnQgb2YgYWxsIHJlZGFjdGlvbiBhY3Rpdml0eSBmcm9tIHRoZVxuICAgKiBtb3N0IHJlY2VudCBydW4uIE5ldmVyIGluY2x1ZGVzIGFjdHVhbCB2YWx1ZXMuXG4gICAqL1xuICBnZXRSZWRhY3Rpb25SZXBvcnQoKTogUmVkYWN0aW9uUmVwb3J0IHtcbiAgICByZXR1cm4gdGhpcy5yZWRhY3Rpb25SdWxlLnJlcG9ydCgpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFBhdXNlL1Jlc3VtZSDilIDilIDilIBcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2hlY2twb2ludCBmcm9tIHRoZSBtb3N0IHJlY2VudCBwYXVzZWQgZXhlY3V0aW9uLCBvciBgdW5kZWZpbmVkYFxuICAgKiBpZiB0aGUgbGFzdCBydW4gY29tcGxldGVkIHdpdGhvdXQgcGF1c2luZy5cbiAgICpcbiAgICogSlNPTi1zZXJpYWxpemFibGUgKHN0b3JlIGl0IGluIFJlZGlzLCBQb3N0Z3JlcywgbG9jYWxTdG9yYWdl4oCmKSBhbmQgZnVsbHlcbiAgICogREVUQUNIRUQgZnJvbSBlbmdpbmUgc3RhdGUgKGBjaGVja3BvaW50LnRzYCk6IG11dGF0aW5nIG9yIHBlcnNpc3RpbmcgaXRcbiAgICogY2Fubm90IGFmZmVjdCB0aGUgZXhlY3V0b3IsIG5vciBhIGxhdGVyIHJlc3VtZSBhIGNoZWNrcG9pbnQgeW91IHN0b3JlZC5cbiAgICogTEVBTjogd2hhdCBgcmVzdW1lKClgIHJlYWRzIGFuZCB0aGUgcGF1c2UncyBvd24gcmVjb3JkIOKAlCBpdHMgc2l6ZSBpcyB0aGVcbiAgICogc3RhdGUncywgbmV2ZXIgdGhlIHJ1bidzIGxlbmd0aC4gVGhlIHJ1bidzIGhpc3RvcnkgKGV4ZWN1dGlvbiB0cmVlLFxuICAgKiBjb21taXQgbG9nLCBzdWJmbG93IHJlc3VsdHMpIGlzIHtAbGluayBnZXRTbmFwc2hvdH0ncy5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dCB9KTtcbiAgICogaWYgKGV4ZWN1dG9yLmlzUGF1c2VkKCkpIHtcbiAgICogICBjb25zdCBjaGVja3BvaW50ID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAgICogICBhd2FpdCByZWRpcy5zZXQoYHNlc3Npb246JHtpZH1gLCBKU09OLnN0cmluZ2lmeShjaGVja3BvaW50KSk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBnZXRDaGVja3BvaW50KCk6IEZsb3djaGFydENoZWNrcG9pbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGVja3BvaW50O1xuICB9XG5cbiAgLyoqIFJldHVybnMgYHRydWVgIGlmIHRoZSBtb3N0IHJlY2VudCBydW4oKSB3YXMgcGF1c2VkIChjaGVja3BvaW50IGF2YWlsYWJsZSkuICovXG4gIGlzUGF1c2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGVja3BvaW50ICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogTnVtYmVyIG9mIGNvbW1pdHMgaW4gdGhlIFJPT1QgbG9nIG5vdy4gTygxKSwgbm8gc25hcHNob3QgbWF0ZXJpYWxpemF0aW9uLlxuICAgKiBOb3QgYW4gZW1pdHRlZCBldmVudCdzIHNvdXJjZSBwb3NpdGlvbjogYSBkZWZlcnJlZCBjYWxsYmFjayBydW5zIGxhdGVyXG4gICAqIGFuZCBhIHN1YmZsb3cgb3ducyBhbm90aGVyIGxvZy4gVXNlIEVtaXRFdmVudC5zb3VyY2VQb3NpdGlvbiBmb3IgdGhhdC5cbiAgICpcbiAgICogUmV0dXJucyAwIGJlZm9yZSBhbnkgcnVuLiBBIGZyZXNoIHJ1biByZXNldHMgdGhlIGxvZzsgYSBzYW1lLWV4ZWN1dG9yXG4gICAqIHJlc3VtZSBjb250aW51ZXMgaXQuIEEgZnJlc2gtZXhlY3V0b3IgcmVzdW1lIHN0YXJ0cyBhIG5ldyBsb2NhbCBsb2cuXG4gICAqIEFsd2F5cyBlcXVhbHMgYGdldFNuYXBzaG90KCkuY29tbWl0TG9nLmxlbmd0aGAgKHRoZSBsb2cgaXMgdGhlXG4gICAqIGBFdmVudExvZ2AncyBgZXhlY3V0aW9uSGlzdG9yeWA7IHRoZSBzbmFwc2hvdCBzZXJ2ZXMgYSBmcm96ZW4gY29weSkuXG4gICAqL1xuICBnZXRDb21taXRDb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPiB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcnVudGltZT8uZXhlY3V0aW9uSGlzdG9yeS5sZW5ndGggPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1bWUgYSBwYXVzZWQgZmxvd2NoYXJ0IGZyb20gYSBjaGVja3BvaW50LlxuICAgKlxuICAgKiBSZXN0b3JlcyB0aGUgc2NvcGUgc3RhdGUsIHJ1bnMgdGhlIHBhdXNlZCBzdGFnZSdzIGByZXN1bWVGbmAgd2l0aCB0aGUgaW5wdXRcbiAgICogKGFuIGBpbnRlcnJ1cHQoKWAgcGF1c2UgcmUtcnVucyB0aGUgc3RhZ2Ugd2l0aCB0aGUgYW5zd2VyKSwgdGhlbiBjb250aW51ZXNcbiAgICogd2l0aCB3aGF0ZXZlciByYW4gYWZ0ZXIgdGhhdCBzdGFnZSBvbiB0aGUgcnVuIOKAlCBpdHMgYG5leHRgLCBvciBpdHNcbiAgICogZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvbiwgYXQgZXZlcnkgbGV2ZWwgb2YgdGhlIHBhdXNlIHBhdGguIFBhcmFsbGVsXG4gICAqIHNpYmxpbmdzIHRoYXQgcGF1c2VkIHRvZ2V0aGVyIChgY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzYCkgYXJlIGFza2VkIGluXG4gICAqIHR1cm47IHRoZSBqb2luIHJ1bnMgYWZ0ZXIgdGhlIGxhc3QgYW5zd2VyLiBTZWUgYFJlc3VtZUVudHJ5YC5cbiAgICpcbiAgICogVGhlIGNoZWNrcG9pbnQgY29tZXMgZnJvbSBgZ2V0Q2hlY2twb2ludCgpYCBvciBmcm9tIHN0b3JhZ2UuIE9uIHRoZSBTQU1FXG4gICAqIGV4ZWN1dG9yLCBuYXJyYXRpdmUvcmVjb3JkZXIgc3RhdGUgYWNjdW11bGF0ZXMgYWNyb3NzIHRoZSBwYXVzZTsgb24gYVxuICAgKiBGUkVTSCBleGVjdXRvciBpdCBzdGFydHMgZW1wdHkuIEEgZnJlc2ggYHJ1bklkYCBlaXRoZXIgd2F5LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFByb2Nlc3MgQSDigJQgYWZ0ZXIgYSBwYXVzZSwgcGVyc2lzdCB0aGUgY2hlY2twb2ludDpcbiAgICogY29uc3QgY2hlY2twb2ludCA9IGV4ZWN1dG9yLmdldENoZWNrcG9pbnQoKSE7XG4gICAqIGF3YWl0IHJlZGlzLnNldChgc2Vzc2lvbjoke2lkfWAsIEpTT04uc3RyaW5naWZ5KGNoZWNrcG9pbnQpKTtcbiAgICpcbiAgICogLy8gUHJvY2VzcyBCIChwb3NzaWJseSBkaWZmZXJlbnQgc2VydmVyLCBzYW1lIGNoYXJ0KSDigJQgcmVzdG9yZSBhbmQgcmVzdW1lOlxuICAgKiBjb25zdCByZXN0b3JlZCA9IEpTT04ucGFyc2UoYXdhaXQgcmVkaXMuZ2V0KGBzZXNzaW9uOiR7aWR9YCkpO1xuICAgKiBjb25zdCBleGVjdXRvciA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCk7XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJlc3VtZShyZXN0b3JlZCwgeyBhcHByb3ZlZDogdHJ1ZSB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZXN1bWUoXG4gICAgY2hlY2twb2ludDogRmxvd2NoYXJ0Q2hlY2twb2ludCxcbiAgICByZXN1bWVJbnB1dD86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFBpY2s8UnVuT3B0aW9ucywgJ3NpZ25hbCcgfCAnZW52JyB8ICdtYXhEZXB0aCcgfCAnbWF4SXRlcmF0aW9ucyc+LFxuICApOiBQcm9taXNlPEV4ZWN1dG9yUmVzdWx0PiB7XG4gICAgdGhpcy5hc3NlcnRJZGxlKCdyZXN1bWUnKTtcbiAgICAvLyBFdmVyeSByZWZ1c2FsIGhhcHBlbnMgaW4gdGhlIHBsYW4g4oCUIGJlZm9yZSBhbnkgc3RhdGUgYmVsb3cgaXMgdG91Y2hlZCxcbiAgICAvLyBzbyBhIHJlamVjdGVkIGNoZWNrcG9pbnQgbGVhdmVzIHRoZSBleGVjdXRvciAoYW5kIGl0cyBjaGVja3BvaW50KSBhcyBpdCB3YXMuXG4gICAgY29uc3QgcGxhbiA9IHBsYW5SZXN1bWUodGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydCwgY2hlY2twb2ludCwgcmVzdW1lSW5wdXQpO1xuICAgIC8vIE1VU1QgcHJlY2VkZSB0aGUgY291bnRlciByZWFkIGluIGBhbm5vdW5jZVJlc3VtZWAgYW5kIHRoZSB0cmF2ZXJzZXIsXG4gICAgLy8gd2hpY2ggdGFrZXMgYm90aCBjb3VudGVycyBCWSBSRUZFUkVOQ0UuXG4gICAgc2VlZENvdW50ZXJzKHBsYW4uY2hlY2twb2ludCwgdGhpcy5fZXhlY3V0aW9uQ291bnRlciwgdGhpcy5fdmlzaXRDb3VudHMpO1xuICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyBTYW1lIGV4ZWN1dG9yOiByZXVzZSB0aGUgcnVudGltZS4gRnJlc2ggZXhlY3V0b3I6IHNlZWQgYSBORVcgb25lIGZyb21cbiAgICAvLyBgY2hlY2twb2ludC5zaGFyZWRTdGF0ZWAuIEVpdGhlciB3YXkgYSBORVcgcnVuSWQgKGEgZGlzdGluY3QgbG9naWNhbCBydW4pLlxuICAgIGNvbnN0IGV4aXN0aW5nUnVudGltZSA9IHRoaXMuX2hhc1J1bkJlZm9yZVxuICAgICAgPyAodGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpIGFzIEluc3RhbmNlVHlwZTx0eXBlb2YgRXhlY3V0aW9uUnVudGltZT4pXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9oYXNSdW5CZWZvcmUgPSB0cnVlOyAvLyBhbnkgcGF0aCB0aGF0IHJlc3VtZXMgY291bnRzIGFzIGEgcnVuXG4gICAgdGhpcy5fY3VycmVudFJ1bklkID0gZ2VuZXJhdGVSdW5JZCgpO1xuXG4gICAgdGhpcy50cmF2ZXJzZXIgPSB0aGlzLmNyZWF0ZVRyYXZlcnNlcihcbiAgICAgIG9wdGlvbnM/LnNpZ25hbCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIG9wdGlvbnM/LmVudixcbiAgICAgIG9wdGlvbnM/Lm1heERlcHRoLFxuICAgICAgb3B0aW9ucz8ubWF4SXRlcmF0aW9ucyxcbiAgICAgIHtcbiAgICAgICAgLy8gQ2xvbmUtaW46IGBpbml0aWFsQ29udGV4dGAgc2VlZHMgdGhlIGZyZXNoIFNoYXJlZE1lbW9yeSB3aXRoIGFcbiAgICAgICAgLy8gdG9wLWxldmVsLW9ubHkgbWVyZ2Ug4oCUIG5lc3RlZCBvYmplY3RzIHdvdWxkIGFsaWFzIHRoZSBjYWxsZXIncyBjaGVja3BvaW50LlxuICAgICAgICBpbml0aWFsQ29udGV4dDogc3RydWN0dXJlZENsb25lKHBsYW4uY2hlY2twb2ludC5zaGFyZWRTdGF0ZSksXG4gICAgICAgIHByZXNlcnZlUmVjb3JkZXJzOiB0cnVlLFxuICAgICAgICAuLi4oZXhpc3RpbmdSdW50aW1lID8geyBleGlzdGluZ1J1bnRpbWUgfSA6IHt9KSxcbiAgICAgICAgcmVzdW1lOiBwbGFuLmVudHJ5LFxuICAgICAgICAuLi4ocGxhbi5jaGVja3BvaW50LnJlZGFjdGlvbk1hcmtzICYmIHsgcmVkYWN0aW9uTWFya3M6IHBsYW4uY2hlY2twb2ludC5yZWRhY3Rpb25NYXJrcyB9KSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICAvLyBCZWZvcmUgdGhlIHRyYXZlcnNhbCBvbiBwdXJwb3NlOiBgb25SZXN1bWVgIHByZWNlZGVzIGBvblJ1blN0YXJ0YC5cbiAgICBhbm5vdW5jZVJlc3VtZShwbGFuLCByZXN1bWVJbnB1dCwge1xuICAgICAgcnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCxcbiAgICAgIGV4ZWN1dGlvbkNvdW50OiB0aGlzLl9leGVjdXRpb25Db3VudGVyLnZhbHVlLFxuICAgICAgb2JzZXJ2ZXJzOiB0aGlzLm9ic2VydmVycyxcbiAgICB9KTtcblxuICAgIC8vIFNldCBBRlRFUiBhbGwgc3luYyB2YWxpZGF0aW9uL2xvb2t1cCB0aHJvd3MgYWJvdmUgKG5vdGhpbmcgY2FuIGxlYWsgdGhlXG4gICAgLy8gZmxhZyk7IG5vIGF3YWl0IGJldHdlZW4gdGhlIHRvcC1vZi1tZXRob2QgY2hlY2sgYW5kIGhlcmUsIHNvIHJhY2UtZnJlZS5cbiAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMudHJhdmVyc2VyLmV4ZWN1dGUoKTtcbiAgICAgIC8vIFRlcm1pbmFsIGZsdXNoIChSRkMtMDAxIEJsb2NrIDgpIOKAlCBzYW1lIGJvdW5kYXJ5IGNvbnRyYWN0IGFzIHJ1bigpLlxuICAgICAgdGhpcy5vYnNlcnZlcnMuZGVmZXJyZWRUaWVyPy50ZXJtaW5hbEZsdXNoKCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXVzZWRPclRocm93KGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faXNFeGVjdXRpbmcgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIHNldHRsZSBvZiBhIGxlZyB0aGF0IHRocmV3OiBmbHVzaCB0aGUgZGVmZXJyZWQgdGllciAodGhlIE9VVEVSTU9TVFxuICAgKiBoYW5kbGVyIOKAlCBhIHBhdXNlIHJlLXRocm93cyB0aHJvdWdoIHN1YmZsb3cgdHJhdmVyc2VycyB3aXRob3V0IGV4aXRcbiAgICogZXZlbnRzLCBzbyBwZXItdHJhdmVyc2VyIGhvb2tzIHdvdWxkIG1pc3MgaXQpLCB0aGVuIHR1cm4gYSBwYXVzZSBpbnRvIGFcbiAgICogZGV0YWNoZWQgY2hlY2twb2ludCAoYGNoZWNrcG9pbnQudHNgKSBhbmQgYSBgUGF1c2VkUmVzdWx0YDsgYW55dGhpbmcgZWxzZVxuICAgKiBpcyByZXRocm93bi5cbiAgICovXG4gIHByaXZhdGUgcGF1c2VkT3JUaHJvdyhlcnJvcjogdW5rbm93bik6IFBhdXNlZFJlc3VsdCB7XG4gICAgdGhpcy5vYnNlcnZlcnMuZGVmZXJyZWRUaWVyPy50ZXJtaW5hbEZsdXNoKCk7XG4gICAgaWYgKGlzUGF1c2VTaWduYWwoZXJyb3IpKSB7XG4gICAgICBjb25zdCByZWRhY3Rpb25NYXJrcyA9IHRoaXMucmVkYWN0aW9uUnVsZS5tYXJrc0ZvckNoZWNrcG9pbnQoKTtcbiAgICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSBidWlsZFBhdXNlQ2hlY2twb2ludChlcnJvciwgdGhpcy50cmF2ZXJzZXIsIHtcbiAgICAgICAgcnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCxcbiAgICAgICAgZXhlY3V0aW9uQ291bnQ6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUsXG4gICAgICAgIHZpc2l0Q291bnRzOiB0aGlzLl92aXNpdENvdW50cyxcbiAgICAgICAgLi4uKHJlZGFjdGlvbk1hcmtzICYmIHsgcmVkYWN0aW9uTWFya3MgfSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHBhdXNlZDogdHJ1ZSwgY2hlY2twb2ludDogdGhpcy5sYXN0Q2hlY2twb2ludCB9IHNhdGlzZmllcyBQYXVzZWRSZXN1bHQ7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgLyoqIFRoZSByZS1lbnRyYW5jeSBndWFyZDogb25lIGV4ZWN1dG9yID0gb25lIGluLWZsaWdodCBleGVjdXRpb24uICovXG4gIHByaXZhdGUgYXNzZXJ0SWRsZShtZXRob2Q6ICdydW4nIHwgJ3Jlc3VtZScpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNFeGVjdXRpbmcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEZsb3dDaGFydEV4ZWN1dG9yOiAke21ldGhvZH0oKSBjYWxsZWQgd2hpbGUgYW5vdGhlciBydW4oKS9yZXN1bWUoKSBpcyBpbiBmbGlnaHQgb24gdGhpcyBgICtcbiAgICAgICAgICAnZXhlY3V0b3IuIEFuIGV4ZWN1dG9yIGhvbGRzIHBlci1ydW4gc3RhdGUgKHJ1bklkLCByZWNvcmRlcnMsIGNoZWNrcG9pbnQpIOKAlCBjcmVhdGUgJyArXG4gICAgICAgICAgJ29uZSBleGVjdXRvciBwZXIgY29uY3VycmVudCBydW4uIFNlZSBkb2NzL2d1aWRlcy9leGVjdXRpb24tbW9kZWwubWQuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFJlY29yZGVycyAodGhlIHJlZ2lzdGVyIGxpdmVzIGluIGBhdHRhY2gudHNgKSDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgU2NvcGVSZWNvcmRlciB0byBvYnNlcnZlIGRhdGEgb3BlcmF0aW9ucyAocmVhZHMsIHdyaXRlcywgY29tbWl0cylcbiAgICogb24gZXZlcnkgc3RhZ2Ugc2NvcGUuIENhbGwgYmVmb3JlIHJ1bigpLiAqKklkZW1wb3RlbnQgYnkgYGlkYCoqIChyZXBsYWNlZCxcbiAgICogbmV2ZXIgZHVwbGljYXRlZCkuIGB7IGRlbGl2ZXJ5OiAnZGVmZXJyZWQnIH1gIG1vdmVzIGl0IG9mZiB0aGUgaG90IHBhdGgg4oCUXG4gICAqIGRlbGl2ZXJlZCBhdCB0aGUgbmV4dCBtaWNyb3Rhc2sgY2hlY2twb2ludDsgcmUtYXR0YWNoaW5nIGFuIGlkIG9uIHRoZVxuICAgKiBvdGhlciB0aWVyIFNXQVBTIHRpZXJzIChgZG9jcy9ndWlkZXMvb2JzZXJ2ZXJzLWRlZmVycmVkLm1kYCkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoKSk7XG4gICAqIGV4ZWN1dG9yLmF0dGFjaFNjb3BlUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCdteS1tZXRyaWNzJykpOyAvLyByZXBsYWNlcyBzYW1lIGlkXG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcjogU2NvcGVSZWNvcmRlciwgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMub2JzZXJ2ZXJzLmF0dGFjaFNjb3BlKHJlY29yZGVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIHNjb3BlIFJlY29yZGVycyB3aXRoIHRoZSBnaXZlbiBJRCDigJQgYm90aCBkZWxpdmVyeSB0aWVycy4gKi9cbiAgZGV0YWNoU2NvcGVSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlcnMuZGV0YWNoU2NvcGUoaWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCBzY29wZSBSZWNvcmRlcnMgKGJvdGggdGllcnMpLiAqL1xuICBnZXRTY29wZVJlY29yZGVycygpOiBTY29wZVJlY29yZGVyW10ge1xuICAgIHJldHVybiB0aGlzLm9ic2VydmVycy5zY29wZUxpc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBGbG93UmVjb3JkZXIgdG8gb2JzZXJ2ZSBjb250cm9sIGZsb3cgZXZlbnRzLiBBdXRvbWF0aWNhbGx5XG4gICAqIGVuYWJsZXMgbmFycmF0aXZlLiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkuIElkZW1wb3RlbnQgYnkgYGlkYDtcbiAgICogYHsgZGVsaXZlcnk6ICdkZWZlcnJlZCcgfWAgYXMgZm9yIGBhdHRhY2hTY29wZVJlY29yZGVyYC5cbiAgICovXG4gIGF0dGFjaEZsb3dSZWNvcmRlcihyZWNvcmRlcjogRmxvd1JlY29yZGVyLCBvcHRpb25zPzogQXR0YWNoUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlcnMuYXR0YWNoRmxvdyhyZWNvcmRlciwgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogRGV0YWNoIGFsbCBGbG93UmVjb3JkZXJzIHdpdGggdGhlIGdpdmVuIElEIOKAlCBib3RoIGRlbGl2ZXJ5IHRpZXJzLiAqL1xuICBkZXRhY2hGbG93UmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMub2JzZXJ2ZXJzLmRldGFjaEZsb3coaWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCBGbG93UmVjb3JkZXJzIChib3RoIHRpZXJzKS4gKi9cbiAgZ2V0Rmxvd1JlY29yZGVycygpOiBGbG93UmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLmZsb3dMaXN0KCk7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIGEgcmVjb3JkZXIgdG8gZXZlcnkgY2hhbm5lbCAoc2NvcGUsIGZsb3csIGVtaXQpIGl0IGhhcyBPV04gYG9uKmBcbiAgICogbWV0aG9kcyBmb3Ig4oCUIHByZWZlcnJlZCBvdmVyIHNpbmdsZS1jaGFubmVsIGNhbGxzLCB3aGVyZSBmb3JnZXR0aW5nIG9uZVxuICAgKiBzaWxlbnRseSBsb3NlcyBldmVudHMuIElkZW1wb3RlbnQgYnkgYGlkYCBhY3Jvc3MgYWxsIGNoYW5uZWxzOyBhIGZsb3dcbiAgICogbWV0aG9kIGVuYWJsZXMgdGhlIG5hcnJhdGl2ZTsgYGRlbGl2ZXJ5YCBjb21lcyBmcm9tIHRoZSBvcHRpb25zIG9yIHRoZVxuICAgKiByZWNvcmRlcidzIG93biBmaWVsZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBhdWRpdDogQ29tYmluZWRSZWNvcmRlciA9IHtcbiAgICogICBpZDogJ2F1ZGl0JyxcbiAgICogICBvbldyaXRlOiAoZSkgPT4gbG9nKCdzY29wZSB3cml0ZScsIGUua2V5KSxcbiAgICogICBvbkRlY2lzaW9uOiAoZSkgPT4gbG9nKCdyb3V0ZWQgdG8nLCBlLmNob3NlbiksXG4gICAqIH07XG4gICAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIoYXVkaXQpO1xuICAgKiBgYGBcbiAgICovXG4gIGF0dGFjaENvbWJpbmVkUmVjb3JkZXIocmVjb3JkZXI6IENvbWJpbmVkUmVjb3JkZXIsIG9wdGlvbnM/OiBBdHRhY2hSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLm9ic2VydmVycy5hdHRhY2hDb21iaW5lZChyZWNvcmRlciwgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogRGV0YWNoIGEgY29tYmluZWQgcmVjb3JkZXIgZnJvbSBldmVyeSBjaGFubmVsIGl0IHdhcyBhdHRhY2hlZCB0byAoc2FmZSBpZiBuZXZlciBhdHRhY2hlZCkuICovXG4gIGRldGFjaENvbWJpbmVkUmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWNoU2NvcGVSZWNvcmRlcihpZCk7XG4gICAgdGhpcy5kZXRhY2hGbG93UmVjb3JkZXIoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhbiBgRW1pdFJlY29yZGVyYCBmb3IgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYCBldmVudHMuIEl0IHJpZGVzXG4gICAqIHRoZSBzY29wZSBsaXN0LCBzbyBgb25FbWl0YCBmaXJlcyBleGFjdGx5IG9uY2UgcGVyIGV2ZW50LiBJZGVtcG90ZW50IGJ5IGBpZGAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogZXhlY3V0b3IuYXR0YWNoRW1pdFJlY29yZGVyKHtcbiAgICogICBpZDogJ3Rva2VuLW1ldGVyJyxcbiAgICogICBvbkVtaXQ6IChlKSA9PiB7XG4gICAqICAgICBpZiAoZS5uYW1lID09PSAnYWdlbnRmb290cHJpbnQubGxtLnRva2VucycpIHRyYWNrVG9rZW5zKGUucGF5bG9hZCk7XG4gICAqICAgfSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoRW1pdFJlY29yZGVyKHJlY29yZGVyOiBFbWl0UmVjb3JkZXIsIG9wdGlvbnM/OiBBdHRhY2hSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLmF0dGFjaFNjb3BlUmVjb3JkZXIocmVjb3JkZXIgYXMgU2NvcGVSZWNvcmRlciwgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogRGV0YWNoIGFuIGBFbWl0UmVjb3JkZXJgIGJ5IGlkLiBTYWZlIHRvIGNhbGwgaWYgbmV2ZXIgYXR0YWNoZWQuICovXG4gIGRldGFjaEVtaXRSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhY2hTY29wZVJlY29yZGVyKGlkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgcmVjb3JkZXJzIChib3RoIHRpZXJzKSB0aGF0IGltcGxlbWVudCBgb25FbWl0YC4gKi9cbiAgZ2V0RW1pdFJlY29yZGVycygpOiBFbWl0UmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0U2NvcGVSZWNvcmRlcnMoKS5maWx0ZXIoXG4gICAgICAocik6IHIgaXMgRW1pdFJlY29yZGVyID0+IHR5cGVvZiAociBhcyB7IG9uRW1pdD86IHVua25vd24gfSkub25FbWl0ID09PSAnZnVuY3Rpb24nLFxuICAgICk7XG4gIH1cblxuICAvLyDilIDilIDilIAgRGV0YWNoIChUNCkg4pSA4pSA4pSAXG4gIC8vIEJhcmUtZXhlY3V0b3IgZW50cnkgcG9pbnRzIGZvciBmaXJlLWFuZC1mb3JnZXQgY2hpbGQgY2hhcnRzLiBGcm9tIGluc2lkZSBhXG4gIC8vIHN0YWdlIHVzZSBgc2NvcGUuJGRldGFjaEFuZEpvaW5MYXRlciguLi4pYCAvIGBzY29wZS4kZGV0YWNoQW5kRm9yZ2V0KC4uLilgLFxuICAvLyB3aGljaCBtaW50IHJlZklkcyBmcm9tIHRoZSBjYWxsaW5nIHN0YWdlOyB0aGVzZSB1c2UgYF9fZXhlY3V0b3JfX2AuXG5cbiAgLyoqXG4gICAqIERldGFjaCBhIGNoaWxkIGZsb3djaGFydCBvbiB0aGUgZ2l2ZW4gZHJpdmVyIGFuZCByZXR1cm4gYSBgRGV0YWNoSGFuZGxlYFxuICAgKiB0aGUgY2FsbGVyIGNhbiBgd2FpdCgpYCBvbiAoUHJvbWlzZSkgb3IgcmVhZCBgLnN0YXR1c2AgZnJvbSAoc3luYykuIFRoZVxuICAgKiBkcml2ZXIgaXMgUkVRVUlSRUQg4oCUIHRoZXJlIGlzIG5vIGxpYnJhcnkgZGVmYXVsdC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQgeyBtaWNyb3Rhc2tCYXRjaERyaXZlciB9IGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCc7XG4gICAqXG4gICAqIGNvbnN0IGV4ZWMgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IocGFyZW50Q2hhcnQpO1xuICAgKiBjb25zdCBoYW5kbGUgPSBleGVjLmRldGFjaEFuZEpvaW5MYXRlcihtaWNyb3Rhc2tCYXRjaERyaXZlciwgdGVsZW1ldHJ5Q2hhcnQsIHsgZXZlbnQ6ICd4JyB9KTtcbiAgICogYXdhaXQgaGFuZGxlLndhaXQoKTsgLy8gb3B0aW9uYWxcbiAgICogYGBgXG4gICAqL1xuICBkZXRhY2hBbmRKb2luTGF0ZXIoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hIYW5kbGUge1xuICAgIHJldHVybiBfZGV0YWNoQW5kSm9pbkxhdGVyKGRyaXZlciwgY2hpbGQsIGlucHV0LCAnX19leGVjdXRvcl9fJyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0YWNoIGEgY2hpbGQgZmxvd2NoYXJ0IG9uIHRoZSBnaXZlbiBkcml2ZXIgYW5kIERJU0NBUkQgdGhlIGhhbmRsZSDigJQgZm9yXG4gICAqIGZpcmUtYW5kLWZvcmdldCBzaWRlIGVmZmVjdHMuIEEgY2hpbGQncyBlcnJvciBsYW5kcyBvbiB0aGUgZGlzY2FyZGVkIGhhbmRsZTtcbiAgICogZm9yIG9ic2VydmFibGUgZGV0YWNoIHByZWZlciBgZGV0YWNoQW5kSm9pbkxhdGVyYCArIGAud2FpdCgpLmNhdGNoKClgLlxuICAgKi9cbiAgZGV0YWNoQW5kRm9yZ2V0KFxuICAgIGRyaXZlcjogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hEcml2ZXIsXG4gICAgY2hpbGQ6IGltcG9ydCgnLi4vYnVpbGRlci90eXBlcy5qcycpLkZsb3dDaGFydCxcbiAgICBpbnB1dD86IHVua25vd24sXG4gICk6IHZvaWQge1xuICAgIF9kZXRhY2hBbmRGb3JnZXQoZHJpdmVyLCBjaGlsZCwgaW5wdXQsICdfX2V4ZWN1dG9yX18nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZXhlY3V0b3Itb3duZWQgbmFycmF0aXZlIHZpZXc7IGAubWFwKGUgPT4gZS50ZXh0KWAgZm9yIGZsYXQgc3RyaW5ncy5cbiAgICogYGVuYWJsZU5hcnJhdGl2ZShvcHRpb25zKWAgY29uZmlndXJlcyB0aGlzIHZpZXcuIEF0dGFjaGluZyBhIGZsb3cgcmVjb3JkZXJcbiAgICogYWxzbyBlbmFibGVzIGl0LCBidXQgdGhhdCByZWNvcmRlcidzIG9wdGlvbnMgYW5kIGVudHJpZXMgcmVtYWluIGluZGVwZW5kZW50XG4gICAqIChyZWFkIGFuIGF0dGFjaGVkIGBuYXJyYXRpdmUoKWAgaW5zdGFuY2Ugd2l0aCBgcmVjb3JkZXIuZ2V0RW50cmllcygpYCkuXG4gICAqIFNhbWUtZXhlY3V0b3IgcmVzdW1lIHJldGFpbnMgaGlzdG9yeTsgYSBmcmVzaCBleGVjdXRvciByZWNvcmRzIGl0cyByZXN1bWVkXG4gICAqIGxlZyBvbmx5LiBUaGUgaW50ZXJuYWwgbmFycmF0b3IgaXMgbm90IGFuIGF0dGFjaGVkIHNuYXBzaG90IHJlY29yZGVyIHJvdy5cbiAgICovXG4gIGdldE5hcnJhdGl2ZUVudHJpZXMoKTogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdIHtcbiAgICBpZiAodGhpcy5vYnNlcnZlcnMuY29tYmluZWRSZWNvcmRlcikge1xuICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLmNvbWJpbmVkUmVjb3JkZXIuZ2V0RW50cmllcygpO1xuICAgIH1cbiAgICBjb25zdCBmbG93U2VudGVuY2VzID0gdGhpcy50cmF2ZXJzZXIuZ2V0TmFycmF0aXZlKCk7XG4gICAgcmV0dXJuIGZsb3dTZW50ZW5jZXMubWFwKCh0ZXh0KSA9PiAoeyB0eXBlOiAnc3RhZ2UnIGFzIGNvbnN0LCB0ZXh0LCBkZXB0aDogMCB9KSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSB0aGUgY2hhcnQuIFJlc29sdmVzIHdoZW4gdGhlIHJ1biBmaW5pc2hlcyDigJQgb3IgcGF1c2VzLCBpZiBhXG4gICAqIHBhdXNhYmxlIHN0YWdlIHJldHVybmVkIGRhdGEgKGNoZWNrIGBpc1BhdXNlZCgpYCBhZnRlcndhcmQpLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBgeyBpbnB1dCwgZW52IH1gIOKAlCBgaW5wdXRgIGlzIHRoZSBmcm96ZW4gYnVzaW5lc3MgaW5wdXRcbiAgICogICAocmVhZCBpbiBhIHN0YWdlIHZpYSBgc2NvcGUuJGdldEFyZ3MoKWApOyBgZW52YCBpcyBpbmZyYXN0cnVjdHVyZSBjb250ZXh0XG4gICAqICAgbGlrZSBgeyBzaWduYWwsIHRpbWVvdXRNcywgdHJhY2VJZCB9YCAocmVhZCB2aWEgYHNjb3BlLiRnZXRFbnYoKWApLlxuICAgKlxuICAgKiBBZnRlciBpdCByZXNvbHZlcywgcmVhZCByZXN1bHRzIG9mZiB0aGUgZXhlY3V0b3I6XG4gICAqIC0gYGdldFNuYXBzaG90KClgIOKAlCBmdWxsIHN0YXRlLCBjb21taXQgbG9nLCBleGVjdXRpb24gdHJlZS5cbiAgICogLSBgZ2V0TmFycmF0aXZlRW50cmllcygpYCDigJQgdGhlIHBsYWluLUVuZ2xpc2ggdHJhY2UgKGNhbGwgYGVuYWJsZU5hcnJhdGl2ZSgpYFxuICAgKiAgIG9yIGF0dGFjaCBhIGBuYXJyYXRpdmUoKWAgcmVjb3JkZXIgZmlyc3QpLlxuICAgKiAtIGBpc1BhdXNlZCgpYCDigJQgdHJ1ZSBpZiBhIHN0YWdlIHBhdXNlZDsgdGhlbiB1c2UgYGdldENoZWNrcG9pbnQoKWAgLyBgcmVzdW1lKClgLlxuICAgKlxuICAgKiBPbmUgcnVuIGF0IGEgdGltZSBwZXIgZXhlY3V0b3Ig4oCUIGl0IGhvbGRzIHBlci1ydW4gc3RhdGUgKHJ1bklkLCByZWNvcmRlcnMsXG4gICAqIGNoZWNrcG9pbnQpLiBDcmVhdGUgb25lIGV4ZWN1dG9yIHBlciBjb25jdXJyZW50IHJ1bi5cbiAgICovXG4gIGFzeW5jIHJ1bihvcHRpb25zPzogUnVuT3B0aW9ucyk6IFByb21pc2U8RXhlY3V0b3JSZXN1bHQ+IHtcbiAgICAvLyBBIGZhaWxlZCBlbnRyeSBsZWF2ZXMgbm8gc2lkZSBlZmZlY3RzOiB0aGUgZ3VhcmQgRklSU1QgKHRoZSBpbi1mbGlnaHRcbiAgICAvLyBydW4gc3RheXMgdW50b3VjaGVkKSwgdmFsaWRhdGlvbiBiZWZvcmUgdGhlIHRpbWVvdXQgdGltZXIgZXhpc3RzLlxuICAgIHRoaXMuYXNzZXJ0SWRsZSgncnVuJyk7XG4gICAgbGV0IHZhbGlkYXRlZElucHV0ID0gb3B0aW9ucz8uaW5wdXQ7XG4gICAgaWYgKHZhbGlkYXRlZElucHV0ICYmIHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQuaW5wdXRTY2hlbWEpIHtcbiAgICAgIHZhbGlkYXRlZElucHV0ID0gdmFsaWRhdGVJbnB1dCh0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmlucHV0U2NoZW1hLCB2YWxpZGF0ZWRJbnB1dCk7XG4gICAgfVxuXG4gICAgbGV0IHNpZ25hbCA9IG9wdGlvbnM/LnNpZ25hbDtcbiAgICBsZXQgdGltZW91dElkOiBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0PiB8IHVuZGVmaW5lZDtcbiAgICBpZiAob3B0aW9ucz8udGltZW91dE1zICYmICFzaWduYWwpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBzaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbDtcbiAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoXG4gICAgICAgICgpID0+IGNvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKGBFeGVjdXRpb24gdGltZWQgb3V0IGFmdGVyICR7b3B0aW9ucy50aW1lb3V0TXN9bXNgKSksXG4gICAgICAgIG9wdGlvbnMudGltZW91dE1zLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLm9ic2VydmVycy5jbGVhckZvclJ1bigpOyAvLyBubyBjcm9zcy1ydW4gYWNjdW11bGF0aW9uXG4gICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9leGVjdXRpb25Db3VudGVyID0geyB2YWx1ZTogMCB9O1xuICAgIHRoaXMuX3Zpc2l0Q291bnRzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuX2N1cnJlbnRSdW5JZCA9IGdlbmVyYXRlUnVuSWQoKTtcbiAgICB0aGlzLl9oYXNSdW5CZWZvcmUgPSB0cnVlOyAvLyBhIGxhdGVyIHJlc3VtZSgpIHJldXNlcyB0aGlzIHJ1bnRpbWVcbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKFxuICAgICAgc2lnbmFsLFxuICAgICAgdmFsaWRhdGVkSW5wdXQsXG4gICAgICBvcHRpb25zPy5lbnYsXG4gICAgICBvcHRpb25zPy5tYXhEZXB0aCxcbiAgICAgIG9wdGlvbnM/Lm1heEl0ZXJhdGlvbnMsXG4gICAgKTtcbiAgICAvLyBBZnRlciBldmVyeSBzeW5jIHRocm93LCB3aXRoIG5vIGF3YWl0IHNpbmNlIHRoZSBndWFyZDogcmFjZS1mcmVlLlxuICAgIHRoaXMuX2lzRXhlY3V0aW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50cmF2ZXJzZXIuZXhlY3V0ZSgpO1xuICAgICAgLy8gVGVybWluYWwgZmx1c2ggKFJGQy0wMDEgQmxvY2sgOCk6IFwib25lIGJlYXQgYmVoaW5kXCIgbmV2ZXIgYmVjb21lcyBcImxvc3QgYXQgZXhpdFwiLlxuICAgICAgdGhpcy5vYnNlcnZlcnMuZGVmZXJyZWRUaWVyPy50ZXJtaW5hbEZsdXNoKCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICByZXR1cm4gdGhpcy5wYXVzZWRPclRocm93KGVycm9yKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5faXNFeGVjdXRpbmcgPSBmYWxzZTtcbiAgICAgIGlmICh0aW1lb3V0SWQgIT09IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZsdXNoIHRoZSBkZWZlcnJlZC1vYnNlcnZlciBiYWNrbG9nLCB0aGVuIGF3YWl0IGFzeW5jIGxpc3RlbmVyIGNvbXBsZXRpb25zXG4gICAqIHVuZGVyIGEgZGVhZGxpbmUg4oCUIGNhbGwgYmVmb3JlIGEgc2VydmVybGVzcyBwcm9jZXNzIGZyZWV6ZXMgb3IgZXhpdHMuXG4gICAqIFplcm9zIHdoZW4gbm8gZGVmZXJyZWQgb2JzZXJ2ZXIgd2FzIGF0dGFjaGVkOyBgcGVuZGluZyA+IDBgIHJlcG9ydHMgd2hhdFxuICAgKiB3YXMgc3RpbGwgb3V0c3RhbmRpbmcgYXQgdGhlIGRlYWRsaW5lLlxuICAgKi9cbiAgZHJhaW5PYnNlcnZlcnMob3B0cz86IHsgdGltZW91dE1zPzogbnVtYmVyIH0pOiBQcm9taXNlPE9ic2VydmVyRHJhaW5SZXN1bHQ+IHtcbiAgICBjb25zdCB0aWVyID0gdGhpcy5vYnNlcnZlcnMuZGVmZXJyZWRUaWVyO1xuICAgIGlmICghdGllcikgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7IGRvbmU6IDAsIGZhaWxlZDogMCwgcGVuZGluZzogMCB9KTtcbiAgICByZXR1cm4gdGllci5kcmFpbihvcHRzKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBJbnRyb3NwZWN0aW9uIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5yZWRhY3QgIGB0cnVlYCBzZXJ2ZXMgYHNoYXJlZFN0YXRlYCAoYW5kIGVhY2ggc3ViZmxvdydzXG4gICAqICAgYGdsb2JhbENvbnRleHRgKSBmcm9tIHRoZSByZWRhY3RlZCBtaXJyb3Ig4oCUIHRoZSBzYWZlIHZpZXcgdG8gZXhwb3J0LiBBXG4gICAqICAgbm8tb3Agd2l0aG91dCBhIHJlZGFjdGlvbiBwb2xpY3kuIFRoZSBjb21taXQgbG9nIGlzIHJlZGFjdGVkIGF0IHdyaXRlXG4gICAqICAgdGltZSByZWdhcmRsZXNzLiBEZWZhdWx0IGBmYWxzZWAuXG4gICAqXG4gICAqICoqVHJlYXQgYHNoYXJlZFN0YXRlYCBhcyBSRUFELU9OTFkuKiogSW4gcHJvZHVjdGlvbiBpdCBpcyBhIGxpdmUgdmlldyBvZlxuICAgKiBlbmdpbmUgbWVtb3J5OyBpbiBkZXYgbW9kZSBhIGRlZXAtZnJvemVuIGNsb25lLCBzbyBhIG11dGF0aW9uIHRocm93cy5cbiAgICovXG4gIGdldFNuYXBzaG90KG9wdGlvbnM/OiB7IHJlZGFjdD86IGJvb2xlYW4gfSk6IFJ1bnRpbWVTbmFwc2hvdCB7XG4gICAgcmV0dXJuIHNlcnZlZFNuYXBzaG90KHRoaXMudHJhdmVyc2VyLCB0aGlzLm9ic2VydmVycywgb3B0aW9ucyk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWUoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc2V0Um9vdE9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy50cmF2ZXJzZXIuc2V0Um9vdE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0QnJhbmNoSWRzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRCcmFuY2hJZHMoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UnVudGltZVJvb3QoKTogU3RhZ2VOb2RlIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZVJvb3QoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UnVudGltZVN0cnVjdHVyZSgpOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lU3RydWN0dXJlKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFN1YmZsb3dSZXN1bHRzKCk6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0U3ViZmxvd1Jlc3VsdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdWJmbG93IG1hbmlmZXN0IGZyb20gYW4gYXR0YWNoZWQgTWFuaWZlc3RGbG93UmVjb3JkZXIuXG4gICAqIFJldHVybnMgZW1wdHkgYXJyYXkgaWYgbm8gTWFuaWZlc3RGbG93UmVjb3JkZXIgaXMgYXR0YWNoZWQuXG4gICAqL1xuICBnZXRTdWJmbG93TWFuaWZlc3QoKTogTWFuaWZlc3RFbnRyeVtdIHtcbiAgICBjb25zdCByZWNvcmRlciA9IHRoaXMub2JzZXJ2ZXJzLmZsb3dSZWNvcmRlcnMuZmluZCgocikgPT4gciBpbnN0YW5jZW9mIE1hbmlmZXN0Rmxvd1JlY29yZGVyKSBhc1xuICAgICAgfCBNYW5pZmVzdEZsb3dSZWNvcmRlclxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlY29yZGVyPy5nZXRNYW5pZmVzdCgpID8/IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGZ1bGwgc3BlYyBmb3IgYSBkeW5hbWljYWxseS1yZWdpc3RlcmVkIHN1YmZsb3cuXG4gICAqIFJlcXVpcmVzIGFuIGF0dGFjaGVkIE1hbmlmZXN0Rmxvd1JlY29yZGVyIHRoYXQgb2JzZXJ2ZWQgdGhlIHJlZ2lzdHJhdGlvbi5cbiAgICovXG4gIGdldFN1YmZsb3dTcGVjKHN1YmZsb3dJZDogc3RyaW5nKTogdW5rbm93biB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLm9ic2VydmVycy5mbG93UmVjb3JkZXJzLmZpbmQoKHIpID0+IHIgaW5zdGFuY2VvZiBNYW5pZmVzdEZsb3dSZWNvcmRlcikgYXNcbiAgICAgIHwgTWFuaWZlc3RGbG93UmVjb3JkZXJcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWNvcmRlcj8uZ2V0U3BlYyhzdWJmbG93SWQpO1xuICB9XG59XG4iXX0=
|
|
584
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7OztBQUtILGlEQUFvSDtBQUtwSCxtR0FBNkY7QUFFN0YscUZBQStFO0FBQy9FLGlEQVM0QjtBQUU1Qix5REFBdUQ7QUFDdkQseURBQW1EO0FBRW5ELGdEQUFrRDtBQUlsRCwyQ0FBMkM7QUFDM0MsbURBQXVEO0FBRXZELCtEQUErRTtBQUMvRSw2Q0FBcUc7QUFDckcsMkNBQXVFO0FBQ3ZFLHlDQUEyQztBQUMzQywrQ0FBK0M7QUFDL0MseURBQW1EO0FBRW5ELE1BQWEsaUJBQWlCO0lBQ3BCLFNBQVMsQ0FBbUM7SUFDcEQ7MkZBQ3VGO0lBQy9FLGlCQUFpQixHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxDQUFDO0lBQ2pDLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBa0IsQ0FBQztJQUNqRCx5RkFBeUY7SUFDakYsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUMzQixtRkFBbUY7SUFDbEUsU0FBUyxHQUFHLElBQUksd0JBQVksRUFBRSxDQUFDO0lBQ3hDLGVBQWUsQ0FBOEI7SUFDckQsaUZBQWlGO0lBQ3pFLGFBQWEsR0FBRyxJQUFJLDRCQUFhLEVBQUUsQ0FBQztJQUNwQyxjQUFjLENBQWtDO0lBQ3hEOzs7OztPQUtHO0lBQ0ssYUFBYSxHQUFHLEtBQUssQ0FBQztJQUM5Qjs7OztPQUlHO0lBQ0ssWUFBWSxHQUFHLEtBQUssQ0FBQztJQUVaLGFBQWEsQ0FBNkI7SUFFM0Q7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsWUFDRSxTQUFrQyxFQUNsQyxnQkFBMEU7UUFFMUUsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFBLGdDQUFtQixFQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3RF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Y3V0b3Ig4oCUIFB1YmxpYyBBUEkgZm9yIGV4ZWN1dGluZyBhIGNvbXBpbGVkIEZsb3dDaGFydC5cbiAqXG4gKiBXcmFwcyBGbG93Y2hhcnRUcmF2ZXJzZXIuIEJ1aWxkIGEgY2hhcnQgd2l0aCBmbG93Q2hhcnQoKSBhbmQgcGFzcyB0aGUgcmVzdWx0IGhlcmU6XG4gKlxuICogICBjb25zdCBjaGFydCA9IGZsb3dDaGFydCgnZW50cnknLCBlbnRyeUZuKS5hZGRGdW5jdGlvbigncHJvY2VzcycsIHByb2Nlc3NGbikuYnVpbGQoKTtcbiAqXG4gKiAgIC8vIE5vLW9wdGlvbnMgZm9ybSAodXNlcyBhdXRvLWRldGVjdGVkIFR5cGVkU2NvcGUgZmFjdG9yeSBmcm9tIHRoZSBjaGFydCk6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAqXG4gKiAgIC8vIE9wdGlvbnMtb2JqZWN0IGZvcm0gKHByZWZlcnJlZCB3aGVuIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBiZWhhdmlvcik6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHNjb3BlRmFjdG9yeTogbXlGYWN0b3J5IH0pO1xuICpcbiAqICAgLy8gMi1wYXJhbSBmb3JtIChhY2NlcHRzIGEgU2NvcGVGYWN0b3J5IGRpcmVjdGx5LCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSk6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCBteUZhY3RvcnkpO1xuICpcbiAqXG4gKiBUaGUgZXhlY3V0b3IgY29tcG9zZXMgZm91ciBtb2R1bGVzLCBvbmUgam9iIGVhY2ggKEY5KTogYGF0dGFjaC50c2AgKHdob1xuICogb2JzZXJ2ZXMgYSBydW4pLCBgcmVzdW1lLnRzYCAocGxhbiBhbmQgYW5ub3VuY2UgYSByZS1lbnRyeSksIGBjaGVja3BvaW50LnRzYFxuICogKHRoZSBwYXVzZSBjaGVja3BvaW50KSwgYHNuYXBzaG90LnRzYCAod2hhdCBgZ2V0U25hcHNob3QoKWAgc2VydmVzKS4gV2hhdFxuICogc3RheXMgaGVyZSBpcyB0aGUgcGVyLXJ1biBzdGF0ZSBhbmQgdGhlIHJ1biBsaWZlY3ljbGUgdGhhdCB0aHJlYWRzIGl0LlxuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dDogZGF0YSwgZW52OiB7IHRyYWNlSWQ6ICdyZXEtMTIzJyB9IH0pO1xuICovXG5cbmltcG9ydCB0eXBlIHsgQ29tbWl0VmFsdWVzTW9kZSB9IGZyb20gJ2Zvb3R0cmFjZSc7XG5cbmltcG9ydCB0eXBlIHsgRmxvd0NoYXJ0IH0gZnJvbSAnLi4vYnVpbGRlci90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZXRhY2hBbmRGb3JnZXQgYXMgX2RldGFjaEFuZEZvcmdldCwgZGV0YWNoQW5kSm9pbkxhdGVyIGFzIF9kZXRhY2hBbmRKb2luTGF0ZXIgfSBmcm9tICcuLi9kZXRhY2gvc3Bhd24uanMnO1xuaW1wb3J0IHR5cGUgeyBSZXN1bWVFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9oYW5kbGVycy9SZXN1bWVFbnRyeS5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvbmFycmF0aXZlVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdEVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9yZWNvcmRlcnMvTWFuaWZlc3RGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgTWFuaWZlc3RGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3JlY29yZGVycy9NYW5pZmVzdEZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgRmxvd2NoYXJ0VHJhdmVyc2VyIH0gZnJvbSAnLi4vZW5naW5lL3RyYXZlcnNhbC9GbG93Y2hhcnRUcmF2ZXJzZXIuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBFeGVjdXRvclJlc3VsdCxcbiAgdHlwZSBQYXVzZWRSZXN1bHQsXG4gIHR5cGUgUnVuT3B0aW9ucyxcbiAgdHlwZSBTY29wZUZhY3RvcnksXG4gIHR5cGUgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICB0eXBlIFN0YWdlTm9kZSxcbiAgdHlwZSBTdWJmbG93UmVzdWx0LFxuICBkZWZhdWx0TG9nZ2VyLFxufSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWFkVHJhY2tpbmdNb2RlLCBXcml0ZVRyYWNraW5nTW9kZSB9IGZyb20gJy4uL21lbW9yeS9mcmFtZVR5cGVzLmpzJztcbmltcG9ydCB7IFJlZGFjdGlvblJ1bGUgfSBmcm9tICcuLi9tZW1vcnkvcmVkYWN0aW9uLmpzJztcbmltcG9ydCB7IHJ1blBvbGljeSB9IGZyb20gJy4uL21lbW9yeS9ydW5Qb2xpY3kuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93Y2hhcnRDaGVja3BvaW50LCBSZWRhY3Rpb25NYXJrcyB9IGZyb20gJy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IGlzUGF1c2VTaWduYWwgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkUmVjb3JkZXIgfSBmcm9tICcuLi9yZWNvcmRlci9Db21iaW5lZFJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi4vcmVjb3JkZXIvRW1pdFJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uUG9saWN5LCBSZWRhY3Rpb25SZXBvcnQsIFNjb3BlUmVjb3JkZXIgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBSdW5PYnNlcnZlcnMgfSBmcm9tICcuL2F0dGFjaC5qcyc7XG5pbXBvcnQgeyBidWlsZFBhdXNlQ2hlY2twb2ludCB9IGZyb20gJy4vY2hlY2twb2ludC5qcyc7XG5pbXBvcnQgdHlwZSB7IEF0dGFjaFJlY29yZGVyT3B0aW9ucywgT2JzZXJ2ZXJEcmFpblJlc3VsdCB9IGZyb20gJy4vRGVmZXJyZWRPYnNlcnZlclRpZXIuanMnO1xuaW1wb3J0IHsgdHlwZSBSdW50aW1lU25hcHNob3QsIEV4ZWN1dGlvblJ1bnRpbWUgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUuanMnO1xuaW1wb3J0IHsgdHlwZSBFeGVjdXRvckFyZ3MsIHR5cGUgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zLCByZXNvbHZlRXhlY3V0b3JBcmdzIH0gZnJvbSAnLi9vcHRpb25zLmpzJztcbmltcG9ydCB7IGFubm91bmNlUmVzdW1lLCBwbGFuUmVzdW1lLCBzZWVkQ291bnRlcnMgfSBmcm9tICcuL3Jlc3VtZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJ1bklkIH0gZnJvbSAnLi9ydW5JZC5qcyc7XG5pbXBvcnQgeyBzZXJ2ZWRTbmFwc2hvdCB9IGZyb20gJy4vc25hcHNob3QuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVJbnB1dCB9IGZyb20gJy4vdmFsaWRhdGVJbnB1dC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBGbG93Q2hhcnRFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSB0cmF2ZXJzZXI6IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+O1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIGFuZCBwZXItc3RhZ2UgdmlzaXQgY291bnRzIChsb29wSXRlcmF0aW9uKSDigJQgc2hhcmVkIEJZXG4gICAqICBSRUZFUkVOQ0Ugd2l0aCBldmVyeSB0cmF2ZXJzZXIgb2YgdGhlIHJ1bjsgc3Vydml2ZSBwYXVzZS9yZXN1bWUsIHJlc2V0IG9uIHJ1bigpLiAqL1xuICBwcml2YXRlIF9leGVjdXRpb25Db3VudGVyID0geyB2YWx1ZTogMCB9O1xuICBwcml2YXRlIF92aXNpdENvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIC8qKiBGcmVzaCBwZXIgcnVuKCkgYW5kIHBlciByZXN1bWUoKSDigJQgc3RhbXBlZCBvbiBldmVyeSBUcmF2ZXJzYWxDb250ZXh0IChgcnVuSWQudHNgKS4gKi9cbiAgcHJpdmF0ZSBfY3VycmVudFJ1bklkID0gJyc7XG4gIC8qKiBXaG8gb2JzZXJ2ZXMgdGhlIHJ1biDigJQgbmFycmF0aXZlLCBpbmxpbmUgbGlzdHMsIGRlZmVycmVkIHRpZXIgKGBhdHRhY2gudHNgKS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBvYnNlcnZlcnMgPSBuZXcgUnVuT2JzZXJ2ZXJzKCk7XG4gIHByaXZhdGUgcmVkYWN0aW9uUG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQ7XG4gIC8qKiBUaGUgcnVuJ3MgT05FIHJlZGFjdGlvbiBydWxlIChgbWVtb3J5L3JlZGFjdGlvbi50c2ApLCBidWlsdCBmcmVzaCBwZXIgbGVnLiAqL1xuICBwcml2YXRlIHJlZGFjdGlvblJ1bGUgPSBuZXcgUmVkYWN0aW9uUnVsZSgpO1xuICBwcml2YXRlIGxhc3RDaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50IHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogYHRydWVgIG9uY2UgcnVuKCkgKG9yIGEgcmVzdW1lKSBleGVjdXRlZCBoZXJlLiBgcmVzdW1lKClgIGJyYW5jaGVzIG9uIGl0OlxuICAgKiB0cnVlIOKGkiByZXVzZSB0aGUgcnVudGltZSAoZXhlY3V0aW9uIHRyZWUsIHJlY29yZGVycywgbmFycmF0aXZlIGFjY3VtdWxhdGUpO1xuICAgKiBmYWxzZSDihpIgc2VlZCBhIGZyZXNoIHJ1bnRpbWUgZnJvbSBgY2hlY2twb2ludC5zaGFyZWRTdGF0ZWAgKGNyb3NzLWV4ZWN1dG9yXG4gICAqIHJlc3VtZSkuIFNlZSBgdGVzdC9saWIvcGF1c2UvY3Jvc3MtZXhlY3V0b3ItcmVzdW1lLnRlc3QudHNgLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFzUnVuQmVmb3JlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBSZS1lbnRyYW5jeSBndWFyZDogcnVuKCkvcmVzdW1lKCkgbXV0YXRlIHBlci1ydW4gc3RhdGUgKHRyYXZlcnNlciwgcnVuSWQsXG4gICAqIGNvdW50ZXJzLCBjaGVja3BvaW50LCByZWNvcmRlcnMpIOKAlCBvbmUgZXhlY3V0b3IgPSBvbmUgaW4tZmxpZ2h0IGV4ZWN1dGlvbi5cbiAgICogU2VlIGRvY3MvZ3VpZGVzL2V4ZWN1dGlvbi1tb2RlbC5tZC5cbiAgICovXG4gIHByaXZhdGUgX2lzRXhlY3V0aW5nID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBmbG93Q2hhcnRBcmdzOiBFeGVjdXRvckFyZ3M8VE91dCwgVFNjb3BlPjtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgRmxvd0NoYXJ0RXhlY3V0b3IuXG4gICAqXG4gICAqICoqT3B0aW9ucyBvYmplY3QgZm9ybSoqIChwcmVmZXJyZWQpOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzY29wZUZhY3RvcnksIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0IH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiAqKjItcGFyYW0gZm9ybSoqIChhbHNvIHN1cHBvcnRlZCk6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCBzY29wZUZhY3RvcnkpXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gZmxvd0NoYXJ0IC0gVGhlIGNvbXBpbGVkIEZsb3dDaGFydCByZXR1cm5lZCBieSBgZmxvd0NoYXJ0KC4uLikuYnVpbGQoKWBcbiAgICogQHBhcmFtIGZhY3RvcnlPck9wdGlvbnMgLSBBIGBTY29wZUZhY3Rvcnk8VFNjb3BlPmAgT1IgYSBgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zPFRTY29wZT5gIG9wdGlvbnMgb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgZmxvd0NoYXJ0OiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBmYWN0b3J5T3JPcHRpb25zPzogU2NvcGVGYWN0b3J5PFRTY29wZT4gfCBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnM8VFNjb3BlPixcbiAgKSB7XG4gICAgdGhpcy5mbG93Q2hhcnRBcmdzID0gcmVzb2x2ZUV4ZWN1dG9yQXJncyhmbG93Q2hhcnQsIGZhY3RvcnlPck9wdGlvbnMpO1xuICAgIHRoaXMudHJhdmVyc2VyID0gdGhpcy5jcmVhdGVUcmF2ZXJzZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlVHJhdmVyc2VyKFxuICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICAgIHJlYWRPbmx5Q29udGV4dE92ZXJyaWRlPzogdW5rbm93bixcbiAgICBlbnY/OiBpbXBvcnQoJy4uL2VuZ2luZS90eXBlcy5qcycpLkV4ZWN1dGlvbkVudixcbiAgICBtYXhEZXB0aD86IG51bWJlcixcbiAgICBtYXhJdGVyYXRpb25zPzogbnVtYmVyLFxuICAgIG92ZXJyaWRlcz86IHtcbiAgICAgIGluaXRpYWxDb250ZXh0PzogdW5rbm93bjtcbiAgICAgIHByZXNlcnZlUmVjb3JkZXJzPzogYm9vbGVhbjtcbiAgICAgIGV4aXN0aW5nUnVudGltZT86IEluc3RhbmNlVHlwZTx0eXBlb2YgRXhlY3V0aW9uUnVudGltZT47XG4gICAgICAvKiogVGhlIHJlc3VtZSdzIG9uZS1zaG90IHJlLWVudHJ5IChgcmVzdW1lLnRzYCk7IHRoZSB0cmF2ZXJzZXIgc3RpbGwgd2Fsa3MgdGhlIFJFQUwgY2hhcnQuICovXG4gICAgICByZXN1bWU/OiBSZXN1bWVFbnRyeTxUT3V0LCBUU2NvcGU+O1xuICAgICAgLyoqIFRoZSByZWRhY3Rpb24gdGhlIHBhdXNlZCBydW4gaGFkIG1hZGUgKG5hbWVzIG9ubHkpIOKAlCB0aGUgcmVzdW1lZCBsZWcncyBydWxlIHN0YXJ0cyBmcm9tIGl0LiAqL1xuICAgICAgcmVkYWN0aW9uTWFya3M/OiBSZWRhY3Rpb25NYXJrcztcbiAgICB9LFxuICApOiBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuZmxvd0NoYXJ0QXJncztcbiAgICBjb25zdCBmYyA9IGFyZ3MuZmxvd0NoYXJ0O1xuICAgIGNvbnN0IG5hcnJhdGl2ZUZsYWcgPSB0aGlzLm9ic2VydmVycy5zdGFydExlZyhmYy5lbmFibGVOYXJyYXRpdmUgPz8gZmFsc2UsIG92ZXJyaWRlcz8ucHJlc2VydmVSZWNvcmRlcnMgPT09IHRydWUpO1xuXG4gICAgdGhpcy5yZWRhY3Rpb25SdWxlID0gbmV3IFJlZGFjdGlvblJ1bGUodGhpcy5yZWRhY3Rpb25Qb2xpY3kpO1xuICAgIC8vIEEgcmVzdW1lIGNvbnRpbnVlcyB0aGUgcGF1c2VkIHJ1bidzIHJlZGFjdGlvbjogYSBjb3B5IG1hc2tlZCBiZWZvcmUgdGhlIHBhdXNlIHN0YXlzIG1hc2tlZC5cbiAgICBpZiAob3ZlcnJpZGVzPy5yZWRhY3Rpb25NYXJrcykgdGhpcy5yZWRhY3Rpb25SdWxlLnJlc3RvcmVNYXJrcyhvdmVycmlkZXMucmVkYWN0aW9uTWFya3MpO1xuICAgIC8vIE9ORSBmYWN0b3J5OiB0aGUgYmFzZSBmYWN0b3J5LCB0aGVuIGV2ZXJ5IHNjb3BlIG1vZGlmaWVyIChyZWNvcmRlcnMsXG4gICAgLy8gZGVmZXJyZWQgdGFwLCByZWRhY3Rpb24pIGluIGEgZmxhdCBwYXNzIOKAlCBzZWUgYFJ1bk9ic2VydmVyc2AuXG4gICAgY29uc3Qgc2NvcGVGYWN0b3J5ID0gdGhpcy5vYnNlcnZlcnMuY29tcG9zZVNjb3BlRmFjdG9yeShcbiAgICAgIGFyZ3Muc2NvcGVGYWN0b3J5LFxuICAgICAgdGhpcy5yZWRhY3Rpb25Qb2xpY3ksXG4gICAgICB0aGlzLnJlZGFjdGlvblJ1bGUubWFya2VkS2V5cygpLFxuICAgICk7XG5cbiAgICAvLyBUaGUgZmlyc3Qgc3RhZ2UgdGhpcyB0cmF2ZXJzYWwgcnVuczogdGhlIHJlc3VtZSdzIGVudHJ5LCBlbHNlIHRoZSBjaGFydCByb290LlxuICAgIGNvbnN0IGVmZmVjdGl2ZVJvb3QgPSBvdmVycmlkZXM/LnJlc3VtZT8uc3RhcnQgPz8gZmMucm9vdDtcbiAgICBjb25zdCBlZmZlY3RpdmVJbml0aWFsQ29udGV4dCA9IG92ZXJyaWRlcz8uaW5pdGlhbENvbnRleHQgPz8gYXJncy5pbml0aWFsQ29udGV4dDtcblxuICAgIC8vIFRoZSBydW4ncyBwb2xpY3kgKEY1KTogdGhlIGRpYWxzLCB0aGUgcnVsZSAoaW5zdGFsbGVkIGV2ZW4gd2l0aG91dCBhXG4gICAgLy8gcG9saWN5IOKAlCBwZXItY2FsbCBgc2V0VmFsdWUoaywgdiwgdHJ1ZSlgIG1hcmtzIGxpdmUgb24gaXQpIGFuZCB0aGUgbWlycm9yXG4gICAgLy8gZmxhZyAoYSByZWRhY3RlZCBoZWFwLCBrZXB0IG9ubHkgdW5kZXIgYSBwb2xpY3kpLCBPTkUgZnJvemVuIG9iamVjdCBwZXJcbiAgICAvLyBsZWcgdGhhdCBldmVyeSBmcmFtZSBvZiB0aGUgcnVuIGhvbGRzIGJ5IHJlZmVyZW5jZS5cbiAgICBjb25zdCBwb2xpY3kgPSBydW5Qb2xpY3koYXJncy5kaWFscywgdGhpcy5yZWRhY3Rpb25SdWxlLCB0aGlzLnJlZGFjdGlvblBvbGljeSAhPT0gdW5kZWZpbmVkKTtcblxuICAgIGxldCBydW50aW1lOiBFeGVjdXRpb25SdW50aW1lO1xuICAgIGlmIChvdmVycmlkZXM/LmV4aXN0aW5nUnVudGltZSkge1xuICAgICAgLy8gU2FtZS1leGVjdXRvciByZXN1bWU6IHRoZSB0cmVlIGNvbnRpbnVlcyBmcm9tIHRoZSBsZWFmOyBnZXRTbmFwc2hvdCgpIGtlZXBzIHRoZSBmdWxsIHRyZWUuXG4gICAgICBydW50aW1lID0gb3ZlcnJpZGVzLmV4aXN0aW5nUnVudGltZTtcbiAgICAgIHJ1bnRpbWUucHJlc2VydmVTbmFwc2hvdFJvb3QoKTtcbiAgICAgIGxldCBsZWFmID0gcnVudGltZS5yb290U3RhZ2VDb250ZXh0O1xuICAgICAgd2hpbGUgKGxlYWYubmV4dCkgbGVhZiA9IGxlYWYubmV4dDtcbiAgICAgIHJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dCA9IGxlYWYuY3JlYXRlTmV4dCgnJywgZWZmZWN0aXZlUm9vdC5uYW1lLCBlZmZlY3RpdmVSb290LmlkKTtcbiAgICAgIHJ1bnRpbWUudXNlUG9saWN5KHBvbGljeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJ1bnRpbWUgPSBuZXcgRXhlY3V0aW9uUnVudGltZShcbiAgICAgICAgZWZmZWN0aXZlUm9vdC5uYW1lLFxuICAgICAgICBlZmZlY3RpdmVSb290LmlkLFxuICAgICAgICBhcmdzLmRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0LFxuICAgICAgICBlZmZlY3RpdmVJbml0aWFsQ29udGV4dCxcbiAgICAgICAgcG9saWN5LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+KHtcbiAgICAgIC8vIEFsd2F5cyB0aGUgUkVBTCBjaGFydDsgYSByZXN1bWUgb25seSBtb3ZlcyB3aGVyZSB0aGUgdHJhdmVyc2FsIFNUQVJUUywgb25jZS5cbiAgICAgIHJvb3Q6IGZjLnJvb3QsXG4gICAgICAuLi4ob3ZlcnJpZGVzPy5yZXN1bWU/LnN0YXJ0ICYmIHsgZW50cnk6IG92ZXJyaWRlcy5yZXN1bWUuc3RhcnQgfSksXG4gICAgICAuLi4ob3ZlcnJpZGVzPy5yZXN1bWU/LnN0YXJ0UGVuZGluZ1BhdXNlcyAmJiB7IHBlbmRpbmdQYXVzZXM6IG92ZXJyaWRlcy5yZXN1bWUuc3RhcnRQZW5kaW5nUGF1c2VzIH0pLFxuICAgICAgLi4uKG92ZXJyaWRlcz8ucmVzdW1lICYmIHsgcmVzdW1lOiBvdmVycmlkZXMucmVzdW1lIH0pLFxuICAgICAgc3RhZ2VNYXA6IGZjLnN0YWdlTWFwLFxuICAgICAgc2NvcGVGYWN0b3J5LFxuICAgICAgZXhlY3V0aW9uUnVudGltZTogcnVudGltZSxcbiAgICAgIHJlYWRPbmx5Q29udGV4dDogcmVhZE9ubHlDb250ZXh0T3ZlcnJpZGUgPz8gYXJncy5yZWFkT25seUNvbnRleHQsXG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBhcmdzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICBzdHJlYW1IYW5kbGVyczogYXJncy5zdHJlYW1IYW5kbGVycyxcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU6IGFyZ3Muc2NvcGVQcm90ZWN0aW9uTW9kZSxcbiAgICAgIHN1YmZsb3dzOiBmYy5zdWJmbG93cyxcbiAgICAgIG5hcnJhdGl2ZUVuYWJsZWQ6IG5hcnJhdGl2ZUZsYWcsXG4gICAgICBidWlsZFRpbWVTdHJ1Y3R1cmU6IGZjLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgIGxvZ2dlcjogZmMubG9nZ2VyID8/IGRlZmF1bHRMb2dnZXIsXG4gICAgICBzaWduYWwsXG4gICAgICBleGVjdXRpb25FbnY6IGVudixcbiAgICAgIGZsb3dSZWNvcmRlcnM6IHRoaXMub2JzZXJ2ZXJzLmZsb3dSZWNvcmRlcnNMaXN0KCksXG4gICAgICBleGVjdXRpb25Db3VudGVyOiB0aGlzLl9leGVjdXRpb25Db3VudGVyLFxuICAgICAgdmlzaXRDb3VudHM6IHRoaXMuX3Zpc2l0Q291bnRzLFxuICAgICAgcnVuSWQ6IHRoaXMuX2N1cnJlbnRSdW5JZCxcbiAgICAgIC4uLihtYXhEZXB0aCAhPT0gdW5kZWZpbmVkICYmIHsgbWF4RGVwdGggfSksXG4gICAgICAuLi4obWF4SXRlcmF0aW9ucyAhPT0gdW5kZWZpbmVkICYmIHsgbWF4SXRlcmF0aW9ucyB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIGVuYWJsZU5hcnJhdGl2ZShvcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLm9ic2VydmVycy5lbmFibGVOYXJyYXRpdmUob3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgZGVjbGFyYXRpdmUgcmVkYWN0aW9uIHBvbGljeSB0aGF0IGFwcGxpZXMgdG8gYWxsIHN0YWdlcy5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpLlxuICAgKi9cbiAgc2V0UmVkYWN0aW9uUG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5yZWRhY3Rpb25Qb2xpY3kgPSBwb2xpY3k7XG4gICAgdGhpcy5yZWRhY3Rpb25SdWxlID0gbmV3IFJlZGFjdGlvblJ1bGUocG9saWN5KTtcbiAgfVxuXG4gIC8qKiBUaGUgYHJlYWRUcmFja2luZ2AgZGlhbCAoc2VlIHtAbGluayBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnMucmVhZFRyYWNraW5nfSkuIENhbGwgYmVmb3JlIHJ1bigpLiAqL1xuICBzZXRSZWFkVHJhY2tpbmcobW9kZTogUmVhZFRyYWNraW5nTW9kZSk6IHZvaWQge1xuICAgIHRoaXMuZmxvd0NoYXJ0QXJncy5kaWFscyA9IHsgLi4udGhpcy5mbG93Q2hhcnRBcmdzLmRpYWxzLCByZWFkVHJhY2tpbmc6IG1vZGUgfTtcbiAgfVxuXG4gIC8qKiBUaGUgYHdyaXRlVHJhY2tpbmdgIGRpYWwgKHNlZSB7QGxpbmsgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zLndyaXRlVHJhY2tpbmd9KS4gQ2FsbCBiZWZvcmUgcnVuKCkuICovXG4gIHNldFdyaXRlVHJhY2tpbmcobW9kZTogV3JpdGVUcmFja2luZ01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dDaGFydEFyZ3MuZGlhbHMgPSB7IC4uLnRoaXMuZmxvd0NoYXJ0QXJncy5kaWFscywgd3JpdGVUcmFja2luZzogbW9kZSB9O1xuICB9XG5cbiAgLyoqIFRoZSBgY29tbWl0VmFsdWVzYCBkaWFsIChzZWUge0BsaW5rIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucy5jb21taXRWYWx1ZXN9KS4gQ2FsbCBiZWZvcmUgcnVuKCkuICovXG4gIHNldENvbW1pdFZhbHVlcyhtb2RlOiBDb21taXRWYWx1ZXNNb2RlKTogdm9pZCB7XG4gICAgdGhpcy5mbG93Q2hhcnRBcmdzLmRpYWxzID0geyAuLi50aGlzLmZsb3dDaGFydEFyZ3MuZGlhbHMsIGNvbW1pdFZhbHVlczogbW9kZSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wbGlhbmNlLWZyaWVuZGx5IHJlcG9ydCBvZiBhbGwgcmVkYWN0aW9uIGFjdGl2aXR5IGZyb20gdGhlXG4gICAqIG1vc3QgcmVjZW50IHJ1bi4gTmV2ZXIgaW5jbHVkZXMgYWN0dWFsIHZhbHVlcy5cbiAgICovXG4gIGdldFJlZGFjdGlvblJlcG9ydCgpOiBSZWRhY3Rpb25SZXBvcnQge1xuICAgIHJldHVybiB0aGlzLnJlZGFjdGlvblJ1bGUucmVwb3J0KCk7XG4gIH1cblxuICAvLyDilIDilIDilIAgUGF1c2UvUmVzdW1lIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjaGVja3BvaW50IGZyb20gdGhlIG1vc3QgcmVjZW50IHBhdXNlZCBleGVjdXRpb24sIG9yIGB1bmRlZmluZWRgXG4gICAqIGlmIHRoZSBsYXN0IHJ1biBjb21wbGV0ZWQgd2l0aG91dCBwYXVzaW5nLlxuICAgKlxuICAgKiBKU09OLXNlcmlhbGl6YWJsZSAoc3RvcmUgaXQgaW4gUmVkaXMsIFBvc3RncmVzLCBsb2NhbFN0b3JhZ2XigKYpIGFuZCBmdWxseVxuICAgKiBERVRBQ0hFRCBmcm9tIGVuZ2luZSBzdGF0ZSAoYGNoZWNrcG9pbnQudHNgKTogbXV0YXRpbmcgb3IgcGVyc2lzdGluZyBpdFxuICAgKiBjYW5ub3QgYWZmZWN0IHRoZSBleGVjdXRvciwgbm9yIGEgbGF0ZXIgcmVzdW1lIGEgY2hlY2twb2ludCB5b3Ugc3RvcmVkLlxuICAgKiBMRUFOOiB3aGF0IGByZXN1bWUoKWAgcmVhZHMgYW5kIHRoZSBwYXVzZSdzIG93biByZWNvcmQg4oCUIGl0cyBzaXplIGlzIHRoZVxuICAgKiBzdGF0ZSdzLCBuZXZlciB0aGUgcnVuJ3MgbGVuZ3RoLiBUaGUgcnVuJ3MgaGlzdG9yeSAoZXhlY3V0aW9uIHRyZWUsXG4gICAqIGNvbW1pdCBsb2csIHN1YmZsb3cgcmVzdWx0cykgaXMge0BsaW5rIGdldFNuYXBzaG90fSdzLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0IH0pO1xuICAgKiBpZiAoZXhlY3V0b3IuaXNQYXVzZWQoKSkge1xuICAgKiAgIGNvbnN0IGNoZWNrcG9pbnQgPSBleGVjdXRvci5nZXRDaGVja3BvaW50KCkhO1xuICAgKiAgIGF3YWl0IHJlZGlzLnNldChgc2Vzc2lvbjoke2lkfWAsIEpTT04uc3RyaW5naWZ5KGNoZWNrcG9pbnQpKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGdldENoZWNrcG9pbnQoKTogRmxvd2NoYXJ0Q2hlY2twb2ludCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoZWNrcG9pbnQ7XG4gIH1cblxuICAvKiogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1vc3QgcmVjZW50IHJ1bigpIHdhcyBwYXVzZWQgKGNoZWNrcG9pbnQgYXZhaWxhYmxlKS4gKi9cbiAgaXNQYXVzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoZWNrcG9pbnQgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgY29tbWl0cyBpbiB0aGUgUk9PVCBsb2cgbm93LiBPKDEpLCBubyBzbmFwc2hvdCBtYXRlcmlhbGl6YXRpb24uXG4gICAqIE5vdCBhbiBlbWl0dGVkIGV2ZW50J3Mgc291cmNlIHBvc2l0aW9uOiBhIGRlZmVycmVkIGNhbGxiYWNrIHJ1bnMgbGF0ZXJcbiAgICogYW5kIGEgc3ViZmxvdyBvd25zIGFub3RoZXIgbG9nLiBVc2UgRW1pdEV2ZW50LnNvdXJjZVBvc2l0aW9uIGZvciB0aGF0LlxuICAgKlxuICAgKiBSZXR1cm5zIDAgYmVmb3JlIGFueSBydW4uIEEgZnJlc2ggcnVuIHJlc2V0cyB0aGUgbG9nOyBhIHNhbWUtZXhlY3V0b3JcbiAgICogcmVzdW1lIGNvbnRpbnVlcyBpdC4gQSBmcmVzaC1leGVjdXRvciByZXN1bWUgc3RhcnRzIGEgbmV3IGxvY2FsIGxvZy5cbiAgICogQWx3YXlzIGVxdWFscyBgZ2V0U25hcHNob3QoKS5jb21taXRMb2cubGVuZ3RoYCAodGhlIGxvZyBpcyB0aGVcbiAgICogYEV2ZW50TG9nYCdzIGBleGVjdXRpb25IaXN0b3J5YDsgdGhlIHNuYXBzaG90IHNlcnZlcyBhIGZyb3plbiBjb3B5KS5cbiAgICovXG4gIGdldENvbW1pdENvdW50KCk6IG51bWJlciB7XG4gICAgY29uc3QgcnVudGltZSA9IHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWUoKSBhcyBJbnN0YW5jZVR5cGU8dHlwZW9mIEV4ZWN1dGlvblJ1bnRpbWU+IHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiBydW50aW1lPy5leGVjdXRpb25IaXN0b3J5Lmxlbmd0aCA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZSBhIHBhdXNlZCBmbG93Y2hhcnQgZnJvbSBhIGNoZWNrcG9pbnQuXG4gICAqXG4gICAqIFJlc3RvcmVzIHRoZSBzY29wZSBzdGF0ZSwgcnVucyB0aGUgcGF1c2VkIHN0YWdlJ3MgYHJlc3VtZUZuYCB3aXRoIHRoZSBpbnB1dFxuICAgKiAoYW4gYGludGVycnVwdCgpYCBwYXVzZSByZS1ydW5zIHRoZSBzdGFnZSB3aXRoIHRoZSBhbnN3ZXIpLCB0aGVuIGNvbnRpbnVlc1xuICAgKiB3aXRoIHdoYXRldmVyIHJhbiBhZnRlciB0aGF0IHN0YWdlIG9uIHRoZSBydW4g4oCUIGl0cyBgbmV4dGAsIG9yIGl0c1xuICAgKiBkaXNwYXRjaGVyJ3MgY29udGludWF0aW9uLCBhdCBldmVyeSBsZXZlbCBvZiB0aGUgcGF1c2UgcGF0aC4gUGFyYWxsZWxcbiAgICogc2libGluZ3MgdGhhdCBwYXVzZWQgdG9nZXRoZXIgKGBjaGVja3BvaW50LnBlbmRpbmdQYXVzZXNgKSBhcmUgYXNrZWQgaW5cbiAgICogdHVybjsgdGhlIGpvaW4gcnVucyBhZnRlciB0aGUgbGFzdCBhbnN3ZXIuIFNlZSBgUmVzdW1lRW50cnlgLlxuICAgKlxuICAgKiBUaGUgY2hlY2twb2ludCBjb21lcyBmcm9tIGBnZXRDaGVja3BvaW50KClgIG9yIGZyb20gc3RvcmFnZS4gT24gdGhlIFNBTUVcbiAgICogZXhlY3V0b3IsIG5hcnJhdGl2ZS9yZWNvcmRlciBzdGF0ZSBhY2N1bXVsYXRlcyBhY3Jvc3MgdGhlIHBhdXNlOyBvbiBhXG4gICAqIEZSRVNIIGV4ZWN1dG9yIGl0IHN0YXJ0cyBlbXB0eS4gQSBmcmVzaCBgcnVuSWRgIGVpdGhlciB3YXkuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gUHJvY2VzcyBBIOKAlCBhZnRlciBhIHBhdXNlLCBwZXJzaXN0IHRoZSBjaGVja3BvaW50OlxuICAgKiBjb25zdCBjaGVja3BvaW50ID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAgICogYXdhaXQgcmVkaXMuc2V0KGBzZXNzaW9uOiR7aWR9YCwgSlNPTi5zdHJpbmdpZnkoY2hlY2twb2ludCkpO1xuICAgKlxuICAgKiAvLyBQcm9jZXNzIEIgKHBvc3NpYmx5IGRpZmZlcmVudCBzZXJ2ZXIsIHNhbWUgY2hhcnQpIOKAlCByZXN0b3JlIGFuZCByZXN1bWU6XG4gICAqIGNvbnN0IHJlc3RvcmVkID0gSlNPTi5wYXJzZShhd2FpdCByZWRpcy5nZXQoYHNlc3Npb246JHtpZH1gKSk7XG4gICAqIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0b3IucmVzdW1lKHJlc3RvcmVkLCB7IGFwcHJvdmVkOiB0cnVlIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGFzeW5jIHJlc3VtZShcbiAgICBjaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50LFxuICAgIHJlc3VtZUlucHV0PzogdW5rbm93bixcbiAgICBvcHRpb25zPzogUGljazxSdW5PcHRpb25zLCAnc2lnbmFsJyB8ICdlbnYnIHwgJ21heERlcHRoJyB8ICdtYXhJdGVyYXRpb25zJz4sXG4gICk6IFByb21pc2U8RXhlY3V0b3JSZXN1bHQ+IHtcbiAgICB0aGlzLmFzc2VydElkbGUoJ3Jlc3VtZScpO1xuICAgIC8vIEV2ZXJ5IHJlZnVzYWwgaGFwcGVucyBpbiB0aGUgcGxhbiDigJQgYmVmb3JlIGFueSBzdGF0ZSBiZWxvdyBpcyB0b3VjaGVkLFxuICAgIC8vIHNvIGEgcmVqZWN0ZWQgY2hlY2twb2ludCBsZWF2ZXMgdGhlIGV4ZWN1dG9yIChhbmQgaXRzIGNoZWNrcG9pbnQpIGFzIGl0IHdhcy5cbiAgICBjb25zdCBwbGFuID0gcGxhblJlc3VtZSh0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LCBjaGVja3BvaW50LCByZXN1bWVJbnB1dCk7XG4gICAgLy8gTVVTVCBwcmVjZWRlIHRoZSBjb3VudGVyIHJlYWQgaW4gYGFubm91bmNlUmVzdW1lYCBhbmQgdGhlIHRyYXZlcnNlcixcbiAgICAvLyB3aGljaCB0YWtlcyBib3RoIGNvdW50ZXJzIEJZIFJFRkVSRU5DRS5cbiAgICBzZWVkQ291bnRlcnMocGxhbi5jaGVja3BvaW50LCB0aGlzLl9leGVjdXRpb25Db3VudGVyLCB0aGlzLl92aXNpdENvdW50cyk7XG4gICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIFNhbWUgZXhlY3V0b3I6IHJldXNlIHRoZSBydW50aW1lLiBGcmVzaCBleGVjdXRvcjogc2VlZCBhIE5FVyBvbmUgZnJvbVxuICAgIC8vIGBjaGVja3BvaW50LnNoYXJlZFN0YXRlYC4gRWl0aGVyIHdheSBhIE5FVyBydW5JZCAoYSBkaXN0aW5jdCBsb2dpY2FsIHJ1bikuXG4gICAgY29uc3QgZXhpc3RpbmdSdW50aW1lID0gdGhpcy5faGFzUnVuQmVmb3JlXG4gICAgICA/ICh0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPilcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuX2hhc1J1bkJlZm9yZSA9IHRydWU7IC8vIGFueSBwYXRoIHRoYXQgcmVzdW1lcyBjb3VudHMgYXMgYSBydW5cbiAgICB0aGlzLl9jdXJyZW50UnVuSWQgPSBnZW5lcmF0ZVJ1bklkKCk7XG5cbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKFxuICAgICAgb3B0aW9ucz8uc2lnbmFsLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgb3B0aW9ucz8uZW52LFxuICAgICAgb3B0aW9ucz8ubWF4RGVwdGgsXG4gICAgICBvcHRpb25zPy5tYXhJdGVyYXRpb25zLFxuICAgICAge1xuICAgICAgICAvLyBDbG9uZS1pbjogYGluaXRpYWxDb250ZXh0YCBzZWVkcyB0aGUgZnJlc2ggU2hhcmVkTWVtb3J5IHdpdGggYVxuICAgICAgICAvLyB0b3AtbGV2ZWwtb25seSBtZXJnZSDigJQgbmVzdGVkIG9iamVjdHMgd291bGQgYWxpYXMgdGhlIGNhbGxlcidzIGNoZWNrcG9pbnQuXG4gICAgICAgIGluaXRpYWxDb250ZXh0OiBzdHJ1Y3R1cmVkQ2xvbmUocGxhbi5jaGVja3BvaW50LnNoYXJlZFN0YXRlKSxcbiAgICAgICAgcHJlc2VydmVSZWNvcmRlcnM6IHRydWUsXG4gICAgICAgIC4uLihleGlzdGluZ1J1bnRpbWUgPyB7IGV4aXN0aW5nUnVudGltZSB9IDoge30pLFxuICAgICAgICByZXN1bWU6IHBsYW4uZW50cnksXG4gICAgICAgIC4uLihwbGFuLmNoZWNrcG9pbnQucmVkYWN0aW9uTWFya3MgJiYgeyByZWRhY3Rpb25NYXJrczogcGxhbi5jaGVja3BvaW50LnJlZGFjdGlvbk1hcmtzIH0pLFxuICAgICAgfSxcbiAgICApO1xuICAgIC8vIEJlZm9yZSB0aGUgdHJhdmVyc2FsIG9uIHB1cnBvc2U6IGBvblJlc3VtZWAgcHJlY2VkZXMgYG9uUnVuU3RhcnRgLlxuICAgIGFubm91bmNlUmVzdW1lKHBsYW4sIHJlc3VtZUlucHV0LCB7XG4gICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgZXhlY3V0aW9uQ291bnQ6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUsXG4gICAgICBvYnNlcnZlcnM6IHRoaXMub2JzZXJ2ZXJzLFxuICAgIH0pO1xuXG4gICAgLy8gU2V0IEFGVEVSIGFsbCBzeW5jIHZhbGlkYXRpb24vbG9va3VwIHRocm93cyBhYm92ZSAobm90aGluZyBjYW4gbGVhayB0aGVcbiAgICAvLyBmbGFnKTsgbm8gYXdhaXQgYmV0d2VlbiB0aGUgdG9wLW9mLW1ldGhvZCBjaGVjayBhbmQgaGVyZSwgc28gcmFjZS1mcmVlLlxuICAgIHRoaXMuX2lzRXhlY3V0aW5nID0gdHJ1ZTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy50cmF2ZXJzZXIuZXhlY3V0ZSgpO1xuICAgICAgLy8gVGVybWluYWwgZmx1c2ggKFJGQy0wMDEgQmxvY2sgOCkg4oCUIHNhbWUgYm91bmRhcnkgY29udHJhY3QgYXMgcnVuKCkuXG4gICAgICB0aGlzLm9ic2VydmVycy5kZWZlcnJlZFRpZXI/LnRlcm1pbmFsRmx1c2goKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHJldHVybiB0aGlzLnBhdXNlZE9yVGhyb3coZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2V0dGxlIG9mIGEgbGVnIHRoYXQgdGhyZXc6IGZsdXNoIHRoZSBkZWZlcnJlZCB0aWVyICh0aGUgT1VURVJNT1NUXG4gICAqIGhhbmRsZXIg4oCUIGEgcGF1c2UgcmUtdGhyb3dzIHRocm91Z2ggc3ViZmxvdyB0cmF2ZXJzZXJzIHdpdGhvdXQgZXhpdFxuICAgKiBldmVudHMsIHNvIHBlci10cmF2ZXJzZXIgaG9va3Mgd291bGQgbWlzcyBpdCksIHRoZW4gdHVybiBhIHBhdXNlIGludG8gYVxuICAgKiBkZXRhY2hlZCBjaGVja3BvaW50IChgY2hlY2twb2ludC50c2ApIGFuZCBhIGBQYXVzZWRSZXN1bHRgOyBhbnl0aGluZyBlbHNlXG4gICAqIGlzIHJldGhyb3duLlxuICAgKi9cbiAgcHJpdmF0ZSBwYXVzZWRPclRocm93KGVycm9yOiB1bmtub3duKTogUGF1c2VkUmVzdWx0IHtcbiAgICB0aGlzLm9ic2VydmVycy5kZWZlcnJlZFRpZXI/LnRlcm1pbmFsRmx1c2goKTtcbiAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgIGNvbnN0IHJlZGFjdGlvbk1hcmtzID0gdGhpcy5yZWRhY3Rpb25SdWxlLm1hcmtzRm9yQ2hlY2twb2ludCgpO1xuICAgICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IGJ1aWxkUGF1c2VDaGVja3BvaW50KGVycm9yLCB0aGlzLnRyYXZlcnNlciwge1xuICAgICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgICBleGVjdXRpb25Db3VudDogdGhpcy5fZXhlY3V0aW9uQ291bnRlci52YWx1ZSxcbiAgICAgICAgdmlzaXRDb3VudHM6IHRoaXMuX3Zpc2l0Q291bnRzLFxuICAgICAgICAuLi4ocmVkYWN0aW9uTWFya3MgJiYgeyByZWRhY3Rpb25NYXJrcyB9KSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHsgcGF1c2VkOiB0cnVlLCBjaGVja3BvaW50OiB0aGlzLmxhc3RDaGVja3BvaW50IH0gc2F0aXNmaWVzIFBhdXNlZFJlc3VsdDtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICAvKiogVGhlIHJlLWVudHJhbmN5IGd1YXJkOiBvbmUgZXhlY3V0b3IgPSBvbmUgaW4tZmxpZ2h0IGV4ZWN1dGlvbi4gKi9cbiAgcHJpdmF0ZSBhc3NlcnRJZGxlKG1ldGhvZDogJ3J1bicgfCAncmVzdW1lJyk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pc0V4ZWN1dGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRmxvd0NoYXJ0RXhlY3V0b3I6ICR7bWV0aG9kfSgpIGNhbGxlZCB3aGlsZSBhbm90aGVyIHJ1bigpL3Jlc3VtZSgpIGlzIGluIGZsaWdodCBvbiB0aGlzIGAgK1xuICAgICAgICAgICdleGVjdXRvci4gQW4gZXhlY3V0b3IgaG9sZHMgcGVyLXJ1biBzdGF0ZSAocnVuSWQsIHJlY29yZGVycywgY2hlY2twb2ludCkg4oCUIGNyZWF0ZSAnICtcbiAgICAgICAgICAnb25lIGV4ZWN1dG9yIHBlciBjb25jdXJyZW50IHJ1bi4gU2VlIGRvY3MvZ3VpZGVzL2V4ZWN1dGlvbi1tb2RlbC5tZC4nLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIDilIAgUmVjb3JkZXJzICh0aGUgcmVnaXN0ZXIgbGl2ZXMgaW4gYGF0dGFjaC50c2ApIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBTY29wZVJlY29yZGVyIHRvIG9ic2VydmUgZGF0YSBvcGVyYXRpb25zIChyZWFkcywgd3JpdGVzLCBjb21taXRzKVxuICAgKiBvbiBldmVyeSBzdGFnZSBzY29wZS4gQ2FsbCBiZWZvcmUgcnVuKCkuICoqSWRlbXBvdGVudCBieSBgaWRgKiogKHJlcGxhY2VkLFxuICAgKiBuZXZlciBkdXBsaWNhdGVkKS4gYHsgZGVsaXZlcnk6ICdkZWZlcnJlZCcgfWAgbW92ZXMgaXQgb2ZmIHRoZSBob3QgcGF0aCDigJRcbiAgICogZGVsaXZlcmVkIGF0IHRoZSBuZXh0IG1pY3JvdGFzayBjaGVja3BvaW50OyByZS1hdHRhY2hpbmcgYW4gaWQgb24gdGhlXG4gICAqIG90aGVyIHRpZXIgU1dBUFMgdGllcnMgKGBkb2NzL2d1aWRlcy9vYnNlcnZlcnMtZGVmZXJyZWQubWRgKS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcigpKTtcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ215LW1ldHJpY3MnKSk7IC8vIHJlcGxhY2VzIHNhbWUgaWRcbiAgICogYGBgXG4gICAqL1xuICBhdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyOiBTY29wZVJlY29yZGVyLCBvcHRpb25zPzogQXR0YWNoUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlcnMuYXR0YWNoU2NvcGUocmVjb3JkZXIsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqIERldGFjaCBhbGwgc2NvcGUgUmVjb3JkZXJzIHdpdGggdGhlIGdpdmVuIElEIOKAlCBib3RoIGRlbGl2ZXJ5IHRpZXJzLiAqL1xuICBkZXRhY2hTY29wZVJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9ic2VydmVycy5kZXRhY2hTY29wZShpZCk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZmVuc2l2ZSBjb3B5IG9mIGF0dGFjaGVkIHNjb3BlIFJlY29yZGVycyAoYm90aCB0aWVycykuICovXG4gIGdldFNjb3BlUmVjb3JkZXJzKCk6IFNjb3BlUmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMub2JzZXJ2ZXJzLnNjb3BlTGlzdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIEZsb3dSZWNvcmRlciB0byBvYnNlcnZlIGNvbnRyb2wgZmxvdyBldmVudHMuIEF1dG9tYXRpY2FsbHlcbiAgICogZW5hYmxlcyBuYXJyYXRpdmUuIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS4gSWRlbXBvdGVudCBieSBgaWRgO1xuICAgKiBgeyBkZWxpdmVyeTogJ2RlZmVycmVkJyB9YCBhcyBmb3IgYGF0dGFjaFNjb3BlUmVjb3JkZXJgLlxuICAgKi9cbiAgYXR0YWNoRmxvd1JlY29yZGVyKHJlY29yZGVyOiBGbG93UmVjb3JkZXIsIG9wdGlvbnM/OiBBdHRhY2hSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLm9ic2VydmVycy5hdHRhY2hGbG93KHJlY29yZGVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIEZsb3dSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQg4oCUIGJvdGggZGVsaXZlcnkgdGllcnMuICovXG4gIGRldGFjaEZsb3dSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vYnNlcnZlcnMuZGV0YWNoRmxvdyhpZCk7XG4gIH1cblxuICAvKiogUmV0dXJucyBhIGRlZmVuc2l2ZSBjb3B5IG9mIGF0dGFjaGVkIEZsb3dSZWNvcmRlcnMgKGJvdGggdGllcnMpLiAqL1xuICBnZXRGbG93UmVjb3JkZXJzKCk6IEZsb3dSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5vYnNlcnZlcnMuZmxvd0xpc3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSByZWNvcmRlciB0byBldmVyeSBjaGFubmVsIChzY29wZSwgZmxvdywgZW1pdCkgaXQgaGFzIE9XTiBgb24qYFxuICAgKiBtZXRob2RzIGZvciDigJQgcHJlZmVycmVkIG92ZXIgc2luZ2xlLWNoYW5uZWwgY2FsbHMsIHdoZXJlIGZvcmdldHRpbmcgb25lXG4gICAqIHNpbGVudGx5IGxvc2VzIGV2ZW50cy4gSWRlbXBvdGVudCBieSBgaWRgIGFjcm9zcyBhbGwgY2hhbm5lbHM7IGEgZmxvd1xuICAgKiBtZXRob2QgZW5hYmxlcyB0aGUgbmFycmF0aXZlOyBgZGVsaXZlcnlgIGNvbWVzIGZyb20gdGhlIG9wdGlvbnMgb3IgdGhlXG4gICAqIHJlY29yZGVyJ3Mgb3duIGZpZWxkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGF1ZGl0OiBDb21iaW5lZFJlY29yZGVyID0ge1xuICAgKiAgIGlkOiAnYXVkaXQnLFxuICAgKiAgIG9uV3JpdGU6IChlKSA9PiBsb2coJ3Njb3BlIHdyaXRlJywgZS5rZXkpLFxuICAgKiAgIG9uRGVjaXNpb246IChlKSA9PiBsb2coJ3JvdXRlZCB0bycsIGUuY2hvc2VuKSxcbiAgICogfTtcbiAgICogZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihhdWRpdCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyZWNvcmRlcjogQ29tYmluZWRSZWNvcmRlciwgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMub2JzZXJ2ZXJzLmF0dGFjaENvbWJpbmVkKHJlY29yZGVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYSBjb21iaW5lZCByZWNvcmRlciBmcm9tIGV2ZXJ5IGNoYW5uZWwgaXQgd2FzIGF0dGFjaGVkIHRvIChzYWZlIGlmIG5ldmVyIGF0dGFjaGVkKS4gKi9cbiAgZGV0YWNoQ29tYmluZWRSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5kZXRhY2hTY29wZVJlY29yZGVyKGlkKTtcbiAgICB0aGlzLmRldGFjaEZsb3dSZWNvcmRlcihpZCk7XG4gIH1cblxuICAvKipcbiAgICogQXR0YWNoIGFuIGBFbWl0UmVjb3JkZXJgIGZvciBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgIGV2ZW50cy4gSXQgcmlkZXNcbiAgICogdGhlIHNjb3BlIGxpc3QsIHNvIGBvbkVtaXRgIGZpcmVzIGV4YWN0bHkgb25jZSBwZXIgZXZlbnQuIElkZW1wb3RlbnQgYnkgYGlkYC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBleGVjdXRvci5hdHRhY2hFbWl0UmVjb3JkZXIoe1xuICAgKiAgIGlkOiAndG9rZW4tbWV0ZXInLFxuICAgKiAgIG9uRW1pdDogKGUpID0+IHtcbiAgICogICAgIGlmIChlLm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5sbG0udG9rZW5zJykgdHJhY2tUb2tlbnMoZS5wYXlsb2FkKTtcbiAgICogICB9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhdHRhY2hFbWl0UmVjb3JkZXIocmVjb3JkZXI6IEVtaXRSZWNvcmRlciwgb3B0aW9ucz86IEF0dGFjaFJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMuYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlciBhcyBTY29wZVJlY29yZGVyLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYW4gYEVtaXRSZWNvcmRlcmAgYnkgaWQuIFNhZmUgdG8gY2FsbCBpZiBuZXZlciBhdHRhY2hlZC4gKi9cbiAgZGV0YWNoRW1pdFJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaFNjb3BlUmVjb3JkZXIoaWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCByZWNvcmRlcnMgKGJvdGggdGllcnMpIHRoYXQgaW1wbGVtZW50IGBvbkVtaXRgLiAqL1xuICBnZXRFbWl0UmVjb3JkZXJzKCk6IEVtaXRSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5nZXRTY29wZVJlY29yZGVycygpLmZpbHRlcihcbiAgICAgIChyKTogciBpcyBFbWl0UmVjb3JkZXIgPT4gdHlwZW9mIChyIGFzIHsgb25FbWl0PzogdW5rbm93biB9KS5vbkVtaXQgPT09ICdmdW5jdGlvbicsXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBEZXRhY2ggKFQ0KSDilIDilIDilIBcbiAgLy8gQmFyZS1leGVjdXRvciBlbnRyeSBwb2ludHMgZm9yIGZpcmUtYW5kLWZvcmdldCBjaGlsZCBjaGFydHMuIEZyb20gaW5zaWRlIGFcbiAgLy8gc3RhZ2UgdXNlIGBzY29wZS4kZGV0YWNoQW5kSm9pbkxhdGVyKC4uLilgIC8gYHNjb3BlLiRkZXRhY2hBbmRGb3JnZXQoLi4uKWAsXG4gIC8vIHdoaWNoIG1pbnQgcmVmSWRzIGZyb20gdGhlIGNhbGxpbmcgc3RhZ2U7IHRoZXNlIHVzZSBgX19leGVjdXRvcl9fYC5cblxuICAvKipcbiAgICogRGV0YWNoIGEgY2hpbGQgZmxvd2NoYXJ0IG9uIHRoZSBnaXZlbiBkcml2ZXIgYW5kIHJldHVybiBhIGBEZXRhY2hIYW5kbGVgXG4gICAqIHRoZSBjYWxsZXIgY2FuIGB3YWl0KClgIG9uIChQcm9taXNlKSBvciByZWFkIGAuc3RhdHVzYCBmcm9tIChzeW5jKS4gVGhlXG4gICAqIGRyaXZlciBpcyBSRVFVSVJFRCDigJQgdGhlcmUgaXMgbm8gbGlicmFyeSBkZWZhdWx0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGltcG9ydCB7IG1pY3JvdGFza0JhdGNoRHJpdmVyIH0gZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJztcbiAgICpcbiAgICogY29uc3QgZXhlYyA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihwYXJlbnRDaGFydCk7XG4gICAqIGNvbnN0IGhhbmRsZSA9IGV4ZWMuZGV0YWNoQW5kSm9pbkxhdGVyKG1pY3JvdGFza0JhdGNoRHJpdmVyLCB0ZWxlbWV0cnlDaGFydCwgeyBldmVudDogJ3gnIH0pO1xuICAgKiBhd2FpdCBoYW5kbGUud2FpdCgpOyAvLyBvcHRpb25hbFxuICAgKiBgYGBcbiAgICovXG4gIGRldGFjaEFuZEpvaW5MYXRlcihcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaEhhbmRsZSB7XG4gICAgcmV0dXJuIF9kZXRhY2hBbmRKb2luTGF0ZXIoZHJpdmVyLCBjaGlsZCwgaW5wdXQsICdfX2V4ZWN1dG9yX18nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRhY2ggYSBjaGlsZCBmbG93Y2hhcnQgb24gdGhlIGdpdmVuIGRyaXZlciBhbmQgRElTQ0FSRCB0aGUgaGFuZGxlIOKAlCBmb3JcbiAgICogZmlyZS1hbmQtZm9yZ2V0IHNpZGUgZWZmZWN0cy4gQSBjaGlsZCdzIGVycm9yIGxhbmRzIG9uIHRoZSBkaXNjYXJkZWQgaGFuZGxlO1xuICAgKiBmb3Igb2JzZXJ2YWJsZSBkZXRhY2ggcHJlZmVyIGBkZXRhY2hBbmRKb2luTGF0ZXJgICsgYC53YWl0KCkuY2F0Y2goKWAuXG4gICAqL1xuICBkZXRhY2hBbmRGb3JnZXQoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogdm9pZCB7XG4gICAgX2RldGFjaEFuZEZvcmdldChkcml2ZXIsIGNoaWxkLCBpbnB1dCwgJ19fZXhlY3V0b3JfXycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBleGVjdXRvci1vd25lZCBuYXJyYXRpdmUgdmlldzsgYC5tYXAoZSA9PiBlLnRleHQpYCBmb3IgZmxhdCBzdHJpbmdzLlxuICAgKiBgZW5hYmxlTmFycmF0aXZlKG9wdGlvbnMpYCBjb25maWd1cmVzIHRoaXMgdmlldy4gQXR0YWNoaW5nIGEgZmxvdyByZWNvcmRlclxuICAgKiBhbHNvIGVuYWJsZXMgaXQsIGJ1dCB0aGF0IHJlY29yZGVyJ3Mgb3B0aW9ucyBhbmQgZW50cmllcyByZW1haW4gaW5kZXBlbmRlbnRcbiAgICogKHJlYWQgYW4gYXR0YWNoZWQgYG5hcnJhdGl2ZSgpYCBpbnN0YW5jZSB3aXRoIGByZWNvcmRlci5nZXRFbnRyaWVzKClgKS5cbiAgICogU2FtZS1leGVjdXRvciByZXN1bWUgcmV0YWlucyBoaXN0b3J5OyBhIGZyZXNoIGV4ZWN1dG9yIHJlY29yZHMgaXRzIHJlc3VtZWRcbiAgICogbGVnIG9ubHkuIFRoZSBpbnRlcm5hbCBuYXJyYXRvciBpcyBub3QgYW4gYXR0YWNoZWQgc25hcHNob3QgcmVjb3JkZXIgcm93LlxuICAgKi9cbiAgZ2V0TmFycmF0aXZlRW50cmllcygpOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10ge1xuICAgIGlmICh0aGlzLm9ic2VydmVycy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5vYnNlcnZlcnMuY29tYmluZWRSZWNvcmRlci5nZXRFbnRyaWVzKCk7XG4gICAgfVxuICAgIGNvbnN0IGZsb3dTZW50ZW5jZXMgPSB0aGlzLnRyYXZlcnNlci5nZXROYXJyYXRpdmUoKTtcbiAgICByZXR1cm4gZmxvd1NlbnRlbmNlcy5tYXAoKHRleHQpID0+ICh7IHR5cGU6ICdzdGFnZScgYXMgY29uc3QsIHRleHQsIGRlcHRoOiAwIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSBjaGFydC4gUmVzb2x2ZXMgd2hlbiB0aGUgcnVuIGZpbmlzaGVzIOKAlCBvciBwYXVzZXMsIGlmIGFcbiAgICogcGF1c2FibGUgc3RhZ2UgcmV0dXJuZWQgZGF0YSAoY2hlY2sgYGlzUGF1c2VkKClgIGFmdGVyd2FyZCkuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIGB7IGlucHV0LCBlbnYgfWAg4oCUIGBpbnB1dGAgaXMgdGhlIGZyb3plbiBidXNpbmVzcyBpbnB1dFxuICAgKiAgIChyZWFkIGluIGEgc3RhZ2UgdmlhIGBzY29wZS4kZ2V0QXJncygpYCk7IGBlbnZgIGlzIGluZnJhc3RydWN0dXJlIGNvbnRleHRcbiAgICogICBsaWtlIGB7IHNpZ25hbCwgdGltZW91dE1zLCB0cmFjZUlkIH1gIChyZWFkIHZpYSBgc2NvcGUuJGdldEVudigpYCkuXG4gICAqXG4gICAqIEFmdGVyIGl0IHJlc29sdmVzLCByZWFkIHJlc3VsdHMgb2ZmIHRoZSBleGVjdXRvcjpcbiAgICogLSBgZ2V0U25hcHNob3QoKWAg4oCUIGZ1bGwgc3RhdGUsIGNvbW1pdCBsb2csIGV4ZWN1dGlvbiB0cmVlLlxuICAgKiAtIGBnZXROYXJyYXRpdmVFbnRyaWVzKClgIOKAlCB0aGUgcGxhaW4tRW5nbGlzaCB0cmFjZSAoY2FsbCBgZW5hYmxlTmFycmF0aXZlKClgXG4gICAqICAgb3IgYXR0YWNoIGEgYG5hcnJhdGl2ZSgpYCByZWNvcmRlciBmaXJzdCkuXG4gICAqIC0gYGlzUGF1c2VkKClgIOKAlCB0cnVlIGlmIGEgc3RhZ2UgcGF1c2VkOyB0aGVuIHVzZSBgZ2V0Q2hlY2twb2ludCgpYCAvIGByZXN1bWUoKWAuXG4gICAqXG4gICAqIE9uZSBydW4gYXQgYSB0aW1lIHBlciBleGVjdXRvciDigJQgaXQgaG9sZHMgcGVyLXJ1biBzdGF0ZSAocnVuSWQsIHJlY29yZGVycyxcbiAgICogY2hlY2twb2ludCkuIENyZWF0ZSBvbmUgZXhlY3V0b3IgcGVyIGNvbmN1cnJlbnQgcnVuLlxuICAgKi9cbiAgYXN5bmMgcnVuKG9wdGlvbnM/OiBSdW5PcHRpb25zKTogUHJvbWlzZTxFeGVjdXRvclJlc3VsdD4ge1xuICAgIC8vIEEgZmFpbGVkIGVudHJ5IGxlYXZlcyBubyBzaWRlIGVmZmVjdHM6IHRoZSBndWFyZCBGSVJTVCAodGhlIGluLWZsaWdodFxuICAgIC8vIHJ1biBzdGF5cyB1bnRvdWNoZWQpLCB2YWxpZGF0aW9uIGJlZm9yZSB0aGUgdGltZW91dCB0aW1lciBleGlzdHMuXG4gICAgdGhpcy5hc3NlcnRJZGxlKCdydW4nKTtcbiAgICBsZXQgdmFsaWRhdGVkSW5wdXQgPSBvcHRpb25zPy5pbnB1dDtcbiAgICBpZiAodmFsaWRhdGVkSW5wdXQgJiYgdGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydC5pbnB1dFNjaGVtYSkge1xuICAgICAgdmFsaWRhdGVkSW5wdXQgPSB2YWxpZGF0ZUlucHV0KHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQuaW5wdXRTY2hlbWEsIHZhbGlkYXRlZElucHV0KTtcbiAgICB9XG5cbiAgICBsZXQgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGxldCB0aW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChvcHRpb25zPy50aW1lb3V0TXMgJiYgIXNpZ25hbCkge1xuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgICAgIHNpZ25hbCA9IGNvbnRyb2xsZXIuc2lnbmFsO1xuICAgICAgdGltZW91dElkID0gc2V0VGltZW91dChcbiAgICAgICAgKCkgPT4gY29udHJvbGxlci5hYm9ydChuZXcgRXJyb3IoYEV4ZWN1dGlvbiB0aW1lZCBvdXQgYWZ0ZXIgJHtvcHRpb25zLnRpbWVvdXRNc31tc2ApKSxcbiAgICAgICAgb3B0aW9ucy50aW1lb3V0TXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMub2JzZXJ2ZXJzLmNsZWFyRm9yUnVuKCk7IC8vIG5vIGNyb3NzLXJ1biBhY2N1bXVsYXRpb25cbiAgICB0aGlzLmxhc3RDaGVja3BvaW50ID0gdW5kZWZpbmVkO1xuICAgIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIgPSB7IHZhbHVlOiAwIH07XG4gICAgdGhpcy5fdmlzaXRDb3VudHMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5fY3VycmVudFJ1bklkID0gZ2VuZXJhdGVSdW5JZCgpO1xuICAgIHRoaXMuX2hhc1J1bkJlZm9yZSA9IHRydWU7IC8vIGEgbGF0ZXIgcmVzdW1lKCkgcmV1c2VzIHRoaXMgcnVudGltZVxuICAgIHRoaXMudHJhdmVyc2VyID0gdGhpcy5jcmVhdGVUcmF2ZXJzZXIoXG4gICAgICBzaWduYWwsXG4gICAgICB2YWxpZGF0ZWRJbnB1dCxcbiAgICAgIG9wdGlvbnM/LmVudixcbiAgICAgIG9wdGlvbnM/Lm1heERlcHRoLFxuICAgICAgb3B0aW9ucz8ubWF4SXRlcmF0aW9ucyxcbiAgICApO1xuICAgIC8vIEFmdGVyIGV2ZXJ5IHN5bmMgdGhyb3csIHdpdGggbm8gYXdhaXQgc2luY2UgdGhlIGd1YXJkOiByYWNlLWZyZWUuXG4gICAgdGhpcy5faXNFeGVjdXRpbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLnRyYXZlcnNlci5leGVjdXRlKCk7XG4gICAgICAvLyBUZXJtaW5hbCBmbHVzaCAoUkZDLTAwMSBCbG9jayA4KTogXCJvbmUgYmVhdCBiZWhpbmRcIiBuZXZlciBiZWNvbWVzIFwibG9zdCBhdCBleGl0XCIuXG4gICAgICB0aGlzLm9ic2VydmVycy5kZWZlcnJlZFRpZXI/LnRlcm1pbmFsRmx1c2goKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIHJldHVybiB0aGlzLnBhdXNlZE9yVGhyb3coZXJyb3IpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IGZhbHNlO1xuICAgICAgaWYgKHRpbWVvdXRJZCAhPT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmx1c2ggdGhlIGRlZmVycmVkLW9ic2VydmVyIGJhY2tsb2csIHRoZW4gYXdhaXQgYXN5bmMgbGlzdGVuZXIgY29tcGxldGlvbnNcbiAgICogdW5kZXIgYSBkZWFkbGluZSDigJQgY2FsbCBiZWZvcmUgYSBzZXJ2ZXJsZXNzIHByb2Nlc3MgZnJlZXplcyBvciBleGl0cy5cbiAgICogWmVyb3Mgd2hlbiBubyBkZWZlcnJlZCBvYnNlcnZlciB3YXMgYXR0YWNoZWQ7IGBwZW5kaW5nID4gMGAgcmVwb3J0cyB3aGF0XG4gICAqIHdhcyBzdGlsbCBvdXRzdGFuZGluZyBhdCB0aGUgZGVhZGxpbmUuXG4gICAqL1xuICBkcmFpbk9ic2VydmVycyhvcHRzPzogeyB0aW1lb3V0TXM/OiBudW1iZXIgfSk6IFByb21pc2U8T2JzZXJ2ZXJEcmFpblJlc3VsdD4ge1xuICAgIGNvbnN0IHRpZXIgPSB0aGlzLm9ic2VydmVycy5kZWZlcnJlZFRpZXI7XG4gICAgaWYgKCF0aWVyKSByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogMCwgZmFpbGVkOiAwLCBwZW5kaW5nOiAwIH0pO1xuICAgIHJldHVybiB0aWVyLmRyYWluKG9wdHMpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEludHJvc3BlY3Rpb24g4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJ1bnRpbWUgc25hcHNob3QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnJlZGFjdCAgYHRydWVgIHNlcnZlcyBgc2hhcmVkU3RhdGVgIChhbmQgZWFjaCBzdWJmbG93J3NcbiAgICogICBgZ2xvYmFsQ29udGV4dGApIGZyb20gdGhlIHJlZGFjdGVkIG1pcnJvciDigJQgdGhlIHNhZmUgdmlldyB0byBleHBvcnQuIEFcbiAgICogICBuby1vcCB3aXRob3V0IGEgcmVkYWN0aW9uIHBvbGljeS4gVGhlIGNvbW1pdCBsb2cgaXMgcmVkYWN0ZWQgYXQgd3JpdGVcbiAgICogICB0aW1lIHJlZ2FyZGxlc3MuIERlZmF1bHQgYGZhbHNlYC5cbiAgICpcbiAgICogKipUcmVhdCBgc2hhcmVkU3RhdGVgIGFzIFJFQUQtT05MWS4qKiBJbiBwcm9kdWN0aW9uIGl0IGlzIGEgbGl2ZSB2aWV3IG9mXG4gICAqIGVuZ2luZSBtZW1vcnk7IGluIGRldiBtb2RlIGEgZGVlcC1mcm96ZW4gY2xvbmUsIHNvIGEgbXV0YXRpb24gdGhyb3dzLlxuICAgKi9cbiAgZ2V0U25hcHNob3Qob3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9KTogUnVudGltZVNuYXBzaG90IHtcbiAgICByZXR1cm4gc2VydmVkU25hcHNob3QodGhpcy50cmF2ZXJzZXIsIHRoaXMub2JzZXJ2ZXJzLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UnVudGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnRyYXZlcnNlci5zZXRSb290T2JqZWN0KHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRCcmFuY2hJZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldEJyYW5jaElkcygpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lUm9vdCgpOiBTdGFnZU5vZGUge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lUm9vdCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lU3RydWN0dXJlKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN1YmZsb3cgbWFuaWZlc3QgZnJvbSBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlci5cbiAgICogUmV0dXJucyBlbXB0eSBhcnJheSBpZiBubyBNYW5pZmVzdEZsb3dSZWNvcmRlciBpcyBhdHRhY2hlZC5cbiAgICovXG4gIGdldFN1YmZsb3dNYW5pZmVzdCgpOiBNYW5pZmVzdEVudHJ5W10ge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5vYnNlcnZlcnMuZmxvd1JlY29yZGVycy5maW5kKChyKSA9PiByIGluc3RhbmNlb2YgTWFuaWZlc3RGbG93UmVjb3JkZXIpIGFzXG4gICAgICB8IE1hbmlmZXN0Rmxvd1JlY29yZGVyXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVjb3JkZXI/LmdldE1hbmlmZXN0KCkgPz8gW107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZnVsbCBzcGVjIGZvciBhIGR5bmFtaWNhbGx5LXJlZ2lzdGVyZWQgc3ViZmxvdy5cbiAgICogUmVxdWlyZXMgYW4gYXR0YWNoZWQgTWFuaWZlc3RGbG93UmVjb3JkZXIgdGhhdCBvYnNlcnZlZCB0aGUgcmVnaXN0cmF0aW9uLlxuICAgKi9cbiAgZ2V0U3ViZmxvd1NwZWMoc3ViZmxvd0lkOiBzdHJpbmcpOiB1bmtub3duIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWNvcmRlciA9IHRoaXMub2JzZXJ2ZXJzLmZsb3dSZWNvcmRlcnMuZmluZCgocikgPT4gciBpbnN0YW5jZW9mIE1hbmlmZXN0Rmxvd1JlY29yZGVyKSBhc1xuICAgICAgfCBNYW5pZmVzdEZsb3dSZWNvcmRlclxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHJlY29yZGVyPy5nZXRTcGVjKHN1YmZsb3dJZCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -23,8 +23,8 @@
|
|
|
23
23
|
*/
|
|
24
24
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
25
|
exports.listSubflowPaths = exports.getSubtreeSnapshot = void 0;
|
|
26
|
+
const foottrace_1 = require("foottrace");
|
|
26
27
|
const devMode_js_1 = require("../devMode.js");
|
|
27
|
-
const runtimeStageId_js_1 = require("../ids/runtimeStageId.js");
|
|
28
28
|
/**
|
|
29
29
|
* Navigate the execution snapshot tree by a slash-separated subflow path.
|
|
30
30
|
*
|
|
@@ -40,11 +40,11 @@ const runtimeStageId_js_1 = require("../ids/runtimeStageId.js");
|
|
|
40
40
|
function getSubtreeSnapshot(snapshot, path, allNarrativeEntries) {
|
|
41
41
|
if (!snapshot || !path)
|
|
42
42
|
return undefined;
|
|
43
|
-
const normalizedPath = (0,
|
|
43
|
+
const normalizedPath = (0, foottrace_1.joinPath)(...(0, foottrace_1.idPathSegments)(path));
|
|
44
44
|
if (!normalizedPath)
|
|
45
45
|
return undefined;
|
|
46
46
|
const subflowResults = snapshot.subflowResults;
|
|
47
|
-
const lastSegment = (0,
|
|
47
|
+
const lastSegment = (0, foottrace_1.splitStageId)(normalizedPath).localStageId;
|
|
48
48
|
// Strategy 1: Direct lookup in subflowResults by full path.
|
|
49
49
|
// SubflowExecutor stores nested results with composite slash-separated keys.
|
|
50
50
|
if (subflowResults && subflowResults[normalizedPath]) {
|
|
@@ -95,7 +95,7 @@ function listSubflowPaths(snapshot) {
|
|
|
95
95
|
// per-iteration mount `runtimeStageId`s (which contain '#'). This function's contract is
|
|
96
96
|
// path-only, so filter the '#' keys out — addressing a specific iteration is done by passing
|
|
97
97
|
// its runtimeStageId straight to getSubtreeSnapshot.
|
|
98
|
-
return Object.keys(snapshot.subflowResults).filter((k) => !(0,
|
|
98
|
+
return Object.keys(snapshot.subflowResults).filter((k) => !(0, foottrace_1.isExecutionKey)(k));
|
|
99
99
|
}
|
|
100
100
|
exports.listSubflowPaths = listSubflowPaths;
|
|
101
101
|
/**
|
|
@@ -105,7 +105,7 @@ exports.listSubflowPaths = listSubflowPaths;
|
|
|
105
105
|
*/
|
|
106
106
|
function extractScopedNarrative(entries, path) {
|
|
107
107
|
// The last segment of the path is the subflowId stored on entries
|
|
108
|
-
const subflowId = (0,
|
|
108
|
+
const subflowId = (0, foottrace_1.splitStageId)(path).localStageId;
|
|
109
109
|
return entries.filter((entry) => {
|
|
110
110
|
// Include entries whose subflowId matches (events emitted while inside this subflow)
|
|
111
111
|
if (entry.subflowId === subflowId)
|
|
@@ -138,4 +138,4 @@ function findSubflowInTree(node, subflowId) {
|
|
|
138
138
|
}
|
|
139
139
|
return undefined;
|
|
140
140
|
}
|
|
141
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0U3VidHJlZVNuYXBzaG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ydW5uZXIvZ2V0U3VidHJlZVNuYXBzaG90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHOzs7QUFFSCw4Q0FBMEM7QUFFMUMsZ0VBQWlHO0FBbUNqRzs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQWdCLGtCQUFrQixDQUNoQyxRQUF5QixFQUN6QixJQUFZLEVBQ1osbUJBQThDO0lBRTlDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFekMsTUFBTSxjQUFjLEdBQUcsSUFBQSw0QkFBUSxFQUFDLEdBQUcsSUFBQSxnQ0FBWSxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdkQsSUFBSSxDQUFDLGNBQWM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUV0QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO0lBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUEsaUNBQWEsRUFBQyxjQUFjLENBQUMsQ0FBQztJQUVsRCw0REFBNEQ7SUFDNUQsNkVBQTZFO0lBQzdFLElBQUksY0FBYyxJQUFJLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO1FBQ3JELE1BQU0sUUFBUSxHQUFHLGNBQWMsQ0FBQyxjQUFjLENBQTRCLENBQUM7UUFDM0UsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLFdBQWtELENBQUM7UUFFNUUsT0FBTztZQUNMLFNBQVMsRUFBRSxXQUFXO1lBQ3RCLGFBQWEsRUFDVixPQUFPLEVBQUUsYUFBMEMsSUFBSSxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFLFdBQVcsQ0FBQztZQUNoSCxXQUFXLEVBQUUsT0FBTyxFQUFFLGFBQW9EO1lBQzFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBeUM7WUFDM0QsWUFBWSxFQUFF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IjpbIi8qKlxuICogZ2V0U3VidHJlZVNuYXBzaG90IOKAlCBuYXZpZ2F0ZSBhbiBleGVjdXRpb24gc25hcHNob3QgdHJlZSBieSBzdWJmbG93IHBhdGguXG4gKlxuICogR2l2ZW4gYSBSdW50aW1lU25hcHNob3QgYW5kIGEgc2xhc2gtc2VwYXJhdGVkIHBhdGggb2Ygc3ViZmxvdyBJRHMsXG4gKiByZXR1cm5zIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdCB0aGF0IHN1YmZsb3cuIFVzZWZ1bCBmb3IgTExNIGRyaWxsLWRvd246XG4gKiBpbnN0ZWFkIG9mIGR1bXBpbmcgdGhlIGZ1bGwgdHJhY2UsIGZldGNoIG9ubHkgdGhlIHJlbGV2YW50IHN1YnRyZWUuXG4gKlxuICogVXNhZ2U6XG4gKiAgIGNvbnN0IHNuYXBzaG90ID0gZXhlY3V0b3IuZ2V0U25hcHNob3QoKTtcbiAqXG4gKiAgIC8vIFRvcC1sZXZlbCBzdWJmbG93XG4gKiAgIGdldFN1YnRyZWVTbmFwc2hvdChzbmFwc2hvdCwgJ3NmLXBheW1lbnQnKTtcbiAqXG4gKiAgIC8vIE5lc3RlZCBzdWJmbG93IChwYXltZW50IOKGkiB2YWxpZGF0aW9uKVxuICogICBnZXRTdWJ0cmVlU25hcHNob3Qoc25hcHNob3QsICdzZi1wYXltZW50L3NmLXZhbGlkYXRpb24nKTtcbiAqXG4gKiAgIC8vIFJldHVybnMgdW5kZWZpbmVkIGlmIHBhdGggbm90IGZvdW5kXG4gKiAgIGdldFN1YnRyZWVTbmFwc2hvdChzbmFwc2hvdCwgJ25vbmV4aXN0ZW50Jyk7IC8vIHVuZGVmaW5lZFxuICpcbiAqICAgLy8gRGlzY292ZXIgYXZhaWxhYmxlIHBhdGhzXG4gKiAgIGxpc3RTdWJmbG93UGF0aHMoc25hcHNob3QpOyAvLyBbJ3NmLXBheW1lbnQnLCAnc2YtcGF5bWVudC9zZi12YWxpZGF0aW9uJ11cbiAqL1xuXG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvbmFycmF0aXZlVHlwZXMuanMnO1xuaW1wb3J0IHsgaXNFeGVjdXRpb25LZXksIGpvaW5QYXRoLCBsYXN0U2VnbWVudE9mLCBwYXRoU2VnbWVudHMgfSBmcm9tICcuLi9pZHMvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZVNuYXBzaG90IH0gZnJvbSAnLi4vbWVtb3J5L2ZyYW1lVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW50aW1lU25hcHNob3QgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUuanMnO1xuXG4vKiogVGhlIHJlc3VsdCBvZiBuYXZpZ2F0aW5nIHRvIGEgc3VidHJlZSB3aXRoaW4gYSBzbmFwc2hvdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VidHJlZVNuYXBzaG90IHtcbiAgLyoqIFRoZSBzdWJmbG93IElEIHRoYXQgd2FzIG1hdGNoZWQgKGxhc3Qgc2VnbWVudCBvZiB0aGUgcGF0aCkuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dJZDogc3RyaW5nO1xuICAvKiogVGhlIGV4ZWN1dGlvbiB0cmVlIHJvb3RlZCBhdCB0aGlzIHN1YmZsb3cuICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblRyZWU6IFN0YWdlU25hcHNob3Q7XG4gIC8qKiBTaGFyZWQgc3RhdGUgc2NvcGVkIHRvIHRoaXMgc3ViZmxvdyAoZnJvbSBzdWJmbG93UmVzdWx0cyBpZiBhdmFpbGFibGUpLiAqL1xuICByZWFkb25seSBzaGFyZWRTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKipcbiAgICogVGhlIHN1YmZsb3cncyBPV04gY29tbWl0IGxvZyAoYHRyZWVDb250ZXh0Lmhpc3RvcnlgKSDigJQgdGhlIHBlci1zdWJmbG93IGF1ZGl0IHRyYWlsLlxuICAgKiBUaGlzIGlzIHRoZSBwdWJsaWMgZG9vciB0byBhIHN1YmZsb3cncyBjb21taXRzICh0aGUgcnVuLWxldmVsIGBjb21taXRMb2dgIGNhcnJpZXMgb25seVxuICAgKiB0aGUgc3ViZmxvdydzIE1PVU5UIGJvdW5kYXJ5LCBub3QgaXRzIGlubmVyIHN0YWdlcyDigJQgc3ViZmxvd3MgcnVuIGluIGlzb2xhdGVkIHJ1bnRpbWVzO1xuICAgKiBzZWUgZG9jcy9kZXNpZ24vc3ViZmxvdy1jb21taXQtdmlzaWJpbGl0eS5tZCkuIGBmaW5kTGFzdFdyaXRlcmAvYGNhdXNhbENoYWluYC9cbiAgICogYGNvbW1pdFZhbHVlQXRgIGNhbiBydW4gUEVSLVNDT1BFIG92ZXIgdGhpcy4gQWJzZW50IHdoZW4gYHN1YmZsb3dSZXN1bHRzYCB3YXMgbm90XG4gICAqIHBvcHVsYXRlZC4gRm9yIGEgTE9PUElORyBzdWJmbG93IHRoaXMgaXMgdGhlIExBU1QgaXRlcmF0aW9uOyBhZGRyZXNzIGEgc3BlY2lmaWNcbiAgICogaXRlcmF0aW9uIGJ5IHBhc3NpbmcgaXRzIG1vdW50IGBydW50aW1lU3RhZ2VJZGAgYXMgdGhlIHBhdGguXG4gICAqL1xuICByZWFkb25seSBoaXN0b3J5PzogcmVhZG9ubHkgdW5rbm93bltdO1xuICAvKipcbiAgICogVGhlIHN1YmZsb3cncyBPV04gZm9sZCBiYXNlIOKAlCB0aGUgc3RhdGUgaXRzIGlzb2xhdGVkIHJ1bnRpbWUgc3RhcnRlZCBmcm9tLFxuICAgKiBiZWZvcmUgaXRzIGZpcnN0IGNvbW1pdCAoYHRyZWVDb250ZXh0LmluaXRpYWxTdGF0ZWApLiBQYWlyIGl0IHdpdGhcbiAgICogYGhpc3RvcnlgIHRvIGZvbGQgdGhlIHN1YmZsb3cncyBzdGF0ZSBhdCBhbnkgb2YgaXRzIGNvbW1pdHM6XG4gICAqIGBzdGF0ZUF0KHN1YnRyZWUsIGkpYCBmcm9tIGBmb290cHJpbnRqcy90cmFjZWAgcmVhZHMgZXhhY3RseSB0aGVzZSB0d29cbiAgICogZmllbGRzLiBOb3JtYWxseSBge31gIOKAlCBhIHN1YmZsb3cncyBgaW5wdXRNYXBwZXJgIHNlZWQgaXMgaXRzIGZpcnN0XG4gICAqIENPTU1JVCwgbm90IGEgcHJlLXJ1biBiYXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgaW5pdGlhbFN0YXRlPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIC8qKiBOYXJyYXRpdmUgZW50cmllcyBzY29wZWQgdG8gdGhpcyBzdWJmbG93IChiZXR3ZWVuIGVudHJ5L2V4aXQgZXZlbnRzKS4gKi9cbiAgcmVhZG9ubHkgbmFycmF0aXZlRW50cmllcz86IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXTtcbn1cblxuLyoqXG4gKiBOYXZpZ2F0ZSB0aGUgZXhlY3V0aW9uIHNuYXBzaG90IHRyZWUgYnkgYSBzbGFzaC1zZXBhcmF0ZWQgc3ViZmxvdyBwYXRoLlxuICpcbiAqICoqSW1wbGVtZW50YXRpb24gbm90ZToqKiBmb290cHJpbnRqcydzIFN1YmZsb3dFeGVjdXRvciBzdG9yZXMgbmVzdGVkIHN1YmZsb3dcbiAqIHJlc3VsdHMgd2l0aCBjb21wb3NpdGUgc2xhc2gtc2VwYXJhdGVkIGtleXMgKGUuZy4gXCJzZi1vdXRlci9zZi1pbm5lclwiKSBpblxuICogdGhlIGZsYXQgYHN1YmZsb3dSZXN1bHRzYCBtYXAuIFRoaXMgZnVuY3Rpb24gdXNlcyB0aG9zZSBrZXlzIGZvciBsb29rdXAuXG4gKlxuICogQHBhcmFtIHNuYXBzaG90IOKAlCB0aGUgZnVsbCBSdW50aW1lU25hcHNob3QgZnJvbSBgZXhlY3V0b3IuZ2V0U25hcHNob3QoKWBcbiAqIEBwYXJhbSBwYXRoIOKAlCBzbGFzaC1zZXBhcmF0ZWQgc3ViZmxvdyBJRHMsIGUuZy4gYFwic2YtcGF5bWVudFwiYCBvciBgXCJzZi1wYXltZW50L3NmLXZhbGlkYXRpb25cImBcbiAqIEBwYXJhbSBhbGxOYXJyYXRpdmVFbnRyaWVzIOKAlCBvcHRpb25hbCBmdWxsIG5hcnJhdGl2ZSBlbnRyaWVzIGZyb20gYGV4ZWN1dG9yLmdldE5hcnJhdGl2ZUVudHJpZXMoKWAsIHVzZWQgdG8gZXh0cmFjdCBzY29wZWQgbmFycmF0aXZlIGZvciB0aGUgc3VidHJlZVxuICogQHJldHVybnMgdGhlIG1hdGNoaW5nIFN1YnRyZWVTbmFwc2hvdCwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIHBhdGggaXMgbm90IGZvdW5kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTdWJ0cmVlU25hcHNob3QoXG4gIHNuYXBzaG90OiBSdW50aW1lU25hcHNob3QsXG4gIHBhdGg6IHN0cmluZyxcbiAgYWxsTmFycmF0aXZlRW50cmllcz86IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXSxcbik6IFN1YnRyZWVTbmFwc2hvdCB8IHVuZGVmaW5lZCB7XG4gIGlmICghc25hcHNob3QgfHwgIXBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBqb2luUGF0aCguLi5wYXRoU2VnbWVudHMocGF0aCkpO1xuICBpZiAoIW5vcm1hbGl6ZWRQYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHN1YmZsb3dSZXN1bHRzID0gc25hcHNob3Quc3ViZmxvd1Jlc3VsdHM7XG4gIGNvbnN0IGxhc3RTZWdtZW50ID0gbGFzdFNlZ21lbnRPZihub3JtYWxpemVkUGF0aCk7XG5cbiAgLy8gU3RyYXRlZ3kgMTogRGlyZWN0IGxvb2t1cCBpbiBzdWJmbG93UmVzdWx0cyBieSBmdWxsIHBhdGguXG4gIC8vIFN1YmZsb3dFeGVjdXRvciBzdG9yZXMgbmVzdGVkIHJlc3VsdHMgd2l0aCBjb21wb3NpdGUgc2xhc2gtc2VwYXJhdGVkIGtleXMuXG4gIGlmIChzdWJmbG93UmVzdWx0cyAmJiBzdWJmbG93UmVzdWx0c1tub3JtYWxpemVkUGF0aF0pIHtcbiAgICBjb25zdCBzZlJlc3VsdCA9IHN1YmZsb3dSZXN1bHRzW25vcm1hbGl6ZWRQYXRoXSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBjb25zdCB0cmVlQ3R4ID0gc2ZSZXN1bHQudHJlZUNvbnRleHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3ViZmxvd0lkOiBsYXN0U2VnbWVudCxcbiAgICAgIGV4ZWN1dGlvblRyZWU6XG4gICAgICAgICh0cmVlQ3R4Py5zdGFnZUNvbnRleHRzIGFzIHVua25vd24gYXMgU3RhZ2VTbmFwc2hvdCkgPz8gZmluZFN1YmZsb3dJblRyZWUoc25hcHNob3QuZXhlY3V0aW9uVHJlZSwgbGFzdFNlZ21lbnQpLFxuICAgICAgc2hhcmVkU3RhdGU6IHRyZWVDdHg/Lmdsb2JhbENvbnRleHQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQsXG4gICAgICBoaXN0b3J5OiB0cmVlQ3R4Py5oaXN0b3J5IGFzIHJlYWRvbmx5IHVua25vd25bXSB8IHVuZGVmaW5lZCxcbiAgICAgIGluaXRpYWxTdGF0ZTogdHJlZUN0eD8uaW5pdGlhbFN0YXRlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgICAgbmFycmF0aXZlRW50cmllczogYWxsTmFycmF0aXZlRW50cmllcyA/IGV4dHJhY3RTY29wZWROYXJyYXRpdmUoYWxsTmFycmF0aXZlRW50cmllcywgbGFzdFNlZ21lbnQpIDogdW5kZWZpbmVkLFxuICAgIH07XG4gIH1cblxuICAvLyBTdHJhdGVneSAyOiBGaW5kIHRoZSBub2RlIGluIHRoZSBleGVjdXRpb24gdHJlZSBieSBzdWJmbG93SWQuXG4gIC8vIFRoaXMgcGF0aCBsYWNrcyBzaGFyZWRTdGF0ZSAoc3ViZmxvd1Jlc3VsdHMgd2FzIG5vdCBwb3B1bGF0ZWQpLlxuICAvLyBUaGlzIHR5cGljYWxseSBtZWFucyB0aGUgZXhlY3V0b3IgcmFuIHdpdGhvdXQgc3ViZmxvdyByZXN1bHQgZW5yaWNobWVudC5cbiAgY29uc3QgZm91bmROb2RlID0gZmluZFN1YmZsb3dJblRyZWUoc25hcHNob3QuZXhlY3V0aW9uVHJlZSwgbGFzdFNlZ21lbnQpO1xuICBpZiAoIWZvdW5kTm9kZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICBgW2Zvb3RwcmludF0gZ2V0U3VidHJlZVNuYXBzaG90KCcke25vcm1hbGl6ZWRQYXRofScpOiBzdWJmbG93UmVzdWx0cyBub3QgcG9wdWxhdGVkIOKAlCBgICtcbiAgICAgICAgJ3NoYXJlZFN0YXRlIHdpbGwgYmUgdW5kZWZpbmVkLiBUaGUgc3ViZmxvdyBtYXkgbm90IGhhdmUgY29tcGxldGVkLCAnICtcbiAgICAgICAgJ29yIGl0cyBvdXRwdXRNYXBwZXIgZGlkIG5vdCB3cml0ZSBiYWNrIHRvIHRoZSBwYXJlbnQgc2NvcGUuJyxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBzdWJmbG93SWQ6IGxhc3RTZWdtZW50LFxuICAgIGV4ZWN1dGlvblRyZWU6IGZvdW5kTm9kZSxcbiAgICBzaGFyZWRTdGF0ZTogdW5kZWZpbmVkLFxuICAgIG5hcnJhdGl2ZUVudHJpZXM6IGFsbE5hcnJhdGl2ZUVudHJpZXMgPyBleHRyYWN0U2NvcGVkTmFycmF0aXZlKGFsbE5hcnJhdGl2ZUVudHJpZXMsIGxhc3RTZWdtZW50KSA6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuLyoqXG4gKiBMaXN0IGFsbCBhdmFpbGFibGUgc3ViZmxvdyBwYXRocyBpbiBhIHNuYXBzaG90LlxuICpcbiAqIFJldHVybnMgdGhlIGtleXMgZnJvbSBgc3ViZmxvd1Jlc3VsdHNgLCB3aGljaCBhcmUgc2xhc2gtc2VwYXJhdGVkXG4gKiBzdWJmbG93IElEIHBhdGhzIChlLmcuIGBbXCJzZi1wYXltZW50XCIsIFwic2Ytb3V0ZXIvc2YtaW5uZXJcIl1gKS5cbiAqIFVzZWZ1bCBmb3IgZGlzY292ZXJ5IOKAlCBhbiBMTE0gb3IgVUkgY2FuIGVudW1lcmF0ZSBhdmFpbGFibGUgZHJpbGwtZG93biB0YXJnZXRzLlxuICpcbiAqIEBwYXJhbSBzbmFwc2hvdCDigJQgdGhlIGZ1bGwgUnVudGltZVNuYXBzaG90IGZyb20gYGV4ZWN1dG9yLmdldFNuYXBzaG90KClgXG4gKiBAcmV0dXJucyBhcnJheSBvZiBhdmFpbGFibGUgc3ViZmxvdyBwYXRocywgZW1wdHkgaWYgbm9uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGlzdFN1YmZsb3dQYXRocyhzbmFwc2hvdDogUnVudGltZVNuYXBzaG90KTogc3RyaW5nW10ge1xuICBpZiAoIXNuYXBzaG90Py5zdWJmbG93UmVzdWx0cykgcmV0dXJuIFtdO1xuICAvLyBgc3ViZmxvd1Jlc3VsdHNgIGlzIGR1YWwta2V5ZWQgKGRlc2lnbjogc3ViZmxvdy1jb21taXQtdmlzaWJpbGl0eSk6IHN1YmZsb3cgUEFUSFMgcGx1c1xuICAvLyBwZXItaXRlcmF0aW9uIG1vdW50IGBydW50aW1lU3RhZ2VJZGBzICh3aGljaCBjb250YWluICcjJykuIFRoaXMgZnVuY3Rpb24ncyBjb250cmFjdCBpc1xuICAvLyBwYXRoLW9ubHksIHNvIGZpbHRlciB0aGUgJyMnIGtleXMgb3V0IOKAlCBhZGRyZXNzaW5nIGEgc3BlY2lmaWMgaXRlcmF0aW9uIGlzIGRvbmUgYnkgcGFzc2luZ1xuICAvLyBpdHMgcnVudGltZVN0YWdlSWQgc3RyYWlnaHQgdG8gZ2V0U3VidHJlZVNuYXBzaG90LlxuICByZXR1cm4gT2JqZWN0LmtleXMoc25hcHNob3Quc3ViZmxvd1Jlc3VsdHMpLmZpbHRlcigoaykgPT4gIWlzRXhlY3V0aW9uS2V5KGspKTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IG5hcnJhdGl2ZSBlbnRyaWVzIHNjb3BlZCB0byBhIHNwZWNpZmljIHN1YmZsb3cuXG4gKiBGaWx0ZXJzIGJ5IGVudHJ5LnN1YmZsb3dJZCBmaWVsZCAoc2V0IGJ5IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgZHVyaW5nIHRyYXZlcnNhbCkuXG4gKiBBbHNvIGluY2x1ZGVzIHRoZSBzdWJmbG93IGVudHJ5L2V4aXQgbWFya2VyIGVudHJpZXMgdGhlbXNlbHZlcy5cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFNjb3BlZE5hcnJhdGl2ZShlbnRyaWVzOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10sIHBhdGg6IHN0cmluZyk6IENvbWJpbmVkTmFycmF0aXZlRW50cnlbXSB7XG4gIC8vIFRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIHBhdGggaXMgdGhlIHN1YmZsb3dJZCBzdG9yZWQgb24gZW50cmllc1xuICBjb25zdCBzdWJmbG93SWQgPSBsYXN0U2VnbWVudE9mKHBhdGgpO1xuICByZXR1cm4gZW50cmllcy5maWx0ZXIoKGVudHJ5KSA9PiB7XG4gICAgLy8gSW5jbHVkZSBlbnRyaWVzIHdob3NlIHN1YmZsb3dJZCBtYXRjaGVzIChldmVudHMgZW1pdHRlZCB3aGlsZSBpbnNpZGUgdGhpcyBzdWJmbG93KVxuICAgIGlmIChlbnRyeS5zdWJmbG93SWQgPT09IHN1YmZsb3dJZCkgcmV0dXJuIHRydWU7XG4gICAgLy8gQWxzbyBpbmNsdWRlIHRoZSBzdWJmbG93IGVudHJ5L2V4aXQgbWFya2VycyAodGhleSBjYXJyeSB0aGUgcGFyZW50IHN1YmZsb3dJZCBvciB1bmRlZmluZWQpXG4gICAgaWYgKGVudHJ5LnR5cGUgPT09ICdzdWJmbG93JyAmJiBlbnRyeS5zdGFnZUlkID09PSBzdWJmbG93SWQpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSk7XG59XG5cbi8qKlxuICogRmluZCBhIHN1YmZsb3cgbm9kZSBpbiB0aGUgZXhlY3V0aW9uIHRyZWUgYnkgc2VhcmNoaW5nIGZvciBhIG5vZGVcbiAqIHdob3NlIHN1YmZsb3dJZCBtYXRjaGVzLlxuICogU2VhcmNoZXMgZGVwdGgtZmlyc3QgdGhyb3VnaCBgbmV4dGAgYW5kIGBjaGlsZHJlbmAgbGlua3MuXG4gKi9cbmZ1bmN0aW9uIGZpbmRTdWJmbG93SW5UcmVlKG5vZGU6IFN0YWdlU25hcHNob3QgfCB1bmRlZmluZWQsIHN1YmZsb3dJZDogc3RyaW5nKTogU3RhZ2VTbmFwc2hvdCB8IHVuZGVmaW5lZCB7XG4gIGlmICghbm9kZSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBpZiAobm9kZS5zdWJmbG93SWQgPT09IHN1YmZsb3dJZCkgcmV0dXJuIG5vZGU7XG5cbiAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gZmluZFN1YmZsb3dJblRyZWUoY2hpbGQsIHN1YmZsb3dJZCk7XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gIH1cblxuICBpZiAobm9kZS5uZXh0KSB7XG4gICAgcmV0dXJuIGZpbmRTdWJmbG93SW5UcmVlKG5vZGUubmV4dCwgc3ViZmxvd0lkKTtcbiAgfVxuXG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
|
|
141
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0U3VidHJlZVNuYXBzaG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ydW5uZXIvZ2V0U3VidHJlZVNuYXBzaG90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHOzs7QUFFSCx5Q0FBbUc7QUFFbkcsOENBQTBDO0FBb0MxQzs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQWdCLGtCQUFrQixDQUNoQyxRQUF5QixFQUN6QixJQUFZLEVBQ1osbUJBQThDO0lBRTlDLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQyxJQUFJO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFekMsTUFBTSxjQUFjLEdBQUcsSUFBQSxvQkFBUSxFQUFDLEdBQUcsSUFBQSwwQkFBWSxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDdkQsSUFBSSxDQUFDLGNBQWM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUV0QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO0lBQy9DLE1BQU0sV0FBVyxHQUFHLElBQUEsd0JBQVksRUFBQyxjQUFjLENBQUMsQ0FBQyxZQUFZLENBQUM7SUFFOUQsNERBQTREO0lBQzVELDZFQUE2RTtJQUM3RSxJQUFJLGNBQWMsSUFBSSxjQUFjLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUNyRCxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsY0FBYyxDQUE0QixDQUFDO1FBQzNFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxXQUFrRCxDQUFDO1FBRTVFLE9BQU87WUFDTCxTQUFTLEVBQUUsV0FBVztZQUN0QixhQUFhLEVBQ1YsT0FBTyxFQUFFLGFBQTBDLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxXQUFXLENBQUM7WUFDaEgsV0FBVyxFQUFFLE9BQU8sRUFBRSxhQUFvRDtZQUMxRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQXlDO1lBQzNE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QUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBnZXRTdWJ0cmVlU25hcHNob3Qg4oCUIG5hdmlnYXRlIGFuIGV4ZWN1dGlvbiBzbmFwc2hvdCB0cmVlIGJ5IHN1YmZsb3cgcGF0aC5cbiAqXG4gKiBHaXZlbiBhIFJ1bnRpbWVTbmFwc2hvdCBhbmQgYSBzbGFzaC1zZXBhcmF0ZWQgcGF0aCBvZiBzdWJmbG93IElEcyxcbiAqIHJldHVybnMgdGhlIHN1YnRyZWUgcm9vdGVkIGF0IHRoYXQgc3ViZmxvdy4gVXNlZnVsIGZvciBMTE0gZHJpbGwtZG93bjpcbiAqIGluc3RlYWQgb2YgZHVtcGluZyB0aGUgZnVsbCB0cmFjZSwgZmV0Y2ggb25seSB0aGUgcmVsZXZhbnQgc3VidHJlZS5cbiAqXG4gKiBVc2FnZTpcbiAqICAgY29uc3Qgc25hcHNob3QgPSBleGVjdXRvci5nZXRTbmFwc2hvdCgpO1xuICpcbiAqICAgLy8gVG9wLWxldmVsIHN1YmZsb3dcbiAqICAgZ2V0U3VidHJlZVNuYXBzaG90KHNuYXBzaG90LCAnc2YtcGF5bWVudCcpO1xuICpcbiAqICAgLy8gTmVzdGVkIHN1YmZsb3cgKHBheW1lbnQg4oaSIHZhbGlkYXRpb24pXG4gKiAgIGdldFN1YnRyZWVTbmFwc2hvdChzbmFwc2hvdCwgJ3NmLXBheW1lbnQvc2YtdmFsaWRhdGlvbicpO1xuICpcbiAqICAgLy8gUmV0dXJucyB1bmRlZmluZWQgaWYgcGF0aCBub3QgZm91bmRcbiAqICAgZ2V0U3VidHJlZVNuYXBzaG90KHNuYXBzaG90LCAnbm9uZXhpc3RlbnQnKTsgLy8gdW5kZWZpbmVkXG4gKlxuICogICAvLyBEaXNjb3ZlciBhdmFpbGFibGUgcGF0aHNcbiAqICAgbGlzdFN1YmZsb3dQYXRocyhzbmFwc2hvdCk7IC8vIFsnc2YtcGF5bWVudCcsICdzZi1wYXltZW50L3NmLXZhbGlkYXRpb24nXVxuICovXG5cbmltcG9ydCB7IGlkUGF0aFNlZ21lbnRzIGFzIHBhdGhTZWdtZW50cywgaXNFeGVjdXRpb25LZXksIGpvaW5QYXRoLCBzcGxpdFN0YWdlSWQgfSBmcm9tICdmb290dHJhY2UnO1xuXG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvbmFycmF0aXZlVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZVNuYXBzaG90IH0gZnJvbSAnLi4vbWVtb3J5L2ZyYW1lVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW50aW1lU25hcHNob3QgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUuanMnO1xuXG4vKiogVGhlIHJlc3VsdCBvZiBuYXZpZ2F0aW5nIHRvIGEgc3VidHJlZSB3aXRoaW4gYSBzbmFwc2hvdC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VidHJlZVNuYXBzaG90IHtcbiAgLyoqIFRoZSBzdWJmbG93IElEIHRoYXQgd2FzIG1hdGNoZWQgKGxhc3Qgc2VnbWVudCBvZiB0aGUgcGF0aCkuICovXG4gIHJlYWRvbmx5IHN1YmZsb3dJZDogc3RyaW5nO1xuICAvKiogVGhlIGV4ZWN1dGlvbiB0cmVlIHJvb3RlZCBhdCB0aGlzIHN1YmZsb3cuICovXG4gIHJlYWRvbmx5IGV4ZWN1dGlvblRyZWU6IFN0YWdlU25hcHNob3Q7XG4gIC8qKiBTaGFyZWQgc3RhdGUgc2NvcGVkIHRvIHRoaXMgc3ViZmxvdyAoZnJvbSBzdWJmbG93UmVzdWx0cyBpZiBhdmFpbGFibGUpLiAqL1xuICByZWFkb25seSBzaGFyZWRTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKipcbiAgICogVGhlIHN1YmZsb3cncyBPV04gY29tbWl0IGxvZyAoYHRyZWVDb250ZXh0Lmhpc3RvcnlgKSDigJQgdGhlIHBlci1zdWJmbG93IGF1ZGl0IHRyYWlsLlxuICAgKiBUaGlzIGlzIHRoZSBwdWJsaWMgZG9vciB0byBhIHN1YmZsb3cncyBjb21taXRzICh0aGUgcnVuLWxldmVsIGBjb21taXRMb2dgIGNhcnJpZXMgb25seVxuICAgKiB0aGUgc3ViZmxvdydzIE1PVU5UIGJvdW5kYXJ5LCBub3QgaXRzIGlubmVyIHN0YWdlcyDigJQgc3ViZmxvd3MgcnVuIGluIGlzb2xhdGVkIHJ1bnRpbWVzO1xuICAgKiBzZWUgZG9jcy9kZXNpZ24vc3ViZmxvdy1jb21taXQtdmlzaWJpbGl0eS5tZCkuIGBmaW5kTGFzdFdyaXRlcmAvYGNhdXNhbENoYWluYC9cbiAgICogYGNvbW1pdFZhbHVlQXRgIGNhbiBydW4gUEVSLVNDT1BFIG92ZXIgdGhpcy4gQWJzZW50IHdoZW4gYHN1YmZsb3dSZXN1bHRzYCB3YXMgbm90XG4gICAqIHBvcHVsYXRlZC4gRm9yIGEgTE9PUElORyBzdWJmbG93IHRoaXMgaXMgdGhlIExBU1QgaXRlcmF0aW9uOyBhZGRyZXNzIGEgc3BlY2lmaWNcbiAgICogaXRlcmF0aW9uIGJ5IHBhc3NpbmcgaXRzIG1vdW50IGBydW50aW1lU3RhZ2VJZGAgYXMgdGhlIHBhdGguXG4gICAqL1xuICByZWFkb25seSBoaXN0b3J5PzogcmVhZG9ubHkgdW5rbm93bltdO1xuICAvKipcbiAgICogVGhlIHN1YmZsb3cncyBPV04gZm9sZCBiYXNlIOKAlCB0aGUgc3RhdGUgaXRzIGlzb2xhdGVkIHJ1bnRpbWUgc3RhcnRlZCBmcm9tLFxuICAgKiBiZWZvcmUgaXRzIGZpcnN0IGNvbW1pdCAoYHRyZWVDb250ZXh0LmluaXRpYWxTdGF0ZWApLiBQYWlyIGl0IHdpdGhcbiAgICogYGhpc3RvcnlgIHRvIGZvbGQgdGhlIHN1YmZsb3cncyBzdGF0ZSBhdCBhbnkgb2YgaXRzIGNvbW1pdHM6XG4gICAqIGBzdGF0ZUF0KHN1YnRyZWUsIGkpYCBmcm9tIGBmb290dHJhY2VgIHJlYWRzIGV4YWN0bHkgdGhlc2UgdHdvXG4gICAqIGZpZWxkcy4gTm9ybWFsbHkgYHt9YCDigJQgYSBzdWJmbG93J3MgYGlucHV0TWFwcGVyYCBzZWVkIGlzIGl0cyBmaXJzdFxuICAgKiBDT01NSVQsIG5vdCBhIHByZS1ydW4gYmFzZS5cbiAgICovXG4gIHJlYWRvbmx5IGluaXRpYWxTdGF0ZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAvKiogTmFycmF0aXZlIGVudHJpZXMgc2NvcGVkIHRvIHRoaXMgc3ViZmxvdyAoYmV0d2VlbiBlbnRyeS9leGl0IGV2ZW50cykuICovXG4gIHJlYWRvbmx5IG5hcnJhdGl2ZUVudHJpZXM/OiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W107XG59XG5cbi8qKlxuICogTmF2aWdhdGUgdGhlIGV4ZWN1dGlvbiBzbmFwc2hvdCB0cmVlIGJ5IGEgc2xhc2gtc2VwYXJhdGVkIHN1YmZsb3cgcGF0aC5cbiAqXG4gKiAqKkltcGxlbWVudGF0aW9uIG5vdGU6KiogZm9vdHByaW50anMncyBTdWJmbG93RXhlY3V0b3Igc3RvcmVzIG5lc3RlZCBzdWJmbG93XG4gKiByZXN1bHRzIHdpdGggY29tcG9zaXRlIHNsYXNoLXNlcGFyYXRlZCBrZXlzIChlLmcuIFwic2Ytb3V0ZXIvc2YtaW5uZXJcIikgaW5cbiAqIHRoZSBmbGF0IGBzdWJmbG93UmVzdWx0c2AgbWFwLiBUaGlzIGZ1bmN0aW9uIHVzZXMgdGhvc2Uga2V5cyBmb3IgbG9va3VwLlxuICpcbiAqIEBwYXJhbSBzbmFwc2hvdCDigJQgdGhlIGZ1bGwgUnVudGltZVNuYXBzaG90IGZyb20gYGV4ZWN1dG9yLmdldFNuYXBzaG90KClgXG4gKiBAcGFyYW0gcGF0aCDigJQgc2xhc2gtc2VwYXJhdGVkIHN1YmZsb3cgSURzLCBlLmcuIGBcInNmLXBheW1lbnRcImAgb3IgYFwic2YtcGF5bWVudC9zZi12YWxpZGF0aW9uXCJgXG4gKiBAcGFyYW0gYWxsTmFycmF0aXZlRW50cmllcyDigJQgb3B0aW9uYWwgZnVsbCBuYXJyYXRpdmUgZW50cmllcyBmcm9tIGBleGVjdXRvci5nZXROYXJyYXRpdmVFbnRyaWVzKClgLCB1c2VkIHRvIGV4dHJhY3Qgc2NvcGVkIG5hcnJhdGl2ZSBmb3IgdGhlIHN1YnRyZWVcbiAqIEByZXR1cm5zIHRoZSBtYXRjaGluZyBTdWJ0cmVlU25hcHNob3QsIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBwYXRoIGlzIG5vdCBmb3VuZFxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3VidHJlZVNuYXBzaG90KFxuICBzbmFwc2hvdDogUnVudGltZVNuYXBzaG90LFxuICBwYXRoOiBzdHJpbmcsXG4gIGFsbE5hcnJhdGl2ZUVudHJpZXM/OiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10sXG4pOiBTdWJ0cmVlU25hcHNob3QgfCB1bmRlZmluZWQge1xuICBpZiAoIXNuYXBzaG90IHx8ICFwYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gam9pblBhdGgoLi4ucGF0aFNlZ21lbnRzKHBhdGgpKTtcbiAgaWYgKCFub3JtYWxpemVkUGF0aCkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBzdWJmbG93UmVzdWx0cyA9IHNuYXBzaG90LnN1YmZsb3dSZXN1bHRzO1xuICBjb25zdCBsYXN0U2VnbWVudCA9IHNwbGl0U3RhZ2VJZChub3JtYWxpemVkUGF0aCkubG9jYWxTdGFnZUlkO1xuXG4gIC8vIFN0cmF0ZWd5IDE6IERpcmVjdCBsb29rdXAgaW4gc3ViZmxvd1Jlc3VsdHMgYnkgZnVsbCBwYXRoLlxuICAvLyBTdWJmbG93RXhlY3V0b3Igc3RvcmVzIG5lc3RlZCByZXN1bHRzIHdpdGggY29tcG9zaXRlIHNsYXNoLXNlcGFyYXRlZCBrZXlzLlxuICBpZiAoc3ViZmxvd1Jlc3VsdHMgJiYgc3ViZmxvd1Jlc3VsdHNbbm9ybWFsaXplZFBhdGhdKSB7XG4gICAgY29uc3Qgc2ZSZXN1bHQgPSBzdWJmbG93UmVzdWx0c1tub3JtYWxpemVkUGF0aF0gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgY29uc3QgdHJlZUN0eCA9IHNmUmVzdWx0LnRyZWVDb250ZXh0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN1YmZsb3dJZDogbGFzdFNlZ21lbnQsXG4gICAgICBleGVjdXRpb25UcmVlOlxuICAgICAgICAodHJlZUN0eD8uc3RhZ2VDb250ZXh0cyBhcyB1bmtub3duIGFzIFN0YWdlU25hcHNob3QpID8/IGZpbmRTdWJmbG93SW5UcmVlKHNuYXBzaG90LmV4ZWN1dGlvblRyZWUsIGxhc3RTZWdtZW50KSxcbiAgICAgIHNoYXJlZFN0YXRlOiB0cmVlQ3R4Py5nbG9iYWxDb250ZXh0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkLFxuICAgICAgaGlzdG9yeTogdHJlZUN0eD8uaGlzdG9yeSBhcyByZWFkb25seSB1bmtub3duW10gfCB1bmRlZmluZWQsXG4gICAgICBpbml0aWFsU3RhdGU6IHRyZWVDdHg/LmluaXRpYWxTdGF0ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCxcbiAgICAgIG5hcnJhdGl2ZUVudHJpZXM6IGFsbE5hcnJhdGl2ZUVudHJpZXMgPyBleHRyYWN0U2NvcGVkTmFycmF0aXZlKGFsbE5hcnJhdGl2ZUVudHJpZXMsIGxhc3RTZWdtZW50KSA6IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgLy8gU3RyYXRlZ3kgMjogRmluZCB0aGUgbm9kZSBpbiB0aGUgZXhlY3V0aW9uIHRyZWUgYnkgc3ViZmxvd0lkLlxuICAvLyBUaGlzIHBhdGggbGFja3Mgc2hhcmVkU3RhdGUgKHN1YmZsb3dSZXN1bHRzIHdhcyBub3QgcG9wdWxhdGVkKS5cbiAgLy8gVGhpcyB0eXBpY2FsbHkgbWVhbnMgdGhlIGV4ZWN1dG9yIHJhbiB3aXRob3V0IHN1YmZsb3cgcmVzdWx0IGVucmljaG1lbnQuXG4gIGNvbnN0IGZvdW5kTm9kZSA9IGZpbmRTdWJmbG93SW5UcmVlKHNuYXBzaG90LmV4ZWN1dGlvblRyZWUsIGxhc3RTZWdtZW50KTtcbiAgaWYgKCFmb3VuZE5vZGUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFtmb290cHJpbnRdIGdldFN1YnRyZWVTbmFwc2hvdCgnJHtub3JtYWxpemVkUGF0aH0nKTogc3ViZmxvd1Jlc3VsdHMgbm90IHBvcHVsYXRlZCDigJQgYCArXG4gICAgICAgICdzaGFyZWRTdGF0ZSB3aWxsIGJlIHVuZGVmaW5lZC4gVGhlIHN1YmZsb3cgbWF5IG5vdCBoYXZlIGNvbXBsZXRlZCwgJyArXG4gICAgICAgICdvciBpdHMgb3V0cHV0TWFwcGVyIGRpZCBub3Qgd3JpdGUgYmFjayB0byB0aGUgcGFyZW50IHNjb3BlLicsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc3ViZmxvd0lkOiBsYXN0U2VnbWVudCxcbiAgICBleGVjdXRpb25UcmVlOiBmb3VuZE5vZGUsXG4gICAgc2hhcmVkU3RhdGU6IHVuZGVmaW5lZCxcbiAgICBuYXJyYXRpdmVFbnRyaWVzOiBhbGxOYXJyYXRpdmVFbnRyaWVzID8gZXh0cmFjdFNjb3BlZE5hcnJhdGl2ZShhbGxOYXJyYXRpdmVFbnRyaWVzLCBsYXN0U2VnbWVudCkgOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbi8qKlxuICogTGlzdCBhbGwgYXZhaWxhYmxlIHN1YmZsb3cgcGF0aHMgaW4gYSBzbmFwc2hvdC5cbiAqXG4gKiBSZXR1cm5zIHRoZSBrZXlzIGZyb20gYHN1YmZsb3dSZXN1bHRzYCwgd2hpY2ggYXJlIHNsYXNoLXNlcGFyYXRlZFxuICogc3ViZmxvdyBJRCBwYXRocyAoZS5nLiBgW1wic2YtcGF5bWVudFwiLCBcInNmLW91dGVyL3NmLWlubmVyXCJdYCkuXG4gKiBVc2VmdWwgZm9yIGRpc2NvdmVyeSDigJQgYW4gTExNIG9yIFVJIGNhbiBlbnVtZXJhdGUgYXZhaWxhYmxlIGRyaWxsLWRvd24gdGFyZ2V0cy5cbiAqXG4gKiBAcGFyYW0gc25hcHNob3Qg4oCUIHRoZSBmdWxsIFJ1bnRpbWVTbmFwc2hvdCBmcm9tIGBleGVjdXRvci5nZXRTbmFwc2hvdCgpYFxuICogQHJldHVybnMgYXJyYXkgb2YgYXZhaWxhYmxlIHN1YmZsb3cgcGF0aHMsIGVtcHR5IGlmIG5vbmVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RTdWJmbG93UGF0aHMoc25hcHNob3Q6IFJ1bnRpbWVTbmFwc2hvdCk6IHN0cmluZ1tdIHtcbiAgaWYgKCFzbmFwc2hvdD8uc3ViZmxvd1Jlc3VsdHMpIHJldHVybiBbXTtcbiAgLy8gYHN1YmZsb3dSZXN1bHRzYCBpcyBkdWFsLWtleWVkIChkZXNpZ246IHN1YmZsb3ctY29tbWl0LXZpc2liaWxpdHkpOiBzdWJmbG93IFBBVEhTIHBsdXNcbiAgLy8gcGVyLWl0ZXJhdGlvbiBtb3VudCBgcnVudGltZVN0YWdlSWRgcyAod2hpY2ggY29udGFpbiAnIycpLiBUaGlzIGZ1bmN0aW9uJ3MgY29udHJhY3QgaXNcbiAgLy8gcGF0aC1vbmx5LCBzbyBmaWx0ZXIgdGhlICcjJyBrZXlzIG91dCDigJQgYWRkcmVzc2luZyBhIHNwZWNpZmljIGl0ZXJhdGlvbiBpcyBkb25lIGJ5IHBhc3NpbmdcbiAgLy8gaXRzIHJ1bnRpbWVTdGFnZUlkIHN0cmFpZ2h0IHRvIGdldFN1YnRyZWVTbmFwc2hvdC5cbiAgcmV0dXJuIE9iamVjdC5rZXlzKHNuYXBzaG90LnN1YmZsb3dSZXN1bHRzKS5maWx0ZXIoKGspID0+ICFpc0V4ZWN1dGlvbktleShrKSk7XG59XG5cbi8qKlxuICogRXh0cmFjdCBuYXJyYXRpdmUgZW50cmllcyBzY29wZWQgdG8gYSBzcGVjaWZpYyBzdWJmbG93LlxuICogRmlsdGVycyBieSBlbnRyeS5zdWJmbG93SWQgZmllbGQgKHNldCBieSBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIGR1cmluZyB0cmF2ZXJzYWwpLlxuICogQWxzbyBpbmNsdWRlcyB0aGUgc3ViZmxvdyBlbnRyeS9leGl0IG1hcmtlciBlbnRyaWVzIHRoZW1zZWx2ZXMuXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RTY29wZWROYXJyYXRpdmUoZW50cmllczogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdLCBwYXRoOiBzdHJpbmcpOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10ge1xuICAvLyBUaGUgbGFzdCBzZWdtZW50IG9mIHRoZSBwYXRoIGlzIHRoZSBzdWJmbG93SWQgc3RvcmVkIG9uIGVudHJpZXNcbiAgY29uc3Qgc3ViZmxvd0lkID0gc3BsaXRTdGFnZUlkKHBhdGgpLmxvY2FsU3RhZ2VJZDtcbiAgcmV0dXJuIGVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4ge1xuICAgIC8vIEluY2x1ZGUgZW50cmllcyB3aG9zZSBzdWJmbG93SWQgbWF0Y2hlcyAoZXZlbnRzIGVtaXR0ZWQgd2hpbGUgaW5zaWRlIHRoaXMgc3ViZmxvdylcbiAgICBpZiAoZW50cnkuc3ViZmxvd0lkID09PSBzdWJmbG93SWQpIHJldHVybiB0cnVlO1xuICAgIC8vIEFsc28gaW5jbHVkZSB0aGUgc3ViZmxvdyBlbnRyeS9leGl0IG1hcmtlcnMgKHRoZXkgY2FycnkgdGhlIHBhcmVudCBzdWJmbG93SWQgb3IgdW5kZWZpbmVkKVxuICAgIGlmIChlbnRyeS50eXBlID09PSAnc3ViZmxvdycgJiYgZW50cnkuc3RhZ2VJZCA9PT0gc3ViZmxvd0lkKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0pO1xufVxuXG4vKipcbiAqIEZpbmQgYSBzdWJmbG93IG5vZGUgaW4gdGhlIGV4ZWN1dGlvbiB0cmVlIGJ5IHNlYXJjaGluZyBmb3IgYSBub2RlXG4gKiB3aG9zZSBzdWJmbG93SWQgbWF0Y2hlcy5cbiAqIFNlYXJjaGVzIGRlcHRoLWZpcnN0IHRocm91Z2ggYG5leHRgIGFuZCBgY2hpbGRyZW5gIGxpbmtzLlxuICovXG5mdW5jdGlvbiBmaW5kU3ViZmxvd0luVHJlZShub2RlOiBTdGFnZVNuYXBzaG90IHwgdW5kZWZpbmVkLCBzdWJmbG93SWQ6IHN0cmluZyk6IFN0YWdlU25hcHNob3QgfCB1bmRlZmluZWQge1xuICBpZiAoIW5vZGUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgaWYgKG5vZGUuc3ViZmxvd0lkID09PSBzdWJmbG93SWQpIHJldHVybiBub2RlO1xuXG4gIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICBjb25zdCBmb3VuZCA9IGZpbmRTdWJmbG93SW5UcmVlKGNoaWxkLCBzdWJmbG93SWQpO1xuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICB9XG5cbiAgaWYgKG5vZGUubmV4dCkge1xuICAgIHJldHVybiBmaW5kU3ViZmxvd0luVHJlZShub2RlLm5leHQsIHN1YmZsb3dJZCk7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19
|
|
@@ -20,9 +20,9 @@
|
|
|
20
20
|
*/
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
22
|
exports.announceResume = exports.seedCounters = exports.planResume = void 0;
|
|
23
|
+
const foottrace_1 = require("foottrace");
|
|
23
24
|
const ResumeEntry_js_1 = require("../engine/handlers/ResumeEntry.js");
|
|
24
25
|
const traversalContext_js_1 = require("../engine/traversalContext.js");
|
|
25
|
-
const runtimeStageId_js_1 = require("../ids/runtimeStageId.js");
|
|
26
26
|
const interrupt_js_1 = require("../pause/interrupt.js");
|
|
27
27
|
const record_js_1 = require("../pause/record.js");
|
|
28
28
|
const types_js_1 = require("../pause/types.js");
|
|
@@ -159,7 +159,7 @@ function announceResume(plan, resumeInput, run) {
|
|
|
159
159
|
const { observers } = run;
|
|
160
160
|
const hasInput = resumeInput !== undefined;
|
|
161
161
|
const stepsBeforeStandIn = entry.stepsBeforeStandIn ?? checkpoint.subflowPath.length;
|
|
162
|
-
const resumeRuntimeStageId = (0,
|
|
162
|
+
const resumeRuntimeStageId = (0, foottrace_1.buildRuntimeStageId)(pausedNode.id, run.executionCount + stepsBeforeStandIn);
|
|
163
163
|
const resumedFrom = resumeLinkOf(checkpoint);
|
|
164
164
|
const flowResumeEvent = {
|
|
165
165
|
stageName: pausedNode.name,
|
|
@@ -304,4 +304,4 @@ function dfsFind(node, targetId, visited = new Set()) {
|
|
|
304
304
|
return dfsFind(node.next, targetId, visited);
|
|
305
305
|
return undefined;
|
|
306
306
|
}
|
|
307
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ydW5uZXIvcmVzdW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHOzs7QUFHSCxzRUFBZ0U7QUFFaEUsdUVBQXVFO0FBRXZFLGdFQUErRDtBQUMvRCx3REFBK0Q7QUFDL0Qsa0RBQXNEO0FBRXRELGdEQUFzRDtBQUN0RCxtREFBaUY7QUFhakYsbUdBQW1HO0FBQ25HLE1BQU0sbUJBQW1CLEdBQUcsSUFBQSx3QkFBYSxFQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFL0Q7Ozs7R0FJRztBQUNILFNBQWdCLFVBQVUsQ0FDeEIsRUFBMkIsRUFDM0IsTUFBMkIsRUFDM0IsV0FBb0I7SUFFcEIsd0VBQXdFO0lBQ3hFLHVFQUF1RTtJQUN2RSxNQUFNLFVBQVUsR0FBRyxJQUFBLDRCQUFnQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTVDLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQ2IseUJBQXlCLFVBQVUsQ0FBQyxhQUFhLDRCQUE0QjtZQUMzRSw4REFBOEQsQ0FDakUsQ0FBQztJQUNKLENBQUM7SUFDRCwyREFBMkQ7SUFDM0QsRUFBRTtJQUNGLHVFQUF1RTtJQUN2RSw0RUFBNEU7SUFDNUUsMEVBQTBFO0lBQzFFLDRFQUE0RTtJQUM1RSx5RUFBeUU7SUFDekUsMERBQTBEO0lBQzFELHlEQUF5RDtJQUN6RCxFQUFFO0lBQ0Ysc0VBQXNFO0lBQ3RFLDhFQUE4RTtJQUM5RSxNQUFNLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxRQUFRLEtBQUssV0FBVyxDQUFDO0lBQzlELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxJQUFJLENB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QUFFLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3RDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELElBQUksS0FBSztnQkFBRSxPQUFPLEtBQUssQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZXN1bWUg4oCUIGhvdyBgRmxvd0NoYXJ0RXhlY3V0b3IucmVzdW1lKClgIHBsYW5zIGFuZCBhbm5vdW5jZXMgYSByZS1lbnRyeSAoRjkpLlxuICpcbiAqIFRocmVlIHN0ZXBzLCBpbiB0aGUgb3JkZXIgdGhlIGV4ZWN1dG9yIHRha2VzIHRoZW06XG4gKlxuICogICAxLiB7QGxpbmsgcGxhblJlc3VtZX0g4oCUIGRlY29kZSB0aGUgY2hlY2twb2ludCAodGhlIE9ORSBjb2RlYyxcbiAqICAgICAgYHBhdXNlL3JlY29yZC50c2ApLCBmaW5kIHRoZSBwYXVzZWQgc3RhZ2UgaW4gdGhlIGNoYXJ0IGFzIGJ1aWx0LCBidWlsZFxuICogICAgICB0aGUgcmVzdW1lIGhhbGYgYW5kIHRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiwgYW5kIHBsYW4gdGhlIG9uZS1zaG90XG4gKiAgICAgIHJlLWVudHJ5IChgUmVzdW1lRW50cnkucGxhbmApLiBFdmVyeSByZWZ1c2FsIGhhcHBlbnMgSEVSRSwgYmVmb3JlIGFueVxuICogICAgICBleGVjdXRvciBzdGF0ZSBpcyB0b3VjaGVkLlxuICogICAyLiB7QGxpbmsgc2VlZENvdW50ZXJzfSDigJQgY2FycnkgdGhlIHBhdXNlLXRpbWUgZXhlY3V0aW9uIGNvdW50ZXIgYW5kIHZpc2l0XG4gKiAgICAgIGNvdW50cyBpbnRvIHRoZSBydW4ncyBzaGFyZWQgY291bnRlcnMgKG11dGF0ZWQsIG5ldmVyIHJlcGxhY2VkKS5cbiAqICAgMy4ge0BsaW5rIGFubm91bmNlUmVzdW1lfSDigJQgZmlyZSB0aGUgZXhlY3V0b3ItbWFkZSBgb25SZXN1bWVgIG9uIHRoZSBmbG93XG4gKiAgICAgIGFuZCBzY29wZSBjaGFubmVscyAoYW5kIGNhcHR1cmUgaXQgZm9yIHRoZSBkZWZlcnJlZCB0aWVyKSwgQkVGT1JFIHRoZVxuICogICAgICB0cmF2ZXJzYWwgc28gaXQgcHJlY2VkZXMgYG9uUnVuU3RhcnRgLlxuICpcbiAqIFRoZSBleGVjdXRvciBvd25zIHRoZSBwZXItcnVuIHN0YXRlIGJldHdlZW4gdGhlIHN0ZXBzICh0aGUgcnVuSWQsIHRoZVxuICogcnVudGltZSwgdGhlIHRyYXZlcnNlcik7IHRoaXMgbW9kdWxlIG5ldmVyIGhvbGRzIGFueS5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dDaGFydCB9IGZyb20gJy4uL2J1aWxkZXIvdHlwZXMuanMnO1xuaW1wb3J0IHsgUmVzdW1lRW50cnkgfSBmcm9tICcuLi9lbmdpbmUvaGFuZGxlcnMvUmVzdW1lRW50cnkuanMnO1xuaW1wb3J0IHR5cGUgeyBSZXN1bWVMaW5rIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyByZXN1bWVUcmF2ZXJzYWxDb250ZXh0IH0gZnJvbSAnLi4vZW5naW5lL3RyYXZlcnNhbENvbnRleHQuanMnO1xuaW1wb3J0IHR5cGUgeyBTdGFnZUZ1bmN0aW9uLCBTdGFnZU5vZGUgfSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgYnVpbGRSdW50aW1lU3RhZ2VJZCB9IGZyb20gJy4uL2lkcy9ydW50aW1lU3RhZ2VJZC5qcyc7XG5pbXBvcnQgeyBwcm92aWRlSW50ZXJydXB0QW5zd2VyIH0gZnJvbSAnLi4vcGF1c2UvaW50ZXJydXB0LmpzJztcbmltcG9ydCB7IGRlY29kZUNoZWNrcG9pbnQgfSBmcm9tICcuLi9wYXVzZS9yZWNvcmQuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93Y2hhcnRDaGVja3BvaW50IH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZWRFeGVjdXRpb24gfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBmaXJlLCByZWNvcmRlckZhaWx1cmVFdmVudCwgd2FybkluRGV2TW9kZSB9IGZyb20gJy4uL3JlY29yZGVyL2hvb2tzLmpzJztcbmltcG9ydCB0eXBlIHsgUnVuT2JzZXJ2ZXJzIH0gZnJvbSAnLi9hdHRhY2guanMnO1xuXG4vKiogRXZlcnl0aGluZyBhIHJlc3VtZSBkZWNpZGVkIGJlZm9yZSBhbnkgZXhlY3V0b3Igc3RhdGUgd2FzIHRvdWNoZWQuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlc3VtZVBsYW48VE91dCwgVFNjb3BlPiB7XG4gIC8qKiBUaGUgZGVjb2RlZCBjaGVja3BvaW50ICh1cGNhc3QgYW5kIGNoZWNrZWQpLiAqL1xuICByZWFkb25seSBjaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50O1xuICAvKiogVGhlIHBhdXNlZCBzdGFnZSdzIFJFQUwgbm9kZSBpbiB0aGUgY2hhcnQuICovXG4gIHJlYWRvbmx5IHBhdXNlZE5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAvKiogV2hlcmUgdGhlIHJlc3VtZWQgdHJhdmVyc2FsIHN0YXJ0cywgYW5kIHdoYXQgZWFjaCBzdWJmbG93IG9uIHRoZSBwYXRoIHRha2VzIG9uIGl0cyBmaXJzdCBlbnRyeS4gKi9cbiAgcmVhZG9ubHkgZW50cnk6IFJlc3VtZUVudHJ5PFRPdXQsIFRTY29wZT47XG59XG5cbi8qKiBUaGUgZmxvdyBjaGFubmVsJ3MgaXNvbGF0aW9uIGZvciB0aGUgZXhlY3V0b3ItbWFkZSBgb25SZXN1bWVgIChkZXYtbW9kZSB3YXJuaW5nLCB0aGVuIHNraXApLiAqL1xuY29uc3QgUkVTVU1FX0ZMT1dfRkFJTFVSRSA9IHdhcm5JbkRldk1vZGUoJ0Zsb3dDaGFydEV4ZWN1dG9yJyk7XG5cbi8qKlxuICogUGxhbiB0aGUgcmVzdW1lIGFnYWluc3QgdGhlIGNoYXJ0IGFzIGJ1aWx0LiBUaHJvd3Mg4oCUIGxlYXZpbmcgdGhlIGV4ZWN1dG9yXG4gKiB1bnRvdWNoZWQg4oCUIHdoZW4gdGhlIGNoZWNrcG9pbnQgaXMgbWFsZm9ybWVkLCB0aGUgcGF1c2VkIHN0YWdlIGlzIGdvbmUsIGl0XG4gKiBjYW5ub3QgYmUgcmVzdW1lZCwgb3IgaXRzIHBhdGggZG9lcyBub3QgZml0IHRoaXMgY2hhcnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbGFuUmVzdW1lPFRPdXQsIFRTY29wZT4oXG4gIGZjOiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgc3RvcmVkOiBGbG93Y2hhcnRDaGVja3BvaW50LFxuICByZXN1bWVJbnB1dDogdW5rbm93bixcbik6IFJlc3VtZVBsYW48VE91dCwgVFNjb3BlPiB7XG4gIC8vIERlY29kZSB0aGUgY2hlY2twb2ludCAobWF5IGNvbWUgZnJvbSB1bnRydXN0ZWQgZXh0ZXJuYWwgc3RvcmFnZSwgZnJvbVxuICAvLyBhbnkgcmVsZWFzZSkg4oCUIHRoZSBPTkUgY29kZWM6IHVwY2FzdCwgdGhlbiBjaGVjayBldmVyeSBwYXVzZSByZWNvcmQuXG4gIGNvbnN0IGNoZWNrcG9pbnQgPSBkZWNvZGVDaGVja3BvaW50KHN0b3JlZCk7XG5cbiAgY29uc3QgcGF1c2VkTm9kZSA9IGZpbmROb2RlSW5HcmFwaChmYywgY2hlY2twb2ludC5wYXVzZWRTdGFnZUlkLCBjaGVja3BvaW50LnN1YmZsb3dQYXRoKTtcbiAgaWYgKCFwYXVzZWROb2RlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke2NoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZH0nIG5vdCBmb3VuZCBpbiBmbG93Y2hhcnQuIGAgK1xuICAgICAgICAnVGhlIGNoYXJ0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQuJyxcbiAgICApO1xuICB9XG4gIC8vIFR3byByZS1lbnRyeSBzaGFwZXMsIGNob3NlbiBieSBIT1cgdGhlIHBhdXNlIHdhcyByYWlzZWQ6XG4gIC8vXG4gIC8vICAg4oCiIGludGVycnVwdCgpICAgICAg4oaSIFJFLVJVTiBUSEUgU1RBR0UnUyBPV04gRlVOQ1RJT04gRlJPTSBJVFMgVE9QLlxuICAvLyAgICAgU3RhZ2VzIGFyZSBhdG9taWMgKHRoZSBzYW1lIGxhdyBgcmVzdW1lT25FcnJvcmAgc3RhdGVzKTogYSBzdGFnZSB0aGF0XG4gIC8vICAgICBzdG9wcGVkIG1pZC1ib2R5IGhhcyBubyBoYWxmIHRvIHJlc3VtZSBpbnRvLCBzbyB0aGUgd2hvbGUgYm9keSBydW5zXG4gIC8vICAgICBhZ2FpbiBhbmQgdGhlIGFuc3dlciBjb21lcyBiYWNrIG91dCBvZiB0aGUgYGludGVycnVwdCgpYCBjYWxsIGl0c2VsZi5cbiAgLy8gICAgIEV2ZXJ5dGhpbmcgdGhlIGJvZHkgZGlkIGJlZm9yZSB0aGUgaW50ZXJydXB0IGlzIHJlLWRvbmUg4oCUIHdoaWNoIGlzXG4gIC8vICAgICB3aHkgdGhlIGRvY3MgdGVsbCB5b3UgdG8ga2VlcCB0aGF0IGhhbGYgaWRlbXBvdGVudC5cbiAgLy8gICDigKIgYWRkUGF1c2FibGVGdW5jdGlvbiDihpIgcnVuIHRoZSBkZWNsYXJlZCBgcmVzdW1lRm5gLlxuICAvL1xuICAvLyBUaGUgZGlzY3JpbWluYW50IGlzIG9uIHRoZSBjaGVja3BvaW50LCBzbyB0aGlzIHdvcmtzIGNyb3NzLWV4ZWN1dG9yXG4gIC8vIChhIGNoZWNrcG9pbnQgcmVzdG9yZWQgZnJvbSBSZWRpcyBvbiBhIGZyZXNoIHByb2Nlc3MgcmVzdW1lcyB0aGUgc2FtZSB3YXkpLlxuICBjb25zdCBpc0ludGVycnVwdFJlc3VtZSA9IGNoZWNrcG9pbnQucGF1c2VkQnkgPT09ICdpbnRlcnJ1cHQnO1xuICBpZiAoIXBhdXNlZE5vZGUucmVzdW1lRm4gJiYgIWlzSW50ZXJydXB0UmVzdW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke3BhdXNlZE5vZGUubmFtZX0nICgke3BhdXNlZE5vZGUuaWR9KSBoYXMgbm8gcmVzdW1lRm4uIGAgK1xuICAgICAgICAnT25seSBzdGFnZXMgY3JlYXRlZCB3aXRoIGFkZFBhdXNhYmxlRnVuY3Rpb24oKSwgb3Igc3RhZ2VzIHRoYXQgcGF1c2VkIHZpYSBpbnRlcnJ1cHQoKSwgY2FuIGJlIHJlc3VtZWQuJyxcbiAgICApO1xuICB9XG4gIGNvbnN0IHJlc3VtZVN0YWdlRm4gPSByZXN1bWVIYWxmT2YoZmMsIHBhdXNlZE5vZGUsIGlzSW50ZXJydXB0UmVzdW1lLCByZXN1bWVJbnB1dCk7XG5cbiAgLy8gVGhlIHBhdXNlZCBzdGFnZSdzIFNUQU5ELUlOOiB0aGUgc3RhZ2UncyBPV04gbm9kZSDigJQgaWQsIG5hbWUsXG4gIC8vIGRlc2NyaXB0aW9uLCB0YWdzLCBhbmQgaXRzIHNoYXBlIChhIGRlY2lkZXIncyBicmFuY2hlcywgYSBzZWxlY3RvcidzLCBhXG4gIC8vIGZvcmsgcGFyZW50J3MgY2hpbGRyZW4sIGl0cyBgbmV4dGApIOKAlCB3aXRoIGl0cyBmdW5jdGlvbiBzd2FwcGVkIGZvciB0aGVcbiAgLy8gcmVzdW1lIGhhbGYuIEJ1aWx0IGZyb20gdGhlIHdob2xlIG5vZGUgc28gYW4gYGludGVycnVwdCgpYCByYWlzZWQgaW5zaWRlXG4gIC8vIGEgZGVjaWRlciwgc2VsZWN0b3Igb3IgZm9yay1wYXJlbnQgZnVuY3Rpb24gRElTUEFUQ0hFUyBvbiByZXN1bWUsIGFzIHRoZVxuICAvLyBzdGFnZSBkaWQgb24gdGhlIHJ1biAoYmVmb3JlIDkuMjguMCBvbmx5IGZuL25leHQvdGFncy9yZXRyeSB3ZXJlIGNvcGllZFxuICAvLyBhbmQgdGhlIGRpc3BhdGNoIHdhcyBzaWxlbnRseSBza2lwcGVkKS4gSXQgaXMgd2hlcmUgdGhlIHJlc3VtZWRcbiAgLy8gdHJhdmVyc2FsIHN0YXJ0cyDigJQgYW5kIG5vdGhpbmcgZWxzZTogaXQgaXMgbmV2ZXIgaW4gYSBub2RlIG1hcCBvciB0aGVcbiAgLy8gc3ViZmxvdyBkaWN0aW9uYXJ5LCBzbyBhIGxvb3AgYmFjayB0byB0aGUgcGF1c2VkIGlkIGZpbmRzIHRoZSBSRUFMXG4gIC8vIHN0YWdlLCB3aGljaCBwYXVzZXMgYWdhaW4gKHNlZSBSZXN1bWVFbnRyeSkuIFdoYXQgcnVucyBhZnRlciBpdCDigJQgaXRzXG4gIC8vIG93biBgbmV4dGAsIGVsc2UgaXRzIGRpc3BhdGNoZXIncyBjb250aW51YXRpb24g4oCUIGlzIGF0dGFjaGVkIGJ5XG4gIC8vIGBSZXN1bWVFbnRyeS5wbGFuYCwgZnJvbSB0aGUgY2hhcnQuXG4gIGNvbnN0IHN0YW5kSW4gPSBzdGFuZEluRm9yKHBhdXNlZE5vZGUsIHJlc3VtZVN0YWdlRm4sIGlzSW50ZXJydXB0UmVzdW1lKTtcblxuICAvLyBXaGVyZSB0aGUgcmVzdW1lIHJlLWVudGVycywgcGxhbm5lZCBhZ2FpbnN0IHRoZSBjaGFydCBhcyBidWlsdDpcbiAgLy9cbiAgLy8gICDigKIgVE9QLUxFVkVMIFBBVVNFIChzdWJmbG93UGF0aCBlbXB0eSk6IHRoZSByZXN1bWVkIHRyYXZlcnNhbCBzdGFydHNcbiAgLy8gICAgIGF0IHRoZSBzdGFuZC1pbi5cbiAgLy8gICDigKIgUEFVU0UgSU5TSURFIFNVQkZMT1dTOiBpdCBzdGFydHMgYXQgdGhlIG1vdW50IG9mIHRoZSBmaXJzdCBzdWJmbG93XG4gIC8vICAgICBvbiB0aGUgcGF0aCwgc28gdGhlIG91dHB1dE1hcHBlcnMgYW5kIHRoZSBwYXJlbnQncyBjb250aW51YXRpb25cbiAgLy8gICAgIHJ1bi4gRWFjaCBzdWJmbG93IG9uIHRoZSBwYXRoIGlzIGVudGVyZWQgT05DRSB0aHJvdWdoIGl0cyBob3A6IGl0c1xuICAvLyAgICAgbmVzdGVkIHJ1bnRpbWUgaXMgc2VlZGVkIGZyb20gaXRzIGNhcHR1cmUgKGluIHBsYWNlIG9mIHRoZVxuICAvLyAgICAgaW5wdXRNYXBwZXIncyB2YWx1ZXMpIGFuZCBpdHMgdHJhdmVyc2FsIHN0YXJ0cyBhdCB0aGUgbW91bnQgb2YgdGhlXG4gIC8vICAgICBuZXh0IHN1YmZsb3cg4oCUIG9yLCBhdCB0aGUgbGVhZiwgYXQgdGhlIHN0YW5kLWluLiBBbiBvdXRlciBzdWJmbG93J3NcbiAgLy8gICAgIHN0YWdlcyBiZWZvcmUgdGhhdCBtb3VudCBkbyBub3QgcnVuIGFnYWluLlxuICAvLyAgIOKAoiBBVCBFVkVSWSBMRVZFTCB0aGUgZW50cnkgY2FycmllcyB3aGF0IGl0cyBkaXNwYXRjaGVyIHdvdWxkIGhhdmUgcnVuXG4gIC8vICAgICBhZnRlciBpdCDigJQgYSBkZWNpZGVyJ3MgYG5leHRgLCBhIHNlbGVjdG9yJ3MsIGEgZm9yaydzIGpvaW4g4oCUIHNvIGFcbiAgLy8gICAgIHN1YmZsb3cgbW91bnRlZCBhcyBhIGJyYW5jaCBvciBhIGZvcmsgY2hpbGQgaGFuZHMgY29udHJvbCBiYWNrIHRvXG4gIC8vICAgICBpdHMgcGFyZW50J3MgY29udGludWF0aW9uIGF0IHRoZSBwYXJlbnQncyBsZXZlbC5cbiAgLy8gICDigKIgUGFyYWxsZWwgc2libGluZ3MgdGhhdCBwYXVzZWQgaW4gdGhlIHNhbWUgZmFuLW91dCB3YWl0IGluXG4gIC8vICAgICBgY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzYDogZWFjaCBpcyByYWlzZWQgYWdhaW4gaW4gdHVybiwgYW5kIHRoZVxuICAvLyAgICAgam9pbiBydW5zIG9ubHkgb25jZSB0aGUgbGFzdCBvbmUgaXMgcmVzdW1lZC5cbiAgLy9cbiAgLy8gRXZlcnl0aGluZyBlbHNlIHdhbGtzIHRoZSBSRUFMIGNoYXJ0OiBgZmMucm9vdGAgYW5kIGBmYy5zdWJmbG93c2AgYXJlXG4gIC8vIHVudG91Y2hlZCwgc28gZXZlcnkgbGF0ZXIgbG9vcCB0YXJnZXQgYW5kIGV2ZXJ5IGxhdGVyIHN1YmZsb3cgZW50cnlcbiAgLy8gKHJlYWwgcm9vdCwgaW5wdXRNYXBwZXIpIHJlc29sdmVzIGFzIGl0IHdvdWxkIG9uIGEgcnVuLiBSZWZ1c2VkIEhFUkUg4oCUXG4gIC8vIGJlZm9yZSBhbnkgc3RhdGUgaXMgdG91Y2hlZCDigJQgd2hlbiB0aGUgY2hlY2twb2ludCdzIHBhdGggZG9lcyBub3QgZml0XG4gIC8vIHRoaXMgY2hhcnQuXG4gIC8vXG4gIC8vIENsb25lLWluOiB0aGUgY2FwdHVyZXMgc2VlZCBuZXN0ZWQgcnVudGltZXMgKHNoYWxsb3ctbWVyZ2VkIGludG8gZWFjaFxuICAvLyBuZXN0ZWQgU2hhcmVkTWVtb3J5KSwgc28gd2l0aG91dCBhIGNvcHkgdGhlIGVuZ2luZSB3b3VsZCBob2xkIGxpdmVcbiAgLy8gcmVmZXJlbmNlcyBpbnRvIHRoZSBjYWxsZXIncyBjaGVja3BvaW50IG9iamVjdCDigJQgY2FsbGVyIG11dGF0aW9ucyB3b3VsZFxuICAvLyBibGVlZCBpbnRvIHRoZSByZXN1bWVkIHJ1biBhbmQgZW5naW5lIHdyaXRlcyB3b3VsZCByZWFjaCBhIGNoZWNrcG9pbnRcbiAgLy8gdGhlIGNhbGxlciBtYXkgaGF2ZSBhbHJlYWR5IHBlcnNpc3RlZC4gVGhlIHNhbWUgZm9yIHRoZSB3YWl0aW5nXG4gIC8vIHNpYmxpbmdzJyBjYXB0dXJlcy5cbiAgY29uc3QgZW50cnkgPSBSZXN1bWVFbnRyeS5wbGFuPFRPdXQsIFRTY29wZT4oe1xuICAgIHJvb3Q6IGZjLnJvb3QsXG4gICAgc3ViZmxvd3M6IGZjLnN1YmZsb3dzLFxuICAgIHBhdGg6IGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgsXG4gICAgY2FwdHVyZXM6IHN0cnVjdHVyZWRDbG9uZShjaGVja3BvaW50LnN1YmZsb3dTdGF0ZXMpLFxuICAgIHN0YW5kSW4sXG4gICAgLi4uKGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlcyAhPT0gdW5kZWZpbmVkICYmIHsgcGVuZGluZ1BhdXNlczogc3RydWN0dXJlZENsb25lKGNoZWNrcG9pbnQucGVuZGluZ1BhdXNlcykgfSksXG4gIH0pO1xuICByZXR1cm4geyBjaGVja3BvaW50LCBwYXVzZWROb2RlLCBlbnRyeSB9O1xufVxuXG4vKipcbiAqIFNlZWQgdGhlIHJ1bidzIHNoYXJlZCBleGVjdXRpb24gY291bnRlciArIHBlci1zdGFnZSB2aXNpdCBjb3VudHMgZnJvbSB0aGVcbiAqIGNoZWNrcG9pbnQsIHNvIHJ1bnRpbWVTdGFnZUlkcyBzdGF5IHVuaXF1ZSBhbmQgbG9vcEl0ZXJhdGlvbiBtb25vdG9uaWNcbiAqIGFjcm9zcyBhIENST1NTLWV4ZWN1dG9yIHJlc3VtZSAoYSBmcmVzaCBleGVjdXRvciBzdGFydHMgYm90aCBhdCAwL2VtcHR5KS5cbiAqXG4gKiBNVVRBVEUsIG5ldmVyIFJFUExBQ0U6IGJvdGggYXJlIHNoYXJlZCBieSByZWZlcmVuY2UgaW50byB0aGUgdHJhdmVyc2VyXG4gKiAoYW5kLCB0cmFuc2l0aXZlbHksIGV2ZXJ5IHN1YmZsb3cgdHJhdmVyc2VyKS4gQm90aCBmaWVsZHMgYXJlIG9wdGlvbmFsIG9uXG4gKiB0aGUgY2hlY2twb2ludCAob2xkZXIgcGVyc2lzdGVkIGNoZWNrcG9pbnRzIG9taXQgdGhlbSkg4oCUIHNlZWRpbmcgaXMgc2tpcHBlZFxuICogd2hlbiBhYnNlbnQuIFNhbWUtZXhlY3V0b3IgcmVzdW1lIGlzIGlkZW1wb3RlbnQ6IGF0IHBhdXNlIHRoZSB2YWx1ZXNcbiAqIGFscmVhZHkgZXF1YWwgdGhlIGNoZWNrcG9pbnQncy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNlZWRDb3VudGVycyhcbiAgY2hlY2twb2ludDogRmxvd2NoYXJ0Q2hlY2twb2ludCxcbiAgZXhlY3V0aW9uQ291bnRlcjogeyB2YWx1ZTogbnVtYmVyIH0sXG4gIHZpc2l0Q291bnRzOiBNYXA8c3RyaW5nLCBudW1iZXI+LFxuKTogdm9pZCB7XG4gIGlmIChjaGVja3BvaW50LmV4ZWN1dGlvbkNvdW50ICE9PSB1bmRlZmluZWQpIHtcbiAgICBleGVjdXRpb25Db3VudGVyLnZhbHVlID0gY2hlY2twb2ludC5leGVjdXRpb25Db3VudDtcbiAgfVxuICBpZiAoY2hlY2twb2ludC52aXNpdENvdW50cykge1xuICAgIHZpc2l0Q291bnRzLmNsZWFyKCk7XG4gICAgZm9yIChjb25zdCBbc3RhZ2VJZCwgY291bnRdIG9mIE9iamVjdC5lbnRyaWVzKGNoZWNrcG9pbnQudmlzaXRDb3VudHMpKSB7XG4gICAgICB2aXNpdENvdW50cy5zZXQoc3RhZ2VJZCwgY291bnQpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEZpcmUgdGhlIGV4ZWN1dG9yLW1hZGUgYG9uUmVzdW1lYCBvbiBldmVyeSByZWNvcmRlciAoZmxvdyArIHNjb3BlKSwgc3RhbXBlZFxuICogd2l0aCB0aGUgcmVzdW1lZCBsZWcncyBORVcgcnVuSWQg4oCUIGNvbnN1bWVycyBkZXRlY3QgXCJhIGZyZXNoIGxvZ2ljYWwgcnVuXCJcbiAqIGJ5IHRoZSBzYW1lIHJ1bklkIGNoYW5nZSB0aGV5IHVzZSBmb3IgYG9uUnVuU3RhcnRgLiBUaGUgc3RhbXAgaXMgYnVpbHQgYnlcbiAqIHRoZSBvbmUgY29uc3RydWN0b3IgKGBlbmdpbmUvdHJhdmVyc2FsQ29udGV4dC50c2ApOiBpdCBuYW1lcyB0aGUgUkVBTFxuICogc3ViZmxvdyB0aGUgc3RhbmQtaW4gcnVucyBpbiBhbmQgaXRzIGRlcHRoLCBhbmQgTElOS1MgdG8gdGhlIHBhdXNlZFxuICogZXhlY3V0aW9uIChgcmVzdW1lZEZyb21gLCByZWFkIG9mZiBgY2hlY2twb2ludC5wYXVzZWRFeGVjdXRpb25gKSDigJQgOS4zNy4wLlxuICpcbiAqIFRoZSBydW50aW1lU3RhZ2VJZCBpcyB0aGUgU1RBTkQtSU4ncyBvd246IGl0IHJ1bnMgYWZ0ZXIgb25lIG1vdW50IHBlclxuICogc3ViZmxvdyBvbiB0aGUgcGF0aCAoZWFjaCBlbnRlcmVkIGF0IGl0cyBtb3VudCksIHNvIGl0cyBleGVjdXRpb24gaW5kZXggaXNcbiAqIHRoZSBjb3VudGVyIHBsdXMgdGhlIHBhdGgncyBsZW5ndGgg4oCUIHRoZSBldmVudCBhbmQgdGhlIHN0YW5kLWluJ3MgY29tbWl0XG4gKiBuYW1lIHRoZSBzYW1lIGV4ZWN1dGlvbi4gVGhlIG9uZSBzaGFwZSB3aGVyZSB0aGUgaW5kZXggY2Fubm90IGJlIGtub3duIHVwXG4gKiBmcm9udCDigJQgYSBkZWdyYWRlZCBjaGVja3BvaW50IG1pc3NpbmcgYW4gT1VURVIgc3ViZmxvdydzIGNhcHR1cmUsIHdob3NlXG4gKiBvcGVuaW5nIHN0YWdlcyB0aGVuIHJlLXJ1biDigJQgbmFtZXMgdGhlIHBsYW5uZWQgcG9zaXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhbm5vdW5jZVJlc3VtZTxUT3V0LCBUU2NvcGU+KFxuICBwbGFuOiBSZXN1bWVQbGFuPFRPdXQsIFRTY29wZT4sXG4gIHJlc3VtZUlucHV0OiB1bmtub3duLFxuICBydW46IHsgcmVhZG9ubHkgcnVuSWQ6IHN0cmluZzsgcmVhZG9ubHkgZXhlY3V0aW9uQ291bnQ6IG51bWJlcjsgcmVhZG9ubHkgb2JzZXJ2ZXJzOiBSdW5PYnNlcnZlcnMgfSxcbik6IHZvaWQge1xuICBjb25zdCB7IGNoZWNrcG9pbnQsIHBhdXNlZE5vZGUsIGVudHJ5IH0gPSBwbGFuO1xuICBjb25zdCB7IG9ic2VydmVycyB9ID0gcnVuO1xuICBjb25zdCBoYXNJbnB1dCA9IHJlc3VtZUlucHV0ICE9PSB1bmRlZmluZWQ7XG4gIGNvbnN0IHN0ZXBzQmVmb3JlU3RhbmRJbiA9IGVudHJ5LnN0ZXBzQmVmb3JlU3RhbmRJbiA/PyBjaGVja3BvaW50LnN1YmZsb3dQYXRoLmxlbmd0aDtcbiAgY29uc3QgcmVzdW1lUnVudGltZVN0YWdlSWQgPSBidWlsZFJ1bnRpbWVTdGFnZUlkKHBhdXNlZE5vZGUuaWQsIHJ1bi5leGVjdXRpb25Db3VudCArIHN0ZXBzQmVmb3JlU3RhbmRJbik7XG4gIGNvbnN0IHJlc3VtZWRGcm9tID0gcmVzdW1lTGlua09mKGNoZWNrcG9pbnQpO1xuICBjb25zdCBmbG93UmVzdW1lRXZlbnQgPSB7XG4gICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgc3RhZ2VJZDogcGF1c2VkTm9kZS5pZCxcbiAgICBoYXNJbnB1dCxcbiAgICB0cmF2ZXJzYWxDb250ZXh0OiByZXN1bWVUcmF2ZXJzYWxDb250ZXh0KHtcbiAgICAgIHJ1bklkOiBydW4ucnVuSWQsXG4gICAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICBydW50aW1lU3RhZ2VJZDogcmVzdW1lUnVudGltZVN0YWdlSWQsXG4gICAgICBzdWJmbG93UGF0aDogY2hlY2twb2ludC5zdWJmbG93UGF0aCxcbiAgICAgIHJlc3VtZWRGcm9tLFxuICAgIH0pLFxuICAgIGNoYW5uZWw6ICdmbG93JyBhcyBjb25zdCxcbiAgfTtcbiAgLy8gRXhlY3V0b3ItbWFkZSAoYEhPT0tTLm9uUmVzdW1lLmV4ZWN1dG9yTWFkZWApOiBmaXJlZCB0aHJvdWdoIHRoZSBzYW1lIGBmaXJlYCBsb29wIGFzIGV2ZXJ5XG4gIC8vIGVuZ2luZSBldmVudCwgc28gYSB0aHJvd2luZyByZWNvcmRlciBpcyBpc29sYXRlZCBpbnN0ZWFkIG9mIHJlamVjdGluZyBgcmVzdW1lKClgIChSMTApLlxuICBmaXJlKG9ic2VydmVycy5pbmxpbmVGbG93TGlzdGVuZXJzKCksICdvblJlc3VtZScsIGZsb3dSZXN1bWVFdmVudCwgUkVTVU1FX0ZMT1dfRkFJTFVSRSk7XG5cbiAgY29uc3Qgc2NvcGVSZXN1bWVFdmVudCA9IHtcbiAgICBzdGFnZU5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgIHJ1bnRpbWVTdGFnZUlkOiByZXN1bWVSdW50aW1lU3RhZ2VJZCxcbiAgICBoYXNJbnB1dCxcbiAgICAuLi4ocmVzdW1lZEZyb20gJiYgeyByZXN1bWVkRnJvbSB9KSxcbiAgICBwaXBlbGluZUlkOiAnJyxcbiAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgY2hhbm5lbDogJ3Njb3BlJyBhcyBjb25zdCxcbiAgfTtcbiAgZmlyZShvYnNlcnZlcnMuc2NvcGVSZWNvcmRlcnMsICdvblJlc3VtZScsIHNjb3BlUmVzdW1lRXZlbnQsIChlcnJvciwgX3JlY29yZGVyLCBob29rKSA9PlxuICAgIC8vIFRoZSBzY29wZSBjaGFubmVsJ3MgcG9saWN5IChhcyBgU2NvcGVGYWNhZGVgIHJvdXRlcyBhIHN0YWdlJ3MgaG9vayBmYWlsdXJlKTogdGhlIHRocm93XG4gICAgLy8gYmVjb21lcyBhbiBgb25FcnJvcmAgb24gZXZlcnkgc2NvcGUgcmVjb3JkZXIsIHdob3NlIG93biB0aHJvdyBpcyBkcm9wcGVkLlxuICAgIGZpcmUob2JzZXJ2ZXJzLnNjb3BlUmVjb3JkZXJzLCAnb25FcnJvcicsIHJlY29yZGVyRmFpbHVyZUV2ZW50KHNjb3BlUmVzdW1lRXZlbnQsIGVycm9yLCBob29rKSksXG4gICk7XG5cbiAgLy8gRGVmZXJyZWQgdGllciAoUkZDLTAwMSk6IHRoZXNlIGV4ZWN1dG9yLXN5bnRoZXNpemVkIG9uUmVzdW1lIGV2ZW50c1xuICAvLyBieXBhc3MgdGhlIHBlci1zdGFnZSBkaXNwYXRjaCBzaXRlcywgc28gY2FwdHVyZSB0aGVtIGRpcmVjdGx5LlxuICBpZiAob2JzZXJ2ZXJzLmRlZmVycmVkVGllcikge1xuICAgIG9ic2VydmVycy5kZWZlcnJlZFRpZXIuY2FwdHVyZSgnZmxvdycsICdvblJlc3VtZScsIHJlc3VtZVJ1bnRpbWVTdGFnZUlkLCBydW4ucnVuSWQsIGZsb3dSZXN1bWVFdmVudCk7XG4gICAgb2JzZXJ2ZXJzLmRlZmVycmVkVGllci5jYXB0dXJlKFxuICAgICAgJ3Njb3BlJyxcbiAgICAgICdvblJlc3VtZScsXG4gICAgICBzY29wZVJlc3VtZUV2ZW50LnJ1bnRpbWVTdGFnZUlkLFxuICAgICAgc2NvcGVSZXN1bWVFdmVudC5waXBlbGluZUlkLFxuICAgICAgc2NvcGVSZXN1bWVFdmVudCxcbiAgICApO1xuICB9XG59XG5cbi8qKlxuICogVGhlIHJlc3VtZSBoYWxmIOKAlCB3aGF0IHRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiBydW5zLiBgaW50ZXJydXB0KClgOlxuICogdGhlIHN0YWdlJ3Mgb3duIGZ1bmN0aW9uLCB3aXRoIHRoZSBhbnN3ZXIgZGVwb3NpdGVkIGZvciBUSElTIHNjb3BlIGZpcnN0XG4gKiAoa2V5ZWQgYnkgc2NvcGUgaWRlbnRpdHkg4oCUIHNhZmUgd2hlbiBzZXZlcmFsIGJyYW5jaGVzIHJlc3VtZSBhdCBvbmNlKS5cbiAqIGBhZGRQYXVzYWJsZUZ1bmN0aW9uYDogdGhlIGRlY2xhcmVkIGByZXN1bWVGbihzY29wZSwgaW5wdXQpYCwgd3JhcHBlZCB0b1xuICogdGhlIGBTdGFnZUZ1bmN0aW9uYCBzaGFwZS5cbiAqL1xuZnVuY3Rpb24gcmVzdW1lSGFsZk9mPFRPdXQsIFRTY29wZT4oXG4gIGZjOiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgcGF1c2VkTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gIGlzSW50ZXJydXB0UmVzdW1lOiBib29sZWFuLFxuICByZXN1bWVJbnB1dDogdW5rbm93bixcbik6IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPiB7XG4gIGlmIChpc0ludGVycnVwdFJlc3VtZSkge1xuICAgIGNvbnN0IG9yaWdpbmFsRm4gPSBwYXVzZWROb2RlLmZuID8/IGZjLnN0YWdlTWFwLmdldChwYXVzZWROb2RlLmlkKSA/PyBmYy5zdGFnZU1hcC5nZXQocGF1c2VkTm9kZS5uYW1lKTtcbiAgICBpZiAoIW9yaWdpbmFsRm4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke3BhdXNlZE5vZGUubmFtZX0nICgke3BhdXNlZE5vZGUuaWR9KSBwYXVzZWQgdmlhIGludGVycnVwdCgpIGJ1dCBpdHMgYCArXG4gICAgICAgICAgJ3N0YWdlIGZ1bmN0aW9uIGlzIG5vIGxvbmdlciBpbiB0aGUgY2hhcnQuIFRoZSBjaGFydCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBjaGVja3BvaW50ICcgK1xuICAgICAgICAgICd3YXMgY3JlYXRlZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIChzY29wZSwgYnJlYWtGbiwgc3RyZWFtQ2FsbGJhY2spID0+IHtcbiAgICAgIHByb3ZpZGVJbnRlcnJ1cHRBbnN3ZXIoc2NvcGUsIHJlc3VtZUlucHV0KTtcbiAgICAgIHJldHVybiBvcmlnaW5hbEZuKHNjb3BlLCBicmVha0ZuLCBzdHJlYW1DYWxsYmFjayk7XG4gICAgfTtcbiAgfVxuICBjb25zdCByZXN1bWVGbiA9IHBhdXNlZE5vZGUucmVzdW1lRm4hO1xuICByZXR1cm4gKHNjb3BlOiBUU2NvcGUpID0+IHtcbiAgICByZXR1cm4gcmVzdW1lRm4oc2NvcGUsIHJlc3VtZUlucHV0KSBhcyBUT3V0IHwgUHJvbWlzZTxUT3V0PjtcbiAgfTtcbn1cblxuLyoqXG4gKiBUaGUgcGF1c2VkIHN0YWdlJ3Mgc3RhbmQtaW4gZm9yIGEgcmVzdW1lOiB0aGUgc3RhZ2UncyBPV04gbm9kZSDigJQgc28gaXQga2VlcHNcbiAqIGl0cyBzaGFwZSAoYSBkZWNpZGVyJ3Mgb3Igc2VsZWN0b3IncyBicmFuY2hlcywgYSBmb3JrIHBhcmVudCdzIGNoaWxkcmVuLFxuICogaXRzIGBuZXh0YCkgYW5kIGl0cyBuYW1lLCBkZXNjcmlwdGlvbiBhbmQgZGVjbGFyZWQgdGFncyDigJQgd2l0aCBgZm5gIHN3YXBwZWRcbiAqIGZvciB0aGUgcmVzdW1lIGhhbGYuXG4gKlxuICogRHJvcHBlZDogYHJlc3VtZUZuYCBhbmQgYGlzUGF1c2FibGVgICh0aGUgcmVzdW1lIGhhbGYgbXVzdCBub3QgcGF1c2VcbiAqIGJlY2F1c2UgaXQgcmV0dXJuZWQgYSB2YWx1ZSDigJQgdGhlIG9yaWdpbmFsIHBhdXNhYmxlIGNvbnRyYWN0KTsgYW5kLCBvbiB0aGVcbiAqIGBhZGRQYXVzYWJsZUZ1bmN0aW9uYCByZS1lbnRyeSwgdGhlIHBvbGljaWVzIGRlY2xhcmVkIGZvciB0aGUgc3RhZ2UncyBPV05cbiAqIGZ1bmN0aW9uIChgcmV0cnlgLCBzdHJlYW1pbmcpIOKAlCB0aGF0IHJlLWVudHJ5IHJ1bnMgYSBkaWZmZXJlbnQgZnVuY3Rpb25cbiAqIChgcmVzdW1lRm5gKSB1bmRlciBhIGRpZmZlcmVudCBjb250cmFjdC4gVGhlIGBpbnRlcnJ1cHQoKWAgcmUtZW50cnkgcmUtcnVuc1xuICogdGhlIHN0YWdlJ3Mgb3duIGZ1bmN0aW9uLCBzbyBpdCBrZWVwcyB0aGVtLlxuICpcbiAqIFRhZ3MgZm9sbG93IHRoZSBzdGFnZSBvbiBCT1RIIHJlLWVudHJpZXMgKDkuMjEuMCk6IGEgdGFnIGlzIHRoZSBzdGFnZSdzXG4gKiBOQU1FLCBub3QgYSBwb2xpY3kgb3ZlciBpdHMgZnVuY3Rpb24sIGFuZCB0aGUgcmVzdW1lZCBleGVjdXRpb24gaXMgdGhhdFxuICogc3RhZ2UgcnVubmluZyBhZ2FpbiDigJQgaXRzIGJ1bmRsZSBtdXN0IGNhcnJ5IGl0LCBvciBhIGNoYWluZWQgYXhpcyB3b3VsZFxuICogc2hvdyB0aGUgcGF1c2VkIGxlZyB0YWdnZWQgYW5kIHRoZSByZXN1bWVkIGxlZyBzaWxlbnRseSBub3QuXG4gKi9cbmZ1bmN0aW9uIHN0YW5kSW5Gb3I8VE91dCwgVFNjb3BlPihcbiAgcGF1c2VkTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gIGZuOiBTdGFnZUZ1bmN0aW9uPFRPdXQsIFRTY29wZT4sXG4gIGlzSW50ZXJydXB0UmVzdW1lOiBib29sZWFuLFxuKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4ge1xuICBjb25zdCBzdGFuZEluOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHsgLi4ucGF1c2VkTm9kZSwgZm4gfTtcbiAgZGVsZXRlIHN0YW5kSW4ucmVzdW1lRm47XG4gIGRlbGV0ZSBzdGFuZEluLmlzUGF1c2FibGU7XG4gIGlmICghaXNJbnRlcnJ1cHRSZXN1bWUpIHtcbiAgICBkZWxldGUgc3RhbmRJbi5yZXRyeTtcbiAgICBkZWxldGUgc3RhbmRJbi5pc1N0cmVhbWluZztcbiAgICBkZWxldGUgc3RhbmRJbi5zdHJlYW1JZDtcbiAgfVxuICByZXR1cm4gc3RhbmRJbjtcbn1cblxuLyoqXG4gKiBUaGUgcmVzdW1lIGV2ZW50J3MgbGluaywgcmVhZCBvZmYgdGhlIGNoZWNrcG9pbnQgaXRzZWxmIOKAlCBzbyBhIHJlc3VtZSByZWNvcmRzXG4gKiB0aGUgc2FtZSB3aGVyZXZlciBpdHMgY2hlY2twb2ludCBjYW1lIGZyb20uIGB1bmRlZmluZWRgIGZvciBhIGNoZWNrcG9pbnRcbiAqIHdpdGhvdXQgYHBhdXNlZEV4ZWN1dGlvbmAgKG1hZGUgYmVmb3JlIDkuMzcuMCkgb3Igd2l0aCBhIG1hbGZvcm1lZCBvbmU6IHRoZVxuICogbGluayBpcyBhIHJlY29yZCwgbmV2ZXIgdXNlZCB0byBwbGFuIHRoZSByZS1lbnRyeSwgc28gaXQgaXMgbGVmdCBvdXQgcmF0aGVyXG4gKiB0aGFuIGd1ZXNzZWQuXG4gKi9cbmZ1bmN0aW9uIHJlc3VtZUxpbmtPZihjaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50KTogUmVzdW1lTGluayB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHBhdXNlZDogdW5rbm93biA9IGNoZWNrcG9pbnQucGF1c2VkRXhlY3V0aW9uO1xuICByZXR1cm4gaXNQYXVzZWRFeGVjdXRpb24ocGF1c2VkKSA/IHsgcnVuSWQ6IHBhdXNlZC5ydW5JZCwgcnVudGltZVN0YWdlSWQ6IHBhdXNlZC5ydW50aW1lU3RhZ2VJZCB9IDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIEZpbmQgYSBTdGFnZU5vZGUgaW4gdGhlIGNvbXBpbGVkIGdyYXBoIGJ5IElELCBkcmlsbGluZyBpbnRvIHJlZ2lzdGVyZWRcbiAqIHN1YmZsb3dzIGFsb25nIGBzdWJmbG93UGF0aGAgYW5kIHNlYXJjaGluZyBmcm9tIHRoZSBsYXN0IHN1YmZsb3cncyByb290LlxuICovXG5mdW5jdGlvbiBmaW5kTm9kZUluR3JhcGg8VE91dCwgVFNjb3BlPihcbiAgZmM6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICBzdGFnZUlkOiBzdHJpbmcsXG4gIHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgaWYgKHN1YmZsb3dQYXRoLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGRmc0ZpbmQoZmMucm9vdCwgc3RhZ2VJZCk7XG4gIGxldCBzdWJmbG93Um9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gIGZvciAoY29uc3Qgc2ZJZCBvZiBzdWJmbG93UGF0aCkge1xuICAgIGNvbnN0IHN1YmZsb3cgPSBmYy5zdWJmbG93cz8uW3NmSWRdO1xuICAgIGlmICghc3ViZmxvdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBzdWJmbG93Um9vdCA9IHN1YmZsb3cucm9vdDtcbiAgfVxuICBpZiAoIXN1YmZsb3dSb290KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gZGZzRmluZChzdWJmbG93Um9vdCwgc3RhZ2VJZCk7XG59XG5cbi8qKiBERlMgc2VhcmNoIGZvciBhIG5vZGUgYnkgSUQgaW4gdGhlIFN0YWdlTm9kZSBncmFwaC4gQ3ljbGUtc2FmZSB2aWEgdmlzaXRlZCBzZXQuICovXG5mdW5jdGlvbiBkZnNGaW5kPFRPdXQsIFRTY29wZT4oXG4gIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICB0YXJnZXRJZDogc3RyaW5nLFxuICB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCksXG4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gIC8vIFNraXAgbG9vcCBiYWNrLWVkZ2UgcmVmZXJlbmNlcyAodGhleSBzaGFyZSB0aGUgdGFyZ2V0J3MgSUQgYnV0IGhhdmUgbm8gZm4vcmVzdW1lRm4pXG4gIGlmIChub2RlLmlzTG9vcFJlZikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUuaWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICB2aXNpdGVkLmFkZChub2RlLmlkKTtcbiAgaWYgKG5vZGUuaWQgPT09IHRhcmdldElkKSByZXR1cm4gbm9kZTtcbiAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGNvbnN0IGZvdW5kID0gZGZzRmluZChjaGlsZCwgdGFyZ2V0SWQsIHZpc2l0ZWQpO1xuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgfVxuICB9XG4gIGlmIChub2RlLm5leHQpIHJldHVybiBkZnNGaW5kKG5vZGUubmV4dCwgdGFyZ2V0SWQsIHZpc2l0ZWQpO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIl19
|
|
307
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi9ydW5uZXIvcmVzdW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHOzs7QUFFSCx5Q0FBZ0Q7QUFHaEQsc0VBQWdFO0FBRWhFLHVFQUF1RTtBQUV2RSx3REFBK0Q7QUFDL0Qsa0RBQXNEO0FBRXRELGdEQUFzRDtBQUN0RCxtREFBaUY7QUFhakYsbUdBQW1HO0FBQ25HLE1BQU0sbUJBQW1CLEdBQUcsSUFBQSx3QkFBYSxFQUFDLG1CQUFtQixDQUFDLENBQUM7QUFFL0Q7Ozs7R0FJRztBQUNILFNBQWdCLFVBQVUsQ0FDeEIsRUFBMkIsRUFDM0IsTUFBMkIsRUFDM0IsV0FBb0I7SUFFcEIsd0VBQXdFO0lBQ3hFLHVFQUF1RTtJQUN2RSxNQUFNLFVBQVUsR0FBRyxJQUFBLDRCQUFnQixFQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTVDLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLGFBQWEsRUFBRSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDekYsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQ2IseUJBQXlCLFVBQVUsQ0FBQyxhQUFhLDRCQUE0QjtZQUMzRSw4REFBOEQsQ0FDakUsQ0FBQztJQUNKLENBQUM7SUFDRCwyREFBMkQ7SUFDM0QsRUFBRTtJQUNGLHVFQUF1RTtJQUN2RSw0RUFBNEU7SUFDNUUsMEVBQTBFO0lBQzFFLDRFQUE0RTtJQUM1RSx5RUFBeUU7SUFDekUsMERBQTBEO0lBQzFELHlEQUF5RDtJQUN6RCxFQUFFO0lBQ0Ysc0VBQXNFO0lBQ3RFLDhFQUE4RTtJQUM5RSxNQUFNLGlCQUFpQixHQUFHLFVBQVUsQ0FBQyxRQUFRLEtBQUssV0FBVyxDQUFDO0lBQzlELElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxJQUFJLENB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QUFFLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQ3RDLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2xCLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ2xDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQ2hELElBQUksS0FBSztnQkFBRSxPQUFPLEtBQUssQ0FBQztRQUMxQixDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksSUFBSSxDQUFDLElBQUk7UUFBRSxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1RCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiByZXN1bWUg4oCUIGhvdyBgRmxvd0NoYXJ0RXhlY3V0b3IucmVzdW1lKClgIHBsYW5zIGFuZCBhbm5vdW5jZXMgYSByZS1lbnRyeSAoRjkpLlxuICpcbiAqIFRocmVlIHN0ZXBzLCBpbiB0aGUgb3JkZXIgdGhlIGV4ZWN1dG9yIHRha2VzIHRoZW06XG4gKlxuICogICAxLiB7QGxpbmsgcGxhblJlc3VtZX0g4oCUIGRlY29kZSB0aGUgY2hlY2twb2ludCAodGhlIE9ORSBjb2RlYyxcbiAqICAgICAgYHBhdXNlL3JlY29yZC50c2ApLCBmaW5kIHRoZSBwYXVzZWQgc3RhZ2UgaW4gdGhlIGNoYXJ0IGFzIGJ1aWx0LCBidWlsZFxuICogICAgICB0aGUgcmVzdW1lIGhhbGYgYW5kIHRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiwgYW5kIHBsYW4gdGhlIG9uZS1zaG90XG4gKiAgICAgIHJlLWVudHJ5IChgUmVzdW1lRW50cnkucGxhbmApLiBFdmVyeSByZWZ1c2FsIGhhcHBlbnMgSEVSRSwgYmVmb3JlIGFueVxuICogICAgICBleGVjdXRvciBzdGF0ZSBpcyB0b3VjaGVkLlxuICogICAyLiB7QGxpbmsgc2VlZENvdW50ZXJzfSDigJQgY2FycnkgdGhlIHBhdXNlLXRpbWUgZXhlY3V0aW9uIGNvdW50ZXIgYW5kIHZpc2l0XG4gKiAgICAgIGNvdW50cyBpbnRvIHRoZSBydW4ncyBzaGFyZWQgY291bnRlcnMgKG11dGF0ZWQsIG5ldmVyIHJlcGxhY2VkKS5cbiAqICAgMy4ge0BsaW5rIGFubm91bmNlUmVzdW1lfSDigJQgZmlyZSB0aGUgZXhlY3V0b3ItbWFkZSBgb25SZXN1bWVgIG9uIHRoZSBmbG93XG4gKiAgICAgIGFuZCBzY29wZSBjaGFubmVscyAoYW5kIGNhcHR1cmUgaXQgZm9yIHRoZSBkZWZlcnJlZCB0aWVyKSwgQkVGT1JFIHRoZVxuICogICAgICB0cmF2ZXJzYWwgc28gaXQgcHJlY2VkZXMgYG9uUnVuU3RhcnRgLlxuICpcbiAqIFRoZSBleGVjdXRvciBvd25zIHRoZSBwZXItcnVuIHN0YXRlIGJldHdlZW4gdGhlIHN0ZXBzICh0aGUgcnVuSWQsIHRoZVxuICogcnVudGltZSwgdGhlIHRyYXZlcnNlcik7IHRoaXMgbW9kdWxlIG5ldmVyIGhvbGRzIGFueS5cbiAqL1xuXG5pbXBvcnQgeyBidWlsZFJ1bnRpbWVTdGFnZUlkIH0gZnJvbSAnZm9vdHRyYWNlJztcblxuaW1wb3J0IHR5cGUgeyBGbG93Q2hhcnQgfSBmcm9tICcuLi9idWlsZGVyL3R5cGVzLmpzJztcbmltcG9ydCB7IFJlc3VtZUVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL2hhbmRsZXJzL1Jlc3VtZUVudHJ5LmpzJztcbmltcG9ydCB0eXBlIHsgUmVzdW1lTGluayB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgcmVzdW1lVHJhdmVyc2FsQ29udGV4dCB9IGZyb20gJy4uL2VuZ2luZS90cmF2ZXJzYWxDb250ZXh0LmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VGdW5jdGlvbiwgU3RhZ2VOb2RlIH0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmltcG9ydCB7IHByb3ZpZGVJbnRlcnJ1cHRBbnN3ZXIgfSBmcm9tICcuLi9wYXVzZS9pbnRlcnJ1cHQuanMnO1xuaW1wb3J0IHsgZGVjb2RlQ2hlY2twb2ludCB9IGZyb20gJy4uL3BhdXNlL3JlY29yZC5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlZEV4ZWN1dGlvbiB9IGZyb20gJy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IGZpcmUsIHJlY29yZGVyRmFpbHVyZUV2ZW50LCB3YXJuSW5EZXZNb2RlIH0gZnJvbSAnLi4vcmVjb3JkZXIvaG9va3MuanMnO1xuaW1wb3J0IHR5cGUgeyBSdW5PYnNlcnZlcnMgfSBmcm9tICcuL2F0dGFjaC5qcyc7XG5cbi8qKiBFdmVyeXRoaW5nIGEgcmVzdW1lIGRlY2lkZWQgYmVmb3JlIGFueSBleGVjdXRvciBzdGF0ZSB3YXMgdG91Y2hlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdW1lUGxhbjxUT3V0LCBUU2NvcGU+IHtcbiAgLyoqIFRoZSBkZWNvZGVkIGNoZWNrcG9pbnQgKHVwY2FzdCBhbmQgY2hlY2tlZCkuICovXG4gIHJlYWRvbmx5IGNoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQ7XG4gIC8qKiBUaGUgcGF1c2VkIHN0YWdlJ3MgUkVBTCBub2RlIGluIHRoZSBjaGFydC4gKi9cbiAgcmVhZG9ubHkgcGF1c2VkTm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gIC8qKiBXaGVyZSB0aGUgcmVzdW1lZCB0cmF2ZXJzYWwgc3RhcnRzLCBhbmQgd2hhdCBlYWNoIHN1YmZsb3cgb24gdGhlIHBhdGggdGFrZXMgb24gaXRzIGZpcnN0IGVudHJ5LiAqL1xuICByZWFkb25seSBlbnRyeTogUmVzdW1lRW50cnk8VE91dCwgVFNjb3BlPjtcbn1cblxuLyoqIFRoZSBmbG93IGNoYW5uZWwncyBpc29sYXRpb24gZm9yIHRoZSBleGVjdXRvci1tYWRlIGBvblJlc3VtZWAgKGRldi1tb2RlIHdhcm5pbmcsIHRoZW4gc2tpcCkuICovXG5jb25zdCBSRVNVTUVfRkxPV19GQUlMVVJFID0gd2FybkluRGV2TW9kZSgnRmxvd0NoYXJ0RXhlY3V0b3InKTtcblxuLyoqXG4gKiBQbGFuIHRoZSByZXN1bWUgYWdhaW5zdCB0aGUgY2hhcnQgYXMgYnVpbHQuIFRocm93cyDigJQgbGVhdmluZyB0aGUgZXhlY3V0b3JcbiAqIHVudG91Y2hlZCDigJQgd2hlbiB0aGUgY2hlY2twb2ludCBpcyBtYWxmb3JtZWQsIHRoZSBwYXVzZWQgc3RhZ2UgaXMgZ29uZSwgaXRcbiAqIGNhbm5vdCBiZSByZXN1bWVkLCBvciBpdHMgcGF0aCBkb2VzIG5vdCBmaXQgdGhpcyBjaGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBsYW5SZXN1bWU8VE91dCwgVFNjb3BlPihcbiAgZmM6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICBzdG9yZWQ6IEZsb3djaGFydENoZWNrcG9pbnQsXG4gIHJlc3VtZUlucHV0OiB1bmtub3duLFxuKTogUmVzdW1lUGxhbjxUT3V0LCBUU2NvcGU+IHtcbiAgLy8gRGVjb2RlIHRoZSBjaGVja3BvaW50IChtYXkgY29tZSBmcm9tIHVudHJ1c3RlZCBleHRlcm5hbCBzdG9yYWdlLCBmcm9tXG4gIC8vIGFueSByZWxlYXNlKSDigJQgdGhlIE9ORSBjb2RlYzogdXBjYXN0LCB0aGVuIGNoZWNrIGV2ZXJ5IHBhdXNlIHJlY29yZC5cbiAgY29uc3QgY2hlY2twb2ludCA9IGRlY29kZUNoZWNrcG9pbnQoc3RvcmVkKTtcblxuICBjb25zdCBwYXVzZWROb2RlID0gZmluZE5vZGVJbkdyYXBoKGZjLCBjaGVja3BvaW50LnBhdXNlZFN0YWdlSWQsIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpO1xuICBpZiAoIXBhdXNlZE5vZGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IHJlc3VtZTogc3RhZ2UgJyR7Y2hlY2twb2ludC5wYXVzZWRTdGFnZUlkfScgbm90IGZvdW5kIGluIGZsb3djaGFydC4gYCArXG4gICAgICAgICdUaGUgY2hhcnQgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgY2hlY2twb2ludCB3YXMgY3JlYXRlZC4nLFxuICAgICk7XG4gIH1cbiAgLy8gVHdvIHJlLWVudHJ5IHNoYXBlcywgY2hvc2VuIGJ5IEhPVyB0aGUgcGF1c2Ugd2FzIHJhaXNlZDpcbiAgLy9cbiAgLy8gICDigKIgaW50ZXJydXB0KCkgICAgICDihpIgUkUtUlVOIFRIRSBTVEFHRSdTIE9XTiBGVU5DVElPTiBGUk9NIElUUyBUT1AuXG4gIC8vICAgICBTdGFnZXMgYXJlIGF0b21pYyAodGhlIHNhbWUgbGF3IGByZXN1bWVPbkVycm9yYCBzdGF0ZXMpOiBhIHN0YWdlIHRoYXRcbiAgLy8gICAgIHN0b3BwZWQgbWlkLWJvZHkgaGFzIG5vIGhhbGYgdG8gcmVzdW1lIGludG8sIHNvIHRoZSB3aG9sZSBib2R5IHJ1bnNcbiAgLy8gICAgIGFnYWluIGFuZCB0aGUgYW5zd2VyIGNvbWVzIGJhY2sgb3V0IG9mIHRoZSBgaW50ZXJydXB0KClgIGNhbGwgaXRzZWxmLlxuICAvLyAgICAgRXZlcnl0aGluZyB0aGUgYm9keSBkaWQgYmVmb3JlIHRoZSBpbnRlcnJ1cHQgaXMgcmUtZG9uZSDigJQgd2hpY2ggaXNcbiAgLy8gICAgIHdoeSB0aGUgZG9jcyB0ZWxsIHlvdSB0byBrZWVwIHRoYXQgaGFsZiBpZGVtcG90ZW50LlxuICAvLyAgIOKAoiBhZGRQYXVzYWJsZUZ1bmN0aW9uIOKGkiBydW4gdGhlIGRlY2xhcmVkIGByZXN1bWVGbmAuXG4gIC8vXG4gIC8vIFRoZSBkaXNjcmltaW5hbnQgaXMgb24gdGhlIGNoZWNrcG9pbnQsIHNvIHRoaXMgd29ya3MgY3Jvc3MtZXhlY3V0b3JcbiAgLy8gKGEgY2hlY2twb2ludCByZXN0b3JlZCBmcm9tIFJlZGlzIG9uIGEgZnJlc2ggcHJvY2VzcyByZXN1bWVzIHRoZSBzYW1lIHdheSkuXG4gIGNvbnN0IGlzSW50ZXJydXB0UmVzdW1lID0gY2hlY2twb2ludC5wYXVzZWRCeSA9PT0gJ2ludGVycnVwdCc7XG4gIGlmICghcGF1c2VkTm9kZS5yZXN1bWVGbiAmJiAhaXNJbnRlcnJ1cHRSZXN1bWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IHJlc3VtZTogc3RhZ2UgJyR7cGF1c2VkTm9kZS5uYW1lfScgKCR7cGF1c2VkTm9kZS5pZH0pIGhhcyBubyByZXN1bWVGbi4gYCArXG4gICAgICAgICdPbmx5IHN0YWdlcyBjcmVhdGVkIHdpdGggYWRkUGF1c2FibGVGdW5jdGlvbigpLCBvciBzdGFnZXMgdGhhdCBwYXVzZWQgdmlhIGludGVycnVwdCgpLCBjYW4gYmUgcmVzdW1lZC4nLFxuICAgICk7XG4gIH1cbiAgY29uc3QgcmVzdW1lU3RhZ2VGbiA9IHJlc3VtZUhhbGZPZihmYywgcGF1c2VkTm9kZSwgaXNJbnRlcnJ1cHRSZXN1bWUsIHJlc3VtZUlucHV0KTtcblxuICAvLyBUaGUgcGF1c2VkIHN0YWdlJ3MgU1RBTkQtSU46IHRoZSBzdGFnZSdzIE9XTiBub2RlIOKAlCBpZCwgbmFtZSxcbiAgLy8gZGVzY3JpcHRpb24sIHRhZ3MsIGFuZCBpdHMgc2hhcGUgKGEgZGVjaWRlcidzIGJyYW5jaGVzLCBhIHNlbGVjdG9yJ3MsIGFcbiAgLy8gZm9yayBwYXJlbnQncyBjaGlsZHJlbiwgaXRzIGBuZXh0YCkg4oCUIHdpdGggaXRzIGZ1bmN0aW9uIHN3YXBwZWQgZm9yIHRoZVxuICAvLyByZXN1bWUgaGFsZi4gQnVpbHQgZnJvbSB0aGUgd2hvbGUgbm9kZSBzbyBhbiBgaW50ZXJydXB0KClgIHJhaXNlZCBpbnNpZGVcbiAgLy8gYSBkZWNpZGVyLCBzZWxlY3RvciBvciBmb3JrLXBhcmVudCBmdW5jdGlvbiBESVNQQVRDSEVTIG9uIHJlc3VtZSwgYXMgdGhlXG4gIC8vIHN0YWdlIGRpZCBvbiB0aGUgcnVuIChiZWZvcmUgOS4yOC4wIG9ubHkgZm4vbmV4dC90YWdzL3JldHJ5IHdlcmUgY29waWVkXG4gIC8vIGFuZCB0aGUgZGlzcGF0Y2ggd2FzIHNpbGVudGx5IHNraXBwZWQpLiBJdCBpcyB3aGVyZSB0aGUgcmVzdW1lZFxuICAvLyB0cmF2ZXJzYWwgc3RhcnRzIOKAlCBhbmQgbm90aGluZyBlbHNlOiBpdCBpcyBuZXZlciBpbiBhIG5vZGUgbWFwIG9yIHRoZVxuICAvLyBzdWJmbG93IGRpY3Rpb25hcnksIHNvIGEgbG9vcCBiYWNrIHRvIHRoZSBwYXVzZWQgaWQgZmluZHMgdGhlIFJFQUxcbiAgLy8gc3RhZ2UsIHdoaWNoIHBhdXNlcyBhZ2FpbiAoc2VlIFJlc3VtZUVudHJ5KS4gV2hhdCBydW5zIGFmdGVyIGl0IOKAlCBpdHNcbiAgLy8gb3duIGBuZXh0YCwgZWxzZSBpdHMgZGlzcGF0Y2hlcidzIGNvbnRpbnVhdGlvbiDigJQgaXMgYXR0YWNoZWQgYnlcbiAgLy8gYFJlc3VtZUVudHJ5LnBsYW5gLCBmcm9tIHRoZSBjaGFydC5cbiAgY29uc3Qgc3RhbmRJbiA9IHN0YW5kSW5Gb3IocGF1c2VkTm9kZSwgcmVzdW1lU3RhZ2VGbiwgaXNJbnRlcnJ1cHRSZXN1bWUpO1xuXG4gIC8vIFdoZXJlIHRoZSByZXN1bWUgcmUtZW50ZXJzLCBwbGFubmVkIGFnYWluc3QgdGhlIGNoYXJ0IGFzIGJ1aWx0OlxuICAvL1xuICAvLyAgIOKAoiBUT1AtTEVWRUwgUEFVU0UgKHN1YmZsb3dQYXRoIGVtcHR5KTogdGhlIHJlc3VtZWQgdHJhdmVyc2FsIHN0YXJ0c1xuICAvLyAgICAgYXQgdGhlIHN0YW5kLWluLlxuICAvLyAgIOKAoiBQQVVTRSBJTlNJREUgU1VCRkxPV1M6IGl0IHN0YXJ0cyBhdCB0aGUgbW91bnQgb2YgdGhlIGZpcnN0IHN1YmZsb3dcbiAgLy8gICAgIG9uIHRoZSBwYXRoLCBzbyB0aGUgb3V0cHV0TWFwcGVycyBhbmQgdGhlIHBhcmVudCdzIGNvbnRpbnVhdGlvblxuICAvLyAgICAgcnVuLiBFYWNoIHN1YmZsb3cgb24gdGhlIHBhdGggaXMgZW50ZXJlZCBPTkNFIHRocm91Z2ggaXRzIGhvcDogaXRzXG4gIC8vICAgICBuZXN0ZWQgcnVudGltZSBpcyBzZWVkZWQgZnJvbSBpdHMgY2FwdHVyZSAoaW4gcGxhY2Ugb2YgdGhlXG4gIC8vICAgICBpbnB1dE1hcHBlcidzIHZhbHVlcykgYW5kIGl0cyB0cmF2ZXJzYWwgc3RhcnRzIGF0IHRoZSBtb3VudCBvZiB0aGVcbiAgLy8gICAgIG5leHQgc3ViZmxvdyDigJQgb3IsIGF0IHRoZSBsZWFmLCBhdCB0aGUgc3RhbmQtaW4uIEFuIG91dGVyIHN1YmZsb3cnc1xuICAvLyAgICAgc3RhZ2VzIGJlZm9yZSB0aGF0IG1vdW50IGRvIG5vdCBydW4gYWdhaW4uXG4gIC8vICAg4oCiIEFUIEVWRVJZIExFVkVMIHRoZSBlbnRyeSBjYXJyaWVzIHdoYXQgaXRzIGRpc3BhdGNoZXIgd291bGQgaGF2ZSBydW5cbiAgLy8gICAgIGFmdGVyIGl0IOKAlCBhIGRlY2lkZXIncyBgbmV4dGAsIGEgc2VsZWN0b3IncywgYSBmb3JrJ3Mgam9pbiDigJQgc28gYVxuICAvLyAgICAgc3ViZmxvdyBtb3VudGVkIGFzIGEgYnJhbmNoIG9yIGEgZm9yayBjaGlsZCBoYW5kcyBjb250cm9sIGJhY2sgdG9cbiAgLy8gICAgIGl0cyBwYXJlbnQncyBjb250aW51YXRpb24gYXQgdGhlIHBhcmVudCdzIGxldmVsLlxuICAvLyAgIOKAoiBQYXJhbGxlbCBzaWJsaW5ncyB0aGF0IHBhdXNlZCBpbiB0aGUgc2FtZSBmYW4tb3V0IHdhaXQgaW5cbiAgLy8gICAgIGBjaGVja3BvaW50LnBlbmRpbmdQYXVzZXNgOiBlYWNoIGlzIHJhaXNlZCBhZ2FpbiBpbiB0dXJuLCBhbmQgdGhlXG4gIC8vICAgICBqb2luIHJ1bnMgb25seSBvbmNlIHRoZSBsYXN0IG9uZSBpcyByZXN1bWVkLlxuICAvL1xuICAvLyBFdmVyeXRoaW5nIGVsc2Ugd2Fsa3MgdGhlIFJFQUwgY2hhcnQ6IGBmYy5yb290YCBhbmQgYGZjLnN1YmZsb3dzYCBhcmVcbiAgLy8gdW50b3VjaGVkLCBzbyBldmVyeSBsYXRlciBsb29wIHRhcmdldCBhbmQgZXZlcnkgbGF0ZXIgc3ViZmxvdyBlbnRyeVxuICAvLyAocmVhbCByb290LCBpbnB1dE1hcHBlcikgcmVzb2x2ZXMgYXMgaXQgd291bGQgb24gYSBydW4uIFJlZnVzZWQgSEVSRSDigJRcbiAgLy8gYmVmb3JlIGFueSBzdGF0ZSBpcyB0b3VjaGVkIOKAlCB3aGVuIHRoZSBjaGVja3BvaW50J3MgcGF0aCBkb2VzIG5vdCBmaXRcbiAgLy8gdGhpcyBjaGFydC5cbiAgLy9cbiAgLy8gQ2xvbmUtaW46IHRoZSBjYXB0dXJlcyBzZWVkIG5lc3RlZCBydW50aW1lcyAoc2hhbGxvdy1tZXJnZWQgaW50byBlYWNoXG4gIC8vIG5lc3RlZCBTaGFyZWRNZW1vcnkpLCBzbyB3aXRob3V0IGEgY29weSB0aGUgZW5naW5lIHdvdWxkIGhvbGQgbGl2ZVxuICAvLyByZWZlcmVuY2VzIGludG8gdGhlIGNhbGxlcidzIGNoZWNrcG9pbnQgb2JqZWN0IOKAlCBjYWxsZXIgbXV0YXRpb25zIHdvdWxkXG4gIC8vIGJsZWVkIGludG8gdGhlIHJlc3VtZWQgcnVuIGFuZCBlbmdpbmUgd3JpdGVzIHdvdWxkIHJlYWNoIGEgY2hlY2twb2ludFxuICAvLyB0aGUgY2FsbGVyIG1heSBoYXZlIGFscmVhZHkgcGVyc2lzdGVkLiBUaGUgc2FtZSBmb3IgdGhlIHdhaXRpbmdcbiAgLy8gc2libGluZ3MnIGNhcHR1cmVzLlxuICBjb25zdCBlbnRyeSA9IFJlc3VtZUVudHJ5LnBsYW48VE91dCwgVFNjb3BlPih7XG4gICAgcm9vdDogZmMucm9vdCxcbiAgICBzdWJmbG93czogZmMuc3ViZmxvd3MsXG4gICAgcGF0aDogY2hlY2twb2ludC5zdWJmbG93UGF0aCxcbiAgICBjYXB0dXJlczogc3RydWN0dXJlZENsb25lKGNoZWNrcG9pbnQuc3ViZmxvd1N0YXRlcyksXG4gICAgc3RhbmRJbixcbiAgICAuLi4oY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzICE9PSB1bmRlZmluZWQgJiYgeyBwZW5kaW5nUGF1c2VzOiBzdHJ1Y3R1cmVkQ2xvbmUoY2hlY2twb2ludC5wZW5kaW5nUGF1c2VzKSB9KSxcbiAgfSk7XG4gIHJldHVybiB7IGNoZWNrcG9pbnQsIHBhdXNlZE5vZGUsIGVudHJ5IH07XG59XG5cbi8qKlxuICogU2VlZCB0aGUgcnVuJ3Mgc2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyICsgcGVyLXN0YWdlIHZpc2l0IGNvdW50cyBmcm9tIHRoZVxuICogY2hlY2twb2ludCwgc28gcnVudGltZVN0YWdlSWRzIHN0YXkgdW5pcXVlIGFuZCBsb29wSXRlcmF0aW9uIG1vbm90b25pY1xuICogYWNyb3NzIGEgQ1JPU1MtZXhlY3V0b3IgcmVzdW1lIChhIGZyZXNoIGV4ZWN1dG9yIHN0YXJ0cyBib3RoIGF0IDAvZW1wdHkpLlxuICpcbiAqIE1VVEFURSwgbmV2ZXIgUkVQTEFDRTogYm90aCBhcmUgc2hhcmVkIGJ5IHJlZmVyZW5jZSBpbnRvIHRoZSB0cmF2ZXJzZXJcbiAqIChhbmQsIHRyYW5zaXRpdmVseSwgZXZlcnkgc3ViZmxvdyB0cmF2ZXJzZXIpLiBCb3RoIGZpZWxkcyBhcmUgb3B0aW9uYWwgb25cbiAqIHRoZSBjaGVja3BvaW50IChvbGRlciBwZXJzaXN0ZWQgY2hlY2twb2ludHMgb21pdCB0aGVtKSDigJQgc2VlZGluZyBpcyBza2lwcGVkXG4gKiB3aGVuIGFic2VudC4gU2FtZS1leGVjdXRvciByZXN1bWUgaXMgaWRlbXBvdGVudDogYXQgcGF1c2UgdGhlIHZhbHVlc1xuICogYWxyZWFkeSBlcXVhbCB0aGUgY2hlY2twb2ludCdzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2VlZENvdW50ZXJzKFxuICBjaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50LFxuICBleGVjdXRpb25Db3VudGVyOiB7IHZhbHVlOiBudW1iZXIgfSxcbiAgdmlzaXRDb3VudHM6IE1hcDxzdHJpbmcsIG51bWJlcj4sXG4pOiB2b2lkIHtcbiAgaWYgKGNoZWNrcG9pbnQuZXhlY3V0aW9uQ291bnQgIT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZWN1dGlvbkNvdW50ZXIudmFsdWUgPSBjaGVja3BvaW50LmV4ZWN1dGlvbkNvdW50O1xuICB9XG4gIGlmIChjaGVja3BvaW50LnZpc2l0Q291bnRzKSB7XG4gICAgdmlzaXRDb3VudHMuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IFtzdGFnZUlkLCBjb3VudF0gb2YgT2JqZWN0LmVudHJpZXMoY2hlY2twb2ludC52aXNpdENvdW50cykpIHtcbiAgICAgIHZpc2l0Q291bnRzLnNldChzdGFnZUlkLCBjb3VudCk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRmlyZSB0aGUgZXhlY3V0b3ItbWFkZSBgb25SZXN1bWVgIG9uIGV2ZXJ5IHJlY29yZGVyIChmbG93ICsgc2NvcGUpLCBzdGFtcGVkXG4gKiB3aXRoIHRoZSByZXN1bWVkIGxlZydzIE5FVyBydW5JZCDigJQgY29uc3VtZXJzIGRldGVjdCBcImEgZnJlc2ggbG9naWNhbCBydW5cIlxuICogYnkgdGhlIHNhbWUgcnVuSWQgY2hhbmdlIHRoZXkgdXNlIGZvciBgb25SdW5TdGFydGAuIFRoZSBzdGFtcCBpcyBidWlsdCBieVxuICogdGhlIG9uZSBjb25zdHJ1Y3RvciAoYGVuZ2luZS90cmF2ZXJzYWxDb250ZXh0LnRzYCk6IGl0IG5hbWVzIHRoZSBSRUFMXG4gKiBzdWJmbG93IHRoZSBzdGFuZC1pbiBydW5zIGluIGFuZCBpdHMgZGVwdGgsIGFuZCBMSU5LUyB0byB0aGUgcGF1c2VkXG4gKiBleGVjdXRpb24gKGByZXN1bWVkRnJvbWAsIHJlYWQgb2ZmIGBjaGVja3BvaW50LnBhdXNlZEV4ZWN1dGlvbmApIOKAlCA5LjM3LjAuXG4gKlxuICogVGhlIHJ1bnRpbWVTdGFnZUlkIGlzIHRoZSBTVEFORC1JTidzIG93bjogaXQgcnVucyBhZnRlciBvbmUgbW91bnQgcGVyXG4gKiBzdWJmbG93IG9uIHRoZSBwYXRoIChlYWNoIGVudGVyZWQgYXQgaXRzIG1vdW50KSwgc28gaXRzIGV4ZWN1dGlvbiBpbmRleCBpc1xuICogdGhlIGNvdW50ZXIgcGx1cyB0aGUgcGF0aCdzIGxlbmd0aCDigJQgdGhlIGV2ZW50IGFuZCB0aGUgc3RhbmQtaW4ncyBjb21taXRcbiAqIG5hbWUgdGhlIHNhbWUgZXhlY3V0aW9uLiBUaGUgb25lIHNoYXBlIHdoZXJlIHRoZSBpbmRleCBjYW5ub3QgYmUga25vd24gdXBcbiAqIGZyb250IOKAlCBhIGRlZ3JhZGVkIGNoZWNrcG9pbnQgbWlzc2luZyBhbiBPVVRFUiBzdWJmbG93J3MgY2FwdHVyZSwgd2hvc2VcbiAqIG9wZW5pbmcgc3RhZ2VzIHRoZW4gcmUtcnVuIOKAlCBuYW1lcyB0aGUgcGxhbm5lZCBwb3NpdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFubm91bmNlUmVzdW1lPFRPdXQsIFRTY29wZT4oXG4gIHBsYW46IFJlc3VtZVBsYW48VE91dCwgVFNjb3BlPixcbiAgcmVzdW1lSW5wdXQ6IHVua25vd24sXG4gIHJ1bjogeyByZWFkb25seSBydW5JZDogc3RyaW5nOyByZWFkb25seSBleGVjdXRpb25Db3VudDogbnVtYmVyOyByZWFkb25seSBvYnNlcnZlcnM6IFJ1bk9ic2VydmVycyB9LFxuKTogdm9pZCB7XG4gIGNvbnN0IHsgY2hlY2twb2ludCwgcGF1c2VkTm9kZSwgZW50cnkgfSA9IHBsYW47XG4gIGNvbnN0IHsgb2JzZXJ2ZXJzIH0gPSBydW47XG4gIGNvbnN0IGhhc0lucHV0ID0gcmVzdW1lSW5wdXQgIT09IHVuZGVmaW5lZDtcbiAgY29uc3Qgc3RlcHNCZWZvcmVTdGFuZEluID0gZW50cnkuc3RlcHNCZWZvcmVTdGFuZEluID8/IGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgubGVuZ3RoO1xuICBjb25zdCByZXN1bWVSdW50aW1lU3RhZ2VJZCA9IGJ1aWxkUnVudGltZVN0YWdlSWQocGF1c2VkTm9kZS5pZCwgcnVuLmV4ZWN1dGlvbkNvdW50ICsgc3RlcHNCZWZvcmVTdGFuZEluKTtcbiAgY29uc3QgcmVzdW1lZEZyb20gPSByZXN1bWVMaW5rT2YoY2hlY2twb2ludCk7XG4gIGNvbnN0IGZsb3dSZXN1bWVFdmVudCA9IHtcbiAgICBzdGFnZU5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgIGhhc0lucHV0LFxuICAgIHRyYXZlcnNhbENvbnRleHQ6IHJlc3VtZVRyYXZlcnNhbENvbnRleHQoe1xuICAgICAgcnVuSWQ6IHJ1bi5ydW5JZCxcbiAgICAgIHN0YWdlSWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgICBzdGFnZU5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiByZXN1bWVSdW50aW1lU3RhZ2VJZCxcbiAgICAgIHN1YmZsb3dQYXRoOiBjaGVja3BvaW50LnN1YmZsb3dQYXRoLFxuICAgICAgcmVzdW1lZEZyb20sXG4gICAgfSksXG4gICAgY2hhbm5lbDogJ2Zsb3cnIGFzIGNvbnN0LFxuICB9O1xuICAvLyBFeGVjdXRvci1tYWRlIChgSE9PS1Mub25SZXN1bWUuZXhlY3V0b3JNYWRlYCk6IGZpcmVkIHRocm91Z2ggdGhlIHNhbWUgYGZpcmVgIGxvb3AgYXMgZXZlcnlcbiAgLy8gZW5naW5lIGV2ZW50LCBzbyBhIHRocm93aW5nIHJlY29yZGVyIGlzIGlzb2xhdGVkIGluc3RlYWQgb2YgcmVqZWN0aW5nIGByZXN1bWUoKWAgKFIxMCkuXG4gIGZpcmUob2JzZXJ2ZXJzLmlubGluZUZsb3dMaXN0ZW5lcnMoKSwgJ29uUmVzdW1lJywgZmxvd1Jlc3VtZUV2ZW50LCBSRVNVTUVfRkxPV19GQUlMVVJFKTtcblxuICBjb25zdCBzY29wZVJlc3VtZUV2ZW50ID0ge1xuICAgIHN0YWdlTmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgIHN0YWdlSWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgcnVudGltZVN0YWdlSWQ6IHJlc3VtZVJ1bnRpbWVTdGFnZUlkLFxuICAgIGhhc0lucHV0LFxuICAgIC4uLihyZXN1bWVkRnJvbSAmJiB7IHJlc3VtZWRGcm9tIH0pLFxuICAgIHBpcGVsaW5lSWQ6ICcnLFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICBjaGFubmVsOiAnc2NvcGUnIGFzIGNvbnN0LFxuICB9O1xuICBmaXJlKG9ic2VydmVycy5zY29wZVJlY29yZGVycywgJ29uUmVzdW1lJywgc2NvcGVSZXN1bWVFdmVudCwgKGVycm9yLCBfcmVjb3JkZXIsIGhvb2spID0+XG4gICAgLy8gVGhlIHNjb3BlIGNoYW5uZWwncyBwb2xpY3kgKGFzIGBTY29wZUZhY2FkZWAgcm91dGVzIGEgc3RhZ2UncyBob29rIGZhaWx1cmUpOiB0aGUgdGhyb3dcbiAgICAvLyBiZWNvbWVzIGFuIGBvbkVycm9yYCBvbiBldmVyeSBzY29wZSByZWNvcmRlciwgd2hvc2Ugb3duIHRocm93IGlzIGRyb3BwZWQuXG4gICAgZmlyZShvYnNlcnZlcnMuc2NvcGVSZWNvcmRlcnMsICdvbkVycm9yJywgcmVjb3JkZXJGYWlsdXJlRXZlbnQoc2NvcGVSZXN1bWVFdmVudCwgZXJyb3IsIGhvb2spKSxcbiAgKTtcblxuICAvLyBEZWZlcnJlZCB0aWVyIChSRkMtMDAxKTogdGhlc2UgZXhlY3V0b3Itc3ludGhlc2l6ZWQgb25SZXN1bWUgZXZlbnRzXG4gIC8vIGJ5cGFzcyB0aGUgcGVyLXN0YWdlIGRpc3BhdGNoIHNpdGVzLCBzbyBjYXB0dXJlIHRoZW0gZGlyZWN0bHkuXG4gIGlmIChvYnNlcnZlcnMuZGVmZXJyZWRUaWVyKSB7XG4gICAgb2JzZXJ2ZXJzLmRlZmVycmVkVGllci5jYXB0dXJlKCdmbG93JywgJ29uUmVzdW1lJywgcmVzdW1lUnVudGltZVN0YWdlSWQsIHJ1bi5ydW5JZCwgZmxvd1Jlc3VtZUV2ZW50KTtcbiAgICBvYnNlcnZlcnMuZGVmZXJyZWRUaWVyLmNhcHR1cmUoXG4gICAgICAnc2NvcGUnLFxuICAgICAgJ29uUmVzdW1lJyxcbiAgICAgIHNjb3BlUmVzdW1lRXZlbnQucnVudGltZVN0YWdlSWQsXG4gICAgICBzY29wZVJlc3VtZUV2ZW50LnBpcGVsaW5lSWQsXG4gICAgICBzY29wZVJlc3VtZUV2ZW50LFxuICAgICk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaGUgcmVzdW1lIGhhbGYg4oCUIHdoYXQgdGhlIHBhdXNlZCBzdGFnZSdzIHN0YW5kLWluIHJ1bnMuIGBpbnRlcnJ1cHQoKWA6XG4gKiB0aGUgc3RhZ2UncyBvd24gZnVuY3Rpb24sIHdpdGggdGhlIGFuc3dlciBkZXBvc2l0ZWQgZm9yIFRISVMgc2NvcGUgZmlyc3RcbiAqIChrZXllZCBieSBzY29wZSBpZGVudGl0eSDigJQgc2FmZSB3aGVuIHNldmVyYWwgYnJhbmNoZXMgcmVzdW1lIGF0IG9uY2UpLlxuICogYGFkZFBhdXNhYmxlRnVuY3Rpb25gOiB0aGUgZGVjbGFyZWQgYHJlc3VtZUZuKHNjb3BlLCBpbnB1dClgLCB3cmFwcGVkIHRvXG4gKiB0aGUgYFN0YWdlRnVuY3Rpb25gIHNoYXBlLlxuICovXG5mdW5jdGlvbiByZXN1bWVIYWxmT2Y8VE91dCwgVFNjb3BlPihcbiAgZmM6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICBwYXVzZWROb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgaXNJbnRlcnJ1cHRSZXN1bWU6IGJvb2xlYW4sXG4gIHJlc3VtZUlucHV0OiB1bmtub3duLFxuKTogU3RhZ2VGdW5jdGlvbjxUT3V0LCBUU2NvcGU+IHtcbiAgaWYgKGlzSW50ZXJydXB0UmVzdW1lKSB7XG4gICAgY29uc3Qgb3JpZ2luYWxGbiA9IHBhdXNlZE5vZGUuZm4gPz8gZmMuc3RhZ2VNYXAuZ2V0KHBhdXNlZE5vZGUuaWQpID8/IGZjLnN0YWdlTWFwLmdldChwYXVzZWROb2RlLm5hbWUpO1xuICAgIGlmICghb3JpZ2luYWxGbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogc3RhZ2UgJyR7cGF1c2VkTm9kZS5uYW1lfScgKCR7cGF1c2VkTm9kZS5pZH0pIHBhdXNlZCB2aWEgaW50ZXJydXB0KCkgYnV0IGl0cyBgICtcbiAgICAgICAgICAnc3RhZ2UgZnVuY3Rpb24gaXMgbm8gbG9uZ2VyIGluIHRoZSBjaGFydC4gVGhlIGNoYXJ0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgJyArXG4gICAgICAgICAgJ3dhcyBjcmVhdGVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gKHNjb3BlLCBicmVha0ZuLCBzdHJlYW1DYWxsYmFjaykgPT4ge1xuICAgICAgcHJvdmlkZUludGVycnVwdEFuc3dlcihzY29wZSwgcmVzdW1lSW5wdXQpO1xuICAgICAgcmV0dXJuIG9yaWdpbmFsRm4oc2NvcGUsIGJyZWFrRm4sIHN0cmVhbUNhbGxiYWNrKTtcbiAgICB9O1xuICB9XG4gIGNvbnN0IHJlc3VtZUZuID0gcGF1c2VkTm9kZS5yZXN1bWVGbiE7XG4gIHJldHVybiAoc2NvcGU6IFRTY29wZSkgPT4ge1xuICAgIHJldHVybiByZXN1bWVGbihzY29wZSwgcmVzdW1lSW5wdXQpIGFzIFRPdXQgfCBQcm9taXNlPFRPdXQ+O1xuICB9O1xufVxuXG4vKipcbiAqIFRoZSBwYXVzZWQgc3RhZ2UncyBzdGFuZC1pbiBmb3IgYSByZXN1bWU6IHRoZSBzdGFnZSdzIE9XTiBub2RlIOKAlCBzbyBpdCBrZWVwc1xuICogaXRzIHNoYXBlIChhIGRlY2lkZXIncyBvciBzZWxlY3RvcidzIGJyYW5jaGVzLCBhIGZvcmsgcGFyZW50J3MgY2hpbGRyZW4sXG4gKiBpdHMgYG5leHRgKSBhbmQgaXRzIG5hbWUsIGRlc2NyaXB0aW9uIGFuZCBkZWNsYXJlZCB0YWdzIOKAlCB3aXRoIGBmbmAgc3dhcHBlZFxuICogZm9yIHRoZSByZXN1bWUgaGFsZi5cbiAqXG4gKiBEcm9wcGVkOiBgcmVzdW1lRm5gIGFuZCBgaXNQYXVzYWJsZWAgKHRoZSByZXN1bWUgaGFsZiBtdXN0IG5vdCBwYXVzZVxuICogYmVjYXVzZSBpdCByZXR1cm5lZCBhIHZhbHVlIOKAlCB0aGUgb3JpZ2luYWwgcGF1c2FibGUgY29udHJhY3QpOyBhbmQsIG9uIHRoZVxuICogYGFkZFBhdXNhYmxlRnVuY3Rpb25gIHJlLWVudHJ5LCB0aGUgcG9saWNpZXMgZGVjbGFyZWQgZm9yIHRoZSBzdGFnZSdzIE9XTlxuICogZnVuY3Rpb24gKGByZXRyeWAsIHN0cmVhbWluZykg4oCUIHRoYXQgcmUtZW50cnkgcnVucyBhIGRpZmZlcmVudCBmdW5jdGlvblxuICogKGByZXN1bWVGbmApIHVuZGVyIGEgZGlmZmVyZW50IGNvbnRyYWN0LiBUaGUgYGludGVycnVwdCgpYCByZS1lbnRyeSByZS1ydW5zXG4gKiB0aGUgc3RhZ2UncyBvd24gZnVuY3Rpb24sIHNvIGl0IGtlZXBzIHRoZW0uXG4gKlxuICogVGFncyBmb2xsb3cgdGhlIHN0YWdlIG9uIEJPVEggcmUtZW50cmllcyAoOS4yMS4wKTogYSB0YWcgaXMgdGhlIHN0YWdlJ3NcbiAqIE5BTUUsIG5vdCBhIHBvbGljeSBvdmVyIGl0cyBmdW5jdGlvbiwgYW5kIHRoZSByZXN1bWVkIGV4ZWN1dGlvbiBpcyB0aGF0XG4gKiBzdGFnZSBydW5uaW5nIGFnYWluIOKAlCBpdHMgYnVuZGxlIG11c3QgY2FycnkgaXQsIG9yIGEgY2hhaW5lZCBheGlzIHdvdWxkXG4gKiBzaG93IHRoZSBwYXVzZWQgbGVnIHRhZ2dlZCBhbmQgdGhlIHJlc3VtZWQgbGVnIHNpbGVudGx5IG5vdC5cbiAqL1xuZnVuY3Rpb24gc3RhbmRJbkZvcjxUT3V0LCBUU2NvcGU+KFxuICBwYXVzZWROb2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgZm46IFN0YWdlRnVuY3Rpb248VE91dCwgVFNjb3BlPixcbiAgaXNJbnRlcnJ1cHRSZXN1bWU6IGJvb2xlYW4sXG4pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB7XG4gIGNvbnN0IHN0YW5kSW46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0geyAuLi5wYXVzZWROb2RlLCBmbiB9O1xuICBkZWxldGUgc3RhbmRJbi5yZXN1bWVGbjtcbiAgZGVsZXRlIHN0YW5kSW4uaXNQYXVzYWJsZTtcbiAgaWYgKCFpc0ludGVycnVwdFJlc3VtZSkge1xuICAgIGRlbGV0ZSBzdGFuZEluLnJldHJ5O1xuICAgIGRlbGV0ZSBzdGFuZEluLmlzU3RyZWFtaW5nO1xuICAgIGRlbGV0ZSBzdGFuZEluLnN0cmVhbUlkO1xuICB9XG4gIHJldHVybiBzdGFuZEluO1xufVxuXG4vKipcbiAqIFRoZSByZXN1bWUgZXZlbnQncyBsaW5rLCByZWFkIG9mZiB0aGUgY2hlY2twb2ludCBpdHNlbGYg4oCUIHNvIGEgcmVzdW1lIHJlY29yZHNcbiAqIHRoZSBzYW1lIHdoZXJldmVyIGl0cyBjaGVja3BvaW50IGNhbWUgZnJvbS4gYHVuZGVmaW5lZGAgZm9yIGEgY2hlY2twb2ludFxuICogd2l0aG91dCBgcGF1c2VkRXhlY3V0aW9uYCAobWFkZSBiZWZvcmUgOS4zNy4wKSBvciB3aXRoIGEgbWFsZm9ybWVkIG9uZTogdGhlXG4gKiBsaW5rIGlzIGEgcmVjb3JkLCBuZXZlciB1c2VkIHRvIHBsYW4gdGhlIHJlLWVudHJ5LCBzbyBpdCBpcyBsZWZ0IG91dCByYXRoZXJcbiAqIHRoYW4gZ3Vlc3NlZC5cbiAqL1xuZnVuY3Rpb24gcmVzdW1lTGlua09mKGNoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQpOiBSZXN1bWVMaW5rIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgcGF1c2VkOiB1bmtub3duID0gY2hlY2twb2ludC5wYXVzZWRFeGVjdXRpb247XG4gIHJldHVybiBpc1BhdXNlZEV4ZWN1dGlvbihwYXVzZWQpID8geyBydW5JZDogcGF1c2VkLnJ1bklkLCBydW50aW1lU3RhZ2VJZDogcGF1c2VkLnJ1bnRpbWVTdGFnZUlkIH0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRmluZCBhIFN0YWdlTm9kZSBpbiB0aGUgY29tcGlsZWQgZ3JhcGggYnkgSUQsIGRyaWxsaW5nIGludG8gcmVnaXN0ZXJlZFxuICogc3ViZmxvd3MgYWxvbmcgYHN1YmZsb3dQYXRoYCBhbmQgc2VhcmNoaW5nIGZyb20gdGhlIGxhc3Qgc3ViZmxvdydzIHJvb3QuXG4gKi9cbmZ1bmN0aW9uIGZpbmROb2RlSW5HcmFwaDxUT3V0LCBUU2NvcGU+KFxuICBmYzogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4sXG4gIHN0YWdlSWQ6IHN0cmluZyxcbiAgc3ViZmxvd1BhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLFxuKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICBpZiAoc3ViZmxvd1BhdGgubGVuZ3RoID09PSAwKSByZXR1cm4gZGZzRmluZChmYy5yb290LCBzdGFnZUlkKTtcbiAgbGV0IHN1YmZsb3dSb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgZm9yIChjb25zdCBzZklkIG9mIHN1YmZsb3dQYXRoKSB7XG4gICAgY29uc3Qgc3ViZmxvdyA9IGZjLnN1YmZsb3dzPy5bc2ZJZF07XG4gICAgaWYgKCFzdWJmbG93KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHN1YmZsb3dSb290ID0gc3ViZmxvdy5yb290O1xuICB9XG4gIGlmICghc3ViZmxvd1Jvb3QpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiBkZnNGaW5kKHN1YmZsb3dSb290LCBzdGFnZUlkKTtcbn1cblxuLyoqIERGUyBzZWFyY2ggZm9yIGEgbm9kZSBieSBJRCBpbiB0aGUgU3RhZ2VOb2RlIGdyYXBoLiBDeWNsZS1zYWZlIHZpYSB2aXNpdGVkIHNldC4gKi9cbmZ1bmN0aW9uIGRmc0ZpbmQ8VE91dCwgVFNjb3BlPihcbiAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gIHRhcmdldElkOiBzdHJpbmcsXG4gIHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKSxcbik6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgLy8gU2tpcCBsb29wIGJhY2stZWRnZSByZWZlcmVuY2VzICh0aGV5IHNoYXJlIHRoZSB0YXJnZXQncyBJRCBidXQgaGF2ZSBubyBmbi9yZXN1bWVGbilcbiAgaWYgKG5vZGUuaXNMb29wUmVmKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAodmlzaXRlZC5oYXMobm9kZS5pZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHZpc2l0ZWQuYWRkKG5vZGUuaWQpO1xuICBpZiAobm9kZS5pZCA9PT0gdGFyZ2V0SWQpIHJldHVybiBub2RlO1xuICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgY29uc3QgZm91bmQgPSBkZnNGaW5kKGNoaWxkLCB0YXJnZXRJZCwgdmlzaXRlZCk7XG4gICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICB9XG4gIH1cbiAgaWYgKG5vZGUubmV4dCkgcmV0dXJuIGRmc0ZpbmQobm9kZS5uZXh0LCB0YXJnZXRJZCwgdmlzaXRlZCk7XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG4iXX0=
|