@dbx-tools/appkit-mastra 0.9.153 → 0.9.157

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 (76) hide show
  1. package/README.md +4 -3
  2. package/index.ts +32 -24
  3. package/lib/index.d.ts +32 -24
  4. package/lib/index.js +32 -23
  5. package/lib/src/agents.d.ts +5 -6
  6. package/lib/src/agents.js +12 -15
  7. package/lib/src/chart.js +33 -33
  8. package/lib/src/chat.js +10 -13
  9. package/lib/src/config.d.ts +12 -13
  10. package/lib/src/config.js +4 -4
  11. package/lib/src/evaluation.js +7 -9
  12. package/lib/src/feedback-mode.d.ts +1 -1
  13. package/lib/src/feedback-mode.js +1 -1
  14. package/lib/src/filesystems.js +6 -6
  15. package/lib/src/follow-up-suggestions.js +10 -10
  16. package/lib/src/genie-chat.js +27 -29
  17. package/lib/src/genie.d.ts +2 -2
  18. package/lib/src/genie.js +29 -29
  19. package/lib/src/identity.d.ts +3 -30
  20. package/lib/src/identity.js +2 -27
  21. package/lib/src/memory.d.ts +1 -1
  22. package/lib/src/memory.js +24 -6
  23. package/lib/src/mlflow.d.ts +4 -4
  24. package/lib/src/mlflow.js +15 -18
  25. package/lib/src/model.d.ts +3 -3
  26. package/lib/src/model.js +6 -6
  27. package/lib/src/monty-sandbox.js +8 -8
  28. package/lib/src/observability.d.ts +6 -5
  29. package/lib/src/observability.js +8 -6
  30. package/lib/src/plugin.d.ts +1 -1
  31. package/lib/src/plugin.js +49 -51
  32. package/lib/src/remote-skills.d.ts +3 -4
  33. package/lib/src/remote-skills.js +46 -46
  34. package/lib/src/rest.d.ts +2 -2
  35. package/lib/src/rest.js +3 -3
  36. package/lib/src/server.js +17 -20
  37. package/lib/src/serving.js +10 -11
  38. package/lib/src/statement.js +7 -7
  39. package/lib/src/storage-schema.js +4 -4
  40. package/lib/src/summarize.js +5 -5
  41. package/lib/src/telemetry.d.ts +0 -6
  42. package/lib/src/telemetry.js +34 -41
  43. package/lib/src/validation.js +3 -4
  44. package/lib/src/workspaces.d.ts +2 -2
  45. package/lib/src/workspaces.js +34 -36
  46. package/lib/src/writer.d.ts +2 -2
  47. package/lib/src/writer.js +3 -3
  48. package/package.json +17 -305
  49. package/src/agents.ts +27 -21
  50. package/src/chart.ts +43 -37
  51. package/src/chat.ts +10 -12
  52. package/src/config.ts +14 -15
  53. package/src/evaluation.ts +6 -8
  54. package/src/feedback-mode.ts +1 -1
  55. package/src/filesystems.ts +5 -5
  56. package/src/follow-up-suggestions.ts +9 -9
  57. package/src/genie-chat.ts +32 -31
  58. package/src/genie.ts +29 -29
  59. package/src/identity.ts +3 -38
  60. package/src/memory.ts +24 -6
  61. package/src/mlflow.ts +21 -21
  62. package/src/model.ts +7 -7
  63. package/src/monty-sandbox.ts +7 -7
  64. package/src/observability.ts +8 -6
  65. package/src/plugin.ts +78 -65
  66. package/src/remote-skills.ts +63 -55
  67. package/src/rest.ts +4 -4
  68. package/src/server.ts +32 -20
  69. package/src/serving.ts +14 -11
  70. package/src/statement.ts +10 -6
  71. package/src/storage-schema.ts +3 -3
  72. package/src/summarize.ts +4 -4
  73. package/src/telemetry.ts +49 -55
  74. package/src/validation.ts +2 -3
  75. package/src/workspaces.ts +52 -42
  76. package/src/writer.ts +3 -3
@@ -14,13 +14,12 @@
14
14
  import { createHash } from "node:crypto";
15
15
  import { tmpdir } from "node:os";
16
16
  import { join } from "node:path";
17
- import { appkit, pluginRegistry } from "@dbx-tools/appkit";
18
- import { filesCache as filesCachePlugin, } from "@dbx-tools/appkit/files-cache";
19
- import { DatabricksFileSystem, workspaceClient } from "@dbx-tools/databricks";
17
+ import { tryGetExecutionContext, instance, filesCache as filesCachePlugin, } from "@dbx-tools/appkit";
18
+ import { DatabricksFileSystem, toLegacyWorkspaceClient } from "@dbx-tools/databricks";
20
19
  import { LocalFileSystem } from "@dbx-tools/fs";
21
- import { find, match } from "@dbx-tools/path";
22
- import { errorUtils, log, object, stringUtils, token } from "@dbx-tools/shared-core";
23
- import { fs as sharedFS, posixPath, MemoryFileSystem, } from "@dbx-tools/shared-fs";
20
+ import { findFiles, toPathMatcher } from "@dbx-tools/path";
21
+ import { log, toError, toStableKey, isRecord, trimToNull, toSlug, tokenize, includesAccessTokenScope, } from "@dbx-tools/shared-core";
22
+ import { fs as sharedFS, posixPath, MemoryFileSystem, isAbsolute, normalize, normalizeRoot, isWithinRoot, basename, } from "@dbx-tools/shared-fs";
24
23
  import { createSkill, validateSkillContent } from "@mastra/core/skills";
25
24
  import { Workspace, } from "@mastra/core/workspace";
26
25
  import { MASTRA_SCOPES_KEY, MASTRA_USER_EMAIL_KEY, MASTRA_USER_KEY, resolveUserKey, } from "./config.js";
