aws-cdk 2.1128.0 → 2.1129.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 (54) hide show
  1. package/README.md +1 -0
  2. package/THIRD_PARTY_LICENSES +2822 -2593
  3. package/build-info.json +2 -2
  4. package/docs/confirmation-prompts.md +79 -0
  5. package/lib/api-private.d.ts +2 -0
  6. package/lib/api-private.js +29 -3
  7. package/lib/cli/cdk-toolkit.d.ts +8 -1
  8. package/lib/cli/cdk-toolkit.js +164 -125
  9. package/lib/cli/cli-config.js +40 -4
  10. package/lib/cli/cli-type-registry.json +16 -1
  11. package/lib/cli/cli.js +49 -10
  12. package/lib/cli/convert-to-user-input.js +7 -1
  13. package/lib/cli/display-version.js +46 -7
  14. package/lib/cli/io-host/cli-io-host.d.ts +211 -23
  15. package/lib/cli/io-host/cli-io-host.js +321 -95
  16. package/lib/cli/parse-command-line-arguments.js +51 -3
  17. package/lib/cli/platform-warnings.js +36 -3
  18. package/lib/cli/pretty-print-error.d.ts +4 -1
  19. package/lib/cli/pretty-print-error.js +15 -7
  20. package/lib/cli/proxy-agent.js +36 -2
  21. package/lib/cli/root-dir.js +36 -3
  22. package/lib/cli/tables.js +35 -2
  23. package/lib/cli/telemetry/installation-id.js +36 -3
  24. package/lib/cli/telemetry/library-version.js +36 -3
  25. package/lib/cli/telemetry/messages.js +35 -2
  26. package/lib/cli/telemetry/session.js +9 -2
  27. package/lib/cli/telemetry/sink/endpoint-sink.js +5 -2
  28. package/lib/cli/telemetry/sink/file-sink.js +37 -2
  29. package/lib/cli/telemetry/sink/funnel.js +2 -1
  30. package/lib/cli/telemetry/sink/io-host-sink.js +2 -1
  31. package/lib/cli/telemetry/telemetry-state.js +36 -3
  32. package/lib/cli/user-configuration.js +51 -13
  33. package/lib/cli/user-input.d.ts +19 -1
  34. package/lib/cli/user-input.js +1 -1
  35. package/lib/cli/util/fs-util.js +35 -2
  36. package/lib/cli/version.js +35 -2
  37. package/lib/commands/context.js +11 -8
  38. package/lib/commands/docs.js +41 -5
  39. package/lib/commands/doctor.js +45 -9
  40. package/lib/commands/flags/flags.js +5 -1
  41. package/lib/commands/flags/interactive-handler.js +3 -1
  42. package/lib/commands/flags/operations.js +58 -14
  43. package/lib/commands/flags/router.js +4 -1
  44. package/lib/commands/flags/validator.js +2 -1
  45. package/lib/commands/init/init-hooks.js +35 -2
  46. package/lib/commands/init/init.js +63 -22
  47. package/lib/commands/init/os.js +40 -4
  48. package/lib/commands/migrate.js +44 -6
  49. package/lib/cxapp/cloud-assembly.js +35 -2
  50. package/lib/cxapp/cloud-executable.d.ts +7 -0
  51. package/lib/cxapp/cloud-executable.js +48 -2
  52. package/lib/cxapp/exec.js +38 -5
  53. package/lib/index.js +284512 -245081
  54. package/package.json +9 -9
@@ -1,11 +1,48 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
2
38
  Object.defineProperty(exports, "__esModule", { value: true });
3
39
  exports.CliIoHost = void 0;
4
- const util = require("node:util");
40
+ exports.matchAny = matchAny;
41
+ const util = __importStar(require("node:util"));
5
42
  const cloud_assembly_schema_1 = require("@aws-cdk/cloud-assembly-schema");
6
43
  const toolkit_lib_1 = require("@aws-cdk/toolkit-lib");
7
- const chalk = require("chalk");
8
- const promptly = require("promptly");
44
+ const chalk_1 = __importDefault(require("chalk"));
45
+ const promptly = __importStar(require("promptly"));
9
46
  const api_private_1 = require("../../../lib/api-private");
10
47
  const deploy_1 = require("../../commands/deploy");
11
48
  const collect_telemetry_1 = require("../telemetry/collect-telemetry");
