footprintjs 4.16.0 → 4.17.2
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 +567 -82
- package/CLAUDE.md +57 -0
- package/README.md +2 -0
- package/dist/advanced.js +4 -2
- package/dist/detach.js +78 -0
- package/dist/esm/advanced.js +2 -1
- package/dist/esm/detach.js +57 -0
- package/dist/esm/lib/builder/FlowChartBuilder.js +171 -61
- package/dist/esm/lib/contract/openapi.js +4 -5
- package/dist/esm/lib/contract/schema.js +115 -4
- package/dist/esm/lib/decide/decide.js +4 -5
- package/dist/esm/lib/decide/evidence.js +3 -2
- package/dist/esm/lib/detach/drivers/immediate.js +66 -0
- package/dist/esm/lib/detach/drivers/microtaskBatch.js +113 -0
- package/dist/esm/lib/detach/drivers/sendBeacon.js +78 -0
- package/dist/esm/lib/detach/drivers/setImmediate.js +81 -0
- package/dist/esm/lib/detach/drivers/setTimeout.js +69 -0
- package/dist/esm/lib/detach/drivers/workerThread.js +117 -0
- package/dist/esm/lib/detach/flush.js +91 -0
- package/dist/esm/lib/detach/handle.js +134 -0
- package/dist/esm/lib/detach/registry.js +97 -0
- package/dist/esm/lib/detach/runChild.js +40 -0
- package/dist/esm/lib/detach/spawn.js +86 -0
- package/dist/esm/lib/detach/types.js +37 -0
- package/dist/esm/lib/engine/errors/errorInfo.js +4 -4
- package/dist/esm/lib/engine/graph/StageNode.js +2 -2
- package/dist/esm/lib/engine/handlers/ChildrenExecutor.js +9 -8
- package/dist/esm/lib/engine/handlers/ContinuationResolver.js +12 -9
- package/dist/esm/lib/engine/handlers/DeciderHandler.js +7 -8
- package/dist/esm/lib/engine/handlers/ExtractorRunner.js +14 -8
- package/dist/esm/lib/engine/handlers/NodeResolver.js +5 -3
- package/dist/esm/lib/engine/handlers/RuntimeStructureManager.js +11 -14
- package/dist/esm/lib/engine/handlers/SelectorHandler.js +9 -9
- package/dist/esm/lib/engine/handlers/StageRunner.js +9 -11
- package/dist/esm/lib/engine/handlers/SubflowExecutor.js +13 -12
- package/dist/esm/lib/engine/handlers/SubflowInputMapper.js +4 -4
- package/dist/esm/lib/engine/narrative/CombinedNarrativeRecorder.js +85 -96
- package/dist/esm/lib/engine/narrative/FlowRecorderDispatcher.js +18 -36
- package/dist/esm/lib/engine/narrative/NarrativeFlowRecorder.js +6 -5
- package/dist/esm/lib/engine/narrative/recorders/AdaptiveNarrativeFlowRecorder.js +7 -6
- package/dist/esm/lib/engine/narrative/recorders/ManifestFlowRecorder.js +10 -10
- package/dist/esm/lib/engine/narrative/recorders/MilestoneNarrativeFlowRecorder.js +5 -3
- package/dist/esm/lib/engine/narrative/recorders/ProgressiveNarrativeFlowRecorder.js +4 -3
- package/dist/esm/lib/engine/narrative/recorders/RLENarrativeFlowRecorder.js +4 -4
- package/dist/esm/lib/engine/narrative/recorders/SeparateNarrativeFlowRecorder.js +5 -6
- package/dist/esm/lib/engine/narrative/recorders/SilentNarrativeFlowRecorder.js +5 -6
- package/dist/esm/lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.js +5 -3
- package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +97 -71
- package/dist/esm/lib/memory/DiagnosticCollector.js +6 -8
- package/dist/esm/lib/memory/EventLog.js +5 -3
- package/dist/esm/lib/memory/SharedMemory.js +3 -2
- package/dist/esm/lib/memory/StageContext.js +44 -14
- package/dist/esm/lib/memory/TransactionBuffer.js +9 -8
- package/dist/esm/lib/memory/backtrack.js +3 -4
- package/dist/esm/lib/memory/commitLogUtils.js +2 -2
- package/dist/esm/lib/memory/utils.js +2 -3
- package/dist/esm/lib/pause/types.js +33 -14
- package/dist/esm/lib/reactive/createTypedScope.js +10 -8
- package/dist/esm/lib/reactive/types.js +3 -1
- package/dist/esm/lib/recorder/BoundaryStateTracker.js +263 -0
- package/dist/esm/lib/recorder/CompositeRecorder.js +3 -1
- package/dist/esm/lib/recorder/InOutRecorder.js +5 -6
- package/dist/esm/lib/recorder/KeyedRecorder.js +2 -4
- package/dist/esm/lib/recorder/QualityRecorder.js +15 -14
- package/dist/esm/lib/recorder/SequenceRecorder.js +11 -12
- package/dist/esm/lib/recorder/TopologyRecorder.js +36 -40
- package/dist/esm/lib/recorder/index.js +2 -1
- package/dist/esm/lib/recorder/qualityTrace.js +4 -5
- package/dist/esm/lib/runner/ExecutionRuntime.js +20 -4
- package/dist/esm/lib/runner/FlowChartExecutor.js +99 -55
- package/dist/esm/lib/runner/RunContext.js +5 -3
- package/dist/esm/lib/runner/RunnableChart.js +7 -9
- package/dist/esm/lib/runner/getSubtreeSnapshot.js +4 -5
- package/dist/esm/lib/schema/errors.js +4 -3
- package/dist/esm/lib/schema/validate.js +4 -5
- package/dist/esm/lib/scope/ScopeFacade.js +52 -35
- package/dist/esm/lib/scope/providers/baseStateCompatible.js +9 -9
- package/dist/esm/lib/scope/providers/guards.js +2 -2
- package/dist/esm/lib/scope/recorders/DebugRecorder.js +9 -7
- package/dist/esm/lib/scope/recorders/MetricRecorder.js +10 -8
- package/dist/esm/lib/scope/state/zod/defineScopeFromZod.js +2 -3
- package/dist/esm/lib/scope/state/zod/resolver.js +2 -3
- package/dist/esm/lib/scope/state/zod/scopeFactory.js +16 -20
- package/dist/esm/lib/scope/state/zod/utils/validateHelper.js +57 -14
- package/dist/esm/trace.js +4 -1
- package/dist/lib/builder/FlowChartBuilder.js +171 -61
- package/dist/lib/contract/openapi.js +4 -5
- package/dist/lib/contract/schema.js +115 -4
- package/dist/lib/decide/decide.js +4 -5
- package/dist/lib/decide/evidence.js +3 -2
- package/dist/lib/detach/drivers/immediate.js +70 -0
- package/dist/lib/detach/drivers/microtaskBatch.js +117 -0
- package/dist/lib/detach/drivers/sendBeacon.js +82 -0
- package/dist/lib/detach/drivers/setImmediate.js +85 -0
- package/dist/lib/detach/drivers/setTimeout.js +73 -0
- package/dist/lib/detach/drivers/workerThread.js +121 -0
- package/dist/lib/detach/flush.js +95 -0
- package/dist/lib/detach/handle.js +140 -0
- package/dist/lib/detach/registry.js +106 -0
- package/dist/lib/detach/runChild.js +67 -0
- package/dist/lib/detach/spawn.js +92 -0
- package/dist/lib/detach/types.js +38 -0
- package/dist/lib/engine/errors/errorInfo.js +4 -4
- package/dist/lib/engine/graph/StageNode.js +2 -2
- package/dist/lib/engine/handlers/ChildrenExecutor.js +9 -8
- package/dist/lib/engine/handlers/ContinuationResolver.js +12 -9
- package/dist/lib/engine/handlers/DeciderHandler.js +7 -8
- package/dist/lib/engine/handlers/ExtractorRunner.js +14 -8
- package/dist/lib/engine/handlers/NodeResolver.js +5 -3
- package/dist/lib/engine/handlers/RuntimeStructureManager.js +11 -14
- package/dist/lib/engine/handlers/SelectorHandler.js +9 -9
- package/dist/lib/engine/handlers/StageRunner.js +9 -11
- package/dist/lib/engine/handlers/SubflowExecutor.js +13 -12
- package/dist/lib/engine/handlers/SubflowInputMapper.js +4 -4
- package/dist/lib/engine/narrative/CombinedNarrativeRecorder.js +85 -96
- package/dist/lib/engine/narrative/FlowRecorderDispatcher.js +18 -36
- package/dist/lib/engine/narrative/NarrativeFlowRecorder.js +6 -5
- package/dist/lib/engine/narrative/recorders/AdaptiveNarrativeFlowRecorder.js +7 -6
- package/dist/lib/engine/narrative/recorders/ManifestFlowRecorder.js +10 -10
- package/dist/lib/engine/narrative/recorders/MilestoneNarrativeFlowRecorder.js +5 -3
- package/dist/lib/engine/narrative/recorders/ProgressiveNarrativeFlowRecorder.js +4 -3
- package/dist/lib/engine/narrative/recorders/RLENarrativeFlowRecorder.js +4 -4
- package/dist/lib/engine/narrative/recorders/SeparateNarrativeFlowRecorder.js +5 -6
- package/dist/lib/engine/narrative/recorders/SilentNarrativeFlowRecorder.js +5 -6
- package/dist/lib/engine/narrative/recorders/WindowedNarrativeFlowRecorder.js +5 -3
- package/dist/lib/engine/traversal/FlowchartTraverser.js +97 -71
- package/dist/lib/memory/DiagnosticCollector.js +6 -8
- package/dist/lib/memory/EventLog.js +5 -3
- package/dist/lib/memory/SharedMemory.js +3 -2
- package/dist/lib/memory/StageContext.js +44 -14
- package/dist/lib/memory/TransactionBuffer.js +9 -8
- package/dist/lib/memory/backtrack.js +3 -4
- package/dist/lib/memory/commitLogUtils.js +2 -2
- package/dist/lib/memory/utils.js +2 -3
- package/dist/lib/pause/types.js +33 -14
- package/dist/lib/reactive/createTypedScope.js +10 -8
- package/dist/lib/reactive/types.js +3 -1
- package/dist/lib/recorder/BoundaryStateTracker.js +267 -0
- package/dist/lib/recorder/CompositeRecorder.js +3 -1
- package/dist/lib/recorder/InOutRecorder.js +5 -6
- package/dist/lib/recorder/KeyedRecorder.js +2 -4
- package/dist/lib/recorder/QualityRecorder.js +15 -14
- package/dist/lib/recorder/SequenceRecorder.js +11 -12
- package/dist/lib/recorder/TopologyRecorder.js +36 -40
- package/dist/lib/recorder/index.js +4 -2
- package/dist/lib/recorder/qualityTrace.js +4 -5
- package/dist/lib/runner/ExecutionRuntime.js +20 -4
- package/dist/lib/runner/FlowChartExecutor.js +99 -55
- package/dist/lib/runner/RunContext.js +5 -3
- package/dist/lib/runner/RunnableChart.js +7 -9
- package/dist/lib/runner/getSubtreeSnapshot.js +4 -5
- package/dist/lib/schema/errors.js +4 -3
- package/dist/lib/schema/validate.js +4 -5
- package/dist/lib/scope/ScopeFacade.js +52 -35
- package/dist/lib/scope/providers/baseStateCompatible.js +9 -9
- package/dist/lib/scope/providers/guards.js +2 -2
- package/dist/lib/scope/recorders/DebugRecorder.js +9 -7
- package/dist/lib/scope/recorders/MetricRecorder.js +10 -8
- package/dist/lib/scope/state/zod/defineScopeFromZod.js +2 -3
- package/dist/lib/scope/state/zod/resolver.js +2 -3
- package/dist/lib/scope/state/zod/scopeFactory.js +16 -20
- package/dist/lib/scope/state/zod/utils/validateHelper.js +57 -14
- package/dist/trace.js +6 -2
- package/dist/types/advanced.d.ts +1 -0
- package/dist/types/detach.d.ts +59 -0
- package/dist/types/lib/builder/FlowChartBuilder.d.ts +81 -0
- package/dist/types/lib/detach/drivers/immediate.d.ts +39 -0
- package/dist/types/lib/detach/drivers/microtaskBatch.d.ts +57 -0
- package/dist/types/lib/detach/drivers/sendBeacon.d.ts +38 -0
- package/dist/types/lib/detach/drivers/setImmediate.d.ts +32 -0
- package/dist/types/lib/detach/drivers/setTimeout.d.ts +34 -0
- package/dist/types/lib/detach/drivers/workerThread.d.ts +50 -0
- package/dist/types/lib/detach/flush.d.ts +62 -0
- package/dist/types/lib/detach/handle.d.ts +83 -0
- package/dist/types/lib/detach/registry.d.ts +82 -0
- package/dist/types/lib/detach/runChild.d.ts +41 -0
- package/dist/types/lib/detach/spawn.d.ts +64 -0
- package/dist/types/lib/detach/types.d.ts +200 -0
- package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +0 -1
- package/dist/types/lib/engine/types.d.ts +0 -1
- package/dist/types/lib/reactive/types.d.ts +4 -0
- package/dist/types/lib/recorder/BoundaryStateTracker.d.ts +215 -0
- package/dist/types/lib/recorder/index.d.ts +1 -0
- package/dist/types/lib/runner/FlowChartExecutor.d.ts +28 -0
- package/dist/types/lib/scope/ScopeFacade.d.ts +4 -0
- package/dist/types/lib/scope/state/zod/utils/validateHelper.d.ts +13 -1
- package/dist/types/trace.d.ts +1 -0
- package/package.json +6 -1
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
*
|
|
17
17
|
* const result = await executor.run({ input: data, env: { traceId: 'req-123' } });
|
|
18
18
|
*/
|
|
19
|
+
import { detachAndForget as _detachAndForget, detachAndJoinLater as _detachAndJoinLater } from '../detach/spawn.js';
|
|
19
20
|
import { CombinedNarrativeRecorder } from '../engine/narrative/CombinedNarrativeRecorder.js';
|
|
20
21
|
import { ManifestFlowRecorder } from '../engine/narrative/recorders/ManifestFlowRecorder.js';
|
|
21
22
|
import { buildRuntimeStageId } from '../engine/runtimeStageId.js';
|
|
@@ -30,6 +31,38 @@ import { validateInput } from './validateInput.js';
|
|
|
30
31
|
/** Default scope factory — creates a plain ScopeFacade for each stage. */
|
|
31
32
|
const defaultScopeFactory = (ctx, stageName, readOnly, env) => new ScopeFacade(ctx, stageName, readOnly, env);
|
|
32
33
|
export class FlowChartExecutor {
|
|
34
|
+
traverser;
|
|
35
|
+
/** Shared execution counter — survives pause/resume. Reset on fresh run(). */
|
|
36
|
+
_executionCounter = { value: 0 };
|
|
37
|
+
narrativeEnabled = false;
|
|
38
|
+
narrativeOptions;
|
|
39
|
+
combinedRecorder;
|
|
40
|
+
flowRecorders = [];
|
|
41
|
+
scopeRecorders = [];
|
|
42
|
+
redactionPolicy;
|
|
43
|
+
sharedRedactedKeys = new Set();
|
|
44
|
+
sharedRedactedFieldsByKey = new Map();
|
|
45
|
+
lastCheckpoint;
|
|
46
|
+
/**
|
|
47
|
+
* `true` once `run()` (or a previous `resume()`) has executed on
|
|
48
|
+
* this instance. `resume()` branches on it:
|
|
49
|
+
*
|
|
50
|
+
* • true → reuse the constructor-time runtime (same-executor
|
|
51
|
+
* continuity: execution tree, recorders, narrative
|
|
52
|
+
* accumulate across pause/resume cycles)
|
|
53
|
+
* • false → seed a fresh runtime from `checkpoint.sharedState`
|
|
54
|
+
* (cross-executor / cross-process resume: new instance
|
|
55
|
+
* reconstructed from a serialized checkpoint)
|
|
56
|
+
*
|
|
57
|
+
* Without this flag, fresh executors silently discarded the
|
|
58
|
+
* checkpoint's sharedState and resume handlers couldn't read pre-pause
|
|
59
|
+
* scope. See `test/lib/pause/cross-executor-resume.test.ts`.
|
|
60
|
+
*/
|
|
61
|
+
_hasRunBefore = false;
|
|
62
|
+
// SYNC REQUIRED: every optional field here must mirror FlowChartExecutorOptions
|
|
63
|
+
// AND be assigned in the constructor's options-resolution block (the `else if` branch).
|
|
64
|
+
// Adding a field to only one of the three places causes silent omission.
|
|
65
|
+
flowChartArgs;
|
|
33
66
|
/**
|
|
34
67
|
* Create a FlowChartExecutor.
|
|
35
68
|
*
|
|
@@ -47,30 +80,6 @@ export class FlowChartExecutor {
|
|
|
47
80
|
* @param factoryOrOptions - A `ScopeFactory<TScope>` OR a `FlowChartExecutorOptions<TScope>` options object.
|
|
48
81
|
*/
|
|
49
82
|
constructor(flowChart, factoryOrOptions) {
|
|
50
|
-
var _a;
|
|
51
|
-
/** Shared execution counter — survives pause/resume. Reset on fresh run(). */
|
|
52
|
-
this._executionCounter = { value: 0 };
|
|
53
|
-
this.narrativeEnabled = false;
|
|
54
|
-
this.flowRecorders = [];
|
|
55
|
-
this.scopeRecorders = [];
|
|
56
|
-
this.sharedRedactedKeys = new Set();
|
|
57
|
-
this.sharedRedactedFieldsByKey = new Map();
|
|
58
|
-
/**
|
|
59
|
-
* `true` once `run()` (or a previous `resume()`) has executed on
|
|
60
|
-
* this instance. `resume()` branches on it:
|
|
61
|
-
*
|
|
62
|
-
* • true → reuse the constructor-time runtime (same-executor
|
|
63
|
-
* continuity: execution tree, recorders, narrative
|
|
64
|
-
* accumulate across pause/resume cycles)
|
|
65
|
-
* • false → seed a fresh runtime from `checkpoint.sharedState`
|
|
66
|
-
* (cross-executor / cross-process resume: new instance
|
|
67
|
-
* reconstructed from a serialized checkpoint)
|
|
68
|
-
*
|
|
69
|
-
* Without this flag, fresh executors silently discarded the
|
|
70
|
-
* checkpoint's sharedState and resume handlers couldn't read pre-pause
|
|
71
|
-
* scope. See `test/lib/pause/cross-executor-resume.test.ts`.
|
|
72
|
-
*/
|
|
73
|
-
this._hasRunBefore = false;
|
|
74
83
|
// Detect options-object form vs factory form
|
|
75
84
|
let scopeFactory;
|
|
76
85
|
let defaultValuesForContext;
|
|
@@ -98,7 +107,7 @@ export class FlowChartExecutor {
|
|
|
98
107
|
}
|
|
99
108
|
this.flowChartArgs = {
|
|
100
109
|
flowChart,
|
|
101
|
-
scopeFactory:
|
|
110
|
+
scopeFactory: scopeFactory ?? flowChart.scopeFactory ?? defaultScopeFactory,
|
|
102
111
|
defaultValuesForContext,
|
|
103
112
|
initialContext,
|
|
104
113
|
readOnlyContext,
|
|
@@ -110,15 +119,14 @@ export class FlowChartExecutor {
|
|
|
110
119
|
this.traverser = this.createTraverser();
|
|
111
120
|
}
|
|
112
121
|
createTraverser(signal, readOnlyContextOverride, env, maxDepth, overrides) {
|
|
113
|
-
var _a, _b, _c, _d;
|
|
114
122
|
const args = this.flowChartArgs;
|
|
115
123
|
const fc = args.flowChart;
|
|
116
|
-
const narrativeFlag = this.narrativeEnabled || (
|
|
124
|
+
const narrativeFlag = this.narrativeEnabled || (fc.enableNarrative ?? false);
|
|
117
125
|
// ── Composed scope factory ─────────────────────────────────────────
|
|
118
126
|
// Collect all scope modifiers (recorders, redaction) into a single list,
|
|
119
127
|
// then create ONE factory that applies them in a loop. Replaces the
|
|
120
128
|
// previous 4-deep closure nesting with a flat, debuggable composition.
|
|
121
|
-
if (overrides
|
|
129
|
+
if (overrides?.preserveRecorders) {
|
|
122
130
|
// Resume mode: keep existing combinedRecorder so narrative accumulates
|
|
123
131
|
}
|
|
124
132
|
else if (narrativeFlag) {
|
|
@@ -181,10 +189,10 @@ export class FlowChartExecutor {
|
|
|
181
189
|
mod(scope);
|
|
182
190
|
return scope;
|
|
183
191
|
});
|
|
184
|
-
const effectiveRoot =
|
|
185
|
-
const effectiveInitialContext =
|
|
192
|
+
const effectiveRoot = overrides?.root ?? fc.root;
|
|
193
|
+
const effectiveInitialContext = overrides?.initialContext ?? args.initialContext;
|
|
186
194
|
let runtime;
|
|
187
|
-
if (overrides
|
|
195
|
+
if (overrides?.existingRuntime) {
|
|
188
196
|
// Resume mode: reuse existing runtime so execution tree continues from pause point.
|
|
189
197
|
// Preserve the original root for getSnapshot() (full tree), then advance
|
|
190
198
|
// rootStageContext to a continuation from the leaf (for traversal).
|
|
@@ -211,7 +219,7 @@ export class FlowChartExecutor {
|
|
|
211
219
|
stageMap: fc.stageMap,
|
|
212
220
|
scopeFactory,
|
|
213
221
|
executionRuntime: runtime,
|
|
214
|
-
readOnlyContext: readOnlyContextOverride
|
|
222
|
+
readOnlyContext: readOnlyContextOverride ?? args.readOnlyContext,
|
|
215
223
|
throttlingErrorChecker: args.throttlingErrorChecker,
|
|
216
224
|
streamHandlers: args.streamHandlers,
|
|
217
225
|
extractor: fc.extractor,
|
|
@@ -220,13 +228,13 @@ export class FlowChartExecutor {
|
|
|
220
228
|
enrichSnapshots: args.enrichSnapshots,
|
|
221
229
|
narrativeEnabled: narrativeFlag,
|
|
222
230
|
buildTimeStructure: fc.buildTimeStructure,
|
|
223
|
-
logger:
|
|
231
|
+
logger: fc.logger ?? defaultLogger,
|
|
224
232
|
signal,
|
|
225
233
|
executionEnv: env,
|
|
226
234
|
flowRecorders: this.buildFlowRecordersList(),
|
|
227
235
|
executionCounter: this._executionCounter,
|
|
228
|
-
...(
|
|
229
|
-
...(
|
|
236
|
+
...(overrides?.subflowsOverride && { subflows: overrides.subflowsOverride }),
|
|
237
|
+
...(overrides?.subflowStatesForResume && {
|
|
230
238
|
subflowStatesForResume: overrides.subflowStatesForResume,
|
|
231
239
|
}),
|
|
232
240
|
...(maxDepth !== undefined && { maxDepth }),
|
|
@@ -249,7 +257,6 @@ export class FlowChartExecutor {
|
|
|
249
257
|
* most recent run. Never includes actual values.
|
|
250
258
|
*/
|
|
251
259
|
getRedactionReport() {
|
|
252
|
-
var _a, _b;
|
|
253
260
|
const fieldRedactions = {};
|
|
254
261
|
for (const [key, fields] of this.sharedRedactedFieldsByKey) {
|
|
255
262
|
fieldRedactions[key] = [...fields];
|
|
@@ -257,7 +264,7 @@ export class FlowChartExecutor {
|
|
|
257
264
|
return {
|
|
258
265
|
redactedKeys: [...this.sharedRedactedKeys],
|
|
259
266
|
fieldRedactions,
|
|
260
|
-
patterns: (
|
|
267
|
+
patterns: (this.redactionPolicy?.patterns ?? []).map((p) => p.source),
|
|
261
268
|
};
|
|
262
269
|
}
|
|
263
270
|
// ─── Pause/Resume ───
|
|
@@ -308,7 +315,6 @@ export class FlowChartExecutor {
|
|
|
308
315
|
* ```
|
|
309
316
|
*/
|
|
310
317
|
async resume(checkpoint, resumeInput, options) {
|
|
311
|
-
var _a, _b, _c;
|
|
312
318
|
this.lastCheckpoint = undefined;
|
|
313
319
|
// ── Validate checkpoint structure (may come from untrusted external storage) ──
|
|
314
320
|
if (!checkpoint ||
|
|
@@ -430,11 +436,11 @@ export class FlowChartExecutor {
|
|
|
430
436
|
}
|
|
431
437
|
// Replace the leaf subflow's root with the resume chain so the
|
|
432
438
|
// body runs from the pause point forward.
|
|
433
|
-
subflowsOverride = { ...(
|
|
439
|
+
subflowsOverride = { ...(fc.subflows ?? {}) };
|
|
434
440
|
subflowsOverride[leafSubflowId] = { root: innerResumeChain };
|
|
435
441
|
}
|
|
436
442
|
const resumeInitialContext = checkpoint.sharedState;
|
|
437
|
-
this.traverser = this.createTraverser(options
|
|
443
|
+
this.traverser = this.createTraverser(options?.signal, undefined, options?.env, options?.maxDepth, {
|
|
438
444
|
root: resumeRoot,
|
|
439
445
|
initialContext: resumeInitialContext,
|
|
440
446
|
preserveRecorders: true,
|
|
@@ -454,7 +460,7 @@ export class FlowChartExecutor {
|
|
|
454
460
|
if (this.combinedRecorder)
|
|
455
461
|
this.combinedRecorder.onResume(flowResumeEvent);
|
|
456
462
|
for (const r of this.flowRecorders)
|
|
457
|
-
|
|
463
|
+
r.onResume?.(flowResumeEvent);
|
|
458
464
|
const scopeResumeEvent = {
|
|
459
465
|
stageName: pausedNode.name,
|
|
460
466
|
stageId: pausedNode.id,
|
|
@@ -464,7 +470,7 @@ export class FlowChartExecutor {
|
|
|
464
470
|
timestamp: Date.now(),
|
|
465
471
|
};
|
|
466
472
|
for (const r of this.scopeRecorders)
|
|
467
|
-
|
|
473
|
+
r.onResume?.(scopeResumeEvent);
|
|
468
474
|
try {
|
|
469
475
|
return await this.traverser.execute();
|
|
470
476
|
}
|
|
@@ -494,7 +500,6 @@ export class FlowChartExecutor {
|
|
|
494
500
|
* Handles subflow paths by drilling into registered subflows.
|
|
495
501
|
*/
|
|
496
502
|
findNodeInGraph(stageId, subflowPath) {
|
|
497
|
-
var _a;
|
|
498
503
|
const fc = this.flowChartArgs.flowChart;
|
|
499
504
|
if (subflowPath.length === 0) {
|
|
500
505
|
// Top-level: DFS from root
|
|
@@ -503,7 +508,7 @@ export class FlowChartExecutor {
|
|
|
503
508
|
// Subflow: drill into the subflow chain, then search from the last subflow's root
|
|
504
509
|
let subflowRoot;
|
|
505
510
|
for (const sfId of subflowPath) {
|
|
506
|
-
const subflow =
|
|
511
|
+
const subflow = fc.subflows?.[sfId];
|
|
507
512
|
if (!subflow)
|
|
508
513
|
return undefined;
|
|
509
514
|
subflowRoot = subflow.root;
|
|
@@ -593,6 +598,47 @@ export class FlowChartExecutor {
|
|
|
593
598
|
this.scopeRecorders = this.scopeRecorders.filter((r) => r.id !== recorder.id);
|
|
594
599
|
this.scopeRecorders.push(recorder);
|
|
595
600
|
}
|
|
601
|
+
// ─── Detach (T4) ─────────────────────────────────────────────────────────
|
|
602
|
+
//
|
|
603
|
+
// Bare-executor entry point for fire-and-forget child flowchart execution.
|
|
604
|
+
// Use from outside any chart (consumer code that wants to detach work
|
|
605
|
+
// without first running a parent chart). For detach FROM INSIDE a stage,
|
|
606
|
+
// use `scope.$detachAndJoinLater(...)` / `scope.$detachAndForget(...)` —
|
|
607
|
+
// those mint refIds from the calling stage's runtimeStageId for trace
|
|
608
|
+
// correlation; the bare-executor entries use a synthetic prefix
|
|
609
|
+
// (`__executor__`) instead.
|
|
610
|
+
/**
|
|
611
|
+
* Detach a child flowchart on the given driver and return a `DetachHandle`
|
|
612
|
+
* the caller can `wait()` on (Promise) or read `.status` from (sync).
|
|
613
|
+
*
|
|
614
|
+
* The driver is a REQUIRED first argument — there is no library-default,
|
|
615
|
+
* to keep the engine free of driver imports and to make the choice of
|
|
616
|
+
* scheduling algorithm explicit at the call site.
|
|
617
|
+
*
|
|
618
|
+
* @example
|
|
619
|
+
* ```typescript
|
|
620
|
+
* import { microtaskBatchDriver } from 'footprintjs/detach';
|
|
621
|
+
*
|
|
622
|
+
* const exec = new FlowChartExecutor(parentChart);
|
|
623
|
+
* const handle = exec.detachAndJoinLater(microtaskBatchDriver, telemetryChart, { event: 'x' });
|
|
624
|
+
* await handle.wait(); // optional
|
|
625
|
+
* ```
|
|
626
|
+
*/
|
|
627
|
+
detachAndJoinLater(driver, child, input) {
|
|
628
|
+
return _detachAndJoinLater(driver, child, input, '__executor__');
|
|
629
|
+
}
|
|
630
|
+
/**
|
|
631
|
+
* Detach a child flowchart on the given driver and DISCARD the handle.
|
|
632
|
+
* Use for telemetry exports / fire-and-forget side effects where the
|
|
633
|
+
* caller doesn't care about the result.
|
|
634
|
+
*
|
|
635
|
+
* Errors raised by the child still land on the (discarded) handle — they
|
|
636
|
+
* go silent unless surfaced through a recorder. For observable detach,
|
|
637
|
+
* prefer `detachAndJoinLater` and surface failures via `.wait().catch()`.
|
|
638
|
+
*/
|
|
639
|
+
detachAndForget(driver, child, input) {
|
|
640
|
+
_detachAndForget(driver, child, input, '__executor__');
|
|
641
|
+
}
|
|
596
642
|
/** Detach all scope Recorders with the given ID. */
|
|
597
643
|
detachRecorder(id) {
|
|
598
644
|
this.scopeRecorders = this.scopeRecorders.filter((r) => r.id !== id);
|
|
@@ -770,17 +816,16 @@ export class FlowChartExecutor {
|
|
|
770
816
|
return recorders.length > 0 ? recorders : undefined;
|
|
771
817
|
}
|
|
772
818
|
async run(options) {
|
|
773
|
-
|
|
774
|
-
let signal = options === null || options === void 0 ? void 0 : options.signal;
|
|
819
|
+
let signal = options?.signal;
|
|
775
820
|
let timeoutId;
|
|
776
821
|
// Create an internal AbortController for timeoutMs
|
|
777
|
-
if (
|
|
822
|
+
if (options?.timeoutMs && !signal) {
|
|
778
823
|
const controller = new AbortController();
|
|
779
824
|
signal = controller.signal;
|
|
780
825
|
timeoutId = setTimeout(() => controller.abort(new Error(`Execution timed out after ${options.timeoutMs}ms`)), options.timeoutMs);
|
|
781
826
|
}
|
|
782
827
|
// Validate input against inputSchema if both are present
|
|
783
|
-
let validatedInput = options
|
|
828
|
+
let validatedInput = options?.input;
|
|
784
829
|
if (validatedInput && this.flowChartArgs.flowChart.inputSchema) {
|
|
785
830
|
validatedInput = validateInput(this.flowChartArgs.flowChart.inputSchema, validatedInput);
|
|
786
831
|
}
|
|
@@ -788,16 +833,16 @@ export class FlowChartExecutor {
|
|
|
788
833
|
// cross-run accumulation. The combinedRecorder is NOT cleared here — createTraverser() always
|
|
789
834
|
// creates a fresh CombinedNarrativeRecorder instance on each run, so stale state is never an issue.
|
|
790
835
|
for (const r of this.flowRecorders) {
|
|
791
|
-
|
|
836
|
+
r.clear?.();
|
|
792
837
|
}
|
|
793
838
|
for (const r of this.scopeRecorders) {
|
|
794
|
-
|
|
839
|
+
r.clear?.();
|
|
795
840
|
}
|
|
796
841
|
this.lastCheckpoint = undefined;
|
|
797
842
|
this._executionCounter = { value: 0 }; // Reset counter on fresh run
|
|
798
843
|
this._hasRunBefore = true; // mark so a later resume() takes the
|
|
799
844
|
// same-executor branch (reuse runtime, accumulate execution tree).
|
|
800
|
-
this.traverser = this.createTraverser(signal, validatedInput, options
|
|
845
|
+
this.traverser = this.createTraverser(signal, validatedInput, options?.env, options?.maxDepth);
|
|
801
846
|
try {
|
|
802
847
|
return await this.traverser.execute();
|
|
803
848
|
}
|
|
@@ -922,9 +967,8 @@ export class FlowChartExecutor {
|
|
|
922
967
|
* Returns empty array if no ManifestFlowRecorder is attached.
|
|
923
968
|
*/
|
|
924
969
|
getSubflowManifest() {
|
|
925
|
-
var _a;
|
|
926
970
|
const recorder = this.flowRecorders.find((r) => r instanceof ManifestFlowRecorder);
|
|
927
|
-
return
|
|
971
|
+
return recorder?.getManifest() ?? [];
|
|
928
972
|
}
|
|
929
973
|
/**
|
|
930
974
|
* Returns the full spec for a dynamically-registered subflow.
|
|
@@ -932,7 +976,7 @@ export class FlowChartExecutor {
|
|
|
932
976
|
*/
|
|
933
977
|
getSubflowSpec(subflowId) {
|
|
934
978
|
const recorder = this.flowRecorders.find((r) => r instanceof ManifestFlowRecorder);
|
|
935
|
-
return recorder
|
|
979
|
+
return recorder?.getSpec(subflowId);
|
|
936
980
|
}
|
|
937
981
|
}
|
|
938
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFJSCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUc3RixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSx1REFBdUQsQ0FBQztBQUU3RixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNsRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQ0FBMkMsQ0FBQztBQUMvRSxPQUFPLEVBV0wsYUFBYSxHQUNkLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRWxELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxzQkFBc0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRXJILE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFFdEQsT0FBTyxFQUErQyxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3RHLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCwwRUFBMEU7QUFDMUUsTUFBTSxtQkFBbUIsR0FBaUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsRUFBRSxDQUMxRSxJQUFJLFdBQVcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztBQWlFakQsTUFBTSxPQUFPLGlCQUFpQjtJQTZDNUI7Ozs7Ozs7Ozs7Ozs7OztPQWVHO0lBQ0gsWUFDRSxTQUFrQyxF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RztJQUNILGNBQWMsQ0FBQyxTQUFpQjtRQUM5QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLG9CQUFvQixDQUVwRSxDQUFDO1FBQ2QsT0FBTyxRQUFRLGFBQVIsUUFBUSx1QkFBUixRQUFRLENBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd0NoYXJ0RXhlY3V0b3Ig4oCUIFB1YmxpYyBBUEkgZm9yIGV4ZWN1dGluZyBhIGNvbXBpbGVkIEZsb3dDaGFydC5cbiAqXG4gKiBXcmFwcyBGbG93Y2hhcnRUcmF2ZXJzZXIuIEJ1aWxkIGEgY2hhcnQgd2l0aCBmbG93Q2hhcnQoKSBhbmQgcGFzcyB0aGUgcmVzdWx0IGhlcmU6XG4gKlxuICogICBjb25zdCBjaGFydCA9IGZsb3dDaGFydCgnZW50cnknLCBlbnRyeUZuKS5hZGRGdW5jdGlvbigncHJvY2VzcycsIHByb2Nlc3NGbikuYnVpbGQoKTtcbiAqXG4gKiAgIC8vIE5vLW9wdGlvbnMgZm9ybSAodXNlcyBhdXRvLWRldGVjdGVkIFR5cGVkU2NvcGUgZmFjdG9yeSBmcm9tIHRoZSBjaGFydCk6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAqXG4gKiAgIC8vIE9wdGlvbnMtb2JqZWN0IGZvcm0gKHByZWZlcnJlZCB3aGVuIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBiZWhhdmlvcik6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHNjb3BlRmFjdG9yeTogbXlGYWN0b3J5LCBlbnJpY2hTbmFwc2hvdHM6IHRydWUgfSk7XG4gKlxuICogICAvLyAyLXBhcmFtIGZvcm0gKGFjY2VwdHMgYSBTY29wZUZhY3RvcnkgZGlyZWN0bHksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIG15RmFjdG9yeSk7XG4gKlxuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dDogZGF0YSwgZW52OiB7IHRyYWNlSWQ6ICdyZXEtMTIzJyB9IH0pO1xuICovXG5cbmltcG9ydCB0eXBlIHsgRmxvd0NoYXJ0IH0gZnJvbSAnLi4vYnVpbGRlci90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLmpzJztcbmltcG9ydCB7IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL0NvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9uYXJyYXRpdmVUeXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IE1hbmlmZXN0RW50cnkgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3JlY29yZGVycy9NYW5pZmVzdEZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBNYW5pZmVzdEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvcmVjb3JkZXJzL01hbmlmZXN0Rmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBidWlsZFJ1bnRpbWVTdGFnZUlkIH0gZnJvbSAnLi4vZW5naW5lL3J1bnRpbWVTdGFnZUlkLmpzJztcbmltcG9ydCB7IEZsb3djaGFydFRyYXZlcnNlciB9IGZyb20gJy4uL2VuZ2luZS90cmF2ZXJzYWwvRmxvd2NoYXJ0VHJhdmVyc2VyLmpzJztcbmltcG9ydCB7XG4gIHR5cGUgRXhlY3V0b3JSZXN1bHQsXG4gIHR5cGUgRXh0cmFjdG9yRXJyb3IsXG4gIHR5cGUgUGF1c2VkUmVzdWx0LFxuICB0eXBlIFJ1bk9wdGlvbnMsXG4gIHR5cGUgU2NvcGVGYWN0b3J5LFxuICB0eXBlIFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSxcbiAgdHlwZSBTdGFnZU5vZGUsXG4gIHR5cGUgU3RyZWFtSGFuZGxlcnMsXG4gIHR5cGUgU3ViZmxvd1Jlc3VsdCxcbiAgdHlwZSBUcmF2ZXJzYWxSZXN1bHQsXG4gIGRlZmF1bHRMb2dnZXIsXG59IGZyb20gJy4uL2VuZ2luZS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnLi4vcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBoYXNFbWl0UmVjb3JkZXJNZXRob2RzLCBoYXNGbG93UmVjb3JkZXJNZXRob2RzLCBoYXNSZWNvcmRlck1ldGhvZHMgfSBmcm9tICcuLi9yZWNvcmRlci9Db21iaW5lZFJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi4vcmVjb3JkZXIvRW1pdFJlY29yZGVyLmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL3Njb3BlL2RldGVjdENpcmN1bGFyLmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVQcm90ZWN0aW9uTW9kZSB9IGZyb20gJy4uL3Njb3BlL3Byb3RlY3Rpb24vdHlwZXMuanMnO1xuaW1wb3J0IHsgU2NvcGVGYWNhZGUgfSBmcm9tICcuLi9zY29wZS9TY29wZUZhY2FkZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlY29yZGVyLCBSZWRhY3Rpb25Qb2xpY3ksIFJlZGFjdGlvblJlcG9ydCB9IGZyb20gJy4uL3Njb3BlL3R5cGVzLmpzJztcbmltcG9ydCB7IHR5cGUgUmVjb3JkZXJTbmFwc2hvdCwgdHlwZSBSdW50aW1lU25hcHNob3QsIEV4ZWN1dGlvblJ1bnRpbWUgfSBmcm9tICcuL0V4ZWN1dGlvblJ1bnRpbWUuanMnO1xuaW1wb3J0IHsgdmFsaWRhdGVJbnB1dCB9IGZyb20gJy4vdmFsaWRhdGVJbnB1dC5qcyc7XG5cbi8qKiBEZWZhdWx0IHNjb3BlIGZhY3Rvcnkg4oCUIGNyZWF0ZXMgYSBwbGFpbiBTY29wZUZhY2FkZSBmb3IgZWFjaCBzdGFnZS4gKi9cbmNvbnN0IGRlZmF1bHRTY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeSA9IChjdHgsIHN0YWdlTmFtZSwgcmVhZE9ubHksIGVudikgPT5cbiAgbmV3IFNjb3BlRmFjYWRlKGN0eCwgc3RhZ2VOYW1lLCByZWFkT25seSwgZW52KTtcblxuLyoqXG4gKiBPcHRpb25zIG9iamVjdCBmb3IgYEZsb3dDaGFydEV4ZWN1dG9yYCDigJQgcHJlZmVycmVkIG92ZXIgcG9zaXRpb25hbCBwYXJhbXMuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZXggPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHtcbiAqICAgc2NvcGVGYWN0b3J5OiBteUZhY3RvcnksXG4gKiAgIGVucmljaFNuYXBzaG90czogdHJ1ZSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogKipTeW5jIG5vdGUgZm9yIG1haW50YWluZXJzOioqIEV2ZXJ5IGZpZWxkIGFkZGVkIGhlcmUgbXVzdCBhbHNvIGFwcGVhciBpbiB0aGVcbiAqIGBmbG93Q2hhcnRBcmdzYCBwcml2YXRlIGZpZWxkIHR5cGUgYW5kIGluIHRoZSBjb25zdHJ1Y3RvcidzIG9wdGlvbnMtcmVzb2x1dGlvblxuICogYmxvY2sgKHRoZSBgZWxzZSBpZmAgYnJhbmNoIHRoYXQgcmVhZHMgZnJvbSBgb3B0c2ApLiBNaXNzaW5nIGFueSBvbmUgb2YgdGhlXG4gKiB0aHJlZSBjYXVzZXMgc2lsZW50IG9taXNzaW9uIOKAlCB0aGUgb3B0aW9uIGlzIGFjY2VwdGVkIGJ1dCBuZXZlciBhcHBsaWVkLlxuICpcbiAqICoqVFNjb3BlIGluZmVyZW5jZSBub3RlOioqIFdoZW4gdXNpbmcgdGhlIG9wdGlvbnMtb2JqZWN0IGZvcm0gd2l0aCBhIGN1c3RvbSBzY29wZSxcbiAqIFR5cGVTY3JpcHQgY2Fubm90IGluZmVyIGBUU2NvcGVgIHRocm91Z2ggdGhlIG9wdGlvbnMgb2JqZWN0LiBQYXNzIHRoZSB0eXBlXG4gKiBleHBsaWNpdGx5OiBgbmV3IEZsb3dDaGFydEV4ZWN1dG9yPFRPdXQsIE15U2NvcGU+KGNoYXJ0LCB7IHNjb3BlRmFjdG9yeSB9KWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zPFRTY29wZSA9IGFueT4ge1xuICAvLyDilIDilIAgQ29tbW9uIG9wdGlvbnMgKG1vc3QgY2FsbGVycyBuZWVkIG9ubHkgdGhlc2UpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBDdXN0b20gc2NvcGUgZmFjdG9yeS4gRGVmYXVsdHMgdG8gVHlwZWRTY29wZSBvciBTY29wZUZhY2FkZSBhdXRvLWRldGVjdGlvbi4gKi9cbiAgc2NvcGVGYWN0b3J5PzogU2NvcGVGYWN0b3J5PFRTY29wZT47XG4gIC8qKlxuICAgKiBBdHRhY2ggYSBwZXItc3RhZ2Ugc2NvcGUgc25hcHNob3QgdG8gZWFjaCBleHRyYWN0b3IgcmVzdWx0LiBXaGVuIGB0cnVlYCwgdGhlXG4gICAqIGV4dHJhY3Rpb24gY2FsbGJhY2sgcmVjZWl2ZXMgdGhlIGZ1bGwgc2hhcmVkIHN0YXRlIGF0IHRoZSBwb2ludCB0aGF0IHN0YWdlXG4gICAqIGNvbW1pdHRlZCDigJQgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgbXVsdGktc3RhZ2Ugc3RhdGUgdHJhbnNpdGlvbnMuIERlZmF1bHRzIHRvXG4gICAqIGBmYWxzZWAgKG5vIHNjb3BlIHNuYXBzaG90IGF0dGFjaGVkKS4gQ2FuIGFsc28gYmUgc2V0IG9uIHRoZSBjaGFydCB2aWFcbiAgICogYGZsb3dDaGFydCguLi4pLmVucmljaFNuYXBzaG90cyh0cnVlKWAuXG4gICAqL1xuICBlbnJpY2hTbmFwc2hvdHM/OiBib29sZWFuO1xuXG4gIC8vIOKUgOKUgCBDb250ZXh0IG9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIHByZS1wb3B1bGF0ZWQgaW50byB0aGUgc2hhcmVkIGNvbnRleHQgYmVmb3JlICoqZWFjaCoqIHN0YWdlXG4gICAqIChyZS1hcHBsaWVkIGV2ZXJ5IHN0YWdlLCBhY3RpbmcgYXMgYmFzZWxpbmUgZGVmYXVsdHMpLlxuICAgKi9cbiAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ/OiB1bmtub3duO1xuICAvKipcbiAgICogSW5pdGlhbCBjb250ZXh0IHZhbHVlcyBtZXJnZWQgaW50byB0aGUgc2hhcmVkIGNvbnRleHQgKipvbmNlKiogYXQgc3RhcnR1cFxuICAgKiAoYXBwbGllZCBiZWZvcmUgdGhlIGZpcnN0IHN0YWdlLCBub3QgcmVwZWF0ZWQgb24gc3Vic2VxdWVudCBzdGFnZXMpLlxuICAgKiBEaXN0aW5jdCBmcm9tIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAsIHdoaWNoIGlzIHJlLWFwcGxpZWQgZXZlcnkgc3RhZ2UuXG4gICAqL1xuICBpbml0aWFsQ29udGV4dD86IHVua25vd247XG4gIC8qKiBSZWFkLW9ubHkgaW5wdXQgYWNjZXNzaWJsZSB2aWEgYHNjb3BlLmdldEFyZ3MoKWAg4oCUIG5ldmVyIHRyYWNrZWQgb3Igd3JpdHRlbi4gKi9cbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcblxuICAvLyDilIDilIAgQWR2YW5jZWQgLyBlc2NhcGUtaGF0Y2ggb3B0aW9ucyAobW9zdCBjYWxsZXJzIGRvIG5vdCBuZWVkIHRoZXNlKSDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ3VzdG9tIGVycm9yIGNsYXNzaWZpZXIgZm9yIHRocm90dGxpbmcgZGV0ZWN0aW9uLiBSZXR1cm4gYHRydWVgIGlmIHRoZVxuICAgKiBlcnJvciByZXByZXNlbnRzIGEgcmF0ZS1saW1pdCBvciBiYWNrcHJlc3N1cmUgY29uZGl0aW9uICh0aGUgZXhlY3V0b3Igd2lsbFxuICAgKiB0cmVhdCBpdCBkaWZmZXJlbnRseSBmcm9tIGhhcmQgZmFpbHVyZXMpLiBEZWZhdWx0cyB0byBubyB0aHJvdHRsaW5nIGNsYXNzaWZpY2F0aW9uLlxuICAgKi9cbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgLyoqIEhhbmRsZXJzIGZvciBzdHJlYW1pbmcgc3RhZ2UgbGlmZWN5Y2xlIGV2ZW50cyAoc2VlIGBhZGRTdHJlYW1pbmdGdW5jdGlvbmApLiAqL1xuICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICAvKiogU2NvcGUgcHJvdGVjdGlvbiBtb2RlIGZvciBUeXBlZFNjb3BlIGRpcmVjdC1hc3NpZ25tZW50IGRldGVjdGlvbi4gKi9cbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG59XG5cbmV4cG9ydCBjbGFzcyBGbG93Q2hhcnRFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSB0cmF2ZXJzZXI6IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+O1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIOKAlCBzdXJ2aXZlcyBwYXVzZS9yZXN1bWUuIFJlc2V0IG9uIGZyZXNoIHJ1bigpLiAqL1xuICBwcml2YXRlIF9leGVjdXRpb25Db3VudGVyID0geyB2YWx1ZTogMCB9O1xuICBwcml2YXRlIG5hcnJhdGl2ZUVuYWJsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBuYXJyYXRpdmVPcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnM7XG4gIHByaXZhdGUgY29tYmluZWRSZWNvcmRlcjogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBmbG93UmVjb3JkZXJzOiBGbG93UmVjb3JkZXJbXSA9IFtdO1xuICBwcml2YXRlIHNjb3BlUmVjb3JkZXJzOiBSZWNvcmRlcltdID0gW107XG4gIHByaXZhdGUgcmVkYWN0aW9uUG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgc2hhcmVkUmVkYWN0ZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIHByaXZhdGUgc2hhcmVkUmVkYWN0ZWRGaWVsZHNCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgcHJpdmF0ZSBsYXN0Q2hlY2twb2ludDogRmxvd2NoYXJ0Q2hlY2twb2ludCB8IHVuZGVmaW5lZDtcbiAgLyoqXG4gICAqIGB0cnVlYCBvbmNlIGBydW4oKWAgKG9yIGEgcHJldmlvdXMgYHJlc3VtZSgpYCkgaGFzIGV4ZWN1dGVkIG9uXG4gICAqIHRoaXMgaW5zdGFuY2UuIGByZXN1bWUoKWAgYnJhbmNoZXMgb24gaXQ6XG4gICAqXG4gICAqICAg4oCiIHRydWUgIOKGkiByZXVzZSB0aGUgY29uc3RydWN0b3ItdGltZSBydW50aW1lIChzYW1lLWV4ZWN1dG9yXG4gICAqICAgICAgICAgICAgIGNvbnRpbnVpdHk6IGV4ZWN1dGlvbiB0cmVlLCByZWNvcmRlcnMsIG5hcnJhdGl2ZVxuICAgKiAgICAgICAgICAgICBhY2N1bXVsYXRlIGFjcm9zcyBwYXVzZS9yZXN1bWUgY3ljbGVzKVxuICAgKiAgIOKAoiBmYWxzZSDihpIgc2VlZCBhIGZyZXNoIHJ1bnRpbWUgZnJvbSBgY2hlY2twb2ludC5zaGFyZWRTdGF0ZWBcbiAgICogICAgICAgICAgICAgKGNyb3NzLWV4ZWN1dG9yIC8gY3Jvc3MtcHJvY2VzcyByZXN1bWU6IG5ldyBpbnN0YW5jZVxuICAgKiAgICAgICAgICAgICByZWNvbnN0cnVjdGVkIGZyb20gYSBzZXJpYWxpemVkIGNoZWNrcG9pbnQpXG4gICAqXG4gICAqIFdpdGhvdXQgdGhpcyBmbGFnLCBmcmVzaCBleGVjdXRvcnMgc2lsZW50bHkgZGlzY2FyZGVkIHRoZVxuICAgKiBjaGVja3BvaW50J3Mgc2hhcmVkU3RhdGUgYW5kIHJlc3VtZSBoYW5kbGVycyBjb3VsZG4ndCByZWFkIHByZS1wYXVzZVxuICAgKiBzY29wZS4gU2VlIGB0ZXN0L2xpYi9wYXVzZS9jcm9zcy1leGVjdXRvci1yZXN1bWUudGVzdC50c2AuXG4gICAqL1xuICBwcml2YXRlIF9oYXNSdW5CZWZvcmUgPSBmYWxzZTtcblxuICAvLyBTWU5DIFJFUVVJUkVEOiBldmVyeSBvcHRpb25hbCBmaWVsZCBoZXJlIG11c3QgbWlycm9yIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uc1xuICAvLyBBTkQgYmUgYXNzaWduZWQgaW4gdGhlIGNvbnN0cnVjdG9yJ3Mgb3B0aW9ucy1yZXNvbHV0aW9uIGJsb2NrICh0aGUgYGVsc2UgaWZgIGJyYW5jaCkuXG4gIC8vIEFkZGluZyBhIGZpZWxkIHRvIG9ubHkgb25lIG9mIHRoZSB0aHJlZSBwbGFjZXMgY2F1c2VzIHNpbGVudCBvbWlzc2lvbi5cbiAgcHJpdmF0ZSByZWFkb25seSBmbG93Q2hhcnRBcmdzOiB7XG4gICAgZmxvd0NoYXJ0OiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPjtcbiAgICBzY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuICAgIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0PzogdW5rbm93bjtcbiAgICBpbml0aWFsQ29udGV4dD86IHVua25vd247XG4gICAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcbiAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyPzogKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuO1xuICAgIHN0cmVhbUhhbmRsZXJzPzogU3RyZWFtSGFuZGxlcnM7XG4gICAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG4gICAgZW5yaWNoU25hcHNob3RzPzogYm9vbGVhbjtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgRmxvd0NoYXJ0RXhlY3V0b3IuXG4gICAqXG4gICAqICoqT3B0aW9ucyBvYmplY3QgZm9ybSoqIChwcmVmZXJyZWQpOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzY29wZUZhY3RvcnksIGVucmljaFNuYXBzaG90czogdHJ1ZSB9KVxuICAgKiBgYGBcbiAgICpcbiAgICogKioyLXBhcmFtIGZvcm0qKiAoYWxzbyBzdXBwb3J0ZWQpOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgc2NvcGVGYWN0b3J5KVxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGZsb3dDaGFydCAtIFRoZSBjb21waWxlZCBGbG93Q2hhcnQgcmV0dXJuZWQgYnkgYGZsb3dDaGFydCguLi4pLmJ1aWxkKClgXG4gICAqIEBwYXJhbSBmYWN0b3J5T3JPcHRpb25zIC0gQSBgU2NvcGVGYWN0b3J5PFRTY29wZT5gIE9SIGEgYEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGU+YCBvcHRpb25zIG9iamVjdC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgIGZsb3dDaGFydDogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT4sXG4gICAgZmFjdG9yeU9yT3B0aW9ucz86IFNjb3BlRmFjdG9yeTxUU2NvcGU+IHwgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zPFRTY29wZT4sXG4gICkge1xuICAgIC8vIERldGVjdCBvcHRpb25zLW9iamVjdCBmb3JtIHZzIGZhY3RvcnkgZm9ybVxuICAgIGxldCBzY29wZUZhY3Rvcnk6IFNjb3BlRmFjdG9yeTxUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAgIGxldCBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dDogdW5rbm93bjtcbiAgICBsZXQgaW5pdGlhbENvbnRleHQ6IHVua25vd247XG4gICAgbGV0IHJlYWRPbmx5Q29udGV4dDogdW5rbm93bjtcbiAgICBsZXQgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogKChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbikgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHN0cmVhbUhhbmRsZXJzOiBTdHJlYW1IYW5kbGVycyB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc2NvcGVQcm90ZWN0aW9uTW9kZTogU2NvcGVQcm90ZWN0aW9uTW9kZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZW5yaWNoU25hcHNob3RzOiBib29sZWFuIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiBmYWN0b3J5T3JPcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyAyLXBhcmFtIGZvcm06IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgc2NvcGVGYWN0b3J5KVxuICAgICAgc2NvcGVGYWN0b3J5ID0gZmFjdG9yeU9yT3B0aW9ucztcbiAgICB9IGVsc2UgaWYgKGZhY3RvcnlPck9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gT3B0aW9ucyBvYmplY3QgZm9ybTogbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHNjb3BlRmFjdG9yeSwgZW5yaWNoU25hcHNob3RzLCAuLi4gfSlcbiAgICAgIGNvbnN0IG9wdHMgPSBmYWN0b3J5T3JPcHRpb25zO1xuICAgICAgc2NvcGVGYWN0b3J5ID0gb3B0cy5zY29wZUZhY3Rvcnk7XG4gICAgICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dCA9IG9wdHMuZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ7XG4gICAgICBpbml0aWFsQ29udGV4dCA9IG9wdHMuaW5pdGlhbENvbnRleHQ7XG4gICAgICByZWFkT25seUNvbnRleHQgPSBvcHRzLnJlYWRPbmx5Q29udGV4dDtcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXIgPSBvcHRzLnRocm90dGxpbmdFcnJvckNoZWNrZXI7XG4gICAgICBzdHJlYW1IYW5kbGVycyA9IG9wdHMuc3RyZWFtSGFuZGxlcnM7XG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlID0gb3B0cy5zY29wZVByb3RlY3Rpb25Nb2RlO1xuICAgICAgZW5yaWNoU25hcHNob3RzID0gb3B0cy5lbnJpY2hTbmFwc2hvdHM7XG4gICAgfVxuICAgIHRoaXMuZmxvd0NoYXJ0QXJncyA9IHtcbiAgICAgIGZsb3dDaGFydCxcbiAgICAgIHNjb3BlRmFjdG9yeTogc2NvcGVGYWN0b3J5ID8/IGZsb3dDaGFydC5zY29wZUZhY3RvcnkgPz8gKGRlZmF1bHRTY29wZUZhY3RvcnkgYXMgU2NvcGVGYWN0b3J5PFRTY29wZT4pLFxuICAgICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQsXG4gICAgICBpbml0aWFsQ29udGV4dCxcbiAgICAgIHJlYWRPbmx5Q29udGV4dCxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICBzdHJlYW1IYW5kbGVycyxcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICBlbnJpY2hTbmFwc2hvdHMsXG4gICAgfTtcbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRyYXZlcnNlcihcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICByZWFkT25seUNvbnRleHRPdmVycmlkZT86IHVua25vd24sXG4gICAgZW52PzogaW1wb3J0KCcuLi9lbmdpbmUvdHlwZXMnKS5FeGVjdXRpb25FbnYsXG4gICAgbWF4RGVwdGg/OiBudW1iZXIsXG4gICAgb3ZlcnJpZGVzPzoge1xuICAgICAgcm9vdD86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgICAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAgICAgcHJlc2VydmVSZWNvcmRlcnM/OiBib29sZWFuO1xuICAgICAgZXhpc3RpbmdSdW50aW1lPzogSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPjtcbiAgICAgIC8qKiBQZXItc3ViZmxvdyBzY29wZSBjYXB0dXJlcyBmcm9tIGEgY2hlY2twb2ludCDigJQgcGFzc2VkIHRocm91Z2hcbiAgICAgICAqICB0byBIYW5kbGVyRGVwcyBzbyBTdWJmbG93RXhlY3V0b3IgY2FuIHJlLXNlZWQgbmVzdGVkIHJ1bnRpbWVzXG4gICAgICAgKiAgb24gdGhlIHJlc3VtZSBwYXRoLiBVbmRlZmluZWQgb24gbm9ybWFsIHJ1bigpIHBhdGhzLiAqL1xuICAgICAgc3ViZmxvd1N0YXRlc0ZvclJlc3VtZT86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgICAgIC8qKiBSZXN1bWUtb25seSBvdmVycmlkZSBvZiB0aGUgc3ViZmxvd3MgZGljdCDigJQgc3Vic3RpdHV0ZXMgdGhlXG4gICAgICAgKiAgbGVhZiBzdWJmbG93J3Mgcm9vdCB3aXRoIGEgcmVzdW1lIGNoYWluIHNvIHRoZSBzdWJmbG93IGJvZHlcbiAgICAgICAqICBwaWNrcyB1cCBhdCB0aGUgcGF1c2UgcG9pbnQuIE90aGVyIGVudHJpZXMgcGFzcyB0aHJvdWdoXG4gICAgICAgKiAgdW5jaGFuZ2VkLiAqL1xuICAgICAgc3ViZmxvd3NPdmVycmlkZT86IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT47XG4gICAgfSxcbiAgKTogRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmZsb3dDaGFydEFyZ3M7XG4gICAgY29uc3QgZmMgPSBhcmdzLmZsb3dDaGFydDtcbiAgICBjb25zdCBuYXJyYXRpdmVGbGFnID0gdGhpcy5uYXJyYXRpdmVFbmFibGVkIHx8IChmYy5lbmFibGVOYXJyYXRpdmUgPz8gZmFsc2UpO1xuXG4gICAgLy8g4pSA4pSAIENvbXBvc2VkIHNjb3BlIGZhY3Rvcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgLy8gQ29sbGVjdCBhbGwgc2NvcGUgbW9kaWZpZXJzIChyZWNvcmRlcnMsIHJlZGFjdGlvbikgaW50byBhIHNpbmdsZSBsaXN0LFxuICAgIC8vIHRoZW4gY3JlYXRlIE9ORSBmYWN0b3J5IHRoYXQgYXBwbGllcyB0aGVtIGluIGEgbG9vcC4gUmVwbGFjZXMgdGhlXG4gICAgLy8gcHJldmlvdXMgNC1kZWVwIGNsb3N1cmUgbmVzdGluZyB3aXRoIGEgZmxhdCwgZGVidWdnYWJsZSBjb21wb3NpdGlvbi5cblxuICAgIGlmIChvdmVycmlkZXM/LnByZXNlcnZlUmVjb3JkZXJzKSB7XG4gICAgICAvLyBSZXN1bWUgbW9kZToga2VlcCBleGlzdGluZyBjb21iaW5lZFJlY29yZGVyIHNvIG5hcnJhdGl2ZSBhY2N1bXVsYXRlc1xuICAgIH0gZWxzZSBpZiAobmFycmF0aXZlRmxhZykge1xuICAgICAgdGhpcy5jb21iaW5lZFJlY29yZGVyID0gbmV3IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIodGhpcy5uYXJyYXRpdmVPcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb21iaW5lZFJlY29yZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMuc2hhcmVkUmVkYWN0ZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgdGhpcy5zaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuXG4gICAgLy8gQnVpbGQgbW9kaWZpZXIgbGlzdCDigJQgZWFjaCBtb2RpZmllciByZWNlaXZlcyB0aGUgc2NvcGUgYWZ0ZXIgY3JlYXRpb25cbiAgICB0eXBlIFNjb3BlTW9kaWZpZXIgPSAoc2NvcGU6IGFueSkgPT4gdm9pZDtcbiAgICBjb25zdCBtb2RpZmllcnM6IFNjb3BlTW9kaWZpZXJbXSA9IFtdO1xuXG4gICAgLy8gMS4gTmFycmF0aXZlIHJlY29yZGVyIChpZiBlbmFibGVkKVxuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHtcbiAgICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5jb21iaW5lZFJlY29yZGVyO1xuICAgICAgbW9kaWZpZXJzLnB1c2goKHNjb3BlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGUuYXR0YWNoUmVjb3JkZXIgPT09ICdmdW5jdGlvbicpIHNjb3BlLmF0dGFjaFJlY29yZGVyKHJlY29yZGVyKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDIuIFVzZXItcHJvdmlkZWQgc2NvcGUgcmVjb3JkZXJzXG4gICAgaWYgKHRoaXMuc2NvcGVSZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcmVjb3JkZXJzID0gdGhpcy5zY29wZVJlY29yZGVycztcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLmF0dGFjaFJlY29yZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZm9yIChjb25zdCByIG9mIHJlY29yZGVycykgc2NvcGUuYXR0YWNoUmVjb3JkZXIocik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDMuIFJlZGFjdGlvbiBwb2xpY3kgKGNvbmRpdGlvbmFsIOKAlCBvbmx5IHdoZW4gcG9saWN5IGlzIHNldClcbiAgICBpZiAodGhpcy5yZWRhY3Rpb25Qb2xpY3kpIHtcbiAgICAgIGNvbnN0IHBvbGljeSA9IHRoaXMucmVkYWN0aW9uUG9saWN5O1xuICAgICAgbW9kaWZpZXJzLnB1c2goKHNjb3BlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGUudXNlUmVkYWN0aW9uUG9saWN5ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgc2NvcGUudXNlUmVkYWN0aW9uUG9saWN5KHBvbGljeSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgLy8gUHJlLXBvcHVsYXRlIGV4ZWN1dG9yLWxldmVsIGZpZWxkIHJlZGFjdGlvbiBtYXAgZnJvbSBwb2xpY3lcbiAgICAgIC8vIHNvIGdldFJlZGFjdGlvblJlcG9ydCgpIGluY2x1ZGVzIGZpZWxkLWxldmVsIHJlZGFjdGlvbnMuXG4gICAgICBpZiAocG9saWN5LmZpZWxkcykge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkc10gb2YgT2JqZWN0LmVudHJpZXMocG9saWN5LmZpZWxkcykpIHtcbiAgICAgICAgICB0aGlzLnNoYXJlZFJlZGFjdGVkRmllbGRzQnlLZXkuc2V0KGtleSwgbmV3IFNldChmaWVsZHMpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENvbXBvc2U6IGJhc2UgZmFjdG9yeSArIG1vZGlmaWVycyBpbiBhIHNpbmdsZSBwYXNzLlxuICAgIC8vIFNoYXJlZCByZWRhY3RlZCBrZXlzIGFyZSBBTFdBWVMgd2lyZWQgdXAgKHVuY29uZGl0aW9uYWwg4oCUIGVuc3VyZXMgY3Jvc3Mtc3RhZ2VcbiAgICAvLyBwcm9wYWdhdGlvbiBldmVuIHdpdGhvdXQgYSBwb2xpY3ksIGJlY2F1c2Ugc3RhZ2VzIGNhbiBjYWxsIHNldFZhbHVlKGtleSwgdmFsLCB0cnVlKVxuICAgIC8vIGZvciBwZXItY2FsbCByZWRhY3Rpb24pLiBPcHRpb25hbCBtb2RpZmllcnMgKHJlY29yZGVycywgcG9saWN5KSBhcmUgaW4gdGhlIGxpc3QuXG4gICAgY29uc3QgYmFzZUZhY3RvcnkgPSBhcmdzLnNjb3BlRmFjdG9yeTtcbiAgICBjb25zdCBzaGFyZWRSZWRhY3RlZEtleXMgPSB0aGlzLnNoYXJlZFJlZGFjdGVkS2V5cztcbiAgICBjb25zdCBzY29wZUZhY3RvcnkgPSAoKGN0eDogYW55LCBzdGFnZU5hbWU6IHN0cmluZywgcmVhZE9ubHk/OiB1bmtub3duLCBlbnZBcmc/OiBhbnkpID0+IHtcbiAgICAgIGNvbnN0IHNjb3BlID0gYmFzZUZhY3RvcnkoY3R4LCBzdGFnZU5hbWUsIHJlYWRPbmx5LCBlbnZBcmcpO1xuICAgICAgLy8gQWx3YXlzIHdpcmUgc2hhcmVkIHJlZGFjdGlvbiBzdGF0ZVxuICAgICAgaWYgKHR5cGVvZiAoc2NvcGUgYXMgYW55KS51c2VTaGFyZWRSZWRhY3RlZEtleXMgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgKHNjb3BlIGFzIGFueSkudXNlU2hhcmVkUmVkYWN0ZWRLZXlzKHNoYXJlZFJlZGFjdGVkS2V5cyk7XG4gICAgICB9XG4gICAgICAvLyBBcHBseSBvcHRpb25hbCBtb2RpZmllcnNcbiAgICAgIGZvciAoY29uc3QgbW9kIG9mIG1vZGlmaWVycykgbW9kKHNjb3BlKTtcbiAgICAgIHJldHVybiBzY29wZTtcbiAgICB9KSBhcyBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZVJvb3QgPSBvdmVycmlkZXM/LnJvb3QgPz8gZmMucm9vdDtcbiAgICBjb25zdCBlZmZlY3RpdmVJbml0aWFsQ29udGV4dCA9IG92ZXJyaWRlcz8uaW5pdGlhbENvbnRleHQgPz8gYXJncy5pbml0aWFsQ29udGV4dDtcblxuICAgIGxldCBydW50aW1lOiBFeGVjdXRpb25SdW50aW1lO1xuICAgIGlmIChvdmVycmlkZXM/LmV4aXN0aW5nUnVudGltZSkge1xuICAgICAgLy8gUmVzdW1lIG1vZGU6IHJldXNlIGV4aXN0aW5nIHJ1bnRpbWUgc28gZXhlY3V0aW9uIHRyZWUgY29udGludWVzIGZyb20gcGF1c2UgcG9pbnQuXG4gICAgICAvLyBQcmVzZXJ2ZSB0aGUgb3JpZ2luYWwgcm9vdCBmb3IgZ2V0U25hcHNob3QoKSAoZnVsbCB0cmVlKSwgdGhlbiBhZHZhbmNlXG4gICAgICAvLyByb290U3RhZ2VDb250ZXh0IHRvIGEgY29udGludWF0aW9uIGZyb20gdGhlIGxlYWYgKGZvciB0cmF2ZXJzYWwpLlxuICAgICAgcnVudGltZSA9IG92ZXJyaWRlcy5leGlzdGluZ1J1bnRpbWU7XG4gICAgICBydW50aW1lLnByZXNlcnZlU25hcHNob3RSb290KCk7XG4gICAgICBsZXQgbGVhZiA9IHJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dDtcbiAgICAgIHdoaWxlIChsZWFmLm5leHQpIGxlYWYgPSBsZWFmLm5leHQ7XG4gICAgICBydW50aW1lLnJvb3RTdGFnZUNvbnRleHQgPSBsZWFmLmNyZWF0ZU5leHQoJycsIGVmZmVjdGl2ZVJvb3QubmFtZSwgZWZmZWN0aXZlUm9vdC5pZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJ1bnRpbWUgPSBuZXcgRXhlY3V0aW9uUnVudGltZShcbiAgICAgICAgZWZmZWN0aXZlUm9vdC5uYW1lLFxuICAgICAgICBlZmZlY3RpdmVSb290LmlkLFxuICAgICAgICBhcmdzLmRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0LFxuICAgICAgICBlZmZlY3RpdmVJbml0aWFsQ29udGV4dCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gV2hlbiBhIHJlZGFjdGlvbiBwb2xpY3kgaXMgY29uZmlndXJlZCwgbWFpbnRhaW4gYSBwYXJhbGxlbCByZWRhY3RlZFxuICAgIC8vIG1pcnJvciBvZiBgZ2xvYmFsU3RvcmVgIGR1cmluZyB0cmF2ZXJzYWwuIEVhY2ggY29tbWl0IGFwcGxpZXMgdGhlXG4gICAgLy8gYWxyZWFkeS1jb21wdXRlZCByZWRhY3RlZCBwYXRjaGVzIOKAlCBzYW1lIG9uZXMgZmVkIHRvIHRoZSBldmVudCBsb2cg4oCUXG4gICAgLy8gc28gYGdldFNuYXBzaG90KHsgcmVkYWN0OiB0cnVlIH0pYCByZXR1cm5zIGEgc2NydWJiZWQgc2hhcmVkU3RhdGUgYXRcbiAgICAvLyB6ZXJvIHBvc3QtcGFzcyBjb3N0LiBTa2lwcGVkIHdoZW4gbm8gcG9saWN5IGV4aXN0cyAoemVybyBhbGxvY2F0aW9uKS5cbiAgICBpZiAodGhpcy5yZWRhY3Rpb25Qb2xpY3kpIHtcbiAgICAgIHJ1bnRpbWUuZW5hYmxlUmVkYWN0ZWRNaXJyb3IoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+KHtcbiAgICAgIHJvb3Q6IGVmZmVjdGl2ZVJvb3QsXG4gICAgICBzdGFnZU1hcDogZmMuc3RhZ2VNYXAsXG4gICAgICBzY29wZUZhY3RvcnksXG4gICAgICBleGVjdXRpb25SdW50aW1lOiBydW50aW1lLFxuICAgICAgcmVhZE9ubHlDb250ZXh0OiByZWFkT25seUNvbnRleHRPdmVycmlkZSA/PyBhcmdzLnJlYWRPbmx5Q29udGV4dCxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI6IGFyZ3MudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcixcbiAgICAgIHN0cmVhbUhhbmRsZXJzOiBhcmdzLnN0cmVhbUhhbmRsZXJzLFxuICAgICAgZXh0cmFjdG9yOiBmYy5leHRyYWN0b3IsXG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBhcmdzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICBzdWJmbG93czogZmMuc3ViZmxvd3MsXG4gICAgICBlbnJpY2hTbmFwc2hvdHM6IGFyZ3MuZW5yaWNoU25hcHNob3RzLFxuICAgICAgbmFycmF0aXZlRW5hYmxlZDogbmFycmF0aXZlRmxhZyxcbiAgICAgIGJ1aWxkVGltZVN0cnVjdHVyZTogZmMuYnVpbGRUaW1lU3RydWN0dXJlLFxuICAgICAgbG9nZ2VyOiBmYy5sb2dnZXIgPz8gZGVmYXVsdExvZ2dlcixcbiAgICAgIHNpZ25hbCxcbiAgICAgIGV4ZWN1dGlvbkVudjogZW52LFxuICAgICAgZmxvd1JlY29yZGVyczogdGhpcy5idWlsZEZsb3dSZWNvcmRlcnNMaXN0KCksXG4gICAgICBleGVjdXRpb25Db3VudGVyOiB0aGlzLl9leGVjdXRpb25Db3VudGVyLFxuICAgICAgLi4uKG92ZXJyaWRlcz8uc3ViZmxvd3NPdmVycmlkZSAmJiB7IHN1YmZsb3dzOiBvdmVycmlkZXMuc3ViZmxvd3NPdmVycmlkZSB9KSxcbiAgICAgIC4uLihvdmVycmlkZXM/LnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUgJiYge1xuICAgICAgICBzdWJmbG93U3RhdGVzRm9yUmVzdW1lOiBvdmVycmlkZXMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSxcbiAgICAgIH0pLFxuICAgICAgLi4uKG1heERlcHRoICE9PSB1bmRlZmluZWQgJiYgeyBtYXhEZXB0aCB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIGVuYWJsZU5hcnJhdGl2ZShvcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgPSB0cnVlO1xuICAgIGlmIChvcHRpb25zKSB0aGlzLm5hcnJhdGl2ZU9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGRlY2xhcmF0aXZlIHJlZGFjdGlvbiBwb2xpY3kgdGhhdCBhcHBsaWVzIHRvIGFsbCBzdGFnZXMuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS5cbiAgICovXG4gIHNldFJlZGFjdGlvblBvbGljeShwb2xpY3k6IFJlZGFjdGlvblBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucmVkYWN0aW9uUG9saWN5ID0gcG9saWN5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wbGlhbmNlLWZyaWVuZGx5IHJlcG9ydCBvZiBhbGwgcmVkYWN0aW9uIGFjdGl2aXR5IGZyb20gdGhlXG4gICAqIG1vc3QgcmVjZW50IHJ1bi4gTmV2ZXIgaW5jbHVkZXMgYWN0dWFsIHZhbHVlcy5cbiAgICovXG4gIGdldFJlZGFjdGlvblJlcG9ydCgpOiBSZWRhY3Rpb25SZXBvcnQge1xuICAgIGNvbnN0IGZpZWxkUmVkYWN0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIHRoaXMuc2hhcmVkUmVkYWN0ZWRGaWVsZHNCeUtleSkge1xuICAgICAgZmllbGRSZWRhY3Rpb25zW2tleV0gPSBbLi4uZmllbGRzXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZGFjdGVkS2V5czogWy4uLnRoaXMuc2hhcmVkUmVkYWN0ZWRLZXlzXSxcbiAgICAgIGZpZWxkUmVkYWN0aW9ucyxcbiAgICAgIHBhdHRlcm5zOiAodGhpcy5yZWRhY3Rpb25Qb2xpY3k/LnBhdHRlcm5zID8/IFtdKS5tYXAoKHApID0+IHAuc291cmNlKSxcbiAgICB9O1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFBhdXNlL1Jlc3VtZSDilIDilIDilIBcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2hlY2twb2ludCBmcm9tIHRoZSBtb3N0IHJlY2VudCBwYXVzZWQgZXhlY3V0aW9uLCBvciBgdW5kZWZpbmVkYFxuICAgKiBpZiB0aGUgbGFzdCBydW4gY29tcGxldGVkIHdpdGhvdXQgcGF1c2luZy5cbiAgICpcbiAgICogVGhlIGNoZWNrcG9pbnQgaXMgSlNPTi1zZXJpYWxpemFibGUg4oCUIHN0b3JlIGl0IGluIFJlZGlzLCBQb3N0Z3JlcywgbG9jYWxTdG9yYWdlLCBldGMuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0b3IucnVuKHsgaW5wdXQgfSk7XG4gICAqIGlmIChleGVjdXRvci5pc1BhdXNlZCgpKSB7XG4gICAqICAgY29uc3QgY2hlY2twb2ludCA9IGV4ZWN1dG9yLmdldENoZWNrcG9pbnQoKSE7XG4gICAqICAgYXdhaXQgcmVkaXMuc2V0KGBzZXNzaW9uOiR7aWR9YCwgSlNPTi5zdHJpbmdpZnkoY2hlY2twb2ludCkpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0Q2hlY2twb2ludCgpOiBGbG93Y2hhcnRDaGVja3BvaW50IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hlY2twb2ludDtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgbW9zdCByZWNlbnQgcnVuKCkgd2FzIHBhdXNlZCAoY2hlY2twb2ludCBhdmFpbGFibGUpLiAqL1xuICBpc1BhdXNlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5sYXN0Q2hlY2twb2ludCAhPT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZSBhIHBhdXNlZCBmbG93Y2hhcnQgZnJvbSBhIGNoZWNrcG9pbnQuXG4gICAqXG4gICAqIFJlc3RvcmVzIHRoZSBzY29wZSBzdGF0ZSwgY2FsbHMgdGhlIHBhdXNlZCBzdGFnZSdzIGByZXN1bWVGbmAgd2l0aCB0aGVcbiAgICogcHJvdmlkZWQgaW5wdXQsIHRoZW4gY29udGludWVzIHRyYXZlcnNhbCBmcm9tIHRoZSBuZXh0IHN0YWdlLlxuICAgKlxuICAgKiBUaGUgY2hlY2twb2ludCBjYW4gY29tZSBmcm9tIGBnZXRDaGVja3BvaW50KClgIG9uIGEgcHJldmlvdXMgcnVuLCBvciBmcm9tXG4gICAqIGEgc2VyaWFsaXplZCBjaGVja3BvaW50IHN0b3JlZCBpbiBSZWRpcy9Qb3N0Z3Jlcy9sb2NhbFN0b3JhZ2UuXG4gICAqXG4gICAqICoqTmFycmF0aXZlL3JlY29yZGVyIHN0YXRlIGlzIHJlc2V0IG9uIHJlc3VtZS4qKiBUbyBrZWVwIGEgdW5pZmllZCBuYXJyYXRpdmVcbiAgICogYWNyb3NzIHBhdXNlL3Jlc3VtZSBjeWNsZXMsIGNvbGxlY3QgaXQgYmVmb3JlIGNhbGxpbmcgcmVzdW1lLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIEFmdGVyIGEgcGF1c2UuLi5cbiAgICogY29uc3QgY2hlY2twb2ludCA9IGV4ZWN1dG9yLmdldENoZWNrcG9pbnQoKSE7XG4gICAqIGF3YWl0IHJlZGlzLnNldChgc2Vzc2lvbjoke2lkfWAsIEpTT04uc3RyaW5naWZ5KGNoZWNrcG9pbnQpKTtcbiAgICpcbiAgICogLy8gTGF0ZXIgKHBvc3NpYmx5IGRpZmZlcmVudCBzZXJ2ZXIsIHNhbWUgY2hhcnQpXG4gICAqIGNvbnN0IGNoZWNrcG9pbnQgPSBKU09OLnBhcnNlKGF3YWl0IHJlZGlzLmdldChgc2Vzc2lvbjoke2lkfWApKTtcbiAgICogY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQpO1xuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5yZXN1bWUoY2hlY2twb2ludCwgeyBhcHByb3ZlZDogdHJ1ZSB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZXN1bWUoXG4gICAgY2hlY2twb2ludDogRmxvd2NoYXJ0Q2hlY2twb2ludCxcbiAgICByZXN1bWVJbnB1dD86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFBpY2s8UnVuT3B0aW9ucywgJ3NpZ25hbCcgfCAnZW52JyB8ICdtYXhEZXB0aCc+LFxuICApOiBQcm9taXNlPEV4ZWN1dG9yUmVzdWx0PiB7XG4gICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIOKUgOKUgCBWYWxpZGF0ZSBjaGVja3BvaW50IHN0cnVjdHVyZSAobWF5IGNvbWUgZnJvbSB1bnRydXN0ZWQgZXh0ZXJuYWwgc3RvcmFnZSkg4pSA4pSAXG4gICAgaWYgKFxuICAgICAgIWNoZWNrcG9pbnQgfHxcbiAgICAgIHR5cGVvZiBjaGVja3BvaW50ICE9PSAnb2JqZWN0JyB8fFxuICAgICAgdHlwZW9mIGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUgIT09ICdvYmplY3QnIHx8XG4gICAgICBjaGVja3BvaW50LnNoYXJlZFN0YXRlID09PSBudWxsIHx8XG4gICAgICBBcnJheS5pc0FycmF5KGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hlY2twb2ludDogc2hhcmVkU3RhdGUgbXVzdCBiZSBhIHBsYWluIG9iamVjdC4nKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBjaGVja3BvaW50LnBhdXNlZFN0YWdlSWQgIT09ICdzdHJpbmcnIHx8IGNoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZCA9PT0gJycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaGVja3BvaW50OiBwYXVzZWRTdGFnZUlkIG11c3QgYmUgYSBub24tZW1wdHkgc3RyaW5nLicpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICAhQXJyYXkuaXNBcnJheShjaGVja3BvaW50LnN1YmZsb3dQYXRoKSB8fFxuICAgICAgIWNoZWNrcG9pbnQuc3ViZmxvd1BhdGguZXZlcnkoKHM6IHVua25vd24pID0+IHR5cGVvZiBzID09PSAnc3RyaW5nJylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaGVja3BvaW50OiBzdWJmbG93UGF0aCBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3MuJyk7XG4gICAgfVxuXG4gICAgLy8gRmluZCB0aGUgcGF1c2VkIG5vZGUgaW4gdGhlIGdyYXBoXG4gICAgY29uc3QgcGF1c2VkTm9kZSA9IHRoaXMuZmluZE5vZGVJbkdyYXBoKGNoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZCwgY2hlY2twb2ludC5zdWJmbG93UGF0aCk7XG4gICAgaWYgKCFwYXVzZWROb2RlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiBzdGFnZSAnJHtjaGVja3BvaW50LnBhdXNlZFN0YWdlSWR9JyBub3QgZm91bmQgaW4gZmxvd2NoYXJ0LiBgICtcbiAgICAgICAgICAnVGhlIGNoYXJ0IG1heSBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGNoZWNrcG9pbnQgd2FzIGNyZWF0ZWQuJyxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghcGF1c2VkTm9kZS5yZXN1bWVGbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogc3RhZ2UgJyR7cGF1c2VkTm9kZS5uYW1lfScgKCR7cGF1c2VkTm9kZS5pZH0pIGhhcyBubyByZXN1bWVGbi4gYCArXG4gICAgICAgICAgJ09ubHkgc3RhZ2VzIGNyZWF0ZWQgd2l0aCBhZGRQYXVzYWJsZUZ1bmN0aW9uKCkgY2FuIGJlIHJlc3VtZWQuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgYSBzeW50aGV0aWMgcmVzdW1lIG5vZGU6IGNhbGxzIHJlc3VtZUZuIHdpdGggcmVzdW1lSW5wdXQsIHRoZW4gY29udGludWVzLlxuICAgIC8vIHJlc3VtZUZuIHNpZ25hdHVyZSBpcyAoc2NvcGUsIGlucHV0KSBwZXIgUGF1c2FibGVIYW5kbGVyIOKAlCB3cmFwIHRvIG1hdGNoIFN0YWdlRnVuY3Rpb24oc2NvcGUsIGJyZWFrRm4pLlxuICAgIGNvbnN0IHJlc3VtZUZuID0gcGF1c2VkTm9kZS5yZXN1bWVGbjtcbiAgICBjb25zdCByZXN1bWVTdGFnZUZuID0gKHNjb3BlOiBUU2NvcGUpID0+IHtcbiAgICAgIHJldHVybiByZXN1bWVGbihzY29wZSwgcmVzdW1lSW5wdXQpO1xuICAgIH07XG5cbiAgICAvLyBEZXRlcm1pbmUgY29udGludWF0aW9uOiBmb3IgYnJhbmNoIGNoaWxkcmVuIChkZWNpZGVyL3NlbGVjdG9yKSxcbiAgICAvLyBwYXVzZWROb2RlLm5leHQgaXMgdW5kZWZpbmVkLiBUaGUgY2hlY2twb2ludCdzXG4gICAgLy8gY29udGludWF0aW9uU3RhZ2VJZCAoY29sbGVjdGVkIGR1cmluZyB0cmF2ZXJzYWwgYnViYmxlLXVwKVxuICAgIC8vIHBvaW50cyB0byB0aGUgaW52b2tlcidzIG5leHQgbm9kZS5cbiAgICAvL1xuICAgIC8vIEZvciBwYXVzZXMgaW5zaWRlIGEgc3ViZmxvdywgdGhlIGNvbnRpbnVhdGlvbiBsaXZlcyBJTlNJREUgdGhlXG4gICAgLy8gbGVhZiBzdWJmbG93IChlLmcuLCB0aGUgbG9vcCB0YXJnZXQgYmFjayB0byBgbWVzc2FnZXNgKS4gU2VhcmNoXG4gICAgLy8gdGhlIGxlYWYgc3ViZmxvdyBmaXJzdDsgZmFsbCBiYWNrIHRvIHRvcC1sZXZlbCBmb3Igcm9vdC1sZXZlbFxuICAgIC8vIHBhdXNlcy5cbiAgICBjb25zdCBzZlN0YXRlcyA9IGNoZWNrcG9pbnQuc3ViZmxvd1N0YXRlcztcbiAgICBjb25zdCBsZWFmU3ViZmxvd0lkID1cbiAgICAgIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgubGVuZ3RoID4gMCA/IGNoZWNrcG9pbnQuc3ViZmxvd1BhdGhbY2hlY2twb2ludC5zdWJmbG93UGF0aC5sZW5ndGggLSAxXSA6IHVuZGVmaW5lZDtcbiAgICBsZXQgY29udGludWF0aW9uTmV4dCA9IHBhdXNlZE5vZGUubmV4dDtcbiAgICBpZiAoIWNvbnRpbnVhdGlvbk5leHQgJiYgY2hlY2twb2ludC5jb250aW51YXRpb25TdGFnZUlkKSB7XG4gICAgICAvLyBTZWFyY2ggbGVhZiBzdWJmbG93IGZpcnN0IChsb29wIHRhcmdldHMgLyBicmFuY2ggam9pbnMgbGl2ZSB0aGVyZSksXG4gICAgICAvLyB0aGVuIGZhbGwgYmFjayB0byB0b3AgbGV2ZWwuXG4gICAgICBjb250aW51YXRpb25OZXh0ID0gbGVhZlN1YmZsb3dJZFxuICAgICAgICA/IHRoaXMuZmluZE5vZGVJbkdyYXBoKGNoZWNrcG9pbnQuY29udGludWF0aW9uU3RhZ2VJZCwgY2hlY2twb2ludC5zdWJmbG93UGF0aClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWNvbnRpbnVhdGlvbk5leHQpIHtcbiAgICAgICAgY29udGludWF0aW9uTmV4dCA9IHRoaXMuZmluZE5vZGVJbkdyYXBoKGNoZWNrcG9pbnQuY29udGludWF0aW9uU3RhZ2VJZCwgW10pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBcImlubmVyXCIgcmVzdW1lIGNoYWluOiByZXN1bWVGbiDihpIgY29udGludWF0aW9uLiBUaGlzIGlzIHdoYXRcbiAgICAvLyBydW5zIElOU0lERSB0aGUgbGVhZiBzdWJmbG93J3MgYm9keS4gRm9yIGEgcm9vdC1sZXZlbCBwYXVzZVxuICAgIC8vIChzdWJmbG93UGF0aCBlbXB0eSksIHRoaXMgaXMgYWxzbyB0aGUgdG9wLWxldmVsIHJlc3VtZSByb290LlxuICAgIGNvbnN0IGlubmVyUmVzdW1lQ2hhaW46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgICAgaWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogcGF1c2VkTm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIGZuOiByZXN1bWVTdGFnZUZuLFxuICAgICAgbmV4dDogY29udGludWF0aW9uTmV4dCxcbiAgICB9O1xuXG4gICAgLy8gRG9uJ3QgY2xlYXIgcmVjb3JkZXJzIOKAlCByZXN1bWUgY29udGludWVzIGZyb20gcHJldmlvdXMgc3RhdGUuXG4gICAgLy8gTmFycmF0aXZlLCBtZXRyaWNzLCBkZWJ1ZyBlbnRyaWVzIGFjY3VtdWxhdGUgYWNyb3NzIHBhdXNlL3Jlc3VtZS5cbiAgICAvL1xuICAgIC8vIFR3by1tb2RlIHJlc3VtZTpcbiAgICAvLyAgIOKAoiBTYW1lLWV4ZWN1dG9yIChydW4oKSBwcmV2aW91c2x5IGNhbGxlZCBvbiBUSElTIGluc3RhbmNlKTpcbiAgICAvLyAgICAgcmV1c2UgdGhlIGV4aXN0aW5nIHJ1bnRpbWUgc28gdGhlIGV4ZWN1dGlvbiB0cmVlIGNvbnRpbnVlc1xuICAgIC8vICAgICBmcm9tIHRoZSBwYXVzZSBwb2ludCBhbmQgcmVjb3JkZXJzL25hcnJhdGl2ZSBhY2N1bXVsYXRlLlxuICAgIC8vICAg4oCiIENyb3NzLWV4ZWN1dG9yIChmcmVzaCBleGVjdXRvciByZWNvbnN0cnVjdGVkIGZyb20gYSBzdG9yZWRcbiAgICAvLyAgICAgY2hlY2twb2ludCk6IHNlZWQgYSBORVcgcnVudGltZSBmcm9tIGBjaGVja3BvaW50LnNoYXJlZFN0YXRlYFxuICAgIC8vICAgICBzbyByZXN1bWUgaGFuZGxlcnMgY2FuIHJlYWQgcHJlLXBhdXNlIHNjb3BlLiBUaGUgZXhlY3V0aW9uXG4gICAgLy8gICAgIHRyZWUgc3RhcnRzIGF0IHRoZSByZXN1bWUgbm9kZSDigJQgd2UgZG9uJ3QgaGF2ZSB0aGUgcHJldmlvdXNcbiAgICAvLyAgICAgdHJhdmVyc2FsJ3MgdHJlZSBvbiBhIGZyZXNoIHByb2Nlc3MgYW55d2F5LlxuICAgIGNvbnN0IHNhbWVFeGVjdXRvciA9IHRoaXMuX2hhc1J1bkJlZm9yZTtcbiAgICBjb25zdCBleGlzdGluZ1J1bnRpbWUgPSBzYW1lRXhlY3V0b3JcbiAgICAgID8gKHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWUoKSBhcyBJbnN0YW5jZVR5cGU8dHlwZW9mIEV4ZWN1dGlvblJ1bnRpbWU+KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5faGFzUnVuQmVmb3JlID0gdHJ1ZTsgLy8gYW55IHBhdGggdGhhdCByZXN1bWVzIGNvdW50cyBhcyBhIHJ1blxuXG4gICAgLy8gUGljayB0aGUgcmVzdW1lIHJvb3QgKyBpbml0aWFsIGNvbnRleHQuXG4gICAgLy9cbiAgICAvLyAgIFJPT1QtTEVWRUwgUEFVU0UgKHN1YmZsb3dQYXRoIGVtcHR5KTpcbiAgICAvLyAgICAgcmVzdW1lIHJvb3QgPSBpbm5lclJlc3VtZUNoYWluIChydW4gcmVzdW1lRm4gYXQgdG9wIGxldmVsKS5cbiAgICAvLyAgICAgaW5pdGlhbENvbnRleHQgPSBjaGVja3BvaW50LnNoYXJlZFN0YXRlLlxuICAgIC8vXG4gICAgLy8gICBTVUJGTE9XLU5FU1RFRCBQQVVTRSAoc3ViZmxvd1BhdGggbm9uLWVtcHR5KTpcbiAgICAvLyAgICAgVGhlIHBhdXNlIHdhcyBJTlNJREUgYSBzdWJmbG93J3MgYm9keS4gVG8gcnVuIHRoZSBzdWJmbG93J3NcbiAgICAvLyAgICAgb3V0cHV0TWFwcGVyIGFuZCB0aGUgcGFyZW50J3MgY29udGludWF0aW9uLCB3ZSBoYXZlIHRvIGVudGVyXG4gICAgLy8gICAgIHRocm91Z2ggdGhlIE9VVEVSIE1PVU5UICh0aGUgcGFyZW50J3Mgbm9kZSB0aGF0IG1vdW50cyB0aGVcbiAgICAvLyAgICAgbGVhZiBzdWJmbG93KS4gV2Ugc3dhcCB0aGUgbGVhZiBzdWJmbG93J3Mgcm9vdCB3aXRoXG4gICAgLy8gICAgIGlubmVyUmVzdW1lQ2hhaW4gc28gU3ViZmxvd0V4ZWN1dG9yOlxuICAgIC8vICAgICAgIDEuIGVudGVycyB0aGUgc3ViZmxvdyBib3VuZGFyeSxcbiAgICAvLyAgICAgICAyLiBzZWVkcyB0aGUgbmVzdGVkIHJ1bnRpbWUgZnJvbSBzdWJmbG93U3RhdGVzW2xlYWZdXG4gICAgLy8gICAgICAgICAgKHNraXBwaW5nIHRoZSBpbnB1dE1hcHBlciDigJQgc2VlIFN1YmZsb3dFeGVjdXRvci50cyksXG4gICAgLy8gICAgICAgMy4gcnVucyB0aGUgcmVzdW1lRm4g4oaSIGNvbnRpbnVhdGlvbiBjaGFpbixcbiAgICAvLyAgICAgICA0LiBydW5zIHRoZSBvdXRwdXRNYXBwZXIgYXQgZXhpdCxcbiAgICAvLyAgICAgICA1LiBwYXJlbnQgdHJhdmVyc2FsIGNvbnRpbnVlcyBub3JtYWxseS5cbiAgICAvL1xuICAgIC8vICAgICBDcm9zcy1leGVjdXRvcjogaW5pdGlhbENvbnRleHQgPSBjaGVja3BvaW50LnNoYXJlZFN0YXRlICh0aGVcbiAgICAvLyAgICAgICBwYXJlbnQncyB2aWV3IGF0IHBhdXNlIHRpbWUg4oCUIG91dHB1dE1hcHBlciB3cml0ZXMgYmFjayBpbnRvIGl0KS5cbiAgICAvLyAgICAgU2FtZS1leGVjdXRvcjogZXhpc3RpbmdSdW50aW1lIGlzIHJldXNlZDsgaW5pdGlhbENvbnRleHQgaXMgbW9vdFxuICAgIC8vICAgICAgIGZvciB0aGUgc3ViZmxvdyBmcmFtZSAoYWxyZWFkeSBpbiB0aGUgcnVudGltZSBzdGFjayksIGJ1dCB3ZVxuICAgIC8vICAgICAgIHN0aWxsIHBhc3Mgc2hhcmVkU3RhdGUgZm9yIGNvbnNpc3RlbmN5LlxuICAgIGNvbnN0IGZjID0gdGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydDtcbiAgICBsZXQgcmVzdW1lUm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSBpbm5lclJlc3VtZUNoYWluO1xuICAgIGxldCBzdWJmbG93c092ZXJyaWRlOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChsZWFmU3ViZmxvd0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEZpbmQgdGhlIE9VVEVSIG1vdW50IG5vZGUgZm9yIHRoZSBGSVJTVCBlbnRyeSBvbiB0aGUgcGF0aC5cbiAgICAgIC8vIEZvciBzaW5nbGUtbGV2ZWwgcGF1c2VzLCB0aGlzIGlzIHRoZSBvbmx5IG1vdW50IHdlIG5lZWQgdG9cbiAgICAgIC8vIGVudGVyIHRocm91Z2guIEZvciBuZXN0ZWQgbW91bnRzIHRoZSBwYXR0ZXJuIHdvdWxkIGV4dGVuZCwgYnV0XG4gICAgICAvLyBzaW5nbGUtbGV2ZWwgY292ZXJzIGFsbCBjdXJyZW50IHVzZSBjYXNlcyAoU2VxdWVuY2UoQWdlbnQpLFxuICAgICAgLy8gQ29uZGl0aW9uYWwoQWdlbnQpLCBQYXJhbGxlbCBicmFuY2hlcyB3aXRoIHBhdXNlZCBhZ2VudHMpLlxuICAgICAgY29uc3Qgb3V0ZXJTdWJmbG93SWQgPSBjaGVja3BvaW50LnN1YmZsb3dQYXRoWzBdO1xuICAgICAgY29uc3Qgb3V0ZXJNb3VudCA9IHRoaXMuZmluZE1vdW50SW5HcmFwaChmYy5yb290LCBvdXRlclN1YmZsb3dJZCk7XG4gICAgICBpZiAob3V0ZXJNb3VudCkge1xuICAgICAgICByZXN1bWVSb290ID0gb3V0ZXJNb3VudDtcbiAgICAgIH1cbiAgICAgIC8vIFJlcGxhY2UgdGhlIGxlYWYgc3ViZmxvdydzIHJvb3Qgd2l0aCB0aGUgcmVzdW1lIGNoYWluIHNvIHRoZVxuICAgICAgLy8gYm9keSBydW5zIGZyb20gdGhlIHBhdXNlIHBvaW50IGZvcndhcmQuXG4gICAgICBzdWJmbG93c092ZXJyaWRlID0geyAuLi4oZmMuc3ViZmxvd3MgPz8ge30pIH07XG4gICAgICBzdWJmbG93c092ZXJyaWRlW2xlYWZTdWJmbG93SWRdID0geyByb290OiBpbm5lclJlc3VtZUNoYWluIH07XG4gICAgfVxuICAgIGNvbnN0IHJlc3VtZUluaXRpYWxDb250ZXh0ID0gY2hlY2twb2ludC5zaGFyZWRTdGF0ZTtcblxuICAgIHRoaXMudHJhdmVyc2VyID0gdGhpcy5jcmVhdGVUcmF2ZXJzZXIob3B0aW9ucz8uc2lnbmFsLCB1bmRlZmluZWQsIG9wdGlvbnM/LmVudiwgb3B0aW9ucz8ubWF4RGVwdGgsIHtcbiAgICAgIHJvb3Q6IHJlc3VtZVJvb3QsXG4gICAgICBpbml0aWFsQ29udGV4dDogcmVzdW1lSW5pdGlhbENvbnRleHQsXG4gICAgICBwcmVzZXJ2ZVJlY29yZGVyczogdHJ1ZSxcbiAgICAgIC4uLihleGlzdGluZ1J1bnRpbWUgPyB7IGV4aXN0aW5nUnVudGltZSB9IDoge30pLFxuICAgICAgLy8gSGFuZCB0aGUgcGVyLXN1YmZsb3cgc2NvcGUgY2FwdHVyZXMgZG93biB0byBTdWJmbG93RXhlY3V0b3IuXG4gICAgICAvLyBBbHdheXMgcHJlc2VudCBvbiBhIGNoZWNrcG9pbnQg4oCUIGVtcHR5IGB7fWAgZm9yIHJvb3QgcGF1c2VzLlxuICAgICAgc3ViZmxvd1N0YXRlc0ZvclJlc3VtZTogc2ZTdGF0ZXMsXG4gICAgICAuLi4oc3ViZmxvd3NPdmVycmlkZSAmJiB7IHN1YmZsb3dzT3ZlcnJpZGUgfSksXG4gICAgfSk7XG5cbiAgICAvLyBGaXJlIG9uUmVzdW1lIGV2ZW50IG9uIGFsbCByZWNvcmRlcnMgKGZsb3cgKyBzY29wZSlcbiAgICBjb25zdCBoYXNJbnB1dCA9IHJlc3VtZUlucHV0ICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgZmxvd1Jlc3VtZUV2ZW50ID0ge1xuICAgICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgaGFzSW5wdXQsXG4gICAgfTtcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB0aGlzLmNvbWJpbmVkUmVjb3JkZXIub25SZXN1bWUoZmxvd1Jlc3VtZUV2ZW50KTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5mbG93UmVjb3JkZXJzKSByLm9uUmVzdW1lPy4oZmxvd1Jlc3VtZUV2ZW50KTtcblxuICAgIGNvbnN0IHNjb3BlUmVzdW1lRXZlbnQgPSB7XG4gICAgICBzdGFnZU5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICAgIHN0YWdlSWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgICBydW50aW1lU3RhZ2VJZDogYnVpbGRSdW50aW1lU3RhZ2VJZChwYXVzZWROb2RlLmlkLCB0aGlzLl9leGVjdXRpb25Db3VudGVyLnZhbHVlKSxcbiAgICAgIGhhc0lucHV0LFxuICAgICAgcGlwZWxpbmVJZDogJycsXG4gICAgICB0aW1lc3RhbXA6IERhdGUubm93KCksXG4gICAgfTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5zY29wZVJlY29yZGVycykgci5vblJlc3VtZT8uKHNjb3BlUmVzdW1lRXZlbnQpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRyYXZlcnNlci5leGVjdXRlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMudHJhdmVyc2VyLmdldFNuYXBzaG90KCk7XG4gICAgICAgIGNvbnN0IHNmUmVzdWx0cyA9IHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gICAgICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB7XG4gICAgICAgICAgc2hhcmVkU3RhdGU6IHNuYXBzaG90LnNoYXJlZFN0YXRlLFxuICAgICAgICAgIGV4ZWN1dGlvblRyZWU6IHNuYXBzaG90LmV4ZWN1dGlvblRyZWUsXG4gICAgICAgICAgcGF1c2VkU3RhZ2VJZDogZXJyb3Iuc3RhZ2VJZCxcbiAgICAgICAgICBzdWJmbG93UGF0aDogZXJyb3Iuc3ViZmxvd1BhdGgsXG4gICAgICAgICAgcGF1c2VEYXRhOiBlcnJvci5wYXVzZURhdGEsXG4gICAgICAgICAgc3ViZmxvd1N0YXRlczogZXJyb3Iuc3ViZmxvd1N0YXRlcyxcbiAgICAgICAgICAuLi4oc2ZSZXN1bHRzLnNpemUgPiAwICYmIHsgc3ViZmxvd1Jlc3VsdHM6IE9iamVjdC5mcm9tRW50cmllcyhzZlJlc3VsdHMpIH0pLFxuICAgICAgICAgIC4uLihlcnJvci5pbnZva2VyU3RhZ2VJZCAmJiB7IGludm9rZXJTdGFnZUlkOiBlcnJvci5pbnZva2VyU3RhZ2VJZCB9KSxcbiAgICAgICAgICAuLi4oZXJyb3IuY29udGludWF0aW9uU3RhZ2VJZCAmJiB7IGNvbnRpbnVhdGlvblN0YWdlSWQ6IGVycm9yLmNvbnRpbnVhdGlvblN0YWdlSWQgfSksXG4gICAgICAgICAgcGF1c2VkQXQ6IERhdGUubm93KCksXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiB7IHBhdXNlZDogdHJ1ZSwgY2hlY2twb2ludDogdGhpcy5sYXN0Q2hlY2twb2ludCB9IHNhdGlzZmllcyBQYXVzZWRSZXN1bHQ7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIFN0YWdlTm9kZSBpbiB0aGUgY29tcGlsZWQgZ3JhcGggYnkgSUQuXG4gICAqIEhhbmRsZXMgc3ViZmxvdyBwYXRocyBieSBkcmlsbGluZyBpbnRvIHJlZ2lzdGVyZWQgc3ViZmxvd3MuXG4gICAqL1xuICBwcml2YXRlIGZpbmROb2RlSW5HcmFwaChzdGFnZUlkOiBzdHJpbmcsIHN1YmZsb3dQYXRoOiByZWFkb25seSBzdHJpbmdbXSk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBmYyA9IHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQ7XG5cbiAgICBpZiAoc3ViZmxvd1BhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyBUb3AtbGV2ZWw6IERGUyBmcm9tIHJvb3RcbiAgICAgIHJldHVybiB0aGlzLmRmc0ZpbmQoZmMucm9vdCwgc3RhZ2VJZCk7XG4gICAgfVxuXG4gICAgLy8gU3ViZmxvdzogZHJpbGwgaW50byB0aGUgc3ViZmxvdyBjaGFpbiwgdGhlbiBzZWFyY2ggZnJvbSB0aGUgbGFzdCBzdWJmbG93J3Mgcm9vdFxuICAgIGxldCBzdWJmbG93Um9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gICAgZm9yIChjb25zdCBzZklkIG9mIHN1YmZsb3dQYXRoKSB7XG4gICAgICBjb25zdCBzdWJmbG93ID0gZmMuc3ViZmxvd3M/LltzZklkXTtcbiAgICAgIGlmICghc3ViZmxvdykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIHN1YmZsb3dSb290ID0gc3ViZmxvdy5yb290O1xuICAgIH1cbiAgICBpZiAoIXN1YmZsb3dSb290KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmRmc0ZpbmQoc3ViZmxvd1Jvb3QsIHN0YWdlSWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIG1vdW50IG5vZGUgKHRoZSBub2RlIHRoYXQgbW91bnRzIGEgc3ViZmxvdyBib3VuZGFyeSlcbiAgICogZm9yIGEgZ2l2ZW4gc3ViZmxvd0lkLCBieSBERlMgZnJvbSBgc3RhcnRgLiBVc2VkIGJ5IGByZXN1bWUoKWAgdG9cbiAgICogbG9jYXRlIHRoZSBPVVRFUiBub2RlIHdlIGhhdmUgdG8gZW50ZXIgdGhyb3VnaCBzbyB0aGUgc3ViZmxvdydzXG4gICAqIG91dHB1dE1hcHBlciBhbmQgcGFyZW50IGNvbnRpbnVhdGlvbiBleGVjdXRlLlxuICAgKlxuICAgKiBDeWNsZS1zYWZlIHZpYSB2aXNpdGVkIHNldC4gUmV0dXJucyB0aGUgZmlyc3QgbWF0Y2ggKERGUyBvcmRlcikuXG4gICAqL1xuICBwcml2YXRlIGZpbmRNb3VudEluR3JhcGgoXG4gICAgc3RhcnQ6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHN1YmZsb3dJZDogc3RyaW5nLFxuICAgIHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKSxcbiAgKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGlmIChzdGFydC5pc0xvb3BSZWYpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHN0YXJ0LmlkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB2aXNpdGVkLmFkZChzdGFydC5pZCk7XG4gICAgaWYgKHN0YXJ0LnN1YmZsb3dJZCA9PT0gc3ViZmxvd0lkKSByZXR1cm4gc3RhcnQ7XG4gICAgaWYgKHN0YXJ0LmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHN0YXJ0LmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5maW5kTW91bnRJbkdyYXBoKGNoaWxkLCBzdWJmbG93SWQsIHZpc2l0ZWQpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHN0YXJ0Lm5leHQpIHJldHVybiB0aGlzLmZpbmRNb3VudEluR3JhcGgoc3RhcnQubmV4dCwgc3ViZmxvd0lkLCB2aXNpdGVkKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIERGUyBzZWFyY2ggZm9yIGEgbm9kZSBieSBJRCBpbiB0aGUgU3RhZ2VOb2RlIGdyYXBoLiBDeWNsZS1zYWZlIHZpYSB2aXNpdGVkIHNldC4gKi9cbiAgcHJpdmF0ZSBkZnNGaW5kKFxuICAgIG5vZGU6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+LFxuICAgIHRhcmdldElkOiBzdHJpbmcsXG4gICAgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpLFxuICApOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgLy8gU2tpcCBsb29wIGJhY2stZWRnZSByZWZlcmVuY2VzICh0aGV5IHNoYXJlIHRoZSB0YXJnZXQncyBJRCBidXQgaGF2ZSBubyBmbi9yZXN1bWVGbilcbiAgICBpZiAobm9kZS5pc0xvb3BSZWYpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgaWYgKHZpc2l0ZWQuaGFzKG5vZGUuaWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHZpc2l0ZWQuYWRkKG5vZGUuaWQpO1xuICAgIGlmIChub2RlLmlkID09PSB0YXJnZXRJZCkgcmV0dXJuIG5vZGU7XG4gICAgaWYgKG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygbm9kZS5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZGZzRmluZChjaGlsZCwgdGFyZ2V0SWQsIHZpc2l0ZWQpO1xuICAgICAgICBpZiAoZm91bmQpIHJldHVybiBmb3VuZDtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKG5vZGUubmV4dCkgcmV0dXJuIHRoaXMuZGZzRmluZChub2RlLm5leHQsIHRhcmdldElkLCB2aXNpdGVkKTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFJlY29yZGVyIE1hbmFnZW1lbnQg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIHNjb3BlIFJlY29yZGVyIHRvIG9ic2VydmUgZGF0YSBvcGVyYXRpb25zIChyZWFkcywgd3JpdGVzLCBjb21taXRzKS5cbiAgICogQXV0b21hdGljYWxseSBhdHRhY2hlZCB0byBldmVyeSBTY29wZUZhY2FkZSBjcmVhdGVkIGR1cmluZyB0cmF2ZXJzYWwuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS5cbiAgICpcbiAgICogKipJZGVtcG90ZW50IGJ5IElEOioqIElmIGEgcmVjb3JkZXIgd2l0aCB0aGUgc2FtZSBgaWRgIGlzIGFscmVhZHkgYXR0YWNoZWQsXG4gICAqIGl0IGlzIHJlcGxhY2VkIChub3QgZHVwbGljYXRlZCkuIFRoaXMgcHJldmVudHMgZG91YmxlLWNvdW50aW5nIHdoZW4gYm90aFxuICAgKiBhIGZyYW1ld29yayBhbmQgdGhlIHVzZXIgYXR0YWNoIHRoZSBzYW1lIHJlY29yZGVyIHR5cGUuXG4gICAqXG4gICAqIEJ1aWx0LWluIHJlY29yZGVycyB1c2UgYXV0by1pbmNyZW1lbnQgSURzIChgbWV0cmljcy0xYCwgYGRlYnVnLTFgLCAuLi4pIGJ5XG4gICAqIGRlZmF1bHQsIHNvIG11bHRpcGxlIGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25maWdzIGNvZXhpc3QuIFRvIG92ZXJyaWRlXG4gICAqIGEgZnJhbWV3b3JrLWF0dGFjaGVkIHJlY29yZGVyLCBwYXNzIHRoZSBzYW1lIHdlbGwta25vd24gSUQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gTXVsdGlwbGUgcmVjb3JkZXJzIHdpdGggZGlmZmVyZW50IGNvbmZpZ3Mg4oCUIGVhY2ggZ2V0cyBhIHVuaXF1ZSBJRFxuICAgKiBleGVjdXRvci5hdHRhY2hSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoKSk7XG4gICAqIGV4ZWN1dG9yLmF0dGFjaFJlY29yZGVyKG5ldyBEZWJ1Z1JlY29yZGVyKHsgdmVyYm9zaXR5OiAnbWluaW1hbCcgfSkpO1xuICAgKlxuICAgKiAvLyBPdmVycmlkZSBhIGZyYW1ld29yay1hdHRhY2hlZCByZWNvcmRlciBieSBwYXNzaW5nIGl0cyB3ZWxsLWtub3duIElEXG4gICAqIGV4ZWN1dG9yLmF0dGFjaFJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcignbWV0cmljcycpKTtcbiAgICpcbiAgICogLy8gQXR0YWNoaW5nIHR3aWNlIHdpdGggc2FtZSBJRCByZXBsYWNlcyAobm8gZG91YmxlLWNvdW50aW5nKVxuICAgKiBleGVjdXRvci5hdHRhY2hSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ215LW1ldHJpY3MnKSk7XG4gICAqIGV4ZWN1dG9yLmF0dGFjaFJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcignbXktbWV0cmljcycpKTsgLy8gcmVwbGFjZXMgcHJldmlvdXNcbiAgICogYGBgXG4gICAqL1xuICBhdHRhY2hSZWNvcmRlcihyZWNvcmRlcjogUmVjb3JkZXIpOiB2b2lkIHtcbiAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBJRCAoaWRlbXBvdGVudCDigJQgcHJldmVudHMgZG91YmxlLWNvdW50aW5nKVxuICAgIHRoaXMuc2NvcGVSZWNvcmRlcnMgPSB0aGlzLnNjb3BlUmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gcmVjb3JkZXIuaWQpO1xuICAgIHRoaXMuc2NvcGVSZWNvcmRlcnMucHVzaChyZWNvcmRlcik7XG4gIH1cblxuICAvKiogRGV0YWNoIGFsbCBzY29wZSBSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQuICovXG4gIGRldGFjaFJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNjb3BlUmVjb3JkZXJzID0gdGhpcy5zY29wZVJlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IGlkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgc2NvcGUgUmVjb3JkZXJzLiAqL1xuICBnZXRSZWNvcmRlcnMoKTogUmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnNjb3BlUmVjb3JkZXJzXTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBGbG93UmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgRmxvd1JlY29yZGVyIHRvIG9ic2VydmUgY29udHJvbCBmbG93IGV2ZW50cy5cbiAgICogQXV0b21hdGljYWxseSBlbmFibGVzIG5hcnJhdGl2ZSBpZiBub3QgYWxyZWFkeSBlbmFibGVkLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkg4oCUIHJlY29yZGVycyBhcmUgcGFzc2VkIHRvIHRoZSB0cmF2ZXJzZXIgYXQgY3JlYXRpb24gdGltZS5cbiAgICpcbiAgICogKipJZGVtcG90ZW50IGJ5IElEOioqIHJlcGxhY2VzIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBgaWRgLlxuICAgKi9cbiAgYXR0YWNoRmxvd1JlY29yZGVyKHJlY29yZGVyOiBGbG93UmVjb3JkZXIpOiB2b2lkIHtcbiAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBJRCAoaWRlbXBvdGVudCDigJQgcHJldmVudHMgZG91YmxlLWNvdW50aW5nKVxuICAgIHRoaXMuZmxvd1JlY29yZGVycyA9IHRoaXMuZmxvd1JlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IHJlY29yZGVyLmlkKTtcbiAgICB0aGlzLmZsb3dSZWNvcmRlcnMucHVzaChyZWNvcmRlcik7XG4gICAgdGhpcy5uYXJyYXRpdmVFbmFibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIEZsb3dSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQuICovXG4gIGRldGFjaEZsb3dSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5mbG93UmVjb3JkZXJzID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gaWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCBGbG93UmVjb3JkZXJzLiAqL1xuICBnZXRGbG93UmVjb3JkZXJzKCk6IEZsb3dSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuZmxvd1JlY29yZGVyc107XG4gIH1cblxuICAvLyDilIDilIDilIAgQ29tYmluZWQgUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgcmVjb3JkZXIgdGhhdCBtYXkgb2JzZXJ2ZSBtdWx0aXBsZSBldmVudCBzdHJlYW1zIChzY29wZVxuICAgKiBkYXRhLWZsb3csIGNvbnRyb2wtZmxvdywgb3IgYm90aCkuIERldGVjdHMgYXQgcnVudGltZSB3aGljaCBzdHJlYW1zIHRoZVxuICAgKiByZWNvcmRlciBoYXMgbWV0aG9kcyBmb3IgYW5kIHJvdXRlcyBpdCB0byB0aGUgY29ycmVjdCBpbnRlcm5hbCBjaGFubmVscy5cbiAgICpcbiAgICogUHJlZmVycmVkIG92ZXIgY2FsbGluZyBgYXR0YWNoUmVjb3JkZXJgIGFuZCBgYXR0YWNoRmxvd1JlY29yZGVyYFxuICAgKiBzZXBhcmF0ZWx5LCBiZWNhdXNlIGZvcmdldHRpbmcgb25lIG9mIHRoZSB0d28gaXMgYSBzaWxlbnQgZm9vdC1ndW4g4oCUXG4gICAqIGhhbGYgeW91ciBldmVudHMgbmV2ZXIgZmlyZSBhbmQgdGhlcmUgaXMgbm8gcnVudGltZSB3YXJuaW5nLiBXaXRoXG4gICAqIGBhdHRhY2hDb21iaW5lZFJlY29yZGVyYCB0aGUgbGlicmFyeSBndWFyYW50ZWVzIHRoZSByZWNvcmRlcidzIGRlY2xhcmVkXG4gICAqIG1ldGhvZHMgYWxsIGZpcmUsIGFuZCBhZGRzIG5vIG92ZXJoZWFkIHZlcnN1cyB0d28gZXhwbGljaXQgY2FsbHMuXG4gICAqXG4gICAqICMjIElkZW1wb3RlbmN5XG4gICAqXG4gICAqIElkZW1wb3RlbnQgYnkgYGlkYCBhY3Jvc3MgQUxMIGNoYW5uZWxzIOKAlCByZS1hdHRhY2hpbmcgd2l0aCB0aGUgc2FtZSBgaWRgXG4gICAqIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBpbnN0YW5jZSBldmVyeXdoZXJlIGl0IHdhcyByZWdpc3RlcmVkLiBNaXhpbmdcbiAgICogYGF0dGFjaENvbWJpbmVkUmVjb3JkZXIoeClgIHdpdGggYSBwcmlvciBgYXR0YWNoUmVjb3JkZXIoeSlgIG9yXG4gICAqIGBhdHRhY2hGbG93UmVjb3JkZXIoeSlgIHRoYXQgc2hhcmUgYHguaWQgPT09IHkuaWRgIGlzIGFsc28gc2FmZTogdGhlXG4gICAqIGNvbWJpbmVkIGF0dGFjaCByZXBsYWNlcyB0aGUgc2luZ2xlLWNoYW5uZWwgcmVnaXN0cmF0aW9uIG9uIHdoaWNoZXZlclxuICAgKiBjaGFubmVsKHMpIGB4YCBoYXMgbWV0aG9kcyBmb3IuIE5vIGR1cGxpY2F0ZSBmaXJpbmdzIG9jY3VyLlxuICAgKlxuICAgKiAjIyBOYXJyYXRpdmUgYWN0aXZhdGlvblxuICAgKlxuICAgKiBJZiB0aGUgcmVjb3JkZXIgaGFzIGFueSBjb250cm9sLWZsb3cgbWV0aG9kcywgYGVuYWJsZU5hcnJhdGl2ZSgpYCBpc1xuICAgKiBjYWxsZWQgYXMgYSBzaWRlIGVmZmVjdCAodGhlIG5hcnJhdGl2ZSBzdWJzeXN0ZW0gaXMgcmVxdWlyZWQgdG8gZW1pdFxuICAgKiBjb250cm9sLWZsb3cgZXZlbnRzKS4gRGF0YS1mbG93LW9ubHkgcmVjb3JkZXJzIGRvIE5PVCBhY3RpdmF0ZSB0aGVcbiAgICogbmFycmF0aXZlLlxuICAgKlxuICAgKiAjIyBEZXRlY3Rpb24gcnVsZVxuICAgKlxuICAgKiBPbmx5ICoqb3duKiogZXZlbnQgbWV0aG9kcyBjb3VudCAoc2VlIGBoYXNSZWNvcmRlck1ldGhvZHNgKS4gTWV0aG9kc1xuICAgKiBpbmhlcml0ZWQgdmlhIHRoZSBwcm90b3R5cGUgY2hhaW4gYXJlIGlnbm9yZWQg4oCUIHRoaXMgcHJvdGVjdHMgYWdhaW5zdFxuICAgKiBhY2NpZGVudGFsIGBPYmplY3QucHJvdG90eXBlYCBwb2xsdXRpb24gYXR0YWNoaW5nIGhhbmRsZXJzIHlvdSBuZXZlclxuICAgKiBkZWNsYXJlZC4gQSByZWNvcmRlciB0aGF0IHByb3ZpZGVzIG9ubHkgYGNsZWFyYC9gdG9TbmFwc2hvdGAgaXMgYVxuICAgKiBuby1vcCBhbmQgZW1pdHMgYSBkZXYtbW9kZSB3YXJuaW5nIHRvIHN1cmZhY2UgdGhlIGxpa2VseSBtaXN0YWtlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGF1ZGl0OiBDb21iaW5lZFJlY29yZGVyID0ge1xuICAgKiAgIGlkOiAnYXVkaXQnLFxuICAgKiAgIG9uV3JpdGU6IChlKSA9PiBsb2coJ3Njb3BlIHdyaXRlJywgZS5rZXkpLFxuICAgKiAgIG9uRGVjaXNpb246IChlKSA9PiBsb2coJ3JvdXRlZCB0bycsIGUuY2hvc2VuKSxcbiAgICogfTtcbiAgICogZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihhdWRpdCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyZWNvcmRlcjogQ29tYmluZWRSZWNvcmRlcik6IHZvaWQge1xuICAgIGNvbnN0IGhhc0RhdGEgPSBoYXNSZWNvcmRlck1ldGhvZHMocmVjb3JkZXIpO1xuICAgIGNvbnN0IGhhc0Zsb3cgPSBoYXNGbG93UmVjb3JkZXJNZXRob2RzKHJlY29yZGVyKTtcbiAgICBjb25zdCBoYXNFbWl0ID0gaGFzRW1pdFJlY29yZGVyTWV0aG9kcyhyZWNvcmRlcik7XG5cbiAgICAvLyBFbWl0IHJlY29yZGVycyBsaXZlIG9uIHRoZSBTQU1FIGNoYW5uZWwgYXMgZGF0YS1mbG93IHJlY29yZGVyc1xuICAgIC8vIChTY29wZUZhY2FkZSBpdGVyYXRlcyBgX3JlY29yZGVyc2AgZm9yIG9uRW1pdCBkaXNwYXRjaCkuIFNvXG4gICAgLy8gYXR0YWNoRW1pdFJlY29yZGVyIGludGVybmFsbHkgY2FsbHMgYXR0YWNoUmVjb3JkZXIg4oCUIGJ1dCB3ZSB3YW50IHRvXG4gICAgLy8gYXZvaWQgZG91YmxlLWF0dGFjaCB3aGVuIHRoZSByZWNvcmRlciBpbXBsZW1lbnRzIEJPVEggb25FbWl0IEFORFxuICAgIC8vIG90aGVyIFJlY29yZGVyIG1ldGhvZHMuIFNob3J0LWNpcmN1aXQ6IGlmIGhhc0RhdGEgT1IgaGFzRW1pdCwgdGhlXG4gICAgLy8gcmVjb3JkZXIgbGFuZHMgb24gdGhlIHNjb3BlLXJlY29yZGVyIGxpc3QgZXhhY3RseSBvbmNlLlxuICAgIGlmIChoYXNEYXRhIHx8IGhhc0VtaXQpIHRoaXMuYXR0YWNoUmVjb3JkZXIocmVjb3JkZXIgYXMgUmVjb3JkZXIpO1xuICAgIGlmIChoYXNGbG93KSB0aGlzLmF0dGFjaEZsb3dSZWNvcmRlcihyZWNvcmRlciBhcyBGbG93UmVjb3JkZXIpO1xuXG4gICAgaWYgKCFoYXNEYXRhICYmICFoYXNGbG93ICYmICFoYXNFbWl0ICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICAvLyBEZXYtbW9kZSBvbmx5OiBzaWxlbnQgc2tpcHMgYXJlIGludmlzaWJsZSBhbmQgcHJvZHVjZSBoYXJkLXRvLWRlYnVnXG4gICAgICAvLyBcIndoeSBkaWRuJ3QgbXkgcmVjb3JkZXIgZmlyZVwiIHJlcG9ydHMuIFBlciBsaWJyYXJ5IGNvbnZlbnRpb24sIGdhdGVkXG4gICAgICAvLyBvbiB0aGUgY2VudHJhbCBpc0Rldk1vZGUoKSBmbGFnIChub3QgcHJvY2Vzcy5lbnYpIHNvIGNvbnN1bWVycyBjYW5cbiAgICAgIC8vIGNvbnRyb2wgZGV2IHRvb2xpbmcgY2VudHJhbGx5IHZpYSBlbmFibGVEZXZNb2RlKCkvZGlzYWJsZURldk1vZGUoKS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZm9vdHByaW50anNdIGF0dGFjaENvbWJpbmVkUmVjb3JkZXI6IHJlY29yZGVyICcke3JlY29yZGVyLmlkfScgaGFzIGAgK1xuICAgICAgICAgICdubyBvYnNlcnZlciBldmVudCBtZXRob2RzIOKAlCBub3RoaW5nIHRvIGF0dGFjaC4gRGlkIHlvdSBmb3JnZXQgdG8gJyArXG4gICAgICAgICAgJ2FkZCBhbiBvbiogaGFuZGxlciAob25Xcml0ZSwgb25EZWNpc2lvbiwgb25TdWJmbG93RW50cnksIC4uLik/ICcgK1xuICAgICAgICAgICdOb3RlOiBvbmx5IE9XTiBwcm9wZXJ0aWVzIGNvdW50OyBtZXRob2RzIG9uIHRoZSBwcm90b3R5cGUgY2hhaW4gJyArXG4gICAgICAgICAgJ2FyZSBpZ25vcmVkIG9uIHB1cnBvc2UuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGFjaCBhIGNvbWJpbmVkIHJlY29yZGVyIGZyb20gYWxsIGNoYW5uZWxzIGl0IHdhcyBhdHRhY2hlZCB0by5cbiAgICogU2FmZSB0byBjYWxsIGlmIHRoZSByZWNvcmRlciB3YXMgb25seSBvbiBvbmUgY2hhbm5lbCBvciBuZXZlciBhdHRhY2hlZC5cbiAgICovXG4gIGRldGFjaENvbWJpbmVkUmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWNoUmVjb3JkZXIoaWQpO1xuICAgIHRoaXMuZGV0YWNoRmxvd1JlY29yZGVyKGlkKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBFbWl0IFJlY29yZGVyIE1hbmFnZW1lbnQgKFBoYXNlIDMpIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYW4gYEVtaXRSZWNvcmRlcmAg4oCUIGFuIG9ic2VydmVyIGZvciBjb25zdW1lci1lbWl0dGVkIHN0cnVjdHVyZWRcbiAgICogZXZlbnRzIGZpcmVkIHZpYSBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgLlxuICAgKlxuICAgKiBJbnRlcm5hbGx5LCBlbWl0IHJlY29yZGVycyBzaGFyZSB0aGUgc2NvcGUtcmVjb3JkZXIgY2hhbm5lbCBiZWNhdXNlXG4gICAqIGVtaXQgZXZlbnRzIGZpcmUgZnJvbSBpbnNpZGUgYFNjb3BlRmFjYWRlYCBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uLFxuICAgKiBzYW1lIHRpbWluZyBhcyBgb25SZWFkYC9gb25Xcml0ZWAuIFRoaXMgbWV0aG9kIGlzIGEgY29udmVuaWVuY2UgdGhhdFxuICAgKiBkZWxlZ2F0ZXMgdG8gYGF0dGFjaFJlY29yZGVyYCDigJQgY29uc3VtZXJzIGNhbiBhbHNvIHVzZVxuICAgKiBgYXR0YWNoUmVjb3JkZXJgIGRpcmVjdGx5IGZvciBhIHJlY29yZGVyIHRoYXQgaW1wbGVtZW50cyBCT1RIXG4gICAqIGBvbldyaXRlYCBhbmQgYG9uRW1pdGAuIEVpdGhlciBhcHByb2FjaCBwbGFjZXMgdGhlIHJlY29yZGVyIG9uIHRoZVxuICAgKiBzYW1lIHVuZGVybHlpbmcgbGlzdCwgc28gYG9uRW1pdGAgZmlyZXMgZXhhY3RseSBvbmNlIHBlciBldmVudC5cbiAgICpcbiAgICogKipJZGVtcG90ZW50IGJ5IGBpZGA6KiogcmVwbGFjZXMgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIGBpZGAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogZXhlY3V0b3IuYXR0YWNoRW1pdFJlY29yZGVyKHtcbiAgICogICBpZDogJ3Rva2VuLW1ldGVyJyxcbiAgICogICBvbkVtaXQ6IChlKSA9PiB7XG4gICAqICAgICBpZiAoZS5uYW1lID09PSAnYWdlbnRmb290cHJpbnQubGxtLnRva2VucycpIHRyYWNrVG9rZW5zKGUucGF5bG9hZCk7XG4gICAqICAgfSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoRW1pdFJlY29yZGVyKHJlY29yZGVyOiBFbWl0UmVjb3JkZXIpOiB2b2lkIHtcbiAgICB0aGlzLmF0dGFjaFJlY29yZGVyKHJlY29yZGVyIGFzIFJlY29yZGVyKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYW4gYEVtaXRSZWNvcmRlcmAgYnkgaWQuIFNhZmUgdG8gY2FsbCBpZiBuZXZlciBhdHRhY2hlZC4gKi9cbiAgZGV0YWNoRW1pdFJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaFJlY29yZGVyKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgcmVjb3JkZXJzIGZpbHRlcmVkIHRvIHRob3NlIHRoYXRcbiAgICogaW1wbGVtZW50IGBvbkVtaXRgLiBVc2VmdWwgZm9yIGluc3BlY3Rpb24gZHVyaW5nIHRlc3RpbmcuXG4gICAqL1xuICBnZXRFbWl0UmVjb3JkZXJzKCk6IEVtaXRSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5zY29wZVJlY29yZGVycy5maWx0ZXIoXG4gICAgICAocik6IHIgaXMgRW1pdFJlY29yZGVyID0+IHR5cGVvZiAociBhcyB7IG9uRW1pdD86IHVua25vd24gfSkub25FbWl0ID09PSAnZnVuY3Rpb24nLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzdHJ1Y3R1cmVkIG5hcnJhdGl2ZSBlbnRyaWVzIOKAlCB0aGUgc2luZ2xlIHB1YmxpYyBuYXJyYXRpdmUgQVBJLlxuICAgKiBFYWNoIGVudHJ5IGhhcyBhIHR5cGUgKHN0YWdlLCBzdGVwLCBjb25kaXRpb24sIGZvcmssIGV0Yy4pLCB0ZXh0LCBhbmRcbiAgICogZGVwdGguIENvbnN1bWVycyByZW5kZXIgaG93ZXZlciB0aGV5IHdhbnQ7IGNhbGwgYC5tYXAoZSA9PiBlLnRleHQpYFxuICAgKiBpZiBhIGZsYXQgYHN0cmluZ1tdYCBpcyBuZWVkZWQgbG9jYWxseS5cbiAgICovXG4gIGdldE5hcnJhdGl2ZUVudHJpZXMoKTogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdIHtcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21iaW5lZFJlY29yZGVyLmdldEVudHJpZXMoKTtcbiAgICB9XG4gICAgY29uc3QgZmxvd1NlbnRlbmNlcyA9IHRoaXMudHJhdmVyc2VyLmdldE5hcnJhdGl2ZSgpO1xuICAgIHJldHVybiBmbG93U2VudGVuY2VzLm1hcCgodGV4dCkgPT4gKHsgdHlwZTogJ3N0YWdlJyBhcyBjb25zdCwgdGV4dCwgZGVwdGg6IDAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbWJpbmVkIEZsb3dSZWNvcmRlcnMgbGlzdC4gV2hlbiBuYXJyYXRpdmUgaXMgZW5hYmxlZCxcbiAgICogaW5jbHVkZXMgdGhlIENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgKHdoaWNoIGJ1aWxkcyBtZXJnZWQgZmxvdytkYXRhXG4gICAqIGVudHJpZXMgaW5saW5lKS4gUGx1cyBhbnkgdXNlci1hdHRhY2hlZCByZWNvcmRlcnMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRmxvd1JlY29yZGVyc0xpc3QoKTogRmxvd1JlY29yZGVyW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVyczogRmxvd1JlY29yZGVyW10gPSBbXTtcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICByZWNvcmRlcnMucHVzaCh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpO1xuICAgIH1cbiAgICByZWNvcmRlcnMucHVzaCguLi50aGlzLmZsb3dSZWNvcmRlcnMpO1xuICAgIHJldHVybiByZWNvcmRlcnMubGVuZ3RoID4gMCA/IHJlY29yZGVycyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGFzeW5jIHJ1bihvcHRpb25zPzogUnVuT3B0aW9ucyk6IFByb21pc2U8RXhlY3V0b3JSZXN1bHQ+IHtcbiAgICBsZXQgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGxldCB0aW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGludGVybmFsIEFib3J0Q29udHJvbGxlciBmb3IgdGltZW91dE1zXG4gICAgaWYgKG9wdGlvbnM/LnRpbWVvdXRNcyAmJiAhc2lnbmFsKSB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgc2lnbmFsID0gY29udHJvbGxlci5zaWduYWw7XG4gICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiBjb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcihgRXhlY3V0aW9uIHRpbWVkIG91dCBhZnRlciAke29wdGlvbnMudGltZW91dE1zfW1zYCkpLFxuICAgICAgICBvcHRpb25zLnRpbWVvdXRNcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW5wdXQgYWdhaW5zdCBpbnB1dFNjaGVtYSBpZiBib3RoIGFyZSBwcmVzZW50XG4gICAgbGV0IHZhbGlkYXRlZElucHV0ID0gb3B0aW9ucz8uaW5wdXQ7XG4gICAgaWYgKHZhbGlkYXRlZElucHV0ICYmIHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQuaW5wdXRTY2hlbWEpIHtcbiAgICAgIHZhbGlkYXRlZElucHV0ID0gdmFsaWRhdGVJbnB1dCh0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmlucHV0U2NoZW1hLCB2YWxpZGF0ZWRJbnB1dCk7XG4gICAgfVxuXG4gICAgLy8gVXNlci1hdHRhY2hlZCByZWNvcmRlcnMgKGZsb3dSZWNvcmRlcnMgKyBzY29wZVJlY29yZGVycykgYXJlIGNsZWFyZWQgdmlhIGNsZWFyKCkgdG8gcHJldmVudFxuICAgIC8vIGNyb3NzLXJ1biBhY2N1bXVsYXRpb24uIFRoZSBjb21iaW5lZFJlY29yZGVyIGlzIE5PVCBjbGVhcmVkIGhlcmUg4oCUIGNyZWF0ZVRyYXZlcnNlcigpIGFsd2F5c1xuICAgIC8vIGNyZWF0ZXMgYSBmcmVzaCBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIGluc3RhbmNlIG9uIGVhY2ggcnVuLCBzbyBzdGFsZSBzdGF0ZSBpcyBuZXZlciBhbiBpc3N1ZS5cbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5mbG93UmVjb3JkZXJzKSB7XG4gICAgICByLmNsZWFyPy4oKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGVSZWNvcmRlcnMpIHtcbiAgICAgIHIuY2xlYXI/LigpO1xuICAgIH1cblxuICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZXhlY3V0aW9uQ291bnRlciA9IHsgdmFsdWU6IDAgfTsgLy8gUmVzZXQgY291bnRlciBvbiBmcmVzaCBydW5cbiAgICB0aGlzLl9oYXNSdW5CZWZvcmUgPSB0cnVlOyAvLyBtYXJrIHNvIGEgbGF0ZXIgcmVzdW1lKCkgdGFrZXMgdGhlXG4gICAgLy8gc2FtZS1leGVjdXRvciBicmFuY2ggKHJldXNlIHJ1bnRpbWUsIGFjY3VtdWxhdGUgZXhlY3V0aW9uIHRyZWUpLlxuICAgIHRoaXMudHJhdmVyc2VyID0gdGhpcy5jcmVhdGVUcmF2ZXJzZXIoc2lnbmFsLCB2YWxpZGF0ZWRJbnB1dCwgb3B0aW9ucz8uZW52LCBvcHRpb25zPy5tYXhEZXB0aCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRyYXZlcnNlci5leGVjdXRlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICAvLyBCdWlsZCBjaGVja3BvaW50IGZyb20gY3VycmVudCBleGVjdXRpb24gc3RhdGVcbiAgICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnRyYXZlcnNlci5nZXRTbmFwc2hvdCgpO1xuICAgICAgICBjb25zdCBzZlJlc3VsdHMgPSB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICAgICAgICAvLyBTdWJmbG93IHNjb3BlIGNhcHR1cmUgc3Vydml2ZXMgT05MWSBvbiB0aGUgc2lnbmFsIOKAlCB0aGVcbiAgICAgICAgLy8gbmVzdGVkIHJ1bnRpbWVzIGFyZSBHQydkIGFzIHRoZSBzdGFjayB1bndpbmRzLiBQcm9tb3RlIHRvXG4gICAgICAgIC8vIHRoZSBjaGVja3BvaW50IGhlcmUgc28gY3Jvc3MtZXhlY3V0b3IgcmVzdW1lIGNhbiByZXN0b3JlXG4gICAgICAgIC8vIHByZS1wYXVzZSBzdWJmbG93IHNjb3BlIChlLmcuIGFuIEFnZW50J3MgYHNjb3BlLmhpc3RvcnlgKS5cbiAgICAgICAgLy8gRW1wdHkgYHt9YCBmb3Igcm9vdC1sZXZlbCBwYXVzZXMgKG5vIHN1YmZsb3dzIGVudGVyZWQpLlxuICAgICAgICB0aGlzLmxhc3RDaGVja3BvaW50ID0ge1xuICAgICAgICAgIHNoYXJlZFN0YXRlOiBzbmFwc2hvdC5zaGFyZWRTdGF0ZSxcbiAgICAgICAgICBleGVjdXRpb25UcmVlOiBzbmFwc2hvdC5leGVjdXRpb25UcmVlLFxuICAgICAgICAgIHBhdXNlZFN0YWdlSWQ6IGVycm9yLnN0YWdlSWQsXG4gICAgICAgICAgc3ViZmxvd1BhdGg6IGVycm9yLnN1YmZsb3dQYXRoLFxuICAgICAgICAgIHBhdXNlRGF0YTogZXJyb3IucGF1c2VEYXRhLFxuICAgICAgICAgIHN1YmZsb3dTdGF0ZXM6IGVycm9yLnN1YmZsb3dTdGF0ZXMsXG4gICAgICAgICAgLi4uKHNmUmVzdWx0cy5zaXplID4gMCAmJiB7IHN1YmZsb3dSZXN1bHRzOiBPYmplY3QuZnJvbUVudHJpZXMoc2ZSZXN1bHRzKSB9KSxcbiAgICAgICAgICAvLyBJbnZva2VyIGNvbnRleHQg4oCUIGNvbGxlY3RlZCBkdXJpbmcgdHJhdmVyc2FsIGJ1YmJsZS11cCAobm90IHRyZWUtd2Fsa2VkKVxuICAgICAgICAgIC4uLihlcnJvci5pbnZva2VyU3RhZ2VJZCAmJiB7IGludm9rZXJTdGFnZUlkOiBlcnJvci5pbnZva2VyU3RhZ2VJZCB9KSxcbiAgICAgICAgICAuLi4oZXJyb3IuY29udGludWF0aW9uU3RhZ2VJZCAmJiB7IGNvbnRpbnVhdGlvblN0YWdlSWQ6IGVycm9yLmNvbnRpbnVhdGlvblN0YWdlSWQgfSksXG4gICAgICAgICAgcGF1c2VkQXQ6IERhdGUubm93KCksXG4gICAgICAgIH07XG4gICAgICAgIC8vIFJldHVybiBhIFBhdXNlUmVzdWx0LXNoYXBlZCB2YWx1ZSBzbyBjYWxsZXJzIGNhbiBjaGVjayB3aXRob3V0IHRyeS9jYXRjaFxuICAgICAgICByZXR1cm4geyBwYXVzZWQ6IHRydWUsIGNoZWNrcG9pbnQ6IHRoaXMubGFzdENoZWNrcG9pbnQgfSBzYXRpc2ZpZXMgUGF1c2VkUmVzdWx0O1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aW1lb3V0SWQgIT09IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEludHJvc3BlY3Rpb24g4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJ1bnRpbWUgc25hcHNob3QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnJlZGFjdCAgV2hlbiBgdHJ1ZWAsIGBzaGFyZWRTdGF0ZWAgY29tZXMgZnJvbSB0aGUgcGFyYWxsZWxcbiAgICogICByZWRhY3RlZCBtaXJyb3IgKGlmIG1haW50YWluZWQg4oCUIHNlZSBgc2V0UmVkYWN0aW9uUG9saWN5YCkuIFRoaXMgaXNcbiAgICogICB0aGUgc2FmZSB2aWV3IGZvciBleHBvcnRpbmcgdHJhY2VzIGV4dGVybmFsbHkgKHBhc3RlIGludG8gYSB2aWV3ZXIsXG4gICAqICAgc2hhcmUgd2l0aCBzdXBwb3J0KS4gV2hlbiBubyByZWRhY3Rpb24gcG9saWN5IGlzIGNvbmZpZ3VyZWQgdGhlXG4gICAqICAgcmVkYWN0ZWQgbWlycm9yIGlzIG5vdCBtYWludGFpbmVkLCBzbyB0aGlzIGZsYWcgaXMgYSBuby1vcCDigJRcbiAgICogICBgc2hhcmVkU3RhdGVgIGlzIHRoZSByYXcgd29ya2luZyBtZW1vcnkgZWl0aGVyIHdheS4gRGVmYXVsdCBgZmFsc2VgLlxuICAgKlxuICAgKiAgIFRoZSBjb21taXQgbG9nIGlzIGFscmVhZHkgcmVkYWN0ZWQgYXQgd3JpdGUtdGltZSByZWdhcmRsZXNzIG9mIHRoaXNcbiAgICogICBmbGFnLCBhbmQgdGhlIGV4ZWN1dGlvbiB0cmVlIGNhcnJpZXMgb25seSBzdHJ1Y3R1cmFsIG1ldGFkYXRhLlxuICAgKi9cbiAgZ2V0U25hcHNob3Qob3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9KTogUnVudGltZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMudHJhdmVyc2VyLmdldFNuYXBzaG90KG9wdGlvbnMpIGFzIFJ1bnRpbWVTbmFwc2hvdDtcbiAgICBjb25zdCBzZlJlc3VsdHMgPSB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICAgIGlmIChzZlJlc3VsdHMuc2l6ZSA+IDApIHtcbiAgICAgIHNuYXBzaG90LnN1YmZsb3dSZXN1bHRzID0gT2JqZWN0LmZyb21FbnRyaWVzKHNmUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgLy8gQ29sbGVjdCBzbmFwc2hvdCBkYXRhIGZyb20gcmVjb3JkZXJzIHRoYXQgaW1wbGVtZW50IHRvU25hcHNob3QoKVxuICAgIGNvbnN0IHJlY29yZGVyU25hcHNob3RzOiBSZWNvcmRlclNuYXBzaG90W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5zY29wZVJlY29yZGVycykge1xuICAgICAgaWYgKHIudG9TbmFwc2hvdCkge1xuICAgICAgICBjb25zdCBzbmFwID0gci50b1NuYXBzaG90KCk7XG4gICAgICAgIHJlY29yZGVyU25hcHNob3RzLnB1c2goe1xuICAgICAgICAgIGlkOiByLmlkLFxuICAgICAgICAgIG5hbWU6IHNuYXAubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogc25hcC5kZXNjcmlwdGlvbixcbiAgICAgICAgICBwcmVmZXJyZWRPcGVyYXRpb246IHNuYXAucHJlZmVycmVkT3BlcmF0aW9uLFxuICAgICAgICAgIGRhdGE6IHNuYXAuZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmZsb3dSZWNvcmRlcnMpIHtcbiAgICAgIGlmIChyLnRvU25hcHNob3QpIHtcbiAgICAgICAgY29uc3Qgc25hcCA9IHIudG9TbmFwc2hvdCgpO1xuICAgICAgICByZWNvcmRlclNuYXBzaG90cy5wdXNoKHtcbiAgICAgICAgICBpZDogci5pZCxcbiAgICAgICAgICBuYW1lOiBzbmFwLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHNuYXAuZGVzY3JpcHRpb24sXG4gICAgICAgICAgcHJlZmVycmVkT3BlcmF0aW9uOiBzbmFwLnByZWZlcnJlZE9wZXJhdGlvbixcbiAgICAgICAgICBkYXRhOiBzbmFwLmRhdGEsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVjb3JkZXJTbmFwc2hvdHMubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3QucmVjb3JkZXJzID0gcmVjb3JkZXJTbmFwc2hvdHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHNldFJvb3RPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMudHJhdmVyc2VyLnNldFJvb3RPYmplY3QocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0QnJhbmNoSWRzKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWVSb290KCk6IFN0YWdlTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWVSb290KCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZVN0cnVjdHVyZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTdWJmbG93UmVzdWx0cygpOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEV4dHJhY3RlZFJlc3VsdHM8VFJlc3VsdCA9IHVua25vd24+KCk6IE1hcDxzdHJpbmcsIFRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0RXh0cmFjdGVkUmVzdWx0czxUUmVzdWx0PigpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRFeHRyYWN0b3JFcnJvcnMoKTogRXh0cmFjdG9yRXJyb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldEV4dHJhY3RvckVycm9ycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN1YmZsb3cgbWFuaWZlc3QgZnJvbSBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlci5cbiAgICogUmV0dXJucyBlbXB0eSBhcnJheSBpZiBubyBNYW5pZmVzdEZsb3dSZWNvcmRlciBpcyBhdHRhY2hlZC5cbiAgICovXG4gIGdldFN1YmZsb3dNYW5pZmVzdCgpOiBNYW5pZmVzdEVudHJ5W10ge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbmQoKHIpID0+IHIgaW5zdGFuY2VvZiBNYW5pZmVzdEZsb3dSZWNvcmRlcikgYXNcbiAgICAgIHwgTWFuaWZlc3RGbG93UmVjb3JkZXJcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWNvcmRlcj8uZ2V0TWFuaWZlc3QoKSA/PyBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmdWxsIHNwZWMgZm9yIGEgZHluYW1pY2FsbHktcmVnaXN0ZXJlZCBzdWJmbG93LlxuICAgKiBSZXF1aXJlcyBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlciB0aGF0IG9ic2VydmVkIHRoZSByZWdpc3RyYXRpb24uXG4gICAqL1xuICBnZXRTdWJmbG93U3BlYyhzdWJmbG93SWQ6IHN0cmluZyk6IHVua25vd24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbmQoKHIpID0+IHIgaW5zdGFuY2VvZiBNYW5pZmVzdEZsb3dSZWNvcmRlcikgYXNcbiAgICAgIHwgTWFuaWZlc3RGbG93UmVjb3JkZXJcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWNvcmRlcj8uZ2V0U3BlYyhzdWJmbG93SWQpO1xuICB9XG59XG4iXX0=
|
|
982
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFHSCxPQUFPLEVBQUUsZUFBZSxJQUFJLGdCQUFnQixFQUFFLGtCQUFrQixJQUFJLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFcEgsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFHN0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFFN0YsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0UsT0FBTyxFQVdMLGFBQWEsR0FDZCxNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVySCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFdkQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBRXRELE9BQU8sRUFBK0MsZ0JBQWdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsMEVBQTBFO0FBQzFFLE1BQU0sbUJBQW1CLEdBQWlCLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFFLEVBQUUsQ0FDMUUsSUFBSSxXQUFXLENBQUMsR0FBRyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FB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QWtCO1FBQ2hCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksb0JBQW9CLENBRXBFLENBQUM7UUFDZCxPQUFPLFFBQVEsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWMsQ0FBQyxTQUFpQjtRQUM5QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLG9CQUFvQixDQUVwRSxDQUFDO1FBQ2QsT0FBTyxRQUFRLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd0NoYXJ0RXhlY3V0b3Ig4oCUIFB1YmxpYyBBUEkgZm9yIGV4ZWN1dGluZyBhIGNvbXBpbGVkIEZsb3dDaGFydC5cbiAqXG4gKiBXcmFwcyBGbG93Y2hhcnRUcmF2ZXJzZXIuIEJ1aWxkIGEgY2hhcnQgd2l0aCBmbG93Q2hhcnQoKSBhbmQgcGFzcyB0aGUgcmVzdWx0IGhlcmU6XG4gKlxuICogICBjb25zdCBjaGFydCA9IGZsb3dDaGFydCgnZW50cnknLCBlbnRyeUZuKS5hZGRGdW5jdGlvbigncHJvY2VzcycsIHByb2Nlc3NGbikuYnVpbGQoKTtcbiAqXG4gKiAgIC8vIE5vLW9wdGlvbnMgZm9ybSAodXNlcyBhdXRvLWRldGVjdGVkIFR5cGVkU2NvcGUgZmFjdG9yeSBmcm9tIHRoZSBjaGFydCk6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAqXG4gKiAgIC8vIE9wdGlvbnMtb2JqZWN0IGZvcm0gKHByZWZlcnJlZCB3aGVuIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBiZWhhdmlvcik6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHNjb3BlRmFjdG9yeTogbXlGYWN0b3J5LCBlbnJpY2hTbmFwc2hvdHM6IHRydWUgfSk7XG4gKlxuICogICAvLyAyLXBhcmFtIGZvcm0gKGFjY2VwdHMgYSBTY29wZUZhY3RvcnkgZGlyZWN0bHksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIG15RmFjdG9yeSk7XG4gKlxuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dDogZGF0YSwgZW52OiB7IHRyYWNlSWQ6ICdyZXEtMTIzJyB9IH0pO1xuICovXG5cbmltcG9ydCB0eXBlIHsgRmxvd0NoYXJ0IH0gZnJvbSAnLi4vYnVpbGRlci90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZXRhY2hBbmRGb3JnZXQgYXMgX2RldGFjaEFuZEZvcmdldCwgZGV0YWNoQW5kSm9pbkxhdGVyIGFzIF9kZXRhY2hBbmRKb2luTGF0ZXIgfSBmcm9tICcuLi9kZXRhY2gvc3Bhd24uanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvbmFycmF0aXZlVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdEVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9yZWNvcmRlcnMvTWFuaWZlc3RGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgTWFuaWZlc3RGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3JlY29yZGVycy9NYW5pZmVzdEZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgYnVpbGRSdW50aW1lU3RhZ2VJZCB9IGZyb20gJy4uL2VuZ2luZS9ydW50aW1lU3RhZ2VJZC5qcyc7XG5pbXBvcnQgeyBGbG93Y2hhcnRUcmF2ZXJzZXIgfSBmcm9tICcuLi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEV4ZWN1dG9yUmVzdWx0LFxuICB0eXBlIEV4dHJhY3RvckVycm9yLFxuICB0eXBlIFBhdXNlZFJlc3VsdCxcbiAgdHlwZSBSdW5PcHRpb25zLFxuICB0eXBlIFNjb3BlRmFjdG9yeSxcbiAgdHlwZSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIHR5cGUgU3RhZ2VOb2RlLFxuICB0eXBlIFN0cmVhbUhhbmRsZXJzLFxuICB0eXBlIFN1YmZsb3dSZXN1bHQsXG4gIHR5cGUgVHJhdmVyc2FsUmVzdWx0LFxuICBkZWZhdWx0TG9nZ2VyLFxufSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93Y2hhcnRDaGVja3BvaW50IH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJy4uL3JlY29yZGVyL0NvbWJpbmVkUmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgaGFzRW1pdFJlY29yZGVyTWV0aG9kcywgaGFzRmxvd1JlY29yZGVyTWV0aG9kcywgaGFzUmVjb3JkZXJNZXRob2RzIH0gZnJvbSAnLi4vcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVtaXRSZWNvcmRlciB9IGZyb20gJy4uL3JlY29yZGVyL0VtaXRSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9zY29wZS9kZXRlY3RDaXJjdWxhci5qcyc7XG5pbXBvcnQgdHlwZSB7IFNjb3BlUHJvdGVjdGlvbk1vZGUgfSBmcm9tICcuLi9zY29wZS9wcm90ZWN0aW9uL3R5cGVzLmpzJztcbmltcG9ydCB7IFNjb3BlRmFjYWRlIH0gZnJvbSAnLi4vc2NvcGUvU2NvcGVGYWNhZGUuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWNvcmRlciwgUmVkYWN0aW9uUG9saWN5LCBSZWRhY3Rpb25SZXBvcnQgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5pbXBvcnQgeyB0eXBlIFJlY29yZGVyU25hcHNob3QsIHR5cGUgUnVudGltZVNuYXBzaG90LCBFeGVjdXRpb25SdW50aW1lIH0gZnJvbSAnLi9FeGVjdXRpb25SdW50aW1lLmpzJztcbmltcG9ydCB7IHZhbGlkYXRlSW5wdXQgfSBmcm9tICcuL3ZhbGlkYXRlSW5wdXQuanMnO1xuXG4vKiogRGVmYXVsdCBzY29wZSBmYWN0b3J5IOKAlCBjcmVhdGVzIGEgcGxhaW4gU2NvcGVGYWNhZGUgZm9yIGVhY2ggc3RhZ2UuICovXG5jb25zdCBkZWZhdWx0U2NvcGVGYWN0b3J5OiBTY29wZUZhY3RvcnkgPSAoY3R4LCBzdGFnZU5hbWUsIHJlYWRPbmx5LCBlbnYpID0+XG4gIG5ldyBTY29wZUZhY2FkZShjdHgsIHN0YWdlTmFtZSwgcmVhZE9ubHksIGVudik7XG5cbi8qKlxuICogT3B0aW9ucyBvYmplY3QgZm9yIGBGbG93Q2hhcnRFeGVjdXRvcmAg4oCUIHByZWZlcnJlZCBvdmVyIHBvc2l0aW9uYWwgcGFyYW1zLlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGV4ID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7XG4gKiAgIHNjb3BlRmFjdG9yeTogbXlGYWN0b3J5LFxuICogICBlbnJpY2hTbmFwc2hvdHM6IHRydWUsXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqICoqU3luYyBub3RlIGZvciBtYWludGFpbmVyczoqKiBFdmVyeSBmaWVsZCBhZGRlZCBoZXJlIG11c3QgYWxzbyBhcHBlYXIgaW4gdGhlXG4gKiBgZmxvd0NoYXJ0QXJnc2AgcHJpdmF0ZSBmaWVsZCB0eXBlIGFuZCBpbiB0aGUgY29uc3RydWN0b3IncyBvcHRpb25zLXJlc29sdXRpb25cbiAqIGJsb2NrICh0aGUgYGVsc2UgaWZgIGJyYW5jaCB0aGF0IHJlYWRzIGZyb20gYG9wdHNgKS4gTWlzc2luZyBhbnkgb25lIG9mIHRoZVxuICogdGhyZWUgY2F1c2VzIHNpbGVudCBvbWlzc2lvbiDigJQgdGhlIG9wdGlvbiBpcyBhY2NlcHRlZCBidXQgbmV2ZXIgYXBwbGllZC5cbiAqXG4gKiAqKlRTY29wZSBpbmZlcmVuY2Ugbm90ZToqKiBXaGVuIHVzaW5nIHRoZSBvcHRpb25zLW9iamVjdCBmb3JtIHdpdGggYSBjdXN0b20gc2NvcGUsXG4gKiBUeXBlU2NyaXB0IGNhbm5vdCBpbmZlciBgVFNjb3BlYCB0aHJvdWdoIHRoZSBvcHRpb25zIG9iamVjdC4gUGFzcyB0aGUgdHlwZVxuICogZXhwbGljaXRseTogYG5ldyBGbG93Q2hhcnRFeGVjdXRvcjxUT3V0LCBNeVNjb3BlPihjaGFydCwgeyBzY29wZUZhY3RvcnkgfSlgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGUgPSBhbnk+IHtcbiAgLy8g4pSA4pSAIENvbW1vbiBvcHRpb25zIChtb3N0IGNhbGxlcnMgbmVlZCBvbmx5IHRoZXNlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQ3VzdG9tIHNjb3BlIGZhY3RvcnkuIERlZmF1bHRzIHRvIFR5cGVkU2NvcGUgb3IgU2NvcGVGYWNhZGUgYXV0by1kZXRlY3Rpb24uICovXG4gIHNjb3BlRmFjdG9yeT86IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuICAvKipcbiAgICogQXR0YWNoIGEgcGVyLXN0YWdlIHNjb3BlIHNuYXBzaG90IHRvIGVhY2ggZXh0cmFjdG9yIHJlc3VsdC4gV2hlbiBgdHJ1ZWAsIHRoZVxuICAgKiBleHRyYWN0aW9uIGNhbGxiYWNrIHJlY2VpdmVzIHRoZSBmdWxsIHNoYXJlZCBzdGF0ZSBhdCB0aGUgcG9pbnQgdGhhdCBzdGFnZVxuICAgKiBjb21taXR0ZWQg4oCUIHVzZWZ1bCBmb3IgZGVidWdnaW5nIG11bHRpLXN0YWdlIHN0YXRlIHRyYW5zaXRpb25zLiBEZWZhdWx0cyB0b1xuICAgKiBgZmFsc2VgIChubyBzY29wZSBzbmFwc2hvdCBhdHRhY2hlZCkuIENhbiBhbHNvIGJlIHNldCBvbiB0aGUgY2hhcnQgdmlhXG4gICAqIGBmbG93Q2hhcnQoLi4uKS5lbnJpY2hTbmFwc2hvdHModHJ1ZSlgLlxuICAgKi9cbiAgZW5yaWNoU25hcHNob3RzPzogYm9vbGVhbjtcblxuICAvLyDilIDilIAgQ29udGV4dCBvcHRpb25zIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IHZhbHVlcyBwcmUtcG9wdWxhdGVkIGludG8gdGhlIHNoYXJlZCBjb250ZXh0IGJlZm9yZSAqKmVhY2gqKiBzdGFnZVxuICAgKiAocmUtYXBwbGllZCBldmVyeSBzdGFnZSwgYWN0aW5nIGFzIGJhc2VsaW5lIGRlZmF1bHRzKS5cbiAgICovXG4gIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqXG4gICAqIEluaXRpYWwgY29udGV4dCB2YWx1ZXMgbWVyZ2VkIGludG8gdGhlIHNoYXJlZCBjb250ZXh0ICoqb25jZSoqIGF0IHN0YXJ0dXBcbiAgICogKGFwcGxpZWQgYmVmb3JlIHRoZSBmaXJzdCBzdGFnZSwgbm90IHJlcGVhdGVkIG9uIHN1YnNlcXVlbnQgc3RhZ2VzKS5cbiAgICogRGlzdGluY3QgZnJvbSBgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHRgLCB3aGljaCBpcyByZS1hcHBsaWVkIGV2ZXJ5IHN0YWdlLlxuICAgKi9cbiAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAvKiogUmVhZC1vbmx5IGlucHV0IGFjY2Vzc2libGUgdmlhIGBzY29wZS5nZXRBcmdzKClgIOKAlCBuZXZlciB0cmFja2VkIG9yIHdyaXR0ZW4uICovXG4gIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG5cbiAgLy8g4pSA4pSAIEFkdmFuY2VkIC8gZXNjYXBlLWhhdGNoIG9wdGlvbnMgKG1vc3QgY2FsbGVycyBkbyBub3QgbmVlZCB0aGVzZSkg4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEN1c3RvbSBlcnJvciBjbGFzc2lmaWVyIGZvciB0aHJvdHRsaW5nIGRldGVjdGlvbi4gUmV0dXJuIGB0cnVlYCBpZiB0aGVcbiAgICogZXJyb3IgcmVwcmVzZW50cyBhIHJhdGUtbGltaXQgb3IgYmFja3ByZXNzdXJlIGNvbmRpdGlvbiAodGhlIGV4ZWN1dG9yIHdpbGxcbiAgICogdHJlYXQgaXQgZGlmZmVyZW50bHkgZnJvbSBoYXJkIGZhaWx1cmVzKS4gRGVmYXVsdHMgdG8gbm8gdGhyb3R0bGluZyBjbGFzc2lmaWNhdGlvbi5cbiAgICovXG4gIHRocm90dGxpbmdFcnJvckNoZWNrZXI/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gIC8qKiBIYW5kbGVycyBmb3Igc3RyZWFtaW5nIHN0YWdlIGxpZmVjeWNsZSBldmVudHMgKHNlZSBgYWRkU3RyZWFtaW5nRnVuY3Rpb25gKS4gKi9cbiAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgLyoqIFNjb3BlIHByb3RlY3Rpb24gbW9kZSBmb3IgVHlwZWRTY29wZSBkaXJlY3QtYXNzaWdubWVudCBkZXRlY3Rpb24uICovXG4gIHNjb3BlUHJvdGVjdGlvbk1vZGU/OiBTY29wZVByb3RlY3Rpb25Nb2RlO1xufVxuXG5leHBvcnQgY2xhc3MgRmxvd0NoYXJ0RXhlY3V0b3I8VE91dCA9IGFueSwgVFNjb3BlID0gYW55PiB7XG4gIHByaXZhdGUgdHJhdmVyc2VyOiBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPjtcbiAgLyoqIFNoYXJlZCBleGVjdXRpb24gY291bnRlciDigJQgc3Vydml2ZXMgcGF1c2UvcmVzdW1lLiBSZXNldCBvbiBmcmVzaCBydW4oKS4gKi9cbiAgcHJpdmF0ZSBfZXhlY3V0aW9uQ291bnRlciA9IHsgdmFsdWU6IDAgfTtcbiAgcHJpdmF0ZSBuYXJyYXRpdmVFbmFibGVkID0gZmFsc2U7XG4gIHByaXZhdGUgbmFycmF0aXZlT3B0aW9ucz86IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zO1xuICBwcml2YXRlIGNvbWJpbmVkUmVjb3JkZXI6IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgZmxvd1JlY29yZGVyczogRmxvd1JlY29yZGVyW10gPSBbXTtcbiAgcHJpdmF0ZSBzY29wZVJlY29yZGVyczogUmVjb3JkZXJbXSA9IFtdO1xuICBwcml2YXRlIHJlZGFjdGlvblBvbGljeTogUmVkYWN0aW9uUG9saWN5IHwgdW5kZWZpbmVkO1xuICBwcml2YXRlIHNoYXJlZFJlZGFjdGVkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIHNoYXJlZFJlZGFjdGVkRmllbGRzQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG4gIHByaXZhdGUgbGFzdENoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQgfCB1bmRlZmluZWQ7XG4gIC8qKlxuICAgKiBgdHJ1ZWAgb25jZSBgcnVuKClgIChvciBhIHByZXZpb3VzIGByZXN1bWUoKWApIGhhcyBleGVjdXRlZCBvblxuICAgKiB0aGlzIGluc3RhbmNlLiBgcmVzdW1lKClgIGJyYW5jaGVzIG9uIGl0OlxuICAgKlxuICAgKiAgIOKAoiB0cnVlICDihpIgcmV1c2UgdGhlIGNvbnN0cnVjdG9yLXRpbWUgcnVudGltZSAoc2FtZS1leGVjdXRvclxuICAgKiAgICAgICAgICAgICBjb250aW51aXR5OiBleGVjdXRpb24gdHJlZSwgcmVjb3JkZXJzLCBuYXJyYXRpdmVcbiAgICogICAgICAgICAgICAgYWNjdW11bGF0ZSBhY3Jvc3MgcGF1c2UvcmVzdW1lIGN5Y2xlcylcbiAgICogICDigKIgZmFsc2Ug4oaSIHNlZWQgYSBmcmVzaCBydW50aW1lIGZyb20gYGNoZWNrcG9pbnQuc2hhcmVkU3RhdGVgXG4gICAqICAgICAgICAgICAgIChjcm9zcy1leGVjdXRvciAvIGNyb3NzLXByb2Nlc3MgcmVzdW1lOiBuZXcgaW5zdGFuY2VcbiAgICogICAgICAgICAgICAgcmVjb25zdHJ1Y3RlZCBmcm9tIGEgc2VyaWFsaXplZCBjaGVja3BvaW50KVxuICAgKlxuICAgKiBXaXRob3V0IHRoaXMgZmxhZywgZnJlc2ggZXhlY3V0b3JzIHNpbGVudGx5IGRpc2NhcmRlZCB0aGVcbiAgICogY2hlY2twb2ludCdzIHNoYXJlZFN0YXRlIGFuZCByZXN1bWUgaGFuZGxlcnMgY291bGRuJ3QgcmVhZCBwcmUtcGF1c2VcbiAgICogc2NvcGUuIFNlZSBgdGVzdC9saWIvcGF1c2UvY3Jvc3MtZXhlY3V0b3ItcmVzdW1lLnRlc3QudHNgLlxuICAgKi9cbiAgcHJpdmF0ZSBfaGFzUnVuQmVmb3JlID0gZmFsc2U7XG5cbiAgLy8gU1lOQyBSRVFVSVJFRDogZXZlcnkgb3B0aW9uYWwgZmllbGQgaGVyZSBtdXN0IG1pcnJvciBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnNcbiAgLy8gQU5EIGJlIGFzc2lnbmVkIGluIHRoZSBjb25zdHJ1Y3RvcidzIG9wdGlvbnMtcmVzb2x1dGlvbiBibG9jayAodGhlIGBlbHNlIGlmYCBicmFuY2gpLlxuICAvLyBBZGRpbmcgYSBmaWVsZCB0byBvbmx5IG9uZSBvZiB0aGUgdGhyZWUgcGxhY2VzIGNhdXNlcyBzaWxlbnQgb21pc3Npb24uXG4gIHByaXZhdGUgcmVhZG9ubHkgZmxvd0NoYXJ0QXJnczoge1xuICAgIGZsb3dDaGFydDogRmxvd0NoYXJ0PFRPdXQsIFRTY29wZT47XG4gICAgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPjtcbiAgICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dD86IHVua25vd247XG4gICAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAgIHJlYWRPbmx5Q29udGV4dD86IHVua25vd247XG4gICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICAgIHNjb3BlUHJvdGVjdGlvbk1vZGU/OiBTY29wZVByb3RlY3Rpb25Nb2RlO1xuICAgIGVucmljaFNuYXBzaG90cz86IGJvb2xlYW47XG4gIH07XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIEZsb3dDaGFydEV4ZWN1dG9yLlxuICAgKlxuICAgKiAqKk9wdGlvbnMgb2JqZWN0IGZvcm0qKiAocHJlZmVycmVkKTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2NvcGVGYWN0b3J5LCBlbnJpY2hTbmFwc2hvdHM6IHRydWUgfSlcbiAgICogYGBgXG4gICAqXG4gICAqICoqMi1wYXJhbSBmb3JtKiogKGFsc28gc3VwcG9ydGVkKTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHNjb3BlRmFjdG9yeSlcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBmbG93Q2hhcnQgLSBUaGUgY29tcGlsZWQgRmxvd0NoYXJ0IHJldHVybmVkIGJ5IGBmbG93Q2hhcnQoLi4uKS5idWlsZCgpYFxuICAgKiBAcGFyYW0gZmFjdG9yeU9yT3B0aW9ucyAtIEEgYFNjb3BlRmFjdG9yeTxUU2NvcGU+YCBPUiBhIGBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnM8VFNjb3BlPmAgb3B0aW9ucyBvYmplY3QuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBmbG93Q2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICAgIGZhY3RvcnlPck9wdGlvbnM/OiBTY29wZUZhY3Rvcnk8VFNjb3BlPiB8IEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGU+LFxuICApIHtcbiAgICAvLyBEZXRlY3Qgb3B0aW9ucy1vYmplY3QgZm9ybSB2cyBmYWN0b3J5IGZvcm1cbiAgICBsZXQgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ6IHVua25vd247XG4gICAgbGV0IGluaXRpYWxDb250ZXh0OiB1bmtub3duO1xuICAgIGxldCByZWFkT25seUNvbnRleHQ6IHVua25vd247XG4gICAgbGV0IHRocm90dGxpbmdFcnJvckNoZWNrZXI6ICgoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdHJlYW1IYW5kbGVyczogU3RyZWFtSGFuZGxlcnMgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHNjb3BlUHJvdGVjdGlvbk1vZGU6IFNjb3BlUHJvdGVjdGlvbk1vZGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGVucmljaFNuYXBzaG90czogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlb2YgZmFjdG9yeU9yT3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gMi1wYXJhbSBmb3JtOiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHNjb3BlRmFjdG9yeSlcbiAgICAgIHNjb3BlRmFjdG9yeSA9IGZhY3RvcnlPck9wdGlvbnM7XG4gICAgfSBlbHNlIGlmIChmYWN0b3J5T3JPcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE9wdGlvbnMgb2JqZWN0IGZvcm06IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzY29wZUZhY3RvcnksIGVucmljaFNuYXBzaG90cywgLi4uIH0pXG4gICAgICBjb25zdCBvcHRzID0gZmFjdG9yeU9yT3B0aW9ucztcbiAgICAgIHNjb3BlRmFjdG9yeSA9IG9wdHMuc2NvcGVGYWN0b3J5O1xuICAgICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQgPSBvcHRzLmRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0O1xuICAgICAgaW5pdGlhbENvbnRleHQgPSBvcHRzLmluaXRpYWxDb250ZXh0O1xuICAgICAgcmVhZE9ubHlDb250ZXh0ID0gb3B0cy5yZWFkT25seUNvbnRleHQ7XG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyID0gb3B0cy50aHJvdHRsaW5nRXJyb3JDaGVja2VyO1xuICAgICAgc3RyZWFtSGFuZGxlcnMgPSBvcHRzLnN0cmVhbUhhbmRsZXJzO1xuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZSA9IG9wdHMuc2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgICAgIGVucmljaFNuYXBzaG90cyA9IG9wdHMuZW5yaWNoU25hcHNob3RzO1xuICAgIH1cbiAgICB0aGlzLmZsb3dDaGFydEFyZ3MgPSB7XG4gICAgICBmbG93Q2hhcnQsXG4gICAgICBzY29wZUZhY3Rvcnk6IHNjb3BlRmFjdG9yeSA/PyBmbG93Q2hhcnQuc2NvcGVGYWN0b3J5ID8/IChkZWZhdWx0U2NvcGVGYWN0b3J5IGFzIFNjb3BlRmFjdG9yeTxUU2NvcGU+KSxcbiAgICAgIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0LFxuICAgICAgaW5pdGlhbENvbnRleHQsXG4gICAgICByZWFkT25seUNvbnRleHQsXG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgc3RyZWFtSGFuZGxlcnMsXG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgZW5yaWNoU25hcHNob3RzLFxuICAgIH07XG4gICAgdGhpcy50cmF2ZXJzZXIgPSB0aGlzLmNyZWF0ZVRyYXZlcnNlcigpO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVUcmF2ZXJzZXIoXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgcmVhZE9ubHlDb250ZXh0T3ZlcnJpZGU/OiB1bmtub3duLFxuICAgIGVudj86IGltcG9ydCgnLi4vZW5naW5lL3R5cGVzJykuRXhlY3V0aW9uRW52LFxuICAgIG1heERlcHRoPzogbnVtYmVyLFxuICAgIG92ZXJyaWRlcz86IHtcbiAgICAgIHJvb3Q/OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPjtcbiAgICAgIGluaXRpYWxDb250ZXh0PzogdW5rbm93bjtcbiAgICAgIHByZXNlcnZlUmVjb3JkZXJzPzogYm9vbGVhbjtcbiAgICAgIGV4aXN0aW5nUnVudGltZT86IEluc3RhbmNlVHlwZTx0eXBlb2YgRXhlY3V0aW9uUnVudGltZT47XG4gICAgICAvKiogUGVyLXN1YmZsb3cgc2NvcGUgY2FwdHVyZXMgZnJvbSBhIGNoZWNrcG9pbnQg4oCUIHBhc3NlZCB0aHJvdWdoXG4gICAgICAgKiAgdG8gSGFuZGxlckRlcHMgc28gU3ViZmxvd0V4ZWN1dG9yIGNhbiByZS1zZWVkIG5lc3RlZCBydW50aW1lc1xuICAgICAgICogIG9uIHRoZSByZXN1bWUgcGF0aC4gVW5kZWZpbmVkIG9uIG5vcm1hbCBydW4oKSBwYXRocy4gKi9cbiAgICAgIHN1YmZsb3dTdGF0ZXNGb3JSZXN1bWU/OiBSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG4gICAgICAvKiogUmVzdW1lLW9ubHkgb3ZlcnJpZGUgb2YgdGhlIHN1YmZsb3dzIGRpY3Qg4oCUIHN1YnN0aXR1dGVzIHRoZVxuICAgICAgICogIGxlYWYgc3ViZmxvdydzIHJvb3Qgd2l0aCBhIHJlc3VtZSBjaGFpbiBzbyB0aGUgc3ViZmxvdyBib2R5XG4gICAgICAgKiAgcGlja3MgdXAgYXQgdGhlIHBhdXNlIHBvaW50LiBPdGhlciBlbnRyaWVzIHBhc3MgdGhyb3VnaFxuICAgICAgICogIHVuY2hhbmdlZC4gKi9cbiAgICAgIHN1YmZsb3dzT3ZlcnJpZGU/OiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+O1xuICAgIH0sXG4gICk6IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+IHtcbiAgICBjb25zdCBhcmdzID0gdGhpcy5mbG93Q2hhcnRBcmdzO1xuICAgIGNvbnN0IGZjID0gYXJncy5mbG93Q2hhcnQ7XG4gICAgY29uc3QgbmFycmF0aXZlRmxhZyA9IHRoaXMubmFycmF0aXZlRW5hYmxlZCB8fCAoZmMuZW5hYmxlTmFycmF0aXZlID8/IGZhbHNlKTtcblxuICAgIC8vIOKUgOKUgCBDb21wb3NlZCBzY29wZSBmYWN0b3J5IOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAgIC8vIENvbGxlY3QgYWxsIHNjb3BlIG1vZGlmaWVycyAocmVjb3JkZXJzLCByZWRhY3Rpb24pIGludG8gYSBzaW5nbGUgbGlzdCxcbiAgICAvLyB0aGVuIGNyZWF0ZSBPTkUgZmFjdG9yeSB0aGF0IGFwcGxpZXMgdGhlbSBpbiBhIGxvb3AuIFJlcGxhY2VzIHRoZVxuICAgIC8vIHByZXZpb3VzIDQtZGVlcCBjbG9zdXJlIG5lc3Rpbmcgd2l0aCBhIGZsYXQsIGRlYnVnZ2FibGUgY29tcG9zaXRpb24uXG5cbiAgICBpZiAob3ZlcnJpZGVzPy5wcmVzZXJ2ZVJlY29yZGVycykge1xuICAgICAgLy8gUmVzdW1lIG1vZGU6IGtlZXAgZXhpc3RpbmcgY29tYmluZWRSZWNvcmRlciBzbyBuYXJyYXRpdmUgYWNjdW11bGF0ZXNcbiAgICB9IGVsc2UgaWYgKG5hcnJhdGl2ZUZsYWcpIHtcbiAgICAgIHRoaXMuY29tYmluZWRSZWNvcmRlciA9IG5ldyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyKHRoaXMubmFycmF0aXZlT3B0aW9ucyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY29tYmluZWRSZWNvcmRlciA9IHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICB0aGlzLnNoYXJlZFJlZGFjdGVkS2V5cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIHRoaXMuc2hhcmVkUmVkYWN0ZWRGaWVsZHNCeUtleSA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcblxuICAgIC8vIEJ1aWxkIG1vZGlmaWVyIGxpc3Qg4oCUIGVhY2ggbW9kaWZpZXIgcmVjZWl2ZXMgdGhlIHNjb3BlIGFmdGVyIGNyZWF0aW9uXG4gICAgdHlwZSBTY29wZU1vZGlmaWVyID0gKHNjb3BlOiBhbnkpID0+IHZvaWQ7XG4gICAgY29uc3QgbW9kaWZpZXJzOiBTY29wZU1vZGlmaWVyW10gPSBbXTtcblxuICAgIC8vIDEuIE5hcnJhdGl2ZSByZWNvcmRlciAoaWYgZW5hYmxlZClcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICBjb25zdCByZWNvcmRlciA9IHRoaXMuY29tYmluZWRSZWNvcmRlcjtcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLmF0dGFjaFJlY29yZGVyID09PSAnZnVuY3Rpb24nKSBzY29wZS5hdHRhY2hSZWNvcmRlcihyZWNvcmRlcik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAyLiBVc2VyLXByb3ZpZGVkIHNjb3BlIHJlY29yZGVyc1xuICAgIGlmICh0aGlzLnNjb3BlUmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlY29yZGVycyA9IHRoaXMuc2NvcGVSZWNvcmRlcnM7XG4gICAgICBtb2RpZmllcnMucHVzaCgoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS5hdHRhY2hSZWNvcmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGZvciAoY29uc3QgciBvZiByZWNvcmRlcnMpIHNjb3BlLmF0dGFjaFJlY29yZGVyKHIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAzLiBSZWRhY3Rpb24gcG9saWN5IChjb25kaXRpb25hbCDigJQgb25seSB3aGVuIHBvbGljeSBpcyBzZXQpXG4gICAgaWYgKHRoaXMucmVkYWN0aW9uUG9saWN5KSB7XG4gICAgICBjb25zdCBwb2xpY3kgPSB0aGlzLnJlZGFjdGlvblBvbGljeTtcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLnVzZVJlZGFjdGlvblBvbGljeSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNjb3BlLnVzZVJlZGFjdGlvblBvbGljeShwb2xpY3kpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIFByZS1wb3B1bGF0ZSBleGVjdXRvci1sZXZlbCBmaWVsZCByZWRhY3Rpb24gbWFwIGZyb20gcG9saWN5XG4gICAgICAvLyBzbyBnZXRSZWRhY3Rpb25SZXBvcnQoKSBpbmNsdWRlcyBmaWVsZC1sZXZlbCByZWRhY3Rpb25zLlxuICAgICAgaWYgKHBvbGljeS5maWVsZHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHBvbGljeS5maWVsZHMpKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5LnNldChrZXksIG5ldyBTZXQoZmllbGRzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb21wb3NlOiBiYXNlIGZhY3RvcnkgKyBtb2RpZmllcnMgaW4gYSBzaW5nbGUgcGFzcy5cbiAgICAvLyBTaGFyZWQgcmVkYWN0ZWQga2V5cyBhcmUgQUxXQVlTIHdpcmVkIHVwICh1bmNvbmRpdGlvbmFsIOKAlCBlbnN1cmVzIGNyb3NzLXN0YWdlXG4gICAgLy8gcHJvcGFnYXRpb24gZXZlbiB3aXRob3V0IGEgcG9saWN5LCBiZWNhdXNlIHN0YWdlcyBjYW4gY2FsbCBzZXRWYWx1ZShrZXksIHZhbCwgdHJ1ZSlcbiAgICAvLyBmb3IgcGVyLWNhbGwgcmVkYWN0aW9uKS4gT3B0aW9uYWwgbW9kaWZpZXJzIChyZWNvcmRlcnMsIHBvbGljeSkgYXJlIGluIHRoZSBsaXN0LlxuICAgIGNvbnN0IGJhc2VGYWN0b3J5ID0gYXJncy5zY29wZUZhY3Rvcnk7XG4gICAgY29uc3Qgc2hhcmVkUmVkYWN0ZWRLZXlzID0gdGhpcy5zaGFyZWRSZWRhY3RlZEtleXM7XG4gICAgY29uc3Qgc2NvcGVGYWN0b3J5ID0gKChjdHg6IGFueSwgc3RhZ2VOYW1lOiBzdHJpbmcsIHJlYWRPbmx5PzogdW5rbm93biwgZW52QXJnPzogYW55KSA9PiB7XG4gICAgICBjb25zdCBzY29wZSA9IGJhc2VGYWN0b3J5KGN0eCwgc3RhZ2VOYW1lLCByZWFkT25seSwgZW52QXJnKTtcbiAgICAgIC8vIEFsd2F5cyB3aXJlIHNoYXJlZCByZWRhY3Rpb24gc3RhdGVcbiAgICAgIGlmICh0eXBlb2YgKHNjb3BlIGFzIGFueSkudXNlU2hhcmVkUmVkYWN0ZWRLZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIChzY29wZSBhcyBhbnkpLnVzZVNoYXJlZFJlZGFjdGVkS2V5cyhzaGFyZWRSZWRhY3RlZEtleXMpO1xuICAgICAgfVxuICAgICAgLy8gQXBwbHkgb3B0aW9uYWwgbW9kaWZpZXJzXG4gICAgICBmb3IgKGNvbnN0IG1vZCBvZiBtb2RpZmllcnMpIG1vZChzY29wZSk7XG4gICAgICByZXR1cm4gc2NvcGU7XG4gICAgfSkgYXMgU2NvcGVGYWN0b3J5PFRTY29wZT47XG5cbiAgICBjb25zdCBlZmZlY3RpdmVSb290ID0gb3ZlcnJpZGVzPy5yb290ID8/IGZjLnJvb3Q7XG4gICAgY29uc3QgZWZmZWN0aXZlSW5pdGlhbENvbnRleHQgPSBvdmVycmlkZXM/LmluaXRpYWxDb250ZXh0ID8/IGFyZ3MuaW5pdGlhbENvbnRleHQ7XG5cbiAgICBsZXQgcnVudGltZTogRXhlY3V0aW9uUnVudGltZTtcbiAgICBpZiAob3ZlcnJpZGVzPy5leGlzdGluZ1J1bnRpbWUpIHtcbiAgICAgIC8vIFJlc3VtZSBtb2RlOiByZXVzZSBleGlzdGluZyBydW50aW1lIHNvIGV4ZWN1dGlvbiB0cmVlIGNvbnRpbnVlcyBmcm9tIHBhdXNlIHBvaW50LlxuICAgICAgLy8gUHJlc2VydmUgdGhlIG9yaWdpbmFsIHJvb3QgZm9yIGdldFNuYXBzaG90KCkgKGZ1bGwgdHJlZSksIHRoZW4gYWR2YW5jZVxuICAgICAgLy8gcm9vdFN0YWdlQ29udGV4dCB0byBhIGNvbnRpbnVhdGlvbiBmcm9tIHRoZSBsZWFmIChmb3IgdHJhdmVyc2FsKS5cbiAgICAgIHJ1bnRpbWUgPSBvdmVycmlkZXMuZXhpc3RpbmdSdW50aW1lO1xuICAgICAgcnVudGltZS5wcmVzZXJ2ZVNuYXBzaG90Um9vdCgpO1xuICAgICAgbGV0IGxlYWYgPSBydW50aW1lLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgICB3aGlsZSAobGVhZi5uZXh0KSBsZWFmID0gbGVhZi5uZXh0O1xuICAgICAgcnVudGltZS5yb290U3RhZ2VDb250ZXh0ID0gbGVhZi5jcmVhdGVOZXh0KCcnLCBlZmZlY3RpdmVSb290Lm5hbWUsIGVmZmVjdGl2ZVJvb3QuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBydW50aW1lID0gbmV3IEV4ZWN1dGlvblJ1bnRpbWUoXG4gICAgICAgIGVmZmVjdGl2ZVJvb3QubmFtZSxcbiAgICAgICAgZWZmZWN0aXZlUm9vdC5pZCxcbiAgICAgICAgYXJncy5kZWZhdWx0VmFsdWVzRm9yQ29udGV4dCxcbiAgICAgICAgZWZmZWN0aXZlSW5pdGlhbENvbnRleHQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFdoZW4gYSByZWRhY3Rpb24gcG9saWN5IGlzIGNvbmZpZ3VyZWQsIG1haW50YWluIGEgcGFyYWxsZWwgcmVkYWN0ZWRcbiAgICAvLyBtaXJyb3Igb2YgYGdsb2JhbFN0b3JlYCBkdXJpbmcgdHJhdmVyc2FsLiBFYWNoIGNvbW1pdCBhcHBsaWVzIHRoZVxuICAgIC8vIGFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcyDigJQgc2FtZSBvbmVzIGZlZCB0byB0aGUgZXZlbnQgbG9nIOKAlFxuICAgIC8vIHNvIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgcmV0dXJucyBhIHNjcnViYmVkIHNoYXJlZFN0YXRlIGF0XG4gICAgLy8gemVybyBwb3N0LXBhc3MgY29zdC4gU2tpcHBlZCB3aGVuIG5vIHBvbGljeSBleGlzdHMgKHplcm8gYWxsb2NhdGlvbikuXG4gICAgaWYgKHRoaXMucmVkYWN0aW9uUG9saWN5KSB7XG4gICAgICBydW50aW1lLmVuYWJsZVJlZGFjdGVkTWlycm9yKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPih7XG4gICAgICByb290OiBlZmZlY3RpdmVSb290LFxuICAgICAgc3RhZ2VNYXA6IGZjLnN0YWdlTWFwLFxuICAgICAgc2NvcGVGYWN0b3J5LFxuICAgICAgZXhlY3V0aW9uUnVudGltZTogcnVudGltZSxcbiAgICAgIHJlYWRPbmx5Q29udGV4dDogcmVhZE9ubHlDb250ZXh0T3ZlcnJpZGUgPz8gYXJncy5yZWFkT25seUNvbnRleHQsXG4gICAgICB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiBhcmdzLnRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICBzdHJlYW1IYW5kbGVyczogYXJncy5zdHJlYW1IYW5kbGVycyxcbiAgICAgIGV4dHJhY3RvcjogZmMuZXh0cmFjdG9yLFxuICAgICAgc2NvcGVQcm90ZWN0aW9uTW9kZTogYXJncy5zY29wZVByb3RlY3Rpb25Nb2RlLFxuICAgICAgc3ViZmxvd3M6IGZjLnN1YmZsb3dzLFxuICAgICAgZW5yaWNoU25hcHNob3RzOiBhcmdzLmVucmljaFNuYXBzaG90cyxcbiAgICAgIG5hcnJhdGl2ZUVuYWJsZWQ6IG5hcnJhdGl2ZUZsYWcsXG4gICAgICBidWlsZFRpbWVTdHJ1Y3R1cmU6IGZjLmJ1aWxkVGltZVN0cnVjdHVyZSxcbiAgICAgIGxvZ2dlcjogZmMubG9nZ2VyID8/IGRlZmF1bHRMb2dnZXIsXG4gICAgICBzaWduYWwsXG4gICAgICBleGVjdXRpb25FbnY6IGVudixcbiAgICAgIGZsb3dSZWNvcmRlcnM6IHRoaXMuYnVpbGRGbG93UmVjb3JkZXJzTGlzdCgpLFxuICAgICAgZXhlY3V0aW9uQ291bnRlcjogdGhpcy5fZXhlY3V0aW9uQ291bnRlcixcbiAgICAgIC4uLihvdmVycmlkZXM/LnN1YmZsb3dzT3ZlcnJpZGUgJiYgeyBzdWJmbG93czogb3ZlcnJpZGVzLnN1YmZsb3dzT3ZlcnJpZGUgfSksXG4gICAgICAuLi4ob3ZlcnJpZGVzPy5zdWJmbG93U3RhdGVzRm9yUmVzdW1lICYmIHtcbiAgICAgICAgc3ViZmxvd1N0YXRlc0ZvclJlc3VtZTogb3ZlcnJpZGVzLnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUsXG4gICAgICB9KSxcbiAgICAgIC4uLihtYXhEZXB0aCAhPT0gdW5kZWZpbmVkICYmIHsgbWF4RGVwdGggfSksXG4gICAgfSk7XG4gIH1cblxuICBlbmFibGVOYXJyYXRpdmUob3B0aW9ucz86IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXJPcHRpb25zKTogdm9pZCB7XG4gICAgdGhpcy5uYXJyYXRpdmVFbmFibGVkID0gdHJ1ZTtcbiAgICBpZiAob3B0aW9ucykgdGhpcy5uYXJyYXRpdmVPcHRpb25zID0gb3B0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBkZWNsYXJhdGl2ZSByZWRhY3Rpb24gcG9saWN5IHRoYXQgYXBwbGllcyB0byBhbGwgc3RhZ2VzLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkuXG4gICAqL1xuICBzZXRSZWRhY3Rpb25Qb2xpY3kocG9saWN5OiBSZWRhY3Rpb25Qb2xpY3kpOiB2b2lkIHtcbiAgICB0aGlzLnJlZGFjdGlvblBvbGljeSA9IHBvbGljeTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29tcGxpYW5jZS1mcmllbmRseSByZXBvcnQgb2YgYWxsIHJlZGFjdGlvbiBhY3Rpdml0eSBmcm9tIHRoZVxuICAgKiBtb3N0IHJlY2VudCBydW4uIE5ldmVyIGluY2x1ZGVzIGFjdHVhbCB2YWx1ZXMuXG4gICAqL1xuICBnZXRSZWRhY3Rpb25SZXBvcnQoKTogUmVkYWN0aW9uUmVwb3J0IHtcbiAgICBjb25zdCBmaWVsZFJlZGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiB0aGlzLnNoYXJlZFJlZGFjdGVkRmllbGRzQnlLZXkpIHtcbiAgICAgIGZpZWxkUmVkYWN0aW9uc1trZXldID0gWy4uLmZpZWxkc107XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZWRhY3RlZEtleXM6IFsuLi50aGlzLnNoYXJlZFJlZGFjdGVkS2V5c10sXG4gICAgICBmaWVsZFJlZGFjdGlvbnMsXG4gICAgICBwYXR0ZXJuczogKHRoaXMucmVkYWN0aW9uUG9saWN5Py5wYXR0ZXJucyA/PyBbXSkubWFwKChwKSA9PiBwLnNvdXJjZSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBQYXVzZS9SZXN1bWUg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNoZWNrcG9pbnQgZnJvbSB0aGUgbW9zdCByZWNlbnQgcGF1c2VkIGV4ZWN1dGlvbiwgb3IgYHVuZGVmaW5lZGBcbiAgICogaWYgdGhlIGxhc3QgcnVuIGNvbXBsZXRlZCB3aXRob3V0IHBhdXNpbmcuXG4gICAqXG4gICAqIFRoZSBjaGVja3BvaW50IGlzIEpTT04tc2VyaWFsaXphYmxlIOKAlCBzdG9yZSBpdCBpbiBSZWRpcywgUG9zdGdyZXMsIGxvY2FsU3RvcmFnZSwgZXRjLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0IH0pO1xuICAgKiBpZiAoZXhlY3V0b3IuaXNQYXVzZWQoKSkge1xuICAgKiAgIGNvbnN0IGNoZWNrcG9pbnQgPSBleGVjdXRvci5nZXRDaGVja3BvaW50KCkhO1xuICAgKiAgIGF3YWl0IHJlZGlzLnNldChgc2Vzc2lvbjoke2lkfWAsIEpTT04uc3RyaW5naWZ5KGNoZWNrcG9pbnQpKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGdldENoZWNrcG9pbnQoKTogRmxvd2NoYXJ0Q2hlY2twb2ludCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoZWNrcG9pbnQ7XG4gIH1cblxuICAvKiogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1vc3QgcmVjZW50IHJ1bigpIHdhcyBwYXVzZWQgKGNoZWNrcG9pbnQgYXZhaWxhYmxlKS4gKi9cbiAgaXNQYXVzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoZWNrcG9pbnQgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1bWUgYSBwYXVzZWQgZmxvd2NoYXJ0IGZyb20gYSBjaGVja3BvaW50LlxuICAgKlxuICAgKiBSZXN0b3JlcyB0aGUgc2NvcGUgc3RhdGUsIGNhbGxzIHRoZSBwYXVzZWQgc3RhZ2UncyBgcmVzdW1lRm5gIHdpdGggdGhlXG4gICAqIHByb3ZpZGVkIGlucHV0LCB0aGVuIGNvbnRpbnVlcyB0cmF2ZXJzYWwgZnJvbSB0aGUgbmV4dCBzdGFnZS5cbiAgICpcbiAgICogVGhlIGNoZWNrcG9pbnQgY2FuIGNvbWUgZnJvbSBgZ2V0Q2hlY2twb2ludCgpYCBvbiBhIHByZXZpb3VzIHJ1biwgb3IgZnJvbVxuICAgKiBhIHNlcmlhbGl6ZWQgY2hlY2twb2ludCBzdG9yZWQgaW4gUmVkaXMvUG9zdGdyZXMvbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiAqKk5hcnJhdGl2ZS9yZWNvcmRlciBzdGF0ZSBpcyByZXNldCBvbiByZXN1bWUuKiogVG8ga2VlcCBhIHVuaWZpZWQgbmFycmF0aXZlXG4gICAqIGFjcm9zcyBwYXVzZS9yZXN1bWUgY3ljbGVzLCBjb2xsZWN0IGl0IGJlZm9yZSBjYWxsaW5nIHJlc3VtZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBBZnRlciBhIHBhdXNlLi4uXG4gICAqIGNvbnN0IGNoZWNrcG9pbnQgPSBleGVjdXRvci5nZXRDaGVja3BvaW50KCkhO1xuICAgKiBhd2FpdCByZWRpcy5zZXQoYHNlc3Npb246JHtpZH1gLCBKU09OLnN0cmluZ2lmeShjaGVja3BvaW50KSk7XG4gICAqXG4gICAqIC8vIExhdGVyIChwb3NzaWJseSBkaWZmZXJlbnQgc2VydmVyLCBzYW1lIGNoYXJ0KVxuICAgKiBjb25zdCBjaGVja3BvaW50ID0gSlNPTi5wYXJzZShhd2FpdCByZWRpcy5nZXQoYHNlc3Npb246JHtpZH1gKSk7XG4gICAqIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0b3IucmVzdW1lKGNoZWNrcG9pbnQsIHsgYXBwcm92ZWQ6IHRydWUgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVzdW1lKFxuICAgIGNoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQsXG4gICAgcmVzdW1lSW5wdXQ/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBQaWNrPFJ1bk9wdGlvbnMsICdzaWduYWwnIHwgJ2VudicgfCAnbWF4RGVwdGgnPixcbiAgKTogUHJvbWlzZTxFeGVjdXRvclJlc3VsdD4ge1xuICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB1bmRlZmluZWQ7XG5cbiAgICAvLyDilIDilIAgVmFsaWRhdGUgY2hlY2twb2ludCBzdHJ1Y3R1cmUgKG1heSBjb21lIGZyb20gdW50cnVzdGVkIGV4dGVybmFsIHN0b3JhZ2UpIOKUgOKUgFxuICAgIGlmIChcbiAgICAgICFjaGVja3BvaW50IHx8XG4gICAgICB0eXBlb2YgY2hlY2twb2ludCAhPT0gJ29iamVjdCcgfHxcbiAgICAgIHR5cGVvZiBjaGVja3BvaW50LnNoYXJlZFN0YXRlICE9PSAnb2JqZWN0JyB8fFxuICAgICAgY2hlY2twb2ludC5zaGFyZWRTdGF0ZSA9PT0gbnVsbCB8fFxuICAgICAgQXJyYXkuaXNBcnJheShjaGVja3BvaW50LnNoYXJlZFN0YXRlKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoZWNrcG9pbnQ6IHNoYXJlZFN0YXRlIG11c3QgYmUgYSBwbGFpbiBvYmplY3QuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2hlY2twb2ludC5wYXVzZWRTdGFnZUlkICE9PSAnc3RyaW5nJyB8fCBjaGVja3BvaW50LnBhdXNlZFN0YWdlSWQgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hlY2twb2ludDogcGF1c2VkU3RhZ2VJZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy4nKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIUFycmF5LmlzQXJyYXkoY2hlY2twb2ludC5zdWJmbG93UGF0aCkgfHxcbiAgICAgICFjaGVja3BvaW50LnN1YmZsb3dQYXRoLmV2ZXJ5KChzOiB1bmtub3duKSA9PiB0eXBlb2YgcyA9PT0gJ3N0cmluZycpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hlY2twb2ludDogc3ViZmxvd1BhdGggbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzLicpO1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIHBhdXNlZCBub2RlIGluIHRoZSBncmFwaFxuICAgIGNvbnN0IHBhdXNlZE5vZGUgPSB0aGlzLmZpbmROb2RlSW5HcmFwaChjaGVja3BvaW50LnBhdXNlZFN0YWdlSWQsIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpO1xuICAgIGlmICghcGF1c2VkTm9kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogc3RhZ2UgJyR7Y2hlY2twb2ludC5wYXVzZWRTdGFnZUlkfScgbm90IGZvdW5kIGluIGZsb3djaGFydC4gYCArXG4gICAgICAgICAgJ1RoZSBjaGFydCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBjaGVja3BvaW50IHdhcyBjcmVhdGVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXBhdXNlZE5vZGUucmVzdW1lRm4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke3BhdXNlZE5vZGUubmFtZX0nICgke3BhdXNlZE5vZGUuaWR9KSBoYXMgbm8gcmVzdW1lRm4uIGAgK1xuICAgICAgICAgICdPbmx5IHN0YWdlcyBjcmVhdGVkIHdpdGggYWRkUGF1c2FibGVGdW5jdGlvbigpIGNhbiBiZSByZXN1bWVkLicsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEJ1aWxkIGEgc3ludGhldGljIHJlc3VtZSBub2RlOiBjYWxscyByZXN1bWVGbiB3aXRoIHJlc3VtZUlucHV0LCB0aGVuIGNvbnRpbnVlcy5cbiAgICAvLyByZXN1bWVGbiBzaWduYXR1cmUgaXMgKHNjb3BlLCBpbnB1dCkgcGVyIFBhdXNhYmxlSGFuZGxlciDigJQgd3JhcCB0byBtYXRjaCBTdGFnZUZ1bmN0aW9uKHNjb3BlLCBicmVha0ZuKS5cbiAgICBjb25zdCByZXN1bWVGbiA9IHBhdXNlZE5vZGUucmVzdW1lRm47XG4gICAgY29uc3QgcmVzdW1lU3RhZ2VGbiA9IChzY29wZTogVFNjb3BlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzdW1lRm4oc2NvcGUsIHJlc3VtZUlucHV0KTtcbiAgICB9O1xuXG4gICAgLy8gRGV0ZXJtaW5lIGNvbnRpbnVhdGlvbjogZm9yIGJyYW5jaCBjaGlsZHJlbiAoZGVjaWRlci9zZWxlY3RvciksXG4gICAgLy8gcGF1c2VkTm9kZS5uZXh0IGlzIHVuZGVmaW5lZC4gVGhlIGNoZWNrcG9pbnQnc1xuICAgIC8vIGNvbnRpbnVhdGlvblN0YWdlSWQgKGNvbGxlY3RlZCBkdXJpbmcgdHJhdmVyc2FsIGJ1YmJsZS11cClcbiAgICAvLyBwb2ludHMgdG8gdGhlIGludm9rZXIncyBuZXh0IG5vZGUuXG4gICAgLy9cbiAgICAvLyBGb3IgcGF1c2VzIGluc2lkZSBhIHN1YmZsb3csIHRoZSBjb250aW51YXRpb24gbGl2ZXMgSU5TSURFIHRoZVxuICAgIC8vIGxlYWYgc3ViZmxvdyAoZS5nLiwgdGhlIGxvb3AgdGFyZ2V0IGJhY2sgdG8gYG1lc3NhZ2VzYCkuIFNlYXJjaFxuICAgIC8vIHRoZSBsZWFmIHN1YmZsb3cgZmlyc3Q7IGZhbGwgYmFjayB0byB0b3AtbGV2ZWwgZm9yIHJvb3QtbGV2ZWxcbiAgICAvLyBwYXVzZXMuXG4gICAgY29uc3Qgc2ZTdGF0ZXMgPSBjaGVja3BvaW50LnN1YmZsb3dTdGF0ZXM7XG4gICAgY29uc3QgbGVhZlN1YmZsb3dJZCA9XG4gICAgICBjaGVja3BvaW50LnN1YmZsb3dQYXRoLmxlbmd0aCA+IDAgPyBjaGVja3BvaW50LnN1YmZsb3dQYXRoW2NoZWNrcG9pbnQuc3ViZmxvd1BhdGgubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgbGV0IGNvbnRpbnVhdGlvbk5leHQgPSBwYXVzZWROb2RlLm5leHQ7XG4gICAgaWYgKCFjb250aW51YXRpb25OZXh0ICYmIGNoZWNrcG9pbnQuY29udGludWF0aW9uU3RhZ2VJZCkge1xuICAgICAgLy8gU2VhcmNoIGxlYWYgc3ViZmxvdyBmaXJzdCAobG9vcCB0YXJnZXRzIC8gYnJhbmNoIGpvaW5zIGxpdmUgdGhlcmUpLFxuICAgICAgLy8gdGhlbiBmYWxsIGJhY2sgdG8gdG9wIGxldmVsLlxuICAgICAgY29udGludWF0aW9uTmV4dCA9IGxlYWZTdWJmbG93SWRcbiAgICAgICAgPyB0aGlzLmZpbmROb2RlSW5HcmFwaChjaGVja3BvaW50LmNvbnRpbnVhdGlvblN0YWdlSWQsIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKCFjb250aW51YXRpb25OZXh0KSB7XG4gICAgICAgIGNvbnRpbnVhdGlvbk5leHQgPSB0aGlzLmZpbmROb2RlSW5HcmFwaChjaGVja3BvaW50LmNvbnRpbnVhdGlvblN0YWdlSWQsIFtdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgXCJpbm5lclwiIHJlc3VtZSBjaGFpbjogcmVzdW1lRm4g4oaSIGNvbnRpbnVhdGlvbi4gVGhpcyBpcyB3aGF0XG4gICAgLy8gcnVucyBJTlNJREUgdGhlIGxlYWYgc3ViZmxvdydzIGJvZHkuIEZvciBhIHJvb3QtbGV2ZWwgcGF1c2VcbiAgICAvLyAoc3ViZmxvd1BhdGggZW1wdHkpLCB0aGlzIGlzIGFsc28gdGhlIHRvcC1sZXZlbCByZXN1bWUgcm9vdC5cbiAgICBjb25zdCBpbm5lclJlc3VtZUNoYWluOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICAgIGlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgZGVzY3JpcHRpb246IHBhdXNlZE5vZGUuZGVzY3JpcHRpb24sXG4gICAgICBmbjogcmVzdW1lU3RhZ2VGbixcbiAgICAgIG5leHQ6IGNvbnRpbnVhdGlvbk5leHQsXG4gICAgfTtcblxuICAgIC8vIERvbid0IGNsZWFyIHJlY29yZGVycyDigJQgcmVzdW1lIGNvbnRpbnVlcyBmcm9tIHByZXZpb3VzIHN0YXRlLlxuICAgIC8vIE5hcnJhdGl2ZSwgbWV0cmljcywgZGVidWcgZW50cmllcyBhY2N1bXVsYXRlIGFjcm9zcyBwYXVzZS9yZXN1bWUuXG4gICAgLy9cbiAgICAvLyBUd28tbW9kZSByZXN1bWU6XG4gICAgLy8gICDigKIgU2FtZS1leGVjdXRvciAocnVuKCkgcHJldmlvdXNseSBjYWxsZWQgb24gVEhJUyBpbnN0YW5jZSk6XG4gICAgLy8gICAgIHJldXNlIHRoZSBleGlzdGluZyBydW50aW1lIHNvIHRoZSBleGVjdXRpb24gdHJlZSBjb250aW51ZXNcbiAgICAvLyAgICAgZnJvbSB0aGUgcGF1c2UgcG9pbnQgYW5kIHJlY29yZGVycy9uYXJyYXRpdmUgYWNjdW11bGF0ZS5cbiAgICAvLyAgIOKAoiBDcm9zcy1leGVjdXRvciAoZnJlc2ggZXhlY3V0b3IgcmVjb25zdHJ1Y3RlZCBmcm9tIGEgc3RvcmVkXG4gICAgLy8gICAgIGNoZWNrcG9pbnQpOiBzZWVkIGEgTkVXIHJ1bnRpbWUgZnJvbSBgY2hlY2twb2ludC5zaGFyZWRTdGF0ZWBcbiAgICAvLyAgICAgc28gcmVzdW1lIGhhbmRsZXJzIGNhbiByZWFkIHByZS1wYXVzZSBzY29wZS4gVGhlIGV4ZWN1dGlvblxuICAgIC8vICAgICB0cmVlIHN0YXJ0cyBhdCB0aGUgcmVzdW1lIG5vZGUg4oCUIHdlIGRvbid0IGhhdmUgdGhlIHByZXZpb3VzXG4gICAgLy8gICAgIHRyYXZlcnNhbCdzIHRyZWUgb24gYSBmcmVzaCBwcm9jZXNzIGFueXdheS5cbiAgICBjb25zdCBzYW1lRXhlY3V0b3IgPSB0aGlzLl9oYXNSdW5CZWZvcmU7XG4gICAgY29uc3QgZXhpc3RpbmdSdW50aW1lID0gc2FtZUV4ZWN1dG9yXG4gICAgICA/ICh0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPilcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuX2hhc1J1bkJlZm9yZSA9IHRydWU7IC8vIGFueSBwYXRoIHRoYXQgcmVzdW1lcyBjb3VudHMgYXMgYSBydW5cblxuICAgIC8vIFBpY2sgdGhlIHJlc3VtZSByb290ICsgaW5pdGlhbCBjb250ZXh0LlxuICAgIC8vXG4gICAgLy8gICBST09ULUxFVkVMIFBBVVNFIChzdWJmbG93UGF0aCBlbXB0eSk6XG4gICAgLy8gICAgIHJlc3VtZSByb290ID0gaW5uZXJSZXN1bWVDaGFpbiAocnVuIHJlc3VtZUZuIGF0IHRvcCBsZXZlbCkuXG4gICAgLy8gICAgIGluaXRpYWxDb250ZXh0ID0gY2hlY2twb2ludC5zaGFyZWRTdGF0ZS5cbiAgICAvL1xuICAgIC8vICAgU1VCRkxPVy1ORVNURUQgUEFVU0UgKHN1YmZsb3dQYXRoIG5vbi1lbXB0eSk6XG4gICAgLy8gICAgIFRoZSBwYXVzZSB3YXMgSU5TSURFIGEgc3ViZmxvdydzIGJvZHkuIFRvIHJ1biB0aGUgc3ViZmxvdydzXG4gICAgLy8gICAgIG91dHB1dE1hcHBlciBhbmQgdGhlIHBhcmVudCdzIGNvbnRpbnVhdGlvbiwgd2UgaGF2ZSB0byBlbnRlclxuICAgIC8vICAgICB0aHJvdWdoIHRoZSBPVVRFUiBNT1VOVCAodGhlIHBhcmVudCdzIG5vZGUgdGhhdCBtb3VudHMgdGhlXG4gICAgLy8gICAgIGxlYWYgc3ViZmxvdykuIFdlIHN3YXAgdGhlIGxlYWYgc3ViZmxvdydzIHJvb3Qgd2l0aFxuICAgIC8vICAgICBpbm5lclJlc3VtZUNoYWluIHNvIFN1YmZsb3dFeGVjdXRvcjpcbiAgICAvLyAgICAgICAxLiBlbnRlcnMgdGhlIHN1YmZsb3cgYm91bmRhcnksXG4gICAgLy8gICAgICAgMi4gc2VlZHMgdGhlIG5lc3RlZCBydW50aW1lIGZyb20gc3ViZmxvd1N0YXRlc1tsZWFmXVxuICAgIC8vICAgICAgICAgIChza2lwcGluZyB0aGUgaW5wdXRNYXBwZXIg4oCUIHNlZSBTdWJmbG93RXhlY3V0b3IudHMpLFxuICAgIC8vICAgICAgIDMuIHJ1bnMgdGhlIHJlc3VtZUZuIOKGkiBjb250aW51YXRpb24gY2hhaW4sXG4gICAgLy8gICAgICAgNC4gcnVucyB0aGUgb3V0cHV0TWFwcGVyIGF0IGV4aXQsXG4gICAgLy8gICAgICAgNS4gcGFyZW50IHRyYXZlcnNhbCBjb250aW51ZXMgbm9ybWFsbHkuXG4gICAgLy9cbiAgICAvLyAgICAgQ3Jvc3MtZXhlY3V0b3I6IGluaXRpYWxDb250ZXh0ID0gY2hlY2twb2ludC5zaGFyZWRTdGF0ZSAodGhlXG4gICAgLy8gICAgICAgcGFyZW50J3MgdmlldyBhdCBwYXVzZSB0aW1lIOKAlCBvdXRwdXRNYXBwZXIgd3JpdGVzIGJhY2sgaW50byBpdCkuXG4gICAgLy8gICAgIFNhbWUtZXhlY3V0b3I6IGV4aXN0aW5nUnVudGltZSBpcyByZXVzZWQ7IGluaXRpYWxDb250ZXh0IGlzIG1vb3RcbiAgICAvLyAgICAgICBmb3IgdGhlIHN1YmZsb3cgZnJhbWUgKGFscmVhZHkgaW4gdGhlIHJ1bnRpbWUgc3RhY2spLCBidXQgd2VcbiAgICAvLyAgICAgICBzdGlsbCBwYXNzIHNoYXJlZFN0YXRlIGZvciBjb25zaXN0ZW5jeS5cbiAgICBjb25zdCBmYyA9IHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQ7XG4gICAgbGV0IHJlc3VtZVJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0gaW5uZXJSZXN1bWVDaGFpbjtcbiAgICBsZXQgc3ViZmxvd3NPdmVycmlkZTogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PiB8IHVuZGVmaW5lZDtcbiAgICBpZiAobGVhZlN1YmZsb3dJZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvLyBGaW5kIHRoZSBPVVRFUiBtb3VudCBub2RlIGZvciB0aGUgRklSU1QgZW50cnkgb24gdGhlIHBhdGguXG4gICAgICAvLyBGb3Igc2luZ2xlLWxldmVsIHBhdXNlcywgdGhpcyBpcyB0aGUgb25seSBtb3VudCB3ZSBuZWVkIHRvXG4gICAgICAvLyBlbnRlciB0aHJvdWdoLiBGb3IgbmVzdGVkIG1vdW50cyB0aGUgcGF0dGVybiB3b3VsZCBleHRlbmQsIGJ1dFxuICAgICAgLy8gc2luZ2xlLWxldmVsIGNvdmVycyBhbGwgY3VycmVudCB1c2UgY2FzZXMgKFNlcXVlbmNlKEFnZW50KSxcbiAgICAgIC8vIENvbmRpdGlvbmFsKEFnZW50KSwgUGFyYWxsZWwgYnJhbmNoZXMgd2l0aCBwYXVzZWQgYWdlbnRzKS5cbiAgICAgIGNvbnN0IG91dGVyU3ViZmxvd0lkID0gY2hlY2twb2ludC5zdWJmbG93UGF0aFswXTtcbiAgICAgIGNvbnN0IG91dGVyTW91bnQgPSB0aGlzLmZpbmRNb3VudEluR3JhcGgoZmMucm9vdCwgb3V0ZXJTdWJmbG93SWQpO1xuICAgICAgaWYgKG91dGVyTW91bnQpIHtcbiAgICAgICAgcmVzdW1lUm9vdCA9IG91dGVyTW91bnQ7XG4gICAgICB9XG4gICAgICAvLyBSZXBsYWNlIHRoZSBsZWFmIHN1YmZsb3cncyByb290IHdpdGggdGhlIHJlc3VtZSBjaGFpbiBzbyB0aGVcbiAgICAgIC8vIGJvZHkgcnVucyBmcm9tIHRoZSBwYXVzZSBwb2ludCBmb3J3YXJkLlxuICAgICAgc3ViZmxvd3NPdmVycmlkZSA9IHsgLi4uKGZjLnN1YmZsb3dzID8/IHt9KSB9O1xuICAgICAgc3ViZmxvd3NPdmVycmlkZVtsZWFmU3ViZmxvd0lkXSA9IHsgcm9vdDogaW5uZXJSZXN1bWVDaGFpbiB9O1xuICAgIH1cbiAgICBjb25zdCByZXN1bWVJbml0aWFsQ29udGV4dCA9IGNoZWNrcG9pbnQuc2hhcmVkU3RhdGU7XG5cbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKG9wdGlvbnM/LnNpZ25hbCwgdW5kZWZpbmVkLCBvcHRpb25zPy5lbnYsIG9wdGlvbnM/Lm1heERlcHRoLCB7XG4gICAgICByb290OiByZXN1bWVSb290LFxuICAgICAgaW5pdGlhbENvbnRleHQ6IHJlc3VtZUluaXRpYWxDb250ZXh0LFxuICAgICAgcHJlc2VydmVSZWNvcmRlcnM6IHRydWUsXG4gICAgICAuLi4oZXhpc3RpbmdSdW50aW1lID8geyBleGlzdGluZ1J1bnRpbWUgfSA6IHt9KSxcbiAgICAgIC8vIEhhbmQgdGhlIHBlci1zdWJmbG93IHNjb3BlIGNhcHR1cmVzIGRvd24gdG8gU3ViZmxvd0V4ZWN1dG9yLlxuICAgICAgLy8gQWx3YXlzIHByZXNlbnQgb24gYSBjaGVja3BvaW50IOKAlCBlbXB0eSBge31gIGZvciByb290IHBhdXNlcy5cbiAgICAgIHN1YmZsb3dTdGF0ZXNGb3JSZXN1bWU6IHNmU3RhdGVzLFxuICAgICAgLi4uKHN1YmZsb3dzT3ZlcnJpZGUgJiYgeyBzdWJmbG93c092ZXJyaWRlIH0pLFxuICAgIH0pO1xuXG4gICAgLy8gRmlyZSBvblJlc3VtZSBldmVudCBvbiBhbGwgcmVjb3JkZXJzIChmbG93ICsgc2NvcGUpXG4gICAgY29uc3QgaGFzSW5wdXQgPSByZXN1bWVJbnB1dCAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGZsb3dSZXN1bWVFdmVudCA9IHtcbiAgICAgIHN0YWdlTmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgICAgc3RhZ2VJZDogcGF1c2VkTm9kZS5pZCxcbiAgICAgIGhhc0lucHV0LFxuICAgIH07XG4gICAgaWYgKHRoaXMuY29tYmluZWRSZWNvcmRlcikgdGhpcy5jb21iaW5lZFJlY29yZGVyLm9uUmVzdW1lKGZsb3dSZXN1bWVFdmVudCk7XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuZmxvd1JlY29yZGVycykgci5vblJlc3VtZT8uKGZsb3dSZXN1bWVFdmVudCk7XG5cbiAgICBjb25zdCBzY29wZVJlc3VtZUV2ZW50ID0ge1xuICAgICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgcnVudGltZVN0YWdlSWQ6IGJ1aWxkUnVudGltZVN0YWdlSWQocGF1c2VkTm9kZS5pZCwgdGhpcy5fZXhlY3V0aW9uQ291bnRlci52YWx1ZSksXG4gICAgICBoYXNJbnB1dCxcbiAgICAgIHBpcGVsaW5lSWQ6ICcnLFxuICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpLFxuICAgIH07XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGVSZWNvcmRlcnMpIHIub25SZXN1bWU/LihzY29wZVJlc3VtZUV2ZW50KTtcblxuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50cmF2ZXJzZXIuZXhlY3V0ZSgpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnRyYXZlcnNlci5nZXRTbmFwc2hvdCgpO1xuICAgICAgICBjb25zdCBzZlJlc3VsdHMgPSB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICAgICAgICB0aGlzLmxhc3RDaGVja3BvaW50ID0ge1xuICAgICAgICAgIHNoYXJlZFN0YXRlOiBzbmFwc2hvdC5zaGFyZWRTdGF0ZSxcbiAgICAgICAgICBleGVjdXRpb25UcmVlOiBzbmFwc2hvdC5leGVjdXRpb25UcmVlLFxuICAgICAgICAgIHBhdXNlZFN0YWdlSWQ6IGVycm9yLnN0YWdlSWQsXG4gICAgICAgICAgc3ViZmxvd1BhdGg6IGVycm9yLnN1YmZsb3dQYXRoLFxuICAgICAgICAgIHBhdXNlRGF0YTogZXJyb3IucGF1c2VEYXRhLFxuICAgICAgICAgIHN1YmZsb3dTdGF0ZXM6IGVycm9yLnN1YmZsb3dTdGF0ZXMsXG4gICAgICAgICAgLi4uKHNmUmVzdWx0cy5zaXplID4gMCAmJiB7IHN1YmZsb3dSZXN1bHRzOiBPYmplY3QuZnJvbUVudHJpZXMoc2ZSZXN1bHRzKSB9KSxcbiAgICAgICAgICAuLi4oZXJyb3IuaW52b2tlclN0YWdlSWQgJiYgeyBpbnZva2VyU3RhZ2VJZDogZXJyb3IuaW52b2tlclN0YWdlSWQgfSksXG4gICAgICAgICAgLi4uKGVycm9yLmNvbnRpbnVhdGlvblN0YWdlSWQgJiYgeyBjb250aW51YXRpb25TdGFnZUlkOiBlcnJvci5jb250aW51YXRpb25TdGFnZUlkIH0pLFxuICAgICAgICAgIHBhdXNlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4geyBwYXVzZWQ6IHRydWUsIGNoZWNrcG9pbnQ6IHRoaXMubGFzdENoZWNrcG9pbnQgfSBzYXRpc2ZpZXMgUGF1c2VkUmVzdWx0O1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgYSBTdGFnZU5vZGUgaW4gdGhlIGNvbXBpbGVkIGdyYXBoIGJ5IElELlxuICAgKiBIYW5kbGVzIHN1YmZsb3cgcGF0aHMgYnkgZHJpbGxpbmcgaW50byByZWdpc3RlcmVkIHN1YmZsb3dzLlxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kTm9kZUluR3JhcGgoc3RhZ2VJZDogc3RyaW5nLCBzdWJmbG93UGF0aDogcmVhZG9ubHkgc3RyaW5nW10pOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgZmMgPSB0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0O1xuXG4gICAgaWYgKHN1YmZsb3dQYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gVG9wLWxldmVsOiBERlMgZnJvbSByb290XG4gICAgICByZXR1cm4gdGhpcy5kZnNGaW5kKGZjLnJvb3QsIHN0YWdlSWQpO1xuICAgIH1cblxuICAgIC8vIFN1YmZsb3c6IGRyaWxsIGludG8gdGhlIHN1YmZsb3cgY2hhaW4sIHRoZW4gc2VhcmNoIGZyb20gdGhlIGxhc3Qgc3ViZmxvdydzIHJvb3RcbiAgICBsZXQgc3ViZmxvd1Jvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkO1xuICAgIGZvciAoY29uc3Qgc2ZJZCBvZiBzdWJmbG93UGF0aCkge1xuICAgICAgY29uc3Qgc3ViZmxvdyA9IGZjLnN1YmZsb3dzPy5bc2ZJZF07XG4gICAgICBpZiAoIXN1YmZsb3cpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICBzdWJmbG93Um9vdCA9IHN1YmZsb3cucm9vdDtcbiAgICB9XG4gICAgaWYgKCFzdWJmbG93Um9vdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGhpcy5kZnNGaW5kKHN1YmZsb3dSb290LCBzdGFnZUlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIHRoZSBtb3VudCBub2RlICh0aGUgbm9kZSB0aGF0IG1vdW50cyBhIHN1YmZsb3cgYm91bmRhcnkpXG4gICAqIGZvciBhIGdpdmVuIHN1YmZsb3dJZCwgYnkgREZTIGZyb20gYHN0YXJ0YC4gVXNlZCBieSBgcmVzdW1lKClgIHRvXG4gICAqIGxvY2F0ZSB0aGUgT1VURVIgbm9kZSB3ZSBoYXZlIHRvIGVudGVyIHRocm91Z2ggc28gdGhlIHN1YmZsb3cnc1xuICAgKiBvdXRwdXRNYXBwZXIgYW5kIHBhcmVudCBjb250aW51YXRpb24gZXhlY3V0ZS5cbiAgICpcbiAgICogQ3ljbGUtc2FmZSB2aWEgdmlzaXRlZCBzZXQuIFJldHVybnMgdGhlIGZpcnN0IG1hdGNoIChERlMgb3JkZXIpLlxuICAgKi9cbiAgcHJpdmF0ZSBmaW5kTW91bnRJbkdyYXBoKFxuICAgIHN0YXJ0OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICBzdWJmbG93SWQ6IHN0cmluZyxcbiAgICB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCksXG4gICk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoc3RhcnQuaXNMb29wUmVmKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh2aXNpdGVkLmhhcyhzdGFydC5pZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgdmlzaXRlZC5hZGQoc3RhcnQuaWQpO1xuICAgIGlmIChzdGFydC5zdWJmbG93SWQgPT09IHN1YmZsb3dJZCkgcmV0dXJuIHN0YXJ0O1xuICAgIGlmIChzdGFydC5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBzdGFydC5jaGlsZHJlbikge1xuICAgICAgICBjb25zdCBmb3VuZCA9IHRoaXMuZmluZE1vdW50SW5HcmFwaChjaGlsZCwgc3ViZmxvd0lkLCB2aXNpdGVkKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzdGFydC5uZXh0KSByZXR1cm4gdGhpcy5maW5kTW91bnRJbkdyYXBoKHN0YXJ0Lm5leHQsIHN1YmZsb3dJZCwgdmlzaXRlZCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKiBERlMgc2VhcmNoIGZvciBhIG5vZGUgYnkgSUQgaW4gdGhlIFN0YWdlTm9kZSBncmFwaC4gQ3ljbGUtc2FmZSB2aWEgdmlzaXRlZCBzZXQuICovXG4gIHByaXZhdGUgZGZzRmluZChcbiAgICBub2RlOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPixcbiAgICB0YXJnZXRJZDogc3RyaW5nLFxuICAgIHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKSxcbiAgKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIC8vIFNraXAgbG9vcCBiYWNrLWVkZ2UgcmVmZXJlbmNlcyAodGhleSBzaGFyZSB0aGUgdGFyZ2V0J3MgSUQgYnV0IGhhdmUgbm8gZm4vcmVzdW1lRm4pXG4gICAgaWYgKG5vZGUuaXNMb29wUmVmKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGlmICh2aXNpdGVkLmhhcyhub2RlLmlkKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB2aXNpdGVkLmFkZChub2RlLmlkKTtcbiAgICBpZiAobm9kZS5pZCA9PT0gdGFyZ2V0SWQpIHJldHVybiBub2RlO1xuICAgIGlmIChub2RlLmNoaWxkcmVuKSB7XG4gICAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIG5vZGUuY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmRmc0ZpbmQoY2hpbGQsIHRhcmdldElkLCB2aXNpdGVkKTtcbiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChub2RlLm5leHQpIHJldHVybiB0aGlzLmRmc0ZpbmQobm9kZS5uZXh0LCB0YXJnZXRJZCwgdmlzaXRlZCk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBSZWNvcmRlciBNYW5hZ2VtZW50IOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBzY29wZSBSZWNvcmRlciB0byBvYnNlcnZlIGRhdGEgb3BlcmF0aW9ucyAocmVhZHMsIHdyaXRlcywgY29tbWl0cykuXG4gICAqIEF1dG9tYXRpY2FsbHkgYXR0YWNoZWQgdG8gZXZlcnkgU2NvcGVGYWNhZGUgY3JlYXRlZCBkdXJpbmcgdHJhdmVyc2FsLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkuXG4gICAqXG4gICAqICoqSWRlbXBvdGVudCBieSBJRDoqKiBJZiBhIHJlY29yZGVyIHdpdGggdGhlIHNhbWUgYGlkYCBpcyBhbHJlYWR5IGF0dGFjaGVkLFxuICAgKiBpdCBpcyByZXBsYWNlZCAobm90IGR1cGxpY2F0ZWQpLiBUaGlzIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZyB3aGVuIGJvdGhcbiAgICogYSBmcmFtZXdvcmsgYW5kIHRoZSB1c2VyIGF0dGFjaCB0aGUgc2FtZSByZWNvcmRlciB0eXBlLlxuICAgKlxuICAgKiBCdWlsdC1pbiByZWNvcmRlcnMgdXNlIGF1dG8taW5jcmVtZW50IElEcyAoYG1ldHJpY3MtMWAsIGBkZWJ1Zy0xYCwgLi4uKSBieVxuICAgKiBkZWZhdWx0LCBzbyBtdWx0aXBsZSBpbnN0YW5jZXMgd2l0aCBkaWZmZXJlbnQgY29uZmlncyBjb2V4aXN0LiBUbyBvdmVycmlkZVxuICAgKiBhIGZyYW1ld29yay1hdHRhY2hlZCByZWNvcmRlciwgcGFzcyB0aGUgc2FtZSB3ZWxsLWtub3duIElELlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIE11bHRpcGxlIHJlY29yZGVycyB3aXRoIGRpZmZlcmVudCBjb25maWdzIOKAlCBlYWNoIGdldHMgYSB1bmlxdWUgSURcbiAgICogZXhlY3V0b3IuYXR0YWNoUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCkpO1xuICAgKiBleGVjdXRvci5hdHRhY2hSZWNvcmRlcihuZXcgRGVidWdSZWNvcmRlcih7IHZlcmJvc2l0eTogJ21pbmltYWwnIH0pKTtcbiAgICpcbiAgICogLy8gT3ZlcnJpZGUgYSBmcmFtZXdvcmstYXR0YWNoZWQgcmVjb3JkZXIgYnkgcGFzc2luZyBpdHMgd2VsbC1rbm93biBJRFxuICAgKiBleGVjdXRvci5hdHRhY2hSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ21ldHJpY3MnKSk7XG4gICAqXG4gICAqIC8vIEF0dGFjaGluZyB0d2ljZSB3aXRoIHNhbWUgSUQgcmVwbGFjZXMgKG5vIGRvdWJsZS1jb3VudGluZylcbiAgICogZXhlY3V0b3IuYXR0YWNoUmVjb3JkZXIobmV3IE1ldHJpY1JlY29yZGVyKCdteS1tZXRyaWNzJykpO1xuICAgKiBleGVjdXRvci5hdHRhY2hSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ215LW1ldHJpY3MnKSk7IC8vIHJlcGxhY2VzIHByZXZpb3VzXG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoUmVjb3JkZXIocmVjb3JkZXI6IFJlY29yZGVyKTogdm9pZCB7XG4gICAgLy8gUmVwbGFjZSBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgSUQgKGlkZW1wb3RlbnQg4oCUIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZylcbiAgICB0aGlzLnNjb3BlUmVjb3JkZXJzID0gdGhpcy5zY29wZVJlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IHJlY29yZGVyLmlkKTtcbiAgICB0aGlzLnNjb3BlUmVjb3JkZXJzLnB1c2gocmVjb3JkZXIpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIERldGFjaCAoVDQpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuICAvL1xuICAvLyBCYXJlLWV4ZWN1dG9yIGVudHJ5IHBvaW50IGZvciBmaXJlLWFuZC1mb3JnZXQgY2hpbGQgZmxvd2NoYXJ0IGV4ZWN1dGlvbi5cbiAgLy8gVXNlIGZyb20gb3V0c2lkZSBhbnkgY2hhcnQgKGNvbnN1bWVyIGNvZGUgdGhhdCB3YW50cyB0byBkZXRhY2ggd29ya1xuICAvLyB3aXRob3V0IGZpcnN0IHJ1bm5pbmcgYSBwYXJlbnQgY2hhcnQpLiBGb3IgZGV0YWNoIEZST00gSU5TSURFIGEgc3RhZ2UsXG4gIC8vIHVzZSBgc2NvcGUuJGRldGFjaEFuZEpvaW5MYXRlciguLi4pYCAvIGBzY29wZS4kZGV0YWNoQW5kRm9yZ2V0KC4uLilgIOKAlFxuICAvLyB0aG9zZSBtaW50IHJlZklkcyBmcm9tIHRoZSBjYWxsaW5nIHN0YWdlJ3MgcnVudGltZVN0YWdlSWQgZm9yIHRyYWNlXG4gIC8vIGNvcnJlbGF0aW9uOyB0aGUgYmFyZS1leGVjdXRvciBlbnRyaWVzIHVzZSBhIHN5bnRoZXRpYyBwcmVmaXhcbiAgLy8gKGBfX2V4ZWN1dG9yX19gKSBpbnN0ZWFkLlxuXG4gIC8qKlxuICAgKiBEZXRhY2ggYSBjaGlsZCBmbG93Y2hhcnQgb24gdGhlIGdpdmVuIGRyaXZlciBhbmQgcmV0dXJuIGEgYERldGFjaEhhbmRsZWBcbiAgICogdGhlIGNhbGxlciBjYW4gYHdhaXQoKWAgb24gKFByb21pc2UpIG9yIHJlYWQgYC5zdGF0dXNgIGZyb20gKHN5bmMpLlxuICAgKlxuICAgKiBUaGUgZHJpdmVyIGlzIGEgUkVRVUlSRUQgZmlyc3QgYXJndW1lbnQg4oCUIHRoZXJlIGlzIG5vIGxpYnJhcnktZGVmYXVsdCxcbiAgICogdG8ga2VlcCB0aGUgZW5naW5lIGZyZWUgb2YgZHJpdmVyIGltcG9ydHMgYW5kIHRvIG1ha2UgdGhlIGNob2ljZSBvZlxuICAgKiBzY2hlZHVsaW5nIGFsZ29yaXRobSBleHBsaWNpdCBhdCB0aGUgY2FsbCBzaXRlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGltcG9ydCB7IG1pY3JvdGFza0JhdGNoRHJpdmVyIH0gZnJvbSAnZm9vdHByaW50anMvZGV0YWNoJztcbiAgICpcbiAgICogY29uc3QgZXhlYyA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihwYXJlbnRDaGFydCk7XG4gICAqIGNvbnN0IGhhbmRsZSA9IGV4ZWMuZGV0YWNoQW5kSm9pbkxhdGVyKG1pY3JvdGFza0JhdGNoRHJpdmVyLCB0ZWxlbWV0cnlDaGFydCwgeyBldmVudDogJ3gnIH0pO1xuICAgKiBhd2FpdCBoYW5kbGUud2FpdCgpOyAvLyBvcHRpb25hbFxuICAgKiBgYGBcbiAgICovXG4gIGRldGFjaEFuZEpvaW5MYXRlcihcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaEhhbmRsZSB7XG4gICAgcmV0dXJuIF9kZXRhY2hBbmRKb2luTGF0ZXIoZHJpdmVyLCBjaGlsZCwgaW5wdXQsICdfX2V4ZWN1dG9yX18nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRhY2ggYSBjaGlsZCBmbG93Y2hhcnQgb24gdGhlIGdpdmVuIGRyaXZlciBhbmQgRElTQ0FSRCB0aGUgaGFuZGxlLlxuICAgKiBVc2UgZm9yIHRlbGVtZXRyeSBleHBvcnRzIC8gZmlyZS1hbmQtZm9yZ2V0IHNpZGUgZWZmZWN0cyB3aGVyZSB0aGVcbiAgICogY2FsbGVyIGRvZXNuJ3QgY2FyZSBhYm91dCB0aGUgcmVzdWx0LlxuICAgKlxuICAgKiBFcnJvcnMgcmFpc2VkIGJ5IHRoZSBjaGlsZCBzdGlsbCBsYW5kIG9uIHRoZSAoZGlzY2FyZGVkKSBoYW5kbGUg4oCUIHRoZXlcbiAgICogZ28gc2lsZW50IHVubGVzcyBzdXJmYWNlZCB0aHJvdWdoIGEgcmVjb3JkZXIuIEZvciBvYnNlcnZhYmxlIGRldGFjaCxcbiAgICogcHJlZmVyIGBkZXRhY2hBbmRKb2luTGF0ZXJgIGFuZCBzdXJmYWNlIGZhaWx1cmVzIHZpYSBgLndhaXQoKS5jYXRjaCgpYC5cbiAgICovXG4gIGRldGFjaEFuZEZvcmdldChcbiAgICBkcml2ZXI6IGltcG9ydCgnLi4vZGV0YWNoL3R5cGVzLmpzJykuRGV0YWNoRHJpdmVyLFxuICAgIGNoaWxkOiBpbXBvcnQoJy4uL2J1aWxkZXIvdHlwZXMuanMnKS5GbG93Q2hhcnQsXG4gICAgaW5wdXQ/OiB1bmtub3duLFxuICApOiB2b2lkIHtcbiAgICBfZGV0YWNoQW5kRm9yZ2V0KGRyaXZlciwgY2hpbGQsIGlucHV0LCAnX19leGVjdXRvcl9fJyk7XG4gIH1cblxuICAvKiogRGV0YWNoIGFsbCBzY29wZSBSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQuICovXG4gIGRldGFjaFJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNjb3BlUmVjb3JkZXJzID0gdGhpcy5zY29wZVJlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IGlkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgc2NvcGUgUmVjb3JkZXJzLiAqL1xuICBnZXRSZWNvcmRlcnMoKTogUmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLnNjb3BlUmVjb3JkZXJzXTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBGbG93UmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgRmxvd1JlY29yZGVyIHRvIG9ic2VydmUgY29udHJvbCBmbG93IGV2ZW50cy5cbiAgICogQXV0b21hdGljYWxseSBlbmFibGVzIG5hcnJhdGl2ZSBpZiBub3QgYWxyZWFkeSBlbmFibGVkLlxuICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgcnVuKCkg4oCUIHJlY29yZGVycyBhcmUgcGFzc2VkIHRvIHRoZSB0cmF2ZXJzZXIgYXQgY3JlYXRpb24gdGltZS5cbiAgICpcbiAgICogKipJZGVtcG90ZW50IGJ5IElEOioqIHJlcGxhY2VzIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBgaWRgLlxuICAgKi9cbiAgYXR0YWNoRmxvd1JlY29yZGVyKHJlY29yZGVyOiBGbG93UmVjb3JkZXIpOiB2b2lkIHtcbiAgICAvLyBSZXBsYWNlIGV4aXN0aW5nIHJlY29yZGVyIHdpdGggc2FtZSBJRCAoaWRlbXBvdGVudCDigJQgcHJldmVudHMgZG91YmxlLWNvdW50aW5nKVxuICAgIHRoaXMuZmxvd1JlY29yZGVycyA9IHRoaXMuZmxvd1JlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IHJlY29yZGVyLmlkKTtcbiAgICB0aGlzLmZsb3dSZWNvcmRlcnMucHVzaChyZWNvcmRlcik7XG4gICAgdGhpcy5uYXJyYXRpdmVFbmFibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYWxsIEZsb3dSZWNvcmRlcnMgd2l0aCB0aGUgZ2l2ZW4gSUQuICovXG4gIGRldGFjaEZsb3dSZWNvcmRlcihpZDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5mbG93UmVjb3JkZXJzID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbHRlcigocikgPT4gci5pZCAhPT0gaWQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCBGbG93UmVjb3JkZXJzLiAqL1xuICBnZXRGbG93UmVjb3JkZXJzKCk6IEZsb3dSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gWy4uLnRoaXMuZmxvd1JlY29yZGVyc107XG4gIH1cblxuICAvLyDilIDilIDilIAgQ29tYmluZWQgUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgcmVjb3JkZXIgdGhhdCBtYXkgb2JzZXJ2ZSBtdWx0aXBsZSBldmVudCBzdHJlYW1zIChzY29wZVxuICAgKiBkYXRhLWZsb3csIGNvbnRyb2wtZmxvdywgb3IgYm90aCkuIERldGVjdHMgYXQgcnVudGltZSB3aGljaCBzdHJlYW1zIHRoZVxuICAgKiByZWNvcmRlciBoYXMgbWV0aG9kcyBmb3IgYW5kIHJvdXRlcyBpdCB0byB0aGUgY29ycmVjdCBpbnRlcm5hbCBjaGFubmVscy5cbiAgICpcbiAgICogUHJlZmVycmVkIG92ZXIgY2FsbGluZyBgYXR0YWNoUmVjb3JkZXJgIGFuZCBgYXR0YWNoRmxvd1JlY29yZGVyYFxuICAgKiBzZXBhcmF0ZWx5LCBiZWNhdXNlIGZvcmdldHRpbmcgb25lIG9mIHRoZSB0d28gaXMgYSBzaWxlbnQgZm9vdC1ndW4g4oCUXG4gICAqIGhhbGYgeW91ciBldmVudHMgbmV2ZXIgZmlyZSBhbmQgdGhlcmUgaXMgbm8gcnVudGltZSB3YXJuaW5nLiBXaXRoXG4gICAqIGBhdHRhY2hDb21iaW5lZFJlY29yZGVyYCB0aGUgbGlicmFyeSBndWFyYW50ZWVzIHRoZSByZWNvcmRlcidzIGRlY2xhcmVkXG4gICAqIG1ldGhvZHMgYWxsIGZpcmUsIGFuZCBhZGRzIG5vIG92ZXJoZWFkIHZlcnN1cyB0d28gZXhwbGljaXQgY2FsbHMuXG4gICAqXG4gICAqICMjIElkZW1wb3RlbmN5XG4gICAqXG4gICAqIElkZW1wb3RlbnQgYnkgYGlkYCBhY3Jvc3MgQUxMIGNoYW5uZWxzIOKAlCByZS1hdHRhY2hpbmcgd2l0aCB0aGUgc2FtZSBgaWRgXG4gICAqIHJlcGxhY2VzIHRoZSBwcmV2aW91cyBpbnN0YW5jZSBldmVyeXdoZXJlIGl0IHdhcyByZWdpc3RlcmVkLiBNaXhpbmdcbiAgICogYGF0dGFjaENvbWJpbmVkUmVjb3JkZXIoeClgIHdpdGggYSBwcmlvciBgYXR0YWNoUmVjb3JkZXIoeSlgIG9yXG4gICAqIGBhdHRhY2hGbG93UmVjb3JkZXIoeSlgIHRoYXQgc2hhcmUgYHguaWQgPT09IHkuaWRgIGlzIGFsc28gc2FmZTogdGhlXG4gICAqIGNvbWJpbmVkIGF0dGFjaCByZXBsYWNlcyB0aGUgc2luZ2xlLWNoYW5uZWwgcmVnaXN0cmF0aW9uIG9uIHdoaWNoZXZlclxuICAgKiBjaGFubmVsKHMpIGB4YCBoYXMgbWV0aG9kcyBmb3IuIE5vIGR1cGxpY2F0ZSBmaXJpbmdzIG9jY3VyLlxuICAgKlxuICAgKiAjIyBOYXJyYXRpdmUgYWN0aXZhdGlvblxuICAgKlxuICAgKiBJZiB0aGUgcmVjb3JkZXIgaGFzIGFueSBjb250cm9sLWZsb3cgbWV0aG9kcywgYGVuYWJsZU5hcnJhdGl2ZSgpYCBpc1xuICAgKiBjYWxsZWQgYXMgYSBzaWRlIGVmZmVjdCAodGhlIG5hcnJhdGl2ZSBzdWJzeXN0ZW0gaXMgcmVxdWlyZWQgdG8gZW1pdFxuICAgKiBjb250cm9sLWZsb3cgZXZlbnRzKS4gRGF0YS1mbG93LW9ubHkgcmVjb3JkZXJzIGRvIE5PVCBhY3RpdmF0ZSB0aGVcbiAgICogbmFycmF0aXZlLlxuICAgKlxuICAgKiAjIyBEZXRlY3Rpb24gcnVsZVxuICAgKlxuICAgKiBPbmx5ICoqb3duKiogZXZlbnQgbWV0aG9kcyBjb3VudCAoc2VlIGBoYXNSZWNvcmRlck1ldGhvZHNgKS4gTWV0aG9kc1xuICAgKiBpbmhlcml0ZWQgdmlhIHRoZSBwcm90b3R5cGUgY2hhaW4gYXJlIGlnbm9yZWQg4oCUIHRoaXMgcHJvdGVjdHMgYWdhaW5zdFxuICAgKiBhY2NpZGVudGFsIGBPYmplY3QucHJvdG90eXBlYCBwb2xsdXRpb24gYXR0YWNoaW5nIGhhbmRsZXJzIHlvdSBuZXZlclxuICAgKiBkZWNsYXJlZC4gQSByZWNvcmRlciB0aGF0IHByb3ZpZGVzIG9ubHkgYGNsZWFyYC9gdG9TbmFwc2hvdGAgaXMgYVxuICAgKiBuby1vcCBhbmQgZW1pdHMgYSBkZXYtbW9kZSB3YXJuaW5nIHRvIHN1cmZhY2UgdGhlIGxpa2VseSBtaXN0YWtlLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGF1ZGl0OiBDb21iaW5lZFJlY29yZGVyID0ge1xuICAgKiAgIGlkOiAnYXVkaXQnLFxuICAgKiAgIG9uV3JpdGU6IChlKSA9PiBsb2coJ3Njb3BlIHdyaXRlJywgZS5rZXkpLFxuICAgKiAgIG9uRGVjaXNpb246IChlKSA9PiBsb2coJ3JvdXRlZCB0bycsIGUuY2hvc2VuKSxcbiAgICogfTtcbiAgICogZXhlY3V0b3IuYXR0YWNoQ29tYmluZWRSZWNvcmRlcihhdWRpdCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoQ29tYmluZWRSZWNvcmRlcihyZWNvcmRlcjogQ29tYmluZWRSZWNvcmRlcik6IHZvaWQge1xuICAgIGNvbnN0IGhhc0RhdGEgPSBoYXNSZWNvcmRlck1ldGhvZHMocmVjb3JkZXIpO1xuICAgIGNvbnN0IGhhc0Zsb3cgPSBoYXNGbG93UmVjb3JkZXJNZXRob2RzKHJlY29yZGVyKTtcbiAgICBjb25zdCBoYXNFbWl0ID0gaGFzRW1pdFJlY29yZGVyTWV0aG9kcyhyZWNvcmRlcik7XG5cbiAgICAvLyBFbWl0IHJlY29yZGVycyBsaXZlIG9uIHRoZSBTQU1FIGNoYW5uZWwgYXMgZGF0YS1mbG93IHJlY29yZGVyc1xuICAgIC8vIChTY29wZUZhY2FkZSBpdGVyYXRlcyBgX3JlY29yZGVyc2AgZm9yIG9uRW1pdCBkaXNwYXRjaCkuIFNvXG4gICAgLy8gYXR0YWNoRW1pdFJlY29yZGVyIGludGVybmFsbHkgY2FsbHMgYXR0YWNoUmVjb3JkZXIg4oCUIGJ1dCB3ZSB3YW50IHRvXG4gICAgLy8gYXZvaWQgZG91YmxlLWF0dGFjaCB3aGVuIHRoZSByZWNvcmRlciBpbXBsZW1lbnRzIEJPVEggb25FbWl0IEFORFxuICAgIC8vIG90aGVyIFJlY29yZGVyIG1ldGhvZHMuIFNob3J0LWNpcmN1aXQ6IGlmIGhhc0RhdGEgT1IgaGFzRW1pdCwgdGhlXG4gICAgLy8gcmVjb3JkZXIgbGFuZHMgb24gdGhlIHNjb3BlLXJlY29yZGVyIGxpc3QgZXhhY3RseSBvbmNlLlxuICAgIGlmIChoYXNEYXRhIHx8IGhhc0VtaXQpIHRoaXMuYXR0YWNoUmVjb3JkZXIocmVjb3JkZXIgYXMgUmVjb3JkZXIpO1xuICAgIGlmIChoYXNGbG93KSB0aGlzLmF0dGFjaEZsb3dSZWNvcmRlcihyZWNvcmRlciBhcyBGbG93UmVjb3JkZXIpO1xuXG4gICAgaWYgKCFoYXNEYXRhICYmICFoYXNGbG93ICYmICFoYXNFbWl0ICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICAvLyBEZXYtbW9kZSBvbmx5OiBzaWxlbnQgc2tpcHMgYXJlIGludmlzaWJsZSBhbmQgcHJvZHVjZSBoYXJkLXRvLWRlYnVnXG4gICAgICAvLyBcIndoeSBkaWRuJ3QgbXkgcmVjb3JkZXIgZmlyZVwiIHJlcG9ydHMuIFBlciBsaWJyYXJ5IGNvbnZlbnRpb24sIGdhdGVkXG4gICAgICAvLyBvbiB0aGUgY2VudHJhbCBpc0Rldk1vZGUoKSBmbGFnIChub3QgcHJvY2Vzcy5lbnYpIHNvIGNvbnN1bWVycyBjYW5cbiAgICAgIC8vIGNvbnRyb2wgZGV2IHRvb2xpbmcgY2VudHJhbGx5IHZpYSBlbmFibGVEZXZNb2RlKCkvZGlzYWJsZURldk1vZGUoKS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZm9vdHByaW50anNdIGF0dGFjaENvbWJpbmVkUmVjb3JkZXI6IHJlY29yZGVyICcke3JlY29yZGVyLmlkfScgaGFzIGAgK1xuICAgICAgICAgICdubyBvYnNlcnZlciBldmVudCBtZXRob2RzIOKAlCBub3RoaW5nIHRvIGF0dGFjaC4gRGlkIHlvdSBmb3JnZXQgdG8gJyArXG4gICAgICAgICAgJ2FkZCBhbiBvbiogaGFuZGxlciAob25Xcml0ZSwgb25EZWNpc2lvbiwgb25TdWJmbG93RW50cnksIC4uLik/ICcgK1xuICAgICAgICAgICdOb3RlOiBvbmx5IE9XTiBwcm9wZXJ0aWVzIGNvdW50OyBtZXRob2RzIG9uIHRoZSBwcm90b3R5cGUgY2hhaW4gJyArXG4gICAgICAgICAgJ2FyZSBpZ25vcmVkIG9uIHB1cnBvc2UuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGFjaCBhIGNvbWJpbmVkIHJlY29yZGVyIGZyb20gYWxsIGNoYW5uZWxzIGl0IHdhcyBhdHRhY2hlZCB0by5cbiAgICogU2FmZSB0byBjYWxsIGlmIHRoZSByZWNvcmRlciB3YXMgb25seSBvbiBvbmUgY2hhbm5lbCBvciBuZXZlciBhdHRhY2hlZC5cbiAgICovXG4gIGRldGFjaENvbWJpbmVkUmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWNoUmVjb3JkZXIoaWQpO1xuICAgIHRoaXMuZGV0YWNoRmxvd1JlY29yZGVyKGlkKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBFbWl0IFJlY29yZGVyIE1hbmFnZW1lbnQgKFBoYXNlIDMpIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYW4gYEVtaXRSZWNvcmRlcmAg4oCUIGFuIG9ic2VydmVyIGZvciBjb25zdW1lci1lbWl0dGVkIHN0cnVjdHVyZWRcbiAgICogZXZlbnRzIGZpcmVkIHZpYSBgc2NvcGUuJGVtaXQobmFtZSwgcGF5bG9hZClgLlxuICAgKlxuICAgKiBJbnRlcm5hbGx5LCBlbWl0IHJlY29yZGVycyBzaGFyZSB0aGUgc2NvcGUtcmVjb3JkZXIgY2hhbm5lbCBiZWNhdXNlXG4gICAqIGVtaXQgZXZlbnRzIGZpcmUgZnJvbSBpbnNpZGUgYFNjb3BlRmFjYWRlYCBkdXJpbmcgc3RhZ2UgZXhlY3V0aW9uLFxuICAgKiBzYW1lIHRpbWluZyBhcyBgb25SZWFkYC9gb25Xcml0ZWAuIFRoaXMgbWV0aG9kIGlzIGEgY29udmVuaWVuY2UgdGhhdFxuICAgKiBkZWxlZ2F0ZXMgdG8gYGF0dGFjaFJlY29yZGVyYCDigJQgY29uc3VtZXJzIGNhbiBhbHNvIHVzZVxuICAgKiBgYXR0YWNoUmVjb3JkZXJgIGRpcmVjdGx5IGZvciBhIHJlY29yZGVyIHRoYXQgaW1wbGVtZW50cyBCT1RIXG4gICAqIGBvbldyaXRlYCBhbmQgYG9uRW1pdGAuIEVpdGhlciBhcHByb2FjaCBwbGFjZXMgdGhlIHJlY29yZGVyIG9uIHRoZVxuICAgKiBzYW1lIHVuZGVybHlpbmcgbGlzdCwgc28gYG9uRW1pdGAgZmlyZXMgZXhhY3RseSBvbmNlIHBlciBldmVudC5cbiAgICpcbiAgICogKipJZGVtcG90ZW50IGJ5IGBpZGA6KiogcmVwbGFjZXMgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIGBpZGAuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogZXhlY3V0b3IuYXR0YWNoRW1pdFJlY29yZGVyKHtcbiAgICogICBpZDogJ3Rva2VuLW1ldGVyJyxcbiAgICogICBvbkVtaXQ6IChlKSA9PiB7XG4gICAqICAgICBpZiAoZS5uYW1lID09PSAnYWdlbnRmb290cHJpbnQubGxtLnRva2VucycpIHRyYWNrVG9rZW5zKGUucGF5bG9hZCk7XG4gICAqICAgfSxcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoRW1pdFJlY29yZGVyKHJlY29yZGVyOiBFbWl0UmVjb3JkZXIpOiB2b2lkIHtcbiAgICB0aGlzLmF0dGFjaFJlY29yZGVyKHJlY29yZGVyIGFzIFJlY29yZGVyKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYW4gYEVtaXRSZWNvcmRlcmAgYnkgaWQuIFNhZmUgdG8gY2FsbCBpZiBuZXZlciBhdHRhY2hlZC4gKi9cbiAgZGV0YWNoRW1pdFJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaFJlY29yZGVyKGlkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgcmVjb3JkZXJzIGZpbHRlcmVkIHRvIHRob3NlIHRoYXRcbiAgICogaW1wbGVtZW50IGBvbkVtaXRgLiBVc2VmdWwgZm9yIGluc3BlY3Rpb24gZHVyaW5nIHRlc3RpbmcuXG4gICAqL1xuICBnZXRFbWl0UmVjb3JkZXJzKCk6IEVtaXRSZWNvcmRlcltdIHtcbiAgICByZXR1cm4gdGhpcy5zY29wZVJlY29yZGVycy5maWx0ZXIoXG4gICAgICAocik6IHIgaXMgRW1pdFJlY29yZGVyID0+IHR5cGVvZiAociBhcyB7IG9uRW1pdD86IHVua25vd24gfSkub25FbWl0ID09PSAnZnVuY3Rpb24nLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBzdHJ1Y3R1cmVkIG5hcnJhdGl2ZSBlbnRyaWVzIOKAlCB0aGUgc2luZ2xlIHB1YmxpYyBuYXJyYXRpdmUgQVBJLlxuICAgKiBFYWNoIGVudHJ5IGhhcyBhIHR5cGUgKHN0YWdlLCBzdGVwLCBjb25kaXRpb24sIGZvcmssIGV0Yy4pLCB0ZXh0LCBhbmRcbiAgICogZGVwdGguIENvbnN1bWVycyByZW5kZXIgaG93ZXZlciB0aGV5IHdhbnQ7IGNhbGwgYC5tYXAoZSA9PiBlLnRleHQpYFxuICAgKiBpZiBhIGZsYXQgYHN0cmluZ1tdYCBpcyBuZWVkZWQgbG9jYWxseS5cbiAgICovXG4gIGdldE5hcnJhdGl2ZUVudHJpZXMoKTogQ29tYmluZWROYXJyYXRpdmVFbnRyeVtdIHtcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21iaW5lZFJlY29yZGVyLmdldEVudHJpZXMoKTtcbiAgICB9XG4gICAgY29uc3QgZmxvd1NlbnRlbmNlcyA9IHRoaXMudHJhdmVyc2VyLmdldE5hcnJhdGl2ZSgpO1xuICAgIHJldHVybiBmbG93U2VudGVuY2VzLm1hcCgodGV4dCkgPT4gKHsgdHlwZTogJ3N0YWdlJyBhcyBjb25zdCwgdGV4dCwgZGVwdGg6IDAgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNvbWJpbmVkIEZsb3dSZWNvcmRlcnMgbGlzdC4gV2hlbiBuYXJyYXRpdmUgaXMgZW5hYmxlZCxcbiAgICogaW5jbHVkZXMgdGhlIENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgKHdoaWNoIGJ1aWxkcyBtZXJnZWQgZmxvdytkYXRhXG4gICAqIGVudHJpZXMgaW5saW5lKS4gUGx1cyBhbnkgdXNlci1hdHRhY2hlZCByZWNvcmRlcnMuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkRmxvd1JlY29yZGVyc0xpc3QoKTogRmxvd1JlY29yZGVyW10gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVyczogRmxvd1JlY29yZGVyW10gPSBbXTtcbiAgICBpZiAodGhpcy5jb21iaW5lZFJlY29yZGVyKSB7XG4gICAgICByZWNvcmRlcnMucHVzaCh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpO1xuICAgIH1cbiAgICByZWNvcmRlcnMucHVzaCguLi50aGlzLmZsb3dSZWNvcmRlcnMpO1xuICAgIHJldHVybiByZWNvcmRlcnMubGVuZ3RoID4gMCA/IHJlY29yZGVycyA6IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGFzeW5jIHJ1bihvcHRpb25zPzogUnVuT3B0aW9ucyk6IFByb21pc2U8RXhlY3V0b3JSZXN1bHQ+IHtcbiAgICBsZXQgc2lnbmFsID0gb3B0aW9ucz8uc2lnbmFsO1xuICAgIGxldCB0aW1lb3V0SWQ6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuXG4gICAgLy8gQ3JlYXRlIGFuIGludGVybmFsIEFib3J0Q29udHJvbGxlciBmb3IgdGltZW91dE1zXG4gICAgaWYgKG9wdGlvbnM/LnRpbWVvdXRNcyAmJiAhc2lnbmFsKSB7XG4gICAgICBjb25zdCBjb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICAgICAgc2lnbmFsID0gY29udHJvbGxlci5zaWduYWw7XG4gICAgICB0aW1lb3V0SWQgPSBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiBjb250cm9sbGVyLmFib3J0KG5ldyBFcnJvcihgRXhlY3V0aW9uIHRpbWVkIG91dCBhZnRlciAke29wdGlvbnMudGltZW91dE1zfW1zYCkpLFxuICAgICAgICBvcHRpb25zLnRpbWVvdXRNcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gVmFsaWRhdGUgaW5wdXQgYWdhaW5zdCBpbnB1dFNjaGVtYSBpZiBib3RoIGFyZSBwcmVzZW50XG4gICAgbGV0IHZhbGlkYXRlZElucHV0ID0gb3B0aW9ucz8uaW5wdXQ7XG4gICAgaWYgKHZhbGlkYXRlZElucHV0ICYmIHRoaXMuZmxvd0NoYXJ0QXJncy5mbG93Q2hhcnQuaW5wdXRTY2hlbWEpIHtcbiAgICAgIHZhbGlkYXRlZElucHV0ID0gdmFsaWRhdGVJbnB1dCh0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmlucHV0U2NoZW1hLCB2YWxpZGF0ZWRJbnB1dCk7XG4gICAgfVxuXG4gICAgLy8gVXNlci1hdHRhY2hlZCByZWNvcmRlcnMgKGZsb3dSZWNvcmRlcnMgKyBzY29wZVJlY29yZGVycykgYXJlIGNsZWFyZWQgdmlhIGNsZWFyKCkgdG8gcHJldmVudFxuICAgIC8vIGNyb3NzLXJ1biBhY2N1bXVsYXRpb24uIFRoZSBjb21iaW5lZFJlY29yZGVyIGlzIE5PVCBjbGVhcmVkIGhlcmUg4oCUIGNyZWF0ZVRyYXZlcnNlcigpIGFsd2F5c1xuICAgIC8vIGNyZWF0ZXMgYSBmcmVzaCBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIGluc3RhbmNlIG9uIGVhY2ggcnVuLCBzbyBzdGFsZSBzdGF0ZSBpcyBuZXZlciBhbiBpc3N1ZS5cbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5mbG93UmVjb3JkZXJzKSB7XG4gICAgICByLmNsZWFyPy4oKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGVSZWNvcmRlcnMpIHtcbiAgICAgIHIuY2xlYXI/LigpO1xuICAgIH1cblxuICAgIHRoaXMubGFzdENoZWNrcG9pbnQgPSB1bmRlZmluZWQ7XG4gICAgdGhpcy5fZXhlY3V0aW9uQ291bnRlciA9IHsgdmFsdWU6IDAgfTsgLy8gUmVzZXQgY291bnRlciBvbiBmcmVzaCBydW5cbiAgICB0aGlzLl9oYXNSdW5CZWZvcmUgPSB0cnVlOyAvLyBtYXJrIHNvIGEgbGF0ZXIgcmVzdW1lKCkgdGFrZXMgdGhlXG4gICAgLy8gc2FtZS1leGVjdXRvciBicmFuY2ggKHJldXNlIHJ1bnRpbWUsIGFjY3VtdWxhdGUgZXhlY3V0aW9uIHRyZWUpLlxuICAgIHRoaXMudHJhdmVyc2VyID0gdGhpcy5jcmVhdGVUcmF2ZXJzZXIoc2lnbmFsLCB2YWxpZGF0ZWRJbnB1dCwgb3B0aW9ucz8uZW52LCBvcHRpb25zPy5tYXhEZXB0aCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRyYXZlcnNlci5leGVjdXRlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICAvLyBCdWlsZCBjaGVja3BvaW50IGZyb20gY3VycmVudCBleGVjdXRpb24gc3RhdGVcbiAgICAgICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnRyYXZlcnNlci5nZXRTbmFwc2hvdCgpO1xuICAgICAgICBjb25zdCBzZlJlc3VsdHMgPSB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICAgICAgICAvLyBTdWJmbG93IHNjb3BlIGNhcHR1cmUgc3Vydml2ZXMgT05MWSBvbiB0aGUgc2lnbmFsIOKAlCB0aGVcbiAgICAgICAgLy8gbmVzdGVkIHJ1bnRpbWVzIGFyZSBHQydkIGFzIHRoZSBzdGFjayB1bndpbmRzLiBQcm9tb3RlIHRvXG4gICAgICAgIC8vIHRoZSBjaGVja3BvaW50IGhlcmUgc28gY3Jvc3MtZXhlY3V0b3IgcmVzdW1lIGNhbiByZXN0b3JlXG4gICAgICAgIC8vIHByZS1wYXVzZSBzdWJmbG93IHNjb3BlIChlLmcuIGFuIEFnZW50J3MgYHNjb3BlLmhpc3RvcnlgKS5cbiAgICAgICAgLy8gRW1wdHkgYHt9YCBmb3Igcm9vdC1sZXZlbCBwYXVzZXMgKG5vIHN1YmZsb3dzIGVudGVyZWQpLlxuICAgICAgICB0aGlzLmxhc3RDaGVja3BvaW50ID0ge1xuICAgICAgICAgIHNoYXJlZFN0YXRlOiBzbmFwc2hvdC5zaGFyZWRTdGF0ZSxcbiAgICAgICAgICBleGVjdXRpb25UcmVlOiBzbmFwc2hvdC5leGVjdXRpb25UcmVlLFxuICAgICAgICAgIHBhdXNlZFN0YWdlSWQ6IGVycm9yLnN0YWdlSWQsXG4gICAgICAgICAgc3ViZmxvd1BhdGg6IGVycm9yLnN1YmZsb3dQYXRoLFxuICAgICAgICAgIHBhdXNlRGF0YTogZXJyb3IucGF1c2VEYXRhLFxuICAgICAgICAgIHN1YmZsb3dTdGF0ZXM6IGVycm9yLnN1YmZsb3dTdGF0ZXMsXG4gICAgICAgICAgLi4uKHNmUmVzdWx0cy5zaXplID4gMCAmJiB7IHN1YmZsb3dSZXN1bHRzOiBPYmplY3QuZnJvbUVudHJpZXMoc2ZSZXN1bHRzKSB9KSxcbiAgICAgICAgICAvLyBJbnZva2VyIGNvbnRleHQg4oCUIGNvbGxlY3RlZCBkdXJpbmcgdHJhdmVyc2FsIGJ1YmJsZS11cCAobm90IHRyZWUtd2Fsa2VkKVxuICAgICAgICAgIC4uLihlcnJvci5pbnZva2VyU3RhZ2VJZCAmJiB7IGludm9rZXJTdGFnZUlkOiBlcnJvci5pbnZva2VyU3RhZ2VJZCB9KSxcbiAgICAgICAgICAuLi4oZXJyb3IuY29udGludWF0aW9uU3RhZ2VJZCAmJiB7IGNvbnRpbnVhdGlvblN0YWdlSWQ6IGVycm9yLmNvbnRpbnVhdGlvblN0YWdlSWQgfSksXG4gICAgICAgICAgcGF1c2VkQXQ6IERhdGUubm93KCksXG4gICAgICAgIH07XG4gICAgICAgIC8vIFJldHVybiBhIFBhdXNlUmVzdWx0LXNoYXBlZCB2YWx1ZSBzbyBjYWxsZXJzIGNhbiBjaGVjayB3aXRob3V0IHRyeS9jYXRjaFxuICAgICAgICByZXR1cm4geyBwYXVzZWQ6IHRydWUsIGNoZWNrcG9pbnQ6IHRoaXMubGFzdENoZWNrcG9pbnQgfSBzYXRpc2ZpZXMgUGF1c2VkUmVzdWx0O1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGlmICh0aW1lb3V0SWQgIT09IHVuZGVmaW5lZCkgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7XG4gICAgfVxuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEludHJvc3BlY3Rpb24g4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHJ1bnRpbWUgc25hcHNob3QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zLnJlZGFjdCAgV2hlbiBgdHJ1ZWAsIGBzaGFyZWRTdGF0ZWAgY29tZXMgZnJvbSB0aGUgcGFyYWxsZWxcbiAgICogICByZWRhY3RlZCBtaXJyb3IgKGlmIG1haW50YWluZWQg4oCUIHNlZSBgc2V0UmVkYWN0aW9uUG9saWN5YCkuIFRoaXMgaXNcbiAgICogICB0aGUgc2FmZSB2aWV3IGZvciBleHBvcnRpbmcgdHJhY2VzIGV4dGVybmFsbHkgKHBhc3RlIGludG8gYSB2aWV3ZXIsXG4gICAqICAgc2hhcmUgd2l0aCBzdXBwb3J0KS4gV2hlbiBubyByZWRhY3Rpb24gcG9saWN5IGlzIGNvbmZpZ3VyZWQgdGhlXG4gICAqICAgcmVkYWN0ZWQgbWlycm9yIGlzIG5vdCBtYWludGFpbmVkLCBzbyB0aGlzIGZsYWcgaXMgYSBuby1vcCDigJRcbiAgICogICBgc2hhcmVkU3RhdGVgIGlzIHRoZSByYXcgd29ya2luZyBtZW1vcnkgZWl0aGVyIHdheS4gRGVmYXVsdCBgZmFsc2VgLlxuICAgKlxuICAgKiAgIFRoZSBjb21taXQgbG9nIGlzIGFscmVhZHkgcmVkYWN0ZWQgYXQgd3JpdGUtdGltZSByZWdhcmRsZXNzIG9mIHRoaXNcbiAgICogICBmbGFnLCBhbmQgdGhlIGV4ZWN1dGlvbiB0cmVlIGNhcnJpZXMgb25seSBzdHJ1Y3R1cmFsIG1ldGFkYXRhLlxuICAgKi9cbiAgZ2V0U25hcHNob3Qob3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9KTogUnVudGltZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMudHJhdmVyc2VyLmdldFNuYXBzaG90KG9wdGlvbnMpIGFzIFJ1bnRpbWVTbmFwc2hvdDtcbiAgICBjb25zdCBzZlJlc3VsdHMgPSB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICAgIGlmIChzZlJlc3VsdHMuc2l6ZSA+IDApIHtcbiAgICAgIHNuYXBzaG90LnN1YmZsb3dSZXN1bHRzID0gT2JqZWN0LmZyb21FbnRyaWVzKHNmUmVzdWx0cyk7XG4gICAgfVxuXG4gICAgLy8gQ29sbGVjdCBzbmFwc2hvdCBkYXRhIGZyb20gcmVjb3JkZXJzIHRoYXQgaW1wbGVtZW50IHRvU25hcHNob3QoKVxuICAgIGNvbnN0IHJlY29yZGVyU25hcHNob3RzOiBSZWNvcmRlclNuYXBzaG90W10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5zY29wZVJlY29yZGVycykge1xuICAgICAgaWYgKHIudG9TbmFwc2hvdCkge1xuICAgICAgICBjb25zdCBzbmFwID0gci50b1NuYXBzaG90KCk7XG4gICAgICAgIHJlY29yZGVyU25hcHNob3RzLnB1c2goe1xuICAgICAgICAgIGlkOiByLmlkLFxuICAgICAgICAgIG5hbWU6IHNuYXAubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogc25hcC5kZXNjcmlwdGlvbixcbiAgICAgICAgICBwcmVmZXJyZWRPcGVyYXRpb246IHNuYXAucHJlZmVycmVkT3BlcmF0aW9uLFxuICAgICAgICAgIGRhdGE6IHNuYXAuZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmZsb3dSZWNvcmRlcnMpIHtcbiAgICAgIGlmIChyLnRvU25hcHNob3QpIHtcbiAgICAgICAgY29uc3Qgc25hcCA9IHIudG9TbmFwc2hvdCgpO1xuICAgICAgICByZWNvcmRlclNuYXBzaG90cy5wdXNoKHtcbiAgICAgICAgICBpZDogci5pZCxcbiAgICAgICAgICBuYW1lOiBzbmFwLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHNuYXAuZGVzY3JpcHRpb24sXG4gICAgICAgICAgcHJlZmVycmVkT3BlcmF0aW9uOiBzbmFwLnByZWZlcnJlZE9wZXJhdGlvbixcbiAgICAgICAgICBkYXRhOiBzbmFwLmRhdGEsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAocmVjb3JkZXJTbmFwc2hvdHMubGVuZ3RoID4gMCkge1xuICAgICAgc25hcHNob3QucmVjb3JkZXJzID0gcmVjb3JkZXJTbmFwc2hvdHM7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNuYXBzaG90O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lKCkge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHNldFJvb3RPYmplY3QocGF0aDogc3RyaW5nW10sIGtleTogc3RyaW5nLCB2YWx1ZTogdW5rbm93bik6IHZvaWQge1xuICAgIHRoaXMudHJhdmVyc2VyLnNldFJvb3RPYmplY3QocGF0aCwga2V5LCB2YWx1ZSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEJyYW5jaElkcygpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0QnJhbmNoSWRzKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWVSb290KCk6IFN0YWdlTm9kZSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWVSb290KCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTogU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZVN0cnVjdHVyZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRTdWJmbG93UmVzdWx0cygpOiBNYXA8c3RyaW5nLCBTdWJmbG93UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldEV4dHJhY3RlZFJlc3VsdHM8VFJlc3VsdCA9IHVua25vd24+KCk6IE1hcDxzdHJpbmcsIFRSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0RXh0cmFjdGVkUmVzdWx0czxUUmVzdWx0PigpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRFeHRyYWN0b3JFcnJvcnMoKTogRXh0cmFjdG9yRXJyb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldEV4dHJhY3RvckVycm9ycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN1YmZsb3cgbWFuaWZlc3QgZnJvbSBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlci5cbiAgICogUmV0dXJucyBlbXB0eSBhcnJheSBpZiBubyBNYW5pZmVzdEZsb3dSZWNvcmRlciBpcyBhdHRhY2hlZC5cbiAgICovXG4gIGdldFN1YmZsb3dNYW5pZmVzdCgpOiBNYW5pZmVzdEVudHJ5W10ge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbmQoKHIpID0+IHIgaW5zdGFuY2VvZiBNYW5pZmVzdEZsb3dSZWNvcmRlcikgYXNcbiAgICAgIHwgTWFuaWZlc3RGbG93UmVjb3JkZXJcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWNvcmRlcj8uZ2V0TWFuaWZlc3QoKSA/PyBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmdWxsIHNwZWMgZm9yIGEgZHluYW1pY2FsbHktcmVnaXN0ZXJlZCBzdWJmbG93LlxuICAgKiBSZXF1aXJlcyBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlciB0aGF0IG9ic2VydmVkIHRoZSByZWdpc3RyYXRpb24uXG4gICAqL1xuICBnZXRTdWJmbG93U3BlYyhzdWJmbG93SWQ6IHN0cmluZyk6IHVua25vd24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbmQoKHIpID0+IHIgaW5zdGFuY2VvZiBNYW5pZmVzdEZsb3dSZWNvcmRlcikgYXNcbiAgICAgIHwgTWFuaWZlc3RGbG93UmVjb3JkZXJcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWNvcmRlcj8uZ2V0U3BlYyhzdWJmbG93SWQpO1xuICB9XG59XG4iXX0=
|