@@ -89,7 +88,7 @@ export function databricksWorkspaceConfig(options = {}) {
89
88
  const paths = resolveDatabricksWorkspacePaths(options);
90
89
  const configuredPaths = paths.length;
91
90
  const extraSkillMounts = options.extraSkillMounts ?? [];
92
- const filesCache = pluginRegistry.instance(options.pluginContext, filesCachePlugin)?.exports();
91
+ const filesCache = instance(options.pluginContext, filesCachePlugin)?.exports();
93
92
  const configuredCache = options.cache;
94
93
  const mountFilesCache = configuredCache === false ? undefined : filesCache;
95
94
  const retainFilesystemSource = mountFilesCache !== undefined &&
@@ -220,7 +219,7 @@ function sandboxName(selection) {
220
219
  * file API access (`workspace` or `all-apis` on {@link MASTRA_SCOPES_KEY}).
221
220
  */
222
221
  function hasWorkspaceFileScope(requestContext) {
223
- return token.includesAccessTokenScope(requestContext?.get(MASTRA_SCOPES_KEY), WORKSPACE_FILE_SCOPES);
222
+ return includesAccessTokenScope(requestContext?.get(MASTRA_SCOPES_KEY), WORKSPACE_FILE_SCOPES);
224
223
  }
225
224
  /** Resolve the request client and authorization-safe files-cache scope. */
226
225
  async function resolveFilesCacheScope(context) {
@@ -242,18 +241,18 @@ async function resolveFilesCacheScope(context) {
242
241
  }
243
242
  /** Join one relative skill path to its actual composite mount path. */
244
243
  function mountedSkillPath(mount, skillPath) {
245
- if (posixPath.isAbsolute(skillPath)) {
244
+ if (isAbsolute(skillPath)) {
246
245
  throw new TypeError(`Skill path must be relative to its mount: ${skillPath}`);
247
246
  }
248
- const normalized = posixPath.normalize(skillPath);
247
+ const normalized = normalize(skillPath);
249
248
  if (!normalized.ok) {
250
249
  throw new TypeError(`Skill path escapes its mount: ${skillPath}`);
251
250
  }
252
- return posixPath.join(posixPath.normalizeRoot(mount), normalized.path.slice(1));
251
+ return posixPath.join(normalizeRoot(mount), normalized.path.slice(1));
253
252
  }
254
253
  /** Return whether a Databricks path belongs to the writable Workspace namespace. */
255
254
  function isWorkspaceRoot(root) {
256
- const normalized = posixPath.normalizeRoot(root);
255
+ const normalized = normalizeRoot(root);
257
256
  return normalized === "/Workspace" || normalized.startsWith("/Workspace/");
258
257
  }
259
258
  /**
@@ -275,7 +274,7 @@ async function resolveWorkspacePathMounts(paths, context, filesCache, cacheConfi
275
274
  const configured = await resolveDatabricksWorkspacePath(path, context);
276
275
  if (!configured)
277
276
  continue;
278
- if (posixPath.isWithinRoot(SCRATCH_MOUNT, configured.path)) {
277
+ if (isWithinRoot(SCRATCH_MOUNT, configured.path)) {
279
278
  const mount = configured.mount ?? configured.path;
280
279
  mounts[mount] = userTempFilesystem(context, configured.path);
281
280
  hasWritableMount = true;
@@ -345,7 +344,7 @@ async function resolveSkillFolderFilesystem(folder, context, cacheConfig, cache)
345
344
  });
346
345
  return undefined;
347
346
  }
348
- const root = stringUtils.trimToNull(folder.path);
347
+ const root = trimToNull(folder.path);
349
348
  if (!root)
350
349
  return undefined;
351
350
  const writable = folder.writable ?? isWorkspaceRoot(root);
@@ -365,11 +364,11 @@ function requestContextValues(requestContext) {
365
364
  return requestContext?.toJSON() ?? {};
366
365
  }
367
366
  function resolveHomePath(input, requestContext) {
368
- const value = stringUtils.trimToNull(input);
367
+ const value = trimToNull(input);
369
368
  if (!value || (value !== "~" && !value.startsWith("~/")))
370
369
  return value ?? undefined;
371
370
  const emailValue = requestContext[MASTRA_USER_EMAIL_KEY];
372
- const email = typeof emailValue === "string" ? stringUtils.trimToNull(emailValue) : undefined;
371
+ const email = typeof emailValue === "string" ? trimToNull(emailValue) : undefined;
373
372
  if (!email)
374
373
  return undefined;
375
374
  const home = personalWorkspacePath(email);
@@ -395,11 +394,11 @@ function cacheFilterMatches(policy, operation, path, requestContext, root) {
395
394
  const expanded = resolveHomePath(input, requestContext);
396
395
  if (!expanded)
397
396
  continue;
398
- inputs.push(!root || posixPath.isAbsolute(expanded) || expanded.startsWith("**")
397
+ inputs.push(!root || isAbsolute(expanded) || expanded.startsWith("**")
399
398
  ? expanded
400
- : `${posixPath.normalizeRoot(root)}/${expanded.replace(/^\.\//, "")}`);
399
+ : `${normalizeRoot(root)}/${expanded.replace(/^\.\//, "")}`);
401
400
  }
402
- return inputs.length > 0 && match.toPathMatcher(...inputs)(path);
401
+ return inputs.length > 0 && toPathMatcher(...inputs)(path);
403
402
  }
404
403
  async function resolveFileCacheOptions(configured, context, root, skillPaths) {
405
404
  const requestContext = requestContextValues(context.requestContext);
@@ -410,8 +409,7 @@ async function resolveFileCacheOptions(configured, context, root, skillPaths) {
410
409
  const roots = skillPaths.map((path) => mountedSkillPath(root, path));
411
410
  return {
412
411
  operations: CACHEABLE_FILESYSTEM_OPERATIONS,
413
- filter: (operation, path) => operation !== "readFile" ||
414
- roots.some((skillRoot) => posixPath.isWithinRoot(skillRoot, path)),
412
+ filter: (operation, path) => operation !== "readFile" || roots.some((skillRoot) => isWithinRoot(skillRoot, path)),
415
413
  };
416
414
  }
417
415
  const policies = toPolicyArray(resolved);
@@ -433,10 +431,10 @@ function resolveWorkspaceIdentity(options) {
433
431
  let id = options.id;
434
432
  let name = options.name;
435
433
  if (!id) {
436
- id = name ? stringUtils.toSlug(name) : "workspace";
434
+ id = name ? toSlug(name) : "workspace";
437
435
  }
438
436
  if (!name) {
439
- name = Array.from(stringUtils.tokenize(id)).join(" ");
437
+ name = Array.from(tokenize(id)).join(" ");
440
438
  }
441
439
  return { id, name };
442
440
  }
@@ -462,10 +460,10 @@ function buildMountResolvers(paths, mounts, localMounts, filesCache, cacheConfig
462
460
  function userTempFilesystem(context, workspacePath) {
463
461
  const userKey = resolveUserKey(context.requestContext);
464
462
  const digest = createHash("sha256")
465
- .update(object.toStableKey({ package: "@dbx-tools/appkit-mastra", userKey }))
463
+ .update(toStableKey({ package: "@dbx-tools/appkit-mastra", userKey }))
466
464
  .digest("hex")
467
465
  .slice(0, 16);
468
- const normalized = posixPath.normalizeRoot(workspacePath);
466
+ const normalized = normalizeRoot(workspacePath);
469
467
  const relative = normalized === SCRATCH_MOUNT ? "" : normalized.slice(`${SCRATCH_MOUNT}/`.length);
470
468
  const source = new LocalFileSystem({
471
469
  root: join(tmpdir(), "dbx-tools", "mastra", digest, relative),
@@ -487,7 +485,7 @@ function localSkillMountResolvers(mounts) {
487
485
  unique.set(`${entry.mountPath}\0${identity}`, entry);
488
486
  }
489
487
  return [...unique.values()].map((entry) => {
490
- const mount = posixPath.normalizeRoot(entry.mountPath);
488
+ const mount = normalizeRoot(entry.mountPath);
491
489
  const filesystem = inMemorySkillFilesystem(entry);
492
490
  return async () => {
493
491
  const source = await filesystem;
@@ -536,7 +534,7 @@ export async function inlineSkillsFromLocalMounts(mounts) {
536
534
  ...(metadata.compatibility !== undefined
537
535
  ? { compatibility: metadata.compatibility }
538
536
  : {}),
539
- ...(object.isRecord(metadata.metadata) ? { metadata: metadata.metadata } : {}),
537
+ ...(isRecord(metadata.metadata) ? { metadata: metadata.metadata } : {}),
540
538
  ...(Object.keys(references).length > 0 ? { references } : {}),
541
539
  }));
542
540
  }
@@ -572,7 +570,7 @@ async function loadInMemorySkillFilesystem(mount) {
572
570
  root: "/",
573
571
  });
574
572
  await memory.init();
575
- for await (const relative of find.findFiles("**/*", { cwd: mount.root, nodir: true })) {
573
+ for await (const relative of findFiles("**/*", { cwd: mount.root, nodir: true })) {
576
574
  await memory.writeFile(relative, await source.readFile(relative), { overwrite: true });
577
575
  }
578
576
  await source.close();
@@ -596,7 +594,7 @@ function shouldMountSkillFolders(requestContext) {
596
594
  */
597
595
  async function databricksFilesystem(client, root, readOnly = true, createRoot = !readOnly, fileSystemCache, cacheOptions, adapterOptions = {}) {
598
596
  const fs = new DatabricksFileSystem({
599
- client: () => workspaceClient.toLegacyWorkspaceClient(requestWorkspaceClient(client)),
597
+ client: () => toLegacyWorkspaceClient(requestWorkspaceClient(client)),
600
598
  root,
601
599
  readOnly,
602
600
  createRoot,
@@ -614,13 +612,13 @@ async function databricksFilesystem(client, root, readOnly = true, createRoot =
614
612
  logger.debug("databricks-mount:skipped", {
615
613
  root,
616
614
  readOnly,
617
- error: errorUtils.toError(err),
615
+ error: toError(err),
618
616
  });
619
617
  }
620
618
  return undefined;
621
619
  }
622
620
  /** @internal Keep service context from replacing the request-scoped workspace client. */
623
- export function requestWorkspaceClient(initialClient, executionContext = appkit.tryGetExecutionContext()) {
621
+ export function requestWorkspaceClient(initialClient, executionContext = tryGetExecutionContext()) {
624
622
  if (executionContext &&
625
623
  "isUserContext" in executionContext &&
626
624
  executionContext.isUserContext === true) {
@@ -651,7 +649,7 @@ function verifyFirstFileSystemAccess(filesystem, readProbe, root) {
651
649
  readCheck = undefined;
652
650
  logger.debug("databricks-mount:read-check-failed", {
653
651
  root,
654
- error: errorUtils.toError(error),
652
+ error: toError(error),
655
653
  });
656
654
  throw error;
657
655
  }
@@ -685,7 +683,7 @@ function verifyFirstFileSystemAccess(filesystem, readProbe, root) {
685
683
  if (!writeVerified) {
686
684
  logger.debug("databricks-mount:write-check-failed", {
687
685
  root,
688
- error: errorUtils.toError(error),
686
+ error: toError(error),
689
687
  });
690
688
  }
691
689
  throw error;
@@ -762,7 +760,7 @@ async function resolveDistinctSkillPaths(filesystem, paths, excludedSkillNames)
762
760
  try {
763
761
  const entries = await filesystem.readdir(path);
764
762
  if (entries.some((entry) => entry.type === "file" && entry.name === "SKILL.md")) {
765
- const name = posixPath.basename(path);
763
+ const name = basename(path);
766
764
  if (!excludedSkillNames.has(name) && !selected.has(name))
767
765
  selected.set(name, path);
768
766
  continue;
@@ -779,7 +777,7 @@ async function resolveDistinctSkillPaths(filesystem, paths, excludedSkillNames)
779
777
  catch (error) {
780
778
  logger.debug("skill-path:skipped", {
781
779
  path,
782
- error: errorUtils.toError(error),
780
+ error: toError(error),
783
781
  });
784
782
  }
785
783
  }
@@ -802,4 +800,4 @@ function contributionResolver(resolvers) {
802
800
  return pending;
803
801
  };
804
802
  }
805
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxFQUNMLFVBQVUsSUFBSSxnQkFBZ0IsR0FHL0IsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBdUIsTUFBTSxpQkFBaUIsQ0FBQztBQUNuRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JGLE9BQU8sRUFDTCxFQUFFLElBQUksUUFBUSxFQUNkLFNBQVMsRUFLVCxnQkFBZ0IsR0FDakIsTUFBTSxzQkFBc0IsQ0FBQztBQUU5QixPQUFPLEVBQUUsV0FBVyxFQUFFLG9CQUFvQixFQUFvQixNQUFNLHFCQUFxQixDQUFDO0FBQzFGLE9BQU8sRUFDTCxTQUFTLEdBT1YsTUFBTSx3QkFBd0IsQ0FBQztBQUVoQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2YsY0FBYyxHQUVmLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsMEJBQTBCLEdBRTNCLE1BQU0sa0JBQWtC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RCxDQUFDO0lBQzlELE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzVCLFFBQVEsS0FBSyw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDOUQsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BELElBQUksUUFBUTtZQUFFLE9BQU8sUUFBUSxDQUFDO1FBQzlCLE1BQU0sT0FBTyxHQUFHLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFzdHJhIHdvcmtzcGFjZSBmYWN0b3J5IGZvciBEYXRhYnJpY2tzIEFwcHMuXG4gKlxuICogQnVpbGRzIG5hdGl2ZSBNYXN0cmEgd29ya3NwYWNlIGNvbmZpZ3VyYXRpb24gZnJvbSBEYXRhYnJpY2tzIHBhdGhzLiBQYXRoc1xuICogbW91bnQgYXQgdGhlIHNhbWUgcGF0aCBieSBkZWZhdWx0LCBgfmAgcmVzb2x2ZXMgdG8gdGhlIGN1cnJlbnQgdXNlcidzXG4gKiBEYXRhYnJpY2tzIHdvcmtzcGFjZSBob21lLCBhbmQgYC90bXBbL3N1YnBhdGhdYCByZXNvbHZlcyB0byBzdGFibGVcbiAqIHVzZXItc2NvcGVkIHN0b3JhZ2UgdW5kZXIgdGhlIGhvc3QncyBlcGhlbWVyYWwgdGVtcCBkaXJlY3RvcnkuXG4gKlxuICogRGF0YWJyaWNrcyBtb3VudHMgdXNlIGBAZGJ4LXRvb2xzL2RhdGFicmlja3NgIHtAbGluayBEYXRhYnJpY2tzRmlsZVN5c3RlbX1cbiAqIHdyYXBwZWQgYnkge0BsaW5rIGZpbGVzeXN0ZW1zfTsgaW5hY2Nlc3NpYmxlIHJvb3RzIGFyZSBza2lwcGVkIGluZGVwZW5kZW50bHkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBhcHBraXQsIHBsdWdpblJlZ2lzdHJ5IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQge1xuICBmaWxlc0NhY2hlIGFzIGZpbGVzQ2FjaGVQbHVnaW4sXG4gIHR5cGUgRmlsZXNDYWNoZUV4cG9ydHMsXG4gIHR5cGUgRmlsZXNDYWNoZVNjb3BlLFxufSBmcm9tIFwiQGRieC10b29scy9hcHBraXQvZmlsZXMtY2FjaGVcIjtcbmltcG9ydCB7IERhdGFicmlja3NGaWxlU3lzdGVtLCB3b3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRieC10b29scy9kYXRhYnJpY2tzXCI7XG5pbXBvcnQgeyBMb2NhbEZpbGVTeXN0ZW0gfSBmcm9tIFwiQGRieC10b29scy9mc1wiO1xuaW1wb3J0IHsgZmluZCwgbWF0Y2gsIHR5cGUgUGF0aE1hdGNoSW5wdXQgfSBmcm9tIFwiQGRieC10b29scy9wYXRoXCI7XG5pbXBvcnQgeyBlcnJvclV0aWxzLCBsb2csIG9iamVjdCwgc3RyaW5nVXRpbHMsIHRva2VuIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIGZzIGFzIHNoYXJlZEZTLFxuICBwb3NpeFBhdGgsXG4gIHR5cGUgQ2FjaGVhYmxlRmlsZVN5c3RlbU9wZXJhdGlvbixcbiAgdHlwZSBGaWxlU3lzdGVtLFxuICB0eXBlIEZpbGVTeXN0ZW1DYWNoZSxcbiAgdHlwZSBGaWxlU3lzdGVtQ2FjaGVPcHRpb25zLFxuICBNZW1vcnlGaWxlU3lzdGVtLFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZnNcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgY3JlYXRlU2tpbGwsIHZhbGlkYXRlU2tpbGxDb250ZW50LCB0eXBlIElubGluZVNraWxsIH0gZnJvbSBcIkBtYXN0cmEvY29yZS9za2lsbHNcIjtcbmltcG9ydCB7XG4gIFdvcmtzcGFjZSxcbiAgdHlwZSBTa2lsbHNSZXNvbHZlcixcbiAgdHlwZSBXb3Jrc3BhY2VDb25maWcsXG4gIHR5cGUgV29ya3NwYWNlRmlsZXN5c3RlbSxcbiAgdHlwZSBXb3Jrc3BhY2VTYW5kYm94LFxuICB0eXBlIFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlcixcbiAgdHlwZSBXb3Jrc3BhY2VUb29sc0NvbmZpZyxcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3Jrc3BhY2VcIjtcblxuaW1wb3J0IHtcbiAgTUFTVFJBX1NDT1BFU19LRVksXG4gIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSxcbiAgTUFTVFJBX1VTRVJfS0VZLFxuICByZXNvbHZlVXNlcktleSxcbiAgdHlwZSBVc2VyLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7XG4gIGZpbGVzeXN0ZW1zLFxuICBNb3VudGVkQ29tcG9zaXRlRmlsZXN5c3RlbSxcbiAgdHlwZSBNYXN0cmFGaWxlU3lzdGVtQWRhcHRlck9wdGlvbnMsXG59IGZyb20gXCIuL2ZpbGVzeXN0ZW1zLnRzXCI7XG5pbXBvcnQgeyBNb250eVNhbmRib3ggfSBmcm9tIFwiLi9tb250eS1zYW5kYm94LnRzXCI7XG5pbXBvcnQgdHlwZSB7IExvY2FsU2tpbGxNb3VudCB9IGZyb20gXCIuL3JlbW90ZS1za2lsbHMudHNcIjtcbmltcG9ydCB7IE9SR0FOSVpBVElPTl9BU1NJU1RBTlRfUEFUSCwgcGVyc29uYWxXb3Jrc3BhY2VQYXRoIH0gZnJvbSBcIi4vc2tpbGwtcGF0aHMudHNcIjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIE9BdXRoIHNjb3BlcyB0aGF0IGdhdGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgZmlsZSBtb3VudHMuICovXG5jb25zdCBXT1JLU1BBQ0VfRklMRV9TQ09QRVMgPSBbXCJ3b3Jrc3BhY2VcIiwgXCJ3b3Jrc3BhY2Uud29ya3NwYWNlXCIsIFwiYWxsLWFwaXNcIl0gYXMgY29uc3Q7XG5jb25zdCBTQ1JBVENIX01PVU5UID0gXCIvdG1wXCI7XG5jb25zdCBDQUNIRUFCTEVfRklMRVNZU1RFTV9PUEVSQVRJT05TID0gW1xuICBcImV4aXN0c1wiLFxuICBcInJlYWRGaWxlXCIsXG4gIFwicmVhZGRpclwiLFxuICBcInN0YXRcIixcbl0gYXMgY29uc3Qgc2F0aXNmaWVzIHJlYWRvbmx5IENhY2hlYWJsZUZpbGVTeXN0ZW1PcGVyYXRpb25bXTtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIm1hc3RyYS93b3Jrc3BhY2VzXCIpO1xubGV0IHdvcmtzcGFjZVNvdXJjZVNlcXVlbmNlID0gMDtcbmNvbnN0IGRhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zID0gbmV3IFdlYWtNYXA8V29ya3NwYWNlLCBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucz4oKTtcbmNvbnN0IHNoYXJlZFNraWxsRmlsZXN5c3RlbXMgPSBuZXcgTWFwPHN0cmluZywgUHJvbWlzZTxGaWxlU3lzdGVtPj4oKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIFBlci1yZXF1ZXN0IGNvbnRleHQgZm9yIHdvcmtzcGFjZSBwYXRoIHJlc29sdmVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQge1xuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xufVxuXG4vKipcbiAqIE9uZSBEYXRhYnJpY2tzIHBhdGggbW91bnRlZCBpbnRvIGEgTWFzdHJhIHdvcmtzcGFjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aE9wdGlvbnMge1xuICAvKiogQWJzb2x1dGUgRGF0YWJyaWNrcyBwYXRoIG9yIGB+YCBzaG9ydGN1dCBmb3IgdGhlIGN1cnJlbnQgdXNlcidzIHdvcmtzcGFjZSBob21lLiAqL1xuICBwYXRoOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1mcmllbmRseSBtb3VudCBuYW1lIHNob3duIGluIGZpbGVzeXN0ZW0gbGlzdGluZ3MuICovXG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICAvKiogTW91bnQgZGVzY3JpcHRpb24gc2hvd24gaW4gZmlsZXN5c3RlbSBsaXN0aW5ncyBhbmQgd29ya3NwYWNlIGluc3RydWN0aW9ucy4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTa2lsbCBwYXRocyByZWxhdGl2ZSB0byB0aGlzIGluY2x1ZGVkIGZpbGVzeXN0ZW0gcGF0aC4gT21pdCBmb3IgYVxuICAgKiBmaWxlLW9ubHkgbW91bnQuIEVhY2ggZW50cnkgaXMgam9pbmVkIHRvIHRoZSBhY3R1YWwgbW91bnQgcGF0aCBiZWZvcmVcbiAgICogTWFzdHJhIHJlY2VpdmVzIGl0LlxuICAgKi9cbiAgc2tpbGxzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIC8qKlxuICAgKiBBbGxvdyB3cml0ZSBhdHRlbXB0cyB0byBhIHtAbGluayBwYXRofSBtb3VudC4gRGVmYXVsdHMgdG8gYHRydWVgIGZvclxuICAgKiBgL1dvcmtzcGFjZWAgcm9vdHMgYW5kIGBmYWxzZWAgZWxzZXdoZXJlLiBEYXRhYnJpY2tzIHBlcm1pc3Npb25zIHN0aWxsXG4gICAqIGRldGVybWluZSB3aGV0aGVyIGVhY2ggbXV0YXRpb24gc3VjY2VlZHMuXG4gICAqL1xuICB3cml0YWJsZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBDcmVhdGUgYSB3cml0YWJsZSB7QGxpbmsgcGF0aH0gcm9vdCB3aGVuIG1pc3NpbmcuIERlZmF1bHRzIHRvXG4gICAqIHtAbGluayB3cml0YWJsZX07IHNldCBgZmFsc2VgIGZvciBwcmUtZXhpc3Rpbmcgcm9vdHMgd2l0aCBjb25kaXRpb25hbCBhY2Nlc3MuXG4gICAqL1xuICBjcmVhdGVSb290PzogYm9vbGVhbjtcbiAgLyoqIE1vdW50IHBvaW50IGluIHRoZSBjb21wb3NpdGUgbmFtZXNwYWNlLiBEYXRhYnJpY2tzIHBhdGhzIGRlZmF1bHQgdG8gdGhlaXIgYWN0dWFsIHJvb3QuICovXG4gIG1vdW50Pzogc3RyaW5nO1xufVxuXG4vKiogU3RyaW5nIHNob3J0aGFuZCBvciBmdWxsIG9wdGlvbnMgZm9yIG9uZSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBwYXRoLiAqL1xuZXhwb3J0IHR5cGUgRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGggPSBzdHJpbmcgfCBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aE9wdGlvbnM7XG5cbi8qKiBGaXhlZCBvciByZXF1ZXN0LWRlcGVuZGVudCBEYXRhYnJpY2tzIHBhdGggZW50cnkuICovXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aFZhbHVlID1cbiAgfCBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aFxuICB8IGZhbHNlXG4gIHwgKChcbiAgICAgIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuICAgICkgPT5cbiAgICAgIHwgRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhcbiAgICAgIHwgZmFsc2VcbiAgICAgIHwgdW5kZWZpbmVkXG4gICAgICB8IFByb21pc2U8RGF0YWJyaWNrc1dvcmtzcGFjZVBhdGggfCBmYWxzZSB8IHVuZGVmaW5lZD4pO1xuXG4vKiogT3BlcmF0aW9ucyBhbmQgcGF0aCBnbG9icyBjYWNoZWQgYnkgdGhlIERhdGFicmlja3MgZmlsZXN5c3RlbSBzaG9ydGN1dC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlRmlsdGVyIHtcbiAgLyoqIENhY2hlZCBmaWxlc3lzdGVtIG9wZXJhdGlvbnMuIE9taXQgZm9yIGBleGlzdHNgLCBgcmVhZEZpbGVgLCBgcmVhZGRpcmAsIGFuZCBgc3RhdGAuICovXG4gIG9wZXJhdGlvbnM/OiBDYWNoZWFibGVGaWxlU3lzdGVtT3BlcmF0aW9uIHwgcmVhZG9ubHkgQ2FjaGVhYmxlRmlsZVN5c3RlbU9wZXJhdGlvbltdO1xuICAvKiogQWJzb2x1dGUgb3Igcm9vdC1yZWxhdGl2ZSBnbG9icyBhbmQgcHJlZGljYXRlcy4gYH5gIGV4cGFuZHMgcGVyIHJlcXVlc3QuICovXG4gIHBhdGhzPzogUGF0aE1hdGNoSW5wdXQgfCByZWFkb25seSBQYXRoTWF0Y2hJbnB1dFtdO1xufVxuXG4vKiogRml4ZWQgb3IgcmVxdWVzdC1kZXBlbmRlbnQgZmlsZXN5c3RlbSBjYWNoZSBzZWxlY3Rpb24uICovXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGUgPVxuICB8IGJvb2xlYW5cbiAgfCBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXJcbiAgfCByZWFkb25seSBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXJbXVxuICB8ICgoXG4gICAgICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbiAgICApID0+XG4gICAgICB8IGJvb2xlYW5cbiAgICAgIHwgRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlRmlsdGVyXG4gICAgICB8IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcltdXG4gICAgICB8IHVuZGVmaW5lZFxuICAgICAgfCBQcm9taXNlPFxuICAgICAgICAgIHwgYm9vbGVhblxuICAgICAgICAgIHwgRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlRmlsdGVyXG4gICAgICAgICAgfCByZWFkb25seSBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXJbXVxuICAgICAgICAgIHwgdW5kZWZpbmVkXG4gICAgICAgID4pO1xuXG4vKiogTW91bnQgbWFwIHBsdXMgb3B0aW9uYWwgTWFzdHJhIHNraWxsIHNjYW4gcm9vdHMgcmVzb2x2ZWQgZm9yIG9uZSByZXF1ZXN0LiAqL1xuaW50ZXJmYWNlIFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHtcbiAgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPjtcbiAgLyoqIFBhdGhzIHdpdGhpbiB0aGUgY29tcG9zaXRlIG5hbWVzcGFjZSB3aGVyZSBgU0tJTEwubWRgIGZpbGVzIGFyZSBzY2FubmVkLiAqL1xuICBza2lsbFBhdGhzPzogc3RyaW5nW107XG59XG5cbi8qKiBJbnRlcm5hbCBmaWxlc3lzdGVtIGNvbnRyaWJ1dGlvbiByZXNvbHZlci4gKi9cbnR5cGUgV29ya3NwYWNlTW91bnRSZXNvbHZlciA9IChcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4pID0+IFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHwgUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj47XG5cbi8qKlxuICogU2FuZGJveCBzZWxlY3Rpb24gZm9yIHtAbGluayBkYXRhYnJpY2tzV29ya3NwYWNlfS4gTW9udHkgaXMgdGhlIGRlZmF1bHQ7XG4gKiBjb21tYW5kIGV4ZWN1dGlvbiBjYW4gYmUgZGlzYWJsZWQgb3IgcmVwbGFjZWQgd2l0aCBhbnkgTWFzdHJhIHByb3ZpZGVyL3Jlc29sdmVyLlxuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VTYW5kYm94U2VsZWN0aW9uID1cbiAgZmFsc2UgfCB0cnVlIHwgXCJtb250eVwiIHwgV29ya3NwYWNlU2FuZGJveCB8IFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlcjtcblxuLyoqIE5hdGl2ZSBNYXN0cmEgd29ya3NwYWNlIG9wdGlvbnMgcGx1cyBEYXRhYnJpY2tzIHBhdGggc2hvcnRjdXRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyBleHRlbmRzIE9taXQ8XG4gIFdvcmtzcGFjZUNvbmZpZyxcbiAgXCJmaWxlc3lzdGVtXCIgfCBcIm1vdW50c1wiIHwgXCJzYW5kYm94XCIgfCBcInNraWxsc1wiXG4+IHtcbiAgLyoqXG4gICAqIFN0YXJ0IGZyb20ge0BsaW5rIERFRkFVTFRfREFUQUJSSUNLU19XT1JLU1BBQ0VfUEFUSFN9LiBEZWZhdWx0cyB0byBgdHJ1ZWAuXG4gICAqL1xuICBhc3Npc3RhbnRQYXRocz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBEYXRhYnJpY2tzIHBhdGhzIGFwcGVuZGVkIGFmdGVyIHRoZSBkZWZhdWx0cy4gQSBzdHJpbmcgaXMgc2hvcnRoYW5kIGZvclxuICAgKiBgeyBwYXRoIH1gOyBhIHJlc29sdmVyIG1heSByZXR1cm4gZWl0aGVyIGZvcm0gcGVyIHJlcXVlc3QuXG4gICAqL1xuICBwYXRocz86IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoVmFsdWVbXTtcbiAgLyoqIE5hdGl2ZSBNYXN0cmEgZmlsZXN5c3RlbXMgY29tcG9zZWQgYmVzaWRlIHRoZSBEYXRhYnJpY2tzIHBhdGhzLiAqL1xuICBtb3VudHM/OiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPjtcbiAgLyoqIE5hdGl2ZSBNYXN0cmEgc2tpbGwgcGF0aHMgb3IgcmVzb2x2ZXIgY29tcG9zZWQgd2l0aCBwYXRoLWRlY2xhcmVkIHNraWxscy4gKi9cbiAgc2tpbGxzPzogU2tpbGxzUmVzb2x2ZXI7XG4gIC8qKiBGaWxlc3lzdGVtIGNhY2hlIGZpbHRlcnMuIElnbm9yZWQgd2hlbiB0aGUgQXBwS2l0IGZpbGVzLWNhY2hlIHBsdWdpbiBpcyBhYnNlbnQuICovXG4gIGNhY2hlPzogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlO1xuICAvKiogQXBwS2l0IHBsdWdpbiBjb250ZXh0IHVzZWQgdG8gZGlzY292ZXIgb3B0aW9uYWwgc2libGluZyBjYXBhYmlsaXRpZXMuICovXG4gIHBsdWdpbkNvbnRleHQ/OiBwbHVnaW5SZWdpc3RyeS5QbHVnaW5Db250ZXh0TGlrZTtcbiAgLyoqXG4gICAqIENvbW1hbmQgc2FuZGJveC4gRGVmYXVsdHMgdG8gTW9udHkuIFBhc3MgYGZhbHNlYCB0byBkaXNhYmxlIGl0LCBvciBhblxuICAgKiBleHBsaWNpdCBNYXN0cmEgc2FuZGJveC9wcm92aWRlciByZXNvbHZlciBmb3IgYSByZW1vdGUgdHJhbnNwb3J0LlxuICAgKi9cbiAgc2FuZGJveD86IFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb247XG4gIC8qKiBBZGQgdXNlci1zY29wZWQgYC90bXBgIG9ubHkgd2hlbiBubyBjb25maWd1cmVkIERhdGFicmlja3MgcGF0aCBtb3VudHMgd3JpdGFibGUuICovXG4gIGZhbGxiYWNrVG9UbXA/OiBib29sZWFuO1xuICAvKipcbiAgICogRXh0cmEgbG9jYWwgc2tpbGwgdHJlZXMgbW91bnRlZCByZWFkLW9ubHkgZm9yIGZpbGUgYWNjZXNzIGFuZCB3b3Jrc3BhY2VcbiAgICogc2tpbGwgc2VhcmNoLiBUaGUgcGx1Z2luIGFsc28gY29udmVydHMgdGhlbSB0byBuYXRpdmUgYWdlbnQtbGV2ZWwgc2tpbGxzLlxuICAgKi9cbiAgZXh0cmFTa2lsbE1vdW50cz86IExvY2FsU2tpbGxNb3VudFtdO1xuICAvKiogU2tpbGwgbmFtZXMgcHJvdmlkZWQgZGlyZWN0bHkgdG8gYWdlbnRzIGFuZCBleGNsdWRlZCBmcm9tIHdvcmtzcGFjZSBzZWFyY2guICovXG4gIGV4Y2x1ZGVTa2lsbE5hbWVzPzogcmVhZG9ubHkgc3RyaW5nW107XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZGVmYXVsdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIERlZmF1bHQgRGF0YWJyaWNrcyBwYXRocyBmb3Igc2hhcmVkIGFuZCBjdXJyZW50LXVzZXIgQWdlbnQgU2tpbGxzLlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9EQVRBQlJJQ0tTX1dPUktTUEFDRV9QQVRIUzogcmVhZG9ubHkgRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhPcHRpb25zW10gPSBbXG4gIHtcbiAgICBwYXRoOiBPUkdBTklaQVRJT05fQVNTSVNUQU5UX1BBVEgsXG4gICAgc2tpbGxzOiBbXCJza2lsbHNcIl0sXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY3JlYXRlUm9vdDogZmFsc2UsXG4gIH0sXG4gIHtcbiAgICBwYXRoOiBcIn5cIixcbiAgICBza2lsbHM6IFtcIi5hc3Npc3RhbnQvc2tpbGxzXCJdLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNyZWF0ZVJvb3Q6IGZhbHNlLFxuICB9LFxuXTtcblxuLyoqXG4gKiBDcmVhdGUgYSBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0gd2l0aCBwZXItcmVxdWVzdCBEYXRhYnJpY2tzIG1vdW50cy5cbiAqXG4gKiBAZXhhbXBsZSBEZWZhdWx0IERhdGFicmlja3MgcGF0aHNcbiAqIGBgYHRzXG4gKiBkYXRhYnJpY2tzV29ya3NwYWNlKClcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFVzZSBvbmx5IGV4cGxpY2l0IHBhdGhzXG4gKiBgYGB0c1xuICogZGF0YWJyaWNrc1dvcmtzcGFjZSh7XG4gKiAgIGFzc2lzdGFudFBhdGhzOiBmYWxzZSxcbiAqICAgcGF0aHM6IFtcIn4vcHJvamVjdFwiLCBcIi90bXAvcHJvamVjdFwiLCBcIi9Wb2x1bWVzL21haW4vZGVmYXVsdC9kYXRhXCJdLFxuICogfSlcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIEJ1aWxkIGEgc3RhbmRhcmQgTWFzdHJhIHdvcmtzcGFjZSB5b3Vyc2VsZlxuICogYGBgdHNcbiAqIG5ldyBXb3Jrc3BhY2Uoe1xuICogICAuLi5kYXRhYnJpY2tzV29ya3NwYWNlQ29uZmlnKHsgcGF0aHM6IFtcIn4vcHJvamVjdFwiXSB9KSxcbiAqICAgc2FuZGJveDogbXlTYW5kYm94LFxuICogfSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YWJyaWNrc1dvcmtzcGFjZUNvbmZpZyhcbiAgb3B0aW9uczogRGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnMgPSB7fSxcbik6IFdvcmtzcGFjZUNvbmZpZyB7XG4gIGNvbnN0IHsgaWQsIG5hbWUgfSA9IHJlc29sdmVXb3Jrc3BhY2VJZGVudGl0eShvcHRpb25zKTtcbiAgY29uc3QgZmlsZXN5c3RlbVNvdXJjZUtleSA9IGAke2lkfTokeysrd29ya3NwYWNlU291cmNlU2VxdWVuY2V9YDtcbiAgY29uc3QgcGF0aHMgPSByZXNvbHZlRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhzKG9wdGlvbnMpO1xuICBjb25zdCBjb25maWd1cmVkUGF0aHMgPSBwYXRocy5sZW5ndGg7XG4gIGNvbnN0IGV4dHJhU2tpbGxNb3VudHMgPSBvcHRpb25zLmV4dHJhU2tpbGxNb3VudHMgPz8gW107XG4gIGNvbnN0IGZpbGVzQ2FjaGUgPSBwbHVnaW5SZWdpc3RyeS5pbnN0YW5jZShvcHRpb25zLnBsdWdpbkNvbnRleHQsIGZpbGVzQ2FjaGVQbHVnaW4pPy5leHBvcnRzKCk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRDYWNoZSA9IG9wdGlvbnMuY2FjaGU7XG4gIGNvbnN0IG1vdW50RmlsZXNDYWNoZSA9IGNvbmZpZ3VyZWRDYWNoZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBmaWxlc0NhY2hlO1xuICBjb25zdCByZXRhaW5GaWxlc3lzdGVtU291cmNlID1cbiAgICBtb3VudEZpbGVzQ2FjaGUgIT09IHVuZGVmaW5lZCAmJlxuICAgIHR5cGVvZiBjb25maWd1cmVkQ2FjaGUgIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHBhdGhzLmV2ZXJ5KChwYXRoKSA9PiB0eXBlb2YgcGF0aCAhPT0gXCJmdW5jdGlvblwiKTtcbiAgY29uc3QgcmVzb2x2ZXJzID0gYnVpbGRNb3VudFJlc29sdmVycyhcbiAgICBwYXRocyxcbiAgICBvcHRpb25zLm1vdW50cyxcbiAgICBsb2NhbFNraWxsTW91bnRSZXNvbHZlcnMoZXh0cmFTa2lsbE1vdW50cyksXG4gICAgbW91bnRGaWxlc0NhY2hlLFxuICAgIGNvbmZpZ3VyZWRDYWNoZSxcbiAgICBvcHRpb25zLmZhbGxiYWNrVG9UbXAgPT09IHRydWUsXG4gICk7XG4gIGNvbnN0IHJlc29sdmVDb250cmlidXRpb24gPSBjb250cmlidXRpb25SZXNvbHZlcihyZXNvbHZlcnMpO1xuICBjb25zdCByZXNvbHZlRmlsZXN5c3RlbSA9IChjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCkgPT5cbiAgICByZXNvbHZlV29ya3NwYWNlRmlsZXN5c3RlbShcbiAgICAgIHJlc29sdmVDb250cmlidXRpb24sXG4gICAgICBjb250ZXh0LFxuICAgICAgcmV0YWluRmlsZXN5c3RlbVNvdXJjZSA/IG1vdW50RmlsZXNDYWNoZSA6IHVuZGVmaW5lZCxcbiAgICAgIGZpbGVzeXN0ZW1Tb3VyY2VLZXksXG4gICAgKTtcbiAgY29uc3QgaGFzU2tpbGxQYXRocyA9IGV4dHJhU2tpbGxNb3VudHMubGVuZ3RoID4gMCB8fCBwYXRocy5zb21lKHBhdGhNYXlQcm92aWRlU2tpbGxzKTtcbiAgY29uc3QgZXhjbHVkZWRTa2lsbE5hbWVzID0gbmV3IFNldChvcHRpb25zLmV4Y2x1ZGVTa2lsbE5hbWVzID8/IFtdKTtcbiAgY29uc3Qgc2tpbGxzOiBTa2lsbHNSZXNvbHZlciA9XG4gICAgb3B0aW9ucy5za2lsbHMgPz9cbiAgICAoYXN5bmMgKHsgcmVxdWVzdENvbnRleHQgfSkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IHsgcmVxdWVzdENvbnRleHQgfTtcbiAgICAgIGNvbnN0IGNvbnRyaWJ1dGlvbiA9IGF3YWl0IHJlc29sdmVDb250cmlidXRpb24oY29udGV4dCk7XG4gICAgICByZXR1cm4gcmVzb2x2ZURpc3RpbmN0U2tpbGxQYXRocyhcbiAgICAgICAgYXdhaXQgcmVzb2x2ZUZpbGVzeXN0ZW0oY29udGV4dCksXG4gICAgICAgIGNvbnRyaWJ1dGlvbi5za2lsbFBhdGhzID8/IFtdLFxuICAgICAgICBleGNsdWRlZFNraWxsTmFtZXMsXG4gICAgICApO1xuICAgIH0pO1xuICBjb25zdCBjaGVja1NraWxsRmlsZU10aW1lID0gb3B0aW9ucy5jaGVja1NraWxsRmlsZU10aW1lID8/IGZhbHNlO1xuICBjb25zdCBibTI1ID0gb3B0aW9ucy5ibTI1ID8/IHRydWU7XG4gIGNvbnN0IHNhbmRib3ggPSByZXNvbHZlV29ya3NwYWNlU2FuZGJveChvcHRpb25zLnNhbmRib3gsIGlkLCBuYW1lKTtcbiAgY29uc3QgdG9vbHMgPSB3b3Jrc3BhY2VUb29scyhvcHRpb25zLnRvb2xzKTtcbiAgbG9nZ2VyLmRlYnVnKFwid29ya3NwYWNlOmNyZWF0ZVwiLCB7XG4gICAgaWQsXG4gICAgbmFtZSxcbiAgICByZXNvbHZlckNvdW50OiByZXNvbHZlcnMubGVuZ3RoLFxuICAgIGNvbmZpZ3VyZWRQYXRocyxcbiAgICBjdXN0b21Nb3VudHM6IE9iamVjdC5rZXlzKG9wdGlvbnMubW91bnRzID8/IHt9KS5sZW5ndGgsXG4gICAgc2tpbGxzQ29uZmlndXJlZDogb3B0aW9ucy5za2lsbHMgIT09IHVuZGVmaW5lZCB8fCBoYXNTa2lsbFBhdGhzLFxuICAgIGN1c3RvbVNraWxsc1Jlc29sdmVyOiBvcHRpb25zLnNraWxscyAhPT0gdW5kZWZpbmVkLFxuICAgIGNoZWNrU2tpbGxGaWxlTXRpbWUsXG4gICAgYm0yNSxcbiAgICBleHRyYVNraWxsTW91bnRzOiBleHRyYVNraWxsTW91bnRzLmxlbmd0aCxcbiAgICBleGNsdWRlZFNraWxsTmFtZXM6IGV4Y2x1ZGVkU2tpbGxOYW1lcy5zaXplLFxuICAgIHNhbmRib3g6IHNhbmRib3ggPyBzYW5kYm94TmFtZShvcHRpb25zLnNhbmRib3gpIDogXCJkaXNhYmxlZFwiLFxuICB9KTtcblxuICBjb25zdCB7XG4gICAgYXNzaXN0YW50UGF0aHM6IF9hc3Npc3RhbnRQYXRocyxcbiAgICBwYXRoczogX3BhdGhzLFxuICAgIG1vdW50czogX21vdW50cyxcbiAgICBza2lsbHM6IF9za2lsbHMsXG4gICAgY2FjaGU6IF9jYWNoZSxcbiAgICBwbHVnaW5Db250ZXh0OiBfcGx1Z2luQ29udGV4dCxcbiAgICBzYW5kYm94OiBfc2FuZGJveCxcbiAgICBmYWxsYmFja1RvVG1wOiBfZmFsbGJhY2tUb1RtcCxcbiAgICBleHRyYVNraWxsTW91bnRzOiBfZXh0cmFTa2lsbE1vdW50cyxcbiAgICBleGNsdWRlU2tpbGxOYW1lczogX2V4Y2x1ZGVTa2lsbE5hbWVzLFxuICAgIC4uLndvcmtzcGFjZU9wdGlvbnNcbiAgfSA9IG9wdGlvbnM7XG4gIHJldHVybiB7XG4gICAgLi4ud29ya3NwYWNlT3B0aW9ucyxcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZpbGVzeXN0ZW06IHJlc29sdmVGaWxlc3lzdGVtLFxuICAgIC4uLihvcHRpb25zLnNraWxscyAhPT0gdW5kZWZpbmVkIHx8IGhhc1NraWxsUGF0aHNcbiAgICAgID8ge1xuICAgICAgICAgIHNraWxscyxcbiAgICAgICAgICBjaGVja1NraWxsRmlsZU10aW1lLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4oc2FuZGJveFxuICAgICAgPyB7XG4gICAgICAgICAgc2FuZGJveCxcbiAgICAgICAgICBpbnN0cnVjdGlvbnM6IHsgZHluYW1pY1NhbmRib3g6IFwicmVzb2x2ZVwiIGFzIGNvbnN0IH0sXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIGJtMjUsXG4gICAgdG9vbHMsXG4gIH07XG59XG5cbi8qKiBDcmVhdGUgYSBuYXRpdmUgTWFzdHJhIHtAbGluayBXb3Jrc3BhY2V9IGZyb20ge0BsaW5rIGRhdGFicmlja3NXb3Jrc3BhY2VDb25maWd9LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRhdGFicmlja3NXb3Jrc3BhY2Uob3B0aW9uczogRGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnMgPSB7fSk6IFdvcmtzcGFjZSB7XG4gIGNvbnN0IHdvcmtzcGFjZSA9IG5ldyBXb3Jrc3BhY2UoZGF0YWJyaWNrc1dvcmtzcGFjZUNvbmZpZyhvcHRpb25zKSk7XG4gIGRhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zLnNldCh3b3Jrc3BhY2UsIG9wdGlvbnMpO1xuICByZXR1cm4gd29ya3NwYWNlO1xufVxuXG4vKiogQGludGVybmFsIEJpbmQgYSBjYWxsZXItY3JlYXRlZCBEYXRhYnJpY2tzIHdvcmtzcGFjZSB0byBpdHMgQXBwS2l0IHBsdWdpbiBjb250ZXh0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmREYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dChcbiAgd29ya3NwYWNlOiBXb3Jrc3BhY2UsXG4gIHBsdWdpbkNvbnRleHQ6IHBsdWdpblJlZ2lzdHJ5LlBsdWdpbkNvbnRleHRMaWtlIHwgdW5kZWZpbmVkLFxuICBleGNsdWRlU2tpbGxOYW1lczogcmVhZG9ubHkgc3RyaW5nW10gPSBbXSxcbik6IFdvcmtzcGFjZSB7XG4gIGNvbnN0IG9wdGlvbnMgPSBkYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucy5nZXQod29ya3NwYWNlKTtcbiAgaWYgKCFvcHRpb25zKSByZXR1cm4gd29ya3NwYWNlO1xuICBjb25zdCBleGNsdWRlZCA9IFsuLi5uZXcgU2V0KFsuLi4ob3B0aW9ucy5leGNsdWRlU2tpbGxOYW1lcyA/PyBbXSksIC4uLmV4Y2x1ZGVTa2lsbE5hbWVzXSldO1xuICBpZiAoXG4gICAgKG9wdGlvbnMucGx1Z2luQ29udGV4dCAhPT0gdW5kZWZpbmVkIHx8IHBsdWdpbkNvbnRleHQgPT09IHVuZGVmaW5lZCkgJiZcbiAgICBleGNsdWRlZC5sZW5ndGggPT09IChvcHRpb25zLmV4Y2x1ZGVTa2lsbE5hbWVzPy5sZW5ndGggPz8gMClcbiAgKSB7XG4gICAgcmV0dXJuIHdvcmtzcGFjZTtcbiAgfVxuICByZXR1cm4gZGF0YWJyaWNrc1dvcmtzcGFjZSh7XG4gICAgLi4ub3B0aW9ucyxcbiAgICAuLi4ocGx1Z2luQ29udGV4dCAhPT0gdW5kZWZpbmVkID8geyBwbHVnaW5Db250ZXh0IH0gOiB7fSksXG4gICAgLi4uKGV4Y2x1ZGVkLmxlbmd0aCA+IDAgPyB7IGV4Y2x1ZGVTa2lsbE5hbWVzOiBleGNsdWRlZCB9IDoge30pLFxuICB9KTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGRlZmF1bHQgYW5kIGNhbGxlci1wcm92aWRlZCBEYXRhYnJpY2tzIHBhdGhzIGluIHByaW9yaXR5IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NXb3Jrc3BhY2VQYXRocyhcbiAgb3B0aW9uczogUGljazxEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucywgXCJhc3Npc3RhbnRQYXRoc1wiIHwgXCJwYXRoc1wiPiA9IHt9LFxuKTogRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhWYWx1ZVtdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi4ob3B0aW9ucy5hc3Npc3RhbnRQYXRocyA9PT0gZmFsc2UgPyBbXSA6IERFRkFVTFRfREFUQUJSSUNLU19XT1JLU1BBQ0VfUEFUSFMpLFxuICAgIC4uLihvcHRpb25zLnBhdGhzID8/IFtdKSxcbiAgXTtcbn1cblxuLyoqIFdoZXRoZXIgb25lIGluY2x1ZGVkIHBhdGggY2FuIGNvbnRyaWJ1dGUgTWFzdHJhIHNraWxsIHBhdGhzLiAqL1xuZnVuY3Rpb24gcGF0aE1heVByb3ZpZGVTa2lsbHMocGF0aDogRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhWYWx1ZSk6IGJvb2xlYW4ge1xuICBpZiAodHlwZW9mIHBhdGggPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHRydWU7XG4gIGlmIChwYXRoID09PSBmYWxzZSB8fCB0eXBlb2YgcGF0aCA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gKHBhdGguc2tpbGxzPy5sZW5ndGggPz8gMCkgPiAwO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHByaXZhdGUgaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmZ1bmN0aW9uIHdvcmtzcGFjZVRvb2xzKGNvbmZpZ3VyZWQ6IFdvcmtzcGFjZVRvb2xzQ29uZmlnIHwgdW5kZWZpbmVkKTogV29ya3NwYWNlVG9vbHNDb25maWcge1xuICByZXR1cm4ge1xuICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgcmVxdWlyZUFwcHJvdmFsOiBmYWxzZSxcbiAgICAuLi5jb25maWd1cmVkLFxuICB9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlU2FuZGJveChcbiAgc2VsZWN0aW9uOiBXb3Jrc3BhY2VTYW5kYm94U2VsZWN0aW9uIHwgdW5kZWZpbmVkLFxuICB3b3Jrc3BhY2VJZDogc3RyaW5nLFxuICB3b3Jrc3BhY2VOYW1lOiBzdHJpbmcsXG4pOiBXb3Jrc3BhY2VTYW5kYm94IHwgV29ya3NwYWNlU2FuZGJveFJlc29sdmVyIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgY29uZmlndXJlZCA9IHNlbGVjdGlvbiA/PyBcIm1vbnR5XCI7XG4gIGlmIChjb25maWd1cmVkID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGNvbmZpZ3VyZWQgPT09IHRydWUgfHwgY29uZmlndXJlZCA9PT0gXCJtb250eVwiKSByZXR1cm4gbmV3IE1vbnR5U2FuZGJveCgpO1xuICBpZiAodHlwZW9mIGNvbmZpZ3VyZWQgPT09IFwiZnVuY3Rpb25cIiB8fCBpc1NhbmRib3goY29uZmlndXJlZCkpIHJldHVybiBjb25maWd1cmVkO1xuICB0aHJvdyBuZXcgVHlwZUVycm9yKGBVbnN1cHBvcnRlZCB3b3Jrc3BhY2Ugc2FuZGJveCBmb3IgJHt3b3Jrc3BhY2VJZH0gKCR7d29ya3NwYWNlTmFtZX0pYCk7XG59XG5cbmZ1bmN0aW9uIGlzU2FuZGJveCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtzcGFjZVNhbmRib3gge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJpZFwiIGluIHZhbHVlICYmIFwicHJvdmlkZXJcIiBpbiB2YWx1ZSAmJiBcInN0YXR1c1wiIGluIHZhbHVlLFxuICApO1xufVxuXG5mdW5jdGlvbiBzYW5kYm94TmFtZShzZWxlY3Rpb246IFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoc2VsZWN0aW9uID09PSB1bmRlZmluZWQgfHwgc2VsZWN0aW9uID09PSBmYWxzZSkgcmV0dXJuIFwiZGlzYWJsZWRcIjtcbiAgaWYgKHNlbGVjdGlvbiA9PT0gdHJ1ZSB8fCBzZWxlY3Rpb24gPT09IFwibW9udHlcIikgcmV0dXJuIFwibW9udHlcIjtcbiAgaWYgKHR5cGVvZiBzZWxlY3Rpb24gPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIFwicmVzb2x2ZXJcIjtcbiAgcmV0dXJuIHNlbGVjdGlvbi5wcm92aWRlcjtcbn1cblxuLyoqXG4gKiBSZXR1cm4gd2hldGhlciB0aGUgcmVxdWVzdCB0b2tlbiBjYXJyaWVzIGEgc2NvcGUgdGhhdCBhbGxvd3Mgd29ya3NwYWNlXG4gKiBmaWxlIEFQSSBhY2Nlc3MgKGB3b3Jrc3BhY2VgIG9yIGBhbGwtYXBpc2Agb24ge0BsaW5rIE1BU1RSQV9TQ09QRVNfS0VZfSkuXG4gKi9cbmZ1bmN0aW9uIGhhc1dvcmtzcGFjZUZpbGVTY29wZShyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRva2VuLmluY2x1ZGVzQWNjZXNzVG9rZW5TY29wZShcbiAgICByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9TQ09QRVNfS0VZKSxcbiAgICBXT1JLU1BBQ0VfRklMRV9TQ09QRVMsXG4gICk7XG59XG5cbi8qKiBSZXNvbHZlIHRoZSByZXF1ZXN0IGNsaWVudCBhbmQgYXV0aG9yaXphdGlvbi1zYWZlIGZpbGVzLWNhY2hlIHNjb3BlLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUZpbGVzQ2FjaGVTY29wZShjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCk6IFByb21pc2U8XG4gIHwge1xuICAgICAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQ7XG4gICAgICBzY29wZTogRmlsZXNDYWNoZVNjb3BlO1xuICAgIH1cbiAgfCB1bmRlZmluZWRcbj4ge1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IGNvbnRleHQucmVxdWVzdENvbnRleHQ7XG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9VU0VSX0tFWSkgYXMgVXNlciB8IHVuZGVmaW5lZDtcbiAgY29uc3QgY2xpZW50ID0gdXNlcj8uZXhlY3V0aW9uQ29udGV4dC5jbGllbnQgYXMgV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkO1xuICBpZiAoIXJlcXVlc3RDb250ZXh0IHx8ICF1c2VyIHx8ICFjbGllbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiB7XG4gICAgY2xpZW50LFxuICAgIHNjb3BlOiB7XG4gICAgICBob3N0OiAoYXdhaXQgY2xpZW50LmNvbmZpZy5nZXRIb3N0KCkpLnRvU3RyaW5nKCksXG4gICAgICB1c2VyS2V5OiByZXNvbHZlVXNlcktleShyZXF1ZXN0Q29udGV4dCksXG4gICAgICAuLi4ocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19XT1JLU1BBQ0VfSUQ/LnRyaW0oKVxuICAgICAgICA/IHsgd29ya3NwYWNlSWQ6IHByb2Nlc3MuZW52LkRBVEFCUklDS1NfV09SS1NQQUNFX0lELnRyaW0oKSB9XG4gICAgICAgIDoge30pLFxuICAgIH0sXG4gIH07XG59XG5cbi8qKiBKb2luIG9uZSByZWxhdGl2ZSBza2lsbCBwYXRoIHRvIGl0cyBhY3R1YWwgY29tcG9zaXRlIG1vdW50IHBhdGguICovXG5mdW5jdGlvbiBtb3VudGVkU2tpbGxQYXRoKG1vdW50OiBzdHJpbmcsIHNraWxsUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKHBvc2l4UGF0aC5pc0Fic29sdXRlKHNraWxsUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBTa2lsbCBwYXRoIG11c3QgYmUgcmVsYXRpdmUgdG8gaXRzIG1vdW50OiAke3NraWxsUGF0aH1gKTtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkID0gcG9zaXhQYXRoLm5vcm1hbGl6ZShza2lsbFBhdGgpO1xuICBpZiAoIW5vcm1hbGl6ZWQub2spIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBTa2lsbCBwYXRoIGVzY2FwZXMgaXRzIG1vdW50OiAke3NraWxsUGF0aH1gKTtcbiAgfVxuICByZXR1cm4gcG9zaXhQYXRoLmpvaW4ocG9zaXhQYXRoLm5vcm1hbGl6ZVJvb3QobW91bnQpLCBub3JtYWxpemVkLnBhdGguc2xpY2UoMSkpO1xufVxuXG4vKiogUmV0dXJuIHdoZXRoZXIgYSBEYXRhYnJpY2tzIHBhdGggYmVsb25ncyB0byB0aGUgd3JpdGFibGUgV29ya3NwYWNlIG5hbWVzcGFjZS4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlUm9vdChyb290OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBvc2l4UGF0aC5ub3JtYWxpemVSb290KHJvb3QpO1xuICByZXR1cm4gbm9ybWFsaXplZCA9PT0gXCIvV29ya3NwYWNlXCIgfHwgbm9ybWFsaXplZC5zdGFydHNXaXRoKFwiL1dvcmtzcGFjZS9cIik7XG59XG5cbi8qKlxuICogTW91bnQgcmVzb2x2ZXIgZm9yIGNvbmZpZ3VyZWQgRGF0YWJyaWNrcyBhbmQgdGVtcG9yYXJ5IHBhdGhzLlxuICpcbiAqIEdhdGVzIG9uIHdvcmtzcGFjZSBmaWxlIHNjb3BlIChvciBkZXZlbG9wbWVudCBtb2RlKSwgdGhlbiBtb3VudHMgZXZlcnlcbiAqIGZvbGRlciB3aG9zZSBsb2NhdGlvbiByZXNvbHZlcyBmb3IgdGhpcyByZXF1ZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlUGF0aE1vdW50cyhcbiAgcGF0aHM6IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoVmFsdWVbXSxcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gIGZpbGVzQ2FjaGU6IEZpbGVzQ2FjaGVFeHBvcnRzIHwgdW5kZWZpbmVkLFxuICBjYWNoZUNvbmZpZzogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlIHwgdW5kZWZpbmVkLFxuICBmYWxsYmFja1RvVG1wOiBib29sZWFuLFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4ge1xuICBjb25zdCBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+ID0ge307XG4gIGNvbnN0IHNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBoYXNXcml0YWJsZU1vdW50ID0gZmFsc2U7XG4gIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gY29udGV4dC5yZXF1ZXN0Q29udGV4dDtcblxuICBjb25zdCBjYW5Nb3VudERhdGFicmlja3MgPSBCb29sZWFuKHJlcXVlc3RDb250ZXh0ICYmIHNob3VsZE1vdW50U2tpbGxGb2xkZXJzKHJlcXVlc3RDb250ZXh0KSk7XG4gIGNvbnN0IHNjb3BlZCA9IGNhbk1vdW50RGF0YWJyaWNrcyA/IGF3YWl0IHJlc29sdmVGaWxlc0NhY2hlU2NvcGUoY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsaWVudCA9IHNjb3BlZD8uY2xpZW50O1xuICBjb25zdCBmaWxlU3lzdGVtQ2FjaGUgPVxuICAgIGZpbGVzQ2FjaGUgJiYgc2NvcGVkID8gYXdhaXQgZmlsZXNDYWNoZS5mb3JTY29wZShzY29wZWQuc2NvcGUpIDogdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBwYXRoXSBvZiBwYXRocy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBjb25maWd1cmVkID0gYXdhaXQgcmVzb2x2ZURhdGFicmlja3NXb3Jrc3BhY2VQYXRoKHBhdGgsIGNvbnRleHQpO1xuICAgIGlmICghY29uZmlndXJlZCkgY29udGludWU7XG4gICAgaWYgKHBvc2l4UGF0aC5pc1dpdGhpblJvb3QoU0NSQVRDSF9NT1VOVCwgY29uZmlndXJlZC5wYXRoKSkge1xuICAgICAgY29uc3QgbW91bnQgPSBjb25maWd1cmVkLm1vdW50ID8/IGNvbmZpZ3VyZWQucGF0aDtcbiAgICAgIG1vdW50c1ttb3VudF0gPSB1c2VyVGVtcEZpbGVzeXN0ZW0oY29udGV4dCwgY29uZmlndXJlZC5wYXRoKTtcbiAgICAgIGhhc1dyaXRhYmxlTW91bnQgPSB0cnVlO1xuICAgICAgc2tpbGxQYXRocy5wdXNoKC4uLihjb25maWd1cmVkLnNraWxscyA/PyBbXSkubWFwKChwYXRoKSA9PiBtb3VudGVkU2tpbGxQYXRoKG1vdW50LCBwYXRoKSkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmICghY2FuTW91bnREYXRhYnJpY2tzKSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJ3b3Jrc3BhY2UtcGF0aDpza2lwcGVkXCIsIHtcbiAgICAgICAgcGF0aDogY29uZmlndXJlZC5wYXRoLFxuICAgICAgICByZWFzb246ICFyZXF1ZXN0Q29udGV4dCA/IFwibm8tcmVxdWVzdC1jb250ZXh0XCIgOiBcIm1pc3Npbmctd29ya3NwYWNlLXNjb3BlXCIsXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlc29sdmVTa2lsbEZvbGRlckZpbGVzeXN0ZW0oY29uZmlndXJlZCwgY29udGV4dCwgY2FjaGVDb25maWcsIHtcbiAgICAgIGNsaWVudCxcbiAgICAgIGZpbGVTeXN0ZW1DYWNoZSxcbiAgICB9KTtcbiAgICBpZiAoIXJlc29sdmVkKSBjb250aW51ZTtcbiAgICBjb25zdCBtb3VudCA9IGNvbmZpZ3VyZWQubW91bnQgPz8gcmVzb2x2ZWQucm9vdDtcbiAgICBpZiAoIW1vdW50KSB7XG4gICAgICBsb2dnZXIuZGVidWcoXCJ3b3Jrc3BhY2UtcGF0aDpza2lwcGVkXCIsIHsgaW5kZXgsIHJlYXNvbjogXCJtaXNzaW5nLW1vdW50XCIgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgbW91bnRzW21vdW50XSA9IHJlc29sdmVkLmZpbGVzeXN0ZW07XG4gICAgaGFzV3JpdGFibGVNb3VudCB8fD0gcmVzb2x2ZWQud3JpdGFibGU7XG4gICAgc2tpbGxQYXRocy5wdXNoKC4uLihjb25maWd1cmVkLnNraWxscyA/PyBbXSkubWFwKChwYXRoKSA9PiBtb3VudGVkU2tpbGxQYXRoKG1vdW50LCBwYXRoKSkpO1xuICB9XG5cbiAgaWYgKGZhbGxiYWNrVG9UbXAgJiYgIWhhc1dyaXRhYmxlTW91bnQpIHtcbiAgICBtb3VudHNbU0NSQVRDSF9NT1VOVF0gPSB1c2VyVGVtcEZpbGVzeXN0ZW0oY29udGV4dCwgU0NSQVRDSF9NT1VOVCk7XG4gIH1cblxuICBsb2dnZXIuZGVidWcoXCJ3b3Jrc3BhY2UtcGF0aHM6bW91bnRlZFwiLCB7XG4gICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhtb3VudHMpLFxuICAgIHNraWxsUGF0aHMsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgbW91bnRzLFxuICAgIHNraWxsUGF0aHMsXG4gIH07XG59XG5cbmludGVyZmFjZSBSZXNvbHZlZERhdGFicmlja3NXb3Jrc3BhY2VQYXRoIHtcbiAgcGF0aDogc3RyaW5nO1xuICBkaXNwbGF5TmFtZT86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHNraWxscz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICB3cml0YWJsZT86IGJvb2xlYW47XG4gIGNyZWF0ZVJvb3Q/OiBib29sZWFuO1xuICBtb3VudD86IHN0cmluZztcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NXb3Jrc3BhY2VQYXRoKFxuICB2YWx1ZTogRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhWYWx1ZSxcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4pOiBQcm9taXNlPFJlc29sdmVkRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGggfCB1bmRlZmluZWQ+IHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IGF3YWl0IHZhbHVlKGNvbnRleHQpIDogdmFsdWU7XG4gIGlmIChzZWxlY3RlZCA9PT0gZmFsc2UgfHwgc2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgY29uZmlndXJlZCA9IHR5cGVvZiBzZWxlY3RlZCA9PT0gXCJzdHJpbmdcIiA/IHsgcGF0aDogc2VsZWN0ZWQgfSA6IHNlbGVjdGVkO1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IHJlcXVlc3RDb250ZXh0VmFsdWVzKGNvbnRleHQucmVxdWVzdENvbnRleHQpO1xuICBjb25zdCByZXNvbHZlZFBhdGggPSByZXNvbHZlSG9tZVBhdGgoY29uZmlndXJlZC5wYXRoLCByZXF1ZXN0Q29udGV4dCk7XG4gIGlmICghcmVzb2x2ZWRQYXRoKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCByZXNvbHZlZE1vdW50ID0gcmVzb2x2ZUhvbWVQYXRoKGNvbmZpZ3VyZWQubW91bnQsIHJlcXVlc3RDb250ZXh0KTtcbiAgcmV0dXJuIHtcbiAgICAuLi5jb25maWd1cmVkLFxuICAgIHBhdGg6IHJlc29sdmVkUGF0aCxcbiAgICAuLi4ocmVzb2x2ZWRNb3VudCA/IHsgbW91bnQ6IHJlc29sdmVkTW91bnQgfSA6IHt9KSxcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIG9uZSBza2lsbCBmb2xkZXIgdG8gYSBNYXN0cmEgZmlsZXN5c3RlbSwgb3IgYHVuZGVmaW5lZGAgdG8gc2tpcCBpdFxuICogZm9yIHRoaXMgcmVxdWVzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNraWxsRm9sZGVyRmlsZXN5c3RlbShcbiAgZm9sZGVyOiBSZXNvbHZlZERhdGFicmlja3NXb3Jrc3BhY2VQYXRoLFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbiAgY2FjaGVDb25maWc6IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZSB8IHVuZGVmaW5lZCxcbiAgY2FjaGU6IHtcbiAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcbiAgICBmaWxlU3lzdGVtQ2FjaGU6IEZpbGVTeXN0ZW1DYWNoZSB8IHVuZGVmaW5lZDtcbiAgfSxcbik6IFByb21pc2U8XG4gIHwge1xuICAgICAgZmlsZXN5c3RlbTogV29ya3NwYWNlRmlsZXN5c3RlbTtcbiAgICAgIHJvb3Q/OiBzdHJpbmc7XG4gICAgICB3cml0YWJsZTogYm9vbGVhbjtcbiAgICB9XG4gIHwgdW5kZWZpbmVkXG4+IHtcbiAgLy8gQSBwYXRoIG1vdW50IG5lZWRzIHRoZSByZXF1ZXN0J3MgT0JPIGNsaWVudCB0byByZWFjaCB0aGUgd29ya3NwYWNlLlxuICBpZiAoIWNhY2hlLmNsaWVudCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcIndvcmtzcGFjZS1wYXRoOnNraXBwZWRcIiwge1xuICAgICAgcGF0aDogZm9sZGVyLnBhdGgsXG4gICAgICByZWFzb246IFwibWlzc2luZy1vYm8tY2xpZW50XCIsXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCByb290ID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChmb2xkZXIucGF0aCk7XG4gIGlmICghcm9vdCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgd3JpdGFibGUgPSBmb2xkZXIud3JpdGFibGUgPz8gaXNXb3Jrc3BhY2VSb290KHJvb3QpO1xuICBjb25zdCBjYWNoZU9wdGlvbnMgPSBjYWNoZS5maWxlU3lzdGVtQ2FjaGVcbiAgICA/IGF3YWl0IHJlc29sdmVGaWxlQ2FjaGVPcHRpb25zKGNhY2hlQ29uZmlnLCBjb250ZXh0LCByb290LCBmb2xkZXIuc2tpbGxzID8/IFtdKVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGRhdGFicmlja3NGaWxlc3lzdGVtKFxuICAgIGNhY2hlLmNsaWVudCxcbiAgICByb290LFxuICAgICF3cml0YWJsZSxcbiAgICBmb2xkZXIuY3JlYXRlUm9vdCA/PyBmb2xkZXIud3JpdGFibGUgPT09IHRydWUsXG4gICAgY2FjaGUuZmlsZVN5c3RlbUNhY2hlLFxuICAgIGNhY2hlT3B0aW9ucyxcbiAgICB7XG4gICAgICAuLi4oZm9sZGVyLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogZm9sZGVyLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAuLi4oZm9sZGVyLmRpc3BsYXlOYW1lID8geyBkaXNwbGF5TmFtZTogZm9sZGVyLmRpc3BsYXlOYW1lIH0gOiB7fSksXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIHJlc29sdmVkID8geyAuLi5yZXNvbHZlZCwgcm9vdCwgd3JpdGFibGUgfSA6IHVuZGVmaW5lZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUNhY2hlQ29uZmlnKFxuICB2YWx1ZTogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlIHwgdW5kZWZpbmVkLFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbik6IFByb21pc2U8XG4gIGJvb2xlYW4gfCBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXIgfCByZWFkb25seSBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXJbXSB8IHVuZGVmaW5lZFxuPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIiA/IHZhbHVlKGNvbnRleHQpIDogdmFsdWU7XG59XG5cbmZ1bmN0aW9uIHJlcXVlc3RDb250ZXh0VmFsdWVzKHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCB8IHVuZGVmaW5lZCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHJlcXVlc3RDb250ZXh0Py50b0pTT04oKSA/PyB7fTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUhvbWVQYXRoKFxuICBpbnB1dDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICByZXF1ZXN0Q29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBjb25zdCB2YWx1ZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoaW5wdXQpO1xuICBpZiAoIXZhbHVlIHx8ICh2YWx1ZSAhPT0gXCJ+XCIgJiYgIXZhbHVlLnN0YXJ0c1dpdGgoXCJ+L1wiKSkpIHJldHVybiB2YWx1ZSA/PyB1bmRlZmluZWQ7XG4gIGNvbnN0IGVtYWlsVmFsdWUgPSByZXF1ZXN0Q29udGV4dFtNQVNUUkFfVVNFUl9FTUFJTF9LRVldO1xuICBjb25zdCBlbWFpbCA9IHR5cGVvZiBlbWFpbFZhbHVlID09PSBcInN0cmluZ1wiID8gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChlbWFpbFZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFlbWFpbCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3QgaG9tZSA9IHBlcnNvbmFsV29ya3NwYWNlUGF0aChlbWFpbCk7XG4gIHJldHVybiB2YWx1ZSA9PT0gXCJ+XCIgPyBob21lIDogYCR7aG9tZX0vJHt2YWx1ZS5zbGljZSgyKX1gO1xufVxuXG5mdW5jdGlvbiB0b1BvbGljeUFycmF5PFQ+KHZhbHVlOiBUIHwgcmVhZG9ubHkgVFtdIHwgdW5kZWZpbmVkKTogcmVhZG9ubHkgVFtdIHtcbiAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHJldHVybiBbXTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gKHZhbHVlIGFzIHJlYWRvbmx5IFRbXSkgOiBbdmFsdWUgYXMgVF07XG59XG5cbmZ1bmN0aW9uIGNhY2hlRmlsdGVyTWF0Y2hlcyhcbiAgcG9saWN5OiBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXIsXG4gIG9wZXJhdGlvbjogQ2FjaGVhYmxlRmlsZVN5c3RlbU9wZXJhdGlvbixcbiAgcGF0aDogc3RyaW5nLFxuICByZXF1ZXN0Q29udGV4dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHJvb3Q/OiBzdHJpbmcsXG4pOiBib29sZWFuIHtcbiAgY29uc3Qgb3BlcmF0aW9ucyA9IHRvUG9saWN5QXJyYXkocG9saWN5Lm9wZXJhdGlvbnMgPz8gQ0FDSEVBQkxFX0ZJTEVTWVNURU1fT1BFUkFUSU9OUyk7XG4gIGlmICghb3BlcmF0aW9ucy5pbmNsdWRlcyhvcGVyYXRpb24pKSByZXR1cm4gZmFsc2U7XG4gIGlmIChwb2xpY3kucGF0aHMgPT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IGlucHV0czogUGF0aE1hdGNoSW5wdXRbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGlucHV0IG9mIHRvUG9saWN5QXJyYXk8UGF0aE1hdGNoSW5wdXQ+KHBvbGljeS5wYXRocykpIHtcbiAgICBpZiAodHlwZW9mIGlucHV0ICE9PSBcInN0cmluZ1wiKSB7XG4gICAgICBpbnB1dHMucHVzaChpbnB1dCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgZXhwYW5kZWQgPSByZXNvbHZlSG9tZVBhdGgoaW5wdXQsIHJlcXVlc3RDb250ZXh0KTtcbiAgICBpZiAoIWV4cGFuZGVkKSBjb250aW51ZTtcbiAgICBpbnB1dHMucHVzaChcbiAgICAgICFyb290IHx8IHBvc2l4UGF0aC5pc0Fic29sdXRlKGV4cGFuZGVkKSB8fCBleHBhbmRlZC5zdGFydHNXaXRoKFwiKipcIilcbiAgICAgICAgPyBleHBhbmRlZFxuICAgICAgICA6IGAke3Bvc2l4UGF0aC5ub3JtYWxpemVSb290KHJvb3QpfS8ke2V4cGFuZGVkLnJlcGxhY2UoL15cXC5cXC8vLCBcIlwiKX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGlucHV0cy5sZW5ndGggPiAwICYmIG1hdGNoLnRvUGF0aE1hdGNoZXIoLi4uaW5wdXRzKShwYXRoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUZpbGVDYWNoZU9wdGlvbnMoXG4gIGNvbmZpZ3VyZWQ6IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZSB8IHVuZGVmaW5lZCxcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gIHJvb3Q6IHN0cmluZyxcbiAgc2tpbGxQYXRoczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBQcm9taXNlPEZpbGVTeXN0ZW1DYWNoZU9wdGlvbnMgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSByZXF1ZXN0Q29udGV4dFZhbHVlcyhjb250ZXh0LnJlcXVlc3RDb250ZXh0KTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCByZXNvbHZlQ2FjaGVDb25maWcoY29uZmlndXJlZCwgY29udGV4dCk7XG4gIGlmIChyZXNvbHZlZCA9PT0gZmFsc2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChyZXNvbHZlZCA9PT0gdW5kZWZpbmVkIHx8IHJlc29sdmVkID09PSB0cnVlKSB7XG4gICAgY29uc3Qgcm9vdHMgPSBza2lsbFBhdGhzLm1hcCgocGF0aCkgPT4gbW91bnRlZFNraWxsUGF0aChyb290LCBwYXRoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZXJhdGlvbnM6IENBQ0hFQUJMRV9GSUxFU1lTVEVNX09QRVJBVElPTlMsXG4gICAgICBmaWx0ZXI6IChvcGVyYXRpb24sIHBhdGgpID0+XG4gICAgICAgIG9wZXJhdGlvbiAhPT0gXCJyZWFkRmlsZVwiIHx8XG4gICAgICAgIHJvb3RzLnNvbWUoKHNraWxsUm9vdCkgPT4gcG9zaXhQYXRoLmlzV2l0aGluUm9vdChza2lsbFJvb3QsIHBhdGgpKSxcbiAgICB9O1xuICB9XG4gIGNvbnN0IHBvbGljaWVzID0gdG9Qb2xpY3lBcnJheShyZXNvbHZlZCk7XG4gIGlmIChwb2xpY2llcy5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IG9wZXJhdGlvbnMgPSBbXG4gICAgLi4ubmV3IFNldChcbiAgICAgIHBvbGljaWVzLmZsYXRNYXAoKHBvbGljeSkgPT5cbiAgICAgICAgdG9Qb2xpY3lBcnJheShwb2xpY3kub3BlcmF0aW9ucyA/PyBDQUNIRUFCTEVfRklMRVNZU1RFTV9PUEVSQVRJT05TKSxcbiAgICAgICksXG4gICAgKSxcbiAgXTtcbiAgcmV0dXJuIHtcbiAgICBvcGVyYXRpb25zLFxuICAgIGZpbHRlcjogKG9wZXJhdGlvbiwgcGF0aCkgPT5cbiAgICAgIHBvbGljaWVzLnNvbWUoKHBvbGljeSkgPT4gY2FjaGVGaWx0ZXJNYXRjaGVzKHBvbGljeSwgb3BlcmF0aW9uLCBwYXRoLCByZXF1ZXN0Q29udGV4dCwgcm9vdCkpLFxuICB9O1xufVxuXG4vKipcbiAqIEZpbGwgaW4gYGlkYCBhbmQgYG5hbWVgIHdoZW4gZWl0aGVyIGlzIG9taXR0ZWQgb24ge0BsaW5rIERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zfS5cbiAqIFNsdWdpZmllcyBgbmFtZWAgaW50byBgaWRgOyB0b2tlbml6ZXMgYGlkYCBpbnRvIGEgZGlzcGxheSBgbmFtZWAuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VJZGVudGl0eShvcHRpb25zOiBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyk6IHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xufSB7XG4gIGxldCBpZCA9IG9wdGlvbnMuaWQ7XG4gIGxldCBuYW1lID0gb3B0aW9ucy5uYW1lO1xuICBpZiAoIWlkKSB7XG4gICAgaWQgPSBuYW1lID8gc3RyaW5nVXRpbHMudG9TbHVnKG5hbWUpIDogXCJ3b3Jrc3BhY2VcIjtcbiAgfVxuICBpZiAoIW5hbWUpIHtcbiAgICBuYW1lID0gQXJyYXkuZnJvbShzdHJpbmdVdGlscy50b2tlbml6ZShpZCkpLmpvaW4oXCIgXCIpO1xuICB9XG4gIHJldHVybiB7IGlkLCBuYW1lIH07XG59XG5cbi8qKiBDb2xsZWN0IHRoZSBEYXRhYnJpY2tzIHBhdGggcmVzb2x2ZXIgYW5kIGFueSBjYWxsZXItc3VwcGxpZWQgbW91bnRzLiAqL1xuZnVuY3Rpb24gYnVpbGRNb3VudFJlc29sdmVycyhcbiAgcGF0aHM6IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoVmFsdWVbXSxcbiAgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPiB8IHVuZGVmaW5lZCxcbiAgbG9jYWxNb3VudHM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbiAgZmlsZXNDYWNoZTogRmlsZXNDYWNoZUV4cG9ydHMgfCB1bmRlZmluZWQsXG4gIGNhY2hlQ29uZmlnOiBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGUgfCB1bmRlZmluZWQsXG4gIGZhbGxiYWNrVG9UbXA6IGJvb2xlYW4sXG4pOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10ge1xuICBjb25zdCByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSA9IFtdO1xuICBjb25zdCBwYXRoQ291bnQgPSBwYXRocy5sZW5ndGg7XG4gIGlmIChwYXRoQ291bnQgPiAwIHx8IGZhbGxiYWNrVG9UbXApIHtcbiAgICByZXNvbHZlcnMucHVzaCgoY29udGV4dCkgPT5cbiAgICAgIHJlc29sdmVXb3Jrc3BhY2VQYXRoTW91bnRzKHBhdGhzLCBjb250ZXh0LCBmaWxlc0NhY2hlLCBjYWNoZUNvbmZpZywgZmFsbGJhY2tUb1RtcCksXG4gICAgKTtcbiAgfVxuICBpZiAobW91bnRzICYmIE9iamVjdC5rZXlzKG1vdW50cykubGVuZ3RoID4gMCkgcmVzb2x2ZXJzLnB1c2goKCkgPT4gKHsgbW91bnRzIH0pKTtcbiAgcmVzb2x2ZXJzLnB1c2goLi4ubG9jYWxNb3VudHMpO1xuICBsb2dnZXIuZGVidWcoXCJtb3VudHM6cmVzb2x2ZXJzXCIsIHtcbiAgICBwYXRoQ291bnQsXG4gICAgY3VzdG9tTW91bnRDb3VudDogT2JqZWN0LmtleXMobW91bnRzID8/IHt9KS5sZW5ndGgsXG4gICAgbG9jYWxNb3VudENvdW50OiBsb2NhbE1vdW50cy5sZW5ndGgsXG4gICAgdG90YWxSZXNvbHZlckNvdW50OiByZXNvbHZlcnMubGVuZ3RoLFxuICB9KTtcbiAgcmV0dXJuIHJlc29sdmVycztcbn1cblxuLyoqIFN0YWJsZSB1c2VyLXNjb3BlZCBsb2NhbCBzdG9yYWdlIHVuZGVyIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0ncyB0ZW1wIGRpcmVjdG9yeS4gKi9cbmZ1bmN0aW9uIHVzZXJUZW1wRmlsZXN5c3RlbShcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gIHdvcmtzcGFjZVBhdGg6IHN0cmluZyxcbik6IFdvcmtzcGFjZUZpbGVzeXN0ZW0ge1xuICBjb25zdCB1c2VyS2V5ID0gcmVzb2x2ZVVzZXJLZXkoY29udGV4dC5yZXF1ZXN0Q29udGV4dCk7XG4gIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAudXBkYXRlKG9iamVjdC50b1N0YWJsZUtleSh7IHBhY2thZ2U6IFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCIsIHVzZXJLZXkgfSkpXG4gICAgLmRpZ2VzdChcImhleFwiKVxuICAgIC5zbGljZSgwLCAxNik7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwb3NpeFBhdGgubm9ybWFsaXplUm9vdCh3b3Jrc3BhY2VQYXRoKTtcbiAgY29uc3QgcmVsYXRpdmUgPSBub3JtYWxpemVkID09PSBTQ1JBVENIX01PVU5UID8gXCJcIiA6IG5vcm1hbGl6ZWQuc2xpY2UoYCR7U0NSQVRDSF9NT1VOVH0vYC5sZW5ndGgpO1xuICBjb25zdCBzb3VyY2UgPSBuZXcgTG9jYWxGaWxlU3lzdGVtKHtcbiAgICByb290OiBqb2luKHRtcGRpcigpLCBcImRieC10b29sc1wiLCBcIm1hc3RyYVwiLCBkaWdlc3QsIHJlbGF0aXZlKSxcbiAgICByZWFkT25seTogZmFsc2UsXG4gICAgY3JlYXRlUm9vdDogdHJ1ZSxcbiAgfSk7XG4gIHJldHVybiBmaWxlc3lzdGVtcyhzb3VyY2UsIHtcbiAgICBkaXNwbGF5TmFtZTogXCJUZW1wb3JhcnkgRmlsZXNcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiVXNlci1zY29wZWQgdGVtcG9yYXJ5IGZpbGVzIHJldGFpbmVkIHdoaWxlIHRoZSBob3N0IGtlZXBzIGl0cyBlcGhlbWVyYWwgdGVtcCBzdG9yYWdlLlwiLFxuICB9KTtcbn1cblxuLyoqIE1vdW50IHN0YXJ0dXAtcHJvdmlzaW9uZWQgbG9jYWwgc2tpbGwgdHJlZXMgaW50byBNYXN0cmEncyB3b3Jrc3BhY2UgZmlsZXN5c3RlbS4gKi9cbmZ1bmN0aW9uIGxvY2FsU2tpbGxNb3VudFJlc29sdmVycyhtb3VudHM6IHJlYWRvbmx5IExvY2FsU2tpbGxNb3VudFtdKTogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdIHtcbiAgY29uc3QgdW5pcXVlID0gbmV3IE1hcDxzdHJpbmcsIExvY2FsU2tpbGxNb3VudD4oKTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBtb3VudHMpIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IFwicm9vdFwiIGluIGVudHJ5ID8gZW50cnkucm9vdC50cmltKCkgOiBlbnRyeS5maWxlc3lzdGVtLmlkO1xuICAgIGlmICghaWRlbnRpdHkpIGNvbnRpbnVlO1xuICAgIHVuaXF1ZS5zZXQoYCR7ZW50cnkubW91bnRQYXRofVxcMCR7aWRlbnRpdHl9YCwgZW50cnkpO1xuICB9XG4gIHJldHVybiBbLi4udW5pcXVlLnZhbHVlcygpXS5tYXAoKGVudHJ5KSA9PiB7XG4gICAgY29uc3QgbW91bnQgPSBwb3NpeFBhdGgubm9ybWFsaXplUm9vdChlbnRyeS5tb3VudFBhdGgpO1xuICAgIGNvbnN0IGZpbGVzeXN0ZW0gPSBpbk1lbW9yeVNraWxsRmlsZXN5c3RlbShlbnRyeSk7XG4gICAgcmV0dXJuIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IGZpbGVzeXN0ZW07XG4gICAgICByZXR1cm4ge1xuICAgICAgICBtb3VudHM6IHsgW21vdW50XTogZmlsZXN5c3RlbXMoc291cmNlLCB7IHJlYWRPbmx5OiB0cnVlIH0pIH0sXG4gICAgICAgIHNraWxsUGF0aHM6IFttb3VudF0sXG4gICAgICB9O1xuICAgIH07XG4gIH0pO1xufVxuXG4vKiogQ29udmVydCBmYXN0IGxvY2FsIG9yIGluLW1lbW9yeSBza2lsbCB0cmVlcyBpbnRvIG5hdGl2ZSBhZ2VudC1sZXZlbCBza2lsbHMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5saW5lU2tpbGxzRnJvbUxvY2FsTW91bnRzKFxuICBtb3VudHM6IHJlYWRvbmx5IExvY2FsU2tpbGxNb3VudFtdLFxuKTogUHJvbWlzZTxJbmxpbmVTa2lsbFtdPiB7XG4gIGNvbnN0IHNlbGVjdGVkID0gbmV3IE1hcDxzdHJpbmcsIElubGluZVNraWxsPigpO1xuICBmb3IgKGNvbnN0IG1vdW50IG9mIG1vdW50cykge1xuICAgIGNvbnN0IGZpbGVzeXN0ZW0gPSBhd2FpdCBpbk1lbW9yeVNraWxsRmlsZXN5c3RlbShtb3VudCk7XG4gICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZpbGVzeXN0ZW0ucmVhZGRpcihcIi9cIik7XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBpZiAoZW50cnkudHlwZSAhPT0gXCJkaXJlY3RvcnlcIiB8fCBzZWxlY3RlZC5oYXMoZW50cnkubmFtZSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3Qgc2tpbGxQYXRoID0gZW50cnkubmFtZTtcbiAgICAgIGNvbnN0IHNraWxsRmlsZSA9IGAke3NraWxsUGF0aH0vU0tJTEwubWRgO1xuICAgICAgaWYgKCEoYXdhaXQgZmlsZXN5c3RlbS5leGlzdHMoc2tpbGxGaWxlKSkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IGZpbGVzeXN0ZW0ucmVhZEZpbGUoc2tpbGxGaWxlLCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KTtcbiAgICAgIGNvbnN0IHBhcnNlZCA9IHZhbGlkYXRlU2tpbGxDb250ZW50KHtcbiAgICAgICAgY29udGVudDogU3RyaW5nKGNvbnRlbnQpLFxuICAgICAgICBkaXJlY3RvcnlOYW1lOiBlbnRyeS5uYW1lLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXBhcnNlZC52YWxpZCB8fCAhcGFyc2VkLm1ldGFkYXRhIHx8IHBhcnNlZC5pbnN0cnVjdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbG9jYWwgc2tpbGwgJHtlbnRyeS5uYW1lfTogJHtwYXJzZWQuZXJyb3JzLmpvaW4oXCI7IFwiKX1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlZmVyZW5jZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiBhd2FpdCBmaWxlc3lzdGVtLnJlYWRkaXIoc2tpbGxQYXRoLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KSkge1xuICAgICAgICBpZiAoZmlsZS50eXBlICE9PSBcImZpbGVcIiB8fCBmaWxlLm5hbWUgPT09IFwiU0tJTEwubWRcIikgY29udGludWU7XG4gICAgICAgIGlmICghL1xcLihtZHx0eHR8anNvbnx5YT9tbHx0b21sfHNofFtjbV0/W2p0XXN4P3xweSkkL2kudGVzdChmaWxlLm5hbWUpKSBjb250aW51ZTtcbiAgICAgICAgcmVmZXJlbmNlc1tmaWxlLm5hbWVdID0gU3RyaW5nKFxuICAgICAgICAgIGF3YWl0IGZpbGVzeXN0ZW0ucmVhZEZpbGUoYCR7c2tpbGxQYXRofS8ke2ZpbGUubmFtZX1gLCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gcGFyc2VkLm1ldGFkYXRhO1xuICAgICAgc2VsZWN0ZWQuc2V0KFxuICAgICAgICBlbnRyeS5uYW1lLFxuICAgICAgICBjcmVhdGVTa2lsbCh7XG4gICAgICAgICAgbmFtZTogU3RyaW5nKG1ldGFkYXRhLm5hbWUpLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBTdHJpbmcobWV0YWRhdGEuZGVzY3JpcHRpb24pLFxuICAgICAgICAgIGluc3RydWN0aW9uczogcGFyc2VkLmluc3RydWN0aW9ucyxcbiAgICAgICAgICAuLi4odHlwZW9mIG1ldGFkYXRhLmxpY2Vuc2UgPT09IFwic3RyaW5nXCIgPyB7IGxpY2Vuc2U6IG1ldGFkYXRhLmxpY2Vuc2UgfSA6IHt9KSxcbiAgICAgICAgICAuLi4obWV0YWRhdGEuY29tcGF0aWJpbGl0eSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHsgY29tcGF0aWJpbGl0eTogbWV0YWRhdGEuY29tcGF0aWJpbGl0eSB9XG4gICAgICAgICAgICA6IHt9KSxcbiAgICAgICAgICAuLi4ob2JqZWN0LmlzUmVjb3JkKG1ldGFkYXRhLm1ldGFkYXRhKSA/IHsgbWV0YWRhdGE6IG1ldGFkYXRhLm1ldGFkYXRhIH0gOiB7fSksXG4gICAgICAgICAgLi4uKE9iamVjdC5rZXlzKHJlZmVyZW5jZXMpLmxlbmd0aCA+IDAgPyB7IHJlZmVyZW5jZXMgfSA6IHt9KSxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLnNlbGVjdGVkLnZhbHVlcygpXTtcbn1cblxuZnVuY3Rpb24gaW5NZW1vcnlTa2lsbEZpbGVzeXN0ZW0obW91bnQ6IExvY2FsU2tpbGxNb3VudCk6IFByb21pc2U8RmlsZVN5c3RlbT4ge1xuICBjb25zdCBrZXkgPSBcInJvb3RcIiBpbiBtb3VudCA/IGByb290OiR7bW91bnQucm9vdH1gIDogYGZpbGVzeXN0ZW06JHttb3VudC5maWxlc3lzdGVtLmlkfWA7XG4gIGNvbnN0IGV4aXN0aW5nID0gc2hhcmVkU2tpbGxGaWxlc3lzdGVtcy5nZXQoa2V5KTtcbiAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gIGNvbnN0IGxvYWRlZCA9IGxvYWRJbk1lbW9yeVNraWxsRmlsZXN5c3RlbShtb3VudCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgaWYgKHNoYXJlZFNraWxsRmlsZXN5c3RlbXMuZ2V0KGtleSkgPT09IGxvYWRlZCkgc2hhcmVkU2tpbGxGaWxlc3lzdGVtcy5kZWxldGUoa2V5KTtcbiAgICB0aHJvdyBlcnJvcjtcbiAgfSk7XG4gIHNoYXJlZFNraWxsRmlsZXN5c3RlbXMuc2V0KGtleSwgbG9hZGVkKTtcbiAgcmV0dXJuIGxvYWRlZDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbG9hZEluTWVtb3J5U2tpbGxGaWxlc3lzdGVtKG1vdW50OiBMb2NhbFNraWxsTW91bnQpOiBQcm9taXNlPEZpbGVTeXN0ZW0+IHtcbiAgaWYgKFwiZmlsZXN5c3RlbVwiIGluIG1vdW50KSB7XG4gICAgYXdhaXQgbW91bnQuZmlsZXN5c3RlbS5pbml0KCk7XG4gICAgcmV0dXJuIG1vdW50LmZpbGVzeXN0ZW07XG4gIH1cbiAgY29uc3Qgc291cmNlID0gbmV3IExvY2FsRmlsZVN5c3RlbSh7XG4gICAgcm9vdDogbW91bnQucm9vdCxcbiAgICByZWFkT25seTogdHJ1ZSxcbiAgICBjcmVhdGVSb290OiBmYWxzZSxcbiAgfSk7XG4gIGF3YWl0IHNvdXJjZS5pbml0KCk7XG4gIGNvbnN0IG1lbW9yeSA9IG5ldyBNZW1vcnlGaWxlU3lzdGVtKHtcbiAgICBpZDogYHNraWxscy0ke2NyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKG1vdW50LnJvb3QpLmRpZ2VzdChcImhleFwiKS5zbGljZSgwLCAxNil9YCxcbiAgICByb290OiBcIi9cIixcbiAgfSk7XG4gIGF3YWl0IG1lbW9yeS5pbml0KCk7XG4gIGZvciBhd2FpdCAoY29uc3QgcmVsYXRpdmUgb2YgZmluZC5maW5kRmlsZXMoXCIqKi8qXCIsIHsgY3dkOiBtb3VudC5yb290LCBub2RpcjogdHJ1ZSB9KSkge1xuICAgIGF3YWl0IG1lbW9yeS53cml0ZUZpbGUocmVsYXRpdmUsIGF3YWl0IHNvdXJjZS5yZWFkRmlsZShyZWxhdGl2ZSksIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuICB9XG4gIGF3YWl0IHNvdXJjZS5jbG9zZSgpO1xuICByZXR1cm4gbWVtb3J5O1xufVxuXG4vKipcbiAqIEdhdGUgc2tpbGwtZm9sZGVyIG1vdW50cyBvbiB0aGUgcmVxdWVzdCdzIHRva2VuLlxuICpcbiAqIEFsd2F5cyBhbGxvd3MgbW91bnRzIGluIGRldmVsb3BtZW50OyBpbiBvdGhlciBlbnZpcm9ubWVudHMgcmVxdWlyZXNcbiAqIHtAbGluayBoYXNXb3Jrc3BhY2VGaWxlU2NvcGV9LlxuICovXG5mdW5jdGlvbiBzaG91bGRNb3VudFNraWxsRm9sZGVycyhyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpOiBib29sZWFuIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHJldHVybiB0cnVlO1xuICByZXR1cm4gaGFzV29ya3NwYWNlRmlsZVNjb3BlKHJlcXVlc3RDb250ZXh0KTtcbn1cblxuLyoqXG4gKiBXcmFwIGEge0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtfSBhcyBhIE1hc3RyYSBmaWxlc3lzdGVtLiBNaXNzaW5nIG9yXG4gKiBpbmFjY2Vzc2libGUgcm9vdHMgcmV0dXJuIGB1bmRlZmluZWRgIHNvIG90aGVyIGFjY2Vzc2libGUgcm9vdHMgcmVtYWluXG4gKiB1c2FibGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRhdGFicmlja3NGaWxlc3lzdGVtKFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgcm9vdDogc3RyaW5nLFxuICByZWFkT25seTogYm9vbGVhbiA9IHRydWUsXG4gIGNyZWF0ZVJvb3Q6IGJvb2xlYW4gPSAhcmVhZE9ubHksXG4gIGZpbGVTeXN0ZW1DYWNoZT86IEZpbGVTeXN0ZW1DYWNoZSxcbiAgY2FjaGVPcHRpb25zPzogRmlsZVN5c3RlbUNhY2hlT3B0aW9ucyxcbiAgYWRhcHRlck9wdGlvbnM6IFBpY2s8TWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXJPcHRpb25zLCBcImRlc2NyaXB0aW9uXCIgfCBcImRpc3BsYXlOYW1lXCI+ID0ge30sXG4pOiBQcm9taXNlPFxuICB8IHtcbiAgICAgIGZpbGVzeXN0ZW06IFdvcmtzcGFjZUZpbGVzeXN0ZW07XG4gICAgfVxuICB8IHVuZGVmaW5lZFxuPiB7XG4gIGNvbnN0IGZzID0gbmV3IERhdGFicmlja3NGaWxlU3lzdGVtKHtcbiAgICBjbGllbnQ6ICgpID0+IHdvcmtzcGFjZUNsaWVudC50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudChyZXF1ZXN0V29ya3NwYWNlQ2xpZW50KGNsaWVudCkpLFxuICAgIHJvb3QsXG4gICAgcmVhZE9ubHksXG4gICAgY3JlYXRlUm9vdCxcbiAgfSk7XG4gIGNvbnN0IGNhY2hlZCA9XG4gICAgZmlsZVN5c3RlbUNhY2hlICYmIGNhY2hlT3B0aW9ucyA/IHNoYXJlZEZTLmNhY2hlKGZzLCBmaWxlU3lzdGVtQ2FjaGUsIGNhY2hlT3B0aW9ucykgOiBmcztcbiAgY29uc3Qgc291cmNlID0gdmVyaWZ5Rmlyc3RGaWxlU3lzdGVtQWNjZXNzKGNhY2hlZCwgKCkgPT4gZnMuc3RhdChcIi5cIiksIHJvb3QpO1xuICBjb25zdCBmaWxlc3lzdGVtID0gZmlsZXN5c3RlbXMoc291cmNlLCB7IC4uLmFkYXB0ZXJPcHRpb25zLCByZWFkT25seSB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmaWxlc3lzdGVtLmluaXQoKTtcbiAgICBpZiAoYXdhaXQgZmlsZXN5c3RlbS5leGlzdHMoXCIuXCIpKSB7XG4gICAgICByZXR1cm4geyBmaWxlc3lzdGVtIH07XG4gICAgfVxuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIuZGVidWcoXCJkYXRhYnJpY2tzLW1vdW50OnNraXBwZWRcIiwge1xuICAgICAgcm9vdCxcbiAgICAgIHJlYWRPbmx5LFxuICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKiBAaW50ZXJuYWwgS2VlcCBzZXJ2aWNlIGNvbnRleHQgZnJvbSByZXBsYWNpbmcgdGhlIHJlcXVlc3Qtc2NvcGVkIHdvcmtzcGFjZSBjbGllbnQuICovXG5leHBvcnQgZnVuY3Rpb24gcmVxdWVzdFdvcmtzcGFjZUNsaWVudChcbiAgaW5pdGlhbENsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICBleGVjdXRpb25Db250ZXh0OiBSZXR1cm5UeXBlPFxuICAgIHR5cGVvZiBhcHBraXQudHJ5R2V0RXhlY3V0aW9uQ29udGV4dFxuICA+ID0gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKSxcbik6IFdvcmtzcGFjZUNsaWVudCB7XG4gIGlmIChcbiAgICBleGVjdXRpb25Db250ZXh0ICYmXG4gICAgXCJpc1VzZXJDb250ZXh0XCIgaW4gZXhlY3V0aW9uQ29udGV4dCAmJlxuICAgIGV4ZWN1dGlvbkNvbnRleHQuaXNVc2VyQ29udGV4dCA9PT0gdHJ1ZVxuICApIHtcbiAgICByZXR1cm4gZXhlY3V0aW9uQ29udGV4dC5jbGllbnQ7XG4gIH1cbiAgcmV0dXJuIGluaXRpYWxDbGllbnQ7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUZpcnN0RmlsZVN5c3RlbUFjY2VzczxURmlsZVN5c3RlbSBleHRlbmRzIEZpbGVTeXN0ZW0+KFxuICBmaWxlc3lzdGVtOiBURmlsZVN5c3RlbSxcbiAgcmVhZFByb2JlOiAoKSA9PiBQcm9taXNlPHVua25vd24+LFxuICByb290OiBzdHJpbmcsXG4pOiBURmlsZVN5c3RlbSB7XG4gIGxldCByZWFkQ2hlY2s6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG4gIGxldCB3cml0ZVZlcmlmaWVkID0gZmFsc2U7XG4gIGNvbnN0IGJvdW5kTWV0aG9kcyA9IG5ldyBNYXA8UHJvcGVydHlLZXksIHVua25vd24+KCk7XG4gIGNvbnN0IHJlYWRPcGVyYXRpb25zID0gbmV3IFNldDxQcm9wZXJ0eUtleT4oW1wiZXhpc3RzXCIsIFwicmVhZEZpbGVcIiwgXCJyZWFkZGlyXCIsIFwic3RhdFwiXSk7XG4gIGNvbnN0IHdyaXRlT3BlcmF0aW9ucyA9IG5ldyBTZXQ8UHJvcGVydHlLZXk+KFtcbiAgICBcImFwcGVuZEZpbGVcIixcbiAgICBcImNvcHlGaWxlXCIsXG4gICAgXCJkZWxldGVGaWxlXCIsXG4gICAgXCJta2RpclwiLFxuICAgIFwibW92ZUZpbGVcIixcbiAgICBcInJtZGlyXCIsXG4gICAgXCJ3cml0ZUZpbGVcIixcbiAgXSk7XG4gIGNvbnN0IHZlcmlmeVJlYWQgPSBhc3luYyAoKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgcmVhZENoZWNrID8/PSBQcm9taXNlLnJlc29sdmUocmVhZFByb2JlKCkpLnRoZW4oKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgcmVhZENoZWNrO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZWFkQ2hlY2sgPSB1bmRlZmluZWQ7XG4gICAgICBsb2dnZXIuZGVidWcoXCJkYXRhYnJpY2tzLW1vdW50OnJlYWQtY2hlY2stZmFpbGVkXCIsIHtcbiAgICAgICAgcm9vdCxcbiAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbmV3IFByb3h5KGZpbGVzeXN0ZW0sIHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5LCB0YXJnZXQpO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdmFsdWU7XG4gICAgICBpZiAoYm91bmRNZXRob2RzLmhhcyhwcm9wZXJ0eSkpIHJldHVybiBib3VuZE1ldGhvZHMuZ2V0KHByb3BlcnR5KTtcbiAgICAgIGNvbnN0IGRlbGVnYXRlZCA9IHZhbHVlLmJpbmQodGFyZ2V0KSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuICAgICAgbGV0IG1ldGhvZCA9IGRlbGVnYXRlZDtcbiAgICAgIGlmIChyZWFkT3BlcmF0aW9ucy5oYXMocHJvcGVydHkpKSB7XG4gICAgICAgIG1ldGhvZCA9IGFzeW5jICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICBhd2FpdCB2ZXJpZnlSZWFkKCk7XG4gICAgICAgICAgcmV0dXJuIGRlbGVnYXRlZCguLi5hcmdzKTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAod3JpdGVPcGVyYXRpb25zLmhhcyhwcm9wZXJ0eSkpIHtcbiAgICAgICAgbWV0aG9kID0gYXN5bmMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWxlZ2F0ZWQoLi4uYXJncyk7XG4gICAgICAgICAgICBpZiAoIXdyaXRlVmVyaWZpZWQpIHtcbiAgICAgICAgICAgICAgd3JpdGVWZXJpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcImRhdGFicmlja3MtbW91bnQ6d3JpdGUtY2hlY2stcGFzc2VkXCIsIHsgcm9vdCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICghd3JpdGVWZXJpZmllZCkge1xuICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXCJkYXRhYnJpY2tzLW1vdW50OndyaXRlLWNoZWNrLWZhaWxlZFwiLCB7XG4gICAgICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVycm9yKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBib3VuZE1ldGhvZHMuc2V0KHByb3BlcnR5LCBtZXRob2QpO1xuICAgICAgcmV0dXJuIG1ldGhvZDtcbiAgICB9LFxuICB9KTtcbn1cblxuLyoqXG4gKiBSdW4gZXZlcnkgbW91bnQgcmVzb2x2ZXIgZm9yIG9uZSByZXF1ZXN0IGFuZCBtZXJnZSBtb3VudHMgcGx1cyBza2lsbCBwYXRocy5cbiAqIExhdGVyIHJlc29sdmVycyBvdmVyd3JpdGUgbW91bnQga2V5cyBmcm9tIGVhcmxpZXIgb25lcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZUNvbnRyaWJ1dGlvbihcbiAgcmVzb2x2ZXJzOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10sXG4gIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4ge1xuICBjb25zdCBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+ID0ge307XG4gIGNvbnN0IHNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIHJlc29sdmVyXSBvZiByZXNvbHZlcnMuZW50cmllcygpKSB7XG4gICAgY29uc3QgY29udHJpYnV0aW9uID0gYXdhaXQgcmVzb2x2ZXIoY29udGV4dCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwibW91bnRzOnJlc29sdmVyXCIsIHtcbiAgICAgIGluZGV4LFxuICAgICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhjb250cmlidXRpb24ubW91bnRzKSxcbiAgICAgIHNraWxsUGF0aHM6IGNvbnRyaWJ1dGlvbi5za2lsbFBhdGhzID8/IFtdLFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24obW91bnRzLCBjb250cmlidXRpb24ubW91bnRzKTtcbiAgICBpZiAoY29udHJpYnV0aW9uLnNraWxsUGF0aHM/Lmxlbmd0aCkge1xuICAgICAgc2tpbGxQYXRocy5wdXNoKC4uLmNvbnRyaWJ1dGlvbi5za2lsbFBhdGhzKTtcbiAgICB9XG4gIH1cblxuICBsb2dnZXIuZGVidWcoXCJtb3VudHM6bWVyZ2VkXCIsIHtcbiAgICBtb3VudEtleXM6IE9iamVjdC5rZXlzKG1vdW50cyksXG4gICAgc2tpbGxQYXRocyxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudHMsXG4gICAgc2tpbGxQYXRocyxcbiAgfTtcbn1cblxuLyoqXG4gKiBEeW5hbWljIGZpbGVzeXN0ZW0gcmVzb2x2ZXIgcGFzc2VkIHRvIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfS5cbiAqXG4gKiBSZXR1cm5zIGEge0BsaW5rIENvbXBvc2l0ZUZpbGVzeXN0ZW19IG92ZXIgZXZlcnkgcGF0aCB0aGF0IHJlc29sdmVkIGZvciB0aGVcbiAqIHJlcXVlc3QuIEFuIGVtcHR5IGNvbXBvc2l0ZSBleHBvc2VzIG5vIGltcGxpY2l0IGxvY2FsIHN0b3JhZ2UuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VGaWxlc3lzdGVtKFxuICByZXNvbHZlQ29udHJpYnV0aW9uOiAoY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQpID0+IFByb21pc2U8V29ya3NwYWNlTW91bnRDb250cmlidXRpb24+LFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbiAgZmlsZXNDYWNoZT86IEZpbGVzQ2FjaGVFeHBvcnRzLFxuICBzb3VyY2VLZXk/OiBzdHJpbmcsXG4pOiBQcm9taXNlPFdvcmtzcGFjZUZpbGVzeXN0ZW0+IHtcbiAgY29uc3QgeyBtb3VudHMgfSA9IGF3YWl0IHJlc29sdmVDb250cmlidXRpb24oY29udGV4dCk7XG4gIGNvbnN0IG1vdW50S2V5cyA9IE9iamVjdC5rZXlzKG1vdW50cyk7XG4gIGlmIChtb3VudEtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZmlsZXN5c3RlbTplbXB0eVwiLCB7XG4gICAgICBoYXNSZXF1ZXN0Q29udGV4dDogQm9vbGVhbihjb250ZXh0LnJlcXVlc3RDb250ZXh0KSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmlsZXN5c3RlbXMobmV3IE1lbW9yeUZpbGVTeXN0ZW0oeyByb290OiBcIi9cIiwgcmVhZE9ubHk6IHRydWUgfSksIHtcbiAgICAgIHJlYWRPbmx5OiB0cnVlLFxuICAgIH0pO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImZpbGVzeXN0ZW06Y29tcG9zaXRlXCIsIHsgbW91bnRLZXlzIH0pO1xuICBjb25zdCBsb2FkID0gKCkgPT4gbmV3IE1vdW50ZWRDb21wb3NpdGVGaWxlc3lzdGVtKHsgbW91bnRzIH0pO1xuICBpZiAoIWZpbGVzQ2FjaGUpIHJldHVybiBsb2FkKCk7XG4gIGNvbnN0IHNjb3BlZCA9IGF3YWl0IHJlc29sdmVGaWxlc0NhY2hlU2NvcGUoY29udGV4dCk7XG4gIGlmICghc2NvcGVkKSByZXR1cm4gbG9hZCgpO1xuICByZXR1cm4gZmlsZXNDYWNoZS5mb3JGaWxlU3lzdGVtKHNjb3BlZC5zY29wZSwgeyBwYXRoczogbW91bnRLZXlzLCBrZXk6IHNvdXJjZUtleSB9LCBsb2FkKTtcbn1cblxuLyoqXG4gKiBFeHBhbmQgY29uZmlndXJlZCBza2lsbCBwYXRocyBpbnRvIGNvbmNyZXRlIHNraWxsIGRpcmVjdG9yaWVzIGFuZCBrZWVwIHRoZSBmaXJzdFxuICogc2FtZS1uYW1lZCBkaXJlY3RvcnkuIE1hc3RyYSBzdGlsbCBvd25zIHBhcnNpbmcsIGluZGV4aW5nLCBhbmQgcmVmcmVzaGVzLFxuICogd2hpbGUgZWFybGllciBjb25maWd1cmVkIHJvb3RzIHJldGFpbiBwcmVjZWRlbmNlIG92ZXIgbGF0ZXIgcm9vdHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEaXN0aW5jdFNraWxsUGF0aHMoXG4gIGZpbGVzeXN0ZW06IFdvcmtzcGFjZUZpbGVzeXN0ZW0sXG4gIHBhdGhzOiByZWFkb25seSBzdHJpbmdbXSxcbiAgZXhjbHVkZWRTa2lsbE5hbWVzOiBSZWFkb25seVNldDxzdHJpbmc+LFxuKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBzZWxlY3RlZCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgcGF0aCBvZiBwYXRocykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZmlsZXN5c3RlbS5yZWFkZGlyKHBhdGgpO1xuICAgICAgaWYgKGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LnR5cGUgPT09IFwiZmlsZVwiICYmIGVudHJ5Lm5hbWUgPT09IFwiU0tJTEwubWRcIikpIHtcbiAgICAgICAgY29uc3QgbmFtZSA9IHBvc2l4UGF0aC5iYXNlbmFtZShwYXRoKTtcbiAgICAgICAgaWYgKCFleGNsdWRlZFNraWxsTmFtZXMuaGFzKG5hbWUpICYmICFzZWxlY3RlZC5oYXMobmFtZSkpIHNlbGVjdGVkLnNldChuYW1lLCBwYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVudHJ5LnR5cGUgIT09IFwiZGlyZWN0b3J5XCIgfHxcbiAgICAgICAgICBleGNsdWRlZFNraWxsTmFtZXMuaGFzKGVudHJ5Lm5hbWUpIHx8XG4gICAgICAgICAgc2VsZWN0ZWQuaGFzKGVudHJ5Lm5hbWUpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdGVkLnNldChlbnRyeS5uYW1lLCBwb3NpeFBhdGguam9pbihwYXRoLCBlbnRyeS5uYW1lKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsLXBhdGg6c2tpcHBlZFwiLCB7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyb3IpLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBbLi4uc2VsZWN0ZWQudmFsdWVzKCldO1xufVxuXG4vKiogTWVtb2l6ZSBvbmUgY29tcGxldGUgbW91bnQgY29udHJpYnV0aW9uIGZvciBlYWNoIHJlcXVlc3QgY29udGV4dC4gKi9cbmZ1bmN0aW9uIGNvbnRyaWJ1dGlvblJlc29sdmVyKFxuICByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbik6IChjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCkgPT4gUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4ge1xuICBjb25zdCBzY29wZWQgPSBuZXcgV2Vha01hcDxSZXF1ZXN0Q29udGV4dCwgUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4+KCk7XG4gIGxldCB1bnNjb3BlZDogUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4gfCB1bmRlZmluZWQ7XG4gIHJldHVybiAoY29udGV4dCkgPT4ge1xuICAgIGlmICghY29udGV4dC5yZXF1ZXN0Q29udGV4dCkge1xuICAgICAgdW5zY29wZWQgPz89IHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24ocmVzb2x2ZXJzLCBjb250ZXh0KTtcbiAgICAgIHJldHVybiB1bnNjb3BlZDtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSBzY29wZWQuZ2V0KGNvbnRleHQucmVxdWVzdENvbnRleHQpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGNvbnN0IHBlbmRpbmcgPSByZXNvbHZlV29ya3NwYWNlQ29udHJpYnV0aW9uKHJlc29sdmVycywgY29udGV4dCk7XG4gICAgc2NvcGVkLnNldChjb250ZXh0LnJlcXVlc3RDb250ZXh0LCBwZW5kaW5nKTtcbiAgICByZXR1cm4gcGVuZGluZztcbiAgfTtcbn1cbiJdfQ==
803
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWpDLE9BQU8sRUFDTCxzQkFBc0IsRUFFdEIsUUFBUSxFQUdSLFVBQVUsSUFBSSxnQkFBZ0IsR0FDL0IsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RixPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBdUIsU0FBUyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hGLE9BQU8sRUFDTCxHQUFHLEVBQ0gsT0FBTyxFQUNQLFdBQVcsRUFDWCxRQUFRLEVBQ1IsVUFBVSxFQUNWLE1BQU0sRUFDTixRQUFRLEVBQ1Isd0JBQXdCLEdBQ3pCLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUNMLEVBQUUsSUFBSSxRQUFRLEVBQ2QsU0FBUyxFQUtULGdCQUFnQixFQUNoQixVQUFVLEVBQ1YsU0FBUyxFQUNULGFBQWEsRUFDYixZQUFZLEVBQ1osUUFBUSxHQUNULE1BQU0sc0JBQXNCLENBQUM7QUFFOUIsT0FBTyxFQUFFLFdBQVcsRUFBRSxvQkFBb0IsRUFBb0IsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRixPQUFPLEVBQ0wsU0FBUyxHQU9WLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsZUFBZSxFQUNmLGNBQWMsR0FFZixNQUFNLGFBQWEs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O1FBQ3BELElBQUksUUFBUTtZQUFFLE9BQU8sUUFBUSxDQUFDO1FBQzlCLE1BQU0sT0FBTyxHQUFHLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFzdHJhIHdvcmtzcGFjZSBmYWN0b3J5IGZvciBEYXRhYnJpY2tzIEFwcHMuXG4gKlxuICogQnVpbGRzIG5hdGl2ZSBNYXN0cmEgd29ya3NwYWNlIGNvbmZpZ3VyYXRpb24gZnJvbSBEYXRhYnJpY2tzIHBhdGhzLiBQYXRoc1xuICogbW91bnQgYXQgdGhlIHNhbWUgcGF0aCBieSBkZWZhdWx0LCBgfmAgcmVzb2x2ZXMgdG8gdGhlIGN1cnJlbnQgdXNlcidzXG4gKiBEYXRhYnJpY2tzIHdvcmtzcGFjZSBob21lLCBhbmQgYC90bXBbL3N1YnBhdGhdYCByZXNvbHZlcyB0byBzdGFibGVcbiAqIHVzZXItc2NvcGVkIHN0b3JhZ2UgdW5kZXIgdGhlIGhvc3QncyBlcGhlbWVyYWwgdGVtcCBkaXJlY3RvcnkuXG4gKlxuICogRGF0YWJyaWNrcyBtb3VudHMgdXNlIGBAZGJ4LXRvb2xzL2RhdGFicmlja3NgIHtAbGluayBEYXRhYnJpY2tzRmlsZVN5c3RlbX1cbiAqIHdyYXBwZWQgYnkge0BsaW5rIGZpbGVzeXN0ZW1zfTsgaW5hY2Nlc3NpYmxlIHJvb3RzIGFyZSBza2lwcGVkIGluZGVwZW5kZW50bHkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IHRtcGRpciB9IGZyb20gXCJub2RlOm9zXCI7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQge1xuICB0cnlHZXRFeGVjdXRpb25Db250ZXh0LFxuICB0eXBlIFBsdWdpbkNvbnRleHRMaWtlLFxuICBpbnN0YW5jZSxcbiAgdHlwZSBGaWxlc0NhY2hlRXhwb3J0cyxcbiAgdHlwZSBGaWxlc0NhY2hlU2NvcGUsXG4gIGZpbGVzQ2FjaGUgYXMgZmlsZXNDYWNoZVBsdWdpbixcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzRmlsZVN5c3RlbSwgdG9MZWdhY3lXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRieC10b29scy9kYXRhYnJpY2tzXCI7XG5pbXBvcnQgeyBMb2NhbEZpbGVTeXN0ZW0gfSBmcm9tIFwiQGRieC10b29scy9mc1wiO1xuaW1wb3J0IHsgdHlwZSBQYXRoTWF0Y2hJbnB1dCwgZmluZEZpbGVzLCB0b1BhdGhNYXRjaGVyIH0gZnJvbSBcIkBkYngtdG9vbHMvcGF0aFwiO1xuaW1wb3J0IHtcbiAgbG9nLFxuICB0b0Vycm9yLFxuICB0b1N0YWJsZUtleSxcbiAgaXNSZWNvcmQsXG4gIHRyaW1Ub051bGwsXG4gIHRvU2x1ZyxcbiAgdG9rZW5pemUsXG4gIGluY2x1ZGVzQWNjZXNzVG9rZW5TY29wZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIGZzIGFzIHNoYXJlZEZTLFxuICBwb3NpeFBhdGgsXG4gIHR5cGUgQ2FjaGVhYmxlRmlsZVN5c3RlbU9wZXJhdGlvbixcbiAgdHlwZSBGaWxlU3lzdGVtLFxuICB0eXBlIEZpbGVTeXN0ZW1DYWNoZSxcbiAgdHlwZSBGaWxlU3lzdGVtQ2FjaGVPcHRpb25zLFxuICBNZW1vcnlGaWxlU3lzdGVtLFxuICBpc0Fic29sdXRlLFxuICBub3JtYWxpemUsXG4gIG5vcm1hbGl6ZVJvb3QsXG4gIGlzV2l0aGluUm9vdCxcbiAgYmFzZW5hbWUsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBjcmVhdGVTa2lsbCwgdmFsaWRhdGVTa2lsbENvbnRlbnQsIHR5cGUgSW5saW5lU2tpbGwgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3NraWxsc1wiO1xuaW1wb3J0IHtcbiAgV29ya3NwYWNlLFxuICB0eXBlIFNraWxsc1Jlc29sdmVyLFxuICB0eXBlIFdvcmtzcGFjZUNvbmZpZyxcbiAgdHlwZSBXb3Jrc3BhY2VGaWxlc3lzdGVtLFxuICB0eXBlIFdvcmtzcGFjZVNhbmRib3gsXG4gIHR5cGUgV29ya3NwYWNlU2FuZGJveFJlc29sdmVyLFxuICB0eXBlIFdvcmtzcGFjZVRvb2xzQ29uZmlnLFxufSBmcm9tIFwiQG1hc3RyYS9jb3JlL3dvcmtzcGFjZVwiO1xuXG5pbXBvcnQge1xuICBNQVNUUkFfU0NPUEVTX0tFWSxcbiAgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLFxuICBNQVNUUkFfVVNFUl9LRVksXG4gIHJlc29sdmVVc2VyS2V5LFxuICB0eXBlIFVzZXIsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHtcbiAgZmlsZXN5c3RlbXMsXG4gIE1vdW50ZWRDb21wb3NpdGVGaWxlc3lzdGVtLFxuICB0eXBlIE1hc3RyYUZpbGVTeXN0ZW1BZGFwdGVyT3B0aW9ucyxcbn0gZnJvbSBcIi4vZmlsZXN5c3RlbXMudHNcIjtcbmltcG9ydCB7IE1vbnR5U2FuZGJveCB9IGZyb20gXCIuL21vbnR5LXNhbmRib3gudHNcIjtcbmltcG9ydCB0eXBlIHsgTG9jYWxTa2lsbE1vdW50IH0gZnJvbSBcIi4vcmVtb3RlLXNraWxscy50c1wiO1xuaW1wb3J0IHsgT1JHQU5JWkFUSU9OX0FTU0lTVEFOVF9QQVRILCBwZXJzb25hbFdvcmtzcGFjZVBhdGggfSBmcm9tIFwiLi9za2lsbC1wYXRocy50c1wiO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogT0F1dGggc2NvcGVzIHRoYXQgZ2F0ZSBEYXRhYnJpY2tzIHdvcmtzcGFjZSBmaWxlIG1vdW50cy4gKi9cbmNvbnN0IFdPUktTUEFDRV9GSUxFX1NDT1BFUyA9IFtcIndvcmtzcGFjZVwiLCBcIndvcmtzcGFjZS53b3Jrc3BhY2VcIiwgXCJhbGwtYXBpc1wiXSBhcyBjb25zdDtcbmNvbnN0IFNDUkFUQ0hfTU9VTlQgPSBcIi90bXBcIjtcbmNvbnN0IENBQ0hFQUJMRV9GSUxFU1lTVEVNX09QRVJBVElPTlMgPSBbXG4gIFwiZXhpc3RzXCIsXG4gIFwicmVhZEZpbGVcIixcbiAgXCJyZWFkZGlyXCIsXG4gIFwic3RhdFwiLFxuXSBhcyBjb25zdCBzYXRpc2ZpZXMgcmVhZG9ubHkgQ2FjaGVhYmxlRmlsZVN5c3RlbU9wZXJhdGlvbltdO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL3dvcmtzcGFjZXNcIik7XG5sZXQgd29ya3NwYWNlU291cmNlU2VxdWVuY2UgPSAwO1xuY29uc3QgZGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnMgPSBuZXcgV2Vha01hcDxXb3Jrc3BhY2UsIERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zPigpO1xuY29uc3Qgc2hhcmVkU2tpbGxGaWxlc3lzdGVtcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPEZpbGVTeXN0ZW0+PigpO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogUGVyLXJlcXVlc3QgY29udGV4dCBmb3Igd29ya3NwYWNlIHBhdGggcmVzb2x2ZXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCB7XG4gIHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQ7XG59XG5cbi8qKlxuICogT25lIERhdGFicmlja3MgcGF0aCBtb3VudGVkIGludG8gYSBNYXN0cmEgd29ya3NwYWNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFicmlja3NXb3Jrc3BhY2VQYXRoT3B0aW9ucyB7XG4gIC8qKiBBYnNvbHV0ZSBEYXRhYnJpY2tzIHBhdGggb3IgYH5gIHNob3J0Y3V0IGZvciB0aGUgY3VycmVudCB1c2VyJ3Mgd29ya3NwYWNlIGhvbWUuICovXG4gIHBhdGg6IHN0cmluZztcbiAgLyoqIEh1bWFuLWZyaWVuZGx5IG1vdW50IG5hbWUgc2hvd24gaW4gZmlsZXN5c3RlbSBsaXN0aW5ncy4gKi9cbiAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBNb3VudCBkZXNjcmlwdGlvbiBzaG93biBpbiBmaWxlc3lzdGVtIGxpc3RpbmdzIGFuZCB3b3Jrc3BhY2UgaW5zdHJ1Y3Rpb25zLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFNraWxsIHBhdGhzIHJlbGF0aXZlIHRvIHRoaXMgaW5jbHVkZWQgZmlsZXN5c3RlbSBwYXRoLiBPbWl0IGZvciBhXG4gICAqIGZpbGUtb25seSBtb3VudC4gRWFjaCBlbnRyeSBpcyBqb2luZWQgdG8gdGhlIGFjdHVhbCBtb3VudCBwYXRoIGJlZm9yZVxuICAgKiBNYXN0cmEgcmVjZWl2ZXMgaXQuXG4gICAqL1xuICBza2lsbHM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEFsbG93IHdyaXRlIGF0dGVtcHRzIHRvIGEge0BsaW5rIHBhdGh9IG1vdW50LiBEZWZhdWx0cyB0byBgdHJ1ZWAgZm9yXG4gICAqIGAvV29ya3NwYWNlYCByb290cyBhbmQgYGZhbHNlYCBlbHNld2hlcmUuIERhdGFicmlja3MgcGVybWlzc2lvbnMgc3RpbGxcbiAgICogZGV0ZXJtaW5lIHdoZXRoZXIgZWFjaCBtdXRhdGlvbiBzdWNjZWVkcy5cbiAgICovXG4gIHdyaXRhYmxlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHdyaXRhYmxlIHtAbGluayBwYXRofSByb290IHdoZW4gbWlzc2luZy4gRGVmYXVsdHMgdG9cbiAgICoge0BsaW5rIHdyaXRhYmxlfTsgc2V0IGBmYWxzZWAgZm9yIHByZS1leGlzdGluZyByb290cyB3aXRoIGNvbmRpdGlvbmFsIGFjY2Vzcy5cbiAgICovXG4gIGNyZWF0ZVJvb3Q/OiBib29sZWFuO1xuICAvKiogTW91bnQgcG9pbnQgaW4gdGhlIGNvbXBvc2l0ZSBuYW1lc3BhY2UuIERhdGFicmlja3MgcGF0aHMgZGVmYXVsdCB0byB0aGVpciBhY3R1YWwgcm9vdC4gKi9cbiAgbW91bnQ/OiBzdHJpbmc7XG59XG5cbi8qKiBTdHJpbmcgc2hvcnRoYW5kIG9yIGZ1bGwgb3B0aW9ucyBmb3Igb25lIERhdGFicmlja3Mgd29ya3NwYWNlIHBhdGguICovXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aCA9IHN0cmluZyB8IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoT3B0aW9ucztcblxuLyoqIEZpeGVkIG9yIHJlcXVlc3QtZGVwZW5kZW50IERhdGFicmlja3MgcGF0aCBlbnRyeS4gKi9cbmV4cG9ydCB0eXBlIERhdGFicmlja3NXb3Jrc3BhY2VQYXRoVmFsdWUgPVxuICB8IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoXG4gIHwgZmFsc2VcbiAgfCAoKFxuICAgICAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gICAgKSA9PlxuICAgICAgfCBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aFxuICAgICAgfCBmYWxzZVxuICAgICAgfCB1bmRlZmluZWRcbiAgICAgIHwgUHJvbWlzZTxEYXRhYnJpY2tzV29ya3NwYWNlUGF0aCB8IGZhbHNlIHwgdW5kZWZpbmVkPik7XG5cbi8qKiBPcGVyYXRpb25zIGFuZCBwYXRoIGdsb2JzIGNhY2hlZCBieSB0aGUgRGF0YWJyaWNrcyBmaWxlc3lzdGVtIHNob3J0Y3V0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXIge1xuICAvKiogQ2FjaGVkIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucy4gT21pdCBmb3IgYGV4aXN0c2AsIGByZWFkRmlsZWAsIGByZWFkZGlyYCwgYW5kIGBzdGF0YC4gKi9cbiAgb3BlcmF0aW9ucz86IENhY2hlYWJsZUZpbGVTeXN0ZW1PcGVyYXRpb24gfCByZWFkb25seSBDYWNoZWFibGVGaWxlU3lzdGVtT3BlcmF0aW9uW107XG4gIC8qKiBBYnNvbHV0ZSBvciByb290LXJlbGF0aXZlIGdsb2JzIGFuZCBwcmVkaWNhdGVzLiBgfmAgZXhwYW5kcyBwZXIgcmVxdWVzdC4gKi9cbiAgcGF0aHM/OiBQYXRoTWF0Y2hJbnB1dCB8IHJlYWRvbmx5IFBhdGhNYXRjaElucHV0W107XG59XG5cbi8qKiBGaXhlZCBvciByZXF1ZXN0LWRlcGVuZGVudCBmaWxlc3lzdGVtIGNhY2hlIHNlbGVjdGlvbi4gKi9cbmV4cG9ydCB0eXBlIERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZSA9XG4gIHwgYm9vbGVhblxuICB8IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlclxuICB8IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcltdXG4gIHwgKChcbiAgICAgIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuICAgICkgPT5cbiAgICAgIHwgYm9vbGVhblxuICAgICAgfCBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXJcbiAgICAgIHwgcmVhZG9ubHkgRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlRmlsdGVyW11cbiAgICAgIHwgdW5kZWZpbmVkXG4gICAgICB8IFByb21pc2U8XG4gICAgICAgICAgfCBib29sZWFuXG4gICAgICAgICAgfCBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXJcbiAgICAgICAgICB8IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcltdXG4gICAgICAgICAgfCB1bmRlZmluZWRcbiAgICAgICAgPik7XG5cbi8qKiBNb3VudCBtYXAgcGx1cyBvcHRpb25hbCBNYXN0cmEgc2tpbGwgc2NhbiByb290cyByZXNvbHZlZCBmb3Igb25lIHJlcXVlc3QuICovXG5pbnRlcmZhY2UgV29ya3NwYWNlTW91bnRDb250cmlidXRpb24ge1xuICBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+O1xuICAvKiogUGF0aHMgd2l0aGluIHRoZSBjb21wb3NpdGUgbmFtZXNwYWNlIHdoZXJlIGBTS0lMTC5tZGAgZmlsZXMgYXJlIHNjYW5uZWQuICovXG4gIHNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqIEludGVybmFsIGZpbGVzeXN0ZW0gY29udHJpYnV0aW9uIHJlc29sdmVyLiAqL1xudHlwZSBXb3Jrc3BhY2VNb3VudFJlc29sdmVyID0gKFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbikgPT4gV29ya3NwYWNlTW91bnRDb250cmlidXRpb24gfCBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPjtcblxuLyoqXG4gKiBTYW5kYm94IHNlbGVjdGlvbiBmb3Ige0BsaW5rIGRhdGFicmlja3NXb3Jrc3BhY2V9LiBNb250eSBpcyB0aGUgZGVmYXVsdDtcbiAqIGNvbW1hbmQgZXhlY3V0aW9uIGNhbiBiZSBkaXNhYmxlZCBvciByZXBsYWNlZCB3aXRoIGFueSBNYXN0cmEgcHJvdmlkZXIvcmVzb2x2ZXIuXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24gPVxuICBmYWxzZSB8IHRydWUgfCBcIm1vbnR5XCIgfCBXb3Jrc3BhY2VTYW5kYm94IHwgV29ya3NwYWNlU2FuZGJveFJlc29sdmVyO1xuXG4vKiogTmF0aXZlIE1hc3RyYSB3b3Jrc3BhY2Ugb3B0aW9ucyBwbHVzIERhdGFicmlja3MgcGF0aCBzaG9ydGN1dHMuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zIGV4dGVuZHMgT21pdDxcbiAgV29ya3NwYWNlQ29uZmlnLFxuICBcImZpbGVzeXN0ZW1cIiB8IFwibW91bnRzXCIgfCBcInNhbmRib3hcIiB8IFwic2tpbGxzXCJcbj4ge1xuICAvKipcbiAgICogU3RhcnQgZnJvbSB7QGxpbmsgREVGQVVMVF9EQVRBQlJJQ0tTX1dPUktTUEFDRV9QQVRIU30uIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIGFzc2lzdGFudFBhdGhzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIERhdGFicmlja3MgcGF0aHMgYXBwZW5kZWQgYWZ0ZXIgdGhlIGRlZmF1bHRzLiBBIHN0cmluZyBpcyBzaG9ydGhhbmQgZm9yXG4gICAqIGB7IHBhdGggfWA7IGEgcmVzb2x2ZXIgbWF5IHJldHVybiBlaXRoZXIgZm9ybSBwZXIgcmVxdWVzdC5cbiAgICovXG4gIHBhdGhzPzogcmVhZG9ubHkgRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhWYWx1ZVtdO1xuICAvKiogTmF0aXZlIE1hc3RyYSBmaWxlc3lzdGVtcyBjb21wb3NlZCBiZXNpZGUgdGhlIERhdGFicmlja3MgcGF0aHMuICovXG4gIG1vdW50cz86IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+O1xuICAvKiogTmF0aXZlIE1hc3RyYSBza2lsbCBwYXRocyBvciByZXNvbHZlciBjb21wb3NlZCB3aXRoIHBhdGgtZGVjbGFyZWQgc2tpbGxzLiAqL1xuICBza2lsbHM/OiBTa2lsbHNSZXNvbHZlcjtcbiAgLyoqIEZpbGVzeXN0ZW0gY2FjaGUgZmlsdGVycy4gSWdub3JlZCB3aGVuIHRoZSBBcHBLaXQgZmlsZXMtY2FjaGUgcGx1Z2luIGlzIGFic2VudC4gKi9cbiAgY2FjaGU/OiBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGU7XG4gIC8qKiBBcHBLaXQgcGx1Z2luIGNvbnRleHQgdXNlZCB0byBkaXNjb3ZlciBvcHRpb25hbCBzaWJsaW5nIGNhcGFiaWxpdGllcy4gKi9cbiAgcGx1Z2luQ29udGV4dD86IFBsdWdpbkNvbnRleHRMaWtlO1xuICAvKipcbiAgICogQ29tbWFuZCBzYW5kYm94LiBEZWZhdWx0cyB0byBNb250eS4gUGFzcyBgZmFsc2VgIHRvIGRpc2FibGUgaXQsIG9yIGFuXG4gICAqIGV4cGxpY2l0IE1hc3RyYSBzYW5kYm94L3Byb3ZpZGVyIHJlc29sdmVyIGZvciBhIHJlbW90ZSB0cmFuc3BvcnQuXG4gICAqL1xuICBzYW5kYm94PzogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbjtcbiAgLyoqIEFkZCB1c2VyLXNjb3BlZCBgL3RtcGAgb25seSB3aGVuIG5vIGNvbmZpZ3VyZWQgRGF0YWJyaWNrcyBwYXRoIG1vdW50cyB3cml0YWJsZS4gKi9cbiAgZmFsbGJhY2tUb1RtcD86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFeHRyYSBsb2NhbCBza2lsbCB0cmVlcyBtb3VudGVkIHJlYWQtb25seSBmb3IgZmlsZSBhY2Nlc3MgYW5kIHdvcmtzcGFjZVxuICAgKiBza2lsbCBzZWFyY2guIFRoZSBwbHVnaW4gYWxzbyBjb252ZXJ0cyB0aGVtIHRvIG5hdGl2ZSBhZ2VudC1sZXZlbCBza2lsbHMuXG4gICAqL1xuICBleHRyYVNraWxsTW91bnRzPzogTG9jYWxTa2lsbE1vdW50W107XG4gIC8qKiBTa2lsbCBuYW1lcyBwcm92aWRlZCBkaXJlY3RseSB0byBhZ2VudHMgYW5kIGV4Y2x1ZGVkIGZyb20gd29ya3NwYWNlIHNlYXJjaC4gKi9cbiAgZXhjbHVkZVNraWxsTmFtZXM/OiByZWFkb25seSBzdHJpbmdbXTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZWZhdWx0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRGVmYXVsdCBEYXRhYnJpY2tzIHBhdGhzIGZvciBzaGFyZWQgYW5kIGN1cnJlbnQtdXNlciBBZ2VudCBTa2lsbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0RBVEFCUklDS1NfV09SS1NQQUNFX1BBVEhTOiByZWFkb25seSBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aE9wdGlvbnNbXSA9IFtcbiAge1xuICAgIHBhdGg6IE9SR0FOSVpBVElPTl9BU1NJU1RBTlRfUEFUSCxcbiAgICBza2lsbHM6IFtcInNraWxsc1wiXSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBjcmVhdGVSb290OiBmYWxzZSxcbiAgfSxcbiAge1xuICAgIHBhdGg6IFwiflwiLFxuICAgIHNraWxsczogW1wiLmFzc2lzdGFudC9za2lsbHNcIl0sXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY3JlYXRlUm9vdDogZmFsc2UsXG4gIH0sXG5dO1xuXG4vKipcbiAqIENyZWF0ZSBhIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfSB3aXRoIHBlci1yZXF1ZXN0IERhdGFicmlja3MgbW91bnRzLlxuICpcbiAqIEBleGFtcGxlIERlZmF1bHQgRGF0YWJyaWNrcyBwYXRoc1xuICogYGBgdHNcbiAqIGRhdGFicmlja3NXb3Jrc3BhY2UoKVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgVXNlIG9ubHkgZXhwbGljaXQgcGF0aHNcbiAqIGBgYHRzXG4gKiBkYXRhYnJpY2tzV29ya3NwYWNlKHtcbiAqICAgYXNzaXN0YW50UGF0aHM6IGZhbHNlLFxuICogICBwYXRoczogW1wifi9wcm9qZWN0XCIsIFwiL3RtcC9wcm9qZWN0XCIsIFwiL1ZvbHVtZXMvbWFpbi9kZWZhdWx0L2RhdGFcIl0sXG4gKiB9KVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgQnVpbGQgYSBzdGFuZGFyZCBNYXN0cmEgd29ya3NwYWNlIHlvdXJzZWxmXG4gKiBgYGB0c1xuICogbmV3IFdvcmtzcGFjZSh7XG4gKiAgIC4uLmRhdGFicmlja3NXb3Jrc3BhY2VDb25maWcoeyBwYXRoczogW1wifi9wcm9qZWN0XCJdIH0pLFxuICogICBzYW5kYm94OiBteVNhbmRib3gsXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhYnJpY2tzV29ya3NwYWNlQ29uZmlnKFxuICBvcHRpb25zOiBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyA9IHt9LFxuKTogV29ya3NwYWNlQ29uZmlnIHtcbiAgY29uc3QgeyBpZCwgbmFtZSB9ID0gcmVzb2x2ZVdvcmtzcGFjZUlkZW50aXR5KG9wdGlvbnMpO1xuICBjb25zdCBmaWxlc3lzdGVtU291cmNlS2V5ID0gYCR7aWR9OiR7Kyt3b3Jrc3BhY2VTb3VyY2VTZXF1ZW5jZX1gO1xuICBjb25zdCBwYXRocyA9IHJlc29sdmVEYXRhYnJpY2tzV29ya3NwYWNlUGF0aHMob3B0aW9ucyk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRQYXRocyA9IHBhdGhzLmxlbmd0aDtcbiAgY29uc3QgZXh0cmFTa2lsbE1vdW50cyA9IG9wdGlvbnMuZXh0cmFTa2lsbE1vdW50cyA/PyBbXTtcbiAgY29uc3QgZmlsZXNDYWNoZSA9IGluc3RhbmNlKG9wdGlvbnMucGx1Z2luQ29udGV4dCwgZmlsZXNDYWNoZVBsdWdpbik/LmV4cG9ydHMoKTtcbiAgY29uc3QgY29uZmlndXJlZENhY2hlID0gb3B0aW9ucy5jYWNoZTtcbiAgY29uc3QgbW91bnRGaWxlc0NhY2hlID0gY29uZmlndXJlZENhY2hlID09PSBmYWxzZSA/IHVuZGVmaW5lZCA6IGZpbGVzQ2FjaGU7XG4gIGNvbnN0IHJldGFpbkZpbGVzeXN0ZW1Tb3VyY2UgPVxuICAgIG1vdW50RmlsZXNDYWNoZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgdHlwZW9mIGNvbmZpZ3VyZWRDYWNoZSAhPT0gXCJmdW5jdGlvblwiICYmXG4gICAgcGF0aHMuZXZlcnkoKHBhdGgpID0+IHR5cGVvZiBwYXRoICE9PSBcImZ1bmN0aW9uXCIpO1xuICBjb25zdCByZXNvbHZlcnMgPSBidWlsZE1vdW50UmVzb2x2ZXJzKFxuICAgIHBhdGhzLFxuICAgIG9wdGlvbnMubW91bnRzLFxuICAgIGxvY2FsU2tpbGxNb3VudFJlc29sdmVycyhleHRyYVNraWxsTW91bnRzKSxcbiAgICBtb3VudEZpbGVzQ2FjaGUsXG4gICAgY29uZmlndXJlZENhY2hlLFxuICAgIG9wdGlvbnMuZmFsbGJhY2tUb1RtcCA9PT0gdHJ1ZSxcbiAgKTtcbiAgY29uc3QgcmVzb2x2ZUNvbnRyaWJ1dGlvbiA9IGNvbnRyaWJ1dGlvblJlc29sdmVyKHJlc29sdmVycyk7XG4gIGNvbnN0IHJlc29sdmVGaWxlc3lzdGVtID0gKGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0KSA9PlxuICAgIHJlc29sdmVXb3Jrc3BhY2VGaWxlc3lzdGVtKFxuICAgICAgcmVzb2x2ZUNvbnRyaWJ1dGlvbixcbiAgICAgIGNvbnRleHQsXG4gICAgICByZXRhaW5GaWxlc3lzdGVtU291cmNlID8gbW91bnRGaWxlc0NhY2hlIDogdW5kZWZpbmVkLFxuICAgICAgZmlsZXN5c3RlbVNvdXJjZUtleSxcbiAgICApO1xuICBjb25zdCBoYXNTa2lsbFBhdGhzID0gZXh0cmFTa2lsbE1vdW50cy5sZW5ndGggPiAwIHx8IHBhdGhzLnNvbWUocGF0aE1heVByb3ZpZGVTa2lsbHMpO1xuICBjb25zdCBleGNsdWRlZFNraWxsTmFtZXMgPSBuZXcgU2V0KG9wdGlvbnMuZXhjbHVkZVNraWxsTmFtZXMgPz8gW10pO1xuICBjb25zdCBza2lsbHM6IFNraWxsc1Jlc29sdmVyID1cbiAgICBvcHRpb25zLnNraWxscyA/P1xuICAgIChhc3luYyAoeyByZXF1ZXN0Q29udGV4dCB9KSA9PiB7XG4gICAgICBjb25zdCBjb250ZXh0ID0geyByZXF1ZXN0Q29udGV4dCB9O1xuICAgICAgY29uc3QgY29udHJpYnV0aW9uID0gYXdhaXQgcmVzb2x2ZUNvbnRyaWJ1dGlvbihjb250ZXh0KTtcbiAgICAgIHJldHVybiByZXNvbHZlRGlzdGluY3RTa2lsbFBhdGhzKFxuICAgICAgICBhd2FpdCByZXNvbHZlRmlsZXN5c3RlbShjb250ZXh0KSxcbiAgICAgICAgY29udHJpYnV0aW9uLnNraWxsUGF0aHMgPz8gW10sXG4gICAgICAgIGV4Y2x1ZGVkU2tpbGxOYW1lcyxcbiAgICAgICk7XG4gICAgfSk7XG4gIGNvbnN0IGNoZWNrU2tpbGxGaWxlTXRpbWUgPSBvcHRpb25zLmNoZWNrU2tpbGxGaWxlTXRpbWUgPz8gZmFsc2U7XG4gIGNvbnN0IGJtMjUgPSBvcHRpb25zLmJtMjUgPz8gdHJ1ZTtcbiAgY29uc3Qgc2FuZGJveCA9IHJlc29sdmVXb3Jrc3BhY2VTYW5kYm94KG9wdGlvbnMuc2FuZGJveCwgaWQsIG5hbWUpO1xuICBjb25zdCB0b29scyA9IHdvcmtzcGFjZVRvb2xzKG9wdGlvbnMudG9vbHMpO1xuICBsb2dnZXIuZGVidWcoXCJ3b3Jrc3BhY2U6Y3JlYXRlXCIsIHtcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIHJlc29sdmVyQ291bnQ6IHJlc29sdmVycy5sZW5ndGgsXG4gICAgY29uZmlndXJlZFBhdGhzLFxuICAgIGN1c3RvbU1vdW50czogT2JqZWN0LmtleXMob3B0aW9ucy5tb3VudHMgPz8ge30pLmxlbmd0aCxcbiAgICBza2lsbHNDb25maWd1cmVkOiBvcHRpb25zLnNraWxscyAhPT0gdW5kZWZpbmVkIHx8IGhhc1NraWxsUGF0aHMsXG4gICAgY3VzdG9tU2tpbGxzUmVzb2x2ZXI6IG9wdGlvbnMuc2tpbGxzICE9PSB1bmRlZmluZWQsXG4gICAgY2hlY2tTa2lsbEZpbGVNdGltZSxcbiAgICBibTI1LFxuICAgIGV4dHJhU2tpbGxNb3VudHM6IGV4dHJhU2tpbGxNb3VudHMubGVuZ3RoLFxuICAgIGV4Y2x1ZGVkU2tpbGxOYW1lczogZXhjbHVkZWRTa2lsbE5hbWVzLnNpemUsXG4gICAgc2FuZGJveDogc2FuZGJveCA/IHNhbmRib3hOYW1lKG9wdGlvbnMuc2FuZGJveCkgOiBcImRpc2FibGVkXCIsXG4gIH0pO1xuXG4gIGNvbnN0IHtcbiAgICBhc3Npc3RhbnRQYXRoczogX2Fzc2lzdGFudFBhdGhzLFxuICAgIHBhdGhzOiBfcGF0aHMsXG4gICAgbW91bnRzOiBfbW91bnRzLFxuICAgIHNraWxsczogX3NraWxscyxcbiAgICBjYWNoZTogX2NhY2hlLFxuICAgIHBsdWdpbkNvbnRleHQ6IF9wbHVnaW5Db250ZXh0LFxuICAgIHNhbmRib3g6IF9zYW5kYm94LFxuICAgIGZhbGxiYWNrVG9UbXA6IF9mYWxsYmFja1RvVG1wLFxuICAgIGV4dHJhU2tpbGxNb3VudHM6IF9leHRyYVNraWxsTW91bnRzLFxuICAgIGV4Y2x1ZGVTa2lsbE5hbWVzOiBfZXhjbHVkZVNraWxsTmFtZXMsXG4gICAgLi4ud29ya3NwYWNlT3B0aW9uc1xuICB9ID0gb3B0aW9ucztcbiAgcmV0dXJuIHtcbiAgICAuLi53b3Jrc3BhY2VPcHRpb25zLFxuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZmlsZXN5c3RlbTogcmVzb2x2ZUZpbGVzeXN0ZW0sXG4gICAgLi4uKG9wdGlvbnMuc2tpbGxzICE9PSB1bmRlZmluZWQgfHwgaGFzU2tpbGxQYXRoc1xuICAgICAgPyB7XG4gICAgICAgICAgc2tpbGxzLFxuICAgICAgICAgIGNoZWNrU2tpbGxGaWxlTXRpbWUsXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihzYW5kYm94XG4gICAgICA/IHtcbiAgICAgICAgICBzYW5kYm94LFxuICAgICAgICAgIGluc3RydWN0aW9uczogeyBkeW5hbWljU2FuZGJveDogXCJyZXNvbHZlXCIgYXMgY29uc3QgfSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgYm0yNSxcbiAgICB0b29scyxcbiAgfTtcbn1cblxuLyoqIENyZWF0ZSBhIG5hdGl2ZSBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0gZnJvbSB7QGxpbmsgZGF0YWJyaWNrc1dvcmtzcGFjZUNvbmZpZ30uICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YWJyaWNrc1dvcmtzcGFjZShvcHRpb25zOiBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyA9IHt9KTogV29ya3NwYWNlIHtcbiAgY29uc3Qgd29ya3NwYWNlID0gbmV3IFdvcmtzcGFjZShkYXRhYnJpY2tzV29ya3NwYWNlQ29uZmlnKG9wdGlvbnMpKTtcbiAgZGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnMuc2V0KHdvcmtzcGFjZSwgb3B0aW9ucyk7XG4gIHJldHVybiB3b3Jrc3BhY2U7XG59XG5cbi8qKiBAaW50ZXJuYWwgQmluZCBhIGNhbGxlci1jcmVhdGVkIERhdGFicmlja3Mgd29ya3NwYWNlIHRvIGl0cyBBcHBLaXQgcGx1Z2luIGNvbnRleHQuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0KFxuICB3b3Jrc3BhY2U6IFdvcmtzcGFjZSxcbiAgcGx1Z2luQ29udGV4dDogUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQsXG4gIGV4Y2x1ZGVTa2lsbE5hbWVzOiByZWFkb25seSBzdHJpbmdbXSA9IFtdLFxuKTogV29ya3NwYWNlIHtcbiAgY29uc3Qgb3B0aW9ucyA9IGRhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zLmdldCh3b3Jrc3BhY2UpO1xuICBpZiAoIW9wdGlvbnMpIHJldHVybiB3b3Jrc3BhY2U7XG4gIGNvbnN0IGV4Y2x1ZGVkID0gWy4uLm5ldyBTZXQoWy4uLihvcHRpb25zLmV4Y2x1ZGVTa2lsbE5hbWVzID8/IFtdKSwgLi4uZXhjbHVkZVNraWxsTmFtZXNdKV07XG4gIGlmIChcbiAgICAob3B0aW9ucy5wbHVnaW5Db250ZXh0ICE9PSB1bmRlZmluZWQgfHwgcGx1Z2luQ29udGV4dCA9PT0gdW5kZWZpbmVkKSAmJlxuICAgIGV4Y2x1ZGVkLmxlbmd0aCA9PT0gKG9wdGlvbnMuZXhjbHVkZVNraWxsTmFtZXM/Lmxlbmd0aCA/PyAwKVxuICApIHtcbiAgICByZXR1cm4gd29ya3NwYWNlO1xuICB9XG4gIHJldHVybiBkYXRhYnJpY2tzV29ya3NwYWNlKHtcbiAgICAuLi5vcHRpb25zLFxuICAgIC4uLihwbHVnaW5Db250ZXh0ICE9PSB1bmRlZmluZWQgPyB7IHBsdWdpbkNvbnRleHQgfSA6IHt9KSxcbiAgICAuLi4oZXhjbHVkZWQubGVuZ3RoID4gMCA/IHsgZXhjbHVkZVNraWxsTmFtZXM6IGV4Y2x1ZGVkIH0gOiB7fSksXG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc29sdmUgZGVmYXVsdCBhbmQgY2FsbGVyLXByb3ZpZGVkIERhdGFicmlja3MgcGF0aHMgaW4gcHJpb3JpdHkgb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhzKFxuICBvcHRpb25zOiBQaWNrPERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zLCBcImFzc2lzdGFudFBhdGhzXCIgfCBcInBhdGhzXCI+ID0ge30sXG4pOiBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aFZhbHVlW10ge1xuICByZXR1cm4gW1xuICAgIC4uLihvcHRpb25zLmFzc2lzdGFudFBhdGhzID09PSBmYWxzZSA/IFtdIDogREVGQVVMVF9EQVRBQlJJQ0tTX1dPUktTUEFDRV9QQVRIUyksXG4gICAgLi4uKG9wdGlvbnMucGF0aHMgPz8gW10pLFxuICBdO1xufVxuXG4vKiogV2hldGhlciBvbmUgaW5jbHVkZWQgcGF0aCBjYW4gY29udHJpYnV0ZSBNYXN0cmEgc2tpbGwgcGF0aHMuICovXG5mdW5jdGlvbiBwYXRoTWF5UHJvdmlkZVNraWxscyhwYXRoOiBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aFZhbHVlKTogYm9vbGVhbiB7XG4gIGlmICh0eXBlb2YgcGF0aCA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdHJ1ZTtcbiAgaWYgKHBhdGggPT09IGZhbHNlIHx8IHR5cGVvZiBwYXRoID09PSBcInN0cmluZ1wiKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiAocGF0aC5za2lsbHM/Lmxlbmd0aCA/PyAwKSA+IDA7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJpdmF0ZSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuZnVuY3Rpb24gd29ya3NwYWNlVG9vbHMoY29uZmlndXJlZDogV29ya3NwYWNlVG9vbHNDb25maWcgfCB1bmRlZmluZWQpOiBXb3Jrc3BhY2VUb29sc0NvbmZpZyB7XG4gIHJldHVybiB7XG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICByZXF1aXJlQXBwcm92YWw6IGZhbHNlLFxuICAgIC4uLmNvbmZpZ3VyZWQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VTYW5kYm94KFxuICBzZWxlY3Rpb246IFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24gfCB1bmRlZmluZWQsXG4gIHdvcmtzcGFjZUlkOiBzdHJpbmcsXG4gIHdvcmtzcGFjZU5hbWU6IHN0cmluZyxcbik6IFdvcmtzcGFjZVNhbmRib3ggfCBXb3Jrc3BhY2VTYW5kYm94UmVzb2x2ZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWd1cmVkID0gc2VsZWN0aW9uID8/IFwibW9udHlcIjtcbiAgaWYgKGNvbmZpZ3VyZWQgPT09IGZhbHNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoY29uZmlndXJlZCA9PT0gdHJ1ZSB8fCBjb25maWd1cmVkID09PSBcIm1vbnR5XCIpIHJldHVybiBuZXcgTW9udHlTYW5kYm94KCk7XG4gIGlmICh0eXBlb2YgY29uZmlndXJlZCA9PT0gXCJmdW5jdGlvblwiIHx8IGlzU2FuZGJveChjb25maWd1cmVkKSkgcmV0dXJuIGNvbmZpZ3VyZWQ7XG4gIHRocm93IG5ldyBUeXBlRXJyb3IoYFVuc3VwcG9ydGVkIHdvcmtzcGFjZSBzYW5kYm94IGZvciAke3dvcmtzcGFjZUlkfSAoJHt3b3Jrc3BhY2VOYW1lfSlgKTtcbn1cblxuZnVuY3Rpb24gaXNTYW5kYm94KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya3NwYWNlU2FuZGJveCB7XG4gIHJldHVybiBCb29sZWFuKFxuICAgIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBcImlkXCIgaW4gdmFsdWUgJiYgXCJwcm92aWRlclwiIGluIHZhbHVlICYmIFwic3RhdHVzXCIgaW4gdmFsdWUsXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNhbmRib3hOYW1lKHNlbGVjdGlvbjogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmIChzZWxlY3Rpb24gPT09IHVuZGVmaW5lZCB8fCBzZWxlY3Rpb24gPT09IGZhbHNlKSByZXR1cm4gXCJkaXNhYmxlZFwiO1xuICBpZiAoc2VsZWN0aW9uID09PSB0cnVlIHx8IHNlbGVjdGlvbiA9PT0gXCJtb250eVwiKSByZXR1cm4gXCJtb250eVwiO1xuICBpZiAodHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gXCJyZXNvbHZlclwiO1xuICByZXR1cm4gc2VsZWN0aW9uLnByb3ZpZGVyO1xufVxuXG4vKipcbiAqIFJldHVybiB3aGV0aGVyIHRoZSByZXF1ZXN0IHRva2VuIGNhcnJpZXMgYSBzY29wZSB0aGF0IGFsbG93cyB3b3Jrc3BhY2VcbiAqIGZpbGUgQVBJIGFjY2VzcyAoYHdvcmtzcGFjZWAgb3IgYGFsbC1hcGlzYCBvbiB7QGxpbmsgTUFTVFJBX1NDT1BFU19LRVl9KS5cbiAqL1xuZnVuY3Rpb24gaGFzV29ya3NwYWNlRmlsZVNjb3BlKHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gaW5jbHVkZXNBY2Nlc3NUb2tlblNjb3BlKHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1NDT1BFU19LRVkpLCBXT1JLU1BBQ0VfRklMRV9TQ09QRVMpO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgcmVxdWVzdCBjbGllbnQgYW5kIGF1dGhvcml6YXRpb24tc2FmZSBmaWxlcy1jYWNoZSBzY29wZS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVGaWxlc0NhY2hlU2NvcGUoY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQpOiBQcm9taXNlPFxuICB8IHtcbiAgICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICAgICAgc2NvcGU6IEZpbGVzQ2FjaGVTY29wZTtcbiAgICB9XG4gIHwgdW5kZWZpbmVkXG4+IHtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSBjb250ZXh0LnJlcXVlc3RDb250ZXh0O1xuICBjb25zdCB1c2VyID0gcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsaWVudCA9IHVzZXI/LmV4ZWN1dGlvbkNvbnRleHQuY2xpZW50IGFzIFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcbiAgaWYgKCFyZXF1ZXN0Q29udGV4dCB8fCAhdXNlciB8fCAhY2xpZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGNsaWVudCxcbiAgICBzY29wZToge1xuICAgICAgaG9zdDogKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpLFxuICAgICAgdXNlcktleTogcmVzb2x2ZVVzZXJLZXkocmVxdWVzdENvbnRleHQpLFxuICAgICAgLi4uKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfV09SS1NQQUNFX0lEPy50cmltKClcbiAgICAgICAgPyB7IHdvcmtzcGFjZUlkOiBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1dPUktTUEFDRV9JRC50cmltKCkgfVxuICAgICAgICA6IHt9KSxcbiAgICB9LFxuICB9O1xufVxuXG4vKiogSm9pbiBvbmUgcmVsYXRpdmUgc2tpbGwgcGF0aCB0byBpdHMgYWN0dWFsIGNvbXBvc2l0ZSBtb3VudCBwYXRoLiAqL1xuZnVuY3Rpb24gbW91bnRlZFNraWxsUGF0aChtb3VudDogc3RyaW5nLCBza2lsbFBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChpc0Fic29sdXRlKHNraWxsUGF0aCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBTa2lsbCBwYXRoIG11c3QgYmUgcmVsYXRpdmUgdG8gaXRzIG1vdW50OiAke3NraWxsUGF0aH1gKTtcbiAgfVxuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplKHNraWxsUGF0aCk7XG4gIGlmICghbm9ybWFsaXplZC5vaykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFNraWxsIHBhdGggZXNjYXBlcyBpdHMgbW91bnQ6ICR7c2tpbGxQYXRofWApO1xuICB9XG4gIHJldHVybiBwb3NpeFBhdGguam9pbihub3JtYWxpemVSb290KG1vdW50KSwgbm9ybWFsaXplZC5wYXRoLnNsaWNlKDEpKTtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIGEgRGF0YWJyaWNrcyBwYXRoIGJlbG9uZ3MgdG8gdGhlIHdyaXRhYmxlIFdvcmtzcGFjZSBuYW1lc3BhY2UuICovXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVJvb3Qocm9vdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVSb290KHJvb3QpO1xuICByZXR1cm4gbm9ybWFsaXplZCA9PT0gXCIvV29ya3NwYWNlXCIgfHwgbm9ybWFsaXplZC5zdGFydHNXaXRoKFwiL1dvcmtzcGFjZS9cIik7XG59XG5cbi8qKlxuICogTW91bnQgcmVzb2x2ZXIgZm9yIGNvbmZpZ3VyZWQgRGF0YWJyaWNrcyBhbmQgdGVtcG9yYXJ5IHBhdGhzLlxuICpcbiAqIEdhdGVzIG9uIHdvcmtzcGFjZSBmaWxlIHNjb3BlIChvciBkZXZlbG9wbWVudCBtb2RlKSwgdGhlbiBtb3VudHMgZXZlcnlcbiAqIGZvbGRlciB3aG9zZSBsb2NhdGlvbiByZXNvbHZlcyBmb3IgdGhpcyByZXF1ZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlUGF0aE1vdW50cyhcbiAgcGF0aHM6IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoVmFsdWVbXSxcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gIGZpbGVzQ2FjaGU6IEZpbGVzQ2FjaGVFeHBvcnRzIHwgdW5kZWZpbmVkLFxuICBjYWNoZUNvbmZpZzogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlIHwgdW5kZWZpbmVkLFxuICBmYWxsYmFja1RvVG1wOiBib29sZWFuLFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4ge1xuICBjb25zdCBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+ID0ge307XG4gIGNvbnN0IHNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGxldCBoYXNXcml0YWJsZU1vdW50ID0gZmFsc2U7XG4gIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gY29udGV4dC5yZXF1ZXN0Q29udGV4dDtcblxuICBjb25zdCBjYW5Nb3VudERhdGFicmlja3MgPSBCb29sZWFuKHJlcXVlc3RDb250ZXh0ICYmIHNob3VsZE1vdW50U2tpbGxGb2xkZXJzKHJlcXVlc3RDb250ZXh0KSk7XG4gIGNvbnN0IHNjb3BlZCA9IGNhbk1vdW50RGF0YWJyaWNrcyA/IGF3YWl0IHJlc29sdmVGaWxlc0NhY2hlU2NvcGUoY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsaWVudCA9IHNjb3BlZD8uY2xpZW50O1xuICBjb25zdCBmaWxlU3lzdGVtQ2FjaGUgPVxuICAgIGZpbGVzQ2FjaGUgJiYgc2NvcGVkID8gYXdhaXQgZmlsZXNDYWNoZS5mb3JTY29wZShzY29wZWQuc2NvcGUpIDogdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBwYXRoXSBvZiBwYXRocy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBjb25maWd1cmVkID0gYXdhaXQgcmVzb2x2ZURhdGFicmlja3NXb3Jrc3BhY2VQYXRoKHBhdGgsIGNvbnRleHQpO1xuICAgIGlmICghY29uZmlndXJlZCkgY29udGludWU7XG4gICAgaWYgKGlzV2l0aGluUm9vdChTQ1JBVENIX01PVU5ULCBjb25maWd1cmVkLnBhdGgpKSB7XG4gICAgICBjb25zdCBtb3VudCA9IGNvbmZpZ3VyZWQubW91bnQgPz8gY29uZmlndXJlZC5wYXRoO1xuICAgICAgbW91bnRzW21vdW50XSA9IHVzZXJUZW1wRmlsZXN5c3RlbShjb250ZXh0LCBjb25maWd1cmVkLnBhdGgpO1xuICAgICAgaGFzV3JpdGFibGVNb3VudCA9IHRydWU7XG4gICAgICBza2lsbFBhdGhzLnB1c2goLi4uKGNvbmZpZ3VyZWQuc2tpbGxzID8/IFtdKS5tYXAoKHBhdGgpID0+IG1vdW50ZWRTa2lsbFBhdGgobW91bnQsIHBhdGgpKSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFjYW5Nb3VudERhdGFicmlja3MpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIndvcmtzcGFjZS1wYXRoOnNraXBwZWRcIiwge1xuICAgICAgICBwYXRoOiBjb25maWd1cmVkLnBhdGgsXG4gICAgICAgIHJlYXNvbjogIXJlcXVlc3RDb250ZXh0ID8gXCJuby1yZXF1ZXN0LWNvbnRleHRcIiA6IFwibWlzc2luZy13b3Jrc3BhY2Utc2NvcGVcIixcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZVNraWxsRm9sZGVyRmlsZXN5c3RlbShjb25maWd1cmVkLCBjb250ZXh0LCBjYWNoZUNvbmZpZywge1xuICAgICAgY2xpZW50LFxuICAgICAgZmlsZVN5c3RlbUNhY2hlLFxuICAgIH0pO1xuICAgIGlmICghcmVzb2x2ZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG1vdW50ID0gY29uZmlndXJlZC5tb3VudCA/PyByZXNvbHZlZC5yb290O1xuICAgIGlmICghbW91bnQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIndvcmtzcGFjZS1wYXRoOnNraXBwZWRcIiwgeyBpbmRleCwgcmVhc29uOiBcIm1pc3NpbmctbW91bnRcIiB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtb3VudHNbbW91bnRdID0gcmVzb2x2ZWQuZmlsZXN5c3RlbTtcbiAgICBoYXNXcml0YWJsZU1vdW50IHx8PSByZXNvbHZlZC53cml0YWJsZTtcbiAgICBza2lsbFBhdGhzLnB1c2goLi4uKGNvbmZpZ3VyZWQuc2tpbGxzID8/IFtdKS5tYXAoKHBhdGgpID0+IG1vdW50ZWRTa2lsbFBhdGgobW91bnQsIHBhdGgpKSk7XG4gIH1cblxuICBpZiAoZmFsbGJhY2tUb1RtcCAmJiAhaGFzV3JpdGFibGVNb3VudCkge1xuICAgIG1vdW50c1tTQ1JBVENIX01PVU5UXSA9IHVzZXJUZW1wRmlsZXN5c3RlbShjb250ZXh0LCBTQ1JBVENIX01PVU5UKTtcbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcIndvcmtzcGFjZS1wYXRoczptb3VudGVkXCIsIHtcbiAgICBtb3VudEtleXM6IE9iamVjdC5rZXlzKG1vdW50cyksXG4gICAgc2tpbGxQYXRocyxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudHMsXG4gICAgc2tpbGxQYXRocyxcbiAgfTtcbn1cblxuaW50ZXJmYWNlIFJlc29sdmVkRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGgge1xuICBwYXRoOiBzdHJpbmc7XG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgc2tpbGxzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIHdyaXRhYmxlPzogYm9vbGVhbjtcbiAgY3JlYXRlUm9vdD86IGJvb2xlYW47XG4gIG1vdW50Pzogc3RyaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGgoXG4gIHZhbHVlOiBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aFZhbHVlLFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbik6IFByb21pc2U8UmVzb2x2ZWREYXRhYnJpY2tzV29ya3NwYWNlUGF0aCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBzZWxlY3RlZCA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gYXdhaXQgdmFsdWUoY29udGV4dCkgOiB2YWx1ZTtcbiAgaWYgKHNlbGVjdGVkID09PSBmYWxzZSB8fCBzZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBjb25maWd1cmVkID0gdHlwZW9mIHNlbGVjdGVkID09PSBcInN0cmluZ1wiID8geyBwYXRoOiBzZWxlY3RlZCB9IDogc2VsZWN0ZWQ7XG4gIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gcmVxdWVzdENvbnRleHRWYWx1ZXMoY29udGV4dC5yZXF1ZXN0Q29udGV4dCk7XG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmVIb21lUGF0aChjb25maWd1cmVkLnBhdGgsIHJlcXVlc3RDb250ZXh0KTtcbiAgaWYgKCFyZXNvbHZlZFBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc29sdmVkTW91bnQgPSByZXNvbHZlSG9tZVBhdGgoY29uZmlndXJlZC5tb3VudCwgcmVxdWVzdENvbnRleHQpO1xuICByZXR1cm4ge1xuICAgIC4uLmNvbmZpZ3VyZWQsXG4gICAgcGF0aDogcmVzb2x2ZWRQYXRoLFxuICAgIC4uLihyZXNvbHZlZE1vdW50ID8geyBtb3VudDogcmVzb2x2ZWRNb3VudCB9IDoge30pLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgb25lIHNraWxsIGZvbGRlciB0byBhIE1hc3RyYSBmaWxlc3lzdGVtLCBvciBgdW5kZWZpbmVkYCB0byBza2lwIGl0XG4gKiBmb3IgdGhpcyByZXF1ZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJGaWxlc3lzdGVtKFxuICBmb2xkZXI6IFJlc29sdmVkRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGgsXG4gIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuICBjYWNoZUNvbmZpZzogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlIHwgdW5kZWZpbmVkLFxuICBjYWNoZToge1xuICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkO1xuICAgIGZpbGVTeXN0ZW1DYWNoZTogRmlsZVN5c3RlbUNhY2hlIHwgdW5kZWZpbmVkO1xuICB9LFxuKTogUHJvbWlzZTxcbiAgfCB7XG4gICAgICBmaWxlc3lzdGVtOiBXb3Jrc3BhY2VGaWxlc3lzdGVtO1xuICAgICAgcm9vdD86IHN0cmluZztcbiAgICAgIHdyaXRhYmxlOiBib29sZWFuO1xuICAgIH1cbiAgfCB1bmRlZmluZWRcbj4ge1xuICAvLyBBIHBhdGggbW91bnQgbmVlZHMgdGhlIHJlcXVlc3QncyBPQk8gY2xpZW50IHRvIHJlYWNoIHRoZSB3b3Jrc3BhY2UuXG4gIGlmICghY2FjaGUuY2xpZW50KSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwid29ya3NwYWNlLXBhdGg6c2tpcHBlZFwiLCB7XG4gICAgICBwYXRoOiBmb2xkZXIucGF0aCxcbiAgICAgIHJlYXNvbjogXCJtaXNzaW5nLW9iby1jbGllbnRcIixcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IHJvb3QgPSB0cmltVG9OdWxsKGZvbGRlci5wYXRoKTtcbiAgaWYgKCFyb290KSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCB3cml0YWJsZSA9IGZvbGRlci53cml0YWJsZSA/PyBpc1dvcmtzcGFjZVJvb3Qocm9vdCk7XG4gIGNvbnN0IGNhY2hlT3B0aW9ucyA9IGNhY2hlLmZpbGVTeXN0ZW1DYWNoZVxuICAgID8gYXdhaXQgcmVzb2x2ZUZpbGVDYWNoZU9wdGlvbnMoY2FjaGVDb25maWcsIGNvbnRleHQsIHJvb3QsIGZvbGRlci5za2lsbHMgPz8gW10pXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgZGF0YWJyaWNrc0ZpbGVzeXN0ZW0oXG4gICAgY2FjaGUuY2xpZW50LFxuICAgIHJvb3QsXG4gICAgIXdyaXRhYmxlLFxuICAgIGZvbGRlci5jcmVhdGVSb290ID8/IGZvbGRlci53cml0YWJsZSA9PT0gdHJ1ZSxcbiAgICBjYWNoZS5maWxlU3lzdGVtQ2FjaGUsXG4gICAgY2FjaGVPcHRpb25zLFxuICAgIHtcbiAgICAgIC4uLihmb2xkZXIuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBmb2xkZXIuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgIC4uLihmb2xkZXIuZGlzcGxheU5hbWUgPyB7IGRpc3BsYXlOYW1lOiBmb2xkZXIuZGlzcGxheU5hbWUgfSA6IHt9KSxcbiAgICB9LFxuICApO1xuICByZXR1cm4gcmVzb2x2ZWQgPyB7IC4uLnJlc29sdmVkLCByb290LCB3cml0YWJsZSB9IDogdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ2FjaGVDb25maWcoXG4gIHZhbHVlOiBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGUgfCB1bmRlZmluZWQsXG4gIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuKTogUHJvbWlzZTxcbiAgYm9vbGVhbiB8IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlciB8IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcltdIHwgdW5kZWZpbmVkXG4+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gdmFsdWUoY29udGV4dCkgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdENvbnRleHRWYWx1ZXMocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gcmVxdWVzdENvbnRleHQ/LnRvSlNPTigpID8/IHt9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlSG9tZVBhdGgoXG4gIGlucHV0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHJlcXVlc3RDb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gdHJpbVRvTnVsbChpbnB1dCk7XG4gIGlmICghdmFsdWUgfHwgKHZhbHVlICE9PSBcIn5cIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIn4vXCIpKSkgcmV0dXJuIHZhbHVlID8/IHVuZGVmaW5lZDtcbiAgY29uc3QgZW1haWxWYWx1ZSA9IHJlcXVlc3RDb250ZXh0W01BU1RSQV9VU0VSX0VNQUlMX0tFWV07XG4gIGNvbnN0IGVtYWlsID0gdHlwZW9mIGVtYWlsVmFsdWUgPT09IFwic3RyaW5nXCIgPyB0cmltVG9OdWxsKGVtYWlsVmFsdWUpIDogdW5kZWZpbmVkO1xuICBpZiAoIWVtYWlsKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBob21lID0gcGVyc29uYWxXb3Jrc3BhY2VQYXRoKGVtYWlsKTtcbiAgcmV0dXJuIHZhbHVlID09PSBcIn5cIiA/IGhvbWUgOiBgJHtob21lfS8ke3ZhbHVlLnNsaWNlKDIpfWA7XG59XG5cbmZ1bmN0aW9uIHRvUG9saWN5QXJyYXk8VD4odmFsdWU6IFQgfCByZWFkb25seSBUW10gfCB1bmRlZmluZWQpOiByZWFkb25seSBUW10ge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAodmFsdWUgYXMgcmVhZG9ubHkgVFtdKSA6IFt2YWx1ZSBhcyBUXTtcbn1cblxuZnVuY3Rpb24gY2FjaGVGaWx0ZXJNYXRjaGVzKFxuICBwb2xpY3k6IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcixcbiAgb3BlcmF0aW9uOiBDYWNoZWFibGVGaWxlU3lzdGVtT3BlcmF0aW9uLFxuICBwYXRoOiBzdHJpbmcsXG4gIHJlcXVlc3RDb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcm9vdD86IHN0cmluZyxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBvcGVyYXRpb25zID0gdG9Qb2xpY3lBcnJheShwb2xpY3kub3BlcmF0aW9ucyA/PyBDQUNIRUFCTEVfRklMRVNZU1RFTV9PUEVSQVRJT05TKTtcbiAgaWYgKCFvcGVyYXRpb25zLmluY2x1ZGVzKG9wZXJhdGlvbikpIHJldHVybiBmYWxzZTtcbiAgaWYgKHBvbGljeS5wYXRocyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgaW5wdXRzOiBQYXRoTWF0Y2hJbnB1dFtdID0gW107XG4gIGZvciAoY29uc3QgaW5wdXQgb2YgdG9Qb2xpY3lBcnJheTxQYXRoTWF0Y2hJbnB1dD4ocG9saWN5LnBhdGhzKSkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlucHV0cy5wdXNoKGlucHV0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBleHBhbmRlZCA9IHJlc29sdmVIb21lUGF0aChpbnB1dCwgcmVxdWVzdENvbnRleHQpO1xuICAgIGlmICghZXhwYW5kZWQpIGNvbnRpbnVlO1xuICAgIGlucHV0cy5wdXNoKFxuICAgICAgIXJvb3QgfHwgaXNBYnNvbHV0ZShleHBhbmRlZCkgfHwgZXhwYW5kZWQuc3RhcnRzV2l0aChcIioqXCIpXG4gICAgICAgID8gZXhwYW5kZWRcbiAgICAgICAgOiBgJHtub3JtYWxpemVSb290KHJvb3QpfS8ke2V4cGFuZGVkLnJlcGxhY2UoL15cXC5cXC8vLCBcIlwiKX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGlucHV0cy5sZW5ndGggPiAwICYmIHRvUGF0aE1hdGNoZXIoLi4uaW5wdXRzKShwYXRoKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUZpbGVDYWNoZU9wdGlvbnMoXG4gIGNvbmZpZ3VyZWQ6IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZSB8IHVuZGVmaW5lZCxcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gIHJvb3Q6IHN0cmluZyxcbiAgc2tpbGxQYXRoczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBQcm9taXNlPEZpbGVTeXN0ZW1DYWNoZU9wdGlvbnMgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSByZXF1ZXN0Q29udGV4dFZhbHVlcyhjb250ZXh0LnJlcXVlc3RDb250ZXh0KTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCByZXNvbHZlQ2FjaGVDb25maWcoY29uZmlndXJlZCwgY29udGV4dCk7XG4gIGlmIChyZXNvbHZlZCA9PT0gZmFsc2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChyZXNvbHZlZCA9PT0gdW5kZWZpbmVkIHx8IHJlc29sdmVkID09PSB0cnVlKSB7XG4gICAgY29uc3Qgcm9vdHMgPSBza2lsbFBhdGhzLm1hcCgocGF0aCkgPT4gbW91bnRlZFNraWxsUGF0aChyb290LCBwYXRoKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG9wZXJhdGlvbnM6IENBQ0hFQUJMRV9GSUxFU1lTVEVNX09QRVJBVElPTlMsXG4gICAgICBmaWx0ZXI6IChvcGVyYXRpb24sIHBhdGgpID0+XG4gICAgICAgIG9wZXJhdGlvbiAhPT0gXCJyZWFkRmlsZVwiIHx8IHJvb3RzLnNvbWUoKHNraWxsUm9vdCkgPT4gaXNXaXRoaW5Sb290KHNraWxsUm9vdCwgcGF0aCkpLFxuICAgIH07XG4gIH1cbiAgY29uc3QgcG9saWNpZXMgPSB0b1BvbGljeUFycmF5KHJlc29sdmVkKTtcbiAgaWYgKHBvbGljaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgb3BlcmF0aW9ucyA9IFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgcG9saWNpZXMuZmxhdE1hcCgocG9saWN5KSA9PlxuICAgICAgICB0b1BvbGljeUFycmF5KHBvbGljeS5vcGVyYXRpb25zID8/IENBQ0hFQUJMRV9GSUxFU1lTVEVNX09QRVJBVElPTlMpLFxuICAgICAgKSxcbiAgICApLFxuICBdO1xuICByZXR1cm4ge1xuICAgIG9wZXJhdGlvbnMsXG4gICAgZmlsdGVyOiAob3BlcmF0aW9uLCBwYXRoKSA9PlxuICAgICAgcG9saWNpZXMuc29tZSgocG9saWN5KSA9PiBjYWNoZUZpbHRlck1hdGNoZXMocG9saWN5LCBvcGVyYXRpb24sIHBhdGgsIHJlcXVlc3RDb250ZXh0LCByb290KSksXG4gIH07XG59XG5cbi8qKlxuICogRmlsbCBpbiBgaWRgIGFuZCBgbmFtZWAgd2hlbiBlaXRoZXIgaXMgb21pdHRlZCBvbiB7QGxpbmsgRGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnN9LlxuICogU2x1Z2lmaWVzIGBuYW1lYCBpbnRvIGBpZGA7IHRva2VuaXplcyBgaWRgIGludG8gYSBkaXNwbGF5IGBuYW1lYC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZUlkZW50aXR5KG9wdGlvbnM6IERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zKToge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59IHtcbiAgbGV0IGlkID0gb3B0aW9ucy5pZDtcbiAgbGV0IG5hbWUgPSBvcHRpb25zLm5hbWU7XG4gIGlmICghaWQpIHtcbiAgICBpZCA9IG5hbWUgPyB0b1NsdWcobmFtZSkgOiBcIndvcmtzcGFjZVwiO1xuICB9XG4gIGlmICghbmFtZSkge1xuICAgIG5hbWUgPSBBcnJheS5mcm9tKHRva2VuaXplKGlkKSkuam9pbihcIiBcIik7XG4gIH1cbiAgcmV0dXJuIHsgaWQsIG5hbWUgfTtcbn1cblxuLyoqIENvbGxlY3QgdGhlIERhdGFicmlja3MgcGF0aCByZXNvbHZlciBhbmQgYW55IGNhbGxlci1zdXBwbGllZCBtb3VudHMuICovXG5mdW5jdGlvbiBidWlsZE1vdW50UmVzb2x2ZXJzKFxuICBwYXRoczogcmVhZG9ubHkgRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhWYWx1ZVtdLFxuICBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+IHwgdW5kZWZpbmVkLFxuICBsb2NhbE1vdW50czogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuICBmaWxlc0NhY2hlOiBGaWxlc0NhY2hlRXhwb3J0cyB8IHVuZGVmaW5lZCxcbiAgY2FjaGVDb25maWc6IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZSB8IHVuZGVmaW5lZCxcbiAgZmFsbGJhY2tUb1RtcDogYm9vbGVhbixcbik6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSB7XG4gIGNvbnN0IHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdID0gW107XG4gIGNvbnN0IHBhdGhDb3VudCA9IHBhdGhzLmxlbmd0aDtcbiAgaWYgKHBhdGhDb3VudCA+IDAgfHwgZmFsbGJhY2tUb1RtcCkge1xuICAgIHJlc29sdmVycy5wdXNoKChjb250ZXh0KSA9PlxuICAgICAgcmVzb2x2ZVdvcmtzcGFjZVBhdGhNb3VudHMocGF0aHMsIGNvbnRleHQsIGZpbGVzQ2FjaGUsIGNhY2hlQ29uZmlnLCBmYWxsYmFja1RvVG1wKSxcbiAgICApO1xuICB9XG4gIGlmIChtb3VudHMgJiYgT2JqZWN0LmtleXMobW91bnRzKS5sZW5ndGggPiAwKSByZXNvbHZlcnMucHVzaCgoKSA9PiAoeyBtb3VudHMgfSkpO1xuICByZXNvbHZlcnMucHVzaCguLi5sb2NhbE1vdW50cyk7XG4gIGxvZ2dlci5kZWJ1ZyhcIm1vdW50czpyZXNvbHZlcnNcIiwge1xuICAgIHBhdGhDb3VudCxcbiAgICBjdXN0b21Nb3VudENvdW50OiBPYmplY3Qua2V5cyhtb3VudHMgPz8ge30pLmxlbmd0aCxcbiAgICBsb2NhbE1vdW50Q291bnQ6IGxvY2FsTW91bnRzLmxlbmd0aCxcbiAgICB0b3RhbFJlc29sdmVyQ291bnQ6IHJlc29sdmVycy5sZW5ndGgsXG4gIH0pO1xuICByZXR1cm4gcmVzb2x2ZXJzO1xufVxuXG4vKiogU3RhYmxlIHVzZXItc2NvcGVkIGxvY2FsIHN0b3JhZ2UgdW5kZXIgdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbSdzIHRlbXAgZGlyZWN0b3J5LiAqL1xuZnVuY3Rpb24gdXNlclRlbXBGaWxlc3lzdGVtKFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbiAgd29ya3NwYWNlUGF0aDogc3RyaW5nLFxuKTogV29ya3NwYWNlRmlsZXN5c3RlbSB7XG4gIGNvbnN0IHVzZXJLZXkgPSByZXNvbHZlVXNlcktleShjb250ZXh0LnJlcXVlc3RDb250ZXh0KTtcbiAgY29uc3QgZGlnZXN0ID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgIC51cGRhdGUodG9TdGFibGVLZXkoeyBwYWNrYWdlOiBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiLCB1c2VyS2V5IH0pKVxuICAgIC5kaWdlc3QoXCJoZXhcIilcbiAgICAuc2xpY2UoMCwgMTYpO1xuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplUm9vdCh3b3Jrc3BhY2VQYXRoKTtcbiAgY29uc3QgcmVsYXRpdmUgPSBub3JtYWxpemVkID09PSBTQ1JBVENIX01PVU5UID8gXCJcIiA6IG5vcm1hbGl6ZWQuc2xpY2UoYCR7U0NSQVRDSF9NT1VOVH0vYC5sZW5ndGgpO1xuICBjb25zdCBzb3VyY2UgPSBuZXcgTG9jYWxGaWxlU3lzdGVtKHtcbiAgICByb290OiBqb2luKHRtcGRpcigpLCBcImRieC10b29sc1wiLCBcIm1hc3RyYVwiLCBkaWdlc3QsIHJlbGF0aXZlKSxcbiAgICByZWFkT25seTogZmFsc2UsXG4gICAgY3JlYXRlUm9vdDogdHJ1ZSxcbiAgfSk7XG4gIHJldHVybiBmaWxlc3lzdGVtcyhzb3VyY2UsIHtcbiAgICBkaXNwbGF5TmFtZTogXCJUZW1wb3JhcnkgRmlsZXNcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiVXNlci1zY29wZWQgdGVtcG9yYXJ5IGZpbGVzIHJldGFpbmVkIHdoaWxlIHRoZSBob3N0IGtlZXBzIGl0cyBlcGhlbWVyYWwgdGVtcCBzdG9yYWdlLlwiLFxuICB9KTtcbn1cblxuLyoqIE1vdW50IHN0YXJ0dXAtcHJvdmlzaW9uZWQgbG9jYWwgc2tpbGwgdHJlZXMgaW50byBNYXN0cmEncyB3b3Jrc3BhY2UgZmlsZXN5c3RlbS4gKi9cbmZ1bmN0aW9uIGxvY2FsU2tpbGxNb3VudFJlc29sdmVycyhtb3VudHM6IHJlYWRvbmx5IExvY2FsU2tpbGxNb3VudFtdKTogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdIHtcbiAgY29uc3QgdW5pcXVlID0gbmV3IE1hcDxzdHJpbmcsIExvY2FsU2tpbGxNb3VudD4oKTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBtb3VudHMpIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IFwicm9vdFwiIGluIGVudHJ5ID8gZW50cnkucm9vdC50cmltKCkgOiBlbnRyeS5maWxlc3lzdGVtLmlkO1xuICAgIGlmICghaWRlbnRpdHkpIGNvbnRpbnVlO1xuICAgIHVuaXF1ZS5zZXQoYCR7ZW50cnkubW91bnRQYXRofVxcMCR7aWRlbnRpdHl9YCwgZW50cnkpO1xuICB9XG4gIHJldHVybiBbLi4udW5pcXVlLnZhbHVlcygpXS5tYXAoKGVudHJ5KSA9PiB7XG4gICAgY29uc3QgbW91bnQgPSBub3JtYWxpemVSb290KGVudHJ5Lm1vdW50UGF0aCk7XG4gICAgY29uc3QgZmlsZXN5c3RlbSA9IGluTWVtb3J5U2tpbGxGaWxlc3lzdGVtKGVudHJ5KTtcbiAgICByZXR1cm4gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgc291cmNlID0gYXdhaXQgZmlsZXN5c3RlbTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1vdW50czogeyBbbW91bnRdOiBmaWxlc3lzdGVtcyhzb3VyY2UsIHsgcmVhZE9ubHk6IHRydWUgfSkgfSxcbiAgICAgICAgc2tpbGxQYXRoczogW21vdW50XSxcbiAgICAgIH07XG4gICAgfTtcbiAgfSk7XG59XG5cbi8qKiBDb252ZXJ0IGZhc3QgbG9jYWwgb3IgaW4tbWVtb3J5IHNraWxsIHRyZWVzIGludG8gbmF0aXZlIGFnZW50LWxldmVsIHNraWxscy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBpbmxpbmVTa2lsbHNGcm9tTG9jYWxNb3VudHMoXG4gIG1vdW50czogcmVhZG9ubHkgTG9jYWxTa2lsbE1vdW50W10sXG4pOiBQcm9taXNlPElubGluZVNraWxsW10+IHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgTWFwPHN0cmluZywgSW5saW5lU2tpbGw+KCk7XG4gIGZvciAoY29uc3QgbW91bnQgb2YgbW91bnRzKSB7XG4gICAgY29uc3QgZmlsZXN5c3RlbSA9IGF3YWl0IGluTWVtb3J5U2tpbGxGaWxlc3lzdGVtKG1vdW50KTtcbiAgICBjb25zdCBlbnRyaWVzID0gYXdhaXQgZmlsZXN5c3RlbS5yZWFkZGlyKFwiL1wiKTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGlmIChlbnRyeS50eXBlICE9PSBcImRpcmVjdG9yeVwiIHx8IHNlbGVjdGVkLmhhcyhlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICBjb25zdCBza2lsbFBhdGggPSBlbnRyeS5uYW1lO1xuICAgICAgY29uc3Qgc2tpbGxGaWxlID0gYCR7c2tpbGxQYXRofS9TS0lMTC5tZGA7XG4gICAgICBpZiAoIShhd2FpdCBmaWxlc3lzdGVtLmV4aXN0cyhza2lsbEZpbGUpKSkgY29udGludWU7XG4gICAgICBjb25zdCBjb250ZW50ID0gYXdhaXQgZmlsZXN5c3RlbS5yZWFkRmlsZShza2lsbEZpbGUsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pO1xuICAgICAgY29uc3QgcGFyc2VkID0gdmFsaWRhdGVTa2lsbENvbnRlbnQoe1xuICAgICAgICBjb250ZW50OiBTdHJpbmcoY29udGVudCksXG4gICAgICAgIGRpcmVjdG9yeU5hbWU6IGVudHJ5Lm5hbWUsXG4gICAgICB9KTtcbiAgICAgIGlmICghcGFyc2VkLnZhbGlkIHx8ICFwYXJzZWQubWV0YWRhdGEgfHwgcGFyc2VkLmluc3RydWN0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBsb2NhbCBza2lsbCAke2VudHJ5Lm5hbWV9OiAke3BhcnNlZC5lcnJvcnMuam9pbihcIjsgXCIpfWApO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVmZXJlbmNlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBmaWxlIG9mIGF3YWl0IGZpbGVzeXN0ZW0ucmVhZGRpcihza2lsbFBhdGgsIHsgcmVjdXJzaXZlOiB0cnVlIH0pKSB7XG4gICAgICAgIGlmIChmaWxlLnR5cGUgIT09IFwiZmlsZVwiIHx8IGZpbGUubmFtZSA9PT0gXCJTS0lMTC5tZFwiKSBjb250aW51ZTtcbiAgICAgICAgaWYgKCEvXFwuKG1kfHR4dHxqc29ufHlhP21sfHRvbWx8c2h8W2NtXT9banRdc3g/fHB5KSQvaS50ZXN0KGZpbGUubmFtZSkpIGNvbnRpbnVlO1xuICAgICAgICByZWZlcmVuY2VzW2ZpbGUubmFtZV0gPSBTdHJpbmcoXG4gICAgICAgICAgYXdhaXQgZmlsZXN5c3RlbS5yZWFkRmlsZShgJHtza2lsbFBhdGh9LyR7ZmlsZS5uYW1lfWAsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgbWV0YWRhdGEgPSBwYXJzZWQubWV0YWRhdGE7XG4gICAgICBzZWxlY3RlZC5zZXQoXG4gICAgICAgIGVudHJ5Lm5hbWUsXG4gICAgICAgIGNyZWF0ZVNraWxsKHtcbiAgICAgICAgICBuYW1lOiBTdHJpbmcobWV0YWRhdGEubmFtZSksXG4gICAgICAgICAgZGVzY3JpcHRpb246IFN0cmluZyhtZXRhZGF0YS5kZXNjcmlwdGlvbiksXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25zOiBwYXJzZWQuaW5zdHJ1Y3Rpb25zLFxuICAgICAgICAgIC4uLih0eXBlb2YgbWV0YWRhdGEubGljZW5zZSA9PT0gXCJzdHJpbmdcIiA/IHsgbGljZW5zZTogbWV0YWRhdGEubGljZW5zZSB9IDoge30pLFxuICAgICAgICAgIC4uLihtZXRhZGF0YS5jb21wYXRpYmlsaXR5ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8geyBjb21wYXRpYmlsaXR5OiBtZXRhZGF0YS5jb21wYXRpYmlsaXR5IH1cbiAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgIC4uLihpc1JlY29yZChtZXRhZGF0YS5tZXRhZGF0YSkgPyB7IG1ldGFkYXRhOiBtZXRhZGF0YS5tZXRhZGF0YSB9IDoge30pLFxuICAgICAgICAgIC4uLihPYmplY3Qua2V5cyhyZWZlcmVuY2VzKS5sZW5ndGggPiAwID8geyByZWZlcmVuY2VzIH0gOiB7fSksXG4gICAgICAgIH0pLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5zZWxlY3RlZC52YWx1ZXMoKV07XG59XG5cbmZ1bmN0aW9uIGluTWVtb3J5U2tpbGxGaWxlc3lzdGVtKG1vdW50OiBMb2NhbFNraWxsTW91bnQpOiBQcm9taXNlPEZpbGVTeXN0ZW0+IHtcbiAgY29uc3Qga2V5ID0gXCJyb290XCIgaW4gbW91bnQgPyBgcm9vdDoke21vdW50LnJvb3R9YCA6IGBmaWxlc3lzdGVtOiR7bW91bnQuZmlsZXN5c3RlbS5pZH1gO1xuICBjb25zdCBleGlzdGluZyA9IHNoYXJlZFNraWxsRmlsZXN5c3RlbXMuZ2V0KGtleSk7XG4gIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICBjb25zdCBsb2FkZWQgPSBsb2FkSW5NZW1vcnlTa2lsbEZpbGVzeXN0ZW0obW91bnQpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgIGlmIChzaGFyZWRTa2lsbEZpbGVzeXN0ZW1zLmdldChrZXkpID09PSBsb2FkZWQpIHNoYXJlZFNraWxsRmlsZXN5c3RlbXMuZGVsZXRlKGtleSk7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH0pO1xuICBzaGFyZWRTa2lsbEZpbGVzeXN0ZW1zLnNldChrZXksIGxvYWRlZCk7XG4gIHJldHVybiBsb2FkZWQ7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGxvYWRJbk1lbW9yeVNraWxsRmlsZXN5c3RlbShtb3VudDogTG9jYWxTa2lsbE1vdW50KTogUHJvbWlzZTxGaWxlU3lzdGVtPiB7XG4gIGlmIChcImZpbGVzeXN0ZW1cIiBpbiBtb3VudCkge1xuICAgIGF3YWl0IG1vdW50LmZpbGVzeXN0ZW0uaW5pdCgpO1xuICAgIHJldHVybiBtb3VudC5maWxlc3lzdGVtO1xuICB9XG4gIGNvbnN0IHNvdXJjZSA9IG5ldyBMb2NhbEZpbGVTeXN0ZW0oe1xuICAgIHJvb3Q6IG1vdW50LnJvb3QsXG4gICAgcmVhZE9ubHk6IHRydWUsXG4gICAgY3JlYXRlUm9vdDogZmFsc2UsXG4gIH0pO1xuICBhd2FpdCBzb3VyY2UuaW5pdCgpO1xuICBjb25zdCBtZW1vcnkgPSBuZXcgTWVtb3J5RmlsZVN5c3RlbSh7XG4gICAgaWQ6IGBza2lsbHMtJHtjcmVhdGVIYXNoKFwic2hhMjU2XCIpLnVwZGF0ZShtb3VudC5yb290KS5kaWdlc3QoXCJoZXhcIikuc2xpY2UoMCwgMTYpfWAsXG4gICAgcm9vdDogXCIvXCIsXG4gIH0pO1xuICBhd2FpdCBtZW1vcnkuaW5pdCgpO1xuICBmb3IgYXdhaXQgKGNvbnN0IHJlbGF0aXZlIG9mIGZpbmRGaWxlcyhcIioqLypcIiwgeyBjd2Q6IG1vdW50LnJvb3QsIG5vZGlyOiB0cnVlIH0pKSB7XG4gICAgYXdhaXQgbWVtb3J5LndyaXRlRmlsZShyZWxhdGl2ZSwgYXdhaXQgc291cmNlLnJlYWRGaWxlKHJlbGF0aXZlKSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gIH1cbiAgYXdhaXQgc291cmNlLmNsb3NlKCk7XG4gIHJldHVybiBtZW1vcnk7XG59XG5cbi8qKlxuICogR2F0ZSBza2lsbC1mb2xkZXIgbW91bnRzIG9uIHRoZSByZXF1ZXN0J3MgdG9rZW4uXG4gKlxuICogQWx3YXlzIGFsbG93cyBtb3VudHMgaW4gZGV2ZWxvcG1lbnQ7IGluIG90aGVyIGVudmlyb25tZW50cyByZXF1aXJlc1xuICoge0BsaW5rIGhhc1dvcmtzcGFjZUZpbGVTY29wZX0uXG4gKi9cbmZ1bmN0aW9uIHNob3VsZE1vdW50U2tpbGxGb2xkZXJzKHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCk6IGJvb2xlYW4ge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikgcmV0dXJuIHRydWU7XG4gIHJldHVybiBoYXNXb3Jrc3BhY2VGaWxlU2NvcGUocmVxdWVzdENvbnRleHQpO1xufVxuXG4vKipcbiAqIFdyYXAgYSB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19IGFzIGEgTWFzdHJhIGZpbGVzeXN0ZW0uIE1pc3Npbmcgb3JcbiAqIGluYWNjZXNzaWJsZSByb290cyByZXR1cm4gYHVuZGVmaW5lZGAgc28gb3RoZXIgYWNjZXNzaWJsZSByb290cyByZW1haW5cbiAqIHVzYWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGF0YWJyaWNrc0ZpbGVzeXN0ZW0oXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICByb290OiBzdHJpbmcsXG4gIHJlYWRPbmx5OiBib29sZWFuID0gdHJ1ZSxcbiAgY3JlYXRlUm9vdDogYm9vbGVhbiA9ICFyZWFkT25seSxcbiAgZmlsZVN5c3RlbUNhY2hlPzogRmlsZVN5c3RlbUNhY2hlLFxuICBjYWNoZU9wdGlvbnM/OiBGaWxlU3lzdGVtQ2FjaGVPcHRpb25zLFxuICBhZGFwdGVyT3B0aW9uczogUGljazxNYXN0cmFGaWxlU3lzdGVtQWRhcHRlck9wdGlvbnMsIFwiZGVzY3JpcHRpb25cIiB8IFwiZGlzcGxheU5hbWVcIj4gPSB7fSxcbik6IFByb21pc2U8XG4gIHwge1xuICAgICAgZmlsZXN5c3RlbTogV29ya3NwYWNlRmlsZXN5c3RlbTtcbiAgICB9XG4gIHwgdW5kZWZpbmVkXG4+IHtcbiAgY29uc3QgZnMgPSBuZXcgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0oe1xuICAgIGNsaWVudDogKCkgPT4gdG9MZWdhY3lXb3Jrc3BhY2VDbGllbnQocmVxdWVzdFdvcmtzcGFjZUNsaWVudChjbGllbnQpKSxcbiAgICByb290LFxuICAgIHJlYWRPbmx5LFxuICAgIGNyZWF0ZVJvb3QsXG4gIH0pO1xuICBjb25zdCBjYWNoZWQgPVxuICAgIGZpbGVTeXN0ZW1DYWNoZSAmJiBjYWNoZU9wdGlvbnMgPyBzaGFyZWRGUy5jYWNoZShmcywgZmlsZVN5c3RlbUNhY2hlLCBjYWNoZU9wdGlvbnMpIDogZnM7XG4gIGNvbnN0IHNvdXJjZSA9IHZlcmlmeUZpcnN0RmlsZVN5c3RlbUFjY2VzcyhjYWNoZWQsICgpID0+IGZzLnN0YXQoXCIuXCIpLCByb290KTtcbiAgY29uc3QgZmlsZXN5c3RlbSA9IGZpbGVzeXN0ZW1zKHNvdXJjZSwgeyAuLi5hZGFwdGVyT3B0aW9ucywgcmVhZE9ubHkgfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZmlsZXN5c3RlbS5pbml0KCk7XG4gICAgaWYgKGF3YWl0IGZpbGVzeXN0ZW0uZXhpc3RzKFwiLlwiKSkge1xuICAgICAgcmV0dXJuIHsgZmlsZXN5c3RlbSB9O1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZGF0YWJyaWNrcy1tb3VudDpza2lwcGVkXCIsIHtcbiAgICAgIHJvb3QsXG4gICAgICByZWFkT25seSxcbiAgICAgIGVycm9yOiB0b0Vycm9yKGVyciksXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqIEBpbnRlcm5hbCBLZWVwIHNlcnZpY2UgY29udGV4dCBmcm9tIHJlcGxhY2luZyB0aGUgcmVxdWVzdC1zY29wZWQgd29ya3NwYWNlIGNsaWVudC4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0V29ya3NwYWNlQ2xpZW50KFxuICBpbml0aWFsQ2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIGV4ZWN1dGlvbkNvbnRleHQ6IFJldHVyblR5cGU8dHlwZW9mIHRyeUdldEV4ZWN1dGlvbkNvbnRleHQ+ID0gdHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpLFxuKTogV29ya3NwYWNlQ2xpZW50IHtcbiAgaWYgKFxuICAgIGV4ZWN1dGlvbkNvbnRleHQgJiZcbiAgICBcImlzVXNlckNvbnRleHRcIiBpbiBleGVjdXRpb25Db250ZXh0ICYmXG4gICAgZXhlY3V0aW9uQ29udGV4dC5pc1VzZXJDb250ZXh0ID09PSB0cnVlXG4gICkge1xuICAgIHJldHVybiBleGVjdXRpb25Db250ZXh0LmNsaWVudDtcbiAgfVxuICByZXR1cm4gaW5pdGlhbENsaWVudDtcbn1cblxuZnVuY3Rpb24gdmVyaWZ5Rmlyc3RGaWxlU3lzdGVtQWNjZXNzPFRGaWxlU3lzdGVtIGV4dGVuZHMgRmlsZVN5c3RlbT4oXG4gIGZpbGVzeXN0ZW06IFRGaWxlU3lzdGVtLFxuICByZWFkUHJvYmU6ICgpID0+IFByb21pc2U8dW5rbm93bj4sXG4gIHJvb3Q6IHN0cmluZyxcbik6IFRGaWxlU3lzdGVtIHtcbiAgbGV0IHJlYWRDaGVjazogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcbiAgbGV0IHdyaXRlVmVyaWZpZWQgPSBmYWxzZTtcbiAgY29uc3QgYm91bmRNZXRob2RzID0gbmV3IE1hcDxQcm9wZXJ0eUtleSwgdW5rbm93bj4oKTtcbiAgY29uc3QgcmVhZE9wZXJhdGlvbnMgPSBuZXcgU2V0PFByb3BlcnR5S2V5PihbXCJleGlzdHNcIiwgXCJyZWFkRmlsZVwiLCBcInJlYWRkaXJcIiwgXCJzdGF0XCJdKTtcbiAgY29uc3Qgd3JpdGVPcGVyYXRpb25zID0gbmV3IFNldDxQcm9wZXJ0eUtleT4oW1xuICAgIFwiYXBwZW5kRmlsZVwiLFxuICAgIFwiY29weUZpbGVcIixcbiAgICBcImRlbGV0ZUZpbGVcIixcbiAgICBcIm1rZGlyXCIsXG4gICAgXCJtb3ZlRmlsZVwiLFxuICAgIFwicm1kaXJcIixcbiAgICBcIndyaXRlRmlsZVwiLFxuICBdKTtcbiAgY29uc3QgdmVyaWZ5UmVhZCA9IGFzeW5jICgpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICByZWFkQ2hlY2sgPz89IFByb21pc2UucmVzb2x2ZShyZWFkUHJvYmUoKSkudGhlbigoKSA9PiB1bmRlZmluZWQpO1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCByZWFkQ2hlY2s7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHJlYWRDaGVjayA9IHVuZGVmaW5lZDtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcImRhdGFicmlja3MtbW91bnQ6cmVhZC1jaGVjay1mYWlsZWRcIiwge1xuICAgICAgICByb290LFxuICAgICAgICBlcnJvcjogdG9FcnJvcihlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbmV3IFByb3h5KGZpbGVzeXN0ZW0sIHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5LCB0YXJnZXQpO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdmFsdWU7XG4gICAgICBpZiAoYm91bmRNZXRob2RzLmhhcyhwcm9wZXJ0eSkpIHJldHVybiBib3VuZE1ldGhvZHMuZ2V0KHByb3BlcnR5KTtcbiAgICAgIGNvbnN0IGRlbGVnYXRlZCA9IHZhbHVlLmJpbmQodGFyZ2V0KSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuICAgICAgbGV0IG1ldGhvZCA9IGRlbGVnYXRlZDtcbiAgICAgIGlmIChyZWFkT3BlcmF0aW9ucy5oYXMocHJvcGVydHkpKSB7XG4gICAgICAgIG1ldGhvZCA9IGFzeW5jICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICBhd2FpdCB2ZXJpZnlSZWFkKCk7XG4gICAgICAgICAgcmV0dXJuIGRlbGVnYXRlZCguLi5hcmdzKTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAod3JpdGVPcGVyYXRpb25zLmhhcyhwcm9wZXJ0eSkpIHtcbiAgICAgICAgbWV0aG9kID0gYXN5bmMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWxlZ2F0ZWQoLi4uYXJncyk7XG4gICAgICAgICAgICBpZiAoIXdyaXRlVmVyaWZpZWQpIHtcbiAgICAgICAgICAgICAgd3JpdGVWZXJpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcImRhdGFicmlja3MtbW91bnQ6d3JpdGUtY2hlY2stcGFzc2VkXCIsIHsgcm9vdCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICghd3JpdGVWZXJpZmllZCkge1xuICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXCJkYXRhYnJpY2tzLW1vdW50OndyaXRlLWNoZWNrLWZhaWxlZFwiLCB7XG4gICAgICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgICAgICBlcnJvcjogdG9FcnJvcihlcnJvciksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgYm91bmRNZXRob2RzLnNldChwcm9wZXJ0eSwgbWV0aG9kKTtcbiAgICAgIHJldHVybiBtZXRob2Q7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogUnVuIGV2ZXJ5IG1vdW50IHJlc29sdmVyIGZvciBvbmUgcmVxdWVzdCBhbmQgbWVyZ2UgbW91bnRzIHBsdXMgc2tpbGwgcGF0aHMuXG4gKiBMYXRlciByZXNvbHZlcnMgb3ZlcndyaXRlIG1vdW50IGtleXMgZnJvbSBlYXJsaWVyIG9uZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24oXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbik6IFByb21pc2U8V29ya3NwYWNlTW91bnRDb250cmlidXRpb24+IHtcbiAgY29uc3QgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPiA9IHt9O1xuICBjb25zdCBza2lsbFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCByZXNvbHZlcl0gb2YgcmVzb2x2ZXJzLmVudHJpZXMoKSkge1xuICAgIGNvbnN0IGNvbnRyaWJ1dGlvbiA9IGF3YWl0IHJlc29sdmVyKGNvbnRleHQpO1xuICAgIGxvZ2dlci5kZWJ1ZyhcIm1vdW50czpyZXNvbHZlclwiLCB7XG4gICAgICBpbmRleCxcbiAgICAgIG1vdW50S2V5czogT2JqZWN0LmtleXMoY29udHJpYnV0aW9uLm1vdW50cyksXG4gICAgICBza2lsbFBhdGhzOiBjb250cmlidXRpb24uc2tpbGxQYXRocyA/PyBbXSxcbiAgICB9KTtcbiAgICBPYmplY3QuYXNzaWduKG1vdW50cywgY29udHJpYnV0aW9uLm1vdW50cyk7XG4gICAgaWYgKGNvbnRyaWJ1dGlvbi5za2lsbFBhdGhzPy5sZW5ndGgpIHtcbiAgICAgIHNraWxsUGF0aHMucHVzaCguLi5jb250cmlidXRpb24uc2tpbGxQYXRocyk7XG4gICAgfVxuICB9XG5cbiAgbG9nZ2VyLmRlYnVnKFwibW91bnRzOm1lcmdlZFwiLCB7XG4gICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhtb3VudHMpLFxuICAgIHNraWxsUGF0aHMsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgbW91bnRzLFxuICAgIHNraWxsUGF0aHMsXG4gIH07XG59XG5cbi8qKlxuICogRHluYW1pYyBmaWxlc3lzdGVtIHJlc29sdmVyIHBhc3NlZCB0byBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0uXG4gKlxuICogUmV0dXJucyBhIHtAbGluayBDb21wb3NpdGVGaWxlc3lzdGVtfSBvdmVyIGV2ZXJ5IHBhdGggdGhhdCByZXNvbHZlZCBmb3IgdGhlXG4gKiByZXF1ZXN0LiBBbiBlbXB0eSBjb21wb3NpdGUgZXhwb3NlcyBubyBpbXBsaWNpdCBsb2NhbCBzdG9yYWdlLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlRmlsZXN5c3RlbShcbiAgcmVzb2x2ZUNvbnRyaWJ1dGlvbjogKGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0KSA9PiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPixcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gIGZpbGVzQ2FjaGU/OiBGaWxlc0NhY2hlRXhwb3J0cyxcbiAgc291cmNlS2V5Pzogc3RyaW5nLFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VGaWxlc3lzdGVtPiB7XG4gIGNvbnN0IHsgbW91bnRzIH0gPSBhd2FpdCByZXNvbHZlQ29udHJpYnV0aW9uKGNvbnRleHQpO1xuICBjb25zdCBtb3VudEtleXMgPSBPYmplY3Qua2V5cyhtb3VudHMpO1xuICBpZiAobW91bnRLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImZpbGVzeXN0ZW06ZW1wdHlcIiwge1xuICAgICAgaGFzUmVxdWVzdENvbnRleHQ6IEJvb2xlYW4oY29udGV4dC5yZXF1ZXN0Q29udGV4dCksXG4gICAgfSk7XG4gICAgcmV0dXJuIGZpbGVzeXN0ZW1zKG5ldyBNZW1vcnlGaWxlU3lzdGVtKHsgcm9vdDogXCIvXCIsIHJlYWRPbmx5OiB0cnVlIH0pLCB7XG4gICAgICByZWFkT25seTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuICBsb2dnZXIuZGVidWcoXCJmaWxlc3lzdGVtOmNvbXBvc2l0ZVwiLCB7IG1vdW50S2V5cyB9KTtcbiAgY29uc3QgbG9hZCA9ICgpID0+IG5ldyBNb3VudGVkQ29tcG9zaXRlRmlsZXN5c3RlbSh7IG1vdW50cyB9KTtcbiAgaWYgKCFmaWxlc0NhY2hlKSByZXR1cm4gbG9hZCgpO1xuICBjb25zdCBzY29wZWQgPSBhd2FpdCByZXNvbHZlRmlsZXNDYWNoZVNjb3BlKGNvbnRleHQpO1xuICBpZiAoIXNjb3BlZCkgcmV0dXJuIGxvYWQoKTtcbiAgcmV0dXJuIGZpbGVzQ2FjaGUuZm9yRmlsZVN5c3RlbShzY29wZWQuc2NvcGUsIHsgcGF0aHM6IG1vdW50S2V5cywga2V5OiBzb3VyY2VLZXkgfSwgbG9hZCk7XG59XG5cbi8qKlxuICogRXhwYW5kIGNvbmZpZ3VyZWQgc2tpbGwgcGF0aHMgaW50byBjb25jcmV0ZSBza2lsbCBkaXJlY3RvcmllcyBhbmQga2VlcCB0aGUgZmlyc3RcbiAqIHNhbWUtbmFtZWQgZGlyZWN0b3J5LiBNYXN0cmEgc3RpbGwgb3ducyBwYXJzaW5nLCBpbmRleGluZywgYW5kIHJlZnJlc2hlcyxcbiAqIHdoaWxlIGVhcmxpZXIgY29uZmlndXJlZCByb290cyByZXRhaW4gcHJlY2VkZW5jZSBvdmVyIGxhdGVyIHJvb3RzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRGlzdGluY3RTa2lsbFBhdGhzKFxuICBmaWxlc3lzdGVtOiBXb3Jrc3BhY2VGaWxlc3lzdGVtLFxuICBwYXRoczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGV4Y2x1ZGVkU2tpbGxOYW1lczogUmVhZG9ubHlTZXQ8c3RyaW5nPixcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZpbGVzeXN0ZW0ucmVhZGRpcihwYXRoKTtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS50eXBlID09PSBcImZpbGVcIiAmJiBlbnRyeS5uYW1lID09PSBcIlNLSUxMLm1kXCIpKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBiYXNlbmFtZShwYXRoKTtcbiAgICAgICAgaWYgKCFleGNsdWRlZFNraWxsTmFtZXMuaGFzKG5hbWUpICYmICFzZWxlY3RlZC5oYXMobmFtZSkpIHNlbGVjdGVkLnNldChuYW1lLCBwYXRoKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGVudHJ5LnR5cGUgIT09IFwiZGlyZWN0b3J5XCIgfHxcbiAgICAgICAgICBleGNsdWRlZFNraWxsTmFtZXMuaGFzKGVudHJ5Lm5hbWUpIHx8XG4gICAgICAgICAgc2VsZWN0ZWQuaGFzKGVudHJ5Lm5hbWUpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIHNlbGVjdGVkLnNldChlbnRyeS5uYW1lLCBwb3NpeFBhdGguam9pbihwYXRoLCBlbnRyeS5uYW1lKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsLXBhdGg6c2tpcHBlZFwiLCB7XG4gICAgICAgIHBhdGgsXG4gICAgICAgIGVycm9yOiB0b0Vycm9yKGVycm9yKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLnNlbGVjdGVkLnZhbHVlcygpXTtcbn1cblxuLyoqIE1lbW9pemUgb25lIGNvbXBsZXRlIG1vdW50IGNvbnRyaWJ1dGlvbiBmb3IgZWFjaCByZXF1ZXN0IGNvbnRleHQuICovXG5mdW5jdGlvbiBjb250cmlidXRpb25SZXNvbHZlcihcbiAgcmVzb2x2ZXJzOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10sXG4pOiAoY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQpID0+IFByb21pc2U8V29ya3NwYWNlTW91bnRDb250cmlidXRpb24+IHtcbiAgY29uc3Qgc2NvcGVkID0gbmV3IFdlYWtNYXA8UmVxdWVzdENvbnRleHQsIFByb21pc2U8V29ya3NwYWNlTW91bnRDb250cmlidXRpb24+PigpO1xuICBsZXQgdW5zY29wZWQ6IFByb21pc2U8V29ya3NwYWNlTW91bnRDb250cmlidXRpb24+IHwgdW5kZWZpbmVkO1xuICByZXR1cm4gKGNvbnRleHQpID0+IHtcbiAgICBpZiAoIWNvbnRleHQucmVxdWVzdENvbnRleHQpIHtcbiAgICAgIHVuc2NvcGVkID8/PSByZXNvbHZlV29ya3NwYWNlQ29udHJpYnV0aW9uKHJlc29sdmVycywgY29udGV4dCk7XG4gICAgICByZXR1cm4gdW5zY29wZWQ7XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nID0gc2NvcGVkLmdldChjb250ZXh0LnJlcXVlc3RDb250ZXh0KTtcbiAgICBpZiAoZXhpc3RpbmcpIHJldHVybiBleGlzdGluZztcbiAgICBjb25zdCBwZW5kaW5nID0gcmVzb2x2ZVdvcmtzcGFjZUNvbnRyaWJ1dGlvbihyZXNvbHZlcnMsIGNvbnRleHQpO1xuICAgIHNjb3BlZC5zZXQoY29udGV4dC5yZXF1ZXN0Q29udGV4dCwgcGVuZGluZyk7XG4gICAgcmV0dXJuIHBlbmRpbmc7XG4gIH07XG59XG4iXX0=