footprintjs 8.3.0 → 9.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/advanced.js +1 -1
  2. package/dist/esm/advanced.js +1 -1
  3. package/dist/esm/index.js +1 -1
  4. package/dist/esm/lib/engine/handlers/ContinuationResolver.js +44 -45
  5. package/dist/esm/lib/engine/handlers/DeciderHandler.js +37 -14
  6. package/dist/esm/lib/engine/handlers/SubflowExecutor.js +14 -1
  7. package/dist/esm/lib/engine/traversal/FlowchartTraverser.js +468 -315
  8. package/dist/esm/lib/engine/types.js +1 -1
  9. package/dist/esm/lib/memory/StageContext.js +211 -21
  10. package/dist/esm/lib/memory/index.js +2 -1
  11. package/dist/esm/lib/memory/types.js +3 -2
  12. package/dist/esm/lib/runner/ExecutionRuntime.js +12 -1
  13. package/dist/esm/lib/runner/FlowChartExecutor.js +29 -7
  14. package/dist/esm/lib/scope/ScopeFacade.js +24 -1
  15. package/dist/index.js +1 -1
  16. package/dist/lib/engine/handlers/ContinuationResolver.js +44 -45
  17. package/dist/lib/engine/handlers/DeciderHandler.js +37 -14
  18. package/dist/lib/engine/handlers/SubflowExecutor.js +14 -1
  19. package/dist/lib/engine/traversal/FlowchartTraverser.js +468 -315
  20. package/dist/lib/engine/types.js +1 -1
  21. package/dist/lib/memory/StageContext.js +211 -21
  22. package/dist/lib/memory/index.js +4 -2
  23. package/dist/lib/memory/types.js +4 -1
  24. package/dist/lib/runner/ExecutionRuntime.js +12 -1
  25. package/dist/lib/runner/FlowChartExecutor.js +29 -7
  26. package/dist/lib/scope/ScopeFacade.js +24 -1
  27. package/dist/types/advanced.d.ts +1 -1
  28. package/dist/types/index.d.ts +10 -0
  29. package/dist/types/lib/engine/handlers/ContinuationResolver.d.ts +36 -9
  30. package/dist/types/lib/engine/handlers/DeciderHandler.d.ts +32 -0
  31. package/dist/types/lib/engine/traversal/FlowchartTraverser.d.ts +91 -23
  32. package/dist/types/lib/engine/types.d.ts +15 -3
  33. package/dist/types/lib/memory/StageContext.d.ts +106 -5
  34. package/dist/types/lib/memory/index.d.ts +2 -1
  35. package/dist/types/lib/memory/types.d.ts +45 -1
  36. package/dist/types/lib/runner/ExecutionRuntime.d.ts +10 -1
  37. package/dist/types/lib/runner/FlowChartExecutor.d.ts +26 -4
  38. package/dist/types/lib/scope/ScopeFacade.d.ts +24 -1
  39. package/package.json +1 -1
@@ -105,6 +105,7 @@ export class FlowChartExecutor {
105
105
  let throttlingErrorChecker;
106
106
  let streamHandlers;
107
107
  let scopeProtectionMode;
108
+ let readTracking;
108
109
  if (typeof factoryOrOptions === 'function') {
109
110
  // 2-param form: new FlowChartExecutor(chart, scopeFactory)
110
111
  scopeFactory = factoryOrOptions;
@@ -119,6 +120,7 @@ export class FlowChartExecutor {
119
120
  throttlingErrorChecker = opts.throttlingErrorChecker;
120
121
  streamHandlers = opts.streamHandlers;
121
122
  scopeProtectionMode = opts.scopeProtectionMode;
123
+ readTracking = opts.readTracking;
122
124
  }
123
125
  this.flowChartArgs = {
124
126
  flowChart,
@@ -129,10 +131,11 @@ export class FlowChartExecutor {
129
131
  throttlingErrorChecker,
130
132
  streamHandlers,
131
133
  scopeProtectionMode,
134
+ readTracking,
132
135
  };
133
136
  this.traverser = this.createTraverser();
134
137
  }
135
- createTraverser(signal, readOnlyContextOverride, env, maxDepth, overrides) {
138
+ createTraverser(signal, readOnlyContextOverride, env, maxDepth, maxIterations, overrides) {
136
139
  const args = this.flowChartArgs;
137
140
  const fc = args.flowChart;
138
141
  const narrativeFlag = this.narrativeEnabled || (fc.enableNarrative ?? false);
@@ -228,6 +231,14 @@ export class FlowChartExecutor {
228
231
  if (this.redactionPolicy) {
229
232
  runtime.enableRedactedMirror();
230
233
  }
234
+ // Read-tracking policy (#14): set on the runtime's root context so every
235
+ // descendant context (createNext/createChild) and subflow root inherits.
236
+ // Applied AFTER the resume-path root swap above so the continuation root
237
+ // carries the policy too. Skipped for the default 'full' — zero work.
238
+ const readTracking = args.readTracking;
239
+ if (readTracking !== undefined && readTracking !== 'full') {
240
+ runtime.useReadTracking(readTracking);
241
+ }
231
242
  return new FlowchartTraverser({
232
243
  root: effectiveRoot,
233
244
  stageMap: fc.stageMap,
@@ -251,6 +262,7 @@ export class FlowChartExecutor {
251
262
  subflowStatesForResume: overrides.subflowStatesForResume,
252
263
  }),
253
264
  ...(maxDepth !== undefined && { maxDepth }),
265
+ ...(maxIterations !== undefined && { maxIterations }),
254
266
  });
255
267
  }
256
268
  enableNarrative(options) {
@@ -265,6 +277,15 @@ export class FlowChartExecutor {
265
277
  setRedactionPolicy(policy) {
266
278
  this.redactionPolicy = policy;
267
279
  }
280
+ /**
281
+ * Set the read-tracking policy for `StageSnapshot.stageReads` (#14).
282
+ * Must be called before run(). Equivalent to the `readTracking`
283
+ * constructor option — see {@link FlowChartExecutorOptions.readTracking}
284
+ * for the mode semantics ('full' default / 'summary' / 'off').
285
+ */
286
+ setReadTracking(mode) {
287
+ this.flowChartArgs.readTracking = mode;
288
+ }
268
289
  /**
269
290
  * Returns a compliance-friendly report of all redaction activity from the
270
291
  * most recent run. Never includes actual values.
@@ -521,7 +542,7 @@ export class FlowChartExecutor {
521
542
  // seeds the fresh SharedMemory via `mergeContextWins`, which copies only
522
543
  // the TOP level — nested objects would alias the caller's checkpoint.
523
544
  const resumeInitialContext = structuredClone(checkpoint.sharedState);
524
- this.traverser = this.createTraverser(options?.signal, undefined, options?.env, options?.maxDepth, {
545
+ this.traverser = this.createTraverser(options?.signal, undefined, options?.env, options?.maxDepth, options?.maxIterations, {
525
546
  root: resumeRoot,
526
547
  initialContext: resumeInitialContext,
527
548
  preserveRecorders: true,
@@ -610,9 +631,10 @@ export class FlowChartExecutor {
610
631
  * on clone failure we sanitize the diagnostic bags (non-cloneable values
611
632
  * become '[non-serializable: …]' markers — the live engine bags are never
612
633
  * touched) and retry. If the retry STILL fails, the violation is in
613
- * consumer-owned data (realistically `pauseData` — a function in shared
614
- * state already rejects at stage entry when TransactionBuffer clones the
615
- * context) and we throw a DESCRIPTIVE contract error naming the offending
634
+ * consumer-owned data (realistically `pauseData` — a function can never
635
+ * reach shared state in the first place: TransactionBuffer clones every
636
+ * written value at write time, so the offending write already rejected)
637
+ * and we throw a DESCRIPTIVE contract error naming the offending
616
638
  * checkpoint field(s). A naked DataCloneError never escapes.
617
639
  *
618
640
  * Subflow scope capture (`subflowStates`) survives ONLY on the signal — the
@@ -1011,7 +1033,7 @@ export class FlowChartExecutor {
1011
1033
  this._currentRunId = generateRunId(); // Fresh runId per run() call
1012
1034
  this._hasRunBefore = true; // mark so a later resume() takes the
1013
1035
  // same-executor branch (reuse runtime, accumulate execution tree).
1014
- this.traverser = this.createTraverser(signal, validatedInput, options?.env, options?.maxDepth);
1036
+ this.traverser = this.createTraverser(signal, validatedInput, options?.env, options?.maxDepth, options?.maxIterations);
1015
1037
  // Set AFTER all sync validation throws (nothing above can leak the flag);
1016
1038
  // no await between the top-of-method check and here, so this is race-free.
1017
1039
  this._isExecuting = true;
@@ -1142,4 +1164,4 @@ export class FlowChartExecutor {
1142
1164
  return recorder?.getSpec(subflowId);
1143
1165
  }
1144
1166
  }
1145
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFHSCxPQUFPLEVBQUUsZUFBZSxJQUFJLGdCQUFnQixFQUFFLGtCQUFrQixJQUFJLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFcEgsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFHN0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFFN0YsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0UsT0FBTyxFQVVMLGFBQWEsR0FDZCxNQUFNLG9CQUFvQixDQUFDO0FBRzVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVySCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRWxFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRyxPQUFPLEVBQStDLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7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QUUsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsa0JBQWtCO1FBQ2hCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksb0JBQW9CLENBRXBFLENBQUM7UUFDZCxPQUFPLFFBQVEsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGNBQWMsQ0FBQyxTQUFpQjtRQUM5QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxZQUFZLG9CQUFvQixDQUVwRSxDQUFDO1FBQ2QsT0FBTyxRQUFRLEVBQUUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogRmxvd0NoYXJ0RXhlY3V0b3Ig4oCUIFB1YmxpYyBBUEkgZm9yIGV4ZWN1dGluZyBhIGNvbXBpbGVkIEZsb3dDaGFydC5cbiAqXG4gKiBXcmFwcyBGbG93Y2hhcnRUcmF2ZXJzZXIuIEJ1aWxkIGEgY2hhcnQgd2l0aCBmbG93Q2hhcnQoKSBhbmQgcGFzcyB0aGUgcmVzdWx0IGhlcmU6XG4gKlxuICogICBjb25zdCBjaGFydCA9IGZsb3dDaGFydCgnZW50cnknLCBlbnRyeUZuKS5hZGRGdW5jdGlvbigncHJvY2VzcycsIHByb2Nlc3NGbikuYnVpbGQoKTtcbiAqXG4gKiAgIC8vIE5vLW9wdGlvbnMgZm9ybSAodXNlcyBhdXRvLWRldGVjdGVkIFR5cGVkU2NvcGUgZmFjdG9yeSBmcm9tIHRoZSBjaGFydCk6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0KTtcbiAqXG4gKiAgIC8vIE9wdGlvbnMtb2JqZWN0IGZvcm0gKHByZWZlcnJlZCB3aGVuIHlvdSBuZWVkIHRvIGN1c3RvbWl6ZSBiZWhhdmlvcik6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHNjb3BlRmFjdG9yeTogbXlGYWN0b3J5IH0pO1xuICpcbiAqICAgLy8gMi1wYXJhbSBmb3JtIChhY2NlcHRzIGEgU2NvcGVGYWN0b3J5IGRpcmVjdGx5LCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSk6XG4gKiAgIGNvbnN0IGV4ZWN1dG9yID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCBteUZhY3RvcnkpO1xuICpcbiAqICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlY3V0b3IucnVuKHsgaW5wdXQ6IGRhdGEsIGVudjogeyB0cmFjZUlkOiAncmVxLTEyMycgfSB9KTtcbiAqL1xuXG5pbXBvcnQgdHlwZSB7IEZsb3dDaGFydCB9IGZyb20gJy4uL2J1aWxkZXIvdHlwZXMuanMnO1xuaW1wb3J0IHsgZGV0YWNoQW5kRm9yZ2V0IGFzIF9kZXRhY2hBbmRGb3JnZXQsIGRldGFjaEFuZEpvaW5MYXRlciBhcyBfZGV0YWNoQW5kSm9pbkxhdGVyIH0gZnJvbSAnLi4vZGV0YWNoL3NwYXduLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL0NvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IENvbWJpbmVkTmFycmF0aXZlRW50cnkgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL25hcnJhdGl2ZVR5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgTWFuaWZlc3RFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvcmVjb3JkZXJzL01hbmlmZXN0Rmxvd1JlY29yZGVyLmpzJztcbmltcG9ydCB7IE1hbmlmZXN0Rmxvd1JlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9yZWNvcmRlcnMvTWFuaWZlc3RGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHR5cGUgeyBGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3R5cGVzLmpzJztcbmltcG9ydCB7IGJ1aWxkUnVudGltZVN0YWdlSWQgfSBmcm9tICcuLi9lbmdpbmUvcnVudGltZVN0YWdlSWQuanMnO1xuaW1wb3J0IHsgRmxvd2NoYXJ0VHJhdmVyc2VyIH0gZnJvbSAnLi4vZW5naW5lL3RyYXZlcnNhbC9GbG93Y2hhcnRUcmF2ZXJzZXIuanMnO1xuaW1wb3J0IHtcbiAgdHlwZSBFeGVjdXRvclJlc3VsdCxcbiAgdHlwZSBQYXVzZWRSZXN1bHQsXG4gIHR5cGUgUnVuT3B0aW9ucyxcbiAgdHlwZSBTY29wZUZhY3RvcnksXG4gIHR5cGUgU2VyaWFsaXplZFBpcGVsaW5lU3RydWN0dXJlLFxuICB0eXBlIFN0YWdlTm9kZSxcbiAgdHlwZSBTdHJlYW1IYW5kbGVycyxcbiAgdHlwZSBTdWJmbG93UmVzdWx0LFxuICB0eXBlIFRyYXZlcnNhbFJlc3VsdCxcbiAgZGVmYXVsdExvZ2dlcixcbn0gZnJvbSAnLi4vZW5naW5lL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgU3RhZ2VTbmFwc2hvdCB9IGZyb20gJy4uL21lbW9yeS90eXBlcy5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3djaGFydENoZWNrcG9pbnQsIFBhdXNlU2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHsgaXNQYXVzZVNpZ25hbCB9IGZyb20gJy4uL3BhdXNlL3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWRSZWNvcmRlciB9IGZyb20gJy4uL3JlY29yZGVyL0NvbWJpbmVkUmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgaGFzRW1pdFJlY29yZGVyTWV0aG9kcywgaGFzRmxvd1JlY29yZGVyTWV0aG9kcywgaGFzUmVjb3JkZXJNZXRob2RzIH0gZnJvbSAnLi4vcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEVtaXRSZWNvcmRlciB9IGZyb20gJy4uL3JlY29yZGVyL0VtaXRSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBpc0Rldk1vZGUgfSBmcm9tICcuLi9zY29wZS9kZXRlY3RDaXJjdWxhci5qcyc7XG5pbXBvcnQgeyBkZWVwRnJlZXplIH0gZnJvbSAnLi4vc2NvcGUvcHJvdGVjdGlvbi9yZWFkb25seUlucHV0LmpzJztcbmltcG9ydCB0eXBlIHsgU2NvcGVQcm90ZWN0aW9uTW9kZSB9IGZyb20gJy4uL3Njb3BlL3Byb3RlY3Rpb24vdHlwZXMuanMnO1xuaW1wb3J0IHsgU2NvcGVGYWNhZGUgfSBmcm9tICcuLi9zY29wZS9TY29wZUZhY2FkZS5qcyc7XG5pbXBvcnQgdHlwZSB7IFJlZGFjdGlvblBvbGljeSwgUmVkYWN0aW9uUmVwb3J0LCBTY29wZVJlY29yZGVyIH0gZnJvbSAnLi4vc2NvcGUvdHlwZXMuanMnO1xuaW1wb3J0IHsgZGVzY3JpYmVDaGVja3BvaW50Q2xvbmVGYWlsdXJlLCBzYW5pdGl6ZURpYWdub3N0aWNCYWdzIH0gZnJvbSAnLi9jaGVja3BvaW50U2FuaXRpemUuanMnO1xuaW1wb3J0IHsgdHlwZSBSZWNvcmRlclNuYXBzaG90LCB0eXBlIFJ1bnRpbWVTbmFwc2hvdCwgRXhlY3V0aW9uUnVudGltZSB9IGZyb20gJy4vRXhlY3V0aW9uUnVudGltZS5qcyc7XG5pbXBvcnQgeyBnZW5lcmF0ZVJ1bklkIH0gZnJvbSAnLi9ydW5JZC5qcyc7XG5pbXBvcnQgeyB2YWxpZGF0ZUlucHV0IH0gZnJvbSAnLi92YWxpZGF0ZUlucHV0LmpzJztcblxuLyoqIERlZmF1bHQgc2NvcGUgZmFjdG9yeSDigJQgY3JlYXRlcyBhIHBsYWluIFNjb3BlRmFjYWRlIGZvciBlYWNoIHN0YWdlLiAqL1xuY29uc3QgZGVmYXVsdFNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5ID0gKGN0eCwgc3RhZ2VOYW1lLCByZWFkT25seSwgZW52KSA9PlxuICBuZXcgU2NvcGVGYWNhZGUoY3R4LCBzdGFnZU5hbWUsIHJlYWRPbmx5LCBlbnYpO1xuXG4vKipcbiAqIE9wdGlvbnMgb2JqZWN0IGZvciBgRmxvd0NoYXJ0RXhlY3V0b3JgIOKAlCBwcmVmZXJyZWQgb3ZlciBwb3NpdGlvbmFsIHBhcmFtcy5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdCBleCA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwge1xuICogICBzY29wZUZhY3Rvcnk6IG15RmFjdG9yeSxcbiAqICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ6IHsgLi4uIH0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqICoqU3luYyBub3RlIGZvciBtYWludGFpbmVyczoqKiBFdmVyeSBmaWVsZCBhZGRlZCBoZXJlIG11c3QgYWxzbyBhcHBlYXIgaW4gdGhlXG4gKiBgZmxvd0NoYXJ0QXJnc2AgcHJpdmF0ZSBmaWVsZCB0eXBlIGFuZCBpbiB0aGUgY29uc3RydWN0b3IncyBvcHRpb25zLXJlc29sdXRpb25cbiAqIGJsb2NrICh0aGUgYGVsc2UgaWZgIGJyYW5jaCB0aGF0IHJlYWRzIGZyb20gYG9wdHNgKS4gTWlzc2luZyBhbnkgb25lIG9mIHRoZVxuICogdGhyZWUgY2F1c2VzIHNpbGVudCBvbWlzc2lvbiDigJQgdGhlIG9wdGlvbiBpcyBhY2NlcHRlZCBidXQgbmV2ZXIgYXBwbGllZC5cbiAqXG4gKiAqKlRTY29wZSBpbmZlcmVuY2Ugbm90ZToqKiBXaGVuIHVzaW5nIHRoZSBvcHRpb25zLW9iamVjdCBmb3JtIHdpdGggYSBjdXN0b20gc2NvcGUsXG4gKiBUeXBlU2NyaXB0IGNhbm5vdCBpbmZlciBgVFNjb3BlYCB0aHJvdWdoIHRoZSBvcHRpb25zIG9iamVjdC4gUGFzcyB0aGUgdHlwZVxuICogZXhwbGljaXRseTogYG5ldyBGbG93Q2hhcnRFeGVjdXRvcjxUT3V0LCBNeVNjb3BlPihjaGFydCwgeyBzY29wZUZhY3RvcnkgfSlgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGUgPSBhbnk+IHtcbiAgLy8g4pSA4pSAIENvbW1vbiBvcHRpb25zIChtb3N0IGNhbGxlcnMgbmVlZCBvbmx5IHRoZXNlKSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKiogQ3VzdG9tIHNjb3BlIGZhY3RvcnkuIERlZmF1bHRzIHRvIFR5cGVkU2NvcGUgb3IgU2NvcGVGYWNhZGUgYXV0by1kZXRlY3Rpb24uICovXG4gIHNjb3BlRmFjdG9yeT86IFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuXG4gIC8vIOKUgOKUgCBDb250ZXh0IG9wdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIERlZmF1bHQgdmFsdWVzIHByZS1wb3B1bGF0ZWQgaW50byB0aGUgc2hhcmVkIGNvbnRleHQgYmVmb3JlICoqZWFjaCoqIHN0YWdlXG4gICAqIChyZS1hcHBsaWVkIGV2ZXJ5IHN0YWdlLCBhY3RpbmcgYXMgYmFzZWxpbmUgZGVmYXVsdHMpLlxuICAgKi9cbiAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ/OiB1bmtub3duO1xuICAvKipcbiAgICogSW5pdGlhbCBjb250ZXh0IHZhbHVlcyBtZXJnZWQgaW50byB0aGUgc2hhcmVkIGNvbnRleHQgKipvbmNlKiogYXQgc3RhcnR1cFxuICAgKiAoYXBwbGllZCBiZWZvcmUgdGhlIGZpcnN0IHN0YWdlLCBub3QgcmVwZWF0ZWQgb24gc3Vic2VxdWVudCBzdGFnZXMpLlxuICAgKiBEaXN0aW5jdCBmcm9tIGBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dGAsIHdoaWNoIGlzIHJlLWFwcGxpZWQgZXZlcnkgc3RhZ2UuXG4gICAqL1xuICBpbml0aWFsQ29udGV4dD86IHVua25vd247XG4gIC8qKiBSZWFkLW9ubHkgaW5wdXQgYWNjZXNzaWJsZSB2aWEgYHNjb3BlLmdldEFyZ3MoKWAg4oCUIG5ldmVyIHRyYWNrZWQgb3Igd3JpdHRlbi4gKi9cbiAgcmVhZE9ubHlDb250ZXh0PzogdW5rbm93bjtcblxuICAvLyDilIDilIAgQWR2YW5jZWQgLyBlc2NhcGUtaGF0Y2ggb3B0aW9ucyAobW9zdCBjYWxsZXJzIGRvIG5vdCBuZWVkIHRoZXNlKSDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ3VzdG9tIGVycm9yIGNsYXNzaWZpZXIgZm9yIHRocm90dGxpbmcgZGV0ZWN0aW9uLiBSZXR1cm4gYHRydWVgIGlmIHRoZVxuICAgKiBlcnJvciByZXByZXNlbnRzIGEgcmF0ZS1saW1pdCBvciBiYWNrcHJlc3N1cmUgY29uZGl0aW9uICh0aGUgZXhlY3V0b3Igd2lsbFxuICAgKiB0cmVhdCBpdCBkaWZmZXJlbnRseSBmcm9tIGhhcmQgZmFpbHVyZXMpLiBEZWZhdWx0cyB0byBubyB0aHJvdHRsaW5nIGNsYXNzaWZpY2F0aW9uLlxuICAgKi9cbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgLyoqIEhhbmRsZXJzIGZvciBzdHJlYW1pbmcgc3RhZ2UgbGlmZWN5Y2xlIGV2ZW50cyAoc2VlIGBhZGRTdHJlYW1pbmdGdW5jdGlvbmApLiAqL1xuICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICAvKiogU2NvcGUgcHJvdGVjdGlvbiBtb2RlIGZvciBUeXBlZFNjb3BlIGRpcmVjdC1hc3NpZ25tZW50IGRldGVjdGlvbi4gKi9cbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG59XG5cbmV4cG9ydCBjbGFzcyBGbG93Q2hhcnRFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSB0cmF2ZXJzZXI6IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+O1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIOKAlCBzdXJ2aXZlcyBwYXVzZS9yZXN1bWUuIFJlc2V0IG9uIGZyZXNoIHJ1bigpLiAqL1xuICBwcml2YXRlIF9leGVjdXRpb25Db3VudGVyID0geyB2YWx1ZTogMCB9O1xuICAvKiogUGVyLWBydW4oKWAgaWRlbnRpZmllciDigJQgZ2VuZXJhdGVkIGZyZXNoIHBlciBydW4gKyBwZXIgcmVzdW1lLiBUaHJlYWRlZFxuICAgKiAgdGhyb3VnaCBldmVyeSBUcmF2ZXJzYWxDb250ZXh0IHNvIHJlY29yZGVycyBjYW4gc2NvcGUgc3RhdGUgdG8gYSBzaW5nbGVcbiAgICogIHJ1bi4gU2VlIGBydW5JZC50c2AuICovXG4gIHByaXZhdGUgX2N1cnJlbnRSdW5JZCA9ICcnO1xuICBwcml2YXRlIG5hcnJhdGl2ZUVuYWJsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBuYXJyYXRpdmVPcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnM7XG4gIHByaXZhdGUgY29tYmluZWRSZWNvcmRlcjogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBmbG93UmVjb3JkZXJzOiBGbG93UmVjb3JkZXJbXSA9IFtdO1xuICBwcml2YXRlIHNjb3BlUmVjb3JkZXJzOiBTY29wZVJlY29yZGVyW10gPSBbXTtcbiAgcHJpdmF0ZSByZWRhY3Rpb25Qb2xpY3k6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzaGFyZWRSZWRhY3RlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBzaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICBwcml2YXRlIGxhc3RDaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50IHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogYHRydWVgIG9uY2UgYHJ1bigpYCAob3IgYSBwcmV2aW91cyBgcmVzdW1lKClgKSBoYXMgZXhlY3V0ZWQgb25cbiAgICogdGhpcyBpbnN0YW5jZS4gYHJlc3VtZSgpYCBicmFuY2hlcyBvbiBpdDpcbiAgICpcbiAgICogICDigKIgdHJ1ZSAg4oaSIHJldXNlIHRoZSBjb25zdHJ1Y3Rvci10aW1lIHJ1bnRpbWUgKHNhbWUtZXhlY3V0b3JcbiAgICogICAgICAgICAgICAgY29udGludWl0eTogZXhlY3V0aW9uIHRyZWUsIHJlY29yZGVycywgbmFycmF0aXZlXG4gICAqICAgICAgICAgICAgIGFjY3VtdWxhdGUgYWNyb3NzIHBhdXNlL3Jlc3VtZSBjeWNsZXMpXG4gICAqICAg4oCiIGZhbHNlIOKGkiBzZWVkIGEgZnJlc2ggcnVudGltZSBmcm9tIGBjaGVja3BvaW50LnNoYXJlZFN0YXRlYFxuICAgKiAgICAgICAgICAgICAoY3Jvc3MtZXhlY3V0b3IgLyBjcm9zcy1wcm9jZXNzIHJlc3VtZTogbmV3IGluc3RhbmNlXG4gICAqICAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgZnJvbSBhIHNlcmlhbGl6ZWQgY2hlY2twb2ludClcbiAgICpcbiAgICogV2l0aG91dCB0aGlzIGZsYWcsIGZyZXNoIGV4ZWN1dG9ycyBzaWxlbnRseSBkaXNjYXJkZWQgdGhlXG4gICAqIGNoZWNrcG9pbnQncyBzaGFyZWRTdGF0ZSBhbmQgcmVzdW1lIGhhbmRsZXJzIGNvdWxkbid0IHJlYWQgcHJlLXBhdXNlXG4gICAqIHNjb3BlLiBTZWUgYHRlc3QvbGliL3BhdXNlL2Nyb3NzLWV4ZWN1dG9yLXJlc3VtZS50ZXN0LnRzYC5cbiAgICovXG4gIHByaXZhdGUgX2hhc1J1bkJlZm9yZSA9IGZhbHNlO1xuICAvKipcbiAgICogUmUtZW50cmFuY3kgZ3VhcmQuIGBydW4oKWAgYW5kIGByZXN1bWUoKWAgbXV0YXRlIHBlci1ydW4gaW5zdGFuY2Ugc3RhdGVcbiAgICogKHRyYXZlcnNlciwgcnVuSWQsIGV4ZWN1dGlvbiBjb3VudGVyLCBjaGVja3BvaW50KSBhbmQgY2xlYXIgYXR0YWNoZWRcbiAgICogcmVjb3JkZXJzIOKAlCBhIHNlY29uZCBjb25jdXJyZW50IGVudHJ5IG9uIHRoZSBTQU1FIGV4ZWN1dG9yIHdvdWxkXG4gICAqIGludGVybGVhdmUgcnVuSWRzIGFuZCBjcm9zcy1jb250YW1pbmF0ZSByZWNvcmRlci9uYXJyYXRpdmUgc3RhdGUsIGFuZFxuICAgKiBgZ2V0Q2hlY2twb2ludCgpYCB3b3VsZCByZXR1cm4gd2hpY2hldmVyIHJ1biBwYXVzZWQgbGFzdC4gT25lIGV4ZWN1dG9yID1cbiAgICogb25lIGluLWZsaWdodCBleGVjdXRpb247IGNyZWF0ZSBhbiBleGVjdXRvciBwZXIgY29uY3VycmVudCBydW4uXG4gICAqIFNlZSBkb2NzL2d1aWRlcy9leGVjdXRpb24tbW9kZWwubWQuXG4gICAqL1xuICBwcml2YXRlIF9pc0V4ZWN1dGluZyA9IGZhbHNlO1xuXG4gIC8vIFNZTkMgUkVRVUlSRUQ6IGV2ZXJ5IG9wdGlvbmFsIGZpZWxkIGhlcmUgbXVzdCBtaXJyb3IgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zXG4gIC8vIEFORCBiZSBhc3NpZ25lZCBpbiB0aGUgY29uc3RydWN0b3IncyBvcHRpb25zLXJlc29sdXRpb24gYmxvY2sgKHRoZSBgZWxzZSBpZmAgYnJhbmNoKS5cbiAgLy8gQWRkaW5nIGEgZmllbGQgdG8gb25seSBvbmUgb2YgdGhlIHRocmVlIHBsYWNlcyBjYXVzZXMgc2lsZW50IG9taXNzaW9uLlxuICBwcml2YXRlIHJlYWRvbmx5IGZsb3dDaGFydEFyZ3M6IHtcbiAgICBmbG93Q2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+O1xuICAgIHNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT47XG4gICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ/OiB1bmtub3duO1xuICAgIGluaXRpYWxDb250ZXh0PzogdW5rbm93bjtcbiAgICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duO1xuICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gICAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgICBzY29wZVByb3RlY3Rpb25Nb2RlPzogU2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlIGEgRmxvd0NoYXJ0RXhlY3V0b3IuXG4gICAqXG4gICAqICoqT3B0aW9ucyBvYmplY3QgZm9ybSoqIChwcmVmZXJyZWQpOlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgeyBzY29wZUZhY3RvcnksIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0IH0pXG4gICAqIGBgYFxuICAgKlxuICAgKiAqKjItcGFyYW0gZm9ybSoqIChhbHNvIHN1cHBvcnRlZCk6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCBzY29wZUZhY3RvcnkpXG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gZmxvd0NoYXJ0IC0gVGhlIGNvbXBpbGVkIEZsb3dDaGFydCByZXR1cm5lZCBieSBgZmxvd0NoYXJ0KC4uLikuYnVpbGQoKWBcbiAgICogQHBhcmFtIGZhY3RvcnlPck9wdGlvbnMgLSBBIGBTY29wZUZhY3Rvcnk8VFNjb3BlPmAgT1IgYSBgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zPFRTY29wZT5gIG9wdGlvbnMgb2JqZWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgZmxvd0NoYXJ0OiBGbG93Q2hhcnQ8VE91dCwgVFNjb3BlPixcbiAgICBmYWN0b3J5T3JPcHRpb25zPzogU2NvcGVGYWN0b3J5PFRTY29wZT4gfCBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnM8VFNjb3BlPixcbiAgKSB7XG4gICAgLy8gRGV0ZWN0IG9wdGlvbnMtb2JqZWN0IGZvcm0gdnMgZmFjdG9yeSBmb3JtXG4gICAgbGV0IHNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0OiB1bmtub3duO1xuICAgIGxldCBpbml0aWFsQ29udGV4dDogdW5rbm93bjtcbiAgICBsZXQgcmVhZE9ubHlDb250ZXh0OiB1bmtub3duO1xuICAgIGxldCB0aHJvdHRsaW5nRXJyb3JDaGVja2VyOiAoKGVycm9yOiB1bmtub3duKSA9PiBib29sZWFuKSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RyZWFtSGFuZGxlcnM6IFN0cmVhbUhhbmRsZXJzIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzY29wZVByb3RlY3Rpb25Nb2RlOiBTY29wZVByb3RlY3Rpb25Nb2RlIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGVvZiBmYWN0b3J5T3JPcHRpb25zID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvLyAyLXBhcmFtIGZvcm06IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCwgc2NvcGVGYWN0b3J5KVxuICAgICAgc2NvcGVGYWN0b3J5ID0gZmFjdG9yeU9yT3B0aW9ucztcbiAgICB9IGVsc2UgaWYgKGZhY3RvcnlPck9wdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gT3B0aW9ucyBvYmplY3QgZm9ybVxuICAgICAgY29uc3Qgb3B0cyA9IGZhY3RvcnlPck9wdGlvbnM7XG4gICAgICBzY29wZUZhY3RvcnkgPSBvcHRzLnNjb3BlRmFjdG9yeTtcbiAgICAgIGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0ID0gb3B0cy5kZWZhdWx0VmFsdWVzRm9yQ29udGV4dDtcbiAgICAgIGluaXRpYWxDb250ZXh0ID0gb3B0cy5pbml0aWFsQ29udGV4dDtcbiAgICAgIHJlYWRPbmx5Q29udGV4dCA9IG9wdHMucmVhZE9ubHlDb250ZXh0O1xuICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlciA9IG9wdHMudGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjtcbiAgICAgIHN0cmVhbUhhbmRsZXJzID0gb3B0cy5zdHJlYW1IYW5kbGVycztcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGUgPSBvcHRzLnNjb3BlUHJvdGVjdGlvbk1vZGU7XG4gICAgfVxuICAgIHRoaXMuZmxvd0NoYXJ0QXJncyA9IHtcbiAgICAgIGZsb3dDaGFydCxcbiAgICAgIHNjb3BlRmFjdG9yeTogc2NvcGVGYWN0b3J5ID8/IGZsb3dDaGFydC5zY29wZUZhY3RvcnkgPz8gKGRlZmF1bHRTY29wZUZhY3RvcnkgYXMgU2NvcGVGYWN0b3J5PFRTY29wZT4pLFxuICAgICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQsXG4gICAgICBpbml0aWFsQ29udGV4dCxcbiAgICAgIHJlYWRPbmx5Q29udGV4dCxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICBzdHJlYW1IYW5kbGVycyxcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgfTtcbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRyYXZlcnNlcihcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICByZWFkT25seUNvbnRleHRPdmVycmlkZT86IHVua25vd24sXG4gICAgZW52PzogaW1wb3J0KCcuLi9lbmdpbmUvdHlwZXMnKS5FeGVjdXRpb25FbnYsXG4gICAgbWF4RGVwdGg/OiBudW1iZXIsXG4gICAgb3ZlcnJpZGVzPzoge1xuICAgICAgcm9vdD86IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+O1xuICAgICAgaW5pdGlhbENvbnRleHQ/OiB1bmtub3duO1xuICAgICAgcHJlc2VydmVSZWNvcmRlcnM/OiBib29sZWFuO1xuICAgICAgZXhpc3RpbmdSdW50aW1lPzogSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPjtcbiAgICAgIC8qKiBQZXItc3ViZmxvdyBzY29wZSBjYXB0dXJlcyBmcm9tIGEgY2hlY2twb2ludCDigJQgcGFzc2VkIHRocm91Z2hcbiAgICAgICAqICB0byBIYW5kbGVyRGVwcyBzbyBTdWJmbG93RXhlY3V0b3IgY2FuIHJlLXNlZWQgbmVzdGVkIHJ1bnRpbWVzXG4gICAgICAgKiAgb24gdGhlIHJlc3VtZSBwYXRoLiBVbmRlZmluZWQgb24gbm9ybWFsIHJ1bigpIHBhdGhzLiAqL1xuICAgICAgc3ViZmxvd1N0YXRlc0ZvclJlc3VtZT86IFJlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcsIHVua25vd24+PjtcbiAgICAgIC8qKiBSZXN1bWUtb25seSBvdmVycmlkZSBvZiB0aGUgc3ViZmxvd3MgZGljdCDigJQgc3Vic3RpdHV0ZXMgdGhlXG4gICAgICAgKiAgbGVhZiBzdWJmbG93J3Mgcm9vdCB3aXRoIGEgcmVzdW1lIGNoYWluIHNvIHRoZSBzdWJmbG93IGJvZHlcbiAgICAgICAqICBwaWNrcyB1cCBhdCB0aGUgcGF1c2UgcG9pbnQuIE90aGVyIGVudHJpZXMgcGFzcyB0aHJvdWdoXG4gICAgICAgKiAgdW5jaGFuZ2VkLiAqL1xuICAgICAgc3ViZmxvd3NPdmVycmlkZT86IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT47XG4gICAgfSxcbiAgKTogRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4ge1xuICAgIGNvbnN0IGFyZ3MgPSB0aGlzLmZsb3dDaGFydEFyZ3M7XG4gICAgY29uc3QgZmMgPSBhcmdzLmZsb3dDaGFydDtcbiAgICBjb25zdCBuYXJyYXRpdmVGbGFnID0gdGhpcy5uYXJyYXRpdmVFbmFibGVkIHx8IChmYy5lbmFibGVOYXJyYXRpdmUgPz8gZmFsc2UpO1xuXG4gICAgLy8g4pSA4pSAIENvbXBvc2VkIHNjb3BlIGZhY3Rvcnkg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG4gICAgLy8gQ29sbGVjdCBhbGwgc2NvcGUgbW9kaWZpZXJzIChyZWNvcmRlcnMsIHJlZGFjdGlvbikgaW50byBhIHNpbmdsZSBsaXN0LFxuICAgIC8vIHRoZW4gY3JlYXRlIE9ORSBmYWN0b3J5IHRoYXQgYXBwbGllcyB0aGVtIGluIGEgbG9vcC4gUmVwbGFjZXMgdGhlXG4gICAgLy8gcHJldmlvdXMgNC1kZWVwIGNsb3N1cmUgbmVzdGluZyB3aXRoIGEgZmxhdCwgZGVidWdnYWJsZSBjb21wb3NpdGlvbi5cblxuICAgIGlmIChvdmVycmlkZXM/LnByZXNlcnZlUmVjb3JkZXJzKSB7XG4gICAgICAvLyBSZXN1bWUgbW9kZToga2VlcCBleGlzdGluZyBjb21iaW5lZFJlY29yZGVyIHNvIG5hcnJhdGl2ZSBhY2N1bXVsYXRlc1xuICAgIH0gZWxzZSBpZiAobmFycmF0aXZlRmxhZykge1xuICAgICAgdGhpcy5jb21iaW5lZFJlY29yZGVyID0gbmV3IENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIodGhpcy5uYXJyYXRpdmVPcHRpb25zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb21iaW5lZFJlY29yZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHRoaXMuc2hhcmVkUmVkYWN0ZWRLZXlzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgdGhpcy5zaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuXG4gICAgLy8gQnVpbGQgbW9kaWZpZXIgbGlzdCDigJQgZWFjaCBtb2RpZmllciByZWNlaXZlcyB0aGUgc2NvcGUgYWZ0ZXIgY3JlYXRpb25cbiAgICB0eXBlIFNjb3BlTW9kaWZpZXIgPSAoc2NvcGU6IGFueSkgPT4gdm9pZDtcbiAgICBjb25zdCBtb2RpZmllcnM6IFNjb3BlTW9kaWZpZXJbXSA9IFtdO1xuXG4gICAgLy8gMS4gTmFycmF0aXZlIHJlY29yZGVyIChpZiBlbmFibGVkKVxuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHtcbiAgICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5jb21iaW5lZFJlY29yZGVyO1xuICAgICAgbW9kaWZpZXJzLnB1c2goKHNjb3BlKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2NvcGUuYXR0YWNoU2NvcGVSZWNvcmRlciA9PT0gJ2Z1bmN0aW9uJykgc2NvcGUuYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcik7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAyLiBVc2VyLXByb3ZpZGVkIHNjb3BlIHJlY29yZGVyc1xuICAgIGlmICh0aGlzLnNjb3BlUmVjb3JkZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IHJlY29yZGVycyA9IHRoaXMuc2NvcGVSZWNvcmRlcnM7XG4gICAgICBtb2RpZmllcnMucHVzaCgoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS5hdHRhY2hTY29wZVJlY29yZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgZm9yIChjb25zdCByIG9mIHJlY29yZGVycykgc2NvcGUuYXR0YWNoU2NvcGVSZWNvcmRlcihyKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gMy4gUmVkYWN0aW9uIHBvbGljeSAoY29uZGl0aW9uYWwg4oCUIG9ubHkgd2hlbiBwb2xpY3kgaXMgc2V0KVxuICAgIGlmICh0aGlzLnJlZGFjdGlvblBvbGljeSkge1xuICAgICAgY29uc3QgcG9saWN5ID0gdGhpcy5yZWRhY3Rpb25Qb2xpY3k7XG4gICAgICBtb2RpZmllcnMucHVzaCgoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS51c2VSZWRhY3Rpb25Qb2xpY3kgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBzY29wZS51c2VSZWRhY3Rpb25Qb2xpY3kocG9saWN5KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBQcmUtcG9wdWxhdGUgZXhlY3V0b3ItbGV2ZWwgZmllbGQgcmVkYWN0aW9uIG1hcCBmcm9tIHBvbGljeVxuICAgICAgLy8gc28gZ2V0UmVkYWN0aW9uUmVwb3J0KCkgaW5jbHVkZXMgZmllbGQtbGV2ZWwgcmVkYWN0aW9ucy5cbiAgICAgIGlmIChwb2xpY3kuZmllbGRzKSB7XG4gICAgICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiBPYmplY3QuZW50cmllcyhwb2xpY3kuZmllbGRzKSkge1xuICAgICAgICAgIHRoaXMuc2hhcmVkUmVkYWN0ZWRGaWVsZHNCeUtleS5zZXQoa2V5LCBuZXcgU2V0KGZpZWxkcykpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ29tcG9zZTogYmFzZSBmYWN0b3J5ICsgbW9kaWZpZXJzIGluIGEgc2luZ2xlIHBhc3MuXG4gICAgLy8gU2hhcmVkIHJlZGFjdGVkIGtleXMgYXJlIEFMV0FZUyB3aXJlZCB1cCAodW5jb25kaXRpb25hbCDigJQgZW5zdXJlcyBjcm9zcy1zdGFnZVxuICAgIC8vIHByb3BhZ2F0aW9uIGV2ZW4gd2l0aG91dCBhIHBvbGljeSwgYmVjYXVzZSBzdGFnZXMgY2FuIGNhbGwgc2V0VmFsdWUoa2V5LCB2YWwsIHRydWUpXG4gICAgLy8gZm9yIHBlci1jYWxsIHJlZGFjdGlvbikuIE9wdGlvbmFsIG1vZGlmaWVycyAocmVjb3JkZXJzLCBwb2xpY3kpIGFyZSBpbiB0aGUgbGlzdC5cbiAgICBjb25zdCBiYXNlRmFjdG9yeSA9IGFyZ3Muc2NvcGVGYWN0b3J5O1xuICAgIGNvbnN0IHNoYXJlZFJlZGFjdGVkS2V5cyA9IHRoaXMuc2hhcmVkUmVkYWN0ZWRLZXlzO1xuICAgIGNvbnN0IHNjb3BlRmFjdG9yeSA9ICgoY3R4OiBhbnksIHN0YWdlTmFtZTogc3RyaW5nLCByZWFkT25seT86IHVua25vd24sIGVudkFyZz86IGFueSkgPT4ge1xuICAgICAgY29uc3Qgc2NvcGUgPSBiYXNlRmFjdG9yeShjdHgsIHN0YWdlTmFtZSwgcmVhZE9ubHksIGVudkFyZyk7XG4gICAgICAvLyBBbHdheXMgd2lyZSBzaGFyZWQgcmVkYWN0aW9uIHN0YXRlXG4gICAgICBpZiAodHlwZW9mIChzY29wZSBhcyBhbnkpLnVzZVNoYXJlZFJlZGFjdGVkS2V5cyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAoc2NvcGUgYXMgYW55KS51c2VTaGFyZWRSZWRhY3RlZEtleXMoc2hhcmVkUmVkYWN0ZWRLZXlzKTtcbiAgICAgIH1cbiAgICAgIC8vIEFwcGx5IG9wdGlvbmFsIG1vZGlmaWVyc1xuICAgICAgZm9yIChjb25zdCBtb2Qgb2YgbW9kaWZpZXJzKSBtb2Qoc2NvcGUpO1xuICAgICAgcmV0dXJuIHNjb3BlO1xuICAgIH0pIGFzIFNjb3BlRmFjdG9yeTxUU2NvcGU+O1xuXG4gICAgY29uc3QgZWZmZWN0aXZlUm9vdCA9IG92ZXJyaWRlcz8ucm9vdCA/PyBmYy5yb290O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUluaXRpYWxDb250ZXh0ID0gb3ZlcnJpZGVzPy5pbml0aWFsQ29udGV4dCA/PyBhcmdzLmluaXRpYWxDb250ZXh0O1xuXG4gICAgbGV0IHJ1bnRpbWU6IEV4ZWN1dGlvblJ1bnRpbWU7XG4gICAgaWYgKG92ZXJyaWRlcz8uZXhpc3RpbmdSdW50aW1lKSB7XG4gICAgICAvLyBSZXN1bWUgbW9kZTogcmV1c2UgZXhpc3RpbmcgcnVudGltZSBzbyBleGVjdXRpb24gdHJlZSBjb250aW51ZXMgZnJvbSBwYXVzZSBwb2ludC5cbiAgICAgIC8vIFByZXNlcnZlIHRoZSBvcmlnaW5hbCByb290IGZvciBnZXRTbmFwc2hvdCgpIChmdWxsIHRyZWUpLCB0aGVuIGFkdmFuY2VcbiAgICAgIC8vIHJvb3RTdGFnZUNvbnRleHQgdG8gYSBjb250aW51YXRpb24gZnJvbSB0aGUgbGVhZiAoZm9yIHRyYXZlcnNhbCkuXG4gICAgICBydW50aW1lID0gb3ZlcnJpZGVzLmV4aXN0aW5nUnVudGltZTtcbiAgICAgIHJ1bnRpbWUucHJlc2VydmVTbmFwc2hvdFJvb3QoKTtcbiAgICAgIGxldCBsZWFmID0gcnVudGltZS5yb290U3RhZ2VDb250ZXh0O1xuICAgICAgd2hpbGUgKGxlYWYubmV4dCkgbGVhZiA9IGxlYWYubmV4dDtcbiAgICAgIHJ1bnRpbWUucm9vdFN0YWdlQ29udGV4dCA9IGxlYWYuY3JlYXRlTmV4dCgnJywgZWZmZWN0aXZlUm9vdC5uYW1lLCBlZmZlY3RpdmVSb290LmlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcnVudGltZSA9IG5ldyBFeGVjdXRpb25SdW50aW1lKFxuICAgICAgICBlZmZlY3RpdmVSb290Lm5hbWUsXG4gICAgICAgIGVmZmVjdGl2ZVJvb3QuaWQsXG4gICAgICAgIGFyZ3MuZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQsXG4gICAgICAgIGVmZmVjdGl2ZUluaXRpYWxDb250ZXh0LFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBXaGVuIGEgcmVkYWN0aW9uIHBvbGljeSBpcyBjb25maWd1cmVkLCBtYWludGFpbiBhIHBhcmFsbGVsIHJlZGFjdGVkXG4gICAgLy8gbWlycm9yIG9mIGBnbG9iYWxTdG9yZWAgZHVyaW5nIHRyYXZlcnNhbC4gRWFjaCBjb21taXQgYXBwbGllcyB0aGVcbiAgICAvLyBhbHJlYWR5LWNvbXB1dGVkIHJlZGFjdGVkIHBhdGNoZXMg4oCUIHNhbWUgb25lcyBmZWQgdG8gdGhlIGV2ZW50IGxvZyDigJRcbiAgICAvLyBzbyBgZ2V0U25hcHNob3QoeyByZWRhY3Q6IHRydWUgfSlgIHJldHVybnMgYSBzY3J1YmJlZCBzaGFyZWRTdGF0ZSBhdFxuICAgIC8vIHplcm8gcG9zdC1wYXNzIGNvc3QuIFNraXBwZWQgd2hlbiBubyBwb2xpY3kgZXhpc3RzICh6ZXJvIGFsbG9jYXRpb24pLlxuICAgIGlmICh0aGlzLnJlZGFjdGlvblBvbGljeSkge1xuICAgICAgcnVudGltZS5lbmFibGVSZWRhY3RlZE1pcnJvcigpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4oe1xuICAgICAgcm9vdDogZWZmZWN0aXZlUm9vdCxcbiAgICAgIHN0YWdlTWFwOiBmYy5zdGFnZU1hcCxcbiAgICAgIHNjb3BlRmFjdG9yeSxcbiAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHJ1bnRpbWUsXG4gICAgICByZWFkT25seUNvbnRleHQ6IHJlYWRPbmx5Q29udGV4dE92ZXJyaWRlID8/IGFyZ3MucmVhZE9ubHlDb250ZXh0LFxuICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogYXJncy50aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgc3RyZWFtSGFuZGxlcnM6IGFyZ3Muc3RyZWFtSGFuZGxlcnMsXG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBhcmdzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICBzdWJmbG93czogZmMuc3ViZmxvd3MsXG4gICAgICBuYXJyYXRpdmVFbmFibGVkOiBuYXJyYXRpdmVGbGFnLFxuICAgICAgYnVpbGRUaW1lU3RydWN0dXJlOiBmYy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICBsb2dnZXI6IGZjLmxvZ2dlciA/PyBkZWZhdWx0TG9nZ2VyLFxuICAgICAgc2lnbmFsLFxuICAgICAgZXhlY3V0aW9uRW52OiBlbnYsXG4gICAgICBmbG93UmVjb3JkZXJzOiB0aGlzLmJ1aWxkRmxvd1JlY29yZGVyc0xpc3QoKSxcbiAgICAgIGV4ZWN1dGlvbkNvdW50ZXI6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIsXG4gICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgLi4uKG92ZXJyaWRlcz8uc3ViZmxvd3NPdmVycmlkZSAmJiB7IHN1YmZsb3dzOiBvdmVycmlkZXMuc3ViZmxvd3NPdmVycmlkZSB9KSxcbiAgICAgIC4uLihvdmVycmlkZXM/LnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUgJiYge1xuICAgICAgICBzdWJmbG93U3RhdGVzRm9yUmVzdW1lOiBvdmVycmlkZXMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSxcbiAgICAgIH0pLFxuICAgICAgLi4uKG1heERlcHRoICE9PSB1bmRlZmluZWQgJiYgeyBtYXhEZXB0aCB9KSxcbiAgICB9KTtcbiAgfVxuXG4gIGVuYWJsZU5hcnJhdGl2ZShvcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnMpOiB2b2lkIHtcbiAgICB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgPSB0cnVlO1xuICAgIGlmIChvcHRpb25zKSB0aGlzLm5hcnJhdGl2ZU9wdGlvbnMgPSBvcHRpb25zO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBhIGRlY2xhcmF0aXZlIHJlZGFjdGlvbiBwb2xpY3kgdGhhdCBhcHBsaWVzIHRvIGFsbCBzdGFnZXMuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS5cbiAgICovXG4gIHNldFJlZGFjdGlvblBvbGljeShwb2xpY3k6IFJlZGFjdGlvblBvbGljeSk6IHZvaWQge1xuICAgIHRoaXMucmVkYWN0aW9uUG9saWN5ID0gcG9saWN5O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb21wbGlhbmNlLWZyaWVuZGx5IHJlcG9ydCBvZiBhbGwgcmVkYWN0aW9uIGFjdGl2aXR5IGZyb20gdGhlXG4gICAqIG1vc3QgcmVjZW50IHJ1bi4gTmV2ZXIgaW5jbHVkZXMgYWN0dWFsIHZhbHVlcy5cbiAgICovXG4gIGdldFJlZGFjdGlvblJlcG9ydCgpOiBSZWRhY3Rpb25SZXBvcnQge1xuICAgIGNvbnN0IGZpZWxkUmVkYWN0aW9uczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIHRoaXMuc2hhcmVkUmVkYWN0ZWRGaWVsZHNCeUtleSkge1xuICAgICAgZmllbGRSZWRhY3Rpb25zW2tleV0gPSBbLi4uZmllbGRzXTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHJlZGFjdGVkS2V5czogWy4uLnRoaXMuc2hhcmVkUmVkYWN0ZWRLZXlzXSxcbiAgICAgIGZpZWxkUmVkYWN0aW9ucyxcbiAgICAgIHBhdHRlcm5zOiAodGhpcy5yZWRhY3Rpb25Qb2xpY3k/LnBhdHRlcm5zID8/IFtdKS5tYXAoKHApID0+IHAuc291cmNlKSxcbiAgICB9O1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIFBhdXNlL1Jlc3VtZSDilIDilIDilIBcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY2hlY2twb2ludCBmcm9tIHRoZSBtb3N0IHJlY2VudCBwYXVzZWQgZXhlY3V0aW9uLCBvciBgdW5kZWZpbmVkYFxuICAgKiBpZiB0aGUgbGFzdCBydW4gY29tcGxldGVkIHdpdGhvdXQgcGF1c2luZy5cbiAgICpcbiAgICogVGhlIGNoZWNrcG9pbnQgaXMgSlNPTi1zZXJpYWxpemFibGUg4oCUIHN0b3JlIGl0IGluIFJlZGlzLCBQb3N0Z3JlcywgbG9jYWxTdG9yYWdlLCBldGMuXG4gICAqXG4gICAqIEl0IGlzIGZ1bGx5IERFVEFDSEVEIGZyb20gZW5naW5lIHN0YXRlOiBldmVyeSBmaWVsZCB3YXMgZGVlcC1jb3BpZWQgYXRcbiAgICogcGF1c2UgdGltZSAoc2VlIGBidWlsZFBhdXNlQ2hlY2twb2ludGApLiBIb2xkaW5nLCBtdXRhdGluZywgb3IgcGVyc2lzdGluZ1xuICAgKiBpdCBjYW5ub3QgYWZmZWN0IHRoZSBleGVjdXRvciwgYW5kIGEgbGF0ZXIgc2FtZS1leGVjdXRvciByZXN1bWUgY2Fubm90XG4gICAqIG11dGF0ZSBhIGNoZWNrcG9pbnQgeW91IGFscmVhZHkgc3RvcmVkLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJ1bih7IGlucHV0IH0pO1xuICAgKiBpZiAoZXhlY3V0b3IuaXNQYXVzZWQoKSkge1xuICAgKiAgIGNvbnN0IGNoZWNrcG9pbnQgPSBleGVjdXRvci5nZXRDaGVja3BvaW50KCkhO1xuICAgKiAgIGF3YWl0IHJlZGlzLnNldChgc2Vzc2lvbjoke2lkfWAsIEpTT04uc3RyaW5naWZ5KGNoZWNrcG9pbnQpKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGdldENoZWNrcG9pbnQoKTogRmxvd2NoYXJ0Q2hlY2twb2ludCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoZWNrcG9pbnQ7XG4gIH1cblxuICAvKiogUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG1vc3QgcmVjZW50IHJ1bigpIHdhcyBwYXVzZWQgKGNoZWNrcG9pbnQgYXZhaWxhYmxlKS4gKi9cbiAgaXNQYXVzZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubGFzdENoZWNrcG9pbnQgIT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgY29tbWl0cyBpbiB0aGUgcnVuJ3MgY29tbWl0IGxvZy4gTygxKSDigJQgZGlyZWN0IGxlbmd0aFxuICAgKiByZWFkLCBubyBzbmFwc2hvdCBtYXRlcmlhbGl6YXRpb24uIFVzZSB0aGlzIHRvIHN0YW1wIGNvbW1pdFxuICAgKiBpbmRpY2VzIG9uIG9ic2VydmVyIGV2ZW50cyAoZS5nLiwgYEJvdW5kYXJ5UmVjb3JkZXJgIHN0b3JpbmdcbiAgICogYGNvbW1pdElkeEJlZm9yZWAgLyBgY29tbWl0SWR4QWZ0ZXJgIHBlciBkb21haW4gZXZlbnQgZm9yXG4gICAqIGBDb21taXRSYW5nZUluZGV4YCBxdWVyaWVzIOKAlCBzZWUgYGZvb3RwcmludGpzL3RyYWNlYCkuXG4gICAqXG4gICAqIFJldHVybnMgMCBiZWZvcmUgYW55IHJ1bjsgYWZ0ZXIsIHJldHVybnMgdGhlIGN1bXVsYXRpdmUgY29tbWl0XG4gICAqIGNvdW50IGFjcm9zcyB0aGUgZXhlY3V0b3IncyBsaWZldGltZSAoaW5jbHVkaW5nIHJlc3VtZXMpLlxuICAgKlxuICAgKiBJTVBMRU1FTlRBVElPTiBOT1RFOiB0aGlzIHJldHVybnMgYHJ1bnRpbWUuZXhlY3V0aW9uSGlzdG9yeS5sZW5ndGhgLFxuICAgKiB3aGljaCBpcyB0aGUgc2FtZSB2YWx1ZSBhcyBgZ2V0U25hcHNob3QoKS5jb21taXRMb2cubGVuZ3RoYC4gVGhlXG4gICAqIG5hbWluZyBhc3ltbWV0cnkgaXMgaGlzdG9yaWNhbCDigJQgdGhlIHVuZGVybHlpbmcgYEV2ZW50TG9nYCBmaWVsZFxuICAgKiBpcyBuYW1lZCBgZXhlY3V0aW9uSGlzdG9yeWAgYnV0IHN0b3JlcyB0aGUgYENvbW1pdEJ1bmRsZVtdYCB0aGF0XG4gICAqIGBjb21taXRMb2dgIGV4cG9zZXMuIFRoZXkgYXJlIHRoZSBTQU1FIGFycmF5ICh2ZXJpZmllZCBieSB0aGVcbiAgICogXCJtYXRjaGVzIGNvbW1pdExvZy5sZW5ndGhcIiBpbnRlZ3JhdGlvbiB0ZXN0KS5cbiAgICovXG4gIGdldENvbW1pdENvdW50KCk6IG51bWJlciB7XG4gICAgY29uc3QgcnVudGltZSA9IHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWUoKSBhcyBJbnN0YW5jZVR5cGU8dHlwZW9mIEV4ZWN1dGlvblJ1bnRpbWU+IHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiBydW50aW1lPy5leGVjdXRpb25IaXN0b3J5Lmxlbmd0aCA/PyAwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc3VtZSBhIHBhdXNlZCBmbG93Y2hhcnQgZnJvbSBhIGNoZWNrcG9pbnQuXG4gICAqXG4gICAqIFJlc3RvcmVzIHRoZSBzY29wZSBzdGF0ZSwgY2FsbHMgdGhlIHBhdXNlZCBzdGFnZSdzIGByZXN1bWVGbmAgd2l0aCB0aGVcbiAgICogcHJvdmlkZWQgaW5wdXQsIHRoZW4gY29udGludWVzIHRyYXZlcnNhbCBmcm9tIHRoZSBuZXh0IHN0YWdlLlxuICAgKlxuICAgKiBUaGUgY2hlY2twb2ludCBjYW4gY29tZSBmcm9tIGBnZXRDaGVja3BvaW50KClgIG9uIGEgcHJldmlvdXMgcnVuLCBvciBmcm9tXG4gICAqIGEgc2VyaWFsaXplZCBjaGVja3BvaW50IHN0b3JlZCBpbiBSZWRpcy9Qb3N0Z3Jlcy9sb2NhbFN0b3JhZ2UuXG4gICAqXG4gICAqICoqTmFycmF0aXZlL3JlY29yZGVyIHN0YXRlIGlzIHJlc2V0IG9uIHJlc3VtZS4qKiBUbyBrZWVwIGEgdW5pZmllZCBuYXJyYXRpdmVcbiAgICogYWNyb3NzIHBhdXNlL3Jlc3VtZSBjeWNsZXMsIGNvbGxlY3QgaXQgYmVmb3JlIGNhbGxpbmcgcmVzdW1lLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFByb2Nlc3MgQSDigJQgYWZ0ZXIgYSBwYXVzZSwgcGVyc2lzdCB0aGUgY2hlY2twb2ludDpcbiAgICogY29uc3QgY2hlY2twb2ludCA9IGV4ZWN1dG9yLmdldENoZWNrcG9pbnQoKSE7XG4gICAqIGF3YWl0IHJlZGlzLnNldChgc2Vzc2lvbjoke2lkfWAsIEpTT04uc3RyaW5naWZ5KGNoZWNrcG9pbnQpKTtcbiAgICpcbiAgICogLy8gUHJvY2VzcyBCIChwb3NzaWJseSBkaWZmZXJlbnQgc2VydmVyLCBzYW1lIGNoYXJ0KSDigJQgcmVzdG9yZSBhbmQgcmVzdW1lOlxuICAgKiBjb25zdCByZXN0b3JlZCA9IEpTT04ucGFyc2UoYXdhaXQgcmVkaXMuZ2V0KGBzZXNzaW9uOiR7aWR9YCkpO1xuICAgKiBjb25zdCBleGVjdXRvciA9IG5ldyBGbG93Q2hhcnRFeGVjdXRvcihjaGFydCk7XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dG9yLnJlc3VtZShyZXN0b3JlZCwgeyBhcHByb3ZlZDogdHJ1ZSB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhc3luYyByZXN1bWUoXG4gICAgY2hlY2twb2ludDogRmxvd2NoYXJ0Q2hlY2twb2ludCxcbiAgICByZXN1bWVJbnB1dD86IHVua25vd24sXG4gICAgb3B0aW9ucz86IFBpY2s8UnVuT3B0aW9ucywgJ3NpZ25hbCcgfCAnZW52JyB8ICdtYXhEZXB0aCc+LFxuICApOiBQcm9taXNlPEV4ZWN1dG9yUmVzdWx0PiB7XG4gICAgLy8gUmUtZW50cmFuY3kgZ3VhcmQgRklSU1Qg4oCUIHJlc3VtZSgpIG11dGF0ZXMgdGhlIHNhbWUgcGVyLXJ1biBzdGF0ZSBydW4oKVxuICAgIC8vIGRvZXMgKHRyYXZlcnNlciwgcnVuSWQsIGNoZWNrcG9pbnQpLCBzbyByZXN1bWUtZHVyaW5nLXJ1biBhbmRcbiAgICAvLyBkb3VibGUtcmVzdW1lIGFyZSB0aGUgc2FtZSBjb3JydXB0aW9uIGNsYXNzIGFzIGNvbmN1cnJlbnQgcnVuKCkuXG4gICAgaWYgKHRoaXMuX2lzRXhlY3V0aW5nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdGbG93Q2hhcnRFeGVjdXRvcjogcmVzdW1lKCkgY2FsbGVkIHdoaWxlIGFub3RoZXIgcnVuKCkvcmVzdW1lKCkgaXMgaW4gZmxpZ2h0IG9uIHRoaXMgJyArXG4gICAgICAgICAgJ2V4ZWN1dG9yLiBBbiBleGVjdXRvciBob2xkcyBwZXItcnVuIHN0YXRlIChydW5JZCwgcmVjb3JkZXJzLCBjaGVja3BvaW50KSDigJQgY3JlYXRlICcgK1xuICAgICAgICAgICdvbmUgZXhlY3V0b3IgcGVyIGNvbmN1cnJlbnQgcnVuLiBTZWUgZG9jcy9ndWlkZXMvZXhlY3V0aW9uLW1vZGVsLm1kLicsXG4gICAgICApO1xuICAgIH1cbiAgICAvLyDilIDilIAgVmFsaWRhdGUgY2hlY2twb2ludCBzdHJ1Y3R1cmUgKG1heSBjb21lIGZyb20gdW50cnVzdGVkIGV4dGVybmFsIHN0b3JhZ2UpIOKUgOKUgFxuICAgIC8vIChsYXN0Q2hlY2twb2ludCBpcyB3aXBlZCBBRlRFUiB2YWxpZGF0aW9uIOKAlCBhIHJlamVjdGVkIGNoZWNrcG9pbnQgbXVzdFxuICAgIC8vIG5vdCBkZXN0cm95IHRoZSBleGVjdXRvcidzIGV4aXN0aW5nIGNoZWNrcG9pbnQgc3RhdGUuKVxuICAgIGlmIChcbiAgICAgICFjaGVja3BvaW50IHx8XG4gICAgICB0eXBlb2YgY2hlY2twb2ludCAhPT0gJ29iamVjdCcgfHxcbiAgICAgIHR5cGVvZiBjaGVja3BvaW50LnNoYXJlZFN0YXRlICE9PSAnb2JqZWN0JyB8fFxuICAgICAgY2hlY2twb2ludC5zaGFyZWRTdGF0ZSA9PT0gbnVsbCB8fFxuICAgICAgQXJyYXkuaXNBcnJheShjaGVja3BvaW50LnNoYXJlZFN0YXRlKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoZWNrcG9pbnQ6IHNoYXJlZFN0YXRlIG11c3QgYmUgYSBwbGFpbiBvYmplY3QuJyk7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgY2hlY2twb2ludC5wYXVzZWRTdGFnZUlkICE9PSAnc3RyaW5nJyB8fCBjaGVja3BvaW50LnBhdXNlZFN0YWdlSWQgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hlY2twb2ludDogcGF1c2VkU3RhZ2VJZCBtdXN0IGJlIGEgbm9uLWVtcHR5IHN0cmluZy4nKTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgIUFycmF5LmlzQXJyYXkoY2hlY2twb2ludC5zdWJmbG93UGF0aCkgfHxcbiAgICAgICFjaGVja3BvaW50LnN1YmZsb3dQYXRoLmV2ZXJ5KChzOiB1bmtub3duKSA9PiB0eXBlb2YgcyA9PT0gJ3N0cmluZycpXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgY2hlY2twb2ludDogc3ViZmxvd1BhdGggbXVzdCBiZSBhbiBhcnJheSBvZiBzdHJpbmdzLicpO1xuICAgIH1cblxuICAgIC8vIEZpbmQgdGhlIHBhdXNlZCBub2RlIGluIHRoZSBncmFwaFxuICAgIGNvbnN0IHBhdXNlZE5vZGUgPSB0aGlzLmZpbmROb2RlSW5HcmFwaChjaGVja3BvaW50LnBhdXNlZFN0YWdlSWQsIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpO1xuICAgIGlmICghcGF1c2VkTm9kZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHJlc3VtZTogc3RhZ2UgJyR7Y2hlY2twb2ludC5wYXVzZWRTdGFnZUlkfScgbm90IGZvdW5kIGluIGZsb3djaGFydC4gYCArXG4gICAgICAgICAgJ1RoZSBjaGFydCBtYXkgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBjaGVja3BvaW50IHdhcyBjcmVhdGVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoIXBhdXNlZE5vZGUucmVzdW1lRm4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke3BhdXNlZE5vZGUubmFtZX0nICgke3BhdXNlZE5vZGUuaWR9KSBoYXMgbm8gcmVzdW1lRm4uIGAgK1xuICAgICAgICAgICdPbmx5IHN0YWdlcyBjcmVhdGVkIHdpdGggYWRkUGF1c2FibGVGdW5jdGlvbigpIGNhbiBiZSByZXN1bWVkLicsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLmxhc3RDaGVja3BvaW50ID0gdW5kZWZpbmVkO1xuXG4gICAgLy8gQnVpbGQgYSBzeW50aGV0aWMgcmVzdW1lIG5vZGU6IGNhbGxzIHJlc3VtZUZuIHdpdGggcmVzdW1lSW5wdXQsIHRoZW4gY29udGludWVzLlxuICAgIC8vIHJlc3VtZUZuIHNpZ25hdHVyZSBpcyAoc2NvcGUsIGlucHV0KSBwZXIgUGF1c2FibGVIYW5kbGVyIOKAlCB3cmFwIHRvIG1hdGNoIFN0YWdlRnVuY3Rpb24oc2NvcGUsIGJyZWFrRm4pLlxuICAgIGNvbnN0IHJlc3VtZUZuID0gcGF1c2VkTm9kZS5yZXN1bWVGbjtcbiAgICBjb25zdCByZXN1bWVTdGFnZUZuID0gKHNjb3BlOiBUU2NvcGUpID0+IHtcbiAgICAgIHJldHVybiByZXN1bWVGbihzY29wZSwgcmVzdW1lSW5wdXQpO1xuICAgIH07XG5cbiAgICAvLyBEZXRlcm1pbmUgY29udGludWF0aW9uOiBmb3IgYnJhbmNoIGNoaWxkcmVuIChkZWNpZGVyL3NlbGVjdG9yKSxcbiAgICAvLyBwYXVzZWROb2RlLm5leHQgaXMgdW5kZWZpbmVkLiBUaGUgY2hlY2twb2ludCdzXG4gICAgLy8gY29udGludWF0aW9uU3RhZ2VJZCAoY29sbGVjdGVkIGR1cmluZyB0cmF2ZXJzYWwgYnViYmxlLXVwKVxuICAgIC8vIHBvaW50cyB0byB0aGUgaW52b2tlcidzIG5leHQgbm9kZS5cbiAgICAvL1xuICAgIC8vIEZvciBwYXVzZXMgaW5zaWRlIGEgc3ViZmxvdywgdGhlIGNvbnRpbnVhdGlvbiBsaXZlcyBJTlNJREUgdGhlXG4gICAgLy8gbGVhZiBzdWJmbG93IChlLmcuLCB0aGUgbG9vcCB0YXJnZXQgYmFjayB0byBgbWVzc2FnZXNgKS4gU2VhcmNoXG4gICAgLy8gdGhlIGxlYWYgc3ViZmxvdyBmaXJzdDsgZmFsbCBiYWNrIHRvIHRvcC1sZXZlbCBmb3Igcm9vdC1sZXZlbFxuICAgIC8vIHBhdXNlcy5cbiAgICAvLyBDbG9uZS1pbjogYHN1YmZsb3dTdGF0ZXNgIHNlZWRzIG5lc3RlZCBydW50aW1lcyBpbiBTdWJmbG93RXhlY3V0b3JcbiAgICAvLyAoc2hhbGxvdy1tZXJnZWQgaW50byBlYWNoIG5lc3RlZCBTaGFyZWRNZW1vcnkpLCBzbyB3aXRob3V0IGEgY29weSB0aGVcbiAgICAvLyBlbmdpbmUgd291bGQgaG9sZCBsaXZlIHJlZmVyZW5jZXMgaW50byB0aGUgY2FsbGVyJ3MgY2hlY2twb2ludCBvYmplY3Qg4oCUXG4gICAgLy8gY2FsbGVyIG11dGF0aW9ucyB3b3VsZCBibGVlZCBpbnRvIHRoZSByZXN1bWVkIHJ1biBhbmQgZW5naW5lIHdyaXRlc1xuICAgIC8vIHdvdWxkIHJlYWNoIGEgY2hlY2twb2ludCB0aGUgY2FsbGVyIG1heSBoYXZlIGFscmVhZHkgcGVyc2lzdGVkLlxuICAgIGNvbnN0IHNmU3RhdGVzID0gc3RydWN0dXJlZENsb25lKGNoZWNrcG9pbnQuc3ViZmxvd1N0YXRlcyk7XG4gICAgY29uc3QgbGVhZlN1YmZsb3dJZCA9XG4gICAgICBjaGVja3BvaW50LnN1YmZsb3dQYXRoLmxlbmd0aCA+IDAgPyBjaGVja3BvaW50LnN1YmZsb3dQYXRoW2NoZWNrcG9pbnQuc3ViZmxvd1BhdGgubGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQ7XG4gICAgbGV0IGNvbnRpbnVhdGlvbk5leHQgPSBwYXVzZWROb2RlLm5leHQ7XG4gICAgLy8gQSBicmFuY2gtc291cmNlZCBsb29wIChgeyBsb29wVG8gfWAgLyBgRGVjaWRlckxpc3QubG9vcFRvYCkgc2V0cyB0aGVcbiAgICAvLyBsb29waW5nIGJyYW5jaCdzIGBuZXh0YCB0byBhIGxvb3AtcmVmIFNUVUIg4oCUIGB7IGlkLCBpc0xvb3BSZWY6dHJ1ZSB9YFxuICAgIC8vIHdpdGggbm8gZm4vY2hpbGRyZW4vc3ViZmxvd0lkLiBPbiBhIE5PUk1BTCBydW4gdGhhdCBzdHViIHJlc29sdmVzIGZpbmU6XG4gICAgLy8gdGhlIHJlYWwgdGFyZ2V0IG5vZGUgaXMgcmVhY2hhYmxlIGZyb20gdGhlIGNoYXJ0IHJvb3QsIHNvIHRoZSB0cmF2ZXJzZXInc1xuICAgIC8vIG5vZGUgbWFwIGFscmVhZHkgaG9sZHMgaXQgKHRoZSBzdHViIGlzIHNraXBwZWQg4oCUIGZpcnN0LXdyaXRlLXdpbnMpLiBPblxuICAgIC8vIFJFU1VNRSB0aGUgbm9kZSBtYXAgaXMgYnVpbHQgZnJvbSB0aGUgdHJ1bmNhdGVkIHJlc3VtZSByb290LCB3aGVyZSB0aGVcbiAgICAvLyByZWFsIHRhcmdldCBpcyB1bnJlYWNoYWJsZSwgc28gdGhlIHN0dWIgd291bGQgd2luIHRoZSBpZCBzbG90IGFuZFxuICAgIC8vIGBleGVjdXRlTm9kZWAgdGhyb3dzIFwiTm9kZSAnPHRhcmdldD4nIG11c3QgZGVmaW5lIC4uLlwiLiBSZXNvbHZlIHRoZSBzdHViXG4gICAgLy8gdG8gdGhlIFJFQUwgdGFyZ2V0IG5vZGUgaGVyZSAoZGZzRmluZCBza2lwcyBsb29wLXJlZnMgYW5kIHJldHVybnMgdGhlXG4gICAgLy8gcmVhbCBub2RlIFdJVEggaXRzIGZ1bGwgZG93bnN0cmVhbSBjaGFpbiDigJQgZS5nLiBhIHN1YmZsb3cgTU9VTlQgbm9kZSxcbiAgICAvLyB3aG9zZSBgLm5leHRgIGNhcnJpZXMgdGhlIGRlY2lkZXIvdGVybWluYWwgY29udGludWF0aW9uIHRoZSBsb29wIG11c3RcbiAgICAvLyByZS1lbnRlcikuIFNlZSB0ZXN0L2xpYi9wYXVzZS9yZXN1bWUtYnJhbmNoLWxvb3Atc3ViZmxvdy50ZXN0LnRzLlxuICAgIGlmIChjb250aW51YXRpb25OZXh0Py5pc0xvb3BSZWYpIHtcbiAgICAgIGNvbnN0IGxvb3BUYXJnZXRJZCA9IGNvbnRpbnVhdGlvbk5leHQuaWQ7XG4gICAgICBjb25zdCByZWFsVGFyZ2V0ID1cbiAgICAgICAgKGxlYWZTdWJmbG93SWQgIT09IHVuZGVmaW5lZCA/IHRoaXMuZmluZE5vZGVJbkdyYXBoKGxvb3BUYXJnZXRJZCwgY2hlY2twb2ludC5zdWJmbG93UGF0aCkgOiB1bmRlZmluZWQpID8/XG4gICAgICAgIHRoaXMuZmluZE5vZGVJbkdyYXBoKGxvb3BUYXJnZXRJZCwgW10pO1xuICAgICAgaWYgKHJlYWxUYXJnZXQpIGNvbnRpbnVhdGlvbk5leHQgPSByZWFsVGFyZ2V0O1xuICAgIH1cbiAgICBpZiAoIWNvbnRpbnVhdGlvbk5leHQgJiYgY2hlY2twb2ludC5jb250aW51YXRpb25TdGFnZUlkKSB7XG4gICAgICAvLyBTZWFyY2ggbGVhZiBzdWJmbG93IGZpcnN0IChsb29wIHRhcmdldHMgLyBicmFuY2ggam9pbnMgbGl2ZSB0aGVyZSksXG4gICAgICAvLyB0aGVuIGZhbGwgYmFjayB0byB0b3AgbGV2ZWwuXG4gICAgICBjb250aW51YXRpb25OZXh0ID0gbGVhZlN1YmZsb3dJZFxuICAgICAgICA/IHRoaXMuZmluZE5vZGVJbkdyYXBoKGNoZWNrcG9pbnQuY29udGludWF0aW9uU3RhZ2VJZCwgY2hlY2twb2ludC5zdWJmbG93UGF0aClcbiAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWNvbnRpbnVhdGlvbk5leHQpIHtcbiAgICAgICAgY29udGludWF0aW9uTmV4dCA9IHRoaXMuZmluZE5vZGVJbkdyYXBoKGNoZWNrcG9pbnQuY29udGludWF0aW9uU3RhZ2VJZCwgW10pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRoZSBcImlubmVyXCIgcmVzdW1lIGNoYWluOiByZXN1bWVGbiDihpIgY29udGludWF0aW9uLiBUaGlzIGlzIHdoYXRcbiAgICAvLyBydW5zIElOU0lERSB0aGUgbGVhZiBzdWJmbG93J3MgYm9keS4gRm9yIGEgcm9vdC1sZXZlbCBwYXVzZVxuICAgIC8vIChzdWJmbG93UGF0aCBlbXB0eSksIHRoaXMgaXMgYWxzbyB0aGUgdG9wLWxldmVsIHJlc3VtZSByb290LlxuICAgIGNvbnN0IGlubmVyUmVzdW1lQ2hhaW46IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+ID0ge1xuICAgICAgbmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgICAgaWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgICBkZXNjcmlwdGlvbjogcGF1c2VkTm9kZS5kZXNjcmlwdGlvbixcbiAgICAgIGZuOiByZXN1bWVTdGFnZUZuLFxuICAgICAgbmV4dDogY29udGludWF0aW9uTmV4dCxcbiAgICB9O1xuXG4gICAgLy8gRG9uJ3QgY2xlYXIgcmVjb3JkZXJzIOKAlCByZXN1bWUgY29udGludWVzIGZyb20gcHJldmlvdXMgc3RhdGUuXG4gICAgLy8gTmFycmF0aXZlLCBtZXRyaWNzLCBkZWJ1ZyBlbnRyaWVzIGFjY3VtdWxhdGUgYWNyb3NzIHBhdXNlL3Jlc3VtZS5cbiAgICAvL1xuICAgIC8vIFR3by1tb2RlIHJlc3VtZTpcbiAgICAvLyAgIOKAoiBTYW1lLWV4ZWN1dG9yIChydW4oKSBwcmV2aW91c2x5IGNhbGxlZCBvbiBUSElTIGluc3RhbmNlKTpcbiAgICAvLyAgICAgcmV1c2UgdGhlIGV4aXN0aW5nIHJ1bnRpbWUgc28gdGhlIGV4ZWN1dGlvbiB0cmVlIGNvbnRpbnVlc1xuICAgIC8vICAgICBmcm9tIHRoZSBwYXVzZSBwb2ludCBhbmQgcmVjb3JkZXJzL25hcnJhdGl2ZSBhY2N1bXVsYXRlLlxuICAgIC8vICAg4oCiIENyb3NzLWV4ZWN1dG9yIChmcmVzaCBleGVjdXRvciByZWNvbnN0cnVjdGVkIGZyb20gYSBzdG9yZWRcbiAgICAvLyAgICAgY2hlY2twb2ludCk6IHNlZWQgYSBORVcgcnVudGltZSBmcm9tIGBjaGVja3BvaW50LnNoYXJlZFN0YXRlYFxuICAgIC8vICAgICBzbyByZXN1bWUgaGFuZGxlcnMgY2FuIHJlYWQgcHJlLXBhdXNlIHNjb3BlLiBUaGUgZXhlY3V0aW9uXG4gICAgLy8gICAgIHRyZWUgc3RhcnRzIGF0IHRoZSByZXN1bWUgbm9kZSDigJQgd2UgZG9uJ3QgaGF2ZSB0aGUgcHJldmlvdXNcbiAgICAvLyAgICAgdHJhdmVyc2FsJ3MgdHJlZSBvbiBhIGZyZXNoIHByb2Nlc3MgYW55d2F5LlxuICAgIGNvbnN0IHNhbWVFeGVjdXRvciA9IHRoaXMuX2hhc1J1bkJlZm9yZTtcbiAgICBjb25zdCBleGlzdGluZ1J1bnRpbWUgPSBzYW1lRXhlY3V0b3JcbiAgICAgID8gKHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWUoKSBhcyBJbnN0YW5jZVR5cGU8dHlwZW9mIEV4ZWN1dGlvblJ1bnRpbWU+KVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgdGhpcy5faGFzUnVuQmVmb3JlID0gdHJ1ZTsgLy8gYW55IHBhdGggdGhhdCByZXN1bWVzIGNvdW50cyBhcyBhIHJ1blxuICAgIC8vIFJlc3VtZSBnZXRzIGEgTkVXIHJ1bklkIOKAlCByZXN1bWUgaXMgbG9naWNhbGx5IGEgZGlzdGluY3QgcnVuLlxuICAgIC8vIE9yaWdpbmFsIHJ1bklkIGlzIHJlY292ZXJhYmxlIGZyb20gY2hlY2twb2ludCBtZXRhZGF0YSBpZiBhIGNvbnN1bWVyXG4gICAgLy8gbmVlZHMgY3Jvc3MtcnVuIGF1ZGl0ICh3ZSBkb24ndCBzdG9yZSBpdCBvbiB0aGUgY2hlY2twb2ludCB0b2RheTtcbiAgICAvLyBmdXR1cmUgZW5oYW5jZW1lbnQpLiBTZWUgYHJ1bklkLnRzYC5cbiAgICB0aGlzLl9jdXJyZW50UnVuSWQgPSBnZW5lcmF0ZVJ1bklkKCk7XG5cbiAgICAvLyBQaWNrIHRoZSByZXN1bWUgcm9vdCArIGluaXRpYWwgY29udGV4dC5cbiAgICAvL1xuICAgIC8vICAgUk9PVC1MRVZFTCBQQVVTRSAoc3ViZmxvd1BhdGggZW1wdHkpOlxuICAgIC8vICAgICByZXN1bWUgcm9vdCA9IGlubmVyUmVzdW1lQ2hhaW4gKHJ1biByZXN1bWVGbiBhdCB0b3AgbGV2ZWwpLlxuICAgIC8vICAgICBpbml0aWFsQ29udGV4dCA9IGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUuXG4gICAgLy9cbiAgICAvLyAgIFNVQkZMT1ctTkVTVEVEIFBBVVNFIChzdWJmbG93UGF0aCBub24tZW1wdHkpOlxuICAgIC8vICAgICBUaGUgcGF1c2Ugd2FzIElOU0lERSBhIHN1YmZsb3cncyBib2R5LiBUbyBydW4gdGhlIHN1YmZsb3cnc1xuICAgIC8vICAgICBvdXRwdXRNYXBwZXIgYW5kIHRoZSBwYXJlbnQncyBjb250aW51YXRpb24sIHdlIGhhdmUgdG8gZW50ZXJcbiAgICAvLyAgICAgdGhyb3VnaCB0aGUgT1VURVIgTU9VTlQgKHRoZSBwYXJlbnQncyBub2RlIHRoYXQgbW91bnRzIHRoZVxuICAgIC8vICAgICBsZWFmIHN1YmZsb3cpLiBXZSBzd2FwIHRoZSBsZWFmIHN1YmZsb3cncyByb290IHdpdGhcbiAgICAvLyAgICAgaW5uZXJSZXN1bWVDaGFpbiBzbyBTdWJmbG93RXhlY3V0b3I6XG4gICAgLy8gICAgICAgMS4gZW50ZXJzIHRoZSBzdWJmbG93IGJvdW5kYXJ5LFxuICAgIC8vICAgICAgIDIuIHNlZWRzIHRoZSBuZXN0ZWQgcnVudGltZSBmcm9tIHN1YmZsb3dTdGF0ZXNbbGVhZl1cbiAgICAvLyAgICAgICAgICAoc2tpcHBpbmcgdGhlIGlucHV0TWFwcGVyIOKAlCBzZWUgU3ViZmxvd0V4ZWN1dG9yLnRzKSxcbiAgICAvLyAgICAgICAzLiBydW5zIHRoZSByZXN1bWVGbiDihpIgY29udGludWF0aW9uIGNoYWluLFxuICAgIC8vICAgICAgIDQuIHJ1bnMgdGhlIG91dHB1dE1hcHBlciBhdCBleGl0LFxuICAgIC8vICAgICAgIDUuIHBhcmVudCB0cmF2ZXJzYWwgY29udGludWVzIG5vcm1hbGx5LlxuICAgIC8vXG4gICAgLy8gICAgIENyb3NzLWV4ZWN1dG9yOiBpbml0aWFsQ29udGV4dCA9IGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUgKHRoZVxuICAgIC8vICAgICAgIHBhcmVudCdzIHZpZXcgYXQgcGF1c2UgdGltZSDigJQgb3V0cHV0TWFwcGVyIHdyaXRlcyBiYWNrIGludG8gaXQpLlxuICAgIC8vICAgICBTYW1lLWV4ZWN1dG9yOiBleGlzdGluZ1J1bnRpbWUgaXMgcmV1c2VkOyBpbml0aWFsQ29udGV4dCBpcyBtb290XG4gICAgLy8gICAgICAgZm9yIHRoZSBzdWJmbG93IGZyYW1lIChhbHJlYWR5IGluIHRoZSBydW50aW1lIHN0YWNrKSwgYnV0IHdlXG4gICAgLy8gICAgICAgc3RpbGwgcGFzcyBzaGFyZWRTdGF0ZSBmb3IgY29uc2lzdGVuY3kuXG4gICAgY29uc3QgZmMgPSB0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0O1xuICAgIGxldCByZXN1bWVSb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IGlubmVyUmVzdW1lQ2hhaW47XG4gICAgbGV0IHN1YmZsb3dzT3ZlcnJpZGU6IFJlY29yZDxzdHJpbmcsIHsgcm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfT4gfCB1bmRlZmluZWQ7XG4gICAgaWYgKGxlYWZTdWJmbG93SWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gRmluZCB0aGUgT1VURVIgbW91bnQgbm9kZSBmb3IgdGhlIEZJUlNUIGVudHJ5IG9uIHRoZSBwYXRoLlxuICAgICAgLy8gRm9yIHNpbmdsZS1sZXZlbCBwYXVzZXMsIHRoaXMgaXMgdGhlIG9ubHkgbW91bnQgd2UgbmVlZCB0b1xuICAgICAgLy8gZW50ZXIgdGhyb3VnaC4gRm9yIG5lc3RlZCBtb3VudHMgdGhlIHBhdHRlcm4gd291bGQgZXh0ZW5kLCBidXRcbiAgICAgIC8vIHNpbmdsZS1sZXZlbCBjb3ZlcnMgYWxsIGN1cnJlbnQgdXNlIGNhc2VzIChTZXF1ZW5jZShBZ2VudCksXG4gICAgICAvLyBDb25kaXRpb25hbChBZ2VudCksIFBhcmFsbGVsIGJyYW5jaGVzIHdpdGggcGF1c2VkIGFnZW50cykuXG4gICAgICBjb25zdCBvdXRlclN1YmZsb3dJZCA9IGNoZWNrcG9pbnQuc3ViZmxvd1BhdGhbMF07XG4gICAgICBjb25zdCBvdXRlck1vdW50ID0gdGhpcy5maW5kTW91bnRJbkdyYXBoKGZjLnJvb3QsIG91dGVyU3ViZmxvd0lkKTtcbiAgICAgIGlmIChvdXRlck1vdW50KSB7XG4gICAgICAgIHJlc3VtZVJvb3QgPSBvdXRlck1vdW50O1xuICAgICAgfVxuICAgICAgLy8gUmVwbGFjZSB0aGUgbGVhZiBzdWJmbG93J3Mgcm9vdCB3aXRoIHRoZSByZXN1bWUgY2hhaW4gc28gdGhlXG4gICAgICAvLyBib2R5IHJ1bnMgZnJvbSB0aGUgcGF1c2UgcG9pbnQgZm9yd2FyZC5cbiAgICAgIHN1YmZsb3dzT3ZlcnJpZGUgPSB7IC4uLihmYy5zdWJmbG93cyA/PyB7fSkgfTtcbiAgICAgIHN1YmZsb3dzT3ZlcnJpZGVbbGVhZlN1YmZsb3dJZF0gPSB7IHJvb3Q6IGlubmVyUmVzdW1lQ2hhaW4gfTtcbiAgICB9XG4gICAgLy8gQ2xvbmUtaW4gZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyBgc2ZTdGF0ZXNgIGFib3ZlOiBgaW5pdGlhbENvbnRleHRgXG4gICAgLy8gc2VlZHMgdGhlIGZyZXNoIFNoYXJlZE1lbW9yeSB2aWEgYG1lcmdlQ29udGV4dFdpbnNgLCB3aGljaCBjb3BpZXMgb25seVxuICAgIC8vIHRoZSBUT1AgbGV2ZWwg4oCUIG5lc3RlZCBvYmplY3RzIHdvdWxkIGFsaWFzIHRoZSBjYWxsZXIncyBjaGVja3BvaW50LlxuICAgIGNvbnN0IHJlc3VtZUluaXRpYWxDb250ZXh0ID0gc3RydWN0dXJlZENsb25lKGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUpO1xuXG4gICAgdGhpcy50cmF2ZXJzZXIgPSB0aGlzLmNyZWF0ZVRyYXZlcnNlcihvcHRpb25zPy5zaWduYWwsIHVuZGVmaW5lZCwgb3B0aW9ucz8uZW52LCBvcHRpb25zPy5tYXhEZXB0aCwge1xuICAgICAgcm9vdDogcmVzdW1lUm9vdCxcbiAgICAgIGluaXRpYWxDb250ZXh0OiByZXN1bWVJbml0aWFsQ29udGV4dCxcbiAgICAgIHByZXNlcnZlUmVjb3JkZXJzOiB0cnVlLFxuICAgICAgLi4uKGV4aXN0aW5nUnVudGltZSA/IHsgZXhpc3RpbmdSdW50aW1lIH0gOiB7fSksXG4gICAgICAvLyBIYW5kIHRoZSBwZXItc3ViZmxvdyBzY29wZSBjYXB0dXJlcyBkb3duIHRvIFN1YmZsb3dFeGVjdXRvci5cbiAgICAgIC8vIEFsd2F5cyBwcmVzZW50IG9uIGEgY2hlY2twb2ludCDigJQgZW1wdHkgYHt9YCBmb3Igcm9vdCBwYXVzZXMuXG4gICAgICBzdWJmbG93U3RhdGVzRm9yUmVzdW1lOiBzZlN0YXRlcyxcbiAgICAgIC4uLihzdWJmbG93c092ZXJyaWRlICYmIHsgc3ViZmxvd3NPdmVycmlkZSB9KSxcbiAgICB9KTtcblxuICAgIC8vIEZpcmUgb25SZXN1bWUgZXZlbnQgb24gYWxsIHJlY29yZGVycyAoZmxvdyArIHNjb3BlKS4gU3RhbXAgdGhlXG4gICAgLy8gc3ludGhldGljIFRyYXZlcnNhbENvbnRleHQgZm9yIHRoZSByZXN1bWVkIHN0YWdlIHdpdGggdGhlIE5FV1xuICAgIC8vIHJ1bklkIHNvIGNvbnN1bWVycyBkZXRlY3QgXCJ0aGlzIGlzIGEgZnJlc2ggbG9naWNhbCBydW5cIiB2aWFcbiAgICAvLyB0aGUgc2FtZSBydW5JZC1jaGFuZ2UgcGF0dGVybiB0aGV5IHVzZSBmb3IgYG9uUnVuU3RhcnRgLlxuICAgIGNvbnN0IGhhc0lucHV0ID0gcmVzdW1lSW5wdXQgIT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXN1bWVSdW50aW1lU3RhZ2VJZCA9IGJ1aWxkUnVudGltZVN0YWdlSWQocGF1c2VkTm9kZS5pZCwgdGhpcy5fZXhlY3V0aW9uQ291bnRlci52YWx1ZSk7XG4gICAgY29uc3QgZmxvd1Jlc3VtZUV2ZW50ID0ge1xuICAgICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgaGFzSW5wdXQsXG4gICAgICB0cmF2ZXJzYWxDb250ZXh0OiB7XG4gICAgICAgIHJ1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsXG4gICAgICAgIHN0YWdlSWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiByZXN1bWVSdW50aW1lU3RhZ2VJZCxcbiAgICAgICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICAgIGRlcHRoOiAwLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHRoaXMuY29tYmluZWRSZWNvcmRlci5vblJlc3VtZShmbG93UmVzdW1lRXZlbnQpO1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmZsb3dSZWNvcmRlcnMpIHIub25SZXN1bWU/LihmbG93UmVzdW1lRXZlbnQpO1xuXG4gICAgY29uc3Qgc2NvcGVSZXN1bWVFdmVudCA9IHtcbiAgICAgIHN0YWdlTmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgICAgc3RhZ2VJZDogcGF1c2VkTm9kZS5pZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBidWlsZFJ1bnRpbWVTdGFnZUlkKHBhdXNlZE5vZGUuaWQsIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUpLFxuICAgICAgaGFzSW5wdXQsXG4gICAgICBwaXBlbGluZUlkOiAnJyxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICB9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnNjb3BlUmVjb3JkZXJzKSByLm9uUmVzdW1lPy4oc2NvcGVSZXN1bWVFdmVudCk7XG5cbiAgICAvLyBTZXQgQUZURVIgYWxsIHN5bmMgdmFsaWRhdGlvbi9sb29rdXAgdGhyb3dzIGFib3ZlIChub3RoaW5nIGNhbiBsZWFrIHRoZVxuICAgIC8vIGZsYWcpOyBubyBhd2FpdCBiZXR3ZWVuIHRoZSB0b3Atb2YtbWV0aG9kIGNoZWNrIGFuZCBoZXJlLCBzbyByYWNlLWZyZWUuXG4gICAgdGhpcy5faXNFeGVjdXRpbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50cmF2ZXJzZXIuZXhlY3V0ZSgpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHRoaXMuYnVpbGRQYXVzZUNoZWNrcG9pbnQoZXJyb3IpO1xuICAgICAgICByZXR1cm4geyBwYXVzZWQ6IHRydWUsIGNoZWNrcG9pbnQ6IHRoaXMubGFzdENoZWNrcG9pbnQgfSBzYXRpc2ZpZXMgUGF1c2VkUmVzdWx0O1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2lzRXhlY3V0aW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgZnVsbHkgREVUQUNIRUQgY2hlY2twb2ludCBmcm9tIGEgY2F1Z2h0IFBhdXNlU2lnbmFsLlxuICAgKlxuICAgKiBFdmVyeSBmaWVsZCBpcyBkZWVwLWNvcGllZCB2aWEgb25lIGBzdHJ1Y3R1cmVkQ2xvbmVgIG9mIHRoZSBhc3NlbWJsZWRcbiAgICogY2hlY2twb2ludCwgYmVjYXVzZSB0aGUgcmF3IHBpZWNlcyBhbGlhcyBsaXZlIGVuZ2luZSBzdGF0ZTpcbiAgICpcbiAgICogICAtIGBzaGFyZWRTdGF0ZWAgSVMgYFNoYXJlZE1lbW9yeWAncyBpbnRlcm5hbCBjb250ZXh0IG9iamVjdCDigJQgdGhlIGFsaWFzXG4gICAqICAgICBvbmx5IGRldGFjaGVzIGF0IHRoZSBuZXh0IGNvbW1pdCAoYGFwcGx5U21hcnRNZXJnZWAgcmVidWlsZHMgaXQpLCBhbmRcbiAgICogICAgIGFmdGVyIGEgcGF1c2UgdGhlcmUgaXMgbm8gbmV4dCBjb21taXQgdW50aWwgcmVzdW1lLlxuICAgKiAgIC0gYGV4ZWN1dGlvblRyZWVgIG5vZGVzIGFyZSBmcmVzaCwgYnV0IHRoZWlyIGBsb2dzYC9gZXJyb3JzYC9gbWV0cmljc2AvXG4gICAqICAgICBgZXZhbHNgL2BzdGFnZVJlYWRzYC9gZmxvd01lc3NhZ2VzYCBmaWVsZHMgcmVmZXJlbmNlIGxpdmVcbiAgICogICAgIGBEaWFnbm9zdGljQ29sbGVjdG9yYCBiYWdzIHRoYXQga2VlcCBhY2N1bXVsYXRpbmcgb24gc2FtZS1leGVjdXRvclxuICAgKiAgICAgcmVzdW1lLlxuICAgKiAgIC0gYHN1YmZsb3dTdGF0ZXNgIHZhbHVlcyBhcmUgc2hhbGxvdyBjb3BpZXMgd2hvc2UgTkVTVEVEIG9iamVjdHMgYWxpYXNcbiAgICogICAgIHN1YmZsb3cgbWVtb3J5LCBhbmQgdGhleSBnZXQgc2VlZGVkIGJhY2sgaW50byBsaXZlIHJ1bnRpbWVzIG9uIHJlc3VtZS5cbiAgICogICAtIGBzdWJmbG93UmVzdWx0c2AgdmFsdWVzIHN0YXkgcmVmZXJlbmNlZCBieSB0aGUgdHJhdmVyc2VyJ3MgcmVzdWx0cyBtYXAuXG4gICAqXG4gICAqIFRoZSBjaGVja3BvaW50IGlzIHBlcnNpc3RlZCBieSBjb250cmFjdCAoXCJzdG9yZSBpbiBSZWRpcy9Qb3N0Z3Jlc1wiKSDigJQgaXRcbiAgICogbXVzdCBuZXZlciBzaGFyZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgZW5naW5lLiBQYXVzZSBpcyBub3QgYSBob3QgcGF0aDsgdGhlXG4gICAqIGNsb25lIGNvc3QgaXMgaXJyZWxldmFudC5cbiAgICpcbiAgICogVGhlIEpTT04tc2FmZSBjaGVja3BvaW50IGNvbnRyYWN0IChubyBmdW5jdGlvbnMsIG5vIGNsYXNzIGluc3RhbmNlcylcbiAgICogZ292ZXJucyBDT05TVU1FUi1vd25lZCBkYXRhIOKAlCBidXQgdGhlIGV4ZWN1dGlvblRyZWUncyBkaWFnbm9zdGljIGJhZ3NcbiAgICogYWNjZXB0IEFOWSB2YWx1ZSBhdCB3cml0ZSB0aW1lIHdpdGhvdXQgY2xvbmluZyAoJGRlYnVnLyRlcnJvci8kbWV0cmljL1xuICAgKiAkZXZhbCBzdG9yZSByYXcgcmVmZXJlbmNlcyksIHNvIGEgY29udHJhY3QtY29tcGxpYW50IHJ1biBjYW4gc3RpbGwgY2FycnlcbiAgICogYSBub24tY2xvbmVhYmxlIGRpYWdub3N0aWMuIE9ic2VydmFiaWxpdHkgc2lkZS1iYWdzIG5ldmVyIGFib3J0IHRyYXZlcnNhbFxuICAgKiBhbnl3aGVyZSBlbHNlIGluIHRoZSBsaWJyYXJ5LCBzbyB0aGV5IG11c3Qgbm90IGFib3J0IHRoZSBwYXVzZSBlaXRoZXI6XG4gICAqIG9uIGNsb25lIGZhaWx1cmUgd2Ugc2FuaXRpemUgdGhlIGRpYWdub3N0aWMgYmFncyAobm9uLWNsb25lYWJsZSB2YWx1ZXNcbiAgICogYmVjb21lICdbbm9uLXNlcmlhbGl6YWJsZTog4oCmXScgbWFya2VycyDigJQgdGhlIGxpdmUgZW5naW5lIGJhZ3MgYXJlIG5ldmVyXG4gICAqIHRvdWNoZWQpIGFuZCByZXRyeS4gSWYgdGhlIHJldHJ5IFNUSUxMIGZhaWxzLCB0aGUgdmlvbGF0aW9uIGlzIGluXG4gICAqIGNvbnN1bWVyLW93bmVkIGRhdGEgKHJlYWxpc3RpY2FsbHkgYHBhdXNlRGF0YWAg4oCUIGEgZnVuY3Rpb24gaW4gc2hhcmVkXG4gICAqIHN0YXRlIGFscmVhZHkgcmVqZWN0cyBhdCBzdGFnZSBlbnRyeSB3aGVuIFRyYW5zYWN0aW9uQnVmZmVyIGNsb25lcyB0aGVcbiAgICogY29udGV4dCkgYW5kIHdlIHRocm93IGEgREVTQ1JJUFRJVkUgY29udHJhY3QgZXJyb3IgbmFtaW5nIHRoZSBvZmZlbmRpbmdcbiAgICogY2hlY2twb2ludCBmaWVsZChzKS4gQSBuYWtlZCBEYXRhQ2xvbmVFcnJvciBuZXZlciBlc2NhcGVzLlxuICAgKlxuICAgKiBTdWJmbG93IHNjb3BlIGNhcHR1cmUgKGBzdWJmbG93U3RhdGVzYCkgc3Vydml2ZXMgT05MWSBvbiB0aGUgc2lnbmFsIOKAlCB0aGVcbiAgICogbmVzdGVkIHJ1bnRpbWVzIGFyZSBHQydkIGFzIHRoZSBzdGFjayB1bndpbmRzLiBQcm9tb3RpbmcgaXQgb250byB0aGVcbiAgICogY2hlY2twb2ludCBoZXJlIGxldHMgY3Jvc3MtZXhlY3V0b3IgcmVzdW1lIHJlc3RvcmUgcHJlLXBhdXNlIHN1YmZsb3dcbiAgICogc2NvcGUgKGUuZy4gYW4gQWdlbnQncyBgc2NvcGUuaGlzdG9yeWApLiBFbXB0eSBge31gIGZvciByb290LWxldmVsIHBhdXNlcy5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRQYXVzZUNoZWNrcG9pbnQoc2lnbmFsOiBQYXVzZVNpZ25hbCk6IEZsb3djaGFydENoZWNrcG9pbnQge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy50cmF2ZXJzZXIuZ2V0U25hcHNob3QoKTtcbiAgICBjb25zdCBzZlJlc3VsdHMgPSB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICAgIGNvbnN0IGNoZWNrcG9pbnQgPSB7XG4gICAgICBzaGFyZWRTdGF0ZTogc25hcHNob3Quc2hhcmVkU3RhdGUsXG4gICAgICBleGVjdXRpb25UcmVlOiBzbmFwc2hvdC5leGVjdXRpb25UcmVlLFxuICAgICAgcGF1c2VkU3RhZ2VJZDogc2lnbmFsLnN0YWdlSWQsXG4gICAgICBzdWJmbG93UGF0aDogc2lnbmFsLnN1YmZsb3dQYXRoLFxuICAgICAgcGF1c2VEYXRhOiBzaWduYWwucGF1c2VEYXRhLFxuICAgICAgc3ViZmxvd1N0YXRlczogc2lnbmFsLnN1YmZsb3dTdGF0ZXMsXG4gICAgICAuLi4oc2ZSZXN1bHRzLnNpemUgPiAwICYmIHsgc3ViZmxvd1Jlc3VsdHM6IE9iamVjdC5mcm9tRW50cmllcyhzZlJlc3VsdHMpIH0pLFxuICAgICAgLy8gSW52b2tlciBjb250ZXh0IOKAlCBjb2xsZWN0ZWQgZHVyaW5nIHRyYXZlcnNhbCBidWJibGUtdXAgKG5vdCB0cmVlLXdhbGtlZClcbiAgICAgIC4uLihzaWduYWwuaW52b2tlclN0YWdlSWQgJiYgeyBpbnZva2VyU3RhZ2VJZDogc2lnbmFsLmludm9rZXJTdGFnZUlkIH0pLFxuICAgICAgLi4uKHNpZ25hbC5jb250aW51YXRpb25TdGFnZUlkICYmIHsgY29udGludWF0aW9uU3RhZ2VJZDogc2lnbmFsLmNvbnRpbnVhdGlvblN0YWdlSWQgfSksXG4gICAgICBwYXVzZWRBdDogRGF0ZS5ub3coKSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKGNoZWNrcG9pbnQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTm9uLWNsb25lYWJsZSBkaWFnbm9zdGljcyBtdXN0IG5vdCBzd2FsbG93IHRoZSBwYXVzZSDigJQgc2FuaXRpemUgdGhlXG4gICAgICAvLyBleGVjdXRpb25UcmVlJ3MgYmFncyAobWFya2VycyByZXBsYWNlIHRoZSBvZmZlbmRlcnMpIGFuZCByZXRyeS5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNoZWNrcG9pbnQuZXhlY3V0aW9uVHJlZSA9IHNhbml0aXplRGlhZ25vc3RpY0JhZ3MoY2hlY2twb2ludC5leGVjdXRpb25UcmVlIGFzIFN0YWdlU25hcHNob3QpO1xuICAgICAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKGNoZWNrcG9pbnQpO1xuICAgICAgfSBjYXRjaCAocmV0cnlFcnJvcikge1xuICAgICAgICAvLyBHZW51aW5lIEpTT04tc2FmZSBjb250cmFjdCB2aW9sYXRpb24gaW4gY29uc3VtZXItb3duZWQgZGF0YS5cbiAgICAgICAgdGhyb3cgZGVzY3JpYmVDaGVja3BvaW50Q2xvbmVGYWlsdXJlKGNoZWNrcG9pbnQsIHJldHJ5RXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgU3RhZ2VOb2RlIGluIHRoZSBjb21waWxlZCBncmFwaCBieSBJRC5cbiAgICogSGFuZGxlcyBzdWJmbG93IHBhdGhzIGJ5IGRyaWxsaW5nIGludG8gcmVnaXN0ZXJlZCBzdWJmbG93cy5cbiAgICovXG4gIHByaXZhdGUgZmluZE5vZGVJbkdyYXBoKHN0YWdlSWQ6IHN0cmluZywgc3ViZmxvd1BhdGg6IHJlYWRvbmx5IHN0cmluZ1tdKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZjID0gdGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydDtcblxuICAgIGlmIChzdWJmbG93UGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFRvcC1sZXZlbDogREZTIGZyb20gcm9vdFxuICAgICAgcmV0dXJuIHRoaXMuZGZzRmluZChmYy5yb290LCBzdGFnZUlkKTtcbiAgICB9XG5cbiAgICAvLyBTdWJmbG93OiBkcmlsbCBpbnRvIHRoZSBzdWJmbG93IGNoYWluLCB0aGVuIHNlYXJjaCBmcm9tIHRoZSBsYXN0IHN1YmZsb3cncyByb290XG4gICAgbGV0IHN1YmZsb3dSb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IHNmSWQgb2Ygc3ViZmxvd1BhdGgpIHtcbiAgICAgIGNvbnN0IHN1YmZsb3cgPSBmYy5zdWJmbG93cz8uW3NmSWRdO1xuICAgICAgaWYgKCFzdWJmbG93KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgc3ViZmxvd1Jvb3QgPSBzdWJmbG93LnJvb3Q7XG4gICAgfVxuICAgIGlmICghc3ViZmxvd1Jvb3QpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuZGZzRmluZChzdWJmbG93Um9vdCwgc3RhZ2VJZCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgbW91bnQgbm9kZSAodGhlIG5vZGUgdGhhdCBtb3VudHMgYSBzdWJmbG93IGJvdW5kYXJ5KVxuICAgKiBmb3IgYSBnaXZlbiBzdWJmbG93SWQsIGJ5IERGUyBmcm9tIGBzdGFydGAuIFVzZWQgYnkgYHJlc3VtZSgpYCB0b1xuICAgKiBsb2NhdGUgdGhlIE9VVEVSIG5vZGUgd2UgaGF2ZSB0byBlbnRlciB0aHJvdWdoIHNvIHRoZSBzdWJmbG93J3NcbiAgICogb3V0cHV0TWFwcGVyIGFuZCBwYXJlbnQgY29udGludWF0aW9uIGV4ZWN1dGUuXG4gICAqXG4gICAqIEN5Y2xlLXNhZmUgdmlhIHZpc2l0ZWQgc2V0LiBSZXR1cm5zIHRoZSBmaXJzdCBtYXRjaCAoREZTIG9yZGVyKS5cbiAgICovXG4gIHByaXZhdGUgZmluZE1vdW50SW5HcmFwaChcbiAgICBzdGFydDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgc3ViZmxvd0lkOiBzdHJpbmcsXG4gICAgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpLFxuICApOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHN0YXJ0LmlzTG9vcFJlZikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodmlzaXRlZC5oYXMoc3RhcnQuaWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHZpc2l0ZWQuYWRkKHN0YXJ0LmlkKTtcbiAgICBpZiAoc3RhcnQuc3ViZmxvd0lkID09PSBzdWJmbG93SWQpIHJldHVybiBzdGFydDtcbiAgICBpZiAoc3RhcnQuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygc3RhcnQuY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmZpbmRNb3VudEluR3JhcGgoY2hpbGQsIHN1YmZsb3dJZCwgdmlzaXRlZCk7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhcnQubmV4dCkgcmV0dXJuIHRoaXMuZmluZE1vdW50SW5HcmFwaChzdGFydC5uZXh0LCBzdWJmbG93SWQsIHZpc2l0ZWQpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogREZTIHNlYXJjaCBmb3IgYSBub2RlIGJ5IElEIGluIHRoZSBTdGFnZU5vZGUgZ3JhcGguIEN5Y2xlLXNhZmUgdmlhIHZpc2l0ZWQgc2V0LiAqL1xuICBwcml2YXRlIGRmc0ZpbmQoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgdGFyZ2V0SWQ6IHN0cmluZyxcbiAgICB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCksXG4gICk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICAvLyBTa2lwIGxvb3AgYmFjay1lZGdlIHJlZmVyZW5jZXMgKHRoZXkgc2hhcmUgdGhlIHRhcmdldCdzIElEIGJ1dCBoYXZlIG5vIGZuL3Jlc3VtZUZuKVxuICAgIGlmIChub2RlLmlzTG9vcFJlZikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodmlzaXRlZC5oYXMobm9kZS5pZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgdmlzaXRlZC5hZGQobm9kZS5pZCk7XG4gICAgaWYgKG5vZGUuaWQgPT09IHRhcmdldElkKSByZXR1cm4gbm9kZTtcbiAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5kZnNGaW5kKGNoaWxkLCB0YXJnZXRJZCwgdmlzaXRlZCk7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobm9kZS5uZXh0KSByZXR1cm4gdGhpcy5kZnNGaW5kKG5vZGUubmV4dCwgdGFyZ2V0SWQsIHZpc2l0ZWQpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDilIDilIDilIAgU2NvcGVSZWNvcmRlciBNYW5hZ2VtZW50IOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBzY29wZSBTY29wZVJlY29yZGVyIHRvIG9ic2VydmUgZGF0YSBvcGVyYXRpb25zIChyZWFkcywgd3JpdGVzLCBjb21taXRzKS5cbiAgICogQXV0b21hdGljYWxseSBhdHRhY2hlZCB0byBldmVyeSBTY29wZUZhY2FkZSBjcmVhdGVkIGR1cmluZyB0cmF2ZXJzYWwuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS5cbiAgICpcbiAgICogKipJZGVtcG90ZW50IGJ5IElEOioqIElmIGEgcmVjb3JkZXIgd2l0aCB0aGUgc2FtZSBgaWRgIGlzIGFscmVhZHkgYXR0YWNoZWQsXG4gICAqIGl0IGlzIHJlcGxhY2VkIChub3QgZHVwbGljYXRlZCkuIFRoaXMgcHJldmVudHMgZG91YmxlLWNvdW50aW5nIHdoZW4gYm90aFxuICAgKiBhIGZyYW1ld29yayBhbmQgdGhlIHVzZXIgYXR0YWNoIHRoZSBzYW1lIHJlY29yZGVyIHR5cGUuXG4gICAqXG4gICAqIEJ1aWx0LWluIHJlY29yZGVycyB1c2UgYXV0by1pbmNyZW1lbnQgSURzIChgbWV0cmljcy0xYCwgYGRlYnVnLTFgLCAuLi4pIGJ5XG4gICAqIGRlZmF1bHQsIHNvIG11bHRpcGxlIGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25maWdzIGNvZXhpc3QuIFRvIG92ZXJyaWRlXG4gICAqIGEgZnJhbWV3b3JrLWF0dGFjaGVkIHJlY29yZGVyLCBwYXNzIHRoZSBzYW1lIHdlbGwta25vd24gSUQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gTXVsdGlwbGUgcmVjb3JkZXJzIHdpdGggZGlmZmVyZW50IGNvbmZpZ3Mg4oCUIGVhY2ggZ2V0cyBhIHVuaXF1ZSBJRFxuICAgKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcigpKTtcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgRGVidWdSZWNvcmRlcih7IHZlcmJvc2l0eTogJ21pbmltYWwnIH0pKTtcbiAgICpcbiAgICogLy8gT3ZlcnJpZGUgYSBmcmFtZXdvcmstYXR0YWNoZWQgcmVjb3JkZXIgYnkgcGFzc2luZyBpdHMgd2VsbC1rbm93biBJRFxuICAgKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcignbWV0cmljcycpKTtcbiAgICpcbiAgICogLy8gQXR0YWNoaW5nIHR3aWNlIHdpdGggc2FtZSBJRCByZXBsYWNlcyAobm8gZG91YmxlLWNvdW50aW5nKVxuICAgKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcignbXktbWV0cmljcycpKTtcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ215LW1ldHJpY3MnKSk7IC8vIHJlcGxhY2VzIHByZXZpb3VzXG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcjogU2NvcGVSZWNvcmRlcik6IHZvaWQge1xuICAgIC8vIFJlcGxhY2UgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIElEIChpZGVtcG90ZW50IOKAlCBwcmV2ZW50cyBkb3VibGUtY291bnRpbmcpXG4gICAgdGhpcy5zY29wZVJlY29yZGVycyA9IHRoaXMuc2NvcGVSZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlci5pZCk7XG4gICAgdGhpcy5zY29wZVJlY29yZGVycy5wdXNoKHJlY29yZGVyKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBEZXRhY2ggKFQ0KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gQmFyZS1leGVjdXRvciBlbnRyeSBwb2ludCBmb3IgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGZsb3djaGFydCBleGVjdXRpb24uXG4gIC8vIFVzZSBmcm9tIG91dHNpZGUgYW55IGNoYXJ0IChjb25zdW1lciBjb2RlIHRoYXQgd2FudHMgdG8gZGV0YWNoIHdvcmtcbiAgLy8gd2l0aG91dCBmaXJzdCBydW5uaW5nIGEgcGFyZW50IGNoYXJ0KS4gRm9yIGRldGFjaCBGUk9NIElOU0lERSBhIHN0YWdlLFxuICAvLyB1c2UgYHNjb3BlLiRkZXRhY2hBbmRKb2luTGF0ZXIoLi4uKWAgLyBgc2NvcGUuJGRldGFjaEFuZEZvcmdldCguLi4pYCDigJRcbiAgLy8gdGhvc2UgbWludCByZWZJZHMgZnJvbSB0aGUgY2FsbGluZyBzdGFnZSdzIHJ1bnRpbWVTdGFnZUlkIGZvciB0cmFjZVxuICAvLyBjb3JyZWxhdGlvbjsgdGhlIGJhcmUtZXhlY3V0b3IgZW50cmllcyB1c2UgYSBzeW50aGV0aWMgcHJlZml4XG4gIC8vIChgX19leGVjdXRvcl9fYCkgaW5zdGVhZC5cblxuICAvKipcbiAgICogRGV0YWNoIGEgY2hpbGQgZmxvd2NoYXJ0IG9uIHRoZSBnaXZlbiBkcml2ZXIgYW5kIHJldHVybiBhIGBEZXRhY2hIYW5kbGVgXG4gICAqIHRoZSBjYWxsZXIgY2FuIGB3YWl0KClgIG9uIChQcm9taXNlKSBvciByZWFkIGAuc3RhdHVzYCBmcm9tIChzeW5jKS5cbiAgICpcbiAgICogVGhlIGRyaXZlciBpcyBhIFJFUVVJUkVEIGZpcnN0IGFyZ3VtZW50IOKAlCB0aGVyZSBpcyBubyBsaWJyYXJ5LWRlZmF1bHQsXG4gICAqIHRvIGtlZXAgdGhlIGVuZ2luZSBmcmVlIG9mIGRyaXZlciBpbXBvcnRzIGFuZCB0byBtYWtlIHRoZSBjaG9pY2Ugb2ZcbiAgICogc2NoZWR1bGluZyBhbGdvcml0aG0gZXhwbGljaXQgYXQgdGhlIGNhbGwgc2l0ZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQgeyBtaWNyb3Rhc2tCYXRjaERyaXZlciB9IGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCc7XG4gICAqXG4gICAqIGNvbnN0IGV4ZWMgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IocGFyZW50Q2hhcnQpO1xuICAgKiBjb25zdCBoYW5kbGUgPSBleGVjLmRldGFjaEFuZEpvaW5MYXRlcihtaWNyb3Rhc2tCYXRjaERyaXZlciwgdGVsZW1ldHJ5Q2hhcnQsIHsgZXZlbnQ6ICd4JyB9KTtcbiAgICogYXdhaXQgaGFuZGxlLndhaXQoKTsgLy8gb3B0aW9uYWxcbiAgICogYGBgXG4gICAqL1xuICBkZXRhY2hBbmRKb2luTGF0ZXIoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hIYW5kbGUge1xuICAgIHJldHVybiBfZGV0YWNoQW5kSm9pbkxhdGVyKGRyaXZlciwgY2hpbGQsIGlucHV0LCAnX19leGVjdXRvcl9fJyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0YWNoIGEgY2hpbGQgZmxvd2NoYXJ0IG9uIHRoZSBnaXZlbiBkcml2ZXIgYW5kIERJU0NBUkQgdGhlIGhhbmRsZS5cbiAgICogVXNlIGZvciB0ZWxlbWV0cnkgZXhwb3J0cyAvIGZpcmUtYW5kLWZvcmdldCBzaWRlIGVmZmVjdHMgd2hlcmUgdGhlXG4gICAqIGNhbGxlciBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIHJlc3VsdC5cbiAgICpcbiAgICogRXJyb3JzIHJhaXNlZCBieSB0aGUgY2hpbGQgc3RpbGwgbGFuZCBvbiB0aGUgKGRpc2NhcmRlZCkgaGFuZGxlIOKAlCB0aGV5XG4gICAqIGdvIHNpbGVudCB1bmxlc3Mgc3VyZmFjZWQgdGhyb3VnaCBhIHJlY29yZGVyLiBGb3Igb2JzZXJ2YWJsZSBkZXRhY2gsXG4gICAqIHByZWZlciBgZGV0YWNoQW5kSm9pbkxhdGVyYCBhbmQgc3VyZmFjZSBmYWlsdXJlcyB2aWEgYC53YWl0KCkuY2F0Y2goKWAuXG4gICAqL1xuICBkZXRhY2hBbmRGb3JnZXQoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogdm9pZCB7XG4gICAgX2RldGFjaEFuZEZvcmdldChkcml2ZXIsIGNoaWxkLCBpbnB1dCwgJ19fZXhlY3V0b3JfXycpO1xuICB9XG5cbiAgLyoqIERldGFjaCBhbGwgc2NvcGUgUmVjb3JkZXJzIHdpdGggdGhlIGdpdmVuIElELiAqL1xuICBkZXRhY2hTY29wZVJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNjb3BlUmVjb3JkZXJzID0gdGhpcy5zY29wZVJlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IGlkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgc2NvcGUgUmVjb3JkZXJzLiAqL1xuICBnZXRTY29wZVJlY29yZGVycygpOiBTY29wZVJlY29yZGVyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5zY29wZVJlY29yZGVyc107XG4gIH1cblxuICAvLyDilIDilIDilIAgRmxvd1JlY29yZGVyIE1hbmFnZW1lbnQg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIEZsb3dSZWNvcmRlciB0byBvYnNlcnZlIGNvbnRyb2wgZmxvdyBldmVudHMuXG4gICAqIEF1dG9tYXRpY2FsbHkgZW5hYmxlcyBuYXJyYXRpdmUgaWYgbm90IGFscmVhZHkgZW5hYmxlZC5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpIOKAlCByZWNvcmRlcnMgYXJlIHBhc3NlZCB0byB0aGUgdHJhdmVyc2VyIGF0IGNyZWF0aW9uIHRpbWUuXG4gICAqXG4gICAqICoqSWRlbXBvdGVudCBieSBJRDoqKiByZXBsYWNlcyBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgYGlkYC5cbiAgICovXG4gIGF0dGFjaEZsb3dSZWNvcmRlcihyZWNvcmRlcjogRmxvd1JlY29yZGVyKTogdm9pZCB7XG4gICAgLy8gUmVwbGFjZSBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgSUQgKGlkZW1wb3RlbnQg4oCUIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZylcbiAgICB0aGlzLmZsb3dSZWNvcmRlcnMgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlci5pZCk7XG4gICAgdGhpcy5mbG93UmVjb3JkZXJzLnB1c2gocmVjb3JkZXIpO1xuICAgIHRoaXMubmFycmF0aXZlRW5hYmxlZCA9IHRydWU7XG4gIH1cblxuICAvKiogRGV0YWNoIGFsbCBGbG93UmVjb3JkZXJzIHdpdGggdGhlIGdpdmVuIElELiAqL1xuICBkZXRhY2hGbG93UmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZmxvd1JlY29yZGVycyA9IHRoaXMuZmxvd1JlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IGlkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgRmxvd1JlY29yZGVycy4gKi9cbiAgZ2V0Rmxvd1JlY29yZGVycygpOiBGbG93UmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmZsb3dSZWNvcmRlcnNdO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIENvbWJpbmVkIFNjb3BlUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgcmVjb3JkZXIgdGhhdCBtYXkgb2JzZXJ2ZSBtdWx0aXBsZSBldmVudCBzdHJlYW1zIChzY29wZVxuICAgKiBkYXRhLWZsb3csIGNvbnRyb2wtZmxvdywgb3IgYm90aCkuIERldGVjdHMgYXQgcnVudGltZSB3aGljaCBzdHJlYW1zIHRoZVxuICAgKiByZWNvcmRlciBoYXMgbWV0aG9kcyBmb3IgYW5kIHJvdXRlcyBpdCB0byB0aGUgY29ycmVjdCBpbnRlcm5hbCBjaGFubmVscy5cbiAgICpcbiAgICogUHJlZmVycmVkIG92ZXIgY2FsbGluZyBgYXR0YWNoU2NvcGVSZWNvcmRlcmAgYW5kIGBhdHRhY2hGbG93UmVjb3JkZXJgXG4gICAqIHNlcGFyYXRlbHksIGJlY2F1c2UgZm9yZ2V0dGluZyBvbmUgb2YgdGhlIHR3byBpcyBhIHNpbGVudCBmb290LWd1biDigJRcbiAgICogaGFsZiB5b3VyIGV2ZW50cyBuZXZlciBmaXJlIGFuZCB0aGVyZSBpcyBubyBydW50aW1lIHdhcm5pbmcuIFdpdGhcbiAgICogYGF0dGFjaENvbWJpbmVkUmVjb3JkZXJgIHRoZSBsaWJyYXJ5IGd1YXJhbnRlZXMgdGhlIHJlY29yZGVyJ3MgZGVjbGFyZWRcbiAgICogbWV0aG9kcyBhbGwgZmlyZSwgYW5kIGFkZHMgbm8gb3ZlcmhlYWQgdmVyc3VzIHR3byBleHBsaWNpdCBjYWxscy5cbiAgICpcbiAgICogIyMgSWRlbXBvdGVuY3lcbiAgICpcbiAgICogSWRlbXBvdGVudCBieSBgaWRgIGFjcm9zcyBBTEwgY2hhbm5lbHMg4oCUIHJlLWF0dGFjaGluZyB3aXRoIHRoZSBzYW1lIGBpZGBcbiAgICogcmVwbGFjZXMgdGhlIHByZXZpb3VzIGluc3RhbmNlIGV2ZXJ5d2hlcmUgaXQgd2FzIHJlZ2lzdGVyZWQuIE1peGluZ1xuICAgKiBgYXR0YWNoQ29tYmluZWRSZWNvcmRlcih4KWAgd2l0aCBhIHByaW9yIGBhdHRhY2hTY29wZVJlY29yZGVyKHkpYCBvclxuICAgKiBgYXR0YWNoRmxvd1JlY29yZGVyKHkpYCB0aGF0IHNoYXJlIGB4LmlkID09PSB5LmlkYCBpcyBhbHNvIHNhZmU6IHRoZVxuICAgKiBjb21iaW5lZCBhdHRhY2ggcmVwbGFjZXMgdGhlIHNpbmdsZS1jaGFubmVsIHJlZ2lzdHJhdGlvbiBvbiB3aGljaGV2ZXJcbiAgICogY2hhbm5lbChzKSBgeGAgaGFzIG1ldGhvZHMgZm9yLiBObyBkdXBsaWNhdGUgZmlyaW5ncyBvY2N1ci5cbiAgICpcbiAgICogIyMgTmFycmF0aXZlIGFjdGl2YXRpb25cbiAgICpcbiAgICogSWYgdGhlIHJlY29yZGVyIGhhcyBhbnkgY29udHJvbC1mbG93IG1ldGhvZHMsIGBlbmFibGVOYXJyYXRpdmUoKWAgaXNcbiAgICogY2FsbGVkIGFzIGEgc2lkZSBlZmZlY3QgKHRoZSBuYXJyYXRpdmUgc3Vic3lzdGVtIGlzIHJlcXVpcmVkIHRvIGVtaXRcbiAgICogY29udHJvbC1mbG93IGV2ZW50cykuIERhdGEtZmxvdy1vbmx5IHJlY29yZGVycyBkbyBOT1QgYWN0aXZhdGUgdGhlXG4gICAqIG5hcnJhdGl2ZS5cbiAgICpcbiAgICogIyMgRGV0ZWN0aW9uIHJ1bGVcbiAgICpcbiAgICogT25seSAqKm93bioqIGV2ZW50IG1ldGhvZHMgY291bnQgKHNlZSBgaGFzUmVjb3JkZXJNZXRob2RzYCkuIE1ldGhvZHNcbiAgICogaW5oZXJpdGVkIHZpYSB0aGUgcHJvdG90eXBlIGNoYWluIGFyZSBpZ25vcmVkIOKAlCB0aGlzIHByb3RlY3RzIGFnYWluc3RcbiAgICogYWNjaWRlbnRhbCBgT2JqZWN0LnByb3RvdHlwZWAgcG9sbHV0aW9uIGF0dGFjaGluZyBoYW5kbGVycyB5b3UgbmV2ZXJcbiAgICogZGVjbGFyZWQuIEEgcmVjb3JkZXIgdGhhdCBwcm92aWRlcyBvbmx5IGBjbGVhcmAvYHRvU25hcHNob3RgIGlzIGFcbiAgICogbm8tb3AgYW5kIGVtaXRzIGEgZGV2LW1vZGUgd2FybmluZyB0byBzdXJmYWNlIHRoZSBsaWtlbHkgbWlzdGFrZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBhdWRpdDogQ29tYmluZWRSZWNvcmRlciA9IHtcbiAgICogICBpZDogJ2F1ZGl0JyxcbiAgICogICBvbldyaXRlOiAoZSkgPT4gbG9nKCdzY29wZSB3cml0ZScsIGUua2V5KSxcbiAgICogICBvbkRlY2lzaW9uOiAoZSkgPT4gbG9nKCdyb3V0ZWQgdG8nLCBlLmNob3NlbiksXG4gICAqIH07XG4gICAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIoYXVkaXQpO1xuICAgKiBgYGBcbiAgICovXG4gIGF0dGFjaENvbWJpbmVkUmVjb3JkZXIocmVjb3JkZXI6IENvbWJpbmVkUmVjb3JkZXIpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNEYXRhID0gaGFzUmVjb3JkZXJNZXRob2RzKHJlY29yZGVyKTtcbiAgICBjb25zdCBoYXNGbG93ID0gaGFzRmxvd1JlY29yZGVyTWV0aG9kcyhyZWNvcmRlcik7XG4gICAgY29uc3QgaGFzRW1pdCA9IGhhc0VtaXRSZWNvcmRlck1ldGhvZHMocmVjb3JkZXIpO1xuXG4gICAgLy8gRW1pdCByZWNvcmRlcnMgbGl2ZSBvbiB0aGUgU0FNRSBjaGFubmVsIGFzIGRhdGEtZmxvdyByZWNvcmRlcnNcbiAgICAvLyAoU2NvcGVGYWNhZGUgaXRlcmF0ZXMgYF9yZWNvcmRlcnNgIGZvciBvbkVtaXQgZGlzcGF0Y2gpLiBTb1xuICAgIC8vIGF0dGFjaEVtaXRSZWNvcmRlciBpbnRlcm5hbGx5IGNhbGxzIGF0dGFjaFNjb3BlUmVjb3JkZXIg4oCUIGJ1dCB3ZSB3YW50IHRvXG4gICAgLy8gYXZvaWQgZG91YmxlLWF0dGFjaCB3aGVuIHRoZSByZWNvcmRlciBpbXBsZW1lbnRzIEJPVEggb25FbWl0IEFORFxuICAgIC8vIG90aGVyIFNjb3BlUmVjb3JkZXIgbWV0aG9kcy4gU2hvcnQtY2lyY3VpdDogaWYgaGFzRGF0YSBPUiBoYXNFbWl0LCB0aGVcbiAgICAvLyByZWNvcmRlciBsYW5kcyBvbiB0aGUgc2NvcGUtcmVjb3JkZXIgbGlzdCBleGFjdGx5IG9uY2UuXG4gICAgaWYgKGhhc0RhdGEgfHwgaGFzRW1pdCkgdGhpcy5hdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyIGFzIFNjb3BlUmVjb3JkZXIpO1xuICAgIGlmIChoYXNGbG93KSB0aGlzLmF0dGFjaEZsb3dSZWNvcmRlcihyZWNvcmRlciBhcyBGbG93UmVjb3JkZXIpO1xuXG4gICAgaWYgKCFoYXNEYXRhICYmICFoYXNGbG93ICYmICFoYXNFbWl0ICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICAvLyBEZXYtbW9kZSBvbmx5OiBzaWxlbnQgc2tpcHMgYXJlIGludmlzaWJsZSBhbmQgcHJvZHVjZSBoYXJkLXRvLWRlYnVnXG4gICAgICAvLyBcIndoeSBkaWRuJ3QgbXkgcmVjb3JkZXIgZmlyZVwiIHJlcG9ydHMuIFBlciBsaWJyYXJ5IGNvbnZlbnRpb24sIGdhdGVkXG4gICAgICAvLyBvbiB0aGUgY2VudHJhbCBpc0Rldk1vZGUoKSBmbGFnIChub3QgcHJvY2Vzcy5lbnYpIHNvIGNvbnN1bWVycyBjYW5cbiAgICAgIC8vIGNvbnRyb2wgZGV2IHRvb2xpbmcgY2VudHJhbGx5IHZpYSBlbmFibGVEZXZNb2RlKCkvZGlzYWJsZURldk1vZGUoKS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZm9vdHByaW50anNdIGF0dGFjaENvbWJpbmVkUmVjb3JkZXI6IHJlY29yZGVyICcke3JlY29yZGVyLmlkfScgaGFzIGAgK1xuICAgICAgICAgICdubyBvYnNlcnZlciBldmVudCBtZXRob2RzIOKAlCBub3RoaW5nIHRvIGF0dGFjaC4gRGlkIHlvdSBmb3JnZXQgdG8gJyArXG4gICAgICAgICAgJ2FkZCBhbiBvbiogaGFuZGxlciAob25Xcml0ZSwgb25EZWNpc2lvbiwgb25TdWJmbG93RW50cnksIC4uLik/ICcgK1xuICAgICAgICAgICdOb3RlOiBvbmx5IE9XTiBwcm9wZXJ0aWVzIGNvdW50OyBtZXRob2RzIG9uIHRoZSBwcm90b3R5cGUgY2hhaW4gJyArXG4gICAgICAgICAgJ2FyZSBpZ25vcmVkIG9uIHB1cnBvc2UuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGFjaCBhIGNvbWJpbmVkIHJlY29yZGVyIGZyb20gYWxsIGNoYW5uZWxzIGl0IHdhcyBhdHRhY2hlZCB0by5cbiAgICogU2FmZSB0byBjYWxsIGlmIHRoZSByZWNvcmRlciB3YXMgb25seSBvbiBvbmUgY2hhbm5lbCBvciBuZXZlciBhdHRhY2hlZC5cbiAgICovXG4gIGRldGFjaENvbWJpbmVkUmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWNoU2NvcGVSZWNvcmRlcihpZCk7XG4gICAgdGhpcy5kZXRhY2hGbG93UmVjb3JkZXIoaWQpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEVtaXQgU2NvcGVSZWNvcmRlciBNYW5hZ2VtZW50IChQaGFzZSAzKSDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGFuIGBFbWl0UmVjb3JkZXJgIOKAlCBhbiBvYnNlcnZlciBmb3IgY29uc3VtZXItZW1pdHRlZCBzdHJ1Y3R1cmVkXG4gICAqIGV2ZW50cyBmaXJlZCB2aWEgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYC5cbiAgICpcbiAgICogSW50ZXJuYWxseSwgZW1pdCByZWNvcmRlcnMgc2hhcmUgdGhlIHNjb3BlLXJlY29yZGVyIGNoYW5uZWwgYmVjYXVzZVxuICAgKiBlbWl0IGV2ZW50cyBmaXJlIGZyb20gaW5zaWRlIGBTY29wZUZhY2FkZWAgZHVyaW5nIHN0YWdlIGV4ZWN1dGlvbixcbiAgICogc2FtZSB0aW1pbmcgYXMgYG9uUmVhZGAvYG9uV3JpdGVgLiBUaGlzIG1ldGhvZCBpcyBhIGNvbnZlbmllbmNlIHRoYXRcbiAgICogZGVsZWdhdGVzIHRvIGBhdHRhY2hTY29wZVJlY29yZGVyYCDigJQgY29uc3VtZXJzIGNhbiBhbHNvIHVzZVxuICAgKiBgYXR0YWNoU2NvcGVSZWNvcmRlcmAgZGlyZWN0bHkgZm9yIGEgcmVjb3JkZXIgdGhhdCBpbXBsZW1lbnRzIEJPVEhcbiAgICogYG9uV3JpdGVgIGFuZCBgb25FbWl0YC4gRWl0aGVyIGFwcHJvYWNoIHBsYWNlcyB0aGUgcmVjb3JkZXIgb24gdGhlXG4gICAqIHNhbWUgdW5kZXJseWluZyBsaXN0LCBzbyBgb25FbWl0YCBmaXJlcyBleGFjdGx5IG9uY2UgcGVyIGV2ZW50LlxuICAgKlxuICAgKiAqKklkZW1wb3RlbnQgYnkgYGlkYDoqKiByZXBsYWNlcyBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgYGlkYC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBleGVjdXRvci5hdHRhY2hFbWl0UmVjb3JkZXIoe1xuICAgKiAgIGlkOiAndG9rZW4tbWV0ZXInLFxuICAgKiAgIG9uRW1pdDogKGUpID0+IHtcbiAgICogICAgIGlmIChlLm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5sbG0udG9rZW5zJykgdHJhY2tUb2tlbnMoZS5wYXlsb2FkKTtcbiAgICogICB9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhdHRhY2hFbWl0UmVjb3JkZXIocmVjb3JkZXI6IEVtaXRSZWNvcmRlcik6IHZvaWQge1xuICAgIHRoaXMuYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlciBhcyBTY29wZVJlY29yZGVyKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYW4gYEVtaXRSZWNvcmRlcmAgYnkgaWQuIFNhZmUgdG8gY2FsbCBpZiBuZXZlciBhdHRhY2hlZC4gKi9cbiAgZGV0YWNoRW1pdFJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaFNjb3BlUmVjb3JkZXIoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCByZWNvcmRlcnMgZmlsdGVyZWQgdG8gdGhvc2UgdGhhdFxuICAgKiBpbXBsZW1lbnQgYG9uRW1pdGAuIFVzZWZ1bCBmb3IgaW5zcGVjdGlvbiBkdXJpbmcgdGVzdGluZy5cbiAgICovXG4gIGdldEVtaXRSZWNvcmRlcnMoKTogRW1pdFJlY29yZGVyW10ge1xuICAgIHJldHVybiB0aGlzLnNjb3BlUmVjb3JkZXJzLmZpbHRlcihcbiAgICAgIChyKTogciBpcyBFbWl0UmVjb3JkZXIgPT4gdHlwZW9mIChyIGFzIHsgb25FbWl0PzogdW5rbm93biB9KS5vbkVtaXQgPT09ICdmdW5jdGlvbicsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHN0cnVjdHVyZWQgbmFycmF0aXZlIGVudHJpZXMg4oCUIHRoZSBzaW5nbGUgcHVibGljIG5hcnJhdGl2ZSBBUEkuXG4gICAqIEVhY2ggZW50cnkgaGFzIGEgdHlwZSAoc3RhZ2UsIHN0ZXAsIGNvbmRpdGlvbiwgZm9yaywgZXRjLiksIHRleHQsIGFuZFxuICAgKiBkZXB0aC4gQ29uc3VtZXJzIHJlbmRlciBob3dldmVyIHRoZXkgd2FudDsgY2FsbCBgLm1hcChlID0+IGUudGV4dClgXG4gICAqIGlmIGEgZmxhdCBgc3RyaW5nW11gIGlzIG5lZWRlZCBsb2NhbGx5LlxuICAgKi9cbiAgZ2V0TmFycmF0aXZlRW50cmllcygpOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10ge1xuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbWJpbmVkUmVjb3JkZXIuZ2V0RW50cmllcygpO1xuICAgIH1cbiAgICBjb25zdCBmbG93U2VudGVuY2VzID0gdGhpcy50cmF2ZXJzZXIuZ2V0TmFycmF0aXZlKCk7XG4gICAgcmV0dXJuIGZsb3dTZW50ZW5jZXMubWFwKCh0ZXh0KSA9PiAoeyB0eXBlOiAnc3RhZ2UnIGFzIGNvbnN0LCB0ZXh0LCBkZXB0aDogMCB9KSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29tYmluZWQgRmxvd1JlY29yZGVycyBsaXN0LiBXaGVuIG5hcnJhdGl2ZSBpcyBlbmFibGVkLFxuICAgKiBpbmNsdWRlcyB0aGUgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciAod2hpY2ggYnVpbGRzIG1lcmdlZCBmbG93K2RhdGFcbiAgICogZW50cmllcyBpbmxpbmUpLiBQbHVzIGFueSB1c2VyLWF0dGFjaGVkIHJlY29yZGVycy5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRGbG93UmVjb3JkZXJzTGlzdCgpOiBGbG93UmVjb3JkZXJbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVjb3JkZXJzOiBGbG93UmVjb3JkZXJbXSA9IFtdO1xuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHtcbiAgICAgIHJlY29yZGVycy5wdXNoKHRoaXMuY29tYmluZWRSZWNvcmRlcik7XG4gICAgfVxuICAgIHJlY29yZGVycy5wdXNoKC4uLnRoaXMuZmxvd1JlY29yZGVycyk7XG4gICAgcmV0dXJuIHJlY29yZGVycy5sZW5ndGggPiAwID8gcmVjb3JkZXJzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgYXN5bmMgcnVuKG9wdGlvbnM/OiBSdW5PcHRpb25zKTogUHJvbWlzZTxFeGVjdXRvclJlc3VsdD4ge1xuICAgIC8vIFJlLWVudHJhbmN5IGd1YXJkIEZJUlNUIOKAlCBiZWZvcmUgY2xlYXJpbmcgcmVjb3JkZXJzIG9yIHRvdWNoaW5nIGFueVxuICAgIC8vIHBlci1ydW4gZmllbGQsIHNvIGEgcmVqZWN0ZWQgY29uY3VycmVudCBjYWxsIGxlYXZlcyB0aGUgaW4tZmxpZ2h0IHJ1blxuICAgIC8vIGNvbXBsZXRlbHkgdW50b3VjaGVkLlxuICAgIGlmICh0aGlzLl9pc0V4ZWN1dGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnRmxvd0NoYXJ0RXhlY3V0b3I6IHJ1bigpIGNhbGxlZCB3aGlsZSBhbm90aGVyIHJ1bigpL3Jlc3VtZSgpIGlzIGluIGZsaWdodCBvbiB0aGlzICcgK1xuICAgICAgICAgICdleGVjdXRvci4gQW4gZXhlY3V0b3IgaG9sZHMgcGVyLXJ1biBzdGF0ZSAocnVuSWQsIHJlY29yZGVycywgY2hlY2twb2ludCkg4oCUIGNyZWF0ZSAnICtcbiAgICAgICAgICAnb25lIGV4ZWN1dG9yIHBlciBjb25jdXJyZW50IHJ1bi4gU2VlIGRvY3MvZ3VpZGVzL2V4ZWN1dGlvbi1tb2RlbC5tZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gVmFsaWRhdGUgaW5wdXQgYWdhaW5zdCBpbnB1dFNjaGVtYSBpZiBib3RoIGFyZSBwcmVzZW50LiBWYWxpZGF0aW9uIHJ1bnNcbiAgICAvLyBCRUZPUkUgdGhlIHRpbWVvdXQgdGltZXIgaXMgY3JlYXRlZCBzbyBhIHJlamVjdGVkIGlucHV0IGNhbid0IGxlYWsgYVxuICAgIC8vIHBlbmRpbmcgdGltZXIgKHNhbWUgXCJmYWlsZWQgZW50cnkgbGVhdmVzIG5vIHNpZGUgZWZmZWN0c1wiIHJ1bGUgYXMgdGhlXG4gICAgLy8gcmUtZW50cmFuY3kgZ3VhcmQgYWJvdmUpLlxuICAgIGxldCB2YWxpZGF0ZWRJbnB1dCA9IG9wdGlvbnM/LmlucHV0O1xuICAgIGlmICh2YWxpZGF0ZWRJbnB1dCAmJiB0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmlucHV0U2NoZW1hKSB7XG4gICAgICB2YWxpZGF0ZWRJbnB1dCA9IHZhbGlkYXRlSW5wdXQodGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydC5pbnB1dFNjaGVtYSwgdmFsaWRhdGVkSW5wdXQpO1xuICAgIH1cblxuICAgIGxldCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgbGV0IHRpbWVvdXRJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBDcmVhdGUgYW4gaW50ZXJuYWwgQWJvcnRDb250cm9sbGVyIGZvciB0aW1lb3V0TXNcbiAgICBpZiAob3B0aW9ucz8udGltZW91dE1zICYmICFzaWduYWwpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBzaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbDtcbiAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoXG4gICAgICAgICgpID0+IGNvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKGBFeGVjdXRpb24gdGltZWQgb3V0IGFmdGVyICR7b3B0aW9ucy50aW1lb3V0TXN9bXNgKSksXG4gICAgICAgIG9wdGlvbnMudGltZW91dE1zLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBVc2VyLWF0dGFjaGVkIHJlY29yZGVycyAoZmxvd1JlY29yZGVycyArIHNjb3BlUmVjb3JkZXJzKSBhcmUgY2xlYXJlZCB2aWEgY2xlYXIoKSB0byBwcmV2ZW50XG4gICAgLy8gY3Jvc3MtcnVuIGFjY3VtdWxhdGlvbi4gVGhlIGNvbWJpbmVkUmVjb3JkZXIgaXMgTk9UIGNsZWFyZWQgaGVyZSDigJQgY3JlYXRlVHJhdmVyc2VyKCkgYWx3YXlzXG4gICAgLy8gY3JlYXRlcyBhIGZyZXNoIENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgaW5zdGFuY2Ugb24gZWFjaCBydW4sIHNvIHN0YWxlIHN0YXRlIGlzIG5ldmVyIGFuIGlzc3VlLlxuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmZsb3dSZWNvcmRlcnMpIHtcbiAgICAgIHIuY2xlYXI/LigpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5zY29wZVJlY29yZGVycykge1xuICAgICAgci5jbGVhcj8uKCk7XG4gICAgfVxuXG4gICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9leGVjdXRpb25Db3VudGVyID0geyB2YWx1ZTogMCB9OyAvLyBSZXNldCBjb3VudGVyIG9uIGZyZXNoIHJ1blxuICAgIHRoaXMuX2N1cnJlbnRSdW5JZCA9IGdlbmVyYXRlUnVuSWQoKTsgLy8gRnJlc2ggcnVuSWQgcGVyIHJ1bigpIGNhbGxcbiAgICB0aGlzLl9oYXNSdW5CZWZvcmUgPSB0cnVlOyAvLyBtYXJrIHNvIGEgbGF0ZXIgcmVzdW1lKCkgdGFrZXMgdGhlXG4gICAgLy8gc2FtZS1leGVjdXRvciBicmFuY2ggKHJldXNlIHJ1bnRpbWUsIGFjY3VtdWxhdGUgZXhlY3V0aW9uIHRyZWUpLlxuICAgIHRoaXMudHJhdmVyc2VyID0gdGhpcy5jcmVhdGVUcmF2ZXJzZXIoc2lnbmFsLCB2YWxpZGF0ZWRJbnB1dCwgb3B0aW9ucz8uZW52LCBvcHRpb25zPy5tYXhEZXB0aCk7XG4gICAgLy8gU2V0IEFGVEVSIGFsbCBzeW5jIHZhbGlkYXRpb24gdGhyb3dzIChub3RoaW5nIGFib3ZlIGNhbiBsZWFrIHRoZSBmbGFnKTtcbiAgICAvLyBubyBhd2FpdCBiZXR3ZWVuIHRoZSB0b3Atb2YtbWV0aG9kIGNoZWNrIGFuZCBoZXJlLCBzbyB0aGlzIGlzIHJhY2UtZnJlZS5cbiAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IHRydWU7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLnRyYXZlcnNlci5leGVjdXRlKCk7XG4gICAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICAgIGlmIChpc1BhdXNlU2lnbmFsKGVycm9yKSkge1xuICAgICAgICAvLyBCdWlsZCBhIGRldGFjaGVkIGNoZWNrcG9pbnQgZnJvbSBjdXJyZW50IGV4ZWN1dGlvbiBzdGF0ZSDigJQgc2VlXG4gICAgICAgIC8vIGJ1aWxkUGF1c2VDaGVja3BvaW50KCkgZm9yIHRoZSBkZWVwLWNvcHkgcmF0aW9uYWxlLlxuICAgICAgICB0aGlzLmxhc3RDaGVja3BvaW50ID0gdGhpcy5idWlsZFBhdXNlQ2hlY2twb2ludChlcnJvcik7XG4gICAgICAgIC8vIFJldHVybiBhIFBhdXNlUmVzdWx0LXNoYXBlZCB2YWx1ZSBzbyBjYWxsZXJzIGNhbiBjaGVjayB3aXRob3V0IHRyeS9jYXRjaFxuICAgICAgICByZXR1cm4geyBwYXVzZWQ6IHRydWUsIGNoZWNrcG9pbnQ6IHRoaXMubGFzdENoZWNrcG9pbnQgfSBzYXRpc2ZpZXMgUGF1c2VkUmVzdWx0O1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2lzRXhlY3V0aW5nID0gZmFsc2U7XG4gICAgICBpZiAodGltZW91dElkICE9PSB1bmRlZmluZWQpIGNsZWFyVGltZW91dCh0aW1lb3V0SWQpO1xuICAgIH1cbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBJbnRyb3NwZWN0aW9uIOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBydW50aW1lIHNuYXBzaG90LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucy5yZWRhY3QgIFdoZW4gYHRydWVgLCBgc2hhcmVkU3RhdGVgIGNvbWVzIGZyb20gdGhlIHBhcmFsbGVsXG4gICAqICAgcmVkYWN0ZWQgbWlycm9yIChpZiBtYWludGFpbmVkIOKAlCBzZWUgYHNldFJlZGFjdGlvblBvbGljeWApLiBUaGlzIGlzXG4gICAqICAgdGhlIHNhZmUgdmlldyBmb3IgZXhwb3J0aW5nIHRyYWNlcyBleHRlcm5hbGx5IChwYXN0ZSBpbnRvIGEgdmlld2VyLFxuICAgKiAgIHNoYXJlIHdpdGggc3VwcG9ydCkuIFdoZW4gbm8gcmVkYWN0aW9uIHBvbGljeSBpcyBjb25maWd1cmVkIHRoZVxuICAgKiAgIHJlZGFjdGVkIG1pcnJvciBpcyBub3QgbWFpbnRhaW5lZCwgc28gdGhpcyBmbGFnIGlzIGEgbm8tb3Ag4oCUXG4gICAqICAgYHNoYXJlZFN0YXRlYCBpcyB0aGUgcmF3IHdvcmtpbmcgbWVtb3J5IGVpdGhlciB3YXkuIERlZmF1bHQgYGZhbHNlYC5cbiAgICpcbiAgICogICBUaGUgY29tbWl0IGxvZyBpcyBhbHJlYWR5IHJlZGFjdGVkIGF0IHdyaXRlLXRpbWUgcmVnYXJkbGVzcyBvZiB0aGlzXG4gICAqICAgZmxhZywgYW5kIHRoZSBleGVjdXRpb24gdHJlZSBjYXJyaWVzIG9ubHkgc3RydWN0dXJhbCBtZXRhZGF0YS5cbiAgICpcbiAgICogKipUcmVhdCBgc2hhcmVkU3RhdGVgIGFzIFJFQUQtT05MWS4qKiBJbiBwcm9kdWN0aW9uIGl0IGlzIGEgbGl2ZSB2aWV3IG9mXG4gICAqIHRoZSBlbmdpbmUncyB3b3JraW5nIG1lbW9yeSAoemVybyBjb3B5IGNvc3QpIOKAlCBtdXRhdGluZyBpdCBjb3JydXB0c1xuICAgKiBlbmdpbmUgc3RhdGUuIEluIGRldiBtb2RlIChgZW5hYmxlRGV2TW9kZSgpYCkgaXQgaXMgYSBkZWVwLWZyb3plbiBDTE9ORSxcbiAgICogc28gYW55IGNvbnN1bWVyIG11dGF0aW9uIHRocm93cyBsb3VkbHkgaW5zdGVhZCBvZiBjb3JydXB0aW5nIHNpbGVudGx5LlxuICAgKi9cbiAgZ2V0U25hcHNob3Qob3B0aW9ucz86IHsgcmVkYWN0PzogYm9vbGVhbiB9KTogUnVudGltZVNuYXBzaG90IHtcbiAgICBjb25zdCBzbmFwc2hvdCA9IHRoaXMudHJhdmVyc2VyLmdldFNuYXBzaG90KG9wdGlvbnMpIGFzIFJ1bnRpbWVTbmFwc2hvdDtcbiAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgIC8vIERldi1tb2RlIG11dGF0aW9uIGd1YXJkOiBmcmVlemUgYSBDTE9ORSwgbmV2ZXIgdGhlIGxpdmUgZW5naW5lXG4gICAgICAvLyBzdGF0ZSDigJQgYHNuYXBzaG90LnNoYXJlZFN0YXRlYCBhbGlhc2VzIFNoYXJlZE1lbW9yeSdzIGludGVybmFsXG4gICAgICAvLyBjb250ZXh0IHVudGlsIHRoZSBuZXh0IGNvbW1pdCByZWJ1aWxkcyBpdCAocG9zdC1ydW46IGZvcmV2ZXIpLlxuICAgICAgLy8gUHJvZHVjdGlvbiBzdGF5cyB6ZXJvLWNvcHk7IGNsb25lLWFsd2F5cyBpcyBhIG1lYXN1cmVkIGRlY2lzaW9uXG4gICAgICAvLyBkZWZlcnJlZCB1bnRpbCB0aGUgYmVuY2ggc2F5cyBpdCdzIGFmZm9yZGFibGUgKEJBQ0tMT0cgIzgpLlxuICAgICAgLy8gTk9URTogZGVlcEZyZWV6ZSAocmV1c2VkIGZyb20gcmVhZG9ubHlJbnB1dCkgZnJlZXplcyBwbGFpbiBvYmplY3RzL1xuICAgICAgLy8gYXJyYXlzIG9ubHkg4oCUIE1hcC9TZXQgSU5URVJOQUxTIHN0YXkgbXV0YWJsZSAoYG1hcC5zZXQoKWAgb24gdGhlXG4gICAgICAvLyBmcm96ZW4gY2xvbmUgd29uJ3QgdGhyb3cpLiBUaGUgQ0xPTkUgc3RpbGwgaXNvbGF0ZXMgdGhlIGVuZ2luZS5cbiAgICAgIHNuYXBzaG90LnNoYXJlZFN0YXRlID0gZGVlcEZyZWV6ZShzdHJ1Y3R1cmVkQ2xvbmUoc25hcHNob3Quc2hhcmVkU3RhdGUpKTtcbiAgICB9XG4gICAgY29uc3Qgc2ZSZXN1bHRzID0gdGhpcy50cmF2ZXJzZXIuZ2V0U3ViZmxvd1Jlc3VsdHMoKTtcbiAgICBpZiAoc2ZSZXN1bHRzLnNpemUgPiAwKSB7XG4gICAgICBzbmFwc2hvdC5zdWJmbG93UmVzdWx0cyA9IE9iamVjdC5mcm9tRW50cmllcyhzZlJlc3VsdHMpO1xuICAgIH1cblxuICAgIC8vIENvbGxlY3Qgc25hcHNob3QgZGF0YSBmcm9tIHJlY29yZGVycyB0aGF0IGltcGxlbWVudCB0b1NuYXBzaG90KClcbiAgICBjb25zdCByZWNvcmRlclNuYXBzaG90czogUmVjb3JkZXJTbmFwc2hvdFtdID0gW107XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuc2NvcGVSZWNvcmRlcnMpIHtcbiAgICAgIGlmIChyLnRvU25hcHNob3QpIHtcbiAgICAgICAgY29uc3Qgc25hcCA9IHIudG9TbmFwc2hvdCgpO1xuICAgICAgICByZWNvcmRlclNuYXBzaG90cy5wdXNoKHtcbiAgICAgICAgICBpZDogci5pZCxcbiAgICAgICAgICBuYW1lOiBzbmFwLm5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246IHNuYXAuZGVzY3JpcHRpb24sXG4gICAgICAgICAgcHJlZmVycmVkT3BlcmF0aW9uOiBzbmFwLnByZWZlcnJlZE9wZXJhdGlvbixcbiAgICAgICAgICBkYXRhOiBzbmFwLmRhdGEsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5mbG93UmVjb3JkZXJzKSB7XG4gICAgICBpZiAoci50b1NuYXBzaG90KSB7XG4gICAgICAgIGNvbnN0IHNuYXAgPSByLnRvU25hcHNob3QoKTtcbiAgICAgICAgcmVjb3JkZXJTbmFwc2hvdHMucHVzaCh7XG4gICAgICAgICAgaWQ6IHIuaWQsXG4gICAgICAgICAgbmFtZTogc25hcC5uYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBzbmFwLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogc25hcC5wcmVmZXJyZWRPcGVyYXRpb24sXG4gICAgICAgICAgZGF0YTogc25hcC5kYXRhLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJlY29yZGVyU25hcHNob3RzLmxlbmd0aCA+IDApIHtcbiAgICAgIHNuYXBzaG90LnJlY29yZGVycyA9IHJlY29yZGVyU25hcHNob3RzO1xuICAgIH1cblxuICAgIHJldHVybiBzbmFwc2hvdDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UnVudGltZSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzZXRSb290T2JqZWN0KHBhdGg6IHN0cmluZ1tdLCBrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICB0aGlzLnRyYXZlcnNlci5zZXRSb290T2JqZWN0KHBhdGgsIGtleSwgdmFsdWUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRCcmFuY2hJZHMoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldEJyYW5jaElkcygpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lUm9vdCgpOiBTdGFnZU5vZGUge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lUm9vdCgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBnZXRSdW50aW1lU3RydWN0dXJlKCk6IFNlcmlhbGl6ZWRQaXBlbGluZVN0cnVjdHVyZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWVTdHJ1Y3R1cmUoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0U3ViZmxvd1Jlc3VsdHMoKTogTWFwPHN0cmluZywgU3ViZmxvd1Jlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN1YmZsb3cgbWFuaWZlc3QgZnJvbSBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlci5cbiAgICogUmV0dXJucyBlbXB0eSBhcnJheSBpZiBubyBNYW5pZmVzdEZsb3dSZWNvcmRlciBpcyBhdHRhY2hlZC5cbiAgICovXG4gIGdldFN1YmZsb3dNYW5pZmVzdCgpOiBNYW5pZmVzdEVudHJ5W10ge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbmQoKHIpID0+IHIgaW5zdGFuY2VvZiBNYW5pZmVzdEZsb3dSZWNvcmRlcikgYXNcbiAgICAgIHwgTWFuaWZlc3RGbG93UmVjb3JkZXJcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWNvcmRlcj8uZ2V0TWFuaWZlc3QoKSA/PyBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBmdWxsIHNwZWMgZm9yIGEgZHluYW1pY2FsbHktcmVnaXN0ZXJlZCBzdWJmbG93LlxuICAgKiBSZXF1aXJlcyBhbiBhdHRhY2hlZCBNYW5pZmVzdEZsb3dSZWNvcmRlciB0aGF0IG9ic2VydmVkIHRoZSByZWdpc3RyYXRpb24uXG4gICAqL1xuICBnZXRTdWJmbG93U3BlYyhzdWJmbG93SWQ6IHN0cmluZyk6IHVua25vd24gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHJlY29yZGVyID0gdGhpcy5mbG93UmVjb3JkZXJzLmZpbmQoKHIpID0+IHIgaW5zdGFuY2VvZiBNYW5pZmVzdEZsb3dSZWNvcmRlcikgYXNcbiAgICAgIHwgTWFuaWZlc3RGbG93UmVjb3JkZXJcbiAgICAgIHwgdW5kZWZpbmVkO1xuICAgIHJldHVybiByZWNvcmRlcj8uZ2V0U3BlYyhzdWJmbG93SWQpO1xuICB9XG59XG4iXX0=
1167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvd0NoYXJ0RXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL3J1bm5lci9GbG93Q2hhcnRFeGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFHSCxPQUFPLEVBQUUsZUFBZSxJQUFJLGdCQUFnQixFQUFFLGtCQUFrQixJQUFJLG1CQUFtQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFcEgsT0FBTyxFQUFFLHlCQUF5QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFHN0YsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sdURBQXVELENBQUM7QUFFN0YsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sMkNBQTJDLENBQUM7QUFDL0UsT0FBTyxFQVVMLGFBQWEsR0FDZCxNQUFNLG9CQUFvQixDQUFDO0FBRzVCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUVsRCxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsc0JBQXNCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUVySCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBRWxFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV0RCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNqRyxPQUFPLEVBQStDLGdCQUFnQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7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KiBGbG93Q2hhcnRFeGVjdXRvciDigJQgUHVibGljIEFQSSBmb3IgZXhlY3V0aW5nIGEgY29tcGlsZWQgRmxvd0NoYXJ0LlxuICpcbiAqIFdyYXBzIEZsb3djaGFydFRyYXZlcnNlci4gQnVpbGQgYSBjaGFydCB3aXRoIGZsb3dDaGFydCgpIGFuZCBwYXNzIHRoZSByZXN1bHQgaGVyZTpcbiAqXG4gKiAgIGNvbnN0IGNoYXJ0ID0gZmxvd0NoYXJ0KCdlbnRyeScsIGVudHJ5Rm4pLmFkZEZ1bmN0aW9uKCdwcm9jZXNzJywgcHJvY2Vzc0ZuKS5idWlsZCgpO1xuICpcbiAqICAgLy8gTm8tb3B0aW9ucyBmb3JtICh1c2VzIGF1dG8tZGV0ZWN0ZWQgVHlwZWRTY29wZSBmYWN0b3J5IGZyb20gdGhlIGNoYXJ0KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQpO1xuICpcbiAqICAgLy8gT3B0aW9ucy1vYmplY3QgZm9ybSAocHJlZmVycmVkIHdoZW4geW91IG5lZWQgdG8gY3VzdG9taXplIGJlaGF2aW9yKTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHsgc2NvcGVGYWN0b3J5OiBteUZhY3RvcnkgfSk7XG4gKlxuICogICAvLyAyLXBhcmFtIGZvcm0gKGFjY2VwdHMgYSBTY29wZUZhY3RvcnkgZGlyZWN0bHksIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KTpcbiAqICAgY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIG15RmFjdG9yeSk7XG4gKlxuICogICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dDogZGF0YSwgZW52OiB7IHRyYWNlSWQ6ICdyZXEtMTIzJyB9IH0pO1xuICovXG5cbmltcG9ydCB0eXBlIHsgRmxvd0NoYXJ0IH0gZnJvbSAnLi4vYnVpbGRlci90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZXRhY2hBbmRGb3JnZXQgYXMgX2RldGFjaEFuZEZvcmdldCwgZGV0YWNoQW5kSm9pbkxhdGVyIGFzIF9kZXRhY2hBbmRKb2luTGF0ZXIgfSBmcm9tICcuLi9kZXRhY2gvc3Bhd24uanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyIH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9Db21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgQ29tYmluZWROYXJyYXRpdmVFbnRyeSB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvbmFycmF0aXZlVHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBNYW5pZmVzdEVudHJ5IH0gZnJvbSAnLi4vZW5naW5lL25hcnJhdGl2ZS9yZWNvcmRlcnMvTWFuaWZlc3RGbG93UmVjb3JkZXIuanMnO1xuaW1wb3J0IHsgTWFuaWZlc3RGbG93UmVjb3JkZXIgfSBmcm9tICcuLi9lbmdpbmUvbmFycmF0aXZlL3JlY29yZGVycy9NYW5pZmVzdEZsb3dSZWNvcmRlci5qcyc7XG5pbXBvcnQgdHlwZSB7IEZsb3dSZWNvcmRlciB9IGZyb20gJy4uL2VuZ2luZS9uYXJyYXRpdmUvdHlwZXMuanMnO1xuaW1wb3J0IHsgYnVpbGRSdW50aW1lU3RhZ2VJZCB9IGZyb20gJy4uL2VuZ2luZS9ydW50aW1lU3RhZ2VJZC5qcyc7XG5pbXBvcnQgeyBGbG93Y2hhcnRUcmF2ZXJzZXIgfSBmcm9tICcuLi9lbmdpbmUvdHJhdmVyc2FsL0Zsb3djaGFydFRyYXZlcnNlci5qcyc7XG5pbXBvcnQge1xuICB0eXBlIEV4ZWN1dG9yUmVzdWx0LFxuICB0eXBlIFBhdXNlZFJlc3VsdCxcbiAgdHlwZSBSdW5PcHRpb25zLFxuICB0eXBlIFNjb3BlRmFjdG9yeSxcbiAgdHlwZSBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUsXG4gIHR5cGUgU3RhZ2VOb2RlLFxuICB0eXBlIFN0cmVhbUhhbmRsZXJzLFxuICB0eXBlIFN1YmZsb3dSZXN1bHQsXG4gIHR5cGUgVHJhdmVyc2FsUmVzdWx0LFxuICBkZWZhdWx0TG9nZ2VyLFxufSBmcm9tICcuLi9lbmdpbmUvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBSZWFkVHJhY2tpbmdNb2RlLCBTdGFnZVNuYXBzaG90IH0gZnJvbSAnLi4vbWVtb3J5L3R5cGVzLmpzJztcbmltcG9ydCB0eXBlIHsgRmxvd2NoYXJ0Q2hlY2twb2ludCwgUGF1c2VTaWduYWwgfSBmcm9tICcuLi9wYXVzZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBpc1BhdXNlU2lnbmFsIH0gZnJvbSAnLi4vcGF1c2UvdHlwZXMuanMnO1xuaW1wb3J0IHR5cGUgeyBDb21iaW5lZFJlY29yZGVyIH0gZnJvbSAnLi4vcmVjb3JkZXIvQ29tYmluZWRSZWNvcmRlci5qcyc7XG5pbXBvcnQgeyBoYXNFbWl0UmVjb3JkZXJNZXRob2RzLCBoYXNGbG93UmVjb3JkZXJNZXRob2RzLCBoYXNSZWNvcmRlck1ldGhvZHMgfSBmcm9tICcuLi9yZWNvcmRlci9Db21iaW5lZFJlY29yZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgRW1pdFJlY29yZGVyIH0gZnJvbSAnLi4vcmVjb3JkZXIvRW1pdFJlY29yZGVyLmpzJztcbmltcG9ydCB7IGlzRGV2TW9kZSB9IGZyb20gJy4uL3Njb3BlL2RldGVjdENpcmN1bGFyLmpzJztcbmltcG9ydCB7IGRlZXBGcmVlemUgfSBmcm9tICcuLi9zY29wZS9wcm90ZWN0aW9uL3JlYWRvbmx5SW5wdXQuanMnO1xuaW1wb3J0IHR5cGUgeyBTY29wZVByb3RlY3Rpb25Nb2RlIH0gZnJvbSAnLi4vc2NvcGUvcHJvdGVjdGlvbi90eXBlcy5qcyc7XG5pbXBvcnQgeyBTY29wZUZhY2FkZSB9IGZyb20gJy4uL3Njb3BlL1Njb3BlRmFjYWRlLmpzJztcbmltcG9ydCB0eXBlIHsgUmVkYWN0aW9uUG9saWN5LCBSZWRhY3Rpb25SZXBvcnQsIFNjb3BlUmVjb3JkZXIgfSBmcm9tICcuLi9zY29wZS90eXBlcy5qcyc7XG5pbXBvcnQgeyBkZXNjcmliZUNoZWNrcG9pbnRDbG9uZUZhaWx1cmUsIHNhbml0aXplRGlhZ25vc3RpY0JhZ3MgfSBmcm9tICcuL2NoZWNrcG9pbnRTYW5pdGl6ZS5qcyc7XG5pbXBvcnQgeyB0eXBlIFJlY29yZGVyU25hcHNob3QsIHR5cGUgUnVudGltZVNuYXBzaG90LCBFeGVjdXRpb25SdW50aW1lIH0gZnJvbSAnLi9FeGVjdXRpb25SdW50aW1lLmpzJztcbmltcG9ydCB7IGdlbmVyYXRlUnVuSWQgfSBmcm9tICcuL3J1bklkLmpzJztcbmltcG9ydCB7IHZhbGlkYXRlSW5wdXQgfSBmcm9tICcuL3ZhbGlkYXRlSW5wdXQuanMnO1xuXG4vKiogRGVmYXVsdCBzY29wZSBmYWN0b3J5IOKAlCBjcmVhdGVzIGEgcGxhaW4gU2NvcGVGYWNhZGUgZm9yIGVhY2ggc3RhZ2UuICovXG5jb25zdCBkZWZhdWx0U2NvcGVGYWN0b3J5OiBTY29wZUZhY3RvcnkgPSAoY3R4LCBzdGFnZU5hbWUsIHJlYWRPbmx5LCBlbnYpID0+XG4gIG5ldyBTY29wZUZhY2FkZShjdHgsIHN0YWdlTmFtZSwgcmVhZE9ubHksIGVudik7XG5cbi8qKlxuICogT3B0aW9ucyBvYmplY3QgZm9yIGBGbG93Q2hhcnRFeGVjdXRvcmAg4oCUIHByZWZlcnJlZCBvdmVyIHBvc2l0aW9uYWwgcGFyYW1zLlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IGV4ID0gbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7XG4gKiAgIHNjb3BlRmFjdG9yeTogbXlGYWN0b3J5LFxuICogICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dDogeyAuLi4gfSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogKipTeW5jIG5vdGUgZm9yIG1haW50YWluZXJzOioqIEV2ZXJ5IGZpZWxkIGFkZGVkIGhlcmUgbXVzdCBhbHNvIGFwcGVhciBpbiB0aGVcbiAqIGBmbG93Q2hhcnRBcmdzYCBwcml2YXRlIGZpZWxkIHR5cGUgYW5kIGluIHRoZSBjb25zdHJ1Y3RvcidzIG9wdGlvbnMtcmVzb2x1dGlvblxuICogYmxvY2sgKHRoZSBgZWxzZSBpZmAgYnJhbmNoIHRoYXQgcmVhZHMgZnJvbSBgb3B0c2ApLiBNaXNzaW5nIGFueSBvbmUgb2YgdGhlXG4gKiB0aHJlZSBjYXVzZXMgc2lsZW50IG9taXNzaW9uIOKAlCB0aGUgb3B0aW9uIGlzIGFjY2VwdGVkIGJ1dCBuZXZlciBhcHBsaWVkLlxuICpcbiAqICoqVFNjb3BlIGluZmVyZW5jZSBub3RlOioqIFdoZW4gdXNpbmcgdGhlIG9wdGlvbnMtb2JqZWN0IGZvcm0gd2l0aCBhIGN1c3RvbSBzY29wZSxcbiAqIFR5cGVTY3JpcHQgY2Fubm90IGluZmVyIGBUU2NvcGVgIHRocm91Z2ggdGhlIG9wdGlvbnMgb2JqZWN0LiBQYXNzIHRoZSB0eXBlXG4gKiBleHBsaWNpdGx5OiBgbmV3IEZsb3dDaGFydEV4ZWN1dG9yPFRPdXQsIE15U2NvcGU+KGNoYXJ0LCB7IHNjb3BlRmFjdG9yeSB9KWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zPFRTY29wZSA9IGFueT4ge1xuICAvLyDilIDilIAgQ29tbW9uIG9wdGlvbnMgKG1vc3QgY2FsbGVycyBuZWVkIG9ubHkgdGhlc2UpIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG4gIC8qKiBDdXN0b20gc2NvcGUgZmFjdG9yeS4gRGVmYXVsdHMgdG8gVHlwZWRTY29wZSBvciBTY29wZUZhY2FkZSBhdXRvLWRldGVjdGlvbi4gKi9cbiAgc2NvcGVGYWN0b3J5PzogU2NvcGVGYWN0b3J5PFRTY29wZT47XG5cbiAgLy8g4pSA4pSAIENvbnRleHQgb3B0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogRGVmYXVsdCB2YWx1ZXMgcHJlLXBvcHVsYXRlZCBpbnRvIHRoZSBzaGFyZWQgY29udGV4dCBiZWZvcmUgKiplYWNoKiogc3RhZ2VcbiAgICogKHJlLWFwcGxpZWQgZXZlcnkgc3RhZ2UsIGFjdGluZyBhcyBiYXNlbGluZSBkZWZhdWx0cykuXG4gICAqL1xuICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dD86IHVua25vd247XG4gIC8qKlxuICAgKiBJbml0aWFsIGNvbnRleHQgdmFsdWVzIG1lcmdlZCBpbnRvIHRoZSBzaGFyZWQgY29udGV4dCAqKm9uY2UqKiBhdCBzdGFydHVwXG4gICAqIChhcHBsaWVkIGJlZm9yZSB0aGUgZmlyc3Qgc3RhZ2UsIG5vdCByZXBlYXRlZCBvbiBzdWJzZXF1ZW50IHN0YWdlcykuXG4gICAqIERpc3RpbmN0IGZyb20gYGRlZmF1bHRWYWx1ZXNGb3JDb250ZXh0YCwgd2hpY2ggaXMgcmUtYXBwbGllZCBldmVyeSBzdGFnZS5cbiAgICovXG4gIGluaXRpYWxDb250ZXh0PzogdW5rbm93bjtcbiAgLyoqIFJlYWQtb25seSBpbnB1dCBhY2Nlc3NpYmxlIHZpYSBgc2NvcGUuZ2V0QXJncygpYCDigJQgbmV2ZXIgdHJhY2tlZCBvciB3cml0dGVuLiAqL1xuICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duO1xuXG4gIC8vIOKUgOKUgCBPYnNlcnZhYmlsaXR5IGNvc3Qgb3B0aW9ucyDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogUG9saWN5IGZvciBgU3RhZ2VTbmFwc2hvdC5zdGFnZVJlYWRzYCAoIzE0KS4gRGVmYXVsdCBgJ2Z1bGwnYCDigJQgZXZlcnlcbiAgICogdHJhY2tlZCByZWFkIGBzdHJ1Y3R1cmVkQ2xvbmVgcyB0aGUgdmFsdWUgaW50byB0aGUgc3RhZ2UncyByZWFkIHZpZXdcbiAgICogKHRoZSBoaXN0b3JpY2FsIGJlaGF2aW9yOyB3aGF0IGxlbnMvYWdlbnRmb290cHJpbnQgc25hcHNob3RzIHNob3cpLlxuICAgKiBgJ3N1bW1hcnknYCByZWNvcmRzIGEgY2hlYXAgdHlwZS9zaXplL3ByZXZpZXcgbWFya2VyIHBlciByZWFkOyBgJ29mZidgXG4gICAqIHJlY29yZHMgbm90aGluZyDigJQgemVybyBwZXItcmVhZCBjbG9uZSBjb3N0IChyZWFkcyBvZiBsYXJnZSB2YWx1ZXMgYmVjb21lXG4gICAqIH5mcmVlKS4gTmFycmF0aXZlIGFuZCBgU2NvcGVSZWNvcmRlci5vblJlYWRgIGFyZSBpZGVudGljYWwgaW4gZXZlcnkgbW9kZS5cbiAgICogQ2F2ZWF0OiB1bmRlciBgJ29mZidgIGEgc3RhZ2UncyBzbmFwc2hvdCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIG9uZVxuICAgKiB0aGF0IHJlYWQgbm90aGluZyDigJQgYXVkaXRpbmcgY29uc3VtZXJzIHRoYXQgbmVlZCBcImRpZCBpdCByZWFkP1wiIHdpdGhvdXRcbiAgICogdGhlIHZhbHVlIGNvc3Qgc2hvdWxkIHByZWZlciBgJ3N1bW1hcnknYC5cbiAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIGBleGVjdXRvci5zZXRSZWFkVHJhY2tpbmcobW9kZSlgIGJlZm9yZSBgcnVuKClgLlxuICAgKi9cbiAgcmVhZFRyYWNraW5nPzogUmVhZFRyYWNraW5nTW9kZTtcblxuICAvLyDilIDilIAgQWR2YW5jZWQgLyBlc2NhcGUtaGF0Y2ggb3B0aW9ucyAobW9zdCBjYWxsZXJzIGRvIG5vdCBuZWVkIHRoZXNlKSDilIDilIDilIDilIDilIBcblxuICAvKipcbiAgICogQ3VzdG9tIGVycm9yIGNsYXNzaWZpZXIgZm9yIHRocm90dGxpbmcgZGV0ZWN0aW9uLiBSZXR1cm4gYHRydWVgIGlmIHRoZVxuICAgKiBlcnJvciByZXByZXNlbnRzIGEgcmF0ZS1saW1pdCBvciBiYWNrcHJlc3N1cmUgY29uZGl0aW9uICh0aGUgZXhlY3V0b3Igd2lsbFxuICAgKiB0cmVhdCBpdCBkaWZmZXJlbnRseSBmcm9tIGhhcmQgZmFpbHVyZXMpLiBEZWZhdWx0cyB0byBubyB0aHJvdHRsaW5nIGNsYXNzaWZpY2F0aW9uLlxuICAgKi9cbiAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcj86IChlcnJvcjogdW5rbm93bikgPT4gYm9vbGVhbjtcbiAgLyoqIEhhbmRsZXJzIGZvciBzdHJlYW1pbmcgc3RhZ2UgbGlmZWN5Y2xlIGV2ZW50cyAoc2VlIGBhZGRTdHJlYW1pbmdGdW5jdGlvbmApLiAqL1xuICBzdHJlYW1IYW5kbGVycz86IFN0cmVhbUhhbmRsZXJzO1xuICAvKiogU2NvcGUgcHJvdGVjdGlvbiBtb2RlIGZvciBUeXBlZFNjb3BlIGRpcmVjdC1hc3NpZ25tZW50IGRldGVjdGlvbi4gKi9cbiAgc2NvcGVQcm90ZWN0aW9uTW9kZT86IFNjb3BlUHJvdGVjdGlvbk1vZGU7XG59XG5cbmV4cG9ydCBjbGFzcyBGbG93Q2hhcnRFeGVjdXRvcjxUT3V0ID0gYW55LCBUU2NvcGUgPSBhbnk+IHtcbiAgcHJpdmF0ZSB0cmF2ZXJzZXI6IEZsb3djaGFydFRyYXZlcnNlcjxUT3V0LCBUU2NvcGU+O1xuICAvKiogU2hhcmVkIGV4ZWN1dGlvbiBjb3VudGVyIOKAlCBzdXJ2aXZlcyBwYXVzZS9yZXN1bWUuIFJlc2V0IG9uIGZyZXNoIHJ1bigpLiAqL1xuICBwcml2YXRlIF9leGVjdXRpb25Db3VudGVyID0geyB2YWx1ZTogMCB9O1xuICAvKiogUGVyLWBydW4oKWAgaWRlbnRpZmllciDigJQgZ2VuZXJhdGVkIGZyZXNoIHBlciBydW4gKyBwZXIgcmVzdW1lLiBUaHJlYWRlZFxuICAgKiAgdGhyb3VnaCBldmVyeSBUcmF2ZXJzYWxDb250ZXh0IHNvIHJlY29yZGVycyBjYW4gc2NvcGUgc3RhdGUgdG8gYSBzaW5nbGVcbiAgICogIHJ1bi4gU2VlIGBydW5JZC50c2AuICovXG4gIHByaXZhdGUgX2N1cnJlbnRSdW5JZCA9ICcnO1xuICBwcml2YXRlIG5hcnJhdGl2ZUVuYWJsZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSBuYXJyYXRpdmVPcHRpb25zPzogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlck9wdGlvbnM7XG4gIHByaXZhdGUgY29tYmluZWRSZWNvcmRlcjogQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBmbG93UmVjb3JkZXJzOiBGbG93UmVjb3JkZXJbXSA9IFtdO1xuICBwcml2YXRlIHNjb3BlUmVjb3JkZXJzOiBTY29wZVJlY29yZGVyW10gPSBbXTtcbiAgcHJpdmF0ZSByZWRhY3Rpb25Qb2xpY3k6IFJlZGFjdGlvblBvbGljeSB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBzaGFyZWRSZWRhY3RlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBzaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5ID0gbmV3IE1hcDxzdHJpbmcsIFNldDxzdHJpbmc+PigpO1xuICBwcml2YXRlIGxhc3RDaGVja3BvaW50OiBGbG93Y2hhcnRDaGVja3BvaW50IHwgdW5kZWZpbmVkO1xuICAvKipcbiAgICogYHRydWVgIG9uY2UgYHJ1bigpYCAob3IgYSBwcmV2aW91cyBgcmVzdW1lKClgKSBoYXMgZXhlY3V0ZWQgb25cbiAgICogdGhpcyBpbnN0YW5jZS4gYHJlc3VtZSgpYCBicmFuY2hlcyBvbiBpdDpcbiAgICpcbiAgICogICDigKIgdHJ1ZSAg4oaSIHJldXNlIHRoZSBjb25zdHJ1Y3Rvci10aW1lIHJ1bnRpbWUgKHNhbWUtZXhlY3V0b3JcbiAgICogICAgICAgICAgICAgY29udGludWl0eTogZXhlY3V0aW9uIHRyZWUsIHJlY29yZGVycywgbmFycmF0aXZlXG4gICAqICAgICAgICAgICAgIGFjY3VtdWxhdGUgYWNyb3NzIHBhdXNlL3Jlc3VtZSBjeWNsZXMpXG4gICAqICAg4oCiIGZhbHNlIOKGkiBzZWVkIGEgZnJlc2ggcnVudGltZSBmcm9tIGBjaGVja3BvaW50LnNoYXJlZFN0YXRlYFxuICAgKiAgICAgICAgICAgICAoY3Jvc3MtZXhlY3V0b3IgLyBjcm9zcy1wcm9jZXNzIHJlc3VtZTogbmV3IGluc3RhbmNlXG4gICAqICAgICAgICAgICAgIHJlY29uc3RydWN0ZWQgZnJvbSBhIHNlcmlhbGl6ZWQgY2hlY2twb2ludClcbiAgICpcbiAgICogV2l0aG91dCB0aGlzIGZsYWcsIGZyZXNoIGV4ZWN1dG9ycyBzaWxlbnRseSBkaXNjYXJkZWQgdGhlXG4gICAqIGNoZWNrcG9pbnQncyBzaGFyZWRTdGF0ZSBhbmQgcmVzdW1lIGhhbmRsZXJzIGNvdWxkbid0IHJlYWQgcHJlLXBhdXNlXG4gICAqIHNjb3BlLiBTZWUgYHRlc3QvbGliL3BhdXNlL2Nyb3NzLWV4ZWN1dG9yLXJlc3VtZS50ZXN0LnRzYC5cbiAgICovXG4gIHByaXZhdGUgX2hhc1J1bkJlZm9yZSA9IGZhbHNlO1xuICAvKipcbiAgICogUmUtZW50cmFuY3kgZ3VhcmQuIGBydW4oKWAgYW5kIGByZXN1bWUoKWAgbXV0YXRlIHBlci1ydW4gaW5zdGFuY2Ugc3RhdGVcbiAgICogKHRyYXZlcnNlciwgcnVuSWQsIGV4ZWN1dGlvbiBjb3VudGVyLCBjaGVja3BvaW50KSBhbmQgY2xlYXIgYXR0YWNoZWRcbiAgICogcmVjb3JkZXJzIOKAlCBhIHNlY29uZCBjb25jdXJyZW50IGVudHJ5IG9uIHRoZSBTQU1FIGV4ZWN1dG9yIHdvdWxkXG4gICAqIGludGVybGVhdmUgcnVuSWRzIGFuZCBjcm9zcy1jb250YW1pbmF0ZSByZWNvcmRlci9uYXJyYXRpdmUgc3RhdGUsIGFuZFxuICAgKiBgZ2V0Q2hlY2twb2ludCgpYCB3b3VsZCByZXR1cm4gd2hpY2hldmVyIHJ1biBwYXVzZWQgbGFzdC4gT25lIGV4ZWN1dG9yID1cbiAgICogb25lIGluLWZsaWdodCBleGVjdXRpb247IGNyZWF0ZSBhbiBleGVjdXRvciBwZXIgY29uY3VycmVudCBydW4uXG4gICAqIFNlZSBkb2NzL2d1aWRlcy9leGVjdXRpb24tbW9kZWwubWQuXG4gICAqL1xuICBwcml2YXRlIF9pc0V4ZWN1dGluZyA9IGZhbHNlO1xuXG4gIC8vIFNZTkMgUkVRVUlSRUQ6IGV2ZXJ5IG9wdGlvbmFsIGZpZWxkIGhlcmUgbXVzdCBtaXJyb3IgRmxvd0NoYXJ0RXhlY3V0b3JPcHRpb25zXG4gIC8vIEFORCBiZSBhc3NpZ25lZCBpbiB0aGUgY29uc3RydWN0b3IncyBvcHRpb25zLXJlc29sdXRpb24gYmxvY2sgKHRoZSBgZWxzZSBpZmAgYnJhbmNoKS5cbiAgLy8gQWRkaW5nIGEgZmllbGQgdG8gb25seSBvbmUgb2YgdGhlIHRocmVlIHBsYWNlcyBjYXVzZXMgc2lsZW50IG9taXNzaW9uLlxuICBwcml2YXRlIHJlYWRvbmx5IGZsb3dDaGFydEFyZ3M6IHtcbiAgICBmbG93Q2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+O1xuICAgIHNjb3BlRmFjdG9yeTogU2NvcGVGYWN0b3J5PFRTY29wZT47XG4gICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ/OiB1bmtub3duO1xuICAgIGluaXRpYWxDb250ZXh0PzogdW5rbm93bjtcbiAgICByZWFkT25seUNvbnRleHQ/OiB1bmtub3duO1xuICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXI/OiAoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW47XG4gICAgc3RyZWFtSGFuZGxlcnM/OiBTdHJlYW1IYW5kbGVycztcbiAgICBzY29wZVByb3RlY3Rpb25Nb2RlPzogU2NvcGVQcm90ZWN0aW9uTW9kZTtcbiAgICByZWFkVHJhY2tpbmc/OiBSZWFkVHJhY2tpbmdNb2RlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDcmVhdGUgYSBGbG93Q2hhcnRFeGVjdXRvci5cbiAgICpcbiAgICogKipPcHRpb25zIG9iamVjdCBmb3JtKiogKHByZWZlcnJlZCk6XG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogbmV3IEZsb3dDaGFydEV4ZWN1dG9yKGNoYXJ0LCB7IHNjb3BlRmFjdG9yeSwgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQgfSlcbiAgICogYGBgXG4gICAqXG4gICAqICoqMi1wYXJhbSBmb3JtKiogKGFsc28gc3VwcG9ydGVkKTpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHNjb3BlRmFjdG9yeSlcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBmbG93Q2hhcnQgLSBUaGUgY29tcGlsZWQgRmxvd0NoYXJ0IHJldHVybmVkIGJ5IGBmbG93Q2hhcnQoLi4uKS5idWlsZCgpYFxuICAgKiBAcGFyYW0gZmFjdG9yeU9yT3B0aW9ucyAtIEEgYFNjb3BlRmFjdG9yeTxUU2NvcGU+YCBPUiBhIGBGbG93Q2hhcnRFeGVjdXRvck9wdGlvbnM8VFNjb3BlPmAgb3B0aW9ucyBvYmplY3QuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBmbG93Q2hhcnQ6IEZsb3dDaGFydDxUT3V0LCBUU2NvcGU+LFxuICAgIGZhY3RvcnlPck9wdGlvbnM/OiBTY29wZUZhY3Rvcnk8VFNjb3BlPiB8IEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9uczxUU2NvcGU+LFxuICApIHtcbiAgICAvLyBEZXRlY3Qgb3B0aW9ucy1vYmplY3QgZm9ybSB2cyBmYWN0b3J5IGZvcm1cbiAgICBsZXQgc2NvcGVGYWN0b3J5OiBTY29wZUZhY3Rvcnk8VFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ6IHVua25vd247XG4gICAgbGV0IGluaXRpYWxDb250ZXh0OiB1bmtub3duO1xuICAgIGxldCByZWFkT25seUNvbnRleHQ6IHVua25vd247XG4gICAgbGV0IHRocm90dGxpbmdFcnJvckNoZWNrZXI6ICgoZXJyb3I6IHVua25vd24pID0+IGJvb2xlYW4pIHwgdW5kZWZpbmVkO1xuICAgIGxldCBzdHJlYW1IYW5kbGVyczogU3RyZWFtSGFuZGxlcnMgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHNjb3BlUHJvdGVjdGlvbk1vZGU6IFNjb3BlUHJvdGVjdGlvbk1vZGUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHJlYWRUcmFja2luZzogUmVhZFRyYWNraW5nTW9kZSB8IHVuZGVmaW5lZDtcblxuICAgIGlmICh0eXBlb2YgZmFjdG9yeU9yT3B0aW9ucyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy8gMi1wYXJhbSBmb3JtOiBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQsIHNjb3BlRmFjdG9yeSlcbiAgICAgIHNjb3BlRmFjdG9yeSA9IGZhY3RvcnlPck9wdGlvbnM7XG4gICAgfSBlbHNlIGlmIChmYWN0b3J5T3JPcHRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIE9wdGlvbnMgb2JqZWN0IGZvcm1cbiAgICAgIGNvbnN0IG9wdHMgPSBmYWN0b3J5T3JPcHRpb25zO1xuICAgICAgc2NvcGVGYWN0b3J5ID0gb3B0cy5zY29wZUZhY3Rvcnk7XG4gICAgICBkZWZhdWx0VmFsdWVzRm9yQ29udGV4dCA9IG9wdHMuZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQ7XG4gICAgICBpbml0aWFsQ29udGV4dCA9IG9wdHMuaW5pdGlhbENvbnRleHQ7XG4gICAgICByZWFkT25seUNvbnRleHQgPSBvcHRzLnJlYWRPbmx5Q29udGV4dDtcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXIgPSBvcHRzLnRocm90dGxpbmdFcnJvckNoZWNrZXI7XG4gICAgICBzdHJlYW1IYW5kbGVycyA9IG9wdHMuc3RyZWFtSGFuZGxlcnM7XG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlID0gb3B0cy5zY29wZVByb3RlY3Rpb25Nb2RlO1xuICAgICAgcmVhZFRyYWNraW5nID0gb3B0cy5yZWFkVHJhY2tpbmc7XG4gICAgfVxuICAgIHRoaXMuZmxvd0NoYXJ0QXJncyA9IHtcbiAgICAgIGZsb3dDaGFydCxcbiAgICAgIHNjb3BlRmFjdG9yeTogc2NvcGVGYWN0b3J5ID8/IGZsb3dDaGFydC5zY29wZUZhY3RvcnkgPz8gKGRlZmF1bHRTY29wZUZhY3RvcnkgYXMgU2NvcGVGYWN0b3J5PFRTY29wZT4pLFxuICAgICAgZGVmYXVsdFZhbHVlc0ZvckNvbnRleHQsXG4gICAgICBpbml0aWFsQ29udGV4dCxcbiAgICAgIHJlYWRPbmx5Q29udGV4dCxcbiAgICAgIHRocm90dGxpbmdFcnJvckNoZWNrZXIsXG4gICAgICBzdHJlYW1IYW5kbGVycyxcbiAgICAgIHNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICByZWFkVHJhY2tpbmcsXG4gICAgfTtcbiAgICB0aGlzLnRyYXZlcnNlciA9IHRoaXMuY3JlYXRlVHJhdmVyc2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZVRyYXZlcnNlcihcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICByZWFkT25seUNvbnRleHRPdmVycmlkZT86IHVua25vd24sXG4gICAgZW52PzogaW1wb3J0KCcuLi9lbmdpbmUvdHlwZXMnKS5FeGVjdXRpb25FbnYsXG4gICAgbWF4RGVwdGg/OiBudW1iZXIsXG4gICAgbWF4SXRlcmF0aW9ucz86IG51bWJlcixcbiAgICBvdmVycmlkZXM/OiB7XG4gICAgICByb290PzogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT47XG4gICAgICBpbml0aWFsQ29udGV4dD86IHVua25vd247XG4gICAgICBwcmVzZXJ2ZVJlY29yZGVycz86IGJvb2xlYW47XG4gICAgICBleGlzdGluZ1J1bnRpbWU/OiBJbnN0YW5jZVR5cGU8dHlwZW9mIEV4ZWN1dGlvblJ1bnRpbWU+O1xuICAgICAgLyoqIFBlci1zdWJmbG93IHNjb3BlIGNhcHR1cmVzIGZyb20gYSBjaGVja3BvaW50IOKAlCBwYXNzZWQgdGhyb3VnaFxuICAgICAgICogIHRvIEhhbmRsZXJEZXBzIHNvIFN1YmZsb3dFeGVjdXRvciBjYW4gcmUtc2VlZCBuZXN0ZWQgcnVudGltZXNcbiAgICAgICAqICBvbiB0aGUgcmVzdW1lIHBhdGguIFVuZGVmaW5lZCBvbiBub3JtYWwgcnVuKCkgcGF0aHMuICovXG4gICAgICBzdWJmbG93U3RhdGVzRm9yUmVzdW1lPzogUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuICAgICAgLyoqIFJlc3VtZS1vbmx5IG92ZXJyaWRlIG9mIHRoZSBzdWJmbG93cyBkaWN0IOKAlCBzdWJzdGl0dXRlcyB0aGVcbiAgICAgICAqICBsZWFmIHN1YmZsb3cncyByb290IHdpdGggYSByZXN1bWUgY2hhaW4gc28gdGhlIHN1YmZsb3cgYm9keVxuICAgICAgICogIHBpY2tzIHVwIGF0IHRoZSBwYXVzZSBwb2ludC4gT3RoZXIgZW50cmllcyBwYXNzIHRocm91Z2hcbiAgICAgICAqICB1bmNoYW5nZWQuICovXG4gICAgICBzdWJmbG93c092ZXJyaWRlPzogUmVjb3JkPHN0cmluZywgeyByb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB9PjtcbiAgICB9LFxuICApOiBGbG93Y2hhcnRUcmF2ZXJzZXI8VE91dCwgVFNjb3BlPiB7XG4gICAgY29uc3QgYXJncyA9IHRoaXMuZmxvd0NoYXJ0QXJncztcbiAgICBjb25zdCBmYyA9IGFyZ3MuZmxvd0NoYXJ0O1xuICAgIGNvbnN0IG5hcnJhdGl2ZUZsYWcgPSB0aGlzLm5hcnJhdGl2ZUVuYWJsZWQgfHwgKGZjLmVuYWJsZU5hcnJhdGl2ZSA/PyBmYWxzZSk7XG5cbiAgICAvLyDilIDilIAgQ29tcG9zZWQgc2NvcGUgZmFjdG9yeSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgICAvLyBDb2xsZWN0IGFsbCBzY29wZSBtb2RpZmllcnMgKHJlY29yZGVycywgcmVkYWN0aW9uKSBpbnRvIGEgc2luZ2xlIGxpc3QsXG4gICAgLy8gdGhlbiBjcmVhdGUgT05FIGZhY3RvcnkgdGhhdCBhcHBsaWVzIHRoZW0gaW4gYSBsb29wLiBSZXBsYWNlcyB0aGVcbiAgICAvLyBwcmV2aW91cyA0LWRlZXAgY2xvc3VyZSBuZXN0aW5nIHdpdGggYSBmbGF0LCBkZWJ1Z2dhYmxlIGNvbXBvc2l0aW9uLlxuXG4gICAgaWYgKG92ZXJyaWRlcz8ucHJlc2VydmVSZWNvcmRlcnMpIHtcbiAgICAgIC8vIFJlc3VtZSBtb2RlOiBrZWVwIGV4aXN0aW5nIGNvbWJpbmVkUmVjb3JkZXIgc28gbmFycmF0aXZlIGFjY3VtdWxhdGVzXG4gICAgfSBlbHNlIGlmIChuYXJyYXRpdmVGbGFnKSB7XG4gICAgICB0aGlzLmNvbWJpbmVkUmVjb3JkZXIgPSBuZXcgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlcih0aGlzLm5hcnJhdGl2ZU9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNvbWJpbmVkUmVjb3JkZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgdGhpcy5zaGFyZWRSZWRhY3RlZEtleXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB0aGlzLnNoYXJlZFJlZGFjdGVkRmllbGRzQnlLZXkgPSBuZXcgTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KCk7XG5cbiAgICAvLyBCdWlsZCBtb2RpZmllciBsaXN0IOKAlCBlYWNoIG1vZGlmaWVyIHJlY2VpdmVzIHRoZSBzY29wZSBhZnRlciBjcmVhdGlvblxuICAgIHR5cGUgU2NvcGVNb2RpZmllciA9IChzY29wZTogYW55KSA9PiB2b2lkO1xuICAgIGNvbnN0IG1vZGlmaWVyczogU2NvcGVNb2RpZmllcltdID0gW107XG5cbiAgICAvLyAxLiBOYXJyYXRpdmUgcmVjb3JkZXIgKGlmIGVuYWJsZWQpXG4gICAgaWYgKHRoaXMuY29tYmluZWRSZWNvcmRlcikge1xuICAgICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLmNvbWJpbmVkUmVjb3JkZXI7XG4gICAgICBtb2RpZmllcnMucHVzaCgoc2NvcGUpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzY29wZS5hdHRhY2hTY29wZVJlY29yZGVyID09PSAnZnVuY3Rpb24nKSBzY29wZS5hdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIDIuIFVzZXItcHJvdmlkZWQgc2NvcGUgcmVjb3JkZXJzXG4gICAgaWYgKHRoaXMuc2NvcGVSZWNvcmRlcnMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcmVjb3JkZXJzID0gdGhpcy5zY29wZVJlY29yZGVycztcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLmF0dGFjaFNjb3BlUmVjb3JkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHIgb2YgcmVjb3JkZXJzKSBzY29wZS5hdHRhY2hTY29wZVJlY29yZGVyKHIpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyAzLiBSZWRhY3Rpb24gcG9saWN5IChjb25kaXRpb25hbCDigJQgb25seSB3aGVuIHBvbGljeSBpcyBzZXQpXG4gICAgaWYgKHRoaXMucmVkYWN0aW9uUG9saWN5KSB7XG4gICAgICBjb25zdCBwb2xpY3kgPSB0aGlzLnJlZGFjdGlvblBvbGljeTtcbiAgICAgIG1vZGlmaWVycy5wdXNoKChzY29wZSkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNjb3BlLnVzZVJlZGFjdGlvblBvbGljeSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIHNjb3BlLnVzZVJlZGFjdGlvblBvbGljeShwb2xpY3kpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIC8vIFByZS1wb3B1bGF0ZSBleGVjdXRvci1sZXZlbCBmaWVsZCByZWRhY3Rpb24gbWFwIGZyb20gcG9saWN5XG4gICAgICAvLyBzbyBnZXRSZWRhY3Rpb25SZXBvcnQoKSBpbmNsdWRlcyBmaWVsZC1sZXZlbCByZWRhY3Rpb25zLlxuICAgICAgaWYgKHBvbGljeS5maWVsZHMpIHtcbiAgICAgICAgZm9yIChjb25zdCBba2V5LCBmaWVsZHNdIG9mIE9iamVjdC5lbnRyaWVzKHBvbGljeS5maWVsZHMpKSB7XG4gICAgICAgICAgdGhpcy5zaGFyZWRSZWRhY3RlZEZpZWxkc0J5S2V5LnNldChrZXksIG5ldyBTZXQoZmllbGRzKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDb21wb3NlOiBiYXNlIGZhY3RvcnkgKyBtb2RpZmllcnMgaW4gYSBzaW5nbGUgcGFzcy5cbiAgICAvLyBTaGFyZWQgcmVkYWN0ZWQga2V5cyBhcmUgQUxXQVlTIHdpcmVkIHVwICh1bmNvbmRpdGlvbmFsIOKAlCBlbnN1cmVzIGNyb3NzLXN0YWdlXG4gICAgLy8gcHJvcGFnYXRpb24gZXZlbiB3aXRob3V0IGEgcG9saWN5LCBiZWNhdXNlIHN0YWdlcyBjYW4gY2FsbCBzZXRWYWx1ZShrZXksIHZhbCwgdHJ1ZSlcbiAgICAvLyBmb3IgcGVyLWNhbGwgcmVkYWN0aW9uKS4gT3B0aW9uYWwgbW9kaWZpZXJzIChyZWNvcmRlcnMsIHBvbGljeSkgYXJlIGluIHRoZSBsaXN0LlxuICAgIGNvbnN0IGJhc2VGYWN0b3J5ID0gYXJncy5zY29wZUZhY3Rvcnk7XG4gICAgY29uc3Qgc2hhcmVkUmVkYWN0ZWRLZXlzID0gdGhpcy5zaGFyZWRSZWRhY3RlZEtleXM7XG4gICAgY29uc3Qgc2NvcGVGYWN0b3J5ID0gKChjdHg6IGFueSwgc3RhZ2VOYW1lOiBzdHJpbmcsIHJlYWRPbmx5PzogdW5rbm93biwgZW52QXJnPzogYW55KSA9PiB7XG4gICAgICBjb25zdCBzY29wZSA9IGJhc2VGYWN0b3J5KGN0eCwgc3RhZ2VOYW1lLCByZWFkT25seSwgZW52QXJnKTtcbiAgICAgIC8vIEFsd2F5cyB3aXJlIHNoYXJlZCByZWRhY3Rpb24gc3RhdGVcbiAgICAgIGlmICh0eXBlb2YgKHNjb3BlIGFzIGFueSkudXNlU2hhcmVkUmVkYWN0ZWRLZXlzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIChzY29wZSBhcyBhbnkpLnVzZVNoYXJlZFJlZGFjdGVkS2V5cyhzaGFyZWRSZWRhY3RlZEtleXMpO1xuICAgICAgfVxuICAgICAgLy8gQXBwbHkgb3B0aW9uYWwgbW9kaWZpZXJzXG4gICAgICBmb3IgKGNvbnN0IG1vZCBvZiBtb2RpZmllcnMpIG1vZChzY29wZSk7XG4gICAgICByZXR1cm4gc2NvcGU7XG4gICAgfSkgYXMgU2NvcGVGYWN0b3J5PFRTY29wZT47XG5cbiAgICBjb25zdCBlZmZlY3RpdmVSb290ID0gb3ZlcnJpZGVzPy5yb290ID8/IGZjLnJvb3Q7XG4gICAgY29uc3QgZWZmZWN0aXZlSW5pdGlhbENvbnRleHQgPSBvdmVycmlkZXM/LmluaXRpYWxDb250ZXh0ID8/IGFyZ3MuaW5pdGlhbENvbnRleHQ7XG5cbiAgICBsZXQgcnVudGltZTogRXhlY3V0aW9uUnVudGltZTtcbiAgICBpZiAob3ZlcnJpZGVzPy5leGlzdGluZ1J1bnRpbWUpIHtcbiAgICAgIC8vIFJlc3VtZSBtb2RlOiByZXVzZSBleGlzdGluZyBydW50aW1lIHNvIGV4ZWN1dGlvbiB0cmVlIGNvbnRpbnVlcyBmcm9tIHBhdXNlIHBvaW50LlxuICAgICAgLy8gUHJlc2VydmUgdGhlIG9yaWdpbmFsIHJvb3QgZm9yIGdldFNuYXBzaG90KCkgKGZ1bGwgdHJlZSksIHRoZW4gYWR2YW5jZVxuICAgICAgLy8gcm9vdFN0YWdlQ29udGV4dCB0byBhIGNvbnRpbnVhdGlvbiBmcm9tIHRoZSBsZWFmIChmb3IgdHJhdmVyc2FsKS5cbiAgICAgIHJ1bnRpbWUgPSBvdmVycmlkZXMuZXhpc3RpbmdSdW50aW1lO1xuICAgICAgcnVudGltZS5wcmVzZXJ2ZVNuYXBzaG90Um9vdCgpO1xuICAgICAgbGV0IGxlYWYgPSBydW50aW1lLnJvb3RTdGFnZUNvbnRleHQ7XG4gICAgICB3aGlsZSAobGVhZi5uZXh0KSBsZWFmID0gbGVhZi5uZXh0O1xuICAgICAgcnVudGltZS5yb290U3RhZ2VDb250ZXh0ID0gbGVhZi5jcmVhdGVOZXh0KCcnLCBlZmZlY3RpdmVSb290Lm5hbWUsIGVmZmVjdGl2ZVJvb3QuaWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBydW50aW1lID0gbmV3IEV4ZWN1dGlvblJ1bnRpbWUoXG4gICAgICAgIGVmZmVjdGl2ZVJvb3QubmFtZSxcbiAgICAgICAgZWZmZWN0aXZlUm9vdC5pZCxcbiAgICAgICAgYXJncy5kZWZhdWx0VmFsdWVzRm9yQ29udGV4dCxcbiAgICAgICAgZWZmZWN0aXZlSW5pdGlhbENvbnRleHQsXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFdoZW4gYSByZWRhY3Rpb24gcG9saWN5IGlzIGNvbmZpZ3VyZWQsIG1haW50YWluIGEgcGFyYWxsZWwgcmVkYWN0ZWRcbiAgICAvLyBtaXJyb3Igb2YgYGdsb2JhbFN0b3JlYCBkdXJpbmcgdHJhdmVyc2FsLiBFYWNoIGNvbW1pdCBhcHBsaWVzIHRoZVxuICAgIC8vIGFscmVhZHktY29tcHV0ZWQgcmVkYWN0ZWQgcGF0Y2hlcyDigJQgc2FtZSBvbmVzIGZlZCB0byB0aGUgZXZlbnQgbG9nIOKAlFxuICAgIC8vIHNvIGBnZXRTbmFwc2hvdCh7IHJlZGFjdDogdHJ1ZSB9KWAgcmV0dXJucyBhIHNjcnViYmVkIHNoYXJlZFN0YXRlIGF0XG4gICAgLy8gemVybyBwb3N0LXBhc3MgY29zdC4gU2tpcHBlZCB3aGVuIG5vIHBvbGljeSBleGlzdHMgKHplcm8gYWxsb2NhdGlvbikuXG4gICAgaWYgKHRoaXMucmVkYWN0aW9uUG9saWN5KSB7XG4gICAgICBydW50aW1lLmVuYWJsZVJlZGFjdGVkTWlycm9yKCk7XG4gICAgfVxuXG4gICAgLy8gUmVhZC10cmFja2luZyBwb2xpY3kgKCMxNCk6IHNldCBvbiB0aGUgcnVudGltZSdzIHJvb3QgY29udGV4dCBzbyBldmVyeVxuICAgIC8vIGRlc2NlbmRhbnQgY29udGV4dCAoY3JlYXRlTmV4dC9jcmVhdGVDaGlsZCkgYW5kIHN1YmZsb3cgcm9vdCBpbmhlcml0cy5cbiAgICAvLyBBcHBsaWVkIEFGVEVSIHRoZSByZXN1bWUtcGF0aCByb290IHN3YXAgYWJvdmUgc28gdGhlIGNvbnRpbnVhdGlvbiByb290XG4gICAgLy8gY2FycmllcyB0aGUgcG9saWN5IHRvby4gU2tpcHBlZCBmb3IgdGhlIGRlZmF1bHQgJ2Z1bGwnIOKAlCB6ZXJvIHdvcmsuXG4gICAgY29uc3QgcmVhZFRyYWNraW5nID0gYXJncy5yZWFkVHJhY2tpbmc7XG4gICAgaWYgKHJlYWRUcmFja2luZyAhPT0gdW5kZWZpbmVkICYmIHJlYWRUcmFja2luZyAhPT0gJ2Z1bGwnKSB7XG4gICAgICBydW50aW1lLnVzZVJlYWRUcmFja2luZyhyZWFkVHJhY2tpbmcpO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgRmxvd2NoYXJ0VHJhdmVyc2VyPFRPdXQsIFRTY29wZT4oe1xuICAgICAgcm9vdDogZWZmZWN0aXZlUm9vdCxcbiAgICAgIHN0YWdlTWFwOiBmYy5zdGFnZU1hcCxcbiAgICAgIHNjb3BlRmFjdG9yeSxcbiAgICAgIGV4ZWN1dGlvblJ1bnRpbWU6IHJ1bnRpbWUsXG4gICAgICByZWFkT25seUNvbnRleHQ6IHJlYWRPbmx5Q29udGV4dE92ZXJyaWRlID8/IGFyZ3MucmVhZE9ubHlDb250ZXh0LFxuICAgICAgdGhyb3R0bGluZ0Vycm9yQ2hlY2tlcjogYXJncy50aHJvdHRsaW5nRXJyb3JDaGVja2VyLFxuICAgICAgc3RyZWFtSGFuZGxlcnM6IGFyZ3Muc3RyZWFtSGFuZGxlcnMsXG4gICAgICBzY29wZVByb3RlY3Rpb25Nb2RlOiBhcmdzLnNjb3BlUHJvdGVjdGlvbk1vZGUsXG4gICAgICBzdWJmbG93czogZmMuc3ViZmxvd3MsXG4gICAgICBuYXJyYXRpdmVFbmFibGVkOiBuYXJyYXRpdmVGbGFnLFxuICAgICAgYnVpbGRUaW1lU3RydWN0dXJlOiBmYy5idWlsZFRpbWVTdHJ1Y3R1cmUsXG4gICAgICBsb2dnZXI6IGZjLmxvZ2dlciA/PyBkZWZhdWx0TG9nZ2VyLFxuICAgICAgc2lnbmFsLFxuICAgICAgZXhlY3V0aW9uRW52OiBlbnYsXG4gICAgICBmbG93UmVjb3JkZXJzOiB0aGlzLmJ1aWxkRmxvd1JlY29yZGVyc0xpc3QoKSxcbiAgICAgIGV4ZWN1dGlvbkNvdW50ZXI6IHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIsXG4gICAgICBydW5JZDogdGhpcy5fY3VycmVudFJ1bklkLFxuICAgICAgLi4uKG92ZXJyaWRlcz8uc3ViZmxvd3NPdmVycmlkZSAmJiB7IHN1YmZsb3dzOiBvdmVycmlkZXMuc3ViZmxvd3NPdmVycmlkZSB9KSxcbiAgICAgIC4uLihvdmVycmlkZXM/LnN1YmZsb3dTdGF0ZXNGb3JSZXN1bWUgJiYge1xuICAgICAgICBzdWJmbG93U3RhdGVzRm9yUmVzdW1lOiBvdmVycmlkZXMuc3ViZmxvd1N0YXRlc0ZvclJlc3VtZSxcbiAgICAgIH0pLFxuICAgICAgLi4uKG1heERlcHRoICE9PSB1bmRlZmluZWQgJiYgeyBtYXhEZXB0aCB9KSxcbiAgICAgIC4uLihtYXhJdGVyYXRpb25zICE9PSB1bmRlZmluZWQgJiYgeyBtYXhJdGVyYXRpb25zIH0pLFxuICAgIH0pO1xuICB9XG5cbiAgZW5hYmxlTmFycmF0aXZlKG9wdGlvbnM/OiBDb21iaW5lZE5hcnJhdGl2ZVJlY29yZGVyT3B0aW9ucyk6IHZvaWQge1xuICAgIHRoaXMubmFycmF0aXZlRW5hYmxlZCA9IHRydWU7XG4gICAgaWYgKG9wdGlvbnMpIHRoaXMubmFycmF0aXZlT3B0aW9ucyA9IG9wdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogU2V0IGEgZGVjbGFyYXRpdmUgcmVkYWN0aW9uIHBvbGljeSB0aGF0IGFwcGxpZXMgdG8gYWxsIHN0YWdlcy5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpLlxuICAgKi9cbiAgc2V0UmVkYWN0aW9uUG9saWN5KHBvbGljeTogUmVkYWN0aW9uUG9saWN5KTogdm9pZCB7XG4gICAgdGhpcy5yZWRhY3Rpb25Qb2xpY3kgPSBwb2xpY3k7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSByZWFkLXRyYWNraW5nIHBvbGljeSBmb3IgYFN0YWdlU25hcHNob3Quc3RhZ2VSZWFkc2AgKCMxNCkuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS4gRXF1aXZhbGVudCB0byB0aGUgYHJlYWRUcmFja2luZ2BcbiAgICogY29uc3RydWN0b3Igb3B0aW9uIOKAlCBzZWUge0BsaW5rIEZsb3dDaGFydEV4ZWN1dG9yT3B0aW9ucy5yZWFkVHJhY2tpbmd9XG4gICAqIGZvciB0aGUgbW9kZSBzZW1hbnRpY3MgKCdmdWxsJyBkZWZhdWx0IC8gJ3N1bW1hcnknIC8gJ29mZicpLlxuICAgKi9cbiAgc2V0UmVhZFRyYWNraW5nKG1vZGU6IFJlYWRUcmFja2luZ01vZGUpOiB2b2lkIHtcbiAgICB0aGlzLmZsb3dDaGFydEFyZ3MucmVhZFRyYWNraW5nID0gbW9kZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgY29tcGxpYW5jZS1mcmllbmRseSByZXBvcnQgb2YgYWxsIHJlZGFjdGlvbiBhY3Rpdml0eSBmcm9tIHRoZVxuICAgKiBtb3N0IHJlY2VudCBydW4uIE5ldmVyIGluY2x1ZGVzIGFjdHVhbCB2YWx1ZXMuXG4gICAqL1xuICBnZXRSZWRhY3Rpb25SZXBvcnQoKTogUmVkYWN0aW9uUmVwb3J0IHtcbiAgICBjb25zdCBmaWVsZFJlZGFjdGlvbnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRzXSBvZiB0aGlzLnNoYXJlZFJlZGFjdGVkRmllbGRzQnlLZXkpIHtcbiAgICAgIGZpZWxkUmVkYWN0aW9uc1trZXldID0gWy4uLmZpZWxkc107XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICByZWRhY3RlZEtleXM6IFsuLi50aGlzLnNoYXJlZFJlZGFjdGVkS2V5c10sXG4gICAgICBmaWVsZFJlZGFjdGlvbnMsXG4gICAgICBwYXR0ZXJuczogKHRoaXMucmVkYWN0aW9uUG9saWN5Py5wYXR0ZXJucyA/PyBbXSkubWFwKChwKSA9PiBwLnNvdXJjZSksXG4gICAgfTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBQYXVzZS9SZXN1bWUg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGNoZWNrcG9pbnQgZnJvbSB0aGUgbW9zdCByZWNlbnQgcGF1c2VkIGV4ZWN1dGlvbiwgb3IgYHVuZGVmaW5lZGBcbiAgICogaWYgdGhlIGxhc3QgcnVuIGNvbXBsZXRlZCB3aXRob3V0IHBhdXNpbmcuXG4gICAqXG4gICAqIFRoZSBjaGVja3BvaW50IGlzIEpTT04tc2VyaWFsaXphYmxlIOKAlCBzdG9yZSBpdCBpbiBSZWRpcywgUG9zdGdyZXMsIGxvY2FsU3RvcmFnZSwgZXRjLlxuICAgKlxuICAgKiBJdCBpcyBmdWxseSBERVRBQ0hFRCBmcm9tIGVuZ2luZSBzdGF0ZTogZXZlcnkgZmllbGQgd2FzIGRlZXAtY29waWVkIGF0XG4gICAqIHBhdXNlIHRpbWUgKHNlZSBgYnVpbGRQYXVzZUNoZWNrcG9pbnRgKS4gSG9sZGluZywgbXV0YXRpbmcsIG9yIHBlcnNpc3RpbmdcbiAgICogaXQgY2Fubm90IGFmZmVjdCB0aGUgZXhlY3V0b3IsIGFuZCBhIGxhdGVyIHNhbWUtZXhlY3V0b3IgcmVzdW1lIGNhbm5vdFxuICAgKiBtdXRhdGUgYSBjaGVja3BvaW50IHlvdSBhbHJlYWR5IHN0b3JlZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5ydW4oeyBpbnB1dCB9KTtcbiAgICogaWYgKGV4ZWN1dG9yLmlzUGF1c2VkKCkpIHtcbiAgICogICBjb25zdCBjaGVja3BvaW50ID0gZXhlY3V0b3IuZ2V0Q2hlY2twb2ludCgpITtcbiAgICogICBhd2FpdCByZWRpcy5zZXQoYHNlc3Npb246JHtpZH1gLCBKU09OLnN0cmluZ2lmeShjaGVja3BvaW50KSk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBnZXRDaGVja3BvaW50KCk6IEZsb3djaGFydENoZWNrcG9pbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGVja3BvaW50O1xuICB9XG5cbiAgLyoqIFJldHVybnMgYHRydWVgIGlmIHRoZSBtb3N0IHJlY2VudCBydW4oKSB3YXMgcGF1c2VkIChjaGVja3BvaW50IGF2YWlsYWJsZSkuICovXG4gIGlzUGF1c2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmxhc3RDaGVja3BvaW50ICE9PSB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogTnVtYmVyIG9mIGNvbW1pdHMgaW4gdGhlIHJ1bidzIGNvbW1pdCBsb2cuIE8oMSkg4oCUIGRpcmVjdCBsZW5ndGhcbiAgICogcmVhZCwgbm8gc25hcHNob3QgbWF0ZXJpYWxpemF0aW9uLiBVc2UgdGhpcyB0byBzdGFtcCBjb21taXRcbiAgICogaW5kaWNlcyBvbiBvYnNlcnZlciBldmVudHMgKGUuZy4sIGBCb3VuZGFyeVJlY29yZGVyYCBzdG9yaW5nXG4gICAqIGBjb21taXRJZHhCZWZvcmVgIC8gYGNvbW1pdElkeEFmdGVyYCBwZXIgZG9tYWluIGV2ZW50IGZvclxuICAgKiBgQ29tbWl0UmFuZ2VJbmRleGAgcXVlcmllcyDigJQgc2VlIGBmb290cHJpbnRqcy90cmFjZWApLlxuICAgKlxuICAgKiBSZXR1cm5zIDAgYmVmb3JlIGFueSBydW47IGFmdGVyLCByZXR1cm5zIHRoZSBjdW11bGF0aXZlIGNvbW1pdFxuICAgKiBjb3VudCBhY3Jvc3MgdGhlIGV4ZWN1dG9yJ3MgbGlmZXRpbWUgKGluY2x1ZGluZyByZXN1bWVzKS5cbiAgICpcbiAgICogSU1QTEVNRU5UQVRJT04gTk9URTogdGhpcyByZXR1cm5zIGBydW50aW1lLmV4ZWN1dGlvbkhpc3RvcnkubGVuZ3RoYCxcbiAgICogd2hpY2ggaXMgdGhlIHNhbWUgdmFsdWUgYXMgYGdldFNuYXBzaG90KCkuY29tbWl0TG9nLmxlbmd0aGAuIFRoZVxuICAgKiBuYW1pbmcgYXN5bW1ldHJ5IGlzIGhpc3RvcmljYWwg4oCUIHRoZSB1bmRlcmx5aW5nIGBFdmVudExvZ2AgZmllbGRcbiAgICogaXMgbmFtZWQgYGV4ZWN1dGlvbkhpc3RvcnlgIGJ1dCBzdG9yZXMgdGhlIGBDb21taXRCdW5kbGVbXWAgdGhhdFxuICAgKiBgY29tbWl0TG9nYCBleHBvc2VzLiBUaGV5IGFyZSB0aGUgU0FNRSBhcnJheSAodmVyaWZpZWQgYnkgdGhlXG4gICAqIFwibWF0Y2hlcyBjb21taXRMb2cubGVuZ3RoXCIgaW50ZWdyYXRpb24gdGVzdCkuXG4gICAqL1xuICBnZXRDb21taXRDb3VudCgpOiBudW1iZXIge1xuICAgIGNvbnN0IHJ1bnRpbWUgPSB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPiB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcnVudGltZT8uZXhlY3V0aW9uSGlzdG9yeS5sZW5ndGggPz8gMDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXN1bWUgYSBwYXVzZWQgZmxvd2NoYXJ0IGZyb20gYSBjaGVja3BvaW50LlxuICAgKlxuICAgKiBSZXN0b3JlcyB0aGUgc2NvcGUgc3RhdGUsIGNhbGxzIHRoZSBwYXVzZWQgc3RhZ2UncyBgcmVzdW1lRm5gIHdpdGggdGhlXG4gICAqIHByb3ZpZGVkIGlucHV0LCB0aGVuIGNvbnRpbnVlcyB0cmF2ZXJzYWwgZnJvbSB0aGUgbmV4dCBzdGFnZS5cbiAgICpcbiAgICogVGhlIGNoZWNrcG9pbnQgY2FuIGNvbWUgZnJvbSBgZ2V0Q2hlY2twb2ludCgpYCBvbiBhIHByZXZpb3VzIHJ1biwgb3IgZnJvbVxuICAgKiBhIHNlcmlhbGl6ZWQgY2hlY2twb2ludCBzdG9yZWQgaW4gUmVkaXMvUG9zdGdyZXMvbG9jYWxTdG9yYWdlLlxuICAgKlxuICAgKiAqKk5hcnJhdGl2ZS9yZWNvcmRlciBzdGF0ZSBpcyByZXNldCBvbiByZXN1bWUuKiogVG8ga2VlcCBhIHVuaWZpZWQgbmFycmF0aXZlXG4gICAqIGFjcm9zcyBwYXVzZS9yZXN1bWUgY3ljbGVzLCBjb2xsZWN0IGl0IGJlZm9yZSBjYWxsaW5nIHJlc3VtZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBQcm9jZXNzIEEg4oCUIGFmdGVyIGEgcGF1c2UsIHBlcnNpc3QgdGhlIGNoZWNrcG9pbnQ6XG4gICAqIGNvbnN0IGNoZWNrcG9pbnQgPSBleGVjdXRvci5nZXRDaGVja3BvaW50KCkhO1xuICAgKiBhd2FpdCByZWRpcy5zZXQoYHNlc3Npb246JHtpZH1gLCBKU09OLnN0cmluZ2lmeShjaGVja3BvaW50KSk7XG4gICAqXG4gICAqIC8vIFByb2Nlc3MgQiAocG9zc2libHkgZGlmZmVyZW50IHNlcnZlciwgc2FtZSBjaGFydCkg4oCUIHJlc3RvcmUgYW5kIHJlc3VtZTpcbiAgICogY29uc3QgcmVzdG9yZWQgPSBKU09OLnBhcnNlKGF3YWl0IHJlZGlzLmdldChgc2Vzc2lvbjoke2lkfWApKTtcbiAgICogY29uc3QgZXhlY3V0b3IgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IoY2hhcnQpO1xuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjdXRvci5yZXN1bWUocmVzdG9yZWQsIHsgYXBwcm92ZWQ6IHRydWUgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYXN5bmMgcmVzdW1lKFxuICAgIGNoZWNrcG9pbnQ6IEZsb3djaGFydENoZWNrcG9pbnQsXG4gICAgcmVzdW1lSW5wdXQ/OiB1bmtub3duLFxuICAgIG9wdGlvbnM/OiBQaWNrPFJ1bk9wdGlvbnMsICdzaWduYWwnIHwgJ2VudicgfCAnbWF4RGVwdGgnIHwgJ21heEl0ZXJhdGlvbnMnPixcbiAgKTogUHJvbWlzZTxFeGVjdXRvclJlc3VsdD4ge1xuICAgIC8vIFJlLWVudHJhbmN5IGd1YXJkIEZJUlNUIOKAlCByZXN1bWUoKSBtdXRhdGVzIHRoZSBzYW1lIHBlci1ydW4gc3RhdGUgcnVuKClcbiAgICAvLyBkb2VzICh0cmF2ZXJzZXIsIHJ1bklkLCBjaGVja3BvaW50KSwgc28gcmVzdW1lLWR1cmluZy1ydW4gYW5kXG4gICAgLy8gZG91YmxlLXJlc3VtZSBhcmUgdGhlIHNhbWUgY29ycnVwdGlvbiBjbGFzcyBhcyBjb25jdXJyZW50IHJ1bigpLlxuICAgIGlmICh0aGlzLl9pc0V4ZWN1dGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnRmxvd0NoYXJ0RXhlY3V0b3I6IHJlc3VtZSgpIGNhbGxlZCB3aGlsZSBhbm90aGVyIHJ1bigpL3Jlc3VtZSgpIGlzIGluIGZsaWdodCBvbiB0aGlzICcgK1xuICAgICAgICAgICdleGVjdXRvci4gQW4gZXhlY3V0b3IgaG9sZHMgcGVyLXJ1biBzdGF0ZSAocnVuSWQsIHJlY29yZGVycywgY2hlY2twb2ludCkg4oCUIGNyZWF0ZSAnICtcbiAgICAgICAgICAnb25lIGV4ZWN1dG9yIHBlciBjb25jdXJyZW50IHJ1bi4gU2VlIGRvY3MvZ3VpZGVzL2V4ZWN1dGlvbi1tb2RlbC5tZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8g4pSA4pSAIFZhbGlkYXRlIGNoZWNrcG9pbnQgc3RydWN0dXJlIChtYXkgY29tZSBmcm9tIHVudHJ1c3RlZCBleHRlcm5hbCBzdG9yYWdlKSDilIDilIBcbiAgICAvLyAobGFzdENoZWNrcG9pbnQgaXMgd2lwZWQgQUZURVIgdmFsaWRhdGlvbiDigJQgYSByZWplY3RlZCBjaGVja3BvaW50IG11c3RcbiAgICAvLyBub3QgZGVzdHJveSB0aGUgZXhlY3V0b3IncyBleGlzdGluZyBjaGVja3BvaW50IHN0YXRlLilcbiAgICBpZiAoXG4gICAgICAhY2hlY2twb2ludCB8fFxuICAgICAgdHlwZW9mIGNoZWNrcG9pbnQgIT09ICdvYmplY3QnIHx8XG4gICAgICB0eXBlb2YgY2hlY2twb2ludC5zaGFyZWRTdGF0ZSAhPT0gJ29iamVjdCcgfHxcbiAgICAgIGNoZWNrcG9pbnQuc2hhcmVkU3RhdGUgPT09IG51bGwgfHxcbiAgICAgIEFycmF5LmlzQXJyYXkoY2hlY2twb2ludC5zaGFyZWRTdGF0ZSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjaGVja3BvaW50OiBzaGFyZWRTdGF0ZSBtdXN0IGJlIGEgcGxhaW4gb2JqZWN0LicpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGNoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZCAhPT0gJ3N0cmluZycgfHwgY2hlY2twb2ludC5wYXVzZWRTdGFnZUlkID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoZWNrcG9pbnQ6IHBhdXNlZFN0YWdlSWQgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuJyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgICFBcnJheS5pc0FycmF5KGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpIHx8XG4gICAgICAhY2hlY2twb2ludC5zdWJmbG93UGF0aC5ldmVyeSgoczogdW5rbm93bikgPT4gdHlwZW9mIHMgPT09ICdzdHJpbmcnKVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoZWNrcG9pbnQ6IHN1YmZsb3dQYXRoIG11c3QgYmUgYW4gYXJyYXkgb2Ygc3RyaW5ncy4nKTtcbiAgICB9XG5cbiAgICAvLyBGaW5kIHRoZSBwYXVzZWQgbm9kZSBpbiB0aGUgZ3JhcGhcbiAgICBjb25zdCBwYXVzZWROb2RlID0gdGhpcy5maW5kTm9kZUluR3JhcGgoY2hlY2twb2ludC5wYXVzZWRTdGFnZUlkLCBjaGVja3BvaW50LnN1YmZsb3dQYXRoKTtcbiAgICBpZiAoIXBhdXNlZE5vZGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCByZXN1bWU6IHN0YWdlICcke2NoZWNrcG9pbnQucGF1c2VkU3RhZ2VJZH0nIG5vdCBmb3VuZCBpbiBmbG93Y2hhcnQuIGAgK1xuICAgICAgICAgICdUaGUgY2hhcnQgbWF5IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgY2hlY2twb2ludCB3YXMgY3JlYXRlZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFwYXVzZWROb2RlLnJlc3VtZUZuKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgcmVzdW1lOiBzdGFnZSAnJHtwYXVzZWROb2RlLm5hbWV9JyAoJHtwYXVzZWROb2RlLmlkfSkgaGFzIG5vIHJlc3VtZUZuLiBgICtcbiAgICAgICAgICAnT25seSBzdGFnZXMgY3JlYXRlZCB3aXRoIGFkZFBhdXNhYmxlRnVuY3Rpb24oKSBjYW4gYmUgcmVzdW1lZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIEJ1aWxkIGEgc3ludGhldGljIHJlc3VtZSBub2RlOiBjYWxscyByZXN1bWVGbiB3aXRoIHJlc3VtZUlucHV0LCB0aGVuIGNvbnRpbnVlcy5cbiAgICAvLyByZXN1bWVGbiBzaWduYXR1cmUgaXMgKHNjb3BlLCBpbnB1dCkgcGVyIFBhdXNhYmxlSGFuZGxlciDigJQgd3JhcCB0byBtYXRjaCBTdGFnZUZ1bmN0aW9uKHNjb3BlLCBicmVha0ZuKS5cbiAgICBjb25zdCByZXN1bWVGbiA9IHBhdXNlZE5vZGUucmVzdW1lRm47XG4gICAgY29uc3QgcmVzdW1lU3RhZ2VGbiA9IChzY29wZTogVFNjb3BlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzdW1lRm4oc2NvcGUsIHJlc3VtZUlucHV0KTtcbiAgICB9O1xuXG4gICAgLy8gRGV0ZXJtaW5lIGNvbnRpbnVhdGlvbjogZm9yIGJyYW5jaCBjaGlsZHJlbiAoZGVjaWRlci9zZWxlY3RvciksXG4gICAgLy8gcGF1c2VkTm9kZS5uZXh0IGlzIHVuZGVmaW5lZC4gVGhlIGNoZWNrcG9pbnQnc1xuICAgIC8vIGNvbnRpbnVhdGlvblN0YWdlSWQgKGNvbGxlY3RlZCBkdXJpbmcgdHJhdmVyc2FsIGJ1YmJsZS11cClcbiAgICAvLyBwb2ludHMgdG8gdGhlIGludm9rZXIncyBuZXh0IG5vZGUuXG4gICAgLy9cbiAgICAvLyBGb3IgcGF1c2VzIGluc2lkZSBhIHN1YmZsb3csIHRoZSBjb250aW51YXRpb24gbGl2ZXMgSU5TSURFIHRoZVxuICAgIC8vIGxlYWYgc3ViZmxvdyAoZS5nLiwgdGhlIGxvb3AgdGFyZ2V0IGJhY2sgdG8gYG1lc3NhZ2VzYCkuIFNlYXJjaFxuICAgIC8vIHRoZSBsZWFmIHN1YmZsb3cgZmlyc3Q7IGZhbGwgYmFjayB0byB0b3AtbGV2ZWwgZm9yIHJvb3QtbGV2ZWxcbiAgICAvLyBwYXVzZXMuXG4gICAgLy8gQ2xvbmUtaW46IGBzdWJmbG93U3RhdGVzYCBzZWVkcyBuZXN0ZWQgcnVudGltZXMgaW4gU3ViZmxvd0V4ZWN1dG9yXG4gICAgLy8gKHNoYWxsb3ctbWVyZ2VkIGludG8gZWFjaCBuZXN0ZWQgU2hhcmVkTWVtb3J5KSwgc28gd2l0aG91dCBhIGNvcHkgdGhlXG4gICAgLy8gZW5naW5lIHdvdWxkIGhvbGQgbGl2ZSByZWZlcmVuY2VzIGludG8gdGhlIGNhbGxlcidzIGNoZWNrcG9pbnQgb2JqZWN0IOKAlFxuICAgIC8vIGNhbGxlciBtdXRhdGlvbnMgd291bGQgYmxlZWQgaW50byB0aGUgcmVzdW1lZCBydW4gYW5kIGVuZ2luZSB3cml0ZXNcbiAgICAvLyB3b3VsZCByZWFjaCBhIGNoZWNrcG9pbnQgdGhlIGNhbGxlciBtYXkgaGF2ZSBhbHJlYWR5IHBlcnNpc3RlZC5cbiAgICBjb25zdCBzZlN0YXRlcyA9IHN0cnVjdHVyZWRDbG9uZShjaGVja3BvaW50LnN1YmZsb3dTdGF0ZXMpO1xuICAgIGNvbnN0IGxlYWZTdWJmbG93SWQgPVxuICAgICAgY2hlY2twb2ludC5zdWJmbG93UGF0aC5sZW5ndGggPiAwID8gY2hlY2twb2ludC5zdWJmbG93UGF0aFtjaGVja3BvaW50LnN1YmZsb3dQYXRoLmxlbmd0aCAtIDFdIDogdW5kZWZpbmVkO1xuICAgIGxldCBjb250aW51YXRpb25OZXh0ID0gcGF1c2VkTm9kZS5uZXh0O1xuICAgIC8vIEEgYnJhbmNoLXNvdXJjZWQgbG9vcCAoYHsgbG9vcFRvIH1gIC8gYERlY2lkZXJMaXN0Lmxvb3BUb2ApIHNldHMgdGhlXG4gICAgLy8gbG9vcGluZyBicmFuY2gncyBgbmV4dGAgdG8gYSBsb29wLXJlZiBTVFVCIOKAlCBgeyBpZCwgaXNMb29wUmVmOnRydWUgfWBcbiAgICAvLyB3aXRoIG5vIGZuL2NoaWxkcmVuL3N1YmZsb3dJZC4gT24gYSBOT1JNQUwgcnVuIHRoYXQgc3R1YiByZXNvbHZlcyBmaW5lOlxuICAgIC8vIHRoZSByZWFsIHRhcmdldCBub2RlIGlzIHJlYWNoYWJsZSBmcm9tIHRoZSBjaGFydCByb290LCBzbyB0aGUgdHJhdmVyc2VyJ3NcbiAgICAvLyBub2RlIG1hcCBhbHJlYWR5IGhvbGRzIGl0ICh0aGUgc3R1YiBpcyBza2lwcGVkIOKAlCBmaXJzdC13cml0ZS13aW5zKS4gT25cbiAgICAvLyBSRVNVTUUgdGhlIG5vZGUgbWFwIGlzIGJ1aWx0IGZyb20gdGhlIHRydW5jYXRlZCByZXN1bWUgcm9vdCwgd2hlcmUgdGhlXG4gICAgLy8gcmVhbCB0YXJnZXQgaXMgdW5yZWFjaGFibGUsIHNvIHRoZSBzdHViIHdvdWxkIHdpbiB0aGUgaWQgc2xvdCBhbmRcbiAgICAvLyBgZXhlY3V0ZU5vZGVgIHRocm93cyBcIk5vZGUgJzx0YXJnZXQ+JyBtdXN0IGRlZmluZSAuLi5cIi4gUmVzb2x2ZSB0aGUgc3R1YlxuICAgIC8vIHRvIHRoZSBSRUFMIHRhcmdldCBub2RlIGhlcmUgKGRmc0ZpbmQgc2tpcHMgbG9vcC1yZWZzIGFuZCByZXR1cm5zIHRoZVxuICAgIC8vIHJlYWwgbm9kZSBXSVRIIGl0cyBmdWxsIGRvd25zdHJlYW0gY2hhaW4g4oCUIGUuZy4gYSBzdWJmbG93IE1PVU5UIG5vZGUsXG4gICAgLy8gd2hvc2UgYC5uZXh0YCBjYXJyaWVzIHRoZSBkZWNpZGVyL3Rlcm1pbmFsIGNvbnRpbnVhdGlvbiB0aGUgbG9vcCBtdXN0XG4gICAgLy8gcmUtZW50ZXIpLiBTZWUgdGVzdC9saWIvcGF1c2UvcmVzdW1lLWJyYW5jaC1sb29wLXN1YmZsb3cudGVzdC50cy5cbiAgICBpZiAoY29udGludWF0aW9uTmV4dD8uaXNMb29wUmVmKSB7XG4gICAgICBjb25zdCBsb29wVGFyZ2V0SWQgPSBjb250aW51YXRpb25OZXh0LmlkO1xuICAgICAgY29uc3QgcmVhbFRhcmdldCA9XG4gICAgICAgIChsZWFmU3ViZmxvd0lkICE9PSB1bmRlZmluZWQgPyB0aGlzLmZpbmROb2RlSW5HcmFwaChsb29wVGFyZ2V0SWQsIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpIDogdW5kZWZpbmVkKSA/P1xuICAgICAgICB0aGlzLmZpbmROb2RlSW5HcmFwaChsb29wVGFyZ2V0SWQsIFtdKTtcbiAgICAgIGlmIChyZWFsVGFyZ2V0KSBjb250aW51YXRpb25OZXh0ID0gcmVhbFRhcmdldDtcbiAgICB9XG4gICAgaWYgKCFjb250aW51YXRpb25OZXh0ICYmIGNoZWNrcG9pbnQuY29udGludWF0aW9uU3RhZ2VJZCkge1xuICAgICAgLy8gU2VhcmNoIGxlYWYgc3ViZmxvdyBmaXJzdCAobG9vcCB0YXJnZXRzIC8gYnJhbmNoIGpvaW5zIGxpdmUgdGhlcmUpLFxuICAgICAgLy8gdGhlbiBmYWxsIGJhY2sgdG8gdG9wIGxldmVsLlxuICAgICAgY29udGludWF0aW9uTmV4dCA9IGxlYWZTdWJmbG93SWRcbiAgICAgICAgPyB0aGlzLmZpbmROb2RlSW5HcmFwaChjaGVja3BvaW50LmNvbnRpbnVhdGlvblN0YWdlSWQsIGNoZWNrcG9pbnQuc3ViZmxvd1BhdGgpXG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgaWYgKCFjb250aW51YXRpb25OZXh0KSB7XG4gICAgICAgIGNvbnRpbnVhdGlvbk5leHQgPSB0aGlzLmZpbmROb2RlSW5HcmFwaChjaGVja3BvaW50LmNvbnRpbnVhdGlvblN0YWdlSWQsIFtdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGUgXCJpbm5lclwiIHJlc3VtZSBjaGFpbjogcmVzdW1lRm4g4oaSIGNvbnRpbnVhdGlvbi4gVGhpcyBpcyB3aGF0XG4gICAgLy8gcnVucyBJTlNJREUgdGhlIGxlYWYgc3ViZmxvdydzIGJvZHkuIEZvciBhIHJvb3QtbGV2ZWwgcGF1c2VcbiAgICAvLyAoc3ViZmxvd1BhdGggZW1wdHkpLCB0aGlzIGlzIGFsc28gdGhlIHRvcC1sZXZlbCByZXN1bWUgcm9vdC5cbiAgICBjb25zdCBpbm5lclJlc3VtZUNoYWluOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiA9IHtcbiAgICAgIG5hbWU6IHBhdXNlZE5vZGUubmFtZSxcbiAgICAgIGlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgZGVzY3JpcHRpb246IHBhdXNlZE5vZGUuZGVzY3JpcHRpb24sXG4gICAgICBmbjogcmVzdW1lU3RhZ2VGbixcbiAgICAgIG5leHQ6IGNvbnRpbnVhdGlvbk5leHQsXG4gICAgfTtcblxuICAgIC8vIERvbid0IGNsZWFyIHJlY29yZGVycyDigJQgcmVzdW1lIGNvbnRpbnVlcyBmcm9tIHByZXZpb3VzIHN0YXRlLlxuICAgIC8vIE5hcnJhdGl2ZSwgbWV0cmljcywgZGVidWcgZW50cmllcyBhY2N1bXVsYXRlIGFjcm9zcyBwYXVzZS9yZXN1bWUuXG4gICAgLy9cbiAgICAvLyBUd28tbW9kZSByZXN1bWU6XG4gICAgLy8gICDigKIgU2FtZS1leGVjdXRvciAocnVuKCkgcHJldmlvdXNseSBjYWxsZWQgb24gVEhJUyBpbnN0YW5jZSk6XG4gICAgLy8gICAgIHJldXNlIHRoZSBleGlzdGluZyBydW50aW1lIHNvIHRoZSBleGVjdXRpb24gdHJlZSBjb250aW51ZXNcbiAgICAvLyAgICAgZnJvbSB0aGUgcGF1c2UgcG9pbnQgYW5kIHJlY29yZGVycy9uYXJyYXRpdmUgYWNjdW11bGF0ZS5cbiAgICAvLyAgIOKAoiBDcm9zcy1leGVjdXRvciAoZnJlc2ggZXhlY3V0b3IgcmVjb25zdHJ1Y3RlZCBmcm9tIGEgc3RvcmVkXG4gICAgLy8gICAgIGNoZWNrcG9pbnQpOiBzZWVkIGEgTkVXIHJ1bnRpbWUgZnJvbSBgY2hlY2twb2ludC5zaGFyZWRTdGF0ZWBcbiAgICAvLyAgICAgc28gcmVzdW1lIGhhbmRsZXJzIGNhbiByZWFkIHByZS1wYXVzZSBzY29wZS4gVGhlIGV4ZWN1dGlvblxuICAgIC8vICAgICB0cmVlIHN0YXJ0cyBhdCB0aGUgcmVzdW1lIG5vZGUg4oCUIHdlIGRvbid0IGhhdmUgdGhlIHByZXZpb3VzXG4gICAgLy8gICAgIHRyYXZlcnNhbCdzIHRyZWUgb24gYSBmcmVzaCBwcm9jZXNzIGFueXdheS5cbiAgICBjb25zdCBzYW1lRXhlY3V0b3IgPSB0aGlzLl9oYXNSdW5CZWZvcmU7XG4gICAgY29uc3QgZXhpc3RpbmdSdW50aW1lID0gc2FtZUV4ZWN1dG9yXG4gICAgICA/ICh0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lKCkgYXMgSW5zdGFuY2VUeXBlPHR5cGVvZiBFeGVjdXRpb25SdW50aW1lPilcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIHRoaXMuX2hhc1J1bkJlZm9yZSA9IHRydWU7IC8vIGFueSBwYXRoIHRoYXQgcmVzdW1lcyBjb3VudHMgYXMgYSBydW5cbiAgICAvLyBSZXN1bWUgZ2V0cyBhIE5FVyBydW5JZCDigJQgcmVzdW1lIGlzIGxvZ2ljYWxseSBhIGRpc3RpbmN0IHJ1bi5cbiAgICAvLyBPcmlnaW5hbCBydW5JZCBpcyByZWNvdmVyYWJsZSBmcm9tIGNoZWNrcG9pbnQgbWV0YWRhdGEgaWYgYSBjb25zdW1lclxuICAgIC8vIG5lZWRzIGNyb3NzLXJ1biBhdWRpdCAod2UgZG9uJ3Qgc3RvcmUgaXQgb24gdGhlIGNoZWNrcG9pbnQgdG9kYXk7XG4gICAgLy8gZnV0dXJlIGVuaGFuY2VtZW50KS4gU2VlIGBydW5JZC50c2AuXG4gICAgdGhpcy5fY3VycmVudFJ1bklkID0gZ2VuZXJhdGVSdW5JZCgpO1xuXG4gICAgLy8gUGljayB0aGUgcmVzdW1lIHJvb3QgKyBpbml0aWFsIGNvbnRleHQuXG4gICAgLy9cbiAgICAvLyAgIFJPT1QtTEVWRUwgUEFVU0UgKHN1YmZsb3dQYXRoIGVtcHR5KTpcbiAgICAvLyAgICAgcmVzdW1lIHJvb3QgPSBpbm5lclJlc3VtZUNoYWluIChydW4gcmVzdW1lRm4gYXQgdG9wIGxldmVsKS5cbiAgICAvLyAgICAgaW5pdGlhbENvbnRleHQgPSBjaGVja3BvaW50LnNoYXJlZFN0YXRlLlxuICAgIC8vXG4gICAgLy8gICBTVUJGTE9XLU5FU1RFRCBQQVVTRSAoc3ViZmxvd1BhdGggbm9uLWVtcHR5KTpcbiAgICAvLyAgICAgVGhlIHBhdXNlIHdhcyBJTlNJREUgYSBzdWJmbG93J3MgYm9keS4gVG8gcnVuIHRoZSBzdWJmbG93J3NcbiAgICAvLyAgICAgb3V0cHV0TWFwcGVyIGFuZCB0aGUgcGFyZW50J3MgY29udGludWF0aW9uLCB3ZSBoYXZlIHRvIGVudGVyXG4gICAgLy8gICAgIHRocm91Z2ggdGhlIE9VVEVSIE1PVU5UICh0aGUgcGFyZW50J3Mgbm9kZSB0aGF0IG1vdW50cyB0aGVcbiAgICAvLyAgICAgbGVhZiBzdWJmbG93KS4gV2Ugc3dhcCB0aGUgbGVhZiBzdWJmbG93J3Mgcm9vdCB3aXRoXG4gICAgLy8gICAgIGlubmVyUmVzdW1lQ2hhaW4gc28gU3ViZmxvd0V4ZWN1dG9yOlxuICAgIC8vICAgICAgIDEuIGVudGVycyB0aGUgc3ViZmxvdyBib3VuZGFyeSxcbiAgICAvLyAgICAgICAyLiBzZWVkcyB0aGUgbmVzdGVkIHJ1bnRpbWUgZnJvbSBzdWJmbG93U3RhdGVzW2xlYWZdXG4gICAgLy8gICAgICAgICAgKHNraXBwaW5nIHRoZSBpbnB1dE1hcHBlciDigJQgc2VlIFN1YmZsb3dFeGVjdXRvci50cyksXG4gICAgLy8gICAgICAgMy4gcnVucyB0aGUgcmVzdW1lRm4g4oaSIGNvbnRpbnVhdGlvbiBjaGFpbixcbiAgICAvLyAgICAgICA0LiBydW5zIHRoZSBvdXRwdXRNYXBwZXIgYXQgZXhpdCxcbiAgICAvLyAgICAgICA1LiBwYXJlbnQgdHJhdmVyc2FsIGNvbnRpbnVlcyBub3JtYWxseS5cbiAgICAvL1xuICAgIC8vICAgICBDcm9zcy1leGVjdXRvcjogaW5pdGlhbENvbnRleHQgPSBjaGVja3BvaW50LnNoYXJlZFN0YXRlICh0aGVcbiAgICAvLyAgICAgICBwYXJlbnQncyB2aWV3IGF0IHBhdXNlIHRpbWUg4oCUIG91dHB1dE1hcHBlciB3cml0ZXMgYmFjayBpbnRvIGl0KS5cbiAgICAvLyAgICAgU2FtZS1leGVjdXRvcjogZXhpc3RpbmdSdW50aW1lIGlzIHJldXNlZDsgaW5pdGlhbENvbnRleHQgaXMgbW9vdFxuICAgIC8vICAgICAgIGZvciB0aGUgc3ViZmxvdyBmcmFtZSAoYWxyZWFkeSBpbiB0aGUgcnVudGltZSBzdGFjayksIGJ1dCB3ZVxuICAgIC8vICAgICAgIHN0aWxsIHBhc3Mgc2hhcmVkU3RhdGUgZm9yIGNvbnNpc3RlbmN5LlxuICAgIGNvbnN0IGZjID0gdGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydDtcbiAgICBsZXQgcmVzdW1lUm9vdDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gPSBpbm5lclJlc3VtZUNoYWluO1xuICAgIGxldCBzdWJmbG93c092ZXJyaWRlOiBSZWNvcmQ8c3RyaW5nLCB7IHJvb3Q6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IH0+IHwgdW5kZWZpbmVkO1xuICAgIGlmIChsZWFmU3ViZmxvd0lkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIC8vIEZpbmQgdGhlIE9VVEVSIG1vdW50IG5vZGUgZm9yIHRoZSBGSVJTVCBlbnRyeSBvbiB0aGUgcGF0aC5cbiAgICAgIC8vIEZvciBzaW5nbGUtbGV2ZWwgcGF1c2VzLCB0aGlzIGlzIHRoZSBvbmx5IG1vdW50IHdlIG5lZWQgdG9cbiAgICAgIC8vIGVudGVyIHRocm91Z2guIEZvciBuZXN0ZWQgbW91bnRzIHRoZSBwYXR0ZXJuIHdvdWxkIGV4dGVuZCwgYnV0XG4gICAgICAvLyBzaW5nbGUtbGV2ZWwgY292ZXJzIGFsbCBjdXJyZW50IHVzZSBjYXNlcyAoU2VxdWVuY2UoQWdlbnQpLFxuICAgICAgLy8gQ29uZGl0aW9uYWwoQWdlbnQpLCBQYXJhbGxlbCBicmFuY2hlcyB3aXRoIHBhdXNlZCBhZ2VudHMpLlxuICAgICAgY29uc3Qgb3V0ZXJTdWJmbG93SWQgPSBjaGVja3BvaW50LnN1YmZsb3dQYXRoWzBdO1xuICAgICAgY29uc3Qgb3V0ZXJNb3VudCA9IHRoaXMuZmluZE1vdW50SW5HcmFwaChmYy5yb290LCBvdXRlclN1YmZsb3dJZCk7XG4gICAgICBpZiAob3V0ZXJNb3VudCkge1xuICAgICAgICByZXN1bWVSb290ID0gb3V0ZXJNb3VudDtcbiAgICAgIH1cbiAgICAgIC8vIFJlcGxhY2UgdGhlIGxlYWYgc3ViZmxvdydzIHJvb3Qgd2l0aCB0aGUgcmVzdW1lIGNoYWluIHNvIHRoZVxuICAgICAgLy8gYm9keSBydW5zIGZyb20gdGhlIHBhdXNlIHBvaW50IGZvcndhcmQuXG4gICAgICBzdWJmbG93c092ZXJyaWRlID0geyAuLi4oZmMuc3ViZmxvd3MgPz8ge30pIH07XG4gICAgICBzdWJmbG93c092ZXJyaWRlW2xlYWZTdWJmbG93SWRdID0geyByb290OiBpbm5lclJlc3VtZUNoYWluIH07XG4gICAgfVxuICAgIC8vIENsb25lLWluIGZvciB0aGUgc2FtZSByZWFzb24gYXMgYHNmU3RhdGVzYCBhYm92ZTogYGluaXRpYWxDb250ZXh0YFxuICAgIC8vIHNlZWRzIHRoZSBmcmVzaCBTaGFyZWRNZW1vcnkgdmlhIGBtZXJnZUNvbnRleHRXaW5zYCwgd2hpY2ggY29waWVzIG9ubHlcbiAgICAvLyB0aGUgVE9QIGxldmVsIOKAlCBuZXN0ZWQgb2JqZWN0cyB3b3VsZCBhbGlhcyB0aGUgY2FsbGVyJ3MgY2hlY2twb2ludC5cbiAgICBjb25zdCByZXN1bWVJbml0aWFsQ29udGV4dCA9IHN0cnVjdHVyZWRDbG9uZShjaGVja3BvaW50LnNoYXJlZFN0YXRlKTtcblxuICAgIHRoaXMudHJhdmVyc2VyID0gdGhpcy5jcmVhdGVUcmF2ZXJzZXIoXG4gICAgICBvcHRpb25zPy5zaWduYWwsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBvcHRpb25zPy5lbnYsXG4gICAgICBvcHRpb25zPy5tYXhEZXB0aCxcbiAgICAgIG9wdGlvbnM/Lm1heEl0ZXJhdGlvbnMsXG4gICAgICB7XG4gICAgICAgIHJvb3Q6IHJlc3VtZVJvb3QsXG4gICAgICAgIGluaXRpYWxDb250ZXh0OiByZXN1bWVJbml0aWFsQ29udGV4dCxcbiAgICAgICAgcHJlc2VydmVSZWNvcmRlcnM6IHRydWUsXG4gICAgICAgIC4uLihleGlzdGluZ1J1bnRpbWUgPyB7IGV4aXN0aW5nUnVudGltZSB9IDoge30pLFxuICAgICAgICAvLyBIYW5kIHRoZSBwZXItc3ViZmxvdyBzY29wZSBjYXB0dXJlcyBkb3duIHRvIFN1YmZsb3dFeGVjdXRvci5cbiAgICAgICAgLy8gQWx3YXlzIHByZXNlbnQgb24gYSBjaGVja3BvaW50IOKAlCBlbXB0eSBge31gIGZvciByb290IHBhdXNlcy5cbiAgICAgICAgc3ViZmxvd1N0YXRlc0ZvclJlc3VtZTogc2ZTdGF0ZXMsXG4gICAgICAgIC4uLihzdWJmbG93c092ZXJyaWRlICYmIHsgc3ViZmxvd3NPdmVycmlkZSB9KSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIC8vIEZpcmUgb25SZXN1bWUgZXZlbnQgb24gYWxsIHJlY29yZGVycyAoZmxvdyArIHNjb3BlKS4gU3RhbXAgdGhlXG4gICAgLy8gc3ludGhldGljIFRyYXZlcnNhbENvbnRleHQgZm9yIHRoZSByZXN1bWVkIHN0YWdlIHdpdGggdGhlIE5FV1xuICAgIC8vIHJ1bklkIHNvIGNvbnN1bWVycyBkZXRlY3QgXCJ0aGlzIGlzIGEgZnJlc2ggbG9naWNhbCBydW5cIiB2aWFcbiAgICAvLyB0aGUgc2FtZSBydW5JZC1jaGFuZ2UgcGF0dGVybiB0aGV5IHVzZSBmb3IgYG9uUnVuU3RhcnRgLlxuICAgIGNvbnN0IGhhc0lucHV0ID0gcmVzdW1lSW5wdXQgIT09IHVuZGVmaW5lZDtcbiAgICBjb25zdCByZXN1bWVSdW50aW1lU3RhZ2VJZCA9IGJ1aWxkUnVudGltZVN0YWdlSWQocGF1c2VkTm9kZS5pZCwgdGhpcy5fZXhlY3V0aW9uQ291bnRlci52YWx1ZSk7XG4gICAgY29uc3QgZmxvd1Jlc3VtZUV2ZW50ID0ge1xuICAgICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICBzdGFnZUlkOiBwYXVzZWROb2RlLmlkLFxuICAgICAgaGFzSW5wdXQsXG4gICAgICB0cmF2ZXJzYWxDb250ZXh0OiB7XG4gICAgICAgIHJ1bklkOiB0aGlzLl9jdXJyZW50UnVuSWQsXG4gICAgICAgIHN0YWdlSWQ6IHBhdXNlZE5vZGUuaWQsXG4gICAgICAgIHJ1bnRpbWVTdGFnZUlkOiByZXN1bWVSdW50aW1lU3RhZ2VJZCxcbiAgICAgICAgc3RhZ2VOYW1lOiBwYXVzZWROb2RlLm5hbWUsXG4gICAgICAgIGRlcHRoOiAwLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHRoaXMuY29tYmluZWRSZWNvcmRlci5vblJlc3VtZShmbG93UmVzdW1lRXZlbnQpO1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmZsb3dSZWNvcmRlcnMpIHIub25SZXN1bWU/LihmbG93UmVzdW1lRXZlbnQpO1xuXG4gICAgY29uc3Qgc2NvcGVSZXN1bWVFdmVudCA9IHtcbiAgICAgIHN0YWdlTmFtZTogcGF1c2VkTm9kZS5uYW1lLFxuICAgICAgc3RhZ2VJZDogcGF1c2VkTm9kZS5pZCxcbiAgICAgIHJ1bnRpbWVTdGFnZUlkOiBidWlsZFJ1bnRpbWVTdGFnZUlkKHBhdXNlZE5vZGUuaWQsIHRoaXMuX2V4ZWN1dGlvbkNvdW50ZXIudmFsdWUpLFxuICAgICAgaGFzSW5wdXQsXG4gICAgICBwaXBlbGluZUlkOiAnJyxcbiAgICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKSxcbiAgICB9O1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnNjb3BlUmVjb3JkZXJzKSByLm9uUmVzdW1lPy4oc2NvcGVSZXN1bWVFdmVudCk7XG5cbiAgICAvLyBTZXQgQUZURVIgYWxsIHN5bmMgdmFsaWRhdGlvbi9sb29rdXAgdGhyb3dzIGFib3ZlIChub3RoaW5nIGNhbiBsZWFrIHRoZVxuICAgIC8vIGZsYWcpOyBubyBhd2FpdCBiZXR3ZWVuIHRoZSB0b3Atb2YtbWV0aG9kIGNoZWNrIGFuZCBoZXJlLCBzbyByYWNlLWZyZWUuXG4gICAgdGhpcy5faXNFeGVjdXRpbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50cmF2ZXJzZXIuZXhlY3V0ZSgpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHRoaXMuYnVpbGRQYXVzZUNoZWNrcG9pbnQoZXJyb3IpO1xuICAgICAgICByZXR1cm4geyBwYXVzZWQ6IHRydWUsIGNoZWNrcG9pbnQ6IHRoaXMubGFzdENoZWNrcG9pbnQgfSBzYXRpc2ZpZXMgUGF1c2VkUmVzdWx0O1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuX2lzRXhlY3V0aW5nID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkIGEgZnVsbHkgREVUQUNIRUQgY2hlY2twb2ludCBmcm9tIGEgY2F1Z2h0IFBhdXNlU2lnbmFsLlxuICAgKlxuICAgKiBFdmVyeSBmaWVsZCBpcyBkZWVwLWNvcGllZCB2aWEgb25lIGBzdHJ1Y3R1cmVkQ2xvbmVgIG9mIHRoZSBhc3NlbWJsZWRcbiAgICogY2hlY2twb2ludCwgYmVjYXVzZSB0aGUgcmF3IHBpZWNlcyBhbGlhcyBsaXZlIGVuZ2luZSBzdGF0ZTpcbiAgICpcbiAgICogICAtIGBzaGFyZWRTdGF0ZWAgSVMgYFNoYXJlZE1lbW9yeWAncyBpbnRlcm5hbCBjb250ZXh0IG9iamVjdCDigJQgdGhlIGFsaWFzXG4gICAqICAgICBvbmx5IGRldGFjaGVzIGF0IHRoZSBuZXh0IGNvbW1pdCAoYGFwcGx5U21hcnRNZXJnZWAgcmVidWlsZHMgaXQpLCBhbmRcbiAgICogICAgIGFmdGVyIGEgcGF1c2UgdGhlcmUgaXMgbm8gbmV4dCBjb21taXQgdW50aWwgcmVzdW1lLlxuICAgKiAgIC0gYGV4ZWN1dGlvblRyZWVgIG5vZGVzIGFyZSBmcmVzaCwgYnV0IHRoZWlyIGBsb2dzYC9gZXJyb3JzYC9gbWV0cmljc2AvXG4gICAqICAgICBgZXZhbHNgL2BzdGFnZVJlYWRzYC9gZmxvd01lc3NhZ2VzYCBmaWVsZHMgcmVmZXJlbmNlIGxpdmVcbiAgICogICAgIGBEaWFnbm9zdGljQ29sbGVjdG9yYCBiYWdzIHRoYXQga2VlcCBhY2N1bXVsYXRpbmcgb24gc2FtZS1leGVjdXRvclxuICAgKiAgICAgcmVzdW1lLlxuICAgKiAgIC0gYHN1YmZsb3dTdGF0ZXNgIHZhbHVlcyBhcmUgc2hhbGxvdyBjb3BpZXMgd2hvc2UgTkVTVEVEIG9iamVjdHMgYWxpYXNcbiAgICogICAgIHN1YmZsb3cgbWVtb3J5LCBhbmQgdGhleSBnZXQgc2VlZGVkIGJhY2sgaW50byBsaXZlIHJ1bnRpbWVzIG9uIHJlc3VtZS5cbiAgICogICAtIGBzdWJmbG93UmVzdWx0c2AgdmFsdWVzIHN0YXkgcmVmZXJlbmNlZCBieSB0aGUgdHJhdmVyc2VyJ3MgcmVzdWx0cyBtYXAuXG4gICAqXG4gICAqIFRoZSBjaGVja3BvaW50IGlzIHBlcnNpc3RlZCBieSBjb250cmFjdCAoXCJzdG9yZSBpbiBSZWRpcy9Qb3N0Z3Jlc1wiKSDigJQgaXRcbiAgICogbXVzdCBuZXZlciBzaGFyZSBzdHJ1Y3R1cmUgd2l0aCB0aGUgZW5naW5lLiBQYXVzZSBpcyBub3QgYSBob3QgcGF0aDsgdGhlXG4gICAqIGNsb25lIGNvc3QgaXMgaXJyZWxldmFudC5cbiAgICpcbiAgICogVGhlIEpTT04tc2FmZSBjaGVja3BvaW50IGNvbnRyYWN0IChubyBmdW5jdGlvbnMsIG5vIGNsYXNzIGluc3RhbmNlcylcbiAgICogZ292ZXJucyBDT05TVU1FUi1vd25lZCBkYXRhIOKAlCBidXQgdGhlIGV4ZWN1dGlvblRyZWUncyBkaWFnbm9zdGljIGJhZ3NcbiAgICogYWNjZXB0IEFOWSB2YWx1ZSBhdCB3cml0ZSB0aW1lIHdpdGhvdXQgY2xvbmluZyAoJGRlYnVnLyRlcnJvci8kbWV0cmljL1xuICAgKiAkZXZhbCBzdG9yZSByYXcgcmVmZXJlbmNlcyksIHNvIGEgY29udHJhY3QtY29tcGxpYW50IHJ1biBjYW4gc3RpbGwgY2FycnlcbiAgICogYSBub24tY2xvbmVhYmxlIGRpYWdub3N0aWMuIE9ic2VydmFiaWxpdHkgc2lkZS1iYWdzIG5ldmVyIGFib3J0IHRyYXZlcnNhbFxuICAgKiBhbnl3aGVyZSBlbHNlIGluIHRoZSBsaWJyYXJ5LCBzbyB0aGV5IG11c3Qgbm90IGFib3J0IHRoZSBwYXVzZSBlaXRoZXI6XG4gICAqIG9uIGNsb25lIGZhaWx1cmUgd2Ugc2FuaXRpemUgdGhlIGRpYWdub3N0aWMgYmFncyAobm9uLWNsb25lYWJsZSB2YWx1ZXNcbiAgICogYmVjb21lICdbbm9uLXNlcmlhbGl6YWJsZTog4oCmXScgbWFya2VycyDigJQgdGhlIGxpdmUgZW5naW5lIGJhZ3MgYXJlIG5ldmVyXG4gICAqIHRvdWNoZWQpIGFuZCByZXRyeS4gSWYgdGhlIHJldHJ5IFNUSUxMIGZhaWxzLCB0aGUgdmlvbGF0aW9uIGlzIGluXG4gICAqIGNvbnN1bWVyLW93bmVkIGRhdGEgKHJlYWxpc3RpY2FsbHkgYHBhdXNlRGF0YWAg4oCUIGEgZnVuY3Rpb24gY2FuIG5ldmVyXG4gICAqIHJlYWNoIHNoYXJlZCBzdGF0ZSBpbiB0aGUgZmlyc3QgcGxhY2U6IFRyYW5zYWN0aW9uQnVmZmVyIGNsb25lcyBldmVyeVxuICAgKiB3cml0dGVuIHZhbHVlIGF0IHdyaXRlIHRpbWUsIHNvIHRoZSBvZmZlbmRpbmcgd3JpdGUgYWxyZWFkeSByZWplY3RlZClcbiAgICogYW5kIHdlIHRocm93IGEgREVTQ1JJUFRJVkUgY29udHJhY3QgZXJyb3IgbmFtaW5nIHRoZSBvZmZlbmRpbmdcbiAgICogY2hlY2twb2ludCBmaWVsZChzKS4gQSBuYWtlZCBEYXRhQ2xvbmVFcnJvciBuZXZlciBlc2NhcGVzLlxuICAgKlxuICAgKiBTdWJmbG93IHNjb3BlIGNhcHR1cmUgKGBzdWJmbG93U3RhdGVzYCkgc3Vydml2ZXMgT05MWSBvbiB0aGUgc2lnbmFsIOKAlCB0aGVcbiAgICogbmVzdGVkIHJ1bnRpbWVzIGFyZSBHQydkIGFzIHRoZSBzdGFjayB1bndpbmRzLiBQcm9tb3RpbmcgaXQgb250byB0aGVcbiAgICogY2hlY2twb2ludCBoZXJlIGxldHMgY3Jvc3MtZXhlY3V0b3IgcmVzdW1lIHJlc3RvcmUgcHJlLXBhdXNlIHN1YmZsb3dcbiAgICogc2NvcGUgKGUuZy4gYW4gQWdlbnQncyBgc2NvcGUuaGlzdG9yeWApLiBFbXB0eSBge31gIGZvciByb290LWxldmVsIHBhdXNlcy5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRQYXVzZUNoZWNrcG9pbnQoc2lnbmFsOiBQYXVzZVNpZ25hbCk6IEZsb3djaGFydENoZWNrcG9pbnQge1xuICAgIGNvbnN0IHNuYXBzaG90ID0gdGhpcy50cmF2ZXJzZXIuZ2V0U25hcHNob3QoKTtcbiAgICBjb25zdCBzZlJlc3VsdHMgPSB0aGlzLnRyYXZlcnNlci5nZXRTdWJmbG93UmVzdWx0cygpO1xuICAgIGNvbnN0IGNoZWNrcG9pbnQgPSB7XG4gICAgICBzaGFyZWRTdGF0ZTogc25hcHNob3Quc2hhcmVkU3RhdGUsXG4gICAgICBleGVjdXRpb25UcmVlOiBzbmFwc2hvdC5leGVjdXRpb25UcmVlLFxuICAgICAgcGF1c2VkU3RhZ2VJZDogc2lnbmFsLnN0YWdlSWQsXG4gICAgICBzdWJmbG93UGF0aDogc2lnbmFsLnN1YmZsb3dQYXRoLFxuICAgICAgcGF1c2VEYXRhOiBzaWduYWwucGF1c2VEYXRhLFxuICAgICAgc3ViZmxvd1N0YXRlczogc2lnbmFsLnN1YmZsb3dTdGF0ZXMsXG4gICAgICAuLi4oc2ZSZXN1bHRzLnNpemUgPiAwICYmIHsgc3ViZmxvd1Jlc3VsdHM6IE9iamVjdC5mcm9tRW50cmllcyhzZlJlc3VsdHMpIH0pLFxuICAgICAgLy8gSW52b2tlciBjb250ZXh0IOKAlCBjb2xsZWN0ZWQgZHVyaW5nIHRyYXZlcnNhbCBidWJibGUtdXAgKG5vdCB0cmVlLXdhbGtlZClcbiAgICAgIC4uLihzaWduYWwuaW52b2tlclN0YWdlSWQgJiYgeyBpbnZva2VyU3RhZ2VJZDogc2lnbmFsLmludm9rZXJTdGFnZUlkIH0pLFxuICAgICAgLi4uKHNpZ25hbC5jb250aW51YXRpb25TdGFnZUlkICYmIHsgY29udGludWF0aW9uU3RhZ2VJZDogc2lnbmFsLmNvbnRpbnVhdGlvblN0YWdlSWQgfSksXG4gICAgICBwYXVzZWRBdDogRGF0ZS5ub3coKSxcbiAgICB9O1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKGNoZWNrcG9pbnQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTm9uLWNsb25lYWJsZSBkaWFnbm9zdGljcyBtdXN0IG5vdCBzd2FsbG93IHRoZSBwYXVzZSDigJQgc2FuaXRpemUgdGhlXG4gICAgICAvLyBleGVjdXRpb25UcmVlJ3MgYmFncyAobWFya2VycyByZXBsYWNlIHRoZSBvZmZlbmRlcnMpIGFuZCByZXRyeS5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNoZWNrcG9pbnQuZXhlY3V0aW9uVHJlZSA9IHNhbml0aXplRGlhZ25vc3RpY0JhZ3MoY2hlY2twb2ludC5leGVjdXRpb25UcmVlIGFzIFN0YWdlU25hcHNob3QpO1xuICAgICAgICByZXR1cm4gc3RydWN0dXJlZENsb25lKGNoZWNrcG9pbnQpO1xuICAgICAgfSBjYXRjaCAocmV0cnlFcnJvcikge1xuICAgICAgICAvLyBHZW51aW5lIEpTT04tc2FmZSBjb250cmFjdCB2aW9sYXRpb24gaW4gY29uc3VtZXItb3duZWQgZGF0YS5cbiAgICAgICAgdGhyb3cgZGVzY3JpYmVDaGVja3BvaW50Q2xvbmVGYWlsdXJlKGNoZWNrcG9pbnQsIHJldHJ5RXJyb3IpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kIGEgU3RhZ2VOb2RlIGluIHRoZSBjb21waWxlZCBncmFwaCBieSBJRC5cbiAgICogSGFuZGxlcyBzdWJmbG93IHBhdGhzIGJ5IGRyaWxsaW5nIGludG8gcmVnaXN0ZXJlZCBzdWJmbG93cy5cbiAgICovXG4gIHByaXZhdGUgZmluZE5vZGVJbkdyYXBoKHN0YWdlSWQ6IHN0cmluZywgc3ViZmxvd1BhdGg6IHJlYWRvbmx5IHN0cmluZ1tdKTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGZjID0gdGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydDtcblxuICAgIGlmIChzdWJmbG93UGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFRvcC1sZXZlbDogREZTIGZyb20gcm9vdFxuICAgICAgcmV0dXJuIHRoaXMuZGZzRmluZChmYy5yb290LCBzdGFnZUlkKTtcbiAgICB9XG5cbiAgICAvLyBTdWJmbG93OiBkcmlsbCBpbnRvIHRoZSBzdWJmbG93IGNoYWluLCB0aGVuIHNlYXJjaCBmcm9tIHRoZSBsYXN0IHN1YmZsb3cncyByb290XG4gICAgbGV0IHN1YmZsb3dSb290OiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZDtcbiAgICBmb3IgKGNvbnN0IHNmSWQgb2Ygc3ViZmxvd1BhdGgpIHtcbiAgICAgIGNvbnN0IHN1YmZsb3cgPSBmYy5zdWJmbG93cz8uW3NmSWRdO1xuICAgICAgaWYgKCFzdWJmbG93KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgc3ViZmxvd1Jvb3QgPSBzdWJmbG93LnJvb3Q7XG4gICAgfVxuICAgIGlmICghc3ViZmxvd1Jvb3QpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHRoaXMuZGZzRmluZChzdWJmbG93Um9vdCwgc3RhZ2VJZCk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCB0aGUgbW91bnQgbm9kZSAodGhlIG5vZGUgdGhhdCBtb3VudHMgYSBzdWJmbG93IGJvdW5kYXJ5KVxuICAgKiBmb3IgYSBnaXZlbiBzdWJmbG93SWQsIGJ5IERGUyBmcm9tIGBzdGFydGAuIFVzZWQgYnkgYHJlc3VtZSgpYCB0b1xuICAgKiBsb2NhdGUgdGhlIE9VVEVSIG5vZGUgd2UgaGF2ZSB0byBlbnRlciB0aHJvdWdoIHNvIHRoZSBzdWJmbG93J3NcbiAgICogb3V0cHV0TWFwcGVyIGFuZCBwYXJlbnQgY29udGludWF0aW9uIGV4ZWN1dGUuXG4gICAqXG4gICAqIEN5Y2xlLXNhZmUgdmlhIHZpc2l0ZWQgc2V0LiBSZXR1cm5zIHRoZSBmaXJzdCBtYXRjaCAoREZTIG9yZGVyKS5cbiAgICovXG4gIHByaXZhdGUgZmluZE1vdW50SW5HcmFwaChcbiAgICBzdGFydDogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgc3ViZmxvd0lkOiBzdHJpbmcsXG4gICAgdmlzaXRlZCA9IG5ldyBTZXQ8c3RyaW5nPigpLFxuICApOiBTdGFnZU5vZGU8VE91dCwgVFNjb3BlPiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHN0YXJ0LmlzTG9vcFJlZikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodmlzaXRlZC5oYXMoc3RhcnQuaWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHZpc2l0ZWQuYWRkKHN0YXJ0LmlkKTtcbiAgICBpZiAoc3RhcnQuc3ViZmxvd0lkID09PSBzdWJmbG93SWQpIHJldHVybiBzdGFydDtcbiAgICBpZiAoc3RhcnQuY2hpbGRyZW4pIHtcbiAgICAgIGZvciAoY29uc3QgY2hpbGQgb2Ygc3RhcnQuY2hpbGRyZW4pIHtcbiAgICAgICAgY29uc3QgZm91bmQgPSB0aGlzLmZpbmRNb3VudEluR3JhcGgoY2hpbGQsIHN1YmZsb3dJZCwgdmlzaXRlZCk7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoc3RhcnQubmV4dCkgcmV0dXJuIHRoaXMuZmluZE1vdW50SW5HcmFwaChzdGFydC5uZXh0LCBzdWJmbG93SWQsIHZpc2l0ZWQpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiogREZTIHNlYXJjaCBmb3IgYSBub2RlIGJ5IElEIGluIHRoZSBTdGFnZU5vZGUgZ3JhcGguIEN5Y2xlLXNhZmUgdmlhIHZpc2l0ZWQgc2V0LiAqL1xuICBwcml2YXRlIGRmc0ZpbmQoXG4gICAgbm9kZTogU3RhZ2VOb2RlPFRPdXQsIFRTY29wZT4sXG4gICAgdGFyZ2V0SWQ6IHN0cmluZyxcbiAgICB2aXNpdGVkID0gbmV3IFNldDxzdHJpbmc+KCksXG4gICk6IFN0YWdlTm9kZTxUT3V0LCBUU2NvcGU+IHwgdW5kZWZpbmVkIHtcbiAgICAvLyBTa2lwIGxvb3AgYmFjay1lZGdlIHJlZmVyZW5jZXMgKHRoZXkgc2hhcmUgdGhlIHRhcmdldCdzIElEIGJ1dCBoYXZlIG5vIGZuL3Jlc3VtZUZuKVxuICAgIGlmIChub2RlLmlzTG9vcFJlZikgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICBpZiAodmlzaXRlZC5oYXMobm9kZS5pZCkpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgdmlzaXRlZC5hZGQobm9kZS5pZCk7XG4gICAgaWYgKG5vZGUuaWQgPT09IHRhcmdldElkKSByZXR1cm4gbm9kZTtcbiAgICBpZiAobm9kZS5jaGlsZHJlbikge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgIGNvbnN0IGZvdW5kID0gdGhpcy5kZnNGaW5kKGNoaWxkLCB0YXJnZXRJZCwgdmlzaXRlZCk7XG4gICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobm9kZS5uZXh0KSByZXR1cm4gdGhpcy5kZnNGaW5kKG5vZGUubmV4dCwgdGFyZ2V0SWQsIHZpc2l0ZWQpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvLyDilIDilIDilIAgU2NvcGVSZWNvcmRlciBNYW5hZ2VtZW50IOKUgOKUgOKUgFxuXG4gIC8qKlxuICAgKiBBdHRhY2ggYSBzY29wZSBTY29wZVJlY29yZGVyIHRvIG9ic2VydmUgZGF0YSBvcGVyYXRpb25zIChyZWFkcywgd3JpdGVzLCBjb21taXRzKS5cbiAgICogQXV0b21hdGljYWxseSBhdHRhY2hlZCB0byBldmVyeSBTY29wZUZhY2FkZSBjcmVhdGVkIGR1cmluZyB0cmF2ZXJzYWwuXG4gICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSBydW4oKS5cbiAgICpcbiAgICogKipJZGVtcG90ZW50IGJ5IElEOioqIElmIGEgcmVjb3JkZXIgd2l0aCB0aGUgc2FtZSBgaWRgIGlzIGFscmVhZHkgYXR0YWNoZWQsXG4gICAqIGl0IGlzIHJlcGxhY2VkIChub3QgZHVwbGljYXRlZCkuIFRoaXMgcHJldmVudHMgZG91YmxlLWNvdW50aW5nIHdoZW4gYm90aFxuICAgKiBhIGZyYW1ld29yayBhbmQgdGhlIHVzZXIgYXR0YWNoIHRoZSBzYW1lIHJlY29yZGVyIHR5cGUuXG4gICAqXG4gICAqIEJ1aWx0LWluIHJlY29yZGVycyB1c2UgYXV0by1pbmNyZW1lbnQgSURzIChgbWV0cmljcy0xYCwgYGRlYnVnLTFgLCAuLi4pIGJ5XG4gICAqIGRlZmF1bHQsIHNvIG11bHRpcGxlIGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25maWdzIGNvZXhpc3QuIFRvIG92ZXJyaWRlXG4gICAqIGEgZnJhbWV3b3JrLWF0dGFjaGVkIHJlY29yZGVyLCBwYXNzIHRoZSBzYW1lIHdlbGwta25vd24gSUQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gTXVsdGlwbGUgcmVjb3JkZXJzIHdpdGggZGlmZmVyZW50IGNvbmZpZ3Mg4oCUIGVhY2ggZ2V0cyBhIHVuaXF1ZSBJRFxuICAgKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcigpKTtcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgRGVidWdSZWNvcmRlcih7IHZlcmJvc2l0eTogJ21pbmltYWwnIH0pKTtcbiAgICpcbiAgICogLy8gT3ZlcnJpZGUgYSBmcmFtZXdvcmstYXR0YWNoZWQgcmVjb3JkZXIgYnkgcGFzc2luZyBpdHMgd2VsbC1rbm93biBJRFxuICAgKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcignbWV0cmljcycpKTtcbiAgICpcbiAgICogLy8gQXR0YWNoaW5nIHR3aWNlIHdpdGggc2FtZSBJRCByZXBsYWNlcyAobm8gZG91YmxlLWNvdW50aW5nKVxuICAgKiBleGVjdXRvci5hdHRhY2hTY29wZVJlY29yZGVyKG5ldyBNZXRyaWNSZWNvcmRlcignbXktbWV0cmljcycpKTtcbiAgICogZXhlY3V0b3IuYXR0YWNoU2NvcGVSZWNvcmRlcihuZXcgTWV0cmljUmVjb3JkZXIoJ215LW1ldHJpY3MnKSk7IC8vIHJlcGxhY2VzIHByZXZpb3VzXG4gICAqIGBgYFxuICAgKi9cbiAgYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlcjogU2NvcGVSZWNvcmRlcik6IHZvaWQge1xuICAgIC8vIFJlcGxhY2UgZXhpc3RpbmcgcmVjb3JkZXIgd2l0aCBzYW1lIElEIChpZGVtcG90ZW50IOKAlCBwcmV2ZW50cyBkb3VibGUtY291bnRpbmcpXG4gICAgdGhpcy5zY29wZVJlY29yZGVycyA9IHRoaXMuc2NvcGVSZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlci5pZCk7XG4gICAgdGhpcy5zY29wZVJlY29yZGVycy5wdXNoKHJlY29yZGVyKTtcbiAgfVxuXG4gIC8vIOKUgOKUgOKUgCBEZXRhY2ggKFQ0KSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcbiAgLy9cbiAgLy8gQmFyZS1leGVjdXRvciBlbnRyeSBwb2ludCBmb3IgZmlyZS1hbmQtZm9yZ2V0IGNoaWxkIGZsb3djaGFydCBleGVjdXRpb24uXG4gIC8vIFVzZSBmcm9tIG91dHNpZGUgYW55IGNoYXJ0IChjb25zdW1lciBjb2RlIHRoYXQgd2FudHMgdG8gZGV0YWNoIHdvcmtcbiAgLy8gd2l0aG91dCBmaXJzdCBydW5uaW5nIGEgcGFyZW50IGNoYXJ0KS4gRm9yIGRldGFjaCBGUk9NIElOU0lERSBhIHN0YWdlLFxuICAvLyB1c2UgYHNjb3BlLiRkZXRhY2hBbmRKb2luTGF0ZXIoLi4uKWAgLyBgc2NvcGUuJGRldGFjaEFuZEZvcmdldCguLi4pYCDigJRcbiAgLy8gdGhvc2UgbWludCByZWZJZHMgZnJvbSB0aGUgY2FsbGluZyBzdGFnZSdzIHJ1bnRpbWVTdGFnZUlkIGZvciB0cmFjZVxuICAvLyBjb3JyZWxhdGlvbjsgdGhlIGJhcmUtZXhlY3V0b3IgZW50cmllcyB1c2UgYSBzeW50aGV0aWMgcHJlZml4XG4gIC8vIChgX19leGVjdXRvcl9fYCkgaW5zdGVhZC5cblxuICAvKipcbiAgICogRGV0YWNoIGEgY2hpbGQgZmxvd2NoYXJ0IG9uIHRoZSBnaXZlbiBkcml2ZXIgYW5kIHJldHVybiBhIGBEZXRhY2hIYW5kbGVgXG4gICAqIHRoZSBjYWxsZXIgY2FuIGB3YWl0KClgIG9uIChQcm9taXNlKSBvciByZWFkIGAuc3RhdHVzYCBmcm9tIChzeW5jKS5cbiAgICpcbiAgICogVGhlIGRyaXZlciBpcyBhIFJFUVVJUkVEIGZpcnN0IGFyZ3VtZW50IOKAlCB0aGVyZSBpcyBubyBsaWJyYXJ5LWRlZmF1bHQsXG4gICAqIHRvIGtlZXAgdGhlIGVuZ2luZSBmcmVlIG9mIGRyaXZlciBpbXBvcnRzIGFuZCB0byBtYWtlIHRoZSBjaG9pY2Ugb2ZcbiAgICogc2NoZWR1bGluZyBhbGdvcml0aG0gZXhwbGljaXQgYXQgdGhlIGNhbGwgc2l0ZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQgeyBtaWNyb3Rhc2tCYXRjaERyaXZlciB9IGZyb20gJ2Zvb3RwcmludGpzL2RldGFjaCc7XG4gICAqXG4gICAqIGNvbnN0IGV4ZWMgPSBuZXcgRmxvd0NoYXJ0RXhlY3V0b3IocGFyZW50Q2hhcnQpO1xuICAgKiBjb25zdCBoYW5kbGUgPSBleGVjLmRldGFjaEFuZEpvaW5MYXRlcihtaWNyb3Rhc2tCYXRjaERyaXZlciwgdGVsZW1ldHJ5Q2hhcnQsIHsgZXZlbnQ6ICd4JyB9KTtcbiAgICogYXdhaXQgaGFuZGxlLndhaXQoKTsgLy8gb3B0aW9uYWxcbiAgICogYGBgXG4gICAqL1xuICBkZXRhY2hBbmRKb2luTGF0ZXIoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogaW1wb3J0KCcuLi9kZXRhY2gvdHlwZXMuanMnKS5EZXRhY2hIYW5kbGUge1xuICAgIHJldHVybiBfZGV0YWNoQW5kSm9pbkxhdGVyKGRyaXZlciwgY2hpbGQsIGlucHV0LCAnX19leGVjdXRvcl9fJyk7XG4gIH1cblxuICAvKipcbiAgICogRGV0YWNoIGEgY2hpbGQgZmxvd2NoYXJ0IG9uIHRoZSBnaXZlbiBkcml2ZXIgYW5kIERJU0NBUkQgdGhlIGhhbmRsZS5cbiAgICogVXNlIGZvciB0ZWxlbWV0cnkgZXhwb3J0cyAvIGZpcmUtYW5kLWZvcmdldCBzaWRlIGVmZmVjdHMgd2hlcmUgdGhlXG4gICAqIGNhbGxlciBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIHJlc3VsdC5cbiAgICpcbiAgICogRXJyb3JzIHJhaXNlZCBieSB0aGUgY2hpbGQgc3RpbGwgbGFuZCBvbiB0aGUgKGRpc2NhcmRlZCkgaGFuZGxlIOKAlCB0aGV5XG4gICAqIGdvIHNpbGVudCB1bmxlc3Mgc3VyZmFjZWQgdGhyb3VnaCBhIHJlY29yZGVyLiBGb3Igb2JzZXJ2YWJsZSBkZXRhY2gsXG4gICAqIHByZWZlciBgZGV0YWNoQW5kSm9pbkxhdGVyYCBhbmQgc3VyZmFjZSBmYWlsdXJlcyB2aWEgYC53YWl0KCkuY2F0Y2goKWAuXG4gICAqL1xuICBkZXRhY2hBbmRGb3JnZXQoXG4gICAgZHJpdmVyOiBpbXBvcnQoJy4uL2RldGFjaC90eXBlcy5qcycpLkRldGFjaERyaXZlcixcbiAgICBjaGlsZDogaW1wb3J0KCcuLi9idWlsZGVyL3R5cGVzLmpzJykuRmxvd0NoYXJ0LFxuICAgIGlucHV0PzogdW5rbm93bixcbiAgKTogdm9pZCB7XG4gICAgX2RldGFjaEFuZEZvcmdldChkcml2ZXIsIGNoaWxkLCBpbnB1dCwgJ19fZXhlY3V0b3JfXycpO1xuICB9XG5cbiAgLyoqIERldGFjaCBhbGwgc2NvcGUgUmVjb3JkZXJzIHdpdGggdGhlIGdpdmVuIElELiAqL1xuICBkZXRhY2hTY29wZVJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLnNjb3BlUmVjb3JkZXJzID0gdGhpcy5zY29wZVJlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IGlkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgc2NvcGUgUmVjb3JkZXJzLiAqL1xuICBnZXRTY29wZVJlY29yZGVycygpOiBTY29wZVJlY29yZGVyW10ge1xuICAgIHJldHVybiBbLi4udGhpcy5zY29wZVJlY29yZGVyc107XG4gIH1cblxuICAvLyDilIDilIDilIAgRmxvd1JlY29yZGVyIE1hbmFnZW1lbnQg4pSA4pSA4pSAXG5cbiAgLyoqXG4gICAqIEF0dGFjaCBhIEZsb3dSZWNvcmRlciB0byBvYnNlcnZlIGNvbnRyb2wgZmxvdyBldmVudHMuXG4gICAqIEF1dG9tYXRpY2FsbHkgZW5hYmxlcyBuYXJyYXRpdmUgaWYgbm90IGFscmVhZHkgZW5hYmxlZC5cbiAgICogTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHJ1bigpIOKAlCByZWNvcmRlcnMgYXJlIHBhc3NlZCB0byB0aGUgdHJhdmVyc2VyIGF0IGNyZWF0aW9uIHRpbWUuXG4gICAqXG4gICAqICoqSWRlbXBvdGVudCBieSBJRDoqKiByZXBsYWNlcyBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgYGlkYC5cbiAgICovXG4gIGF0dGFjaEZsb3dSZWNvcmRlcihyZWNvcmRlcjogRmxvd1JlY29yZGVyKTogdm9pZCB7XG4gICAgLy8gUmVwbGFjZSBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgSUQgKGlkZW1wb3RlbnQg4oCUIHByZXZlbnRzIGRvdWJsZS1jb3VudGluZylcbiAgICB0aGlzLmZsb3dSZWNvcmRlcnMgPSB0aGlzLmZsb3dSZWNvcmRlcnMuZmlsdGVyKChyKSA9PiByLmlkICE9PSByZWNvcmRlci5pZCk7XG4gICAgdGhpcy5mbG93UmVjb3JkZXJzLnB1c2gocmVjb3JkZXIpO1xuICAgIHRoaXMubmFycmF0aXZlRW5hYmxlZCA9IHRydWU7XG4gIH1cblxuICAvKiogRGV0YWNoIGFsbCBGbG93UmVjb3JkZXJzIHdpdGggdGhlIGdpdmVuIElELiAqL1xuICBkZXRhY2hGbG93UmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZmxvd1JlY29yZGVycyA9IHRoaXMuZmxvd1JlY29yZGVycy5maWx0ZXIoKHIpID0+IHIuaWQgIT09IGlkKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIGEgZGVmZW5zaXZlIGNvcHkgb2YgYXR0YWNoZWQgRmxvd1JlY29yZGVycy4gKi9cbiAgZ2V0Rmxvd1JlY29yZGVycygpOiBGbG93UmVjb3JkZXJbXSB7XG4gICAgcmV0dXJuIFsuLi50aGlzLmZsb3dSZWNvcmRlcnNdO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIENvbWJpbmVkIFNjb3BlUmVjb3JkZXIgTWFuYWdlbWVudCDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGEgcmVjb3JkZXIgdGhhdCBtYXkgb2JzZXJ2ZSBtdWx0aXBsZSBldmVudCBzdHJlYW1zIChzY29wZVxuICAgKiBkYXRhLWZsb3csIGNvbnRyb2wtZmxvdywgb3IgYm90aCkuIERldGVjdHMgYXQgcnVudGltZSB3aGljaCBzdHJlYW1zIHRoZVxuICAgKiByZWNvcmRlciBoYXMgbWV0aG9kcyBmb3IgYW5kIHJvdXRlcyBpdCB0byB0aGUgY29ycmVjdCBpbnRlcm5hbCBjaGFubmVscy5cbiAgICpcbiAgICogUHJlZmVycmVkIG92ZXIgY2FsbGluZyBgYXR0YWNoU2NvcGVSZWNvcmRlcmAgYW5kIGBhdHRhY2hGbG93UmVjb3JkZXJgXG4gICAqIHNlcGFyYXRlbHksIGJlY2F1c2UgZm9yZ2V0dGluZyBvbmUgb2YgdGhlIHR3byBpcyBhIHNpbGVudCBmb290LWd1biDigJRcbiAgICogaGFsZiB5b3VyIGV2ZW50cyBuZXZlciBmaXJlIGFuZCB0aGVyZSBpcyBubyBydW50aW1lIHdhcm5pbmcuIFdpdGhcbiAgICogYGF0dGFjaENvbWJpbmVkUmVjb3JkZXJgIHRoZSBsaWJyYXJ5IGd1YXJhbnRlZXMgdGhlIHJlY29yZGVyJ3MgZGVjbGFyZWRcbiAgICogbWV0aG9kcyBhbGwgZmlyZSwgYW5kIGFkZHMgbm8gb3ZlcmhlYWQgdmVyc3VzIHR3byBleHBsaWNpdCBjYWxscy5cbiAgICpcbiAgICogIyMgSWRlbXBvdGVuY3lcbiAgICpcbiAgICogSWRlbXBvdGVudCBieSBgaWRgIGFjcm9zcyBBTEwgY2hhbm5lbHMg4oCUIHJlLWF0dGFjaGluZyB3aXRoIHRoZSBzYW1lIGBpZGBcbiAgICogcmVwbGFjZXMgdGhlIHByZXZpb3VzIGluc3RhbmNlIGV2ZXJ5d2hlcmUgaXQgd2FzIHJlZ2lzdGVyZWQuIE1peGluZ1xuICAgKiBgYXR0YWNoQ29tYmluZWRSZWNvcmRlcih4KWAgd2l0aCBhIHByaW9yIGBhdHRhY2hTY29wZVJlY29yZGVyKHkpYCBvclxuICAgKiBgYXR0YWNoRmxvd1JlY29yZGVyKHkpYCB0aGF0IHNoYXJlIGB4LmlkID09PSB5LmlkYCBpcyBhbHNvIHNhZmU6IHRoZVxuICAgKiBjb21iaW5lZCBhdHRhY2ggcmVwbGFjZXMgdGhlIHNpbmdsZS1jaGFubmVsIHJlZ2lzdHJhdGlvbiBvbiB3aGljaGV2ZXJcbiAgICogY2hhbm5lbChzKSBgeGAgaGFzIG1ldGhvZHMgZm9yLiBObyBkdXBsaWNhdGUgZmlyaW5ncyBvY2N1ci5cbiAgICpcbiAgICogIyMgTmFycmF0aXZlIGFjdGl2YXRpb25cbiAgICpcbiAgICogSWYgdGhlIHJlY29yZGVyIGhhcyBhbnkgY29udHJvbC1mbG93IG1ldGhvZHMsIGBlbmFibGVOYXJyYXRpdmUoKWAgaXNcbiAgICogY2FsbGVkIGFzIGEgc2lkZSBlZmZlY3QgKHRoZSBuYXJyYXRpdmUgc3Vic3lzdGVtIGlzIHJlcXVpcmVkIHRvIGVtaXRcbiAgICogY29udHJvbC1mbG93IGV2ZW50cykuIERhdGEtZmxvdy1vbmx5IHJlY29yZGVycyBkbyBOT1QgYWN0aXZhdGUgdGhlXG4gICAqIG5hcnJhdGl2ZS5cbiAgICpcbiAgICogIyMgRGV0ZWN0aW9uIHJ1bGVcbiAgICpcbiAgICogT25seSAqKm93bioqIGV2ZW50IG1ldGhvZHMgY291bnQgKHNlZSBgaGFzUmVjb3JkZXJNZXRob2RzYCkuIE1ldGhvZHNcbiAgICogaW5oZXJpdGVkIHZpYSB0aGUgcHJvdG90eXBlIGNoYWluIGFyZSBpZ25vcmVkIOKAlCB0aGlzIHByb3RlY3RzIGFnYWluc3RcbiAgICogYWNjaWRlbnRhbCBgT2JqZWN0LnByb3RvdHlwZWAgcG9sbHV0aW9uIGF0dGFjaGluZyBoYW5kbGVycyB5b3UgbmV2ZXJcbiAgICogZGVjbGFyZWQuIEEgcmVjb3JkZXIgdGhhdCBwcm92aWRlcyBvbmx5IGBjbGVhcmAvYHRvU25hcHNob3RgIGlzIGFcbiAgICogbm8tb3AgYW5kIGVtaXRzIGEgZGV2LW1vZGUgd2FybmluZyB0byBzdXJmYWNlIHRoZSBsaWtlbHkgbWlzdGFrZS5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBhdWRpdDogQ29tYmluZWRSZWNvcmRlciA9IHtcbiAgICogICBpZDogJ2F1ZGl0JyxcbiAgICogICBvbldyaXRlOiAoZSkgPT4gbG9nKCdzY29wZSB3cml0ZScsIGUua2V5KSxcbiAgICogICBvbkRlY2lzaW9uOiAoZSkgPT4gbG9nKCdyb3V0ZWQgdG8nLCBlLmNob3NlbiksXG4gICAqIH07XG4gICAqIGV4ZWN1dG9yLmF0dGFjaENvbWJpbmVkUmVjb3JkZXIoYXVkaXQpO1xuICAgKiBgYGBcbiAgICovXG4gIGF0dGFjaENvbWJpbmVkUmVjb3JkZXIocmVjb3JkZXI6IENvbWJpbmVkUmVjb3JkZXIpOiB2b2lkIHtcbiAgICBjb25zdCBoYXNEYXRhID0gaGFzUmVjb3JkZXJNZXRob2RzKHJlY29yZGVyKTtcbiAgICBjb25zdCBoYXNGbG93ID0gaGFzRmxvd1JlY29yZGVyTWV0aG9kcyhyZWNvcmRlcik7XG4gICAgY29uc3QgaGFzRW1pdCA9IGhhc0VtaXRSZWNvcmRlck1ldGhvZHMocmVjb3JkZXIpO1xuXG4gICAgLy8gRW1pdCByZWNvcmRlcnMgbGl2ZSBvbiB0aGUgU0FNRSBjaGFubmVsIGFzIGRhdGEtZmxvdyByZWNvcmRlcnNcbiAgICAvLyAoU2NvcGVGYWNhZGUgaXRlcmF0ZXMgYF9yZWNvcmRlcnNgIGZvciBvbkVtaXQgZGlzcGF0Y2gpLiBTb1xuICAgIC8vIGF0dGFjaEVtaXRSZWNvcmRlciBpbnRlcm5hbGx5IGNhbGxzIGF0dGFjaFNjb3BlUmVjb3JkZXIg4oCUIGJ1dCB3ZSB3YW50IHRvXG4gICAgLy8gYXZvaWQgZG91YmxlLWF0dGFjaCB3aGVuIHRoZSByZWNvcmRlciBpbXBsZW1lbnRzIEJPVEggb25FbWl0IEFORFxuICAgIC8vIG90aGVyIFNjb3BlUmVjb3JkZXIgbWV0aG9kcy4gU2hvcnQtY2lyY3VpdDogaWYgaGFzRGF0YSBPUiBoYXNFbWl0LCB0aGVcbiAgICAvLyByZWNvcmRlciBsYW5kcyBvbiB0aGUgc2NvcGUtcmVjb3JkZXIgbGlzdCBleGFjdGx5IG9uY2UuXG4gICAgaWYgKGhhc0RhdGEgfHwgaGFzRW1pdCkgdGhpcy5hdHRhY2hTY29wZVJlY29yZGVyKHJlY29yZGVyIGFzIFNjb3BlUmVjb3JkZXIpO1xuICAgIGlmIChoYXNGbG93KSB0aGlzLmF0dGFjaEZsb3dSZWNvcmRlcihyZWNvcmRlciBhcyBGbG93UmVjb3JkZXIpO1xuXG4gICAgaWYgKCFoYXNEYXRhICYmICFoYXNGbG93ICYmICFoYXNFbWl0ICYmIGlzRGV2TW9kZSgpKSB7XG4gICAgICAvLyBEZXYtbW9kZSBvbmx5OiBzaWxlbnQgc2tpcHMgYXJlIGludmlzaWJsZSBhbmQgcHJvZHVjZSBoYXJkLXRvLWRlYnVnXG4gICAgICAvLyBcIndoeSBkaWRuJ3QgbXkgcmVjb3JkZXIgZmlyZVwiIHJlcG9ydHMuIFBlciBsaWJyYXJ5IGNvbnZlbnRpb24sIGdhdGVkXG4gICAgICAvLyBvbiB0aGUgY2VudHJhbCBpc0Rldk1vZGUoKSBmbGFnIChub3QgcHJvY2Vzcy5lbnYpIHNvIGNvbnN1bWVycyBjYW5cbiAgICAgIC8vIGNvbnRyb2wgZGV2IHRvb2xpbmcgY2VudHJhbGx5IHZpYSBlbmFibGVEZXZNb2RlKCkvZGlzYWJsZURldk1vZGUoKS5cbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgIGBbZm9vdHByaW50anNdIGF0dGFjaENvbWJpbmVkUmVjb3JkZXI6IHJlY29yZGVyICcke3JlY29yZGVyLmlkfScgaGFzIGAgK1xuICAgICAgICAgICdubyBvYnNlcnZlciBldmVudCBtZXRob2RzIOKAlCBub3RoaW5nIHRvIGF0dGFjaC4gRGlkIHlvdSBmb3JnZXQgdG8gJyArXG4gICAgICAgICAgJ2FkZCBhbiBvbiogaGFuZGxlciAob25Xcml0ZSwgb25EZWNpc2lvbiwgb25TdWJmbG93RW50cnksIC4uLik/ICcgK1xuICAgICAgICAgICdOb3RlOiBvbmx5IE9XTiBwcm9wZXJ0aWVzIGNvdW50OyBtZXRob2RzIG9uIHRoZSBwcm90b3R5cGUgY2hhaW4gJyArXG4gICAgICAgICAgJ2FyZSBpZ25vcmVkIG9uIHB1cnBvc2UuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERldGFjaCBhIGNvbWJpbmVkIHJlY29yZGVyIGZyb20gYWxsIGNoYW5uZWxzIGl0IHdhcyBhdHRhY2hlZCB0by5cbiAgICogU2FmZSB0byBjYWxsIGlmIHRoZSByZWNvcmRlciB3YXMgb25seSBvbiBvbmUgY2hhbm5lbCBvciBuZXZlciBhdHRhY2hlZC5cbiAgICovXG4gIGRldGFjaENvbWJpbmVkUmVjb3JkZXIoaWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuZGV0YWNoU2NvcGVSZWNvcmRlcihpZCk7XG4gICAgdGhpcy5kZXRhY2hGbG93UmVjb3JkZXIoaWQpO1xuICB9XG5cbiAgLy8g4pSA4pSA4pSAIEVtaXQgU2NvcGVSZWNvcmRlciBNYW5hZ2VtZW50IChQaGFzZSAzKSDilIDilIDilIBcblxuICAvKipcbiAgICogQXR0YWNoIGFuIGBFbWl0UmVjb3JkZXJgIOKAlCBhbiBvYnNlcnZlciBmb3IgY29uc3VtZXItZW1pdHRlZCBzdHJ1Y3R1cmVkXG4gICAqIGV2ZW50cyBmaXJlZCB2aWEgYHNjb3BlLiRlbWl0KG5hbWUsIHBheWxvYWQpYC5cbiAgICpcbiAgICogSW50ZXJuYWxseSwgZW1pdCByZWNvcmRlcnMgc2hhcmUgdGhlIHNjb3BlLXJlY29yZGVyIGNoYW5uZWwgYmVjYXVzZVxuICAgKiBlbWl0IGV2ZW50cyBmaXJlIGZyb20gaW5zaWRlIGBTY29wZUZhY2FkZWAgZHVyaW5nIHN0YWdlIGV4ZWN1dGlvbixcbiAgICogc2FtZSB0aW1pbmcgYXMgYG9uUmVhZGAvYG9uV3JpdGVgLiBUaGlzIG1ldGhvZCBpcyBhIGNvbnZlbmllbmNlIHRoYXRcbiAgICogZGVsZWdhdGVzIHRvIGBhdHRhY2hTY29wZVJlY29yZGVyYCDigJQgY29uc3VtZXJzIGNhbiBhbHNvIHVzZVxuICAgKiBgYXR0YWNoU2NvcGVSZWNvcmRlcmAgZGlyZWN0bHkgZm9yIGEgcmVjb3JkZXIgdGhhdCBpbXBsZW1lbnRzIEJPVEhcbiAgICogYG9uV3JpdGVgIGFuZCBgb25FbWl0YC4gRWl0aGVyIGFwcHJvYWNoIHBsYWNlcyB0aGUgcmVjb3JkZXIgb24gdGhlXG4gICAqIHNhbWUgdW5kZXJseWluZyBsaXN0LCBzbyBgb25FbWl0YCBmaXJlcyBleGFjdGx5IG9uY2UgcGVyIGV2ZW50LlxuICAgKlxuICAgKiAqKklkZW1wb3RlbnQgYnkgYGlkYDoqKiByZXBsYWNlcyBleGlzdGluZyByZWNvcmRlciB3aXRoIHNhbWUgYGlkYC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBleGVjdXRvci5hdHRhY2hFbWl0UmVjb3JkZXIoe1xuICAgKiAgIGlkOiAndG9rZW4tbWV0ZXInLFxuICAgKiAgIG9uRW1pdDogKGUpID0+IHtcbiAgICogICAgIGlmIChlLm5hbWUgPT09ICdhZ2VudGZvb3RwcmludC5sbG0udG9rZW5zJykgdHJhY2tUb2tlbnMoZS5wYXlsb2FkKTtcbiAgICogICB9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBhdHRhY2hFbWl0UmVjb3JkZXIocmVjb3JkZXI6IEVtaXRSZWNvcmRlcik6IHZvaWQge1xuICAgIHRoaXMuYXR0YWNoU2NvcGVSZWNvcmRlcihyZWNvcmRlciBhcyBTY29wZVJlY29yZGVyKTtcbiAgfVxuXG4gIC8qKiBEZXRhY2ggYW4gYEVtaXRSZWNvcmRlcmAgYnkgaWQuIFNhZmUgdG8gY2FsbCBpZiBuZXZlciBhdHRhY2hlZC4gKi9cbiAgZGV0YWNoRW1pdFJlY29yZGVyKGlkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmRldGFjaFNjb3BlUmVjb3JkZXIoaWQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBkZWZlbnNpdmUgY29weSBvZiBhdHRhY2hlZCByZWNvcmRlcnMgZmlsdGVyZWQgdG8gdGhvc2UgdGhhdFxuICAgKiBpbXBsZW1lbnQgYG9uRW1pdGAuIFVzZWZ1bCBmb3IgaW5zcGVjdGlvbiBkdXJpbmcgdGVzdGluZy5cbiAgICovXG4gIGdldEVtaXRSZWNvcmRlcnMoKTogRW1pdFJlY29yZGVyW10ge1xuICAgIHJldHVybiB0aGlzLnNjb3BlUmVjb3JkZXJzLmZpbHRlcihcbiAgICAgIChyKTogciBpcyBFbWl0UmVjb3JkZXIgPT4gdHlwZW9mIChyIGFzIHsgb25FbWl0PzogdW5rbm93biB9KS5vbkVtaXQgPT09ICdmdW5jdGlvbicsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHN0cnVjdHVyZWQgbmFycmF0aXZlIGVudHJpZXMg4oCUIHRoZSBzaW5nbGUgcHVibGljIG5hcnJhdGl2ZSBBUEkuXG4gICAqIEVhY2ggZW50cnkgaGFzIGEgdHlwZSAoc3RhZ2UsIHN0ZXAsIGNvbmRpdGlvbiwgZm9yaywgZXRjLiksIHRleHQsIGFuZFxuICAgKiBkZXB0aC4gQ29uc3VtZXJzIHJlbmRlciBob3dldmVyIHRoZXkgd2FudDsgY2FsbCBgLm1hcChlID0+IGUudGV4dClgXG4gICAqIGlmIGEgZmxhdCBgc3RyaW5nW11gIGlzIG5lZWRlZCBsb2NhbGx5LlxuICAgKi9cbiAgZ2V0TmFycmF0aXZlRW50cmllcygpOiBDb21iaW5lZE5hcnJhdGl2ZUVudHJ5W10ge1xuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbWJpbmVkUmVjb3JkZXIuZ2V0RW50cmllcygpO1xuICAgIH1cbiAgICBjb25zdCBmbG93U2VudGVuY2VzID0gdGhpcy50cmF2ZXJzZXIuZ2V0TmFycmF0aXZlKCk7XG4gICAgcmV0dXJuIGZsb3dTZW50ZW5jZXMubWFwKCh0ZXh0KSA9PiAoeyB0eXBlOiAnc3RhZ2UnIGFzIGNvbnN0LCB0ZXh0LCBkZXB0aDogMCB9KSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29tYmluZWQgRmxvd1JlY29yZGVycyBsaXN0LiBXaGVuIG5hcnJhdGl2ZSBpcyBlbmFibGVkLFxuICAgKiBpbmNsdWRlcyB0aGUgQ29tYmluZWROYXJyYXRpdmVSZWNvcmRlciAod2hpY2ggYnVpbGRzIG1lcmdlZCBmbG93K2RhdGFcbiAgICogZW50cmllcyBpbmxpbmUpLiBQbHVzIGFueSB1c2VyLWF0dGFjaGVkIHJlY29yZGVycy5cbiAgICovXG4gIHByaXZhdGUgYnVpbGRGbG93UmVjb3JkZXJzTGlzdCgpOiBGbG93UmVjb3JkZXJbXSB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgcmVjb3JkZXJzOiBGbG93UmVjb3JkZXJbXSA9IFtdO1xuICAgIGlmICh0aGlzLmNvbWJpbmVkUmVjb3JkZXIpIHtcbiAgICAgIHJlY29yZGVycy5wdXNoKHRoaXMuY29tYmluZWRSZWNvcmRlcik7XG4gICAgfVxuICAgIHJlY29yZGVycy5wdXNoKC4uLnRoaXMuZmxvd1JlY29yZGVycyk7XG4gICAgcmV0dXJuIHJlY29yZGVycy5sZW5ndGggPiAwID8gcmVjb3JkZXJzIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgYXN5bmMgcnVuKG9wdGlvbnM/OiBSdW5PcHRpb25zKTogUHJvbWlzZTxFeGVjdXRvclJlc3VsdD4ge1xuICAgIC8vIFJlLWVudHJhbmN5IGd1YXJkIEZJUlNUIOKAlCBiZWZvcmUgY2xlYXJpbmcgcmVjb3JkZXJzIG9yIHRvdWNoaW5nIGFueVxuICAgIC8vIHBlci1ydW4gZmllbGQsIHNvIGEgcmVqZWN0ZWQgY29uY3VycmVudCBjYWxsIGxlYXZlcyB0aGUgaW4tZmxpZ2h0IHJ1blxuICAgIC8vIGNvbXBsZXRlbHkgdW50b3VjaGVkLlxuICAgIGlmICh0aGlzLl9pc0V4ZWN1dGluZykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnRmxvd0NoYXJ0RXhlY3V0b3I6IHJ1bigpIGNhbGxlZCB3aGlsZSBhbm90aGVyIHJ1bigpL3Jlc3VtZSgpIGlzIGluIGZsaWdodCBvbiB0aGlzICcgK1xuICAgICAgICAgICdleGVjdXRvci4gQW4gZXhlY3V0b3IgaG9sZHMgcGVyLXJ1biBzdGF0ZSAocnVuSWQsIHJlY29yZGVycywgY2hlY2twb2ludCkg4oCUIGNyZWF0ZSAnICtcbiAgICAgICAgICAnb25lIGV4ZWN1dG9yIHBlciBjb25jdXJyZW50IHJ1bi4gU2VlIGRvY3MvZ3VpZGVzL2V4ZWN1dGlvbi1tb2RlbC5tZC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy8gVmFsaWRhdGUgaW5wdXQgYWdhaW5zdCBpbnB1dFNjaGVtYSBpZiBib3RoIGFyZSBwcmVzZW50LiBWYWxpZGF0aW9uIHJ1bnNcbiAgICAvLyBCRUZPUkUgdGhlIHRpbWVvdXQgdGltZXIgaXMgY3JlYXRlZCBzbyBhIHJlamVjdGVkIGlucHV0IGNhbid0IGxlYWsgYVxuICAgIC8vIHBlbmRpbmcgdGltZXIgKHNhbWUgXCJmYWlsZWQgZW50cnkgbGVhdmVzIG5vIHNpZGUgZWZmZWN0c1wiIHJ1bGUgYXMgdGhlXG4gICAgLy8gcmUtZW50cmFuY3kgZ3VhcmQgYWJvdmUpLlxuICAgIGxldCB2YWxpZGF0ZWRJbnB1dCA9IG9wdGlvbnM/LmlucHV0O1xuICAgIGlmICh2YWxpZGF0ZWRJbnB1dCAmJiB0aGlzLmZsb3dDaGFydEFyZ3MuZmxvd0NoYXJ0LmlucHV0U2NoZW1hKSB7XG4gICAgICB2YWxpZGF0ZWRJbnB1dCA9IHZhbGlkYXRlSW5wdXQodGhpcy5mbG93Q2hhcnRBcmdzLmZsb3dDaGFydC5pbnB1dFNjaGVtYSwgdmFsaWRhdGVkSW5wdXQpO1xuICAgIH1cblxuICAgIGxldCBzaWduYWwgPSBvcHRpb25zPy5zaWduYWw7XG4gICAgbGV0IHRpbWVvdXRJZDogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG5cbiAgICAvLyBDcmVhdGUgYW4gaW50ZXJuYWwgQWJvcnRDb250cm9sbGVyIGZvciB0aW1lb3V0TXNcbiAgICBpZiAob3B0aW9ucz8udGltZW91dE1zICYmICFzaWduYWwpIHtcbiAgICAgIGNvbnN0IGNvbnRyb2xsZXIgPSBuZXcgQWJvcnRDb250cm9sbGVyKCk7XG4gICAgICBzaWduYWwgPSBjb250cm9sbGVyLnNpZ25hbDtcbiAgICAgIHRpbWVvdXRJZCA9IHNldFRpbWVvdXQoXG4gICAgICAgICgpID0+IGNvbnRyb2xsZXIuYWJvcnQobmV3IEVycm9yKGBFeGVjdXRpb24gdGltZWQgb3V0IGFmdGVyICR7b3B0aW9ucy50aW1lb3V0TXN9bXNgKSksXG4gICAgICAgIG9wdGlvbnMudGltZW91dE1zLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBVc2VyLWF0dGFjaGVkIHJlY29yZGVycyAoZmxvd1JlY29yZGVycyArIHNjb3BlUmVjb3JkZXJzKSBhcmUgY2xlYXJlZCB2aWEgY2xlYXIoKSB0byBwcmV2ZW50XG4gICAgLy8gY3Jvc3MtcnVuIGFjY3VtdWxhdGlvbi4gVGhlIGNvbWJpbmVkUmVjb3JkZXIgaXMgTk9UIGNsZWFyZWQgaGVyZSDigJQgY3JlYXRlVHJhdmVyc2VyKCkgYWx3YXlzXG4gICAgLy8gY3JlYXRlcyBhIGZyZXNoIENvbWJpbmVkTmFycmF0aXZlUmVjb3JkZXIgaW5zdGFuY2Ugb24gZWFjaCBydW4sIHNvIHN0YWxlIHN0YXRlIGlzIG5ldmVyIGFuIGlzc3VlLlxuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLmZsb3dSZWNvcmRlcnMpIHtcbiAgICAgIHIuY2xlYXI/LigpO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHIgb2YgdGhpcy5zY29wZVJlY29yZGVycykge1xuICAgICAgci5jbGVhcj8uKCk7XG4gICAgfVxuXG4gICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLl9leGVjdXRpb25Db3VudGVyID0geyB2YWx1ZTogMCB9OyAvLyBSZXNldCBjb3VudGVyIG9uIGZyZXNoIHJ1blxuICAgIHRoaXMuX2N1cnJlbnRSdW5JZCA9IGdlbmVyYXRlUnVuSWQoKTsgLy8gRnJlc2ggcnVuSWQgcGVyIHJ1bigpIGNhbGxcbiAgICB0aGlzLl9oYXNSdW5CZWZvcmUgPSB0cnVlOyAvLyBtYXJrIHNvIGEgbGF0ZXIgcmVzdW1lKCkgdGFrZXMgdGhlXG4gICAgLy8gc2FtZS1leGVjdXRvciBicmFuY2ggKHJldXNlIHJ1bnRpbWUsIGFjY3VtdWxhdGUgZXhlY3V0aW9uIHRyZWUpLlxuICAgIHRoaXMudHJhdmVyc2VyID0gdGhpcy5jcmVhdGVUcmF2ZXJzZXIoXG4gICAgICBzaWduYWwsXG4gICAgICB2YWxpZGF0ZWRJbnB1dCxcbiAgICAgIG9wdGlvbnM/LmVudixcbiAgICAgIG9wdGlvbnM/Lm1heERlcHRoLFxuICAgICAgb3B0aW9ucz8ubWF4SXRlcmF0aW9ucyxcbiAgICApO1xuICAgIC8vIFNldCBBRlRFUiBhbGwgc3luYyB2YWxpZGF0aW9uIHRocm93cyAobm90aGluZyBhYm92ZSBjYW4gbGVhayB0aGUgZmxhZyk7XG4gICAgLy8gbm8gYXdhaXQgYmV0d2VlbiB0aGUgdG9wLW9mLW1ldGhvZCBjaGVjayBhbmQgaGVyZSwgc28gdGhpcyBpcyByYWNlLWZyZWUuXG4gICAgdGhpcy5faXNFeGVjdXRpbmcgPSB0cnVlO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy50cmF2ZXJzZXIuZXhlY3V0ZSgpO1xuICAgIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgICBpZiAoaXNQYXVzZVNpZ25hbChlcnJvcikpIHtcbiAgICAgICAgLy8gQnVpbGQgYSBkZXRhY2hlZCBjaGVja3BvaW50IGZyb20gY3VycmVudCBleGVjdXRpb24gc3RhdGUg4oCUIHNlZVxuICAgICAgICAvLyBidWlsZFBhdXNlQ2hlY2twb2ludCgpIGZvciB0aGUgZGVlcC1jb3B5IHJhdGlvbmFsZS5cbiAgICAgICAgdGhpcy5sYXN0Q2hlY2twb2ludCA9IHRoaXMuYnVpbGRQYXVzZUNoZWNrcG9pbnQoZXJyb3IpO1xuICAgICAgICAvLyBSZXR1cm4gYSBQYXVzZVJlc3VsdC1zaGFwZWQgdmFsdWUgc28gY2FsbGVycyBjYW4gY2hlY2sgd2l0aG91dCB0cnkvY2F0Y2hcbiAgICAgICAgcmV0dXJuIHsgcGF1c2VkOiB0cnVlLCBjaGVja3BvaW50OiB0aGlzLmxhc3RDaGVja3BvaW50IH0gc2F0aXNmaWVzIFBhdXNlZFJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9pc0V4ZWN1dGluZyA9IGZhbHNlO1xuICAgICAgaWYgKHRpbWVvdXRJZCAhPT0gdW5kZWZpbmVkKSBjbGVhclRpbWVvdXQodGltZW91dElkKTtcbiAgICB9XG4gIH1cblxuICAvLyDilIDilIDilIAgSW50cm9zcGVjdGlvbiDilIDilIDilIBcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcnVudGltZSBzbmFwc2hvdC5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMucmVkYWN0ICBXaGVuIGB0cnVlYCwgYHNoYXJlZFN0YXRlYCBjb21lcyBmcm9tIHRoZSBwYXJhbGxlbFxuICAgKiAgIHJlZGFjdGVkIG1pcnJvciAoaWYgbWFpbnRhaW5lZCDigJQgc2VlIGBzZXRSZWRhY3Rpb25Qb2xpY3lgKS4gVGhpcyBpc1xuICAgKiAgIHRoZSBzYWZlIHZpZXcgZm9yIGV4cG9ydGluZyB0cmFjZXMgZXh0ZXJuYWxseSAocGFzdGUgaW50byBhIHZpZXdlcixcbiAgICogICBzaGFyZSB3aXRoIHN1cHBvcnQpLiBXaGVuIG5vIHJlZGFjdGlvbiBwb2xpY3kgaXMgY29uZmlndXJlZCB0aGVcbiAgICogICByZWRhY3RlZCBtaXJyb3IgaXMgbm90IG1haW50YWluZWQsIHNvIHRoaXMgZmxhZyBpcyBhIG5vLW9wIOKAlFxuICAgKiAgIGBzaGFyZWRTdGF0ZWAgaXMgdGhlIHJhdyB3b3JraW5nIG1lbW9yeSBlaXRoZXIgd2F5LiBEZWZhdWx0IGBmYWxzZWAuXG4gICAqXG4gICAqICAgVGhlIGNvbW1pdCBsb2cgaXMgYWxyZWFkeSByZWRhY3RlZCBhdCB3cml0ZS10aW1lIHJlZ2FyZGxlc3Mgb2YgdGhpc1xuICAgKiAgIGZsYWcsIGFuZCB0aGUgZXhlY3V0aW9uIHRyZWUgY2FycmllcyBvbmx5IHN0cnVjdHVyYWwgbWV0YWRhdGEuXG4gICAqXG4gICAqICoqVHJlYXQgYHNoYXJlZFN0YXRlYCBhcyBSRUFELU9OTFkuKiogSW4gcHJvZHVjdGlvbiBpdCBpcyBhIGxpdmUgdmlldyBvZlxuICAgKiB0aGUgZW5naW5lJ3Mgd29ya2luZyBtZW1vcnkgKHplcm8gY29weSBjb3N0KSDigJQgbXV0YXRpbmcgaXQgY29ycnVwdHNcbiAgICogZW5naW5lIHN0YXRlLiBJbiBkZXYgbW9kZSAoYGVuYWJsZURldk1vZGUoKWApIGl0IGlzIGEgZGVlcC1mcm96ZW4gQ0xPTkUsXG4gICAqIHNvIGFueSBjb25zdW1lciBtdXRhdGlvbiB0aHJvd3MgbG91ZGx5IGluc3RlYWQgb2YgY29ycnVwdGluZyBzaWxlbnRseS5cbiAgICovXG4gIGdldFNuYXBzaG90KG9wdGlvbnM/OiB7IHJlZGFjdD86IGJvb2xlYW4gfSk6IFJ1bnRpbWVTbmFwc2hvdCB7XG4gICAgY29uc3Qgc25hcHNob3QgPSB0aGlzLnRyYXZlcnNlci5nZXRTbmFwc2hvdChvcHRpb25zKSBhcyBSdW50aW1lU25hcHNob3Q7XG4gICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAvLyBEZXYtbW9kZSBtdXRhdGlvbiBndWFyZDogZnJlZXplIGEgQ0xPTkUsIG5ldmVyIHRoZSBsaXZlIGVuZ2luZVxuICAgICAgLy8gc3RhdGUg4oCUIGBzbmFwc2hvdC5zaGFyZWRTdGF0ZWAgYWxpYXNlcyBTaGFyZWRNZW1vcnkncyBpbnRlcm5hbFxuICAgICAgLy8gY29udGV4dCB1bnRpbCB0aGUgbmV4dCBjb21taXQgcmVidWlsZHMgaXQgKHBvc3QtcnVuOiBmb3JldmVyKS5cbiAgICAgIC8vIFByb2R1Y3Rpb24gc3RheXMgemVyby1jb3B5OyBjbG9uZS1hbHdheXMgaXMgYSBtZWFzdXJlZCBkZWNpc2lvblxuICAgICAgLy8gZGVmZXJyZWQgdW50aWwgdGhlIGJlbmNoIHNheXMgaXQncyBhZmZvcmRhYmxlIChCQUNLTE9HICM4KS5cbiAgICAgIC8vIE5PVEU6IGRlZXBGcmVlemUgKHJldXNlZCBmcm9tIHJlYWRvbmx5SW5wdXQpIGZyZWV6ZXMgcGxhaW4gb2JqZWN0cy9cbiAgICAgIC8vIGFycmF5cyBvbmx5IOKAlCBNYXAvU2V0IElOVEVSTkFMUyBzdGF5IG11dGFibGUgKGBtYXAuc2V0KClgIG9uIHRoZVxuICAgICAgLy8gZnJvemVuIGNsb25lIHdvbid0IHRocm93KS4gVGhlIENMT05FIHN0aWxsIGlzb2xhdGVzIHRoZSBlbmdpbmUuXG4gICAgICBzbmFwc2hvdC5zaGFyZWRTdGF0ZSA9IGRlZXBGcmVlemUoc3RydWN0dXJlZENsb25lKHNuYXBzaG90LnNoYXJlZFN0YXRlKSk7XG4gICAgfVxuICAgIGNvbnN0IHNmUmVzdWx0cyA9IHRoaXMudHJhdmVyc2VyLmdldFN1YmZsb3dSZXN1bHRzKCk7XG4gICAgaWYgKHNmUmVzdWx0cy5zaXplID4gMCkge1xuICAgICAgc25hcHNob3Quc3ViZmxvd1Jlc3VsdHMgPSBPYmplY3QuZnJvbUVudHJpZXMoc2ZSZXN1bHRzKTtcbiAgICB9XG5cbiAgICAvLyBDb2xsZWN0IHNuYXBzaG90IGRhdGEgZnJvbSByZWNvcmRlcnMgdGhhdCBpbXBsZW1lbnQgdG9TbmFwc2hvdCgpXG4gICAgY29uc3QgcmVjb3JkZXJTbmFwc2hvdHM6IFJlY29yZGVyU25hcHNob3RbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgciBvZiB0aGlzLnNjb3BlUmVjb3JkZXJzKSB7XG4gICAgICBpZiAoci50b1NuYXBzaG90KSB7XG4gICAgICAgIGNvbnN0IHNuYXAgPSByLnRvU25hcHNob3QoKTtcbiAgICAgICAgcmVjb3JkZXJTbmFwc2hvdHMucHVzaCh7XG4gICAgICAgICAgaWQ6IHIuaWQsXG4gICAgICAgICAgbmFtZTogc25hcC5uYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBzbmFwLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIHByZWZlcnJlZE9wZXJhdGlvbjogc25hcC5wcmVmZXJyZWRPcGVyYXRpb24sXG4gICAgICAgICAgZGF0YTogc25hcC5kYXRhLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCByIG9mIHRoaXMuZmxvd1JlY29yZGVycykge1xuICAgICAgaWYgKHIudG9TbmFwc2hvdCkge1xuICAgICAgICBjb25zdCBzbmFwID0gci50b1NuYXBzaG90KCk7XG4gICAgICAgIHJlY29yZGVyU25hcHNob3RzLnB1c2goe1xuICAgICAgICAgIGlkOiByLmlkLFxuICAgICAgICAgIG5hbWU6IHNuYXAubmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogc25hcC5kZXNjcmlwdGlvbixcbiAgICAgICAgICBwcmVmZXJyZWRPcGVyYXRpb246IHNuYXAucHJlZmVycmVkT3BlcmF0aW9uLFxuICAgICAgICAgIGRhdGE6IHNuYXAuZGF0YSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChyZWNvcmRlclNuYXBzaG90cy5sZW5ndGggPiAwKSB7XG4gICAgICBzbmFwc2hvdC5yZWNvcmRlcnMgPSByZWNvcmRlclNuYXBzaG90cztcbiAgICB9XG5cbiAgICByZXR1cm4gc25hcHNob3Q7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFJ1bnRpbWUoKSB7XG4gICAgcmV0dXJuIHRoaXMudHJhdmVyc2VyLmdldFJ1bnRpbWUoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc2V0Um9vdE9iamVjdChwYXRoOiBzdHJpbmdbXSwga2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKTogdm9pZCB7XG4gICAgdGhpcy50cmF2ZXJzZXIuc2V0Um9vdE9iamVjdChwYXRoLCBrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0QnJhbmNoSWRzKCkge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRCcmFuY2hJZHMoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UnVudGltZVJvb3QoKTogU3RhZ2VOb2RlIHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0UnVudGltZVJvb3QoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgZ2V0UnVudGltZVN0cnVjdHVyZSgpOiBTZXJpYWxpemVkUGlwZWxpbmVTdHJ1Y3R1cmUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLnRyYXZlcnNlci5nZXRSdW50aW1lU3RydWN0dXJlKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIGdldFN1YmZsb3dSZXN1bHRzKCk6IE1hcDxzdHJpbmcsIFN1YmZsb3dSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmF2ZXJzZXIuZ2V0U3ViZmxvd1Jlc3VsdHMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzdWJmbG93IG1hbmlmZXN0IGZyb20gYW4gYXR0YWNoZWQgTWFuaWZlc3RGbG93UmVjb3JkZXIuXG4gICAqIFJldHVybnMgZW1wdHkgYXJyYXkgaWYgbm8gTWFuaWZlc3RGbG93UmVjb3JkZXIgaXMgYXR0YWNoZWQuXG4gICAqL1xuICBnZXRTdWJmbG93TWFuaWZlc3QoKTogTWFuaWZlc3RFbnRyeVtdIHtcbiAgICBjb25zdCByZWNvcmRlciA9IHRoaXMuZmxvd1JlY29yZGVycy5maW5kKChyKSA9PiByIGluc3RhbmNlb2YgTWFuaWZlc3RGbG93UmVjb3JkZXIpIGFzXG4gICAgICB8IE1hbmlmZXN0Rmxvd1JlY29yZGVyXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVjb3JkZXI/LmdldE1hbmlmZXN0KCkgPz8gW107XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgZnVsbCBzcGVjIGZvciBhIGR5bmFtaWNhbGx5LXJlZ2lzdGVyZWQgc3ViZmxvdy5cbiAgICogUmVxdWlyZXMgYW4gYXR0YWNoZWQgTWFuaWZlc3RGbG93UmVjb3JkZXIgdGhhdCBvYnNlcnZlZCB0aGUgcmVnaXN0cmF0aW9uLlxuICAgKi9cbiAgZ2V0U3ViZmxvd1NwZWMoc3ViZmxvd0lkOiBzdHJpbmcpOiB1bmtub3duIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCByZWNvcmRlciA9IHRoaXMuZmxvd1JlY29yZGVycy5maW5kKChyKSA9PiByIGluc3RhbmNlb2YgTWFuaWZlc3RGbG93UmVjb3JkZXIpIGFzXG4gICAgICB8IE1hbmlmZXN0Rmxvd1JlY29yZGVyXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gcmVjb3JkZXI/LmdldFNwZWMoc3ViZmxvd0lkKTtcbiAgfVxufVxuIl19