@@ -35,20 +72,62 @@ class CliIoHost {
35
72
  static get() {
36
73
  return CliIoHost._instance;
37
74
  }
75
+ /**
76
+ * Singleton instance of the CliIoHost
77
+ */
78
+ static _instance;
79
+ /**
80
+ * The current action being performed by the CLI.
81
+ */
82
+ currentAction;
83
+ /**
84
+ * Whether the CliIoHost is running in CI mode.
85
+ *
86
+ * In CI mode, all non-error output goes to stdout instead of stderr.
87
+ */
88
+ isCI;
89
+ /**
90
+ * Whether the host can use interactions and message styling.
91
+ */
92
+ isTTY;
93
+ /**
94
+ * The current threshold.
95
+ *
96
+ * Messages with a lower priority level will be ignored.
97
+ */
98
+ logLevel;
99
+ /**
100
+ * The conditions for requiring approval in this CliIoHost.
101
+ */
102
+ requireDeployApproval;
103
+ /**
104
+ * Configure the target stream for notices
105
+ *
106
+ * (Not a setter because there's no need for additional logic when this value
107
+ * is changed yet)
108
+ */
109
+ noticesDestination = 'stderr';
110
+ _progress = deploy_1.StackActivityProgress.BAR;
111
+ // Stack Activity Printer
112
+ activityPrinter;
113
+ // Corked Logging
114
+ corkedCounter = 0;
115
+ corkedLoggingBuffer = [];
116
+ // Message listeners in registration order. Each carries a matcher (by code,
117
+ // or a custom predicate). See `on`/`once`/`rewrite`/`respond`.
118
+ messageListeners = [];
119
+ // Observers of how messages are handled (see ObservableIoHost / observeMessages).
120
+ messageObservers = new Set();
121
+ // True while replaying corked messages, so observers aren't notified twice.
122
+ corkReplaying = false;
123
+ autoRespond;
124
+ /**
125
+ * The telemetry session object
126
+ *
127
+ * Will remain `undefined` if the user has disabled telemetry.
128
+ */
129
+ telemetry;
38
130
  constructor(props = {}) {
39
- /**
40
- * Configure the target stream for notices
41
- *
42
- * (Not a setter because there's no need for additional logic when this value
43
- * is changed yet)
44
- */
45
- this.noticesDestination = 'stderr';
46
- this._progress = deploy_1.StackActivityProgress.BAR;
47
- // Corked Logging
48
- this.corkedCounter = 0;
49
- this.corkedLoggingBuffer = [];
50
- // Message listeners, keyed by message code. See `on`/`once`/`rewrite`/`rewriteOnce`.
51
- this.messageListeners = new Map();
52
131
  this.currentAction = props.currentAction ?? 'none';
53
132
  this.isTTY = props.isTTY ?? process.stdout.isTTY ?? false;
54
133
  this.logLevel = props.logLevel ?? 'info';
@@ -172,108 +251,175 @@ class CliIoHost {
172
251
  this.corkedCounter--;
173
252
  if (this.corkedCounter === 0) {
174
253
  // Process each buffered message through notify
175
- for (const ioMessage of this.corkedLoggingBuffer) {
176
- await this.notify(ioMessage);
254
+ this.corkReplaying = true;
255
+ try {
256
+ for (const ioMessage of this.corkedLoggingBuffer) {
257
+ await this.notify(ioMessage);
258
+ }
259
+ }
260
+ finally {
261
+ this.corkReplaying = false;
177
262
  }
178
263
  // remove all buffered messages in-place
179
264
  this.corkedLoggingBuffer.splice(0);
180
265
  }
181
266
  }
182
267
  }
268
+ on(selector, listener) {
269
+ return this.addMessageListener({ once: false, fn: listener, matches: messageMatcher(selector) });
270
+ }
271
+ /**
272
+ * Register an observer that is invoked for every message the host handles —
273
+ * both notifications and requests — with the disposition the host computed
274
+ * for it (its effective form after listeners and whether it was dropped). For
275
+ * a request, the resolved answer is the effective message's `defaultResponse`.
276
+ * Returns a function that removes the observer.
277
+ *
278
+ * @see ObservableIoHost
279
+ */
280
+ observeMessages(observer) {
281
+ this.messageObservers.add(observer);
282
+ return () => {
283
+ this.messageObservers.delete(observer);
284
+ };
285
+ }
286
+ once(selector, listener) {
287
+ return this.addMessageListener({ once: true, fn: listener, matches: messageMatcher(selector) });
288
+ }
289
+ /**
290
+ * Remove every message listener registered via `on`/`once`/`rewrite`/`respond`.
291
+ *
292
+ * The host's own internal listeners (such as stack-activity routing) are kept,
293
+ * so the host keeps working afterwards. Message observers registered via
294
+ * `observeMessages` are a separate mechanism and are not affected.
295
+ *
296
+ * This is mainly useful for tests that share the singleton host and need to
297
+ * reset listener state between cases (a leftover listener would otherwise
298
+ * leak into the next test).
299
+ */
300
+ removeAllListeners() {
301
+ // Drop user listeners in place (preserving array identity for any
302
+ // outstanding dispose closures); keep the host's internal listeners.
303
+ for (let i = this.messageListeners.length - 1; i >= 0; i--) {
304
+ if (!this.messageListeners[i].internal) {
305
+ this.messageListeners.splice(i, 1);
306
+ }
307
+ }
308
+ }
183
309
  /**
184
- * Register a listener that is invoked for every message with the given code.
310
+ * Answer a request (by its code) on the user's behalf with a fixed value, so
311
+ * the host does not prompt. Syntactic sugar for an `on` listener returning
312
+ * `{ respond: value, preventDefault: suppressQuestion }`; for conditional
313
+ * answers or to also reword the question, use `on`/`once` directly. Returns a
314
+ * function that removes the responder again.
185
315
  *
186
- * The listener may return a `MessageListenerResult` to update the message
187
- * text and/or prevent the default processing (writing it to a stream);
188
- * returning nothing leaves the message untouched. Returns a function that
189
- * removes the listener again.
316
+ * @param suppressQuestion - whether to also suppress writing the question text.
317
+ * Defaults to `true` (answer silently). Pass `false` to still surface the
318
+ * question while answering it.
190
319
  *
191
320
  * @example
192
- * const dispose = ioHost.on(IO.CDK_TOOLKIT_I2901, (msg) => {
193
- * myCount += msg.data.stacks.length;
194
- * });
321
+ * // Under --force, auto-confirm the destroy prompt without prompting.
322
+ * const dispose = ioHost.respond(IO.CDK_TOOLKIT_I7010, true);
195
323
  */
196
- on(code, listener) {
197
- return this.addMessageListener(code.code, { once: false, fn: listener });
324
+ respond(code, value, suppressQuestion = true) {
325
+ return this.addMessageListener({ once: false, fn: () => ({ respond: value, preventDefault: suppressQuestion }), matches: messageMatcher(code) });
198
326
  }
199
327
  /**
200
- * Like `on`, but the listener is automatically removed after it has been
201
- * invoked once.
328
+ * Like `respond`, but the answer is given only once and then removed.
202
329
  */
203
- once(code, listener) {
204
- return this.addMessageListener(code.code, { once: true, fn: listener });
330
+ respondOnce(code, value, suppressQuestion = true) {
331
+ return this.addMessageListener({ once: true, fn: () => ({ respond: value, preventDefault: suppressQuestion }), matches: messageMatcher(code) });
205
332
  }
206
333
  /**
207
334
  * Register a formatter that replaces the printed text of messages with the
208
335
  * given code. This lets a caller define _how_ a toolkit message is presented
209
336
  * without the IoHost needing to know about it.
210
337
  *
211
- * Syntactic sugar for an `on` listener that returns `{ message }`. Returns a
212
- * function that removes the formatter again.
338
+ * Optionally pass a `level` to also override the message's level (which moves
339
+ * it between stdout/stderr and changes verbosity filtering). For the rarer
340
+ * case of overriding only the level, use `on`/`once` returning `{ level }`.
341
+ *
342
+ * Syntactic sugar for an `on` listener that returns `{ message, level? }`.
343
+ * Returns a function that removes the formatter again.
213
344
  *
214
345
  * @example
215
346
  * const dispose = ioHost.rewrite(IO.CDK_TOOLKIT_I2901, (msg) =>
216
347
  * serializeStructure(msg.data.stacks, true));
217
348
  */
218
- rewrite(code, formatter) {
219
- return this.on(code, (msg) => ({ message: formatter(msg) }));
349
+ rewrite(code, formatter, level) {
350
+ return this.on(code, (msg) => ({ message: formatter(msg), ...(level !== undefined ? { level } : {}) }));
220
351
  }
221
352
  /**
222
353
  * Like `rewrite`, but the formatter is automatically removed after it has
223
354
  * been applied once.
224
355
  */
225
- rewriteOnce(code, formatter) {
226
- return this.once(code, (msg) => ({ message: formatter(msg) }));
356
+ rewriteOnce(code, formatter, level) {
357
+ return this.once(code, (msg) => ({ message: formatter(msg), ...(level !== undefined ? { level } : {}) }));
227
358
  }
228
359
  /**
229
360
  * Add a listener to the registry and return a function that removes it.
230
361
  */
231
- addMessageListener(code, listener) {
232
- const listeners = this.messageListeners.get(code) ?? [];
233
- listeners.push(listener);
234
- this.messageListeners.set(code, listeners);
362
+ addMessageListener(listener) {
363
+ this.messageListeners.push(listener);
235
364
  return () => {
236
- const index = listeners.indexOf(listener);
365
+ const index = this.messageListeners.indexOf(listener);
237
366
  if (index >= 0) {
238
- listeners.splice(index, 1);
367
+ this.messageListeners.splice(index, 1);
239
368
  }
240
369
  };
241
370
  }
242
371
  /**
243
- * Run all registered listeners for a message's code, in registration order.
372
+ * Run every registered listener that matches the message, in registration
373
+ * order. A listener matches by its code (maker) or its custom predicate.
244
374
  *
245
- * A listener may update the message text (which is passed on to subsequent
246
- * listeners and the rest of the pipeline) and/or request that the default
247
- * processing be skipped. `once` listeners are removed after they have run.
375
+ * A listener may update the message text/level (passed on to subsequent
376
+ * listeners and the rest of the pipeline), prevent the default processing, or
377
+ * (for requests) answer it. `once` listeners are removed after they have run.
378
+ * Matching is decided against the message as emitted, so a rewrite by an
379
+ * earlier listener does not change which later listeners apply.
248
380
  *
249
- * Returns the (possibly text-updated) message and whether any listener
250
- * prevented the default processing.
381
+ * Returns the (possibly updated) message, whether the default processing was
382
+ * prevented, and whether a listener answered the request (and with what).
251
383
  */
252
- applyMessageListeners(msg) {
384
+ async applyMessageListeners(msg) {
253
385
  let current = msg;
254
386
  let preventDefault = false;
255
- const listeners = msg.code ? this.messageListeners.get(msg.code) : undefined;
256
- if (listeners && listeners.length > 0) {
257
- // Iterate over a copy so that `once` listeners can remove themselves safely.
258
- for (const listener of [...listeners]) {
259
- const result = listener.fn(current);
260
- if (listener.once) {
261
- const index = listeners.indexOf(listener);
262
- if (index >= 0) {
263
- listeners.splice(index, 1);
264
- }
387
+ let responded = false;
388
+ // Iterate over a copy so that `once` listeners can remove themselves safely.
389
+ for (const listener of [...this.messageListeners]) {
390
+ // Match against the emitted message; a listener receives the cumulatively
391
+ // transformed `current` message.
392
+ if (!listener.matches(msg)) {
393
+ continue;
394
+ }
395
+ // Listeners may be async; await each one before running the next so the
396
+ // cumulative effect on the message stays order-deterministic.
397
+ const result = await listener.fn(current);
398
+ if (listener.once) {
399
+ const index = this.messageListeners.indexOf(listener);
400
+ if (index >= 0) {
401
+ this.messageListeners.splice(index, 1);
265
402
  }
266
- if (result) {
267
- if (result.message !== undefined) {
268
- current = { ...current, message: result.message };
269
- }
270
- if (result.preventDefault) {
271
- preventDefault = true;
272
- }
403
+ }
404
+ if (result) {
405
+ if (result.message !== undefined) {
406
+ current = { ...current, message: result.message };
407
+ }
408
+ if (result.level !== undefined) {
409
+ current = { ...current, level: result.level };
410
+ }
411
+ if (result.preventDefault) {
412
+ preventDefault = true;
413
+ }
414
+ if ('respond' in result && 'defaultResponse' in msg) {
415
+ // Fold the answer into the request's default response and mark it
416
+ // answered, so we skip prompting and resolve with this value.
417
+ current = { ...current, defaultResponse: result.respond };
418
+ responded = true;
273
419
  }
274
420
  }
275
421
  }
276
- return { message: current, preventDefault };
422
+ return { message: current, preventDefault, responded };
277
423
  }
278
424
  /**
279
425
  * Notifies the host of a message.
@@ -284,10 +430,37 @@ class CliIoHost {
284
430
  // Run any registered listeners. A listener may update the message text
285
431
  // and/or prevent the default processing (e.g. stack-activity messages are
286
432
  // routed to the activity printer and not written to a stream).
287
- const { message, preventDefault } = this.applyMessageListeners(msg);
433
+ const { message, preventDefault } = await this.applyMessageListeners(msg);
434
+ // Tell observers how this message was handled (its effective form and
435
+ // whether it was dropped). Skipped while replaying corked messages so each
436
+ // message is observed exactly once.
437
+ if (!this.corkReplaying) {
438
+ this.notifyObservers({ type: 'notify', emitted: msg, effective: message, dropped: preventDefault });
439
+ }
288
440
  if (preventDefault) {
289
441
  return;
290
442
  }
443
+ this.writeMessage(message);
444
+ }
445
+ /**
446
+ * Notify every registered message observer of how a message or request was
447
+ * handled. A no-op when nothing is observing (i.e. outside of tests), so the
448
+ * surrounding hot paths pay nothing in production.
449
+ */
450
+ notifyObservers(observation) {
451
+ if (this.messageObservers.size === 0) {
452
+ return;
453
+ }
454
+ for (const observer of this.messageObservers) {
455
+ observer(observation);
456
+ }
457
+ }
458
+ /**
459
+ * Write a (already listener-processed) message to its target stream, honoring
460
+ * the log level and corked-logging buffer. Shared by `notify` and the
461
+ * non-prompting `requestResponse` path.
462
+ */
463
+ writeMessage(message) {
291
464
  if (!(0, api_private_1.isMessageRelevantForLevel)(message, this.logLevel)) {
292
465
  return;
293
466
  }
@@ -326,9 +499,14 @@ class CliIoHost {
326
499
  this.activityPrinter.notify(msg);
327
500
  return { preventDefault: true }; // handled by the printer; don't also write to a stream
328
501
  };
329
- this.on(api_private_1.IO.CDK_TOOLKIT_I5501, route);
330
- this.on(api_private_1.IO.CDK_TOOLKIT_I5502, route);
331
- this.on(api_private_1.IO.CDK_TOOLKIT_I5503, route);
502
+ // A single internal listener (so it survives `removeAllListeners()` and the
503
+ // host keeps routing stack activity) matching any of the activity codes.
504
+ this.addMessageListener({
505
+ once: false,
506
+ internal: true,
507
+ fn: route,
508
+ matches: matchAny(api_private_1.IO.CDK_TOOLKIT_I5501, api_private_1.IO.CDK_TOOLKIT_I5502, api_private_1.IO.CDK_TOOLKIT_I5503),
509
+ });
332
510
  }
333
511
  /**
334
512
  * Detect special messages encode information about whether or not
@@ -383,13 +561,38 @@ class CliIoHost {
383
561
  /**
384
562
  * Notifies the host of a message that requires a response.
385
563
  *
386
- * If the host does not return a response the suggested
387
- * default response from the input message will be used.
564
+ * Registered listeners run first: a listener may reword the question (its text
565
+ * or level) or answer it outright via `respond` (e.g. `--force` auto-confirms
566
+ * a destroy). If no listener answers and the host cannot prompt, the suggested
567
+ * default response is used.
388
568
  */
389
569
  async requestResponse(msg) {
390
- // If the request cannot be prompted for by the CliIoHost, we just accept the default
391
- if (!isPromptableRequest(msg)) {
392
- await this.notify(msg);
570
+ // Listeners run exactly once here (so we don't go back through `notify`):
571
+ // they may answer the request, or reword/relevel the question shown below.
572
+ const { message, ...listenerResult } = await this.applyMessageListeners(msg);
573
+ const response = await this.resolveRequest(message, listenerResult);
574
+ // Tell observers how this request was handled: the effective (possibly reworded) question
575
+ // and the resolved response. When a listener answered the request with the question suppressed
576
+ // (`preventDefault`, e.g. `--force` auto-confirm), it is reported as `dropped` since the user never saw it.
577
+ this.notifyObservers({ type: 'request', emitted: msg, effective: message, dropped: listenerResult.preventDefault });
578
+ return response;
579
+ }
580
+ /**
581
+ * Resolve a request to its response: a listener's answer if one was given,
582
+ * otherwise the answer prompted from the user, otherwise the suggested
583
+ * default when the host cannot prompt.
584
+ *
585
+ * Kept separate from `requestResponse` so the response can be observed in a
586
+ * single place regardless of which of these paths produced it.
587
+ */
588
+ async resolveRequest(msg, listenerResult) {
589
+ // stop processing, a listener has taken care of it
590
+ if (listenerResult.preventDefault) {
591
+ return msg.defaultResponse;
592
+ }
593
+ // if a listener provided a response, we skip interaction
594
+ if (!isPromptableRequest(msg) || listenerResult.responded) {
595
+ this.writeMessage(msg);
393
596
  return msg.defaultResponse;
394
597
  }
395
598
  const response = await this.withCorkedLogging(async () => {
@@ -410,17 +613,17 @@ class CliIoHost {
410
613
  if (this.autoRespond) {
411
614
  // respond with yes to all confirmations
412
615
  if (isConfirmationPrompt(msg)) {
413
- await this.notify({
616
+ await this.writeMessage({
414
617
  ...msg,
415
- message: `${chalk.cyan(msg.message)} (auto-confirmed)`,
618
+ message: `${chalk_1.default.cyan(msg.message)} (auto-confirmed)`,
416
619
  });
417
620
  return true;
418
621
  }
419
622
  // respond with the default for all other messages
420
623
  if (msg.defaultResponse) {
421
- await this.notify({
624
+ await this.writeMessage({
422
625
  ...msg,
423
- message: `${chalk.cyan(msg.message)} (auto-responded with default: ${util.format(msg.defaultResponse)})`,
626
+ message: `${chalk_1.default.cyan(msg.message)} (auto-responded with default: ${util.format(msg.defaultResponse)})`,
424
627
  });
425
628
  return msg.defaultResponse;
426
629
  }
@@ -435,17 +638,16 @@ class CliIoHost {
435
638
  }
436
639
  // Basic confirmation prompt
437
640
  // We treat all requests with a boolean response as confirmation prompts
641
+ // The IoHost never aborts on a "no": it returns the answer and lets the
642
+ // calling action decide what to do (so abort handling is consistent
643
+ // across actions).
438
644
  if (isConfirmationPrompt(msg)) {
439
- const confirmed = await promptly.confirm(`${chalk.cyan(msg.message)} (y/n)`);
440
- if (!confirmed) {
441
- throw new toolkit_lib_1.ToolkitError('AbortedByUser', 'Aborted by user');
442
- }
443
- return confirmed;
645
+ return promptly.confirm(`${chalk_1.default.cyan(msg.message)} (y/n)`);
444
646
  }
445
647
  // Asking for a specific value
446
648
  const prompt = extractPromptInfo(msg);
447
649
  const desc = responseDescription ?? prompt.default;
448
- const answer = await promptly.prompt(`${chalk.cyan(msg.message)}${desc ? ` (${desc})` : ''}`, {
650
+ const answer = await promptly.prompt(`${chalk_1.default.cyan(msg.message)}${desc ? ` (${desc})` : ''}`, {
449
651
  default: prompt.default,
450
652
  trim: true,
451
653
  });
@@ -492,6 +694,30 @@ class CliIoHost {
492
694
  }
493
695
  }
494
696
  exports.CliIoHost = CliIoHost;
697
+ /**
698
+ * Convert a `MessageSelector` into a predicate that decides whether a listener
699
+ * applies to a message. A maker matches messages carrying its `code`; a
700
+ * predicate (e.g. a maker's `.is`, or any `(msg) => boolean`) is used as-is.
701
+ */
702
+ function messageMatcher(selector) {
703
+ if (typeof selector === 'function') {
704
+ return selector;
705
+ }
706
+ const { code } = selector;
707
+ return (msg) => msg.code === code;
708
+ }
709
+ /**
710
+ * Combine several selectors into a single predicate that matches a message when
711
+ * *any* of them matches. Each selector may be a maker (matched by its `code`)
712
+ * or a predicate.
713
+ *
714
+ * Useful for one listener that spans multiple codes, e.g.
715
+ * `ioHost.on(matchAny(IO.CDK_TOOLKIT_I5501, IO.CDK_TOOLKIT_I5502), listener)`.
716
+ */
717
+ function matchAny(...selectors) {
718
+ const matchers = selectors.map(messageMatcher);
719
+ return (msg) => matchers.some((matches) => matches(msg));
720
+ }
495
721
  /**
496
722
  * This IoHost implementation considers a request promptable, if:
497
723
  * - it's a yes/no confirmation
@@ -522,12 +748,12 @@ function extractPromptInfo(msg) {
522
748
  };
523
749
  }
524
750
  const styleMap = {
525
- error: chalk.red,
526
- warn: chalk.yellow,
527
- result: chalk.reset,
528
- info: chalk.reset,
529
- debug: chalk.gray,
530
- trace: chalk.gray,
751
+ error: chalk_1.default.red,
752
+ warn: chalk_1.default.yellow,
753
+ result: chalk_1.default.reset,
754
+ info: chalk_1.default.reset,
755
+ debug: chalk_1.default.gray,
756
+ trace: chalk_1.default.gray,
531
757
  };
532
758
  function targetStreamObject(x) {
533
759
  switch (x) {
@@ -600,4 +826,4 @@ function hotswapToEventResult(result) {
600
826
  },
601
827
  };
602
828
  }
603
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWlvLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjbGktaW8taG9zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSxrQ0FBa0M7QUFDbEMsMEVBQWlFO0FBQ2pFLHNEQUFvRDtBQUVwRCwrQkFBK0I7QUFDL0IscUNBQXFDO0FBRXJDLDBEQUFxSTtBQUVySSxrREFBOEQ7QUFDOUQsc0VBQXFFO0FBQ3JFLDhDQUFxRDtBQUVyRCxvREFBdUQ7QUFFdkQsa0RBQXdEO0FBQ3hELG1FQUF3RTtBQUN4RSwyREFBZ0U7QUFDaEUscURBQWtEO0FBRWxELG1DQUFrQztBQXFIbEM7O0dBRUc7QUFDSCxNQUFhLFNBQVM7SUFDcEI7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQXdCLEVBQUUsRUFBRSxRQUFRLEdBQUcsS0FBSztRQUMxRCxJQUFJLFFBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEdBQUc7UUFDUixPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQWlFRCxZQUFvQixRQUF3QixFQUFFO1FBN0I5Qzs7Ozs7V0FLRztRQUNJLHVCQUFrQixHQUFpQixRQUFRLENBQUM7UUFFM0MsY0FBUyxHQUEwQiw4QkFBcUIsQ0FBQyxHQUFHLENBQUM7UUFLckUsaUJBQWlCO1FBQ1Qsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDVCx3QkFBbUIsR0FBeUIsRUFBRSxDQUFDO1FBRWhFLHFGQUFxRjtRQUNwRSxxQkFBZ0IsR0FBRyxJQUFJLEdBQUcsRUFBb0MsQ0FBQztRQVk5RSxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLElBQUks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Q3pCLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNqQixLQUFLLEVBQUU7Z0JBQ0wsSUFBSSxFQUFFLElBQUEsdUJBQWUsRUFBQyxNQUFNLENBQUMsS0FBSyxDQUFDO2FBQ3BDO1NBQ0YsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1AsUUFBUSxFQUFFO1lBQ1IsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyQyxlQUFlLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9DLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNO1lBQ3RELHNCQUFzQixFQUFFLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNO1lBQzVELEdBQUcsd0JBQXdCO1NBQzVCO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEFnZW50IH0gZnJvbSAnbm9kZTpodHRwcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJ25vZGU6dXRpbCc7XG5pbXBvcnQgeyBSZXF1aXJlQXBwcm92YWwgfSBmcm9tICdAYXdzLWNkay9jbG91ZC1hc3NlbWJseS1zY2hlbWEnO1xuaW1wb3J0IHsgVG9vbGtpdEVycm9yIH0gZnJvbSAnQGF3cy1jZGsvdG9vbGtpdC1saWInO1xuaW1wb3J0IHR5cGUgeyBIb3Rzd2FwUmVzdWx0LCBJSW9Ib3N0LCBJb01lc3NhZ2UsIElvTWVzc2FnZUNvZGUsIElvTWVzc2FnZUxldmVsLCBJb1JlcXVlc3QsIFRvb2xraXRBY3Rpb24gfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgKiBhcyBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBwcm9tcHRseSBmcm9tICdwcm9tcHRseSc7XG5pbXBvcnQgdHlwZSB7IElvSGVscGVyLCBBY3Rpdml0eVByaW50ZXJQcm9wcywgSUFjdGl2aXR5UHJpbnRlciwgSW9NZXNzYWdlTWFrZXIsIElvRGVmYXVsdE1lc3NhZ2VzIH0gZnJvbSAnLi4vLi4vLi4vbGliL2FwaS1wcml2YXRlJztcbmltcG9ydCB7IGFzSW9IZWxwZXIsIElPLCBpc01lc3NhZ2VSZWxldmFudEZvckxldmVsLCBDdXJyZW50QWN0aXZpdHlQcmludGVyLCBIaXN0b3J5QWN0aXZpdHlQcmludGVyIH0gZnJvbSAnLi4vLi4vLi4vbGliL2FwaS1wcml2YXRlJztcbmltcG9ydCB0eXBlIHsgQ29udGV4dCB9IGZyb20gJy4uLy4uL2FwaS9jb250ZXh0JztcbmltcG9ydCB7IFN0YWNrQWN0aXZpdHlQcm9ncmVzcyB9IGZyb20gJy4uLy4uL2NvbW1hbmRzL2RlcGxveSc7XG5pbXBvcnQgeyBjYW5Db2xsZWN0VGVsZW1ldHJ5IH0gZnJvbSAnLi4vdGVsZW1ldHJ5L2NvbGxlY3QtdGVsZW1ldHJ5JztcbmltcG9ydCB7IGNka0NsaUVycm9yTmFtZSB9IGZyb20gJy4uL3RlbGVtZXRyeS9lcnJvcic7XG5pbXBvcnQgdHlwZSB7IEV2ZW50UmVzdWx0IH0gZnJvbSAnLi4vdGVsZW1ldHJ5L21lc3NhZ2VzJztcbmltcG9ydCB7IENMSV9QUklWQVRFX0lPIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L21lc3NhZ2VzJztcbmltcG9ydCB0eXBlIHsgVGVsZW1ldHJ5RXZlbnQgfSBmcm9tICcuLi90ZWxlbWV0cnkvc2Vzc2lvbic7XG5pbXBvcnQgeyBUZWxlbWV0cnlTZXNzaW9uIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L3Nlc3Npb24nO1xuaW1wb3J0IHsgRW5kcG9pbnRUZWxlbWV0cnlTaW5rIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L3NpbmsvZW5kcG9pbnQtc2luayc7XG5pbXBvcnQgeyBGaWxlVGVsZW1ldHJ5U2luayB9IGZyb20gJy4uL3RlbGVtZXRyeS9zaW5rL2ZpbGUtc2luayc7XG5pbXBvcnQgeyBGdW5uZWwgfSBmcm9tICcuLi90ZWxlbWV0cnkvc2luay9mdW5uZWwnO1xuaW1wb3J0IHR5cGUgeyBJVGVsZW1ldHJ5U2luayB9IGZyb20gJy4uL3RlbGVtZXRyeS9zaW5rL3NpbmstaW50ZXJmYWNlJztcbmltcG9ydCB7IGlzQ0kgfSBmcm9tICcuLi91dGlsL2NpJztcblxuZXhwb3J0IHR5cGUgeyBJSW9Ib3N0LCBJb01lc3NhZ2UsIElvTWVzc2FnZUNvZGUsIElvTWVzc2FnZUxldmVsLCBJb1JlcXVlc3QgfTtcblxuLyoqXG4gKiBUaGUgY3VycmVudCBhY3Rpb24gYmVpbmcgcGVyZm9ybWVkIGJ5IHRoZSBDTEkuICdub25lJyByZXByZXNlbnRzIHRoZSBhYnNlbmNlIG9mIGFuIGFjdGlvbi5cbiAqL1xudHlwZSBDbGlBY3Rpb24gPVxuICB8IFRvb2xraXRBY3Rpb25cbiAgfCAnY29udGV4dCdcbiAgfCAnZG9jcydcbiAgfCAnZmxhZ3MnXG4gIHwgJ25vdGljZXMnXG4gIHwgJ3ZlcnNpb24nXG4gIHwgJ2NsaS10ZWxlbWV0cnknXG4gIHwgJ25vbmUnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENsaUlvSG9zdFByb3BzIHtcbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIFRvb2xraXQgYWN0aW9uIHRoZSBob3N0cyBzdGFydHMgd2l0aC5cbiAgICpcbiAgICogQGRlZmF1bHQgJ25vbmUnXG4gICAqL1xuICByZWFkb25seSBjdXJyZW50QWN0aW9uPzogQ2xpQWN0aW9uO1xuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSB2ZXJib3NpdHkgb2YgdGhlIG91dHB1dC5cbiAgICpcbiAgICogVGhlIENsaUlvSG9zdCB3aWxsIHN0aWxsIHJlY2VpdmUgYWxsIG1lc3NhZ2VzIGFuZCByZXF1ZXN0cyxcbiAgICogYnV0IG9ubHkgdGhlIG1lc3NhZ2VzIGluY2x1ZGVkIGluIHRoaXMgbGV2ZWwgd2lsbCBiZSBwcmludGVkLlxuICAgKlxuICAgKiBAZGVmYXVsdCAnaW5mbydcbiAgICovXG4gIHJlYWRvbmx5IGxvZ0xldmVsPzogSW9NZXNzYWdlTGV2ZWw7XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyB0aGUgYXV0b21hdGljIFRUWSBkZXRlY3Rpb24uXG4gICAqXG4gICAqIFdoZW4gVFRZIGlzIGRpc2FibGVkLCB0aGUgQ0xJIHdpbGwgaGF2ZSBubyBpbnRlcmFjdGlvbnMgb3IgY29sb3IuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGV0ZXJtaW5lZCBmcm9tIHRoZSBjdXJyZW50IHByb2Nlc3NcbiAgICovXG4gIHJlYWRvbmx5IGlzVFRZPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgQ2xpSW9Ib3N0IGlzIHJ1bm5pbmcgaW4gQ0kgbW9kZS5cbiAgICpcbiAgICogSW4gQ0kgbW9kZSwgYWxsIG5vbi1lcnJvciBvdXRwdXQgZ29lcyB0byBzdGRvdXQgaW5zdGVhZCBvZiBzdGRlcnIuXG4gICAqIFNldCB0byBmYWxzZSBpbiB0aGUgQ2xpSW9Ib3N0IGNvbnN0cnVjdG9yIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gaWYgdGhlIENMSSBDSSBhcmd1bWVudCBpcyBwYXNzZWRcbiAgICpcbiAgICogQGRlZmF1bHQgLSBkZXRlcm1pbmVkIGZyb20gdGhlIGVudmlyb25tZW50LCBzcGVjaWZpY2FsbHkgYmFzZWQgb24gYHByb2Nlc3MuZW52LkNJYFxuICAgKi9cbiAgcmVhZG9ubHkgaXNDST86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluIHdoYXQgc2NlbmFyaW9zIHNob3VsZCB0aGUgQ2xpSW9Ib3N0IGFzayBmb3IgYXBwcm92YWxcbiAgICpcbiAgICogQGRlZmF1bHQgUmVxdWlyZUFwcHJvdmFsLkJST0FERU5JTkdcbiAgICovXG4gIHJlYWRvbmx5IHJlcXVpcmVEZXBsb3lBcHByb3ZhbD86IFJlcXVpcmVBcHByb3ZhbDtcblxuICAvKipcbiAgICogVGhlIGluaXRpYWwgVG9vbGtpdCBhY3Rpb24gdGhlIGhvc3RzIHN0YXJ0cyB3aXRoLlxuICAgKlxuICAgKiBAZGVmYXVsdCBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuQkFSXG4gICAqL1xuICByZWFkb25seSBzdGFja1Byb2dyZXNzPzogU3RhY2tBY3Rpdml0eVByb2dyZXNzO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBDTEkgc2hvdWxkIGF0dGVtcHQgdG8gYXV0b21hdGljYWxseSByZXNwb25kIHRvIHByb21wdHMuXG4gICAqXG4gICAqIFdoZW4gdHJ1ZSwgb3BlcmF0aW9uIHdpbGwgdXN1YWxseSBwcm9jZWVkIHdpdGhvdXQgaW50ZXJhY3RpdmUgY29uZmlybWF0aW9uLlxuICAgKiBDb25maXJtYXRpb25zIGFyZSByZXNwb25kZWQgdG8gd2l0aCB5ZXMuIE90aGVyIHByb21wdHMgd2lsbCByZXNwb25kIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBhdXRvUmVzcG9uZD86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSB0eXBlIGZvciBjb25maWd1cmluZyBhIHRhcmdldCBzdHJlYW1cbiAqL1xuZXhwb3J0IHR5cGUgVGFyZ2V0U3RyZWFtID0gJ3N0ZG91dCcgfCAnc3RkZXJyJyB8ICdkcm9wJztcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGEgbWVzc2FnZSBsaXN0ZW5lciBtYXkgcmV0dXJuIHRvIGluZmx1ZW5jZSBob3cgYSBtZXNzYWdlIGlzIGhhbmRsZWQuXG4gKlxuICogQSBsaXN0ZW5lciBjYW4gb25seSB1cGRhdGUgdGhlIG1lc3NhZ2UgX3RleHRfOyBpdCBjYW5ub3QgY2hhbmdlIGFueSBvdGhlclxuICogZmllbGQgb2YgdGhlIG1lc3NhZ2UgKHN1Y2ggYXMgaXRzIGBjb2RlYCksIHdoaWNoIGtlZXBzIHRoZSBjb2RlLWtleWVkXG4gKiBsaXN0ZW5lciByZWdpc3RyeSB2YWxpZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlTGlzdGVuZXJSZXN1bHQge1xuICAvKipcbiAgICogUmVwbGFjZSB0aGUgdGV4dCB0aGF0IGlzIHByaW50ZWQgZm9yIHRoaXMgbWVzc2FnZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgbWVzc2FnZSB0ZXh0IGlzIGxlZnQgdW5jaGFuZ2VkXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTa2lwIHRoZSBkZWZhdWx0IHByb2Nlc3Npbmcgb2YgdGhlIG1lc3NhZ2UsIGkuZS4gZG8gbm90IHdyaXRlIGl0IHRvIGEgc3RyZWFtLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgcHJldmVudERlZmF1bHQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgcmVnaXN0ZXJlZCBtZXNzYWdlIGxpc3RlbmVyLiBJdHMgcmV0dXJuIHZhbHVlIChpZiBhbnkpIG1heSB1cGRhdGUgdGhlXG4gKiBtZXNzYWdlIHRleHQgYW5kL29yIHByZXZlbnQgdGhlIGRlZmF1bHQgcHJvY2Vzc2luZy5cbiAqL1xudHlwZSBNZXNzYWdlTGlzdGVuZXJGbiA9IChtc2c6IElvTWVzc2FnZTxhbnk+KSA9PiB2b2lkIHwgTWVzc2FnZUxpc3RlbmVyUmVzdWx0O1xuaW50ZXJmYWNlIE1lc3NhZ2VMaXN0ZW5lciB7XG4gIHJlYWRvbmx5IG9uY2U6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGZuOiBNZXNzYWdlTGlzdGVuZXJGbjtcbn1cblxuLyoqXG4gKiBBIHNpbXBsZSBJTyBob3N0IGZvciB0aGUgQ0xJIHRoYXQgd3JpdGVzIG1lc3NhZ2VzIHRvIHRoZSBjb25zb2xlLlxuICovXG5leHBvcnQgY2xhc3MgQ2xpSW9Ib3N0IGltcGxlbWVudHMgSUlvSG9zdCB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBpbnN0YW5jZShwcm9wczogQ2xpSW9Ib3N0UHJvcHMgPSB7fSwgZm9yY2VOZXcgPSBmYWxzZSk6IENsaUlvSG9zdCB7XG4gICAgaWYgKGZvcmNlTmV3IHx8ICFDbGlJb0hvc3QuX2luc3RhbmNlKSB7XG4gICAgICBDbGlJb0hvc3QuX2luc3RhbmNlID0gbmV3IENsaUlvSG9zdChwcm9wcyk7XG4gICAgfVxuICAgIHJldHVybiBDbGlJb0hvc3QuX2luc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBpZiBpdCBleGlzdHNcbiAgICovXG4gIHN0YXRpYyBnZXQoKTogQ2xpSW9Ib3N0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gQ2xpSW9Ib3N0Ll9pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIENsaUlvSG9zdFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBDbGlJb0hvc3QgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGFjdGlvbiBiZWluZyBwZXJmb3JtZWQgYnkgdGhlIENMSS5cbiAgICovXG4gIHB1YmxpYyBjdXJyZW50QWN0aW9uOiBDbGlBY3Rpb247XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIENsaUlvSG9zdCBpcyBydW5uaW5nIGluIENJIG1vZGUuXG4gICAqXG4gICAqIEluIENJIG1vZGUsIGFsbCBub24tZXJyb3Igb3V0cHV0IGdvZXMgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyLlxuICAgKi9cbiAgcHVibGljIGlzQ0k6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGhvc3QgY2FuIHVzZSBpbnRlcmFjdGlvbnMgYW5kIG1lc3NhZ2Ugc3R5bGluZy5cbiAgICovXG4gIHB1YmxpYyBpc1RUWTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdGhyZXNob2xkLlxuICAgKlxuICAgKiBNZXNzYWdlcyB3aXRoIGEgbG93ZXIgcHJpb3JpdHkgbGV2ZWwgd2lsbCBiZSBpZ25vcmVkLlxuICAgKi9cbiAgcHVibGljIGxvZ0xldmVsOiBJb01lc3NhZ2VMZXZlbDtcblxuICAvKipcbiAgICogVGhlIGNvbmRpdGlvbnMgZm9yIHJlcXVpcmluZyBhcHByb3ZhbCBpbiB0aGlzIENsaUlvSG9zdC5cbiAgICovXG4gIHB1YmxpYyByZXF1aXJlRGVwbG95QXBwcm92YWw6IFJlcXVpcmVBcHByb3ZhbDtcblxuICAvKipcbiAgICogQ29uZmlndXJlIHRoZSB0YXJnZXQgc3RyZWFtIGZvciBub3RpY2VzXG4gICAqXG4gICAqIChOb3QgYSBzZXR0ZXIgYmVjYXVzZSB0aGVyZSdzIG5vIG5lZWQgZm9yIGFkZGl0aW9uYWwgbG9naWMgd2hlbiB0aGlzIHZhbHVlXG4gICAqIGlzIGNoYW5nZWQgeWV0KVxuICAgKi9cbiAgcHVibGljIG5vdGljZXNEZXN0aW5hdGlvbjogVGFyZ2V0U3RyZWFtID0gJ3N0ZGVycic7XG5cbiAgcHJpdmF0ZSBfcHJvZ3Jlc3M6IFN0YWNrQWN0aXZpdHlQcm9ncmVzcyA9IFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5CQVI7XG5cbiAgLy8gU3RhY2sgQWN0aXZpdHkgUHJpbnRlclxuICBwcml2YXRlIGFjdGl2aXR5UHJpbnRlcj86IElBY3Rpdml0eVByaW50ZXI7XG5cbiAgLy8gQ29ya2VkIExvZ2dpbmdcbiAgcHJpdmF0ZSBjb3JrZWRDb3VudGVyID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb3JrZWRMb2dnaW5nQnVmZmVyOiBJb01lc3NhZ2U8dW5rbm93bj5bXSA9IFtdO1xuXG4gIC8vIE1lc3NhZ2UgbGlzdGVuZXJzLCBrZXllZCBieSBtZXNzYWdlIGNvZGUuIFNlZSBgb25gL2BvbmNlYC9gcmV3cml0ZWAvYHJld3JpdGVPbmNlYC5cbiAgcHJpdmF0ZSByZWFkb25seSBtZXNzYWdlTGlzdGVuZXJzID0gbmV3IE1hcDxJb01lc3NhZ2VDb2RlLCBNZXNzYWdlTGlzdGVuZXJbXT4oKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGF1dG9SZXNwb25kOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdGVsZW1ldHJ5IHNlc3Npb24gb2JqZWN0XG4gICAqXG4gICAqIFdpbGwgcmVtYWluIGB1bmRlZmluZWRgIGlmIHRoZSB1c2VyIGhhcyBkaXNhYmxlZCB0ZWxlbWV0cnkuXG4gICAqL1xuICBwdWJsaWMgdGVsZW1ldHJ5PzogVGVsZW1ldHJ5U2Vzc2lvbjtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHByb3BzOiBDbGlJb0hvc3RQcm9wcyA9IHt9KSB7XG4gICAgdGhpcy5jdXJyZW50QWN0aW9uID0gcHJvcHMuY3VycmVudEFjdGlvbiA/PyAnbm9uZSc7XG4gICAgdGhpcy5pc1RUWSA9IHByb3BzLmlzVFRZID8/IHByb2Nlc3Muc3Rkb3V0LmlzVFRZID8/IGZhbHNlO1xuICAgIHRoaXMubG9nTGV2ZWwgPSBwcm9wcy5sb2dMZXZlbCA/PyAnaW5mbyc7XG4gICAgdGhpcy5pc0NJID0gcHJvcHMuaXNDSSA/PyBpc0NJKCk7XG4gICAgdGhpcy5yZXF1aXJlRGVwbG95QXBwcm92YWwgPSBwcm9wcy5yZXF1aXJlRGVwbG95QXBwcm92YWwgPz8gUmVxdWlyZUFwcHJvdmFsLkJST0FERU5JTkc7XG4gICAgdGhpcy5zdGFja1Byb2dyZXNzID0gcHJvcHMuc3RhY2tQcm9ncmVzcyA/PyBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuQkFSO1xuICAgIHRoaXMuYXV0b1Jlc3BvbmQgPSBwcm9wcy5hdXRvUmVzcG9uZCA/PyBmYWxzZTtcblxuICAgIC8vIFN0YWNrLWFjdGl2aXR5IG1lc3NhZ2VzIGFyZSBoYW5kbGVkIGJ5IHRoZSBhY3Rpdml0eSBwcmludGVyIHJhdGhlciB0aGFuXG4gICAgLy8gd3JpdHRlbiB0byBhIHN0cmVhbS4gVGhpcyBpcyB3aXJlZCB1cCBhcyBtZXNzYWdlIGxpc3RlbmVycy5cbiAgICB0aGlzLnJvdXRlU3RhY2tBY3Rpdml0eVRvUHJpbnRlcigpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHN0YXJ0VGVsZW1ldHJ5KGFyZ3M6IGFueSwgY29udGV4dDogQ29udGV4dCwgcHJveHlBZ2VudD86IEFnZW50KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBjb25maWcgPSByZXF1aXJlKCcuLi9jbGktdHlwZS1yZWdpc3RyeS5qc29uJyk7XG4gICAgY29uc3QgdmFsaWRDb21tYW5kcyA9IE9iamVjdC5rZXlzKGNvbmZpZy5jb21tYW5kcyk7XG4gICAgY29uc3QgY21kID0gYXJncy5fWzBdO1xuICAgIGlmICghdmFsaWRDb21tYW5kcy5pbmNsdWRlcyhjbWQpKSB7XG4gICAgICAvLyB0aGUgdXNlciB0eXBlZCBpbiBhbiBpbnZhbGlkIGNvbW1hbmQgLSBubyBuZWVkIGZvciB0ZWxlbWV0cnkgc2luY2UgdGhlIGludm9jYXRpb24gaXMgZ29pbmcgdG8gZmFpbFxuICAgICAgLy8gaW1taW5lbnRseSBhbnl3YXkuXG4gICAgICBhd2FpdCB0aGlzLmFzSW9IZWxwZXIoKS5kZWZhdWx0cy50cmFjZShgU2Vzc2lvbiBpbnN0YW50aWF0ZWQgd2l0aCBhbiBpbnZhbGlkIGNvbW1hbmQgKCR7Y21kfSkuIE5vdCBzdGFydGluZyB0ZWxlbWV0cnkuYCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHNpbmtzOiBJVGVsZW1ldHJ5U2lua1tdID0gW107XG4gICAgY29uc3QgdGVsZW1ldHJ5RmlsZVBhdGggPSBhcmdzWyd0ZWxlbWV0cnktZmlsZSddO1xuICAgIGlmICh0ZWxlbWV0cnlGaWxlUGF0aCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2lua3MucHVzaChuZXcgRmlsZVRlbGVtZXRyeVNpbmsoe1xuICAgICAgICAgIGlvSG9zdDogdGhpcyxcbiAgICAgICAgICBsb2dGaWxlUGF0aDogdGVsZW1ldHJ5RmlsZVBhdGgsXG4gICAgICAgIH0pKTtcbiAgICAgICAgYXdhaXQgdGhpcy5hc0lvSGVscGVyKCkuZGVmYXVsdHMudHJhY2UoJ0ZpbGUgVGVsZW1ldHJ5IGNvbm5lY3RlZCcpO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXNJb0hlbHBlcigpLmRlZmF1bHRzLnRyYWNlKGBGaWxlIFRlbGVtZXRyeSBpbnN0YW50aWF0aW9uIGZhaWxlZDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGVsZW1ldHJ5RW5kcG9pbnQgPSBwcm9jZXNzLmVudi5URUxFTUVUUllfRU5EUE9JTlQgPz8gJ2h0dHBzOi8vY2RrLWNsaS10ZWxlbWV0cnkudXMtZWFzdC0xLmFwaS5hd3MvbWV0cmljcyc7XG4gICAgaWYgKGNhbkNvbGxlY3RUZWxlbWV0cnkoYXJncywgY29udGV4dCkgJiYgdGVsZW1ldHJ5RW5kcG9pbnQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNpbmtzLnB1c2gobmV3IEVuZHBvaW50VGVsZW1ldHJ5U2luayh7XG4gICAgICAgICAgaW9Ib3N0OiB0aGlzLFxuICAgICAgICAgIGFnZW50OiBwcm94eUFnZW50LFxuICAgICAgICAgIGVuZHBvaW50OiB0ZWxlbWV0cnlFbmRwb2ludCxcbiAgICAgICAgfSkpO1xuICAgICAgICBhd2FpdCB0aGlzLmFzSW9IZWxwZXIoKS5kZWZhdWx0cy50cmFjZSgnRW5kcG9pbnQgVGVsZW1ldHJ5IGNvbm5lY3RlZCcpO1xuICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXNJb0hlbHBlcigpLmRlZmF1bHRzLnRyYWNlKGBFbmRwb2ludCBUZWxlbWV0cnkgaW5zdGFudGlhdGlvbiBmYWlsZWQ6ICR7ZS5tZXNzYWdlfWApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCB0aGlzLmFzSW9IZWxwZXIoKS5kZWZhdWx0cy50cmFjZSgnRW5kcG9pbnQgVGVsZW1ldHJ5IE5PVCBjb25uZWN0ZWQnKTtcbiAgICB9XG5cbiAgICBpZiAoc2lua3MubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy50ZWxlbWV0cnkgPSBuZXcgVGVsZW1ldHJ5U2Vzc2lvbih7XG4gICAgICAgIGlvSG9zdDogdGhpcyxcbiAgICAgICAgY2xpZW50OiBuZXcgRnVubmVsKHsgc2lua3MgfSksXG4gICAgICAgIGFyZ3VtZW50czogYXJncyxcbiAgICAgICAgY29udGV4dDogY29udGV4dCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGF3YWl0IHRoaXMudGVsZW1ldHJ5Py5iZWdpbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgc3RhY2tQcm9ncmVzcyBwcmVmZXJlbmNlLlxuICAgKi9cbiAgcHVibGljIHNldCBzdGFja1Byb2dyZXNzKHR5cGU6IFN0YWNrQWN0aXZpdHlQcm9ncmVzcykge1xuICAgIHRoaXMuX3Byb2dyZXNzID0gdHlwZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzdGFja1Byb2dyZXNzIHZhbHVlLlxuICAgKlxuICAgKiBUaGlzIHRha2VzIGludG8gYWNjb3VudCBvdGhlciBzdGF0ZSBvZiB0aGUgaW9Ib3N0LFxuICAgKiBsaWtlIGlmIGlzVFRZIGFuZCBpc0NJLlxuICAgKi9cbiAgcHVibGljIGdldCBzdGFja1Byb2dyZXNzKCk6IFN0YWNrQWN0aXZpdHlQcm9ncmVzcyB7XG4gICAgLy8gV2UgY2FuIGFsd2F5cyB1c2UgRVZFTlRTXG4gICAgaWYgKHRoaXMuX3Byb2dyZXNzID09PSBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MuRVZFTlRTKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcHJvZ3Jlc3M7XG4gICAgfVxuXG4gICAgLy8gaWYgYSBkZWJ1ZyBtZXNzYWdlIChhbmQgdGh1cyBhbnkgbW9yZSB2ZXJib3NlIG1lc3NhZ2VzKSBhcmUgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgbG9nIGxldmVsLCB3ZSBoYXZlIHZlcmJvc2UgbG9nZ2luZ1xuICAgIGNvbnN0IHZlcmJvc2VMb2dnaW5nID0gaXNNZXNzYWdlUmVsZXZhbnRGb3JMZXZlbCh7IGxldmVsOiAnZGVidWcnIH0sIHRoaXMubG9nTGV2ZWwpO1xuICAgIGlmICh2ZXJib3NlTG9nZ2luZykge1xuICAgICAgcmV0dXJuIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFM7XG4gICAgfVxuXG4gICAgLy8gT24gV2luZG93cyB3ZSBjYW5ub3QgdXNlIGZhbmN5IG91dHB1dFxuICAgIGNvbnN0IGlzV2luZG93cyA9IHByb2Nlc3MucGxhdGZvcm0gPT09ICd3aW4zMic7XG4gICAgaWYgKGlzV2luZG93cykge1xuICAgICAgcmV0dXJuIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFM7XG4gICAgfVxuXG4gICAgLy8gT24gc29tZSBDSSBzeXN0ZW1zIChzdWNoIGFzIENpcmNsZUNJKSBvdXRwdXQgc3RpbGwgcmVwb3J0cyBhcyBhIFRUWSBzbyB3ZSBhbHNvXG4gICAgLy8gbmVlZCBhbiBpbmRpdmlkdWFsIGNoZWNrIGZvciB3aGV0aGVyIHdlJ3JlIHJ1bm5pbmcgb24gQ0kuXG4gICAgLy8gc2VlOiBodHRwczovL2Rpc2N1c3MuY2lyY2xlY2kuY29tL3QvY2lyY2xlY2ktdGVybWluYWwtaXMtYS10dHktYnV0LXRlcm0taXMtbm90LXNldC85OTY1XG4gICAgY29uc3QgZmFuY3lPdXRwdXRBdmFpbGFibGUgPSB0aGlzLmlzVFRZICYmICF0aGlzLmlzQ0k7XG4gICAgaWYgKCFmYW5jeU91dHB1dEF2YWlsYWJsZSkge1xuICAgICAgcmV0dXJuIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFM7XG4gICAgfVxuXG4gICAgLy8gVXNlIHRoZSB1c2VyIHByZWZlcmVuY2VcbiAgICByZXR1cm4gdGhpcy5fcHJvZ3Jlc3M7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlZmF1bHRzKCk6IElvRGVmYXVsdE1lc3NhZ2VzIHtcbiAgICByZXR1cm4gdGhpcy5hc0lvSGVscGVyKCkuZGVmYXVsdHM7XG4gIH1cblxuICBwdWJsaWMgYXNJb0hlbHBlcigpOiBJb0hlbHBlciB7XG4gICAgcmV0dXJuIGFzSW9IZWxwZXIodGhpcywgdGhpcy5jdXJyZW50QWN0aW9uIGFzIGFueSk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgYSBibG9jayBvZiBjb2RlIHdpdGggY29ya2VkIGxvZ2dpbmcuIEFsbCBsb2cgbWVzc2FnZXMgZHVyaW5nIGV4ZWN1dGlvblxuICAgKiBhcmUgYnVmZmVyZWQgYW5kIG9ubHkgd3JpdHRlbiB3aGVuIGFsbCBuZXN0ZWQgY29yayBibG9ja3MgY29tcGxldGUgKHdoZW4gQ09SS19DT1VOVEVSIHJlYWNoZXMgMCkuXG4gICAqIFRoZSBjb3JraW5nIGlzIGJvdW5kIHRvIHRoZSBzcGVjaWZpYyBpbnN0YW5jZSBvZiB0aGUgQ2xpSW9Ib3N0LlxuICAgKlxuICAgKiBAcGFyYW0gYmxvY2sgLSBBc3luYyBmdW5jdGlvbiB0byBleGVjdXRlIHdpdGggY29ya2VkIGxvZ2dpbmdcbiAgICogQHJldHVybnMgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGJsb2NrJ3MgcmV0dXJuIHZhbHVlXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgd2l0aENvcmtlZExvZ2dpbmc8VD4oYmxvY2s6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICB0aGlzLmNvcmtlZENvdW50ZXIrKztcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIGF3YWl0IGJsb2NrKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuY29ya2VkQ291bnRlci0tO1xuICAgICAgaWYgKHRoaXMuY29ya2VkQ291bnRlciA9PT0gMCkge1xuICAgICAgICAvLyBQcm9jZXNzIGVhY2ggYnVmZmVyZWQgbWVzc2FnZSB0aHJvdWdoIG5vdGlmeVxuICAgICAgICBmb3IgKGNvbnN0IGlvTWVzc2FnZSBvZiB0aGlzLmNvcmtlZExvZ2dpbmdCdWZmZXIpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLm5vdGlmeShpb01lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHJlbW92ZSBhbGwgYnVmZmVyZWQgbWVzc2FnZXMgaW4tcGxhY2VcbiAgICAgICAgdGhpcy5jb3JrZWRMb2dnaW5nQnVmZmVyLnNwbGljZSgwKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsaXN0ZW5lciB0aGF0IGlzIGludm9rZWQgZm9yIGV2ZXJ5IG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gY29kZS5cbiAgICpcbiAgICogVGhlIGxpc3RlbmVyIG1heSByZXR1cm4gYSBgTWVzc2FnZUxpc3RlbmVyUmVzdWx0YCB0byB1cGRhdGUgdGhlIG1lc3NhZ2VcbiAgICogdGV4dCBhbmQvb3IgcHJldmVudCB0aGUgZGVmYXVsdCBwcm9jZXNzaW5nICh3cml0aW5nIGl0IHRvIGEgc3RyZWFtKTtcbiAgICogcmV0dXJuaW5nIG5vdGhpbmcgbGVhdmVzIHRoZSBtZXNzYWdlIHVudG91Y2hlZC4gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXRcbiAgICogcmVtb3ZlcyB0aGUgbGlzdGVuZXIgYWdhaW4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGRpc3Bvc2UgPSBpb0hvc3Qub24oSU8uQ0RLX1RPT0xLSVRfSTI5MDEsIChtc2cpID0+IHtcbiAgICogICBteUNvdW50ICs9IG1zZy5kYXRhLnN0YWNrcy5sZW5ndGg7XG4gICAqIH0pO1xuICAgKi9cbiAgcHVibGljIG9uPFQ+KGNvZGU6IElvTWVzc2FnZU1ha2VyPFQ+LCBsaXN0ZW5lcjogKG1zZzogSW9NZXNzYWdlPFQ+KSA9PiB2b2lkIHwgTWVzc2FnZUxpc3RlbmVyUmVzdWx0KTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuYWRkTWVzc2FnZUxpc3RlbmVyKGNvZGUuY29kZSwgeyBvbmNlOiBmYWxzZSwgZm46IGxpc3RlbmVyIGFzIE1lc3NhZ2VMaXN0ZW5lckZuIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExpa2UgYG9uYCwgYnV0IHRoZSBsaXN0ZW5lciBpcyBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgYWZ0ZXIgaXQgaGFzIGJlZW5cbiAgICogaW52b2tlZCBvbmNlLlxuICAgKi9cbiAgcHVibGljIG9uY2U8VD4oY29kZTogSW9NZXNzYWdlTWFrZXI8VD4sIGxpc3RlbmVyOiAobXNnOiBJb01lc3NhZ2U8VD4pID0+IHZvaWQgfCBNZXNzYWdlTGlzdGVuZXJSZXN1bHQpOiAoKSA9PiB2b2lkIHtcbiAgICByZXR1cm4gdGhpcy5hZGRNZXNzYWdlTGlzdGVuZXIoY29kZS5jb2RlLCB7IG9uY2U6IHRydWUsIGZuOiBsaXN0ZW5lciBhcyBNZXNzYWdlTGlzdGVuZXJGbiB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGZvcm1hdHRlciB0aGF0IHJlcGxhY2VzIHRoZSBwcmludGVkIHRleHQgb2YgbWVzc2FnZXMgd2l0aCB0aGVcbiAgICogZ2l2ZW4gY29kZS4gVGhpcyBsZXRzIGEgY2FsbGVyIGRlZmluZSBfaG93XyBhIHRvb2xraXQgbWVzc2FnZSBpcyBwcmVzZW50ZWRcbiAgICogd2l0aG91dCB0aGUgSW9Ib3N0IG5lZWRpbmcgdG8ga25vdyBhYm91dCBpdC5cbiAgICpcbiAgICogU3ludGFjdGljIHN1Z2FyIGZvciBhbiBgb25gIGxpc3RlbmVyIHRoYXQgcmV0dXJucyBgeyBtZXNzYWdlIH1gLiBSZXR1cm5zIGFcbiAgICogZnVuY3Rpb24gdGhhdCByZW1vdmVzIHRoZSBmb3JtYXR0ZXIgYWdhaW4uXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IGRpc3Bvc2UgPSBpb0hvc3QucmV3cml0ZShJTy5DREtfVE9PTEtJVF9JMjkwMSwgKG1zZykgPT5cbiAgICogICBzZXJpYWxpemVTdHJ1Y3R1cmUobXNnLmRhdGEuc3RhY2tzLCB0cnVlKSk7XG4gICAqL1xuICBwdWJsaWMgcmV3cml0ZTxUPihjb2RlOiBJb01lc3NhZ2VNYWtlcjxUPiwgZm9ybWF0dGVyOiAobXNnOiBJb01lc3NhZ2U8VD4pID0+IHN0cmluZyk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm9uKGNvZGUsIChtc2cpID0+ICh7IG1lc3NhZ2U6IGZvcm1hdHRlcihtc2cpIH0pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWtlIGByZXdyaXRlYCwgYnV0IHRoZSBmb3JtYXR0ZXIgaXMgYXV0b21hdGljYWxseSByZW1vdmVkIGFmdGVyIGl0IGhhc1xuICAgKiBiZWVuIGFwcGxpZWQgb25jZS5cbiAgICovXG4gIHB1YmxpYyByZXdyaXRlT25jZTxUPihjb2RlOiBJb01lc3NhZ2VNYWtlcjxUPiwgZm9ybWF0dGVyOiAobXNnOiBJb01lc3NhZ2U8VD4pID0+IHN0cmluZyk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm9uY2UoY29kZSwgKG1zZykgPT4gKHsgbWVzc2FnZTogZm9ybWF0dGVyKG1zZykgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGxpc3RlbmVyIHRvIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCByZW1vdmVzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRNZXNzYWdlTGlzdGVuZXIoY29kZTogSW9NZXNzYWdlQ29kZSwgbGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIGNvbnN0IGxpc3RlbmVycyA9IHRoaXMubWVzc2FnZUxpc3RlbmVycy5nZXQoY29kZSkgPz8gW107XG4gICAgbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpO1xuICAgIHRoaXMubWVzc2FnZUxpc3RlbmVycy5zZXQoY29kZSwgbGlzdGVuZXJzKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUnVuIGFsbCByZWdpc3RlcmVkIGxpc3RlbmVycyBmb3IgYSBtZXNzYWdlJ3MgY29kZSwgaW4gcmVnaXN0cmF0aW9uIG9yZGVyLlxuICAgKlxuICAgKiBBIGxpc3RlbmVyIG1heSB1cGRhdGUgdGhlIG1lc3NhZ2UgdGV4dCAod2hpY2ggaXMgcGFzc2VkIG9uIHRvIHN1YnNlcXVlbnRcbiAgICogbGlzdGVuZXJzIGFuZCB0aGUgcmVzdCBvZiB0aGUgcGlwZWxpbmUpIGFuZC9vciByZXF1ZXN0IHRoYXQgdGhlIGRlZmF1bHRcbiAgICogcHJvY2Vzc2luZyBiZSBza2lwcGVkLiBgb25jZWAgbGlzdGVuZXJzIGFyZSByZW1vdmVkIGFmdGVyIHRoZXkgaGF2ZSBydW4uXG4gICAqXG4gICAqIFJldHVybnMgdGhlIChwb3NzaWJseSB0ZXh0LXVwZGF0ZWQpIG1lc3NhZ2UgYW5kIHdoZXRoZXIgYW55IGxpc3RlbmVyXG4gICAqIHByZXZlbnRlZCB0aGUgZGVmYXVsdCBwcm9jZXNzaW5nLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseU1lc3NhZ2VMaXN0ZW5lcnMobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pOiB7IG1lc3NhZ2U6IElvTWVzc2FnZTx1bmtub3duPjsgcHJldmVudERlZmF1bHQ6IGJvb2xlYW4gfSB7XG4gICAgbGV0IGN1cnJlbnQgPSBtc2c7XG4gICAgbGV0IHByZXZlbnREZWZhdWx0ID0gZmFsc2U7XG5cbiAgICBjb25zdCBsaXN0ZW5lcnMgPSBtc2cuY29kZSA/IHRoaXMubWVzc2FnZUxpc3RlbmVycy5nZXQobXNnLmNvZGUpIDogdW5kZWZpbmVkO1xuICAgIGlmIChsaXN0ZW5lcnMgJiYgbGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIC8vIEl0ZXJhdGUgb3ZlciBhIGNvcHkgc28gdGhhdCBgb25jZWAgbGlzdGVuZXJzIGNhbiByZW1vdmUgdGhlbXNlbHZlcyBzYWZlbHkuXG4gICAgICBmb3IgKGNvbnN0IGxpc3RlbmVyIG9mIFsuLi5saXN0ZW5lcnNdKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGxpc3RlbmVyLmZuKGN1cnJlbnQpO1xuXG4gICAgICAgIGlmIChsaXN0ZW5lci5vbmNlKSB7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZihsaXN0ZW5lcik7XG4gICAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICBpZiAocmVzdWx0Lm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY3VycmVudCA9IHsgLi4uY3VycmVudCwgbWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgICAgcHJldmVudERlZmF1bHQgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7IG1lc3NhZ2U6IGN1cnJlbnQsIHByZXZlbnREZWZhdWx0IH07XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgdGhlIGhvc3Qgb2YgYSBtZXNzYWdlLlxuICAgKiBUaGUgY2FsbGVyIHdhaXRzIHVudGlsIHRoZSBub3RpZmljYXRpb24gY29tcGxldGVzLlxuICAgKi9cbiAgcHVibGljIGFzeW5jIG5vdGlmeShtc2c6IElvTWVzc2FnZTx1bmtub3duPik6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMubWF5YmVFbWl0VGVsZW1ldHJ5KG1zZyk7XG5cbiAgICAvLyBSdW4gYW55IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLiBBIGxpc3RlbmVyIG1heSB1cGRhdGUgdGhlIG1lc3NhZ2UgdGV4dFxuICAgIC8vIGFuZC9vciBwcmV2ZW50IHRoZSBkZWZhdWx0IHByb2Nlc3NpbmcgKGUuZy4gc3RhY2stYWN0aXZpdHkgbWVzc2FnZXMgYXJlXG4gICAgLy8gcm91dGVkIHRvIHRoZSBhY3Rpdml0eSBwcmludGVyIGFuZCBub3Qgd3JpdHRlbiB0byBhIHN0cmVhbSkuXG4gICAgY29uc3QgeyBtZXNzYWdlLCBwcmV2ZW50RGVmYXVsdCB9ID0gdGhpcy5hcHBseU1lc3NhZ2VMaXN0ZW5lcnMobXNnKTtcbiAgICBpZiAocHJldmVudERlZmF1bHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIWlzTWVzc2FnZVJlbGV2YW50Rm9yTGV2ZWwobWVzc2FnZSwgdGhpcy5sb2dMZXZlbCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5jb3JrZWRDb3VudGVyID4gMCkge1xuICAgICAgdGhpcy5jb3JrZWRMb2dnaW5nQnVmZmVyLnB1c2gobWVzc2FnZSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5mb3JtYXRNZXNzYWdlKG1lc3NhZ2UpO1xuICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuc2VsZWN0U3RyZWFtKG1lc3NhZ2UpO1xuICAgIHN0cmVhbT8ud3JpdGUob3V0cHV0KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbWF5YmVFbWl0VGVsZW1ldHJ5KG1zZzogSW9NZXNzYWdlPHVua25vd24+KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHRlbGVtZXRyeUV2ZW50ID0gZXZlbnRGcm9tTWVzc2FnZShtc2cpO1xuICAgICAgaWYgKHRlbGVtZXRyeUV2ZW50KSB7XG4gICAgICAgIGF3YWl0IHRoaXMudGVsZW1ldHJ5Py5lbWl0KHRlbGVtZXRyeUV2ZW50KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIGF3YWl0IHRoaXMuZGVmYXVsdHMudHJhY2UoYEVtaXQgVGVsZW1ldHJ5IEZhaWxlZCAke2UubWVzc2FnZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUm91dGUgc3RhY2stYWN0aXZpdHkgbWVzc2FnZXMgdG8gdGhlIGFjdGl2aXR5IHByaW50ZXIgKHByb2dyZXNzIGJhciBvclxuICAgKiBldmVudCBsaXN0KSByYXRoZXIgdGhhbiB3cml0aW5nIHRoZW0gdG8gYSBzdHJlYW0uXG4gICAqXG4gICAqIEltcGxlbWVudGVkIGFzIGxpc3RlbmVycyB0aGF0IGhhbmRsZSB0aGUgbWVzc2FnZSB2aWEgdGhlIHByaW50ZXIgYW5kXG4gICAqIHByZXZlbnQgdGhlIGRlZmF1bHQgcHJvY2Vzc2luZywgc28gdGhlIHJlc3Qgb2YgdGhlIHBpcGVsaW5lIGRvZXMgbm90IGFsc29cbiAgICogZW1pdCB0aGVtLiBUaGUgcHJpbnRlciBpcyBjcmVhdGVkIGxhemlseSBvbiB0aGUgZmlyc3Qgc3RhY2stYWN0aXZpdHkgbWVzc2FnZS5cbiAgICovXG4gIHByaXZhdGUgcm91dGVTdGFja0FjdGl2aXR5VG9QcmludGVyKCkge1xuICAgIGNvbnN0IHJvdXRlID0gKG1zZzogSW9NZXNzYWdlPHVua25vd24+KTogTWVzc2FnZUxpc3RlbmVyUmVzdWx0ID0+IHtcbiAgICAgIGlmICghdGhpcy5hY3Rpdml0eVByaW50ZXIpIHtcbiAgICAgICAgdGhpcy5hY3Rpdml0eVByaW50ZXIgPSB0aGlzLm1ha2VBY3Rpdml0eVByaW50ZXIoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYWN0aXZpdHlQcmludGVyLm5vdGlmeShtc2cpO1xuICAgICAgcmV0dXJuIHsgcHJldmVudERlZmF1bHQ6IHRydWUgfTsgLy8gaGFuZGxlZCBieSB0aGUgcHJpbnRlcjsgZG9uJ3QgYWxzbyB3cml0ZSB0byBhIHN0cmVhbVxuICAgIH07XG5cbiAgICB0aGlzLm9uKElPLkNES19UT09MS0lUX0k1NTAxLCByb3V0ZSk7XG4gICAgdGhpcy5vbihJTy5DREtfVE9PTEtJVF9JNTUwMiwgcm91dGUpO1xuICAgIHRoaXMub24oSU8uQ0RLX1RPT0xLSVRfSTU1MDMsIHJvdXRlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlY3Qgc3BlY2lhbCBtZXNzYWdlcyBlbmNvZGUgaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciBvciBub3RcbiAgICogdGhleSByZXF1aXJlIGFwcHJvdmFsXG4gICAqL1xuICBwcml2YXRlIHNraXBBcHByb3ZhbFN0ZXAobXNnOiBJb1JlcXVlc3Q8YW55LCBhbnk+KTogYm9vbGVhbiB7XG4gICAgY29uc3QgYXBwcm92YWxUb29sa2l0Q29kZXMgPSBbJ0NES19UT09MS0lUX0k1MDYwJ107XG4gICAgaWYgKCEobXNnLmNvZGUgJiYgYXBwcm92YWxUb29sa2l0Q29kZXMuaW5jbHVkZXMobXNnLmNvZGUpKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHN3aXRjaCAodGhpcy5yZXF1aXJlRGVwbG95QXBwcm92YWwpIHtcbiAgICAgIC8vIE5ldmVyIHJlcXVpcmUgYXBwcm92YWxcbiAgICAgIGNhc2UgUmVxdWlyZUFwcHJvdmFsLk5FVkVSOlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIC8vIEFsd2F5cyByZXF1aXJlIGFwcHJvdmFsXG4gICAgICBjYXNlIFJlcXVpcmVBcHByb3ZhbC5BTllDSEFOR0U6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIFJlcXVpcmUgYXBwcm92YWwgaWYgY2hhbmdlcyBpbmNsdWRlIGJyb2FkZW5pbmcgcGVybWlzc2lvbnNcbiAgICAgIGNhc2UgUmVxdWlyZUFwcHJvdmFsLkJST0FERU5JTkc6XG4gICAgICAgIHJldHVybiBbJ25vbmUnLCAnbm9uLWJyb2FkZW5pbmcnXS5pbmNsdWRlcyhtc2cuZGF0YT8ucGVybWlzc2lvbkNoYW5nZVR5cGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBvdXRwdXQgc3RyZWFtLCBiYXNlZCBvbiBtZXNzYWdlIGFuZCBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzZWxlY3RTdHJlYW0obXNnOiBJb01lc3NhZ2U8YW55Pik6IE5vZGVKUy5Xcml0ZVN0cmVhbSB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKGlzTm90aWNlc01lc3NhZ2UobXNnKSkge1xuICAgICAgcmV0dXJuIHRhcmdldFN0cmVhbU9iamVjdCh0aGlzLm5vdGljZXNEZXN0aW5hdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0U3RyZWFtRnJvbUxldmVsKG1zZy5sZXZlbCk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgb3V0cHV0IHN0cmVhbSwgYmFzZWQgb24gbWVzc2FnZSBsZXZlbCBhbmQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgc2VsZWN0U3RyZWFtRnJvbUxldmVsKGxldmVsOiBJb01lc3NhZ2VMZXZlbCk6IE5vZGVKUy5Xcml0ZVN0cmVhbSB7XG4gICAgLy8gVGhlIHN0cmVhbSBzZWxlY3Rpb24gcG9saWN5IGZvciB0aGUgQ0xJIGlzIHRoZSBmb2xsb3dpbmc6XG4gICAgLy9cbiAgICAvLyAgICgxKSBNZXNzYWdlcyBvZiBsZXZlbCBgcmVzdWx0YCBhbHdheXMgZ28gdG8gYHN0ZG91dGBcbiAgICAvLyAgICgyKSBNZXNzYWdlcyBvZiBsZXZlbCBgZXJyb3JgIGFsd2F5cyBnbyB0byBgc3RkZXJyYC5cbiAgICAvLyAgICgzYSkgQWxsIHJlbWFpbmluZyBtZXNzYWdlcyBnbyB0byBgc3RkZXJyYC5cbiAgICAvLyAgICgzYikgSWYgd2UgYXJlIGluIENJIG1vZGUsIGFsbCByZW1haW5pbmcgbWVzc2FnZXMgZ28gdG8gYHN0ZG91dGAuXG4gICAgLy9cbiAgICBzd2l0Y2ggKGxldmVsKSB7XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICAgIHJldHVybiBwcm9jZXNzLnN0ZGVycjtcbiAgICAgIGNhc2UgJ3Jlc3VsdCc6XG4gICAgICAgIHJldHVybiBwcm9jZXNzLnN0ZG91dDtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB0aGlzLmlzQ0kgPyBwcm9jZXNzLnN0ZG91dCA6IHByb2Nlc3Muc3RkZXJyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZmllcyB0aGUgaG9zdCBvZiBhIG1lc3NhZ2UgdGhhdCByZXF1aXJlcyBhIHJlc3BvbnNlLlxuICAgKlxuICAgKiBJZiB0aGUgaG9zdCBkb2VzIG5vdCByZXR1cm4gYSByZXNwb25zZSB0aGUgc3VnZ2VzdGVkXG4gICAqIGRlZmF1bHQgcmVzcG9uc2UgZnJvbSB0aGUgaW5wdXQgbWVzc2FnZSB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdFJlc3BvbnNlPERhdGFUeXBlLCBSZXNwb25zZVR5cGU+KG1zZzogSW9SZXF1ZXN0PERhdGFUeXBlLCBSZXNwb25zZVR5cGU+KTogUHJvbWlzZTxSZXNwb25zZVR5cGU+IHtcbiAgICAvLyBJZiB0aGUgcmVxdWVzdCBjYW5ub3QgYmUgcHJvbXB0ZWQgZm9yIGJ5IHRoZSBDbGlJb0hvc3QsIHdlIGp1c3QgYWNjZXB0IHRoZSBkZWZhdWx0XG4gICAgaWYgKCFpc1Byb21wdGFibGVSZXF1ZXN0KG1zZykpIHtcbiAgICAgIGF3YWl0IHRoaXMubm90aWZ5KG1zZyk7XG4gICAgICByZXR1cm4gbXNnLmRlZmF1bHRSZXNwb25zZTtcbiAgICB9XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMud2l0aENvcmtlZExvZ2dpbmcoYXN5bmMgKCk6IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgdHJ1ZT4gPT4ge1xuICAgICAgLy8gcHJlcGFyZSBwcm9tcHQgZGF0YVxuICAgICAgLy8gQHRvZG8gdGhpcyBmb3JtYXQgaXMgbm90IGRlZmluZWQgYW55d2hlcmUsIHByb2JhYmx5IHNob3VsZCBiZVxuICAgICAgY29uc3QgZGF0YToge1xuICAgICAgICBtb3RpdmF0aW9uPzogc3RyaW5nO1xuICAgICAgICBjb25jdXJyZW5jeT86IG51bWJlcjtcbiAgICAgICAgcmVzcG9uc2VEZXNjcmlwdGlvbj86IHN0cmluZztcbiAgICAgIH0gPSBtc2cuZGF0YSA/PyB7fTtcblxuICAgICAgY29uc3QgbW90aXZhdGlvbiA9IGRhdGEubW90aXZhdGlvbiA/PyAnVXNlciBpbnB1dCBpcyBuZWVkZWQnO1xuICAgICAgY29uc3QgY29uY3VycmVuY3kgPSBkYXRhLmNvbmN1cnJlbmN5ID8/IDA7XG4gICAgICBjb25zdCByZXNwb25zZURlc2NyaXB0aW9uID0gZGF0YS5yZXNwb25zZURlc2NyaXB0aW9uO1xuXG4gICAgICAvLyBTcGVjaWFsIGFwcHJvdmFsIHByb21wdFxuICAgICAgLy8gRGV0ZXJtaW5lIGlmIHRoZSBtZXNzYWdlIG5lZWRzIGFwcHJvdmFsLiBJZiBpdCBkb2VzLCBjb250aW51ZSAoaXQgaXMgYSBiYXNpYyBjb25maXJtYXRpb24gcHJvbXB0KVxuICAgICAgLy8gSWYgaXQgZG9lcyBub3QsIHJldHVybiBzdWNjZXNzICh0cnVlKS4gV2Ugb25seSBjaGVjayBtZXNzYWdlcyB3aXRoIGNvZGVzIHRoYXQgd2UgYXJlIGF3YXJlXG4gICAgICAvLyBhcmUgcmVxdWlyZXMgYXBwcm92YWwgY29kZXMuXG4gICAgICBpZiAodGhpcy5za2lwQXBwcm92YWxTdGVwKG1zZykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEluIC0teWVzIG1vZGUsIHJlc3BvbmQgZm9yIHRoZSB1c2VyIGlmIHdlIGNhblxuICAgICAgaWYgKHRoaXMuYXV0b1Jlc3BvbmQpIHtcbiAgICAgICAgLy8gcmVzcG9uZCB3aXRoIHllcyB0byBhbGwgY29uZmlybWF0aW9uc1xuICAgICAgICBpZiAoaXNDb25maXJtYXRpb25Qcm9tcHQobXNnKSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMubm90aWZ5KHtcbiAgICAgICAgICAgIC4uLm1zZyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke2NoYWxrLmN5YW4obXNnLm1lc3NhZ2UpfSAoYXV0by1jb25maXJtZWQpYCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHJlc3BvbmQgd2l0aCB0aGUgZGVmYXVsdCBmb3IgYWxsIG90aGVyIG1lc3NhZ2VzXG4gICAgICAgIGlmIChtc2cuZGVmYXVsdFJlc3BvbnNlKSB7XG4gICAgICAgICAgYXdhaXQgdGhpcy5ub3RpZnkoe1xuICAgICAgICAgICAgLi4ubXNnLFxuICAgICAgICAgICAgbWVzc2FnZTogYCR7Y2hhbGsuY3lhbihtc2cubWVzc2FnZSl9IChhdXRvLXJlc3BvbmRlZCB3aXRoIGRlZmF1bHQ6ICR7dXRpbC5mb3JtYXQobXNnLmRlZmF1bHRSZXNwb25zZSl9KWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIG1zZy5kZWZhdWx0UmVzcG9uc2U7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gb25seSB0YWxrIHRvIHVzZXIgaWYgU1RESU4gaXMgYSB0ZXJtaW5hbCAob3RoZXJ3aXNlLCBmYWlsKVxuICAgICAgaWYgKCF0aGlzLmlzVFRZKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ1R0eU5vdEF0dGFjaGVkJywgYCR7bW90aXZhdGlvbn0sIGJ1dCB0ZXJtaW5hbCAoVFRZKSBpcyBub3QgYXR0YWNoZWQgc28gd2UgYXJlIHVuYWJsZSB0byBnZXQgYSBjb25maXJtYXRpb24gZnJvbSB0aGUgdXNlcmApO1xuICAgICAgfVxuXG4gICAgICAvLyBvbmx5IHRhbGsgdG8gdXNlciBpZiBjb25jdXJyZW5jeSBpcyAxIChvdGhlcndpc2UsIGZhaWwpXG4gICAgICBpZiAoY29uY3VycmVuY3kgPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0NvbmN1cnJlbmN5Q29uZmxpY3QnLCBgJHttb3RpdmF0aW9ufSwgYnV0IGNvbmN1cnJlbmN5IGlzIGdyZWF0ZXIgdGhhbiAxIHNvIHdlIGFyZSB1bmFibGUgdG8gZ2V0IGEgY29uZmlybWF0aW9uIGZyb20gdGhlIHVzZXJgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQmFzaWMgY29uZmlybWF0aW9uIHByb21wdFxuICAgICAgLy8gV2UgdHJlYXQgYWxsIHJlcXVlc3RzIHdpdGggYSBib29sZWFuIHJlc3BvbnNlIGFzIGNvbmZpcm1hdGlvbiBwcm9tcHRzXG4gICAgICBpZiAoaXNDb25maXJtYXRpb25Qcm9tcHQobXNnKSkge1xuICAgICAgICBjb25zdCBjb25maXJtZWQgPSBhd2FpdCBwcm9tcHRseS5jb25maXJtKGAke2NoYWxrLmN5YW4obXNnLm1lc3NhZ2UpfSAoeS9uKWApO1xuICAgICAgICBpZiAoIWNvbmZpcm1lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBUb29sa2l0RXJyb3IoJ0Fib3J0ZWRCeVVzZXInLCAnQWJvcnRlZCBieSB1c2VyJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbmZpcm1lZDtcbiAgICAgIH1cblxuICAgICAgLy8gQXNraW5nIGZvciBhIHNwZWNpZmljIHZhbHVlXG4gICAgICBjb25zdCBwcm9tcHQgPSBleHRyYWN0UHJvbXB0SW5mbyhtc2cpO1xuICAgICAgY29uc3QgZGVzYyA9IHJlc3BvbnNlRGVzY3JpcHRpb24gPz8gcHJvbXB0LmRlZmF1bHQ7XG4gICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBwcm9tcHRseS5wcm9tcHQoYCR7Y2hhbGsuY3lhbihtc2cubWVzc2FnZSl9JHtkZXNjID8gYCAoJHtkZXNjfSlgIDogJyd9YCwge1xuICAgICAgICBkZWZhdWx0OiBwcm9tcHQuZGVmYXVsdCxcbiAgICAgICAgdHJpbTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHByb21wdC5jb252ZXJ0QW5zd2VyKGFuc3dlcik7XG4gICAgfSk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIGNhc3QgdGhpcyBiZWNhdXNlIGl0IGlzIGltcG9zc2libGUgdG8gbmFycm93IHRoZSBnZW5lcmljIHR5cGVcbiAgICAvLyBpc1Byb21wdGFibGVSZXF1ZXN0IGVuc3VyZXMgdGhhdCB0aGUgcmVzcG9uc2UgdHlwZSBpcyBvbmUgd2UgY2FuIHByb21wdCBmb3JcbiAgICAvLyB0aGUgcmVtYWluaW5nIGNvZGUgZW5zdXJlIHdlIGFyZSBpbmRlZWQgcmV0dXJuaW5nIHRoZSBjb3JyZWN0IHR5cGVcbiAgICByZXR1cm4gcmVzcG9uc2UgYXMgUmVzcG9uc2VUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgYSBtZXNzYWdlIGZvciBjb25zb2xlIG91dHB1dCB3aXRoIG9wdGlvbmFsIGNvbG9yIHN1cHBvcnRcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0TWVzc2FnZShtc2c6IElvTWVzc2FnZTx1bmtub3duPik6IHN0cmluZyB7XG4gICAgLy8gYXBwbHkgcHJvdmlkZWQgc3R5bGUgb3IgYSBkZWZhdWx0IHN0eWxlIGlmIHdlJ3JlIGluIFRUWSBtb2RlXG4gICAgbGV0IG1lc3NhZ2VfdGV4dCA9IHRoaXMuaXNUVFlcbiAgICAgID8gc3R5bGVNYXBbbXNnLmxldmVsXShtc2cubWVzc2FnZSlcbiAgICAgIDogbXNnLm1lc3NhZ2U7XG5cbiAgICAvLyBwcmVwZW5kIHRpbWVzdGFtcCBpZiBJb01lc3NhZ2VMZXZlbCBpcyBERUJVRyBvciBUUkFDRS4gUG9zdHBlbmQgYSBuZXdsaW5lLlxuICAgIHJldHVybiAoKG1zZy5sZXZlbCA9PT0gJ2RlYnVnJyB8fCBtc2cubGV2ZWwgPT09ICd0cmFjZScpXG4gICAgICA/IGBbJHt0aGlzLmZvcm1hdFRpbWUobXNnLnRpbWUpfV0gJHttZXNzYWdlX3RleHR9YFxuICAgICAgOiBtZXNzYWdlX3RleHQpICsgJ1xcbic7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBkYXRlIHRvIEhIOk1NOlNTXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdFRpbWUoZDogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFkID0gKG46IG51bWJlcik6IHN0cmluZyA9PiBuLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICByZXR1cm4gYCR7cGFkKGQuZ2V0SG91cnMoKSl9OiR7cGFkKGQuZ2V0TWludXRlcygpKX06JHtwYWQoZC5nZXRTZWNvbmRzKCkpfWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGluc3RhbmNlIG9mIHRoZSBBY3Rpdml0eVByaW50ZXJcbiAgICovXG4gIHByaXZhdGUgbWFrZUFjdGl2aXR5UHJpbnRlcigpIHtcbiAgICBjb25zdCBwcm9wczogQWN0aXZpdHlQcmludGVyUHJvcHMgPSB7XG4gICAgICBzdHJlYW06IHRoaXMuc2VsZWN0U3RyZWFtRnJvbUxldmVsKCdpbmZvJyksXG4gICAgfTtcblxuICAgIHN3aXRjaCAodGhpcy5zdGFja1Byb2dyZXNzKSB7XG4gICAgICBjYXNlIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFM6XG4gICAgICAgIHJldHVybiBuZXcgSGlzdG9yeUFjdGl2aXR5UHJpbnRlcihwcm9wcyk7XG4gICAgICBjYXNlIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5CQVI6XG4gICAgICAgIHJldHVybiBuZXcgQ3VycmVudEFjdGl2aXR5UHJpbnRlcihwcm9wcyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGhpcyBJb0hvc3QgaW1wbGVtZW50YXRpb24gY29uc2lkZXJzIGEgcmVxdWVzdCBwcm9tcHRhYmxlLCBpZjpcbiAqIC0gaXQncyBhIHllcy9ubyBjb25maXJtYXRpb25cbiAqIC0gYXNraW5nIGZvciBhIHN0cmluZyBvciBudW1iZXIgdmFsdWVcbiAqL1xuZnVuY3Rpb24gaXNQcm9tcHRhYmxlUmVxdWVzdChtc2c6IElvUmVxdWVzdDxhbnksIGFueT4pOiBtc2cgaXMgSW9SZXF1ZXN0PGFueSwgc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbj4ge1xuICByZXR1cm4gaXNDb25maXJtYXRpb25Qcm9tcHQobXNnKVxuICAgIHx8IHR5cGVvZiBtc2cuZGVmYXVsdFJlc3BvbnNlID09PSAnc3RyaW5nJ1xuICAgIHx8IHR5cGVvZiBtc2cuZGVmYXVsdFJlc3BvbnNlID09PSAnbnVtYmVyJztcbn1cblxuLyoqXG4gKiBDaGVjayBpZiB0aGUgcmVxdWVzdCBpcyBhIGNvbmZpcm1hdGlvbiBwcm9tcHRcbiAqIFdlIHRyZWF0IGFsbCByZXF1ZXN0cyB3aXRoIGEgYm9vbGVhbiByZXNwb25zZSBhcyBjb25maXJtYXRpb24gcHJvbXB0c1xuICovXG5mdW5jdGlvbiBpc0NvbmZpcm1hdGlvblByb21wdChtc2c6IElvUmVxdWVzdDxhbnksIGFueT4pOiBtc2cgaXMgSW9SZXF1ZXN0PGFueSwgYm9vbGVhbj4ge1xuICByZXR1cm4gdHlwZW9mIG1zZy5kZWZhdWx0UmVzcG9uc2UgPT09ICdib29sZWFuJztcbn1cblxuLyoqXG4gKiBIZWxwZXIgdG8gZXh0cmFjdCBpbmZvcm1hdGlvbiBmb3IgcHJvbXB0bHkgZnJvbSB0aGUgcmVxdWVzdFxuICovXG5mdW5jdGlvbiBleHRyYWN0UHJvbXB0SW5mbyhtc2c6IElvUmVxdWVzdDxhbnksIGFueT4pOiB7XG4gIGRlZmF1bHQ6IHN0cmluZztcbiAgZGVmYXVsdERlc2M6IHN0cmluZztcbiAgY29udmVydEFuc3dlcjogKGlucHV0OiBzdHJpbmcpID0+IHN0cmluZyB8IG51bWJlcjtcbn0ge1xuICBjb25zdCBpc051bWJlciA9ICh0eXBlb2YgbXNnLmRlZmF1bHRSZXNwb25zZSA9PT0gJ251bWJlcicpO1xuICBjb25zdCBkZWZhdWx0UmVzcG9uc2UgPSB1dGlsLmZvcm1hdChtc2cuZGVmYXVsdFJlc3BvbnNlKTtcbiAgcmV0dXJuIHtcbiAgICBkZWZhdWx0OiBkZWZhdWx0UmVzcG9uc2UsXG4gICAgZGVmYXVsdERlc2M6ICdkZWZhdWx0RGVzY3JpcHRpb24nIGluIG1zZyAmJiBtc2cuZGVmYXVsdERlc2NyaXB0aW9uID8gdXRpbC5mb3JtYXQobXNnLmRlZmF1bHREZXNjcmlwdGlvbikgOiBkZWZhdWx0UmVzcG9uc2UsXG4gICAgY29udmVydEFuc3dlcjogaXNOdW1iZXIgPyAodikgPT4gTnVtYmVyKHYpIDogKHYpID0+IFN0cmluZyh2KSxcbiAgfTtcbn1cblxuY29uc3Qgc3R5bGVNYXA6IFJlY29yZDxJb01lc3NhZ2VMZXZlbCwgKHN0cjogc3RyaW5nKSA9PiBzdHJpbmc+ID0ge1xuICBlcnJvcjogY2hhbGsucmVkLFxuICB3YXJuOiBjaGFsay55ZWxsb3csXG4gIHJlc3VsdDogY2hhbGsucmVzZXQsXG4gIGluZm86IGNoYWxrLnJlc2V0LFxuICBkZWJ1ZzogY2hhbGsuZ3JheSxcbiAgdHJhY2U6IGNoYWxrLmdyYXksXG59O1xuXG5mdW5jdGlvbiB0YXJnZXRTdHJlYW1PYmplY3QoeDogVGFyZ2V0U3RyZWFtKTogTm9kZUpTLldyaXRlU3RyZWFtIHwgdW5kZWZpbmVkIHtcbiAgc3dpdGNoICh4KSB7XG4gICAgY2FzZSAnc3RkZXJyJzpcbiAgICAgIHJldHVybiBwcm9jZXNzLnN0ZGVycjtcbiAgICBjYXNlICdzdGRvdXQnOlxuICAgICAgcmV0dXJuIHByb2Nlc3Muc3Rkb3V0O1xuICAgIGNhc2UgJ2Ryb3AnOlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vdGljZXNNZXNzYWdlKG1zZzogSW9NZXNzYWdlPHVua25vd24+KTogbXNnIGlzIElvTWVzc2FnZTx2b2lkPiB7XG4gIHJldHVybiBJTy5DREtfVE9PTEtJVF9JMDEwMC5pcyhtc2cpIHx8IElPLkNES19UT09MS0lUX1cwMTAxLmlzKG1zZykgfHwgSU8uQ0RLX1RPT0xLSVRfRTAxMDEuaXMobXNnKSB8fCBJTy5DREtfVE9PTEtJVF9JMDEwMS5pcyhtc2cpO1xufVxuXG5mdW5jdGlvbiBldmVudEZyb21NZXNzYWdlKG1zZzogSW9NZXNzYWdlPHVua25vd24+KTogVGVsZW1ldHJ5RXZlbnQgfCB1bmRlZmluZWQge1xuICBpZiAoQ0xJX1BSSVZBVEVfSU8uQ0RLX0NMSV9JMTAwMS5pcyhtc2cpKSB7XG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0KCdTWU5USCcsIG1zZyk7XG4gIH1cbiAgaWYgKENMSV9QUklWQVRFX0lPLkNES19DTElfSTIwMDEuaXMobXNnKSkge1xuICAgIHJldHVybiBldmVudFJlc3VsdCgnSU5WT0tFJywgbXNnKTtcbiAgfVxuICBpZiAoQ0xJX1BSSVZBVEVfSU8uQ0RLX0NMSV9JMzAwMS5pcyhtc2cpKSB7XG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0KCdERVBMT1knLCBtc2cpO1xuICB9XG4gIGlmIChDTElfUFJJVkFURV9JTy5DREtfQ0xJX0kzMDAzLmlzKG1zZykpIHtcbiAgICByZXR1cm4gZXZlbnRSZXN1bHQoJ0FTU0VUJywgbXNnKTtcbiAgfVxuICAvLyBIb3Rzd2FwIGxpdmVzIGluIHRoZSBjZGstdG9vbGtpdCBzbyBpdCBjYW5ub3QgYmUgYSBDREtfQ0xJIGVycm9yIGNvZGUuXG4gIC8vIEluc3RlYWQgd2UgcmV1c2UgdGhlIGV4aXN0aW5nIEhvdHN3YXAgc3Bhbi5cbiAgaWYgKElPLkNES19UT09MS0lUX0k1NDEwLmlzKG1zZykpIHtcbiAgICAvLyBDcmVhdGUgYSB0ZWxlbWV0cnktY29tcGF0aWJsZSByZXN1bHRcbiAgICByZXR1cm4gaG90c3dhcFRvRXZlbnRSZXN1bHQobXNnLmRhdGEpO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgZnVuY3Rpb24gZXZlbnRSZXN1bHQoZXZlbnRUeXBlOiBUZWxlbWV0cnlFdmVudFsnZXZlbnRUeXBlJ10sIG06IElvTWVzc2FnZTxFdmVudFJlc3VsdD4pOiBUZWxlbWV0cnlFdmVudCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2ZW50VHlwZSxcbiAgICAgIGR1cmF0aW9uOiBtLmRhdGEuZHVyYXRpb24sXG4gICAgICBlcnJvcjogbS5kYXRhLmVycm9yLFxuICAgICAgY291bnRlcnM6IG0uZGF0YS5jb3VudGVycyxcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGhvdHN3YXBUb0V2ZW50UmVzdWx0KHJlc3VsdDogSG90c3dhcFJlc3VsdCk6IFRlbGVtZXRyeUV2ZW50IHtcbiAgY29uc3Qgbm9uSG90c3dhcHBhYmxlUmVzb3VyY2VzOiBSZWNvcmQ8c3RyaW5nLCBudW1iZXI+ID0ge307XG4gIGZvciAoY29uc3QgeyBzdWJqZWN0IH0gb2YgcmVzdWx0Lm5vbkhvdHN3YXBwYWJsZUNoYW5nZXMpIHtcbiAgICBpZiAoJ3Jlc291cmNlVHlwZScgaW4gc3ViamVjdCkge1xuICAgICAgY29uc3Qga2V5cyA9ICdyZWplY3RlZFByb3BlcnRpZXMnIGluIHN1YmplY3QgJiYgc3ViamVjdC5yZWplY3RlZFByb3BlcnRpZXNcbiAgICAgICAgPyBzdWJqZWN0LnJlamVjdGVkUHJvcGVydGllcy5tYXAocCA9PiBgaG90c3dhcEZhbGxiYWNrOiR7c3ViamVjdC5yZXNvdXJjZVR5cGV9IyR7cH1gKVxuICAgICAgICA6IFtgaG90c3dhcEZhbGxiYWNrOiR7c3ViamVjdC5yZXNvdXJjZVR5cGV9YF07XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBrZXlzKSB7XG4gICAgICAgIG5vbkhvdHN3YXBwYWJsZVJlc291cmNlc1trZXldID0gKG5vbkhvdHN3YXBwYWJsZVJlc291cmNlc1trZXldID8/IDApICsgMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGV2ZW50VHlwZTogJ0hPVFNXQVAnIGFzIGNvbnN0LFxuICAgIGR1cmF0aW9uOiByZXN1bHQuZHVyYXRpb24sXG4gICAgLi4uKHJlc3VsdC5lcnJvciA/IHtcbiAgICAgIGVycm9yOiB7XG4gICAgICAgIG5hbWU6IGNka0NsaUVycm9yTmFtZShyZXN1bHQuZXJyb3IpLFxuICAgICAgfSxcbiAgICB9IDoge30pLFxuICAgIGNvdW50ZXJzOiB7XG4gICAgICBob3Rzd2FwcGVkOiByZXN1bHQuaG90c3dhcHBlZCA/IDEgOiAwLFxuICAgICAgaG90c3dhcEZhbGxiYWNrOiByZXN1bHQuaG90c3dhcEZhbGxiYWNrID8gMSA6IDAsXG4gICAgICBob3Rzd2FwcGFibGVDaGFuZ2VzOiByZXN1bHQuaG90c3dhcHBhYmxlQ2hhbmdlcy5sZW5ndGgsXG4gICAgICBub25Ib3Rzd2FwcGFibGVDaGFuZ2VzOiByZXN1bHQubm9uSG90c3dhcHBhYmxlQ2hhbmdlcy5sZW5ndGgsXG4gICAgICAuLi5ub25Ib3Rzd2FwcGFibGVSZXNvdXJjZXMsXG4gICAgfSxcbiAgfTtcbn1cbiJdfQ==
829
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWlvLWhvc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjbGktaW8taG9zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFtaUNBLDRCQUdDO0FBcmlDRCxnREFBa0M7QUFDbEMsMEVBQWlFO0FBQ2pFLHNEQUFvRDtBQUVwRCxrREFBMEI7QUFDMUIsbURBQXFDO0FBRXJDLDBEQUFxSTtBQUVySSxrREFBOEQ7QUFDOUQsc0VBQXFFO0FBQ3JFLDhDQUFxRDtBQUVyRCxvREFBdUQ7QUFFdkQsa0RBQXdEO0FBQ3hELG1FQUF3RTtBQUN4RSwyREFBZ0U7QUFDaEUscURBQWtEO0FBRWxELG1DQUFrQztBQStPbEM7O0dBRUc7QUFDSCxNQUFhLFNBQVM7SUFDcEI7O09BRUc7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQXdCLEVBQUUsRUFBRSxRQUFRLEdBQUcsS0FBSztRQUMxRCxJQUFJLFFBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUNyQyxTQUFTLENBQUMsU0FBUyxHQUFHLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLEdBQUc7UUFDUixPQUFPLFNBQVMsQ0FBQyxTQUFTLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ssTUFBTSxDQUFDLFNBQVMsQ0FBd0I7SUFFaEQ7O09BRUc7SUFDSSxhQUFhLENBQVk7SUFFaEM7Ozs7T0FJRztJQUNJLElBQUksQ0FBVTtJQUVyQjs7T0FFRztJQUNJLEtBQUssQ0FBVTtJQUV0Qjs7OztPQUlHO0lBQ0ksUUFBUSxDQUFpQjtJQUVoQzs7T0FFRztJQUNJLHFCQUFxQixDQUFrQjtJQUU5Qzs7Ozs7T0FLRztJQUNJLGtCQUFrQixHQUFpQixRQUFRLENB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RixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDUCxRQUFRLEVBQUU7WUFDUixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3JDLGVBQWUsRUFBRSxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0MsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLG1CQUFtQixDQUFDLE1BQU07WUFDdEQsc0JBQXNCLEVBQUUsTUFBTSxDQUFDLHNCQUFzQixDQUFDLE1BQU07WUFDNUQsR0FBRyx3QkFBd0I7U0FDNUI7S0FDRixDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQWdlbnQgfSBmcm9tICdub2RlOmh0dHBzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCB7IFJlcXVpcmVBcHByb3ZhbCB9IGZyb20gJ0Bhd3MtY2RrL2Nsb3VkLWFzc2VtYmx5LXNjaGVtYSc7XG5pbXBvcnQgeyBUb29sa2l0RXJyb3IgfSBmcm9tICdAYXdzLWNkay90b29sa2l0LWxpYic7XG5pbXBvcnQgdHlwZSB7IEhvdHN3YXBSZXN1bHQsIElJb0hvc3QsIElvTWVzc2FnZSwgSW9NZXNzYWdlQ29kZSwgSW9NZXNzYWdlTGV2ZWwsIElvUmVxdWVzdCwgVG9vbGtpdEFjdGlvbiB9IGZyb20gJ0Bhd3MtY2RrL3Rvb2xraXQtbGliJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgKiBhcyBwcm9tcHRseSBmcm9tICdwcm9tcHRseSc7XG5pbXBvcnQgdHlwZSB7IElvSGVscGVyLCBBY3Rpdml0eVByaW50ZXJQcm9wcywgSUFjdGl2aXR5UHJpbnRlciwgSW9NZXNzYWdlTWFrZXIsIElvUmVxdWVzdE1ha2VyLCBJb0RlZmF1bHRNZXNzYWdlcyB9IGZyb20gJy4uLy4uLy4uL2xpYi9hcGktcHJpdmF0ZSc7XG5pbXBvcnQgeyBhc0lvSGVscGVyLCBJTywgaXNNZXNzYWdlUmVsZXZhbnRGb3JMZXZlbCwgQ3VycmVudEFjdGl2aXR5UHJpbnRlciwgSGlzdG9yeUFjdGl2aXR5UHJpbnRlciB9IGZyb20gJy4uLy4uLy4uL2xpYi9hcGktcHJpdmF0ZSc7XG5pbXBvcnQgdHlwZSB7IENvbnRleHQgfSBmcm9tICcuLi8uLi9hcGkvY29udGV4dCc7XG5pbXBvcnQgeyBTdGFja0FjdGl2aXR5UHJvZ3Jlc3MgfSBmcm9tICcuLi8uLi9jb21tYW5kcy9kZXBsb3knO1xuaW1wb3J0IHsgY2FuQ29sbGVjdFRlbGVtZXRyeSB9IGZyb20gJy4uL3RlbGVtZXRyeS9jb2xsZWN0LXRlbGVtZXRyeSc7XG5pbXBvcnQgeyBjZGtDbGlFcnJvck5hbWUgfSBmcm9tICcuLi90ZWxlbWV0cnkvZXJyb3InO1xuaW1wb3J0IHR5cGUgeyBFdmVudFJlc3VsdCB9IGZyb20gJy4uL3RlbGVtZXRyeS9tZXNzYWdlcyc7XG5pbXBvcnQgeyBDTElfUFJJVkFURV9JTyB9IGZyb20gJy4uL3RlbGVtZXRyeS9tZXNzYWdlcyc7XG5pbXBvcnQgdHlwZSB7IFRlbGVtZXRyeUV2ZW50IH0gZnJvbSAnLi4vdGVsZW1ldHJ5L3Nlc3Npb24nO1xuaW1wb3J0IHsgVGVsZW1ldHJ5U2Vzc2lvbiB9IGZyb20gJy4uL3RlbGVtZXRyeS9zZXNzaW9uJztcbmltcG9ydCB7IEVuZHBvaW50VGVsZW1ldHJ5U2luayB9IGZyb20gJy4uL3RlbGVtZXRyeS9zaW5rL2VuZHBvaW50LXNpbmsnO1xuaW1wb3J0IHsgRmlsZVRlbGVtZXRyeVNpbmsgfSBmcm9tICcuLi90ZWxlbWV0cnkvc2luay9maWxlLXNpbmsnO1xuaW1wb3J0IHsgRnVubmVsIH0gZnJvbSAnLi4vdGVsZW1ldHJ5L3NpbmsvZnVubmVsJztcbmltcG9ydCB0eXBlIHsgSVRlbGVtZXRyeVNpbmsgfSBmcm9tICcuLi90ZWxlbWV0cnkvc2luay9zaW5rLWludGVyZmFjZSc7XG5pbXBvcnQgeyBpc0NJIH0gZnJvbSAnLi4vdXRpbC9jaSc7XG5cbmV4cG9ydCB0eXBlIHsgSUlvSG9zdCwgSW9NZXNzYWdlLCBJb01lc3NhZ2VDb2RlLCBJb01lc3NhZ2VMZXZlbCwgSW9SZXF1ZXN0IH07XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgYWN0aW9uIGJlaW5nIHBlcmZvcm1lZCBieSB0aGUgQ0xJLiAnbm9uZScgcmVwcmVzZW50cyB0aGUgYWJzZW5jZSBvZiBhbiBhY3Rpb24uXG4gKi9cbnR5cGUgQ2xpQWN0aW9uID1cbiAgfCBUb29sa2l0QWN0aW9uXG4gIHwgJ2NvbnRleHQnXG4gIHwgJ2RvY3MnXG4gIHwgJ2ZsYWdzJ1xuICB8ICdub3RpY2VzJ1xuICB8ICd2ZXJzaW9uJ1xuICB8ICdjbGktdGVsZW1ldHJ5J1xuICB8ICdub25lJztcblxuZXhwb3J0IGludGVyZmFjZSBDbGlJb0hvc3RQcm9wcyB7XG4gIC8qKlxuICAgKiBUaGUgaW5pdGlhbCBUb29sa2l0IGFjdGlvbiB0aGUgaG9zdHMgc3RhcnRzIHdpdGguXG4gICAqXG4gICAqIEBkZWZhdWx0ICdub25lJ1xuICAgKi9cbiAgcmVhZG9ubHkgY3VycmVudEFjdGlvbj86IENsaUFjdGlvbjtcblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgdmVyYm9zaXR5IG9mIHRoZSBvdXRwdXQuXG4gICAqXG4gICAqIFRoZSBDbGlJb0hvc3Qgd2lsbCBzdGlsbCByZWNlaXZlIGFsbCBtZXNzYWdlcyBhbmQgcmVxdWVzdHMsXG4gICAqIGJ1dCBvbmx5IHRoZSBtZXNzYWdlcyBpbmNsdWRlZCBpbiB0aGlzIGxldmVsIHdpbGwgYmUgcHJpbnRlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgJ2luZm8nXG4gICAqL1xuICByZWFkb25seSBsb2dMZXZlbD86IElvTWVzc2FnZUxldmVsO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlIGF1dG9tYXRpYyBUVFkgZGV0ZWN0aW9uLlxuICAgKlxuICAgKiBXaGVuIFRUWSBpcyBkaXNhYmxlZCwgdGhlIENMSSB3aWxsIGhhdmUgbm8gaW50ZXJhY3Rpb25zIG9yIGNvbG9yLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGRldGVybWluZWQgZnJvbSB0aGUgY3VycmVudCBwcm9jZXNzXG4gICAqL1xuICByZWFkb25seSBpc1RUWT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIENsaUlvSG9zdCBpcyBydW5uaW5nIGluIENJIG1vZGUuXG4gICAqXG4gICAqIEluIENJIG1vZGUsIGFsbCBub24tZXJyb3Igb3V0cHV0IGdvZXMgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyLlxuICAgKiBTZXQgdG8gZmFsc2UgaW4gdGhlIENsaUlvSG9zdCBjb25zdHJ1Y3RvciBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuIGlmIHRoZSBDTEkgQ0kgYXJndW1lbnQgaXMgcGFzc2VkXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gZGV0ZXJtaW5lZCBmcm9tIHRoZSBlbnZpcm9ubWVudCwgc3BlY2lmaWNhbGx5IGJhc2VkIG9uIGBwcm9jZXNzLmVudi5DSWBcbiAgICovXG4gIHJlYWRvbmx5IGlzQ0k/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbiB3aGF0IHNjZW5hcmlvcyBzaG91bGQgdGhlIENsaUlvSG9zdCBhc2sgZm9yIGFwcHJvdmFsXG4gICAqXG4gICAqIEBkZWZhdWx0IFJlcXVpcmVBcHByb3ZhbC5CUk9BREVOSU5HXG4gICAqL1xuICByZWFkb25seSByZXF1aXJlRGVwbG95QXBwcm92YWw/OiBSZXF1aXJlQXBwcm92YWw7XG5cbiAgLyoqXG4gICAqIFRoZSBpbml0aWFsIFRvb2xraXQgYWN0aW9uIHRoZSBob3N0cyBzdGFydHMgd2l0aC5cbiAgICpcbiAgICogQGRlZmF1bHQgU3RhY2tBY3Rpdml0eVByb2dyZXNzLkJBUlxuICAgKi9cbiAgcmVhZG9ubHkgc3RhY2tQcm9ncmVzcz86IFN0YWNrQWN0aXZpdHlQcm9ncmVzcztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgQ0xJIHNob3VsZCBhdHRlbXB0IHRvIGF1dG9tYXRpY2FsbHkgcmVzcG9uZCB0byBwcm9tcHRzLlxuICAgKlxuICAgKiBXaGVuIHRydWUsIG9wZXJhdGlvbiB3aWxsIHVzdWFsbHkgcHJvY2VlZCB3aXRob3V0IGludGVyYWN0aXZlIGNvbmZpcm1hdGlvbi5cbiAgICogQ29uZmlybWF0aW9ucyBhcmUgcmVzcG9uZGVkIHRvIHdpdGggeWVzLiBPdGhlciBwcm9tcHRzIHdpbGwgcmVzcG9uZCB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgYXV0b1Jlc3BvbmQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIEEgdHlwZSBmb3IgY29uZmlndXJpbmcgYSB0YXJnZXQgc3RyZWFtXG4gKi9cbmV4cG9ydCB0eXBlIFRhcmdldFN0cmVhbSA9ICdzdGRvdXQnIHwgJ3N0ZGVycicgfCAnZHJvcCc7XG5cbi8qKlxuICogVGhlIHJlc3VsdCBhIG1lc3NhZ2UgbGlzdGVuZXIgbWF5IHJldHVybiB0byBpbmZsdWVuY2UgaG93IGEgbWVzc2FnZSBpcyBoYW5kbGVkLlxuICpcbiAqIEEgbGlzdGVuZXIgbWF5IHVwZGF0ZSB0aGUgbWVzc2FnZSBfdGV4dF8gYW5kL29yIGl0cyBfbGV2ZWxfOyBpdCBjYW5ub3QgY2hhbmdlXG4gKiBhbnkgb3RoZXIgZmllbGQgb2YgdGhlIG1lc3NhZ2UgKHN1Y2ggYXMgaXRzIGBjb2RlYCksIHdoaWNoIGtlZXBzIHRoZVxuICogY29kZS1rZXllZCBsaXN0ZW5lciByZWdpc3RyeSB2YWxpZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlTGlzdGVuZXJSZXN1bHQge1xuICAvKipcbiAgICogUmVwbGFjZSB0aGUgdGV4dCB0aGF0IGlzIHByaW50ZWQgZm9yIHRoaXMgbWVzc2FnZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgbWVzc2FnZSB0ZXh0IGlzIGxlZnQgdW5jaGFuZ2VkXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB0aGUgbGV2ZWwgb2YgdGhpcyBtZXNzYWdlLlxuICAgKlxuICAgKiBUaGUgbmV3IGxldmVsIGlzIHVzZWQgZm9yIGJvdGggdmVyYm9zaXR5IGZpbHRlcmluZyBhbmQgc3RyZWFtIHNlbGVjdGlvbiwgc29cbiAgICogdGhpcyBjYW4gbW92ZSBhIG1lc3NhZ2UgYmV0d2VlbiBzdGRvdXQvc3RkZXJyIChlLmcuIGRvd25ncmFkZSBhIGByZXN1bHRgIHRvXG4gICAqIGBpbmZvYCkuIFRoZSBgY29kZWAgaXMgaW50ZW50aW9uYWxseSBsZWZ0IHVuY2hhbmdlZC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgbWVzc2FnZSBsZXZlbCBpcyBsZWZ0IHVuY2hhbmdlZFxuICAgKi9cbiAgcmVhZG9ubHkgbGV2ZWw/OiBJb01lc3NhZ2VMZXZlbDtcblxuICAvKipcbiAgICogU2tpcCB0aGUgZGVmYXVsdCBoYW5kbGluZyBvZiB0aGUgbWVzc2FnZS5cbiAgICpcbiAgICogRm9yIGEgbm90aWZpY2F0aW9uIHRoaXMgbWVhbnMgaXQgaXMgbm90IHdyaXR0ZW4gdG8gYSBzdHJlYW0uIEZvciBhIHJlcXVlc3RcbiAgICogaXQgc3RvcHMgcHJvY2Vzc2luZyBlbnRpcmVseTogdGhlIHVzZXIgaXMgbm90IHByb21wdGVkLCBub3RoaW5nIGlzIHdyaXR0ZW4sXG4gICAqIGFuZCB0aGUgcmVxdWVzdCByZXNvbHZlcyB3aXRoIGl0cyAocG9zc2libHkgYHJlc3BvbmRgLW92ZXJyaWRkZW4pIGRlZmF1bHRcbiAgICogcmVzcG9uc2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBwcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEZvciByZXF1ZXN0cyBvbmx5OiB0aGUgdmFsdWUgdG8gcmVzb2x2ZSB0aGUgcmVxdWVzdCB3aXRoLiBJdCBpcyBmb2xkZWQgaW50b1xuICAgKiB0aGUgcmVxdWVzdCdzIGRlZmF1bHQgcmVzcG9uc2UgYW5kIHNraXBzIHRoZSBwcm9tcHQgKHRoZSByZXF1ZXN0IGlzIHRyZWF0ZWRcbiAgICogYXMgbm90IHByb21wdGFibGUpLiBUaGUgcXVlc3Rpb24gaXMgc3RpbGwgd3JpdHRlbiB1bmxlc3MgYHByZXZlbnREZWZhdWx0YCBpc1xuICAgKiBhbHNvIHNldC4gSWdub3JlZCBmb3IgcGxhaW4gbm90aWZpY2F0aW9ucy5cbiAgICpcbiAgICogVGhlIHByZXNlbmNlIG9mIHRoZSBrZXkgaXMgd2hhdCBtYXR0ZXJzLCBzbyBgZmFsc2VgL2AwYC9gJydgIGFyZSB2YWxpZFxuICAgKiBhbnN3ZXJzLiBVc2UgdGhlIGByZXNwb25kYC9gcmVzcG9uZE9uY2VgIGhlbHBlcnMgZm9yIHRoZSBjb21tb24gY2FzZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGlzIGxpc3RlbmVyIGRvZXMgbm90IHN1cHBseSBhIHJlc3BvbnNlXG4gICAqL1xuICByZWFkb25seSByZXNwb25kPzogdW5rbm93bjtcbn1cblxuLyoqXG4gKiBXaGF0IGEgbWVzc2FnZSBsaXN0ZW5lciBtYXkgcmV0dXJuOiBub3RoaW5nLCBhIGBNZXNzYWdlTGlzdGVuZXJSZXN1bHRgLCBvciBhXG4gKiBgUHJvbWlzZWAgb2YgZWl0aGVyLlxuICpcbiAqIExpc3RlbmVycyBtYXkgYmUgYXN5bmMuIFRoZSBob3N0IGF3YWl0cyBlYWNoIGxpc3RlbmVyIGJlZm9yZSBydW5uaW5nIHRoZVxuICogbmV4dCwgc28gcmVnaXN0cmF0aW9uIG9yZGVyIOKAlCBhbmQgdGhlIGN1bXVsYXRpdmUgZWZmZWN0IG9uIHRoZSBtZXNzYWdlIOKAlCBpc1xuICogcHJlc2VydmVkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBsaXN0ZW5lcnMgYXJlIHN5bmMgb3IgYXN5bmMuXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VMaXN0ZW5lclJlc3VsdE9yUHJvbWlzZSA9IHZvaWQgfCBNZXNzYWdlTGlzdGVuZXJSZXN1bHQgfCBQcm9taXNlPHZvaWQgfCBNZXNzYWdlTGlzdGVuZXJSZXN1bHQ+O1xuXG4vKipcbiAqIEEgcmVnaXN0ZXJlZCBtZXNzYWdlIGxpc3RlbmVyLiBJdHMgcmV0dXJuIHZhbHVlIChpZiBhbnkpIG1heSB1cGRhdGUgdGhlXG4gKiBtZXNzYWdlIHRleHQgYW5kL29yIHByZXZlbnQgdGhlIGRlZmF1bHQgcHJvY2Vzc2luZy4gSXQgbWF5IGJlIGFzeW5jLlxuICovXG50eXBlIE1lc3NhZ2VMaXN0ZW5lckZuID0gKG1zZzogSW9NZXNzYWdlPGFueT4pID0+IE1lc3NhZ2VMaXN0ZW5lclJlc3VsdE9yUHJvbWlzZTtcbmludGVyZmFjZSBNZXNzYWdlTGlzdGVuZXIge1xuICByZWFkb25seSBvbmNlOiBib29sZWFuO1xuICByZWFkb25seSBmbjogTWVzc2FnZUxpc3RlbmVyRm47XG4gIC8qKlxuICAgKiBEZWNpZGVzIHdoaWNoIG1lc3NhZ2VzIHRoaXMgbGlzdGVuZXIgYXBwbGllcyB0by4gRm9yIGEgbGlzdGVuZXIgcmVnaXN0ZXJlZFxuICAgKiB3aXRoIGEgbWFrZXIgdGhpcyBtYXRjaGVzIGJ5IGBjb2RlYDsgZm9yIG9uZSByZWdpc3RlcmVkIHdpdGggYSBwcmVkaWNhdGUgaXRcbiAgICogaXMgdGhlIHByZWRpY2F0ZSBpdHNlbGYuXG4gICAqL1xuICByZWFkb25seSBtYXRjaGVzOiAobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pID0+IGJvb2xlYW47XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgaXMgb25lIG9mIHRoZSBob3N0J3Mgb3duIGludGVybmFsIGxpc3RlbmVycyAoZS5nLiBzdGFjay1hY3Rpdml0eVxuICAgKiByb3V0aW5nKS4gSW50ZXJuYWwgbGlzdGVuZXJzIGFyZSBub3QgcmVtb3ZlZCBieSBgcmVtb3ZlQWxsTGlzdGVuZXJzYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2UgLSBhIHVzZXIgbGlzdGVuZXIgcmVnaXN0ZXJlZCB2aWEgYG9uYC9gb25jZWAvYHJld3JpdGVgL2ByZXNwb25kYFxuICAgKi9cbiAgcmVhZG9ubHkgaW50ZXJuYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFNlbGVjdHMgd2hpY2ggbWVzc2FnZXMgYSBsaXN0ZW5lciBhcHBsaWVzIHRvLlxuICpcbiAqIEVpdGhlciBhIG1lc3NhZ2UvcmVxdWVzdCAqbWFrZXIqIOKAlCB0aGUgbGlzdGVuZXIgZmlyZXMgZm9yIG1lc3NhZ2VzIHdpdGggdGhhdFxuICogbWFrZXIncyBgY29kZWAgKHRoZSBvcmlnaW5hbCBiZWhhdmlvcikg4oCUIG9yIGEgY3VzdG9tICpwcmVkaWNhdGUqIG92ZXIgdGhlXG4gKiBtZXNzYWdlLiBBIG1ha2VyJ3MgYC5pc2AgdHlwZSBndWFyZCAoZS5nLiBgSU8uQ0RLX1RPT0xLSVRfSTcwMTAuaXNgKSBpcyBhXG4gKiBjb252ZW5pZW50IHByZWRpY2F0ZSwgYnV0IGFueSBgKG1zZykgPT4gYm9vbGVhbmAgd29ya3MgKGUuZy4gdG8gbWF0Y2ggYSBmYW1pbHlcbiAqIG9mIGNvZGVzLCBvciBvbiB0aGUgbWVzc2FnZSBsZXZlbCkuXG4gKi9cbmV4cG9ydCB0eXBlIE1lc3NhZ2VTZWxlY3RvcjxUPiA9XG4gIHwgSW9NZXNzYWdlTWFrZXI8VD5cbiAgfCBJb1JlcXVlc3RNYWtlcjxULCBhbnk+XG4gIHwgKChtc2c6IElvTWVzc2FnZTxhbnk+KSA9PiBib29sZWFuKTtcblxuLyoqXG4gKiBIb3cgYW4gSW9Ib3N0IHByb2Nlc3NlZCBhIHNpbmdsZSBtZXNzYWdlIG9yIHJlcXVlc3QuXG4gKlxuICogVGhpcyBkZXNjcmliZXMgdGhlIG1lc3NhZ2UgKmFzIHRoZSBob3N0IGhhbmRsZWQgaXQqLCB3aGljaCBjYW4gZGlmZmVyIGZyb21cbiAqIHdoYXQgd2FzIGVtaXR0ZWQ6IGxpc3RlbmVycyBtYXkgcmV3cml0ZSB0aGUgdGV4dCBvciBsZXZlbCwgcHJldmVudCBpdCBmcm9tXG4gKiBiZWluZyB3cml0dGVuIGF0IGFsbCwgb3IgKGZvciByZXF1ZXN0cykgYW5zd2VyIGl0IG9uIHRoZSB1c2VyJ3MgYmVoYWxmLlxuICpcbiAqIEJvdGggbm90aWZpY2F0aW9ucyAoYG5vdGlmeWApIGFuZCByZXF1ZXN0cyAoYHJlcXVlc3RSZXNwb25zZWApIGFyZSByZXBvcnRlZCxcbiAqIHNvIGFuIG9ic2VydmVyIHNlZXMgdGhlIGNvbXBsZXRlLCBvcmRlcmVkIHN0cmVhbSB0aGUgaG9zdCBoYW5kbGVkLiBVc2VcbiAqIGB0eXBlYCB0byB0ZWxsIHRoZW0gYXBhcnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW9NZXNzYWdlT2JzZXJ2YXRpb24ge1xuICAvKipcbiAgICogV2hldGhlciB0aGlzIG9ic2VydmF0aW9uIGRlc2NyaWJlcyBhIHBsYWluIG5vdGlmaWNhdGlvbiAoYG5vdGlmeWApIG9yIGFcbiAgICogcmVxdWVzdCB0aGF0IGFza2VkIGZvciBhIHJlc3BvbnNlIChgcmVxdWVzdFJlc3BvbnNlYCkuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiAnbm90aWZ5JyB8ICdyZXF1ZXN0JztcblxuICAvKipcbiAgICogVGhlIG1lc3NhZ2UgZXhhY3RseSBhcyBpdCB3YXMgZW1pdHRlZCB0byB0aGUgaG9zdCAoYmVmb3JlIGFueSBsaXN0ZW5lcnMpLlxuICAgKi9cbiAgcmVhZG9ubHkgZW1pdHRlZDogSW9NZXNzYWdlPHVua25vd24+O1xuXG4gIC8qKlxuICAgKiBUaGUgbWVzc2FnZSBhZnRlciB0aGUgaG9zdCdzIGxpc3RlbmVycyByYW4gKHRleHQgYW5kL29yIGxldmVsIG1heSBkaWZmZXIpLlxuICAgKi9cbiAgcmVhZG9ubHkgZWZmZWN0aXZlOiBJb01lc3NhZ2U8dW5rbm93bj47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgYSBsaXN0ZW5lciBwcmV2ZW50ZWQgdGhpcyBtZXNzYWdlIGZyb20gYmVpbmcgd3JpdHRlbiwgaS5lLiB0aGUgdXNlclxuICAgKiB3b3VsZCBub3Qgc2VlIGl0LiBBbHdheXMgYGZhbHNlYCBmb3IgcmVxdWVzdHMgKGEgcmVxdWVzdCBpcyByZXBvcnRlZCBvbmNlXG4gICAqIGl0IGhhcyBiZWVuIHJlc29sdmVkLCByZWdhcmRsZXNzIG9mIGhvdyBpdCB3YXMgYW5zd2VyZWQpLlxuICAgKi9cbiAgcmVhZG9ubHkgZHJvcHBlZDogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbiBJb0hvc3Qgd2hvc2UgbWVzc2FnZSBoYW5kbGluZyBjYW4gYmUgb2JzZXJ2ZWQuXG4gKlxuICogVGhpcyBpcyBhIENMSS1pbnRlcm5hbCBjb250cmFjdCB1c2VkIGJ5IHRlc3RzIHRvIHJlY29yZCB0aGUgKmVmZmVjdGl2ZSosXG4gKiB1c2VyLWZhY2luZyBtZXNzYWdlIHN0cmVhbSAoYWZ0ZXIgbGlzdGVuZXJzKSB3aXRob3V0IHJlYWNoaW5nIGludG8gaG9zdFxuICogaW50ZXJuYWxzLiBJdCBpcyBpbnRlbnRpb25hbGx5IHNlcGFyYXRlIGZyb20gYElJb0hvc3RgIHNvIHRoYXQgdGhlIHJlY29yZGVyXG4gKiBjYW4gd29yayB3aXRoIGFueSBgSUlvSG9zdGAgYW5kIG9ubHkgZW5yaWNoIGl0cyBvdXRwdXQgd2hlbiB0aGUgaG9zdCBhbHNvXG4gKiBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9ic2VydmFibGVJb0hvc3Qge1xuICAvKipcbiAgICogUmVnaXN0ZXIgYW4gb2JzZXJ2ZXIgdGhhdCBpcyBpbnZva2VkIGZvciBldmVyeSBtZXNzYWdlIHRoZSBob3N0IGhhbmRsZXMg4oCUXG4gICAqIGJvdGggbm90aWZpY2F0aW9ucyBhbmQgcmVxdWVzdHMg4oCUIHdpdGggdGhlIGRpc3Bvc2l0aW9uIHRoZSBob3N0IGNvbXB1dGVkXG4gICAqIGZvciBpdCAoaXRzIGVmZmVjdGl2ZSBmb3JtIGFmdGVyIGxpc3RlbmVycyBhbmQgd2hldGhlciBpdCB3YXMgZHJvcHBlZCkuIEZvclxuICAgKiBhIHJlcXVlc3QsIHRoZSByZXNvbHZlZCBhbnN3ZXIgaXMgdGhlIGVmZmVjdGl2ZSBtZXNzYWdlJ3MgYGRlZmF1bHRSZXNwb25zZWAuXG4gICAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHJlbW92ZXMgdGhlIG9ic2VydmVyIGFnYWluLlxuICAgKi9cbiAgb2JzZXJ2ZU1lc3NhZ2VzKG9ic2VydmVyOiAob2JzZXJ2YXRpb246IElvTWVzc2FnZU9ic2VydmF0aW9uKSA9PiB2b2lkKTogKCkgPT4gdm9pZDtcbn1cblxuLyoqXG4gKiBBIHNpbXBsZSBJTyBob3N0IGZvciB0aGUgQ0xJIHRoYXQgd3JpdGVzIG1lc3NhZ2VzIHRvIHRoZSBjb25zb2xlLlxuICovXG5leHBvcnQgY2xhc3MgQ2xpSW9Ib3N0IGltcGxlbWVudHMgSUlvSG9zdCwgT2JzZXJ2YWJsZUlvSG9zdCB7XG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzaW5nbGV0b24gaW5zdGFuY2VcbiAgICovXG4gIHN0YXRpYyBpbnN0YW5jZShwcm9wczogQ2xpSW9Ib3N0UHJvcHMgPSB7fSwgZm9yY2VOZXcgPSBmYWxzZSk6IENsaUlvSG9zdCB7XG4gICAgaWYgKGZvcmNlTmV3IHx8ICFDbGlJb0hvc3QuX2luc3RhbmNlKSB7XG4gICAgICBDbGlJb0hvc3QuX2luc3RhbmNlID0gbmV3IENsaUlvSG9zdChwcm9wcyk7XG4gICAgfVxuICAgIHJldHVybiBDbGlJb0hvc3QuX2luc3RhbmNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBpZiBpdCBleGlzdHNcbiAgICovXG4gIHN0YXRpYyBnZXQoKTogQ2xpSW9Ib3N0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gQ2xpSW9Ib3N0Ll9pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIENsaUlvSG9zdFxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgX2luc3RhbmNlOiBDbGlJb0hvc3QgfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBjdXJyZW50IGFjdGlvbiBiZWluZyBwZXJmb3JtZWQgYnkgdGhlIENMSS5cbiAgICovXG4gIHB1YmxpYyBjdXJyZW50QWN0aW9uOiBDbGlBY3Rpb247XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIENsaUlvSG9zdCBpcyBydW5uaW5nIGluIENJIG1vZGUuXG4gICAqXG4gICAqIEluIENJIG1vZGUsIGFsbCBub24tZXJyb3Igb3V0cHV0IGdvZXMgdG8gc3Rkb3V0IGluc3RlYWQgb2Ygc3RkZXJyLlxuICAgKi9cbiAgcHVibGljIGlzQ0k6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGhvc3QgY2FuIHVzZSBpbnRlcmFjdGlvbnMgYW5kIG1lc3NhZ2Ugc3R5bGluZy5cbiAgICovXG4gIHB1YmxpYyBpc1RUWTogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGN1cnJlbnQgdGhyZXNob2xkLlxuICAgKlxuICAgKiBNZXNzYWdlcyB3aXRoIGEgbG93ZXIgcHJpb3JpdHkgbGV2ZWwgd2lsbCBiZSBpZ25vcmVkLlxuICAgKi9cbiAgcHVibGljIGxvZ0xldmVsOiBJb01lc3NhZ2VMZXZlbDtcblxuICAvKipcbiAgICogVGhlIGNvbmRpdGlvbnMgZm9yIHJlcXVpcmluZyBhcHByb3ZhbCBpbiB0aGlzIENsaUlvSG9zdC5cbiAgICovXG4gIHB1YmxpYyByZXF1aXJlRGVwbG95QXBwcm92YWw6IFJlcXVpcmVBcHByb3ZhbDtcblxuICAvKipcbiAgICogQ29uZmlndXJlIHRoZSB0YXJnZXQgc3RyZWFtIGZvciBub3RpY2VzXG4gICAqXG4gICAqIChOb3QgYSBzZXR0ZXIgYmVjYXVzZSB0aGVyZSdzIG5vIG5lZWQgZm9yIGFkZGl0aW9uYWwgbG9naWMgd2hlbiB0aGlzIHZhbHVlXG4gICAqIGlzIGNoYW5nZWQgeWV0KVxuICAgKi9cbiAgcHVibGljIG5vdGljZXNEZXN0aW5hdGlvbjogVGFyZ2V0U3RyZWFtID0gJ3N0ZGVycic7XG5cbiAgcHJpdmF0ZSBfcHJvZ3Jlc3M6IFN0YWNrQWN0aXZpdHlQcm9ncmVzcyA9IFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5CQVI7XG5cbiAgLy8gU3RhY2sgQWN0aXZpdHkgUHJpbnRlclxuICBwcml2YXRlIGFjdGl2aXR5UHJpbnRlcj86IElBY3Rpdml0eVByaW50ZXI7XG5cbiAgLy8gQ29ya2VkIExvZ2dpbmdcbiAgcHJpdmF0ZSBjb3JrZWRDb3VudGVyID0gMDtcbiAgcHJpdmF0ZSByZWFkb25seSBjb3JrZWRMb2dnaW5nQnVmZmVyOiBJb01lc3NhZ2U8dW5rbm93bj5bXSA9IFtdO1xuXG4gIC8vIE1lc3NhZ2UgbGlzdGVuZXJzIGluIHJlZ2lzdHJhdGlvbiBvcmRlci4gRWFjaCBjYXJyaWVzIGEgbWF0Y2hlciAoYnkgY29kZSxcbiAgLy8gb3IgYSBjdXN0b20gcHJlZGljYXRlKS4gU2VlIGBvbmAvYG9uY2VgL2ByZXdyaXRlYC9gcmVzcG9uZGAuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZUxpc3RlbmVyczogTWVzc2FnZUxpc3RlbmVyW10gPSBbXTtcblxuICAvLyBPYnNlcnZlcnMgb2YgaG93IG1lc3NhZ2VzIGFyZSBoYW5kbGVkIChzZWUgT2JzZXJ2YWJsZUlvSG9zdCAvIG9ic2VydmVNZXNzYWdlcykuXG4gIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZU9ic2VydmVycyA9IG5ldyBTZXQ8KG9ic2VydmF0aW9uOiBJb01lc3NhZ2VPYnNlcnZhdGlvbikgPT4gdm9pZD4oKTtcblxuICAvLyBUcnVlIHdoaWxlIHJlcGxheWluZyBjb3JrZWQgbWVzc2FnZXMsIHNvIG9ic2VydmVycyBhcmVuJ3Qgbm90aWZpZWQgdHdpY2UuXG4gIHByaXZhdGUgY29ya1JlcGxheWluZyA9IGZhbHNlO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXV0b1Jlc3BvbmQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSB0ZWxlbWV0cnkgc2Vzc2lvbiBvYmplY3RcbiAgICpcbiAgICogV2lsbCByZW1haW4gYHVuZGVmaW5lZGAgaWYgdGhlIHVzZXIgaGFzIGRpc2FibGVkIHRlbGVtZXRyeS5cbiAgICovXG4gIHB1YmxpYyB0ZWxlbWV0cnk/OiBUZWxlbWV0cnlTZXNzaW9uO1xuXG4gIHByaXZhdGUgY29uc3RydWN0b3IocHJvcHM6IENsaUlvSG9zdFByb3BzID0ge30pIHtcbiAgICB0aGlzLmN1cnJlbnRBY3Rpb24gPSBwcm9wcy5jdXJyZW50QWN0aW9uID8/ICdub25lJztcbiAgICB0aGlzLmlzVFRZID0gcHJvcHMuaXNUVFkgPz8gcHJvY2Vzcy5zdGRvdXQuaXNUVFkgPz8gZmFsc2U7XG4gICAgdGhpcy5sb2dMZXZlbCA9IHByb3BzLmxvZ0xldmVsID8/ICdpbmZvJztcbiAgICB0aGlzLmlzQ0kgPSBwcm9wcy5pc0NJID8/IGlzQ0koKTtcbiAgICB0aGlzLnJlcXVpcmVEZXBsb3lBcHByb3ZhbCA9IHByb3BzLnJlcXVpcmVEZXBsb3lBcHByb3ZhbCA/PyBSZXF1aXJlQXBwcm92YWwuQlJPQURFTklORztcbiAgICB0aGlzLnN0YWNrUHJvZ3Jlc3MgPSBwcm9wcy5zdGFja1Byb2dyZXNzID8/IFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5CQVI7XG4gICAgdGhpcy5hdXRvUmVzcG9uZCA9IHByb3BzLmF1dG9SZXNwb25kID8/IGZhbHNlO1xuXG4gICAgLy8gU3RhY2stYWN0aXZpdHkgbWVzc2FnZXMgYXJlIGhhbmRsZWQgYnkgdGhlIGFjdGl2aXR5IHByaW50ZXIgcmF0aGVyIHRoYW5cbiAgICAvLyB3cml0dGVuIHRvIGEgc3RyZWFtLiBUaGlzIGlzIHdpcmVkIHVwIGFzIG1lc3NhZ2UgbGlzdGVuZXJzLlxuICAgIHRoaXMucm91dGVTdGFja0FjdGl2aXR5VG9QcmludGVyKCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgc3RhcnRUZWxlbWV0cnkoYXJnczogYW55LCBjb250ZXh0OiBDb250ZXh0LCBwcm94eUFnZW50PzogQWdlbnQpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuICAgIGNvbnN0IGNvbmZpZyA9IHJlcXVpcmUoJy4uL2NsaS10eXBlLXJlZ2lzdHJ5Lmpzb24nKTtcbiAgICBjb25zdCB2YWxpZENvbW1hbmRzID0gT2JqZWN0LmtleXMoY29uZmlnLmNvbW1hbmRzKTtcbiAgICBjb25zdCBjbWQgPSBhcmdzLl9bMF07XG4gICAgaWYgKCF2YWxpZENvbW1hbmRzLmluY2x1ZGVzKGNtZCkpIHtcbiAgICAgIC8vIHRoZSB1c2VyIHR5cGVkIGluIGFuIGludmFsaWQgY29tbWFuZCAtIG5vIG5lZWQgZm9yIHRlbGVtZXRyeSBzaW5jZSB0aGUgaW52b2NhdGlvbiBpcyBnb2luZyB0byBmYWlsXG4gICAgICAvLyBpbW1pbmVudGx5IGFueXdheS5cbiAgICAgIGF3YWl0IHRoaXMuYXNJb0hlbHBlcigpLmRlZmF1bHRzLnRyYWNlKGBTZXNzaW9uIGluc3RhbnRpYXRlZCB3aXRoIGFuIGludmFsaWQgY29tbWFuZCAoJHtjbWR9KS4gTm90IHN0YXJ0aW5nIHRlbGVtZXRyeS5gKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgc2lua3M6IElUZWxlbWV0cnlTaW5rW10gPSBbXTtcbiAgICBjb25zdCB0ZWxlbWV0cnlGaWxlUGF0aCA9IGFyZ3NbJ3RlbGVtZXRyeS1maWxlJ107XG4gICAgaWYgKHRlbGVtZXRyeUZpbGVQYXRoKSB7XG4gICAgICB0cnkge1xuICAgICAgICBzaW5rcy5wdXNoKG5ldyBGaWxlVGVsZW1ldHJ5U2luayh7XG4gICAgICAgICAgaW9Ib3N0OiB0aGlzLFxuICAgICAgICAgIGxvZ0ZpbGVQYXRoOiB0ZWxlbWV0cnlGaWxlUGF0aCxcbiAgICAgICAgfSkpO1xuICAgICAgICBhd2FpdCB0aGlzLmFzSW9IZWxwZXIoKS5kZWZhdWx0cy50cmFjZSgnRmlsZSBUZWxlbWV0cnkgY29ubmVjdGVkJyk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hc0lvSGVscGVyKCkuZGVmYXVsdHMudHJhY2UoYEZpbGUgVGVsZW1ldHJ5IGluc3RhbnRpYXRpb24gZmFpbGVkOiAke2UubWVzc2FnZX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB0ZWxlbWV0cnlFbmRwb2ludCA9IHByb2Nlc3MuZW52LlRFTEVNRVRSWV9FTkRQT0lOVCA/PyAnaHR0cHM6Ly9jZGstY2xpLXRlbGVtZXRyeS51cy1lYXN0LTEuYXBpLmF3cy9tZXRyaWNzJztcbiAgICBpZiAoY2FuQ29sbGVjdFRlbGVtZXRyeShhcmdzLCBjb250ZXh0KSAmJiB0ZWxlbWV0cnlFbmRwb2ludCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgc2lua3MucHVzaChuZXcgRW5kcG9pbnRUZWxlbWV0cnlTaW5rKHtcbiAgICAgICAgICBpb0hvc3Q6IHRoaXMsXG4gICAgICAgICAgYWdlbnQ6IHByb3h5QWdlbnQsXG4gICAgICAgICAgZW5kcG9pbnQ6IHRlbGVtZXRyeUVuZHBvaW50LFxuICAgICAgICB9KSk7XG4gICAgICAgIGF3YWl0IHRoaXMuYXNJb0hlbHBlcigpLmRlZmF1bHRzLnRyYWNlKCdFbmRwb2ludCBUZWxlbWV0cnkgY29ubmVjdGVkJyk7XG4gICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgYXdhaXQgdGhpcy5hc0lvSGVscGVyKCkuZGVmYXVsdHMudHJhY2UoYEVuZHBvaW50IFRlbGVtZXRyeSBpbnN0YW50aWF0aW9uIGZhaWxlZDogJHtlLm1lc3NhZ2V9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGF3YWl0IHRoaXMuYXNJb0hlbHBlcigpLmRlZmF1bHRzLnRyYWNlKCdFbmRwb2ludCBUZWxlbWV0cnkgTk9UIGNvbm5lY3RlZCcpO1xuICAgIH1cblxuICAgIGlmIChzaW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnRlbGVtZXRyeSA9IG5ldyBUZWxlbWV0cnlTZXNzaW9uKHtcbiAgICAgICAgaW9Ib3N0OiB0aGlzLFxuICAgICAgICBjbGllbnQ6IG5ldyBGdW5uZWwoeyBzaW5rcyB9KSxcbiAgICAgICAgYXJndW1lbnRzOiBhcmdzLFxuICAgICAgICBjb250ZXh0OiBjb250ZXh0LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXdhaXQgdGhpcy50ZWxlbWV0cnk/LmJlZ2luKCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlIHRoZSBzdGFja1Byb2dyZXNzIHByZWZlcmVuY2UuXG4gICAqL1xuICBwdWJsaWMgc2V0IHN0YWNrUHJvZ3Jlc3ModHlwZTogU3RhY2tBY3Rpdml0eVByb2dyZXNzKSB7XG4gICAgdGhpcy5fcHJvZ3Jlc3MgPSB0eXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHN0YWNrUHJvZ3Jlc3MgdmFsdWUuXG4gICAqXG4gICAqIFRoaXMgdGFrZXMgaW50byBhY2NvdW50IG90aGVyIHN0YXRlIG9mIHRoZSBpb0hvc3QsXG4gICAqIGxpa2UgaWYgaXNUVFkgYW5kIGlzQ0kuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN0YWNrUHJvZ3Jlc3MoKTogU3RhY2tBY3Rpdml0eVByb2dyZXNzIHtcbiAgICAvLyBXZSBjYW4gYWx3YXlzIHVzZSBFVkVOVFNcbiAgICBpZiAodGhpcy5fcHJvZ3Jlc3MgPT09IFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFMpIHtcbiAgICAgIHJldHVybiB0aGlzLl9wcm9ncmVzcztcbiAgICB9XG5cbiAgICAvLyBpZiBhIGRlYnVnIG1lc3NhZ2UgKGFuZCB0aHVzIGFueSBtb3JlIHZlcmJvc2UgbWVzc2FnZXMpIGFyZSByZWxldmFudCB0byB0aGUgY3VycmVudCBsb2cgbGV2ZWwsIHdlIGhhdmUgdmVyYm9zZSBsb2dnaW5nXG4gICAgY29uc3QgdmVyYm9zZUxvZ2dpbmcgPSBpc01lc3NhZ2VSZWxldmFudEZvckxldmVsKHsgbGV2ZWw6ICdkZWJ1ZycgfSwgdGhpcy5sb2dMZXZlbCk7XG4gICAgaWYgKHZlcmJvc2VMb2dnaW5nKSB7XG4gICAgICByZXR1cm4gU3RhY2tBY3Rpdml0eVByb2dyZXNzLkVWRU5UUztcbiAgICB9XG5cbiAgICAvLyBPbiBXaW5kb3dzIHdlIGNhbm5vdCB1c2UgZmFuY3kgb3V0cHV0XG4gICAgY29uc3QgaXNXaW5kb3dzID0gcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ3dpbjMyJztcbiAgICBpZiAoaXNXaW5kb3dzKSB7XG4gICAgICByZXR1cm4gU3RhY2tBY3Rpdml0eVByb2dyZXNzLkVWRU5UUztcbiAgICB9XG5cbiAgICAvLyBPbiBzb21lIENJIHN5c3RlbXMgKHN1Y2ggYXMgQ2lyY2xlQ0kpIG91dHB1dCBzdGlsbCByZXBvcnRzIGFzIGEgVFRZIHNvIHdlIGFsc29cbiAgICAvLyBuZWVkIGFuIGluZGl2aWR1YWwgY2hlY2sgZm9yIHdoZXRoZXIgd2UncmUgcnVubmluZyBvbiBDSS5cbiAgICAvLyBzZWU6IGh0dHBzOi8vZGlzY3Vzcy5jaXJjbGVjaS5jb20vdC9jaXJjbGVjaS10ZXJtaW5hbC1pcy1hLXR0eS1idXQtdGVybS1pcy1ub3Qtc2V0Lzk5NjVcbiAgICBjb25zdCBmYW5jeU91dHB1dEF2YWlsYWJsZSA9IHRoaXMuaXNUVFkgJiYgIXRoaXMuaXNDSTtcbiAgICBpZiAoIWZhbmN5T3V0cHV0QXZhaWxhYmxlKSB7XG4gICAgICByZXR1cm4gU3RhY2tBY3Rpdml0eVByb2dyZXNzLkVWRU5UUztcbiAgICB9XG5cbiAgICAvLyBVc2UgdGhlIHVzZXIgcHJlZmVyZW5jZVxuICAgIHJldHVybiB0aGlzLl9wcm9ncmVzcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGVmYXVsdHMoKTogSW9EZWZhdWx0TWVzc2FnZXMge1xuICAgIHJldHVybiB0aGlzLmFzSW9IZWxwZXIoKS5kZWZhdWx0cztcbiAgfVxuXG4gIHB1YmxpYyBhc0lvSGVscGVyKCk6IElvSGVscGVyIHtcbiAgICByZXR1cm4gYXNJb0hlbHBlcih0aGlzLCB0aGlzLmN1cnJlbnRBY3Rpb24gYXMgYW55KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBhIGJsb2NrIG9mIGNvZGUgd2l0aCBjb3JrZWQgbG9nZ2luZy4gQWxsIGxvZyBtZXNzYWdlcyBkdXJpbmcgZXhlY3V0aW9uXG4gICAqIGFyZSBidWZmZXJlZCBhbmQgb25seSB3cml0dGVuIHdoZW4gYWxsIG5lc3RlZCBjb3JrIGJsb2NrcyBjb21wbGV0ZSAod2hlbiBDT1JLX0NPVU5URVIgcmVhY2hlcyAwKS5cbiAgICogVGhlIGNvcmtpbmcgaXMgYm91bmQgdG8gdGhlIHNwZWNpZmljIGluc3RhbmNlIG9mIHRoZSBDbGlJb0hvc3QuXG4gICAqXG4gICAqIEBwYXJhbSBibG9jayAtIEFzeW5jIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgd2l0aCBjb3JrZWQgbG9nZ2luZ1xuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgYmxvY2sncyByZXR1cm4gdmFsdWVcbiAgICovXG4gIHB1YmxpYyBhc3luYyB3aXRoQ29ya2VkTG9nZ2luZzxUPihibG9jazogKCkgPT4gUHJvbWlzZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHRoaXMuY29ya2VkQ291bnRlcisrO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gYXdhaXQgYmxvY2soKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5jb3JrZWRDb3VudGVyLS07XG4gICAgICBpZiAodGhpcy5jb3JrZWRDb3VudGVyID09PSAwKSB7XG4gICAgICAgIC8vIFByb2Nlc3MgZWFjaCBidWZmZXJlZCBtZXNzYWdlIHRocm91Z2ggbm90aWZ5XG4gICAgICAgIHRoaXMuY29ya1JlcGxheWluZyA9IHRydWU7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgZm9yIChjb25zdCBpb01lc3NhZ2Ugb2YgdGhpcy5jb3JrZWRMb2dnaW5nQnVmZmVyKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLm5vdGlmeShpb01lc3NhZ2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aGlzLmNvcmtSZXBsYXlpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvLyByZW1vdmUgYWxsIGJ1ZmZlcmVkIG1lc3NhZ2VzIGluLXBsYWNlXG4gICAgICAgIHRoaXMuY29ya2VkTG9nZ2luZ0J1ZmZlci5zcGxpY2UoMCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgbGlzdGVuZXIgdGhhdCBpcyBpbnZva2VkIGZvciBldmVyeSBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIGNvZGUuXG4gICAqXG4gICAqIFRoZSBsaXN0ZW5lciBtYXkgcmV0dXJuIGEgYE1lc3NhZ2VMaXN0ZW5lclJlc3VsdGAgdG8gdXBkYXRlIHRoZSBtZXNzYWdlXG4gICAqIHRleHQgYW5kL29yIHByZXZlbnQgdGhlIGRlZmF1bHQgcHJvY2Vzc2luZyAod3JpdGluZyBpdCB0byBhIHN0cmVhbSk7XG4gICAqIHJldHVybmluZyBub3RoaW5nIGxlYXZlcyB0aGUgbWVzc2FnZSB1bnRvdWNoZWQuIFRoZSBsaXN0ZW5lciBtYXkgYmUgYXN5bmNcbiAgICogKHJldHVybiBhIGBQcm9taXNlYCk7IHRoZSBob3N0IGF3YWl0cyBpdCBiZWZvcmUgcHJvY2Vzc2luZyB0aGUgbWVzc2FnZVxuICAgKiBmdXJ0aGVyLiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCByZW1vdmVzIHRoZSBsaXN0ZW5lciBhZ2Fpbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgZGlzcG9zZSA9IGlvSG9zdC5vbihJTy5DREtfVE9PTEtJVF9JMjkwMSwgYXN5bmMgKG1zZykgPT4ge1xuICAgKiAgIG15Q291bnQgKz0gbXNnLmRhdGEuc3RhY2tzLmxlbmd0aDtcbiAgICogICBhd2FpdCBwZXJzaXN0KG15Q291bnQpO1xuICAgKiB9KTtcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogLy8gTWF0Y2ggd2l0aCBhIGN1c3RvbSBwcmVkaWNhdGUgaW5zdGVhZCBvZiBhIGNvZGUsIGUuZy4gYSBtYWtlcidzIGAuaXNgOlxuICAgKiBjb25zdCBkaXNwb3NlID0gaW9Ib3N0Lm9uKElPLkNES19UT09MS0lUX0k3MDEwLmlzLCAobXNnKSA9PiAoeyByZXNwb25kOiB0cnVlIH0pKTtcbiAgICovXG4gIHB1YmxpYyBvbjxUPihcbiAgICBzZWxlY3RvcjogSW9NZXNzYWdlTWFrZXI8VD4gfCBJb1JlcXVlc3RNYWtlcjxULCBhbnk+IHwgKChtc2c6IElvTWVzc2FnZTxhbnk+KSA9PiBtc2cgaXMgSW9NZXNzYWdlPFQ+KSxcbiAgICBsaXN0ZW5lcjogKG1zZzogSW9NZXNzYWdlPFQ+KSA9PiBNZXNzYWdlTGlzdGVuZXJSZXN1bHRPclByb21pc2UsXG4gICk6ICgpID0+IHZvaWQ7XG4gIHB1YmxpYyBvbihcbiAgICBwcmVkaWNhdGU6IChtc2c6IElvTWVzc2FnZTxhbnk+KSA9PiBib29sZWFuLFxuICAgIGxpc3RlbmVyOiAobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pID0+IE1lc3NhZ2VMaXN0ZW5lclJlc3VsdE9yUHJvbWlzZSxcbiAgKTogKCkgPT4gdm9pZDtcbiAgcHVibGljIG9uKHNlbGVjdG9yOiBNZXNzYWdlU2VsZWN0b3I8YW55PiwgbGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lckZuKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMuYWRkTWVzc2FnZUxpc3RlbmVyKHsgb25jZTogZmFsc2UsIGZuOiBsaXN0ZW5lciwgbWF0Y2hlczogbWVzc2FnZU1hdGNoZXIoc2VsZWN0b3IpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGFuIG9ic2VydmVyIHRoYXQgaXMgaW52b2tlZCBmb3IgZXZlcnkgbWVzc2FnZSB0aGUgaG9zdCBoYW5kbGVzIOKAlFxuICAgKiBib3RoIG5vdGlmaWNhdGlvbnMgYW5kIHJlcXVlc3RzIOKAlCB3aXRoIHRoZSBkaXNwb3NpdGlvbiB0aGUgaG9zdCBjb21wdXRlZFxuICAgKiBmb3IgaXQgKGl0cyBlZmZlY3RpdmUgZm9ybSBhZnRlciBsaXN0ZW5lcnMgYW5kIHdoZXRoZXIgaXQgd2FzIGRyb3BwZWQpLiBGb3JcbiAgICogYSByZXF1ZXN0LCB0aGUgcmVzb2x2ZWQgYW5zd2VyIGlzIHRoZSBlZmZlY3RpdmUgbWVzc2FnZSdzIGBkZWZhdWx0UmVzcG9uc2VgLlxuICAgKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCByZW1vdmVzIHRoZSBvYnNlcnZlci5cbiAgICpcbiAgICogQHNlZSBPYnNlcnZhYmxlSW9Ib3N0XG4gICAqL1xuICBwdWJsaWMgb2JzZXJ2ZU1lc3NhZ2VzKG9ic2VydmVyOiAob2JzZXJ2YXRpb246IElvTWVzc2FnZU9ic2VydmF0aW9uKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5tZXNzYWdlT2JzZXJ2ZXJzLmFkZChvYnNlcnZlcik7XG4gICAgcmV0dXJuICgpID0+IHtcbiAgICAgIHRoaXMubWVzc2FnZU9ic2VydmVycy5kZWxldGUob2JzZXJ2ZXIpO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTGlrZSBgb25gLCBidXQgdGhlIGxpc3RlbmVyIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBhZnRlciBpdCBoYXMgYmVlblxuICAgKiBpbnZva2VkIG9uY2UuXG4gICAqL1xuICBwdWJsaWMgb25jZTxUPihcbiAgICBzZWxlY3RvcjogSW9NZXNzYWdlTWFrZXI8VD4gfCBJb1JlcXVlc3RNYWtlcjxULCBhbnk+IHwgKChtc2c6IElvTWVzc2FnZTxhbnk+KSA9PiBtc2cgaXMgSW9NZXNzYWdlPFQ+KSxcbiAgICBsaXN0ZW5lcjogKG1zZzogSW9NZXNzYWdlPFQ+KSA9PiBNZXNzYWdlTGlzdGVuZXJSZXN1bHRPclByb21pc2UsXG4gICk6ICgpID0+IHZvaWQ7XG4gIHB1YmxpYyBvbmNlKFxuICAgIHByZWRpY2F0ZTogKG1zZzogSW9NZXNzYWdlPGFueT4pID0+IGJvb2xlYW4sXG4gICAgbGlzdGVuZXI6IChtc2c6IElvTWVzc2FnZTx1bmtub3duPikgPT4gTWVzc2FnZUxpc3RlbmVyUmVzdWx0T3JQcm9taXNlLFxuICApOiAoKSA9PiB2b2lkO1xuICBwdWJsaWMgb25jZShzZWxlY3RvcjogTWVzc2FnZVNlbGVjdG9yPGFueT4sIGxpc3RlbmVyOiBNZXNzYWdlTGlzdGVuZXJGbik6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmFkZE1lc3NhZ2VMaXN0ZW5lcih7IG9uY2U6IHRydWUsIGZuOiBsaXN0ZW5lciwgbWF0Y2hlczogbWVzc2FnZU1hdGNoZXIoc2VsZWN0b3IpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBldmVyeSBtZXNzYWdlIGxpc3RlbmVyIHJlZ2lzdGVyZWQgdmlhIGBvbmAvYG9uY2VgL2ByZXdyaXRlYC9gcmVzcG9uZGAuXG4gICAqXG4gICAqIFRoZSBob3N0J3Mgb3duIGludGVybmFsIGxpc3RlbmVycyAoc3VjaCBhcyBzdGFjay1hY3Rpdml0eSByb3V0aW5nKSBhcmUga2VwdCxcbiAgICogc28gdGhlIGhvc3Qga2VlcHMgd29ya2luZyBhZnRlcndhcmRzLiBNZXNzYWdlIG9ic2VydmVycyByZWdpc3RlcmVkIHZpYVxuICAgKiBgb2JzZXJ2ZU1lc3NhZ2VzYCBhcmUgYSBzZXBhcmF0ZSBtZWNoYW5pc20gYW5kIGFyZSBub3QgYWZmZWN0ZWQuXG4gICAqXG4gICAqIFRoaXMgaXMgbWFpbmx5IHVzZWZ1bCBmb3IgdGVzdHMgdGhhdCBzaGFyZSB0aGUgc2luZ2xldG9uIGhvc3QgYW5kIG5lZWQgdG9cbiAgICogcmVzZXQgbGlzdGVuZXIgc3RhdGUgYmV0d2VlbiBjYXNlcyAoYSBsZWZ0b3ZlciBsaXN0ZW5lciB3b3VsZCBvdGhlcndpc2VcbiAgICogbGVhayBpbnRvIHRoZSBuZXh0IHRlc3QpLlxuICAgKi9cbiAgcHVibGljIHJlbW92ZUFsbExpc3RlbmVycygpOiB2b2lkIHtcbiAgICAvLyBEcm9wIHVzZXIgbGlzdGVuZXJzIGluIHBsYWNlIChwcmVzZXJ2aW5nIGFycmF5IGlkZW50aXR5IGZvciBhbnlcbiAgICAvLyBvdXRzdGFuZGluZyBkaXNwb3NlIGNsb3N1cmVzKTsga2VlcCB0aGUgaG9zdCdzIGludGVybmFsIGxpc3RlbmVycy5cbiAgICBmb3IgKGxldCBpID0gdGhpcy5tZXNzYWdlTGlzdGVuZXJzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoIXRoaXMubWVzc2FnZUxpc3RlbmVyc1tpXS5pbnRlcm5hbCkge1xuICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0ZW5lcnMuc3BsaWNlKGksIDEpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBbnN3ZXIgYSByZXF1ZXN0IChieSBpdHMgY29kZSkgb24gdGhlIHVzZXIncyBiZWhhbGYgd2l0aCBhIGZpeGVkIHZhbHVlLCBzb1xuICAgKiB0aGUgaG9zdCBkb2VzIG5vdCBwcm9tcHQuIFN5bnRhY3RpYyBzdWdhciBmb3IgYW4gYG9uYCBsaXN0ZW5lciByZXR1cm5pbmdcbiAgICogYHsgcmVzcG9uZDogdmFsdWUsIHByZXZlbnREZWZhdWx0OiBzdXBwcmVzc1F1ZXN0aW9uIH1gOyBmb3IgY29uZGl0aW9uYWxcbiAgICogYW5zd2VycyBvciB0byBhbHNvIHJld29yZCB0aGUgcXVlc3Rpb24sIHVzZSBgb25gL2BvbmNlYCBkaXJlY3RseS4gUmV0dXJucyBhXG4gICAqIGZ1bmN0aW9uIHRoYXQgcmVtb3ZlcyB0aGUgcmVzcG9uZGVyIGFnYWluLlxuICAgKlxuICAgKiBAcGFyYW0gc3VwcHJlc3NRdWVzdGlvbiAtIHdoZXRoZXIgdG8gYWxzbyBzdXBwcmVzcyB3cml0aW5nIHRoZSBxdWVzdGlvbiB0ZXh0LlxuICAgKiAgIERlZmF1bHRzIHRvIGB0cnVlYCAoYW5zd2VyIHNpbGVudGx5KS4gUGFzcyBgZmFsc2VgIHRvIHN0aWxsIHN1cmZhY2UgdGhlXG4gICAqICAgcXVlc3Rpb24gd2hpbGUgYW5zd2VyaW5nIGl0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiAvLyBVbmRlciAtLWZvcmNlLCBhdXRvLWNvbmZpcm0gdGhlIGRlc3Ryb3kgcHJvbXB0IHdpdGhvdXQgcHJvbXB0aW5nLlxuICAgKiBjb25zdCBkaXNwb3NlID0gaW9Ib3N0LnJlc3BvbmQoSU8uQ0RLX1RPT0xLSVRfSTcwMTAsIHRydWUpO1xuICAgKi9cbiAgcHVibGljIHJlc3BvbmQ8VCwgVT4oY29kZTogSW9SZXF1ZXN0TWFrZXI8VCwgVT4sIHZhbHVlOiBVLCBzdXBwcmVzc1F1ZXN0aW9uID0gdHJ1ZSk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmFkZE1lc3NhZ2VMaXN0ZW5lcih7IG9uY2U6IGZhbHNlLCBmbjogKCkgPT4gKHsgcmVzcG9uZDogdmFsdWUsIHByZXZlbnREZWZhdWx0OiBzdXBwcmVzc1F1ZXN0aW9uIH0pLCBtYXRjaGVzOiBtZXNzYWdlTWF0Y2hlcihjb2RlKSB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaWtlIGByZXNwb25kYCwgYnV0IHRoZSBhbnN3ZXIgaXMgZ2l2ZW4gb25seSBvbmNlIGFuZCB0aGVuIHJlbW92ZWQuXG4gICAqL1xuICBwdWJsaWMgcmVzcG9uZE9uY2U8VCwgVT4oY29kZTogSW9SZXF1ZXN0TWFrZXI8VCwgVT4sIHZhbHVlOiBVLCBzdXBwcmVzc1F1ZXN0aW9uID0gdHJ1ZSk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiB0aGlzLmFkZE1lc3NhZ2VMaXN0ZW5lcih7IG9uY2U6IHRydWUsIGZuOiAoKSA9PiAoeyByZXNwb25kOiB2YWx1ZSwgcHJldmVudERlZmF1bHQ6IHN1cHByZXNzUXVlc3Rpb24gfSksIG1hdGNoZXM6IG1lc3NhZ2VNYXRjaGVyKGNvZGUpIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGEgZm9ybWF0dGVyIHRoYXQgcmVwbGFjZXMgdGhlIHByaW50ZWQgdGV4dCBvZiBtZXNzYWdlcyB3aXRoIHRoZVxuICAgKiBnaXZlbiBjb2RlLiBUaGlzIGxldHMgYSBjYWxsZXIgZGVmaW5lIF9ob3dfIGEgdG9vbGtpdCBtZXNzYWdlIGlzIHByZXNlbnRlZFxuICAgKiB3aXRob3V0IHRoZSBJb0hvc3QgbmVlZGluZyB0byBrbm93IGFib3V0IGl0LlxuICAgKlxuICAgKiBPcHRpb25hbGx5IHBhc3MgYSBgbGV2ZWxgIHRvIGFsc28gb3ZlcnJpZGUgdGhlIG1lc3NhZ2UncyBsZXZlbCAod2hpY2ggbW92ZXNcbiAgICogaXQgYmV0d2VlbiBzdGRvdXQvc3RkZXJyIGFuZCBjaGFuZ2VzIHZlcmJvc2l0eSBmaWx0ZXJpbmcpLiBGb3IgdGhlIHJhcmVyXG4gICAqIGNhc2Ugb2Ygb3ZlcnJpZGluZyBvbmx5IHRoZSBsZXZlbCwgdXNlIGBvbmAvYG9uY2VgIHJldHVybmluZyBgeyBsZXZlbCB9YC5cbiAgICpcbiAgICogU3ludGFjdGljIHN1Z2FyIGZvciBhbiBgb25gIGxpc3RlbmVyIHRoYXQgcmV0dXJucyBgeyBtZXNzYWdlLCBsZXZlbD8gfWAuXG4gICAqIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHJlbW92ZXMgdGhlIGZvcm1hdHRlciBhZ2Fpbi5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogY29uc3QgZGlzcG9zZSA9IGlvSG9zdC5yZXdyaXRlKElPLkNES19UT09MS0lUX0kyOTAxLCAobXNnKSA9PlxuICAgKiAgIHNlcmlhbGl6ZVN0cnVjdHVyZShtc2cuZGF0YS5zdGFja3MsIHRydWUpKTtcbiAgICovXG4gIHB1YmxpYyByZXdyaXRlPFQ+KFxuICAgIGNvZGU6IElvTWVzc2FnZU1ha2VyPFQ+IHwgSW9SZXF1ZXN0TWFrZXI8VCwgYW55PixcbiAgICBmb3JtYXR0ZXI6IChtc2c6IElvTWVzc2FnZTxUPikgPT4gc3RyaW5nLFxuICAgIGxldmVsPzogSW9NZXNzYWdlTGV2ZWwsXG4gICk6ICgpID0+IHZvaWQge1xuICAgIHJldHVybiB0aGlzLm9uKGNvZGUsIChtc2cpID0+ICh7IG1lc3NhZ2U6IGZvcm1hdHRlcihtc2cpLCAuLi4obGV2ZWwgIT09IHVuZGVmaW5lZCA/IHsgbGV2ZWwgfSA6IHt9KSB9KSk7XG4gIH1cblxuICAvKipcbiAgICogTGlrZSBgcmV3cml0ZWAsIGJ1dCB0aGUgZm9ybWF0dGVyIGlzIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBhZnRlciBpdCBoYXNcbiAgICogYmVlbiBhcHBsaWVkIG9uY2UuXG4gICAqL1xuICBwdWJsaWMgcmV3cml0ZU9uY2U8VD4oXG4gICAgY29kZTogSW9NZXNzYWdlTWFrZXI8VD4gfCBJb1JlcXVlc3RNYWtlcjxULCBhbnk+LFxuICAgIGZvcm1hdHRlcjogKG1zZzogSW9NZXNzYWdlPFQ+KSA9PiBzdHJpbmcsXG4gICAgbGV2ZWw/OiBJb01lc3NhZ2VMZXZlbCxcbiAgKTogKCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIHRoaXMub25jZShjb2RlLCAobXNnKSA9PiAoeyBtZXNzYWdlOiBmb3JtYXR0ZXIobXNnKSwgLi4uKGxldmVsICE9PSB1bmRlZmluZWQgPyB7IGxldmVsIH0gOiB7fSkgfSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGxpc3RlbmVyIHRvIHRoZSByZWdpc3RyeSBhbmQgcmV0dXJuIGEgZnVuY3Rpb24gdGhhdCByZW1vdmVzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBhZGRNZXNzYWdlTGlzdGVuZXIobGlzdGVuZXI6IE1lc3NhZ2VMaXN0ZW5lcik6ICgpID0+IHZvaWQge1xuICAgIHRoaXMubWVzc2FnZUxpc3RlbmVycy5wdXNoKGxpc3RlbmVyKTtcblxuICAgIHJldHVybiAoKSA9PiB7XG4gICAgICBjb25zdCBpbmRleCA9IHRoaXMubWVzc2FnZUxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgIHRoaXMubWVzc2FnZUxpc3RlbmVycy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogUnVuIGV2ZXJ5IHJlZ2lzdGVyZWQgbGlzdGVuZXIgdGhhdCBtYXRjaGVzIHRoZSBtZXNzYWdlLCBpbiByZWdpc3RyYXRpb25cbiAgICogb3JkZXIuIEEgbGlzdGVuZXIgbWF0Y2hlcyBieSBpdHMgY29kZSAobWFrZXIpIG9yIGl0cyBjdXN0b20gcHJlZGljYXRlLlxuICAgKlxuICAgKiBBIGxpc3RlbmVyIG1heSB1cGRhdGUgdGhlIG1lc3NhZ2UgdGV4dC9sZXZlbCAocGFzc2VkIG9uIHRvIHN1YnNlcXVlbnRcbiAgICogbGlzdGVuZXJzIGFuZCB0aGUgcmVzdCBvZiB0aGUgcGlwZWxpbmUpLCBwcmV2ZW50IHRoZSBkZWZhdWx0IHByb2Nlc3NpbmcsIG9yXG4gICAqIChmb3IgcmVxdWVzdHMpIGFuc3dlciBpdC4gYG9uY2VgIGxpc3RlbmVycyBhcmUgcmVtb3ZlZCBhZnRlciB0aGV5IGhhdmUgcnVuLlxuICAgKiBNYXRjaGluZyBpcyBkZWNpZGVkIGFnYWluc3QgdGhlIG1lc3NhZ2UgYXMgZW1pdHRlZCwgc28gYSByZXdyaXRlIGJ5IGFuXG4gICAqIGVhcmxpZXIgbGlzdGVuZXIgZG9lcyBub3QgY2hhbmdlIHdoaWNoIGxhdGVyIGxpc3RlbmVycyBhcHBseS5cbiAgICpcbiAgICogUmV0dXJucyB0aGUgKHBvc3NpYmx5IHVwZGF0ZWQpIG1lc3NhZ2UsIHdoZXRoZXIgdGhlIGRlZmF1bHQgcHJvY2Vzc2luZyB3YXNcbiAgICogcHJldmVudGVkLCBhbmQgd2hldGhlciBhIGxpc3RlbmVyIGFuc3dlcmVkIHRoZSByZXF1ZXN0IChhbmQgd2l0aCB3aGF0KS5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgYXBwbHlNZXNzYWdlTGlzdGVuZXJzPFQgZXh0ZW5kcyBJb01lc3NhZ2U8dW5rbm93bj4+KG1zZzogVCk6IFByb21pc2U8e1xuICAgIG1lc3NhZ2U6IFQ7XG4gICAgcHJldmVudERlZmF1bHQ6IGJvb2xlYW47XG4gICAgcmVzcG9uZGVkOiBib29sZWFuO1xuICB9PiB7XG4gICAgbGV0IGN1cnJlbnQgPSBtc2c7XG4gICAgbGV0IHByZXZlbnREZWZhdWx0ID0gZmFsc2U7XG4gICAgbGV0IHJlc3BvbmRlZCA9IGZhbHNlO1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBhIGNvcHkgc28gdGhhdCBgb25jZWAgbGlzdGVuZXJzIGNhbiByZW1vdmUgdGhlbXNlbHZlcyBzYWZlbHkuXG4gICAgZm9yIChjb25zdCBsaXN0ZW5lciBvZiBbLi4udGhpcy5tZXNzYWdlTGlzdGVuZXJzXSkge1xuICAgICAgLy8gTWF0Y2ggYWdhaW5zdCB0aGUgZW1pdHRlZCBtZXNzYWdlOyBhIGxpc3RlbmVyIHJlY2VpdmVzIHRoZSBjdW11bGF0aXZlbHlcbiAgICAgIC8vIHRyYW5zZm9ybWVkIGBjdXJyZW50YCBtZXNzYWdlLlxuICAgICAgaWYgKCFsaXN0ZW5lci5tYXRjaGVzKG1zZykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIExpc3RlbmVycyBtYXkgYmUgYXN5bmM7IGF3YWl0IGVhY2ggb25lIGJlZm9yZSBydW5uaW5nIHRoZSBuZXh0IHNvIHRoZVxuICAgICAgLy8gY3VtdWxhdGl2ZSBlZmZlY3Qgb24gdGhlIG1lc3NhZ2Ugc3RheXMgb3JkZXItZGV0ZXJtaW5pc3RpYy5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGxpc3RlbmVyLmZuKGN1cnJlbnQpO1xuXG4gICAgICBpZiAobGlzdGVuZXIub25jZSkge1xuICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMubWVzc2FnZUxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgaWYgKGluZGV4ID49IDApIHtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VMaXN0ZW5lcnMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIGlmIChyZXN1bHQubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY3VycmVudCA9IHsgLi4uY3VycmVudCwgbWVzc2FnZTogcmVzdWx0Lm1lc3NhZ2UgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzdWx0LmxldmVsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjdXJyZW50ID0geyAuLi5jdXJyZW50LCBsZXZlbDogcmVzdWx0LmxldmVsIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoJ3Jlc3BvbmQnIGluIHJlc3VsdCAmJiAnZGVmYXVsdFJlc3BvbnNlJyBpbiBtc2cpIHtcbiAgICAgICAgICAvLyBGb2xkIHRoZSBhbnN3ZXIgaW50byB0aGUgcmVxdWVzdCdzIGRlZmF1bHQgcmVzcG9uc2UgYW5kIG1hcmsgaXRcbiAgICAgICAgICAvLyBhbnN3ZXJlZCwgc28gd2Ugc2tpcCBwcm9tcHRpbmcgYW5kIHJlc29sdmUgd2l0aCB0aGlzIHZhbHVlLlxuICAgICAgICAgIGN1cnJlbnQgPSB7IC4uLmN1cnJlbnQsIGRlZmF1bHRSZXNwb25zZTogcmVzdWx0LnJlc3BvbmQgfTtcbiAgICAgICAgICByZXNwb25kZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgbWVzc2FnZTogY3VycmVudCwgcHJldmVudERlZmF1bHQsIHJlc3BvbmRlZCB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdGlmaWVzIHRoZSBob3N0IG9mIGEgbWVzc2FnZS5cbiAgICogVGhlIGNhbGxlciB3YWl0cyB1bnRpbCB0aGUgbm90aWZpY2F0aW9uIGNvbXBsZXRlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBub3RpZnkobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLm1heWJlRW1pdFRlbGVtZXRyeShtc2cpO1xuXG4gICAgLy8gUnVuIGFueSByZWdpc3RlcmVkIGxpc3RlbmVycy4gQSBsaXN0ZW5lciBtYXkgdXBkYXRlIHRoZSBtZXNzYWdlIHRleHRcbiAgICAvLyBhbmQvb3IgcHJldmVudCB0aGUgZGVmYXVsdCBwcm9jZXNzaW5nIChlLmcuIHN0YWNrLWFjdGl2aXR5IG1lc3NhZ2VzIGFyZVxuICAgIC8vIHJvdXRlZCB0byB0aGUgYWN0aXZpdHkgcHJpbnRlciBhbmQgbm90IHdyaXR0ZW4gdG8gYSBzdHJlYW0pLlxuICAgIGNvbnN0IHsgbWVzc2FnZSwgcHJldmVudERlZmF1bHQgfSA9IGF3YWl0IHRoaXMuYXBwbHlNZXNzYWdlTGlzdGVuZXJzKG1zZyk7XG5cbiAgICAvLyBUZWxsIG9ic2VydmVycyBob3cgdGhpcyBtZXNzYWdlIHdhcyBoYW5kbGVkIChpdHMgZWZmZWN0aXZlIGZvcm0gYW5kXG4gICAgLy8gd2hldGhlciBpdCB3YXMgZHJvcHBlZCkuIFNraXBwZWQgd2hpbGUgcmVwbGF5aW5nIGNvcmtlZCBtZXNzYWdlcyBzbyBlYWNoXG4gICAgLy8gbWVzc2FnZSBpcyBvYnNlcnZlZCBleGFjdGx5IG9uY2UuXG4gICAgaWYgKCF0aGlzLmNvcmtSZXBsYXlpbmcpIHtcbiAgICAgIHRoaXMubm90aWZ5T2JzZXJ2ZXJzKHsgdHlwZTogJ25vdGlmeScsIGVtaXR0ZWQ6IG1zZywgZWZmZWN0aXZlOiBtZXNzYWdlLCBkcm9wcGVkOiBwcmV2ZW50RGVmYXVsdCB9KTtcbiAgICB9XG5cbiAgICBpZiAocHJldmVudERlZmF1bHQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLndyaXRlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZnkgZXZlcnkgcmVnaXN0ZXJlZCBtZXNzYWdlIG9ic2VydmVyIG9mIGhvdyBhIG1lc3NhZ2Ugb3IgcmVxdWVzdCB3YXNcbiAgICogaGFuZGxlZC4gQSBuby1vcCB3aGVuIG5vdGhpbmcgaXMgb2JzZXJ2aW5nIChpLmUuIG91dHNpZGUgb2YgdGVzdHMpLCBzbyB0aGVcbiAgICogc3Vycm91bmRpbmcgaG90IHBhdGhzIHBheSBub3RoaW5nIGluIHByb2R1Y3Rpb24uXG4gICAqL1xuICBwcml2YXRlIG5vdGlmeU9ic2VydmVycyhvYnNlcnZhdGlvbjogSW9NZXNzYWdlT2JzZXJ2YXRpb24pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tZXNzYWdlT2JzZXJ2ZXJzLnNpemUgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChjb25zdCBvYnNlcnZlciBvZiB0aGlzLm1lc3NhZ2VPYnNlcnZlcnMpIHtcbiAgICAgIG9ic2VydmVyKG9ic2VydmF0aW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogV3JpdGUgYSAoYWxyZWFkeSBsaXN0ZW5lci1wcm9jZXNzZWQpIG1lc3NhZ2UgdG8gaXRzIHRhcmdldCBzdHJlYW0sIGhvbm9yaW5nXG4gICAqIHRoZSBsb2cgbGV2ZWwgYW5kIGNvcmtlZC1sb2dnaW5nIGJ1ZmZlci4gU2hhcmVkIGJ5IGBub3RpZnlgIGFuZCB0aGVcbiAgICogbm9uLXByb21wdGluZyBgcmVxdWVzdFJlc3BvbnNlYCBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSB3cml0ZU1lc3NhZ2UobWVzc2FnZTogSW9NZXNzYWdlPHVua25vd24+KTogdm9pZCB7XG4gICAgaWYgKCFpc01lc3NhZ2VSZWxldmFudEZvckxldmVsKG1lc3NhZ2UsIHRoaXMubG9nTGV2ZWwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY29ya2VkQ291bnRlciA+IDApIHtcbiAgICAgIHRoaXMuY29ya2VkTG9nZ2luZ0J1ZmZlci5wdXNoKG1lc3NhZ2UpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dCA9IHRoaXMuZm9ybWF0TWVzc2FnZShtZXNzYWdlKTtcbiAgICBjb25zdCBzdHJlYW0gPSB0aGlzLnNlbGVjdFN0cmVhbShtZXNzYWdlKTtcbiAgICBzdHJlYW0/LndyaXRlKG91dHB1dCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIG1heWJlRW1pdFRlbGVtZXRyeShtc2c6IElvTWVzc2FnZTx1bmtub3duPikge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0ZWxlbWV0cnlFdmVudCA9IGV2ZW50RnJvbU1lc3NhZ2UobXNnKTtcbiAgICAgIGlmICh0ZWxlbWV0cnlFdmVudCkge1xuICAgICAgICBhd2FpdCB0aGlzLnRlbGVtZXRyeT8uZW1pdCh0ZWxlbWV0cnlFdmVudCk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICBhd2FpdCB0aGlzLmRlZmF1bHRzLnRyYWNlKGBFbWl0IFRlbGVtZXRyeSBGYWlsZWQgJHtlLm1lc3NhZ2V9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJvdXRlIHN0YWNrLWFjdGl2aXR5IG1lc3NhZ2VzIHRvIHRoZSBhY3Rpdml0eSBwcmludGVyIChwcm9ncmVzcyBiYXIgb3JcbiAgICogZXZlbnQgbGlzdCkgcmF0aGVyIHRoYW4gd3JpdGluZyB0aGVtIHRvIGEgc3RyZWFtLlxuICAgKlxuICAgKiBJbXBsZW1lbnRlZCBhcyBsaXN0ZW5lcnMgdGhhdCBoYW5kbGUgdGhlIG1lc3NhZ2UgdmlhIHRoZSBwcmludGVyIGFuZFxuICAgKiBwcmV2ZW50IHRoZSBkZWZhdWx0IHByb2Nlc3NpbmcsIHNvIHRoZSByZXN0IG9mIHRoZSBwaXBlbGluZSBkb2VzIG5vdCBhbHNvXG4gICAqIGVtaXQgdGhlbS4gVGhlIHByaW50ZXIgaXMgY3JlYXRlZCBsYXppbHkgb24gdGhlIGZpcnN0IHN0YWNrLWFjdGl2aXR5IG1lc3NhZ2UuXG4gICAqL1xuICBwcml2YXRlIHJvdXRlU3RhY2tBY3Rpdml0eVRvUHJpbnRlcigpIHtcbiAgICBjb25zdCByb3V0ZSA9IChtc2c6IElvTWVzc2FnZTx1bmtub3duPik6IE1lc3NhZ2VMaXN0ZW5lclJlc3VsdCA9PiB7XG4gICAgICBpZiAoIXRoaXMuYWN0aXZpdHlQcmludGVyKSB7XG4gICAgICAgIHRoaXMuYWN0aXZpdHlQcmludGVyID0gdGhpcy5tYWtlQWN0aXZpdHlQcmludGVyKCk7XG4gICAgICB9XG4gICAgICB0aGlzLmFjdGl2aXR5UHJpbnRlci5ub3RpZnkobXNnKTtcbiAgICAgIHJldHVybiB7IHByZXZlbnREZWZhdWx0OiB0cnVlIH07IC8vIGhhbmRsZWQgYnkgdGhlIHByaW50ZXI7IGRvbid0IGFsc28gd3JpdGUgdG8gYSBzdHJlYW1cbiAgICB9O1xuXG4gICAgLy8gQSBzaW5nbGUgaW50ZXJuYWwgbGlzdGVuZXIgKHNvIGl0IHN1cnZpdmVzIGByZW1vdmVBbGxMaXN0ZW5lcnMoKWAgYW5kIHRoZVxuICAgIC8vIGhvc3Qga2VlcHMgcm91dGluZyBzdGFjayBhY3Rpdml0eSkgbWF0Y2hpbmcgYW55IG9mIHRoZSBhY3Rpdml0eSBjb2Rlcy5cbiAgICB0aGlzLmFkZE1lc3NhZ2VMaXN0ZW5lcih7XG4gICAgICBvbmNlOiBmYWxzZSxcbiAgICAgIGludGVybmFsOiB0cnVlLFxuICAgICAgZm46IHJvdXRlLFxuICAgICAgbWF0Y2hlczogbWF0Y2hBbnkoSU8uQ0RLX1RPT0xLSVRfSTU1MDEsIElPLkNES19UT09MS0lUX0k1NTAyLCBJTy5DREtfVE9PTEtJVF9JNTUwMyksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZWN0IHNwZWNpYWwgbWVzc2FnZXMgZW5jb2RlIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgb3Igbm90XG4gICAqIHRoZXkgcmVxdWlyZSBhcHByb3ZhbFxuICAgKi9cbiAgcHJpdmF0ZSBza2lwQXBwcm92YWxTdGVwKG1zZzogSW9SZXF1ZXN0PGFueSwgYW55Pik6IGJvb2xlYW4ge1xuICAgIGNvbnN0IGFwcHJvdmFsVG9vbGtpdENvZGVzID0gWydDREtfVE9PTEtJVF9JNTA2MCddO1xuICAgIGlmICghKG1zZy5jb2RlICYmIGFwcHJvdmFsVG9vbGtpdENvZGVzLmluY2x1ZGVzKG1zZy5jb2RlKSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHRoaXMucmVxdWlyZURlcGxveUFwcHJvdmFsKSB7XG4gICAgICAvLyBOZXZlciByZXF1aXJlIGFwcHJvdmFsXG4gICAgICBjYXNlIFJlcXVpcmVBcHByb3ZhbC5ORVZFUjpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAvLyBBbHdheXMgcmVxdWlyZSBhcHByb3ZhbFxuICAgICAgY2FzZSBSZXF1aXJlQXBwcm92YWwuQU5ZQ0hBTkdFOlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBSZXF1aXJlIGFwcHJvdmFsIGlmIGNoYW5nZXMgaW5jbHVkZSBicm9hZGVuaW5nIHBlcm1pc3Npb25zXG4gICAgICBjYXNlIFJlcXVpcmVBcHByb3ZhbC5CUk9BREVOSU5HOlxuICAgICAgICByZXR1cm4gWydub25lJywgJ25vbi1icm9hZGVuaW5nJ10uaW5jbHVkZXMobXNnLmRhdGE/LnBlcm1pc3Npb25DaGFuZ2VUeXBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyB0aGUgb3V0cHV0IHN0cmVhbSwgYmFzZWQgb24gbWVzc2FnZSBhbmQgY29uZmlndXJhdGlvbi5cbiAgICovXG4gIHByaXZhdGUgc2VsZWN0U3RyZWFtKG1zZzogSW9NZXNzYWdlPGFueT4pOiBOb2RlSlMuV3JpdGVTdHJlYW0gfCB1bmRlZmluZWQge1xuICAgIGlmIChpc05vdGljZXNNZXNzYWdlKG1zZykpIHtcbiAgICAgIHJldHVybiB0YXJnZXRTdHJlYW1PYmplY3QodGhpcy5ub3RpY2VzRGVzdGluYXRpb24pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnNlbGVjdFN0cmVhbUZyb21MZXZlbChtc2cubGV2ZWwpO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgdGhlIG91dHB1dCBzdHJlYW0sIGJhc2VkIG9uIG1lc3NhZ2UgbGV2ZWwgYW5kIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBwcml2YXRlIHNlbGVjdFN0cmVhbUZyb21MZXZlbChsZXZlbDogSW9NZXNzYWdlTGV2ZWwpOiBOb2RlSlMuV3JpdGVTdHJlYW0ge1xuICAgIC8vIFRoZSBzdHJlYW0gc2VsZWN0aW9uIHBvbGljeSBmb3IgdGhlIENMSSBpcyB0aGUgZm9sbG93aW5nOlxuICAgIC8vXG4gICAgLy8gICAoMSkgTWVzc2FnZXMgb2YgbGV2ZWwgYHJlc3VsdGAgYWx3YXlzIGdvIHRvIGBzdGRvdXRgXG4gICAgLy8gICAoMikgTWVzc2FnZXMgb2YgbGV2ZWwgYGVycm9yYCBhbHdheXMgZ28gdG8gYHN0ZGVycmAuXG4gICAgLy8gICAoM2EpIEFsbCByZW1haW5pbmcgbWVzc2FnZXMgZ28gdG8gYHN0ZGVycmAuXG4gICAgLy8gICAoM2IpIElmIHdlIGFyZSBpbiBDSSBtb2RlLCBhbGwgcmVtYWluaW5nIG1lc3NhZ2VzIGdvIHRvIGBzdGRvdXRgLlxuICAgIC8vXG4gICAgc3dpdGNoIChsZXZlbCkge1xuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICByZXR1cm4gcHJvY2Vzcy5zdGRlcnI7XG4gICAgICBjYXNlICdyZXN1bHQnOlxuICAgICAgICByZXR1cm4gcHJvY2Vzcy5zdGRvdXQ7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdGhpcy5pc0NJID8gcHJvY2Vzcy5zdGRvdXQgOiBwcm9jZXNzLnN0ZGVycjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgdGhlIGhvc3Qgb2YgYSBtZXNzYWdlIHRoYXQgcmVxdWlyZXMgYSByZXNwb25zZS5cbiAgICpcbiAgICogUmVnaXN0ZXJlZCBsaXN0ZW5lcnMgcnVuIGZpcnN0OiBhIGxpc3RlbmVyIG1heSByZXdvcmQgdGhlIHF1ZXN0aW9uIChpdHMgdGV4dFxuICAgKiBvciBsZXZlbCkgb3IgYW5zd2VyIGl0IG91dHJpZ2h0IHZpYSBgcmVzcG9uZGAgKGUuZy4gYC0tZm9yY2VgIGF1dG8tY29uZmlybXNcbiAgICogYSBkZXN0cm95KS4gSWYgbm8gbGlzdGVuZXIgYW5zd2VycyBhbmQgdGhlIGhvc3QgY2Fubm90IHByb21wdCwgdGhlIHN1Z2dlc3RlZFxuICAgKiBkZWZhdWx0IHJlc3BvbnNlIGlzIHVzZWQuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgcmVxdWVzdFJlc3BvbnNlPERhdGFUeXBlLCBSZXNwb25zZVR5cGU+KG1zZzogSW9SZXF1ZXN0PERhdGFUeXBlLCBSZXNwb25zZVR5cGU+KTogUHJvbWlzZTxSZXNwb25zZVR5cGU+IHtcbiAgICAvLyBMaXN0ZW5lcnMgcnVuIGV4YWN0bHkgb25jZSBoZXJlIChzbyB3ZSBkb24ndCBnbyBiYWNrIHRocm91Z2ggYG5vdGlmeWApOlxuICAgIC8vIHRoZXkgbWF5IGFuc3dlciB0aGUgcmVxdWVzdCwgb3IgcmV3b3JkL3JlbGV2ZWwgdGhlIHF1ZXN0aW9uIHNob3duIGJlbG93LlxuICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4ubGlzdGVuZXJSZXN1bHQgfSA9IGF3YWl0IHRoaXMuYXBwbHlNZXNzYWdlTGlzdGVuZXJzKG1zZyk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMucmVzb2x2ZVJlcXVlc3QobWVzc2FnZSwgbGlzdGVuZXJSZXN1bHQpO1xuXG4gICAgLy8gVGVsbCBvYnNlcnZlcnMgaG93IHRoaXMgcmVxdWVzdCB3YXMgaGFuZGxlZDogdGhlIGVmZmVjdGl2ZSAocG9zc2libHkgcmV3b3JkZWQpIHF1ZXN0aW9uXG4gICAgLy8gYW5kIHRoZSByZXNvbHZlZCByZXNwb25zZS4gV2hlbiBhIGxpc3RlbmVyIGFuc3dlcmVkIHRoZSByZXF1ZXN0IHdpdGggdGhlIHF1ZXN0aW9uIHN1cHByZXNzZWRcbiAgICAvLyAoYHByZXZlbnREZWZhdWx0YCwgZS5nLiBgLS1mb3JjZWAgYXV0by1jb25maXJtKSwgaXQgaXMgcmVwb3J0ZWQgYXMgYGRyb3BwZWRgIHNpbmNlIHRoZSB1c2VyIG5ldmVyIHNhdyBpdC5cbiAgICB0aGlzLm5vdGlmeU9ic2VydmVycyh7IHR5cGU6ICdyZXF1ZXN0JywgZW1pdHRlZDogbXNnLCBlZmZlY3RpdmU6IG1lc3NhZ2UsIGRyb3BwZWQ6IGxpc3RlbmVyUmVzdWx0LnByZXZlbnREZWZhdWx0IH0pO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmUgYSByZXF1ZXN0IHRvIGl0cyByZXNwb25zZTogYSBsaXN0ZW5lcidzIGFuc3dlciBpZiBvbmUgd2FzIGdpdmVuLFxuICAgKiBvdGhlcndpc2UgdGhlIGFuc3dlciBwcm9tcHRlZCBmcm9tIHRoZSB1c2VyLCBvdGhlcndpc2UgdGhlIHN1Z2dlc3RlZFxuICAgKiBkZWZhdWx0IHdoZW4gdGhlIGhvc3QgY2Fubm90IHByb21wdC5cbiAgICpcbiAgICogS2VwdCBzZXBhcmF0ZSBmcm9tIGByZXF1ZXN0UmVzcG9uc2VgIHNvIHRoZSByZXNwb25zZSBjYW4gYmUgb2JzZXJ2ZWQgaW4gYVxuICAgKiBzaW5nbGUgcGxhY2UgcmVnYXJkbGVzcyBvZiB3aGljaCBvZiB0aGVzZSBwYXRocyBwcm9kdWNlZCBpdC5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzb2x2ZVJlcXVlc3Q8RGF0YVR5cGUsIFJlc3BvbnNlVHlwZT4oXG4gICAgbXNnOiBJb1JlcXVlc3Q8RGF0YVR5cGUsIFJlc3BvbnNlVHlwZT4sXG4gICAgbGlzdGVuZXJSZXN1bHQ6IHsgcHJldmVudERlZmF1bHQ6IGJvb2xlYW47IHJlc3BvbmRlZDogYm9vbGVhbiB9LFxuICApOiBQcm9taXNlPFJlc3BvbnNlVHlwZT4ge1xuICAgIC8vIHN0b3AgcHJvY2Vzc2luZywgYSBsaXN0ZW5lciBoYXMgdGFrZW4gY2FyZSBvZiBpdFxuICAgIGlmIChsaXN0ZW5lclJlc3VsdC5wcmV2ZW50RGVmYXVsdCkge1xuICAgICAgcmV0dXJuIG1zZy5kZWZhdWx0UmVzcG9uc2U7XG4gICAgfVxuXG4gICAgLy8gaWYgYSBsaXN0ZW5lciBwcm92aWRlZCBhIHJlc3BvbnNlLCB3ZSBza2lwIGludGVyYWN0aW9uXG4gICAgaWYgKCFpc1Byb21wdGFibGVSZXF1ZXN0KG1zZykgfHwgbGlzdGVuZXJSZXN1bHQucmVzcG9uZGVkKSB7XG4gICAgICB0aGlzLndyaXRlTWVzc2FnZShtc2cpO1xuICAgICAgcmV0dXJuIG1zZy5kZWZhdWx0UmVzcG9uc2U7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLndpdGhDb3JrZWRMb2dnaW5nKGFzeW5jICgpOiBQcm9taXNlPHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4+ID0+IHtcbiAgICAgIC8vIHByZXBhcmUgcHJvbXB0IGRhdGFcbiAgICAgIC8vIEB0b2RvIHRoaXMgZm9ybWF0IGlzIG5vdCBkZWZpbmVkIGFueXdoZXJlLCBwcm9iYWJseSBzaG91bGQgYmVcbiAgICAgIGNvbnN0IGRhdGE6IHtcbiAgICAgICAgbW90aXZhdGlvbj86IHN0cmluZztcbiAgICAgICAgY29uY3VycmVuY3k/OiBudW1iZXI7XG4gICAgICAgIHJlc3BvbnNlRGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgICB9ID0gbXNnLmRhdGEgPz8ge307XG5cbiAgICAgIGNvbnN0IG1vdGl2YXRpb24gPSBkYXRhLm1vdGl2YXRpb24gPz8gJ1VzZXIgaW5wdXQgaXMgbmVlZGVkJztcbiAgICAgIGNvbnN0IGNvbmN1cnJlbmN5ID0gZGF0YS5jb25jdXJyZW5jeSA/PyAwO1xuICAgICAgY29uc3QgcmVzcG9uc2VEZXNjcmlwdGlvbiA9IGRhdGEucmVzcG9uc2VEZXNjcmlwdGlvbjtcblxuICAgICAgLy8gU3BlY2lhbCBhcHByb3ZhbCBwcm9tcHRcbiAgICAgIC8vIERldGVybWluZSBpZiB0aGUgbWVzc2FnZSBuZWVkcyBhcHByb3ZhbC4gSWYgaXQgZG9lcywgY29udGludWUgKGl0IGlzIGEgYmFzaWMgY29uZmlybWF0aW9uIHByb21wdClcbiAgICAgIC8vIElmIGl0IGRvZXMgbm90LCByZXR1cm4gc3VjY2VzcyAodHJ1ZSkuIFdlIG9ubHkgY2hlY2sgbWVzc2FnZXMgd2l0aCBjb2RlcyB0aGF0IHdlIGFyZSBhd2FyZVxuICAgICAgLy8gYXJlIHJlcXVpcmVzIGFwcHJvdmFsIGNvZGVzLlxuICAgICAgaWYgKHRoaXMuc2tpcEFwcHJvdmFsU3RlcChtc2cpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBJbiAtLXllcyBtb2RlLCByZXNwb25kIGZvciB0aGUgdXNlciBpZiB3ZSBjYW5cbiAgICAgIGlmICh0aGlzLmF1dG9SZXNwb25kKSB7XG4gICAgICAgIC8vIHJlc3BvbmQgd2l0aCB5ZXMgdG8gYWxsIGNvbmZpcm1hdGlvbnNcbiAgICAgICAgaWYgKGlzQ29uZmlybWF0aW9uUHJvbXB0KG1zZykpIHtcbiAgICAgICAgICBhd2FpdCB0aGlzLndyaXRlTWVzc2FnZSh7XG4gICAgICAgICAgICAuLi5tc2csXG4gICAgICAgICAgICBtZXNzYWdlOiBgJHtjaGFsay5jeWFuKG1zZy5tZXNzYWdlKX0gKGF1dG8tY29uZmlybWVkKWAsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZXNwb25kIHdpdGggdGhlIGRlZmF1bHQgZm9yIGFsbCBvdGhlciBtZXNzYWdlc1xuICAgICAgICBpZiAobXNnLmRlZmF1bHRSZXNwb25zZSkge1xuICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGVNZXNzYWdlKHtcbiAgICAgICAgICAgIC4uLm1zZyxcbiAgICAgICAgICAgIG1lc3NhZ2U6IGAke2NoYWxrLmN5YW4obXNnLm1lc3NhZ2UpfSAoYXV0by1yZXNwb25kZWQgd2l0aCBkZWZhdWx0OiAke3V0aWwuZm9ybWF0KG1zZy5kZWZhdWx0UmVzcG9uc2UpfSlgLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiBtc2cuZGVmYXVsdFJlc3BvbnNlO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIG9ubHkgdGFsayB0byB1c2VyIGlmIFNURElOIGlzIGEgdGVybWluYWwgKG90aGVyd2lzZSwgZmFpbClcbiAgICAgIGlmICghdGhpcy5pc1RUWSkge1xuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdUdHlOb3RBdHRhY2hlZCcsIGAke21vdGl2YXRpb259LCBidXQgdGVybWluYWwgKFRUWSkgaXMgbm90IGF0dGFjaGVkIHNvIHdlIGFyZSB1bmFibGUgdG8gZ2V0IGEgY29uZmlybWF0aW9uIGZyb20gdGhlIHVzZXJgKTtcbiAgICAgIH1cblxuICAgICAgLy8gb25seSB0YWxrIHRvIHVzZXIgaWYgY29uY3VycmVuY3kgaXMgMSAob3RoZXJ3aXNlLCBmYWlsKVxuICAgICAgaWYgKGNvbmN1cnJlbmN5ID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgVG9vbGtpdEVycm9yKCdDb25jdXJyZW5jeUNvbmZsaWN0JywgYCR7bW90aXZhdGlvbn0sIGJ1dCBjb25jdXJyZW5jeSBpcyBncmVhdGVyIHRoYW4gMSBzbyB3ZSBhcmUgdW5hYmxlIHRvIGdldCBhIGNvbmZpcm1hdGlvbiBmcm9tIHRoZSB1c2VyYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEJhc2ljIGNvbmZpcm1hdGlvbiBwcm9tcHRcbiAgICAgIC8vIFdlIHRyZWF0IGFsbCByZXF1ZXN0cyB3aXRoIGEgYm9vbGVhbiByZXNwb25zZSBhcyBjb25maXJtYXRpb24gcHJvbXB0c1xuICAgICAgLy8gVGhlIElvSG9zdCBuZXZlciBhYm9ydHMgb24gYSBcIm5vXCI6IGl0IHJldHVybnMgdGhlIGFuc3dlciBhbmQgbGV0cyB0aGVcbiAgICAgIC8vIGNhbGxpbmcgYWN0aW9uIGRlY2lkZSB3aGF0IHRvIGRvIChzbyBhYm9ydCBoYW5kbGluZyBpcyBjb25zaXN0ZW50XG4gICAgICAvLyBhY3Jvc3MgYWN0aW9ucykuXG4gICAgICBpZiAoaXNDb25maXJtYXRpb25Qcm9tcHQobXNnKSkge1xuICAgICAgICByZXR1cm4gcHJvbXB0bHkuY29uZmlybShgJHtjaGFsay5jeWFuKG1zZy5tZXNzYWdlKX0gKHkvbilgKTtcbiAgICAgIH1cblxuICAgICAgLy8gQXNraW5nIGZvciBhIHNwZWNpZmljIHZhbHVlXG4gICAgICBjb25zdCBwcm9tcHQgPSBleHRyYWN0UHJvbXB0SW5mbyhtc2cpO1xuICAgICAgY29uc3QgZGVzYyA9IHJlc3BvbnNlRGVzY3JpcHRpb24gPz8gcHJvbXB0LmRlZmF1bHQ7XG4gICAgICBjb25zdCBhbnN3ZXIgPSBhd2FpdCBwcm9tcHRseS5wcm9tcHQoYCR7Y2hhbGsuY3lhbihtc2cubWVzc2FnZSl9JHtkZXNjID8gYCAoJHtkZXNjfSlgIDogJyd9YCwge1xuICAgICAgICBkZWZhdWx0OiBwcm9tcHQuZGVmYXVsdCxcbiAgICAgICAgdHJpbTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHByb21wdC5jb252ZXJ0QW5zd2VyKGFuc3dlcik7XG4gICAgfSk7XG5cbiAgICAvLyBXZSBuZWVkIHRvIGNhc3QgdGhpcyBiZWNhdXNlIGl0IGlzIGltcG9zc2libGUgdG8gbmFycm93IHRoZSBnZW5lcmljIHR5cGVcbiAgICAvLyBpc1Byb21wdGFibGVSZXF1ZXN0IGVuc3VyZXMgdGhhdCB0aGUgcmVzcG9uc2UgdHlwZSBpcyBvbmUgd2UgY2FuIHByb21wdCBmb3JcbiAgICAvLyB0aGUgcmVtYWluaW5nIGNvZGUgZW5zdXJlIHdlIGFyZSBpbmRlZWQgcmV0dXJuaW5nIHRoZSBjb3JyZWN0IHR5cGVcbiAgICByZXR1cm4gcmVzcG9uc2UgYXMgUmVzcG9uc2VUeXBlO1xuICB9XG5cbiAgLyoqXG4gICAqIEZvcm1hdHMgYSBtZXNzYWdlIGZvciBjb25zb2xlIG91dHB1dCB3aXRoIG9wdGlvbmFsIGNvbG9yIHN1cHBvcnRcbiAgICovXG4gIHByaXZhdGUgZm9ybWF0TWVzc2FnZShtc2c6IElvTWVzc2FnZTx1bmtub3duPik6IHN0cmluZyB7XG4gICAgLy8gYXBwbHkgcHJvdmlkZWQgc3R5bGUgb3IgYSBkZWZhdWx0IHN0eWxlIGlmIHdlJ3JlIGluIFRUWSBtb2RlXG4gICAgbGV0IG1lc3NhZ2VfdGV4dCA9IHRoaXMuaXNUVFlcbiAgICAgID8gc3R5bGVNYXBbbXNnLmxldmVsXShtc2cubWVzc2FnZSlcbiAgICAgIDogbXNnLm1lc3NhZ2U7XG5cbiAgICAvLyBwcmVwZW5kIHRpbWVzdGFtcCBpZiBJb01lc3NhZ2VMZXZlbCBpcyBERUJVRyBvciBUUkFDRS4gUG9zdHBlbmQgYSBuZXdsaW5lLlxuICAgIHJldHVybiAoKG1zZy5sZXZlbCA9PT0gJ2RlYnVnJyB8fCBtc2cubGV2ZWwgPT09ICd0cmFjZScpXG4gICAgICA/IGBbJHt0aGlzLmZvcm1hdFRpbWUobXNnLnRpbWUpfV0gJHttZXNzYWdlX3RleHR9YFxuICAgICAgOiBtZXNzYWdlX3RleHQpICsgJ1xcbic7XG4gIH1cblxuICAvKipcbiAgICogRm9ybWF0cyBkYXRlIHRvIEhIOk1NOlNTXG4gICAqL1xuICBwcml2YXRlIGZvcm1hdFRpbWUoZDogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgcGFkID0gKG46IG51bWJlcik6IHN0cmluZyA9PiBuLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICByZXR1cm4gYCR7cGFkKGQuZ2V0SG91cnMoKSl9OiR7cGFkKGQuZ2V0TWludXRlcygpKX06JHtwYWQoZC5nZXRTZWNvbmRzKCkpfWA7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGluc3RhbmNlIG9mIHRoZSBBY3Rpdml0eVByaW50ZXJcbiAgICovXG4gIHByaXZhdGUgbWFrZUFjdGl2aXR5UHJpbnRlcigpIHtcbiAgICBjb25zdCBwcm9wczogQWN0aXZpdHlQcmludGVyUHJvcHMgPSB7XG4gICAgICBzdHJlYW06IHRoaXMuc2VsZWN0U3RyZWFtRnJvbUxldmVsKCdpbmZvJyksXG4gICAgfTtcblxuICAgIHN3aXRjaCAodGhpcy5zdGFja1Byb2dyZXNzKSB7XG4gICAgICBjYXNlIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5FVkVOVFM6XG4gICAgICAgIHJldHVybiBuZXcgSGlzdG9yeUFjdGl2aXR5UHJpbnRlcihwcm9wcyk7XG4gICAgICBjYXNlIFN0YWNrQWN0aXZpdHlQcm9ncmVzcy5CQVI6XG4gICAgICAgIHJldHVybiBuZXcgQ3VycmVudEFjdGl2aXR5UHJpbnRlcihwcm9wcyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29udmVydCBhIGBNZXNzYWdlU2VsZWN0b3JgIGludG8gYSBwcmVkaWNhdGUgdGhhdCBkZWNpZGVzIHdoZXRoZXIgYSBsaXN0ZW5lclxuICogYXBwbGllcyB0byBhIG1lc3NhZ2UuIEEgbWFrZXIgbWF0Y2hlcyBtZXNzYWdlcyBjYXJyeWluZyBpdHMgYGNvZGVgOyBhXG4gKiBwcmVkaWNhdGUgKGUuZy4gYSBtYWtlcidzIGAuaXNgLCBvciBhbnkgYChtc2cpID0+IGJvb2xlYW5gKSBpcyB1c2VkIGFzLWlzLlxuICovXG5mdW5jdGlvbiBtZXNzYWdlTWF0Y2hlcihzZWxlY3RvcjogTWVzc2FnZVNlbGVjdG9yPGFueT4pOiAobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pID0+IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIHNlbGVjdG9yO1xuICB9XG4gIGNvbnN0IHsgY29kZSB9ID0gc2VsZWN0b3I7XG4gIHJldHVybiAobXNnKSA9PiBtc2cuY29kZSA9PT0gY29kZTtcbn1cblxuLyoqXG4gKiBDb21iaW5lIHNldmVyYWwgc2VsZWN0b3JzIGludG8gYSBzaW5nbGUgcHJlZGljYXRlIHRoYXQgbWF0Y2hlcyBhIG1lc3NhZ2Ugd2hlblxuICogKmFueSogb2YgdGhlbSBtYXRjaGVzLiBFYWNoIHNlbGVjdG9yIG1heSBiZSBhIG1ha2VyIChtYXRjaGVkIGJ5IGl0cyBgY29kZWApXG4gKiBvciBhIHByZWRpY2F0ZS5cbiAqXG4gKiBVc2VmdWwgZm9yIG9uZSBsaXN0ZW5lciB0aGF0IHNwYW5zIG11bHRpcGxlIGNvZGVzLCBlLmcuXG4gKiBgaW9Ib3N0Lm9uKG1hdGNoQW55KElPLkNES19UT09MS0lUX0k1NTAxLCBJTy5DREtfVE9PTEtJVF9JNTUwMiksIGxpc3RlbmVyKWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaEFueSguLi5zZWxlY3RvcnM6IE1lc3NhZ2VTZWxlY3Rvcjxhbnk+W10pOiAobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pID0+IGJvb2xlYW4ge1xuICBjb25zdCBtYXRjaGVycyA9IHNlbGVjdG9ycy5tYXAobWVzc2FnZU1hdGNoZXIpO1xuICByZXR1cm4gKG1zZykgPT4gbWF0Y2hlcnMuc29tZSgobWF0Y2hlcykgPT4gbWF0Y2hlcyhtc2cpKTtcbn1cblxuLyoqXG4gKiBUaGlzIElvSG9zdCBpbXBsZW1lbnRhdGlvbiBjb25zaWRlcnMgYSByZXF1ZXN0IHByb21wdGFibGUsIGlmOlxuICogLSBpdCdzIGEgeWVzL25vIGNvbmZpcm1hdGlvblxuICogLSBhc2tpbmcgZm9yIGEgc3RyaW5nIG9yIG51bWJlciB2YWx1ZVxuICovXG5mdW5jdGlvbiBpc1Byb21wdGFibGVSZXF1ZXN0KG1zZzogSW9SZXF1ZXN0PGFueSwgYW55Pik6IG1zZyBpcyBJb1JlcXVlc3Q8YW55LCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuPiB7XG4gIHJldHVybiBpc0NvbmZpcm1hdGlvblByb21wdChtc2cpXG4gICAgfHwgdHlwZW9mIG1zZy5kZWZhdWx0UmVzcG9uc2UgPT09ICdzdHJpbmcnXG4gICAgfHwgdHlwZW9mIG1zZy5kZWZhdWx0UmVzcG9uc2UgPT09ICdudW1iZXInO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHRoZSByZXF1ZXN0IGlzIGEgY29uZmlybWF0aW9uIHByb21wdFxuICogV2UgdHJlYXQgYWxsIHJlcXVlc3RzIHdpdGggYSBib29sZWFuIHJlc3BvbnNlIGFzIGNvbmZpcm1hdGlvbiBwcm9tcHRzXG4gKi9cbmZ1bmN0aW9uIGlzQ29uZmlybWF0aW9uUHJvbXB0KG1zZzogSW9SZXF1ZXN0PGFueSwgYW55Pik6IG1zZyBpcyBJb1JlcXVlc3Q8YW55LCBib29sZWFuPiB7XG4gIHJldHVybiB0eXBlb2YgbXNnLmRlZmF1bHRSZXNwb25zZSA9PT0gJ2Jvb2xlYW4nO1xufVxuXG4vKipcbiAqIEhlbHBlciB0byBleHRyYWN0IGluZm9ybWF0aW9uIGZvciBwcm9tcHRseSBmcm9tIHRoZSByZXF1ZXN0XG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RQcm9tcHRJbmZvKG1zZzogSW9SZXF1ZXN0PGFueSwgYW55Pik6IHtcbiAgZGVmYXVsdDogc3RyaW5nO1xuICBkZWZhdWx0RGVzYzogc3RyaW5nO1xuICBjb252ZXJ0QW5zd2VyOiAoaW5wdXQ6IHN0cmluZykgPT4gc3RyaW5nIHwgbnVtYmVyO1xufSB7XG4gIGNvbnN0IGlzTnVtYmVyID0gKHR5cGVvZiBtc2cuZGVmYXVsdFJlc3BvbnNlID09PSAnbnVtYmVyJyk7XG4gIGNvbnN0IGRlZmF1bHRSZXNwb25zZSA9IHV0aWwuZm9ybWF0KG1zZy5kZWZhdWx0UmVzcG9uc2UpO1xuICByZXR1cm4ge1xuICAgIGRlZmF1bHQ6IGRlZmF1bHRSZXNwb25zZSxcbiAgICBkZWZhdWx0RGVzYzogJ2RlZmF1bHREZXNjcmlwdGlvbicgaW4gbXNnICYmIG1zZy5kZWZhdWx0RGVzY3JpcHRpb24gPyB1dGlsLmZvcm1hdChtc2cuZGVmYXVsdERlc2NyaXB0aW9uKSA6IGRlZmF1bHRSZXNwb25zZSxcbiAgICBjb252ZXJ0QW5zd2VyOiBpc051bWJlciA/ICh2KSA9PiBOdW1iZXIodikgOiAodikgPT4gU3RyaW5nKHYpLFxuICB9O1xufVxuXG5jb25zdCBzdHlsZU1hcDogUmVjb3JkPElvTWVzc2FnZUxldmVsLCAoc3RyOiBzdHJpbmcpID0+IHN0cmluZz4gPSB7XG4gIGVycm9yOiBjaGFsay5yZWQsXG4gIHdhcm46IGNoYWxrLnllbGxvdyxcbiAgcmVzdWx0OiBjaGFsay5yZXNldCxcbiAgaW5mbzogY2hhbGsucmVzZXQsXG4gIGRlYnVnOiBjaGFsay5ncmF5LFxuICB0cmFjZTogY2hhbGsuZ3JheSxcbn07XG5cbmZ1bmN0aW9uIHRhcmdldFN0cmVhbU9iamVjdCh4OiBUYXJnZXRTdHJlYW0pOiBOb2RlSlMuV3JpdGVTdHJlYW0gfCB1bmRlZmluZWQge1xuICBzd2l0Y2ggKHgpIHtcbiAgICBjYXNlICdzdGRlcnInOlxuICAgICAgcmV0dXJuIHByb2Nlc3Muc3RkZXJyO1xuICAgIGNhc2UgJ3N0ZG91dCc6XG4gICAgICByZXR1cm4gcHJvY2Vzcy5zdGRvdXQ7XG4gICAgY2FzZSAnZHJvcCc6XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzTm90aWNlc01lc3NhZ2UobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pOiBtc2cgaXMgSW9NZXNzYWdlPHZvaWQ+IHtcbiAgcmV0dXJuIElPLkNES19UT09MS0lUX0kwMTAwLmlzKG1zZykgfHwgSU8uQ0RLX1RPT0xLSVRfVzAxMDEuaXMobXNnKSB8fCBJTy5DREtfVE9PTEtJVF9FMDEwMS5pcyhtc2cpIHx8IElPLkNES19UT09MS0lUX0kwMTAxLmlzKG1zZyk7XG59XG5cbmZ1bmN0aW9uIGV2ZW50RnJvbU1lc3NhZ2UobXNnOiBJb01lc3NhZ2U8dW5rbm93bj4pOiBUZWxlbWV0cnlFdmVudCB8IHVuZGVmaW5lZCB7XG4gIGlmIChDTElfUFJJVkFURV9JTy5DREtfQ0xJX0kxMDAxLmlzKG1zZykpIHtcbiAgICByZXR1cm4gZXZlbnRSZXN1bHQoJ1NZTlRIJywgbXNnKTtcbiAgfVxuICBpZiAoQ0xJX1BSSVZBVEVfSU8uQ0RLX0NMSV9JMjAwMS5pcyhtc2cpKSB7XG4gICAgcmV0dXJuIGV2ZW50UmVzdWx0KCdJTlZPS0UnLCBtc2cpO1xuICB9XG4gIGlmIChDTElfUFJJVkFURV9JTy5DREtfQ0xJX0kzMDAxLmlzKG1zZykpIHtcbiAgICByZXR1cm4gZXZlbnRSZXN1bHQoJ0RFUExPWScsIG1zZyk7XG4gIH1cbiAgaWYgKENMSV9QUklWQVRFX0lPLkNES19DTElfSTMwMDMuaXMobXNnKSkge1xuICAgIHJldHVybiBldmVudFJlc3VsdCgnQVNTRVQnLCBtc2cpO1xuICB9XG4gIC8vIEhvdHN3YXAgbGl2ZXMgaW4gdGhlIGNkay10b29sa2l0IHNvIGl0IGNhbm5vdCBiZSBhIENES19DTEkgZXJyb3IgY29kZS5cbiAgLy8gSW5zdGVhZCB3ZSByZXVzZSB0aGUgZXhpc3RpbmcgSG90c3dhcCBzcGFuLlxuICBpZiAoSU8uQ0RLX1RPT0xLSVRfSTU0MTAuaXMobXNnKSkge1xuICAgIC8vIENyZWF0ZSBhIHRlbGVtZXRyeS1jb21wYXRpYmxlIHJlc3VsdFxuICAgIHJldHVybiBob3Rzd2FwVG9FdmVudFJlc3VsdChtc2cuZGF0YSk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBmdW5jdGlvbiBldmVudFJlc3VsdChldmVudFR5cGU6IFRlbGVtZXRyeUV2ZW50WydldmVudFR5cGUnXSwgbTogSW9NZXNzYWdlPEV2ZW50UmVzdWx0Pik6IFRlbGVtZXRyeUV2ZW50IHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRUeXBlLFxuICAgICAgZHVyYXRpb246IG0uZGF0YS5kdXJhdGlvbixcbiAgICAgIGVycm9yOiBtLmRhdGEuZXJyb3IsXG4gICAgICBjb3VudGVyczogbS5kYXRhLmNvdW50ZXJzLFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gaG90c3dhcFRvRXZlbnRSZXN1bHQocmVzdWx0OiBIb3Rzd2FwUmVzdWx0KTogVGVsZW1ldHJ5RXZlbnQge1xuICBjb25zdCBub25Ib3Rzd2FwcGFibGVSZXNvdXJjZXM6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbiAgZm9yIChjb25zdCB7IHN1YmplY3QgfSBvZiByZXN1bHQubm9uSG90c3dhcHBhYmxlQ2hhbmdlcykge1xuICAgIGlmICgncmVzb3VyY2VUeXBlJyBpbiBzdWJqZWN0KSB7XG4gICAgICBjb25zdCBrZXlzID0gJ3JlamVjdGVkUHJvcGVydGllcycgaW4gc3ViamVjdCAmJiBzdWJqZWN0LnJlamVjdGVkUHJvcGVydGllc1xuICAgICAgICA/IHN1YmplY3QucmVqZWN0ZWRQcm9wZXJ0aWVzLm1hcChwID0+IGBob3Rzd2FwRmFsbGJhY2s6JHtzdWJqZWN0LnJlc291cmNlVHlwZX0jJHtwfWApXG4gICAgICAgIDogW2Bob3Rzd2FwRmFsbGJhY2s6JHtzdWJqZWN0LnJlc291cmNlVHlwZX1gXTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMpIHtcbiAgICAgICAgbm9uSG90c3dhcHBhYmxlUmVzb3VyY2VzW2tleV0gPSAobm9uSG90c3dhcHBhYmxlUmVzb3VyY2VzW2tleV0gPz8gMCkgKyAxO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgZXZlbnRUeXBlOiAnSE9UU1dBUCcgYXMgY29uc3QsXG4gICAgZHVyYXRpb246IHJlc3VsdC5kdXJhdGlvbixcbiAgICAuLi4ocmVzdWx0LmVycm9yID8ge1xuICAgICAgZXJyb3I6IHtcbiAgICAgICAgbmFtZTogY2RrQ2xpRXJyb3JOYW1lKHJlc3VsdC5lcnJvciksXG4gICAgICB9LFxuICAgIH0gOiB7fSksXG4gICAgY291bnRlcnM6IHtcbiAgICAgIGhvdHN3YXBwZWQ6IHJlc3VsdC5ob3Rzd2FwcGVkID8gMSA6IDAsXG4gICAgICBob3Rzd2FwRmFsbGJhY2s6IHJlc3VsdC5ob3Rzd2FwRmFsbGJhY2sgPyAxIDogMCxcbiAgICAgIGhvdHN3YXBwYWJsZUNoYW5nZXM6IHJlc3VsdC5ob3Rzd2FwcGFibGVDaGFuZ2VzLmxlbmd0aCxcbiAgICAgIG5vbkhvdHN3YXBwYWJsZUNoYW5nZXM6IHJlc3VsdC5ub25Ib3Rzd2FwcGFibGVDaGFuZ2VzLmxlbmd0aCxcbiAgICAgIC4uLm5vbkhvdHN3YXBwYWJsZVJlc291cmNlcyxcbiAgICB9LFxuICB9O1xufVxuIl19