footprintjs 10.0.1 → 10.2.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 +2 -1
- package/CLAUDE.md +61 -7
- package/README.md +136 -312
- package/dist/esm/index.d.ts +62 -2
- package/dist/esm/index.js +13 -6
- package/dist/esm/lib/attempt/anySignal.d.ts +19 -0
- package/dist/esm/lib/attempt/anySignal.js +39 -0
- package/dist/esm/lib/attempt/call.d.ts +88 -0
- package/dist/esm/lib/attempt/call.js +129 -0
- package/dist/esm/lib/attempt/category.d.ts +37 -0
- package/dist/esm/lib/attempt/category.js +131 -0
- package/dist/esm/lib/attempt/correlation.d.ts +95 -0
- package/dist/esm/lib/attempt/correlation.js +178 -0
- package/dist/esm/lib/attempt/deadline.d.ts +44 -0
- package/dist/esm/lib/attempt/deadline.js +101 -0
- package/dist/esm/lib/attempt/decision.d.ts +52 -0
- package/dist/esm/lib/attempt/decision.js +134 -0
- package/dist/esm/lib/attempt/effect.d.ts +76 -0
- package/dist/esm/lib/attempt/effect.js +160 -0
- package/dist/esm/lib/attempt/errors.d.ts +41 -0
- package/dist/esm/lib/attempt/errors.js +44 -0
- package/dist/esm/lib/attempt/index.d.ts +18 -0
- package/dist/esm/lib/attempt/index.js +15 -0
- package/dist/esm/lib/attempt/name.d.ts +21 -0
- package/dist/esm/lib/attempt/name.js +43 -0
- package/dist/esm/lib/attempt/observed.d.ts +66 -0
- package/dist/esm/lib/attempt/observed.js +171 -0
- package/dist/esm/lib/attempt/policy.d.ts +45 -0
- package/dist/esm/lib/attempt/policy.js +83 -0
- package/dist/esm/lib/attempt/record.d.ts +11 -0
- package/dist/esm/lib/attempt/record.js +24 -0
- package/dist/esm/lib/attempt/retryLoopContext.d.ts +18 -0
- package/dist/esm/lib/attempt/retryLoopContext.js +24 -0
- package/dist/esm/lib/attempt/retryLoopTypes.d.ts +18 -0
- package/dist/esm/lib/attempt/retryLoopTypes.js +2 -0
- package/dist/esm/lib/attempt/runner.d.ts +157 -0
- package/dist/esm/lib/attempt/runner.js +523 -0
- package/dist/esm/lib/attempt/standalone.d.ts +47 -0
- package/dist/esm/lib/attempt/standalone.js +126 -0
- package/dist/esm/lib/attempt/types.d.ts +453 -0
- package/dist/esm/lib/attempt/types.js +16 -0
- package/dist/esm/lib/budget/index.d.ts +9 -0
- package/dist/esm/lib/budget/index.js +9 -0
- package/dist/esm/lib/budget/timeBudget.d.ts +136 -0
- package/dist/esm/lib/budget/timeBudget.js +666 -0
- package/dist/esm/lib/builder/FlowChartBuilder.d.ts +88 -3
- package/dist/esm/lib/builder/FlowChartBuilder.js +199 -9
- package/dist/esm/lib/builder/retryLoop.d.ts +56 -0
- package/dist/esm/lib/builder/retryLoop.js +283 -0
- package/dist/esm/lib/builder/types.d.ts +35 -1
- package/dist/esm/lib/builder/types.js +1 -1
- package/dist/esm/lib/decide/decide.js +2 -2
- package/dist/esm/lib/decide/index.d.ts +1 -1
- package/dist/esm/lib/decide/index.js +2 -2
- package/dist/esm/lib/decide/types.d.ts +3 -0
- package/dist/esm/lib/decide/types.js +1 -8
- package/dist/esm/lib/engine/graph/StageNode.d.ts +11 -1
- package/dist/esm/lib/engine/graph/StageNode.js +1 -1
- package/dist/esm/lib/engine/graph/prefixNodeTree.js +5 -1
- package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +36 -6
- package/dist/esm/lib/engine/handlers/DeciderHandler.js +9 -5
- package/dist/esm/lib/engine/handlers/ResumeEntry.js +3 -1
- package/dist/esm/lib/engine/handlers/SelectorHandler.js +6 -5
- package/dist/esm/lib/engine/handlers/StageRunner.d.ts +8 -1
- package/dist/esm/lib/engine/handlers/StageRunner.js +36 -9
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +24 -5
- package/dist/esm/lib/engine/handlers/commitStage.d.ts +7 -0
- package/dist/esm/lib/engine/handlers/commitStage.js +22 -4
- package/dist/esm/lib/engine/handlers/stageError.d.ts +9 -0
- package/dist/esm/lib/engine/handlers/stageError.js +23 -1
- package/dist/esm/lib/engine/index.d.ts +2 -2
- package/dist/esm/lib/engine/index.js +1 -1
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +68 -40
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +61 -9
- package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
- package/dist/esm/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
- package/dist/esm/lib/engine/narrative/formatting/sentences.d.ts +23 -0
- package/dist/esm/lib/engine/narrative/formatting/sentences.js +127 -1
- package/dist/esm/lib/engine/narrative/index.d.ts +2 -2
- package/dist/esm/lib/engine/narrative/index.js +1 -1
- package/dist/esm/lib/engine/narrative/narrativeTypes.d.ts +27 -21
- package/dist/esm/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
- package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
- package/dist/esm/lib/engine/narrative/recorders/index.d.ts +1 -1
- package/dist/esm/lib/engine/narrative/recorders/index.js +1 -1
- package/dist/esm/lib/engine/narrative/types.d.ts +74 -5
- package/dist/esm/lib/engine/narrative/types.js +1 -1
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +194 -118
- package/dist/esm/lib/engine/traversalContext.d.ts +7 -2
- package/dist/esm/lib/engine/traversalContext.js +6 -3
- package/dist/esm/lib/engine/types.d.ts +52 -57
- package/dist/esm/lib/engine/types.js +1 -1
- package/dist/esm/lib/errors/terminalFailure.d.ts +29 -0
- package/dist/esm/lib/errors/terminalFailure.js +60 -0
- package/dist/esm/lib/{decide → filter}/evaluator.d.ts +7 -2
- package/dist/esm/lib/filter/evaluator.js +135 -0
- package/dist/esm/lib/ids/idempotencyKey.d.ts +14 -0
- package/dist/esm/lib/ids/idempotencyKey.js +24 -0
- package/dist/esm/lib/memory/StageContext.d.ts +123 -3
- package/dist/esm/lib/memory/StageContext.js +245 -4
- package/dist/esm/lib/memory/attention.d.ts +26 -0
- package/dist/esm/lib/memory/attention.js +171 -0
- package/dist/esm/lib/memory/borrowedMutation.d.ts +8 -0
- package/dist/esm/lib/memory/borrowedMutation.js +14 -1
- package/dist/esm/lib/memory/frameTypes.d.ts +38 -0
- package/dist/esm/lib/memory/frameTypes.js +3 -1
- package/dist/esm/lib/memory/redaction.d.ts +12 -0
- package/dist/esm/lib/memory/redaction.js +54 -5
- package/dist/esm/lib/pause/record.js +10 -1
- package/dist/esm/lib/pause/types.d.ts +19 -0
- package/dist/esm/lib/pause/types.js +17 -1
- package/dist/esm/lib/reactive/createTypedScope.js +3 -1
- package/dist/esm/lib/reactive/types.d.ts +36 -4
- package/dist/esm/lib/reactive/types.js +3 -1
- package/dist/esm/lib/recorder/AttemptRecorder.d.ts +141 -0
- package/dist/esm/lib/recorder/AttemptRecorder.js +412 -0
- package/dist/esm/lib/recorder/ControlDepRecorder.d.ts +36 -2
- package/dist/esm/lib/recorder/ControlDepRecorder.js +50 -2
- package/dist/esm/lib/recorder/EmitRecorder.d.ts +3 -0
- package/dist/esm/lib/recorder/EmitRecorder.js +1 -1
- package/dist/esm/lib/recorder/InOutRecorder.d.ts +37 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +75 -6
- package/dist/esm/lib/recorder/QualityRecorder.d.ts +32 -5
- package/dist/esm/lib/recorder/QualityRecorder.js +87 -29
- package/dist/esm/lib/recorder/TopologyRecorder.d.ts +35 -5
- package/dist/esm/lib/recorder/TopologyRecorder.js +76 -2
- package/dist/esm/lib/recorder/attemptMetricRows.d.ts +11 -0
- package/dist/esm/lib/recorder/attemptMetricRows.js +202 -0
- package/dist/esm/lib/recorder/attemptMetrics.d.ts +7 -0
- package/dist/esm/lib/recorder/attemptMetrics.js +165 -0
- package/dist/esm/lib/recorder/attemptMetricsTypes.d.ts +114 -0
- package/dist/esm/lib/recorder/attemptMetricsTypes.js +2 -0
- package/dist/esm/lib/recorder/attemptOTel.d.ts +78 -0
- package/dist/esm/lib/recorder/attemptOTel.js +107 -0
- package/dist/esm/lib/recorder/attemptSeries.d.ts +81 -0
- package/dist/esm/lib/recorder/attemptSeries.js +103 -0
- package/dist/esm/lib/recorder/hooks.d.ts +9 -0
- package/dist/esm/lib/recorder/hooks.js +4 -1
- package/dist/esm/lib/runner/DeferredObserverTier.js +13 -1
- package/dist/esm/lib/runner/ExecutionRuntime.d.ts +54 -6
- package/dist/esm/lib/runner/ExecutionRuntime.js +57 -5
- package/dist/esm/lib/runner/FlowChartExecutor.d.ts +46 -2
- package/dist/esm/lib/runner/FlowChartExecutor.js +330 -101
- package/dist/esm/lib/runner/RunnableChart.d.ts +6 -0
- package/dist/esm/lib/runner/RunnableChart.js +5 -1
- package/dist/esm/lib/runner/attach.d.ts +2 -1
- package/dist/esm/lib/runner/attach.js +8 -2
- package/dist/esm/lib/runner/checkpoint.js +3 -1
- package/dist/esm/lib/runner/deadline.d.ts +42 -0
- package/dist/esm/lib/runner/deadline.js +90 -0
- package/dist/esm/lib/runner/index.d.ts +3 -1
- package/dist/esm/lib/runner/index.js +2 -1
- package/dist/esm/lib/runner/options.d.ts +17 -0
- package/dist/esm/lib/runner/options.js +3 -1
- package/dist/esm/lib/runner/recordSink.d.ts +128 -0
- package/dist/esm/lib/runner/recordSink.js +296 -0
- package/dist/esm/lib/runner/resume.d.ts +3 -0
- package/dist/esm/lib/runner/resume.js +22 -2
- package/dist/esm/lib/runner/snapshot.d.ts +2 -2
- package/dist/esm/lib/runner/snapshot.js +6 -2
- package/dist/esm/lib/scope/ScopeFacade.d.ts +118 -4
- package/dist/esm/lib/scope/ScopeFacade.js +304 -7
- package/dist/esm/lib/scope/recorders/DebugRecorder.d.ts +17 -3
- package/dist/esm/lib/scope/recorders/DebugRecorder.js +79 -13
- package/dist/esm/lib/scope/recorders/MetricRecorder.d.ts +10 -0
- package/dist/esm/lib/scope/recorders/MetricRecorder.js +15 -2
- package/dist/esm/lib/scope/runtime.d.ts +3 -0
- package/dist/esm/lib/scope/runtime.js +1 -1
- package/dist/esm/lib/scope/types.d.ts +6 -0
- package/dist/esm/lib/scope/types.js +1 -1
- package/dist/esm/lib/sinks/fileSink.d.ts +135 -0
- package/dist/esm/lib/sinks/fileSink.js +387 -0
- package/dist/esm/recorders.d.ts +8 -2
- package/dist/esm/recorders.js +7 -1
- package/dist/esm/sinks.d.ts +23 -0
- package/dist/esm/sinks.js +23 -0
- package/dist/esm/trace.d.ts +2 -2
- package/dist/esm/trace.js +1 -1
- package/dist/index.js +77 -60
- package/dist/lib/attempt/anySignal.js +43 -0
- package/dist/lib/attempt/call.js +134 -0
- package/dist/lib/attempt/category.js +136 -0
- package/dist/lib/attempt/correlation.js +186 -0
- package/dist/lib/attempt/deadline.js +112 -0
- package/dist/lib/attempt/decision.js +139 -0
- package/dist/lib/attempt/effect.js +174 -0
- package/dist/lib/attempt/errors.js +49 -0
- package/dist/lib/attempt/index.js +26 -0
- package/dist/lib/attempt/name.js +48 -0
- package/dist/lib/attempt/observed.js +177 -0
- package/dist/lib/attempt/policy.js +92 -0
- package/dist/lib/attempt/record.js +29 -0
- package/dist/lib/attempt/retryLoopContext.js +31 -0
- package/dist/lib/attempt/retryLoopTypes.js +3 -0
- package/dist/lib/attempt/runner.js +530 -0
- package/dist/lib/attempt/standalone.js +130 -0
- package/dist/lib/attempt/types.js +17 -0
- package/dist/lib/budget/index.js +17 -0
- package/dist/lib/budget/timeBudget.js +674 -0
- package/dist/lib/builder/FlowChartBuilder.js +199 -9
- package/dist/lib/builder/retryLoop.js +287 -0
- package/dist/lib/builder/types.js +1 -1
- package/dist/lib/decide/decide.js +2 -2
- package/dist/lib/decide/index.js +2 -2
- package/dist/lib/decide/types.js +1 -8
- package/dist/lib/engine/graph/StageNode.js +1 -1
- package/dist/lib/engine/graph/prefixNodeTree.js +5 -1
- package/dist/lib/engine/handlers/ChildrenExecutor.js +36 -6
- package/dist/lib/engine/handlers/DeciderHandler.js +7 -3
- package/dist/lib/engine/handlers/ResumeEntry.js +3 -1
- package/dist/lib/engine/handlers/SelectorHandler.js +4 -3
- package/dist/lib/engine/handlers/StageRunner.js +36 -9
- package/dist/lib/engine/handlers/SubflowExecutor.js +24 -5
- package/dist/lib/engine/handlers/commitStage.js +24 -5
- package/dist/lib/engine/handlers/stageError.js +26 -2
- package/dist/lib/engine/index.js +1 -1
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +67 -39
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +19 -2
- package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +60 -8
- package/dist/lib/engine/narrative/NullControlFlowNarrativeGenerator.js +2 -1
- package/dist/lib/engine/narrative/formatting/sentences.js +131 -2
- package/dist/lib/engine/narrative/index.js +1 -1
- package/dist/lib/engine/narrative/narrativeTypes.js +1 -1
- package/dist/lib/engine/narrative/recorders/ManifestFlowRecorder.js +55 -2
- package/dist/lib/engine/narrative/recorders/index.js +1 -1
- package/dist/lib/engine/narrative/types.js +1 -1
- package/dist/lib/engine/traversal/FlowchartTraverser.js +192 -116
- package/dist/lib/engine/traversalContext.js +6 -3
- package/dist/lib/engine/types.js +1 -1
- package/dist/lib/errors/terminalFailure.js +64 -0
- package/dist/lib/filter/evaluator.js +139 -0
- package/dist/lib/ids/idempotencyKey.js +28 -0
- package/dist/lib/memory/StageContext.js +246 -5
- package/dist/lib/memory/attention.js +175 -0
- package/dist/lib/memory/borrowedMutation.js +16 -2
- package/dist/lib/memory/frameTypes.js +3 -1
- package/dist/lib/memory/redaction.js +54 -5
- package/dist/lib/pause/record.js +10 -1
- package/dist/lib/pause/types.js +17 -1
- package/dist/lib/reactive/createTypedScope.js +3 -1
- package/dist/lib/reactive/types.js +3 -1
- package/dist/lib/recorder/AttemptRecorder.js +417 -0
- package/dist/lib/recorder/ControlDepRecorder.js +50 -2
- package/dist/lib/recorder/EmitRecorder.js +1 -1
- package/dist/lib/recorder/InOutRecorder.js +75 -6
- package/dist/lib/recorder/QualityRecorder.js +87 -29
- package/dist/lib/recorder/TopologyRecorder.js +76 -2
- package/dist/lib/recorder/attemptMetricRows.js +209 -0
- package/dist/lib/recorder/attemptMetrics.js +174 -0
- package/dist/lib/recorder/attemptMetricsTypes.js +3 -0
- package/dist/lib/recorder/attemptOTel.js +111 -0
- package/dist/lib/recorder/attemptSeries.js +113 -0
- package/dist/lib/recorder/hooks.js +4 -1
- package/dist/lib/runner/DeferredObserverTier.js +13 -1
- package/dist/lib/runner/ExecutionRuntime.js +57 -5
- package/dist/lib/runner/FlowChartExecutor.js +330 -101
- package/dist/lib/runner/RunnableChart.js +5 -1
- package/dist/lib/runner/attach.js +8 -2
- package/dist/lib/runner/checkpoint.js +3 -1
- package/dist/lib/runner/deadline.js +94 -0
- package/dist/lib/runner/index.js +4 -2
- package/dist/lib/runner/options.js +3 -1
- package/dist/lib/runner/recordSink.js +302 -0
- package/dist/lib/runner/resume.js +22 -2
- package/dist/lib/runner/snapshot.js +6 -2
- package/dist/lib/scope/ScopeFacade.js +303 -6
- package/dist/lib/scope/recorders/DebugRecorder.js +79 -13
- package/dist/lib/scope/recorders/MetricRecorder.js +15 -2
- package/dist/lib/scope/runtime.js +1 -1
- package/dist/lib/scope/types.js +1 -1
- package/dist/lib/sinks/fileSink.js +392 -0
- package/dist/recorders.js +10 -2
- package/dist/sinks.js +32 -0
- package/dist/trace.js +1 -1
- package/dist/types/index.d.ts +62 -2
- package/dist/types/lib/attempt/anySignal.d.ts +19 -0
- package/dist/types/lib/attempt/call.d.ts +88 -0
- package/dist/types/lib/attempt/category.d.ts +37 -0
- package/dist/types/lib/attempt/correlation.d.ts +95 -0
- package/dist/types/lib/attempt/deadline.d.ts +44 -0
- package/dist/types/lib/attempt/decision.d.ts +52 -0
- package/dist/types/lib/attempt/effect.d.ts +76 -0
- package/dist/types/lib/attempt/errors.d.ts +41 -0
- package/dist/types/lib/attempt/index.d.ts +18 -0
- package/dist/types/lib/attempt/name.d.ts +21 -0
- package/dist/types/lib/attempt/observed.d.ts +66 -0
- package/dist/types/lib/attempt/policy.d.ts +45 -0
- package/dist/types/lib/attempt/record.d.ts +11 -0
- package/dist/types/lib/attempt/retryLoopContext.d.ts +18 -0
- package/dist/types/lib/attempt/retryLoopTypes.d.ts +18 -0
- package/dist/types/lib/attempt/runner.d.ts +157 -0
- package/dist/types/lib/attempt/standalone.d.ts +47 -0
- package/dist/types/lib/attempt/types.d.ts +453 -0
- package/dist/types/lib/budget/index.d.ts +9 -0
- package/dist/types/lib/budget/timeBudget.d.ts +136 -0
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +88 -3
- package/dist/types/lib/builder/retryLoop.d.ts +56 -0
- package/dist/types/lib/builder/types.d.ts +35 -1
- package/dist/types/lib/decide/index.d.ts +1 -1
- package/dist/types/lib/decide/types.d.ts +3 -0
- package/dist/types/lib/engine/graph/StageNode.d.ts +11 -1
- package/dist/types/lib/engine/handlers/StageRunner.d.ts +8 -1
- package/dist/types/lib/engine/handlers/commitStage.d.ts +7 -0
- package/dist/types/lib/engine/handlers/stageError.d.ts +9 -0
- package/dist/types/lib/engine/index.d.ts +2 -2
- package/dist/types/lib/engine/narrative/CombinedNarrativeRecorder.d.ts +27 -13
- package/dist/types/lib/engine/narrative/FlowRecorderDispatcher.d.ts +4 -1
- package/dist/types/lib/engine/narrative/NarrativeFlowRecorder.d.ts +22 -3
- package/dist/types/lib/engine/narrative/NullControlFlowNarrativeGenerator.d.ts +1 -0
- package/dist/types/lib/engine/narrative/formatting/sentences.d.ts +23 -0
- package/dist/types/lib/engine/narrative/index.d.ts +2 -2
- package/dist/types/lib/engine/narrative/narrativeTypes.d.ts +27 -21
- package/dist/types/lib/engine/narrative/recorders/ManifestFlowRecorder.d.ts +45 -2
- package/dist/types/lib/engine/narrative/recorders/index.d.ts +1 -1
- package/dist/types/lib/engine/narrative/types.d.ts +74 -5
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +59 -19
- package/dist/types/lib/engine/traversalContext.d.ts +7 -2
- package/dist/types/lib/engine/types.d.ts +52 -57
- package/dist/types/lib/errors/terminalFailure.d.ts +29 -0
- package/dist/types/lib/{decide → filter}/evaluator.d.ts +7 -2
- package/dist/types/lib/ids/idempotencyKey.d.ts +14 -0
- package/dist/types/lib/memory/StageContext.d.ts +123 -3
- package/dist/types/lib/memory/attention.d.ts +26 -0
- package/dist/types/lib/memory/borrowedMutation.d.ts +8 -0
- package/dist/types/lib/memory/frameTypes.d.ts +38 -0
- package/dist/types/lib/memory/redaction.d.ts +12 -0
- package/dist/types/lib/pause/types.d.ts +19 -0
- package/dist/types/lib/reactive/types.d.ts +36 -4
- package/dist/types/lib/recorder/AttemptRecorder.d.ts +141 -0
- package/dist/types/lib/recorder/ControlDepRecorder.d.ts +36 -2
- package/dist/types/lib/recorder/EmitRecorder.d.ts +3 -0
- package/dist/types/lib/recorder/InOutRecorder.d.ts +37 -1
- package/dist/types/lib/recorder/QualityRecorder.d.ts +32 -5
- package/dist/types/lib/recorder/TopologyRecorder.d.ts +35 -5
- package/dist/types/lib/recorder/attemptMetricRows.d.ts +11 -0
- package/dist/types/lib/recorder/attemptMetrics.d.ts +7 -0
- package/dist/types/lib/recorder/attemptMetricsTypes.d.ts +114 -0
- package/dist/types/lib/recorder/attemptOTel.d.ts +78 -0
- package/dist/types/lib/recorder/attemptSeries.d.ts +81 -0
- package/dist/types/lib/recorder/hooks.d.ts +9 -0
- package/dist/types/lib/runner/ExecutionRuntime.d.ts +54 -6
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +46 -2
- package/dist/types/lib/runner/RunnableChart.d.ts +6 -0
- package/dist/types/lib/runner/attach.d.ts +2 -1
- package/dist/types/lib/runner/deadline.d.ts +42 -0
- package/dist/types/lib/runner/index.d.ts +3 -1
- package/dist/types/lib/runner/options.d.ts +17 -0
- package/dist/types/lib/runner/recordSink.d.ts +128 -0
- package/dist/types/lib/runner/resume.d.ts +3 -0
- package/dist/types/lib/runner/snapshot.d.ts +2 -2
- package/dist/types/lib/scope/ScopeFacade.d.ts +118 -4
- package/dist/types/lib/scope/recorders/DebugRecorder.d.ts +17 -3
- package/dist/types/lib/scope/recorders/MetricRecorder.d.ts +10 -0
- package/dist/types/lib/scope/runtime.d.ts +3 -0
- package/dist/types/lib/scope/types.d.ts +6 -0
- package/dist/types/lib/sinks/fileSink.d.ts +135 -0
- package/dist/types/recorders.d.ts +8 -2
- package/dist/types/sinks.d.ts +23 -0
- package/dist/types/trace.d.ts +2 -2
- package/package.json +20 -6
- package/dist/esm/lib/decide/evaluator.js +0 -130
- package/dist/lib/decide/evaluator.js +0 -134
|
@@ -238,6 +238,23 @@ export class RedactionRule {
|
|
|
238
238
|
const kept = this.isInert() ? value : this.retainNamed(address.slice(1), value);
|
|
239
239
|
return this.diagnosticRule ? this.diagnosticRule.retain(address, kept) : kept;
|
|
240
240
|
}
|
|
241
|
+
/**
|
|
242
|
+
* An idempotency key as records serve it (P3, design §6). The key is a VALUE, and the documented way to make one
|
|
243
|
+
* is from the input or the state (`order-${args.orderId}`) — so it is selected by its NAME (the diagnostic entry
|
|
244
|
+
* `{ idempotencyKey }`: a state rule of that name, or `policy.diagnostics` at `logs.idempotencyKey`) AND by its
|
|
245
|
+
* SOURCES, conservatively, the subflow-mapper taint law's way: when the input it may be derived from holds a
|
|
246
|
+
* selected key at any depth, or the stage read a selected value before making it (`selectedReads`), it is served
|
|
247
|
+
* whole as the placeholder. Never value equality. An inert rule never reads it.
|
|
248
|
+
*/
|
|
249
|
+
retainIdempotencyKey(key, sources) {
|
|
250
|
+
if (this.isDiagnosticInert())
|
|
251
|
+
return key;
|
|
252
|
+
if (!this.isInert() && ((sources.selectedReads ?? 0) > 0 || this.carriesSelectedKey(sources.input))) {
|
|
253
|
+
return SCOPE_PLACEHOLDER;
|
|
254
|
+
}
|
|
255
|
+
const kept = this.retainDiagnostic(['logs', 'idempotencyKey'], key);
|
|
256
|
+
return typeof kept === 'string' ? kept : String(kept);
|
|
257
|
+
}
|
|
241
258
|
/**
|
|
242
259
|
* Retain flow-message text (`flowMessages.description` / `.rationale`): text
|
|
243
260
|
* the engine composes has no name of its own, so no state selector reaches
|
|
@@ -284,7 +301,7 @@ export class RedactionRule {
|
|
|
284
301
|
...(info.code !== undefined && { code: info.code }),
|
|
285
302
|
raw: undefined,
|
|
286
303
|
};
|
|
287
|
-
(this.maskedErrors ??= new
|
|
304
|
+
(this.maskedErrors ??= new MaskedErrors()).set(error, masked);
|
|
288
305
|
return { message, structuredError: masked };
|
|
289
306
|
}
|
|
290
307
|
/**
|
|
@@ -293,7 +310,7 @@ export class RedactionRule {
|
|
|
293
310
|
* served masked (the safe side), never a second throw from an error path.
|
|
294
311
|
*/
|
|
295
312
|
carriesSelectedKey(value) {
|
|
296
|
-
if (this.isInert() || value === null || typeof value !== 'object')
|
|
313
|
+
if ((this.isInert() && !this.maskedErrors?.any) || value === null || typeof value !== 'object')
|
|
297
314
|
return false;
|
|
298
315
|
try {
|
|
299
316
|
return this.thrownCarries(value, new Set());
|
|
@@ -314,6 +331,9 @@ export class RedactionRule {
|
|
|
314
331
|
if (seen.has(value))
|
|
315
332
|
return false;
|
|
316
333
|
seen.add(value);
|
|
334
|
+
// A wrapper cannot expose a raw cause that this rule already served masked (including diagnostic-only masks).
|
|
335
|
+
if (this.maskedErrors?.has(value))
|
|
336
|
+
return true;
|
|
317
337
|
if (selectsByPath(value, undefined, this.dottedTargets(undefined), this.namesWalk(false), new Map(), 0).selected) {
|
|
318
338
|
return true;
|
|
319
339
|
}
|
|
@@ -396,7 +416,7 @@ export class RedactionRule {
|
|
|
396
416
|
}
|
|
397
417
|
maskedError(error) {
|
|
398
418
|
const known = this.maskedErrors?.get(error);
|
|
399
|
-
if (known || this.isDiagnosticInert())
|
|
419
|
+
if (known || (this.isDiagnosticInert() && !this.maskedErrors?.any))
|
|
400
420
|
return known;
|
|
401
421
|
const text = thrownText(error);
|
|
402
422
|
this.retainStageError(error, text, this.retainDiagnostic(['errors', 'stageExecutionError'], text));
|
|
@@ -574,7 +594,7 @@ export class RedactionRule {
|
|
|
574
594
|
// A masked stage error inside the record (a fork envelope's `result`) is
|
|
575
595
|
// served in its masked form: an Error's message is non-enumerable and a
|
|
576
596
|
// thrown string is a plain value, so no key walk sees either.
|
|
577
|
-
const served = this.maskedErrors?.
|
|
597
|
+
const served = this.maskedErrors?.any ? this.withServedErrors(record) : record;
|
|
578
598
|
if (this.isInert() || served === null || typeof served !== 'object')
|
|
579
599
|
return served;
|
|
580
600
|
const top = this.retainRecord(served, placeholder);
|
|
@@ -1398,4 +1418,33 @@ export class MapperTaint {
|
|
|
1398
1418
|
return false;
|
|
1399
1419
|
}
|
|
1400
1420
|
}
|
|
1401
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcmVkYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMERHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVoRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDO0FBMkU5QyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQXFCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFXLENBQUMsQ0FBQztBQUVqRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQXVCLEVBQUUsR0FBVztJQUM1RCxPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzFELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUVoQzs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxjQUFjLENBQUMsTUFBNEMsRUFBRSxHQUFXO0lBQy9FLE9BQU8sTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMs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Q0FBQyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUM7UUFDbEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdEMsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssT0FBTztZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQy9ELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFBRSxJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQztnQkFBRSxPQUFPLElBQUksQ0FBQztRQUM1RixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogcmVkYWN0aW9uLnRzIOKAlCBUaGUgT05FIG93bmVyIG9mIHdoYXQgYSByZWRhY3Rpb24gcG9saWN5IHNheXMgYWJvdXQgYSB2YWx1ZS5cbiAqXG4gKiBUSEUgTEFXIChvd25lciBydWxpbmcgKGEpKS4gQSByZWRhY3Rpb24gcG9saWN5IGNvdmVycyBFVkVSWVRISU5HIHRoZSBsaWJyYXJ5XG4gKiByZXRhaW5zIG9yIHNlcnZlcyDigJQgdGhlIGNvbW1pdCBsb2cgKGJvdGggZW5jb2RpbmdzKSwgdGhlIHJlZGFjdGVkIG1pcnJvcixcbiAqIHRyYWNrZWQgcmVhZHMvd3JpdGVzLCBldmVyeSByZWNvcmRlciBldmVudCAoaW5saW5lIGFuZCBkZWZlcnJlZCkgYW5kIHRoZVxuICogcmVjb3JkZXIgcm93cyBidWlsdCBmcm9tIHRoZW0sIHRoZSBuYXJyYXRpdmUsIHNuYXBzaG90cywgZGlhZ25vc3RpY3MsIHBhdXNlXG4gKiBwYXlsb2FkcywgYm91bmRhcnkgcmVjb3JkcyBhbmQgbG9nIGxpbmVzIOKAlCBhbmQgTkVWRVIgdGhlIGxpdmUgaGVhcCBvciB0aGVcbiAqIHJlc3VtZSBjaGVja3BvaW50LiBUd28gdmFsdWVzIGFyZSB0aGUgY2FsbGVyJ3Mgb3duIGFuZCBzdGF5IHJlYWw6IHRoZVxuICogYHJ1bigpYCByZWplY3Rpb24gKHRoZSB0aHJvd24gdmFsdWUgaXRzZWxmKSBhbmQgdGhlIGxpdmUgZm9yayByZXN1bHQuXG4gKlxuICogQSBwb2xpY3kgc2VsZWN0cyBieSBOQU1FIOKAlCBhIGtleSwgYSBkb3R0ZWQgcGF0aCwgYSBmaWVsZCDigJQgbmV2ZXIgYnlcbiAqIHNjYW5uaW5nIGNvbnRlbnQuIFdoYXQgY2FycmllcyBhIG5hbWU6XG4gKiAgIC0gc3RhdGUg4oCUIGl0cyB1c2VyLWxldmVsIHBhdGggKHtAbGluayBSZWRhY3Rpb25SdWxlLnZlcmRpY3R9KTtcbiAqICAgLSBhIHJlY29yZCBoYW5kZWQgb3V0IHdob2xlIOKAlCByb290IGlucHV0L291dHB1dCwgYSBzdWJmbG93J3MgbWFwcGVkIHNlZWRcbiAqICAgICBhbmQgZXhpdCBzdGF0ZSwgYSBwYXVzZSBwYXlsb2FkLCBhIHRocm93biB2YWx1ZSDigJQgaXRzIGtleXMgYXQgZXZlcnlcbiAqICAgICBkZXB0aCAoe0BsaW5rIFJlZGFjdGlvblJ1bGUucmV0YWluQm91bmRhcnl9KTtcbiAqICAgLSBhIGRpYWdub3N0aWMgZW50cnkg4oCUIGAkZGVidWdgL2AkZXJyb3JgL2AkbWV0cmljYC9gJGV2YWxgL2AkbG9nYCBhbmQgdGhlXG4gKiAgICAgZW5naW5lJ3Mgb3duIOKAlCB0aGUgcmVjb3JkIGB7IFtuYW1lXTogdmFsdWUgfWA6IGl0cyBuYW1lIElTIGEgc3RhdGUga2V5XG4gKiAgICAgKHtAbGluayBSZWRhY3Rpb25SdWxlLnJldGFpbkRpYWdub3N0aWN9KS4gYHBvbGljeS5kaWFnbm9zdGljc2AgYWRkc1xuICogICAgIGRpYWdub3N0aWMtb25seSBzZWxlY3RvcnMgb24gdG9wOyBmbG93LW1lc3NhZ2UgdGV4dCBoYXMgbm8gbmFtZSBvZiBpdHNcbiAqICAgICBvd24sIHNvIG9ubHkgdGhleSBzZWxlY3QgaXQ7XG4gKiAgIC0gYSBzdWJmbG93IG1hcHBlcidzIGNvcHkg4oCUIGEga2V5IGFuIGBpbnB1dE1hcHBlcmAvYG91dHB1dE1hcHBlcmAgKG9yIGFcbiAqICAgICBgcGFyYWxsZWxGb3JFYWNoYCBpdGVtcyBzZWxlY3Rvcikgd3JvdGUgaW5oZXJpdHMgdGhlIHJlZGFjdGlvbiBvZiB0aGVcbiAqICAgICBzZWxlY3RlZCB2YWx1ZSBpdCBjb3BpZWQgKHtAbGluayBNYXBwZXJUYWludH0pLlxuICogQSBtYXJrIGlzIGEgTkFNRSwgcnVuLXdpZGUsIHVudGlsIHRoZSBrZXkgaXMgZGVsZXRlZDsgYSBwYXVzZSBjYXJyaWVzIHRoZVxuICogbWFya3Mg4oCUIG5hbWVzIG9ubHkg4oCUIHRvIHRoZSByZXN1bWVkIHJ1biAoe0BsaW5rIFJlZGFjdGlvblJ1bGUubWFya3NGb3JDaGVja3BvaW50fSkuXG4gKiBBIHZhbHVlIHdpdGggbm8gbmFtZSDigJQgYSBzY2FsYXIgcm9vdCBpbnB1dC9vdXRwdXQgb3IgcGF1c2UgcGF5bG9hZCwgZnJlZVxuICogZXJyb3IgdGV4dCDigJQgaXMgc2VsZWN0ZWQgYnkgbm90aGluZy4gYGVtaXRQYXR0ZXJuc2AgaXMgdGhlIG9uZSBzZXBhcmF0ZVxuICogc2NydWI6IGEgYCRlbWl0YCBwYXlsb2FkIGlzIHNlbGVjdGVkIGJ5IGl0cyBldmVudCBuYW1lLlxuICpcbiAqIEhPVyBPTkUgT1dORVIgS0VFUFMgSVQuIEV2ZXJ5IHN0YWdlZCB3cml0ZSBhbmQgZXZlcnkgdHJhY2tlZCByZWFkIHBhc3Nlc1xuICogdGhyb3VnaCBgU3RhZ2VDb250ZXh0YCwgc28gYFN0YWdlQ29udGV4dGAgYXNrcyBUSElTIHJ1bGUg4oCUIG5vdCB0aGUgY2FsbGVyIOKAlFxuICogd2hhdCB0aGUgcG9saWN5IHNheXMgYWJvdXQgdGhlIHBhdGggaXQgaXMgYWJvdXQgdG8gcmV0YWluLiBBIGBTY29wZUZhY2FkZWBcbiAqIHdyaXRlLCBhIHN1YmZsb3cgYGlucHV0TWFwcGVyYCBzZWVkLCBhbiBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrIGFuZCBhXG4gKiByZXN1bWUgcmUtc2VlZCBhcmUgdGhlbiBhbGwgdGhlIHNhbWUgY2FzZTogdGhlIGZ1bm5lbCBkZWNpZGVzLCB0aGUgY2FsbGVyXG4gKiBjYW5ub3QgZm9yZ2V0IHRvLiBUaGUgZmFjYWRlIHVzZXMgdGhlIHNhbWUgcnVsZSBmb3IgdGhlIHZhbHVlcyBpdCBoYW5kcyB0b1xuICogcmVjb3JkZXJzOyBgU3ViZmxvd0V4ZWN1dG9yYCB1c2VzIGl0IGZvciB0aGUgbmFycmF0ZWQgc2VlZCBhbmRcbiAqIGBGbG93Y2hhcnRUcmF2ZXJzZXIuZXhlY3V0ZWAgZm9yIHJvb3QgaW5wdXQvb3V0cHV0IGJlZm9yZSBkaXNwYXRjaC4gQmVmb3JlIDkuMTkuMFxuICogdGhlIGZhY2FkZSBoZWxkIHRoZSB2ZXJkaWN0IGFsb25lLCBhbmQgZXZlcnkgcGF0aCB0aGF0IHdyb3RlIG9yIHJlYWQgcGFzdFxuICogdGhlIGZhY2FkZSDigJQgZml2ZSBvZiB0aGVtIOKAlCByZXRhaW5lZCBwbGFpbnRleHQgdW5kZXIgYSBwb2xpY3kuXG4gKlxuICogT05FIFZFUkRJQ1QgT1dORVIsIE9ORSBFTkNPRElORyBPV05FUiAoQzQpLiBUaGlzIGZpbGUgREVDSURFUyDigJQgdGhlIHJ1bGUsXG4gKiBhbmQgZm9yIGEgc3RhZ2VkIHdyaXRlIHtAbGluayBkZWNpZGVXcml0ZX0gKHRoZSB2ZXJkaWN0KSxcbiAqIHtAbGluayBpbmhlcml0QnlJZGVudGl0eX0gYW5kIHtAbGluayBtYXJrU3RhZ2VkV3JpdGV9ICh0aGUgbWFya3MpIOKAlCBhbmQgaXNcbiAqIHRoZSBlbmdpbmUncyAoTDQsIGJlc2lkZSB0aGUgcnVuIHBvbGljeSB0aGF0IGNhcnJpZXMgdGhlIHJ1bGUpLiBUaGUgQllURVMgb2YgYVxuICogdmVyZGljdCBhcmUgdGhlIHJlY29yZCdzOiB0aGUgZnJhbWUgaGFuZHMgaXRzIHNjcnViIChgd2hvbGVgLCBvciB0aGVcbiAqIGBmaWVsZHNgIGluc2lkZSB0aGUgdmFsdWUg4oCUIHtAbGluayBzY3J1Yk9mfSkgdG8gYFJlY29yZEZyYW1lIMK3IHdyaXRlYCwgYW5kXG4gKiB0aGUgcmVjb3JkJ3Mgb3duIHNjcnViIChgbWVtb3J5L3NjcnViLnRzYCwgTDIpIHdyaXRlcyB0aGUgbG9nJ3MgcGxhY2Vob2xkZXJcbiAqIGF0IGNvbW1pdC4gQmVmb3JlIEM0IHRoZSBzY3J1YiBsaXZlZCBoZXJlIHRvbywgc28gdGhlIHJlY29yZCBpbXBvcnRlZCB0aGVcbiAqIGVuZ2luZSdzIHBvbGljeSBtb2R1bGUgdG8gd3JpdGUgYSBzdHJpbmcuXG4gKlxuICogVFdPIFBMQUNFSE9MREVSUywgQk9USCBISVNUT1JJQ0FMLCBPTkUgUEVSIE9XTkVSOiB0aGUgY29tbWl0IGxvZyBhbmQgdGhlXG4gKiBtaXJyb3IgY2FycnkgYCdSRURBQ1RFRCdgIChgTE9HX1BMQUNFSE9MREVSYCwgYG1lbW9yeS9wbGFjZWhvbGRlcnMudHNgIOKAlCBhXG4gKiByZWNvcmQgYnl0ZSwgd3JpdHRlbiBieSBgbWVtb3J5L3NjcnViLnRzYCk7IGV2ZXJ5IHNjb3BlLXRpZXIgdmlldyDigJQgc2NvcGVcbiAqIHJlY29yZGVyIGV2ZW50cywgYHN0YWdlUmVhZHNgL2BzdGFnZVdyaXRlc2AsIG5hcnJhdGl2ZSDigJQgY2Fycmllc1xuICogYCdbUkVEQUNURURdJ2AgKHtAbGluayBTQ09QRV9QTEFDRUhPTERFUn0sIGJlbG93IOKAlCB0aGUgdmVyZGljdCdzIG93bikuXG4gKiBOZWl0aGVyIHN0cmluZyBjaGFuZ2VkIGluIDkuMTkuMCBvciBzaW5jZTsgZWFjaCBpcyBzcGVsbGVkIG9uY2UgaW4gYHNyYy9gLlxuICovXG5cbmltcG9ydCB7IG5hdGl2ZUhhcyB9IGZyb20gJ2Zvb3R0cmFjZS9wYXRocyc7XG5pbXBvcnQgdHlwZSB7IFdyaXRlU2NydWIsIFdyaXRlVmVyYiB9IGZyb20gJ2Zvb3R0cmFjZS93cml0ZSc7XG5cbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL2Rldk1vZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBTdHJ1Y3R1cmVkRXJyb3JJbmZvIH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgeyBleHRyYWN0RXJyb3JJbmZvLCB0aHJvd25UZXh0IH0gZnJvbSAnLi4vZXJyb3JzL2Vycm9ySW5mby5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvbk1hcmtzIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgUlVOX05BTUVTUEFDRSB9IGZyb20gJy4vcnVuQWRkcmVzcy5qcyc7XG5cbi8qKlxuICogV2hhdCB0aGUgU0NPUEUgQ0hBTk5FTCBjYXJyaWVzIHdoZXJlIGEgdmFsdWUgd2FzIHNjcnViYmVkOiBhIHNjb3BlIHJlY29yZGVyJ3MgcmVhZCwgd3JpdGUgYW5kXG4gKiBjb21taXQgZXZlbnRzLCB0aGUgYHN0YWdlUmVhZHNgIC8gYHN0YWdlV3JpdGVzYCByZXRlbnRpb24sIHRoZSBuYXJyYXRpdmUsIGEgZGVjaXNpb24ncyBldmlkZW5jZSwgYW5cbiAqIGVtaXQgcGF5bG9hZCBtYXRjaGVkIGJ5IGBlbWl0UGF0dGVybnNgLCBhIHBhdXNlIHBheWxvYWQncyBzZXJ2ZWQgZm9ybSBhbmQgYSBzdWJmbG93J3MgbmFycmF0ZWQgc2VlZFxuICogKGBvblN1YmZsb3dFbnRyeWApIOKAlCBldmVyeSB2YWx1ZSB0aGlzIHZlcmRpY3Qgc2VydmVzLCB1bmxlc3MgaXRzIGNhbGxlciBwYXNzZXMgdGhlIGxvZydzIHN0cmluZy5cbiAqXG4gKiBJdHMgdHdpbiBpcyB0aGUgUkVDT1JEJ3MgYExPR19QTEFDRUhPTERFUmAgKGAnUkVEQUNURUQnYCwgYG1lbW9yeS9wbGFjZWhvbGRlcnMudHNgKTogdGhlIGNvbW1pdCBsb2csXG4gKiB0aGUgcmVkYWN0ZWQgbWlycm9yIGFuZCBldmVyeXRoaW5nIHNlcnZlZCBmcm9tIHRoZW0uIFNvIE5PVCBldmVyeSByZWNvcmRlciBldmVudCBjYXJyaWVzIHRoaXMgb25lOlxuICogYG9uU3ViZmxvd0V4aXQub3V0cHV0U3RhdGVgIHNlcnZlcyB0aGUgc3ViZmxvdydzIHJlZGFjdGVkIG1pcnJvciB3aGVuIGEgcG9saWN5IGtlZXBzIG9uZSwgYW5kIHNvXG4gKiBjYXJyaWVzIHRoZSBsb2cncyBzdHJpbmcgKHdpdGhvdXQgYSBtaXJyb3Ig4oCUIHBlci1jYWxsIG1hcmtzIGFsb25lIOKAlCBpdCBpcyB0aGUgc3ViZmxvdydzIGhlYXBcbiAqIHJldGFpbmVkIHVuZGVyIHRoZSBydWxlLCB3aXRoIHRoaXMgb25lKS4gQm90aCBzdHJpbmdzIGFyZSBoaXN0b3JpY2FsIGFuZCBuZWl0aGVyIGNoYW5nZWQgd2hlbiBpdFxuICogbW92ZWQ6IHRoaXMgb25lIHdhcyB0aGUgY29uc3RhbnQgYFJFREFDVEVEYCBpbiB0aGlzIGZpbGUgdW50aWwgRjRhLCB0aGVuIGBwbGFjZWhvbGRlcnMudHMgwrdcbiAqIFNDT1BFX1BMQUNFSE9MREVSYCwgYW5kIHNpbmNlIEM0IGl0IGxpdmVzIGhlcmUgYWdhaW4sIGJlc2lkZSB0aGUgdmVyZGljdCB0aGF0IHdyaXRlcyBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IFNDT1BFX1BMQUNFSE9MREVSID0gJ1tSRURBQ1RFRF0nO1xuXG4vKipcbiAqIERlY2xhcmF0aXZlIGtleS9wYXRoIHJlZGFjdGlvbiBmb3IgcmVjb3JkZWQgc3RhdGUgYW5kIGJvdW5kYXJ5IHJlY29yZHMuXG4gKlxuICogQ29uZmlndXJlIGF0IHRoZSBzY29wZSBjbGFzcyBsZXZlbCAoc3RhdGljIHByb3BlcnR5KSBvciBwYXNzIHRvXG4gKiBGbG93Q2hhcnRFeGVjdXRvciB0byBhcHBseSBhY3Jvc3MgYWxsIHN0YWdlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRhY3Rpb25Qb2xpY3kge1xuICAvKiogRXhhY3Qga2V5IG5hbWVzIHRvIGFsd2F5cyByZWRhY3QgKGUuZy4gWydzc24nLCAnY3JlZGl0Q2FyZCddKS4gKi9cbiAga2V5cz86IHN0cmluZ1tdO1xuICAvKipcbiAgICogUmVnZXggcGF0dGVybnMg4oCUIGFueSBrZXkgbWF0Y2hpbmcgYSBwYXR0ZXJuIGlzIGF1dG8tcmVkYWN0ZWQuXG4gICAqXG4gICAqIFBhdHRlcm4gbWF0Y2hpbmcgaXMgc2tpcHBlZCBmb3Iga2V5cyB0aGF0IGV4Y2VlZCBhbiBpbnRlcm5hbCBsZW5ndGggY2FwXG4gICAqIChkZXNpZ25lZCB0byBwcmV2ZW50IFJlRG9TIG9uIHBhdGhvbG9naWNhbCBwYXR0ZXJucykuIEZvciB2ZXJ5IGxvbmcga2V5XG4gICAqIG5hbWVzLCB1c2UgYGtleXNgIChleGFjdCBtYXRjaCkgaW5zdGVhZCBvZiBwYXR0ZXJucy5cbiAgICovXG4gIHBhdHRlcm5zPzogUmVnRXhwW107XG4gIC8qKiBGaWVsZC1sZXZlbCByZWRhY3Rpb24gd2l0aGluIG9iamVjdHMg4oCUIGtleSDihpIgYXJyYXkgb2YgZmllbGRzIHRvIHNjcnViLlxuICAgKiAgU3VwcG9ydHMgZG90LW5vdGF0aW9uIGZvciBuZXN0ZWQgcGF0aHMgKGUuZy4gJ2FkZHJlc3MuemlwJykuICovXG4gIGZpZWxkcz86IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqXG4gICAqIERpYWdub3N0aWMtb25seSBzZWxlY3RvcnMsIElOIEFERElUSU9OIHRvIHRoZSBzdGF0ZSBzZWxlY3RvcnMgYWJvdmUgKHdoaWNoXG4gICAqIGFscmVhZHkgY292ZXIgYSBkaWFnbm9zdGljIGVudHJ5IGJ5IGl0cyBuYW1lOiBga2V5czogWyd0b2tlbiddYCBtYXNrc1xuICAgKiBgJGRlYnVnKCd0b2tlbicsIOKApilgKS4gVXNlIHRoZXNlIGZvciBuYW1lcyB5b3UgbWFzayBpbiBkaWFnbm9zdGljcyBidXRcbiAgICogbm90IGluIHN0YXRlLiBQYXRocyBzdGFydCB3aXRoIGxvZ3MvZXJyb3JzL21ldHJpY3MvZXZhbHMsIGUuZy5cbiAgICogYGxvZ3MucHJvZmlsZS50b2tlbmAuIE9ubHkgZmxvd01lc3NhZ2VzLmRlc2NyaXB0aW9uIGFuZFxuICAgKiBmbG93TWVzc2FnZXMucmF0aW9uYWxlIGFyZSBwYXlsb2FkczsgZmxvdyB0b3BvbG9neS90aW1pbmcgbWV0YWRhdGEgc3RheXNcbiAgICogaW50YWN0LiBBcHBsaWVkIGJlZm9yZSByZXRlbnRpb24sIG5vdCByZXRyb2FjdGl2ZWx5IHRvIGV4aXN0aW5nIGJhZ3MuXG4gICAqL1xuICBkaWFnbm9zdGljcz86IFBpY2s8UmVkYWN0aW9uUG9saWN5LCAna2V5cycgfCAncGF0dGVybnMnIHwgJ2ZpZWxkcyc+O1xuICAvKipcbiAgICogUmVnZXggcGF0dGVybnMgbWF0Y2hlZCBhZ2FpbnN0IGBFbWl0RXZlbnQubmFtZWAgZm9yIGBzY29wZS4kZW1pdCguLi4pYFxuICAgKiBjYWxscy4gQW55IGVtaXQgZXZlbnQgd2hvc2UgbmFtZSBtYXRjaGVzIGhhcyBpdHMgcGF5bG9hZCByZXBsYWNlZCB3aXRoXG4gICAqIHRoZSBzdHJpbmcgYCdbUkVEQUNURURdJ2AgYmVmb3JlIGRpc3BhdGNoIHRvIHJlY29yZGVycy5cbiAgICogR2xvYmFsL3N0aWNreSBwYXR0ZXJucyBzdGFydCBhdCBpbmRleCB6ZXJvIG9uIGV2ZXJ5IHRlc3Q7IHRoZWlyIGZsYWdzXG4gICAqIHJldGFpbiB0aGVpciB1c3VhbCBtZWFuaW5nLiBUaGlzIGRvZXMgbm90IHNjcnViIGRpYWdub3N0aWMgc2lkZSBiYWdzLlxuICAgKlxuICAgKiBFeGFtcGxlOlxuICAgKiBgYGB0c1xuICAgKiB7IGVtaXRQYXR0ZXJuczogWy9cXC5hdXRoXFwuLywgL1xcLmJpbGxpbmdcXC4vXSB9XG4gICAqIC8vIEhpZGVzIHBheWxvYWRzIG9mIGV2ZW50cyBsaWtlICdteWFwcC5hdXRoLmNoZWNrJyBhbmQgJ215YXBwLmJpbGxpbmcuc3BlbmQnXG4gICAqIGBgYFxuICAgKi9cbiAgZW1pdFBhdHRlcm5zPzogUmVnRXhwW107XG59XG5cbi8qKlxuICogU3RhdGUgcmVkYWN0aW9uIHJlcG9ydC4gTmV2ZXIgaW5jbHVkZXMgdmFsdWVzOyBlbWl0IGFuZCBkaWFnbm9zdGljXG4gKiBzZWxlY3RvcnMvYWN0aXZpdHkgYXJlIG5vdCByZXByZXNlbnRlZCBoZXJlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlZGFjdGlvblJlcG9ydCB7XG4gIC8qKiBLZXlzIGZ1bGx5IHJlZGFjdGVkIChleGFjdCBtYXRjaCBvciBwYXR0ZXJuIG1hdGNoKS4gKi9cbiAgcmVkYWN0ZWRLZXlzOiBzdHJpbmdbXTtcbiAgLyoqIEtleXMgd2l0aCBmaWVsZC1sZXZlbCByZWRhY3Rpb24g4oaSIHdoaWNoIGZpZWxkcyB3ZXJlIHNjcnViYmVkLiAqL1xuICBmaWVsZFJlZGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPjtcbiAgLyoqIFBhdHRlcm4gc291cmNlcyB0aGF0IHdlcmUgYWN0aXZlIChlLmcuIFsncGFzc3dvcmR8c2VjcmV0J10pLiAqL1xuICBwYXR0ZXJuczogc3RyaW5nW107XG59XG5cbi8qKlxuICogV2hhdCB0aGUgcG9saWN5IHNheXMgYWJvdXQgdGhlIHZhbHVlIGF0IG9uZSB1c2VyLWxldmVsIHBhdGguXG4gKlxuICogLSBgJ2NsZWFyJ2AgIOKAlCBub3RoaW5nIHRvIHNjcnViOyByZXRhaW4gYW5kIHNlcnZlIHRoZSB2YWx1ZSBhcyBpdCBpcy5cbiAqIC0gYCd3aG9sZSdgICDigJQgdGhlIGVudGlyZSB2YWx1ZSBpcyBzZWNyZXQuIGBrZXlgIGlzIHRoZSBwb2xpY3kgb3IgbWFya2VkXG4gKiAgIGtleSB0aGF0IGRlY2lkZWQgaXQgKHRoZSBwYXRoIGl0c2VsZiBvciBvbmUgb2YgaXRzIGFuY2VzdG9ycykuXG4gKiAtIGAnZmllbGRzJ2Ag4oCUIHRoZSB2YWx1ZSBpcyBhbiBvYmplY3Qgd2hvc2UgYHBhdGhzYCAoZG90LXBhdGhzIElOU0lERSB0aGVcbiAqICAgdmFsdWUsIHJlbGF0aXZlIHRvIGl0KSBhcmUgc2VjcmV0OyBldmVyeXRoaW5nIGVsc2UgaW4gaXQgaXMgbm90LlxuICovXG5leHBvcnQgdHlwZSBSZWRhY3Rpb25WZXJkaWN0ID1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdjbGVhcicgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ3dob2xlJzsgcmVhZG9ubHkga2V5OiBzdHJpbmcgfVxuICB8IHsgcmVhZG9ubHkga2luZDogJ2ZpZWxkcyc7IHJlYWRvbmx5IGtleTogc3RyaW5nOyByZWFkb25seSBwYXRoczogcmVhZG9ubHkgc3RyaW5nW10gfTtcblxuZXhwb3J0IGNvbnN0IENMRUFSOiBSZWRhY3Rpb25WZXJkaWN0ID0gT2JqZWN0LmZyZWV6ZSh7IGtpbmQ6ICdjbGVhcicgfSBhcyBjb25zdCk7XG5cbi8qKlxuICogVGhlIHVzZXItbGV2ZWwgTkFNRSBvZiBga2V5YCB1bmRlciBgcGF0aGAg4oCUIHRoZSBrZXkgaXRzZWxmIGF0IHRoZSB0b3AgbGV2ZWwsIGVsc2UgdGhlIHNlZ21lbnRzXG4gKiBqb2luZWQgYnkgYSBkb3QgKGBbJ3Byb2ZpbGUnXSArICdhdXRoJ2Ag4oaSIGAncHJvZmlsZS5hdXRoJ2ApOiB3aGF0IGEgdmVyZGljdCBkZWNpZGVzIG9uLCBhIG1hcmtcbiAqIGhvbGRzLCBhbmQgdGhlIGZyYW1lIGtleXMgYSBzdGFnZSdzIHJldGFpbmVkIHJlYWRzIGFuZCB3cml0ZXMgYnkgKGBTdGFnZUNvbnRleHRgKS4gQSBuYW1lLCBub3QgYW5cbiAqIGFkZHJlc3Mg4oCUIGEga2V5IG1heSBjb250YWluIGEgZG90IOKAlCBzbyBpdCBuZXZlciBnb2VzIGludG8gYSB0cmFjZSBwYXRoLiBObyBhbGxvY2F0aW9uIGZvciB0aGVcbiAqIGNvbW1vbiB0b3AtbGV2ZWwga2V5LiAoVGhlIHJlY29yZCBzcGVsbHMgdGhlIHNhbWUgbmFtZSBmb3IgYHJlYWRLZXlzYCwgYFJlY29yZEZyYW1lIMK3IG5vdGVSZWFkYC4pXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1c2VyS2V5T2YocGF0aDogcmVhZG9ubHkgc3RyaW5nW10sIGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgubGVuZ3RoID4gMCA/IFsuLi5wYXRoLCBrZXldLmpvaW4oJy4nKSA6IGtleTtcbn1cblxuLyoqXG4gKiBNYXhpbXVtIGtleSBsZW5ndGggKGNoYXJhY3RlcnMpIHRoYXQgd2lsbCBiZSB0ZXN0ZWQgYWdhaW5zdCByZWdleCByZWRhY3Rpb25cbiAqIHBhdHRlcm5zLiBLZXlzIGxvbmdlciB0aGFuIHRoaXMgYXJlIHNraXBwZWQgZm9yIHBhdHRlcm4gbWF0Y2hpbmcgdG8gcHJldmVudFxuICogUmVEb1M6IGEgcGF0aG9sb2dpY2FsIHJlZ2V4IHRlc3RlZCBhZ2FpbnN0IGFuIHVuYm91bmRlZGx5IGxvbmcga2V5IHN0cmluZ1xuICogY2FuIGNhdXNlIGNhdGFzdHJvcGhpYyBiYWNrdHJhY2tpbmcuIDI1NiBjaGFyYWN0ZXJzIGNvbWZvcnRhYmx5IGV4Y2VlZHMgYW55XG4gKiByZWFsaXN0aWMgc2NvcGUtc3RhdGUga2V5IG5hbWUuXG4gKi9cbmNvbnN0IE1BWF9QQVRURVJOX0tFWV9MRU4gPSAyNTY7XG5cbi8qKlxuICogVGhlIGZpZWxkcyBhIHBvbGljeSBkZWNsYXJlcyB1bmRlciBga2V5YCDigJQgb25seSB3aGVuIGBmaWVsZHNgIE9XTlMgYGtleWAuXG4gKiBUaGUga2V5IGlzIGEgbmFtZSBmcm9tIGRhdGEgKGEgc3RhdGUga2V5LCBhIG5lc3RlZCBrZXkgb2YgYSByZWNvcmQgaGFuZGVkXG4gKiBvdXQgd2hvbGUpLCBhbmQgYSBwbGFpbi1vYmplY3QgbG9va3VwIHJlYWRzIHRoZSBwcm90b3R5cGUgY2hhaW46XG4gKiBgZmllbGRzWydjb25zdHJ1Y3RvciddYCBpcyBgT2JqZWN0YCwgYGZpZWxkc1snX19wcm90b19fJ11gIGlzXG4gKiBgT2JqZWN0LnByb3RvdHlwZWAuIFRoZSB3YWxrIHRoZW4gaXRlcmF0ZWQgdGhlbSwgc28gYW55IGBmaWVsZHNgIHBvbGljeVxuICogZmFpbGVkIHRoZSBydW4gd2l0aCBhIFR5cGVFcnJvciBvbiBkYXRhIGhvbGRpbmcgc3VjaCBhIGtleS5cbiAqL1xuZnVuY3Rpb24gZGVjbGFyZWRGaWVsZHMoZmllbGRzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfCB1bmRlZmluZWQsIGtleTogc3RyaW5nKTogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQge1xuICByZXR1cm4gZmllbGRzICE9PSB1bmRlZmluZWQgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGZpZWxkcywga2V5KSA/IGZpZWxkc1trZXldIDogdW5kZWZpbmVkO1xufVxuXG4vKiogUG9saWN5IHBhdHRlcm5zIGFyZSBwcmVkaWNhdGVzLCBub3QgY3Vyc29ycyBvdmVyIHN1Y2Nlc3NpdmUga2V5cy9ldmVudHMuICovXG5mdW5jdGlvbiBtYXRjaGVzUGF0dGVybih2YWx1ZTogc3RyaW5nLCBwYXR0ZXJuczogcmVhZG9ubHkgUmVnRXhwW10gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgaWYgKCFwYXR0ZXJucykgcmV0dXJuIGZhbHNlO1xuICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgcGF0dGVybnMpIHtcbiAgICAvLyBPbmx5IHRoZXNlIGZsYWdzIGNvbnN1bWUgbGFzdEluZGV4LiBPcmRpbmFyeSAoaW5jbHVkaW5nIGZyb3plbilcbiAgICAvLyByZWdleGVzIG5lZWQgbm8gd3JpdGFibGUgY3Vyc29yIHRvIG1hdGNoLiBLZWVwIGFsbCBvcmlnaW5hbCBmbGFncy5cbiAgICBpZiAocGF0dGVybi5nbG9iYWwgfHwgcGF0dGVybi5zdGlja3kpIHBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICBpZiAocGF0dGVybi50ZXN0KHZhbHVlKSkgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgY2xhc3MgUmVkYWN0aW9uUnVsZSB7XG4gIHByaXZhdGUgcG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZGlhZ25vc3RpY1J1bGU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQ7XG4gIC8qKiBXaGV0aGVyIGBwb2xpY3lgIG5hbWVzIGFueXRoaW5nIGEgc3RhdGUgdmVyZGljdCBjYW4gYWN0IG9uIOKAlCBjb21wdXRlZFxuICAgKiAgb25jZSBwZXIgYHNldFBvbGljeWAgc28ge0BsaW5rIGlzSW5lcnR9IGlzIGEgdHdvLWZpZWxkIGNoZWNrLiAqL1xuICBwcml2YXRlIHBvbGljeUFjdGl2ZSA9IGZhbHNlO1xuICAvKiogVGhlIHBvbGljeSdzIHBhdHRlcm5zIHRoYXQgY2FuIGRlcGVuZCBvbiBhIHdob2xlIGRvdHRlZCBwYXRoICh7QGxpbmsgbmVlZHNQYXRofSkg4oCUIHBlciBgc2V0UG9saWN5YC4gKi9cbiAgcHJpdmF0ZSBwYXRoUGF0dGVybnM6IHJlYWRvbmx5IFJlZ0V4cFtdID0gW107XG4gIHByaXZhdGUgd2Fsa0xpbWl0V2FybmVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBLZXlzIG1hcmtlZCBzZWNyZXQgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4g4oCUIGJ5IGEgcGVyLWNhbGxcbiAgICogYHNldFZhbHVlKGtleSwgdmFsdWUsIHRydWUpYCwgb3IgYnkgYW55IHdyaXRlIHRoZSBwb2xpY3kgcmVkYWN0ZWQgd2hvbGUuXG4gICAqIE9ORSBzZXQgcGVyIHJ1biwgc2hhcmVkIGJ5IGV2ZXJ5IHNjb3BlIGFuZCBjb250ZXh0ICh0aGUgZXhlY3V0b3IgYnVpbGRzXG4gICAqIHRoZSBydWxlIG9uY2UgcGVyIHJ1biBhbmQgaW5zdGFsbHMgaXQgb24gdGhlIHJ1bnRpbWUgcm9vdCkuXG4gICAqL1xuICBwcml2YXRlIG1hcmtlZDogU2V0PHN0cmluZz47XG4gIC8qKlxuICAgKiBGaWVsZHMgYSBzdWJmbG93IG1hcHBlciBoYW5kZWQgdG8gYSBORVcga2V5IGFsb25nIHdpdGggdGhlIHZhbHVlIHRoZXlcbiAgICogYmVsb25nIHRvIOKAlCB0YXJnZXQga2V5IOKGkiB0aGUgc291cmNlIGtleSdzIGZpZWxkIHBhdGhzIChhbiBvYmplY3QgY29waWVkXG4gICAqIGJ5IHJlZmVyZW5jZSBmcm9tIGEgYGZpZWxkc2Atc2VsZWN0ZWQga2V5OyB7QGxpbmsgTWFwcGVyVGFpbnR9KS5cbiAgICogUnVuLXdpZGUsIGJ5IG5hbWUsIGxpa2Uge0BsaW5rIG1hcmtlZH0uXG4gICAqL1xuICBwcml2YXRlIGluaGVyaXRlZDogTWFwPHN0cmluZywgcmVhZG9ubHkgc3RyaW5nW10+IHwgdW5kZWZpbmVkO1xuICAvKiogVGhpcyBydW4ncyB0aHJvd24gdmFsdWVzIHNlcnZlZCBtYXNrZWQgKHRoZWlyIHRleHQgc2VsZWN0ZWQsIG9yIGEgc2VsZWN0ZWQga2V5IGluc2lkZSB0aGVtKSDihpIgdGhlaXIgc2VydmVkIGZvcm0uICovXG4gIHByaXZhdGUgbWFza2VkRXJyb3JzOiBNYXA8dW5rbm93biwgU3RydWN0dXJlZEVycm9ySW5mbz4gfCB1bmRlZmluZWQ7XG5cbiAgY29uc3RydWN0b3IocG9saWN5PzogUmVkYWN0aW9uUG9saWN5LCBtYXJrZWQ/OiBTZXQ8c3RyaW5nPikge1xuICAgIHRoaXMubWFya2VkID0gbWFya2VkID8/IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHRoaXMuc2V0UG9saWN5KHBvbGljeSk7XG4gIH1cblxuICBnZXRQb2xpY3koKTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wb2xpY3k7XG4gIH1cblxuICBzZXRQb2xpY3kocG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICB0aGlzLnBvbGljeSA9IHBvbGljeTtcbiAgICBjb25zdCBkaWFnbm9zdGljcyA9IHBvbGljeT8uZGlhZ25vc3RpY3M7XG4gICAgdGhpcy5kaWFnbm9zdGljUnVsZSA9IGRpYWdub3N0aWNzXG4gICAgICA/IG5ldyBSZWRhY3Rpb25SdWxlKHsga2V5czogZGlhZ25vc3RpY3Mua2V5cywgcGF0dGVybnM6IGRpYWdub3N0aWNzLnBhdHRlcm5zLCBmaWVsZHM6IGRpYWdub3N0aWNzLmZpZWxkcyB9KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5wYXRoUGF0dGVybnMgPSAocG9saWN5Py5wYXR0ZXJucyA/PyBbXSkuZmlsdGVyKG5lZWRzUGF0aCk7XG4gICAgdGhpcy5wb2xpY3lBY3RpdmUgPVxuICAgICAgcG9saWN5ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICgocG9saWN5LmtleXM/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcbiAgICAgICAgKHBvbGljeS5wYXR0ZXJucz8ubGVuZ3RoID8/IDApID4gMCB8fFxuICAgICAgICBPYmplY3Qua2V5cyhwb2xpY3kuZmllbGRzID8/IHt9KS5sZW5ndGggPiAwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcnVlIHdoZW4gdGhpcyBydWxlIGhhcyBub3RoaW5nIHRvIHNheSBhYm91dCBBTlkgcGF0aCDigJQgbm8ga2V5LCBwYXR0ZXJuXG4gICAqIG9yIGZpZWxkIGluIHRoZSBwb2xpY3kgYW5kIG5vIGtleSBtYXJrZWQgc28gZmFyLiBUaGUgbm8tcG9saWN5IGZhc3RcbiAgICogcGF0aDogYFN0YWdlQ29udGV4dGAgc2tpcHMgdGhlIHZlcmRpY3QgKGFuZCBpdHMgcGF0aCBhbGxvY2F0aW9uKSBvblxuICAgKiBldmVyeSB0cmFja2VkIHJlYWQgYW5kIHN0YWdlZCB3cml0ZSB3aGlsZSB0aGlzIGhvbGRzLiBBIHBlci1jYWxsXG4gICAqIGBzZXRWYWx1ZShrZXksIHZhbHVlLCB0cnVlKWAgbWFya3MgYSBrZXkgYW5kIGVuZHMgaXQuXG4gICAqL1xuICBpc0luZXJ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1hcmtlZC5zaXplID09PSAwICYmICF0aGlzLnBvbGljeUFjdGl2ZSAmJiB0aGlzLmluaGVyaXRlZCA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIFRoZSBzaGFyZWQgbWFya2VkLWtleXMgc2V0IOKAlCBmb3IgdGhlIGBAaW50ZXJuYWxgIHNoYXJpbmcgcHJvdG9jb2wgYW5kIGBkZWNpZGUoKWAuICovXG4gIG1hcmtlZEtleXMoKTogU2V0PHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLm1hcmtlZDtcbiAgfVxuXG4gIHVzZU1hcmtlZEtleXMoc2hhcmVkOiBTZXQ8c3RyaW5nPik6IHZvaWQge1xuICAgIHRoaXMubWFya2VkID0gc2hhcmVkO1xuICB9XG5cbiAgbWFyayhrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMubWFya2VkLmFkZChrZXkpO1xuICB9XG5cbiAgLyoqIERlbGV0aW5nIGEga2V5IGNsZWFycyBpdHMgcGVyLWNhbGwgbWFyayBhbmQgYW55IGZpZWxkcyBhIG1hcHBlciBnYXZlIGl0OyBhIHBvbGljeSB2ZXJkaWN0IHN1cnZpdmVzIGl0LiAqL1xuICB1bm1hcmsoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtlZC5kZWxldGUoa2V5KTtcbiAgICBpZiAodGhpcy5pbmhlcml0ZWQ/LmRlbGV0ZShrZXkpICYmIHRoaXMuaW5oZXJpdGVkLnNpemUgPT09IDApIHRoaXMuaW5oZXJpdGVkID0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEtleS1sZXZlbCB2ZXJkaWN0OiBtYXJrZWQsIGxpc3RlZCBpbiBgcG9saWN5LmtleXNgLCBvciBtYXRjaGluZyBhIHBhdHRlcm4uICovXG4gIGlzS2V5UmVkYWN0ZWQoa2V5OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5tYXJrZWQuaGFzKGtleSkpIHJldHVybiB0cnVlO1xuICAgIGlmICghdGhpcy5wb2xpY3kpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodGhpcy5wb2xpY3kua2V5cz8uaW5jbHVkZXMoa2V5KSkgcmV0dXJuIHRydWU7XG4gICAgY29uc3QgcGF0dGVybnMgPSB0aGlzLnBvbGljeS5wYXR0ZXJucztcbiAgICBpZiAoIXBhdHRlcm5zIHx8IHBhdHRlcm5zLmxlbmd0aCA9PT0gMCkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChrZXkubGVuZ3RoID4gTUFYX1BBVFRFUk5fS0VZX0xFTikge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgW2Zvb3RwcmludF0gUmVkYWN0aW9uUG9saWN5OiBrZXkgJyR7a2V5LnNsaWNlKDAsIDQwKX0uLi4nICgke2tleS5sZW5ndGh9IGNoYXJzKSBleGNlZWRzIGAgK1xuICAgICAgICAgICAgJ3RoZSBwYXR0ZXJuLW1hdGNoaW5nIGxlbmd0aCBjYXAgYW5kIHdhcyBza2lwcGVkLiAnICtcbiAgICAgICAgICAgICdVc2UgcG9saWN5LmtleXMgZm9yIGV4YWN0IG1hdGNoaW5nIG9mIGxvbmcga2V5IG5hbWVzLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVzUGF0dGVybihrZXksIHBhdHRlcm5zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRhaW4gYW4gZW1pdHRlZCBwYXlsb2FkIEJFRk9SRSBkaXNwYXRjaC9jYXB0dXJlLiBFbWl0IG5hbWVzIGFyZSBub3RcbiAgICogc3RhdGUgcGF0aHM6IG5vIGtleS1sZW5ndGggY2FwLCBtYXJrcyBvciBmaWVsZCBzY3J1YiBhcHBsaWVzIGhlcmUuXG4gICAqIEEgY2xlYXIgcGF5bG9hZCBrZWVwcyBpdHMgaWRlbnRpdHk7IGRpYWdub3N0aWMgYmFncyBhcmUgdW50b3VjaGVkLlxuICAgKi9cbiAgcmV0YWluRW1pdChuYW1lOiBzdHJpbmcsIHBheWxvYWQ6IHVua25vd24pOiB1bmtub3duIHtcbiAgICByZXR1cm4gbWF0Y2hlc1BhdHRlcm4obmFtZSwgdGhpcy5wb2xpY3k/LmVtaXRQYXR0ZXJucykgPyBTQ09QRV9QTEFDRUhPTERFUiA6IHBheWxvYWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0YWluIGEgTkFNRUQgZGlhZ25vc3RpYyBlbnRyeSDigJQgYGFkZHJlc3NgIGlzIGBbY2hhbm5lbCwgLi4ucGF0aCwgbmFtZV1gXG4gICAqIChgJGRlYnVnKCd0b2tlbicsIHYpYCDihpIgYFsnbG9ncycsICd0b2tlbiddYDsgYCRsb2codilgIOKGkiBgWydsb2dzJyxcbiAgICogJ21lc3NhZ2VzJ11gKS4gVEhFIE1BUFBJTkc6IHRoZSBlbnRyeSBpcyB0aGUgcmVjb3JkIGB7IFtuYW1lXTogdmFsdWUgfWBcbiAgICogaGFuZGVkIG91dCB3aG9sZSwgc28gaXQgaXMgcmV0YWluZWQgYXMgYSBib3VuZGFyeSByZWNvcmQgaG9sZGluZyB0aGVcbiAgICogc3RhdGUga2V5IGBuYW1lYCB3b3VsZCBiZSDigJQgdGhlIHN0YXRlIHZlcmRpY3QgYXQgYFsuLi5wYXRoLCBuYW1lXWAgKGtleXMsXG4gICAqIHBhdHRlcm5zIGFuZCBtYXJrcyBhdCBldmVyeSBkb3R0ZWQgcHJlZml4IGFuZCBhdCB0aGUgbmFtZSBpdHNlbGY7IHRoZSB0b3BcbiAgICoga2V5J3MgYGZpZWxkc2ApLCB0aGVuIGV2ZXJ5IG5lc3RlZCBvd24ga2V5IHdob3NlIG5hbWUgb3IgZG90dGVkIHBhdGggaXNcbiAgICogc2VsZWN0ZWQgKHtAbGluayByZXRhaW5Cb3VuZGFyeX0ncyB3YWxrKS4gVGhlIGNoYW5uZWwgdGFrZXMgbm8gcGFydDpcbiAgICogYGxvZ3MudG9rZW5gLCBgZXJyb3JzLnRva2VuYCBhbmQgYG1ldHJpY3MudG9rZW5gIGFyZSBhbGwgdGhlIHN0YXRlIGtleVxuICAgKiBgdG9rZW5gLiBgcG9saWN5LmRpYWdub3N0aWNzYCAoZGlhZ25vc3RpYy1vbmx5IHNlbGVjdG9ycywgcm9vdGVkIGF0IHRoZVxuICAgKiBjaGFubmVsKSBhcHBsaWVzIG9uIHRvcC4gQ2xlYXIgdmFsdWVzIGtlZXAgdGhlaXIgaWRlbnRpdHkuXG4gICAqL1xuICByZXRhaW5EaWFnbm9zdGljKGFkZHJlc3M6IHJlYWRvbmx5IHN0cmluZ1tdLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLmlzSW5lcnQoKSA/IHZhbHVlIDogdGhpcy5yZXRhaW5OYW1lZChhZGRyZXNzLnNsaWNlKDEpLCB2YWx1ZSk7XG4gICAgcmV0dXJuIHRoaXMuZGlhZ25vc3RpY1J1bGUgPyB0aGlzLmRpYWdub3N0aWNSdWxlLnJldGFpbihhZGRyZXNzLCBrZXB0KSA6IGtlcHQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0YWluIGZsb3ctbWVzc2FnZSB0ZXh0IChgZmxvd01lc3NhZ2VzLmRlc2NyaXB0aW9uYCAvIGAucmF0aW9uYWxlYCk6IHRleHRcbiAgICogdGhlIGVuZ2luZSBjb21wb3NlcyBoYXMgbm8gbmFtZSBvZiBpdHMgb3duLCBzbyBubyBzdGF0ZSBzZWxlY3RvciByZWFjaGVzXG4gICAqIGl0IOKAlCBvbmx5IGBwb2xpY3kuZGlhZ25vc3RpY3NgIHNlbGVjdHMgaXQuXG4gICAqL1xuICByZXRhaW5GbG93VGV4dChhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgdGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kaWFnbm9zdGljUnVsZSA/ICh0aGlzLmRpYWdub3N0aWNSdWxlLnJldGFpbihhZGRyZXNzLCB0ZXh0KSBhcyBzdHJpbmcpIDogdGV4dDtcbiAgfVxuXG4gIC8qKiB7QGxpbmsgcmV0YWluRGlhZ25vc3RpY30ncyBzdGF0ZSBoYWxmOiB0aGUgdmFsdWUgbmFtZWQgYnkgYHBhdGhgIChpdHMgbGFzdCBzZWdtZW50KSwgc2VydmVkIHdob2xlLiAqL1xuICBwcml2YXRlIHJldGFpbk5hbWVkKHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHZhbHVlO1xuICAgIGNvbnN0IG5hbWUgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCA9XG4gICAgICBwYXRoLmxlbmd0aCA+IDEgJiYgdGhpcy5pc0tleVJlZGFjdGVkKG5hbWUpID8geyBraW5kOiAnd2hvbGUnLCBrZXk6IG5hbWUgfSA6IHRoaXMudmVyZGljdChwYXRoKTtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSByZXR1cm4gU0NPUEVfUExBQ0VIT0xERVI7XG4gICAgY29uc3Qga2VwdCA9IFJlZGFjdGlvblJ1bGUuYXBwbHkodmVyZGljdCwgdmFsdWUpO1xuICAgIGlmIChrZXB0ID09PSBudWxsIHx8IHR5cGVvZiBrZXB0ICE9PSAnb2JqZWN0JykgcmV0dXJuIGtlcHQ7XG4gICAgY29uc3QgYmFzZSA9IHBhdGguam9pbignLicpO1xuICAgIHJldHVybiBzZXJ2ZWRCeVBhdGgoa2VwdCwgYmFzZSwgdGhpcy5kb3R0ZWRUYXJnZXRzKGJhc2UpLCB0aGlzLm5hbWVzV2FsayhmYWxzZSksIFNDT1BFX1BMQUNFSE9MREVSKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVkIGZvcm0gb2YgYSB0aHJvd24gdmFsdWUsIGRlY2lkZWQgT05DRSBhdCBpdHMgZXJyb3Igc2l0ZSBmcm9tIHRoZVxuICAgKiB0ZXh0IHRoZSBkaWFnbm9zdGljIGNvbGxlY3RvciByZXRhaW5lZCBmb3IgYGVycm9ycy5zdGFnZUV4ZWN1dGlvbkVycm9yYFxuICAgKiAoYGtlcHRgKSBhbmQgZnJvbSB0aGUgdmFsdWUgaXRzZWxmIOKAlCBhIHJlY29yZCBoYW5kZWQgb3V0IHdob2xlLCBtYXNrZWRcbiAgICogd2hlbiBvbmUgb2YgaXRzIG93biBrZXlzLCBhdCBhbnkgZGVwdGgsIGNhcnJpZXMgYSBzZWxlY3RlZCBuYW1lLlxuICAgKiBVbm1hc2tlZDogdG9kYXkncyBzdHJ1Y3R1cmVkIGluZm8uIE1hc2tlZDogdGhlIGVycm9yJ3MgYG5hbWVgL2Bjb2RlYCBrZXB0LFxuICAgKiBubyBgaXNzdWVzYCAodGhleSBxdW90ZSB0aGUgaW5wdXQpIGFuZCBubyBgcmF3YCBlcnJvciAoaXQgaG9sZHMgdGhlIHRleHRcbiAgICogYW5kIHRoZSBrZXlzKTsgdGhlIG1lc3NhZ2UgaXMgdGhlIHBsYWNlaG9sZGVyIHdoZW4gdGhlIHRleHQgd2FzIHNlbGVjdGVkLFxuICAgKiB0aGUgdGV4dCBpdHNlbGYgd2hlbiBvbmx5IGEga2V5IHdhcyDigJQgcmVtZW1iZXJlZCBzbyBgb25SdW5GYWlsZWRgLCB0aGVcbiAgICogbG9nZ2VyIGFuZCBhIGZvcmsgZW52ZWxvcGUgc2VydmUgdGhlIHNhbWUgZm9ybSAoe0BsaW5rIHNlcnZlZEVycm9yfSkuIFRoZVxuICAgKiB0aHJvd24gdmFsdWUgaXRzZWxmIHN0YXlzIHJlYWwuXG4gICAqL1xuICByZXRhaW5TdGFnZUVycm9yKFxuICAgIGVycm9yOiB1bmtub3duLFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBrZXB0OiB1bmtub3duLFxuICApOiB7IG1lc3NhZ2U6IHN0cmluZzsgc3RydWN0dXJlZEVycm9yOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIH0ge1xuICAgIGNvbnN0IGluZm8gPSBleHRyYWN0RXJyb3JJbmZvKGVycm9yKTtcbiAgICBjb25zdCB0ZXh0U2VsZWN0ZWQgPSBrZXB0ICE9PSB0ZXh0O1xuICAgIGlmICghdGV4dFNlbGVjdGVkICYmICF0aGlzLmNhcnJpZXNTZWxlY3RlZEtleShlcnJvcikpIHJldHVybiB7IG1lc3NhZ2U6IHRleHQsIHN0cnVjdHVyZWRFcnJvcjogaW5mbyB9O1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0ZXh0U2VsZWN0ZWQgPyBTdHJpbmcoa2VwdCkgOiB0ZXh0O1xuICAgIGNvbnN0IG1hc2tlZDogU3RydWN0dXJlZEVycm9ySW5mbyA9IHtcbiAgICAgIG1lc3NhZ2U6IHRleHRTZWxlY3RlZCA/IG1lc3NhZ2UgOiBpbmZvLm1lc3NhZ2UsXG4gICAgICAuLi4oaW5mby5uYW1lICE9PSB1bmRlZmluZWQgJiYgeyBuYW1lOiBpbmZvLm5hbWUgfSksXG4gICAgICAuLi4oaW5mby5jb2RlICE9PSB1bmRlZmluZWQgJiYgeyBjb2RlOiBpbmZvLmNvZGUgfSksXG4gICAgICByYXc6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgICh0aGlzLm1hc2tlZEVycm9ycyA/Pz0gbmV3IE1hcCgpKS5zZXQoZXJyb3IsIG1hc2tlZCk7XG4gICAgcmV0dXJuIHsgbWVzc2FnZSwgc3RydWN0dXJlZEVycm9yOiBtYXNrZWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEb2VzIGEgdGhyb3duIHZhbHVlIGNhcnJ5IGEgc2VsZWN0ZWQgbmFtZSDigJQgYW4gb3duIGtleSwgYXQgYW55IGRlcHRoLCB0aGF0XG4gICAqIHRoZSBwb2xpY3kgb3IgYSBtYXJrIHNlbGVjdHM/IFRvdGFsOiBhIHZhbHVlIHdob3NlIGtleXMgY2Fubm90IGJlIHJlYWQgaXNcbiAgICogc2VydmVkIG1hc2tlZCAodGhlIHNhZmUgc2lkZSksIG5ldmVyIGEgc2Vjb25kIHRocm93IGZyb20gYW4gZXJyb3IgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgY2Fycmllc1NlbGVjdGVkS2V5KHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuaXNJbmVydCgpIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBmYWxzZTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMudGhyb3duQ2Fycmllcyh2YWx1ZSwgbmV3IFNldCgpKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIEtleXMgdGhhdCBjYW5ub3QgYmUgcmVhZCAoYSB0aHJvd2luZyBnZXR0ZXIsIGEgcmV2b2tlZCBQcm94eSkgb3IgYSB3YWxrIHBhc3QgaXRzXG4gICAgICAvLyBsaW1pdDogc2VydmVkIGluIHRoZSBtYXNrZWQgZm9ybSDigJQgaXRzIHRleHQga2VwdCwgbm8gYHJhd2AuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogT25lIHRocm93biB2YWx1ZSBhbmQgd2hhdCBhIGxvZ2dlciBvciBhIHNlcmlhbGl6ZXIgcHJpbnRzIHdpdGggaXQ6IGl0cyBvd25cbiAgICoga2V5cyBhdCBldmVyeSBkZXB0aCwgYW5kIGl0cyBgY2F1c2VgIC8gYW4gYEFnZ3JlZ2F0ZUVycm9yYCdzIGBlcnJvcnNgIOKAlCBvd25cbiAgICogTk9OLWVudW1lcmFibGUga2V5cyBubyBrZXkgd2FsayBzZWVzIOKAlCBlYWNoIHdhbGtlZCB0aGUgc2FtZSB3YXkgKGEgY3ljbGVcbiAgICogYW1vbmcgdGhlbSBpcyBmb2xsb3dlZCBvbmNlKS5cbiAgICovXG4gIHByaXZhdGUgdGhyb3duQ2Fycmllcyh2YWx1ZTogb2JqZWN0LCBzZWVuOiBTZXQ8b2JqZWN0Pik6IGJvb2xlYW4ge1xuICAgIGlmIChzZWVuLmhhcyh2YWx1ZSkpIHJldHVybiBmYWxzZTtcbiAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgaWYgKHNlbGVjdHNCeVBhdGgodmFsdWUsIHVuZGVmaW5lZCwgdGhpcy5kb3R0ZWRUYXJnZXRzKHVuZGVmaW5lZCksIHRoaXMubmFtZXNXYWxrKGZhbHNlKSwgbmV3IE1hcCgpLCAwKS5zZWxlY3RlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IG93biA9IChrZXk6IHN0cmluZyk6IHVua25vd24gPT5cbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSA/ICh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBlcnJvcnMgPSBvd24oJ2Vycm9ycycpO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBbb3duKCdjYXVzZScpLCAuLi4oQXJyYXkuaXNBcnJheShlcnJvcnMpID8gZXJyb3JzIDogW10pXSkge1xuICAgICAgaWYgKHBhcnQgIT09IG51bGwgJiYgdHlwZW9mIHBhcnQgPT09ICdvYmplY3QnICYmIHRoaXMudGhyb3duQ2FycmllcyhwYXJ0LCBzZWVuKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUga2V5LWxldmVsIHJ1bGVzIGFzIHRoZSBwYXRoIHdhbGsgYXNrcyB0aGVtICh7QGxpbmsgc2VydmVkQnlQYXRofSk6IGFcbiAgICogbmVzdGVkIGtleSBpcyBzZWxlY3RlZCBieSBpdHMgb3duIE5BTUUgKG1hcmtzLCBrZXlzLCBwYXR0ZXJucyksIGFuZCDigJQgdW5kZXJcbiAgICogcGF0dGVybnMgb25seSDigJQgYnkgaXRzIGRvdHRlZCBwYXRoOyBhIGRlY2xhcmVkIChvciBpbmhlcml0ZWQpIGZpZWxkIGJlbG93IGFcbiAgICoga2V5IG9mIGl0cyBuYW1lIGlzIGEgdGFyZ2V0LiBEb3R0ZWQga2V5cyBhbmQgbWFya3MgYXJlIFRBUkdFVFMgZnJvbSB0aGVcbiAgICogd2FsaydzIHJvb3QgKHtAbGluayBkb3R0ZWRUYXJnZXRzfSksIHNvIHdpdGhvdXQgcGF0dGVybnMgbm8gZGVjaXNpb25cbiAgICogZGVwZW5kcyBvbiB0aGUgcGF0aCBhbmQgdGhlIHdhbGsgc2hhcmVzIHRoZW0gcGVyIG9iamVjdCAobGluZWFyIG9uIGEgREFHKS5cbiAgICogYHJvb3REZWNpZGVkYDogdGhlIHJvb3QncyBvd24ga2V5cyB3ZXJlIGFscmVhZHkgZGVjaWRlZCAoYHJldGFpblJlY29yZGApLlxuICAgKi9cbiAgcHJpdmF0ZSBuYW1lc1dhbGsocm9vdERlY2lkZWQ6IGJvb2xlYW4pOiBXYWxrIHtcbiAgICBjb25zdCBieVBhdGggPSB0aGlzLnBhdGhQYXR0ZXJucztcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXM6IHtcbiAgICAgICAgbWFza3M6IChuYW1lKSA9PiB0aGlzLmlzS2V5UmVkYWN0ZWQobmFtZSksXG4gICAgICAgIC4uLihieVBhdGgubGVuZ3RoID4gMCAmJiB7XG4gICAgICAgICAgcGF0aE1hc2tzOiAocGF0aDogc3RyaW5nKSA9PiBwYXRoLmxlbmd0aCA8PSBNQVhfUEFUVEVSTl9LRVlfTEVOICYmIG1hdGNoZXNQYXR0ZXJuKHBhdGgsIGJ5UGF0aCksXG4gICAgICAgIH0pLFxuICAgICAgICBmaWVsZHM6IChuYW1lKSA9PiB0aGlzLmZpZWxkc09mKG5hbWUpLFxuICAgICAgfSxcbiAgICAgIHJvb3REZWNpZGVkLFxuICAgICAgLi4uKGJ5UGF0aC5sZW5ndGggPT09IDAgJiYgeyBtZW1vOiBuZXcgV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIHVua25vd24+PigpIH0pLFxuICAgICAgYnVkZ2V0OiB3YWxrTGltaXQsXG4gICAgICBvbkxpbWl0OiAoKSA9PiB0aGlzLndhcm5XYWxrTGltaXQoYnlQYXRoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIE9uY2UgcGVyIHJ1bGUsIGluIGRldiBtb2RlOiBhIHBhdGggd2FsayBwYXNzZWQgaXRzIGxpbWl0IGFuZCBzZXJ2ZWQgaXRzIHJlbWFpbmRlciBhcyB0aGUgcGxhY2Vob2xkZXIuICovXG4gIHByaXZhdGUgd2FybldhbGtMaW1pdChwYXR0ZXJuczogcmVhZG9ubHkgUmVnRXhwW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy53YWxrTGltaXRXYXJuZWQgfHwgIWlzRGV2TW9kZSgpKSByZXR1cm47XG4gICAgdGhpcy53YWxrTGltaXRXYXJuZWQgPSB0cnVlO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFtmb290cHJpbnRdIFJlZGFjdGlvblBvbGljeTogYSB2YWx1ZSB3aXRoIG1vcmUgdGhhbiAke3dhbGtMaW1pdH0gcGF0aHMgdW5kZXIgdGhlIHBhdGggcGF0dGVybihzKSBgICtcbiAgICAgICAgYCR7cGF0dGVybnMubWFwKFN0cmluZykuam9pbignLCAnKX0g4oCUIHRoZSBwYXRocyBwYXN0IHRoYXQgd2VyZSBzZXJ2ZWQgYXMgdGhlIHBsYWNlaG9sZGVyLiBgICtcbiAgICAgICAgJ0EgcGF0dGVybiB0aGF0IG5hbWVzIGEgS0VZIChubyBkb3QsIG5vIGxvb2thcm91bmQpIGlzIGRlY2lkZWQgcGVyIG9iamVjdDsgcHJlZmVyIG9uZSwgb3Iga2V5cy9maWVsZHMuJyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkb3R0ZWQga2V5cyBhbmQgbWFya3MgdGhhdCBuYW1lIGEgcGF0aCB1bmRlciBgYmFzZWAgKHRoZSB3YWxrJ3Mgcm9vdDpcbiAgICogYHVuZGVmaW5lZGAgZm9yIGEgcmVjb3JkJ3Mgb3duIGtleXMsIGFuIGVudHJ5J3MgbmFtZSBmb3IgYSBkaWFnbm9zdGljKSxcbiAgICogYXMgdGFyZ2V0cyByZWxhdGl2ZSB0byBpdCDigJQgYSBkb3R0ZWQgcnVsZSBpcyBleGFjdCB0byBpdHMgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgZG90dGVkVGFyZ2V0cyhiYXNlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBUYXJnZXRbXSB7XG4gICAgY29uc3QgcHJlZml4ID0gYmFzZSA9PT0gdW5kZWZpbmVkID8gJycgOiBgJHtiYXNlfS5gO1xuICAgIGNvbnN0IG91dDogVGFyZ2V0W10gPSBbXTtcbiAgICBjb25zdCBhZGQgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJy4nKSB8fCAhbmFtZS5zdGFydHNXaXRoKHByZWZpeCkgfHwgbmFtZS5sZW5ndGggPT09IHByZWZpeC5sZW5ndGgpIHJldHVybjtcbiAgICAgIG91dC5wdXNoKG5hbWUuc2xpY2UocHJlZml4Lmxlbmd0aCkuc3BsaXQoJy4nKSk7XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdGhpcy5tYXJrZWQpIGFkZChuYW1lKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdGhpcy5wb2xpY3k/LmtleXMgPz8gW10pIGFkZChuYW1lKTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgYW55IG9ic2VydmVyIGlzIHNlcnZlZCBmb3IgYSB0aHJvd24gdmFsdWUg4oCUIHJldHJ5LCB0aHJvdHRsZSwgcnVuXG4gICAqIGZhaWx1cmUsIGEgZm9yayBlbnZlbG9wZSwgdGhlIGxvZ2dlcjogaXRzIHJlbWVtYmVyZWQgc3RhZ2UgZm9ybSwgZWxzZSB0aGVcbiAgICogc2FtZSBkZWNpc2lvbiBtYWRlIG5vdyAoYW5kIHJlbWVtYmVyZWQpLCBlbHNlIGl0cyBzdHJ1Y3R1cmVkIGluZm8uXG4gICAqL1xuICBzZXJ2ZWRFcnJvcihlcnJvcjogdW5rbm93bik6IFN0cnVjdHVyZWRFcnJvckluZm8ge1xuICAgIGNvbnN0IG1hc2tlZCA9IHRoaXMubWFza2VkRXJyb3IoZXJyb3IpO1xuICAgIC8vIEVhY2ggZXZlbnQgZ2V0cyBpdHMgb3duIG9iamVjdCwgYXMgZXh0cmFjdEVycm9ySW5mbyBnaXZlcyBpdCBvbmUuXG4gICAgcmV0dXJuIG1hc2tlZCA/IHsgLi4ubWFza2VkIH0gOiBleHRyYWN0RXJyb3JJbmZvKGVycm9yKTtcbiAgfVxuXG4gIC8qKiBXaGF0IHRoZSBsb2dnZXIgaXMgaGFuZGVkOiB0aGUgdGhyb3duIHZhbHVlIGl0c2VsZiB1bmxlc3MgdGhlIHBvbGljeSBtYXNrZWQgaXRzIHRleHQuICovXG4gIGxvZ2dhYmxlRXJyb3IoZXJyb3I6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBjb25zdCBtYXNrZWQgPSB0aGlzLm1hc2tlZEVycm9yKGVycm9yKTtcbiAgICByZXR1cm4gbWFza2VkID8geyAuLi5tYXNrZWQgfSA6IGVycm9yO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXNrZWRFcnJvcihlcnJvcjogdW5rbm93bik6IFN0cnVjdHVyZWRFcnJvckluZm8gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtub3duID0gdGhpcy5tYXNrZWRFcnJvcnM/LmdldChlcnJvcik7XG4gICAgaWYgKGtub3duIHx8IHRoaXMuaXNEaWFnbm9zdGljSW5lcnQoKSkgcmV0dXJuIGtub3duO1xuICAgIGNvbnN0IHRleHQgPSB0aHJvd25UZXh0KGVycm9yKTtcbiAgICB0aGlzLnJldGFpblN0YWdlRXJyb3IoZXJyb3IsIHRleHQsIHRoaXMucmV0YWluRGlhZ25vc3RpYyhbJ2Vycm9ycycsICdzdGFnZUV4ZWN1dGlvbkVycm9yJ10sIHRleHQpKTtcbiAgICByZXR1cm4gdGhpcy5tYXNrZWRFcnJvcnM/LmdldChlcnJvcik7XG4gIH1cblxuICAvKipcbiAgICogTm90aGluZyBjYW4gbWFzayBhIGRpYWdub3N0aWMgZW50cnkgb3IgYSB0aHJvd24gdmFsdWUg4oCUIG5vIHN0YXRlIHNlbGVjdG9yLFxuICAgKiBubyBtYXJrLCBubyBkaWFnbm9zdGljIHNlbGVjdG9yOiB0aGUgY29sbGVjdG9ycycgYW5kIHRoZSBlcnJvciBwYXRocycgZmFzdFxuICAgKiBwYXRoIChhIG5vLXBvbGljeSBydW4gbmV2ZXIgcmVhZHMgYSBwYXlsb2FkLCBpbmNsdWRpbmcgYm9ycm93ZWQgZ2V0dGVycykuXG4gICAqL1xuICBpc0RpYWdub3N0aWNJbmVydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pc0luZXJ0KCkgJiYgdGhpcy5pc0Zsb3dUZXh0SW5lcnQoKTtcbiAgfVxuXG4gIC8qKiBOb3RoaW5nIGNhbiBtYXNrIGZsb3ctbWVzc2FnZSB0ZXh0IOKAlCBvbmx5IGBwb2xpY3kuZGlhZ25vc3RpY3NgIHNlbGVjdHMgaXQgKHtAbGluayByZXRhaW5GbG93VGV4dH0pLiAqL1xuICBpc0Zsb3dUZXh0SW5lcnQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICF0aGlzLmRpYWdub3N0aWNSdWxlIHx8IHRoaXMuZGlhZ25vc3RpY1J1bGUuaXNJbmVydCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJkaWN0IGZvciBhIHVzZXItbGV2ZWwgcGF0aCDigJQgYFsncHJvZmlsZSddYCBmb3IgYSBzY29wZSBrZXksXG4gICAqIGBbJ3Byb2ZpbGUnLCAnYXV0aCddYCBmb3IgYSBuZXN0ZWQgd3JpdGUgc3VjaCBhcyBhIHN1YmZsb3cgc2VlZC5cbiAgICpcbiAgICogRXZlcnkgZG90dGVkIHByZWZpeCBpcyB0ZXN0ZWQgYXQga2V5IGxldmVsIChgcHJvZmlsZWAsIHRoZW5cbiAgICogYHByb2ZpbGUuYXV0aGApLCBzbyBhIHBvbGljeSB0aGF0IG5hbWVzIGEga2V5IGNvdmVycyBldmVyeXRoaW5nIHdyaXR0ZW5cbiAgICogYmVuZWF0aCBpdC4gYGZpZWxkc2AgYXJlIGRlY2xhcmVkIHJlbGF0aXZlIHRvIHRoZSBUT1Aga2V5OyBmb3IgYSBuZXN0ZWRcbiAgICogcGF0aCB0aGV5IGFyZSByZS1iYXNlZCBvbnRvIHRoZSB2YWx1ZSBiZWluZyB3cml0dGVuLCBhbmQgYSBmaWVsZCB0aGF0XG4gICAqIG5hbWVzIHRoZSB3cml0dGVuIHBhdGggZXhhY3RseSBtYWtlcyB0aGUgd2hvbGUgdmFsdWUgc2VjcmV0LlxuICAgKi9cbiAgdmVyZGljdChwYXRoOiByZWFkb25seSBzdHJpbmdbXSk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkgcmV0dXJuIENMRUFSO1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMSkgcmV0dXJuIHRoaXMudmVyZGljdE9mS2V5KHBhdGhbMF0pO1xuICAgIGxldCBkb3R0ZWQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRvdHRlZCA9IGkgPT09IDAgPyBwYXRoWzBdIDogYCR7ZG90dGVkfS4ke3BhdGhbaV19YDtcbiAgICAgIGlmICh0aGlzLmlzS2V5UmVkYWN0ZWQoZG90dGVkKSkgcmV0dXJuIHsga2luZDogJ3dob2xlJywga2V5OiBkb3R0ZWQgfTtcbiAgICB9XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5maWVsZHNPZihwYXRoWzBdKTtcbiAgICBpZiAoIWZpZWxkcyB8fCBmaWVsZHMubGVuZ3RoID09PSAwKSByZXR1cm4gQ0xFQVI7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAxKSByZXR1cm4geyBraW5kOiAnZmllbGRzJywga2V5OiBwYXRoWzBdLCBwYXRoczogZmllbGRzIH07XG4gICAgY29uc3QgcmVsID0gcGF0aC5zbGljZSgxKS5qb2luKCcuJyk7XG4gICAgY29uc3QgaW5zaWRlOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICAvLyBUaGUgd3JpdHRlbiBwYXRoIElTIGEgc2VjcmV0IGZpZWxkOiB0aGUgd2hvbGUgdmFsdWUgaXMgc2VjcmV0LCBhbmRcbiAgICAgIC8vIHRoZSBrZXkgdGhhdCBkZWNpZGVkIGl0IGlzIHRoYXQgZG90dGVkIHBhdGgg4oCUIG5ldmVyIHRoZSB0b3Aga2V5LFxuICAgICAgLy8gd2hvc2Ugc2libGluZ3Mgc3RheSBjbGVhci5cbiAgICAgIGlmIChmaWVsZCA9PT0gcmVsKSByZXR1cm4geyBraW5kOiAnd2hvbGUnLCBrZXk6IGRvdHRlZCB9O1xuICAgICAgaWYgKGZpZWxkLnN0YXJ0c1dpdGgoYCR7cmVsfS5gKSkgaW5zaWRlLnB1c2goZmllbGQuc2xpY2UocmVsLmxlbmd0aCArIDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIGluc2lkZS5sZW5ndGggPiAwID8geyBraW5kOiAnZmllbGRzJywga2V5OiBwYXRoWzBdLCBwYXRoczogaW5zaWRlIH0gOiBDTEVBUjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmVyZGljdCBmb3IgYGtleWAgd3JpdHRlbiBvciByZWFkIHVuZGVyIGBwYXRoYCDigJQgdGhlIGNvbW1vblxuICAgKiBzaW5nbGUtc2VnbWVudCBjYXNlIChgcGF0aGAgZW1wdHk6IGV2ZXJ5IGZhY2FkZSB3cml0ZSBhbmQgcmVhZCkgZGVjaWRlc1xuICAgKiBvbiB0aGUga2V5IHN0cmluZyBhbG9uZSwgbm8gYXJyYXkgYWxsb2NhdGVkLlxuICAgKi9cbiAgdmVyZGljdEF0KHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIHJldHVybiBwYXRoLmxlbmd0aCA9PT0gMCA/IHRoaXMudmVyZGljdE9mS2V5KGtleSkgOiB0aGlzLnZlcmRpY3QoWy4uLnBhdGgsIGtleV0pO1xuICB9XG5cbiAgLyoqIFRoZSBzaW5nbGUtc2VnbWVudCB2ZXJkaWN0OiBrZXktbGV2ZWwgaGl0IOKGkiB3aG9sZTsgZGVjbGFyZWQgb3IgaW5oZXJpdGVkIGZpZWxkcyDihpIgZmllbGRzLiAqL1xuICBwcml2YXRlIHZlcmRpY3RPZktleShrZXk6IHN0cmluZyk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGlmICh0aGlzLmlzS2V5UmVkYWN0ZWQoa2V5KSkgcmV0dXJuIHsga2luZDogJ3dob2xlJywga2V5IH07XG4gICAgY29uc3QgZmllbGRzID0gdGhpcy5maWVsZHNPZihrZXkpO1xuICAgIHJldHVybiBmaWVsZHMgIT09IHVuZGVmaW5lZCAmJiBmaWVsZHMubGVuZ3RoID4gMCA/IHsga2luZDogJ2ZpZWxkcycsIGtleSwgcGF0aHM6IGZpZWxkcyB9IDogQ0xFQVI7XG4gIH1cblxuICAvKiogVGhlIHNlY3JldCBmaWVsZHMgb2YgYSB0b3Aga2V5OiB0aGUgcG9saWN5J3MsIHBsdXMgYW55IGEgbWFwcGVyIGhhbmRlZCBpdCAoe0BsaW5rIE1hcHBlclRhaW50fSkuICovXG4gIHByaXZhdGUgZmllbGRzT2Yoa2V5OiBzdHJpbmcpOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZGVjbGFyZWQgPSBkZWNsYXJlZEZpZWxkcyh0aGlzLnBvbGljeT8uZmllbGRzLCBrZXkpO1xuICAgIGNvbnN0IGluaGVyaXRlZCA9IHRoaXMuaW5oZXJpdGVkPy5nZXQoa2V5KTtcbiAgICBpZiAoaW5oZXJpdGVkID09PSB1bmRlZmluZWQpIHJldHVybiBkZWNsYXJlZDtcbiAgICByZXR1cm4gZGVjbGFyZWQgPT09IHVuZGVmaW5lZCA/IGluaGVyaXRlZCA6IFsuLi5uZXcgU2V0KFsuLi5kZWNsYXJlZCwgLi4uaW5oZXJpdGVkXSldO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBydW4ncyBtYXJrcyBhbmQgdGhlIGZpZWxkcyBtYXBwZXJzIGhhbmRlZCB0byBuZXcga2V5cywgYXMgTkFNRVMg4oCUIHdoYXRcbiAgICogYSBwYXVzZSBjYXJyaWVzIHRvIHRoZSByZXN1bWVkIHJ1biAoYEZsb3djaGFydENoZWNrcG9pbnQucmVkYWN0aW9uTWFya3NgKS5cbiAgICogYHVuZGVmaW5lZGAgd2hlbiB0aGVyZSBhcmUgbm9uZSAobm8gcG9saWN5LCBubyBwZXItY2FsbCBtYXJrKS5cbiAgICovXG4gIG1hcmtzRm9yQ2hlY2twb2ludCgpOiBSZWRhY3Rpb25NYXJrcyB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMubWFya2VkLnNpemUgPT09IDAgJiYgdGhpcy5pbmhlcml0ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4ge1xuICAgICAga2V5czogWy4uLnRoaXMubWFya2VkXSxcbiAgICAgIC4uLih0aGlzLmluaGVyaXRlZCAhPT0gdW5kZWZpbmVkICYmIHtcbiAgICAgICAgZmllbGRzOiBPYmplY3QuZnJvbUVudHJpZXMoWy4uLnRoaXMuaW5oZXJpdGVkXS5tYXAoKFtrZXksIHBhdGhzXSkgPT4gW2tleSwgWy4uLnBhdGhzXV0pKSxcbiAgICAgIH0pLFxuICAgIH07XG4gIH1cblxuICAvKiogU2VlZCBhIHJlc3VtZWQgcnVuJ3MgcnVsZSB3aXRoIHRoZSBtYXJrcyBpdHMgcGF1c2UgY2FycmllZCAoe0BsaW5rIG1hcmtzRm9yQ2hlY2twb2ludH0pLiAqL1xuICByZXN0b3JlTWFya3MobWFya3M6IFJlZGFjdGlvbk1hcmtzKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgbWFya3Mua2V5cykgdGhpcy5tYXJrZWQuYWRkKGtleSk7XG4gICAgZm9yIChjb25zdCBba2V5LCBwYXRoc10gb2YgT2JqZWN0LmVudHJpZXMobWFya3MuZmllbGRzID8/IHt9KSkgdGhpcy5pbmhlcml0RmllbGRzKGtleSwgcGF0aHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEEgc3ViZmxvdyBtYXBwZXIncyBjb3B5IGluaGVyaXRzIHRoZSBmaWVsZHMgb2YgdGhlIHZhbHVlIGl0IGNvcGllZDpcbiAgICogYHRhcmdldGAgaXMgYSBrZXkgdGhlIG1hcHBlciB3cm90ZTsgYHBhdGhzYCB0aGUgc291cmNlIGtleSdzIGZpZWxkIHBhdGhzXG4gICAqIChkZWNsYXJlZCBvciB0aGVtc2VsdmVzIGluaGVyaXRlZCkuIFJ1bi13aWRlLCBieSBuYW1lLCBsaWtlIGEgbWFyay5cbiAgICovXG4gIGluaGVyaXRGaWVsZHModGFyZ2V0OiBzdHJpbmcsIHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGNvbnN0IHByaW9yID0gdGhpcy5pbmhlcml0ZWQ/LmdldCh0YXJnZXQpID8/IFtdO1xuICAgICh0aGlzLmluaGVyaXRlZCA/Pz0gbmV3IE1hcCgpKS5zZXQodGFyZ2V0LCBbLi4ubmV3IFNldChbLi4ucHJpb3IsIC4uLnBhdGhzXSldKTtcbiAgfVxuXG4gIC8qKiBUaGUgdmVyZGljdCBvZiBhIGtleSBhIG1hcHBlciByZWFkIOKAlCBgcnVuc2AgKHRoZSBydW4gbmFtZXNwYWNlcywgYFJVTl9OQU1FU1BBQ0VgKSBpcyBzZWxlY3RlZCB3aGVuIGFueSBuYW1lc3BhY2VkIGtleSBpcy4gKi9cbiAgdmVyZGljdE9mUmVhZChrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy52ZXJkaWN0T2ZLZXkoa2V5KTtcbiAgICBpZiAodmVyZGljdC5raW5kICE9PSAnY2xlYXInIHx8IGtleSAhPT0gUlVOX05BTUVTUEFDRSB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7XG4gICAgICByZXR1cm4gdmVyZGljdDtcbiAgICB9XG4gICAgZm9yIChjb25zdCBzcGFjZSBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkge1xuICAgICAgaWYgKHNwYWNlID09PSBudWxsIHx8IHR5cGVvZiBzcGFjZSAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgICAgZm9yIChjb25zdCBpbm5lciBvZiBPYmplY3Qua2V5cyhzcGFjZSkpIHtcbiAgICAgICAgaWYgKHRoaXMudmVyZGljdE9mS2V5KGlubmVyKS5raW5kICE9PSAnY2xlYXInKSByZXR1cm4geyBraW5kOiAnd2hvbGUnLCBrZXkgfTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZlcmRpY3Q7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJldGFpbmVkIC8gc2VydmVkIGZvcm0gb2YgYSB2YWx1ZSBhdCBhIHBhdGg6IHRoZSBwbGFjZWhvbGRlciwgYVxuICAgKiBzY3J1YmJlZCBDTE9ORSwgb3IgdGhlIHZhbHVlIGl0c2VsZiAoc2FtZSByZWZlcmVuY2Ug4oCUIHJlY29yZGVycyByZWNlaXZlXG4gICAqIGJvcnJvd2VkIGxpdmUgcmVmZXJlbmNlcyBmb3IgY2xlYXIgdmFsdWVzLCBhcyB0aGV5IGFsd2F5cyBoYXZlKS5cbiAgICogYHBsYWNlaG9sZGVyYCBkZWZhdWx0cyB0byB0aGUgc2NvcGUtdGllciBgJ1tSRURBQ1RFRF0nYDsgdGhlIG1pcnJvciBzZWVkXG4gICAqIHBhc3NlcyB0aGUgbG9nJ3MgYCdSRURBQ1RFRCdgLlxuICAgKi9cbiAgcmV0YWluKHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCB2YWx1ZTogdW5rbm93biwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogdW5rbm93biB7XG4gICAgcmV0dXJuIFJlZGFjdGlvblJ1bGUuYXBwbHkodGhpcy52ZXJkaWN0KHBhdGgpLCB2YWx1ZSwgcGxhY2Vob2xkZXIpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZXRhaW5lZCBmb3JtIG9mIGEgU1RBVEUgcmVjb3JkIChzdGF0ZSByZWFkLCBtaXJyb3Igc2VlZCk6IGVhY2ggb3duXG4gICAqIGVudW1lcmFibGUgc3RyaW5nIGtleSB0aHJvdWdoIHtAbGluayByZXRhaW59LiBGaWVsZHMgYXJlIHBhdGhzIGluc2lkZSB0aGF0XG4gICAqIGtleWVkIHZhbHVlLiBTY2FsYXJzIGFuZCByb290IGFycmF5cyBwYXNzIHRocm91Z2guIEJvdW5kYXJ5IHJlY29yZHMgYWRkXG4gICAqIHRoZSBuZXN0ZWQta2V5IHdhbGs6IHtAbGluayByZXRhaW5Cb3VuZGFyeX0uXG4gICAqIFJldHVybnMgdGhlIFNBTUUgb2JqZWN0IHdoZW4gdW5jaGFuZ2VkLiBBbiBpbmVydCBydWxlIGRvZXMgbm90IGVudW1lcmF0ZVxuICAgKiB0aGUgdmFsdWUsIHNvIGV2ZW4gYW4gYWNjZXNzb3IgaXMgdW50b3VjaGVkIG9uIHRoZSBuby1wb2xpY3kgZmFzdCBwYXRoLlxuICAgKi9cbiAgcmV0YWluUmVjb3JkPFQ+KHJlY29yZDogVCwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogVCB7XG4gICAgaWYgKHRoaXMuaXNJbmVydCgpIHx8IHJlY29yZCA9PT0gbnVsbCB8fCB0eXBlb2YgcmVjb3JkICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHJlY29yZCkpIHJldHVybiByZWNvcmQ7XG4gICAgbGV0IG91dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocmVjb3JkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSkge1xuICAgICAgY29uc3Qga2VwdCA9IHRoaXMucmV0YWluKFtrZXldLCB2YWx1ZSwgcGxhY2Vob2xkZXIpO1xuICAgICAgaWYgKGtlcHQgPT09IHZhbHVlKSBjb250aW51ZTtcbiAgICAgIG91dCA/Pz0geyAuLi4ocmVjb3JkIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgICAgb3V0W2tleV0gPSBrZXB0O1xuICAgIH1cbiAgICByZXR1cm4gKG91dCA/PyByZWNvcmQpIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJldGFpbmVkIGZvcm0gb2YgYSBCT1VOREFSWSByZWNvcmQg4oCUIHJvb3QgaW5wdXQvb3V0cHV0IGFuZCBhIHN1YmZsb3cnc1xuICAgKiBtYXBwZWQgc2VlZCwgYmVmb3JlIGFueSBvYnNlcnZlciBzZWVzIGl0LiB7QGxpbmsgcmV0YWluUmVjb3JkfSBkZWNpZGVzIGVhY2hcbiAgICogdG9wIGtleTsgdGhlbiBldmVyeSBORVNURUQgb3duIGtleSBpcyBhIGtleSB0b286IHNlY3JldCB3aGVuIGl0cyBvd24gbmFtZVxuICAgKiBvciBpdHMgZG90dGVkIHBhdGggaXMgcmVkYWN0ZWQgYXQga2V5IGxldmVsIChga2V5czogWydzZWNyZXQnXWAgY292ZXJzXG4gICAqIGB7IHdyYXBwZXI6IHsgc2VjcmV0IH0gfWA7IGEgcm9vdCBhcnJheSdzIGVsZW1lbnRzIGFyZSB3YWxrZWQgdGhlIHNhbWVcbiAgICogd2F5KSwgYW5kIGl0cyBkZWNsYXJlZCBgZmllbGRzYCBzY3J1YmJlZCBpbnNpZGUgaXQgKGBmaWVsZHM6IHsgcHJvZmlsZTpcbiAgICogWyd0b2tlbiddIH1gIGNvdmVycyBgeyB3cmFwcGVyOiB7IHByb2ZpbGU6IHsgdG9rZW4gfSB9IH1gKS4gRGVjaWRlZCBwZXJcbiAgICogUEFUSCwgY29weS1vbi13cml0ZSBwZXIgcGF0aCAoe0BsaW5rIHNlcnZlZEJ5UGF0aH0pOiBhbiBvYmplY3Qgc2hhcmVkIGJ5XG4gICAqIHR3byBwYXRocyBpcyBtYXNrZWQgYXQgdGhlIG9uZSBhIHBhdGggcnVsZSBuYW1lcyBhbmQgc2VydmVkIGFzIGl0IGlzIGF0XG4gICAqIHRoZSBvdGhlcjsgYSBjeWNsZSBlZGdlIGxhbmRzIG9uIHRoZSBzZXJ2ZWQgY29weSwgbmV2ZXIgb24gYW4gdW5zY3J1YmJlZFxuICAgKiBvcmlnaW5hbDsgdGhlIGxpdmUgdmFsdWUgaXMgbmV2ZXIgdG91Y2hlZC4gUmV0dXJucyB0aGUgU0FNRSBvYmplY3Qgd2hlblxuICAgKiBub3RoaW5nIG5lc3RlZCBpcyBzZWNyZXQsIGFuZCBhbiBpbmVydCBydWxlIGVudW1lcmF0ZXMgbm90aGluZy4gU3RhdGVcbiAgICoga2VlcHMgaXRzIG93biBwYXRoIHZlcmRpY3RzICh7QGxpbmsgdmVyZGljdH0pOyB0aGlzIHdhbGsgaXMgZm9yIHJlY29yZHNcbiAgICogaGFuZGVkIG91dCB3aG9sZS5cbiAgICovXG4gIHJldGFpbkJvdW5kYXJ5PFQ+KHJlY29yZDogVCwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogVCB7XG4gICAgLy8gQSBtYXNrZWQgc3RhZ2UgZXJyb3IgaW5zaWRlIHRoZSByZWNvcmQgKGEgZm9yayBlbnZlbG9wZSdzIGByZXN1bHRgKSBpc1xuICAgIC8vIHNlcnZlZCBpbiBpdHMgbWFza2VkIGZvcm06IGFuIEVycm9yJ3MgbWVzc2FnZSBpcyBub24tZW51bWVyYWJsZSBhbmQgYVxuICAgIC8vIHRocm93biBzdHJpbmcgaXMgYSBwbGFpbiB2YWx1ZSwgc28gbm8ga2V5IHdhbGsgc2VlcyBlaXRoZXIuXG4gICAgY29uc3Qgc2VydmVkID0gdGhpcy5tYXNrZWRFcnJvcnM/LnNpemUgPyAodGhpcy53aXRoU2VydmVkRXJyb3JzKHJlY29yZCkgYXMgVCkgOiByZWNvcmQ7XG4gICAgaWYgKHRoaXMuaXNJbmVydCgpIHx8IHNlcnZlZCA9PT0gbnVsbCB8fCB0eXBlb2Ygc2VydmVkICE9PSAnb2JqZWN0JykgcmV0dXJuIHNlcnZlZDtcbiAgICBjb25zdCB0b3AgPSB0aGlzLnJldGFpblJlY29yZChzZXJ2ZWQsIHBsYWNlaG9sZGVyKSBhcyB1bmtub3duIGFzIG9iamVjdDtcbiAgICAvLyBCZWxvdyB0aGUgdG9wIGtleXMsIG9uZSBkZWNpc2lvbiBwZXIgUEFUSCAodGhlIHdob2xlIHJlY29yZCBpcyB0aGUgd2FsaydzIHJvb3QsIHNvIGEgY3ljbGVcbiAgICAvLyBiYWNrIHRvIGl0IGxhbmRzIG9uIHRoZSBzZXJ2ZWQgY29weSkuXG4gICAgcmV0dXJuIHNlcnZlZEJ5UGF0aCh0b3AsIHVuZGVmaW5lZCwgdGhpcy5kb3R0ZWRUYXJnZXRzKHVuZGVmaW5lZCksIHRoaXMubmFtZXNXYWxrKHRydWUpLCBwbGFjZWhvbGRlcikgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3B5LW9uLXdyaXRlIG92ZXIgY29udGFpbmVyczogZXZlcnkgcmVtZW1iZXJlZCBtYXNrZWQgZXJyb3IgYmVjb21lcyBpdHNcbiAgICogc2VydmVkIGZvcm0g4oCUIGFuIG9iamVjdCBlcnJvciBpdHMgbWFza2VkIHN0cnVjdHVyZWQgaW5mbywgYSB0aHJvd25cbiAgICogc3RyaW5nL251bWJlciBpdHMgbWFza2VkIHRleHQgKHRoZSB2YWx1ZSBrZWVwcyBiZWluZyBhIHNjYWxhcikuIEEgc2NhbGFyIGlzXG4gICAqIG1hdGNoZWQgYnkgVkFMVUUsIHNvIGFuIHVucmVsYXRlZCBmaWVsZCB0aGF0IGhhcHBlbnMgdG8gZXF1YWwgYSBtYXNrZWRcbiAgICogdGhyb3duIHN0cmluZyBpcyBtYXNrZWQgdG9vOiBvdmVyLW1hc2tpbmcgaXMgdGhlIHNhZmUgZGlyZWN0aW9uLlxuICAgKiBgdW5kZWZpbmVkYC9gbnVsbGAvYm9vbGVhbnMgYXJlIG5ldmVyIHN3YXBwZWQg4oCUIHRoZXkgY2Fycnkgbm8gdGV4dCwgYW5kXG4gICAqIHN3YXBwaW5nIHRoZW0gd291bGQgcmV3cml0ZSBvcmRpbmFyeSBkYXRhIHNoYXBlcy5cbiAgICpcbiAgICogQ1lDTEUtU0FGRSAocmV2aWV3IGZpbmRpbmcgMikuIFRoZSBjb250YWluZXJzIHRoYXQgY2FuIFJFQUNIIGEgbWFza2VkXG4gICAqIGVycm9yIGFyZSBmb3VuZCBmaXJzdCAoe0BsaW5rIHJlYWNoaW5nTWFza2VkRXJyb3JzfSDigJQgdGhlIHdob2xlIHJlYWNoYWJsZVxuICAgKiBncmFwaCwgY3ljbGVzIGluY2x1ZGVkKTsgZWFjaCBvZiB0aGVtIGlzIGNvcGllZCwgaXRzIGNvcHkgYWxsb2NhdGVkIGFuZFxuICAgKiByZW1lbWJlcmVkIEJFRk9SRSBpdHMgY2hpbGRyZW4gYXJlIGZpbGxlZCwgc28gYW4gZWRnZSBiYWNrIHRvIGl0IOKAlCBhIGN5Y2xlXG4gICAqIOKAlCBsYW5kcyBvbiB0aGUgY29weSwgbmV2ZXIgb24gdGhlIG9yaWdpbmFsIHRoYXQgc3RpbGwgaG9sZHMgdGhlIHJhdyBlcnJvci5cbiAgICogRXZlcnkgb3RoZXIgY29udGFpbmVyIGtlZXBzIGl0cyBpZGVudGl0eS5cbiAgICovXG4gIHByaXZhdGUgd2l0aFNlcnZlZEVycm9ycyh2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGNvbnN0IGxlYWYgPSB0aGlzLnNlcnZlZExlYWYodmFsdWUpO1xuICAgIGlmIChsZWFmICE9PSBLRUVQIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiBsZWFmID09PSBLRUVQID8gdmFsdWUgOiBsZWFmO1xuICAgIGNvbnN0IHJlYWNoaW5nID0gdGhpcy5yZWFjaGluZ01hc2tlZEVycm9ycyh2YWx1ZSk7XG4gICAgaWYgKCFyZWFjaGluZy5oYXModmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgY29uc3QgY29waWVzID0gbmV3IE1hcDxvYmplY3QsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PigpO1xuICAgIGNvbnN0IGNvcHlPZiA9IChub2RlOiBvYmplY3QpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgICBjb25zdCBrbm93biA9IGNvcGllcy5nZXQobm9kZSk7XG4gICAgICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGtub3duO1xuICAgICAgY29uc3QgY29weSA9IChBcnJheS5pc0FycmF5KG5vZGUpID8gbm9kZS5zbGljZSgpIDogeyAuLi5ub2RlIH0pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgY29waWVzLnNldChub2RlLCBjb3B5KTtcbiAgICAgIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUpKSB7XG4gICAgICAgIGNvbnN0IHNlcnZlZCA9IHRoaXMuc2VydmVkTGVhZihjaGlsZCk7XG4gICAgICAgIGlmIChzZXJ2ZWQgIT09IEtFRVApIGNvcHlba2V5XSA9IHNlcnZlZDtcbiAgICAgICAgZWxzZSBpZiAoY2hpbGQgIT09IG51bGwgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JyAmJiByZWFjaGluZy5oYXMoY2hpbGQpKSBjb3B5W2tleV0gPSBjb3B5T2YoY2hpbGQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvcHk7XG4gICAgfTtcbiAgICByZXR1cm4gY29weU9mKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBBIG1hc2tlZCBlcnJvcidzIHNlcnZlZCBmb3JtIOKAlCBgS0VFUGAgZm9yIGFueXRoaW5nIGVsc2UgKGEgc2NhbGFyIG5ldmVyIHN3YXBwZWQsIGEgY29udGFpbmVyKS4gKi9cbiAgcHJpdmF0ZSBzZXJ2ZWRMZWFmKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHJldHVybiBLRUVQO1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCBtYXNrZWQgPSB0aGlzLm1hc2tlZEVycm9ycz8uZ2V0KHZhbHVlKTtcbiAgICAgIHJldHVybiBtYXNrZWQgPyB7IC4uLm1hc2tlZCB9IDogS0VFUDtcbiAgICB9XG4gICAgY29uc3Qgc3dhcHBhYmxlID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCc7XG4gICAgY29uc3QgbWFza2VkID0gc3dhcHBhYmxlID8gdGhpcy5tYXNrZWRFcnJvcnM/LmdldCh2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG1hc2tlZCA/IG1hc2tlZC5tZXNzYWdlIDogS0VFUDtcbiAgfVxuXG4gIC8qKiBFdmVyeSBjb250YWluZXIgdW5kZXIgYHJvb3RgIChpdHNlbGYgaW5jbHVkZWQpIGZyb20gd2hpY2ggc29tZSBwYXRoIHJlYWNoZXMgYSBtYXNrZWQgZXJyb3IuICovXG4gIHByaXZhdGUgcmVhY2hpbmdNYXNrZWRFcnJvcnMocm9vdDogb2JqZWN0KTogU2V0PG9iamVjdD4ge1xuICAgIGNvbnN0IHBhcmVudHMgPSBuZXcgTWFwPG9iamVjdCwgb2JqZWN0W10+KCk7XG4gICAgY29uc3QgaG9sZGVyczogb2JqZWN0W10gPSBbXTtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxvYmplY3Q+KFtyb290XSk7XG4gICAgY29uc3Qgc3RhY2s6IG9iamVjdFtdID0gW3Jvb3RdO1xuICAgIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub2RlID0gc3RhY2sucG9wKCkhO1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKG5vZGUpKSB7XG4gICAgICAgIGlmICh0aGlzLnNlcnZlZExlYWYoY2hpbGQpICE9PSBLRUVQKSB7XG4gICAgICAgICAgaG9sZGVycy5wdXNoKG5vZGUpO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgb2YgPSBwYXJlbnRzLmdldChjaGlsZCk7XG4gICAgICAgIGlmIChvZiA9PT0gdW5kZWZpbmVkKSBwYXJlbnRzLnNldChjaGlsZCwgW25vZGVdKTtcbiAgICAgICAgZWxzZSBvZi5wdXNoKG5vZGUpO1xuICAgICAgICBpZiAoIXNlZW4uaGFzKGNoaWxkKSkge1xuICAgICAgICAgIHNlZW4uYWRkKGNoaWxkKTtcbiAgICAgICAgICBzdGFjay5wdXNoKGNoaWxkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCByZWFjaGluZyA9IG5ldyBTZXQ8b2JqZWN0PigpO1xuICAgIHdoaWxlIChob2xkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG5vZGUgPSBob2xkZXJzLnBvcCgpITtcbiAgICAgIGlmIChyZWFjaGluZy5oYXMobm9kZSkpIGNvbnRpbnVlO1xuICAgICAgcmVhY2hpbmcuYWRkKG5vZGUpO1xuICAgICAgaG9sZGVycy5wdXNoKC4uLihwYXJlbnRzLmdldChub2RlKSA/PyBbXSkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVhY2hpbmc7XG4gIH1cblxuICAvKiogRG9lcyBgdmFsdWVgIGhvbGQgb25lIG9mIGBwYXRoc2Ag4oCUIGFuIG93biBrZXkgb2YgdGhhdCBuYW1lLCBvciBhIGRvdHRlZCBwYXRoIGluc2lkZSBpdD8gKi9cbiAgc3RhdGljIGhvbGRzUGF0aHModmFsdWU6IG9iamVjdCwgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKHBhdGhzID09PSB1bmRlZmluZWQpIHJldHVybiBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHBhdGgpIHx8IChwYXRoLmluY2x1ZGVzKCcuJykgJiYgbmF0aXZlSGFzKHZhbHVlLCBwYXRoKSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0YWluZWQgZm9ybSBvZiBhIHdob2xlIFNUQVRFIOKAlCB7QGxpbmsgcmV0YWluUmVjb3JkfSBvdmVyIHRoZSByb290XG4gICAqIGtleXMgQU5EIG92ZXIgZXZlcnkgcnVuIG5hbWVzcGFjZSB1bmRlciBgcnVuc2AgKGZvcmsgY2hpbGRyZW4gd3JpdGVcbiAgICogdGhlcmU7IGEgY2hlY2twb2ludCdzIGBzaGFyZWRTdGF0ZWAgY2FycmllcyBpdCBiYWNrIGFzIGEgc2VlZCkuIFRoaXMgaXNcbiAgICogd2hhdCBzZWVkcyB0aGUgcmVkYWN0ZWQgbWlycm9yOiB0aGUgc3RvcmUncyBzdGFydGluZyBzdGF0ZSwgc2NydWJiZWRcbiAgICogd2l0aCB0aGUgbG9nJ3MgcGxhY2Vob2xkZXIsIHNvIGEgcG9saWN5IGtleSB0aGF0IGFycml2ZXMgYnkgc2VlZCBhbmQgaXNcbiAgICogbmV2ZXIgcmUtd3JpdHRlbiBpcyBzdGlsbCBzZXJ2ZWQgYXMgdGhlIHBsYWNlaG9sZGVyLlxuICAgKi9cbiAgcmV0YWluU3RhdGU8VD4oc3RhdGU6IFQsIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IFQge1xuICAgIGNvbnN0IGtlcHQgPSB0aGlzLnJldGFpblJlY29yZChzdGF0ZSwgcGxhY2Vob2xkZXIpO1xuICAgIGlmIChrZXB0ID09PSBudWxsIHx8IHR5cGVvZiBrZXB0ICE9PSAnb2JqZWN0JykgcmV0dXJuIGtlcHQ7XG4gICAgY29uc3QgcnVucyA9IChrZXB0IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtSVU5fTkFNRVNQQUNFXTtcbiAgICBpZiAocnVucyA9PT0gbnVsbCB8fCB0eXBlb2YgcnVucyAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShydW5zKSkgcmV0dXJuIGtlcHQ7XG4gICAgbGV0IHNjcnViYmVkUnVuczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBbcnVuSWQsIHJlY29yZF0gb2YgT2JqZWN0LmVudHJpZXMocnVucyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikpIHtcbiAgICAgIGNvbnN0IGtlcHRSdW4gPSB0aGlzLnJldGFpblJlY29yZChyZWNvcmQsIHBsYWNlaG9sZGVyKTtcbiAgICAgIGlmIChrZXB0UnVuID09PSByZWNvcmQpIGNvbnRpbnVlO1xuICAgICAgc2NydWJiZWRSdW5zID8/PSB7IC4uLihydW5zIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgICAgc2NydWJiZWRSdW5zW3J1bklkXSA9IGtlcHRSdW47XG4gICAgfVxuICAgIHJldHVybiBzY3J1YmJlZFJ1bnMgPT09IHVuZGVmaW5lZCA/IGtlcHQgOiAoeyAuLi4oa2VwdCBhcyBvYmplY3QpLCBbUlVOX05BTUVTUEFDRV06IHNjcnViYmVkUnVucyB9IGFzIFQpO1xuICB9XG5cbiAgLyoqIEFwcGx5IGEgdmVyZGljdCB0byBhIHZhbHVlIOKAlCBzZWUge0BsaW5rIHJldGFpbn0uICovXG4gIHN0YXRpYyBhcHBseSh2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LCB2YWx1ZTogdW5rbm93biwgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSKTogdW5rbm93biB7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIHBsYWNlaG9sZGVyO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnKSByZXR1cm4gUmVkYWN0aW9uUnVsZS5zY3J1YkZpZWxkcyh2YWx1ZSwgdmVyZGljdC5wYXRocywgcGxhY2Vob2xkZXIpID8/IHZhbHVlO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBIGRlZXAgY2xvbmUgb2YgYHZhbHVlYCB3aXRoIHRoZSBnaXZlbiBkb3QtcGF0aHMgcmVwbGFjZWQgYnkgdGhlXG4gICAqIHBsYWNlaG9sZGVyIOKAlCBgdW5kZWZpbmVkYCB3aGVuIGB2YWx1ZWAgaXMgbm90IGFuIG9iamVjdCAodGhlcmUgaXMgbm90aGluZ1xuICAgKiB0byBzY3J1YiBpbiBhIHNjYWxhcjsgdGhlIGNhbGxlciBrZWVwcyB0aGUgdmFsdWUpLiBUaGUgY2xvbmUgcmVmdXNlcyBhblxuICAgKiB1bmNsb25lYWJsZSB2YWx1ZS4gQSBwYXRoIG5hbWVzIGEgbGl0ZXJhbCBrZXkgKGAnYS5iJ2AgYXMgb25lIHByb3BlcnR5KVxuICAgKiBhbmQsIHdoZW4gZG90dGVkLCB0aGUgbmVzdGVkIHBhdGg7IGVhY2ggaXMgc2NydWJiZWQgd2hlcmUgaXQgZXhpc3RzLCBwZXJcbiAgICogUEFUSCDigJQgYSBub2RlIHRoZSBjbG9uZSBzaGFyZXMgYmV0d2VlbiB0d28gcGF0aHMgaXMgbWFza2VkIGF0IHRoZSBuYW1lZFxuICAgKiBvbmUgb25seSAoe0BsaW5rIHNlcnZlZEJ5UGF0aH0pLiBQYXRocyB0aGF0IGRvIG5vdCBleGlzdCBhcmUgaWdub3JlZCDigJRcbiAgICogc2NydWJiaW5nIG5ldmVyIGludmVudHMgYSBmaWVsZC5cbiAgICovXG4gIHN0YXRpYyBzY3J1YkZpZWxkcyhcbiAgICB2YWx1ZTogdW5rbm93bixcbiAgICBwYXRoczogcmVhZG9ubHkgc3RyaW5nW10sXG4gICAgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFNDT1BFX1BMQUNFSE9MREVSLFxuICApOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgLy8gVGhlIGNsb25lIGRldGFjaGVzIHRoZSByZXRhaW5lZCB2YWx1ZSAoYW5kIHJlZnVzZXMgYW4gdW5jbG9uZWFibGUgb25lKTsgdGhlIHNjcnViIG9uIGl0IGlzXG4gICAgLy8gZGVjaWRlZCBwZXIgUEFUSCwgc28gYSBub2RlIHRoZSBjbG9uZSBzaGFyZXMgYmV0d2VlbiB0d28gcGF0aHMgaXMgbWFza2VkIGF0IHRoZSBuYW1lZCBvbmUgb25seS5cbiAgICBjb25zdCBjb3B5ID0gc3RydWN0dXJlZENsb25lKHZhbHVlKSBhcyBvYmplY3Q7XG4gICAgcmV0dXJuIHNlcnZlZEJ5UGF0aChcbiAgICAgIGNvcHksXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0YXJnZXRzT2YocGF0aHMpLFxuICAgICAgeyByb290RGVjaWRlZDogZmFsc2UsIG1lbW86IG5ldyBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgdW5rbm93bj4+KCksIGJ1ZGdldDogd2Fsa0xpbWl0IH0sXG4gICAgICBwbGFjZWhvbGRlcixcbiAgICApIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgcmVwb3J0KCk6IFJlZGFjdGlvblJlcG9ydCB7XG4gICAgLy8gS2V5ZWQgYnkgYSBNYXAsIHRoZW4gbWFkZSBvd24gZGF0YSBrZXlzIGJ5IGBmcm9tRW50cmllc2A6IGEga2V5IGEgbWFwcGVyXG4gICAgLy8gd3JvdGUgaXMgYSBuYW1lIGZyb20gZGF0YSwgYW5kIG9uIGEgcGxhaW4gb2JqZWN0IGB0b1N0cmluZ2Agd291bGQgcmVhZFxuICAgIC8vIHRoZSBpbmhlcml0ZWQgbWV0aG9kIGFuZCBgX19wcm90b19fYCB3b3VsZCBjYWxsIHRoZSBwcm90b3R5cGUgc2V0dGVyLlxuICAgIGNvbnN0IGZpZWxkUmVkYWN0aW9ucyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmdbXT4oKTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkc10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wb2xpY3k/LmZpZWxkcyA/PyB7fSkpIHtcbiAgICAgIGZpZWxkUmVkYWN0aW9ucy5zZXQoa2V5LCBbLi4uZmllbGRzXSk7XG4gICAgfVxuICAgIC8vIEZpZWxkcyBhIG1hcHBlciBoYW5kZWQgdG8gYSBuZXcga2V5IGFyZSBzY3J1YmJlZCB1bmRlciB0aGF0IGtleSB0b28uXG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIHRoaXMuaW5oZXJpdGVkID8/IFtdKSB7XG4gICAgICBmaWVsZFJlZGFjdGlvbnMuc2V0KGtleSwgWy4uLm5ldyBTZXQoWy4uLihmaWVsZFJlZGFjdGlvbnMuZ2V0KGtleSkgPz8gW10pLCAuLi5maWVsZHNdKV0pO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgcmVkYWN0ZWRLZXlzOiBbLi4udGhpcy5tYXJrZWRdLFxuICAgICAgZmllbGRSZWRhY3Rpb25zOiBPYmplY3QuZnJvbUVudHJpZXMoZmllbGRSZWRhY3Rpb25zKSxcbiAgICAgIHBhdHRlcm5zOiAodGhpcy5wb2xpY3k/LnBhdHRlcm5zID8/IFtdKS5tYXAoKHApID0+IHAuc291cmNlKSxcbiAgICB9O1xuICB9XG59XG5cbi8vIOKUgOKUgOKUgCBUaGUgd3JpdGUgZGVjaXNpb24g4oCUIG9uZSBwZXIgc3RhZ2VkIHdyaXRlIChDNCkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4vL1xuLy8gV2hhdCB0aGUgcnVuJ3MgcnVsZSBzYXlzIGFib3V0IG9uZSBzdGFnZWQgd3JpdGUsIGFuZCB3aGF0IHRoZSB3cml0ZSBsZWF2ZXMgb24gdGhlIHJ1bGUuIEV2ZXJ5IHN0YWdlZFxuLy8gd3JpdGUgcGFzc2VzIGBTdGFnZUNvbnRleHQgwrcgc3RhZ2VXcml0ZWAgKHRoZSBvbmUgZnVubmVsOiBmYWNhZGUgd3JpdGVzLCBhIHN1YmZsb3cgc2VlZCwgYW5cbi8vIGBvdXRwdXRNYXBwZXJgIG1lcmdlLWJhY2ssIGEgcmVzdW1lIHJlLXNlZWQpLCB3aGljaCBydW5zIHRoZSBmb3VyIHN0ZXBzIGluIHRoZSBvcmRlciB0aGUgcmVjb3JkIG5lZWRzOlxuLy9cbi8vICAgMS4gVkVSRElDVCAgYGRlY2lkZVdyaXRlYCDigJQgYW4gZXhwbGljaXQgcGVyLWNhbGwgZmxhZywgZWxzZSB0aGUgcnVsZSB0aGF0IGlzIEFDVElWRSBhcyB0aGUgd3JpdGUgYmVnaW5zLlxuLy8gICAyLiBJREVOVElUWSBgaW5oZXJpdEJ5SWRlbnRpdHlgIOKAlCB3aXRoIHRoZSBmcmFtZSdzIHNlbGVjdGVkIHJlYWRzIEFTIFRIRVkgU1RBTkQgYWZ0ZXIgc3RlcCAxOiBhIHBvbGljeVxuLy8gICAgICAgICAgICAgICBwYXR0ZXJuIGlzIHVzZXIgY29kZSwgYW5kIGl0IGNhbiByZWFkIG9uIHRoZSB2ZXJ5IGZyYW1lIHRoYXQgaXMgd3JpdGluZy5cbi8vICAgMy4gQllURVMgICAgdGhlIGNhbGxlcjogYFJlY29yZEZyYW1lIMK3IHdyaXRlKHBhdGgsIHZhbHVlLCB2ZXJiLCBzY3J1Yk9mKHZlcmRpY3QpKWAuIFRoZSByZWNvcmQgd3JpdGVzXG4vLyAgICAgICAgICAgICAgIHRoZW07IGl0IG5ldmVyIGRlY2lkZXMgdGhlbS5cbi8vICAgNC4gTUFSS1MgICAgYG1hcmtTdGFnZWRXcml0ZWAg4oCUIG9ubHkgb25jZSB0aGUgd3JpdGUgc3RhZ2VkOiBhIHdyaXRlIHRoYXQgZmFpbHMgdG8gc3RhZ2UgbWFya3Mgbm90aGluZy5cbi8vXG4vLyBTdGVwcyAx4oCTMiBhbmQgc3RlcCA0IGFyZSBjYWxscyBhcm91bmQgdGhlIHdyaXRlLCBub3Qgb25lIGNhbGwgYmVmb3JlIGl0LCBhbmQgZWFjaCByZWFkcyB0aGUgcnVsZSB3aGVuXG4vLyBpdCBhY3RzIOKAlCBhcyB0aGUgZnVubmVsIGFsd2F5cyBkaWQsIHNvIHVzZXIgY29kZSB0aGF0IHJ1bnMgRFVSSU5HIGEgd3JpdGUgKGEgZ2V0dGVyIG9uIHRoZSB2YWx1ZSwgYVxuLy8gcGF0dGVybidzIGB0ZXN0YCkgZmluZHMgdGhlIHNhbWUgcnVsZSwgYW5kIGxlYXZlcyB0aGUgc2FtZSBtYXJrcywgYXMgYmVmb3JlIEM0LlxuXG4vKipcbiAqIFN0ZXAgMSDigJQgVEhFIFZFUkRJQ1QgZm9yIG9uZSBzdGFnZWQgd3JpdGU6IGFuIGV4cGxpY2l0IHBlci1jYWxsIGZsYWcgKGBzZXRWYWx1ZShrZXksIHZhbHVlLCB0cnVlKWApXG4gKiBtYWtlcyB0aGUgdmFsdWUgc2VjcmV0IHdob2xlIHVuZGVyIGl0cyB1c2VyLWxldmVsIGtleTsgZWxzZSB0aGUgYGFjdGl2ZWAgcnVsZSBkZWNpZGVzIGZyb20gdGhlXG4gKiB1c2VyLWxldmVsIHBhdGg7IHdpdGggbm9uZSAobm8gcnVsZSwgb3IgYW4gaW5lcnQgb25lIOKAlCB0aGUgY2FsbGVyIHBhc3NlcyBgdW5kZWZpbmVkYCksIGNsZWFyLCB3aXRoIG5vXG4gKiB2ZXJkaWN0IGNhbGwgYW5kIG5vIHBhdGggYWxsb2NhdGlvbiAodGhlIG5vLXBvbGljeSBmYXN0IHBhdGgpLiBNYXJrcyBub3RoaW5nLlxuICpcbiAqIGBgYHRzXG4gKiBkZWNpZGVXcml0ZShuZXcgUmVkYWN0aW9uUnVsZSh7IGZpZWxkczogeyBjYXJkOiBbJ251bWJlciddIH0gfSksIFtdLCAnY2FyZCcsIGZhbHNlKTsgLy8geyBraW5kOiAnZmllbGRzJywga2V5OiAnY2FyZCcsIHBhdGhzOiBbJ251bWJlciddIH1cbiAqIGRlY2lkZVdyaXRlKHVuZGVmaW5lZCwgWydwcm9maWxlJ10sICdhdXRoJywgdHJ1ZSk7IC8vIHsga2luZDogJ3dob2xlJywga2V5OiAncHJvZmlsZS5hdXRoJyB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY2lkZVdyaXRlKFxuICBhY3RpdmU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQsXG4gIHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBrZXk6IHN0cmluZyxcbiAgZXhwbGljaXQ6IGJvb2xlYW4gfCB1bmRlZmluZWQsXG4pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgaWYgKGV4cGxpY2l0KSByZXR1cm4geyBraW5kOiAnd2hvbGUnLCBrZXk6IHVzZXJLZXlPZihwYXRoLCBrZXkpIH07XG4gIHJldHVybiBhY3RpdmUgIT09IHVuZGVmaW5lZCA/IGFjdGl2ZS52ZXJkaWN0QXQocGF0aCwga2V5KSA6IENMRUFSO1xufVxuXG4vKipcbiAqIFN0ZXAgMiDigJQgSURFTlRJVFk6IGFuIE9CSkVDVCB0aGUgc3RhZ2UgcmVhZCB1bmRlciBhIHNlbGVjdGVkIG5hbWUgKGBzZWxlY3RlZGAg4oCUIHRoZSBmcmFtZSdzIHNlbGVjdGVkXG4gKiByZWFkcywgZmlsbGVkIGJ5IGl0cyB0cmFja2VkIHJlYWRzKSwgd3JpdHRlbiB1bmRlciBhbm90aGVyIG5hbWUgKGBzLnBlcnNvbiA9IHMucHJvZmlsZWApLCBrZWVwcyB0aGF0XG4gKiByZWFkJ3MgcnVsZSwgbWF0Y2hlZCBieSBpZGVudGl0eTogYSB3aG9sZSByZWFkIG1hcmtzIHRoZSBuZXcga2V5LCBhIGBmaWVsZHNgIHJlYWQgaGFuZHMgaXQgdGhlIGZpZWxkc1xuICogKHJlLWJhc2VkIHVuZGVyIHRoZSB3cml0dGVuIHBhdGgpLCBhbmQgdGhlIHZlcmRpY3QgaXMgYXNrZWQgYWdhaW4uIEEgbmV3IG9iamVjdCwgYSBwcmltaXRpdmUsIG9yIGFcbiAqIHdyaXRlIGFscmVhZHkgd2hvbGUgaXMgc2VsZWN0ZWQgYnkgaXRzIG93biBuYW1lIG9ubHkg4oCUIGB2ZXJkaWN0YCBjb21lcyBiYWNrIGFzIGl0IGlzLiBEZWNpZGVkIEJFRk9SRVxuICogdGhlIHdyaXRlLCBiZWNhdXNlIHRoZSB2ZXJkaWN0IG5lZWRzIGl0OiBhbiBpbmhlcml0YW5jZSBzdGF5cyBldmVuIGlmIHRoZSB3cml0ZSB0aGVuIGZhaWxzIHRvIHN0YWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5oZXJpdEJ5SWRlbnRpdHkoXG4gIGFjdGl2ZTogUmVkYWN0aW9uUnVsZSB8IHVuZGVmaW5lZCxcbiAgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCxcbiAgc2VsZWN0ZWQ6IFdlYWtNYXA8b2JqZWN0LCBSZWRhY3Rpb25WZXJkaWN0PiB8IHVuZGVmaW5lZCxcbiAgcGF0aDogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGtleTogc3RyaW5nLFxuICB2YWx1ZTogdW5rbm93bixcbik6IFJlZGFjdGlvblZlcmRpY3Qge1xuICBjb25zdCByZWFkID1cbiAgICBhY3RpdmUgIT09IHVuZGVmaW5lZCAmJiB2ZXJkaWN0LmtpbmQgIT09ICd3aG9sZScgJiYgdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0J1xuICAgICAgPyBzZWxlY3RlZD8uZ2V0KHZhbHVlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGlmIChyZWFkID09PSB1bmRlZmluZWQgfHwgYWN0aXZlID09PSB1bmRlZmluZWQpIHJldHVybiB2ZXJkaWN0O1xuICBpZiAocmVhZC5raW5kID09PSAnd2hvbGUnKSBhY3RpdmUubWFyayh1c2VyS2V5T2YocGF0aCwga2V5KSk7XG4gIGVsc2UgaWYgKHJlYWQua2luZCA9PT0gJ2ZpZWxkcycpIHtcbiAgICBjb25zdCBhdCA9IFsuLi5wYXRoLnNsaWNlKDEpLCAuLi4ocGF0aC5sZW5ndGggPiAwID8gW2tleV0gOiBbXSldO1xuICAgIGFjdGl2ZS5pbmhlcml0RmllbGRzKFxuICAgICAgcGF0aFswXSA/PyBrZXksXG4gICAgICByZWFkLnBhdGhzLm1hcCgoZmllbGQpID0+IFsuLi5hdCwgZmllbGRdLmpvaW4oJy4nKSksXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYWN0aXZlLnZlcmRpY3RBdChwYXRoLCBrZXkpO1xufVxuXG4vKiogVGhlIHNjcnViIG9mIGEgd2hvbGUgdmVyZGljdCDigJQgb25lIGZyb3plbiBvYmplY3QgZm9yIGV2ZXJ5IHdyaXRlIGl0IGNvdmVycy4gKi9cbmNvbnN0IFdIT0xFX1NDUlVCOiBXcml0ZVNjcnViID0gT2JqZWN0LmZyZWV6ZSh7IHdob2xlOiB0cnVlIH0pO1xuXG4vKipcbiAqIFN0ZXAgMydzIGlucHV0IOKAlCBhIHZlcmRpY3QncyBCWVRFUyBmb3IgdGhlIHJlY29yZCAoYFJlY29yZEZyYW1lIMK3IHdyaXRlYCk6IG5vdGhpbmcgd2hlbiBjbGVhciwgdGhlXG4gKiB3aG9sZSB2YWx1ZSwgb3IgdGhlIGZpZWxkcyBpbnNpZGUgaXQuIE5vIGFsbG9jYXRpb24gb24gdGhlIGRlZmF1bHQgcGF0aCAoY2xlYXIpIG9yIGZvciBhIHdob2xlIHZlcmRpY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzY3J1Yk9mKHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QpOiBXcml0ZVNjcnViIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcmV0dXJuIFdIT0xFX1NDUlVCO1xuICByZXR1cm4gdmVyZGljdC5raW5kID09PSAnZmllbGRzJyA/IHsgZmllbGRzOiB2ZXJkaWN0LnBhdGhzIH0gOiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogU3RlcCA0IOKAlCB0aGUgTUFSS1MgYSBzdGFnZWQgd3JpdGUgbGVhdmVzOyBjYWxsIGl0IG9ubHkgb25jZSB0aGUgd3JpdGUgc3RhZ2VkLCBzbyBhIHdyaXRlIHRoYXQgZmFpbHMgdG9cbiAqIHN0YWdlIG1hcmtzIG5vdGhpbmcuIEEgZGVsZXRlIGNsZWFycyBpdHMga2V5J3MgbWFyayAoYW5kIGFueSBmaWVsZHMgYSBtYXBwZXIgaGFuZGVkIGl0KSBvbiBgYWN0aXZlYCxcbiAqIHRoZSBydWxlIHRoYXQgd2FzIGFjdGl2ZSBhcyB0aGUgd3JpdGUgQkVHQU4g4oCUIG5vbmUgd2hlbiBpdCB3YXMgaW5lcnQsIGV2ZW4gaWYgdXNlciBjb2RlIG1hcmtlZCB0aGUga2V5XG4gKiBkdXJpbmcgdGhlIHdyaXRlLiBBIHdob2xlIHZlcmRpY3QgbWFya3MgaXRzIGtleSDigJQgdGhlIGtleSB0aGF0IERFQ0lERUQgaXQgKGB2ZXJkaWN0LmtleWA6IGFuIGFuY2VzdG9yXG4gKiBmb3IgYSBuZXN0ZWQgd3JpdGUgdW5kZXIgYSB3aG9sZS1zZWxlY3RlZCBrZXkpIOKAlCBmb3IgdGhlIHJlc3Qgb2YgdGhlIHJ1biBvbiBgcnVsZWAsIHRoZSBydW4ncyBydWxlIGFzXG4gKiBpdCBzdGFuZHMgTk9XICh1c2VyIGNvZGUgZHVyaW5nIHRoZSB3cml0ZSBtYXkgaGF2ZSBpbnN0YWxsZWQgb25lOyBhbiBleHBsaWNpdCBtYXJrIGlzIHdoYXQgbWFrZXMgYW5cbiAqIGluZXJ0IHJ1bGUgYWN0aXZlKS4gQSBtYXJrIGlzIGEgcnVuLXdpZGUgTkFNRTogaXQgc3RheXMgd2hlbiB0aGUgc3RhZ2UncyBjb21taXQgZmFpbHMgb3IgYSByZXRyeVxuICogZGlzY2FyZHMgdGhlIGF0dGVtcHQg4oCUIHRoZSBzYWZlIHNpZGU7IG9ubHkgYSBzdGFnZWQgZGVsZXRlIHJlbW92ZXMgb25lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWFya1N0YWdlZFdyaXRlKFxuICBhY3RpdmU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQsXG4gIHJ1bGU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQsXG4gIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsXG4gIHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBrZXk6IHN0cmluZyxcbiAgdmVyYjogV3JpdGVWZXJiLFxuKTogdm9pZCB7XG4gIGlmICh2ZXJiID09PSAnZGVsZXRlJykgYWN0aXZlPy51bm1hcmsodXNlcktleU9mKHBhdGgsIGtleSkpO1xuICBlbHNlIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJ1bGU/Lm1hcmsodmVyZGljdC5rZXkpO1xufVxuXG4vLyDilIDilIDilIAgVGhlIHBhdGggd2FsayDigJQgb25lIGRlY2lzaW9uIHBlciBQQVRIIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIEEgcnVsZSB0aGF0IG5hbWVzIGEgUEFUSCAoYSBkb3R0ZWQga2V5LCBhIHBhdHRlcm4sIGEgZmllbGQpIG11c3QgYmUgZXhhY3Rcbi8vIGV2ZW4gd2hlbiBvbmUgb2JqZWN0IGlzIHJlYWNoYWJsZSBhdCB0d28gcGF0aHM6IHRoZSBkZWNpc2lvbiBpcyBtYWRlIHBlclxuLy8gcGF0aCwgbmV2ZXIgcGVyIG9iamVjdCwgYW5kIGEgY29weSBpcyBtYWRlIHBlciBwYXRoIChjb3B5LW9uLXdyaXRlKSDigJQgbmV2ZXJcbi8vIGEgc2NydWIgaW4gcGxhY2Ugb24gYSBub2RlIGFub3RoZXIgcGF0aCBzdGlsbCBzaG93cy4gQSBrZXktTkFNRSBydWxlIGlzIHRoZVxuLy8gc2FtZSBhdCBldmVyeSBwYXRoLCBzbyBhIHNoYXJlZCBub2RlIGl0IG1hc2tzIGlzIG1hc2tlZCBldmVyeXdoZXJlIOKAlCB0aGVcbi8vIHNhZmUgc2lkZS4gQSBjeWNsZSBlZGdlIGlzIG5vdCBmb2xsb3dlZDogaXQgaXMgcG9pbnRlZCBhdCB0aGUgYW5jZXN0b3Inc1xuLy8gc2VydmVkIGNvcHkuXG4vL1xuLy8gTElORUFSIE9OIEEgREFHLiBEb3R0ZWQga2V5cyBhbmQgbWFya3MgYXJlIHdhbGtlZCBhcyBUQVJHRVRTIChwYXRoLXJlbGF0aXZlXG4vLyBzdGF0ZSwgbGlrZSBmaWVsZHMpLCBhbmQgYSBwYXR0ZXJuIHRoYXQgY2FuIG9ubHkgbWF0Y2ggd2l0aGluIGEga2V5IE5BTUVcbi8vICh7QGxpbmsgbmVlZHNQYXRofSDigJQgdGhlIGNvbW1vbiBjYXNlLCBgL3Bhc3N3b3JkL2lgKSBpcyBkZWNpZGVkIGJ5IHRoZSBuYW1lLFxuLy8gc28gYSBkZWNpc2lvbiBkZXBlbmRzIG9ubHkgb24gdGhlIG9iamVjdCBhbmQgdGhlIHRhcmdldHMgc3RpbGwgbGl2ZSBhdCBpdCDigJRcbi8vIG1lbW9pemVkIHBlciAob2JqZWN0LCB0YXJnZXRzKTogYW4gb2JqZWN0IHNoYXJlZCBieSBtYW55IHBhdGhzIChhbiBhZ2VudCdzXG4vLyBsaW5rZWQgaGlzdG9yeSkgaXMgZGVjaWRlZCBvbmNlLCBhbmQgaXRzIHNlcnZlZCBjb3B5IGlzIHNoYXJlZCB0b28uIE9ubHkgYVxuLy8gZ2VudWluZWx5IFBBVEgtZGVwZW5kZW50IHBhdHRlcm4gKGAvXmFcXC5iJC9gKSB3YWxrcyBwYXRoczsgcGFzdFxuLy8ge0BsaW5rIFdBTEtfTElNSVR9IHBhdGggdmlzaXRzIHN1Y2ggYSB3YWxrIHNlcnZlcyB0aGUgdW52aXNpdGVkIHJlbWFpbmRlciBhc1xuLy8gdGhlIHBsYWNlaG9sZGVyICh0aGUgc2FmZSBzaWRlKSwgd2FybnMgb25jZSBpbiBkZXYgbW9kZSwgYW5kIG5ldmVyIGZhaWxzLlxuXG4vKiogQSBmaWVsZCBzdGlsbCB0byByZWFjaCBiZWxvdyBhIG5vZGU6IHRoZSBwYXRoIHNlZ21lbnRzIGxlZnQgdG8gd2Fsay4gKi9cbnR5cGUgVGFyZ2V0ID0gcmVhZG9ubHkgc3RyaW5nW107XG5cbi8qKiBIb3cgYSB3YWxrIGRlY2lkZXMgYW4gZWRnZS4gKi9cbmludGVyZmFjZSBXYWxrIHtcbiAgLyoqIEtleS1sZXZlbCBydWxlcyBhdCBldmVyeSBuZXN0ZWQga2V5IOKAlCBhYnNlbnQgZm9yIGEgYmFyZSBmaWVsZCBzY3J1YiAodGFyZ2V0cyBvbmx5KS4gKi9cbiAgcmVhZG9ubHkgbmFtZXM/OiB7XG4gICAgLyoqIFNlbGVjdGVkIHdob2xlIGF0IHRoaXMgbmVzdGVkIGtleSBieSBpdHMgb3duIE5BTUUgKG1hcmtzLCBrZXlzLCBwYXR0ZXJucykuICovXG4gICAgbWFza3MobmFtZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgICAvKiogU2VsZWN0ZWQgd2hvbGUgYnkgdGhlIGRvdHRlZCBQQVRIIOKAlCBwcmVzZW50IG9ubHkgdW5kZXIgcGF0dGVybnMgKGEgcGF0dGVybiBpcyB0ZXN0ZWQgb24gdGhlIHBhdGgpLiAqL1xuICAgIHBhdGhNYXNrcz8ocGF0aDogc3RyaW5nKTogYm9vbGVhbjtcbiAgICAvKiogVGhlIGRlY2xhcmVkIGZpZWxkcyBiZWxvdyBhIGtleSBvZiB0aGlzIG5hbWUuICovXG4gICAgZmllbGRzKG5hbWU6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkO1xuICB9O1xuICAvKiogVGhlIHJvb3QncyBvd24ga2V5cyB3ZXJlIGRlY2lkZWQgYnkgdGhlIGNhbGxlciAoYHJldGFpblJlY29yZGApOiB3YWxrIGJlbG93IHRoZW0gb25seS4gKi9cbiAgcmVhZG9ubHkgcm9vdERlY2lkZWQ6IGJvb2xlYW47XG4gIC8qKiBEZWNpc2lvbnMgc2hhcmVkIHBlciAob2JqZWN0LCB0YXJnZXRzKSDigJQgYWJzZW50IHdoZW4gYSBkZWNpc2lvbiBkZXBlbmRzIG9uIHRoZSBwYXRoLiAqL1xuICByZWFkb25seSBtZW1vPzogV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIHVua25vd24+PjtcbiAgLyoqIFBhdGggdmlzaXRzIGxlZnQuICovXG4gIGJ1ZGdldDogbnVtYmVyO1xuICAvKiogVG9sZCBvbmNlIHdoZW4gdGhlIHdhbGsgcGFzc2VzIGl0cyBsaW1pdC4gKi9cbiAgcmVhZG9ubHkgb25MaW1pdD86ICgpID0+IHZvaWQ7XG4gIC8qKiBUaGUgd2FsayBoYXMgcGFzc2VkIGl0cyBsaW1pdDogd2hhdCBpdCBoYXMgbm90IHZpc2l0ZWQgaXMgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlci4gKi9cbiAgbGltaXRlZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUGF0aCB2aXNpdHMgb25lIHdhbGsgbWF5IG1ha2Ug4oCUIHJlYWNoYWJsZSBvbmx5IHVuZGVyIGEgUEFUSC1kZXBlbmRlbnRcbiAqIHBhdHRlcm4gb3ZlciBhIHZhbHVlIHdob3NlIHBhdGhzIG91dG51bWJlciBpdHMgb2JqZWN0cyAoYSBsaW5rZWQgaGlzdG9yeSwgYVxuICogREFHKTogZXZlcnkgb3RoZXIgd2FsayBzaGFyZXMgaXRzIGRlY2lzaW9ucyBwZXIgb2JqZWN0IGFuZCBzdGF5cyBsaW5lYXIuXG4gKi9cbmV4cG9ydCBjb25zdCBXQUxLX0xJTUlUID0gMV8wMDBfMDAwO1xuXG4vKiogVGhlIGxpbWl0IHdhbGtzIHVzZToge0BsaW5rIFdBTEtfTElNSVR9LCB1bmxlc3MgYSB0ZXN0IGxvd2VyZWQgaXQgKHtAbGluayB1c2VXYWxrTGltaXR9KS4gKi9cbmxldCB3YWxrTGltaXQ6IG51bWJlciA9IFdBTEtfTElNSVQ7XG5cbi8qKlxuICogQGludGVybmFsIFRlc3RzIG9ubHkg4oCUIG5vdCBvbiBhbnkgcHVibGljIGRvb3I6IHdhbGtzIHVzZSBgbGltaXRgIHVudGlsIHRoZVxuICogcmV0dXJuZWQgcmVzdG9yZSBpcyBjYWxsZWQsIHNvIGEgdGVzdCByZWFjaGVzIHRoZSBvdmVyLWxpbWl0IHBhdGggaW4gYVxuICogdGhvdXNhbmQgdmlzaXRzIGluc3RlYWQgb2YgYSBtaWxsaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlV2Fsa0xpbWl0KGxpbWl0OiBudW1iZXIpOiAoKSA9PiB2b2lkIHtcbiAgY29uc3QgcHJpb3IgPSB3YWxrTGltaXQ7XG4gIHdhbGtMaW1pdCA9IGxpbWl0O1xuICByZXR1cm4gKCkgPT4ge1xuICAgIHdhbGtMaW1pdCA9IHByaW9yO1xuICB9O1xufVxuXG4vKipcbiAqIENhbiBgcGF0dGVybmAgbWF0Y2ggYSBkb3R0ZWQgUEFUSCB3aGVyZSBpdCBtYXRjaGVzIG5vbmUgb2YgdGhlIHBhdGgnc1xuICogc2VnbWVudCBOQU1FUz8gT25seSB0aHJvdWdoIGEgY29uc3RydWN0IHRoYXQgY2FuIG1hdGNoIG9yIHRlc3QgdGhlIGAuYFxuICogYmV0d2VlbiBzZWdtZW50czogYC5gIGl0c2VsZiwgYW4gZXNjYXBlIHRoYXQgY2FuIHN0YW5kIGZvciBpdCAoYFxcVyBcXFMgXFxEXG4gKiBcXEIgXFxwIFxcUCBcXHUgXFx4IFxcY2AsIGEgZGlnaXQgZXNjYXBlKSwgYSBuZWdhdGVkIGNsYXNzLCBhIGNsYXNzIHJhbmdlIHRoYXRcbiAqIHNwYW5zIGAuYCwgYSBsb29rYXJvdW5kIG9yIGEgbmFtZWQgZ3JvdXAuIEFueXRoaW5nIGVsc2UgbWF0Y2hlcyBhIHBhdGggb25seVxuICogaW5zaWRlIG9uZSBzZWdtZW50IOKAlCBhbmQgYW4gYW5jZXN0b3Igd2hvc2UgTkFNRSBtYXRjaGVzIGlzIG1hc2tlZCB3aG9sZVxuICogYmVmb3JlIHRoZSB3YWxrIGdvZXMgYmVsb3cgaXQsIHNvIHRoZSBuYW1lIGRlY2lkZXMuIENvbnNlcnZhdGl2ZTogYHRydWVgXG4gKiB3aGVuZXZlciBpbiBkb3VidC5cbiAqXG4gKiBMaW5lYXIgaW4gdGhlIGxlbmd0aCBvZiBgcGF0dGVybi5zb3VyY2VgOiBldmVyeSBzY2FuIGhlcmUgaXMgb25lIGZvcndhcmRcbiAqIHBhc3MgKHtAbGluayBjbGFzc0JvZGllc30pIG9yIGEgcmVnZXggdGhhdCBkb2VzIGNvbnN0YW50IHdvcmsgcGVyIHBvc2l0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmVlZHNQYXRoKHBhdHRlcm46IFJlZ0V4cCk6IGJvb2xlYW4ge1xuICBjb25zdCBzb3VyY2UgPSBwYXR0ZXJuLnNvdXJjZTtcbiAgaWYgKC9cXC58XFxcXFtXU0RCcFB1eGMwLTldfFxcW1xcXnxcXChcXD9bPSE8XS8udGVzdChzb3VyY2UpKSByZXR1cm4gdHJ1ZTtcbiAgZm9yIChjb25zdCBib2R5IG9mIGNsYXNzQm9kaWVzKHNvdXJjZSkpIHtcbiAgICBmb3IgKGNvbnN0IFssIGxvdywgaGlnaF0gb2YgYm9keS5tYXRjaEFsbCgvKFxcXFw/W1xcc1xcU10pLShcXFxcP1tcXHNcXFNdKS9nKSkge1xuICAgICAgaWYgKGxvdy5sZW5ndGggPiAxIHx8IGhpZ2gubGVuZ3RoID4gMSB8fCAobG93IDw9ICcuJyAmJiBoaWdoID49ICcuJykpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogVGhlIGJvZHkgb2YgZWFjaCBjaGFyYWN0ZXIgY2xhc3MgaW4gYHNvdXJjZWAsIGxlZnQgdG8gcmlnaHQ6IHRoZSB0ZXh0XG4gKiBiZXR3ZWVuIGEgYFtgIGFuZCB0aGUgZmlyc3QgYF1gIGFmdGVyIGl0IHRoYXQgbm8gYFxcYCBlc2NhcGVzIChhIGBcXGAgdGFrZXNcbiAqIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgaXQgYWxvbmcpLiBPTkUgZm9yd2FyZCBwYXNzLlxuICpcbiAqIEl0IHJlcGxhY2VzIGBzb3VyY2UubWF0Y2hBbGwoL1xcWygoPzpcXFxcW1xcc1xcU118W15cXF1cXFxcXSkqKVxcXS9nKWAgYW5kIGdpdmVzIHRoZVxuICogc2FtZSBib2RpZXMgZm9yIGV2ZXJ5IHN0cmluZyAocGlubmVkIGFnYWluc3QgdGhhdCByZWdleCBhcyB0aGUgY29udHJvbCxcbiAqIHRlc3QvbGliL21lbW9yeS9zZWN1cml0eS9uZWVkcy1wYXRoLWxpbmVhci5zZWN1cml0eS50ZXN0LnRzKS4gVGhlIHJlZ2V4IHdhc1xuICogcXVhZHJhdGljOiBhZnRlciBhIGBbYCB0aGF0IG5ldmVyIGNsb3NlZCBpdCByZXRyaWVkIGF0IGV2ZXJ5IGxhdGVyIGBbYCxcbiAqIGVhY2ggcmV0cnkgcmVzY2FubmluZyB0byB0aGUgZW5kIOKAlCBgXFxbYCByZXBlYXRlZCAzMiwwMDAgdGltZXMgdG9vayAwLjcgcyxcbiAqIGFuZCBgc2V0UG9saWN5YCBydW5zIG9uY2UgcGVyIHN0YWdlJ3Mgc2NvcGUgKENvZGVRTCBqcy9wb2x5bm9taWFsLXJlZG9zKS5cbiAqIFRoZSBwYXNzIHN0b3BzIGF0IHRoZSBmaXJzdCBgW2AgdGhhdCBuZXZlciBjbG9zZXMgaW5zdGVhZDogYSBsYXRlciBgW2BcbiAqIHN0YXJ0cyBpdHMgYm9keSB3aGVyZSB0aGUgZmFpbGVkIHNjYW4gd2FzIGFsc28gYmV0d2VlbiB0d28gdG9rZW5zLCBzbyBpdFxuICogcmVhZHMgdGhlIHNhbWUgdGFpbCB0aGUgc2FtZSB3YXkgYW5kIGNsb3NlcyBub3doZXJlIGVpdGhlci5cbiAqXG4gKiBAaW50ZXJuYWwgRXhwb3J0ZWQgZm9yIHRoYXQgdGVzdCBvbmx5IOKAlCBub3Qgb24gYW55IHB1YmxpYyBkb29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xhc3NCb2RpZXMoc291cmNlOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGJvZGllczogc3RyaW5nW10gPSBbXTtcbiAgbGV0IG9wZW4gPSBzb3VyY2UuaW5kZXhPZignWycpO1xuICB3aGlsZSAob3BlbiAhPT0gLTEpIHtcbiAgICBjb25zdCBjbG9zZSA9IGNsb3NpbmdCcmFja2V0KHNvdXJjZSwgb3BlbiArIDEpO1xuICAgIGlmIChjbG9zZSA9PT0gLTEpIGJyZWFrO1xuICAgIGJvZGllcy5wdXNoKHNvdXJjZS5zbGljZShvcGVuICsgMSwgY2xvc2UpKTtcbiAgICBvcGVuID0gc291cmNlLmluZGV4T2YoJ1snLCBjbG9zZSArIDEpO1xuICB9XG4gIHJldHVybiBib2RpZXM7XG59XG5cbi8qKiBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGBdYCBhdCBvciBhZnRlciBgZnJvbWAgdGhhdCBubyBgXFxgIGVzY2FwZXMsIGVsc2UgLTEgKGEgdHJhaWxpbmcgbG9uZSBgXFxgIGVzY2FwZXMgbm90aGluZyBhbmQgY2xvc2VzIG5vdGhpbmcpLiAqL1xuZnVuY3Rpb24gY2xvc2luZ0JyYWNrZXQoc291cmNlOiBzdHJpbmcsIGZyb206IG51bWJlcik6IG51bWJlciB7XG4gIGxldCBhdCA9IGZyb207XG4gIHdoaWxlIChhdCA8IHNvdXJjZS5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyID0gc291cmNlW2F0XTtcbiAgICBpZiAoY2hhciA9PT0gJ10nKSByZXR1cm4gYXQ7XG4gICAgYXQgKz0gY2hhciA9PT0gJ1xcXFwnID8gMiA6IDE7XG4gIH1cbiAgcmV0dXJuIC0xO1xufVxuXG4vKiogYHNlcnZlZExlYWZgJ3MgYW5zd2VyIGZvciBhIHZhbHVlIGl0IGxlYXZlcyBhcyBpdCBpcy4gKi9cbmNvbnN0IEtFRVA6IHVuaXF1ZSBzeW1ib2wgPSBTeW1ib2woJ2tlcHQgYXMgaXQgaXMnKTtcblxuLyoqIEVhY2ggZmllbGQgcGF0aCBhcyBvbmUgbGl0ZXJhbCBrZXkgYW5kLCB3aGVuIGRvdHRlZCwgYXMgaXRzIHNlZ21lbnRzLiAqL1xuZnVuY3Rpb24gdGFyZ2V0c09mKHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IFRhcmdldFtdIHtcbiAgY29uc3Qgb3V0OiBUYXJnZXRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMgPz8gW10pIHtcbiAgICBvdXQucHVzaChbcGF0aF0pO1xuICAgIGlmIChwYXRoLmluY2x1ZGVzKCcuJykpIG91dC5wdXNoKHBhdGguc3BsaXQoJy4nKSk7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLyoqIFRoZSBtZW1vIGtleSBvZiBhIHRhcmdldCBzdGF0ZSDigJQgb3JkZXItZnJlZS4gKi9cbmZ1bmN0aW9uIHNpZ25hdHVyZU9mKHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHRhcmdldHMubGVuZ3RoID09PSAwXG4gICAgPyAnJ1xuICAgIDogdGFyZ2V0c1xuICAgICAgICAubWFwKCh0KSA9PiB0LmpvaW4oJ1xcdTAwMWYnKSlcbiAgICAgICAgLnNvcnQoKVxuICAgICAgICAuam9pbignXFx1MDAxZScpO1xufVxuXG4vKiogT25lIGVkZ2UncyBkZWNpc2lvbjogdGhlIHZhbHVlIHVuZGVyIGBrZXlgIGlzIG1hc2tlZCBoZXJlLCBvciB0aGVzZSB0YXJnZXRzIGNvbnRpbnVlIGJlbG93IGl0LiAqL1xuZnVuY3Rpb24gZGVjaWRlRWRnZShcbiAga2V5OiBzdHJpbmcsXG4gIGRvdHRlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0YXJnZXRzOiByZWFkb25seSBUYXJnZXRbXSxcbiAgd2FsazogV2FsayxcbiAgZGVwdGg6IG51bWJlcixcbik6IHsgbWFza2VkOiBib29sZWFuOyBiZWxvdzogVGFyZ2V0W10gfSB7XG4gIGNvbnN0IGJlbG93OiBUYXJnZXRbXSA9IFtdO1xuICBsZXQgbWFza2VkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgdGFyZ2V0IG9mIHRhcmdldHMpIHtcbiAgICBpZiAodGFyZ2V0WzBdICE9PSBrZXkpIGNvbnRpbnVlO1xuICAgIGlmICh0YXJnZXQubGVuZ3RoID09PSAxKSBtYXNrZWQgPSB0cnVlO1xuICAgIGVsc2UgYmVsb3cucHVzaCh0YXJnZXQuc2xpY2UoMSkpO1xuICB9XG4gIGNvbnN0IG5hbWVzID0gd2Fsay5yb290RGVjaWRlZCAmJiBkZXB0aCA9PT0gMCA/IHVuZGVmaW5lZCA6IHdhbGsubmFtZXM7XG4gIGlmIChuYW1lcyAhPT0gdW5kZWZpbmVkICYmICFtYXNrZWQpIHtcbiAgICBtYXNrZWQgPVxuICAgICAgbmFtZXMubWFza3Moa2V5KSB8fFxuICAgICAgKG5hbWVzLnBhdGhNYXNrcyAhPT0gdW5kZWZpbmVkICYmIGRvdHRlZCAhPT0gdW5kZWZpbmVkICYmIG5hbWVzLnBhdGhNYXNrcyhgJHtkb3R0ZWR9LiR7a2V5fWApKTtcbiAgICBiZWxvdy5wdXNoKC4uLnRhcmdldHNPZihuYW1lcy5maWVsZHMoa2V5KSkpO1xuICB9XG4gIHJldHVybiB7IG1hc2tlZCwgYmVsb3cgfTtcbn1cblxuLyoqIE9uZSBzdGVwIGRvd24gYSB3YWxrJ3MgcGF0aDogY291bnQgdGhlIHZpc2l0IOKAlCBgZmFsc2VgIG9uY2UgdGhlIHdhbGsgaXMgcGFzdCBpdHMgbGltaXQuICovXG5mdW5jdGlvbiB2aXNpdCh3YWxrOiBXYWxrKTogYm9vbGVhbiB7XG4gIGlmICgtLXdhbGsuYnVkZ2V0ID49IDApIHJldHVybiB0cnVlO1xuICBpZiAoIXdhbGsubGltaXRlZCkge1xuICAgIHdhbGsubGltaXRlZCA9IHRydWU7XG4gICAgd2Fsay5vbkxpbWl0Py4oKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbi8qKlxuICogSXMgYW55dGhpbmcgc2VsZWN0ZWQgb24gc29tZSBQQVRIIHVuZGVyIGBub2RlYD8gUmVhZC1vbmx5OyBhIGN5Y2xlIGVkZ2UgaXNcbiAqIG5vdCBmb2xsb3dlZC4gYGJhY2tgIGlzIHRoZSBzaGFsbG93ZXN0IGFuY2VzdG9yIGEgc2tpcHBlZCBjeWNsZSBlZGdlIGJlbG93XG4gKiByZWFjaGVkIOKAlCBhIGBmYWxzZWAgdGhhdCByZXN0cyBvbiBvbmUgaXMgbm90IHNoYXJlZCAobWVtbykuXG4gKi9cbmZ1bmN0aW9uIHNlbGVjdHNCeVBhdGgoXG4gIG5vZGU6IG9iamVjdCxcbiAgZG90dGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdLFxuICB3YWxrOiBXYWxrLFxuICBhbmNlc3RvcnM6IE1hcDxvYmplY3QsIG51bWJlcj4sXG4gIGRlcHRoOiBudW1iZXIsXG4pOiB7IHNlbGVjdGVkOiBib29sZWFuOyBiYWNrOiBudW1iZXIgfSB7XG4gIC8vIFBhc3QgdGhlIGxpbWl0OiBhc3N1bWUgYSBzZWxlY3Rpb24g4oCUIHRoZSBjb3B5IHNlcnZlcyB0aGUgdW52aXNpdGVkIHJlbWFpbmRlciBhcyB0aGUgcGxhY2Vob2xkZXIuXG4gIGlmICghdmlzaXQod2FsaykpIHJldHVybiB7IHNlbGVjdGVkOiB0cnVlLCBiYWNrOiBJbmZpbml0eSB9O1xuICBpZiAod2Fsay5uYW1lcyA9PT0gdW5kZWZpbmVkICYmIHRhcmdldHMubGVuZ3RoID09PSAwKSByZXR1cm4geyBzZWxlY3RlZDogZmFsc2UsIGJhY2s6IEluZmluaXR5IH07XG4gIGNvbnN0IHNpZyA9IHdhbGsubWVtbyA/IHNpZ25hdHVyZU9mKHRhcmdldHMpIDogJyc7XG4gIGNvbnN0IGtub3duID0gd2Fsay5tZW1vPy5nZXQobm9kZSk/LmdldChgcyR7c2lnfWApO1xuICBpZiAoa25vd24gIT09IHVuZGVmaW5lZCkgcmV0dXJuIHsgc2VsZWN0ZWQ6IGtub3duIGFzIGJvb2xlYW4sIGJhY2s6IEluZmluaXR5IH07XG4gIGFuY2VzdG9ycy5zZXQobm9kZSwgZGVwdGgpO1xuICBsZXQgYmFjayA9IEluZmluaXR5O1xuICBsZXQgc2VsZWN0ZWQgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICBjb25zdCBlZGdlID0gZGVjaWRlRWRnZShrZXksIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgZGVwdGgpO1xuICAgIGlmIChlZGdlLm1hc2tlZCkge1xuICAgICAgc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChjaGlsZCA9PT0gbnVsbCB8fCB0eXBlb2YgY2hpbGQgIT09ICdvYmplY3QnKSBjb250aW51ZTtcbiAgICBjb25zdCBhdCA9IGFuY2VzdG9ycy5nZXQoY2hpbGQpO1xuICAgIGlmIChhdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBiYWNrID0gTWF0aC5taW4oYmFjaywgYXQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IGNoaWxkUGF0aCA9IHdhbGsubmFtZXM/LnBhdGhNYXNrcyA/IChkb3R0ZWQgPT09IHVuZGVmaW5lZCA/IGtleSA6IGAke2RvdHRlZH0uJHtrZXl9YCkgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgYmVsb3cgPSBzZWxlY3RzQnlQYXRoKGNoaWxkLCBjaGlsZFBhdGggPz8ga2V5LCBlZGdlLmJlbG93LCB3YWxrLCBhbmNlc3RvcnMsIGRlcHRoICsgMSk7XG4gICAgYmFjayA9IE1hdGgubWluKGJhY2ssIGJlbG93LmJhY2spO1xuICAgIGlmIChiZWxvdy5zZWxlY3RlZCkge1xuICAgICAgc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGFuY2VzdG9ycy5kZWxldGUobm9kZSk7XG4gIGlmICh3YWxrLm1lbW8gJiYgKHNlbGVjdGVkIHx8IGJhY2sgPj0gZGVwdGgpKSByZW1lbWJlcih3YWxrLm1lbW8sIG5vZGUsIGBzJHtzaWd9YCwgc2VsZWN0ZWQpO1xuICByZXR1cm4geyBzZWxlY3RlZCwgYmFjazogYmFjayA8IGRlcHRoID8gYmFjayA6IEluZmluaXR5IH07XG59XG5cbmZ1bmN0aW9uIHJlbWVtYmVyKG1lbW86IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCB1bmtub3duPj4sIG5vZGU6IG9iamVjdCwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gIGxldCBlbnRyaWVzID0gbWVtby5nZXQobm9kZSk7XG4gIGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIG1lbW8uc2V0KG5vZGUsIChlbnRyaWVzID0gbmV3IE1hcCgpKSk7XG4gIGVudHJpZXMuc2V0KGtleSwgdmFsdWUpO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZWQgY29weSBvZiBgbm9kZWAsIGNvcHktb24td3JpdGUgUEVSIFBBVEguIEV2ZXJ5IGNvbnRhaW5lciBlbnRlcmVkXG4gKiBnZXRzIGl0cyBjb3B5IEJFRk9SRSBpdHMgY2hpbGRyZW4gYXJlIHdhbGtlZCwgc28gYSBjeWNsZSBlZGdlIGlzIHBvaW50ZWQgYXRcbiAqIHRoZSBhbmNlc3RvcidzIGNvcHkg4oCUIG5ldmVyIGJhY2sgYXQgYW4gdW5zY3J1YmJlZCBvcmlnaW5hbDsgYSBjb250YWluZXIgaXNcbiAqIHNlcnZlZCBhcyBpdHNlbGYgd2hlbiBub3RoaW5nIHVuZGVyIGl0IGNoYW5nZWQgYW5kIG5vIGN5Y2xlIHBhc3NlcyB0aHJvdWdoXG4gKiBpdC4gQSBwcnVuZWQgZGVzY2VudCAoYSBiYXJlIGZpZWxkIHNjcnViIG9mIGFuIGFjeWNsaWMgdmFsdWUpIHNraXBzIHN1YnRyZWVzXG4gKiBubyB0YXJnZXQgcmVhY2hlcy4gYGJhY2tgIGlzIHRoZSBzaGFsbG93ZXN0IGFuY2VzdG9yIGEgY3ljbGUgZWRnZSBiZWxvd1xuICogcmVhY2hlZCAoYEluZmluaXR5YDogbm9uZSk7IGEgY29weSB0aGF0IHJlc3RzIG9uIG5vbmUgaXMgc2hhcmVkIChtZW1vKS5cbiAqL1xuZnVuY3Rpb24gY29weUJ5UGF0aChcbiAgbm9kZTogb2JqZWN0LFxuICBkb3R0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10sXG4gIHdhbGs6IFdhbGssXG4gIHBsYWNlaG9sZGVyOiBzdHJpbmcsXG4gIGFuY2VzdG9yczogTWFwPG9iamVjdCwgeyBjb3B5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjsgZGVwdGg6IG51bWJlciB9PixcbiAgZGVwdGg6IG51bWJlcixcbiAgcHJ1bmU6IGJvb2xlYW4sXG4pOiB7IG91dDogdW5rbm93bjsgYmFjazogbnVtYmVyIH0ge1xuICAvLyBQYXN0IHRoZSBsaW1pdDogdGhlIHVudmlzaXRlZCByZW1haW5kZXIgaXMgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlciDigJQgbmV2ZXIgcmF3LlxuICBpZiAoIXZpc2l0KHdhbGspKSByZXR1cm4geyBvdXQ6IHBsYWNlaG9sZGVyLCBiYWNrOiBJbmZpbml0eSB9O1xuICBjb25zdCBzaWcgPSB3YWxrLm1lbW8gPyBgYyR7c2lnbmF0dXJlT2YodGFyZ2V0cyl9YCA6ICcnO1xuICBjb25zdCBrbm93biA9IHdhbGsubWVtbz8uZ2V0KG5vZGUpPy5nZXQoc2lnKTtcbiAgaWYgKGtub3duICE9PSB1bmRlZmluZWQpIHJldHVybiB7IG91dDoga25vd24sIGJhY2s6IEluZmluaXR5IH07XG4gIGNvbnN0IGZyYW1lID0ge1xuICAgIGNvcHk6IChBcnJheS5pc0FycmF5KG5vZGUpID8gbm9kZS5zbGljZSgpIDogeyAuLi5ub2RlIH0pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIGRlcHRoLFxuICB9O1xuICBhbmNlc3RvcnMuc2V0KG5vZGUsIGZyYW1lKTtcbiAgbGV0IGNoYW5nZWQgPSBmYWxzZTtcbiAgbGV0IGJhY2sgPSBJbmZpbml0eTtcbiAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICBjb25zdCBlZGdlID0gZGVjaWRlRWRnZShrZXksIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgZGVwdGgpO1xuICAgIGlmIChlZGdlLm1hc2tlZCkge1xuICAgICAgZnJhbWUuY29weVtrZXldID0gcGxhY2Vob2xkZXI7XG4gICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgY29uc3QgYW5jZXN0b3IgPSBhbmNlc3RvcnMuZ2V0KGNoaWxkKTtcbiAgICBpZiAoYW5jZXN0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZnJhbWUuY29weVtrZXldID0gYW5jZXN0b3IuY29weTtcbiAgICAgIGJhY2sgPSBNYXRoLm1pbihiYWNrLCBhbmNlc3Rvci5kZXB0aCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHBydW5lICYmIGVkZ2UuYmVsb3cubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICBjb25zdCBjaGlsZFBhdGggPSB3YWxrLm5hbWVzPy5wYXRoTWFza3MgPyAoZG90dGVkID09PSB1bmRlZmluZWQgPyBrZXkgOiBgJHtkb3R0ZWR9LiR7a2V5fWApIDoga2V5O1xuICAgIGNvbnN0IGJlbG93ID0gY29weUJ5UGF0aChjaGlsZCwgY2hpbGRQYXRoLCBlZGdlLmJlbG93LCB3YWxrLCBwbGFjZWhvbGRlciwgYW5jZXN0b3JzLCBkZXB0aCArIDEsIHBydW5lKTtcbiAgICBpZiAoYmVsb3cub3V0ICE9PSBjaGlsZCkge1xuICAgICAgZnJhbWUuY29weVtrZXldID0gYmVsb3cub3V0O1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgfVxuICAgIGJhY2sgPSBNYXRoLm1pbihiYWNrLCBiZWxvdy5iYWNrKTtcbiAgfVxuICBhbmNlc3RvcnMuZGVsZXRlKG5vZGUpO1xuICBjb25zdCBvdXQgPSBjaGFuZ2VkIHx8IGJhY2sgPD0gZGVwdGggPyBmcmFtZS5jb3B5IDogbm9kZTtcbiAgaWYgKHdhbGsubWVtbyAmJiBiYWNrID49IGRlcHRoKSByZW1lbWJlcih3YWxrLm1lbW8sIG5vZGUsIHNpZywgb3V0KTtcbiAgcmV0dXJuIHsgb3V0LCBiYWNrOiBiYWNrIDwgZGVwdGggPyBiYWNrIDogSW5maW5pdHkgfTtcbn1cblxuLyoqIERvZXMgYW55IHBhdGggZnJvbSBgcm9vdGAgY29tZSBiYWNrIHRvIGFuIG9iamVjdCBvbiBpdD8gKi9cbmZ1bmN0aW9uIGhhc0N5Y2xlKHJvb3Q6IG9iamVjdCk6IGJvb2xlYW4ge1xuICBjb25zdCBkb25lID0gbmV3IFdlYWtTZXQ8b2JqZWN0PigpO1xuICBjb25zdCBvblBhdGggPSBuZXcgU2V0PG9iamVjdD4oKTtcbiAgY29uc3QgdmlzaXROb2RlID0gKG5vZGU6IG9iamVjdCk6IGJvb2xlYW4gPT4ge1xuICAgIGlmIChvblBhdGguaGFzKG5vZGUpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoZG9uZS5oYXMobm9kZSkpIHJldHVybiBmYWxzZTtcbiAgICBvblBhdGguYWRkKG5vZGUpO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgT2JqZWN0LnZhbHVlcyhub2RlKSkge1xuICAgICAgaWYgKGNoaWxkICE9PSBudWxsICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcgJiYgdmlzaXROb2RlKGNoaWxkKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG9uUGF0aC5kZWxldGUobm9kZSk7XG4gICAgZG9uZS5hZGQobm9kZSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICByZXR1cm4gdmlzaXROb2RlKHJvb3QpO1xufVxuXG4vKipcbiAqIFRoZSBzZXJ2ZWQgZm9ybSBvZiBgcm9vdGAgdW5kZXIgYSB3YWxrOiBgcm9vdGAgaXRzZWxmIHdoZW4gbm8gcGF0aCBzZWxlY3RzXG4gKiBhbnl0aGluZywgZWxzZSBpdHMgY29weS1vbi13cml0ZSBjb3B5IChwYXN0IHRoZSB3YWxrIGxpbWl0LCBpdHMgdW52aXNpdGVkXG4gKiByZW1haW5kZXIgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlcikuIFRocm93cyDigJQgdGhlIGNhbGxlciByZWZ1c2VzIHRvIHNlcnZlXG4gKiDigJQgb24gYW4gZW51bWVyYWJsZSBnZXR0ZXIgdGhhdCB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIHNlcnZlZEJ5UGF0aChcbiAgcm9vdDogb2JqZWN0LFxuICBkb3R0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10sXG4gIHdhbGs6IFdhbGssXG4gIHBsYWNlaG9sZGVyOiBzdHJpbmcsXG4pOiB1bmtub3duIHtcbiAgaWYgKCFzZWxlY3RzQnlQYXRoKHJvb3QsIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgbmV3IE1hcCgpLCAwKS5zZWxlY3RlZCkgcmV0dXJuIHJvb3Q7XG4gIHdhbGsuYnVkZ2V0ID0gd2Fsa0xpbWl0O1xuICAvLyBBIGJhcmUgZmllbGQgc2NydWIgb2YgYW4gYWN5Y2xpYyB2YWx1ZSB3YWxrcyBpdHMgdGFyZ2V0cyBvbmx5OiBubyBjeWNsZSBjYW4gYnJpbmcgYW5cbiAgLy8gdW5zY3J1YmJlZCBvcmlnaW5hbCBiYWNrLiBFdmVyeSBvdGhlciB3YWxrIHZpc2l0cyBldmVyeSBwYXRoIChhIGN5Y2xlIGVkZ2UgYW55d2hlcmVcbiAgLy8gbXVzdCBsYW5kIG9uIGEgc2VydmVkIGNvcHkpLlxuICBjb25zdCBwcnVuZSA9IHdhbGsubmFtZXMgPT09IHVuZGVmaW5lZCAmJiAhaGFzQ3ljbGUocm9vdCk7XG4gIHJldHVybiBjb3B5QnlQYXRoKHJvb3QsIGRvdHRlZCwgdGFyZ2V0cywgd2FsaywgcGxhY2Vob2xkZXIsIG5ldyBNYXAoKSwgMCwgcHJ1bmUpLm91dDtcbn1cblxuLyoqIEEgcGxhaW4gcmVjb3JkIOKAlCB0aGUgb25seSBzaGFwZSBhIG1hcHBlciBpcyBoYW5kZWQgYXMgYSByZWNvcmRpbmcgdmlldyAoYSBjbGFzcyBpbnN0YW5jZSBrZWVwcyBpdHMgcHJvdG90eXBlKS4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5SZWNvcmQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkodmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbiAgcmV0dXJuIHByb3RvID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvID09PSBudWxsO1xufVxuXG4vKiogVGhlIHN0cmljdGVyIG9mIHR3byB2ZXJkaWN0cyBvbiB0aGUgc2FtZSB2YWx1ZTogd2hvbGUgb3ZlciBmaWVsZHMgb3ZlciBjbGVhcjsgZmllbGRzIHVuaXRlLiAqL1xuZnVuY3Rpb24gc3RyaWN0ZXIoYTogUmVkYWN0aW9uVmVyZGljdCB8IHVuZGVmaW5lZCwgYjogUmVkYWN0aW9uVmVyZGljdCk6IFJlZGFjdGlvblZlcmRpY3Qge1xuICBpZiAoYSA9PT0gdW5kZWZpbmVkIHx8IGEua2luZCA9PT0gJ2NsZWFyJyB8fCBiLmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBiO1xuICBpZiAoYS5raW5kID09PSAnd2hvbGUnIHx8IGIua2luZCA9PT0gJ2NsZWFyJykgcmV0dXJuIGE7XG4gIHJldHVybiB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6IGEua2V5LCBwYXRoczogWy4uLm5ldyBTZXQoWy4uLmEucGF0aHMsIC4uLmIucGF0aHNdKV0gfTtcbn1cblxuLyoqXG4gKiBUSEUgVEFJTlQgUlVMRSBhdCBhIHN1YmZsb3cgbWFwcGVyIGJvdW5kYXJ5IChhbiBgaW5wdXRNYXBwZXJgIHNlZWRpbmcgYVxuICogc3ViZmxvdywgYW4gYG91dHB1dE1hcHBlcmAgbWVyZ2luZyBpdCBiYWNrKTogYSBrZXkgdGhlIG1hcHBlciB3cml0ZXNcbiAqIGluaGVyaXRzIHRoZSByZWRhY3Rpb24gb2YgdGhlIFNFTEVDVEVEIHZhbHVlIGl0IGNvcGllZCDigJQgYSBtYXJrIChvclxuICogaW5oZXJpdGVkIGZpZWxkcyksIGJ5IG5hbWUsIGxpa2UgYSBwZXItY2FsbCBgc2V0VmFsdWUoa2V5LCB2YWx1ZSwgdHJ1ZSlgIOKAlFxuICogc28gdGhlIHN1YmZsb3cncyBzZWVkLCBsb2csIG1pcnJvciwgcmVhZHMsIG5hcnJhdGl2ZSBhbmQgcmVzdWx0cywgYW5kIHRoZVxuICogcGFyZW50J3MgbWVyZ2UtYmFjaywgcmV0YWluIHRoZSBjb3B5IGFzIHRoZXkgcmV0YWluIGl0cyBzb3VyY2UuIERlY2lkZWQgYnlcbiAqIHdoaWNoIHZhbHVlcyB0aGUgbWFwcGVyIFJFQUQ6XG4gKlxuICogICAtIFNBTUUgTkFNRSDigJQgYSB2YWx1ZSBwYXNzZWQgb24gdW5kZXIgdGhlIG5hbWUgaXQgd2FzIHJlYWQgdW5kZXIga2VlcHNcbiAqICAgICB0aGF0IG5hbWUncyB2ZXJkaWN0IChgeyBjb3VudDogcC5jb3VudCB9YCwgYHsgLi4ucCB9YCk6IGEgY2xlYXIgdmFsdWVcbiAqICAgICBzdGF5cyBjbGVhciwgd2hlcmV2ZXIgZWxzZSB0aGUgbWFwcGVyIHJlYWQgYSBzZWNyZXQuXG4gKiAgIC0gRVhBQ1Qg4oCUIGFuIG91dHB1dCBPQkpFQ1QgdGhhdCBJUyAoYnkgcmVmZXJlbmNlKSBhIHZhbHVlIHRoZSBtYXBwZXIgcmVhZFxuICogICAgIGluaGVyaXRzIHRoYXQga2V5J3MgdmVyZGljdDogd2hvbGUgc3RheXMgd2hvbGUsIGBmaWVsZHNgIGhhbmQgdGhlaXIgcGF0aHNcbiAqICAgICB0byB0aGUgbmV3IGtleSwgY2xlYXIgc3RheXMgY2xlYXIuIFRoZSByZWNvcmQgdGhlIG1hcHBlciB3YXMgSEFOREVELFxuICogICAgIHBhc3NlZCBvbiB3aG9sZSAoYChwKSA9PiAoeyBjdHg6IHAgfSlgKSwgaGFuZHMgZXZlcnkgc2VsZWN0ZWQga2V5IG9mIGl0XG4gKiAgICAgdG8gdGhlIG5ldyBrZXkgYXMgYSBmaWVsZCAoYGN0eC50b2tlbmApLlxuICogICAtIENPTlNFUlZBVElWRSDigJQgYW55IG90aGVyIG91dHB1dCAoYSBwcmltaXRpdmUgdW5kZXIgYSBuZXcgbmFtZSwgb3IgYW5cbiAqICAgICBvYmplY3QgdGhlIG1hcHBlciBidWlsdCkgaXMgc2VsZWN0ZWQgV0hPTEUgd2hlbiB0aGUgbWFwcGVyIHJlYWQgYVxuICogICAgIHNlbGVjdGVkIHZhbHVlIOKAlCBhIHdob2xlLXNlbGVjdGVkIGtleSwgb3IgYSBzZWxlY3RlZCBGSUVMRCBvZiBhXG4gKiAgICAgYGZpZWxkc2Atc2VsZWN0ZWQgcmVjb3JkIOKAlCBvciB3aGVuIGl0IGVtYmVkcyBhIHNlbGVjdGVkIHJlY29yZCBieVxuICogICAgIHJlZmVyZW5jZTsgdGhlIGxpYnJhcnkgY2Fubm90IHRlbGwgd2hhdCBhIGNvbXB1dGVkIHZhbHVlIGNhcnJpZXMuXG4gKiAgICAgKFZhbHVlcyBhcmUgbmV2ZXIgbWF0Y2hlZCBieSBFUVVBTElUWSBhY3Jvc3MgbmFtZXM6IGFuIGVxdWFsIHByaW1pdGl2ZVxuICogICAgIHdvdWxkIG92ZXItbWF0Y2ggdW5yZWxhdGVkIGtleXMuKVxuICpcbiAqIEhPVyBGQVIgQSBNQVJLIFJFQUNIRVM6IGEgTkFNRSwgcnVuLXdpZGUsIGZyb20gdGhlIG1vbWVudCBpdCBpcyBtYWRlIOKAlCBldmVyeVxuICoga2V5IG9mIHRoYXQgbmFtZSBpbiB0aGUgc3ViZmxvdywgdGhlIHBhcmVudCwgYSBzaWJsaW5nIGFuZCBldmVyeSBsYXRlciBzdGFnZVxuICogaXMgc2VsZWN0ZWQgaW4gd2hhdGV2ZXIgaXMgc2VydmVkLCB1bnRpbCB0aGUga2V5IGlzIGRlbGV0ZWQ7IGEgcGF1c2UgY2Fycmllc1xuICogaXQgdG8gdGhlIHJlc3VtZWQgcnVuIChgRmxvd2NoYXJ0Q2hlY2twb2ludC5yZWRhY3Rpb25NYXJrc2ApLlxuICpcbiAqIEEgYGZpZWxkc2Atc2VsZWN0ZWQgcmVjb3JkIHRoYXQgaG9sZHMgYSBzZWxlY3RlZCBmaWVsZCBpcyBoYW5kZWQgdG8gdGhlXG4gKiBtYXBwZXIgYXMgYSB2aWV3IG9mIGl0cyBvd24sIHNvIHJlYWRpbmcgdGhlIHJlY29yZCAodG8gcGFzcyBpdCBvbiwgb3IgdG9cbiAqIHRlc3QgaXRzIHR5cGUpIGlzIG5vdCByZWFkaW5nIHRoZSBmaWVsZC4gUmVhZGluZyBgcnVuc2AgKHRoZSBuYW1lc3BhY2Ugcm9vdFxuICogZm9yayBjaGlsZHJlbiB3cml0ZSB1bmRlcikgcmVhZHMgZXZlcnkgbmFtZXNwYWNlZCBrZXkuIFJlY29yZGluZyBzdG9wcyB3aGVuXG4gKiB0aGUgbWFwcGVyIHJldHVybnM7IHtAbGluayBpbmhlcml0fSBoYW5kcyBiYWNrIHRoZSBvdXRwdXQgd2l0aCBldmVyeSB2aWV3IGl0XG4gKiByZXR1cm5lZCBzd2FwcGVkIGZvciB0aGUgcmVjb3JkIGJlaGluZCBpdC5cbiAqL1xuZXhwb3J0IGNsYXNzIE1hcHBlclRhaW50IHtcbiAgLyoqIEVhY2ggb2JqZWN0IHRoZSBtYXBwZXIgcmVhZCDihpIgdGhlIHZlcmRpY3Qgb2YgdGhlIGtleSBpdCByZWFkIGl0IHVuZGVyLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHNvdXJjZXMgPSBuZXcgTWFwPG9iamVjdCwgUmVkYWN0aW9uVmVyZGljdD4oKTtcbiAgLyoqIEVhY2gga2V5IHRoZSBtYXBwZXIgcmVhZCDihpIgdGhlIHZhbHVlcyBpdCByZWFkIHVuZGVyIHRoYXQgbmFtZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBieU5hbWUgPSBuZXcgTWFwPHN0cmluZywgdW5rbm93bltdPigpO1xuICAvKiogRWFjaCBgZmllbGRzYCB2aWV3IGhhbmRlZCBvdXQg4oaSIHRoZSByZWNvcmQgYmVoaW5kIGl0IGFuZCBpdHMgdmVyZGljdC4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSB2aWV3cyA9IG5ldyBNYXA8b2JqZWN0LCB7IHJhdzogb2JqZWN0OyB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0IH0+KCk7XG4gIC8qKiBFYWNoIHJlY29yZCB0aGUgbWFwcGVyIHdhcyBoYW5kZWQg4oaSIGFzIGEgdmlldyAocGFzc2VkIG9uIHdob2xlLCBpdCBoYW5kcyBvbiBpdHMgc2VsZWN0ZWQga2V5cykuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcmVjb3JkcyA9IG5ldyBNYXA8b2JqZWN0LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgLyoqIFRoZSBzZWxlY3RlZCB2YWx1ZXMgdGhlIG1hcHBlciByZWFkICh3aG9sZSBrZXlzLCBzZWxlY3RlZCBmaWVsZHMpIOKAlCB3aGF0IGl0IGNvdWxkIHBsYW50IGJ5IHJlZmVyZW5jZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzZWNyZXRSZWFkczogdW5rbm93bltdID0gW107XG4gIHByaXZhdGUgc2VsZWN0ZWRSZWFkID0gZmFsc2U7XG4gIHByaXZhdGUgb3BlbiA9IHRydWU7XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IHJ1bGU6IFJlZGFjdGlvblJ1bGUpIHt9XG5cbiAgLyoqIGB1bmRlZmluZWRgIHdoaWxlIHRoZSBydW4ncyBydWxlIGlzIGluZXJ0IOKAlCBub3RoaW5nIGEgbWFwcGVyIHJlYWRzIGNhbiBiZSBzZWxlY3RlZC4gKi9cbiAgc3RhdGljIG9mKHJ1bGU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQpOiBNYXBwZXJUYWludCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHJ1bGUgIT09IHVuZGVmaW5lZCAmJiAhcnVsZS5pc0luZXJ0KCkgPyBuZXcgTWFwcGVyVGFpbnQocnVsZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJlY29yZCBhIG1hcHBlciBpcyBoYW5kZWQ6IHRoZSBzYW1lIG93biBrZXlzIGFuZCB2YWx1ZXMsIGVhY2ggcmVhZFxuICAgKiByZWNvcmRlZC4gQW4gYWNjZXNzb3IgcGVyIGtleSwgbm90IGEgUHJveHkg4oCUIGEgbWFwcGVyIG1heSBzcHJlYWQsIGNsb25lIG9yXG4gICAqIHNlcmlhbGl6ZSB3aGF0IGl0IGlzIGhhbmRlZC4gQW4gYXNzaWdubWVudCBsYW5kcyBvbiB0aGUgdmlldywgbmV2ZXIgb24gdGhlXG4gICAqIGxpdmUgcmVjb3JkIGJlaGluZCBpdC4gQW55dGhpbmcgYnV0IGEgcGxhaW4gcmVjb3JkIGlzIGhhbmRlZCBvdmVyIGFzIGl0IGlzLlxuICAgKi9cbiAgd2F0Y2g8VD4ocmVjb3JkOiBUKTogVCB7XG4gICAgaWYgKCFpc1BsYWluUmVjb3JkKHJlY29yZCkpIHJldHVybiByZWNvcmQ7XG4gICAgY29uc3QgdmlldyA9IHRoaXMudmlld09mKHJlY29yZCwgKGtleSkgPT4gdGhpcy5zZXJ2ZWQoa2V5LCByZWNvcmRba2V5XSkpO1xuICAgIHRoaXMucmVjb3Jkcy5zZXQodmlldywgcmVjb3JkKTtcbiAgICByZXR1cm4gdmlldyBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtYXBwZXIgcmV0dXJuZWQgYG91dHB1dGA6IGV2ZXJ5IGtleSBpdCB3cm90ZSBpbmhlcml0cyB3aGF0IGl0IGNvcGllZFxuICAgKiAoc2VlIHRoZSBjbGFzcykuIFJldHVybnMgdGhlIG91dHB1dCB0byB1c2Ug4oCUIHRoZSBzYW1lIG9iamVjdCB1bmxlc3MgYSB2aWV3XG4gICAqIGhhZCB0byBiZSBzd2FwcGVkIGJhY2sgZm9yIHRoZSByZWNvcmQgYmVoaW5kIGl0LlxuICAgKi9cbiAgaW5oZXJpdDxUPihvdXRwdXQ6IFQpOiBUIHtcbiAgICB0aGlzLm9wZW4gPSBmYWxzZTtcbiAgICBpZiAob3V0cHV0ID09PSBudWxsIHx8IHR5cGVvZiBvdXRwdXQgIT09ICdvYmplY3QnKSByZXR1cm4gb3V0cHV0O1xuICAgIGxldCBvdXQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgW3RhcmdldCwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG91dHB1dCkpIHtcbiAgICAgIGNvbnN0IGNvcGllZCA9IHRoaXMuY29waWVkVmVyZGljdCh0YXJnZXQsIHZhbHVlKTtcbiAgICAgIGlmIChjb3BpZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFJlYWQgfHwgdGhpcy5lbWJlZHNTZWxlY3RlZCh2YWx1ZSwgbmV3IFdlYWtTZXQoKSkpIHRoaXMucnVsZS5tYXJrKHRhcmdldCk7XG4gICAgICB9IGVsc2UgaWYgKGNvcGllZC5raW5kID09PSAnd2hvbGUnKSB0aGlzLnJ1bGUubWFyayh0YXJnZXQpO1xuICAgICAgZWxzZSBpZiAoY29waWVkLmtpbmQgPT09ICdmaWVsZHMnKSB0aGlzLnJ1bGUuaW5oZXJpdEZpZWxkcyh0YXJnZXQsIGNvcGllZC5wYXRocyk7XG4gICAgICBjb25zdCByYXcgPSB0aGlzLmJlaGluZCh2YWx1ZSk7XG4gICAgICAvLyBBbiBvYmplY3QgcGFzc2VkIG9uIEJZIFJFRkVSRU5DRSBtYXkgY2Fycnkgd2hhdCB0aGUgbWFwcGVyIHBsYW50ZWQgaW4gaXRcbiAgICAgIC8vIChgT2JqZWN0LmFzc2lnbihwLnJlcXVlc3QsIHsgYXV0aDogcC50b2tlbiB9KWAsIGBwLmxpc3QucHVzaChwLnRva2VuKWApOlxuICAgICAgLy8gZWFjaCBwbGFjZSBpdCBob2xkcyBhIHNlbGVjdGVkIHZhbHVlIHRoZSBtYXBwZXIgcmVhZCBpcyBhIGZpZWxkIG9mIHRoZSBuZXcga2V5LlxuICAgICAgaWYgKGNvcGllZCAhPT0gdW5kZWZpbmVkICYmIGNvcGllZC5raW5kICE9PSAnd2hvbGUnICYmIHJhdyAhPT0gbnVsbCAmJiB0eXBlb2YgcmF3ID09PSAnb2JqZWN0Jykge1xuICAgICAgICBjb25zdCBwbGFudGVkID0gdGhpcy5wbGFudGVkUGF0aHMocmF3KTtcbiAgICAgICAgaWYgKHBsYW50ZWQubGVuZ3RoID4gMCkgdGhpcy5ydWxlLmluaGVyaXRGaWVsZHModGFyZ2V0LCBwbGFudGVkKTtcbiAgICAgIH1cbiAgICAgIGlmIChyYXcgIT09IHZhbHVlKSB7XG4gICAgICAgIG91dCA/Pz0gKEFycmF5LmlzQXJyYXkob3V0cHV0KSA/IFsuLi5vdXRwdXRdIDogeyAuLi5vdXRwdXQgfSkgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgIG91dFt0YXJnZXRdID0gcmF3O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gKG91dCA/PyBvdXRwdXQpIGFzIFQ7XG4gIH1cblxuICAvKiogV2hhdCBvbmUgcmVjb3JkZWQgcmVhZCBoYW5kcyB0aGUgbWFwcGVyIChzZWUgdGhlIGNsYXNzKS4gKi9cbiAgcHJpdmF0ZSBzZXJ2ZWQoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKCF0aGlzLm9wZW4pIHJldHVybiB2YWx1ZTtcbiAgICBjb25zdCByZWFkID0gdGhpcy5ieU5hbWUuZ2V0KGtleSk7XG4gICAgaWYgKHJlYWQgPT09IHVuZGVmaW5lZCkgdGhpcy5ieU5hbWUuc2V0KGtleSwgW3ZhbHVlXSk7XG4gICAgZWxzZSByZWFkLnB1c2godmFsdWUpO1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLnJ1bGUudmVyZGljdE9mUmVhZChrZXksIHZhbHVlKTtcbiAgICAvLyBBbiBhYnNlbnQga2V5IGNhcnJpZXMgbm8gc2VjcmV0OyBuZWl0aGVyIGRvZXMgYSB2YWx1ZSB3aXRoIG5vIGZpZWxkcyAoYSBzY2FsYXIpIG9yIG5vbmUgb2ZcbiAgICAvLyBpdHMgc2VsZWN0ZWQgb25lcyDigJQgc3RhdGUgcmV0YWlucyB0aG9zZSBhcyB0aGV5IGFyZSB0b28uXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiB2YWx1ZTtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykge1xuICAgICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgIVJlZGFjdGlvblJ1bGUuaG9sZHNQYXRocyh2YWx1ZSwgdmVyZGljdC5wYXRocykpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVtZW1iZXIodmFsdWUsIHZlcmRpY3QpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUGxhaW5SZWNvcmQodmFsdWUpKSByZXR1cm4gdGhpcy5maWVsZHNWaWV3KHZhbHVlLCB2ZXJkaWN0KTtcbiAgICB9XG4gICAgaWYgKHZlcmRpY3Qua2luZCAhPT0gJ2NsZWFyJykge1xuICAgICAgdGhpcy5zZWxlY3RlZFJlYWQgPSB0cnVlO1xuICAgICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgdGhpcy5zZWNyZXRSZWFkcy5wdXNoKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVtZW1iZXIodmFsdWUsIHZlcmRpY3QpO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1lbWJlcih2YWx1ZTogdW5rbm93biwgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCk6IHVua25vd24ge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICB0aGlzLnNvdXJjZXMuc2V0KHZhbHVlLCBzdHJpY3Rlcih0aGlzLnNvdXJjZXMuZ2V0KHZhbHVlKSwgdmVyZGljdCkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKiogQSBgZmllbGRzYC1zZWxlY3RlZCByZWNvcmQ6IHJlYWRpbmcgb25lIG9mIGl0cyBzZWxlY3RlZCBmaWVsZHMgKG9yIGEgcGF0aCdzIGZpcnN0IHNlZ21lbnQpIGlzIGEgc2VsZWN0ZWQgcmVhZC4gKi9cbiAgcHJpdmF0ZSBmaWVsZHNWaWV3KHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QgJiB7IGtpbmQ6ICdmaWVsZHMnIH0pOiBvYmplY3Qge1xuICAgIGNvbnN0IHNlbGVjdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHZlcmRpY3QucGF0aHMpIHNlbGVjdGVkLmFkZChwYXRoKS5hZGQocGF0aC5zcGxpdCgnLicpWzBdKTtcbiAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3T2YocmVjb3JkLCAoa2V5KSA9PiB7XG4gICAgICBpZiAodGhpcy5vcGVuICYmIHNlbGVjdGVkLmhhcyhrZXkpKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRSZWFkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zZWNyZXRSZWFkcy5wdXNoKHJlY29yZFtrZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZWNvcmRba2V5XTtcbiAgICB9KTtcbiAgICB0aGlzLnZpZXdzLnNldCh2aWV3LCB7IHJhdzogcmVjb3JkLCB2ZXJkaWN0IH0pO1xuICAgIHJldHVybiB2aWV3O1xuICB9XG5cbiAgcHJpdmF0ZSB2aWV3T2YocmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiwgcmVhZDogKGtleTogc3RyaW5nKSA9PiB1bmtub3duKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICAgIGNvbnN0IHZpZXc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge307XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVjb3JkKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHZpZXcsIGtleSwge1xuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgIGdldDogKCkgPT4gcmVhZChrZXkpLFxuICAgICAgICBzZXQ6ICh2YWx1ZTogdW5rbm93bikgPT4ge1xuICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2aWV3LCBrZXksIHsgdmFsdWUsIHdyaXRhYmxlOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXc7XG4gIH1cblxuICAvKiogVGhlIHJlY29yZCBiZWhpbmQgYSB2aWV3IHRoZSBtYXBwZXIgcmV0dXJuZWQ7IGFueSBvdGhlciB2YWx1ZSBhcyBpdCBpcy4gKi9cbiAgcHJpdmF0ZSBiZWhpbmQodmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIHZhbHVlO1xuICAgIHJldHVybiB0aGlzLnZpZXdzLmdldCh2YWx1ZSk/LnJhdyA/PyB0aGlzLnJlY29yZHMuZ2V0KHZhbHVlKSA/PyB2YWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdmVyZGljdCBgdGFyZ2V0YCBpbmhlcml0cyBmcm9tIGB2YWx1ZWAg4oCUIGB1bmRlZmluZWRgIHdoZW4gaXQgaXNcbiAgICogbmVpdGhlciBhIHZhbHVlIHRoZSBtYXBwZXIgcmVhZCBub3Igb25lIHBhc3NlZCB1bmRlciBpdHMgb3duIG5hbWUuXG4gICAqL1xuICBwcml2YXRlIGNvcGllZFZlcmRpY3QodGFyZ2V0OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogUmVkYWN0aW9uVmVyZGljdCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdzLmdldCh2YWx1ZSk7XG4gICAgICBpZiAodmlldykgcmV0dXJuIHZpZXcudmVyZGljdDtcbiAgICAgIGNvbnN0IHJlY29yZCA9IHRoaXMucmVjb3Jkcy5nZXQodmFsdWUpO1xuICAgICAgaWYgKHJlY29yZCkgcmV0dXJuIHRoaXMuc2VsZWN0ZWRGaWVsZHNPZihyZWNvcmQpO1xuICAgICAgY29uc3Qga25vd24gPSB0aGlzLnNvdXJjZXMuZ2V0KHZhbHVlKTtcbiAgICAgIGlmIChrbm93bikgcmV0dXJuIGtub3duO1xuICAgIH1cbiAgICBjb25zdCByZWFkID0gdGhpcy5ieU5hbWUuZ2V0KHRhcmdldCk7XG4gICAgcmV0dXJuIHJlYWQ/LnNvbWUoKHYpID0+IE9iamVjdC5pcyh2LCB2YWx1ZSkpID8gdGhpcy5ydWxlLnZlcmRpY3RPZlJlYWQodGFyZ2V0LCB2YWx1ZSkgOiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogQSB3aG9sZSByZWNvcmQncyBzZWxlY3RlZCBrZXlzLCBhcyBmaWVsZHMgb2Ygd2hhdGV2ZXIga2V5IGl0IGlzIHBhc3NlZCBvbiB1bmRlci4gKi9cbiAgcHJpdmF0ZSBzZWxlY3RlZEZpZWxkc09mKHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhyZWNvcmQpKSB7XG4gICAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5ydWxlLnZlcmRpY3RPZlJlYWQoa2V5LCByZWNvcmRba2V5XSk7XG4gICAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSBwYXRocy5wdXNoKGtleSk7XG4gICAgICBlbHNlIGlmICh2ZXJkaWN0LmtpbmQgPT09ICdmaWVsZHMnKSBmb3IgKGNvbnN0IHBhdGggb2YgdmVyZGljdC5wYXRocykgcGF0aHMucHVzaChgJHtrZXl9LiR7cGF0aH1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhzLmxlbmd0aCA9PT0gMCA/IENMRUFSIDogeyBraW5kOiAnZmllbGRzJywga2V5OiAnJywgcGF0aHMgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVyZSBgcm9vdGAgKGFuIG9iamVjdCB0aGUgbWFwcGVyIHBhc3NlZCBvbiBieSByZWZlcmVuY2UpIGhvbGRzIG9uZSBvZiB0aGVcbiAgICogc2VsZWN0ZWQgUFJJTUlUSVZFUyBpdCByZWFkIOKAlCBtYXRjaGVkIGJ5IHZhbHVlLCBvbmx5IGFnYWluc3Qgd2hhdCB0aGlzXG4gICAqIG1hcHBlciByZWFkIGFuZCBvbmx5IGluc2lkZSB3aGF0IGl0IHBhc3NlZCBvbiwgc28gb3Zlci1tYXRjaGluZyBhbiBlcXVhbFxuICAgKiB2YWx1ZSBpcyB0aGUgc2FmZSBzaWRlLiBPbmUgcmVsYXRpdmUgcGF0aCBwZXIgcGxhY2UsIGEgc2hhcmVkIG9iamVjdCBhdFxuICAgKiBlYWNoIG9mIGl0cyBwYXRoczsgYSBjeWNsZSBlZGdlIGlzIG5vdCBmb2xsb3dlZC5cbiAgICovXG4gIHByaXZhdGUgcGxhbnRlZFBhdGhzKHJvb3Q6IG9iamVjdCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzZWNyZXRzID0gbmV3IFNldDx1bmtub3duPigpO1xuICAgIGNvbnN0IGNvbGxlY3QgPSAodmFsdWU6IHVua25vd24sIHNlZW46IFNldDxvYmplY3Q+KTogdm9pZCA9PiB7XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpIHNlY3JldHMuYWRkKHZhbHVlKTtcbiAgICAgIGVsc2UgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIXNlZW4uaGFzKHZhbHVlKSkge1xuICAgICAgICBzZWVuLmFkZCh2YWx1ZSk7XG4gICAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIGNvbGxlY3QoY2hpbGQsIHNlZW4pO1xuICAgICAgfVxuICAgIH07XG4gICAgZm9yIChjb25zdCB2YWx1ZSBvZiB0aGlzLnNlY3JldFJlYWRzKSBjb2xsZWN0KHZhbHVlLCBuZXcgU2V0KCkpO1xuICAgIGlmIChzZWNyZXRzLnNpemUgPT09IDApIHJldHVybiBbXTtcbiAgICBjb25zdCBtZW1vID0gbmV3IE1hcDxvYmplY3QsIHN0cmluZ1tdPigpO1xuICAgIGNvbnN0IG9uUGF0aCA9IG5ldyBTZXQ8b2JqZWN0PigpO1xuICAgIGNvbnN0IGluc2lkZSA9IChub2RlOiBvYmplY3QpOiBzdHJpbmdbXSA9PiB7XG4gICAgICBjb25zdCBrbm93biA9IG1lbW8uZ2V0KG5vZGUpO1xuICAgICAgaWYgKGtub3duICE9PSB1bmRlZmluZWQpIHJldHVybiBrbm93bjtcbiAgICAgIGlmIChvblBhdGguaGFzKG5vZGUpKSByZXR1cm4gW107XG4gICAgICBvblBhdGguYWRkKG5vZGUpO1xuICAgICAgY29uc3QgZm91bmQ6IHN0cmluZ1tdID0gW107XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhub2RlKSkge1xuICAgICAgICBpZiAoY2hpbGQgIT09IG51bGwgJiYgdHlwZW9mIGNoaWxkID09PSAnb2JqZWN0JykgZm9yIChjb25zdCBzdWIgb2YgaW5zaWRlKGNoaWxkKSkgZm91bmQucHVzaChgJHtrZXl9LiR7c3VifWApO1xuICAgICAgICBlbHNlIGlmIChzZWNyZXRzLmhhcyhjaGlsZCkpIGZvdW5kLnB1c2goa2V5KTtcbiAgICAgIH1cbiAgICAgIG9uUGF0aC5kZWxldGUobm9kZSk7XG4gICAgICBtZW1vLnNldChub2RlLCBmb3VuZCk7XG4gICAgICByZXR1cm4gZm91bmQ7XG4gICAgfTtcbiAgICByZXR1cm4gaW5zaWRlKHJvb3QpO1xuICB9XG5cbiAgLyoqIERvZXMgYSB2YWx1ZSB0aGUgbWFwcGVyIEJVSUxUIGVtYmVkLCBieSByZWZlcmVuY2UsIGEgc2VsZWN0ZWQgcmVjb3JkIGl0IHJlYWQgb3Igd2FzIGhhbmRlZD8gKi9cbiAgcHJpdmF0ZSBlbWJlZHNTZWxlY3RlZCh2YWx1ZTogdW5rbm93biwgc2VlbjogV2Vha1NldDxvYmplY3Q+KTogYm9vbGVhbiB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcgfHwgc2Vlbi5oYXModmFsdWUpKSByZXR1cm4gZmFsc2U7XG4gICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgIGlmICh0aGlzLnZpZXdzLmhhcyh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHJlY29yZCA9IHRoaXMucmVjb3Jkcy5nZXQodmFsdWUpO1xuICAgIGlmIChyZWNvcmQpIHJldHVybiB0aGlzLnNlbGVjdGVkRmllbGRzT2YocmVjb3JkKS5raW5kICE9PSAnY2xlYXInO1xuICAgIGNvbnN0IGtub3duID0gdGhpcy5zb3VyY2VzLmdldCh2YWx1ZSk7XG4gICAgaWYgKGtub3duICE9PSB1bmRlZmluZWQgJiYga25vd24ua2luZCAhPT0gJ2NsZWFyJykgcmV0dXJuIHRydWU7XG4gICAgZm9yIChjb25zdCBjaGlsZCBvZiBPYmplY3QudmFsdWVzKHZhbHVlKSkgaWYgKHRoaXMuZW1iZWRzU2VsZWN0ZWQoY2hpbGQsIHNlZW4pKSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
|
|
1421
|
+
/**
|
|
1422
|
+
* Masked thrown values → their served form. An object (an Error, a thrown record) is held WEAKLY: a run whose calls
|
|
1423
|
+
* fail thousands of times (`scope.$call`, P2) must not keep every thrown value alive for the run's life. A thrown
|
|
1424
|
+
* scalar (a string, a number) is matched by value, so it is held by value. `any` gates the serving walk: it says a
|
|
1425
|
+
* value was ever masked, not that one is still alive (a false positive costs one walk, never a leak).
|
|
1426
|
+
*/
|
|
1427
|
+
class MaskedErrors {
|
|
1428
|
+
objects = new WeakMap();
|
|
1429
|
+
scalars = new Map();
|
|
1430
|
+
/** Whether anything was ever masked. */
|
|
1431
|
+
any = false;
|
|
1432
|
+
get(value) {
|
|
1433
|
+
return isWeakKey(value) ? this.objects.get(value) : this.scalars.get(value);
|
|
1434
|
+
}
|
|
1435
|
+
/** Whether `value` was served masked (and, for an object, is still alive) — the `Map` reading consumers rely on. */
|
|
1436
|
+
has(value) {
|
|
1437
|
+
return isWeakKey(value) ? this.objects.has(value) : this.scalars.has(value);
|
|
1438
|
+
}
|
|
1439
|
+
set(value, info) {
|
|
1440
|
+
this.any = true;
|
|
1441
|
+
if (isWeakKey(value))
|
|
1442
|
+
this.objects.set(value, info);
|
|
1443
|
+
else
|
|
1444
|
+
this.scalars.set(value, info);
|
|
1445
|
+
}
|
|
1446
|
+
}
|
|
1447
|
+
function isWeakKey(value) {
|
|
1448
|
+
return (typeof value === 'object' && value !== null) || typeof value === 'function';
|
|
1449
|
+
}
|
|
1450
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9tZW1vcnkvcmVkYWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMERHO0FBRUgsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRzVDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFMUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXRFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUVoRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsWUFBWSxDQUFDO0FBMkU5QyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQXFCLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFXLENBQUMsQ0FBQztBQUVqRjs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBQXVCLEVBQUUsR0FBVztJQUM1RCxPQUFPLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzFELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLG1CQUFtQixHQUFHLEdBQUcsQ0FBQztBQUVoQzs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxjQUFjLENBQUMsTUFBNEMsRUFBRSxHQUFXO0lBQy9FLE9BQU8sTUFBTSxLQUFLLFNBQVMsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMs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QUFLLEtBQUssSUFBSSxDQUFDLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxDQUFDO0FBQ3RGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIHJlZGFjdGlvbi50cyDigJQgVGhlIE9ORSBvd25lciBvZiB3aGF0IGEgcmVkYWN0aW9uIHBvbGljeSBzYXlzIGFib3V0IGEgdmFsdWUuXG4gKlxuICogVEhFIExBVyAob3duZXIgcnVsaW5nIChhKSkuIEEgcmVkYWN0aW9uIHBvbGljeSBjb3ZlcnMgRVZFUllUSElORyB0aGUgbGlicmFyeVxuICogcmV0YWlucyBvciBzZXJ2ZXMg4oCUIHRoZSBjb21taXQgbG9nIChib3RoIGVuY29kaW5ncyksIHRoZSByZWRhY3RlZCBtaXJyb3IsXG4gKiB0cmFja2VkIHJlYWRzL3dyaXRlcywgZXZlcnkgcmVjb3JkZXIgZXZlbnQgKGlubGluZSBhbmQgZGVmZXJyZWQpIGFuZCB0aGVcbiAqIHJlY29yZGVyIHJvd3MgYnVpbHQgZnJvbSB0aGVtLCB0aGUgbmFycmF0aXZlLCBzbmFwc2hvdHMsIGRpYWdub3N0aWNzLCBwYXVzZVxuICogcGF5bG9hZHMsIGJvdW5kYXJ5IHJlY29yZHMgYW5kIGxvZyBsaW5lcyDigJQgYW5kIE5FVkVSIHRoZSBsaXZlIGhlYXAgb3IgdGhlXG4gKiByZXN1bWUgY2hlY2twb2ludC4gVHdvIHZhbHVlcyBhcmUgdGhlIGNhbGxlcidzIG93biBhbmQgc3RheSByZWFsOiB0aGVcbiAqIGBydW4oKWAgcmVqZWN0aW9uICh0aGUgdGhyb3duIHZhbHVlIGl0c2VsZikgYW5kIHRoZSBsaXZlIGZvcmsgcmVzdWx0LlxuICpcbiAqIEEgcG9saWN5IHNlbGVjdHMgYnkgTkFNRSDigJQgYSBrZXksIGEgZG90dGVkIHBhdGgsIGEgZmllbGQg4oCUIG5ldmVyIGJ5XG4gKiBzY2FubmluZyBjb250ZW50LiBXaGF0IGNhcnJpZXMgYSBuYW1lOlxuICogICAtIHN0YXRlIOKAlCBpdHMgdXNlci1sZXZlbCBwYXRoICh7QGxpbmsgUmVkYWN0aW9uUnVsZS52ZXJkaWN0fSk7XG4gKiAgIC0gYSByZWNvcmQgaGFuZGVkIG91dCB3aG9sZSDigJQgcm9vdCBpbnB1dC9vdXRwdXQsIGEgc3ViZmxvdydzIG1hcHBlZCBzZWVkXG4gKiAgICAgYW5kIGV4aXQgc3RhdGUsIGEgcGF1c2UgcGF5bG9hZCwgYSB0aHJvd24gdmFsdWUg4oCUIGl0cyBrZXlzIGF0IGV2ZXJ5XG4gKiAgICAgZGVwdGggKHtAbGluayBSZWRhY3Rpb25SdWxlLnJldGFpbkJvdW5kYXJ5fSk7XG4gKiAgIC0gYSBkaWFnbm9zdGljIGVudHJ5IOKAlCBgJGRlYnVnYC9gJGVycm9yYC9gJG1ldHJpY2AvYCRldmFsYC9gJGxvZ2AgYW5kIHRoZVxuICogICAgIGVuZ2luZSdzIG93biDigJQgdGhlIHJlY29yZCBgeyBbbmFtZV06IHZhbHVlIH1gOiBpdHMgbmFtZSBJUyBhIHN0YXRlIGtleVxuICogICAgICh7QGxpbmsgUmVkYWN0aW9uUnVsZS5yZXRhaW5EaWFnbm9zdGljfSkuIGBwb2xpY3kuZGlhZ25vc3RpY3NgIGFkZHNcbiAqICAgICBkaWFnbm9zdGljLW9ubHkgc2VsZWN0b3JzIG9uIHRvcDsgZmxvdy1tZXNzYWdlIHRleHQgaGFzIG5vIG5hbWUgb2YgaXRzXG4gKiAgICAgb3duLCBzbyBvbmx5IHRoZXkgc2VsZWN0IGl0O1xuICogICAtIGEgc3ViZmxvdyBtYXBwZXIncyBjb3B5IOKAlCBhIGtleSBhbiBgaW5wdXRNYXBwZXJgL2BvdXRwdXRNYXBwZXJgIChvciBhXG4gKiAgICAgYHBhcmFsbGVsRm9yRWFjaGAgaXRlbXMgc2VsZWN0b3IpIHdyb3RlIGluaGVyaXRzIHRoZSByZWRhY3Rpb24gb2YgdGhlXG4gKiAgICAgc2VsZWN0ZWQgdmFsdWUgaXQgY29waWVkICh7QGxpbmsgTWFwcGVyVGFpbnR9KS5cbiAqIEEgbWFyayBpcyBhIE5BTUUsIHJ1bi13aWRlLCB1bnRpbCB0aGUga2V5IGlzIGRlbGV0ZWQ7IGEgcGF1c2UgY2FycmllcyB0aGVcbiAqIG1hcmtzIOKAlCBuYW1lcyBvbmx5IOKAlCB0byB0aGUgcmVzdW1lZCBydW4gKHtAbGluayBSZWRhY3Rpb25SdWxlLm1hcmtzRm9yQ2hlY2twb2ludH0pLlxuICogQSB2YWx1ZSB3aXRoIG5vIG5hbWUg4oCUIGEgc2NhbGFyIHJvb3QgaW5wdXQvb3V0cHV0IG9yIHBhdXNlIHBheWxvYWQsIGZyZWVcbiAqIGVycm9yIHRleHQg4oCUIGlzIHNlbGVjdGVkIGJ5IG5vdGhpbmcuIGBlbWl0UGF0dGVybnNgIGlzIHRoZSBvbmUgc2VwYXJhdGVcbiAqIHNjcnViOiBhIGAkZW1pdGAgcGF5bG9hZCBpcyBzZWxlY3RlZCBieSBpdHMgZXZlbnQgbmFtZS5cbiAqXG4gKiBIT1cgT05FIE9XTkVSIEtFRVBTIElULiBFdmVyeSBzdGFnZWQgd3JpdGUgYW5kIGV2ZXJ5IHRyYWNrZWQgcmVhZCBwYXNzZXNcbiAqIHRocm91Z2ggYFN0YWdlQ29udGV4dGAsIHNvIGBTdGFnZUNvbnRleHRgIGFza3MgVEhJUyBydWxlIOKAlCBub3QgdGhlIGNhbGxlciDigJRcbiAqIHdoYXQgdGhlIHBvbGljeSBzYXlzIGFib3V0IHRoZSBwYXRoIGl0IGlzIGFib3V0IHRvIHJldGFpbi4gQSBgU2NvcGVGYWNhZGVgXG4gKiB3cml0ZSwgYSBzdWJmbG93IGBpbnB1dE1hcHBlcmAgc2VlZCwgYW4gYG91dHB1dE1hcHBlcmAgbWVyZ2UtYmFjayBhbmQgYVxuICogcmVzdW1lIHJlLXNlZWQgYXJlIHRoZW4gYWxsIHRoZSBzYW1lIGNhc2U6IHRoZSBmdW5uZWwgZGVjaWRlcywgdGhlIGNhbGxlclxuICogY2Fubm90IGZvcmdldCB0by4gVGhlIGZhY2FkZSB1c2VzIHRoZSBzYW1lIHJ1bGUgZm9yIHRoZSB2YWx1ZXMgaXQgaGFuZHMgdG9cbiAqIHJlY29yZGVyczsgYFN1YmZsb3dFeGVjdXRvcmAgdXNlcyBpdCBmb3IgdGhlIG5hcnJhdGVkIHNlZWQgYW5kXG4gKiBgRmxvd2NoYXJ0VHJhdmVyc2VyLmV4ZWN1dGVgIGZvciByb290IGlucHV0L291dHB1dCBiZWZvcmUgZGlzcGF0Y2guIEJlZm9yZSA5LjE5LjBcbiAqIHRoZSBmYWNhZGUgaGVsZCB0aGUgdmVyZGljdCBhbG9uZSwgYW5kIGV2ZXJ5IHBhdGggdGhhdCB3cm90ZSBvciByZWFkIHBhc3RcbiAqIHRoZSBmYWNhZGUg4oCUIGZpdmUgb2YgdGhlbSDigJQgcmV0YWluZWQgcGxhaW50ZXh0IHVuZGVyIGEgcG9saWN5LlxuICpcbiAqIE9ORSBWRVJESUNUIE9XTkVSLCBPTkUgRU5DT0RJTkcgT1dORVIgKEM0KS4gVGhpcyBmaWxlIERFQ0lERVMg4oCUIHRoZSBydWxlLFxuICogYW5kIGZvciBhIHN0YWdlZCB3cml0ZSB7QGxpbmsgZGVjaWRlV3JpdGV9ICh0aGUgdmVyZGljdCksXG4gKiB7QGxpbmsgaW5oZXJpdEJ5SWRlbnRpdHl9IGFuZCB7QGxpbmsgbWFya1N0YWdlZFdyaXRlfSAodGhlIG1hcmtzKSDigJQgYW5kIGlzXG4gKiB0aGUgZW5naW5lJ3MgKEw0LCBiZXNpZGUgdGhlIHJ1biBwb2xpY3kgdGhhdCBjYXJyaWVzIHRoZSBydWxlKS4gVGhlIEJZVEVTIG9mIGFcbiAqIHZlcmRpY3QgYXJlIHRoZSByZWNvcmQnczogdGhlIGZyYW1lIGhhbmRzIGl0cyBzY3J1YiAoYHdob2xlYCwgb3IgdGhlXG4gKiBgZmllbGRzYCBpbnNpZGUgdGhlIHZhbHVlIOKAlCB7QGxpbmsgc2NydWJPZn0pIHRvIGBSZWNvcmRGcmFtZSDCtyB3cml0ZWAsIGFuZFxuICogdGhlIHJlY29yZCdzIG93biBzY3J1YiAoYG1lbW9yeS9zY3J1Yi50c2AsIEwyKSB3cml0ZXMgdGhlIGxvZydzIHBsYWNlaG9sZGVyXG4gKiBhdCBjb21taXQuIEJlZm9yZSBDNCB0aGUgc2NydWIgbGl2ZWQgaGVyZSB0b28sIHNvIHRoZSByZWNvcmQgaW1wb3J0ZWQgdGhlXG4gKiBlbmdpbmUncyBwb2xpY3kgbW9kdWxlIHRvIHdyaXRlIGEgc3RyaW5nLlxuICpcbiAqIFRXTyBQTEFDRUhPTERFUlMsIEJPVEggSElTVE9SSUNBTCwgT05FIFBFUiBPV05FUjogdGhlIGNvbW1pdCBsb2cgYW5kIHRoZVxuICogbWlycm9yIGNhcnJ5IGAnUkVEQUNURUQnYCAoYExPR19QTEFDRUhPTERFUmAsIGBtZW1vcnkvcGxhY2Vob2xkZXJzLnRzYCDigJQgYVxuICogcmVjb3JkIGJ5dGUsIHdyaXR0ZW4gYnkgYG1lbW9yeS9zY3J1Yi50c2ApOyBldmVyeSBzY29wZS10aWVyIHZpZXcg4oCUIHNjb3BlXG4gKiByZWNvcmRlciBldmVudHMsIGBzdGFnZVJlYWRzYC9gc3RhZ2VXcml0ZXNgLCBuYXJyYXRpdmUg4oCUIGNhcnJpZXNcbiAqIGAnW1JFREFDVEVEXSdgICh7QGxpbmsgU0NPUEVfUExBQ0VIT0xERVJ9LCBiZWxvdyDigJQgdGhlIHZlcmRpY3QncyBvd24pLlxuICogTmVpdGhlciBzdHJpbmcgY2hhbmdlZCBpbiA5LjE5LjAgb3Igc2luY2U7IGVhY2ggaXMgc3BlbGxlZCBvbmNlIGluIGBzcmMvYC5cbiAqL1xuXG5pbXBvcnQgeyBuYXRpdmVIYXMgfSBmcm9tICdmb290dHJhY2UvcGF0aHMnO1xuaW1wb3J0IHR5cGUgeyBXcml0ZVNjcnViLCBXcml0ZVZlcmIgfSBmcm9tICdmb290dHJhY2Uvd3JpdGUnO1xuXG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9kZXZNb2RlLmpzJztcbmltcG9ydCB0eXBlIHsgU3RydWN0dXJlZEVycm9ySW5mbyB9IGZyb20gJy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHsgZXh0cmFjdEVycm9ySW5mbywgdGhyb3duVGV4dCB9IGZyb20gJy4uL2Vycm9ycy9lcnJvckluZm8uanMnO1xuaW1wb3J0IHR5cGUgeyBSZWRhY3Rpb25NYXJrcyB9IGZyb20gJy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB7IFJVTl9OQU1FU1BBQ0UgfSBmcm9tICcuL3J1bkFkZHJlc3MuanMnO1xuXG4vKipcbiAqIFdoYXQgdGhlIFNDT1BFIENIQU5ORUwgY2FycmllcyB3aGVyZSBhIHZhbHVlIHdhcyBzY3J1YmJlZDogYSBzY29wZSByZWNvcmRlcidzIHJlYWQsIHdyaXRlIGFuZFxuICogY29tbWl0IGV2ZW50cywgdGhlIGBzdGFnZVJlYWRzYCAvIGBzdGFnZVdyaXRlc2AgcmV0ZW50aW9uLCB0aGUgbmFycmF0aXZlLCBhIGRlY2lzaW9uJ3MgZXZpZGVuY2UsIGFuXG4gKiBlbWl0IHBheWxvYWQgbWF0Y2hlZCBieSBgZW1pdFBhdHRlcm5zYCwgYSBwYXVzZSBwYXlsb2FkJ3Mgc2VydmVkIGZvcm0gYW5kIGEgc3ViZmxvdydzIG5hcnJhdGVkIHNlZWRcbiAqIChgb25TdWJmbG93RW50cnlgKSDigJQgZXZlcnkgdmFsdWUgdGhpcyB2ZXJkaWN0IHNlcnZlcywgdW5sZXNzIGl0cyBjYWxsZXIgcGFzc2VzIHRoZSBsb2cncyBzdHJpbmcuXG4gKlxuICogSXRzIHR3aW4gaXMgdGhlIFJFQ09SRCdzIGBMT0dfUExBQ0VIT0xERVJgIChgJ1JFREFDVEVEJ2AsIGBtZW1vcnkvcGxhY2Vob2xkZXJzLnRzYCk6IHRoZSBjb21taXQgbG9nLFxuICogdGhlIHJlZGFjdGVkIG1pcnJvciBhbmQgZXZlcnl0aGluZyBzZXJ2ZWQgZnJvbSB0aGVtLiBTbyBOT1QgZXZlcnkgcmVjb3JkZXIgZXZlbnQgY2FycmllcyB0aGlzIG9uZTpcbiAqIGBvblN1YmZsb3dFeGl0Lm91dHB1dFN0YXRlYCBzZXJ2ZXMgdGhlIHN1YmZsb3cncyByZWRhY3RlZCBtaXJyb3Igd2hlbiBhIHBvbGljeSBrZWVwcyBvbmUsIGFuZCBzb1xuICogY2FycmllcyB0aGUgbG9nJ3Mgc3RyaW5nICh3aXRob3V0IGEgbWlycm9yIOKAlCBwZXItY2FsbCBtYXJrcyBhbG9uZSDigJQgaXQgaXMgdGhlIHN1YmZsb3cncyBoZWFwXG4gKiByZXRhaW5lZCB1bmRlciB0aGUgcnVsZSwgd2l0aCB0aGlzIG9uZSkuIEJvdGggc3RyaW5ncyBhcmUgaGlzdG9yaWNhbCBhbmQgbmVpdGhlciBjaGFuZ2VkIHdoZW4gaXRcbiAqIG1vdmVkOiB0aGlzIG9uZSB3YXMgdGhlIGNvbnN0YW50IGBSRURBQ1RFRGAgaW4gdGhpcyBmaWxlIHVudGlsIEY0YSwgdGhlbiBgcGxhY2Vob2xkZXJzLnRzIMK3XG4gKiBTQ09QRV9QTEFDRUhPTERFUmAsIGFuZCBzaW5jZSBDNCBpdCBsaXZlcyBoZXJlIGFnYWluLCBiZXNpZGUgdGhlIHZlcmRpY3QgdGhhdCB3cml0ZXMgaXQuXG4gKi9cbmV4cG9ydCBjb25zdCBTQ09QRV9QTEFDRUhPTERFUiA9ICdbUkVEQUNURURdJztcblxuLyoqXG4gKiBEZWNsYXJhdGl2ZSBrZXkvcGF0aCByZWRhY3Rpb24gZm9yIHJlY29yZGVkIHN0YXRlIGFuZCBib3VuZGFyeSByZWNvcmRzLlxuICpcbiAqIENvbmZpZ3VyZSBhdCB0aGUgc2NvcGUgY2xhc3MgbGV2ZWwgKHN0YXRpYyBwcm9wZXJ0eSkgb3IgcGFzcyB0b1xuICogRmxvd0NoYXJ0RXhlY3V0b3IgdG8gYXBwbHkgYWNyb3NzIGFsbCBzdGFnZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVkYWN0aW9uUG9saWN5IHtcbiAgLyoqIEV4YWN0IGtleSBuYW1lcyB0byBhbHdheXMgcmVkYWN0IChlLmcuIFsnc3NuJywgJ2NyZWRpdENhcmQnXSkuICovXG4gIGtleXM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIFJlZ2V4IHBhdHRlcm5zIOKAlCBhbnkga2V5IG1hdGNoaW5nIGEgcGF0dGVybiBpcyBhdXRvLXJlZGFjdGVkLlxuICAgKlxuICAgKiBQYXR0ZXJuIG1hdGNoaW5nIGlzIHNraXBwZWQgZm9yIGtleXMgdGhhdCBleGNlZWQgYW4gaW50ZXJuYWwgbGVuZ3RoIGNhcFxuICAgKiAoZGVzaWduZWQgdG8gcHJldmVudCBSZURvUyBvbiBwYXRob2xvZ2ljYWwgcGF0dGVybnMpLiBGb3IgdmVyeSBsb25nIGtleVxuICAgKiBuYW1lcywgdXNlIGBrZXlzYCAoZXhhY3QgbWF0Y2gpIGluc3RlYWQgb2YgcGF0dGVybnMuXG4gICAqL1xuICBwYXR0ZXJucz86IFJlZ0V4cFtdO1xuICAvKiogRmllbGQtbGV2ZWwgcmVkYWN0aW9uIHdpdGhpbiBvYmplY3RzIOKAlCBrZXkg4oaSIGFycmF5IG9mIGZpZWxkcyB0byBzY3J1Yi5cbiAgICogIFN1cHBvcnRzIGRvdC1ub3RhdGlvbiBmb3IgbmVzdGVkIHBhdGhzIChlLmcuICdhZGRyZXNzLnppcCcpLiAqL1xuICBmaWVsZHM/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIC8qKlxuICAgKiBEaWFnbm9zdGljLW9ubHkgc2VsZWN0b3JzLCBJTiBBRERJVElPTiB0byB0aGUgc3RhdGUgc2VsZWN0b3JzIGFib3ZlICh3aGljaFxuICAgKiBhbHJlYWR5IGNvdmVyIGEgZGlhZ25vc3RpYyBlbnRyeSBieSBpdHMgbmFtZTogYGtleXM6IFsndG9rZW4nXWAgbWFza3NcbiAgICogYCRkZWJ1ZygndG9rZW4nLCDigKYpYCkuIFVzZSB0aGVzZSBmb3IgbmFtZXMgeW91IG1hc2sgaW4gZGlhZ25vc3RpY3MgYnV0XG4gICAqIG5vdCBpbiBzdGF0ZS4gUGF0aHMgc3RhcnQgd2l0aCBsb2dzL2Vycm9ycy9tZXRyaWNzL2V2YWxzLCBlLmcuXG4gICAqIGBsb2dzLnByb2ZpbGUudG9rZW5gLiBPbmx5IGZsb3dNZXNzYWdlcy5kZXNjcmlwdGlvbiBhbmRcbiAgICogZmxvd01lc3NhZ2VzLnJhdGlvbmFsZSBhcmUgcGF5bG9hZHM7IGZsb3cgdG9wb2xvZ3kvdGltaW5nIG1ldGFkYXRhIHN0YXlzXG4gICAqIGludGFjdC4gQXBwbGllZCBiZWZvcmUgcmV0ZW50aW9uLCBub3QgcmV0cm9hY3RpdmVseSB0byBleGlzdGluZyBiYWdzLlxuICAgKi9cbiAgZGlhZ25vc3RpY3M/OiBQaWNrPFJlZGFjdGlvblBvbGljeSwgJ2tleXMnIHwgJ3BhdHRlcm5zJyB8ICdmaWVsZHMnPjtcbiAgLyoqXG4gICAqIFJlZ2V4IHBhdHRlcm5zIG1hdGNoZWQgYWdhaW5zdCBgRW1pdEV2ZW50Lm5hbWVgIGZvciBgc2NvcGUuJGVtaXQoLi4uKWBcbiAgICogY2FsbHMuIEFueSBlbWl0IGV2ZW50IHdob3NlIG5hbWUgbWF0Y2hlcyBoYXMgaXRzIHBheWxvYWQgcmVwbGFjZWQgd2l0aFxuICAgKiB0aGUgc3RyaW5nIGAnW1JFREFDVEVEXSdgIGJlZm9yZSBkaXNwYXRjaCB0byByZWNvcmRlcnMuXG4gICAqIEdsb2JhbC9zdGlja3kgcGF0dGVybnMgc3RhcnQgYXQgaW5kZXggemVybyBvbiBldmVyeSB0ZXN0OyB0aGVpciBmbGFnc1xuICAgKiByZXRhaW4gdGhlaXIgdXN1YWwgbWVhbmluZy4gVGhpcyBkb2VzIG5vdCBzY3J1YiBkaWFnbm9zdGljIHNpZGUgYmFncy5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICogYGBgdHNcbiAgICogeyBlbWl0UGF0dGVybnM6IFsvXFwuYXV0aFxcLi8sIC9cXC5iaWxsaW5nXFwuL10gfVxuICAgKiAvLyBIaWRlcyBwYXlsb2FkcyBvZiBldmVudHMgbGlrZSAnbXlhcHAuYXV0aC5jaGVjaycgYW5kICdteWFwcC5iaWxsaW5nLnNwZW5kJ1xuICAgKiBgYGBcbiAgICovXG4gIGVtaXRQYXR0ZXJucz86IFJlZ0V4cFtdO1xufVxuXG4vKipcbiAqIFN0YXRlIHJlZGFjdGlvbiByZXBvcnQuIE5ldmVyIGluY2x1ZGVzIHZhbHVlczsgZW1pdCBhbmQgZGlhZ25vc3RpY1xuICogc2VsZWN0b3JzL2FjdGl2aXR5IGFyZSBub3QgcmVwcmVzZW50ZWQgaGVyZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWRhY3Rpb25SZXBvcnQge1xuICAvKiogS2V5cyBmdWxseSByZWRhY3RlZCAoZXhhY3QgbWF0Y2ggb3IgcGF0dGVybiBtYXRjaCkuICovXG4gIHJlZGFjdGVkS2V5czogc3RyaW5nW107XG4gIC8qKiBLZXlzIHdpdGggZmllbGQtbGV2ZWwgcmVkYWN0aW9uIOKGkiB3aGljaCBmaWVsZHMgd2VyZSBzY3J1YmJlZC4gKi9cbiAgZmllbGRSZWRhY3Rpb25zOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT47XG4gIC8qKiBQYXR0ZXJuIHNvdXJjZXMgdGhhdCB3ZXJlIGFjdGl2ZSAoZS5nLiBbJ3Bhc3N3b3JkfHNlY3JldCddKS4gKi9cbiAgcGF0dGVybnM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIFdoYXQgdGhlIHBvbGljeSBzYXlzIGFib3V0IHRoZSB2YWx1ZSBhdCBvbmUgdXNlci1sZXZlbCBwYXRoLlxuICpcbiAqIC0gYCdjbGVhcidgICDigJQgbm90aGluZyB0byBzY3J1YjsgcmV0YWluIGFuZCBzZXJ2ZSB0aGUgdmFsdWUgYXMgaXQgaXMuXG4gKiAtIGAnd2hvbGUnYCAg4oCUIHRoZSBlbnRpcmUgdmFsdWUgaXMgc2VjcmV0LiBga2V5YCBpcyB0aGUgcG9saWN5IG9yIG1hcmtlZFxuICogICBrZXkgdGhhdCBkZWNpZGVkIGl0ICh0aGUgcGF0aCBpdHNlbGYgb3Igb25lIG9mIGl0cyBhbmNlc3RvcnMpLlxuICogLSBgJ2ZpZWxkcydgIOKAlCB0aGUgdmFsdWUgaXMgYW4gb2JqZWN0IHdob3NlIGBwYXRoc2AgKGRvdC1wYXRocyBJTlNJREUgdGhlXG4gKiAgIHZhbHVlLCByZWxhdGl2ZSB0byBpdCkgYXJlIHNlY3JldDsgZXZlcnl0aGluZyBlbHNlIGluIGl0IGlzIG5vdC5cbiAqL1xuZXhwb3J0IHR5cGUgUmVkYWN0aW9uVmVyZGljdCA9XG4gIHwgeyByZWFkb25seSBraW5kOiAnY2xlYXInIH1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICd3aG9sZSc7IHJlYWRvbmx5IGtleTogc3RyaW5nIH1cbiAgfCB7IHJlYWRvbmx5IGtpbmQ6ICdmaWVsZHMnOyByZWFkb25seSBrZXk6IHN0cmluZzsgcmVhZG9ubHkgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdIH07XG5cbmV4cG9ydCBjb25zdCBDTEVBUjogUmVkYWN0aW9uVmVyZGljdCA9IE9iamVjdC5mcmVlemUoeyBraW5kOiAnY2xlYXInIH0gYXMgY29uc3QpO1xuXG4vKipcbiAqIFRoZSB1c2VyLWxldmVsIE5BTUUgb2YgYGtleWAgdW5kZXIgYHBhdGhgIOKAlCB0aGUga2V5IGl0c2VsZiBhdCB0aGUgdG9wIGxldmVsLCBlbHNlIHRoZSBzZWdtZW50c1xuICogam9pbmVkIGJ5IGEgZG90IChgWydwcm9maWxlJ10gKyAnYXV0aCdgIOKGkiBgJ3Byb2ZpbGUuYXV0aCdgKTogd2hhdCBhIHZlcmRpY3QgZGVjaWRlcyBvbiwgYSBtYXJrXG4gKiBob2xkcywgYW5kIHRoZSBmcmFtZSBrZXlzIGEgc3RhZ2UncyByZXRhaW5lZCByZWFkcyBhbmQgd3JpdGVzIGJ5IChgU3RhZ2VDb250ZXh0YCkuIEEgbmFtZSwgbm90IGFuXG4gKiBhZGRyZXNzIOKAlCBhIGtleSBtYXkgY29udGFpbiBhIGRvdCDigJQgc28gaXQgbmV2ZXIgZ29lcyBpbnRvIGEgdHJhY2UgcGF0aC4gTm8gYWxsb2NhdGlvbiBmb3IgdGhlXG4gKiBjb21tb24gdG9wLWxldmVsIGtleS4gKFRoZSByZWNvcmQgc3BlbGxzIHRoZSBzYW1lIG5hbWUgZm9yIGByZWFkS2V5c2AsIGBSZWNvcmRGcmFtZSDCtyBub3RlUmVhZGAuKVxuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlcktleU9mKHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCBrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoLmxlbmd0aCA+IDAgPyBbLi4ucGF0aCwga2V5XS5qb2luKCcuJykgOiBrZXk7XG59XG5cbi8qKlxuICogTWF4aW11bSBrZXkgbGVuZ3RoIChjaGFyYWN0ZXJzKSB0aGF0IHdpbGwgYmUgdGVzdGVkIGFnYWluc3QgcmVnZXggcmVkYWN0aW9uXG4gKiBwYXR0ZXJucy4gS2V5cyBsb25nZXIgdGhhbiB0aGlzIGFyZSBza2lwcGVkIGZvciBwYXR0ZXJuIG1hdGNoaW5nIHRvIHByZXZlbnRcbiAqIFJlRG9TOiBhIHBhdGhvbG9naWNhbCByZWdleCB0ZXN0ZWQgYWdhaW5zdCBhbiB1bmJvdW5kZWRseSBsb25nIGtleSBzdHJpbmdcbiAqIGNhbiBjYXVzZSBjYXRhc3Ryb3BoaWMgYmFja3RyYWNraW5nLiAyNTYgY2hhcmFjdGVycyBjb21mb3J0YWJseSBleGNlZWRzIGFueVxuICogcmVhbGlzdGljIHNjb3BlLXN0YXRlIGtleSBuYW1lLlxuICovXG5jb25zdCBNQVhfUEFUVEVSTl9LRVlfTEVOID0gMjU2O1xuXG4vKipcbiAqIFRoZSBmaWVsZHMgYSBwb2xpY3kgZGVjbGFyZXMgdW5kZXIgYGtleWAg4oCUIG9ubHkgd2hlbiBgZmllbGRzYCBPV05TIGBrZXlgLlxuICogVGhlIGtleSBpcyBhIG5hbWUgZnJvbSBkYXRhIChhIHN0YXRlIGtleSwgYSBuZXN0ZWQga2V5IG9mIGEgcmVjb3JkIGhhbmRlZFxuICogb3V0IHdob2xlKSwgYW5kIGEgcGxhaW4tb2JqZWN0IGxvb2t1cCByZWFkcyB0aGUgcHJvdG90eXBlIGNoYWluOlxuICogYGZpZWxkc1snY29uc3RydWN0b3InXWAgaXMgYE9iamVjdGAsIGBmaWVsZHNbJ19fcHJvdG9fXyddYCBpc1xuICogYE9iamVjdC5wcm90b3R5cGVgLiBUaGUgd2FsayB0aGVuIGl0ZXJhdGVkIHRoZW0sIHNvIGFueSBgZmllbGRzYCBwb2xpY3lcbiAqIGZhaWxlZCB0aGUgcnVuIHdpdGggYSBUeXBlRXJyb3Igb24gZGF0YSBob2xkaW5nIHN1Y2ggYSBrZXkuXG4gKi9cbmZ1bmN0aW9uIGRlY2xhcmVkRmllbGRzKGZpZWxkczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHwgdW5kZWZpbmVkLCBrZXk6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIGZpZWxkcyAhPT0gdW5kZWZpbmVkICYmIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChmaWVsZHMsIGtleSkgPyBmaWVsZHNba2V5XSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqIFBvbGljeSBwYXR0ZXJucyBhcmUgcHJlZGljYXRlcywgbm90IGN1cnNvcnMgb3ZlciBzdWNjZXNzaXZlIGtleXMvZXZlbnRzLiAqL1xuZnVuY3Rpb24gbWF0Y2hlc1BhdHRlcm4odmFsdWU6IHN0cmluZywgcGF0dGVybnM6IHJlYWRvbmx5IFJlZ0V4cFtdIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gIGlmICghcGF0dGVybnMpIHJldHVybiBmYWxzZTtcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIHBhdHRlcm5zKSB7XG4gICAgLy8gT25seSB0aGVzZSBmbGFncyBjb25zdW1lIGxhc3RJbmRleC4gT3JkaW5hcnkgKGluY2x1ZGluZyBmcm96ZW4pXG4gICAgLy8gcmVnZXhlcyBuZWVkIG5vIHdyaXRhYmxlIGN1cnNvciB0byBtYXRjaC4gS2VlcCBhbGwgb3JpZ2luYWwgZmxhZ3MuXG4gICAgaWYgKHBhdHRlcm4uZ2xvYmFsIHx8IHBhdHRlcm4uc3RpY2t5KSBwYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gICAgaWYgKHBhdHRlcm4udGVzdCh2YWx1ZSkpIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNsYXNzIFJlZGFjdGlvblJ1bGUge1xuICBwcml2YXRlIHBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIGRpYWdub3N0aWNSdWxlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkO1xuICAvKiogV2hldGhlciBgcG9saWN5YCBuYW1lcyBhbnl0aGluZyBhIHN0YXRlIHZlcmRpY3QgY2FuIGFjdCBvbiDigJQgY29tcHV0ZWRcbiAgICogIG9uY2UgcGVyIGBzZXRQb2xpY3lgIHNvIHtAbGluayBpc0luZXJ0fSBpcyBhIHR3by1maWVsZCBjaGVjay4gKi9cbiAgcHJpdmF0ZSBwb2xpY3lBY3RpdmUgPSBmYWxzZTtcbiAgLyoqIFRoZSBwb2xpY3kncyBwYXR0ZXJucyB0aGF0IGNhbiBkZXBlbmQgb24gYSB3aG9sZSBkb3R0ZWQgcGF0aCAoe0BsaW5rIG5lZWRzUGF0aH0pIOKAlCBwZXIgYHNldFBvbGljeWAuICovXG4gIHByaXZhdGUgcGF0aFBhdHRlcm5zOiByZWFkb25seSBSZWdFeHBbXSA9IFtdO1xuICBwcml2YXRlIHdhbGtMaW1pdFdhcm5lZCA9IGZhbHNlO1xuICAvKipcbiAgICogS2V5cyBtYXJrZWQgc2VjcmV0IGZvciB0aGUgcmVzdCBvZiB0aGUgcnVuIOKAlCBieSBhIHBlci1jYWxsXG4gICAqIGBzZXRWYWx1ZShrZXksIHZhbHVlLCB0cnVlKWAsIG9yIGJ5IGFueSB3cml0ZSB0aGUgcG9saWN5IHJlZGFjdGVkIHdob2xlLlxuICAgKiBPTkUgc2V0IHBlciBydW4sIHNoYXJlZCBieSBldmVyeSBzY29wZSBhbmQgY29udGV4dCAodGhlIGV4ZWN1dG9yIGJ1aWxkc1xuICAgKiB0aGUgcnVsZSBvbmNlIHBlciBydW4gYW5kIGluc3RhbGxzIGl0IG9uIHRoZSBydW50aW1lIHJvb3QpLlxuICAgKi9cbiAgcHJpdmF0ZSBtYXJrZWQ6IFNldDxzdHJpbmc+O1xuICAvKipcbiAgICogRmllbGRzIGEgc3ViZmxvdyBtYXBwZXIgaGFuZGVkIHRvIGEgTkVXIGtleSBhbG9uZyB3aXRoIHRoZSB2YWx1ZSB0aGV5XG4gICAqIGJlbG9uZyB0byDigJQgdGFyZ2V0IGtleSDihpIgdGhlIHNvdXJjZSBrZXkncyBmaWVsZCBwYXRocyAoYW4gb2JqZWN0IGNvcGllZFxuICAgKiBieSByZWZlcmVuY2UgZnJvbSBhIGBmaWVsZHNgLXNlbGVjdGVkIGtleTsge0BsaW5rIE1hcHBlclRhaW50fSkuXG4gICAqIFJ1bi13aWRlLCBieSBuYW1lLCBsaWtlIHtAbGluayBtYXJrZWR9LlxuICAgKi9cbiAgcHJpdmF0ZSBpbmhlcml0ZWQ6IE1hcDxzdHJpbmcsIHJlYWRvbmx5IHN0cmluZ1tdPiB8IHVuZGVmaW5lZDtcbiAgLyoqIFRoaXMgcnVuJ3MgdGhyb3duIHZhbHVlcyBzZXJ2ZWQgbWFza2VkICh0aGVpciB0ZXh0IHNlbGVjdGVkLCBvciBhIHNlbGVjdGVkIGtleSBpbnNpZGUgdGhlbSkg4oaSIHRoZWlyIHNlcnZlZCBmb3JtLiAqL1xuICBwcml2YXRlIG1hc2tlZEVycm9yczogTWFza2VkRXJyb3JzIHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0cnVjdG9yKHBvbGljeT86IFJlZGFjdGlvblBvbGljeSwgbWFya2VkPzogU2V0PHN0cmluZz4pIHtcbiAgICB0aGlzLm1hcmtlZCA9IG1hcmtlZCA/PyBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLnNldFBvbGljeShwb2xpY3kpO1xuICB9XG5cbiAgZ2V0UG9saWN5KCk6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucG9saWN5O1xuICB9XG5cbiAgc2V0UG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgdGhpcy5wb2xpY3kgPSBwb2xpY3k7XG4gICAgY29uc3QgZGlhZ25vc3RpY3MgPSBwb2xpY3k/LmRpYWdub3N0aWNzO1xuICAgIHRoaXMuZGlhZ25vc3RpY1J1bGUgPSBkaWFnbm9zdGljc1xuICAgICAgPyBuZXcgUmVkYWN0aW9uUnVsZSh7IGtleXM6IGRpYWdub3N0aWNzLmtleXMsIHBhdHRlcm5zOiBkaWFnbm9zdGljcy5wYXR0ZXJucywgZmllbGRzOiBkaWFnbm9zdGljcy5maWVsZHMgfSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMucGF0aFBhdHRlcm5zID0gKHBvbGljeT8ucGF0dGVybnMgPz8gW10pLmZpbHRlcihuZWVkc1BhdGgpO1xuICAgIHRoaXMucG9saWN5QWN0aXZlID1cbiAgICAgIHBvbGljeSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAoKHBvbGljeS5rZXlzPy5sZW5ndGggPz8gMCkgPiAwIHx8XG4gICAgICAgIChwb2xpY3kucGF0dGVybnM/Lmxlbmd0aCA/PyAwKSA+IDAgfHxcbiAgICAgICAgT2JqZWN0LmtleXMocG9saWN5LmZpZWxkcyA/PyB7fSkubGVuZ3RoID4gMCk7XG4gIH1cblxuICAvKipcbiAgICogVHJ1ZSB3aGVuIHRoaXMgcnVsZSBoYXMgbm90aGluZyB0byBzYXkgYWJvdXQgQU5ZIHBhdGgg4oCUIG5vIGtleSwgcGF0dGVyblxuICAgKiBvciBmaWVsZCBpbiB0aGUgcG9saWN5IGFuZCBubyBrZXkgbWFya2VkIHNvIGZhci4gVGhlIG5vLXBvbGljeSBmYXN0XG4gICAqIHBhdGg6IGBTdGFnZUNvbnRleHRgIHNraXBzIHRoZSB2ZXJkaWN0IChhbmQgaXRzIHBhdGggYWxsb2NhdGlvbikgb25cbiAgICogZXZlcnkgdHJhY2tlZCByZWFkIGFuZCBzdGFnZWQgd3JpdGUgd2hpbGUgdGhpcyBob2xkcy4gQSBwZXItY2FsbFxuICAgKiBgc2V0VmFsdWUoa2V5LCB2YWx1ZSwgdHJ1ZSlgIG1hcmtzIGEga2V5IGFuZCBlbmRzIGl0LlxuICAgKi9cbiAgaXNJbmVydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5tYXJrZWQuc2l6ZSA9PT0gMCAmJiAhdGhpcy5wb2xpY3lBY3RpdmUgJiYgdGhpcy5pbmhlcml0ZWQgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBUaGUgc2hhcmVkIG1hcmtlZC1rZXlzIHNldCDigJQgZm9yIHRoZSBgQGludGVybmFsYCBzaGFyaW5nIHByb3RvY29sIGFuZCBgZGVjaWRlKClgLiAqL1xuICBtYXJrZWRLZXlzKCk6IFNldDxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5tYXJrZWQ7XG4gIH1cblxuICB1c2VNYXJrZWRLZXlzKHNoYXJlZDogU2V0PHN0cmluZz4pOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtlZCA9IHNoYXJlZDtcbiAgfVxuXG4gIG1hcmsoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm1hcmtlZC5hZGQoa2V5KTtcbiAgfVxuXG4gIC8qKiBEZWxldGluZyBhIGtleSBjbGVhcnMgaXRzIHBlci1jYWxsIG1hcmsgYW5kIGFueSBmaWVsZHMgYSBtYXBwZXIgZ2F2ZSBpdDsgYSBwb2xpY3kgdmVyZGljdCBzdXJ2aXZlcyBpdC4gKi9cbiAgdW5tYXJrKGtleTogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5tYXJrZWQuZGVsZXRlKGtleSk7XG4gICAgaWYgKHRoaXMuaW5oZXJpdGVkPy5kZWxldGUoa2V5KSAmJiB0aGlzLmluaGVyaXRlZC5zaXplID09PSAwKSB0aGlzLmluaGVyaXRlZCA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBLZXktbGV2ZWwgdmVyZGljdDogbWFya2VkLCBsaXN0ZWQgaW4gYHBvbGljeS5rZXlzYCwgb3IgbWF0Y2hpbmcgYSBwYXR0ZXJuLiAqL1xuICBpc0tleVJlZGFjdGVkKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMubWFya2VkLmhhcyhrZXkpKSByZXR1cm4gdHJ1ZTtcbiAgICBpZiAoIXRoaXMucG9saWN5KSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHRoaXMucG9saWN5LmtleXM/LmluY2x1ZGVzKGtleSkpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IHBhdHRlcm5zID0gdGhpcy5wb2xpY3kucGF0dGVybnM7XG4gICAgaWYgKCFwYXR0ZXJucyB8fCBwYXR0ZXJucy5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcbiAgICBpZiAoa2V5Lmxlbmd0aCA+IE1BWF9QQVRURVJOX0tFWV9MRU4pIHtcbiAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgYFtmb290cHJpbnRdIFJlZGFjdGlvblBvbGljeToga2V5ICcke2tleS5zbGljZSgwLCA0MCl9Li4uJyAoJHtrZXkubGVuZ3RofSBjaGFycykgZXhjZWVkcyBgICtcbiAgICAgICAgICAgICd0aGUgcGF0dGVybi1tYXRjaGluZyBsZW5ndGggY2FwIGFuZCB3YXMgc2tpcHBlZC4gJyArXG4gICAgICAgICAgICAnVXNlIHBvbGljeS5rZXlzIGZvciBleGFjdCBtYXRjaGluZyBvZiBsb25nIGtleSBuYW1lcy4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gbWF0Y2hlc1BhdHRlcm4oa2V5LCBwYXR0ZXJucyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0YWluIGFuIGVtaXR0ZWQgcGF5bG9hZCBCRUZPUkUgZGlzcGF0Y2gvY2FwdHVyZS4gRW1pdCBuYW1lcyBhcmUgbm90XG4gICAqIHN0YXRlIHBhdGhzOiBubyBrZXktbGVuZ3RoIGNhcCwgbWFya3Mgb3IgZmllbGQgc2NydWIgYXBwbGllcyBoZXJlLlxuICAgKiBBIGNsZWFyIHBheWxvYWQga2VlcHMgaXRzIGlkZW50aXR5OyBkaWFnbm9zdGljIGJhZ3MgYXJlIHVudG91Y2hlZC5cbiAgICovXG4gIHJldGFpbkVtaXQobmFtZTogc3RyaW5nLCBwYXlsb2FkOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgcmV0dXJuIG1hdGNoZXNQYXR0ZXJuKG5hbWUsIHRoaXMucG9saWN5Py5lbWl0UGF0dGVybnMpID8gU0NPUEVfUExBQ0VIT0xERVIgOiBwYXlsb2FkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldGFpbiBhIE5BTUVEIGRpYWdub3N0aWMgZW50cnkg4oCUIGBhZGRyZXNzYCBpcyBgW2NoYW5uZWwsIC4uLnBhdGgsIG5hbWVdYFxuICAgKiAoYCRkZWJ1ZygndG9rZW4nLCB2KWAg4oaSIGBbJ2xvZ3MnLCAndG9rZW4nXWA7IGAkbG9nKHYpYCDihpIgYFsnbG9ncycsXG4gICAqICdtZXNzYWdlcyddYCkuIFRIRSBNQVBQSU5HOiB0aGUgZW50cnkgaXMgdGhlIHJlY29yZCBgeyBbbmFtZV06IHZhbHVlIH1gXG4gICAqIGhhbmRlZCBvdXQgd2hvbGUsIHNvIGl0IGlzIHJldGFpbmVkIGFzIGEgYm91bmRhcnkgcmVjb3JkIGhvbGRpbmcgdGhlXG4gICAqIHN0YXRlIGtleSBgbmFtZWAgd291bGQgYmUg4oCUIHRoZSBzdGF0ZSB2ZXJkaWN0IGF0IGBbLi4ucGF0aCwgbmFtZV1gIChrZXlzLFxuICAgKiBwYXR0ZXJucyBhbmQgbWFya3MgYXQgZXZlcnkgZG90dGVkIHByZWZpeCBhbmQgYXQgdGhlIG5hbWUgaXRzZWxmOyB0aGUgdG9wXG4gICAqIGtleSdzIGBmaWVsZHNgKSwgdGhlbiBldmVyeSBuZXN0ZWQgb3duIGtleSB3aG9zZSBuYW1lIG9yIGRvdHRlZCBwYXRoIGlzXG4gICAqIHNlbGVjdGVkICh7QGxpbmsgcmV0YWluQm91bmRhcnl9J3Mgd2FsaykuIFRoZSBjaGFubmVsIHRha2VzIG5vIHBhcnQ6XG4gICAqIGBsb2dzLnRva2VuYCwgYGVycm9ycy50b2tlbmAgYW5kIGBtZXRyaWNzLnRva2VuYCBhcmUgYWxsIHRoZSBzdGF0ZSBrZXlcbiAgICogYHRva2VuYC4gYHBvbGljeS5kaWFnbm9zdGljc2AgKGRpYWdub3N0aWMtb25seSBzZWxlY3RvcnMsIHJvb3RlZCBhdCB0aGVcbiAgICogY2hhbm5lbCkgYXBwbGllcyBvbiB0b3AuIENsZWFyIHZhbHVlcyBrZWVwIHRoZWlyIGlkZW50aXR5LlxuICAgKi9cbiAgcmV0YWluRGlhZ25vc3RpYyhhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgdmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5pc0luZXJ0KCkgPyB2YWx1ZSA6IHRoaXMucmV0YWluTmFtZWQoYWRkcmVzcy5zbGljZSgxKSwgdmFsdWUpO1xuICAgIHJldHVybiB0aGlzLmRpYWdub3N0aWNSdWxlID8gdGhpcy5kaWFnbm9zdGljUnVsZS5yZXRhaW4oYWRkcmVzcywga2VwdCkgOiBrZXB0O1xuICB9XG5cbiAgLyoqXG4gICAqIEFuIGlkZW1wb3RlbmN5IGtleSBhcyByZWNvcmRzIHNlcnZlIGl0IChQMywgZGVzaWduIMKnNikuIFRoZSBrZXkgaXMgYSBWQUxVRSwgYW5kIHRoZSBkb2N1bWVudGVkIHdheSB0byBtYWtlIG9uZVxuICAgKiBpcyBmcm9tIHRoZSBpbnB1dCBvciB0aGUgc3RhdGUgKGBvcmRlci0ke2FyZ3Mub3JkZXJJZH1gKSDigJQgc28gaXQgaXMgc2VsZWN0ZWQgYnkgaXRzIE5BTUUgKHRoZSBkaWFnbm9zdGljIGVudHJ5XG4gICAqIGB7IGlkZW1wb3RlbmN5S2V5IH1gOiBhIHN0YXRlIHJ1bGUgb2YgdGhhdCBuYW1lLCBvciBgcG9saWN5LmRpYWdub3N0aWNzYCBhdCBgbG9ncy5pZGVtcG90ZW5jeUtleWApIEFORCBieSBpdHNcbiAgICogU09VUkNFUywgY29uc2VydmF0aXZlbHksIHRoZSBzdWJmbG93LW1hcHBlciB0YWludCBsYXcncyB3YXk6IHdoZW4gdGhlIGlucHV0IGl0IG1heSBiZSBkZXJpdmVkIGZyb20gaG9sZHMgYVxuICAgKiBzZWxlY3RlZCBrZXkgYXQgYW55IGRlcHRoLCBvciB0aGUgc3RhZ2UgcmVhZCBhIHNlbGVjdGVkIHZhbHVlIGJlZm9yZSBtYWtpbmcgaXQgKGBzZWxlY3RlZFJlYWRzYCksIGl0IGlzIHNlcnZlZFxuICAgKiB3aG9sZSBhcyB0aGUgcGxhY2Vob2xkZXIuIE5ldmVyIHZhbHVlIGVxdWFsaXR5LiBBbiBpbmVydCBydWxlIG5ldmVyIHJlYWRzIGl0LlxuICAgKi9cbiAgcmV0YWluSWRlbXBvdGVuY3lLZXkoa2V5OiBzdHJpbmcsIHNvdXJjZXM6IHsgcmVhZG9ubHkgaW5wdXQ/OiB1bmtub3duOyByZWFkb25seSBzZWxlY3RlZFJlYWRzPzogbnVtYmVyIH0pOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmlzRGlhZ25vc3RpY0luZXJ0KCkpIHJldHVybiBrZXk7XG4gICAgaWYgKCF0aGlzLmlzSW5lcnQoKSAmJiAoKHNvdXJjZXMuc2VsZWN0ZWRSZWFkcyA/PyAwKSA+IDAgfHwgdGhpcy5jYXJyaWVzU2VsZWN0ZWRLZXkoc291cmNlcy5pbnB1dCkpKSB7XG4gICAgICByZXR1cm4gU0NPUEVfUExBQ0VIT0xERVI7XG4gICAgfVxuICAgIGNvbnN0IGtlcHQgPSB0aGlzLnJldGFpbkRpYWdub3N0aWMoWydsb2dzJywgJ2lkZW1wb3RlbmN5S2V5J10sIGtleSk7XG4gICAgcmV0dXJuIHR5cGVvZiBrZXB0ID09PSAnc3RyaW5nJyA/IGtlcHQgOiBTdHJpbmcoa2VwdCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0YWluIGZsb3ctbWVzc2FnZSB0ZXh0IChgZmxvd01lc3NhZ2VzLmRlc2NyaXB0aW9uYCAvIGAucmF0aW9uYWxlYCk6IHRleHRcbiAgICogdGhlIGVuZ2luZSBjb21wb3NlcyBoYXMgbm8gbmFtZSBvZiBpdHMgb3duLCBzbyBubyBzdGF0ZSBzZWxlY3RvciByZWFjaGVzXG4gICAqIGl0IOKAlCBvbmx5IGBwb2xpY3kuZGlhZ25vc3RpY3NgIHNlbGVjdHMgaXQuXG4gICAqL1xuICByZXRhaW5GbG93VGV4dChhZGRyZXNzOiByZWFkb25seSBzdHJpbmdbXSwgdGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kaWFnbm9zdGljUnVsZSA/ICh0aGlzLmRpYWdub3N0aWNSdWxlLnJldGFpbihhZGRyZXNzLCB0ZXh0KSBhcyBzdHJpbmcpIDogdGV4dDtcbiAgfVxuXG4gIC8qKiB7QGxpbmsgcmV0YWluRGlhZ25vc3RpY30ncyBzdGF0ZSBoYWxmOiB0aGUgdmFsdWUgbmFtZWQgYnkgYHBhdGhgIChpdHMgbGFzdCBzZWdtZW50KSwgc2VydmVkIHdob2xlLiAqL1xuICBwcml2YXRlIHJldGFpbk5hbWVkKHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHZhbHVlO1xuICAgIGNvbnN0IG5hbWUgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gICAgY29uc3QgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCA9XG4gICAgICBwYXRoLmxlbmd0aCA+IDEgJiYgdGhpcy5pc0tleVJlZGFjdGVkKG5hbWUpID8geyBraW5kOiAnd2hvbGUnLCBrZXk6IG5hbWUgfSA6IHRoaXMudmVyZGljdChwYXRoKTtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSByZXR1cm4gU0NPUEVfUExBQ0VIT0xERVI7XG4gICAgY29uc3Qga2VwdCA9IFJlZGFjdGlvblJ1bGUuYXBwbHkodmVyZGljdCwgdmFsdWUpO1xuICAgIGlmIChrZXB0ID09PSBudWxsIHx8IHR5cGVvZiBrZXB0ICE9PSAnb2JqZWN0JykgcmV0dXJuIGtlcHQ7XG4gICAgY29uc3QgYmFzZSA9IHBhdGguam9pbignLicpO1xuICAgIHJldHVybiBzZXJ2ZWRCeVBhdGgoa2VwdCwgYmFzZSwgdGhpcy5kb3R0ZWRUYXJnZXRzKGJhc2UpLCB0aGlzLm5hbWVzV2FsayhmYWxzZSksIFNDT1BFX1BMQUNFSE9MREVSKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VydmVkIGZvcm0gb2YgYSB0aHJvd24gdmFsdWUsIGRlY2lkZWQgT05DRSBhdCBpdHMgZXJyb3Igc2l0ZSBmcm9tIHRoZVxuICAgKiB0ZXh0IHRoZSBkaWFnbm9zdGljIGNvbGxlY3RvciByZXRhaW5lZCBmb3IgYGVycm9ycy5zdGFnZUV4ZWN1dGlvbkVycm9yYFxuICAgKiAoYGtlcHRgKSBhbmQgZnJvbSB0aGUgdmFsdWUgaXRzZWxmIOKAlCBhIHJlY29yZCBoYW5kZWQgb3V0IHdob2xlLCBtYXNrZWRcbiAgICogd2hlbiBvbmUgb2YgaXRzIG93biBrZXlzLCBhdCBhbnkgZGVwdGgsIGNhcnJpZXMgYSBzZWxlY3RlZCBuYW1lLlxuICAgKiBVbm1hc2tlZDogdG9kYXkncyBzdHJ1Y3R1cmVkIGluZm8uIE1hc2tlZDogdGhlIGVycm9yJ3MgYG5hbWVgL2Bjb2RlYCBrZXB0LFxuICAgKiBubyBgaXNzdWVzYCAodGhleSBxdW90ZSB0aGUgaW5wdXQpIGFuZCBubyBgcmF3YCBlcnJvciAoaXQgaG9sZHMgdGhlIHRleHRcbiAgICogYW5kIHRoZSBrZXlzKTsgdGhlIG1lc3NhZ2UgaXMgdGhlIHBsYWNlaG9sZGVyIHdoZW4gdGhlIHRleHQgd2FzIHNlbGVjdGVkLFxuICAgKiB0aGUgdGV4dCBpdHNlbGYgd2hlbiBvbmx5IGEga2V5IHdhcyDigJQgcmVtZW1iZXJlZCBzbyBgb25SdW5GYWlsZWRgLCB0aGVcbiAgICogbG9nZ2VyIGFuZCBhIGZvcmsgZW52ZWxvcGUgc2VydmUgdGhlIHNhbWUgZm9ybSAoe0BsaW5rIHNlcnZlZEVycm9yfSkuIFRoZVxuICAgKiB0aHJvd24gdmFsdWUgaXRzZWxmIHN0YXlzIHJlYWwuXG4gICAqL1xuICByZXRhaW5TdGFnZUVycm9yKFxuICAgIGVycm9yOiB1bmtub3duLFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBrZXB0OiB1bmtub3duLFxuICApOiB7IG1lc3NhZ2U6IHN0cmluZzsgc3RydWN0dXJlZEVycm9yOiBTdHJ1Y3R1cmVkRXJyb3JJbmZvIH0ge1xuICAgIGNvbnN0IGluZm8gPSBleHRyYWN0RXJyb3JJbmZvKGVycm9yKTtcbiAgICBjb25zdCB0ZXh0U2VsZWN0ZWQgPSBrZXB0ICE9PSB0ZXh0O1xuICAgIGlmICghdGV4dFNlbGVjdGVkICYmICF0aGlzLmNhcnJpZXNTZWxlY3RlZEtleShlcnJvcikpIHJldHVybiB7IG1lc3NhZ2U6IHRleHQsIHN0cnVjdHVyZWRFcnJvcjogaW5mbyB9O1xuICAgIGNvbnN0IG1lc3NhZ2UgPSB0ZXh0U2VsZWN0ZWQgPyBTdHJpbmcoa2VwdCkgOiB0ZXh0O1xuICAgIGNvbnN0IG1hc2tlZDogU3RydWN0dXJlZEVycm9ySW5mbyA9IHtcbiAgICAgIG1lc3NhZ2U6IHRleHRTZWxlY3RlZCA/IG1lc3NhZ2UgOiBpbmZvLm1lc3NhZ2UsXG4gICAgICAuLi4oaW5mby5uYW1lICE9PSB1bmRlZmluZWQgJiYgeyBuYW1lOiBpbmZvLm5hbWUgfSksXG4gICAgICAuLi4oaW5mby5jb2RlICE9PSB1bmRlZmluZWQgJiYgeyBjb2RlOiBpbmZvLmNvZGUgfSksXG4gICAgICByYXc6IHVuZGVmaW5lZCxcbiAgICB9O1xuICAgICh0aGlzLm1hc2tlZEVycm9ycyA/Pz0gbmV3IE1hc2tlZEVycm9ycygpKS5zZXQoZXJyb3IsIG1hc2tlZCk7XG4gICAgcmV0dXJuIHsgbWVzc2FnZSwgc3RydWN0dXJlZEVycm9yOiBtYXNrZWQgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEb2VzIGEgdGhyb3duIHZhbHVlIGNhcnJ5IGEgc2VsZWN0ZWQgbmFtZSDigJQgYW4gb3duIGtleSwgYXQgYW55IGRlcHRoLCB0aGF0XG4gICAqIHRoZSBwb2xpY3kgb3IgYSBtYXJrIHNlbGVjdHM/IFRvdGFsOiBhIHZhbHVlIHdob3NlIGtleXMgY2Fubm90IGJlIHJlYWQgaXNcbiAgICogc2VydmVkIG1hc2tlZCAodGhlIHNhZmUgc2lkZSksIG5ldmVyIGEgc2Vjb25kIHRocm93IGZyb20gYW4gZXJyb3IgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgY2Fycmllc1NlbGVjdGVkS2V5KHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gICAgaWYgKCh0aGlzLmlzSW5lcnQoKSAmJiAhdGhpcy5tYXNrZWRFcnJvcnM/LmFueSkgfHwgdmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy50aHJvd25DYXJyaWVzKHZhbHVlLCBuZXcgU2V0KCkpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gS2V5cyB0aGF0IGNhbm5vdCBiZSByZWFkIChhIHRocm93aW5nIGdldHRlciwgYSByZXZva2VkIFByb3h5KSBvciBhIHdhbGsgcGFzdCBpdHNcbiAgICAgIC8vIGxpbWl0OiBzZXJ2ZWQgaW4gdGhlIG1hc2tlZCBmb3JtIOKAlCBpdHMgdGV4dCBrZXB0LCBubyBgcmF3YC5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPbmUgdGhyb3duIHZhbHVlIGFuZCB3aGF0IGEgbG9nZ2VyIG9yIGEgc2VyaWFsaXplciBwcmludHMgd2l0aCBpdDogaXRzIG93blxuICAgKiBrZXlzIGF0IGV2ZXJ5IGRlcHRoLCBhbmQgaXRzIGBjYXVzZWAgLyBhbiBgQWdncmVnYXRlRXJyb3JgJ3MgYGVycm9yc2Ag4oCUIG93blxuICAgKiBOT04tZW51bWVyYWJsZSBrZXlzIG5vIGtleSB3YWxrIHNlZXMg4oCUIGVhY2ggd2Fsa2VkIHRoZSBzYW1lIHdheSAoYSBjeWNsZVxuICAgKiBhbW9uZyB0aGVtIGlzIGZvbGxvd2VkIG9uY2UpLlxuICAgKi9cbiAgcHJpdmF0ZSB0aHJvd25DYXJyaWVzKHZhbHVlOiBvYmplY3QsIHNlZW46IFNldDxvYmplY3Q+KTogYm9vbGVhbiB7XG4gICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICAvLyBBIHdyYXBwZXIgY2Fubm90IGV4cG9zZSBhIHJhdyBjYXVzZSB0aGF0IHRoaXMgcnVsZSBhbHJlYWR5IHNlcnZlZCBtYXNrZWQgKGluY2x1ZGluZyBkaWFnbm9zdGljLW9ubHkgbWFza3MpLlxuICAgIGlmICh0aGlzLm1hc2tlZEVycm9ycz8uaGFzKHZhbHVlKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHNlbGVjdHNCeVBhdGgodmFsdWUsIHVuZGVmaW5lZCwgdGhpcy5kb3R0ZWRUYXJnZXRzKHVuZGVmaW5lZCksIHRoaXMubmFtZXNXYWxrKGZhbHNlKSwgbmV3IE1hcCgpLCAwKS5zZWxlY3RlZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNvbnN0IG93biA9IChrZXk6IHN0cmluZyk6IHVua25vd24gPT5cbiAgICAgIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwga2V5KSA/ICh2YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilba2V5XSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBlcnJvcnMgPSBvd24oJ2Vycm9ycycpO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBbb3duKCdjYXVzZScpLCAuLi4oQXJyYXkuaXNBcnJheShlcnJvcnMpID8gZXJyb3JzIDogW10pXSkge1xuICAgICAgaWYgKHBhcnQgIT09IG51bGwgJiYgdHlwZW9mIHBhcnQgPT09ICdvYmplY3QnICYmIHRoaXMudGhyb3duQ2FycmllcyhwYXJ0LCBzZWVuKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUga2V5LWxldmVsIHJ1bGVzIGFzIHRoZSBwYXRoIHdhbGsgYXNrcyB0aGVtICh7QGxpbmsgc2VydmVkQnlQYXRofSk6IGFcbiAgICogbmVzdGVkIGtleSBpcyBzZWxlY3RlZCBieSBpdHMgb3duIE5BTUUgKG1hcmtzLCBrZXlzLCBwYXR0ZXJucyksIGFuZCDigJQgdW5kZXJcbiAgICogcGF0dGVybnMgb25seSDigJQgYnkgaXRzIGRvdHRlZCBwYXRoOyBhIGRlY2xhcmVkIChvciBpbmhlcml0ZWQpIGZpZWxkIGJlbG93IGFcbiAgICoga2V5IG9mIGl0cyBuYW1lIGlzIGEgdGFyZ2V0LiBEb3R0ZWQga2V5cyBhbmQgbWFya3MgYXJlIFRBUkdFVFMgZnJvbSB0aGVcbiAgICogd2FsaydzIHJvb3QgKHtAbGluayBkb3R0ZWRUYXJnZXRzfSksIHNvIHdpdGhvdXQgcGF0dGVybnMgbm8gZGVjaXNpb25cbiAgICogZGVwZW5kcyBvbiB0aGUgcGF0aCBhbmQgdGhlIHdhbGsgc2hhcmVzIHRoZW0gcGVyIG9iamVjdCAobGluZWFyIG9uIGEgREFHKS5cbiAgICogYHJvb3REZWNpZGVkYDogdGhlIHJvb3QncyBvd24ga2V5cyB3ZXJlIGFscmVhZHkgZGVjaWRlZCAoYHJldGFpblJlY29yZGApLlxuICAgKi9cbiAgcHJpdmF0ZSBuYW1lc1dhbGsocm9vdERlY2lkZWQ6IGJvb2xlYW4pOiBXYWxrIHtcbiAgICBjb25zdCBieVBhdGggPSB0aGlzLnBhdGhQYXR0ZXJucztcbiAgICByZXR1cm4ge1xuICAgICAgbmFtZXM6IHtcbiAgICAgICAgbWFza3M6IChuYW1lKSA9PiB0aGlzLmlzS2V5UmVkYWN0ZWQobmFtZSksXG4gICAgICAgIC4uLihieVBhdGgubGVuZ3RoID4gMCAmJiB7XG4gICAgICAgICAgcGF0aE1hc2tzOiAocGF0aDogc3RyaW5nKSA9PiBwYXRoLmxlbmd0aCA8PSBNQVhfUEFUVEVSTl9LRVlfTEVOICYmIG1hdGNoZXNQYXR0ZXJuKHBhdGgsIGJ5UGF0aCksXG4gICAgICAgIH0pLFxuICAgICAgICBmaWVsZHM6IChuYW1lKSA9PiB0aGlzLmZpZWxkc09mKG5hbWUpLFxuICAgICAgfSxcbiAgICAgIHJvb3REZWNpZGVkLFxuICAgICAgLi4uKGJ5UGF0aC5sZW5ndGggPT09IDAgJiYgeyBtZW1vOiBuZXcgV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIHVua25vd24+PigpIH0pLFxuICAgICAgYnVkZ2V0OiB3YWxrTGltaXQsXG4gICAgICBvbkxpbWl0OiAoKSA9PiB0aGlzLndhcm5XYWxrTGltaXQoYnlQYXRoKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIE9uY2UgcGVyIHJ1bGUsIGluIGRldiBtb2RlOiBhIHBhdGggd2FsayBwYXNzZWQgaXRzIGxpbWl0IGFuZCBzZXJ2ZWQgaXRzIHJlbWFpbmRlciBhcyB0aGUgcGxhY2Vob2xkZXIuICovXG4gIHByaXZhdGUgd2FybldhbGtMaW1pdChwYXR0ZXJuczogcmVhZG9ubHkgUmVnRXhwW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy53YWxrTGltaXRXYXJuZWQgfHwgIWlzRGV2TW9kZSgpKSByZXR1cm47XG4gICAgdGhpcy53YWxrTGltaXRXYXJuZWQgPSB0cnVlO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgYFtmb290cHJpbnRdIFJlZGFjdGlvblBvbGljeTogYSB2YWx1ZSB3aXRoIG1vcmUgdGhhbiAke3dhbGtMaW1pdH0gcGF0aHMgdW5kZXIgdGhlIHBhdGggcGF0dGVybihzKSBgICtcbiAgICAgICAgYCR7cGF0dGVybnMubWFwKFN0cmluZykuam9pbignLCAnKX0g4oCUIHRoZSBwYXRocyBwYXN0IHRoYXQgd2VyZSBzZXJ2ZWQgYXMgdGhlIHBsYWNlaG9sZGVyLiBgICtcbiAgICAgICAgJ0EgcGF0dGVybiB0aGF0IG5hbWVzIGEgS0VZIChubyBkb3QsIG5vIGxvb2thcm91bmQpIGlzIGRlY2lkZWQgcGVyIG9iamVjdDsgcHJlZmVyIG9uZSwgb3Iga2V5cy9maWVsZHMuJyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkb3R0ZWQga2V5cyBhbmQgbWFya3MgdGhhdCBuYW1lIGEgcGF0aCB1bmRlciBgYmFzZWAgKHRoZSB3YWxrJ3Mgcm9vdDpcbiAgICogYHVuZGVmaW5lZGAgZm9yIGEgcmVjb3JkJ3Mgb3duIGtleXMsIGFuIGVudHJ5J3MgbmFtZSBmb3IgYSBkaWFnbm9zdGljKSxcbiAgICogYXMgdGFyZ2V0cyByZWxhdGl2ZSB0byBpdCDigJQgYSBkb3R0ZWQgcnVsZSBpcyBleGFjdCB0byBpdHMgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgZG90dGVkVGFyZ2V0cyhiYXNlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBUYXJnZXRbXSB7XG4gICAgY29uc3QgcHJlZml4ID0gYmFzZSA9PT0gdW5kZWZpbmVkID8gJycgOiBgJHtiYXNlfS5gO1xuICAgIGNvbnN0IG91dDogVGFyZ2V0W10gPSBbXTtcbiAgICBjb25zdCBhZGQgPSAobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICBpZiAoIW5hbWUuaW5jbHVkZXMoJy4nKSB8fCAhbmFtZS5zdGFydHNXaXRoKHByZWZpeCkgfHwgbmFtZS5sZW5ndGggPT09IHByZWZpeC5sZW5ndGgpIHJldHVybjtcbiAgICAgIG91dC5wdXNoKG5hbWUuc2xpY2UocHJlZml4Lmxlbmd0aCkuc3BsaXQoJy4nKSk7XG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdGhpcy5tYXJrZWQpIGFkZChuYW1lKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdGhpcy5wb2xpY3k/LmtleXMgPz8gW10pIGFkZChuYW1lKTtcbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgYW55IG9ic2VydmVyIGlzIHNlcnZlZCBmb3IgYSB0aHJvd24gdmFsdWUg4oCUIHJldHJ5LCB0aHJvdHRsZSwgcnVuXG4gICAqIGZhaWx1cmUsIGEgZm9yayBlbnZlbG9wZSwgdGhlIGxvZ2dlcjogaXRzIHJlbWVtYmVyZWQgc3RhZ2UgZm9ybSwgZWxzZSB0aGVcbiAgICogc2FtZSBkZWNpc2lvbiBtYWRlIG5vdyAoYW5kIHJlbWVtYmVyZWQpLCBlbHNlIGl0cyBzdHJ1Y3R1cmVkIGluZm8uXG4gICAqL1xuICBzZXJ2ZWRFcnJvcihlcnJvcjogdW5rbm93bik6IFN0cnVjdHVyZWRFcnJvckluZm8ge1xuICAgIGNvbnN0IG1hc2tlZCA9IHRoaXMubWFza2VkRXJyb3IoZXJyb3IpO1xuICAgIC8vIEVhY2ggZXZlbnQgZ2V0cyBpdHMgb3duIG9iamVjdCwgYXMgZXh0cmFjdEVycm9ySW5mbyBnaXZlcyBpdCBvbmUuXG4gICAgcmV0dXJuIG1hc2tlZCA/IHsgLi4ubWFza2VkIH0gOiBleHRyYWN0RXJyb3JJbmZvKGVycm9yKTtcbiAgfVxuXG4gIC8qKiBXaGF0IHRoZSBsb2dnZXIgaXMgaGFuZGVkOiB0aGUgdGhyb3duIHZhbHVlIGl0c2VsZiB1bmxlc3MgdGhlIHBvbGljeSBtYXNrZWQgaXRzIHRleHQuICovXG4gIGxvZ2dhYmxlRXJyb3IoZXJyb3I6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBjb25zdCBtYXNrZWQgPSB0aGlzLm1hc2tlZEVycm9yKGVycm9yKTtcbiAgICByZXR1cm4gbWFza2VkID8geyAuLi5tYXNrZWQgfSA6IGVycm9yO1xuICB9XG5cbiAgcHJpdmF0ZSBtYXNrZWRFcnJvcihlcnJvcjogdW5rbm93bik6IFN0cnVjdHVyZWRFcnJvckluZm8gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGtub3duID0gdGhpcy5tYXNrZWRFcnJvcnM/LmdldChlcnJvcik7XG4gICAgaWYgKGtub3duIHx8ICh0aGlzLmlzRGlhZ25vc3RpY0luZXJ0KCkgJiYgIXRoaXMubWFza2VkRXJyb3JzPy5hbnkpKSByZXR1cm4ga25vd247XG4gICAgY29uc3QgdGV4dCA9IHRocm93blRleHQoZXJyb3IpO1xuICAgIHRoaXMucmV0YWluU3RhZ2VFcnJvcihlcnJvciwgdGV4dCwgdGhpcy5yZXRhaW5EaWFnbm9zdGljKFsnZXJyb3JzJywgJ3N0YWdlRXhlY3V0aW9uRXJyb3InXSwgdGV4dCkpO1xuICAgIHJldHVybiB0aGlzLm1hc2tlZEVycm9ycz8uZ2V0KGVycm9yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RoaW5nIGNhbiBtYXNrIGEgZGlhZ25vc3RpYyBlbnRyeSBvciBhIHRocm93biB2YWx1ZSDigJQgbm8gc3RhdGUgc2VsZWN0b3IsXG4gICAqIG5vIG1hcmssIG5vIGRpYWdub3N0aWMgc2VsZWN0b3I6IHRoZSBjb2xsZWN0b3JzJyBhbmQgdGhlIGVycm9yIHBhdGhzJyBmYXN0XG4gICAqIHBhdGggKGEgbm8tcG9saWN5IHJ1biBuZXZlciByZWFkcyBhIHBheWxvYWQsIGluY2x1ZGluZyBib3Jyb3dlZCBnZXR0ZXJzKS5cbiAgICovXG4gIGlzRGlhZ25vc3RpY0luZXJ0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzSW5lcnQoKSAmJiB0aGlzLmlzRmxvd1RleHRJbmVydCgpO1xuICB9XG5cbiAgLyoqIE5vdGhpbmcgY2FuIG1hc2sgZmxvdy1tZXNzYWdlIHRleHQg4oCUIG9ubHkgYHBvbGljeS5kaWFnbm9zdGljc2Agc2VsZWN0cyBpdCAoe0BsaW5rIHJldGFpbkZsb3dUZXh0fSkuICovXG4gIGlzRmxvd1RleHRJbmVydCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gIXRoaXMuZGlhZ25vc3RpY1J1bGUgfHwgdGhpcy5kaWFnbm9zdGljUnVsZS5pc0luZXJ0KCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZlcmRpY3QgZm9yIGEgdXNlci1sZXZlbCBwYXRoIOKAlCBgWydwcm9maWxlJ11gIGZvciBhIHNjb3BlIGtleSxcbiAgICogYFsncHJvZmlsZScsICdhdXRoJ11gIGZvciBhIG5lc3RlZCB3cml0ZSBzdWNoIGFzIGEgc3ViZmxvdyBzZWVkLlxuICAgKlxuICAgKiBFdmVyeSBkb3R0ZWQgcHJlZml4IGlzIHRlc3RlZCBhdCBrZXkgbGV2ZWwgKGBwcm9maWxlYCwgdGhlblxuICAgKiBgcHJvZmlsZS5hdXRoYCksIHNvIGEgcG9saWN5IHRoYXQgbmFtZXMgYSBrZXkgY292ZXJzIGV2ZXJ5dGhpbmcgd3JpdHRlblxuICAgKiBiZW5lYXRoIGl0LiBgZmllbGRzYCBhcmUgZGVjbGFyZWQgcmVsYXRpdmUgdG8gdGhlIFRPUCBrZXk7IGZvciBhIG5lc3RlZFxuICAgKiBwYXRoIHRoZXkgYXJlIHJlLWJhc2VkIG9udG8gdGhlIHZhbHVlIGJlaW5nIHdyaXR0ZW4sIGFuZCBhIGZpZWxkIHRoYXRcbiAgICogbmFtZXMgdGhlIHdyaXR0ZW4gcGF0aCBleGFjdGx5IG1ha2VzIHRoZSB3aG9sZSB2YWx1ZSBzZWNyZXQuXG4gICAqL1xuICB2ZXJkaWN0KHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm4gQ0xFQVI7XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAxKSByZXR1cm4gdGhpcy52ZXJkaWN0T2ZLZXkocGF0aFswXSk7XG4gICAgbGV0IGRvdHRlZCA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykge1xuICAgICAgZG90dGVkID0gaSA9PT0gMCA/IHBhdGhbMF0gOiBgJHtkb3R0ZWR9LiR7cGF0aFtpXX1gO1xuICAgICAgaWYgKHRoaXMuaXNLZXlSZWRhY3RlZChkb3R0ZWQpKSByZXR1cm4geyBraW5kOiAnd2hvbGUnLCBrZXk6IGRvdHRlZCB9O1xuICAgIH1cbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkc09mKHBhdGhbMF0pO1xuICAgIGlmICghZmllbGRzIHx8IGZpZWxkcy5sZW5ndGggPT09IDApIHJldHVybiBDTEVBUjtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDEpIHJldHVybiB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6IHBhdGhbMF0sIHBhdGhzOiBmaWVsZHMgfTtcbiAgICBjb25zdCByZWwgPSBwYXRoLnNsaWNlKDEpLmpvaW4oJy4nKTtcbiAgICBjb25zdCBpbnNpZGU6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHMpIHtcbiAgICAgIC8vIFRoZSB3cml0dGVuIHBhdGggSVMgYSBzZWNyZXQgZmllbGQ6IHRoZSB3aG9sZSB2YWx1ZSBpcyBzZWNyZXQsIGFuZFxuICAgICAgLy8gdGhlIGtleSB0aGF0IGRlY2lkZWQgaXQgaXMgdGhhdCBkb3R0ZWQgcGF0aCDigJQgbmV2ZXIgdGhlIHRvcCBrZXksXG4gICAgICAvLyB3aG9zZSBzaWJsaW5ncyBzdGF5IGNsZWFyLlxuICAgICAgaWYgKGZpZWxkID09PSByZWwpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleTogZG90dGVkIH07XG4gICAgICBpZiAoZmllbGQuc3RhcnRzV2l0aChgJHtyZWx9LmApKSBpbnNpZGUucHVzaChmaWVsZC5zbGljZShyZWwubGVuZ3RoICsgMSkpO1xuICAgIH1cbiAgICByZXR1cm4gaW5zaWRlLmxlbmd0aCA+IDAgPyB7IGtpbmQ6ICdmaWVsZHMnLCBrZXk6IHBhdGhbMF0sIHBhdGhzOiBpbnNpZGUgfSA6IENMRUFSO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB2ZXJkaWN0IGZvciBga2V5YCB3cml0dGVuIG9yIHJlYWQgdW5kZXIgYHBhdGhgIOKAlCB0aGUgY29tbW9uXG4gICAqIHNpbmdsZS1zZWdtZW50IGNhc2UgKGBwYXRoYCBlbXB0eTogZXZlcnkgZmFjYWRlIHdyaXRlIGFuZCByZWFkKSBkZWNpZGVzXG4gICAqIG9uIHRoZSBrZXkgc3RyaW5nIGFsb25lLCBubyBhcnJheSBhbGxvY2F0ZWQuXG4gICAqL1xuICB2ZXJkaWN0QXQocGF0aDogcmVhZG9ubHkgc3RyaW5nW10sIGtleTogc3RyaW5nKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgcmV0dXJuIHBhdGgubGVuZ3RoID09PSAwID8gdGhpcy52ZXJkaWN0T2ZLZXkoa2V5KSA6IHRoaXMudmVyZGljdChbLi4ucGF0aCwga2V5XSk7XG4gIH1cblxuICAvKiogVGhlIHNpbmdsZS1zZWdtZW50IHZlcmRpY3Q6IGtleS1sZXZlbCBoaXQg4oaSIHdob2xlOyBkZWNsYXJlZCBvciBpbmhlcml0ZWQgZmllbGRzIOKGkiBmaWVsZHMuICovXG4gIHByaXZhdGUgdmVyZGljdE9mS2V5KGtleTogc3RyaW5nKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgaWYgKHRoaXMuaXNLZXlSZWRhY3RlZChrZXkpKSByZXR1cm4geyBraW5kOiAnd2hvbGUnLCBrZXkgfTtcbiAgICBjb25zdCBmaWVsZHMgPSB0aGlzLmZpZWxkc09mKGtleSk7XG4gICAgcmV0dXJuIGZpZWxkcyAhPT0gdW5kZWZpbmVkICYmIGZpZWxkcy5sZW5ndGggPiAwID8geyBraW5kOiAnZmllbGRzJywga2V5LCBwYXRoczogZmllbGRzIH0gOiBDTEVBUjtcbiAgfVxuXG4gIC8qKiBUaGUgc2VjcmV0IGZpZWxkcyBvZiBhIHRvcCBrZXk6IHRoZSBwb2xpY3kncywgcGx1cyBhbnkgYSBtYXBwZXIgaGFuZGVkIGl0ICh7QGxpbmsgTWFwcGVyVGFpbnR9KS4gKi9cbiAgcHJpdmF0ZSBmaWVsZHNPZihrZXk6IHN0cmluZyk6IHJlYWRvbmx5IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBkZWNsYXJlZCA9IGRlY2xhcmVkRmllbGRzKHRoaXMucG9saWN5Py5maWVsZHMsIGtleSk7XG4gICAgY29uc3QgaW5oZXJpdGVkID0gdGhpcy5pbmhlcml0ZWQ/LmdldChrZXkpO1xuICAgIGlmIChpbmhlcml0ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGRlY2xhcmVkO1xuICAgIHJldHVybiBkZWNsYXJlZCA9PT0gdW5kZWZpbmVkID8gaW5oZXJpdGVkIDogWy4uLm5ldyBTZXQoWy4uLmRlY2xhcmVkLCAuLi5pbmhlcml0ZWRdKV07XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJ1bidzIG1hcmtzIGFuZCB0aGUgZmllbGRzIG1hcHBlcnMgaGFuZGVkIHRvIG5ldyBrZXlzLCBhcyBOQU1FUyDigJQgd2hhdFxuICAgKiBhIHBhdXNlIGNhcnJpZXMgdG8gdGhlIHJlc3VtZWQgcnVuIChgRmxvd2NoYXJ0Q2hlY2twb2ludC5yZWRhY3Rpb25NYXJrc2ApLlxuICAgKiBgdW5kZWZpbmVkYCB3aGVuIHRoZXJlIGFyZSBub25lIChubyBwb2xpY3ksIG5vIHBlci1jYWxsIG1hcmspLlxuICAgKi9cbiAgbWFya3NGb3JDaGVja3BvaW50KCk6IFJlZGFjdGlvbk1hcmtzIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5tYXJrZWQuc2l6ZSA9PT0gMCAmJiB0aGlzLmluaGVyaXRlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB7XG4gICAgICBrZXlzOiBbLi4udGhpcy5tYXJrZWRdLFxuICAgICAgLi4uKHRoaXMuaW5oZXJpdGVkICE9PSB1bmRlZmluZWQgJiYge1xuICAgICAgICBmaWVsZHM6IE9iamVjdC5mcm9tRW50cmllcyhbLi4udGhpcy5pbmhlcml0ZWRdLm1hcCgoW2tleSwgcGF0aHNdKSA9PiBba2V5LCBbLi4ucGF0aHNdXSkpLFxuICAgICAgfSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiBTZWVkIGEgcmVzdW1lZCBydW4ncyBydWxlIHdpdGggdGhlIG1hcmtzIGl0cyBwYXVzZSBjYXJyaWVkICh7QGxpbmsgbWFya3NGb3JDaGVja3BvaW50fSkuICovXG4gIHJlc3RvcmVNYXJrcyhtYXJrczogUmVkYWN0aW9uTWFya3MpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBtYXJrcy5rZXlzKSB0aGlzLm1hcmtlZC5hZGQoa2V5KTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHBhdGhzXSBvZiBPYmplY3QuZW50cmllcyhtYXJrcy5maWVsZHMgPz8ge30pKSB0aGlzLmluaGVyaXRGaWVsZHMoa2V5LCBwYXRocyk7XG4gIH1cblxuICAvKipcbiAgICogQSBzdWJmbG93IG1hcHBlcidzIGNvcHkgaW5oZXJpdHMgdGhlIGZpZWxkcyBvZiB0aGUgdmFsdWUgaXQgY29waWVkOlxuICAgKiBgdGFyZ2V0YCBpcyBhIGtleSB0aGUgbWFwcGVyIHdyb3RlOyBgcGF0aHNgIHRoZSBzb3VyY2Uga2V5J3MgZmllbGQgcGF0aHNcbiAgICogKGRlY2xhcmVkIG9yIHRoZW1zZWx2ZXMgaW5oZXJpdGVkKS4gUnVuLXdpZGUsIGJ5IG5hbWUsIGxpa2UgYSBtYXJrLlxuICAgKi9cbiAgaW5oZXJpdEZpZWxkcyh0YXJnZXQ6IHN0cmluZywgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgY29uc3QgcHJpb3IgPSB0aGlzLmluaGVyaXRlZD8uZ2V0KHRhcmdldCkgPz8gW107XG4gICAgKHRoaXMuaW5oZXJpdGVkID8/PSBuZXcgTWFwKCkpLnNldCh0YXJnZXQsIFsuLi5uZXcgU2V0KFsuLi5wcmlvciwgLi4ucGF0aHNdKV0pO1xuICB9XG5cbiAgLyoqIFRoZSB2ZXJkaWN0IG9mIGEga2V5IGEgbWFwcGVyIHJlYWQg4oCUIGBydW5zYCAodGhlIHJ1biBuYW1lc3BhY2VzLCBgUlVOX05BTUVTUEFDRWApIGlzIHNlbGVjdGVkIHdoZW4gYW55IG5hbWVzcGFjZWQga2V5IGlzLiAqL1xuICB2ZXJkaWN0T2ZSZWFkKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFJlZGFjdGlvblZlcmRpY3Qge1xuICAgIGNvbnN0IHZlcmRpY3QgPSB0aGlzLnZlcmRpY3RPZktleShrZXkpO1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicgfHwga2V5ICE9PSBSVU5fTkFNRVNQQUNFIHx8IHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldHVybiB2ZXJkaWN0O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHNwYWNlIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSB7XG4gICAgICBpZiAoc3BhY2UgPT09IG51bGwgfHwgdHlwZW9mIHNwYWNlICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICBmb3IgKGNvbnN0IGlubmVyIG9mIE9iamVjdC5rZXlzKHNwYWNlKSkge1xuICAgICAgICBpZiAodGhpcy52ZXJkaWN0T2ZLZXkoaW5uZXIpLmtpbmQgIT09ICdjbGVhcicpIHJldHVybiB7IGtpbmQ6ICd3aG9sZScsIGtleSB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmVyZGljdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0YWluZWQgLyBzZXJ2ZWQgZm9ybSBvZiBhIHZhbHVlIGF0IGEgcGF0aDogdGhlIHBsYWNlaG9sZGVyLCBhXG4gICAqIHNjcnViYmVkIENMT05FLCBvciB0aGUgdmFsdWUgaXRzZWxmIChzYW1lIHJlZmVyZW5jZSDigJQgcmVjb3JkZXJzIHJlY2VpdmVcbiAgICogYm9ycm93ZWQgbGl2ZSByZWZlcmVuY2VzIGZvciBjbGVhciB2YWx1ZXMsIGFzIHRoZXkgYWx3YXlzIGhhdmUpLlxuICAgKiBgcGxhY2Vob2xkZXJgIGRlZmF1bHRzIHRvIHRoZSBzY29wZS10aWVyIGAnW1JFREFDVEVEXSdgOyB0aGUgbWlycm9yIHNlZWRcbiAgICogcGFzc2VzIHRoZSBsb2cncyBgJ1JFREFDVEVEJ2AuXG4gICAqL1xuICByZXRhaW4ocGF0aDogcmVhZG9ubHkgc3RyaW5nW10sIHZhbHVlOiB1bmtub3duLCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiB1bmtub3duIHtcbiAgICByZXR1cm4gUmVkYWN0aW9uUnVsZS5hcHBseSh0aGlzLnZlcmRpY3QocGF0aCksIHZhbHVlLCBwbGFjZWhvbGRlcik7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJldGFpbmVkIGZvcm0gb2YgYSBTVEFURSByZWNvcmQgKHN0YXRlIHJlYWQsIG1pcnJvciBzZWVkKTogZWFjaCBvd25cbiAgICogZW51bWVyYWJsZSBzdHJpbmcga2V5IHRocm91Z2gge0BsaW5rIHJldGFpbn0uIEZpZWxkcyBhcmUgcGF0aHMgaW5zaWRlIHRoYXRcbiAgICoga2V5ZWQgdmFsdWUuIFNjYWxhcnMgYW5kIHJvb3QgYXJyYXlzIHBhc3MgdGhyb3VnaC4gQm91bmRhcnkgcmVjb3JkcyBhZGRcbiAgICogdGhlIG5lc3RlZC1rZXkgd2Fsazoge0BsaW5rIHJldGFpbkJvdW5kYXJ5fS5cbiAgICogUmV0dXJucyB0aGUgU0FNRSBvYmplY3Qgd2hlbiB1bmNoYW5nZWQuIEFuIGluZXJ0IHJ1bGUgZG9lcyBub3QgZW51bWVyYXRlXG4gICAqIHRoZSB2YWx1ZSwgc28gZXZlbiBhbiBhY2Nlc3NvciBpcyB1bnRvdWNoZWQgb24gdGhlIG5vLXBvbGljeSBmYXN0IHBhdGguXG4gICAqL1xuICByZXRhaW5SZWNvcmQ8VD4ocmVjb3JkOiBULCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiBUIHtcbiAgICBpZiAodGhpcy5pc0luZXJ0KCkgfHwgcmVjb3JkID09PSBudWxsIHx8IHR5cGVvZiByZWNvcmQgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocmVjb3JkKSkgcmV0dXJuIHJlY29yZDtcbiAgICBsZXQgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhyZWNvcmQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgICBjb25zdCBrZXB0ID0gdGhpcy5yZXRhaW4oW2tleV0sIHZhbHVlLCBwbGFjZWhvbGRlcik7XG4gICAgICBpZiAoa2VwdCA9PT0gdmFsdWUpIGNvbnRpbnVlO1xuICAgICAgb3V0ID8/PSB7IC4uLihyZWNvcmQgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIH07XG4gICAgICBvdXRba2V5XSA9IGtlcHQ7XG4gICAgfVxuICAgIHJldHVybiAob3V0ID8/IHJlY29yZCkgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgcmV0YWluZWQgZm9ybSBvZiBhIEJPVU5EQVJZIHJlY29yZCDigJQgcm9vdCBpbnB1dC9vdXRwdXQgYW5kIGEgc3ViZmxvdydzXG4gICAqIG1hcHBlZCBzZWVkLCBiZWZvcmUgYW55IG9ic2VydmVyIHNlZXMgaXQuIHtAbGluayByZXRhaW5SZWNvcmR9IGRlY2lkZXMgZWFjaFxuICAgKiB0b3Aga2V5OyB0aGVuIGV2ZXJ5IE5FU1RFRCBvd24ga2V5IGlzIGEga2V5IHRvbzogc2VjcmV0IHdoZW4gaXRzIG93biBuYW1lXG4gICAqIG9yIGl0cyBkb3R0ZWQgcGF0aCBpcyByZWRhY3RlZCBhdCBrZXkgbGV2ZWwgKGBrZXlzOiBbJ3NlY3JldCddYCBjb3ZlcnNcbiAgICogYHsgd3JhcHBlcjogeyBzZWNyZXQgfSB9YDsgYSByb290IGFycmF5J3MgZWxlbWVudHMgYXJlIHdhbGtlZCB0aGUgc2FtZVxuICAgKiB3YXkpLCBhbmQgaXRzIGRlY2xhcmVkIGBmaWVsZHNgIHNjcnViYmVkIGluc2lkZSBpdCAoYGZpZWxkczogeyBwcm9maWxlOlxuICAgKiBbJ3Rva2VuJ10gfWAgY292ZXJzIGB7IHdyYXBwZXI6IHsgcHJvZmlsZTogeyB0b2tlbiB9IH0gfWApLiBEZWNpZGVkIHBlclxuICAgKiBQQVRILCBjb3B5LW9uLXdyaXRlIHBlciBwYXRoICh7QGxpbmsgc2VydmVkQnlQYXRofSk6IGFuIG9iamVjdCBzaGFyZWQgYnlcbiAgICogdHdvIHBhdGhzIGlzIG1hc2tlZCBhdCB0aGUgb25lIGEgcGF0aCBydWxlIG5hbWVzIGFuZCBzZXJ2ZWQgYXMgaXQgaXMgYXRcbiAgICogdGhlIG90aGVyOyBhIGN5Y2xlIGVkZ2UgbGFuZHMgb24gdGhlIHNlcnZlZCBjb3B5LCBuZXZlciBvbiBhbiB1bnNjcnViYmVkXG4gICAqIG9yaWdpbmFsOyB0aGUgbGl2ZSB2YWx1ZSBpcyBuZXZlciB0b3VjaGVkLiBSZXR1cm5zIHRoZSBTQU1FIG9iamVjdCB3aGVuXG4gICAqIG5vdGhpbmcgbmVzdGVkIGlzIHNlY3JldCwgYW5kIGFuIGluZXJ0IHJ1bGUgZW51bWVyYXRlcyBub3RoaW5nLiBTdGF0ZVxuICAgKiBrZWVwcyBpdHMgb3duIHBhdGggdmVyZGljdHMgKHtAbGluayB2ZXJkaWN0fSk7IHRoaXMgd2FsayBpcyBmb3IgcmVjb3Jkc1xuICAgKiBoYW5kZWQgb3V0IHdob2xlLlxuICAgKi9cbiAgcmV0YWluQm91bmRhcnk8VD4ocmVjb3JkOiBULCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiBUIHtcbiAgICAvLyBBIG1hc2tlZCBzdGFnZSBlcnJvciBpbnNpZGUgdGhlIHJlY29yZCAoYSBmb3JrIGVudmVsb3BlJ3MgYHJlc3VsdGApIGlzXG4gICAgLy8gc2VydmVkIGluIGl0cyBtYXNrZWQgZm9ybTogYW4gRXJyb3IncyBtZXNzYWdlIGlzIG5vbi1lbnVtZXJhYmxlIGFuZCBhXG4gICAgLy8gdGhyb3duIHN0cmluZyBpcyBhIHBsYWluIHZhbHVlLCBzbyBubyBrZXkgd2FsayBzZWVzIGVpdGhlci5cbiAgICBjb25zdCBzZXJ2ZWQgPSB0aGlzLm1hc2tlZEVycm9ycz8uYW55ID8gKHRoaXMud2l0aFNlcnZlZEVycm9ycyhyZWNvcmQpIGFzIFQpIDogcmVjb3JkO1xuICAgIGlmICh0aGlzLmlzSW5lcnQoKSB8fCBzZXJ2ZWQgPT09IG51bGwgfHwgdHlwZW9mIHNlcnZlZCAhPT0gJ29iamVjdCcpIHJldHVybiBzZXJ2ZWQ7XG4gICAgY29uc3QgdG9wID0gdGhpcy5yZXRhaW5SZWNvcmQoc2VydmVkLCBwbGFjZWhvbGRlcikgYXMgdW5rbm93biBhcyBvYmplY3Q7XG4gICAgLy8gQmVsb3cgdGhlIHRvcCBrZXlzLCBvbmUgZGVjaXNpb24gcGVyIFBBVEggKHRoZSB3aG9sZSByZWNvcmQgaXMgdGhlIHdhbGsncyByb290LCBzbyBhIGN5Y2xlXG4gICAgLy8gYmFjayB0byBpdCBsYW5kcyBvbiB0aGUgc2VydmVkIGNvcHkpLlxuICAgIHJldHVybiBzZXJ2ZWRCeVBhdGgodG9wLCB1bmRlZmluZWQsIHRoaXMuZG90dGVkVGFyZ2V0cyh1bmRlZmluZWQpLCB0aGlzLm5hbWVzV2Fsayh0cnVlKSwgcGxhY2Vob2xkZXIpIGFzIFQ7XG4gIH1cblxuICAvKipcbiAgICogQ29weS1vbi13cml0ZSBvdmVyIGNvbnRhaW5lcnM6IGV2ZXJ5IHJlbWVtYmVyZWQgbWFza2VkIGVycm9yIGJlY29tZXMgaXRzXG4gICAqIHNlcnZlZCBmb3JtIOKAlCBhbiBvYmplY3QgZXJyb3IgaXRzIG1hc2tlZCBzdHJ1Y3R1cmVkIGluZm8sIGEgdGhyb3duXG4gICAqIHN0cmluZy9udW1iZXIgaXRzIG1hc2tlZCB0ZXh0ICh0aGUgdmFsdWUga2VlcHMgYmVpbmcgYSBzY2FsYXIpLiBBIHNjYWxhciBpc1xuICAgKiBtYXRjaGVkIGJ5IFZBTFVFLCBzbyBhbiB1bnJlbGF0ZWQgZmllbGQgdGhhdCBoYXBwZW5zIHRvIGVxdWFsIGEgbWFza2VkXG4gICAqIHRocm93biBzdHJpbmcgaXMgbWFza2VkIHRvbzogb3Zlci1tYXNraW5nIGlzIHRoZSBzYWZlIGRpcmVjdGlvbi5cbiAgICogYHVuZGVmaW5lZGAvYG51bGxgL2Jvb2xlYW5zIGFyZSBuZXZlciBzd2FwcGVkIOKAlCB0aGV5IGNhcnJ5IG5vIHRleHQsIGFuZFxuICAgKiBzd2FwcGluZyB0aGVtIHdvdWxkIHJld3JpdGUgb3JkaW5hcnkgZGF0YSBzaGFwZXMuXG4gICAqXG4gICAqIENZQ0xFLVNBRkUgKHJldmlldyBmaW5kaW5nIDIpLiBUaGUgY29udGFpbmVycyB0aGF0IGNhbiBSRUFDSCBhIG1hc2tlZFxuICAgKiBlcnJvciBhcmUgZm91bmQgZmlyc3QgKHtAbGluayByZWFjaGluZ01hc2tlZEVycm9yc30g4oCUIHRoZSB3aG9sZSByZWFjaGFibGVcbiAgICogZ3JhcGgsIGN5Y2xlcyBpbmNsdWRlZCk7IGVhY2ggb2YgdGhlbSBpcyBjb3BpZWQsIGl0cyBjb3B5IGFsbG9jYXRlZCBhbmRcbiAgICogcmVtZW1iZXJlZCBCRUZPUkUgaXRzIGNoaWxkcmVuIGFyZSBmaWxsZWQsIHNvIGFuIGVkZ2UgYmFjayB0byBpdCDigJQgYSBjeWNsZVxuICAgKiDigJQgbGFuZHMgb24gdGhlIGNvcHksIG5ldmVyIG9uIHRoZSBvcmlnaW5hbCB0aGF0IHN0aWxsIGhvbGRzIHRoZSByYXcgZXJyb3IuXG4gICAqIEV2ZXJ5IG90aGVyIGNvbnRhaW5lciBrZWVwcyBpdHMgaWRlbnRpdHkuXG4gICAqL1xuICBwcml2YXRlIHdpdGhTZXJ2ZWRFcnJvcnModmFsdWU6IHVua25vd24pOiB1bmtub3duIHtcbiAgICBjb25zdCBsZWFmID0gdGhpcy5zZXJ2ZWRMZWFmKHZhbHVlKTtcbiAgICBpZiAobGVhZiAhPT0gS0VFUCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gbGVhZiA9PT0gS0VFUCA/IHZhbHVlIDogbGVhZjtcbiAgICBjb25zdCByZWFjaGluZyA9IHRoaXMucmVhY2hpbmdNYXNrZWRFcnJvcnModmFsdWUpO1xuICAgIGlmICghcmVhY2hpbmcuaGFzKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIGNvbnN0IGNvcGllcyA9IG5ldyBNYXA8b2JqZWN0LCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4oKTtcbiAgICBjb25zdCBjb3B5T2YgPSAobm9kZTogb2JqZWN0KTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPT4ge1xuICAgICAgY29uc3Qga25vd24gPSBjb3BpZXMuZ2V0KG5vZGUpO1xuICAgICAgaWYgKGtub3duICE9PSB1bmRlZmluZWQpIHJldHVybiBrbm93bjtcbiAgICAgIGNvbnN0IGNvcHkgPSAoQXJyYXkuaXNBcnJheShub2RlKSA/IG5vZGUuc2xpY2UoKSA6IHsgLi4ubm9kZSB9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgIGNvcGllcy5zZXQobm9kZSwgY29weSk7XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIGNoaWxkXSBvZiBPYmplY3QuZW50cmllcyhub2RlKSkge1xuICAgICAgICBjb25zdCBzZXJ2ZWQgPSB0aGlzLnNlcnZlZExlYWYoY2hpbGQpO1xuICAgICAgICBpZiAoc2VydmVkICE9PSBLRUVQKSBjb3B5W2tleV0gPSBzZXJ2ZWQ7XG4gICAgICAgIGVsc2UgaWYgKGNoaWxkICE9PSBudWxsICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcgJiYgcmVhY2hpbmcuaGFzKGNoaWxkKSkgY29weVtrZXldID0gY29weU9mKGNoaWxkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb3B5O1xuICAgIH07XG4gICAgcmV0dXJuIGNvcHlPZih2YWx1ZSk7XG4gIH1cblxuICAvKiogQSBtYXNrZWQgZXJyb3IncyBzZXJ2ZWQgZm9ybSDigJQgYEtFRVBgIGZvciBhbnl0aGluZyBlbHNlIChhIHNjYWxhciBuZXZlciBzd2FwcGVkLCBhIGNvbnRhaW5lcikuICovXG4gIHByaXZhdGUgc2VydmVkTGVhZih2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2Jvb2xlYW4nKSByZXR1cm4gS0VFUDtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgY29uc3QgbWFza2VkID0gdGhpcy5tYXNrZWRFcnJvcnM/LmdldCh2YWx1ZSk7XG4gICAgICByZXR1cm4gbWFza2VkID8geyAuLi5tYXNrZWQgfSA6IEtFRVA7XG4gICAgfVxuICAgIGNvbnN0IHN3YXBwYWJsZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnO1xuICAgIGNvbnN0IG1hc2tlZCA9IHN3YXBwYWJsZSA/IHRoaXMubWFza2VkRXJyb3JzPy5nZXQodmFsdWUpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiBtYXNrZWQgPyBtYXNrZWQubWVzc2FnZSA6IEtFRVA7XG4gIH1cblxuICAvKiogRXZlcnkgY29udGFpbmVyIHVuZGVyIGByb290YCAoaXRzZWxmIGluY2x1ZGVkKSBmcm9tIHdoaWNoIHNvbWUgcGF0aCByZWFjaGVzIGEgbWFza2VkIGVycm9yLiAqL1xuICBwcml2YXRlIHJlYWNoaW5nTWFza2VkRXJyb3JzKHJvb3Q6IG9iamVjdCk6IFNldDxvYmplY3Q+IHtcbiAgICBjb25zdCBwYXJlbnRzID0gbmV3IE1hcDxvYmplY3QsIG9iamVjdFtdPigpO1xuICAgIGNvbnN0IGhvbGRlcnM6IG9iamVjdFtdID0gW107XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8b2JqZWN0Pihbcm9vdF0pO1xuICAgIGNvbnN0IHN0YWNrOiBvYmplY3RbXSA9IFtyb290XTtcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3Qgbm9kZSA9IHN0YWNrLnBvcCgpITtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2YgT2JqZWN0LnZhbHVlcyhub2RlKSkge1xuICAgICAgICBpZiAodGhpcy5zZXJ2ZWRMZWFmKGNoaWxkKSAhPT0gS0VFUCkge1xuICAgICAgICAgIGhvbGRlcnMucHVzaChub2RlKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgICAgIGNvbnN0IG9mID0gcGFyZW50cy5nZXQoY2hpbGQpO1xuICAgICAgICBpZiAob2YgPT09IHVuZGVmaW5lZCkgcGFyZW50cy5zZXQoY2hpbGQsIFtub2RlXSk7XG4gICAgICAgIGVsc2Ugb2YucHVzaChub2RlKTtcbiAgICAgICAgaWYgKCFzZWVuLmhhcyhjaGlsZCkpIHtcbiAgICAgICAgICBzZWVuLmFkZChjaGlsZCk7XG4gICAgICAgICAgc3RhY2sucHVzaChjaGlsZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcmVhY2hpbmcgPSBuZXcgU2V0PG9iamVjdD4oKTtcbiAgICB3aGlsZSAoaG9sZGVycy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub2RlID0gaG9sZGVycy5wb3AoKSE7XG4gICAgICBpZiAocmVhY2hpbmcuaGFzKG5vZGUpKSBjb250aW51ZTtcbiAgICAgIHJlYWNoaW5nLmFkZChub2RlKTtcbiAgICAgIGhvbGRlcnMucHVzaCguLi4ocGFyZW50cy5nZXQobm9kZSkgPz8gW10pKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlYWNoaW5nO1xuICB9XG5cbiAgLyoqIERvZXMgYHZhbHVlYCBob2xkIG9uZSBvZiBgcGF0aHNgIOKAlCBhbiBvd24ga2V5IG9mIHRoYXQgbmFtZSwgb3IgYSBkb3R0ZWQgcGF0aCBpbnNpZGUgaXQ/ICovXG4gIHN0YXRpYyBob2xkc1BhdGhzKHZhbHVlOiBvYmplY3QsIHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICAgIGlmIChwYXRocyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZmFsc2U7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBwYXRoKSB8fCAocGF0aC5pbmNsdWRlcygnLicpICYmIG5hdGl2ZUhhcyh2YWx1ZSwgcGF0aCkpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHJldGFpbmVkIGZvcm0gb2YgYSB3aG9sZSBTVEFURSDigJQge0BsaW5rIHJldGFpblJlY29yZH0gb3ZlciB0aGUgcm9vdFxuICAgKiBrZXlzIEFORCBvdmVyIGV2ZXJ5IHJ1biBuYW1lc3BhY2UgdW5kZXIgYHJ1bnNgIChmb3JrIGNoaWxkcmVuIHdyaXRlXG4gICAqIHRoZXJlOyBhIGNoZWNrcG9pbnQncyBgc2hhcmVkU3RhdGVgIGNhcnJpZXMgaXQgYmFjayBhcyBhIHNlZWQpLiBUaGlzIGlzXG4gICAqIHdoYXQgc2VlZHMgdGhlIHJlZGFjdGVkIG1pcnJvcjogdGhlIHN0b3JlJ3Mgc3RhcnRpbmcgc3RhdGUsIHNjcnViYmVkXG4gICAqIHdpdGggdGhlIGxvZydzIHBsYWNlaG9sZGVyLCBzbyBhIHBvbGljeSBrZXkgdGhhdCBhcnJpdmVzIGJ5IHNlZWQgYW5kIGlzXG4gICAqIG5ldmVyIHJlLXdyaXR0ZW4gaXMgc3RpbGwgc2VydmVkIGFzIHRoZSBwbGFjZWhvbGRlci5cbiAgICovXG4gIHJldGFpblN0YXRlPFQ+KHN0YXRlOiBULCBwbGFjZWhvbGRlcjogc3RyaW5nID0gU0NPUEVfUExBQ0VIT0xERVIpOiBUIHtcbiAgICBjb25zdCBrZXB0ID0gdGhpcy5yZXRhaW5SZWNvcmQoc3RhdGUsIHBsYWNlaG9sZGVyKTtcbiAgICBpZiAoa2VwdCA9PT0gbnVsbCB8fCB0eXBlb2Yga2VwdCAhPT0gJ29iamVjdCcpIHJldHVybiBrZXB0O1xuICAgIGNvbnN0IHJ1bnMgPSAoa2VwdCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPilbUlVOX05BTUVTUEFDRV07XG4gICAgaWYgKHJ1bnMgPT09IG51bGwgfHwgdHlwZW9mIHJ1bnMgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkocnVucykpIHJldHVybiBrZXB0O1xuICAgIGxldCBzY3J1YmJlZFJ1bnM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3QgW3J1bklkLCByZWNvcmRdIG9mIE9iamVjdC5lbnRyaWVzKHJ1bnMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pKSB7XG4gICAgICBjb25zdCBrZXB0UnVuID0gdGhpcy5yZXRhaW5SZWNvcmQocmVjb3JkLCBwbGFjZWhvbGRlcik7XG4gICAgICBpZiAoa2VwdFJ1biA9PT0gcmVjb3JkKSBjb250aW51ZTtcbiAgICAgIHNjcnViYmVkUnVucyA/Pz0geyAuLi4ocnVucyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfTtcbiAgICAgIHNjcnViYmVkUnVuc1tydW5JZF0gPSBrZXB0UnVuO1xuICAgIH1cbiAgICByZXR1cm4gc2NydWJiZWRSdW5zID09PSB1bmRlZmluZWQgPyBrZXB0IDogKHsgLi4uKGtlcHQgYXMgb2JqZWN0KSwgW1JVTl9OQU1FU1BBQ0VdOiBzY3J1YmJlZFJ1bnMgfSBhcyBUKTtcbiAgfVxuXG4gIC8qKiBBcHBseSBhIHZlcmRpY3QgdG8gYSB2YWx1ZSDigJQgc2VlIHtAbGluayByZXRhaW59LiAqL1xuICBzdGF0aWMgYXBwbHkodmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCwgdmFsdWU6IHVua25vd24sIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUik6IHVua25vd24ge1xuICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBwbGFjZWhvbGRlcjtcbiAgICBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykgcmV0dXJuIFJlZGFjdGlvblJ1bGUuc2NydWJGaWVsZHModmFsdWUsIHZlcmRpY3QucGF0aHMsIHBsYWNlaG9sZGVyKSA/PyB2YWx1ZTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQSBkZWVwIGNsb25lIG9mIGB2YWx1ZWAgd2l0aCB0aGUgZ2l2ZW4gZG90LXBhdGhzIHJlcGxhY2VkIGJ5IHRoZVxuICAgKiBwbGFjZWhvbGRlciDigJQgYHVuZGVmaW5lZGAgd2hlbiBgdmFsdWVgIGlzIG5vdCBhbiBvYmplY3QgKHRoZXJlIGlzIG5vdGhpbmdcbiAgICogdG8gc2NydWIgaW4gYSBzY2FsYXI7IHRoZSBjYWxsZXIga2VlcHMgdGhlIHZhbHVlKS4gVGhlIGNsb25lIHJlZnVzZXMgYW5cbiAgICogdW5jbG9uZWFibGUgdmFsdWUuIEEgcGF0aCBuYW1lcyBhIGxpdGVyYWwga2V5IChgJ2EuYidgIGFzIG9uZSBwcm9wZXJ0eSlcbiAgICogYW5kLCB3aGVuIGRvdHRlZCwgdGhlIG5lc3RlZCBwYXRoOyBlYWNoIGlzIHNjcnViYmVkIHdoZXJlIGl0IGV4aXN0cywgcGVyXG4gICAqIFBBVEgg4oCUIGEgbm9kZSB0aGUgY2xvbmUgc2hhcmVzIGJldHdlZW4gdHdvIHBhdGhzIGlzIG1hc2tlZCBhdCB0aGUgbmFtZWRcbiAgICogb25lIG9ubHkgKHtAbGluayBzZXJ2ZWRCeVBhdGh9KS4gUGF0aHMgdGhhdCBkbyBub3QgZXhpc3QgYXJlIGlnbm9yZWQg4oCUXG4gICAqIHNjcnViYmluZyBuZXZlciBpbnZlbnRzIGEgZmllbGQuXG4gICAqL1xuICBzdGF0aWMgc2NydWJGaWVsZHMoXG4gICAgdmFsdWU6IHVua25vd24sXG4gICAgcGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICAgIHBsYWNlaG9sZGVyOiBzdHJpbmcgPSBTQ09QRV9QTEFDRUhPTERFUixcbiAgKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIC8vIFRoZSBjbG9uZSBkZXRhY2hlcyB0aGUgcmV0YWluZWQgdmFsdWUgKGFuZCByZWZ1c2VzIGFuIHVuY2xvbmVhYmxlIG9uZSk7IHRoZSBzY3J1YiBvbiBpdCBpc1xuICAgIC8vIGRlY2lkZWQgcGVyIFBBVEgsIHNvIGEgbm9kZSB0aGUgY2xvbmUgc2hhcmVzIGJldHdlZW4gdHdvIHBhdGhzIGlzIG1hc2tlZCBhdCB0aGUgbmFtZWQgb25lIG9ubHkuXG4gICAgY29uc3QgY29weSA9IHN0cnVjdHVyZWRDbG9uZSh2YWx1ZSkgYXMgb2JqZWN0O1xuICAgIHJldHVybiBzZXJ2ZWRCeVBhdGgoXG4gICAgICBjb3B5LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGFyZ2V0c09mKHBhdGhzKSxcbiAgICAgIHsgcm9vdERlY2lkZWQ6IGZhbHNlLCBtZW1vOiBuZXcgV2Vha01hcDxvYmplY3QsIE1hcDxzdHJpbmcsIHVua25vd24+PigpLCBidWRnZXQ6IHdhbGtMaW1pdCB9LFxuICAgICAgcGxhY2Vob2xkZXIsXG4gICAgKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIHJlcG9ydCgpOiBSZWRhY3Rpb25SZXBvcnQge1xuICAgIC8vIEtleWVkIGJ5IGEgTWFwLCB0aGVuIG1hZGUgb3duIGRhdGEga2V5cyBieSBgZnJvbUVudHJpZXNgOiBhIGtleSBhIG1hcHBlclxuICAgIC8vIHdyb3RlIGlzIGEgbmFtZSBmcm9tIGRhdGEsIGFuZCBvbiBhIHBsYWluIG9iamVjdCBgdG9TdHJpbmdgIHdvdWxkIHJlYWRcbiAgICAvLyB0aGUgaW5oZXJpdGVkIG1ldGhvZCBhbmQgYF9fcHJvdG9fX2Agd291bGQgY2FsbCB0aGUgcHJvdG90eXBlIHNldHRlci5cbiAgICBjb25zdCBmaWVsZFJlZGFjdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMucG9saWN5Py5maWVsZHMgPz8ge30pKSB7XG4gICAgICBmaWVsZFJlZGFjdGlvbnMuc2V0KGtleSwgWy4uLmZpZWxkc10pO1xuICAgIH1cbiAgICAvLyBGaWVsZHMgYSBtYXBwZXIgaGFuZGVkIHRvIGEgbmV3IGtleSBhcmUgc2NydWJiZWQgdW5kZXIgdGhhdCBrZXkgdG9vLlxuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiB0aGlzLmluaGVyaXRlZCA/PyBbXSkge1xuICAgICAgZmllbGRSZWRhY3Rpb25zLnNldChrZXksIFsuLi5uZXcgU2V0KFsuLi4oZmllbGRSZWRhY3Rpb25zLmdldChrZXkpID8/IFtdKSwgLi4uZmllbGRzXSldKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZGFjdGVkS2V5czogWy4uLnRoaXMubWFya2VkXSxcbiAgICAgIGZpZWxkUmVkYWN0aW9uczogT2JqZWN0LmZyb21FbnRyaWVzKGZpZWxkUmVkYWN0aW9ucyksXG4gICAgICBwYXR0ZXJuczogKHRoaXMucG9saWN5Py5wYXR0ZXJucyA/PyBbXSkubWFwKChwKSA9PiBwLnNvdXJjZSksXG4gICAgfTtcbiAgfVxufVxuXG4vLyDilIDilIDilIAgVGhlIHdyaXRlIGRlY2lzaW9uIOKAlCBvbmUgcGVyIHN0YWdlZCB3cml0ZSAoQzQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuLy9cbi8vIFdoYXQgdGhlIHJ1bidzIHJ1bGUgc2F5cyBhYm91dCBvbmUgc3RhZ2VkIHdyaXRlLCBhbmQgd2hhdCB0aGUgd3JpdGUgbGVhdmVzIG9uIHRoZSBydWxlLiBFdmVyeSBzdGFnZWRcbi8vIHdyaXRlIHBhc3NlcyBgU3RhZ2VDb250ZXh0IMK3IHN0YWdlV3JpdGVgICh0aGUgb25lIGZ1bm5lbDogZmFjYWRlIHdyaXRlcywgYSBzdWJmbG93IHNlZWQsIGFuXG4vLyBgb3V0cHV0TWFwcGVyYCBtZXJnZS1iYWNrLCBhIHJlc3VtZSByZS1zZWVkKSwgd2hpY2ggcnVucyB0aGUgZm91ciBzdGVwcyBpbiB0aGUgb3JkZXIgdGhlIHJlY29yZCBuZWVkczpcbi8vXG4vLyAgIDEuIFZFUkRJQ1QgIGBkZWNpZGVXcml0ZWAg4oCUIGFuIGV4cGxpY2l0IHBlci1jYWxsIGZsYWcsIGVsc2UgdGhlIHJ1bGUgdGhhdCBpcyBBQ1RJVkUgYXMgdGhlIHdyaXRlIGJlZ2lucy5cbi8vICAgMi4gSURFTlRJVFkgYGluaGVyaXRCeUlkZW50aXR5YCDigJQgd2l0aCB0aGUgZnJhbWUncyBzZWxlY3RlZCByZWFkcyBBUyBUSEVZIFNUQU5EIGFmdGVyIHN0ZXAgMTogYSBwb2xpY3lcbi8vICAgICAgICAgICAgICAgcGF0dGVybiBpcyB1c2VyIGNvZGUsIGFuZCBpdCBjYW4gcmVhZCBvbiB0aGUgdmVyeSBmcmFtZSB0aGF0IGlzIHdyaXRpbmcuXG4vLyAgIDMuIEJZVEVTICAgIHRoZSBjYWxsZXI6IGBSZWNvcmRGcmFtZSDCtyB3cml0ZShwYXRoLCB2YWx1ZSwgdmVyYiwgc2NydWJPZih2ZXJkaWN0KSlgLiBUaGUgcmVjb3JkIHdyaXRlc1xuLy8gICAgICAgICAgICAgICB0aGVtOyBpdCBuZXZlciBkZWNpZGVzIHRoZW0uXG4vLyAgIDQuIE1BUktTICAgIGBtYXJrU3RhZ2VkV3JpdGVgIOKAlCBvbmx5IG9uY2UgdGhlIHdyaXRlIHN0YWdlZDogYSB3cml0ZSB0aGF0IGZhaWxzIHRvIHN0YWdlIG1hcmtzIG5vdGhpbmcuXG4vL1xuLy8gU3RlcHMgMeKAkzIgYW5kIHN0ZXAgNCBhcmUgY2FsbHMgYXJvdW5kIHRoZSB3cml0ZSwgbm90IG9uZSBjYWxsIGJlZm9yZSBpdCwgYW5kIGVhY2ggcmVhZHMgdGhlIHJ1bGUgd2hlblxuLy8gaXQgYWN0cyDigJQgYXMgdGhlIGZ1bm5lbCBhbHdheXMgZGlkLCBzbyB1c2VyIGNvZGUgdGhhdCBydW5zIERVUklORyBhIHdyaXRlIChhIGdldHRlciBvbiB0aGUgdmFsdWUsIGFcbi8vIHBhdHRlcm4ncyBgdGVzdGApIGZpbmRzIHRoZSBzYW1lIHJ1bGUsIGFuZCBsZWF2ZXMgdGhlIHNhbWUgbWFya3MsIGFzIGJlZm9yZSBDNC5cblxuLyoqXG4gKiBTdGVwIDEg4oCUIFRIRSBWRVJESUNUIGZvciBvbmUgc3RhZ2VkIHdyaXRlOiBhbiBleHBsaWNpdCBwZXItY2FsbCBmbGFnIChgc2V0VmFsdWUoa2V5LCB2YWx1ZSwgdHJ1ZSlgKVxuICogbWFrZXMgdGhlIHZhbHVlIHNlY3JldCB3aG9sZSB1bmRlciBpdHMgdXNlci1sZXZlbCBrZXk7IGVsc2UgdGhlIGBhY3RpdmVgIHJ1bGUgZGVjaWRlcyBmcm9tIHRoZVxuICogdXNlci1sZXZlbCBwYXRoOyB3aXRoIG5vbmUgKG5vIHJ1bGUsIG9yIGFuIGluZXJ0IG9uZSDigJQgdGhlIGNhbGxlciBwYXNzZXMgYHVuZGVmaW5lZGApLCBjbGVhciwgd2l0aCBub1xuICogdmVyZGljdCBjYWxsIGFuZCBubyBwYXRoIGFsbG9jYXRpb24gKHRoZSBuby1wb2xpY3kgZmFzdCBwYXRoKS4gTWFya3Mgbm90aGluZy5cbiAqXG4gKiBgYGB0c1xuICogZGVjaWRlV3JpdGUobmV3IFJlZGFjdGlvblJ1bGUoeyBmaWVsZHM6IHsgY2FyZDogWydudW1iZXInXSB9IH0pLCBbXSwgJ2NhcmQnLCBmYWxzZSk7IC8vIHsga2luZDogJ2ZpZWxkcycsIGtleTogJ2NhcmQnLCBwYXRoczogWydudW1iZXInXSB9XG4gKiBkZWNpZGVXcml0ZSh1bmRlZmluZWQsIFsncHJvZmlsZSddLCAnYXV0aCcsIHRydWUpOyAvLyB7IGtpbmQ6ICd3aG9sZScsIGtleTogJ3Byb2ZpbGUuYXV0aCcgfVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZWNpZGVXcml0ZShcbiAgYWN0aXZlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkLFxuICBwYXRoOiByZWFkb25seSBzdHJpbmdbXSxcbiAga2V5OiBzdHJpbmcsXG4gIGV4cGxpY2l0OiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogUmVkYWN0aW9uVmVyZGljdCB7XG4gIGlmIChleHBsaWNpdCkgcmV0dXJuIHsga2luZDogJ3dob2xlJywga2V5OiB1c2VyS2V5T2YocGF0aCwga2V5KSB9O1xuICByZXR1cm4gYWN0aXZlICE9PSB1bmRlZmluZWQgPyBhY3RpdmUudmVyZGljdEF0KHBhdGgsIGtleSkgOiBDTEVBUjtcbn1cblxuLyoqXG4gKiBTdGVwIDIg4oCUIElERU5USVRZOiBhbiBPQkpFQ1QgdGhlIHN0YWdlIHJlYWQgdW5kZXIgYSBzZWxlY3RlZCBuYW1lIChgc2VsZWN0ZWRgIOKAlCB0aGUgZnJhbWUncyBzZWxlY3RlZFxuICogcmVhZHMsIGZpbGxlZCBieSBpdHMgdHJhY2tlZCByZWFkcyksIHdyaXR0ZW4gdW5kZXIgYW5vdGhlciBuYW1lIChgcy5wZXJzb24gPSBzLnByb2ZpbGVgKSwga2VlcHMgdGhhdFxuICogcmVhZCdzIHJ1bGUsIG1hdGNoZWQgYnkgaWRlbnRpdHk6IGEgd2hvbGUgcmVhZCBtYXJrcyB0aGUgbmV3IGtleSwgYSBgZmllbGRzYCByZWFkIGhhbmRzIGl0IHRoZSBmaWVsZHNcbiAqIChyZS1iYXNlZCB1bmRlciB0aGUgd3JpdHRlbiBwYXRoKSwgYW5kIHRoZSB2ZXJkaWN0IGlzIGFza2VkIGFnYWluLiBBIG5ldyBvYmplY3QsIGEgcHJpbWl0aXZlLCBvciBhXG4gKiB3cml0ZSBhbHJlYWR5IHdob2xlIGlzIHNlbGVjdGVkIGJ5IGl0cyBvd24gbmFtZSBvbmx5IOKAlCBgdmVyZGljdGAgY29tZXMgYmFjayBhcyBpdCBpcy4gRGVjaWRlZCBCRUZPUkVcbiAqIHRoZSB3cml0ZSwgYmVjYXVzZSB0aGUgdmVyZGljdCBuZWVkcyBpdDogYW4gaW5oZXJpdGFuY2Ugc3RheXMgZXZlbiBpZiB0aGUgd3JpdGUgdGhlbiBmYWlscyB0byBzdGFnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluaGVyaXRCeUlkZW50aXR5KFxuICBhY3RpdmU6IFJlZGFjdGlvblJ1bGUgfCB1bmRlZmluZWQsXG4gIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QsXG4gIHNlbGVjdGVkOiBXZWFrTWFwPG9iamVjdCwgUmVkYWN0aW9uVmVyZGljdD4gfCB1bmRlZmluZWQsXG4gIHBhdGg6IHJlYWRvbmx5IHN0cmluZ1tdLFxuICBrZXk6IHN0cmluZyxcbiAgdmFsdWU6IHVua25vd24sXG4pOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgY29uc3QgcmVhZCA9XG4gICAgYWN0aXZlICE9PSB1bmRlZmluZWQgJiYgdmVyZGljdC5raW5kICE9PSAnd2hvbGUnICYmIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCdcbiAgICAgID8gc2VsZWN0ZWQ/LmdldCh2YWx1ZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICBpZiAocmVhZCA9PT0gdW5kZWZpbmVkIHx8IGFjdGl2ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdmVyZGljdDtcbiAgaWYgKHJlYWQua2luZCA9PT0gJ3dob2xlJykgYWN0aXZlLm1hcmsodXNlcktleU9mKHBhdGgsIGtleSkpO1xuICBlbHNlIGlmIChyZWFkLmtpbmQgPT09ICdmaWVsZHMnKSB7XG4gICAgY29uc3QgYXQgPSBbLi4ucGF0aC5zbGljZSgxKSwgLi4uKHBhdGgubGVuZ3RoID4gMCA/IFtrZXldIDogW10pXTtcbiAgICBhY3RpdmUuaW5oZXJpdEZpZWxkcyhcbiAgICAgIHBhdGhbMF0gPz8ga2V5LFxuICAgICAgcmVhZC5wYXRocy5tYXAoKGZpZWxkKSA9PiBbLi4uYXQsIGZpZWxkXS5qb2luKCcuJykpLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGFjdGl2ZS52ZXJkaWN0QXQocGF0aCwga2V5KTtcbn1cblxuLyoqIFRoZSBzY3J1YiBvZiBhIHdob2xlIHZlcmRpY3Qg4oCUIG9uZSBmcm96ZW4gb2JqZWN0IGZvciBldmVyeSB3cml0ZSBpdCBjb3ZlcnMuICovXG5jb25zdCBXSE9MRV9TQ1JVQjogV3JpdGVTY3J1YiA9IE9iamVjdC5mcmVlemUoeyB3aG9sZTogdHJ1ZSB9KTtcblxuLyoqXG4gKiBTdGVwIDMncyBpbnB1dCDigJQgYSB2ZXJkaWN0J3MgQllURVMgZm9yIHRoZSByZWNvcmQgKGBSZWNvcmRGcmFtZSDCtyB3cml0ZWApOiBub3RoaW5nIHdoZW4gY2xlYXIsIHRoZVxuICogd2hvbGUgdmFsdWUsIG9yIHRoZSBmaWVsZHMgaW5zaWRlIGl0LiBObyBhbGxvY2F0aW9uIG9uIHRoZSBkZWZhdWx0IHBhdGggKGNsZWFyKSBvciBmb3IgYSB3aG9sZSB2ZXJkaWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NydWJPZih2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0KTogV3JpdGVTY3J1YiB8IHVuZGVmaW5lZCB7XG4gIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHJldHVybiBXSE9MRV9TQ1JVQjtcbiAgcmV0dXJuIHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycgPyB7IGZpZWxkczogdmVyZGljdC5wYXRocyB9IDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFN0ZXAgNCDigJQgdGhlIE1BUktTIGEgc3RhZ2VkIHdyaXRlIGxlYXZlczsgY2FsbCBpdCBvbmx5IG9uY2UgdGhlIHdyaXRlIHN0YWdlZCwgc28gYSB3cml0ZSB0aGF0IGZhaWxzIHRvXG4gKiBzdGFnZSBtYXJrcyBub3RoaW5nLiBBIGRlbGV0ZSBjbGVhcnMgaXRzIGtleSdzIG1hcmsgKGFuZCBhbnkgZmllbGRzIGEgbWFwcGVyIGhhbmRlZCBpdCkgb24gYGFjdGl2ZWAsXG4gKiB0aGUgcnVsZSB0aGF0IHdhcyBhY3RpdmUgYXMgdGhlIHdyaXRlIEJFR0FOIOKAlCBub25lIHdoZW4gaXQgd2FzIGluZXJ0LCBldmVuIGlmIHVzZXIgY29kZSBtYXJrZWQgdGhlIGtleVxuICogZHVyaW5nIHRoZSB3cml0ZS4gQSB3aG9sZSB2ZXJkaWN0IG1hcmtzIGl0cyBrZXkg4oCUIHRoZSBrZXkgdGhhdCBERUNJREVEIGl0IChgdmVyZGljdC5rZXlgOiBhbiBhbmNlc3RvclxuICogZm9yIGEgbmVzdGVkIHdyaXRlIHVuZGVyIGEgd2hvbGUtc2VsZWN0ZWQga2V5KSDigJQgZm9yIHRoZSByZXN0IG9mIHRoZSBydW4gb24gYHJ1bGVgLCB0aGUgcnVuJ3MgcnVsZSBhc1xuICogaXQgc3RhbmRzIE5PVyAodXNlciBjb2RlIGR1cmluZyB0aGUgd3JpdGUgbWF5IGhhdmUgaW5zdGFsbGVkIG9uZTsgYW4gZXhwbGljaXQgbWFyayBpcyB3aGF0IG1ha2VzIGFuXG4gKiBpbmVydCBydWxlIGFjdGl2ZSkuIEEgbWFyayBpcyBhIHJ1bi13aWRlIE5BTUU6IGl0IHN0YXlzIHdoZW4gdGhlIHN0YWdlJ3MgY29tbWl0IGZhaWxzIG9yIGEgcmV0cnlcbiAqIGRpc2NhcmRzIHRoZSBhdHRlbXB0IOKAlCB0aGUgc2FmZSBzaWRlOyBvbmx5IGEgc3RhZ2VkIGRlbGV0ZSByZW1vdmVzIG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtTdGFnZWRXcml0ZShcbiAgYWN0aXZlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkLFxuICBydWxlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkLFxuICB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0LFxuICBwYXRoOiByZWFkb25seSBzdHJpbmdbXSxcbiAga2V5OiBzdHJpbmcsXG4gIHZlcmI6IFdyaXRlVmVyYixcbik6IHZvaWQge1xuICBpZiAodmVyYiA9PT0gJ2RlbGV0ZScpIGFjdGl2ZT8udW5tYXJrKHVzZXJLZXlPZihwYXRoLCBrZXkpKTtcbiAgZWxzZSBpZiAodmVyZGljdC5raW5kID09PSAnd2hvbGUnKSBydWxlPy5tYXJrKHZlcmRpY3Qua2V5KTtcbn1cblxuLy8g4pSA4pSA4pSAIFRoZSBwYXRoIHdhbGsg4oCUIG9uZSBkZWNpc2lvbiBwZXIgUEFUSCDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbi8vXG4vLyBBIHJ1bGUgdGhhdCBuYW1lcyBhIFBBVEggKGEgZG90dGVkIGtleSwgYSBwYXR0ZXJuLCBhIGZpZWxkKSBtdXN0IGJlIGV4YWN0XG4vLyBldmVuIHdoZW4gb25lIG9iamVjdCBpcyByZWFjaGFibGUgYXQgdHdvIHBhdGhzOiB0aGUgZGVjaXNpb24gaXMgbWFkZSBwZXJcbi8vIHBhdGgsIG5ldmVyIHBlciBvYmplY3QsIGFuZCBhIGNvcHkgaXMgbWFkZSBwZXIgcGF0aCAoY29weS1vbi13cml0ZSkg4oCUIG5ldmVyXG4vLyBhIHNjcnViIGluIHBsYWNlIG9uIGEgbm9kZSBhbm90aGVyIHBhdGggc3RpbGwgc2hvd3MuIEEga2V5LU5BTUUgcnVsZSBpcyB0aGVcbi8vIHNhbWUgYXQgZXZlcnkgcGF0aCwgc28gYSBzaGFyZWQgbm9kZSBpdCBtYXNrcyBpcyBtYXNrZWQgZXZlcnl3aGVyZSDigJQgdGhlXG4vLyBzYWZlIHNpZGUuIEEgY3ljbGUgZWRnZSBpcyBub3QgZm9sbG93ZWQ6IGl0IGlzIHBvaW50ZWQgYXQgdGhlIGFuY2VzdG9yJ3Ncbi8vIHNlcnZlZCBjb3B5LlxuLy9cbi8vIExJTkVBUiBPTiBBIERBRy4gRG90dGVkIGtleXMgYW5kIG1hcmtzIGFyZSB3YWxrZWQgYXMgVEFSR0VUUyAocGF0aC1yZWxhdGl2ZVxuLy8gc3RhdGUsIGxpa2UgZmllbGRzKSwgYW5kIGEgcGF0dGVybiB0aGF0IGNhbiBvbmx5IG1hdGNoIHdpdGhpbiBhIGtleSBOQU1FXG4vLyAoe0BsaW5rIG5lZWRzUGF0aH0g4oCUIHRoZSBjb21tb24gY2FzZSwgYC9wYXNzd29yZC9pYCkgaXMgZGVjaWRlZCBieSB0aGUgbmFtZSxcbi8vIHNvIGEgZGVjaXNpb24gZGVwZW5kcyBvbmx5IG9uIHRoZSBvYmplY3QgYW5kIHRoZSB0YXJnZXRzIHN0aWxsIGxpdmUgYXQgaXQg4oCUXG4vLyBtZW1vaXplZCBwZXIgKG9iamVjdCwgdGFyZ2V0cyk6IGFuIG9iamVjdCBzaGFyZWQgYnkgbWFueSBwYXRocyAoYW4gYWdlbnQnc1xuLy8gbGlua2VkIGhpc3RvcnkpIGlzIGRlY2lkZWQgb25jZSwgYW5kIGl0cyBzZXJ2ZWQgY29weSBpcyBzaGFyZWQgdG9vLiBPbmx5IGFcbi8vIGdlbnVpbmVseSBQQVRILWRlcGVuZGVudCBwYXR0ZXJuIChgL15hXFwuYiQvYCkgd2Fsa3MgcGF0aHM7IHBhc3Rcbi8vIHtAbGluayBXQUxLX0xJTUlUfSBwYXRoIHZpc2l0cyBzdWNoIGEgd2FsayBzZXJ2ZXMgdGhlIHVudmlzaXRlZCByZW1haW5kZXIgYXNcbi8vIHRoZSBwbGFjZWhvbGRlciAodGhlIHNhZmUgc2lkZSksIHdhcm5zIG9uY2UgaW4gZGV2IG1vZGUsIGFuZCBuZXZlciBmYWlscy5cblxuLyoqIEEgZmllbGQgc3RpbGwgdG8gcmVhY2ggYmVsb3cgYSBub2RlOiB0aGUgcGF0aCBzZWdtZW50cyBsZWZ0IHRvIHdhbGsuICovXG50eXBlIFRhcmdldCA9IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4vKiogSG93IGEgd2FsayBkZWNpZGVzIGFuIGVkZ2UuICovXG5pbnRlcmZhY2UgV2FsayB7XG4gIC8qKiBLZXktbGV2ZWwgcnVsZXMgYXQgZXZlcnkgbmVzdGVkIGtleSDigJQgYWJzZW50IGZvciBhIGJhcmUgZmllbGQgc2NydWIgKHRhcmdldHMgb25seSkuICovXG4gIHJlYWRvbmx5IG5hbWVzPzoge1xuICAgIC8qKiBTZWxlY3RlZCB3aG9sZSBhdCB0aGlzIG5lc3RlZCBrZXkgYnkgaXRzIG93biBOQU1FIChtYXJrcywga2V5cywgcGF0dGVybnMpLiAqL1xuICAgIG1hc2tzKG5hbWU6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgLyoqIFNlbGVjdGVkIHdob2xlIGJ5IHRoZSBkb3R0ZWQgUEFUSCDigJQgcHJlc2VudCBvbmx5IHVuZGVyIHBhdHRlcm5zIChhIHBhdHRlcm4gaXMgdGVzdGVkIG9uIHRoZSBwYXRoKS4gKi9cbiAgICBwYXRoTWFza3M/KHBhdGg6IHN0cmluZyk6IGJvb2xlYW47XG4gICAgLyoqIFRoZSBkZWNsYXJlZCBmaWVsZHMgYmVsb3cgYSBrZXkgb2YgdGhpcyBuYW1lLiAqL1xuICAgIGZpZWxkcyhuYW1lOiBzdHJpbmcpOiByZWFkb25seSBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgfTtcbiAgLyoqIFRoZSByb290J3Mgb3duIGtleXMgd2VyZSBkZWNpZGVkIGJ5IHRoZSBjYWxsZXIgKGByZXRhaW5SZWNvcmRgKTogd2FsayBiZWxvdyB0aGVtIG9ubHkuICovXG4gIHJlYWRvbmx5IHJvb3REZWNpZGVkOiBib29sZWFuO1xuICAvKiogRGVjaXNpb25zIHNoYXJlZCBwZXIgKG9iamVjdCwgdGFyZ2V0cykg4oCUIGFic2VudCB3aGVuIGEgZGVjaXNpb24gZGVwZW5kcyBvbiB0aGUgcGF0aC4gKi9cbiAgcmVhZG9ubHkgbWVtbz86IFdlYWtNYXA8b2JqZWN0LCBNYXA8c3RyaW5nLCB1bmtub3duPj47XG4gIC8qKiBQYXRoIHZpc2l0cyBsZWZ0LiAqL1xuICBidWRnZXQ6IG51bWJlcjtcbiAgLyoqIFRvbGQgb25jZSB3aGVuIHRoZSB3YWxrIHBhc3NlcyBpdHMgbGltaXQuICovXG4gIHJlYWRvbmx5IG9uTGltaXQ/OiAoKSA9PiB2b2lkO1xuICAvKiogVGhlIHdhbGsgaGFzIHBhc3NlZCBpdHMgbGltaXQ6IHdoYXQgaXQgaGFzIG5vdCB2aXNpdGVkIGlzIHNlcnZlZCBhcyB0aGUgcGxhY2Vob2xkZXIuICovXG4gIGxpbWl0ZWQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFBhdGggdmlzaXRzIG9uZSB3YWxrIG1heSBtYWtlIOKAlCByZWFjaGFibGUgb25seSB1bmRlciBhIFBBVEgtZGVwZW5kZW50XG4gKiBwYXR0ZXJuIG92ZXIgYSB2YWx1ZSB3aG9zZSBwYXRocyBvdXRudW1iZXIgaXRzIG9iamVjdHMgKGEgbGlua2VkIGhpc3RvcnksIGFcbiAqIERBRyk6IGV2ZXJ5IG90aGVyIHdhbGsgc2hhcmVzIGl0cyBkZWNpc2lvbnMgcGVyIG9iamVjdCBhbmQgc3RheXMgbGluZWFyLlxuICovXG5leHBvcnQgY29uc3QgV0FMS19MSU1JVCA9IDFfMDAwXzAwMDtcblxuLyoqIFRoZSBsaW1pdCB3YWxrcyB1c2U6IHtAbGluayBXQUxLX0xJTUlUfSwgdW5sZXNzIGEgdGVzdCBsb3dlcmVkIGl0ICh7QGxpbmsgdXNlV2Fsa0xpbWl0fSkuICovXG5sZXQgd2Fsa0xpbWl0OiBudW1iZXIgPSBXQUxLX0xJTUlUO1xuXG4vKipcbiAqIEBpbnRlcm5hbCBUZXN0cyBvbmx5IOKAlCBub3Qgb24gYW55IHB1YmxpYyBkb29yOiB3YWxrcyB1c2UgYGxpbWl0YCB1bnRpbCB0aGVcbiAqIHJldHVybmVkIHJlc3RvcmUgaXMgY2FsbGVkLCBzbyBhIHRlc3QgcmVhY2hlcyB0aGUgb3Zlci1saW1pdCBwYXRoIGluIGFcbiAqIHRob3VzYW5kIHZpc2l0cyBpbnN0ZWFkIG9mIGEgbWlsbGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZVdhbGtMaW1pdChsaW1pdDogbnVtYmVyKTogKCkgPT4gdm9pZCB7XG4gIGNvbnN0IHByaW9yID0gd2Fsa0xpbWl0O1xuICB3YWxrTGltaXQgPSBsaW1pdDtcbiAgcmV0dXJuICgpID0+IHtcbiAgICB3YWxrTGltaXQgPSBwcmlvcjtcbiAgfTtcbn1cblxuLyoqXG4gKiBDYW4gYHBhdHRlcm5gIG1hdGNoIGEgZG90dGVkIFBBVEggd2hlcmUgaXQgbWF0Y2hlcyBub25lIG9mIHRoZSBwYXRoJ3NcbiAqIHNlZ21lbnQgTkFNRVM/IE9ubHkgdGhyb3VnaCBhIGNvbnN0cnVjdCB0aGF0IGNhbiBtYXRjaCBvciB0ZXN0IHRoZSBgLmBcbiAqIGJldHdlZW4gc2VnbWVudHM6IGAuYCBpdHNlbGYsIGFuIGVzY2FwZSB0aGF0IGNhbiBzdGFuZCBmb3IgaXQgKGBcXFcgXFxTIFxcRFxuICogXFxCIFxccCBcXFAgXFx1IFxceCBcXGNgLCBhIGRpZ2l0IGVzY2FwZSksIGEgbmVnYXRlZCBjbGFzcywgYSBjbGFzcyByYW5nZSB0aGF0XG4gKiBzcGFucyBgLmAsIGEgbG9va2Fyb3VuZCBvciBhIG5hbWVkIGdyb3VwLiBBbnl0aGluZyBlbHNlIG1hdGNoZXMgYSBwYXRoIG9ubHlcbiAqIGluc2lkZSBvbmUgc2VnbWVudCDigJQgYW5kIGFuIGFuY2VzdG9yIHdob3NlIE5BTUUgbWF0Y2hlcyBpcyBtYXNrZWQgd2hvbGVcbiAqIGJlZm9yZSB0aGUgd2FsayBnb2VzIGJlbG93IGl0LCBzbyB0aGUgbmFtZSBkZWNpZGVzLiBDb25zZXJ2YXRpdmU6IGB0cnVlYFxuICogd2hlbmV2ZXIgaW4gZG91YnQuXG4gKlxuICogTGluZWFyIGluIHRoZSBsZW5ndGggb2YgYHBhdHRlcm4uc291cmNlYDogZXZlcnkgc2NhbiBoZXJlIGlzIG9uZSBmb3J3YXJkXG4gKiBwYXNzICh7QGxpbmsgY2xhc3NCb2RpZXN9KSBvciBhIHJlZ2V4IHRoYXQgZG9lcyBjb25zdGFudCB3b3JrIHBlciBwb3NpdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5lZWRzUGF0aChwYXR0ZXJuOiBSZWdFeHApOiBib29sZWFuIHtcbiAgY29uc3Qgc291cmNlID0gcGF0dGVybi5zb3VyY2U7XG4gIGlmICgvXFwufFxcXFxbV1NEQnBQdXhjMC05XXxcXFtcXF58XFwoXFw/Wz0hPF0vLnRlc3Qoc291cmNlKSkgcmV0dXJuIHRydWU7XG4gIGZvciAoY29uc3QgYm9keSBvZiBjbGFzc0JvZGllcyhzb3VyY2UpKSB7XG4gICAgZm9yIChjb25zdCBbLCBsb3csIGhpZ2hdIG9mIGJvZHkubWF0Y2hBbGwoLyhcXFxcP1tcXHNcXFNdKS0oXFxcXD9bXFxzXFxTXSkvZykpIHtcbiAgICAgIGlmIChsb3cubGVuZ3RoID4gMSB8fCBoaWdoLmxlbmd0aCA+IDEgfHwgKGxvdyA8PSAnLicgJiYgaGlnaCA+PSAnLicpKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIFRoZSBib2R5IG9mIGVhY2ggY2hhcmFjdGVyIGNsYXNzIGluIGBzb3VyY2VgLCBsZWZ0IHRvIHJpZ2h0OiB0aGUgdGV4dFxuICogYmV0d2VlbiBhIGBbYCBhbmQgdGhlIGZpcnN0IGBdYCBhZnRlciBpdCB0aGF0IG5vIGBcXGAgZXNjYXBlcyAoYSBgXFxgIHRha2VzXG4gKiB0aGUgY2hhcmFjdGVyIGFmdGVyIGl0IGFsb25nKS4gT05FIGZvcndhcmQgcGFzcy5cbiAqXG4gKiBJdCByZXBsYWNlcyBgc291cmNlLm1hdGNoQWxsKC9cXFsoKD86XFxcXFtcXHNcXFNdfFteXFxdXFxcXF0pKilcXF0vZylgIGFuZCBnaXZlcyB0aGVcbiAqIHNhbWUgYm9kaWVzIGZvciBldmVyeSBzdHJpbmcgKHBpbm5lZCBhZ2FpbnN0IHRoYXQgcmVnZXggYXMgdGhlIGNvbnRyb2wsXG4gKiB0ZXN0L2xpYi9tZW1vcnkvc2VjdXJpdHkvbmVlZHMtcGF0aC1saW5lYXIuc2VjdXJpdHkudGVzdC50cykuIFRoZSByZWdleCB3YXNcbiAqIHF1YWRyYXRpYzogYWZ0ZXIgYSBgW2AgdGhhdCBuZXZlciBjbG9zZWQgaXQgcmV0cmllZCBhdCBldmVyeSBsYXRlciBgW2AsXG4gKiBlYWNoIHJldHJ5IHJlc2Nhbm5pbmcgdG8gdGhlIGVuZCDigJQgYFxcW2AgcmVwZWF0ZWQgMzIsMDAwIHRpbWVzIHRvb2sgMC43IHMsXG4gKiBhbmQgYHNldFBvbGljeWAgcnVucyBvbmNlIHBlciBzdGFnZSdzIHNjb3BlIChDb2RlUUwganMvcG9seW5vbWlhbC1yZWRvcykuXG4gKiBUaGUgcGFzcyBzdG9wcyBhdCB0aGUgZmlyc3QgYFtgIHRoYXQgbmV2ZXIgY2xvc2VzIGluc3RlYWQ6IGEgbGF0ZXIgYFtgXG4gKiBzdGFydHMgaXRzIGJvZHkgd2hlcmUgdGhlIGZhaWxlZCBzY2FuIHdhcyBhbHNvIGJldHdlZW4gdHdvIHRva2Vucywgc28gaXRcbiAqIHJlYWRzIHRoZSBzYW1lIHRhaWwgdGhlIHNhbWUgd2F5IGFuZCBjbG9zZXMgbm93aGVyZSBlaXRoZXIuXG4gKlxuICogQGludGVybmFsIEV4cG9ydGVkIGZvciB0aGF0IHRlc3Qgb25seSDigJQgbm90IG9uIGFueSBwdWJsaWMgZG9vci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsYXNzQm9kaWVzKHNvdXJjZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBib2RpZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBvcGVuID0gc291cmNlLmluZGV4T2YoJ1snKTtcbiAgd2hpbGUgKG9wZW4gIT09IC0xKSB7XG4gICAgY29uc3QgY2xvc2UgPSBjbG9zaW5nQnJhY2tldChzb3VyY2UsIG9wZW4gKyAxKTtcbiAgICBpZiAoY2xvc2UgPT09IC0xKSBicmVhaztcbiAgICBib2RpZXMucHVzaChzb3VyY2Uuc2xpY2Uob3BlbiArIDEsIGNsb3NlKSk7XG4gICAgb3BlbiA9IHNvdXJjZS5pbmRleE9mKCdbJywgY2xvc2UgKyAxKTtcbiAgfVxuICByZXR1cm4gYm9kaWVzO1xufVxuXG4vKiogVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBgXWAgYXQgb3IgYWZ0ZXIgYGZyb21gIHRoYXQgbm8gYFxcYCBlc2NhcGVzLCBlbHNlIC0xIChhIHRyYWlsaW5nIGxvbmUgYFxcYCBlc2NhcGVzIG5vdGhpbmcgYW5kIGNsb3NlcyBub3RoaW5nKS4gKi9cbmZ1bmN0aW9uIGNsb3NpbmdCcmFja2V0KHNvdXJjZTogc3RyaW5nLCBmcm9tOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgYXQgPSBmcm9tO1xuICB3aGlsZSAoYXQgPCBzb3VyY2UubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IHNvdXJjZVthdF07XG4gICAgaWYgKGNoYXIgPT09ICddJykgcmV0dXJuIGF0O1xuICAgIGF0ICs9IGNoYXIgPT09ICdcXFxcJyA/IDIgOiAxO1xuICB9XG4gIHJldHVybiAtMTtcbn1cblxuLyoqIGBzZXJ2ZWRMZWFmYCdzIGFuc3dlciBmb3IgYSB2YWx1ZSBpdCBsZWF2ZXMgYXMgaXQgaXMuICovXG5jb25zdCBLRUVQOiB1bmlxdWUgc3ltYm9sID0gU3ltYm9sKCdrZXB0IGFzIGl0IGlzJyk7XG5cbi8qKiBFYWNoIGZpZWxkIHBhdGggYXMgb25lIGxpdGVyYWwga2V5IGFuZCwgd2hlbiBkb3R0ZWQsIGFzIGl0cyBzZWdtZW50cy4gKi9cbmZ1bmN0aW9uIHRhcmdldHNPZihwYXRoczogcmVhZG9ubHkgc3RyaW5nW10gfCB1bmRlZmluZWQpOiBUYXJnZXRbXSB7XG4gIGNvbnN0IG91dDogVGFyZ2V0W10gPSBbXTtcbiAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzID8/IFtdKSB7XG4gICAgb3V0LnB1c2goW3BhdGhdKTtcbiAgICBpZiAocGF0aC5pbmNsdWRlcygnLicpKSBvdXQucHVzaChwYXRoLnNwbGl0KCcuJykpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBUaGUgbWVtbyBrZXkgb2YgYSB0YXJnZXQgc3RhdGUg4oCUIG9yZGVyLWZyZWUuICovXG5mdW5jdGlvbiBzaWduYXR1cmVPZih0YXJnZXRzOiByZWFkb25seSBUYXJnZXRbXSk6IHN0cmluZyB7XG4gIHJldHVybiB0YXJnZXRzLmxlbmd0aCA9PT0gMFxuICAgID8gJydcbiAgICA6IHRhcmdldHNcbiAgICAgICAgLm1hcCgodCkgPT4gdC5qb2luKCdcXHUwMDFmJykpXG4gICAgICAgIC5zb3J0KClcbiAgICAgICAgLmpvaW4oJ1xcdTAwMWUnKTtcbn1cblxuLyoqIE9uZSBlZGdlJ3MgZGVjaXNpb246IHRoZSB2YWx1ZSB1bmRlciBga2V5YCBpcyBtYXNrZWQgaGVyZSwgb3IgdGhlc2UgdGFyZ2V0cyBjb250aW51ZSBiZWxvdyBpdC4gKi9cbmZ1bmN0aW9uIGRlY2lkZUVkZ2UoXG4gIGtleTogc3RyaW5nLFxuICBkb3R0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgdGFyZ2V0czogcmVhZG9ubHkgVGFyZ2V0W10sXG4gIHdhbGs6IFdhbGssXG4gIGRlcHRoOiBudW1iZXIsXG4pOiB7IG1hc2tlZDogYm9vbGVhbjsgYmVsb3c6IFRhcmdldFtdIH0ge1xuICBjb25zdCBiZWxvdzogVGFyZ2V0W10gPSBbXTtcbiAgbGV0IG1hc2tlZCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IHRhcmdldCBvZiB0YXJnZXRzKSB7XG4gICAgaWYgKHRhcmdldFswXSAhPT0ga2V5KSBjb250aW51ZTtcbiAgICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMSkgbWFza2VkID0gdHJ1ZTtcbiAgICBlbHNlIGJlbG93LnB1c2godGFyZ2V0LnNsaWNlKDEpKTtcbiAgfVxuICBjb25zdCBuYW1lcyA9IHdhbGsucm9vdERlY2lkZWQgJiYgZGVwdGggPT09IDAgPyB1bmRlZmluZWQgOiB3YWxrLm5hbWVzO1xuICBpZiAobmFtZXMgIT09IHVuZGVmaW5lZCAmJiAhbWFza2VkKSB7XG4gICAgbWFza2VkID1cbiAgICAgIG5hbWVzLm1hc2tzKGtleSkgfHxcbiAgICAgIChuYW1lcy5wYXRoTWFza3MgIT09IHVuZGVmaW5lZCAmJiBkb3R0ZWQgIT09IHVuZGVmaW5lZCAmJiBuYW1lcy5wYXRoTWFza3MoYCR7ZG90dGVkfS4ke2tleX1gKSk7XG4gICAgYmVsb3cucHVzaCguLi50YXJnZXRzT2YobmFtZXMuZmllbGRzKGtleSkpKTtcbiAgfVxuICByZXR1cm4geyBtYXNrZWQsIGJlbG93IH07XG59XG5cbi8qKiBPbmUgc3RlcCBkb3duIGEgd2FsaydzIHBhdGg6IGNvdW50IHRoZSB2aXNpdCDigJQgYGZhbHNlYCBvbmNlIHRoZSB3YWxrIGlzIHBhc3QgaXRzIGxpbWl0LiAqL1xuZnVuY3Rpb24gdmlzaXQod2FsazogV2Fsayk6IGJvb2xlYW4ge1xuICBpZiAoLS13YWxrLmJ1ZGdldCA+PSAwKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKCF3YWxrLmxpbWl0ZWQpIHtcbiAgICB3YWxrLmxpbWl0ZWQgPSB0cnVlO1xuICAgIHdhbGsub25MaW1pdD8uKCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIElzIGFueXRoaW5nIHNlbGVjdGVkIG9uIHNvbWUgUEFUSCB1bmRlciBgbm9kZWA/IFJlYWQtb25seTsgYSBjeWNsZSBlZGdlIGlzXG4gKiBub3QgZm9sbG93ZWQuIGBiYWNrYCBpcyB0aGUgc2hhbGxvd2VzdCBhbmNlc3RvciBhIHNraXBwZWQgY3ljbGUgZWRnZSBiZWxvd1xuICogcmVhY2hlZCDigJQgYSBgZmFsc2VgIHRoYXQgcmVzdHMgb24gb25lIGlzIG5vdCBzaGFyZWQgKG1lbW8pLlxuICovXG5mdW5jdGlvbiBzZWxlY3RzQnlQYXRoKFxuICBub2RlOiBvYmplY3QsXG4gIGRvdHRlZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB0YXJnZXRzOiByZWFkb25seSBUYXJnZXRbXSxcbiAgd2FsazogV2FsayxcbiAgYW5jZXN0b3JzOiBNYXA8b2JqZWN0LCBudW1iZXI+LFxuICBkZXB0aDogbnVtYmVyLFxuKTogeyBzZWxlY3RlZDogYm9vbGVhbjsgYmFjazogbnVtYmVyIH0ge1xuICAvLyBQYXN0IHRoZSBsaW1pdDogYXNzdW1lIGEgc2VsZWN0aW9uIOKAlCB0aGUgY29weSBzZXJ2ZXMgdGhlIHVudmlzaXRlZCByZW1haW5kZXIgYXMgdGhlIHBsYWNlaG9sZGVyLlxuICBpZiAoIXZpc2l0KHdhbGspKSByZXR1cm4geyBzZWxlY3RlZDogdHJ1ZSwgYmFjazogSW5maW5pdHkgfTtcbiAgaWYgKHdhbGsubmFtZXMgPT09IHVuZGVmaW5lZCAmJiB0YXJnZXRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHsgc2VsZWN0ZWQ6IGZhbHNlLCBiYWNrOiBJbmZpbml0eSB9O1xuICBjb25zdCBzaWcgPSB3YWxrLm1lbW8gPyBzaWduYXR1cmVPZih0YXJnZXRzKSA6ICcnO1xuICBjb25zdCBrbm93biA9IHdhbGsubWVtbz8uZ2V0KG5vZGUpPy5nZXQoYHMke3NpZ31gKTtcbiAgaWYgKGtub3duICE9PSB1bmRlZmluZWQpIHJldHVybiB7IHNlbGVjdGVkOiBrbm93biBhcyBib29sZWFuLCBiYWNrOiBJbmZpbml0eSB9O1xuICBhbmNlc3RvcnMuc2V0KG5vZGUsIGRlcHRoKTtcbiAgbGV0IGJhY2sgPSBJbmZpbml0eTtcbiAgbGV0IHNlbGVjdGVkID0gZmFsc2U7XG4gIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUpKSB7XG4gICAgY29uc3QgZWRnZSA9IGRlY2lkZUVkZ2Uoa2V5LCBkb3R0ZWQsIHRhcmdldHMsIHdhbGssIGRlcHRoKTtcbiAgICBpZiAoZWRnZS5tYXNrZWQpIHtcbiAgICAgIHNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBpZiAoY2hpbGQgPT09IG51bGwgfHwgdHlwZW9mIGNoaWxkICE9PSAnb2JqZWN0JykgY29udGludWU7XG4gICAgY29uc3QgYXQgPSBhbmNlc3RvcnMuZ2V0KGNoaWxkKTtcbiAgICBpZiAoYXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYmFjayA9IE1hdGgubWluKGJhY2ssIGF0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBjaGlsZFBhdGggPSB3YWxrLm5hbWVzPy5wYXRoTWFza3MgPyAoZG90dGVkID09PSB1bmRlZmluZWQgPyBrZXkgOiBgJHtkb3R0ZWR9LiR7a2V5fWApIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGJlbG93ID0gc2VsZWN0c0J5UGF0aChjaGlsZCwgY2hpbGRQYXRoID8/IGtleSwgZWRnZS5iZWxvdywgd2FsaywgYW5jZXN0b3JzLCBkZXB0aCArIDEpO1xuICAgIGJhY2sgPSBNYXRoLm1pbihiYWNrLCBiZWxvdy5iYWNrKTtcbiAgICBpZiAoYmVsb3cuc2VsZWN0ZWQpIHtcbiAgICAgIHNlbGVjdGVkID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICBhbmNlc3RvcnMuZGVsZXRlKG5vZGUpO1xuICBpZiAod2Fsay5tZW1vICYmIChzZWxlY3RlZCB8fCBiYWNrID49IGRlcHRoKSkgcmVtZW1iZXIod2Fsay5tZW1vLCBub2RlLCBgcyR7c2lnfWAsIHNlbGVjdGVkKTtcbiAgcmV0dXJuIHsgc2VsZWN0ZWQsIGJhY2s6IGJhY2sgPCBkZXB0aCA/IGJhY2sgOiBJbmZpbml0eSB9O1xufVxuXG5mdW5jdGlvbiByZW1lbWJlcihtZW1vOiBXZWFrTWFwPG9iamVjdCwgTWFwPHN0cmluZywgdW5rbm93bj4+LCBub2RlOiBvYmplY3QsIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICBsZXQgZW50cmllcyA9IG1lbW8uZ2V0KG5vZGUpO1xuICBpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSBtZW1vLnNldChub2RlLCAoZW50cmllcyA9IG5ldyBNYXAoKSkpO1xuICBlbnRyaWVzLnNldChrZXksIHZhbHVlKTtcbn1cblxuLyoqXG4gKiBUaGUgc2VydmVkIGNvcHkgb2YgYG5vZGVgLCBjb3B5LW9uLXdyaXRlIFBFUiBQQVRILiBFdmVyeSBjb250YWluZXIgZW50ZXJlZFxuICogZ2V0cyBpdHMgY29weSBCRUZPUkUgaXRzIGNoaWxkcmVuIGFyZSB3YWxrZWQsIHNvIGEgY3ljbGUgZWRnZSBpcyBwb2ludGVkIGF0XG4gKiB0aGUgYW5jZXN0b3IncyBjb3B5IOKAlCBuZXZlciBiYWNrIGF0IGFuIHVuc2NydWJiZWQgb3JpZ2luYWw7IGEgY29udGFpbmVyIGlzXG4gKiBzZXJ2ZWQgYXMgaXRzZWxmIHdoZW4gbm90aGluZyB1bmRlciBpdCBjaGFuZ2VkIGFuZCBubyBjeWNsZSBwYXNzZXMgdGhyb3VnaFxuICogaXQuIEEgcHJ1bmVkIGRlc2NlbnQgKGEgYmFyZSBmaWVsZCBzY3J1YiBvZiBhbiBhY3ljbGljIHZhbHVlKSBza2lwcyBzdWJ0cmVlc1xuICogbm8gdGFyZ2V0IHJlYWNoZXMuIGBiYWNrYCBpcyB0aGUgc2hhbGxvd2VzdCBhbmNlc3RvciBhIGN5Y2xlIGVkZ2UgYmVsb3dcbiAqIHJlYWNoZWQgKGBJbmZpbml0eWA6IG5vbmUpOyBhIGNvcHkgdGhhdCByZXN0cyBvbiBub25lIGlzIHNoYXJlZCAobWVtbykuXG4gKi9cbmZ1bmN0aW9uIGNvcHlCeVBhdGgoXG4gIG5vZGU6IG9iamVjdCxcbiAgZG90dGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdLFxuICB3YWxrOiBXYWxrLFxuICBwbGFjZWhvbGRlcjogc3RyaW5nLFxuICBhbmNlc3RvcnM6IE1hcDxvYmplY3QsIHsgY29weTogUmVjb3JkPHN0cmluZywgdW5rbm93bj47IGRlcHRoOiBudW1iZXIgfT4sXG4gIGRlcHRoOiBudW1iZXIsXG4gIHBydW5lOiBib29sZWFuLFxuKTogeyBvdXQ6IHVua25vd247IGJhY2s6IG51bWJlciB9IHtcbiAgLy8gUGFzdCB0aGUgbGltaXQ6IHRoZSB1bnZpc2l0ZWQgcmVtYWluZGVyIGlzIHNlcnZlZCBhcyB0aGUgcGxhY2Vob2xkZXIg4oCUIG5ldmVyIHJhdy5cbiAgaWYgKCF2aXNpdCh3YWxrKSkgcmV0dXJuIHsgb3V0OiBwbGFjZWhvbGRlciwgYmFjazogSW5maW5pdHkgfTtcbiAgY29uc3Qgc2lnID0gd2Fsay5tZW1vID8gYGMke3NpZ25hdHVyZU9mKHRhcmdldHMpfWAgOiAnJztcbiAgY29uc3Qga25vd24gPSB3YWxrLm1lbW8/LmdldChub2RlKT8uZ2V0KHNpZyk7XG4gIGlmIChrbm93biAhPT0gdW5kZWZpbmVkKSByZXR1cm4geyBvdXQ6IGtub3duLCBiYWNrOiBJbmZpbml0eSB9O1xuICBjb25zdCBmcmFtZSA9IHtcbiAgICBjb3B5OiAoQXJyYXkuaXNBcnJheShub2RlKSA/IG5vZGUuc2xpY2UoKSA6IHsgLi4ubm9kZSB9KSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBkZXB0aCxcbiAgfTtcbiAgYW5jZXN0b3JzLnNldChub2RlLCBmcmFtZSk7XG4gIGxldCBjaGFuZ2VkID0gZmFsc2U7XG4gIGxldCBiYWNrID0gSW5maW5pdHk7XG4gIGZvciAoY29uc3QgW2tleSwgY2hpbGRdIG9mIE9iamVjdC5lbnRyaWVzKG5vZGUpKSB7XG4gICAgY29uc3QgZWRnZSA9IGRlY2lkZUVkZ2Uoa2V5LCBkb3R0ZWQsIHRhcmdldHMsIHdhbGssIGRlcHRoKTtcbiAgICBpZiAoZWRnZS5tYXNrZWQpIHtcbiAgICAgIGZyYW1lLmNvcHlba2V5XSA9IHBsYWNlaG9sZGVyO1xuICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGNoaWxkID09PSBudWxsIHx8IHR5cGVvZiBjaGlsZCAhPT0gJ29iamVjdCcpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGFuY2VzdG9yID0gYW5jZXN0b3JzLmdldChjaGlsZCk7XG4gICAgaWYgKGFuY2VzdG9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGZyYW1lLmNvcHlba2V5XSA9IGFuY2VzdG9yLmNvcHk7XG4gICAgICBiYWNrID0gTWF0aC5taW4oYmFjaywgYW5jZXN0b3IuZGVwdGgpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChwcnVuZSAmJiBlZGdlLmJlbG93Lmxlbmd0aCA9PT0gMCkgY29udGludWU7XG4gICAgY29uc3QgY2hpbGRQYXRoID0gd2Fsay5uYW1lcz8ucGF0aE1hc2tzID8gKGRvdHRlZCA9PT0gdW5kZWZpbmVkID8ga2V5IDogYCR7ZG90dGVkfS4ke2tleX1gKSA6IGtleTtcbiAgICBjb25zdCBiZWxvdyA9IGNvcHlCeVBhdGgoY2hpbGQsIGNoaWxkUGF0aCwgZWRnZS5iZWxvdywgd2FsaywgcGxhY2Vob2xkZXIsIGFuY2VzdG9ycywgZGVwdGggKyAxLCBwcnVuZSk7XG4gICAgaWYgKGJlbG93Lm91dCAhPT0gY2hpbGQpIHtcbiAgICAgIGZyYW1lLmNvcHlba2V5XSA9IGJlbG93Lm91dDtcbiAgICAgIGNoYW5nZWQgPSB0cnVlO1xuICAgIH1cbiAgICBiYWNrID0gTWF0aC5taW4oYmFjaywgYmVsb3cuYmFjayk7XG4gIH1cbiAgYW5jZXN0b3JzLmRlbGV0ZShub2RlKTtcbiAgY29uc3Qgb3V0ID0gY2hhbmdlZCB8fCBiYWNrIDw9IGRlcHRoID8gZnJhbWUuY29weSA6IG5vZGU7XG4gIGlmICh3YWxrLm1lbW8gJiYgYmFjayA+PSBkZXB0aCkgcmVtZW1iZXIod2Fsay5tZW1vLCBub2RlLCBzaWcsIG91dCk7XG4gIHJldHVybiB7IG91dCwgYmFjazogYmFjayA8IGRlcHRoID8gYmFjayA6IEluZmluaXR5IH07XG59XG5cbi8qKiBEb2VzIGFueSBwYXRoIGZyb20gYHJvb3RgIGNvbWUgYmFjayB0byBhbiBvYmplY3Qgb24gaXQ/ICovXG5mdW5jdGlvbiBoYXNDeWNsZShyb290OiBvYmplY3QpOiBib29sZWFuIHtcbiAgY29uc3QgZG9uZSA9IG5ldyBXZWFrU2V0PG9iamVjdD4oKTtcbiAgY29uc3Qgb25QYXRoID0gbmV3IFNldDxvYmplY3Q+KCk7XG4gIGNvbnN0IHZpc2l0Tm9kZSA9IChub2RlOiBvYmplY3QpOiBib29sZWFuID0+IHtcbiAgICBpZiAob25QYXRoLmhhcyhub2RlKSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKGRvbmUuaGFzKG5vZGUpKSByZXR1cm4gZmFsc2U7XG4gICAgb25QYXRoLmFkZChub2RlKTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIE9iamVjdC52YWx1ZXMobm9kZSkpIHtcbiAgICAgIGlmIChjaGlsZCAhPT0gbnVsbCAmJiB0eXBlb2YgY2hpbGQgPT09ICdvYmplY3QnICYmIHZpc2l0Tm9kZShjaGlsZCkpIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBvblBhdGguZGVsZXRlKG5vZGUpO1xuICAgIGRvbmUuYWRkKG5vZGUpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbiAgcmV0dXJuIHZpc2l0Tm9kZShyb290KTtcbn1cblxuLyoqXG4gKiBUaGUgc2VydmVkIGZvcm0gb2YgYHJvb3RgIHVuZGVyIGEgd2FsazogYHJvb3RgIGl0c2VsZiB3aGVuIG5vIHBhdGggc2VsZWN0c1xuICogYW55dGhpbmcsIGVsc2UgaXRzIGNvcHktb24td3JpdGUgY29weSAocGFzdCB0aGUgd2FsayBsaW1pdCwgaXRzIHVudmlzaXRlZFxuICogcmVtYWluZGVyIHNlcnZlZCBhcyB0aGUgcGxhY2Vob2xkZXIpLiBUaHJvd3Mg4oCUIHRoZSBjYWxsZXIgcmVmdXNlcyB0byBzZXJ2ZVxuICog4oCUIG9uIGFuIGVudW1lcmFibGUgZ2V0dGVyIHRoYXQgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBzZXJ2ZWRCeVBhdGgoXG4gIHJvb3Q6IG9iamVjdCxcbiAgZG90dGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHRhcmdldHM6IHJlYWRvbmx5IFRhcmdldFtdLFxuICB3YWxrOiBXYWxrLFxuICBwbGFjZWhvbGRlcjogc3RyaW5nLFxuKTogdW5rbm93biB7XG4gIGlmICghc2VsZWN0c0J5UGF0aChyb290LCBkb3R0ZWQsIHRhcmdldHMsIHdhbGssIG5ldyBNYXAoKSwgMCkuc2VsZWN0ZWQpIHJldHVybiByb290O1xuICB3YWxrLmJ1ZGdldCA9IHdhbGtMaW1pdDtcbiAgLy8gQSBiYXJlIGZpZWxkIHNjcnViIG9mIGFuIGFjeWNsaWMgdmFsdWUgd2Fsa3MgaXRzIHRhcmdldHMgb25seTogbm8gY3ljbGUgY2FuIGJyaW5nIGFuXG4gIC8vIHVuc2NydWJiZWQgb3JpZ2luYWwgYmFjay4gRXZlcnkgb3RoZXIgd2FsayB2aXNpdHMgZXZlcnkgcGF0aCAoYSBjeWNsZSBlZGdlIGFueXdoZXJlXG4gIC8vIG11c3QgbGFuZCBvbiBhIHNlcnZlZCBjb3B5KS5cbiAgY29uc3QgcHJ1bmUgPSB3YWxrLm5hbWVzID09PSB1bmRlZmluZWQgJiYgIWhhc0N5Y2xlKHJvb3QpO1xuICByZXR1cm4gY29weUJ5UGF0aChyb290LCBkb3R0ZWQsIHRhcmdldHMsIHdhbGssIHBsYWNlaG9sZGVyLCBuZXcgTWFwKCksIDAsIHBydW5lKS5vdXQ7XG59XG5cbi8qKiBBIHBsYWluIHJlY29yZCDigJQgdGhlIG9ubHkgc2hhcGUgYSBtYXBwZXIgaXMgaGFuZGVkIGFzIGEgcmVjb3JkaW5nIHZpZXcgKGEgY2xhc3MgaW5zdGFuY2Uga2VlcHMgaXRzIHByb3RvdHlwZSkuICovXG5mdW5jdGlvbiBpc1BsYWluUmVjb3JkKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSk7XG4gIHJldHVybiBwcm90byA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90byA9PT0gbnVsbDtcbn1cblxuLyoqIFRoZSBzdHJpY3RlciBvZiB0d28gdmVyZGljdHMgb24gdGhlIHNhbWUgdmFsdWU6IHdob2xlIG92ZXIgZmllbGRzIG92ZXIgY2xlYXI7IGZpZWxkcyB1bml0ZS4gKi9cbmZ1bmN0aW9uIHN0cmljdGVyKGE6IFJlZGFjdGlvblZlcmRpY3QgfCB1bmRlZmluZWQsIGI6IFJlZGFjdGlvblZlcmRpY3QpOiBSZWRhY3Rpb25WZXJkaWN0IHtcbiAgaWYgKGEgPT09IHVuZGVmaW5lZCB8fCBhLmtpbmQgPT09ICdjbGVhcicgfHwgYi5raW5kID09PSAnd2hvbGUnKSByZXR1cm4gYjtcbiAgaWYgKGEua2luZCA9PT0gJ3dob2xlJyB8fCBiLmtpbmQgPT09ICdjbGVhcicpIHJldHVybiBhO1xuICByZXR1cm4geyBraW5kOiAnZmllbGRzJywga2V5OiBhLmtleSwgcGF0aHM6IFsuLi5uZXcgU2V0KFsuLi5hLnBhdGhzLCAuLi5iLnBhdGhzXSldIH07XG59XG5cbi8qKlxuICogVEhFIFRBSU5UIFJVTEUgYXQgYSBzdWJmbG93IG1hcHBlciBib3VuZGFyeSAoYW4gYGlucHV0TWFwcGVyYCBzZWVkaW5nIGFcbiAqIHN1YmZsb3csIGFuIGBvdXRwdXRNYXBwZXJgIG1lcmdpbmcgaXQgYmFjayk6IGEga2V5IHRoZSBtYXBwZXIgd3JpdGVzXG4gKiBpbmhlcml0cyB0aGUgcmVkYWN0aW9uIG9mIHRoZSBTRUxFQ1RFRCB2YWx1ZSBpdCBjb3BpZWQg4oCUIGEgbWFyayAob3JcbiAqIGluaGVyaXRlZCBmaWVsZHMpLCBieSBuYW1lLCBsaWtlIGEgcGVyLWNhbGwgYHNldFZhbHVlKGtleSwgdmFsdWUsIHRydWUpYCDigJRcbiAqIHNvIHRoZSBzdWJmbG93J3Mgc2VlZCwgbG9nLCBtaXJyb3IsIHJlYWRzLCBuYXJyYXRpdmUgYW5kIHJlc3VsdHMsIGFuZCB0aGVcbiAqIHBhcmVudCdzIG1lcmdlLWJhY2ssIHJldGFpbiB0aGUgY29weSBhcyB0aGV5IHJldGFpbiBpdHMgc291cmNlLiBEZWNpZGVkIGJ5XG4gKiB3aGljaCB2YWx1ZXMgdGhlIG1hcHBlciBSRUFEOlxuICpcbiAqICAgLSBTQU1FIE5BTUUg4oCUIGEgdmFsdWUgcGFzc2VkIG9uIHVuZGVyIHRoZSBuYW1lIGl0IHdhcyByZWFkIHVuZGVyIGtlZXBzXG4gKiAgICAgdGhhdCBuYW1lJ3MgdmVyZGljdCAoYHsgY291bnQ6IHAuY291bnQgfWAsIGB7IC4uLnAgfWApOiBhIGNsZWFyIHZhbHVlXG4gKiAgICAgc3RheXMgY2xlYXIsIHdoZXJldmVyIGVsc2UgdGhlIG1hcHBlciByZWFkIGEgc2VjcmV0LlxuICogICAtIEVYQUNUIOKAlCBhbiBvdXRwdXQgT0JKRUNUIHRoYXQgSVMgKGJ5IHJlZmVyZW5jZSkgYSB2YWx1ZSB0aGUgbWFwcGVyIHJlYWRcbiAqICAgICBpbmhlcml0cyB0aGF0IGtleSdzIHZlcmRpY3Q6IHdob2xlIHN0YXlzIHdob2xlLCBgZmllbGRzYCBoYW5kIHRoZWlyIHBhdGhzXG4gKiAgICAgdG8gdGhlIG5ldyBrZXksIGNsZWFyIHN0YXlzIGNsZWFyLiBUaGUgcmVjb3JkIHRoZSBtYXBwZXIgd2FzIEhBTkRFRCxcbiAqICAgICBwYXNzZWQgb24gd2hvbGUgKGAocCkgPT4gKHsgY3R4OiBwIH0pYCksIGhhbmRzIGV2ZXJ5IHNlbGVjdGVkIGtleSBvZiBpdFxuICogICAgIHRvIHRoZSBuZXcga2V5IGFzIGEgZmllbGQgKGBjdHgudG9rZW5gKS5cbiAqICAgLSBDT05TRVJWQVRJVkUg4oCUIGFueSBvdGhlciBvdXRwdXQgKGEgcHJpbWl0aXZlIHVuZGVyIGEgbmV3IG5hbWUsIG9yIGFuXG4gKiAgICAgb2JqZWN0IHRoZSBtYXBwZXIgYnVpbHQpIGlzIHNlbGVjdGVkIFdIT0xFIHdoZW4gdGhlIG1hcHBlciByZWFkIGFcbiAqICAgICBzZWxlY3RlZCB2YWx1ZSDigJQgYSB3aG9sZS1zZWxlY3RlZCBrZXksIG9yIGEgc2VsZWN0ZWQgRklFTEQgb2YgYVxuICogICAgIGBmaWVsZHNgLXNlbGVjdGVkIHJlY29yZCDigJQgb3Igd2hlbiBpdCBlbWJlZHMgYSBzZWxlY3RlZCByZWNvcmQgYnlcbiAqICAgICByZWZlcmVuY2U7IHRoZSBsaWJyYXJ5IGNhbm5vdCB0ZWxsIHdoYXQgYSBjb21wdXRlZCB2YWx1ZSBjYXJyaWVzLlxuICogICAgIChWYWx1ZXMgYXJlIG5ldmVyIG1hdGNoZWQgYnkgRVFVQUxJVFkgYWNyb3NzIG5hbWVzOiBhbiBlcXVhbCBwcmltaXRpdmVcbiAqICAgICB3b3VsZCBvdmVyLW1hdGNoIHVucmVsYXRlZCBrZXlzLilcbiAqXG4gKiBIT1cgRkFSIEEgTUFSSyBSRUFDSEVTOiBhIE5BTUUsIHJ1bi13aWRlLCBmcm9tIHRoZSBtb21lbnQgaXQgaXMgbWFkZSDigJQgZXZlcnlcbiAqIGtleSBvZiB0aGF0IG5hbWUgaW4gdGhlIHN1YmZsb3csIHRoZSBwYXJlbnQsIGEgc2libGluZyBhbmQgZXZlcnkgbGF0ZXIgc3RhZ2VcbiAqIGlzIHNlbGVjdGVkIGluIHdoYXRldmVyIGlzIHNlcnZlZCwgdW50aWwgdGhlIGtleSBpcyBkZWxldGVkOyBhIHBhdXNlIGNhcnJpZXNcbiAqIGl0IHRvIHRoZSByZXN1bWVkIHJ1biAoYEZsb3djaGFydENoZWNrcG9pbnQucmVkYWN0aW9uTWFya3NgKS5cbiAqXG4gKiBBIGBmaWVsZHNgLXNlbGVjdGVkIHJlY29yZCB0aGF0IGhvbGRzIGEgc2VsZWN0ZWQgZmllbGQgaXMgaGFuZGVkIHRvIHRoZVxuICogbWFwcGVyIGFzIGEgdmlldyBvZiBpdHMgb3duLCBzbyByZWFkaW5nIHRoZSByZWNvcmQgKHRvIHBhc3MgaXQgb24sIG9yIHRvXG4gKiB0ZXN0IGl0cyB0eXBlKSBpcyBub3QgcmVhZGluZyB0aGUgZmllbGQuIFJlYWRpbmcgYHJ1bnNgICh0aGUgbmFtZXNwYWNlIHJvb3RcbiAqIGZvcmsgY2hpbGRyZW4gd3JpdGUgdW5kZXIpIHJlYWRzIGV2ZXJ5IG5hbWVzcGFjZWQga2V5LiBSZWNvcmRpbmcgc3RvcHMgd2hlblxuICogdGhlIG1hcHBlciByZXR1cm5zOyB7QGxpbmsgaW5oZXJpdH0gaGFuZHMgYmFjayB0aGUgb3V0cHV0IHdpdGggZXZlcnkgdmlldyBpdFxuICogcmV0dXJuZWQgc3dhcHBlZCBmb3IgdGhlIHJlY29yZCBiZWhpbmQgaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYXBwZXJUYWludCB7XG4gIC8qKiBFYWNoIG9iamVjdCB0aGUgbWFwcGVyIHJlYWQg4oaSIHRoZSB2ZXJkaWN0IG9mIHRoZSBrZXkgaXQgcmVhZCBpdCB1bmRlci4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBzb3VyY2VzID0gbmV3IE1hcDxvYmplY3QsIFJlZGFjdGlvblZlcmRpY3Q+KCk7XG4gIC8qKiBFYWNoIGtleSB0aGUgbWFwcGVyIHJlYWQg4oaSIHRoZSB2YWx1ZXMgaXQgcmVhZCB1bmRlciB0aGF0IG5hbWUuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgYnlOYW1lID0gbmV3IE1hcDxzdHJpbmcsIHVua25vd25bXT4oKTtcbiAgLyoqIEVhY2ggYGZpZWxkc2AgdmlldyBoYW5kZWQgb3V0IOKGkiB0aGUgcmVjb3JkIGJlaGluZCBpdCBhbmQgaXRzIHZlcmRpY3QuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgdmlld3MgPSBuZXcgTWFwPG9iamVjdCwgeyByYXc6IG9iamVjdDsgdmVyZGljdDogUmVkYWN0aW9uVmVyZGljdCB9PigpO1xuICAvKiogRWFjaCByZWNvcmQgdGhlIG1hcHBlciB3YXMgaGFuZGVkIOKGkiBhcyBhIHZpZXcgKHBhc3NlZCBvbiB3aG9sZSwgaXQgaGFuZHMgb24gaXRzIHNlbGVjdGVkIGtleXMpLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJlY29yZHMgPSBuZXcgTWFwPG9iamVjdCwgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KCk7XG4gIC8qKiBUaGUgc2VsZWN0ZWQgdmFsdWVzIHRoZSBtYXBwZXIgcmVhZCAod2hvbGUga2V5cywgc2VsZWN0ZWQgZmllbGRzKSDigJQgd2hhdCBpdCBjb3VsZCBwbGFudCBieSByZWZlcmVuY2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VjcmV0UmVhZHM6IHVua25vd25bXSA9IFtdO1xuICBwcml2YXRlIHNlbGVjdGVkUmVhZCA9IGZhbHNlO1xuICBwcml2YXRlIG9wZW4gPSB0cnVlO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBydWxlOiBSZWRhY3Rpb25SdWxlKSB7fVxuXG4gIC8qKiBgdW5kZWZpbmVkYCB3aGlsZSB0aGUgcnVuJ3MgcnVsZSBpcyBpbmVydCDigJQgbm90aGluZyBhIG1hcHBlciByZWFkcyBjYW4gYmUgc2VsZWN0ZWQuICovXG4gIHN0YXRpYyBvZihydWxlOiBSZWRhY3Rpb25SdWxlIHwgdW5kZWZpbmVkKTogTWFwcGVyVGFpbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBydWxlICE9PSB1bmRlZmluZWQgJiYgIXJ1bGUuaXNJbmVydCgpID8gbmV3IE1hcHBlclRhaW50KHJ1bGUpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSByZWNvcmQgYSBtYXBwZXIgaXMgaGFuZGVkOiB0aGUgc2FtZSBvd24ga2V5cyBhbmQgdmFsdWVzLCBlYWNoIHJlYWRcbiAgICogcmVjb3JkZWQuIEFuIGFjY2Vzc29yIHBlciBrZXksIG5vdCBhIFByb3h5IOKAlCBhIG1hcHBlciBtYXkgc3ByZWFkLCBjbG9uZSBvclxuICAgKiBzZXJpYWxpemUgd2hhdCBpdCBpcyBoYW5kZWQuIEFuIGFzc2lnbm1lbnQgbGFuZHMgb24gdGhlIHZpZXcsIG5ldmVyIG9uIHRoZVxuICAgKiBsaXZlIHJlY29yZCBiZWhpbmQgaXQuIEFueXRoaW5nIGJ1dCBhIHBsYWluIHJlY29yZCBpcyBoYW5kZWQgb3ZlciBhcyBpdCBpcy5cbiAgICovXG4gIHdhdGNoPFQ+KHJlY29yZDogVCk6IFQge1xuICAgIGlmICghaXNQbGFpblJlY29yZChyZWNvcmQpKSByZXR1cm4gcmVjb3JkO1xuICAgIGNvbnN0IHZpZXcgPSB0aGlzLnZpZXdPZihyZWNvcmQsIChrZXkpID0+IHRoaXMuc2VydmVkKGtleSwgcmVjb3JkW2tleV0pKTtcbiAgICB0aGlzLnJlY29yZHMuc2V0KHZpZXcsIHJlY29yZCk7XG4gICAgcmV0dXJuIHZpZXcgYXMgVDtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbWFwcGVyIHJldHVybmVkIGBvdXRwdXRgOiBldmVyeSBrZXkgaXQgd3JvdGUgaW5oZXJpdHMgd2hhdCBpdCBjb3BpZWRcbiAgICogKHNlZSB0aGUgY2xhc3MpLiBSZXR1cm5zIHRoZSBvdXRwdXQgdG8gdXNlIOKAlCB0aGUgc2FtZSBvYmplY3QgdW5sZXNzIGEgdmlld1xuICAgKiBoYWQgdG8gYmUgc3dhcHBlZCBiYWNrIGZvciB0aGUgcmVjb3JkIGJlaGluZCBpdC5cbiAgICovXG4gIGluaGVyaXQ8VD4ob3V0cHV0OiBUKTogVCB7XG4gICAgdGhpcy5vcGVuID0gZmFsc2U7XG4gICAgaWYgKG91dHB1dCA9PT0gbnVsbCB8fCB0eXBlb2Ygb3V0cHV0ICE9PSAnb2JqZWN0JykgcmV0dXJuIG91dHB1dDtcbiAgICBsZXQgb3V0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IFt0YXJnZXQsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvdXRwdXQpKSB7XG4gICAgICBjb25zdCBjb3BpZWQgPSB0aGlzLmNvcGllZFZlcmRpY3QodGFyZ2V0LCB2YWx1ZSk7XG4gICAgICBpZiAoY29waWVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRSZWFkIHx8IHRoaXMuZW1iZWRzU2VsZWN0ZWQodmFsdWUsIG5ldyBXZWFrU2V0KCkpKSB0aGlzLnJ1bGUubWFyayh0YXJnZXQpO1xuICAgICAgfSBlbHNlIGlmIChjb3BpZWQua2luZCA9PT0gJ3dob2xlJykgdGhpcy5ydWxlLm1hcmsodGFyZ2V0KTtcbiAgICAgIGVsc2UgaWYgKGNvcGllZC5raW5kID09PSAnZmllbGRzJykgdGhpcy5ydWxlLmluaGVyaXRGaWVsZHModGFyZ2V0LCBjb3BpZWQucGF0aHMpO1xuICAgICAgY29uc3QgcmF3ID0gdGhpcy5iZWhpbmQodmFsdWUpO1xuICAgICAgLy8gQW4gb2JqZWN0IHBhc3NlZCBvbiBCWSBSRUZFUkVOQ0UgbWF5IGNhcnJ5IHdoYXQgdGhlIG1hcHBlciBwbGFudGVkIGluIGl0XG4gICAgICAvLyAoYE9iamVjdC5hc3NpZ24ocC5yZXF1ZXN0LCB7IGF1dGg6IHAudG9rZW4gfSlgLCBgcC5saXN0LnB1c2gocC50b2tlbilgKTpcbiAgICAgIC8vIGVhY2ggcGxhY2UgaXQgaG9sZHMgYSBzZWxlY3RlZCB2YWx1ZSB0aGUgbWFwcGVyIHJlYWQgaXMgYSBmaWVsZCBvZiB0aGUgbmV3IGtleS5cbiAgICAgIGlmIChjb3BpZWQgIT09IHVuZGVmaW5lZCAmJiBjb3BpZWQua2luZCAhPT0gJ3dob2xlJyAmJiByYXcgIT09IG51bGwgJiYgdHlwZW9mIHJhdyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgY29uc3QgcGxhbnRlZCA9IHRoaXMucGxhbnRlZFBhdGhzKHJhdyk7XG4gICAgICAgIGlmIChwbGFudGVkLmxlbmd0aCA+IDApIHRoaXMucnVsZS5pbmhlcml0RmllbGRzKHRhcmdldCwgcGxhbnRlZCk7XG4gICAgICB9XG4gICAgICBpZiAocmF3ICE9PSB2YWx1ZSkge1xuICAgICAgICBvdXQgPz89IChBcnJheS5pc0FycmF5KG91dHB1dCkgPyBbLi4ub3V0cHV0XSA6IHsgLi4ub3V0cHV0IH0pIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgICAgICBvdXRbdGFyZ2V0XSA9IHJhdztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIChvdXQgPz8gb3V0cHV0KSBhcyBUO1xuICB9XG5cbiAgLyoqIFdoYXQgb25lIHJlY29yZGVkIHJlYWQgaGFuZHMgdGhlIG1hcHBlciAoc2VlIHRoZSBjbGFzcykuICovXG4gIHByaXZhdGUgc2VydmVkKGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHVua25vd24ge1xuICAgIGlmICghdGhpcy5vcGVuKSByZXR1cm4gdmFsdWU7XG4gICAgY29uc3QgcmVhZCA9IHRoaXMuYnlOYW1lLmdldChrZXkpO1xuICAgIGlmIChyZWFkID09PSB1bmRlZmluZWQpIHRoaXMuYnlOYW1lLnNldChrZXksIFt2YWx1ZV0pO1xuICAgIGVsc2UgcmVhZC5wdXNoKHZhbHVlKTtcbiAgICBjb25zdCB2ZXJkaWN0ID0gdGhpcy5ydWxlLnZlcmRpY3RPZlJlYWQoa2V5LCB2YWx1ZSk7XG4gICAgLy8gQW4gYWJzZW50IGtleSBjYXJyaWVzIG5vIHNlY3JldDsgbmVpdGhlciBkb2VzIGEgdmFsdWUgd2l0aCBubyBmaWVsZHMgKGEgc2NhbGFyKSBvciBub25lIG9mXG4gICAgLy8gaXRzIHNlbGVjdGVkIG9uZXMg4oCUIHN0YXRlIHJldGFpbnMgdGhvc2UgYXMgdGhleSBhcmUgdG9vLlxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ2ZpZWxkcycpIHtcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8ICFSZWRhY3Rpb25SdWxlLmhvbGRzUGF0aHModmFsdWUsIHZlcmRpY3QucGF0aHMpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJlbWVtYmVyKHZhbHVlLCB2ZXJkaWN0KTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1BsYWluUmVjb3JkKHZhbHVlKSkgcmV0dXJuIHRoaXMuZmllbGRzVmlldyh2YWx1ZSwgdmVyZGljdCk7XG4gICAgfVxuICAgIGlmICh2ZXJkaWN0LmtpbmQgIT09ICdjbGVhcicpIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRSZWFkID0gdHJ1ZTtcbiAgICAgIGlmICh2ZXJkaWN0LmtpbmQgPT09ICd3aG9sZScpIHRoaXMuc2VjcmV0UmVhZHMucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlbWVtYmVyKHZhbHVlLCB2ZXJkaWN0KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtZW1iZXIodmFsdWU6IHVua25vd24sIHZlcmRpY3Q6IFJlZGFjdGlvblZlcmRpY3QpOiB1bmtub3duIHtcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgdGhpcy5zb3VyY2VzLnNldCh2YWx1ZSwgc3RyaWN0ZXIodGhpcy5zb3VyY2VzLmdldCh2YWx1ZSksIHZlcmRpY3QpKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLyoqIEEgYGZpZWxkc2Atc2VsZWN0ZWQgcmVjb3JkOiByZWFkaW5nIG9uZSBvZiBpdHMgc2VsZWN0ZWQgZmllbGRzIChvciBhIHBhdGgncyBmaXJzdCBzZWdtZW50KSBpcyBhIHNlbGVjdGVkIHJlYWQuICovXG4gIHByaXZhdGUgZmllbGRzVmlldyhyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCB2ZXJkaWN0OiBSZWRhY3Rpb25WZXJkaWN0ICYgeyBraW5kOiAnZmllbGRzJyB9KTogb2JqZWN0IHtcbiAgICBjb25zdCBzZWxlY3RlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGZvciAoY29uc3QgcGF0aCBvZiB2ZXJkaWN0LnBhdGhzKSBzZWxlY3RlZC5hZGQocGF0aCkuYWRkKHBhdGguc3BsaXQoJy4nKVswXSk7XG4gICAgY29uc3QgdmlldyA9IHRoaXMudmlld09mKHJlY29yZCwgKGtleSkgPT4ge1xuICAgICAgaWYgKHRoaXMub3BlbiAmJiBzZWxlY3RlZC5oYXMoa2V5KSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkUmVhZCA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VjcmV0UmVhZHMucHVzaChyZWNvcmRba2V5XSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVjb3JkW2tleV07XG4gICAgfSk7XG4gICAgdGhpcy52aWV3cy5zZXQodmlldywgeyByYXc6IHJlY29yZCwgdmVyZGljdCB9KTtcbiAgICByZXR1cm4gdmlldztcbiAgfVxuXG4gIHByaXZhdGUgdmlld09mKHJlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHJlYWQ6IChrZXk6IHN0cmluZykgPT4gdW5rbm93bik6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCB2aWV3OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHJlY29yZCkpIHtcbiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh2aWV3LCBrZXksIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICBnZXQ6ICgpID0+IHJlYWQoa2V5KSxcbiAgICAgICAgc2V0OiAodmFsdWU6IHVua25vd24pID0+IHtcbiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodmlldywga2V5LCB7IHZhbHVlLCB3cml0YWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIHJldHVybiB2aWV3O1xuICB9XG5cbiAgLyoqIFRoZSByZWNvcmQgYmVoaW5kIGEgdmlldyB0aGUgbWFwcGVyIHJldHVybmVkOyBhbnkgb3RoZXIgdmFsdWUgYXMgaXQgaXMuICovXG4gIHByaXZhdGUgYmVoaW5kKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHJldHVybiB2YWx1ZTtcbiAgICByZXR1cm4gdGhpcy52aWV3cy5nZXQodmFsdWUpPy5yYXcgPz8gdGhpcy5yZWNvcmRzLmdldCh2YWx1ZSkgPz8gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHZlcmRpY3QgYHRhcmdldGAgaW5oZXJpdHMgZnJvbSBgdmFsdWVgIOKAlCBgdW5kZWZpbmVkYCB3aGVuIGl0IGlzXG4gICAqIG5laXRoZXIgYSB2YWx1ZSB0aGUgbWFwcGVyIHJlYWQgbm9yIG9uZSBwYXNzZWQgdW5kZXIgaXRzIG93biBuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBjb3BpZWRWZXJkaWN0KHRhcmdldDogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IFJlZGFjdGlvblZlcmRpY3QgfCB1bmRlZmluZWQge1xuICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICBjb25zdCB2aWV3ID0gdGhpcy52aWV3cy5nZXQodmFsdWUpO1xuICAgICAgaWYgKHZpZXcpIHJldHVybiB2aWV3LnZlcmRpY3Q7XG4gICAgICBjb25zdCByZWNvcmQgPSB0aGlzLnJlY29yZHMuZ2V0KHZhbHVlKTtcbiAgICAgIGlmIChyZWNvcmQpIHJldHVybiB0aGlzLnNlbGVjdGVkRmllbGRzT2YocmVjb3JkKTtcbiAgICAgIGNvbnN0IGtub3duID0gdGhpcy5zb3VyY2VzLmdldCh2YWx1ZSk7XG4gICAgICBpZiAoa25vd24pIHJldHVybiBrbm93bjtcbiAgICB9XG4gICAgY29uc3QgcmVhZCA9IHRoaXMuYnlOYW1lLmdldCh0YXJnZXQpO1xuICAgIHJldHVybiByZWFkPy5zb21lKCh2KSA9PiBPYmplY3QuaXModiwgdmFsdWUpKSA/IHRoaXMucnVsZS52ZXJkaWN0T2ZSZWFkKHRhcmdldCwgdmFsdWUpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEEgd2hvbGUgcmVjb3JkJ3Mgc2VsZWN0ZWQga2V5cywgYXMgZmllbGRzIG9mIHdoYXRldmVyIGtleSBpdCBpcyBwYXNzZWQgb24gdW5kZXIuICovXG4gIHByaXZhdGUgc2VsZWN0ZWRGaWVsZHNPZihyZWNvcmQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KTogUmVkYWN0aW9uVmVyZGljdCB7XG4gICAgY29uc3QgcGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocmVjb3JkKSkge1xuICAgICAgY29uc3QgdmVyZGljdCA9IHRoaXMucnVsZS52ZXJkaWN0T2ZSZWFkKGtleSwgcmVjb3JkW2tleV0pO1xuICAgICAgaWYgKHZlcmRpY3Qua2luZCA9PT0gJ3dob2xlJykgcGF0aHMucHVzaChrZXkpO1xuICAgICAgZWxzZSBpZiAodmVyZGljdC5raW5kID09PSAnZmllbGRzJykgZm9yIChjb25zdCBwYXRoIG9mIHZlcmRpY3QucGF0aHMpIHBhdGhzLnB1c2goYCR7a2V5fS4ke3BhdGh9YCk7XG4gICAgfVxuICAgIHJldHVybiBwYXRocy5sZW5ndGggPT09IDAgPyBDTEVBUiA6IHsga2luZDogJ2ZpZWxkcycsIGtleTogJycsIHBhdGhzIH07XG4gIH1cblxuICAvKipcbiAgICogV2hlcmUgYHJvb3RgIChhbiBvYmplY3QgdGhlIG1hcHBlciBwYXNzZWQgb24gYnkgcmVmZXJlbmNlKSBob2xkcyBvbmUgb2YgdGhlXG4gICAqIHNlbGVjdGVkIFBSSU1JVElWRVMgaXQgcmVhZCDigJQgbWF0Y2hlZCBieSB2YWx1ZSwgb25seSBhZ2FpbnN0IHdoYXQgdGhpc1xuICAgKiBtYXBwZXIgcmVhZCBhbmQgb25seSBpbnNpZGUgd2hhdCBpdCBwYXNzZWQgb24sIHNvIG92ZXItbWF0Y2hpbmcgYW4gZXF1YWxcbiAgICogdmFsdWUgaXMgdGhlIHNhZmUgc2lkZS4gT25lIHJlbGF0aXZlIHBhdGggcGVyIHBsYWNlLCBhIHNoYXJlZCBvYmplY3QgYXRcbiAgICogZWFjaCBvZiBpdHMgcGF0aHM7IGEgY3ljbGUgZWRnZSBpcyBub3QgZm9sbG93ZWQuXG4gICAqL1xuICBwcml2YXRlIHBsYW50ZWRQYXRocyhyb290OiBvYmplY3QpOiBzdHJpbmdbXSB7XG4gICAgY29uc3Qgc2VjcmV0cyA9IG5ldyBTZXQ8dW5rbm93bj4oKTtcbiAgICBjb25zdCBjb2xsZWN0ID0gKHZhbHVlOiB1bmtub3duLCBzZWVuOiBTZXQ8b2JqZWN0Pik6IHZvaWQgPT4ge1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyB8fCB0eXBlb2YgdmFsdWUgPT09ICdiaWdpbnQnKSBzZWNyZXRzLmFkZCh2YWx1ZSk7XG4gICAgICBlbHNlIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmICFzZWVuLmhhcyh2YWx1ZSkpIHtcbiAgICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIE9iamVjdC52YWx1ZXModmFsdWUpKSBjb2xsZWN0KGNoaWxkLCBzZWVuKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdGhpcy5zZWNyZXRSZWFkcykgY29sbGVjdCh2YWx1ZSwgbmV3IFNldCgpKTtcbiAgICBpZiAoc2VjcmV0cy5zaXplID09PSAwKSByZXR1cm4gW107XG4gICAgY29uc3QgbWVtbyA9IG5ldyBNYXA8b2JqZWN0LCBzdHJpbmdbXT4oKTtcbiAgICBjb25zdCBvblBhdGggPSBuZXcgU2V0PG9iamVjdD4oKTtcbiAgICBjb25zdCBpbnNpZGUgPSAobm9kZTogb2JqZWN0KTogc3RyaW5nW10gPT4ge1xuICAgICAgY29uc3Qga25vd24gPSBtZW1vLmdldChub2RlKTtcbiAgICAgIGlmIChrbm93biAhPT0gdW5kZWZpbmVkKSByZXR1cm4ga25vd247XG4gICAgICBpZiAob25QYXRoLmhhcyhub2RlKSkgcmV0dXJuIFtdO1xuICAgICAgb25QYXRoLmFkZChub2RlKTtcbiAgICAgIGNvbnN0IGZvdW5kOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBba2V5LCBjaGlsZF0gb2YgT2JqZWN0LmVudHJpZXMobm9kZSkpIHtcbiAgICAgICAgaWYgKGNoaWxkICE9PSBudWxsICYmIHR5cGVvZiBjaGlsZCA9PT0gJ29iamVjdCcpIGZvciAoY29uc3Qgc3ViIG9mIGluc2lkZShjaGlsZCkpIGZvdW5kLnB1c2goYCR7a2V5fS4ke3N1Yn1gKTtcbiAgICAgICAgZWxzZSBpZiAoc2VjcmV0cy5oYXMoY2hpbGQpKSBmb3VuZC5wdXNoKGtleSk7XG4gICAgICB9XG4gICAgICBvblBhdGguZGVsZXRlKG5vZGUpO1xuICAgICAgbWVtby5zZXQobm9kZSwgZm91bmQpO1xuICAgICAgcmV0dXJuIGZvdW5kO1xuICAgIH07XG4gICAgcmV0dXJuIGluc2lkZShyb290KTtcbiAgfVxuXG4gIC8qKiBEb2VzIGEgdmFsdWUgdGhlIG1hcHBlciBCVUlMVCBlbWJlZCwgYnkgcmVmZXJlbmNlLCBhIHNlbGVjdGVkIHJlY29yZCBpdCByZWFkIG9yIHdhcyBoYW5kZWQ/ICovXG4gIHByaXZhdGUgZW1iZWRzU2VsZWN0ZWQodmFsdWU6IHVua25vd24sIHNlZW46IFdlYWtTZXQ8b2JqZWN0Pik6IGJvb2xlYW4ge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8IHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuIGZhbHNlO1xuICAgIHNlZW4uYWRkKHZhbHVlKTtcbiAgICBpZiAodGhpcy52aWV3cy5oYXModmFsdWUpKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCByZWNvcmQgPSB0aGlzLnJlY29yZHMuZ2V0KHZhbHVlKTtcbiAgICBpZiAocmVjb3JkKSByZXR1cm4gdGhpcy5zZWxlY3RlZEZpZWxkc09mKHJlY29yZCkua2luZCAhPT0gJ2NsZWFyJztcbiAgICBjb25zdCBrbm93biA9IHRoaXMuc291cmNlcy5nZXQodmFsdWUpO1xuICAgIGlmIChrbm93biAhPT0gdW5kZWZpbmVkICYmIGtub3duLmtpbmQgIT09ICdjbGVhcicpIHJldHVybiB0cnVlO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIGlmICh0aGlzLmVtYmVkc1NlbGVjdGVkKGNoaWxkLCBzZWVuKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogTWFza2VkIHRocm93biB2YWx1ZXMg4oaSIHRoZWlyIHNlcnZlZCBmb3JtLiBBbiBvYmplY3QgKGFuIEVycm9yLCBhIHRocm93biByZWNvcmQpIGlzIGhlbGQgV0VBS0xZOiBhIHJ1biB3aG9zZSBjYWxsc1xuICogZmFpbCB0aG91c2FuZHMgb2YgdGltZXMgKGBzY29wZS4kY2FsbGAsIFAyKSBtdXN0IG5vdCBrZWVwIGV2ZXJ5IHRocm93biB2YWx1ZSBhbGl2ZSBmb3IgdGhlIHJ1bidzIGxpZmUuIEEgdGhyb3duXG4gKiBzY2FsYXIgKGEgc3RyaW5nLCBhIG51bWJlcikgaXMgbWF0Y2hlZCBieSB2YWx1ZSwgc28gaXQgaXMgaGVsZCBieSB2YWx1ZS4gYGFueWAgZ2F0ZXMgdGhlIHNlcnZpbmcgd2FsazogaXQgc2F5cyBhXG4gKiB2YWx1ZSB3YXMgZXZlciBtYXNrZWQsIG5vdCB0aGF0IG9uZSBpcyBzdGlsbCBhbGl2ZSAoYSBmYWxzZSBwb3NpdGl2ZSBjb3N0cyBvbmUgd2FsaywgbmV2ZXIgYSBsZWFrKS5cbiAqL1xuY2xhc3MgTWFza2VkRXJyb3JzIHtcbiAgcHJpdmF0ZSByZWFkb25seSBvYmplY3RzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBTdHJ1Y3R1cmVkRXJyb3JJbmZvPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNjYWxhcnMgPSBuZXcgTWFwPHVua25vd24sIFN0cnVjdHVyZWRFcnJvckluZm8+KCk7XG4gIC8qKiBXaGV0aGVyIGFueXRoaW5nIHdhcyBldmVyIG1hc2tlZC4gKi9cbiAgYW55ID0gZmFsc2U7XG5cbiAgZ2V0KHZhbHVlOiB1bmtub3duKTogU3RydWN0dXJlZEVycm9ySW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIGlzV2Vha0tleSh2YWx1ZSkgPyB0aGlzLm9iamVjdHMuZ2V0KHZhbHVlKSA6IHRoaXMuc2NhbGFycy5nZXQodmFsdWUpO1xuICB9XG5cbiAgLyoqIFdoZXRoZXIgYHZhbHVlYCB3YXMgc2VydmVkIG1hc2tlZCAoYW5kLCBmb3IgYW4gb2JqZWN0LCBpcyBzdGlsbCBhbGl2ZSkg4oCUIHRoZSBgTWFwYCByZWFkaW5nIGNvbnN1bWVycyByZWx5IG9uLiAqL1xuICBoYXModmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNXZWFrS2V5KHZhbHVlKSA/IHRoaXMub2JqZWN0cy5oYXModmFsdWUpIDogdGhpcy5zY2FsYXJzLmhhcyh2YWx1ZSk7XG4gIH1cblxuICBzZXQodmFsdWU6IHVua25vd24sIGluZm86IFN0cnVjdHVyZWRFcnJvckluZm8pOiB2b2lkIHtcbiAgICB0aGlzLmFueSA9IHRydWU7XG4gICAgaWYgKGlzV2Vha0tleSh2YWx1ZSkpIHRoaXMub2JqZWN0cy5zZXQodmFsdWUsIGluZm8pO1xuICAgIGVsc2UgdGhpcy5zY2FsYXJzLnNldCh2YWx1ZSwgaW5mbyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNXZWFrS2V5KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgb2JqZWN0IHtcbiAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKSB8fCB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7XG59XG4iXX0=
|