experimental-agent 0.0.3 → 0.0.5

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 (38) hide show
  1. package/dist/agent-workflow.d.mts +1 -1
  2. package/dist/agent-workflow.d.ts +1 -1
  3. package/dist/agent-workflow.js +739 -319
  4. package/dist/agent-workflow.mjs +1 -1
  5. package/dist/chunk-2IIWVPZB.mjs +334 -0
  6. package/dist/{chunk-TQRCSTCF.mjs → chunk-CQB6AOJ7.mjs} +2 -2
  7. package/dist/{chunk-UFVWOC5L.mjs → chunk-CRDAPJEY.mjs} +3 -3
  8. package/dist/chunk-GJETDXOU.mjs +361 -0
  9. package/dist/chunk-M2XPBOZD.mjs +1980 -0
  10. package/dist/chunk-ZWP7RQZT.mjs +1239 -0
  11. package/dist/{client-SREKHM6I.mjs → client-5C4CNU6H.mjs} +1 -1
  12. package/dist/{client-BlSrVoPI.d.mts → client-9A8NO6x9.d.mts} +268 -7
  13. package/dist/{client-BlSrVoPI.d.ts → client-9A8NO6x9.d.ts} +268 -7
  14. package/dist/{handler-36FM5H35.mjs → handler-SZDTM3MC.mjs} +1 -1
  15. package/dist/index.d.mts +2 -2
  16. package/dist/index.d.ts +2 -2
  17. package/dist/index.js +875 -341
  18. package/dist/index.mjs +96 -24
  19. package/dist/lifecycle-workflow.d.mts +1 -1
  20. package/dist/lifecycle-workflow.d.ts +1 -1
  21. package/dist/lifecycle-workflow.js +97 -4
  22. package/dist/lifecycle-workflow.mjs +1 -1
  23. package/dist/local-fs-handlers-BZVA3XAU.mjs +277 -0
  24. package/dist/next/loader.js +3 -3
  25. package/dist/next/loader.mjs +1 -1
  26. package/dist/next.js +6 -3
  27. package/dist/next.mjs +5 -2
  28. package/dist/{sandbox-QAPGBVYM.mjs → sandbox-M24R3JLM.mjs} +2 -2
  29. package/dist/{storage-Q376OZH3.mjs → storage-TMZQJ2OQ.mjs} +2 -2
  30. package/dist/vercel-WGN2NY3D.mjs +20 -0
  31. package/dist/{vercel-sdk-VHKEX2GQ.mjs → vercel-sdk-UKBD5JDI.mjs} +2 -2
  32. package/package.json +2 -2
  33. package/dist/chunk-GSRJYPWF.mjs +0 -284
  34. package/dist/chunk-JEE2FQ4O.mjs +0 -844
  35. package/dist/chunk-VBLZWXVE.mjs +0 -318
  36. package/dist/chunk-ZASQBPOI.mjs +0 -2057
  37. package/dist/local-fs-handlers-P4WGW3QY.mjs +0 -235
  38. package/dist/vercel-LLXAHKVJ.mjs +0 -20
package/dist/index.mjs CHANGED
@@ -2,10 +2,10 @@ import "./chunk-TAXLUVIC.mjs";
2
2
  import {
3
3
  STORAGE_RPC_METHODS,
4
4
  handleStorageRpc
5
- } from "./chunk-VBLZWXVE.mjs";
5
+ } from "./chunk-GJETDXOU.mjs";
6
6
  import {
7
7
  getSandbox
8
- } from "./chunk-JEE2FQ4O.mjs";
8
+ } from "./chunk-ZWP7RQZT.mjs";
9
9
  import {
10
10
  agentMessageHook,
11
11
  agentWorkflow,
@@ -16,14 +16,14 @@ import {
16
16
  computeSessionUsage,
17
17
  normalizeSkillsDirs,
18
18
  resolveApiUrl
19
- } from "./chunk-ZASQBPOI.mjs";
20
- import "./chunk-TQRCSTCF.mjs";
19
+ } from "./chunk-M2XPBOZD.mjs";
20
+ import "./chunk-CQB6AOJ7.mjs";
21
21
  import "./chunk-64THY7Y7.mjs";
22
22
  import {
23
23
  DEFAULT_NAMESPACE,
24
24
  LOCAL_STORAGE_VERSION,
25
25
  getStorage
26
- } from "./chunk-GSRJYPWF.mjs";
26
+ } from "./chunk-2IIWVPZB.mjs";
27
27
  import {
28
28
  MessageNotFoundError,
29
29
  SandboxError,
@@ -35,6 +35,7 @@ import {
35
35
  import "./chunk-3ODWQVIA.mjs";
36
36
 
37
37
  // src/client.ts
38
+ import { getVercelOidcTokenSync } from "@vercel/oidc";
38
39
  import { all } from "better-all";
39
40
  import * as errore from "errore";
40
41
  import equal from "fast-deep-equal";
@@ -43,6 +44,9 @@ import { getRun, start } from "workflow/api";
43
44
 
44
45
  // src/rpc-dispatch.ts
45
46
  import { z } from "zod";
47
+ var builtinNeedsApproval = {
48
+ Bash: true
49
+ };
46
50
  function handleOverrideResult(res) {
47
51
  if (res === null) {
48
52
  return null;
@@ -113,13 +117,7 @@ async function dispatch(method, params, context, name) {
113
117
  });
114
118
  return { result: result2 };
115
119
  }
116
- if (!needsApproval) {
117
- return { result: false };
118
- }
119
- const entry = needsApproval[p.toolName];
120
- if (entry == null) {
121
- return { result: false };
122
- }
120
+ const entry = needsApproval?.[p.toolName] ?? builtinNeedsApproval[p.toolName] ?? false;
123
121
  if (typeof entry === "boolean") {
124
122
  return { result: entry };
125
123
  }
@@ -252,7 +250,7 @@ async function dispatch(method, params, context, name) {
252
250
  status: 400
253
251
  };
254
252
  }
255
- const sandboxInstance = getSandbox({
253
+ const sandboxInstance = await getSandbox({
256
254
  sandboxRecord: p.sandboxRecord,
257
255
  storageConfig,
258
256
  storage: getStorageInstance(),
@@ -395,11 +393,11 @@ async function handleStorageRequest({
395
393
  switch (config.type) {
396
394
  case "local": {
397
395
  const handlers = await getStorageHandlers(name);
398
- const { handleStorageRpc: handleStorageRpc2 } = await import("./handler-36FM5H35.mjs");
396
+ const { handleStorageRpc: handleStorageRpc2 } = await import("./handler-SZDTM3MC.mjs");
399
397
  return handleStorageRpc2(request, handlers);
400
398
  }
401
399
  case "vercel": {
402
- const { getVercelStorageConfig } = await import("./vercel-LLXAHKVJ.mjs");
400
+ const { getVercelStorageConfig } = await import("./vercel-WGN2NY3D.mjs");
403
401
  const resolved = await getVercelStorageConfig();
404
402
  return await proxyStorageRequest({
405
403
  url: resolved.url,
@@ -520,6 +518,13 @@ function toMessageAndParts({
520
518
  }
521
519
 
522
520
  // src/client.ts
521
+ var isVercel = () => {
522
+ try {
523
+ return Boolean(getVercelOidcTokenSync());
524
+ } catch {
525
+ return false;
526
+ }
527
+ };
523
528
  var agent = (options) => {
524
529
  const agentSecret = process.env.AGENT_SECRET;
525
530
  if (!agentSecret) {
@@ -527,7 +532,7 @@ var agent = (options) => {
527
532
  "AGENT_SECRET env var is required. Use withAgent() or set it manually."
528
533
  );
529
534
  }
530
- const baseStorageConfig = options.storage ?? { type: "vercel" };
535
+ const baseStorageConfig = options.storage ?? (isVercel() ? { type: "vercel" } : { type: "local" });
531
536
  const storageConfig = {
532
537
  ...baseStorageConfig,
533
538
  name: options.name ?? baseStorageConfig.name
@@ -552,7 +557,7 @@ var agent = (options) => {
552
557
  if (!storageHandlersPromise) {
553
558
  storageHandlersPromise = (async () => {
554
559
  const { join } = await import("node:path");
555
- const { createFilesystemHandlers } = await import("./local-fs-handlers-P4WGW3QY.mjs");
560
+ const { createFilesystemHandlers } = await import("./local-fs-handlers-BZVA3XAU.mjs");
556
561
  const basePath = storageConfig.path ?? ".agent-storage";
557
562
  const fullPath = join(basePath, name, LOCAL_STORAGE_VERSION);
558
563
  return createFilesystemHandlers(fullPath);
@@ -560,8 +565,32 @@ var agent = (options) => {
560
565
  }
561
566
  return storageHandlersPromise;
562
567
  };
568
+ const agentSandboxOption = options.sandbox;
569
+ const sandboxSetup = agentSandboxOption && typeof agentSandboxOption !== "string" ? agentSandboxOption.setup : void 0;
570
+ const sandboxOnRestart = agentSandboxOption && typeof agentSandboxOption !== "string" ? agentSandboxOption.onRestart : void 0;
563
571
  const sandbox = async (sandboxId, opts) => {
564
572
  const existingRecord = await getStorageInstance().sandbox.get(sandboxId);
573
+ const resolvedSetup = opts?.setup && sandboxSetup ? {
574
+ key: `${sandboxSetup.key}:${opts.setup.key}`,
575
+ run: async (sbx) => {
576
+ await sandboxSetup.run(sbx);
577
+ await opts.setup?.run(sbx);
578
+ }
579
+ } : opts?.setup ?? sandboxSetup;
580
+ const resolvedOnRestart = opts?.onRestart && sandboxOnRestart ? async (sbx) => {
581
+ await sandboxOnRestart(sbx);
582
+ await opts.onRestart?.(sbx);
583
+ } : opts?.onRestart ?? sandboxOnRestart;
584
+ const resolveConfig = () => {
585
+ if (opts?.config) {
586
+ return opts.config;
587
+ }
588
+ if (typeof options.sandbox === "string" || !options.sandbox) {
589
+ return isVercel() ? { type: "vercel" } : { type: "local" };
590
+ }
591
+ const { setup: _s, onRestart: _r, ...rest } = options.sandbox;
592
+ return rest;
593
+ };
565
594
  if (existingRecord instanceof Error) {
566
595
  if (!(existingRecord instanceof SandboxNotFoundError)) {
567
596
  throw existingRecord;
@@ -573,27 +602,31 @@ var agent = (options) => {
573
602
  acquiringLockId: null,
574
603
  createdAt: Date.now(),
575
604
  lastActivityAt: Date.now(),
576
- config: opts?.config ?? (typeof options.sandbox === "string" ? void 0 : options.sandbox) ?? { type: "vercel" }
605
+ config: resolveConfig()
577
606
  });
578
607
  if (sandboxRecord instanceof Error) {
579
608
  throw sandboxRecord;
580
609
  }
581
- return getSandbox({
610
+ return await getSandbox({
582
611
  storageConfig,
583
612
  sandboxRecord,
584
613
  storage: getStorageInstance(),
585
- rpc: agentObj.rpc
614
+ rpc: agentObj.rpc,
615
+ setup: resolvedSetup,
616
+ onRestart: resolvedOnRestart
586
617
  });
587
618
  }
588
619
  const newConfig = opts?.config ?? existingRecord.config;
589
620
  if (!equal(existingRecord.config, newConfig)) {
590
621
  console.warn("sandbox config changes are not supported");
591
622
  }
592
- return getSandbox({
623
+ return await getSandbox({
593
624
  storageConfig,
594
625
  sandboxRecord: existingRecord,
595
626
  storage: getStorageInstance(),
596
- rpc: agentObj.rpc
627
+ rpc: agentObj.rpc,
628
+ setup: resolvedSetup,
629
+ onRestart: resolvedOnRestart
597
630
  });
598
631
  };
599
632
  const agentObj = {
@@ -604,9 +637,28 @@ var agent = (options) => {
604
637
  // biome-ignore lint/style/noNestedTernary: ok
605
638
  session instanceof Error ? `sandbox_${ulid2()}` : session.sandboxId ?? `sandbox_${ulid2()}`
606
639
  );
640
+ const hasSessionSandbox = sessionOptions?.sandbox != null;
641
+ let sessionSetup;
642
+ let sessionOnRestart;
643
+ const sandboxConfig = typeof sandboxInput === "string" || !sandboxInput ? void 0 : (() => {
644
+ const {
645
+ setup: _s,
646
+ onRestart: _r,
647
+ ...rest
648
+ } = sandboxInput;
649
+ if (hasSessionSandbox) {
650
+ sessionSetup = _s;
651
+ sessionOnRestart = _r;
652
+ }
653
+ return rest;
654
+ })();
607
655
  const sandboxPromise = sandbox(
608
656
  sandboxId,
609
- typeof sandboxInput === "string" ? void 0 : { config: sandboxInput }
657
+ sandboxConfig ? {
658
+ config: sandboxConfig,
659
+ setup: sessionSetup,
660
+ onRestart: sessionOnRestart
661
+ } : void 0
610
662
  );
611
663
  const existingSession = session instanceof Error ? null : session;
612
664
  const skillsDir = sessionOptions?.skillsDir ?? existingSession?.skillsDir ?? options.skillsDir ?? null;
@@ -947,6 +999,26 @@ var agent = (options) => {
947
999
  return messagesResult;
948
1000
  }
949
1001
  return computeSessionUsage(messagesResult.items);
1002
+ },
1003
+ update: async (updateOptions) => {
1004
+ const current = await getStorageInstance().session.get(sessionId);
1005
+ if (current instanceof Error) {
1006
+ return current;
1007
+ }
1008
+ const updated = {
1009
+ ...current,
1010
+ ...updateOptions,
1011
+ updatedAt: Date.now(),
1012
+ skillsDir: updateOptions.skillsDir ? normalizeSkillsDirs(updateOptions.skillsDir) : current.skillsDir
1013
+ };
1014
+ if (equal(updated, current)) {
1015
+ return void 0;
1016
+ }
1017
+ const result = await getStorageInstance().session.set(updated);
1018
+ if (result instanceof Error) {
1019
+ return result;
1020
+ }
1021
+ return void 0;
950
1022
  }
951
1023
  };
952
1024
  },
@@ -1032,4 +1104,4 @@ export {
1032
1104
  builtinToolNames,
1033
1105
  handleStorageRpc
1034
1106
  };
1035
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaWVudC50cyIsICIuLi9zcmMvcnBjLWRpc3BhdGNoLnRzIiwgIi4uL3NyYy91dGlscy9tZXNzYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7XG4gIEdhdGV3YXlNb2RlbElkLFxuICBJbmZlclRvb2xJbnB1dCxcbiAgSW5mZXJVSVRvb2xzLFxuICBNb2RlbE1lc3NhZ2UsXG4gIFRvb2xTZXQsXG4gIFVJRGF0YVR5cGVzLFxuICBVSU1lc3NhZ2UsXG4gIFVJTWVzc2FnZUNodW5rLFxufSBmcm9tIFwiYWlcIjtcbmltcG9ydCB7IGFsbCB9IGZyb20gXCJiZXR0ZXItYWxsXCI7XG5pbXBvcnQgKiBhcyBlcnJvcmUgZnJvbSBcImVycm9yZVwiO1xuaW1wb3J0IGVxdWFsIGZyb20gXCJmYXN0LWRlZXAtZXF1YWxcIjtcbmltcG9ydCB7IHVsaWQgfSBmcm9tIFwidWxpZFwiO1xuaW1wb3J0IHsgZ2V0UnVuLCBzdGFydCB9IGZyb20gXCJ3b3JrZmxvdy9hcGlcIjtcbmltcG9ydCB0eXBlIHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB7XG4gIHR5cGUgQWdlbnRJbnB1dCxcbiAgdHlwZSBBZ2VudE1lc3NhZ2VJbnB1dCxcbiAgYWdlbnRNZXNzYWdlSG9vayxcbiAgYWdlbnRXb3JrZmxvdyxcbiAgYXBwcm92YWxIb29rLFxufSBmcm9tIFwiLi9hZ2VudC13b3JrZmxvd1wiO1xuaW1wb3J0IHtcbiAgU2FuZGJveE5vdEZvdW5kRXJyb3IsXG4gIFNlc3Npb25FcnJvcixcbiAgU2Vzc2lvbk5vdEZvdW5kRXJyb3IsXG59IGZyb20gXCIuL2Vycm9yc1wiO1xuaW1wb3J0IHR5cGUgeyBHZW5lcmF0aW9uT3B0aW9ucyB9IGZyb20gXCIuL2dlbmVyYXRpb25cIjtcbmltcG9ydCB7XG4gIHR5cGUgRGlzcGF0Y2hDb250ZXh0LFxuICBkaXNwYXRjaCxcbiAgdHlwZSBIb29rVG9vbEFmdGVyUGFyYW1zLFxuICB0eXBlIEhvb2tUb29sQWZ0ZXJSZXN1bHQsXG4gIHR5cGUgSG9va1Rvb2xCZWZvcmVQYXJhbXMsXG4gIHR5cGUgSG9va1Rvb2xCZWZvcmVSZXN1bHQsXG4gIHR5cGUgVG9vbE1ldGFkYXRhLFxuICB0eXBlIFRvb2xzRXhlY3V0ZVBhcmFtcyxcbiAgdHlwZSBUb29sc05lZWRzQXBwcm92YWxQYXJhbXMsXG4gIHR5cGUgVG9vbHNOZWVkc0FwcHJvdmFsUmVzdWx0LFxufSBmcm9tIFwiLi9ycGMtZGlzcGF0Y2hcIjtcbmltcG9ydCB7IGdldFNhbmRib3ggfSBmcm9tIFwiLi9zYW5kYm94XCI7XG5pbXBvcnQgeyBub3JtYWxpemVTa2lsbHNEaXJzIH0gZnJvbSBcIi4vc2tpbGxzL3BhcnNlclwiO1xuaW1wb3J0IHR5cGUgeyBTa2lsbHNEaXIgfSBmcm9tIFwiLi9za2lsbHMvdHlwZXNcIjtcbmltcG9ydCB7XG4gIHR5cGUgU3RvcmFnZSBhcyBBZ2VudFN0b3JhZ2UsXG4gIERFRkFVTFRfTkFNRVNQQUNFLFxuICBnZXRTdG9yYWdlLFxuICBMT0NBTF9TVE9SQUdFX1ZFUlNJT04sXG4gIHR5cGUgTWVzc2FnZSxcbiAgdHlwZSBQYXJ0LFxuICB0eXBlIFNhbmRib3hDb25maWcsXG4gIHR5cGUgU2Vzc2lvbixcbiAgdHlwZSBTdG9yYWdlQ29uZmlnLFxuICB0eXBlIEhhbmRsZXJzIGFzIFN0b3JhZ2VIYW5kbGVycyxcbiAgdHlwZSBTdG9yYWdlTWV0aG9kcyxcbn0gZnJvbSBcIi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgdHlwZSBCdWlsdEluVG9vbE5hbWUsIGJ1aWx0SW5Ub29scywgdHlwZSBUb29sQ29udGV4dCB9IGZyb20gXCIuL3Rvb2xzXCI7XG5pbXBvcnQgeyB0b01lc3NhZ2VBbmRQYXJ0cyB9IGZyb20gXCIuL3V0aWxzL21lc3NhZ2VcIjtcbmltcG9ydCB7IGFzc2VtYmxlVUlNZXNzYWdlcyB9IGZyb20gXCIuL3V0aWxzL3VpXCI7XG5pbXBvcnQgeyBjb21wdXRlU2Vzc2lvblVzYWdlLCB0eXBlIFNlc3Npb25Vc2FnZSB9IGZyb20gXCIuL3V0aWxzL3VzYWdlXCI7XG5cbmV4cG9ydCB0eXBlIFNlbmRJbnB1dCA9XG4gIHwgc3RyaW5nXG4gIHwgeyByb2xlPzogVUlNZXNzYWdlW1wicm9sZVwiXTsgcGFydHM6IFVJTWVzc2FnZVtcInBhcnRzXCJdOyBpZD86IHN0cmluZyB9O1xuXG4vKipcbiAqIEluZmVyIGEgdHlwZWQgVUlNZXNzYWdlIGZyb20gYW4gYWdlbnQgaW5zdGFuY2UuXG4gKiBUb29sIHBhcnRzIGFyZSBkaXNjcmltaW5hdGVkIGJ5IGB0eXBlOiBcInRvb2wtJHtuYW1lfVwiYCB3aXRoIHR5cGVkIGlucHV0L291dHB1dC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IG15QWdlbnQgPSBhZ2VudCh7IHRvb2xzOiB7IG15VG9vbDogdG9vbCh7Li4ufSkgfSB9KTtcbiAqIHR5cGUgTXlNZXNzYWdlID0gSW5mZXJVSU1lc3NhZ2U8dHlwZW9mIG15QWdlbnQ+O1xuICogLy8gTXlNZXNzYWdlLnBhcnRzIGluY2x1ZGVzIHsgdHlwZTogXCJ0b29sLW15VG9vbFwiOyBpbnB1dDogTXlJbnB1dDsgb3V0cHV0OiBNeU91dHB1dDsgLi4uIH1cbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBJbmZlclVJTWVzc2FnZTxBPiA9IEEgZXh0ZW5kcyB7IHRvb2xzOiBpbmZlciBUIGV4dGVuZHMgVG9vbFNldCB9XG4gID8gVUlNZXNzYWdlPHVua25vd24sIFVJRGF0YVR5cGVzLCBJbmZlclVJVG9vbHM8VD4+XG4gIDogVUlNZXNzYWdlO1xuXG50eXBlIFRvb2xOYW1lPFRvb2xzPiA9IEV4dHJhY3Q8a2V5b2YgVG9vbHMsIHN0cmluZz4gfCBCdWlsdEluVG9vbE5hbWU7XG5cbnR5cGUgVG9vbElucHV0PFRvb2xzLCBLPiA9IEsgZXh0ZW5kcyBCdWlsdEluVG9vbE5hbWVcbiAgPyBJbmZlclRvb2xJbnB1dDwodHlwZW9mIGJ1aWx0SW5Ub29scylbS10+XG4gIDogSyBleHRlbmRzIGtleW9mIFRvb2xzXG4gICAgPyBUb29sc1tLXSBleHRlbmRzIGltcG9ydChcImFpXCIpLlRvb2xcbiAgICAgID8gSW5mZXJUb29sSW5wdXQ8VG9vbHNbS10+XG4gICAgICA6IHVua25vd25cbiAgICA6IHVua25vd247XG5cbmV4cG9ydCB0eXBlIE5lZWRzQXBwcm92YWxNYXA8VG9vbHM+ID0ge1xuICBbSyBpbiBUb29sTmFtZTxUb29scz5dPzpcbiAgICB8IGJvb2xlYW5cbiAgICB8ICgoXG4gICAgICAgIGlucHV0OiBUb29sSW5wdXQ8VG9vbHMsIEs+LFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgdG9vbENhbGxJZDogc3RyaW5nO1xuICAgICAgICAgIG1lc3NhZ2VzOiBNb2RlbE1lc3NhZ2VbXTtcbiAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dDogdW5rbm93bjtcbiAgICAgICAgfVxuICAgICAgKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik7XG59O1xuXG4vKipcbiAqIE9wdGlvbnMgdGhhdCBjYW4gYmUgc2V0IHBlci1zZXNzaW9uLCBvdmVycmlkaW5nIGFnZW50LWxldmVsIGRlZmF1bHRzLlxuICovXG5leHBvcnQgdHlwZSBTZXNzaW9uT3B0aW9uczxcbiAgVG9vbHMgZXh0ZW5kcyBUb29sU2V0LFxuICBUVGFncyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgbmV2ZXI+LFxuPiA9IHtcbiAgLyoqIFRoZSBBSSBtb2RlbCB0byB1c2UuICovXG4gIG1vZGVsPzogR2F0ZXdheU1vZGVsSWQ7XG4gIC8qKiBTeXN0ZW0gcHJvbXB0IGZvciB0aGUgQUkgbW9kZWwuICovXG4gIHN5c3RlbT86IHN0cmluZztcbiAgLyoqIFNhbmRib3ggY29uZmlndXJhdGlvbiBvciBJRC4gSWYgc3RyaW5nLCB1c2VzIGFzIHNhbmRib3ggSUQgd2l0aCBpdHMgY29uZmlnLiAqL1xuICBzYW5kYm94PzogU2FuZGJveENvbmZpZyB8IHN0cmluZztcbiAgLyoqIEtleS12YWx1ZSBtZXRhZGF0YSB0YWdzIGZvciB0aGUgc2Vzc2lvbi4gKi9cbiAgdGFncz86IFRUYWdzO1xuICAvKiogRGlyZWN0b3J5IGNvbnRhaW5pbmcgc2tpbGwgZGVmaW5pdGlvbnMgZm9yIHRoZSBhZ2VudC4gKi9cbiAgc2tpbGxzRGlyPzogU2tpbGxzRGlyO1xuICAvKipcbiAgICogTmFtZXMgb2YgdG9vbHMgdG8gYWN0aXZhdGUgZm9yIHRoaXMgc2Vzc2lvbi5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgYWxsIGFnZW50LWxldmVsIHRvb2xzIGFyZSBhY3RpdmUuXG4gICAqIFVzZSB0aGlzIHRvIHJlc3RyaWN0IHdoaWNoIHRvb2xzIGFyZSBhdmFpbGFibGUgcGVyLXNlc3Npb24uXG4gICAqL1xuICBhY3RpdmVUb29scz86IChFeHRyYWN0PGtleW9mIFRvb2xzLCBzdHJpbmc+IHwgQnVpbHRJblRvb2xOYW1lKVtdO1xuICAvKiogR2VuZXJhdGlvbiBvcHRpb25zICh0ZW1wZXJhdHVyZSwgbWF4U3RlcHMsIGV0Yy4pLiBPdmVycmlkZXMgYWdlbnQtbGV2ZWwgZGVmYXVsdHMuICovXG4gIGdlbmVyYXRpb24/OiBHZW5lcmF0aW9uT3B0aW9ucztcbn07XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBjcmVhdGluZyBhbiBhZ2VudCBpbnN0YW5jZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGNvbnN0IG15QWdlbnQgPSBhZ2VudCh7XG4gKiAgIG1vZGVsOiBcImFudGhyb3BpYy9jbGF1ZGUtb3B1cy00LjVcIixcbiAqICAgc3lzdGVtOiBcIllvdSBhcmUgYSBoZWxwZnVsIGFzc2lzdGFudC4uLlwiLFxuICogICB0YWdzU2NoZW1hOiB6Lm9iamVjdCh7IHVzZXJJZDogei5zdHJpbmcoKSB9KSxcbiAqICAgY29udGV4dFNjaGVtYTogei5vYmplY3QoeyBhdXRoVG9rZW46IHouc3RyaW5nKCkgfSksXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgdHlwZSBBZ2VudE9wdGlvbnM8XG4gIFRvb2xzIGV4dGVuZHMgVG9vbFNldCxcbiAgVFRhZ3MgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbiAgVENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbj4gPSB7XG4gIC8qKlxuICAgKiBBZ2VudCBuYW1lLiBVc2VkIHRvIGlzb2xhdGUgc3RvcmFnZSBkYXRhIC0gZGlmZmVyZW50IG5hbWVzIGhhdmUgc2VwYXJhdGUgZGF0YS5cbiAgICogQGRlZmF1bHQgXCJkZWZhdWx0XCJcbiAgICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTdG9yYWdlIGJhY2tlbmQgY29uZmlndXJhdGlvbi5cbiAgICogLSBgeyB0eXBlOiBcImxvY2FsXCIgfWAgLSBmaWxlc3lzdGVtIHN0b3JhZ2UgKGRldilcbiAgICogLSBgeyB0eXBlOiBcInZlcmNlbFwiIH1gIC0gVmVyY2VsIG1hbmFnZWQgc3RvcmFnZSAocHJvZClcbiAgICogLSBgeyB0eXBlOiBcImN1c3RvbVwiLCB1cmw6IFwiLi4uXCIgfWAgLSBjdXN0b20gSFRUUCBiYWNrZW5kXG4gICAqIEBkZWZhdWx0IHsgdHlwZTogXCJ2ZXJjZWxcIiB9XG4gICAqL1xuICBzdG9yYWdlPzogU3RvcmFnZUNvbmZpZztcbiAgLyoqXG4gICAqIEN1c3RvbSB0b29scyBhdmFpbGFibGUgdG8gdGhlIGFnZW50LlxuICAgKiBUaGVzZSBhcmUgZXhwb3NlZCB2aWEgdGhlIFJQQyBoYW5kbGVyIGFuZCBjYWxsZWQgb3ZlciBIVFRQLlxuICAgKi9cbiAgdG9vbHM/OiBUb29scztcbiAgLyoqXG4gICAqIEhvb2tzIGZvciBpbnRlcmNlcHRpbmcgYWdlbnQgb3BlcmF0aW9ucy5cbiAgICovXG4gIGhvb2tzPzogQWdlbnRIb29rcztcbiAgLyoqXG4gICAqIFNjaGVtYSBmb3Igc2Vzc2lvbiB0YWdzLiBBbGwgc2Vzc2lvbnMgc2hhcmUgdGhpcyBzY2hlbWEuXG4gICAqIFRhZ3MgYXJlIHBlcnNpc3RlZCBpbiBzdG9yYWdlIGFuZCBzdXJ2aXZlIGFjcm9zcyByZXF1ZXN0cy5cbiAgICovXG4gIHRhZ3NTY2hlbWE/OiB6LlpvZFR5cGU8VFRhZ3M+O1xuICAvKipcbiAgICogU2NoZW1hIGZvciB0cmFuc2llbnQgdG9vbCBjb250ZXh0LiBQYXNzZWQgcGVyLXJlcXVlc3QgdmlhIHNlbmQoKS5cbiAgICogTk9UIHBlcnNpc3RlZCAtIHVzZSBmb3Igc2VjcmV0cyBsaWtlIGF1dGggdG9rZW5zLlxuICAgKi9cbiAgY29udGV4dFNjaGVtYT86IHouWm9kVHlwZTxUQ29udGV4dD47XG4gIC8qKlxuICAgKiBBcHByb3ZhbCBydWxlcyBmb3IgdG9vbHMgeW91IGRvbid0IG93biAoYnVpbHQtaW4gb3IgdGhpcmQtcGFydHkpLlxuICAgKiBNYXBzIHRvb2wgbmFtZXMgdG8gYSBib29sZWFuIG9yIGEgZnVuY3Rpb24gdGhhdCBkZWNpZGVzIHdoZXRoZXIgdG8gYXNrLlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBuZWVkc0FwcHJvdmFsOiB7XG4gICAqICAgQmFzaDogKGlucHV0KSA9PiBpbnB1dC5jb21tYW5kLnN0YXJ0c1dpdGgoXCJybVwiKSxcbiAgICogICBXcml0ZTogdHJ1ZSxcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIG5lZWRzQXBwcm92YWw/OiBOZWVkc0FwcHJvdmFsTWFwPFRvb2xzPjtcbn0gJiBPbWl0PFNlc3Npb25PcHRpb25zPFRvb2xzLCBUVGFncz4sIFwidGFnc1wiPjtcblxuLyoqXG4gKiBCYXNlIHR5cGUgZm9yIHNlc3Npb24vc2FuZGJveCB0YWdzLiBVc2VkIGZvciBnZW5lcmljIGNvbnN0cmFpbnRzLlxuICogRm9yIGFnZW50LWxldmVsIHRhZyB2YWxpZGF0aW9uLCB1c2UgYHRhZ3NTY2hlbWFgIG9wdGlvbiB3aXRoIGEgem9kIHNjaGVtYS5cbiAqL1xuZXhwb3J0IHR5cGUgVGFnc1NjaGVtYSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIEhvb2tzIGZvciBpbnRlcmNlcHRpbmcgYWdlbnQgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgQWdlbnRIb29rcyA9IHtcbiAgLyoqIENhbGxlZCBiZWZvcmUgYSB0b29sIGlzIGV4ZWN1dGVkLiBDYW4gbW9kaWZ5IGlucHV0IG9yIHRocm93IHRvIGJsb2NrLiAqL1xuICBcInRvb2wuYmVmb3JlXCI/OiAob3B0czoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBpbnB1dDogdW5rbm93bjtcbiAgICBjb250ZXh0OiBUb29sQ29udGV4dDtcbiAgfSkgPT4gUHJvbWlzZTx1bmRlZmluZWQgfCB7IGlucHV0OiB1bmtub3duIH0+O1xuICAvKiogQ2FsbGVkIGFmdGVyIGEgdG9vbCBpcyBleGVjdXRlZC4gQ2FuIG1vZGlmeSByZXN1bHQuICovXG4gIFwidG9vbC5hZnRlclwiPzogKG9wdHM6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgaW5wdXQ6IHVua25vd247XG4gICAgcmVzdWx0OiB1bmtub3duO1xuICAgIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xuICB9KSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IHsgcmVzdWx0OiB1bmtub3duIH0+O1xufTtcblxuLyoqXG4gKiBSUEMgcmVxdWVzdCBib2R5IGZvciBhZ2VudCBoYW5kbGVyLlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiBvbiBgbWV0aG9kYCBmb3IgdHlwZS1zYWZlIHBhcmFtcy5cbiAqL1xuZXhwb3J0IHR5cGUgQWdlbnRScGNSZXF1ZXN0ID0ge1xuICBbSyBpbiBrZXlvZiBBZ2VudFJwY01ldGhvZHNdOiB7XG4gICAgbWV0aG9kOiBLO1xuICAgIHBhcmFtczogQWdlbnRScGNNZXRob2RzW0tdW1wicGFyYW1zXCJdO1xuICB9O1xufVtrZXlvZiBBZ2VudFJwY01ldGhvZHNdO1xuXG4vKipcbiAqIFJQQyByZXNwb25zZSB0eXBlIGZvciBkaXNwYXRjaC5cbiAqL1xuZXhwb3J0IHR5cGUgUnBjUmVzdWx0PFQgPSB1bmtub3duPiA9XG4gIHwgeyByZXN1bHQ6IFQgfVxuICB8IHsgZXJyb3I6IHsgY29kZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfTsgc3RhdHVzPzogbnVtYmVyIH07XG5cbi8qKlxuICogRGlyZWN0IFJQQyBwYXlsb2FkIGZvciBzdGVwIGZ1bmN0aW9uIGNhbGxzIChubyBIVFRQKS5cbiAqL1xuZXhwb3J0IHR5cGUgUnBjUGF5bG9hZCA9IHtcbiAgbmFtZT86IHN0cmluZztcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHBhcmFtczogdW5rbm93bjtcbn07XG5cbi8qKlxuICogQWxsIFJQQyBtZXRob2RzIGF2YWlsYWJsZSBvbiB0aGUgYWdlbnQgaGFuZGxlci5cbiAqIENvbWJpbmVzIHRvb2xzIG1ldGhvZHMsIGhvb2tzLCBhbmQgc3RvcmFnZSBtZXRob2RzLlxuICovXG5leHBvcnQgdHlwZSBBZ2VudFJwY01ldGhvZHMgPSB7XG4gIFwidG9vbHMubGlzdFwiOiB7IHBhcmFtczogUmVjb3JkPHN0cmluZywgbmV2ZXI+OyByZXN1bHQ6IFRvb2xNZXRhZGF0YVtdIH07XG4gIFwidG9vbHMuZXhlY3V0ZVwiOiB7IHBhcmFtczogVG9vbHNFeGVjdXRlUGFyYW1zOyByZXN1bHQ6IHVua25vd24gfTtcbiAgXCJ0b29scy5uZWVkc0FwcHJvdmFsXCI6IHtcbiAgICBwYXJhbXM6IFRvb2xzTmVlZHNBcHByb3ZhbFBhcmFtcztcbiAgICByZXN1bHQ6IFRvb2xzTmVlZHNBcHByb3ZhbFJlc3VsdDtcbiAgfTtcbiAgXCJob29rLnRvb2wuYmVmb3JlXCI6IHtcbiAgICBwYXJhbXM6IEhvb2tUb29sQmVmb3JlUGFyYW1zO1xuICAgIHJlc3VsdDogSG9va1Rvb2xCZWZvcmVSZXN1bHQ7XG4gIH07XG4gIFwiaG9vay50b29sLmFmdGVyXCI6IHtcbiAgICBwYXJhbXM6IEhvb2tUb29sQWZ0ZXJQYXJhbXM7XG4gICAgcmVzdWx0OiBIb29rVG9vbEFmdGVyUmVzdWx0O1xuICB9O1xufSAmIFN0b3JhZ2VNZXRob2RzO1xuXG5leHBvcnQgdHlwZSBBZ2VudFJwY01ldGhvZE5hbWUgPSBrZXlvZiBBZ2VudFJwY01ldGhvZHM7XG5cbi8qKlxuICogUmVzdWx0IHR5cGUgZm9yIFJQQyBvdmVycmlkZSBoYW5kbGVycy5cbiAqIC0gYHsgb2s6IHRydWU7IHJlc3VsdDogVCB9YCAtIHJldHVybiB0aGlzIHJlc3VsdFxuICogLSBgeyBvazogZmFsc2U7IGVycm9yOiBzdHJpbmcgfWAgLSByZXR1cm4gdGhpcyBlcnJvclxuICogLSBgbnVsbGAgLSB1c2UgZGVmYXVsdCBoYW5kbGVyXG4gKi9cbmV4cG9ydCB0eXBlIEFnZW50UnBjUmVzdWx0PFQ+ID1cbiAgfCB7IG9rOiB0cnVlOyByZXN1bHQ6IFQgfVxuICB8IHsgb2s6IGZhbHNlOyBlcnJvcjogc3RyaW5nIH1cbiAgfCBudWxsO1xuXG4vKipcbiAqIE92ZXJyaWRlIGhhbmRsZXJzIGZvciBhZ2VudCBSUEMgbWV0aG9kcy5cbiAqIEVhY2ggbWV0aG9kIGNhbiBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbi5cbiAqIFJldHVybiBgbnVsbGAgdG8gZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IGhhbmRsZXIuXG4gKi9cbmV4cG9ydCB0eXBlIEFnZW50UnBjT3ZlcnJpZGVzID0ge1xuICBbSyBpbiBBZ2VudFJwY01ldGhvZE5hbWVdPzogKFxuICAgIHBhcmFtczogQWdlbnRScGNNZXRob2RzW0tdW1wicGFyYW1zXCJdXG4gICkgPT4gUHJvbWlzZTxBZ2VudFJwY1Jlc3VsdDxBZ2VudFJwY01ldGhvZHNbS11bXCJyZXN1bHRcIl0+Pjtcbn07XG5cbmV4cG9ydCBjb25zdCBhZ2VudCA9IDxcbiAgVG9vbHMgZXh0ZW5kcyB7fSxcbiAgVFRhZ3MgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbiAgVENvbnRleHQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IFJlY29yZDxzdHJpbmcsIG5ldmVyPixcbj4oXG4gIG9wdGlvbnM6IEFnZW50T3B0aW9uczxUb29scywgVFRhZ3MsIFRDb250ZXh0PlxuKSA9PiB7XG4gIGNvbnN0IGFnZW50U2VjcmV0ID0gcHJvY2Vzcy5lbnYuQUdFTlRfU0VDUkVUO1xuICBpZiAoIWFnZW50U2VjcmV0KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgXCJBR0VOVF9TRUNSRVQgZW52IHZhciBpcyByZXF1aXJlZC4gVXNlIHdpdGhBZ2VudCgpIG9yIHNldCBpdCBtYW51YWxseS5cIlxuICAgICk7XG4gIH1cblxuICBjb25zdCBiYXNlU3RvcmFnZUNvbmZpZyA9IG9wdGlvbnMuc3RvcmFnZSA/PyB7IHR5cGU6IFwidmVyY2VsXCIgfTtcbiAgY29uc3Qgc3RvcmFnZUNvbmZpZzogU3RvcmFnZUNvbmZpZyA9IHtcbiAgICAuLi5iYXNlU3RvcmFnZUNvbmZpZyxcbiAgICBuYW1lOiBvcHRpb25zLm5hbWUgPz8gYmFzZVN0b3JhZ2VDb25maWcubmFtZSxcbiAgfTtcblxuICAvKipcbiAgICogU3RvcmFnZSBpcyBpbml0aWFsaXplZCBsYXppbHkuXG4gICAqIFVzZXMgYWdlbnRPYmoucnBjIHdoaWNoIGlzIHdpcmVkIHVwIGJ5IHRoZSBsb2FkZXIgY2FsbGluZyBfX2luaXRBZ2VudC5cbiAgICovXG4gIGxldCBfc3RvcmFnZTogQWdlbnRTdG9yYWdlIHwgbnVsbCA9IG51bGw7XG4gIGNvbnN0IGdldFN0b3JhZ2VJbnN0YW5jZSA9ICgpOiBBZ2VudFN0b3JhZ2UgPT4ge1xuICAgIGlmICghX3N0b3JhZ2UpIHtcbiAgICAgIF9zdG9yYWdlID0gZ2V0U3RvcmFnZSh7XG4gICAgICAgIGNvbmZpZzogc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgcnBjOiBhZ2VudE9iai5ycGMsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIF9zdG9yYWdlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBMYXp5LWluaXRpYWxpemVkIHN0b3JhZ2UgaGFuZGxlcnMgZm9yIGxvY2FsIHN0b3JhZ2UuXG4gICAqIENyZWF0ZWQgb24gZmlyc3Qgc3RvcmFnZSBSUEMgcmVxdWVzdC5cbiAgICovXG4gIGxldCBzdG9yYWdlSGFuZGxlcnNQcm9taXNlOiBQcm9taXNlPFN0b3JhZ2VIYW5kbGVycz4gfCBudWxsID0gbnVsbDtcbiAgY29uc3QgZ2V0U3RvcmFnZUhhbmRsZXJzID0gKG5hbWU6IHN0cmluZyk6IFByb21pc2U8U3RvcmFnZUhhbmRsZXJzPiA9PiB7XG4gICAgaWYgKHN0b3JhZ2VDb25maWcudHlwZSAhPT0gXCJsb2NhbFwiKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBFcnJvcihcIlN0b3JhZ2UgaGFuZGxlcnMgb25seSBhdmFpbGFibGUgZm9yIGxvY2FsIHN0b3JhZ2VcIilcbiAgICAgICk7XG4gICAgfVxuICAgIGlmICghc3RvcmFnZUhhbmRsZXJzUHJvbWlzZSkge1xuICAgICAgc3RvcmFnZUhhbmRsZXJzUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgam9pbiB9ID0gYXdhaXQgaW1wb3J0KFwibm9kZTpwYXRoXCIpO1xuICAgICAgICBjb25zdCB7IGNyZWF0ZUZpbGVzeXN0ZW1IYW5kbGVycyB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAgIFwiLi9zdG9yYWdlL2JpbmRpbmdzL2xvY2FsLWZzLWhhbmRsZXJzXCJcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgYmFzZVBhdGggPSBzdG9yYWdlQ29uZmlnLnBhdGggPz8gXCIuYWdlbnQtc3RvcmFnZVwiO1xuICAgICAgICBjb25zdCBmdWxsUGF0aCA9IGpvaW4oYmFzZVBhdGgsIG5hbWUsIExPQ0FMX1NUT1JBR0VfVkVSU0lPTik7XG4gICAgICAgIHJldHVybiBjcmVhdGVGaWxlc3lzdGVtSGFuZGxlcnMoZnVsbFBhdGgpO1xuICAgICAgfSkoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN0b3JhZ2VIYW5kbGVyc1Byb21pc2U7XG4gIH07XG5cbiAgY29uc3Qgc2FuZGJveCA9IGFzeW5jIChcbiAgICBzYW5kYm94SWQ6IHN0cmluZyxcbiAgICBvcHRzPzogeyBjb25maWc/OiBTYW5kYm94Q29uZmlnOyB0YWdzPzogVFRhZ3MgfVxuICApID0+IHtcbiAgICBjb25zdCBleGlzdGluZ1JlY29yZCA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNhbmRib3guZ2V0KHNhbmRib3hJZCk7XG5cbiAgICBpZiAoZXhpc3RpbmdSZWNvcmQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgaWYgKCEoZXhpc3RpbmdSZWNvcmQgaW5zdGFuY2VvZiBTYW5kYm94Tm90Rm91bmRFcnJvcikpIHtcbiAgICAgICAgdGhyb3cgZXhpc3RpbmdSZWNvcmQ7XG4gICAgICB9XG4gICAgICBjb25zdCBzYW5kYm94UmVjb3JkID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2FuZGJveC5zZXQoe1xuICAgICAgICBpZDogc2FuZGJveElkLFxuICAgICAgICB0YWdzOiBvcHRzPy50YWdzID8/IG51bGwsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tBdDogbnVsbCxcbiAgICAgICAgYWNxdWlyaW5nTG9ja0lkOiBudWxsLFxuICAgICAgICBjcmVhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgIGxhc3RBY3Rpdml0eUF0OiBEYXRlLm5vdygpLFxuICAgICAgICBjb25maWc6IG9wdHM/LmNvbmZpZyA/P1xuICAgICAgICAgICh0eXBlb2Ygb3B0aW9ucy5zYW5kYm94ID09PSBcInN0cmluZ1wiXG4gICAgICAgICAgICA/IHVuZGVmaW5lZFxuICAgICAgICAgICAgOiBvcHRpb25zLnNhbmRib3gpID8/IHsgdHlwZTogXCJ2ZXJjZWxcIiB9LFxuICAgICAgfSk7XG4gICAgICBpZiAoc2FuZGJveFJlY29yZCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHRocm93IHNhbmRib3hSZWNvcmQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0U2FuZGJveDxUVGFncz4oe1xuICAgICAgICBzdG9yYWdlQ29uZmlnLFxuICAgICAgICBzYW5kYm94UmVjb3JkLFxuICAgICAgICBzdG9yYWdlOiBnZXRTdG9yYWdlSW5zdGFuY2UoKSxcbiAgICAgICAgcnBjOiBhZ2VudE9iai5ycGMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb25maWcgPSBvcHRzPy5jb25maWcgPz8gZXhpc3RpbmdSZWNvcmQuY29uZmlnO1xuICAgIGlmICghZXF1YWwoZXhpc3RpbmdSZWNvcmQuY29uZmlnLCBuZXdDb25maWcpKSB7XG4gICAgICAvLyB0aHJvdyBuZXcgU2FuZGJveEVycm9yKHtcbiAgICAgIC8vICAgcmVhc29uOiBcInNhbmRib3ggY29uZmlnIGNoYW5nZXMgYXJlIG5vdCBzdXBwb3J0ZWRcIixcbiAgICAgIC8vIH0pO1xuICAgICAgY29uc29sZS53YXJuKFwic2FuZGJveCBjb25maWcgY2hhbmdlcyBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZ2V0U2FuZGJveDxUVGFncz4oe1xuICAgICAgc3RvcmFnZUNvbmZpZyxcbiAgICAgIHNhbmRib3hSZWNvcmQ6IGV4aXN0aW5nUmVjb3JkLFxuICAgICAgc3RvcmFnZTogZ2V0U3RvcmFnZUluc3RhbmNlKCksXG4gICAgICBycGM6IGFnZW50T2JqLnJwYyxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBhZ2VudE9iaiA9IHtcbiAgICBzZXNzaW9uOiBhc3luYyAoXG4gICAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICAgIHNlc3Npb25PcHRpb25zPzogU2Vzc2lvbk9wdGlvbnM8VG9vbHMsIFRUYWdzPlxuICAgICkgPT4ge1xuICAgICAgbGV0IHNlc3Npb24gPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zZXNzaW9uLmdldChzZXNzaW9uSWQpO1xuXG4gICAgICAvKipcbiAgICAgICAqIG5vcm1hbGl6ZSBzYW5kYm94IGlucHV0IHRvIGEgc2FuZGJveCBJRCBhbmQgY29uZmlnXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IHNhbmRib3hJbnB1dCA9IHNlc3Npb25PcHRpb25zPy5zYW5kYm94ID8/IG9wdGlvbnMuc2FuZGJveDtcbiAgICAgIGNvbnN0IHNhbmRib3hJZCA9XG4gICAgICAgIHR5cGVvZiBzYW5kYm94SW5wdXQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IHNhbmRib3hJbnB1dFxuICAgICAgICAgIDogLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9OZXN0ZWRUZXJuYXJ5OiBva1xuICAgICAgICAgICAgc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICA/IGBzYW5kYm94XyR7dWxpZCgpfWBcbiAgICAgICAgICAgIDogKHNlc3Npb24uc2FuZGJveElkID8/IGBzYW5kYm94XyR7dWxpZCgpfWApO1xuICAgICAgY29uc3Qgc2FuZGJveFByb21pc2UgPSBzYW5kYm94KFxuICAgICAgICBzYW5kYm94SWQsXG4gICAgICAgIHR5cGVvZiBzYW5kYm94SW5wdXQgPT09IFwic3RyaW5nXCIgPyB1bmRlZmluZWQgOiB7IGNvbmZpZzogc2FuZGJveElucHV0IH1cbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nU2Vzc2lvbiA9IHNlc3Npb24gaW5zdGFuY2VvZiBFcnJvciA/IG51bGwgOiBzZXNzaW9uO1xuICAgICAgY29uc3Qgc2tpbGxzRGlyID1cbiAgICAgICAgc2Vzc2lvbk9wdGlvbnM/LnNraWxsc0RpciA/P1xuICAgICAgICBleGlzdGluZ1Nlc3Npb24/LnNraWxsc0RpciA/P1xuICAgICAgICBvcHRpb25zLnNraWxsc0RpciA/P1xuICAgICAgICBudWxsO1xuXG4gICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGlmIChzZXNzaW9uIGluc3RhbmNlb2YgU2Vzc2lvbk5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBtb2RlbCA9IHNlc3Npb25PcHRpb25zPy5tb2RlbCA/PyBvcHRpb25zLm1vZGVsID8/IG51bGw7XG4gICAgICAgICAgaWYgKCFtb2RlbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25FcnJvcih7XG4gICAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogXCJNb2RlbCBpcyBub3Qgc2V0XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2Vzc2lvbiA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uc2V0KHtcbiAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICBsYXN0TWVzc2FnZUlkOiBudWxsLFxuICAgICAgICAgICAgcnVuSWQ6IG51bGwsXG4gICAgICAgICAgICB0YWdzOiBzZXNzaW9uT3B0aW9ucz8udGFncyA/PyBudWxsLFxuICAgICAgICAgICAgc3lzdGVtOiBzZXNzaW9uT3B0aW9ucz8uc3lzdGVtID8/IG9wdGlvbnMuc3lzdGVtID8/IG51bGwsXG4gICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgIHNhbmRib3hJZCxcbiAgICAgICAgICAgIHNraWxsc0Rpcjogc2tpbGxzRGlyID8gbm9ybWFsaXplU2tpbGxzRGlycyhza2lsbHNEaXIpIDogbnVsbCxcbiAgICAgICAgICAgIGhvb2tUb2tlbjogbnVsbCxcbiAgICAgICAgICAgIGFjdGl2ZVRvb2xzOlxuICAgICAgICAgICAgICBzZXNzaW9uT3B0aW9ucz8uYWN0aXZlVG9vbHMgPz8gb3B0aW9ucy5hY3RpdmVUb29scyA/PyBudWxsLFxuICAgICAgICAgICAgZ2VuZXJhdGlvbjpcbiAgICAgICAgICAgICAgb3B0aW9ucy5nZW5lcmF0aW9uIHx8IHNlc3Npb25PcHRpb25zPy5nZW5lcmF0aW9uXG4gICAgICAgICAgICAgICAgPyB7IC4uLm9wdGlvbnMuZ2VuZXJhdGlvbiwgLi4uc2Vzc2lvbk9wdGlvbnM/LmdlbmVyYXRpb24gfVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBzZXNzaW9uO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKipcbiAgICAgICAgICogdGhpcyBpcyBhbiBleGlzdGluZyBzZXNzaW9uLiB3ZSBjb21wYXJlIHRoZSBvcHRpb25zIGFuZCB1cGRhdGUgdGhlIHNlc3Npb24gaWYgbmVjZXNzYXJ5LlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgdXBkYXRlZDogU2Vzc2lvbiA9IHtcbiAgICAgICAgICAuLi5zZXNzaW9uLFxuICAgICAgICAgIC4uLnNlc3Npb25PcHRpb25zLFxuICAgICAgICAgIHNhbmRib3hJZCxcbiAgICAgICAgICBza2lsbHNEaXI6IHNraWxsc0RpciA/IG5vcm1hbGl6ZVNraWxsc0RpcnMoc2tpbGxzRGlyKSA6IG51bGwsXG4gICAgICAgIH07XG4gICAgICAgIGlmICghZXF1YWwodXBkYXRlZCwgc2Vzc2lvbikpIHtcbiAgICAgICAgICBzZXNzaW9uID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2Vzc2lvbi5zZXQodXBkYXRlZCk7XG4gICAgICAgICAgaWYgKHNlc3Npb24gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgc2Vzc2lvbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBJbnRlcnJ1cHRzIGFsbCBwZW5kaW5nIGFzc2lzdGFudCBtZXNzYWdlcyAoYm90aCBzdHJlYW1pbmcgYW5kIHF1ZXVlZCkuXG4gICAgICAgKiBBIG1lc3NhZ2UgaXMgY29uc2lkZXJlZCBwZW5kaW5nIGlmIGNvbXBsZXRlZEF0ID09PSBudWxsICYmIGludGVycnVwdGVkQXQgPT09IG51bGwuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGludGVycnVwdEN1cnJlbnRNZXNzYWdlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlc1Jlc3VsdCA9XG4gICAgICAgICAgYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkubWVzc2FnZS5saXN0KHNlc3Npb25JZCk7XG4gICAgICAgIGlmIChtZXNzYWdlc1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2VzUmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgcGVuZGluZ0Fzc2lzdGFudE1lc3NhZ2VzID0gbWVzc2FnZXNSZXN1bHQuaXRlbXMuZmlsdGVyKFxuICAgICAgICAgIChtKSA9PlxuICAgICAgICAgICAgbS5yb2xlID09PSBcImFzc2lzdGFudFwiICYmXG4gICAgICAgICAgICBtLmNvbXBsZXRlZEF0ID09PSBudWxsICYmXG4gICAgICAgICAgICBtLmludGVycnVwdGVkQXQgPT09IG51bGxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgcGVuZGluZ0Fzc2lzdGFudE1lc3NhZ2VzLm1hcCgobSkgPT5cbiAgICAgICAgICAgIGdldFN0b3JhZ2VJbnN0YW5jZSgpLm1lc3NhZ2Uuc2V0KHsgLi4ubSwgaW50ZXJydXB0ZWRBdDogbm93IH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXV0by1yZWplY3QgYW55IHBlbmRpbmcgYXBwcm92YWwgaG9va3Mgc28gdGhlIHdvcmtmbG93IHVuYmxvY2tzXG4gICAgICAgIGZvciAoY29uc3QgbSBvZiBwZW5kaW5nQXNzaXN0YW50TWVzc2FnZXMpIHtcbiAgICAgICAgICBjb25zdCBwYXJ0c1Jlc3VsdCA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnBhcnQubGlzdEJ5TWVzc2FnZShcbiAgICAgICAgICAgIG0uaWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwYXJ0c1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBwIG9mIHBhcnRzUmVzdWx0Lml0ZW1zKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHAucGFydCAmJlxuICAgICAgICAgICAgICBcInN0YXRlXCIgaW4gcC5wYXJ0ICYmXG4gICAgICAgICAgICAgIChwLnBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlID09PSBcImFwcHJvdmFsLXJlcXVlc3RlZFwiICYmXG4gICAgICAgICAgICAgIFwiYXBwcm92YWxcIiBpbiBwLnBhcnRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCBhcHByb3ZhbCA9IChwLnBhcnQgYXMgeyBhcHByb3ZhbD86IHsgaWQ6IHN0cmluZyB9IH0pXG4gICAgICAgICAgICAgICAgLmFwcHJvdmFsO1xuICAgICAgICAgICAgICBpZiAoYXBwcm92YWw/LmlkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkucGFydC5zZXQoe1xuICAgICAgICAgICAgICAgICAgLi4ucCxcbiAgICAgICAgICAgICAgICAgIHBhcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucC5wYXJ0LFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogXCJhcHByb3ZhbC1yZXNwb25kZWRcIixcbiAgICAgICAgICAgICAgICAgICAgYXBwcm92YWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi5hcHByb3ZhbCxcbiAgICAgICAgICAgICAgICAgICAgICBhcHByb3ZlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBcImludGVycnVwdGVkXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0gYXMgUGFydCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBwcm92YWxIb29rLnJlc3VtZShhcHByb3ZhbC5pZCwge1xuICAgICAgICAgICAgICAgICAgYXBwcm92ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgcmVhc29uOiBcImludGVycnVwdGVkXCIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VuZDogYXN5bmMgKHtcbiAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICBpbnRlcnJ1cHRJZlN0cmVhbWluZyxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICB9OiB7XG4gICAgICAgICAgaW5wdXQ6IFNlbmRJbnB1dCB8IFNlbmRJbnB1dFtdO1xuICAgICAgICAgIGludGVycnVwdElmU3RyZWFtaW5nPzogYm9vbGVhbjtcbiAgICAgICAgICBjb250ZXh0PzogVENvbnRleHQ7XG4gICAgICAgIH0pID0+IHtcbiAgICAgICAgICBpZiAoaW50ZXJydXB0SWZTdHJlYW1pbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVycnVwdFJlc3VsdCA9IGF3YWl0IGludGVycnVwdEN1cnJlbnRNZXNzYWdlKCk7XG4gICAgICAgICAgICBpZiAoaW50ZXJydXB0UmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGludGVycnVwdFJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbmV3TWVzc2FnZXM6IE1lc3NhZ2VbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IG5ld1BhcnRzOiBQYXJ0W10gPSBbXTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBpbnB1dCkge1xuICAgICAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIHBhcnRzIH0gPSB0b01lc3NhZ2VBbmRQYXJ0cyh7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgIGlucHV0OiBpLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRSb2xlOiBcInVzZXJcIixcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgbmV3TWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgbmV3UGFydHMucHVzaCguLi5wYXJ0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgcGFydHMgfSA9IHRvTWVzc2FnZUFuZFBhcnRzKHtcbiAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgZGVmYXVsdFJvbGU6IFwidXNlclwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuZXdNZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgbmV3UGFydHMucHVzaCguLi5wYXJ0cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIHdlIGFsc28gcHJlLWNyZWF0ZSB0aGUgYXNzaXN0YW50IG1lc3NhZ2VcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdCBhc3Npc3RhbnRNZXNzYWdlSWQgPSBgbWVzc2FnZV8ke3VsaWQoKX1gO1xuICAgICAgICAgIGNvbnN0IGJhc2VUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCBhc3Npc3RhbnRNZXNzYWdlQ3JlYXRlZEF0ID0gYmFzZVRpbWUgKyBuZXdNZXNzYWdlcy5sZW5ndGg7XG4gICAgICAgICAgbmV3TWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICBpZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogYXNzaXN0YW50TWVzc2FnZUNyZWF0ZWRBdCxcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogbnVsbCxcbiAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBudWxsLFxuICAgICAgICAgICAgaW50ZXJydXB0ZWRBdDogbnVsbCxcbiAgICAgICAgICAgIHVzYWdlOiBudWxsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3Qgc2Vzc2lvbjIgPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zZXNzaW9uLmdldChzZXNzaW9uSWQpO1xuICAgICAgICAgIGlmIChzZXNzaW9uMiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBzZXNzaW9uMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhZ2VudElucHV0OiBBZ2VudElucHV0ID0ge1xuICAgICAgICAgICAgc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIHJwYzogYWdlbnRPYmoucnBjLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgZXZlbnQ6IEFnZW50TWVzc2FnZUlucHV0ID0ge1xuICAgICAgICAgICAgYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgaG9va1Rva2VuOiBjcnlwdG8ucmFuZG9tVVVJRCgpLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBhc3Npc3RhbnRNZXNzYWdlQ3JlYXRlZEF0LFxuICAgICAgICAgICAgY29udGV4dDogY29udGV4dCA/PyB7fSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGVycm9yZS50cnlBc3luYyh7XG4gICAgICAgICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgYXdhaXQgYWxsKHtcbiAgICAgICAgICAgICAgICBhc3luYyBzYXZlTWVzc2FnZXMoKSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgbmV3TWVzc2FnZXMubWFwKChtLCBpKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIGdldFN0b3JhZ2VJbnN0YW5jZSgpLm1lc3NhZ2Uuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGJhc2VUaW1lICsgaSxcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYXN5bmMgc2F2ZVBhcnRzKCkge1xuICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgIG5ld1BhcnRzLm1hcChnZXRTdG9yYWdlSW5zdGFuY2UoKS5wYXJ0LnNldClcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhc3luYyByZXN1bWVPclN0YXJ0QWdlbnRXb3JrZmxvdygpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uMi5ydW5JZCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhZ2VudE1lc3NhZ2VIb29rLnJlc3VtZShzZXNzaW9uSWQsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0UmVzdWx0ID0gYXdhaXQgc3RhcnQoYWdlbnRXb3JrZmxvdywgW1xuICAgICAgICAgICAgICAgICAgICAgIHsgaW5wdXQ6IGFnZW50SW5wdXQsIGV2ZW50IH0sXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uMi5ydW5JZCA9IHN0YXJ0UmVzdWx0LnJ1bklkO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYXN5bmMgdXBkYXRlU2Vzc2lvbigpIHtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuJC5yZXN1bWVPclN0YXJ0QWdlbnRXb3JrZmxvdztcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2Vzc2lvbjIsXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgbGFzdE1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICBob29rVG9rZW46IGV2ZW50Lmhvb2tUb2tlbixcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2F0Y2g6IChlKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbkVycm9yKHtcbiAgICAgICAgICAgICAgICBpZDogc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogYGZhaWxlZCB0byBzZW5kOiAke1N0cmluZyhlKX1gLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc3RyZWFtOiBhc3luYyAob3B0cz86IHsgbWVzc2FnZUlkPzogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2Vzc2lvbi5nZXQoc2Vzc2lvbklkKTtcbiAgICAgICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUlkID0gb3B0cz8ubWVzc2FnZUlkID8/IHNlc3Npb24ubGFzdE1lc3NhZ2VJZDtcbiAgICAgICAgICBpZiAoIW1lc3NhZ2VJZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uRXJyb3Ioe1xuICAgICAgICAgICAgICBpZDogc2Vzc2lvbklkLFxuICAgICAgICAgICAgICByZWFzb246IFwiTm8gbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvblwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc2Vzc2lvbi5ydW5JZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uRXJyb3Ioe1xuICAgICAgICAgICAgICBpZDogc2Vzc2lvbklkLFxuICAgICAgICAgICAgICByZWFzb246IFwiTm8gcnVuIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcnVuID0gZ2V0UnVuKHNlc3Npb24ucnVuSWQpO1xuICAgICAgICAgIHJldHVybiBydW4uZ2V0UmVhZGFibGU8VUlNZXNzYWdlQ2h1bms+KHsgbmFtZXNwYWNlOiBtZXNzYWdlSWQgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdWk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBbbWVzc2FnZXNSZXN1bHQsIHBhcnRzUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIGdldFN0b3JhZ2VJbnN0YW5jZSgpLm1lc3NhZ2UubGlzdChzZXNzaW9uSWQpLFxuICAgICAgICAgICAgZ2V0U3RvcmFnZUluc3RhbmNlKCkucGFydC5saXN0QnlTZXNzaW9uKHNlc3Npb25JZCksXG4gICAgICAgICAgXSk7XG5cbiAgICAgICAgICBpZiAobWVzc2FnZXNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VzUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocGFydHNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnRzUmVzdWx0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gYXNzZW1ibGVVSU1lc3NhZ2VzKHtcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlc1Jlc3VsdC5pdGVtcyxcbiAgICAgICAgICAgIHBhcnRzOiBwYXJ0c1Jlc3VsdC5pdGVtcyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IGxhc3RTdGFydGVkQXNzaXN0YW50ID0gbWVzc2FnZXNSZXN1bHQuaXRlbXNcbiAgICAgICAgICAgIC5maWx0ZXIoKG0pID0+IG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiAmJiBtLnN0YXJ0ZWRBdCAhPT0gbnVsbClcbiAgICAgICAgICAgIC5hdCgtMSk7XG4gICAgICAgICAgY29uc3QgaXNTdHJlYW1pbmcgPVxuICAgICAgICAgICAgbGFzdFN0YXJ0ZWRBc3Npc3RhbnQgJiZcbiAgICAgICAgICAgIGxhc3RTdGFydGVkQXNzaXN0YW50LmNvbXBsZXRlZEF0ID09PSBudWxsICYmXG4gICAgICAgICAgICBsYXN0U3RhcnRlZEFzc2lzdGFudC5pbnRlcnJ1cHRlZEF0ID09PSBudWxsO1xuICAgICAgICAgIGNvbnN0IHN0cmVhbWluZ01lc3NhZ2VJZCA9IGlzU3RyZWFtaW5nXG4gICAgICAgICAgICA/IGxhc3RTdGFydGVkQXNzaXN0YW50LmlkXG4gICAgICAgICAgICA6IG51bGw7XG5cbiAgICAgICAgICBjb25zdCB1c2FnZSA9IGNvbXB1dGVTZXNzaW9uVXNhZ2UobWVzc2FnZXNSZXN1bHQuaXRlbXMpO1xuXG4gICAgICAgICAgdHlwZSBUeXBlZE1lc3NhZ2UgPSBVSU1lc3NhZ2U8XG4gICAgICAgICAgICB1bmtub3duLFxuICAgICAgICAgICAgVUlEYXRhVHlwZXMsXG4gICAgICAgICAgICBJbmZlclVJVG9vbHM8dHlwZW9mIGJ1aWx0SW5Ub29scyAmIFRvb2xzPlxuICAgICAgICAgID47XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlcyBhcyB1bmtub3duIGFzIFR5cGVkTWVzc2FnZVtdLFxuICAgICAgICAgICAgc3RyZWFtaW5nTWVzc2FnZUlkLFxuICAgICAgICAgICAgdXNhZ2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgdGFnOiB7XG4gICAgICAgICAgbGlzdDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uZ2V0KHNlc3Npb25JZCk7XG4gICAgICAgICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChzZXNzaW9uLnRhZ3MgPz8ge30pIGFzIFRUYWdzO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2V0OiBhc3luYyA8SyBleHRlbmRzIGtleW9mIFRUYWdzICYgc3RyaW5nPihcbiAgICAgICAgICAgIGtleTogS1xuICAgICAgICAgICk6IFByb21pc2U8VFRhZ3NbS10gfCB1bmRlZmluZWQgfCBFcnJvcj4gPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uZ2V0KHNlc3Npb25JZCk7XG4gICAgICAgICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNlc3Npb24udGFncz8uW2tleV0gYXMgVFRhZ3NbS10gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQ6IGFzeW5jIDxLIGV4dGVuZHMga2V5b2YgVFRhZ3MgJiBzdHJpbmc+KFxuICAgICAgICAgICAga2V5OiBLLFxuICAgICAgICAgICAgdmFsdWU6IFRUYWdzW0tdXG4gICAgICAgICAgKTogUHJvbWlzZTx1bmRlZmluZWQgfCBFcnJvcj4gPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2Vzc2lvbi50YWcuc2V0KHtcbiAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICB0YWdzOiB7IFtrZXldOiB2YWx1ZSB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXRNYW55OiBhc3luYyAodGFnczogUGFydGlhbDxUVGFncz4pOiBQcm9taXNlPHVuZGVmaW5lZCB8IEVycm9yPiA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zZXNzaW9uLnRhZy5zZXQoe1xuICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHRhZ3M6IHRhZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzYW5kYm94OiBhd2FpdCBzYW5kYm94UHJvbWlzZSxcblxuICAgICAgICBpbnRlcnJ1cHQ6IGludGVycnVwdEN1cnJlbnRNZXNzYWdlLFxuXG4gICAgICAgIHJlc29sdmVBcHByb3ZhbDogYXN5bmMgKHtcbiAgICAgICAgICBhcHByb3ZhbElkLFxuICAgICAgICAgIGFwcHJvdmVkLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgfToge1xuICAgICAgICAgIGFwcHJvdmFsSWQ6IHN0cmluZztcbiAgICAgICAgICBhcHByb3ZlZDogYm9vbGVhbjtcbiAgICAgICAgICByZWFzb24/OiBzdHJpbmc7XG4gICAgICAgIH0pOiBQcm9taXNlPHVuZGVmaW5lZCB8IEVycm9yPiA9PiB7XG4gICAgICAgICAgY29uc3QgcGFydHNSZXN1bHQgPVxuICAgICAgICAgICAgYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkucGFydC5saXN0QnlTZXNzaW9uKHNlc3Npb25JZCk7XG4gICAgICAgICAgaWYgKHBhcnRzUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0c1Jlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0YXJnZXRQYXJ0ID0gcGFydHNSZXN1bHQuaXRlbXMuZmluZChcbiAgICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgICBwLnBhcnQgJiZcbiAgICAgICAgICAgICAgXCJhcHByb3ZhbFwiIGluIHAucGFydCAmJlxuICAgICAgICAgICAgICAocC5wYXJ0IGFzIHsgYXBwcm92YWw/OiB7IGlkOiBzdHJpbmcgfSB9KS5hcHByb3ZhbD8uaWQgPT09XG4gICAgICAgICAgICAgICAgYXBwcm92YWxJZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCF0YXJnZXRQYXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25FcnJvcih7XG4gICAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogYEFwcHJvdmFsICR7YXBwcm92YWxJZH0gbm90IGZvdW5kYCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRQYXJ0ID0ge1xuICAgICAgICAgICAgLi4udGFyZ2V0UGFydCxcbiAgICAgICAgICAgIHBhcnQ6IHtcbiAgICAgICAgICAgICAgLi4udGFyZ2V0UGFydC5wYXJ0LFxuICAgICAgICAgICAgICBzdGF0ZTogXCJhcHByb3ZhbC1yZXNwb25kZWRcIiBhcyBjb25zdCxcbiAgICAgICAgICAgICAgYXBwcm92YWw6IHsgaWQ6IGFwcHJvdmFsSWQsIGFwcHJvdmVkLCByZWFzb24gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBzZXRSZXN1bHQgPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5wYXJ0LnNldChcbiAgICAgICAgICAgIHVwZGF0ZWRQYXJ0IGFzIFBhcnRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzZXRSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHNldFJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGaXJlIHRoZSBhcHByb3ZhbCBob29rIHRvIHJlc3VtZSB0aGUgc3VzcGVuZGVkIHdvcmtmbG93LlxuICAgICAgICAgIC8vIEZvciBzdWItdG9vbCBhcHByb3ZhbHMgKGZyb20gdGhlIEphdmFTY3JpcHQgdG9vbCksIHRoZXJlJ3Mgbm9cbiAgICAgICAgICAvLyBzdXNwZW5kZWQgaG9vayBcdTIwMTQgcG9sbGluZyBoYW5kbGVzIGl0LiBTd2FsbG93IHRoZSBlcnJvci5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgYXBwcm92YWxIb29rLnJlc3VtZShhcHByb3ZhbElkLCB7IGFwcHJvdmVkLCByZWFzb24gfSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBObyBob29rIHJlZ2lzdGVyZWQgZm9yIHRoaXMgYXBwcm92YWxJZCAoZS5nLiBKUyBzdWItdG9vbCBhcHByb3ZhbClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVzYWdlOiBhc3luYyAoKTogUHJvbWlzZTxTZXNzaW9uVXNhZ2UgfCBFcnJvcj4gPT4ge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzUmVzdWx0ID1cbiAgICAgICAgICAgIGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLm1lc3NhZ2UubGlzdChzZXNzaW9uSWQpO1xuICAgICAgICAgIGlmIChtZXNzYWdlc1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZXNSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjb21wdXRlU2Vzc2lvblVzYWdlKG1lc3NhZ2VzUmVzdWx0Lml0ZW1zKTtcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfSxcbiAgICBzYW5kYm94LFxuICAgIGdldCBzdG9yYWdlKCkge1xuICAgICAgcmV0dXJuIGdldFN0b3JhZ2VJbnN0YW5jZSgpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSUEMgaGFuZGxlciBmb3IgYWdlbnQgb3BlcmF0aW9ucy5cbiAgICAgKiBIYW5kbGVzIHRvb2xzLmxpc3QsIHRvb2xzLmV4ZWN1dGUsIHN0b3JhZ2UgUlBDLCBhbmQgaG9va3MuXG4gICAgICpcbiAgICAgKiBDYWxsZWQgaW50ZXJuYWxseSBieSB0aGUgYHJwY2Agc3RlcCBmdW5jdGlvbiBkdXJpbmcgd29ya2Zsb3cgZXhlY3V0aW9uLlxuICAgICAqIENhbiBhbHNvIGJlIGV4cG9zZWQgdmlhIEhUVFAgZm9yIGV4dGVybmFsIGFjY2VzcyBpZiBuZWVkZWQuXG4gICAgICovXG4gICAgaGFuZGxlcjogYXN5bmMgKFxuICAgICAgaW5wdXQ6IFJlcXVlc3QgfCBScGNQYXlsb2FkLFxuICAgICAgb3ZlcnJpZGVzPzogQWdlbnRScGNPdmVycmlkZXNcbiAgICApOiBQcm9taXNlPFJlc3BvbnNlIHwgUnBjUmVzdWx0PiA9PiB7XG4gICAgICBjb25zdCBpc1JlcXVlc3QgPSBpbnB1dCBpbnN0YW5jZW9mIFJlcXVlc3Q7XG5cbiAgICAgIGxldCBtZXRob2Q6IHN0cmluZztcbiAgICAgIGxldCBwYXJhbXM6IHVua25vd247XG4gICAgICBsZXQgbmFtZTogc3RyaW5nO1xuXG4gICAgICBpZiAoaXNSZXF1ZXN0KSB7XG4gICAgICAgIGNvbnN0IHNlY3JldCA9IGlucHV0LmhlYWRlcnMuZ2V0KFwieC1hZ2VudC1zZWNyZXRcIik7XG4gICAgICAgIGlmIChzZWNyZXQgIT09IGFnZW50U2VjcmV0KSB7XG4gICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oXG4gICAgICAgICAgICB7IGVycm9yOiB7IGNvZGU6IFwiVU5BVVRIT1JJWkVEXCIsIG1lc3NhZ2U6IFwiSW52YWxpZCBzZWNyZXRcIiB9IH0sXG4gICAgICAgICAgICB7IHN0YXR1czogNDAxIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGJvZHk6IEFnZW50UnBjUmVxdWVzdDtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBib2R5ID0gYXdhaXQgaW5wdXQuanNvbigpO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuanNvbihcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgZXJyb3I6IHsgY29kZTogXCJJTlZBTElEX1JFUVVFU1RcIiwgbWVzc2FnZTogXCJJbnZhbGlkIEpTT04gYm9keVwiIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgeyBzdGF0dXM6IDQwMCB9XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1ldGhvZCA9IGJvZHkubWV0aG9kO1xuICAgICAgICBwYXJhbXMgPSBib2R5LnBhcmFtcztcbiAgICAgICAgbmFtZSA9IGlucHV0LmhlYWRlcnMuZ2V0KFwieC1hZ2VudC1uYW1lXCIpID8/IERFRkFVTFRfTkFNRVNQQUNFO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWV0aG9kID0gaW5wdXQubWV0aG9kO1xuICAgICAgICBwYXJhbXMgPSBpbnB1dC5wYXJhbXM7XG4gICAgICAgIG5hbWUgPSBpbnB1dC5uYW1lID8/IERFRkFVTFRfTkFNRVNQQUNFO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkaXNwYXRjaENvbnRleHQ6IERpc3BhdGNoQ29udGV4dCA9IHtcbiAgICAgICAgdG9vbHM6IG9wdGlvbnMudG9vbHMgYXMgVG9vbFNldCB8IHVuZGVmaW5lZCxcbiAgICAgICAgaG9va3M6IG9wdGlvbnMuaG9va3MsXG4gICAgICAgIG5lZWRzQXBwcm92YWw6XG4gICAgICAgICAgb3B0aW9ucy5uZWVkc0FwcHJvdmFsIGFzIERpc3BhdGNoQ29udGV4dFtcIm5lZWRzQXBwcm92YWxcIl0sXG4gICAgICAgIHN0b3JhZ2VDb25maWcsXG4gICAgICAgIGdldFN0b3JhZ2VJbnN0YW5jZSxcbiAgICAgICAgZ2V0U3RvcmFnZUhhbmRsZXJzLFxuICAgICAgICBycGM6IGFnZW50T2JqLnJwYyxcbiAgICAgICAgb3ZlcnJpZGVzLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZGlzcGF0Y2gobWV0aG9kLCBwYXJhbXMsIGRpc3BhdGNoQ29udGV4dCwgbmFtZSk7XG5cbiAgICAgIGlmICghaXNSZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YXR1cyA9IFwiZXJyb3JcIiBpbiByZXN1bHQgPyAocmVzdWx0LnN0YXR1cyA/PyA1MDApIDogMjAwO1xuICAgICAgcmV0dXJuIFJlc3BvbnNlLmpzb24oXG4gICAgICAgIFwiZXJyb3JcIiBpbiByZXN1bHQgPyB7IGVycm9yOiByZXN1bHQuZXJyb3IgfSA6IHsgcmVzdWx0OiByZXN1bHQucmVzdWx0IH0sXG4gICAgICAgIHsgc3RhdHVzIH1cbiAgICAgICk7XG4gICAgfSxcblxuICAgIHRvb2xzOiB7IC4uLmJ1aWx0SW5Ub29scywgLi4ub3B0aW9ucy50b29scyB9IGFzIHR5cGVvZiBidWlsdEluVG9vbHMgJiBUb29scyxcblxuICAgIHJwYzogKCgpID0+IHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgXCJycGMgbm90IGNvbmZpZ3VyZWQuIEVuc3VyZSB3aXRoQWdlbnQgaXMgc2V0IHVwIGluIG5leHQuY29uZmlnLnRzXCJcbiAgICAgICk7XG4gICAgfSkgYXMgKHBhcmFtczogUnBjUGF5bG9hZCkgPT4gUHJvbWlzZTxScGNSZXN1bHQ+LFxuICB9O1xuXG4gIHJldHVybiBhZ2VudE9iajtcbn07XG4iLCAiaW1wb3J0IHR5cGUgeyBKU09OU2NoZW1hNywgVG9vbCwgVG9vbFNldCB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRScGNPdmVycmlkZXMsIEFnZW50UnBjUmVzdWx0LCBScGNSZXN1bHQgfSBmcm9tIFwiLi9jbGllbnRcIjtcbmltcG9ydCB7IGdldFNhbmRib3ggfSBmcm9tIFwiLi9zYW5kYm94XCI7XG5pbXBvcnQgdHlwZSB7XG4gIFN0b3JhZ2UgYXMgQWdlbnRTdG9yYWdlLFxuICBNZXRob2ROYW1lLFxuICBScGNGbixcbiAgUnBjUmVxdWVzdCxcbiAgUnBjUmVzcG9uc2UsXG4gIFNhbmRib3hSZWNvcmQsXG4gIFNlc3Npb24sXG4gIFN0b3JhZ2VDb25maWcsXG4gIEhhbmRsZXJzIGFzIFN0b3JhZ2VIYW5kbGVycyxcbn0gZnJvbSBcIi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgU1RPUkFHRV9SUENfTUVUSE9EUyB9IGZyb20gXCIuL3N0b3JhZ2VcIjtcbmltcG9ydCB7IHJlc29sdmVBcGlVcmwsIHR5cGUgVG9vbENvbnRleHQgfSBmcm9tIFwiLi90b29sc1wiO1xuXG5leHBvcnQgdHlwZSBUb29sTWV0YWRhdGEgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGlucHV0U2NoZW1hPzogSlNPTlNjaGVtYTc7XG59O1xuXG5leHBvcnQgdHlwZSBUb29sc0V4ZWN1dGVQYXJhbXMgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgaW5wdXQ6IHVua25vd247XG4gIHNlc3Npb246IFNlc3Npb247XG4gIHNhbmRib3hSZWNvcmQ6IFNhbmRib3hSZWNvcmQ7XG4gIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufTtcblxuZXhwb3J0IHR5cGUgSG9va1Rvb2xCZWZvcmVQYXJhbXMgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgaW5wdXQ6IHVua25vd247XG4gIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xufTtcblxuZXhwb3J0IHR5cGUgSG9va1Rvb2xCZWZvcmVSZXN1bHQgPSB7XG4gIGlucHV0PzogdW5rbm93bjtcbiAgc3RvcD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBIb29rVG9vbEFmdGVyUGFyYW1zID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGlucHV0OiB1bmtub3duO1xuICByZXN1bHQ6IHVua25vd247XG4gIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xufTtcblxuZXhwb3J0IHR5cGUgSG9va1Rvb2xBZnRlclJlc3VsdCA9IHtcbiAgcmVzdWx0PzogdW5rbm93bjtcbiAgc3RvcD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUb29sc05lZWRzQXBwcm92YWxQYXJhbXMgPSB7XG4gIHRvb2xOYW1lOiBzdHJpbmc7XG4gIGlucHV0OiB1bmtub3duO1xuICB0b29sQ2FsbElkOiBzdHJpbmc7XG4gIG1lc3NhZ2VzOiB1bmtub3duW107XG59O1xuXG5leHBvcnQgdHlwZSBUb29sc05lZWRzQXBwcm92YWxSZXN1bHQgPSBib29sZWFuO1xuXG50eXBlIEFnZW50SG9va3MgPSB7XG4gIFwidG9vbC5iZWZvcmVcIj86IChvcHRzOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlucHV0OiB1bmtub3duO1xuICAgIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xuICB9KSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IHsgaW5wdXQ6IHVua25vd24gfT47XG4gIFwidG9vbC5hZnRlclwiPzogKG9wdHM6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgaW5wdXQ6IHVua25vd247XG4gICAgcmVzdWx0OiB1bmtub3duO1xuICAgIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xuICB9KSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IHsgcmVzdWx0OiB1bmtub3duIH0+O1xufTtcblxudHlwZSBOZWVkc0FwcHJvdmFsRW50cnkgPVxuICB8IGJvb2xlYW5cbiAgfCAoKFxuICAgICAgaW5wdXQ6IHVua25vd24sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHRvb2xDYWxsSWQ6IHN0cmluZztcbiAgICAgICAgbWVzc2FnZXM6IHVua25vd25bXTtcbiAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHVua25vd247XG4gICAgICB9XG4gICAgKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik7XG5cbmV4cG9ydCB0eXBlIERpc3BhdGNoQ29udGV4dCA9IHtcbiAgdG9vbHM6IFRvb2xTZXQgfCB1bmRlZmluZWQ7XG4gIGhvb2tzOiBBZ2VudEhvb2tzIHwgdW5kZWZpbmVkO1xuICBuZWVkc0FwcHJvdmFsOiBSZWNvcmQ8c3RyaW5nLCBOZWVkc0FwcHJvdmFsRW50cnk+IHwgdW5kZWZpbmVkO1xuICBzdG9yYWdlQ29uZmlnOiBTdG9yYWdlQ29uZmlnO1xuICBnZXRTdG9yYWdlSW5zdGFuY2U6ICgpID0+IEFnZW50U3RvcmFnZTtcbiAgZ2V0U3RvcmFnZUhhbmRsZXJzOiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPFN0b3JhZ2VIYW5kbGVycz47XG4gIHJwYzogUnBjRm47XG4gIG92ZXJyaWRlcz86IEFnZW50UnBjT3ZlcnJpZGVzO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0cyBhbiBvdmVycmlkZSByZXN1bHQgdG8gUnBjUmVzdWx0LCBvciBudWxsIHRvIGZhbGwgdGhyb3VnaC5cbiAqL1xuZnVuY3Rpb24gaGFuZGxlT3ZlcnJpZGVSZXN1bHQ8VD4ocmVzOiBBZ2VudFJwY1Jlc3VsdDxUPik6IFJwY1Jlc3VsdDxUPiB8IG51bGwge1xuICBpZiAocmVzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHJlcy5vaykge1xuICAgIHJldHVybiB7IHJlc3VsdDogcmVzLnJlc3VsdCB9O1xuICB9XG4gIHJldHVybiB7XG4gICAgZXJyb3I6IHsgY29kZTogXCJIQU5ETEVSX0VSUk9SXCIsIG1lc3NhZ2U6IHJlcy5lcnJvciB9LFxuICAgIHN0YXR1czogNDAwLFxuICB9O1xufVxuXG4vKipcbiAqIEludGVybmFsIGRpc3BhdGNoIGZ1bmN0aW9uLiBSZXR1cm5zIFJwY1Jlc3VsdCwgbm90IFJlc3BvbnNlLlxuICogRW5hYmxlcyByZWN1cnNpdmUgY2FsbHMgZm9yIGhvb2tzIHdpdGhvdXQgSlNPTiByb3VuZC10cmlwcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRpc3BhdGNoKFxuICBtZXRob2Q6IHN0cmluZyxcbiAgcGFyYW1zOiB1bmtub3duLFxuICBjb250ZXh0OiBEaXNwYXRjaENvbnRleHQsXG4gIG5hbWU/OiBzdHJpbmdcbik6IFByb21pc2U8UnBjUmVzdWx0PiB7XG4gIGNvbnN0IHtcbiAgICB0b29scyxcbiAgICBob29rcyxcbiAgICBuZWVkc0FwcHJvdmFsLFxuICAgIHN0b3JhZ2VDb25maWcsXG4gICAgZ2V0U3RvcmFnZUluc3RhbmNlLFxuICAgIGdldFN0b3JhZ2VIYW5kbGVycyxcbiAgICBycGMsXG4gICAgb3ZlcnJpZGVzLFxuICB9ID0gY29udGV4dDtcblxuICBzd2l0Y2ggKG1ldGhvZCkge1xuICAgIGNhc2UgXCJ0b29scy5saXN0XCI6IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRIYW5kbGVyID0gKCk6IFJwY1Jlc3VsdDxUb29sTWV0YWRhdGFbXT4gPT4ge1xuICAgICAgICBjb25zdCB0b29sc01hcCA9IHRvb2xzID8/ICh7fSBhcyBUb29sU2V0KTtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gT2JqZWN0LmVudHJpZXModG9vbHNNYXApLm1hcCgoW25hbWUsIHRdKSA9PiAoe1xuICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgZGVzY3JpcHRpb246ICh0IGFzIFRvb2wpLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIGlucHV0U2NoZW1hOiBzY2hlbWFUb0pzb25TY2hlbWEoKHQgYXMgVG9vbCkuaW5wdXRTY2hlbWEpLFxuICAgICAgICB9KSk7XG4gICAgICAgIHJldHVybiB7IHJlc3VsdCB9O1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBvdmVycmlkZXM/LltcInRvb2xzLmxpc3RcIl07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG92ZXJyaWRlUmVzdWx0ID0gYXdhaXQgb3ZlcnJpZGU/Lih7fSk7XG4gICAgICAgIGlmIChvdmVycmlkZVJlc3VsdCkge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZWQgPSBoYW5kbGVPdmVycmlkZVJlc3VsdChvdmVycmlkZVJlc3VsdCk7XG4gICAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVmYXVsdEhhbmRsZXIoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJIQU5ETEVSX0VSUk9SXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlIFwidG9vbHMubmVlZHNBcHByb3ZhbFwiOiB7XG4gICAgICBjb25zdCBwID0gcGFyYW1zIGFzIFRvb2xzTmVlZHNBcHByb3ZhbFBhcmFtcztcblxuICAgICAgY29uc3QgZGVmYXVsdEhhbmRsZXIgPSBhc3luYyAoKTogUHJvbWlzZTxScGNSZXN1bHQ8Ym9vbGVhbj4+ID0+IHtcbiAgICAgICAgLy8gMS4gUGVyLXRvb2wgbmVlZHNBcHByb3ZhbCBvbiBjdXN0b20gdG9vbHMgdGFrZXMgcHJpb3JpdHlcbiAgICAgICAgY29uc3QgdG9vbHNNYXAgPSB0b29scyA/PyAoe30gYXMgVG9vbFNldCk7XG4gICAgICAgIGNvbnN0IHRvb2xEZWYgPSB0b29sc01hcFtwLnRvb2xOYW1lXSBhcyBUb29sIHwgdW5kZWZpbmVkO1xuICAgICAgICBpZiAodG9vbERlZj8ubmVlZHNBcHByb3ZhbCAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0b29sRGVmLm5lZWRzQXBwcm92YWwgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgICByZXR1cm4geyByZXN1bHQ6IHRvb2xEZWYubmVlZHNBcHByb3ZhbCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0b29sRGVmLm5lZWRzQXBwcm92YWwocC5pbnB1dCwge1xuICAgICAgICAgICAgdG9vbENhbGxJZDogcC50b29sQ2FsbElkLFxuICAgICAgICAgICAgbWVzc2FnZXM6IHAubWVzc2FnZXMgYXMgbmV2ZXJbXSxcbiAgICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB1bmRlZmluZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHsgcmVzdWx0IH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyAyLiBBZ2VudC1sZXZlbCBuZWVkc0FwcHJvdmFsIG1hcFxuICAgICAgICBpZiAoIW5lZWRzQXBwcm92YWwpIHtcbiAgICAgICAgICByZXR1cm4geyByZXN1bHQ6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZW50cnkgPSBuZWVkc0FwcHJvdmFsW3AudG9vbE5hbWVdO1xuICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIGVudHJ5ID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgIHJldHVybiB7IHJlc3VsdDogZW50cnkgfTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBlbnRyeShwLmlucHV0LCB7XG4gICAgICAgICAgdG9vbENhbGxJZDogcC50b29sQ2FsbElkLFxuICAgICAgICAgIG1lc3NhZ2VzOiBwLm1lc3NhZ2VzLFxuICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB1bmRlZmluZWQsXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4geyByZXN1bHQgfTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVzPy5bXCJ0b29scy5uZWVkc0FwcHJvdmFsXCJdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvdmVycmlkZVJlc3VsdCA9IGF3YWl0IG92ZXJyaWRlPy4ocCk7XG4gICAgICAgIGlmIChvdmVycmlkZVJlc3VsdCkge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZWQgPSBoYW5kbGVPdmVycmlkZVJlc3VsdChvdmVycmlkZVJlc3VsdCk7XG4gICAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgZGVmYXVsdEhhbmRsZXIoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJORUVEU19BUFBST1ZBTF9FUlJPUlwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdHVzOiA1MDAsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FzZSBcImhvb2sudG9vbC5iZWZvcmVcIjoge1xuICAgICAgY29uc3QgcCA9IHBhcmFtcyBhcyBIb29rVG9vbEJlZm9yZVBhcmFtcztcblxuICAgICAgY29uc3QgZGVmYXVsdEhhbmRsZXIgPSBhc3luYyAoXG4gICAgICAgIGhvb2tQYXJhbXM6IEhvb2tUb29sQmVmb3JlUGFyYW1zXG4gICAgICApOiBQcm9taXNlPEhvb2tUb29sQmVmb3JlUmVzdWx0PiA9PiB7XG4gICAgICAgIGlmICghaG9va3M/LltcInRvb2wuYmVmb3JlXCJdKSB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhvb2tSZXN1bHQgPSBhd2FpdCBob29rc1tcInRvb2wuYmVmb3JlXCJdKGhvb2tQYXJhbXMpO1xuICAgICAgICByZXR1cm4gaG9va1Jlc3VsdCA/PyB7fTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVzPy5bXCJob29rLnRvb2wuYmVmb3JlXCJdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBsZXQgY3VycmVudFBhcmFtcyA9IHA7XG4gICAgICAgIGxldCBtZXJnZWQ6IEhvb2tUb29sQmVmb3JlUmVzdWx0ID0ge307XG5cbiAgICAgICAgY29uc3Qgb3ZlcnJpZGVSZXN1bHQgPSBhd2FpdCBvdmVycmlkZT8uKHApO1xuICAgICAgICBpZiAob3ZlcnJpZGVSZXN1bHQ/Lm9rKSB7XG4gICAgICAgICAgbWVyZ2VkID0geyAuLi5tZXJnZWQsIC4uLm92ZXJyaWRlUmVzdWx0LnJlc3VsdCB9O1xuICAgICAgICAgIGlmIChtZXJnZWQuc3RvcCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiBtZXJnZWQgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG92ZXJyaWRlUmVzdWx0LnJlc3VsdC5pbnB1dCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjdXJyZW50UGFyYW1zID0ge1xuICAgICAgICAgICAgICAuLi5jdXJyZW50UGFyYW1zLFxuICAgICAgICAgICAgICBpbnB1dDogb3ZlcnJpZGVSZXN1bHQucmVzdWx0LmlucHV0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWZhdWx0UmVzdWx0ID0gYXdhaXQgZGVmYXVsdEhhbmRsZXIoY3VycmVudFBhcmFtcyk7XG4gICAgICAgIG1lcmdlZCA9IHsgLi4ubWVyZ2VkLCAuLi5kZWZhdWx0UmVzdWx0IH07XG5cbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiBtZXJnZWQgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJIT09LX0VSUk9SXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlIFwiaG9vay50b29sLmFmdGVyXCI6IHtcbiAgICAgIGNvbnN0IHAgPSBwYXJhbXMgYXMgSG9va1Rvb2xBZnRlclBhcmFtcztcblxuICAgICAgY29uc3QgZGVmYXVsdEhhbmRsZXIgPSBhc3luYyAoXG4gICAgICAgIGhvb2tQYXJhbXM6IEhvb2tUb29sQWZ0ZXJQYXJhbXNcbiAgICAgICk6IFByb21pc2U8SG9va1Rvb2xBZnRlclJlc3VsdD4gPT4ge1xuICAgICAgICBpZiAoIWhvb2tzPy5bXCJ0b29sLmFmdGVyXCJdKSB7XG4gICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhvb2tSZXN1bHQgPSBhd2FpdCBob29rc1tcInRvb2wuYWZ0ZXJcIl0oaG9va1BhcmFtcyk7XG4gICAgICAgIHJldHVybiBob29rUmVzdWx0ID8/IHt9O1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBvdmVycmlkZXM/LltcImhvb2sudG9vbC5hZnRlclwiXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IGN1cnJlbnRQYXJhbXMgPSBwO1xuICAgICAgICBsZXQgbWVyZ2VkOiBIb29rVG9vbEFmdGVyUmVzdWx0ID0ge307XG5cbiAgICAgICAgY29uc3Qgb3ZlcnJpZGVSZXN1bHQgPSBhd2FpdCBvdmVycmlkZT8uKHApO1xuICAgICAgICBpZiAob3ZlcnJpZGVSZXN1bHQ/Lm9rKSB7XG4gICAgICAgICAgbWVyZ2VkID0geyAuLi5tZXJnZWQsIC4uLm92ZXJyaWRlUmVzdWx0LnJlc3VsdCB9O1xuICAgICAgICAgIGlmIChtZXJnZWQuc3RvcCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiBtZXJnZWQgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG92ZXJyaWRlUmVzdWx0LnJlc3VsdC5yZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY3VycmVudFBhcmFtcyA9IHtcbiAgICAgICAgICAgICAgLi4uY3VycmVudFBhcmFtcyxcbiAgICAgICAgICAgICAgcmVzdWx0OiBvdmVycmlkZVJlc3VsdC5yZXN1bHQucmVzdWx0LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWZhdWx0UmVzdWx0ID0gYXdhaXQgZGVmYXVsdEhhbmRsZXIoY3VycmVudFBhcmFtcyk7XG4gICAgICAgIG1lcmdlZCA9IHsgLi4ubWVyZ2VkLCAuLi5kZWZhdWx0UmVzdWx0IH07XG5cbiAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiBtZXJnZWQgfTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJIT09LX0VSUk9SXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlIFwidG9vbHMuZXhlY3V0ZVwiOiB7XG4gICAgICBjb25zdCBwID0gcGFyYW1zIGFzIFRvb2xzRXhlY3V0ZVBhcmFtcztcblxuICAgICAgY29uc3QgZGVmYXVsdEhhbmRsZXIgPSBhc3luYyAoKTogUHJvbWlzZTxScGNSZXN1bHQ+ID0+IHtcbiAgICAgICAgY29uc3QgdG9vbHNNYXAgPSB0b29scyA/PyAoe30gYXMgVG9vbFNldCk7XG4gICAgICAgIGNvbnN0IHRvb2xEZWYgPSB0b29sc01hcFtwLm5hbWUgYXMga2V5b2YgdHlwZW9mIHRvb2xzTWFwXTtcbiAgICAgICAgaWYgKCF0b29sRGVmKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgIGNvZGU6IFwiVE9PTF9OT1RfRk9VTkRcIixcbiAgICAgICAgICAgICAgbWVzc2FnZTogYFVua25vd24gdG9vbDogJHtwLm5hbWV9YCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZXhlY3V0ZSA9ICh0b29sRGVmIGFzIFRvb2wpLmV4ZWN1dGU7XG4gICAgICAgIGlmICghZXhlY3V0ZSkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICBjb2RlOiBcIk5PX0VYRUNVVEVcIixcbiAgICAgICAgICAgICAgbWVzc2FnZTogYFRvb2wgJHtwLm5hbWV9IGhhcyBubyBleGVjdXRlIGZ1bmN0aW9uYCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc2FuZGJveEluc3RhbmNlID0gZ2V0U2FuZGJveCh7XG4gICAgICAgICAgc2FuZGJveFJlY29yZDogcC5zYW5kYm94UmVjb3JkLFxuICAgICAgICAgIHN0b3JhZ2VDb25maWcsXG4gICAgICAgICAgc3RvcmFnZTogZ2V0U3RvcmFnZUluc3RhbmNlKCksXG4gICAgICAgICAgcnBjLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB0b29sQ29udGV4dDogVG9vbENvbnRleHQgPSB7XG4gICAgICAgICAgc2Vzc2lvbjogcC5zZXNzaW9uLFxuICAgICAgICAgIHNhbmRib3g6IHNhbmRib3hJbnN0YW5jZSxcbiAgICAgICAgICBzdG9yYWdlOiBnZXRTdG9yYWdlSW5zdGFuY2UoKSxcbiAgICAgICAgICBjb250ZXh0OiBwLmNvbnRleHQsXG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHRvb2xJbnB1dCA9IHAuaW5wdXQ7XG5cbiAgICAgICAgY29uc3QgYmVmb3JlUmVzdWx0ID0gYXdhaXQgZGlzcGF0Y2goXG4gICAgICAgICAgXCJob29rLnRvb2wuYmVmb3JlXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICAgIGNvbnRleHQ6IHRvb2xDb250ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBuYW1lXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcImVycm9yXCIgaW4gYmVmb3JlUmVzdWx0KSB7XG4gICAgICAgICAgcmV0dXJuIGJlZm9yZVJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBiZWZvcmVIb29rID0gYmVmb3JlUmVzdWx0LnJlc3VsdCBhcyBIb29rVG9vbEJlZm9yZVJlc3VsdDtcbiAgICAgICAgaWYgKGJlZm9yZUhvb2suc3RvcCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICBjb2RlOiBcIkhPT0tfU1RPUFBFRFwiLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBcInRvb2wuYmVmb3JlIGhvb2sgc3RvcHBlZCBleGVjdXRpb25cIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGF0dXM6IDQwMCxcbiAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIGlmIChiZWZvcmVIb29rLmlucHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0b29sSW5wdXQgPSBiZWZvcmVIb29rLmlucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IGV4ZWN1dGUodG9vbElucHV0IGFzIG5ldmVyLCB7XG4gICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHRvb2xDb250ZXh0LFxuICAgICAgICAgIHRvb2xDYWxsSWQ6IFwicnBjXCIsXG4gICAgICAgICAgbWVzc2FnZXM6IFtdLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBhZnRlclJlc3VsdCA9IGF3YWl0IGRpc3BhdGNoKFxuICAgICAgICAgIFwiaG9vay50b29sLmFmdGVyXCIsXG4gICAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogcC5uYW1lLFxuICAgICAgICAgICAgaW5wdXQ6IHRvb2xJbnB1dCxcbiAgICAgICAgICAgIHJlc3VsdCxcbiAgICAgICAgICAgIGNvbnRleHQ6IHRvb2xDb250ZXh0LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICBuYW1lXG4gICAgICAgICk7XG4gICAgICAgIGlmIChcImVycm9yXCIgaW4gYWZ0ZXJSZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gYWZ0ZXJSZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWZ0ZXJIb29rID0gYWZ0ZXJSZXN1bHQucmVzdWx0IGFzIEhvb2tUb29sQWZ0ZXJSZXN1bHQ7XG4gICAgICAgIGlmIChhZnRlckhvb2suc3RvcCkge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgICBjb2RlOiBcIkhPT0tfU1RPUFBFRFwiLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBcInRvb2wuYWZ0ZXIgaG9vayBzdG9wcGVkIGV4ZWN1dGlvblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFmdGVySG9vay5yZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJlc3VsdCA9IGFmdGVySG9vay5yZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyByZXN1bHQgfTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVzPy5bXCJ0b29scy5leGVjdXRlXCJdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvdmVycmlkZVJlc3VsdCA9IGF3YWl0IG92ZXJyaWRlPy4ocCk7XG4gICAgICAgIGlmIChvdmVycmlkZVJlc3VsdCkge1xuICAgICAgICAgIGNvbnN0IGhhbmRsZWQgPSBoYW5kbGVPdmVycmlkZVJlc3VsdChvdmVycmlkZVJlc3VsdCk7XG4gICAgICAgICAgaWYgKGhhbmRsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBoYW5kbGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYXdhaXQgZGVmYXVsdEhhbmRsZXIoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJFWEVDVVRFX0VSUk9SXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25zdCBtZXRob2ROYW1lID0gbWV0aG9kIGFzIE1ldGhvZE5hbWU7XG4gICAgICBpZiAoIVNUT1JBR0VfUlBDX01FVEhPRFMuaW5jbHVkZXMobWV0aG9kTmFtZSkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBlcnJvcjoge1xuICAgICAgICAgICAgY29kZTogXCJVTktOT1dOX01FVEhPRFwiLFxuICAgICAgICAgICAgbWVzc2FnZTogYFVua25vd24gUlBDIG1ldGhvZDogJHttZXRob2R9YCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZWZhdWx0SGFuZGxlciA9IGFzeW5jICgpOiBQcm9taXNlPFJwY1Jlc3VsdD4gPT4ge1xuICAgICAgICByZXR1cm4gYXdhaXQgaGFuZGxlU3RvcmFnZVJlcXVlc3Qoe1xuICAgICAgICAgIGNvbmZpZzogc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgICByZXF1ZXN0OiB7IG1ldGhvZCwgcGFyYW1zIH0sXG4gICAgICAgICAgbmFtZTogbmFtZSA/PyBzdG9yYWdlQ29uZmlnLm5hbWUgPz8gXCJkZWZhdWx0XCIsXG4gICAgICAgICAgZ2V0U3RvcmFnZUhhbmRsZXJzLFxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVzPy5bbWV0aG9kTmFtZV0gYXNcbiAgICAgICAgfCAoKHBhcmFtczogdW5rbm93bikgPT4gUHJvbWlzZTxBZ2VudFJwY1Jlc3VsdDx1bmtub3duPj4pXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvdmVycmlkZVJlc3VsdCA9IGF3YWl0IG92ZXJyaWRlPy4ocGFyYW1zKTtcbiAgICAgICAgaWYgKG92ZXJyaWRlUmVzdWx0KSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlZCA9IGhhbmRsZU92ZXJyaWRlUmVzdWx0KG92ZXJyaWRlUmVzdWx0KTtcbiAgICAgICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBkZWZhdWx0SGFuZGxlcigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBjb2RlOiBcIlNUT1JBR0VfRVJST1JcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1czogNTAwLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFJvdXRlcyBzdG9yYWdlIFJQQyByZXF1ZXN0cyBiYXNlZCBvbiBzdG9yYWdlIGNvbmZpZyB0eXBlLlxuICovXG5hc3luYyBmdW5jdGlvbiBoYW5kbGVTdG9yYWdlUmVxdWVzdCh7XG4gIGNvbmZpZyxcbiAgcmVxdWVzdCxcbiAgbmFtZSxcbiAgZ2V0U3RvcmFnZUhhbmRsZXJzLFxufToge1xuICBjb25maWc6IFN0b3JhZ2VDb25maWc7XG4gIHJlcXVlc3Q6IFJwY1JlcXVlc3Q7XG4gIG5hbWU6IHN0cmluZztcbiAgZ2V0U3RvcmFnZUhhbmRsZXJzOiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPFN0b3JhZ2VIYW5kbGVycz47XG59KTogUHJvbWlzZTxScGNSZXNwb25zZT4ge1xuICBzd2l0Y2ggKGNvbmZpZy50eXBlKSB7XG4gICAgY2FzZSBcImxvY2FsXCI6IHtcbiAgICAgIGNvbnN0IGhhbmRsZXJzID0gYXdhaXQgZ2V0U3RvcmFnZUhhbmRsZXJzKG5hbWUpO1xuICAgICAgY29uc3QgeyBoYW5kbGVTdG9yYWdlUnBjIH0gPSBhd2FpdCBpbXBvcnQoXCIuL3N0b3JhZ2UvaGFuZGxlclwiKTtcbiAgICAgIHJldHVybiBoYW5kbGVTdG9yYWdlUnBjKHJlcXVlc3QsIGhhbmRsZXJzKTtcbiAgICB9XG4gICAgY2FzZSBcInZlcmNlbFwiOiB7XG4gICAgICBjb25zdCB7IGdldFZlcmNlbFN0b3JhZ2VDb25maWcgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgICAgXCIuL3N0b3JhZ2UvYmluZGluZ3MvdmVyY2VsXCJcbiAgICAgICk7XG4gICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGdldFZlcmNlbFN0b3JhZ2VDb25maWcoKTtcbiAgICAgIHJldHVybiBhd2FpdCBwcm94eVN0b3JhZ2VSZXF1ZXN0KHtcbiAgICAgICAgdXJsOiByZXNvbHZlZC51cmwsXG4gICAgICAgIGhlYWRlcnM6IHsgLi4ucmVzb2x2ZWQuaGVhZGVycywgXCJ4LWFnZW50LW5hbWVcIjogbmFtZSB9LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNhc2UgXCJjdXN0b21cIjoge1xuICAgICAgcmV0dXJuIGF3YWl0IHByb3h5U3RvcmFnZVJlcXVlc3Qoe1xuICAgICAgICB1cmw6IHJlc29sdmVBcGlVcmwoeyBhcGk6IGNvbmZpZy51cmwgfSksXG4gICAgICAgIGhlYWRlcnM6IHsgLi4uY29uZmlnLmhlYWRlcnMsIFwieC1hZ2VudC1uYW1lXCI6IG5hbWUgfSxcbiAgICAgICAgcmVxdWVzdCxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBjb25maWcgc2F0aXNmaWVzIG5ldmVyO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVW5rbm93biBzdG9yYWdlIHR5cGU6ICR7KGNvbmZpZyBhcyB7IHR5cGU6IHN0cmluZyB9KS50eXBlfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUHJveGllcyBhIHN0b3JhZ2UgUlBDIHJlcXVlc3QgdG8gYW4gZXh0ZXJuYWwgVVJMLlxuICovXG5hc3luYyBmdW5jdGlvbiBwcm94eVN0b3JhZ2VSZXF1ZXN0KHtcbiAgdXJsLFxuICBoZWFkZXJzLFxuICByZXF1ZXN0LFxufToge1xuICB1cmw6IHN0cmluZztcbiAgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG4gIHJlcXVlc3Q6IFJwY1JlcXVlc3Q7XG59KTogUHJvbWlzZTxScGNSZXNwb25zZT4ge1xuICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKHVybCwge1xuICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgaGVhZGVyczoge1xuICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIsXG4gICAgICAuLi5oZWFkZXJzLFxuICAgIH0sXG4gICAgYm9keTogSlNPTi5zdHJpbmdpZnkocmVxdWVzdCksXG4gIH0pO1xuXG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXJyb3I6IHtcbiAgICAgICAgY29kZTogXCJQUk9YWV9FUlJPUlwiLFxuICAgICAgICBtZXNzYWdlOiBgU3RvcmFnZSBwcm94eSBmYWlsZWQ6ICR7cmVzcG9uc2Uuc3RhdHVzfSAke3Jlc3BvbnNlLnN0YXR1c1RleHR9YCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiByZXNwb25zZS5qc29uKCkgYXMgUHJvbWlzZTxScGNSZXNwb25zZT47XG59XG5cbmZ1bmN0aW9uIHNjaGVtYVRvSnNvblNjaGVtYShzY2hlbWE6IHVua25vd24pOiBKU09OU2NoZW1hNyB8IHVuZGVmaW5lZCB7XG4gIGlmICghc2NoZW1hKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChcbiAgICB0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiICYmXG4gICAgc2NoZW1hICE9PSBudWxsICYmXG4gICAgXCJfZGVmXCIgaW4gc2NoZW1hICYmXG4gICAgdHlwZW9mIChzY2hlbWEgYXMgei5ab2RUeXBlKS5fZGVmID09PSBcIm9iamVjdFwiXG4gICkge1xuICAgIHJldHVybiB6LnRvSlNPTlNjaGVtYShzY2hlbWEgYXMgei5ab2RUeXBlKSBhcyBKU09OU2NoZW1hNztcbiAgfVxuXG4gIGlmICh0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiICYmIHNjaGVtYSAhPT0gbnVsbCkge1xuICAgIGNvbnN0IHMgPSBzY2hlbWEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgaWYgKFN5bWJvbC5mb3IoXCJ2ZXJjZWwuYWkuc2NoZW1hXCIpIGluIHMgJiYgXCJqc29uU2NoZW1hXCIgaW4gcykge1xuICAgICAgcmV0dXJuIHMuanNvblNjaGVtYSBhcyBKU09OU2NoZW1hNztcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgdHlwZW9mIHNjaGVtYSA9PT0gXCJvYmplY3RcIiAmJlxuICAgIHNjaGVtYSAhPT0gbnVsbCAmJlxuICAgIChcInR5cGVcIiBpbiBzY2hlbWEgfHwgXCJwcm9wZXJ0aWVzXCIgaW4gc2NoZW1hKVxuICApIHtcbiAgICByZXR1cm4gc2NoZW1hIGFzIEpTT05TY2hlbWE3O1xuICB9XG5cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cbiIsICJpbXBvcnQgdHlwZSB7IFVJTWVzc2FnZSB9IGZyb20gXCJhaVwiO1xuaW1wb3J0IHsgdWxpZCB9IGZyb20gXCJ1bGlkXCI7XG5pbXBvcnQgdHlwZSB7IFNlbmRJbnB1dCB9IGZyb20gXCIuLi9jbGllbnRcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgUGFydCB9IGZyb20gXCIuLi9zdG9yYWdlXCI7XG5cbmV4cG9ydCBmdW5jdGlvbiB0b01lc3NhZ2VBbmRQYXJ0cyh7XG4gIHNlc3Npb25JZCxcbiAgaWQsXG4gIGlucHV0LFxuICBkZWZhdWx0Um9sZSxcbn06IHtcbiAgc2Vzc2lvbklkOiBzdHJpbmc7XG4gIGlkPzogc3RyaW5nO1xuICBpbnB1dDogU2VuZElucHV0O1xuICBkZWZhdWx0Um9sZTogVUlNZXNzYWdlW1wicm9sZVwiXTtcbn0pOiB7IG1lc3NhZ2U6IE1lc3NhZ2U7IHBhcnRzOiBQYXJ0W10gfSB7XG4gIGNvbnN0IG1lc3NhZ2VJZCA9IGlkID8/IGBtZXNzYWdlXyR7dWxpZCgpfWA7XG4gIGlmICh0eXBlb2YgaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgIHJldHVybiB7XG4gICAgICBtZXNzYWdlOiB7XG4gICAgICAgIGlkOiBtZXNzYWdlSWQsXG4gICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgcm9sZTogZGVmYXVsdFJvbGUsXG4gICAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgICBzdGFydGVkQXQ6IG51bGwsXG4gICAgICAgIGNvbXBsZXRlZEF0OiBudWxsLFxuICAgICAgICBpbnRlcnJ1cHRlZEF0OiBudWxsLFxuICAgICAgICB1c2FnZTogbnVsbCxcbiAgICAgIH0sXG4gICAgICBwYXJ0czogW1xuICAgICAgICB7XG4gICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgIG1lc3NhZ2VJZCxcbiAgICAgICAgICBpZDogYHBhcnRfJHt1bGlkKCl9YCxcbiAgICAgICAgICBpbmRleDogMCxcbiAgICAgICAgICBwYXJ0OiB7IHR5cGU6IFwidGV4dFwiLCB0ZXh0OiBpbnB1dCB9LFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9O1xuICB9XG4gIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gIHJldHVybiB7XG4gICAgbWVzc2FnZToge1xuICAgICAgc2Vzc2lvbklkLFxuICAgICAgaWQ6IG1lc3NhZ2VJZCxcbiAgICAgIGNyZWF0ZWRBdDogbm93LFxuICAgICAgc3RhcnRlZEF0OiBudWxsLFxuICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICBpbnRlcnJ1cHRlZEF0OiBudWxsLFxuICAgICAgdXNhZ2U6IG51bGwsXG4gICAgICByb2xlOiBpbnB1dC5yb2xlID8/IGRlZmF1bHRSb2xlLFxuICAgIH0sXG4gICAgcGFydHM6IGlucHV0LnBhcnRzLm1hcCgocGFydCwgaW5kZXgpID0+ICh7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBtZXNzYWdlSWQsXG4gICAgICBpZDogYHBhcnRfJHt1bGlkKCl9YCxcbiAgICAgIGluZGV4LFxuICAgICAgcGFydCxcbiAgICB9KSksXG4gIH07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBVUEsU0FBUyxXQUFXO0FBQ3BCLFlBQVksWUFBWTtBQUN4QixPQUFPLFdBQVc7QUFDbEIsU0FBUyxRQUFBQSxhQUFZO0FBQ3JCLFNBQVMsUUFBUSxhQUFhOzs7QUNiOUIsU0FBUyxTQUFTO0FBc0dsQixTQUFTLHFCQUF3QixLQUE2QztBQUM1RSxNQUFJLFFBQVEsTUFBTTtBQUNoQixXQUFPO0FBQUEsRUFDVDtBQUNBLE1BQUksSUFBSSxJQUFJO0FBQ1YsV0FBTyxFQUFFLFFBQVEsSUFBSSxPQUFPO0FBQUEsRUFDOUI7QUFDQSxTQUFPO0FBQUEsSUFDTCxPQUFPLEVBQUUsTUFBTSxpQkFBaUIsU0FBUyxJQUFJLE1BQU07QUFBQSxJQUNuRCxRQUFRO0FBQUEsRUFDVjtB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QUNBO0FBQUEsUUFDQSxLQUFLLFNBQVM7QUFBQSxRQUNkO0FBQUEsTUFDRjtBQUVBLFlBQU0sU0FBUyxNQUFNLFNBQVMsUUFBUSxRQUFRLGlCQUFpQixJQUFJO0FBRW5FLFVBQUksQ0FBQyxXQUFXO0FBQ2QsZUFBTztBQUFBLE1BQ1Q7QUFFQSxZQUFNLFNBQVMsV0FBVyxTQUFVLE9BQU8sVUFBVSxNQUFPO0FBQzVELGFBQU8sU0FBUztBQUFBLFFBQ2QsV0FBVyxTQUFTLEVBQUUsT0FBTyxPQUFPLE1BQU0sSUFBSSxFQUFFLFFBQVEsT0FBTyxPQUFPO0FBQUEsUUFDdEUsRUFBRSxPQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0Y7QUFBQSxJQUVBLE9BQU8sRUFBRSxHQUFHLGNBQWMsR0FBRyxRQUFRLE1BQU07QUFBQSxJQUUzQyxLQUFNLE1BQU07QUFDVixZQUFNLElBQUk7QUFBQSxRQUNSO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogWyJ1bGlkIiwgIm5hbWUiLCAicmVzdWx0IiwgImhhbmRsZVN0b3JhZ2VScGMiLCAibm93IiwgInVsaWQiLCAic2Vzc2lvbiJdCn0K
1107
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2NsaWVudC50cyIsICIuLi9zcmMvcnBjLWRpc3BhdGNoLnRzIiwgIi4uL3NyYy91dGlscy9tZXNzYWdlLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBnZXRWZXJjZWxPaWRjVG9rZW5TeW5jIH0gZnJvbSBcIkB2ZXJjZWwvb2lkY1wiO1xuaW1wb3J0IHR5cGUge1xuICBHYXRld2F5TW9kZWxJZCxcbiAgSW5mZXJUb29sSW5wdXQsXG4gIEluZmVyVUlUb29scyxcbiAgTW9kZWxNZXNzYWdlLFxuICBUb29sU2V0LFxuICBVSURhdGFUeXBlcyxcbiAgVUlNZXNzYWdlLFxuICBVSU1lc3NhZ2VDaHVuayxcbn0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyBhbGwgfSBmcm9tIFwiYmV0dGVyLWFsbFwiO1xuaW1wb3J0ICogYXMgZXJyb3JlIGZyb20gXCJlcnJvcmVcIjtcbmltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyB1bGlkIH0gZnJvbSBcInVsaWRcIjtcbmltcG9ydCB7IGdldFJ1biwgc3RhcnQgfSBmcm9tIFwid29ya2Zsb3cvYXBpXCI7XG5pbXBvcnQgdHlwZSB7IHogfSBmcm9tIFwiem9kXCI7XG5pbXBvcnQge1xuICB0eXBlIEFnZW50SW5wdXQsXG4gIHR5cGUgQWdlbnRNZXNzYWdlSW5wdXQsXG4gIGFnZW50TWVzc2FnZUhvb2ssXG4gIGFnZW50V29ya2Zsb3csXG4gIGFwcHJvdmFsSG9vayxcbn0gZnJvbSBcIi4vYWdlbnQtd29ya2Zsb3dcIjtcbmltcG9ydCB7XG4gIFNhbmRib3hOb3RGb3VuZEVycm9yLFxuICBTZXNzaW9uRXJyb3IsXG4gIFNlc3Npb25Ob3RGb3VuZEVycm9yLFxufSBmcm9tIFwiLi9lcnJvcnNcIjtcbmltcG9ydCB0eXBlIHsgR2VuZXJhdGlvbk9wdGlvbnMgfSBmcm9tIFwiLi9nZW5lcmF0aW9uXCI7XG5pbXBvcnQge1xuICB0eXBlIERpc3BhdGNoQ29udGV4dCxcbiAgZGlzcGF0Y2gsXG4gIHR5cGUgSG9va1Rvb2xBZnRlclBhcmFtcyxcbiAgdHlwZSBIb29rVG9vbEFmdGVyUmVzdWx0LFxuICB0eXBlIEhvb2tUb29sQmVmb3JlUGFyYW1zLFxuICB0eXBlIEhvb2tUb29sQmVmb3JlUmVzdWx0LFxuICB0eXBlIFRvb2xNZXRhZGF0YSxcbiAgdHlwZSBUb29sc0V4ZWN1dGVQYXJhbXMsXG4gIHR5cGUgVG9vbHNOZWVkc0FwcHJvdmFsUGFyYW1zLFxuICB0eXBlIFRvb2xzTmVlZHNBcHByb3ZhbFJlc3VsdCxcbn0gZnJvbSBcIi4vcnBjLWRpc3BhdGNoXCI7XG5pbXBvcnQgeyBnZXRTYW5kYm94IH0gZnJvbSBcIi4vc2FuZGJveFwiO1xuaW1wb3J0IHR5cGUgeyBPblJlc3RhcnQsIFNhbmRib3hTZXR1cCB9IGZyb20gXCIuL3NhbmRib3gvdHlwZXNcIjtcbmltcG9ydCB7IG5vcm1hbGl6ZVNraWxsc0RpcnMgfSBmcm9tIFwiLi9za2lsbHMvcGFyc2VyXCI7XG5pbXBvcnQgdHlwZSB7IFNraWxsc0RpciB9IGZyb20gXCIuL3NraWxscy90eXBlc1wiO1xuaW1wb3J0IHtcbiAgdHlwZSBTdG9yYWdlIGFzIEFnZW50U3RvcmFnZSxcbiAgREVGQVVMVF9OQU1FU1BBQ0UsXG4gIGdldFN0b3JhZ2UsXG4gIExPQ0FMX1NUT1JBR0VfVkVSU0lPTixcbiAgdHlwZSBNZXNzYWdlLFxuICB0eXBlIFBhcnQsXG4gIHR5cGUgU2FuZGJveENvbmZpZyxcbiAgdHlwZSBTZXNzaW9uLFxuICB0eXBlIFN0b3JhZ2VDb25maWcsXG4gIHR5cGUgSGFuZGxlcnMgYXMgU3RvcmFnZUhhbmRsZXJzLFxuICB0eXBlIFN0b3JhZ2VNZXRob2RzLFxufSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyB0eXBlIEJ1aWx0SW5Ub29sTmFtZSwgYnVpbHRJblRvb2xzLCB0eXBlIFRvb2xDb250ZXh0IH0gZnJvbSBcIi4vdG9vbHNcIjtcbmltcG9ydCB7IHRvTWVzc2FnZUFuZFBhcnRzIH0gZnJvbSBcIi4vdXRpbHMvbWVzc2FnZVwiO1xuaW1wb3J0IHsgYXNzZW1ibGVVSU1lc3NhZ2VzIH0gZnJvbSBcIi4vdXRpbHMvdWlcIjtcbmltcG9ydCB7IGNvbXB1dGVTZXNzaW9uVXNhZ2UsIHR5cGUgU2Vzc2lvblVzYWdlIH0gZnJvbSBcIi4vdXRpbHMvdXNhZ2VcIjtcblxuZXhwb3J0IHR5cGUgU2VuZElucHV0ID1cbiAgfCBzdHJpbmdcbiAgfCB7IHJvbGU/OiBVSU1lc3NhZ2VbXCJyb2xlXCJdOyBwYXJ0czogVUlNZXNzYWdlW1wicGFydHNcIl07IGlkPzogc3RyaW5nIH07XG5cbi8qKlxuICogSW5mZXIgYSB0eXBlZCBVSU1lc3NhZ2UgZnJvbSBhbiBhZ2VudCBpbnN0YW5jZS5cbiAqIFRvb2wgcGFydHMgYXJlIGRpc2NyaW1pbmF0ZWQgYnkgYHR5cGU6IFwidG9vbC0ke25hbWV9XCJgIHdpdGggdHlwZWQgaW5wdXQvb3V0cHV0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgbXlBZ2VudCA9IGFnZW50KHsgdG9vbHM6IHsgbXlUb29sOiB0b29sKHsuLi59KSB9IH0pO1xuICogdHlwZSBNeU1lc3NhZ2UgPSBJbmZlclVJTWVzc2FnZTx0eXBlb2YgbXlBZ2VudD47XG4gKiAvLyBNeU1lc3NhZ2UucGFydHMgaW5jbHVkZXMgeyB0eXBlOiBcInRvb2wtbXlUb29sXCI7IGlucHV0OiBNeUlucHV0OyBvdXRwdXQ6IE15T3V0cHV0OyAuLi4gfVxuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIEluZmVyVUlNZXNzYWdlPEE+ID0gQSBleHRlbmRzIHsgdG9vbHM6IGluZmVyIFQgZXh0ZW5kcyBUb29sU2V0IH1cbiAgPyBVSU1lc3NhZ2U8dW5rbm93biwgVUlEYXRhVHlwZXMsIEluZmVyVUlUb29sczxUPj5cbiAgOiBVSU1lc3NhZ2U7XG5cbnR5cGUgVG9vbE5hbWU8VG9vbHM+ID0gRXh0cmFjdDxrZXlvZiBUb29scywgc3RyaW5nPiB8IEJ1aWx0SW5Ub29sTmFtZTtcblxudHlwZSBUb29sSW5wdXQ8VG9vbHMsIEs+ID0gSyBleHRlbmRzIEJ1aWx0SW5Ub29sTmFtZVxuICA/IEluZmVyVG9vbElucHV0PCh0eXBlb2YgYnVpbHRJblRvb2xzKVtLXT5cbiAgOiBLIGV4dGVuZHMga2V5b2YgVG9vbHNcbiAgICA/IFRvb2xzW0tdIGV4dGVuZHMgaW1wb3J0KFwiYWlcIikuVG9vbFxuICAgICAgPyBJbmZlclRvb2xJbnB1dDxUb29sc1tLXT5cbiAgICAgIDogdW5rbm93blxuICAgIDogdW5rbm93bjtcblxuZXhwb3J0IHR5cGUgTmVlZHNBcHByb3ZhbE1hcDxUb29scz4gPSB7XG4gIFtLIGluIFRvb2xOYW1lPFRvb2xzPl0/OlxuICAgIHwgYm9vbGVhblxuICAgIHwgKChcbiAgICAgICAgaW5wdXQ6IFRvb2xJbnB1dDxUb29scywgSz4sXG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICB0b29sQ2FsbElkOiBzdHJpbmc7XG4gICAgICAgICAgbWVzc2FnZXM6IE1vZGVsTWVzc2FnZVtdO1xuICAgICAgICAgIGV4cGVyaW1lbnRhbF9jb250ZXh0OiB1bmtub3duO1xuICAgICAgICB9XG4gICAgICApID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KTtcbn07XG5cbi8qKlxuICogT3B0aW9ucyB0aGF0IGNhbiBiZSBzZXQgcGVyLXNlc3Npb24sIG92ZXJyaWRpbmcgYWdlbnQtbGV2ZWwgZGVmYXVsdHMuXG4gKi9cbmV4cG9ydCB0eXBlIFNlc3Npb25PcHRpb25zPFxuICBUb29scyBleHRlbmRzIFRvb2xTZXQsXG4gIFRUYWdzIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSBSZWNvcmQ8c3RyaW5nLCBuZXZlcj4sXG4+ID0ge1xuICAvKiogVGhlIEFJIG1vZGVsIHRvIHVzZS4gKi9cbiAgbW9kZWw/OiBHYXRld2F5TW9kZWxJZDtcbiAgLyoqIFN5c3RlbSBwcm9tcHQgZm9yIHRoZSBBSSBtb2RlbC4gKi9cbiAgc3lzdGVtPzogc3RyaW5nO1xuICAvKiogU2FuZGJveCBjb25maWd1cmF0aW9uIG9yIElELiBJZiBzdHJpbmcsIHVzZXMgYXMgc2FuZGJveCBJRCB3aXRoIGl0cyBjb25maWcuICovXG4gIHNhbmRib3g/OlxuICAgIHwgKFNhbmRib3hDb25maWcgJiB7IHNldHVwPzogU2FuZGJveFNldHVwOyBvblJlc3RhcnQ/OiBPblJlc3RhcnQgfSlcbiAgICB8IHN0cmluZztcbiAgLyoqIEtleS12YWx1ZSBtZXRhZGF0YSB0YWdzIGZvciB0aGUgc2Vzc2lvbi4gKi9cbiAgdGFncz86IFRUYWdzO1xuICAvKiogRGlyZWN0b3J5IGNvbnRhaW5pbmcgc2tpbGwgZGVmaW5pdGlvbnMgZm9yIHRoZSBhZ2VudC4gKi9cbiAgc2tpbGxzRGlyPzogU2tpbGxzRGlyO1xuICAvKipcbiAgICogTmFtZXMgb2YgdG9vbHMgdG8gYWN0aXZhdGUgZm9yIHRoaXMgc2Vzc2lvbi5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgYWxsIGFnZW50LWxldmVsIHRvb2xzIGFyZSBhY3RpdmUuXG4gICAqIFVzZSB0aGlzIHRvIHJlc3RyaWN0IHdoaWNoIHRvb2xzIGFyZSBhdmFpbGFibGUgcGVyLXNlc3Npb24uXG4gICAqL1xuICBhY3RpdmVUb29scz86IChFeHRyYWN0PGtleW9mIFRvb2xzLCBzdHJpbmc+IHwgQnVpbHRJblRvb2xOYW1lKVtdO1xuICAvKiogR2VuZXJhdGlvbiBvcHRpb25zICh0ZW1wZXJhdHVyZSwgbWF4U3RlcHMsIGV0Yy4pLiBPdmVycmlkZXMgYWdlbnQtbGV2ZWwgZGVmYXVsdHMuICovXG4gIGdlbmVyYXRpb24/OiBHZW5lcmF0aW9uT3B0aW9ucztcbn07XG5cbi8qKlxuICogRmllbGRzIHRoYXQgY2FuIGJlIHVwZGF0ZWQgb24gYW4gZXhpc3Rpbmcgc2Vzc2lvbiB2aWEgYHNlc3Npb24udXBkYXRlKClgLlxuICogRXhjbHVkZXMgc2FuZGJveCAobm90IGNoYW5nZWFibGUgYWZ0ZXIgY3JlYXRpb24pIGFuZCB0YWdzICh1c2UgYHNlc3Npb24udGFnYCBtZXRob2RzKS5cbiAqL1xuZXhwb3J0IHR5cGUgU2Vzc2lvblVwZGF0ZU9wdGlvbnM8VG9vbHMgZXh0ZW5kcyBUb29sU2V0PiA9IFBpY2s8XG4gIFNlc3Npb25PcHRpb25zPFRvb2xzPixcbiAgXCJtb2RlbFwiIHwgXCJzeXN0ZW1cIiB8IFwic2tpbGxzRGlyXCIgfCBcImFjdGl2ZVRvb2xzXCIgfCBcImdlbmVyYXRpb25cIlxuPjtcblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGNyZWF0aW5nIGFuIGFnZW50IGluc3RhbmNlLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogY29uc3QgbXlBZ2VudCA9IGFnZW50KHtcbiAqICAgbW9kZWw6IFwiYW50aHJvcGljL2NsYXVkZS1vcHVzLTQuNVwiLFxuICogICBzeXN0ZW06IFwiWW91IGFyZSBhIGhlbHBmdWwgYXNzaXN0YW50Li4uXCIsXG4gKiAgIHRhZ3NTY2hlbWE6IHoub2JqZWN0KHsgdXNlcklkOiB6LnN0cmluZygpIH0pLFxuICogICBjb250ZXh0U2NoZW1hOiB6Lm9iamVjdCh7IGF1dGhUb2tlbjogei5zdHJpbmcoKSB9KSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCB0eXBlIEFnZW50T3B0aW9uczxcbiAgVG9vbHMgZXh0ZW5kcyBUb29sU2V0LFxuICBUVGFncyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgbmV2ZXI+LFxuICBUQ29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgbmV2ZXI+LFxuPiA9IHtcbiAgLyoqXG4gICAqIEFnZW50IG5hbWUuIFVzZWQgdG8gaXNvbGF0ZSBzdG9yYWdlIGRhdGEgLSBkaWZmZXJlbnQgbmFtZXMgaGF2ZSBzZXBhcmF0ZSBkYXRhLlxuICAgKiBAZGVmYXVsdCBcImRlZmF1bHRcIlxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqXG4gICAqIFN0b3JhZ2UgYmFja2VuZCBjb25maWd1cmF0aW9uLlxuICAgKiAtIGB7IHR5cGU6IFwibG9jYWxcIiB9YCAtIGZpbGVzeXN0ZW0gc3RvcmFnZSAoZGV2KVxuICAgKiAtIGB7IHR5cGU6IFwidmVyY2VsXCIgfWAgLSBWZXJjZWwgbWFuYWdlZCBzdG9yYWdlIChwcm9kKVxuICAgKiAtIGB7IHR5cGU6IFwiY3VzdG9tXCIsIHVybDogXCIuLi5cIiB9YCAtIGN1c3RvbSBIVFRQIGJhY2tlbmRcbiAgICogQGRlZmF1bHQgSW5mZXJyZWQgZnJvbSBlbnZpcm9ubWVudDogYHsgdHlwZTogXCJ2ZXJjZWxcIiB9YCB3aGVuIGBWRVJDRUxfT0lEQ19UT0tFTmAgaXMgc2V0LCBgeyB0eXBlOiBcImxvY2FsXCIgfWAgb3RoZXJ3aXNlLlxuICAgKi9cbiAgc3RvcmFnZT86IFN0b3JhZ2VDb25maWc7XG4gIC8qKlxuICAgKiBDdXN0b20gdG9vbHMgYXZhaWxhYmxlIHRvIHRoZSBhZ2VudC5cbiAgICogVGhlc2UgYXJlIGV4cG9zZWQgdmlhIHRoZSBSUEMgaGFuZGxlciBhbmQgY2FsbGVkIG92ZXIgSFRUUC5cbiAgICovXG4gIHRvb2xzPzogVG9vbHM7XG4gIC8qKlxuICAgKiBIb29rcyBmb3IgaW50ZXJjZXB0aW5nIGFnZW50IG9wZXJhdGlvbnMuXG4gICAqL1xuICBob29rcz86IEFnZW50SG9va3M7XG4gIC8qKlxuICAgKiBTY2hlbWEgZm9yIHNlc3Npb24gdGFncy4gQWxsIHNlc3Npb25zIHNoYXJlIHRoaXMgc2NoZW1hLlxuICAgKiBUYWdzIGFyZSBwZXJzaXN0ZWQgaW4gc3RvcmFnZSBhbmQgc3Vydml2ZSBhY3Jvc3MgcmVxdWVzdHMuXG4gICAqL1xuICB0YWdzU2NoZW1hPzogei5ab2RUeXBlPFRUYWdzPjtcbiAgLyoqXG4gICAqIFNjaGVtYSBmb3IgdHJhbnNpZW50IHRvb2wgY29udGV4dC4gUGFzc2VkIHBlci1yZXF1ZXN0IHZpYSBzZW5kKCkuXG4gICAqIE5PVCBwZXJzaXN0ZWQgLSB1c2UgZm9yIHNlY3JldHMgbGlrZSBhdXRoIHRva2Vucy5cbiAgICovXG4gIGNvbnRleHRTY2hlbWE/OiB6LlpvZFR5cGU8VENvbnRleHQ+O1xuICAvKipcbiAgICogQXBwcm92YWwgcnVsZXMgZm9yIHRvb2xzIHlvdSBkb24ndCBvd24gKGJ1aWx0LWluIG9yIHRoaXJkLXBhcnR5KS5cbiAgICogTWFwcyB0b29sIG5hbWVzIHRvIGEgYm9vbGVhbiBvciBhIGZ1bmN0aW9uIHRoYXQgZGVjaWRlcyB3aGV0aGVyIHRvIGFzay5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogbmVlZHNBcHByb3ZhbDoge1xuICAgKiAgIEJhc2g6IChpbnB1dCkgPT4gaW5wdXQuY29tbWFuZC5zdGFydHNXaXRoKFwicm1cIiksXG4gICAqICAgV3JpdGU6IHRydWUsXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBuZWVkc0FwcHJvdmFsPzogTmVlZHNBcHByb3ZhbE1hcDxUb29scz47XG4gIC8qKlxuICAgKiBTYW5kYm94IGNvbmZpZ3VyYXRpb24gd2l0aCBvcHRpb25hbCBzZXR1cCBhbmQgcmVzdGFydCBob29rcy5cbiAgICpcbiAgICogLSBgc2V0dXAua2V5YDogZXhwbGljaXQgc3RyaW5nIHRvIGNvbnRyb2wgc25hcHNob3QgaW52YWxpZGF0aW9uIChidW1wIHRvIHJlLXJ1bilcbiAgICogLSBgc2V0dXAucnVuYDogYXN5bmMgZnVuY3Rpb24gdGhhdCBydW5zIG9uY2UgdG8gaW5pdGlhbGl6ZSB0aGUgc2FuZGJveCwgdGhlbiBnZXRzIHNuYXBzaG90dGVkXG4gICAqIC0gYG9uUmVzdGFydGA6IGFzeW5jIGZ1bmN0aW9uIHRoYXQgcnVucyBldmVyeSB0aW1lIGEgc2FuZGJveCByZXN1bWVzIGZyb20gYSBzbmFwc2hvdFxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBgYGB0c1xuICAgKiBzYW5kYm94OiB7XG4gICAqICAgdHlwZTogXCJ2ZXJjZWxcIixcbiAgICogICBzZXR1cDoge1xuICAgKiAgICAga2V5OiBcImRldi1lbnYtdjNcIixcbiAgICogICAgIHJ1bjogYXN5bmMgKHNhbmRib3gpID0+IHtcbiAgICogICAgICAgYXdhaXQgc2FuZGJveC5leGVjKHsgY29tbWFuZDogXCJucG1cIiwgYXJnczogW1wiaVwiLCBcIi1nXCIsIFwidmVyY2VsXCJdIH0pXG4gICAqICAgICB9LFxuICAgKiAgIH0sXG4gICAqICAgb25SZXN0YXJ0OiBhc3luYyAoc2FuZGJveCkgPT4ge1xuICAgKiAgICAgYXdhaXQgc2FuZGJveC5leGVjKHsgY29tbWFuZDogXCJiYXNoXCIsIGFyZ3M6IFtcIi1jXCIsIFwibnBtIHJ1biBkZXYgJlwiXSB9KVxuICAgKiAgIH0sXG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBzYW5kYm94PzpcbiAgICB8IChTYW5kYm94Q29uZmlnICYgeyBzZXR1cD86IFNhbmRib3hTZXR1cDsgb25SZXN0YXJ0PzogT25SZXN0YXJ0IH0pXG4gICAgfCBzdHJpbmc7XG59ICYgT21pdDxTZXNzaW9uT3B0aW9uczxUb29scywgVFRhZ3M+LCBcInRhZ3NcIiB8IFwic2FuZGJveFwiPjtcblxuLyoqXG4gKiBCYXNlIHR5cGUgZm9yIHNlc3Npb24vc2FuZGJveCB0YWdzLiBVc2VkIGZvciBnZW5lcmljIGNvbnN0cmFpbnRzLlxuICogRm9yIGFnZW50LWxldmVsIHRhZyB2YWxpZGF0aW9uLCB1c2UgYHRhZ3NTY2hlbWFgIG9wdGlvbiB3aXRoIGEgem9kIHNjaGVtYS5cbiAqL1xuZXhwb3J0IHR5cGUgVGFnc1NjaGVtYSA9IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4vKipcbiAqIEhvb2tzIGZvciBpbnRlcmNlcHRpbmcgYWdlbnQgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgQWdlbnRIb29rcyA9IHtcbiAgLyoqIENhbGxlZCBiZWZvcmUgYSB0b29sIGlzIGV4ZWN1dGVkLiBDYW4gbW9kaWZ5IGlucHV0IG9yIHRocm93IHRvIGJsb2NrLiAqL1xuICBcInRvb2wuYmVmb3JlXCI/OiAob3B0czoge1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBpbnB1dDogdW5rbm93bjtcbiAgICBjb250ZXh0OiBUb29sQ29udGV4dDtcbiAgfSkgPT4gUHJvbWlzZTx1bmRlZmluZWQgfCB7IGlucHV0OiB1bmtub3duIH0+O1xuICAvKiogQ2FsbGVkIGFmdGVyIGEgdG9vbCBpcyBleGVjdXRlZC4gQ2FuIG1vZGlmeSByZXN1bHQuICovXG4gIFwidG9vbC5hZnRlclwiPzogKG9wdHM6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgaW5wdXQ6IHVua25vd247XG4gICAgcmVzdWx0OiB1bmtub3duO1xuICAgIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xuICB9KSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IHsgcmVzdWx0OiB1bmtub3duIH0+O1xufTtcblxuLyoqXG4gKiBSUEMgcmVxdWVzdCBib2R5IGZvciBhZ2VudCBoYW5kbGVyLlxuICogRGlzY3JpbWluYXRlZCB1bmlvbiBvbiBgbWV0aG9kYCBmb3IgdHlwZS1zYWZlIHBhcmFtcy5cbiAqL1xuZXhwb3J0IHR5cGUgQWdlbnRScGNSZXF1ZXN0ID0ge1xuICBbSyBpbiBrZXlvZiBBZ2VudFJwY01ldGhvZHNdOiB7XG4gICAgbWV0aG9kOiBLO1xuICAgIHBhcmFtczogQWdlbnRScGNNZXRob2RzW0tdW1wicGFyYW1zXCJdO1xuICB9O1xufVtrZXlvZiBBZ2VudFJwY01ldGhvZHNdO1xuXG4vKipcbiAqIFJQQyByZXNwb25zZSB0eXBlIGZvciBkaXNwYXRjaC5cbiAqL1xuZXhwb3J0IHR5cGUgUnBjUmVzdWx0PFQgPSB1bmtub3duPiA9XG4gIHwgeyByZXN1bHQ6IFQgfVxuICB8IHsgZXJyb3I6IHsgY29kZTogc3RyaW5nOyBtZXNzYWdlOiBzdHJpbmcgfTsgc3RhdHVzPzogbnVtYmVyIH07XG5cbi8qKlxuICogRGlyZWN0IFJQQyBwYXlsb2FkIGZvciBzdGVwIGZ1bmN0aW9uIGNhbGxzIChubyBIVFRQKS5cbiAqL1xuZXhwb3J0IHR5cGUgUnBjUGF5bG9hZCA9IHtcbiAgbmFtZT86IHN0cmluZztcbiAgbWV0aG9kOiBzdHJpbmc7XG4gIHBhcmFtczogdW5rbm93bjtcbn07XG5cbi8qKlxuICogQWxsIFJQQyBtZXRob2RzIGF2YWlsYWJsZSBvbiB0aGUgYWdlbnQgaGFuZGxlci5cbiAqIENvbWJpbmVzIHRvb2xzIG1ldGhvZHMsIGhvb2tzLCBhbmQgc3RvcmFnZSBtZXRob2RzLlxuICovXG5leHBvcnQgdHlwZSBBZ2VudFJwY01ldGhvZHMgPSB7XG4gIFwidG9vbHMubGlzdFwiOiB7IHBhcmFtczogUmVjb3JkPHN0cmluZywgbmV2ZXI+OyByZXN1bHQ6IFRvb2xNZXRhZGF0YVtdIH07XG4gIFwidG9vbHMuZXhlY3V0ZVwiOiB7IHBhcmFtczogVG9vbHNFeGVjdXRlUGFyYW1zOyByZXN1bHQ6IHVua25vd24gfTtcbiAgXCJ0b29scy5uZWVkc0FwcHJvdmFsXCI6IHtcbiAgICBwYXJhbXM6IFRvb2xzTmVlZHNBcHByb3ZhbFBhcmFtcztcbiAgICByZXN1bHQ6IFRvb2xzTmVlZHNBcHByb3ZhbFJlc3VsdDtcbiAgfTtcbiAgXCJob29rLnRvb2wuYmVmb3JlXCI6IHtcbiAgICBwYXJhbXM6IEhvb2tUb29sQmVmb3JlUGFyYW1zO1xuICAgIHJlc3VsdDogSG9va1Rvb2xCZWZvcmVSZXN1bHQ7XG4gIH07XG4gIFwiaG9vay50b29sLmFmdGVyXCI6IHtcbiAgICBwYXJhbXM6IEhvb2tUb29sQWZ0ZXJQYXJhbXM7XG4gICAgcmVzdWx0OiBIb29rVG9vbEFmdGVyUmVzdWx0O1xuICB9O1xufSAmIFN0b3JhZ2VNZXRob2RzO1xuXG5leHBvcnQgdHlwZSBBZ2VudFJwY01ldGhvZE5hbWUgPSBrZXlvZiBBZ2VudFJwY01ldGhvZHM7XG5cbi8qKlxuICogUmVzdWx0IHR5cGUgZm9yIFJQQyBvdmVycmlkZSBoYW5kbGVycy5cbiAqIC0gYHsgb2s6IHRydWU7IHJlc3VsdDogVCB9YCAtIHJldHVybiB0aGlzIHJlc3VsdFxuICogLSBgeyBvazogZmFsc2U7IGVycm9yOiBzdHJpbmcgfWAgLSByZXR1cm4gdGhpcyBlcnJvclxuICogLSBgbnVsbGAgLSB1c2UgZGVmYXVsdCBoYW5kbGVyXG4gKi9cbmV4cG9ydCB0eXBlIEFnZW50UnBjUmVzdWx0PFQ+ID1cbiAgfCB7IG9rOiB0cnVlOyByZXN1bHQ6IFQgfVxuICB8IHsgb2s6IGZhbHNlOyBlcnJvcjogc3RyaW5nIH1cbiAgfCBudWxsO1xuXG4vKipcbiAqIE92ZXJyaWRlIGhhbmRsZXJzIGZvciBhZ2VudCBSUEMgbWV0aG9kcy5cbiAqIEVhY2ggbWV0aG9kIGNhbiBiZSBpbmRpdmlkdWFsbHkgb3ZlcnJpZGRlbi5cbiAqIFJldHVybiBgbnVsbGAgdG8gZmFsbCBiYWNrIHRvIHRoZSBkZWZhdWx0IGhhbmRsZXIuXG4gKi9cbmV4cG9ydCB0eXBlIEFnZW50UnBjT3ZlcnJpZGVzID0ge1xuICBbSyBpbiBBZ2VudFJwY01ldGhvZE5hbWVdPzogKFxuICAgIHBhcmFtczogQWdlbnRScGNNZXRob2RzW0tdW1wicGFyYW1zXCJdXG4gICkgPT4gUHJvbWlzZTxBZ2VudFJwY1Jlc3VsdDxBZ2VudFJwY01ldGhvZHNbS11bXCJyZXN1bHRcIl0+Pjtcbn07XG5cbmNvbnN0IGlzVmVyY2VsID0gKCkgPT4ge1xuICB0cnkge1xuICAgIHJldHVybiBCb29sZWFuKGdldFZlcmNlbE9pZGNUb2tlblN5bmMoKSk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGFnZW50ID0gPFxuICBUb29scyBleHRlbmRzIHt9LFxuICBUVGFncyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgbmV2ZXI+LFxuICBUQ29udGV4dCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0gUmVjb3JkPHN0cmluZywgbmV2ZXI+LFxuPihcbiAgb3B0aW9uczogQWdlbnRPcHRpb25zPFRvb2xzLCBUVGFncywgVENvbnRleHQ+XG4pID0+IHtcbiAgY29uc3QgYWdlbnRTZWNyZXQgPSBwcm9jZXNzLmVudi5BR0VOVF9TRUNSRVQ7XG4gIGlmICghYWdlbnRTZWNyZXQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBcIkFHRU5UX1NFQ1JFVCBlbnYgdmFyIGlzIHJlcXVpcmVkLiBVc2Ugd2l0aEFnZW50KCkgb3Igc2V0IGl0IG1hbnVhbGx5LlwiXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGJhc2VTdG9yYWdlQ29uZmlnID1cbiAgICBvcHRpb25zLnN0b3JhZ2UgPz9cbiAgICAoKGlzVmVyY2VsKClcbiAgICAgID8geyB0eXBlOiBcInZlcmNlbFwiIH1cbiAgICAgIDogeyB0eXBlOiBcImxvY2FsXCIgfSkgc2F0aXNmaWVzIFN0b3JhZ2VDb25maWcpO1xuICBjb25zdCBzdG9yYWdlQ29uZmlnOiBTdG9yYWdlQ29uZmlnID0ge1xuICAgIC4uLmJhc2VTdG9yYWdlQ29uZmlnLFxuICAgIG5hbWU6IG9wdGlvbnMubmFtZSA/PyBiYXNlU3RvcmFnZUNvbmZpZy5uYW1lLFxuICB9O1xuXG4gIC8qKlxuICAgKiBTdG9yYWdlIGlzIGluaXRpYWxpemVkIGxhemlseS5cbiAgICogVXNlcyBhZ2VudE9iai5ycGMgd2hpY2ggaXMgd2lyZWQgdXAgYnkgdGhlIGxvYWRlciBjYWxsaW5nIF9faW5pdEFnZW50LlxuICAgKi9cbiAgbGV0IF9zdG9yYWdlOiBBZ2VudFN0b3JhZ2UgfCBudWxsID0gbnVsbDtcbiAgY29uc3QgZ2V0U3RvcmFnZUluc3RhbmNlID0gKCk6IEFnZW50U3RvcmFnZSA9PiB7XG4gICAgaWYgKCFfc3RvcmFnZSkge1xuICAgICAgX3N0b3JhZ2UgPSBnZXRTdG9yYWdlKHtcbiAgICAgICAgY29uZmlnOiBzdG9yYWdlQ29uZmlnLFxuICAgICAgICBycGM6IGFnZW50T2JqLnJwYyxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gX3N0b3JhZ2U7XG4gIH07XG5cbiAgLyoqXG4gICAqIExhenktaW5pdGlhbGl6ZWQgc3RvcmFnZSBoYW5kbGVycyBmb3IgbG9jYWwgc3RvcmFnZS5cbiAgICogQ3JlYXRlZCBvbiBmaXJzdCBzdG9yYWdlIFJQQyByZXF1ZXN0LlxuICAgKi9cbiAgbGV0IHN0b3JhZ2VIYW5kbGVyc1Byb21pc2U6IFByb21pc2U8U3RvcmFnZUhhbmRsZXJzPiB8IG51bGwgPSBudWxsO1xuICBjb25zdCBnZXRTdG9yYWdlSGFuZGxlcnMgPSAobmFtZTogc3RyaW5nKTogUHJvbWlzZTxTdG9yYWdlSGFuZGxlcnM+ID0+IHtcbiAgICBpZiAoc3RvcmFnZUNvbmZpZy50eXBlICE9PSBcImxvY2FsXCIpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IEVycm9yKFwiU3RvcmFnZSBoYW5kbGVycyBvbmx5IGF2YWlsYWJsZSBmb3IgbG9jYWwgc3RvcmFnZVwiKVxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKCFzdG9yYWdlSGFuZGxlcnNQcm9taXNlKSB7XG4gICAgICBzdG9yYWdlSGFuZGxlcnNQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgeyBqb2luIH0gPSBhd2FpdCBpbXBvcnQoXCJub2RlOnBhdGhcIik7XG4gICAgICAgIGNvbnN0IHsgY3JlYXRlRmlsZXN5c3RlbUhhbmRsZXJzIH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgICAgICAgXCIuL3N0b3JhZ2UvYmluZGluZ3MvbG9jYWwtZnMtaGFuZGxlcnNcIlxuICAgICAgICApO1xuICAgICAgICBjb25zdCBiYXNlUGF0aCA9IHN0b3JhZ2VDb25maWcucGF0aCA/PyBcIi5hZ2VudC1zdG9yYWdlXCI7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gam9pbihiYXNlUGF0aCwgbmFtZSwgTE9DQUxfU1RPUkFHRV9WRVJTSU9OKTtcbiAgICAgICAgcmV0dXJuIGNyZWF0ZUZpbGVzeXN0ZW1IYW5kbGVycyhmdWxsUGF0aCk7XG4gICAgICB9KSgpO1xuICAgIH1cbiAgICByZXR1cm4gc3RvcmFnZUhhbmRsZXJzUHJvbWlzZTtcbiAgfTtcblxuICAvLyBFeHRyYWN0IHNldHVwIGFuZCBvblJlc3RhcnQgZnJvbSBhZ2VudC1sZXZlbCBzYW5kYm94IG9wdGlvbnMgKG5vdCBzZXJpYWxpemFibGUpXG4gIGNvbnN0IGFnZW50U2FuZGJveE9wdGlvbiA9IG9wdGlvbnMuc2FuZGJveDtcbiAgY29uc3Qgc2FuZGJveFNldHVwID1cbiAgICBhZ2VudFNhbmRib3hPcHRpb24gJiYgdHlwZW9mIGFnZW50U2FuZGJveE9wdGlvbiAhPT0gXCJzdHJpbmdcIlxuICAgICAgPyBhZ2VudFNhbmRib3hPcHRpb24uc2V0dXBcbiAgICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBzYW5kYm94T25SZXN0YXJ0ID1cbiAgICBhZ2VudFNhbmRib3hPcHRpb24gJiYgdHlwZW9mIGFnZW50U2FuZGJveE9wdGlvbiAhPT0gXCJzdHJpbmdcIlxuICAgICAgPyBhZ2VudFNhbmRib3hPcHRpb24ub25SZXN0YXJ0XG4gICAgICA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBzYW5kYm94ID0gYXN5bmMgKFxuICAgIHNhbmRib3hJZDogc3RyaW5nLFxuICAgIG9wdHM/OiB7XG4gICAgICBjb25maWc/OiBTYW5kYm94Q29uZmlnO1xuICAgICAgdGFncz86IFRUYWdzO1xuICAgICAgc2V0dXA/OiBTYW5kYm94U2V0dXA7XG4gICAgICBvblJlc3RhcnQ/OiBPblJlc3RhcnQ7XG4gICAgfVxuICApID0+IHtcbiAgICBjb25zdCBleGlzdGluZ1JlY29yZCA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNhbmRib3guZ2V0KHNhbmRib3hJZCk7XG5cbiAgICAvLyBDb21wb3NlIGFnZW50LWxldmVsIGFuZCBzZXNzaW9uLWxldmVsIHNldHVwL29uUmVzdGFydC5cbiAgICAvLyBTZXNzaW9uIHNldHVwIHJ1bnMgb24gdG9wIG9mIGFnZW50IHNldHVwIChlLmcuIGFnZW50IGluc3RhbGxzIHNoYXJlZCBkZXBzLFxuICAgIC8vIHNlc3Npb24gZG9lcyBnaXQgY2xvbmUgKyBucG0gaW5zdGFsbCkuIFRoZSBjb21wb3NlZCBrZXkgaW5jb3Jwb3JhdGVzIGJvdGhcbiAgICAvLyBzbyBzbmFwc2hvdCBpbnZhbGlkYXRpb24gd29ya3MgY29ycmVjdGx5LlxuICAgIGNvbnN0IHJlc29sdmVkU2V0dXA6IFNhbmRib3hTZXR1cCB8IHVuZGVmaW5lZCA9XG4gICAgICBvcHRzPy5zZXR1cCAmJiBzYW5kYm94U2V0dXBcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBrZXk6IGAke3NhbmRib3hTZXR1cC5rZXl9OiR7b3B0cy5zZXR1cC5rZXl9YCxcbiAgICAgICAgICAgIHJ1bjogYXN5bmMgKHNieCkgPT4ge1xuICAgICAgICAgICAgICBhd2FpdCBzYW5kYm94U2V0dXAucnVuKHNieCk7XG4gICAgICAgICAgICAgIGF3YWl0IG9wdHMuc2V0dXA/LnJ1bihzYngpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XG4gICAgICAgIDogKG9wdHM/LnNldHVwID8/IHNhbmRib3hTZXR1cCk7XG4gICAgY29uc3QgcmVzb2x2ZWRPblJlc3RhcnQ6IE9uUmVzdGFydCB8IHVuZGVmaW5lZCA9XG4gICAgICBvcHRzPy5vblJlc3RhcnQgJiYgc2FuZGJveE9uUmVzdGFydFxuICAgICAgICA/IGFzeW5jIChzYngpID0+IHtcbiAgICAgICAgICAgIGF3YWl0IHNhbmRib3hPblJlc3RhcnQoc2J4KTtcbiAgICAgICAgICAgIGF3YWl0IG9wdHMub25SZXN0YXJ0Py4oc2J4KTtcbiAgICAgICAgICB9XG4gICAgICAgIDogKG9wdHM/Lm9uUmVzdGFydCA/PyBzYW5kYm94T25SZXN0YXJ0KTtcblxuICAgIC8vIFN0cmlwIHNldHVwL29uUmVzdGFydCBmcm9tIGNvbmZpZyBiZWZvcmUgc3RvcmluZyAoZnVuY3Rpb25zIGFyZW4ndCBzZXJpYWxpemFibGUpXG4gICAgY29uc3QgcmVzb2x2ZUNvbmZpZyA9ICgpOiBTYW5kYm94Q29uZmlnID0+IHtcbiAgICAgIGlmIChvcHRzPy5jb25maWcpIHtcbiAgICAgICAgcmV0dXJuIG9wdHMuY29uZmlnO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBvcHRpb25zLnNhbmRib3ggPT09IFwic3RyaW5nXCIgfHwgIW9wdGlvbnMuc2FuZGJveCkge1xuICAgICAgICByZXR1cm4gaXNWZXJjZWwoKSA/IHsgdHlwZTogXCJ2ZXJjZWxcIiB9IDogeyB0eXBlOiBcImxvY2FsXCIgfTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsgc2V0dXA6IF9zLCBvblJlc3RhcnQ6IF9yLCAuLi5yZXN0IH0gPSBvcHRpb25zLnNhbmRib3g7XG4gICAgICByZXR1cm4gcmVzdDtcbiAgICB9O1xuXG4gICAgaWYgKGV4aXN0aW5nUmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIGlmICghKGV4aXN0aW5nUmVjb3JkIGluc3RhbmNlb2YgU2FuZGJveE5vdEZvdW5kRXJyb3IpKSB7XG4gICAgICAgIHRocm93IGV4aXN0aW5nUmVjb3JkO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2FuZGJveFJlY29yZCA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNhbmRib3guc2V0KHtcbiAgICAgICAgaWQ6IHNhbmRib3hJZCxcbiAgICAgICAgdGFnczogb3B0cz8udGFncyA/PyBudWxsLFxuICAgICAgICBhY3F1aXJpbmdMb2NrQXQ6IG51bGwsXG4gICAgICAgIGFjcXVpcmluZ0xvY2tJZDogbnVsbCxcbiAgICAgICAgY3JlYXRlZEF0OiBEYXRlLm5vdygpLFxuICAgICAgICBsYXN0QWN0aXZpdHlBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgY29uZmlnOiByZXNvbHZlQ29uZmlnKCksXG4gICAgICB9KTtcbiAgICAgIGlmIChzYW5kYm94UmVjb3JkIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgc2FuZGJveFJlY29yZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhd2FpdCBnZXRTYW5kYm94PFRUYWdzPih7XG4gICAgICAgIHN0b3JhZ2VDb25maWcsXG4gICAgICAgIHNhbmRib3hSZWNvcmQsXG4gICAgICAgIHN0b3JhZ2U6IGdldFN0b3JhZ2VJbnN0YW5jZSgpLFxuICAgICAgICBycGM6IGFnZW50T2JqLnJwYyxcbiAgICAgICAgc2V0dXA6IHJlc29sdmVkU2V0dXAsXG4gICAgICAgIG9uUmVzdGFydDogcmVzb2x2ZWRPblJlc3RhcnQsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdDb25maWcgPSBvcHRzPy5jb25maWcgPz8gZXhpc3RpbmdSZWNvcmQuY29uZmlnO1xuICAgIGlmICghZXF1YWwoZXhpc3RpbmdSZWNvcmQuY29uZmlnLCBuZXdDb25maWcpKSB7XG4gICAgICAvLyB0aHJvdyBuZXcgU2FuZGJveEVycm9yKHtcbiAgICAgIC8vICAgcmVhc29uOiBcInNhbmRib3ggY29uZmlnIGNoYW5nZXMgYXJlIG5vdCBzdXBwb3J0ZWRcIixcbiAgICAgIC8vIH0pO1xuICAgICAgY29uc29sZS53YXJuKFwic2FuZGJveCBjb25maWcgY2hhbmdlcyBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYXdhaXQgZ2V0U2FuZGJveDxUVGFncz4oe1xuICAgICAgc3RvcmFnZUNvbmZpZyxcbiAgICAgIHNhbmRib3hSZWNvcmQ6IGV4aXN0aW5nUmVjb3JkLFxuICAgICAgc3RvcmFnZTogZ2V0U3RvcmFnZUluc3RhbmNlKCksXG4gICAgICBycGM6IGFnZW50T2JqLnJwYyxcbiAgICAgIHNldHVwOiByZXNvbHZlZFNldHVwLFxuICAgICAgb25SZXN0YXJ0OiByZXNvbHZlZE9uUmVzdGFydCxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBhZ2VudE9iaiA9IHtcbiAgICBzZXNzaW9uOiBhc3luYyAoXG4gICAgICBzZXNzaW9uSWQ6IHN0cmluZyxcbiAgICAgIHNlc3Npb25PcHRpb25zPzogU2Vzc2lvbk9wdGlvbnM8VG9vbHMsIFRUYWdzPlxuICAgICkgPT4ge1xuICAgICAgbGV0IHNlc3Npb24gPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zZXNzaW9uLmdldChzZXNzaW9uSWQpO1xuXG4gICAgICAvKipcbiAgICAgICAqIG5vcm1hbGl6ZSBzYW5kYm94IGlucHV0IHRvIGEgc2FuZGJveCBJRCBhbmQgY29uZmlnXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IHNhbmRib3hJbnB1dCA9IHNlc3Npb25PcHRpb25zPy5zYW5kYm94ID8/IG9wdGlvbnMuc2FuZGJveDtcbiAgICAgIGNvbnN0IHNhbmRib3hJZCA9XG4gICAgICAgIHR5cGVvZiBzYW5kYm94SW5wdXQgPT09IFwic3RyaW5nXCJcbiAgICAgICAgICA/IHNhbmRib3hJbnB1dFxuICAgICAgICAgIDogLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvbm9OZXN0ZWRUZXJuYXJ5OiBva1xuICAgICAgICAgICAgc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yXG4gICAgICAgICAgICA/IGBzYW5kYm94XyR7dWxpZCgpfWBcbiAgICAgICAgICAgIDogKHNlc3Npb24uc2FuZGJveElkID8/IGBzYW5kYm94XyR7dWxpZCgpfWApO1xuICAgICAgLy8gU3RyaXAgbm9uLXNlcmlhbGl6YWJsZSBmaWVsZHMgKHNldHVwL29uUmVzdGFydCkgYmVmb3JlIHBhc3NpbmcgYXMgY29uZmlnLlxuICAgICAgLy8gT25seSB0cmVhdCBzZXR1cC9vblJlc3RhcnQgYXMgc2Vzc2lvbi1sZXZlbCBvdmVycmlkZXMgd2hlbiB0aGUgc2Vzc2lvblxuICAgICAgLy8gYWN0dWFsbHkgcHJvdmlkZWQgaXRzIG93biBzYW5kYm94IGNvbmZpZyAobm90IHdoZW4gZmFsbGluZyBiYWNrIHRvIGFnZW50IGNvbmZpZykuXG4gICAgICBjb25zdCBoYXNTZXNzaW9uU2FuZGJveCA9IHNlc3Npb25PcHRpb25zPy5zYW5kYm94ICE9IG51bGw7XG4gICAgICBsZXQgc2Vzc2lvblNldHVwOiBTYW5kYm94U2V0dXAgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgc2Vzc2lvbk9uUmVzdGFydDogT25SZXN0YXJ0IHwgdW5kZWZpbmVkO1xuICAgICAgY29uc3Qgc2FuZGJveENvbmZpZzogU2FuZGJveENvbmZpZyB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHR5cGVvZiBzYW5kYm94SW5wdXQgPT09IFwic3RyaW5nXCIgfHwgIXNhbmRib3hJbnB1dFxuICAgICAgICAgID8gdW5kZWZpbmVkXG4gICAgICAgICAgOiAoKCkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgICAgc2V0dXA6IF9zLFxuICAgICAgICAgICAgICAgIG9uUmVzdGFydDogX3IsXG4gICAgICAgICAgICAgICAgLi4ucmVzdFxuICAgICAgICAgICAgICB9ID0gc2FuZGJveElucHV0IGFzIFNhbmRib3hDb25maWcgJiB7XG4gICAgICAgICAgICAgICAgc2V0dXA/OiBTYW5kYm94U2V0dXA7XG4gICAgICAgICAgICAgICAgb25SZXN0YXJ0PzogT25SZXN0YXJ0O1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBpZiAoaGFzU2Vzc2lvblNhbmRib3gpIHtcbiAgICAgICAgICAgICAgICBzZXNzaW9uU2V0dXAgPSBfcztcbiAgICAgICAgICAgICAgICBzZXNzaW9uT25SZXN0YXJ0ID0gX3I7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3Q7XG4gICAgICAgICAgICB9KSgpO1xuICAgICAgY29uc3Qgc2FuZGJveFByb21pc2UgPSBzYW5kYm94KFxuICAgICAgICBzYW5kYm94SWQsXG4gICAgICAgIHNhbmRib3hDb25maWdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgY29uZmlnOiBzYW5kYm94Q29uZmlnLFxuICAgICAgICAgICAgICBzZXR1cDogc2Vzc2lvblNldHVwLFxuICAgICAgICAgICAgICBvblJlc3RhcnQ6IHNlc3Npb25PblJlc3RhcnQsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB1bmRlZmluZWRcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGV4aXN0aW5nU2Vzc2lvbiA9IHNlc3Npb24gaW5zdGFuY2VvZiBFcnJvciA/IG51bGwgOiBzZXNzaW9uO1xuICAgICAgY29uc3Qgc2tpbGxzRGlyID1cbiAgICAgICAgc2Vzc2lvbk9wdGlvbnM/LnNraWxsc0RpciA/P1xuICAgICAgICBleGlzdGluZ1Nlc3Npb24/LnNraWxsc0RpciA/P1xuICAgICAgICBvcHRpb25zLnNraWxsc0RpciA/P1xuICAgICAgICBudWxsO1xuXG4gICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIGlmIChzZXNzaW9uIGluc3RhbmNlb2YgU2Vzc2lvbk5vdEZvdW5kRXJyb3IpIHtcbiAgICAgICAgICBjb25zdCBtb2RlbCA9IHNlc3Npb25PcHRpb25zPy5tb2RlbCA/PyBvcHRpb25zLm1vZGVsID8/IG51bGw7XG4gICAgICAgICAgaWYgKCFtb2RlbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IFNlc3Npb25FcnJvcih7XG4gICAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogXCJNb2RlbCBpcyBub3Qgc2V0XCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2Vzc2lvbiA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uc2V0KHtcbiAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICBjcmVhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICBsYXN0TWVzc2FnZUlkOiBudWxsLFxuICAgICAgICAgICAgcnVuSWQ6IG51bGwsXG4gICAgICAgICAgICB0YWdzOiBzZXNzaW9uT3B0aW9ucz8udGFncyA/PyBudWxsLFxuICAgICAgICAgICAgc3lzdGVtOiBzZXNzaW9uT3B0aW9ucz8uc3lzdGVtID8/IG9wdGlvbnMuc3lzdGVtID8/IG51bGwsXG4gICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgIHNhbmRib3hJZCxcbiAgICAgICAgICAgIHNraWxsc0Rpcjogc2tpbGxzRGlyID8gbm9ybWFsaXplU2tpbGxzRGlycyhza2lsbHNEaXIpIDogbnVsbCxcbiAgICAgICAgICAgIGhvb2tUb2tlbjogbnVsbCxcbiAgICAgICAgICAgIGFjdGl2ZVRvb2xzOlxuICAgICAgICAgICAgICBzZXNzaW9uT3B0aW9ucz8uYWN0aXZlVG9vbHMgPz8gb3B0aW9ucy5hY3RpdmVUb29scyA/PyBudWxsLFxuICAgICAgICAgICAgZ2VuZXJhdGlvbjpcbiAgICAgICAgICAgICAgb3B0aW9ucy5nZW5lcmF0aW9uIHx8IHNlc3Npb25PcHRpb25zPy5nZW5lcmF0aW9uXG4gICAgICAgICAgICAgICAgPyB7IC4uLm9wdGlvbnMuZ2VuZXJhdGlvbiwgLi4uc2Vzc2lvbk9wdGlvbnM/LmdlbmVyYXRpb24gfVxuICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBzZXNzaW9uO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvKipcbiAgICAgICAgICogdGhpcyBpcyBhbiBleGlzdGluZyBzZXNzaW9uLiB3ZSBjb21wYXJlIHRoZSBvcHRpb25zIGFuZCB1cGRhdGUgdGhlIHNlc3Npb24gaWYgbmVjZXNzYXJ5LlxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgdXBkYXRlZDogU2Vzc2lvbiA9IHtcbiAgICAgICAgICAuLi5zZXNzaW9uLFxuICAgICAgICAgIC4uLnNlc3Npb25PcHRpb25zLFxuICAgICAgICAgIHNhbmRib3hJZCxcbiAgICAgICAgICBza2lsbHNEaXI6IHNraWxsc0RpciA/IG5vcm1hbGl6ZVNraWxsc0RpcnMoc2tpbGxzRGlyKSA6IG51bGwsXG4gICAgICAgIH07XG4gICAgICAgIGlmICghZXF1YWwodXBkYXRlZCwgc2Vzc2lvbikpIHtcbiAgICAgICAgICBzZXNzaW9uID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2Vzc2lvbi5zZXQodXBkYXRlZCk7XG4gICAgICAgICAgaWYgKHNlc3Npb24gaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgdGhyb3cgc2Vzc2lvbjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBJbnRlcnJ1cHRzIGFsbCBwZW5kaW5nIGFzc2lzdGFudCBtZXNzYWdlcyAoYm90aCBzdHJlYW1pbmcgYW5kIHF1ZXVlZCkuXG4gICAgICAgKiBBIG1lc3NhZ2UgaXMgY29uc2lkZXJlZCBwZW5kaW5nIGlmIGNvbXBsZXRlZEF0ID09PSBudWxsICYmIGludGVycnVwdGVkQXQgPT09IG51bGwuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGludGVycnVwdEN1cnJlbnRNZXNzYWdlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBtZXNzYWdlc1Jlc3VsdCA9XG4gICAgICAgICAgYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkubWVzc2FnZS5saXN0KHNlc3Npb25JZCk7XG4gICAgICAgIGlmIChtZXNzYWdlc1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgcmV0dXJuIG1lc3NhZ2VzUmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgY29uc3QgcGVuZGluZ0Fzc2lzdGFudE1lc3NhZ2VzID0gbWVzc2FnZXNSZXN1bHQuaXRlbXMuZmlsdGVyKFxuICAgICAgICAgIChtKSA9PlxuICAgICAgICAgICAgbS5yb2xlID09PSBcImFzc2lzdGFudFwiICYmXG4gICAgICAgICAgICBtLmNvbXBsZXRlZEF0ID09PSBudWxsICYmXG4gICAgICAgICAgICBtLmludGVycnVwdGVkQXQgPT09IG51bGxcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCByZXN1bHRzID0gYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgcGVuZGluZ0Fzc2lzdGFudE1lc3NhZ2VzLm1hcCgobSkgPT5cbiAgICAgICAgICAgIGdldFN0b3JhZ2VJbnN0YW5jZSgpLm1lc3NhZ2Uuc2V0KHsgLi4ubSwgaW50ZXJydXB0ZWRBdDogbm93IH0pXG4gICAgICAgICAgKVxuICAgICAgICApO1xuXG4gICAgICAgIGZvciAoY29uc3QgcmVzdWx0IG9mIHJlc3VsdHMpIHtcbiAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXV0by1yZWplY3QgYW55IHBlbmRpbmcgYXBwcm92YWwgaG9va3Mgc28gdGhlIHdvcmtmbG93IHVuYmxvY2tzXG4gICAgICAgIGZvciAoY29uc3QgbSBvZiBwZW5kaW5nQXNzaXN0YW50TWVzc2FnZXMpIHtcbiAgICAgICAgICBjb25zdCBwYXJ0c1Jlc3VsdCA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnBhcnQubGlzdEJ5TWVzc2FnZShcbiAgICAgICAgICAgIG0uaWRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwYXJ0c1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBwIG9mIHBhcnRzUmVzdWx0Lml0ZW1zKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIHAucGFydCAmJlxuICAgICAgICAgICAgICBcInN0YXRlXCIgaW4gcC5wYXJ0ICYmXG4gICAgICAgICAgICAgIChwLnBhcnQgYXMgeyBzdGF0ZTogc3RyaW5nIH0pLnN0YXRlID09PSBcImFwcHJvdmFsLXJlcXVlc3RlZFwiICYmXG4gICAgICAgICAgICAgIFwiYXBwcm92YWxcIiBpbiBwLnBhcnRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBjb25zdCBhcHByb3ZhbCA9IChwLnBhcnQgYXMgeyBhcHByb3ZhbD86IHsgaWQ6IHN0cmluZyB9IH0pXG4gICAgICAgICAgICAgICAgLmFwcHJvdmFsO1xuICAgICAgICAgICAgICBpZiAoYXBwcm92YWw/LmlkKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkucGFydC5zZXQoe1xuICAgICAgICAgICAgICAgICAgLi4ucCxcbiAgICAgICAgICAgICAgICAgIHBhcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgLi4ucC5wYXJ0LFxuICAgICAgICAgICAgICAgICAgICBzdGF0ZTogXCJhcHByb3ZhbC1yZXNwb25kZWRcIixcbiAgICAgICAgICAgICAgICAgICAgYXBwcm92YWw6IHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi5hcHByb3ZhbCxcbiAgICAgICAgICAgICAgICAgICAgICBhcHByb3ZlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgcmVhc29uOiBcImludGVycnVwdGVkXCIsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0gYXMgUGFydCk7XG4gICAgICAgICAgICAgICAgYXdhaXQgYXBwcm92YWxIb29rLnJlc3VtZShhcHByb3ZhbC5pZCwge1xuICAgICAgICAgICAgICAgICAgYXBwcm92ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgcmVhc29uOiBcImludGVycnVwdGVkXCIsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc2VuZDogYXN5bmMgKHtcbiAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICBpbnRlcnJ1cHRJZlN0cmVhbWluZyxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICB9OiB7XG4gICAgICAgICAgaW5wdXQ6IFNlbmRJbnB1dCB8IFNlbmRJbnB1dFtdO1xuICAgICAgICAgIGludGVycnVwdElmU3RyZWFtaW5nPzogYm9vbGVhbjtcbiAgICAgICAgICBjb250ZXh0PzogVENvbnRleHQ7XG4gICAgICAgIH0pID0+IHtcbiAgICAgICAgICBpZiAoaW50ZXJydXB0SWZTdHJlYW1pbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGludGVycnVwdFJlc3VsdCA9IGF3YWl0IGludGVycnVwdEN1cnJlbnRNZXNzYWdlKCk7XG4gICAgICAgICAgICBpZiAoaW50ZXJydXB0UmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGludGVycnVwdFJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbmV3TWVzc2FnZXM6IE1lc3NhZ2VbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IG5ld1BhcnRzOiBQYXJ0W10gPSBbXTtcbiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dCkpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBvZiBpbnB1dCkge1xuICAgICAgICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIHBhcnRzIH0gPSB0b01lc3NhZ2VBbmRQYXJ0cyh7XG4gICAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgIGlucHV0OiBpLFxuICAgICAgICAgICAgICAgIGRlZmF1bHRSb2xlOiBcInVzZXJcIixcbiAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgbmV3TWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgICAgICAgbmV3UGFydHMucHVzaCguLi5wYXJ0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgcGFydHMgfSA9IHRvTWVzc2FnZUFuZFBhcnRzKHtcbiAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICBpbnB1dCxcbiAgICAgICAgICAgICAgZGVmYXVsdFJvbGU6IFwidXNlclwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuZXdNZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuICAgICAgICAgICAgbmV3UGFydHMucHVzaCguLi5wYXJ0cyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qKlxuICAgICAgICAgICAqIHdlIGFsc28gcHJlLWNyZWF0ZSB0aGUgYXNzaXN0YW50IG1lc3NhZ2VcbiAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdCBhc3Npc3RhbnRNZXNzYWdlSWQgPSBgbWVzc2FnZV8ke3VsaWQoKX1gO1xuICAgICAgICAgIGNvbnN0IGJhc2VUaW1lID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICBjb25zdCBhc3Npc3RhbnRNZXNzYWdlQ3JlYXRlZEF0ID0gYmFzZVRpbWUgKyBuZXdNZXNzYWdlcy5sZW5ndGg7XG4gICAgICAgICAgbmV3TWVzc2FnZXMucHVzaCh7XG4gICAgICAgICAgICBpZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgcm9sZTogXCJhc3Npc3RhbnRcIixcbiAgICAgICAgICAgIGNyZWF0ZWRBdDogYXNzaXN0YW50TWVzc2FnZUNyZWF0ZWRBdCxcbiAgICAgICAgICAgIHN0YXJ0ZWRBdDogbnVsbCxcbiAgICAgICAgICAgIGNvbXBsZXRlZEF0OiBudWxsLFxuICAgICAgICAgICAgaW50ZXJydXB0ZWRBdDogbnVsbCxcbiAgICAgICAgICAgIHVzYWdlOiBudWxsLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3Qgc2Vzc2lvbjIgPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zZXNzaW9uLmdldChzZXNzaW9uSWQpO1xuICAgICAgICAgIGlmIChzZXNzaW9uMiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBzZXNzaW9uMjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBhZ2VudElucHV0OiBBZ2VudElucHV0ID0ge1xuICAgICAgICAgICAgc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgICAgIHNlc3Npb25JZCxcbiAgICAgICAgICAgIHJwYzogYWdlbnRPYmoucnBjLFxuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3QgZXZlbnQ6IEFnZW50TWVzc2FnZUlucHV0ID0ge1xuICAgICAgICAgICAgYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgaG9va1Rva2VuOiBjcnlwdG8ucmFuZG9tVVVJRCgpLFxuICAgICAgICAgICAgY3JlYXRlZEF0OiBhc3Npc3RhbnRNZXNzYWdlQ3JlYXRlZEF0LFxuICAgICAgICAgICAgY29udGV4dDogY29udGV4dCA/PyB7fSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuIGF3YWl0IGVycm9yZS50cnlBc3luYyh7XG4gICAgICAgICAgICB0cnk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgYXdhaXQgYWxsKHtcbiAgICAgICAgICAgICAgICBhc3luYyBzYXZlTWVzc2FnZXMoKSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICAgICAgbmV3TWVzc2FnZXMubWFwKChtLCBpKSA9PlxuICAgICAgICAgICAgICAgICAgICAgIGdldFN0b3JhZ2VJbnN0YW5jZSgpLm1lc3NhZ2Uuc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm0sXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkQXQ6IGJhc2VUaW1lICsgaSxcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYXN5bmMgc2F2ZVBhcnRzKCkge1xuICAgICAgICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgICAgIG5ld1BhcnRzLm1hcChnZXRTdG9yYWdlSW5zdGFuY2UoKS5wYXJ0LnNldClcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhc3luYyByZXN1bWVPclN0YXJ0QWdlbnRXb3JrZmxvdygpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uMi5ydW5JZCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhZ2VudE1lc3NhZ2VIb29rLnJlc3VtZShzZXNzaW9uSWQsIGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0UmVzdWx0ID0gYXdhaXQgc3RhcnQoYWdlbnRXb3JrZmxvdywgW1xuICAgICAgICAgICAgICAgICAgICAgIHsgaW5wdXQ6IGFnZW50SW5wdXQsIGV2ZW50IH0sXG4gICAgICAgICAgICAgICAgICAgIF0pO1xuICAgICAgICAgICAgICAgICAgICBzZXNzaW9uMi5ydW5JZCA9IHN0YXJ0UmVzdWx0LnJ1bklkO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYXN5bmMgdXBkYXRlU2Vzc2lvbigpIHtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHRoaXMuJC5yZXN1bWVPclN0YXJ0QWdlbnRXb3JrZmxvdztcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uc2V0KHtcbiAgICAgICAgICAgICAgICAgICAgLi4uc2Vzc2lvbjIsXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRBdDogRGF0ZS5ub3coKSxcbiAgICAgICAgICAgICAgICAgICAgbGFzdE1lc3NhZ2VJZDogYXNzaXN0YW50TWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICBob29rVG9rZW46IGV2ZW50Lmhvb2tUb2tlbixcbiAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHJlc3VsdDtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2F0Y2g6IChlKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbkVycm9yKHtcbiAgICAgICAgICAgICAgICBpZDogc2Vzc2lvbklkLFxuICAgICAgICAgICAgICAgIHJlYXNvbjogYGZhaWxlZCB0byBzZW5kOiAke1N0cmluZyhlKX1gLFxuICAgICAgICAgICAgICAgIGNhdXNlOiBlLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc3RyZWFtOiBhc3luYyAob3B0cz86IHsgbWVzc2FnZUlkPzogc3RyaW5nIH0pID0+IHtcbiAgICAgICAgICBjb25zdCBzZXNzaW9uID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2Vzc2lvbi5nZXQoc2Vzc2lvbklkKTtcbiAgICAgICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbjtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbWVzc2FnZUlkID0gb3B0cz8ubWVzc2FnZUlkID8/IHNlc3Npb24ubGFzdE1lc3NhZ2VJZDtcbiAgICAgICAgICBpZiAoIW1lc3NhZ2VJZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uRXJyb3Ioe1xuICAgICAgICAgICAgICBpZDogc2Vzc2lvbklkLFxuICAgICAgICAgICAgICByZWFzb246IFwiTm8gbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvblwiLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghc2Vzc2lvbi5ydW5JZCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uRXJyb3Ioe1xuICAgICAgICAgICAgICBpZDogc2Vzc2lvbklkLFxuICAgICAgICAgICAgICByZWFzb246IFwiTm8gcnVuIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uXCIsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcnVuID0gZ2V0UnVuKHNlc3Npb24ucnVuSWQpO1xuICAgICAgICAgIHJldHVybiBydW4uZ2V0UmVhZGFibGU8VUlNZXNzYWdlQ2h1bms+KHsgbmFtZXNwYWNlOiBtZXNzYWdlSWQgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdWk6IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBbbWVzc2FnZXNSZXN1bHQsIHBhcnRzUmVzdWx0XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgIGdldFN0b3JhZ2VJbnN0YW5jZSgpLm1lc3NhZ2UubGlzdChzZXNzaW9uSWQpLFxuICAgICAgICAgICAgZ2V0U3RvcmFnZUluc3RhbmNlKCkucGFydC5saXN0QnlTZXNzaW9uKHNlc3Npb25JZCksXG4gICAgICAgICAgXSk7XG5cbiAgICAgICAgICBpZiAobWVzc2FnZXNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VzUmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocGFydHNSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHBhcnRzUmVzdWx0O1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzID0gYXNzZW1ibGVVSU1lc3NhZ2VzKHtcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlc1Jlc3VsdC5pdGVtcyxcbiAgICAgICAgICAgIHBhcnRzOiBwYXJ0c1Jlc3VsdC5pdGVtcyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IGxhc3RTdGFydGVkQXNzaXN0YW50ID0gbWVzc2FnZXNSZXN1bHQuaXRlbXNcbiAgICAgICAgICAgIC5maWx0ZXIoKG0pID0+IG0ucm9sZSA9PT0gXCJhc3Npc3RhbnRcIiAmJiBtLnN0YXJ0ZWRBdCAhPT0gbnVsbClcbiAgICAgICAgICAgIC5hdCgtMSk7XG4gICAgICAgICAgY29uc3QgaXNTdHJlYW1pbmcgPVxuICAgICAgICAgICAgbGFzdFN0YXJ0ZWRBc3Npc3RhbnQgJiZcbiAgICAgICAgICAgIGxhc3RTdGFydGVkQXNzaXN0YW50LmNvbXBsZXRlZEF0ID09PSBudWxsICYmXG4gICAgICAgICAgICBsYXN0U3RhcnRlZEFzc2lzdGFudC5pbnRlcnJ1cHRlZEF0ID09PSBudWxsO1xuICAgICAgICAgIGNvbnN0IHN0cmVhbWluZ01lc3NhZ2VJZCA9IGlzU3RyZWFtaW5nXG4gICAgICAgICAgICA/IGxhc3RTdGFydGVkQXNzaXN0YW50LmlkXG4gICAgICAgICAgICA6IG51bGw7XG5cbiAgICAgICAgICBjb25zdCB1c2FnZSA9IGNvbXB1dGVTZXNzaW9uVXNhZ2UobWVzc2FnZXNSZXN1bHQuaXRlbXMpO1xuXG4gICAgICAgICAgdHlwZSBUeXBlZE1lc3NhZ2UgPSBVSU1lc3NhZ2U8XG4gICAgICAgICAgICB1bmtub3duLFxuICAgICAgICAgICAgVUlEYXRhVHlwZXMsXG4gICAgICAgICAgICBJbmZlclVJVG9vbHM8dHlwZW9mIGJ1aWx0SW5Ub29scyAmIFRvb2xzPlxuICAgICAgICAgID47XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlcyBhcyB1bmtub3duIGFzIFR5cGVkTWVzc2FnZVtdLFxuICAgICAgICAgICAgc3RyZWFtaW5nTWVzc2FnZUlkLFxuICAgICAgICAgICAgdXNhZ2UsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgdGFnOiB7XG4gICAgICAgICAgbGlzdDogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uZ2V0KHNlc3Npb25JZCk7XG4gICAgICAgICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIChzZXNzaW9uLnRhZ3MgPz8ge30pIGFzIFRUYWdzO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZ2V0OiBhc3luYyA8SyBleHRlbmRzIGtleW9mIFRUYWdzICYgc3RyaW5nPihcbiAgICAgICAgICAgIGtleTogS1xuICAgICAgICAgICk6IFByb21pc2U8VFRhZ3NbS10gfCB1bmRlZmluZWQgfCBFcnJvcj4gPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbiA9IGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLnNlc3Npb24uZ2V0KHNlc3Npb25JZCk7XG4gICAgICAgICAgICBpZiAoc2Vzc2lvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZXNzaW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHNlc3Npb24udGFncz8uW2tleV0gYXMgVFRhZ3NbS10gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXQ6IGFzeW5jIDxLIGV4dGVuZHMga2V5b2YgVFRhZ3MgJiBzdHJpbmc+KFxuICAgICAgICAgICAga2V5OiBLLFxuICAgICAgICAgICAgdmFsdWU6IFRUYWdzW0tdXG4gICAgICAgICAgKTogUHJvbWlzZTx1bmRlZmluZWQgfCBFcnJvcj4gPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2Vzc2lvbi50YWcuc2V0KHtcbiAgICAgICAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICAgICAgICB0YWdzOiB7IFtrZXldOiB2YWx1ZSB9IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZXRNYW55OiBhc3luYyAodGFnczogUGFydGlhbDxUVGFncz4pOiBQcm9taXNlPHVuZGVmaW5lZCB8IEVycm9yPiA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zZXNzaW9uLnRhZy5zZXQoe1xuICAgICAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHRhZ3M6IHRhZ3MgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzYW5kYm94OiBhd2FpdCBzYW5kYm94UHJvbWlzZSxcblxuICAgICAgICBpbnRlcnJ1cHQ6IGludGVycnVwdEN1cnJlbnRNZXNzYWdlLFxuXG4gICAgICAgIHJlc29sdmVBcHByb3ZhbDogYXN5bmMgKHtcbiAgICAgICAgICBhcHByb3ZhbElkLFxuICAgICAgICAgIGFwcHJvdmVkLFxuICAgICAgICAgIHJlYXNvbixcbiAgICAgICAgfToge1xuICAgICAgICAgIGFwcHJvdmFsSWQ6IHN0cmluZztcbiAgICAgICAgICBhcHByb3ZlZDogYm9vbGVhbjtcbiAgICAgICAgICByZWFzb24/OiBzdHJpbmc7XG4gICAgICAgIH0pOiBQcm9taXNlPHVuZGVmaW5lZCB8IEVycm9yPiA9PiB7XG4gICAgICAgICAgY29uc3QgcGFydHNSZXN1bHQgPVxuICAgICAgICAgICAgYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkucGFydC5saXN0QnlTZXNzaW9uKHNlc3Npb25JZCk7XG4gICAgICAgICAgaWYgKHBhcnRzUmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJ0c1Jlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB0YXJnZXRQYXJ0ID0gcGFydHNSZXN1bHQuaXRlbXMuZmluZChcbiAgICAgICAgICAgIChwKSA9PlxuICAgICAgICAgICAgICBwLnBhcnQgJiZcbiAgICAgICAgICAgICAgXCJhcHByb3ZhbFwiIGluIHAucGFydCAmJlxuICAgICAgICAgICAgICAocC5wYXJ0IGFzIHsgYXBwcm92YWw/OiB7IGlkOiBzdHJpbmcgfSB9KS5hcHByb3ZhbD8uaWQgPT09XG4gICAgICAgICAgICAgICAgYXBwcm92YWxJZFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKCF0YXJnZXRQYXJ0KSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25FcnJvcih7XG4gICAgICAgICAgICAgIGlkOiBzZXNzaW9uSWQsXG4gICAgICAgICAgICAgIHJlYXNvbjogYEFwcHJvdmFsICR7YXBwcm92YWxJZH0gbm90IGZvdW5kYCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHVwZGF0ZWRQYXJ0ID0ge1xuICAgICAgICAgICAgLi4udGFyZ2V0UGFydCxcbiAgICAgICAgICAgIHBhcnQ6IHtcbiAgICAgICAgICAgICAgLi4udGFyZ2V0UGFydC5wYXJ0LFxuICAgICAgICAgICAgICBzdGF0ZTogXCJhcHByb3ZhbC1yZXNwb25kZWRcIiBhcyBjb25zdCxcbiAgICAgICAgICAgICAgYXBwcm92YWw6IHsgaWQ6IGFwcHJvdmFsSWQsIGFwcHJvdmVkLCByZWFzb24gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfTtcbiAgICAgICAgICBjb25zdCBzZXRSZXN1bHQgPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5wYXJ0LnNldChcbiAgICAgICAgICAgIHVwZGF0ZWRQYXJ0IGFzIFBhcnRcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzZXRSZXN1bHQgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgICAgcmV0dXJuIHNldFJlc3VsdDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBGaXJlIHRoZSBhcHByb3ZhbCBob29rIHRvIHJlc3VtZSB0aGUgc3VzcGVuZGVkIHdvcmtmbG93LlxuICAgICAgICAgIC8vIEZvciBzdWItdG9vbCBhcHByb3ZhbHMgKGZyb20gdGhlIEphdmFTY3JpcHQgdG9vbCksIHRoZXJlJ3Mgbm9cbiAgICAgICAgICAvLyBzdXNwZW5kZWQgaG9vayBcdTIwMTQgcG9sbGluZyBoYW5kbGVzIGl0LiBTd2FsbG93IHRoZSBlcnJvci5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgYXBwcm92YWxIb29rLnJlc3VtZShhcHByb3ZhbElkLCB7IGFwcHJvdmVkLCByZWFzb24gfSk7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBObyBob29rIHJlZ2lzdGVyZWQgZm9yIHRoaXMgYXBwcm92YWxJZCAoZS5nLiBKUyBzdWItdG9vbCBhcHByb3ZhbClcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuXG4gICAgICAgIHVzYWdlOiBhc3luYyAoKTogUHJvbWlzZTxTZXNzaW9uVXNhZ2UgfCBFcnJvcj4gPT4ge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VzUmVzdWx0ID1cbiAgICAgICAgICAgIGF3YWl0IGdldFN0b3JhZ2VJbnN0YW5jZSgpLm1lc3NhZ2UubGlzdChzZXNzaW9uSWQpO1xuICAgICAgICAgIGlmIChtZXNzYWdlc1Jlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZXNSZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjb21wdXRlU2Vzc2lvblVzYWdlKG1lc3NhZ2VzUmVzdWx0Lml0ZW1zKTtcbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGU6IGFzeW5jIChcbiAgICAgICAgICB1cGRhdGVPcHRpb25zOiBTZXNzaW9uVXBkYXRlT3B0aW9uczxUb29scz5cbiAgICAgICAgKTogUHJvbWlzZTx1bmRlZmluZWQgfCBFcnJvcj4gPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCBnZXRTdG9yYWdlSW5zdGFuY2UoKS5zZXNzaW9uLmdldChzZXNzaW9uSWQpO1xuICAgICAgICAgIGlmIChjdXJyZW50IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB1cGRhdGVkOiBTZXNzaW9uID0ge1xuICAgICAgICAgICAgLi4uY3VycmVudCxcbiAgICAgICAgICAgIC4uLnVwZGF0ZU9wdGlvbnMsXG4gICAgICAgICAgICB1cGRhdGVkQXQ6IERhdGUubm93KCksXG4gICAgICAgICAgICBza2lsbHNEaXI6IHVwZGF0ZU9wdGlvbnMuc2tpbGxzRGlyXG4gICAgICAgICAgICAgID8gbm9ybWFsaXplU2tpbGxzRGlycyh1cGRhdGVPcHRpb25zLnNraWxsc0RpcilcbiAgICAgICAgICAgICAgOiBjdXJyZW50LnNraWxsc0RpcixcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChlcXVhbCh1cGRhdGVkLCBjdXJyZW50KSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZ2V0U3RvcmFnZUluc3RhbmNlKCkuc2Vzc2lvbi5zZXQodXBkYXRlZCk7XG4gICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9LFxuICAgIHNhbmRib3gsXG4gICAgZ2V0IHN0b3JhZ2UoKSB7XG4gICAgICByZXR1cm4gZ2V0U3RvcmFnZUluc3RhbmNlKCk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJQQyBoYW5kbGVyIGZvciBhZ2VudCBvcGVyYXRpb25zLlxuICAgICAqIEhhbmRsZXMgdG9vbHMubGlzdCwgdG9vbHMuZXhlY3V0ZSwgc3RvcmFnZSBSUEMsIGFuZCBob29rcy5cbiAgICAgKlxuICAgICAqIENhbGxlZCBpbnRlcm5hbGx5IGJ5IHRoZSBgcnBjYCBzdGVwIGZ1bmN0aW9uIGR1cmluZyB3b3JrZmxvdyBleGVjdXRpb24uXG4gICAgICogQ2FuIGFsc28gYmUgZXhwb3NlZCB2aWEgSFRUUCBmb3IgZXh0ZXJuYWwgYWNjZXNzIGlmIG5lZWRlZC5cbiAgICAgKi9cbiAgICBoYW5kbGVyOiBhc3luYyAoXG4gICAgICBpbnB1dDogUmVxdWVzdCB8IFJwY1BheWxvYWQsXG4gICAgICBvdmVycmlkZXM/OiBBZ2VudFJwY092ZXJyaWRlc1xuICAgICk6IFByb21pc2U8UmVzcG9uc2UgfCBScGNSZXN1bHQ+ID0+IHtcbiAgICAgIGNvbnN0IGlzUmVxdWVzdCA9IGlucHV0IGluc3RhbmNlb2YgUmVxdWVzdDtcblxuICAgICAgbGV0IG1ldGhvZDogc3RyaW5nO1xuICAgICAgbGV0IHBhcmFtczogdW5rbm93bjtcbiAgICAgIGxldCBuYW1lOiBzdHJpbmc7XG5cbiAgICAgIGlmIChpc1JlcXVlc3QpIHtcbiAgICAgICAgY29uc3Qgc2VjcmV0ID0gaW5wdXQuaGVhZGVycy5nZXQoXCJ4LWFnZW50LXNlY3JldFwiKTtcbiAgICAgICAgaWYgKHNlY3JldCAhPT0gYWdlbnRTZWNyZXQpIHtcbiAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuanNvbihcbiAgICAgICAgICAgIHsgZXJyb3I6IHsgY29kZTogXCJVTkFVVEhPUklaRURcIiwgbWVzc2FnZTogXCJJbnZhbGlkIHNlY3JldFwiIH0gfSxcbiAgICAgICAgICAgIHsgc3RhdHVzOiA0MDEgfVxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYm9keTogQWdlbnRScGNSZXF1ZXN0O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGJvZHkgPSBhd2FpdCBpbnB1dC5qc29uKCk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIHJldHVybiBSZXNwb25zZS5qc29uKFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBlcnJvcjogeyBjb2RlOiBcIklOVkFMSURfUkVRVUVTVFwiLCBtZXNzYWdlOiBcIkludmFsaWQgSlNPTiBib2R5XCIgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7IHN0YXR1czogNDAwIH1cbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbWV0aG9kID0gYm9keS5tZXRob2Q7XG4gICAgICAgIHBhcmFtcyA9IGJvZHkucGFyYW1zO1xuICAgICAgICBuYW1lID0gaW5wdXQuaGVhZGVycy5nZXQoXCJ4LWFnZW50LW5hbWVcIikgPz8gREVGQVVMVF9OQU1FU1BBQ0U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXRob2QgPSBpbnB1dC5tZXRob2Q7XG4gICAgICAgIHBhcmFtcyA9IGlucHV0LnBhcmFtcztcbiAgICAgICAgbmFtZSA9IGlucHV0Lm5hbWUgPz8gREVGQVVMVF9OQU1FU1BBQ0U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpc3BhdGNoQ29udGV4dDogRGlzcGF0Y2hDb250ZXh0ID0ge1xuICAgICAgICB0b29sczogb3B0aW9ucy50b29scyBhcyBUb29sU2V0IHwgdW5kZWZpbmVkLFxuICAgICAgICBob29rczogb3B0aW9ucy5ob29rcyxcbiAgICAgICAgbmVlZHNBcHByb3ZhbDpcbiAgICAgICAgICBvcHRpb25zLm5lZWRzQXBwcm92YWwgYXMgRGlzcGF0Y2hDb250ZXh0W1wibmVlZHNBcHByb3ZhbFwiXSxcbiAgICAgICAgc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgZ2V0U3RvcmFnZUluc3RhbmNlLFxuICAgICAgICBnZXRTdG9yYWdlSGFuZGxlcnMsXG4gICAgICAgIHJwYzogYWdlbnRPYmoucnBjLFxuICAgICAgICBvdmVycmlkZXMsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkaXNwYXRjaChtZXRob2QsIHBhcmFtcywgZGlzcGF0Y2hDb250ZXh0LCBuYW1lKTtcblxuICAgICAgaWYgKCFpc1JlcXVlc3QpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhdHVzID0gXCJlcnJvclwiIGluIHJlc3VsdCA/IChyZXN1bHQuc3RhdHVzID8/IDUwMCkgOiAyMDA7XG4gICAgICByZXR1cm4gUmVzcG9uc2UuanNvbihcbiAgICAgICAgXCJlcnJvclwiIGluIHJlc3VsdCA/IHsgZXJyb3I6IHJlc3VsdC5lcnJvciB9IDogeyByZXN1bHQ6IHJlc3VsdC5yZXN1bHQgfSxcbiAgICAgICAgeyBzdGF0dXMgfVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgdG9vbHM6IHsgLi4uYnVpbHRJblRvb2xzLCAuLi5vcHRpb25zLnRvb2xzIH0gYXMgdHlwZW9mIGJ1aWx0SW5Ub29scyAmIFRvb2xzLFxuXG4gICAgcnBjOiAoKCkgPT4ge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBcInJwYyBub3QgY29uZmlndXJlZC4gRW5zdXJlIHdpdGhBZ2VudCBpcyBzZXQgdXAgaW4gbmV4dC5jb25maWcudHNcIlxuICAgICAgKTtcbiAgICB9KSBhcyAocGFyYW1zOiBScGNQYXlsb2FkKSA9PiBQcm9taXNlPFJwY1Jlc3VsdD4sXG4gIH07XG5cbiAgcmV0dXJuIGFnZW50T2JqO1xufTtcbiIsICJpbXBvcnQgdHlwZSB7IEpTT05TY2hlbWE3LCBUb29sLCBUb29sU2V0IH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudFJwY092ZXJyaWRlcywgQWdlbnRScGNSZXN1bHQsIFJwY1Jlc3VsdCB9IGZyb20gXCIuL2NsaWVudFwiO1xuaW1wb3J0IHsgZ2V0U2FuZGJveCB9IGZyb20gXCIuL3NhbmRib3hcIjtcbmltcG9ydCB0eXBlIHtcbiAgU3RvcmFnZSBhcyBBZ2VudFN0b3JhZ2UsXG4gIE1ldGhvZE5hbWUsXG4gIFJwY0ZuLFxuICBScGNSZXF1ZXN0LFxuICBScGNSZXNwb25zZSxcbiAgU2FuZGJveFJlY29yZCxcbiAgU2Vzc2lvbixcbiAgU3RvcmFnZUNvbmZpZyxcbiAgSGFuZGxlcnMgYXMgU3RvcmFnZUhhbmRsZXJzLFxufSBmcm9tIFwiLi9zdG9yYWdlXCI7XG5pbXBvcnQgeyBTVE9SQUdFX1JQQ19NRVRIT0RTIH0gZnJvbSBcIi4vc3RvcmFnZVwiO1xuaW1wb3J0IHsgdHlwZSBCdWlsdEluVG9vbE5hbWUsIHJlc29sdmVBcGlVcmwsIHR5cGUgVG9vbENvbnRleHQgfSBmcm9tIFwiLi90b29sc1wiO1xuXG5leHBvcnQgdHlwZSBUb29sTWV0YWRhdGEgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIGlucHV0U2NoZW1hPzogSlNPTlNjaGVtYTc7XG59O1xuXG5leHBvcnQgdHlwZSBUb29sc0V4ZWN1dGVQYXJhbXMgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgaW5wdXQ6IHVua25vd247XG4gIHNlc3Npb246IFNlc3Npb247XG4gIHNhbmRib3hSZWNvcmQ6IFNhbmRib3hSZWNvcmQ7XG4gIGNvbnRleHQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufTtcblxuZXhwb3J0IHR5cGUgSG9va1Rvb2xCZWZvcmVQYXJhbXMgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgaW5wdXQ6IHVua25vd247XG4gIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xufTtcblxuZXhwb3J0IHR5cGUgSG9va1Rvb2xCZWZvcmVSZXN1bHQgPSB7XG4gIGlucHV0PzogdW5rbm93bjtcbiAgc3RvcD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBIb29rVG9vbEFmdGVyUGFyYW1zID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGlucHV0OiB1bmtub3duO1xuICByZXN1bHQ6IHVua25vd247XG4gIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xufTtcblxuZXhwb3J0IHR5cGUgSG9va1Rvb2xBZnRlclJlc3VsdCA9IHtcbiAgcmVzdWx0PzogdW5rbm93bjtcbiAgc3RvcD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUb29sc05lZWRzQXBwcm92YWxQYXJhbXMgPSB7XG4gIHRvb2xOYW1lOiBzdHJpbmc7XG4gIGlucHV0OiB1bmtub3duO1xuICB0b29sQ2FsbElkOiBzdHJpbmc7XG4gIG1lc3NhZ2VzOiB1bmtub3duW107XG59O1xuXG5leHBvcnQgdHlwZSBUb29sc05lZWRzQXBwcm92YWxSZXN1bHQgPSBib29sZWFuO1xuXG50eXBlIEFnZW50SG9va3MgPSB7XG4gIFwidG9vbC5iZWZvcmVcIj86IChvcHRzOiB7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGlucHV0OiB1bmtub3duO1xuICAgIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xuICB9KSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IHsgaW5wdXQ6IHVua25vd24gfT47XG4gIFwidG9vbC5hZnRlclwiPzogKG9wdHM6IHtcbiAgICBuYW1lOiBzdHJpbmc7XG4gICAgaW5wdXQ6IHVua25vd247XG4gICAgcmVzdWx0OiB1bmtub3duO1xuICAgIGNvbnRleHQ6IFRvb2xDb250ZXh0O1xuICB9KSA9PiBQcm9taXNlPHVuZGVmaW5lZCB8IHsgcmVzdWx0OiB1bmtub3duIH0+O1xufTtcblxudHlwZSBOZWVkc0FwcHJvdmFsRW50cnkgPVxuICB8IGJvb2xlYW5cbiAgfCAoKFxuICAgICAgaW5wdXQ6IHVua25vd24sXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHRvb2xDYWxsSWQ6IHN0cmluZztcbiAgICAgICAgbWVzc2FnZXM6IHVua25vd25bXTtcbiAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHVua25vd247XG4gICAgICB9XG4gICAgKSA9PiBib29sZWFuIHwgUHJvbWlzZTxib29sZWFuPik7XG5cbmV4cG9ydCB0eXBlIERpc3BhdGNoQ29udGV4dCA9IHtcbiAgdG9vbHM6IFRvb2xTZXQgfCB1bmRlZmluZWQ7XG4gIGhvb2tzOiBBZ2VudEhvb2tzIHwgdW5kZWZpbmVkO1xuICBuZWVkc0FwcHJvdmFsOiBSZWNvcmQ8c3RyaW5nLCBOZWVkc0FwcHJvdmFsRW50cnk+IHwgdW5kZWZpbmVkO1xuICBzdG9yYWdlQ29uZmlnOiBTdG9yYWdlQ29uZmlnO1xuICBnZXRTdG9yYWdlSW5zdGFuY2U6ICgpID0+IEFnZW50U3RvcmFnZTtcbiAgZ2V0U3RvcmFnZUhhbmRsZXJzOiAobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPFN0b3JhZ2VIYW5kbGVycz47XG4gIHJwYzogUnBjRm47XG4gIG92ZXJyaWRlcz86IEFnZW50UnBjT3ZlcnJpZGVzO1xufTtcblxuLyoqIERlZmF1bHQgbmVlZHNBcHByb3ZhbCBmb3IgYnVpbHQtaW4gdG9vbHMgKHVzZXIgY2FuIG92ZXJyaWRlIHZpYSBuZWVkc0FwcHJvdmFsIGNvbmZpZykuICovXG5jb25zdCBidWlsdGluTmVlZHNBcHByb3ZhbDogUGFydGlhbDxcbiAgUmVjb3JkPEJ1aWx0SW5Ub29sTmFtZSwgTmVlZHNBcHByb3ZhbEVudHJ5PlxuPiA9IHtcbiAgQmFzaDogdHJ1ZSxcbn07XG5cbi8qKlxuICogQ29udmVydHMgYW4gb3ZlcnJpZGUgcmVzdWx0IHRvIFJwY1Jlc3VsdCwgb3IgbnVsbCB0byBmYWxsIHRocm91Z2guXG4gKi9cbmZ1bmN0aW9uIGhhbmRsZU92ZXJyaWRlUmVzdWx0PFQ+KHJlczogQWdlbnRScGNSZXN1bHQ8VD4pOiBScGNSZXN1bHQ8VD4gfCBudWxsIHtcbiAgaWYgKHJlcyA9PT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmIChyZXMub2spIHtcbiAgICByZXR1cm4geyByZXN1bHQ6IHJlcy5yZXN1bHQgfTtcbiAgfVxuICByZXR1cm4ge1xuICAgIGVycm9yOiB7IGNvZGU6IFwiSEFORExFUl9FUlJPUlwiLCBtZXNzYWdlOiByZXMuZXJyb3IgfSxcbiAgICBzdGF0dXM6IDQwMCxcbiAgfTtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBkaXNwYXRjaCBmdW5jdGlvbi4gUmV0dXJucyBScGNSZXN1bHQsIG5vdCBSZXNwb25zZS5cbiAqIEVuYWJsZXMgcmVjdXJzaXZlIGNhbGxzIGZvciBob29rcyB3aXRob3V0IEpTT04gcm91bmQtdHJpcHMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkaXNwYXRjaChcbiAgbWV0aG9kOiBzdHJpbmcsXG4gIHBhcmFtczogdW5rbm93bixcbiAgY29udGV4dDogRGlzcGF0Y2hDb250ZXh0LFxuICBuYW1lPzogc3RyaW5nXG4pOiBQcm9taXNlPFJwY1Jlc3VsdD4ge1xuICBjb25zdCB7XG4gICAgdG9vbHMsXG4gICAgaG9va3MsXG4gICAgbmVlZHNBcHByb3ZhbCxcbiAgICBzdG9yYWdlQ29uZmlnLFxuICAgIGdldFN0b3JhZ2VJbnN0YW5jZSxcbiAgICBnZXRTdG9yYWdlSGFuZGxlcnMsXG4gICAgcnBjLFxuICAgIG92ZXJyaWRlcyxcbiAgfSA9IGNvbnRleHQ7XG5cbiAgc3dpdGNoIChtZXRob2QpIHtcbiAgICBjYXNlIFwidG9vbHMubGlzdFwiOiB7XG4gICAgICBjb25zdCBkZWZhdWx0SGFuZGxlciA9ICgpOiBScGNSZXN1bHQ8VG9vbE1ldGFkYXRhW10+ID0+IHtcbiAgICAgICAgY29uc3QgdG9vbHNNYXAgPSB0b29scyA/PyAoe30gYXMgVG9vbFNldCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5lbnRyaWVzKHRvb2xzTWFwKS5tYXAoKFtuYW1lLCB0XSkgPT4gKHtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiAodCBhcyBUb29sKS5kZXNjcmlwdGlvbixcbiAgICAgICAgICBpbnB1dFNjaGVtYTogc2NoZW1hVG9Kc29uU2NoZW1hKCh0IGFzIFRvb2wpLmlucHV0U2NoZW1hKSxcbiAgICAgICAgfSkpO1xuICAgICAgICByZXR1cm4geyByZXN1bHQgfTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IG92ZXJyaWRlID0gb3ZlcnJpZGVzPy5bXCJ0b29scy5saXN0XCJdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBvdmVycmlkZVJlc3VsdCA9IGF3YWl0IG92ZXJyaWRlPy4oe30pO1xuICAgICAgICBpZiAob3ZlcnJpZGVSZXN1bHQpIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVkID0gaGFuZGxlT3ZlcnJpZGVSZXN1bHQob3ZlcnJpZGVSZXN1bHQpO1xuICAgICAgICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmF1bHRIYW5kbGVyKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIGNvZGU6IFwiSEFORExFUl9FUlJPUlwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdHVzOiA1MDAsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2FzZSBcInRvb2xzLm5lZWRzQXBwcm92YWxcIjoge1xuICAgICAgY29uc3QgcCA9IHBhcmFtcyBhcyBUb29sc05lZWRzQXBwcm92YWxQYXJhbXM7XG5cbiAgICAgIGNvbnN0IGRlZmF1bHRIYW5kbGVyID0gYXN5bmMgKCk6IFByb21pc2U8UnBjUmVzdWx0PGJvb2xlYW4+PiA9PiB7XG4gICAgICAgIC8vIDEuIFBlci10b29sIG5lZWRzQXBwcm92YWwgb24gY3VzdG9tIHRvb2xzIHRha2VzIHByaW9yaXR5XG4gICAgICAgIGNvbnN0IHRvb2xzTWFwID0gdG9vbHMgPz8gKHt9IGFzIFRvb2xTZXQpO1xuICAgICAgICBjb25zdCB0b29sRGVmID0gdG9vbHNNYXBbcC50b29sTmFtZV0gYXMgVG9vbCB8IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKHRvb2xEZWY/Lm5lZWRzQXBwcm92YWwgIT0gbnVsbCkge1xuICAgICAgICAgIGlmICh0eXBlb2YgdG9vbERlZi5uZWVkc0FwcHJvdmFsID09PSBcImJvb2xlYW5cIikge1xuICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiB0b29sRGVmLm5lZWRzQXBwcm92YWwgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdG9vbERlZi5uZWVkc0FwcHJvdmFsKHAuaW5wdXQsIHtcbiAgICAgICAgICAgIHRvb2xDYWxsSWQ6IHAudG9vbENhbGxJZCxcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBwLm1lc3NhZ2VzIGFzIG5ldmVyW10sXG4gICAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dDogdW5kZWZpbmVkLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiB7IHJlc3VsdCB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gMi4gQWdlbnQtbGV2ZWwgbmVlZHNBcHByb3ZhbCBtYXAsIGZhbGxpbmcgYmFjayB0byBidWlsdC1pbiBkZWZhdWx0c1xuICAgICAgICBjb25zdCBlbnRyeSA9XG4gICAgICAgICAgbmVlZHNBcHByb3ZhbD8uW3AudG9vbE5hbWVdID8/XG4gICAgICAgICAgYnVpbHRpbk5lZWRzQXBwcm92YWxbcC50b29sTmFtZSBhcyBCdWlsdEluVG9vbE5hbWVdID8/XG4gICAgICAgICAgZmFsc2U7XG4gICAgICAgIGlmICh0eXBlb2YgZW50cnkgPT09IFwiYm9vbGVhblwiKSB7XG4gICAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiBlbnRyeSB9O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGVudHJ5KHAuaW5wdXQsIHtcbiAgICAgICAgICB0b29sQ2FsbElkOiBwLnRvb2xDYWxsSWQsXG4gICAgICAgICAgbWVzc2FnZXM6IHAubWVzc2FnZXMsXG4gICAgICAgICAgZXhwZXJpbWVudGFsX2NvbnRleHQ6IHVuZGVmaW5lZCxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB7IHJlc3VsdCB9O1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBvdmVycmlkZXM/LltcInRvb2xzLm5lZWRzQXBwcm92YWxcIl07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG92ZXJyaWRlUmVzdWx0ID0gYXdhaXQgb3ZlcnJpZGU/LihwKTtcbiAgICAgICAgaWYgKG92ZXJyaWRlUmVzdWx0KSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlZCA9IGhhbmRsZU92ZXJyaWRlUmVzdWx0KG92ZXJyaWRlUmVzdWx0KTtcbiAgICAgICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBkZWZhdWx0SGFuZGxlcigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBjb2RlOiBcIk5FRURTX0FQUFJPVkFMX0VSUk9SXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBlIGluc3RhbmNlb2YgRXJyb3IgPyBlLm1lc3NhZ2UgOiBTdHJpbmcoZSksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzdGF0dXM6IDUwMCxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjYXNlIFwiaG9vay50b29sLmJlZm9yZVwiOiB7XG4gICAgICBjb25zdCBwID0gcGFyYW1zIGFzIEhvb2tUb29sQmVmb3JlUGFyYW1zO1xuXG4gICAgICBjb25zdCBkZWZhdWx0SGFuZGxlciA9IGFzeW5jIChcbiAgICAgICAgaG9va1BhcmFtczogSG9va1Rvb2xCZWZvcmVQYXJhbXNcbiAgICAgICk6IFByb21pc2U8SG9va1Rvb2xCZWZvcmVSZXN1bHQ+ID0+IHtcbiAgICAgICAgaWYgKCFob29rcz8uW1widG9vbC5iZWZvcmVcIl0pIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaG9va1Jlc3VsdCA9IGF3YWl0IGhvb2tzW1widG9vbC5iZWZvcmVcIl0oaG9va1BhcmFtcyk7XG4gICAgICAgIHJldHVybiBob29rUmVzdWx0ID8/IHt9O1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBvdmVycmlkZXM/LltcImhvb2sudG9vbC5iZWZvcmVcIl07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGxldCBjdXJyZW50UGFyYW1zID0gcDtcbiAgICAgICAgbGV0IG1lcmdlZDogSG9va1Rvb2xCZWZvcmVSZXN1bHQgPSB7fTtcblxuICAgICAgICBjb25zdCBvdmVycmlkZVJlc3VsdCA9IGF3YWl0IG92ZXJyaWRlPy4ocCk7XG4gICAgICAgIGlmIChvdmVycmlkZVJlc3VsdD8ub2spIHtcbiAgICAgICAgICBtZXJnZWQgPSB7IC4uLm1lcmdlZCwgLi4ub3ZlcnJpZGVSZXN1bHQucmVzdWx0IH07XG4gICAgICAgICAgaWYgKG1lcmdlZC5zdG9wKSB7XG4gICAgICAgICAgICByZXR1cm4geyByZXN1bHQ6IG1lcmdlZCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3ZlcnJpZGVSZXN1bHQucmVzdWx0LmlucHV0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGN1cnJlbnRQYXJhbXMgPSB7XG4gICAgICAgICAgICAgIC4uLmN1cnJlbnRQYXJhbXMsXG4gICAgICAgICAgICAgIGlucHV0OiBvdmVycmlkZVJlc3VsdC5yZXN1bHQuaW5wdXQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRSZXN1bHQgPSBhd2FpdCBkZWZhdWx0SGFuZGxlcihjdXJyZW50UGFyYW1zKTtcbiAgICAgICAgbWVyZ2VkID0geyAuLi5tZXJnZWQsIC4uLmRlZmF1bHRSZXN1bHQgfTtcblxuICAgICAgICByZXR1cm4geyByZXN1bHQ6IG1lcmdlZCB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBjb2RlOiBcIkhPT0tfRVJST1JcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1czogNTAwLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhc2UgXCJob29rLnRvb2wuYWZ0ZXJcIjoge1xuICAgICAgY29uc3QgcCA9IHBhcmFtcyBhcyBIb29rVG9vbEFmdGVyUGFyYW1zO1xuXG4gICAgICBjb25zdCBkZWZhdWx0SGFuZGxlciA9IGFzeW5jIChcbiAgICAgICAgaG9va1BhcmFtczogSG9va1Rvb2xBZnRlclBhcmFtc1xuICAgICAgKTogUHJvbWlzZTxIb29rVG9vbEFmdGVyUmVzdWx0PiA9PiB7XG4gICAgICAgIGlmICghaG9va3M/LltcInRvb2wuYWZ0ZXJcIl0pIHtcbiAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaG9va1Jlc3VsdCA9IGF3YWl0IGhvb2tzW1widG9vbC5hZnRlclwiXShob29rUGFyYW1zKTtcbiAgICAgICAgcmV0dXJuIGhvb2tSZXN1bHQgPz8ge307XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBvdmVycmlkZSA9IG92ZXJyaWRlcz8uW1wiaG9vay50b29sLmFmdGVyXCJdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBsZXQgY3VycmVudFBhcmFtcyA9IHA7XG4gICAgICAgIGxldCBtZXJnZWQ6IEhvb2tUb29sQWZ0ZXJSZXN1bHQgPSB7fTtcblxuICAgICAgICBjb25zdCBvdmVycmlkZVJlc3VsdCA9IGF3YWl0IG92ZXJyaWRlPy4ocCk7XG4gICAgICAgIGlmIChvdmVycmlkZVJlc3VsdD8ub2spIHtcbiAgICAgICAgICBtZXJnZWQgPSB7IC4uLm1lcmdlZCwgLi4ub3ZlcnJpZGVSZXN1bHQucmVzdWx0IH07XG4gICAgICAgICAgaWYgKG1lcmdlZC5zdG9wKSB7XG4gICAgICAgICAgICByZXR1cm4geyByZXN1bHQ6IG1lcmdlZCB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAob3ZlcnJpZGVSZXN1bHQucmVzdWx0LnJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjdXJyZW50UGFyYW1zID0ge1xuICAgICAgICAgICAgICAuLi5jdXJyZW50UGFyYW1zLFxuICAgICAgICAgICAgICByZXN1bHQ6IG92ZXJyaWRlUmVzdWx0LnJlc3VsdC5yZXN1bHQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRSZXN1bHQgPSBhd2FpdCBkZWZhdWx0SGFuZGxlcihjdXJyZW50UGFyYW1zKTtcbiAgICAgICAgbWVyZ2VkID0geyAuLi5tZXJnZWQsIC4uLmRlZmF1bHRSZXN1bHQgfTtcblxuICAgICAgICByZXR1cm4geyByZXN1bHQ6IG1lcmdlZCB9O1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBjb2RlOiBcIkhPT0tfRVJST1JcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1czogNTAwLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGNhc2UgXCJ0b29scy5leGVjdXRlXCI6IHtcbiAgICAgIGNvbnN0IHAgPSBwYXJhbXMgYXMgVG9vbHNFeGVjdXRlUGFyYW1zO1xuXG4gICAgICBjb25zdCBkZWZhdWx0SGFuZGxlciA9IGFzeW5jICgpOiBQcm9taXNlPFJwY1Jlc3VsdD4gPT4ge1xuICAgICAgICBjb25zdCB0b29sc01hcCA9IHRvb2xzID8/ICh7fSBhcyBUb29sU2V0KTtcbiAgICAgICAgY29uc3QgdG9vbERlZiA9IHRvb2xzTWFwW3AubmFtZSBhcyBrZXlvZiB0eXBlb2YgdG9vbHNNYXBdO1xuICAgICAgICBpZiAoIXRvb2xEZWYpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgICAgY29kZTogXCJUT09MX05PVF9GT1VORFwiLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBgVW5rbm93biB0b29sOiAke3AubmFtZX1gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBleGVjdXRlID0gKHRvb2xEZWYgYXMgVG9vbCkuZXhlY3V0ZTtcbiAgICAgICAgaWYgKCFleGVjdXRlKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgIGNvZGU6IFwiTk9fRVhFQ1VURVwiLFxuICAgICAgICAgICAgICBtZXNzYWdlOiBgVG9vbCAke3AubmFtZX0gaGFzIG5vIGV4ZWN1dGUgZnVuY3Rpb25gLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzYW5kYm94SW5zdGFuY2UgPSBhd2FpdCBnZXRTYW5kYm94KHtcbiAgICAgICAgICBzYW5kYm94UmVjb3JkOiBwLnNhbmRib3hSZWNvcmQsXG4gICAgICAgICAgc3RvcmFnZUNvbmZpZyxcbiAgICAgICAgICBzdG9yYWdlOiBnZXRTdG9yYWdlSW5zdGFuY2UoKSxcbiAgICAgICAgICBycGMsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHRvb2xDb250ZXh0OiBUb29sQ29udGV4dCA9IHtcbiAgICAgICAgICBzZXNzaW9uOiBwLnNlc3Npb24sXG4gICAgICAgICAgc2FuZGJveDogc2FuZGJveEluc3RhbmNlLFxuICAgICAgICAgIHN0b3JhZ2U6IGdldFN0b3JhZ2VJbnN0YW5jZSgpLFxuICAgICAgICAgIGNvbnRleHQ6IHAuY29udGV4dCxcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgdG9vbElucHV0ID0gcC5pbnB1dDtcblxuICAgICAgICBjb25zdCBiZWZvcmVSZXN1bHQgPSBhd2FpdCBkaXNwYXRjaChcbiAgICAgICAgICBcImhvb2sudG9vbC5iZWZvcmVcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBwLm5hbWUsXG4gICAgICAgICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgICAgICAgICAgY29udGV4dDogdG9vbENvbnRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIG5hbWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKFwiZXJyb3JcIiBpbiBiZWZvcmVSZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gYmVmb3JlUmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJlZm9yZUhvb2sgPSBiZWZvcmVSZXN1bHQucmVzdWx0IGFzIEhvb2tUb29sQmVmb3JlUmVzdWx0O1xuICAgICAgICBpZiAoYmVmb3JlSG9vay5zdG9wKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgIGNvZGU6IFwiSE9PS19TVE9QUEVEXCIsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwidG9vbC5iZWZvcmUgaG9vayBzdG9wcGVkIGV4ZWN1dGlvblwiLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHN0YXR1czogNDAwLFxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJlZm9yZUhvb2suaW5wdXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRvb2xJbnB1dCA9IGJlZm9yZUhvb2suaW5wdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgZXhlY3V0ZSh0b29sSW5wdXQgYXMgbmV2ZXIsIHtcbiAgICAgICAgICBleHBlcmltZW50YWxfY29udGV4dDogdG9vbENvbnRleHQsXG4gICAgICAgICAgdG9vbENhbGxJZDogXCJycGNcIixcbiAgICAgICAgICBtZXNzYWdlczogW10sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGFmdGVyUmVzdWx0ID0gYXdhaXQgZGlzcGF0Y2goXG4gICAgICAgICAgXCJob29rLnRvb2wuYWZ0ZXJcIixcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBwLm5hbWUsXG4gICAgICAgICAgICBpbnB1dDogdG9vbElucHV0LFxuICAgICAgICAgICAgcmVzdWx0LFxuICAgICAgICAgICAgY29udGV4dDogdG9vbENvbnRleHQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgIG5hbWVcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKFwiZXJyb3JcIiBpbiBhZnRlclJlc3VsdCkge1xuICAgICAgICAgIHJldHVybiBhZnRlclJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhZnRlckhvb2sgPSBhZnRlclJlc3VsdC5yZXN1bHQgYXMgSG9va1Rvb2xBZnRlclJlc3VsdDtcbiAgICAgICAgaWYgKGFmdGVySG9vay5zdG9wKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICAgIGNvZGU6IFwiSE9PS19TVE9QUEVEXCIsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6IFwidG9vbC5hZnRlciBob29rIHN0b3BwZWQgZXhlY3V0aW9uXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhdHVzOiA0MDAsXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWZ0ZXJIb29rLnJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmVzdWx0ID0gYWZ0ZXJIb29rLnJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IHJlc3VsdCB9O1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBvdmVycmlkZXM/LltcInRvb2xzLmV4ZWN1dGVcIl07XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG92ZXJyaWRlUmVzdWx0ID0gYXdhaXQgb3ZlcnJpZGU/LihwKTtcbiAgICAgICAgaWYgKG92ZXJyaWRlUmVzdWx0KSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlZCA9IGhhbmRsZU92ZXJyaWRlUmVzdWx0KG92ZXJyaWRlUmVzdWx0KTtcbiAgICAgICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGhhbmRsZWQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhd2FpdCBkZWZhdWx0SGFuZGxlcigpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBjb2RlOiBcIkVYRUNVVEVfRVJST1JcIixcbiAgICAgICAgICAgIG1lc3NhZ2U6IGUgaW5zdGFuY2VvZiBFcnJvciA/IGUubWVzc2FnZSA6IFN0cmluZyhlKSxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN0YXR1czogNTAwLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBtZXRob2QgYXMgTWV0aG9kTmFtZTtcbiAgICAgIGlmICghU1RPUkFHRV9SUENfTUVUSE9EUy5pbmNsdWRlcyhtZXRob2ROYW1lKSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGVycm9yOiB7XG4gICAgICAgICAgICBjb2RlOiBcIlVOS05PV05fTUVUSE9EXCIsXG4gICAgICAgICAgICBtZXNzYWdlOiBgVW5rbm93biBSUEMgbWV0aG9kOiAke21ldGhvZH1gLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdHVzOiA0MDAsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlZmF1bHRIYW5kbGVyID0gYXN5bmMgKCk6IFByb21pc2U8UnBjUmVzdWx0PiA9PiB7XG4gICAgICAgIHJldHVybiBhd2FpdCBoYW5kbGVTdG9yYWdlUmVxdWVzdCh7XG4gICAgICAgICAgY29uZmlnOiBzdG9yYWdlQ29uZmlnLFxuICAgICAgICAgIHJlcXVlc3Q6IHsgbWV0aG9kLCBwYXJhbXMgfSxcbiAgICAgICAgICBuYW1lOiBuYW1lID8/IHN0b3JhZ2VDb25maWcubmFtZSA/PyBcImRlZmF1bHRcIixcbiAgICAgICAgICBnZXRTdG9yYWdlSGFuZGxlcnMsXG4gICAgICAgIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3Qgb3ZlcnJpZGUgPSBvdmVycmlkZXM/LlttZXRob2ROYW1lXSBhc1xuICAgICAgICB8ICgocGFyYW1zOiB1bmtub3duKSA9PiBQcm9taXNlPEFnZW50UnBjUmVzdWx0PHVua25vd24+PilcbiAgICAgICAgfCB1bmRlZmluZWQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IG92ZXJyaWRlUmVzdWx0ID0gYXdhaXQgb3ZlcnJpZGU/LihwYXJhbXMpO1xuICAgICAgICBpZiAob3ZlcnJpZGVSZXN1bHQpIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVkID0gaGFuZGxlT3ZlcnJpZGVSZXN1bHQob3ZlcnJpZGVSZXN1bHQpO1xuICAgICAgICAgIGlmIChoYW5kbGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaGFuZGxlZDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGF3YWl0IGRlZmF1bHRIYW5kbGVyKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgZXJyb3I6IHtcbiAgICAgICAgICAgIGNvZGU6IFwiU1RPUkFHRV9FUlJPUlwiLFxuICAgICAgICAgICAgbWVzc2FnZTogZSBpbnN0YW5jZW9mIEVycm9yID8gZS5tZXNzYWdlIDogU3RyaW5nKGUpLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc3RhdHVzOiA1MDAsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUm91dGVzIHN0b3JhZ2UgUlBDIHJlcXVlc3RzIGJhc2VkIG9uIHN0b3JhZ2UgY29uZmlnIHR5cGUuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGhhbmRsZVN0b3JhZ2VSZXF1ZXN0KHtcbiAgY29uZmlnLFxuICByZXF1ZXN0LFxuICBuYW1lLFxuICBnZXRTdG9yYWdlSGFuZGxlcnMsXG59OiB7XG4gIGNvbmZpZzogU3RvcmFnZUNvbmZpZztcbiAgcmVxdWVzdDogUnBjUmVxdWVzdDtcbiAgbmFtZTogc3RyaW5nO1xuICBnZXRTdG9yYWdlSGFuZGxlcnM6IChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8U3RvcmFnZUhhbmRsZXJzPjtcbn0pOiBQcm9taXNlPFJwY1Jlc3BvbnNlPiB7XG4gIHN3aXRjaCAoY29uZmlnLnR5cGUpIHtcbiAgICBjYXNlIFwibG9jYWxcIjoge1xuICAgICAgY29uc3QgaGFuZGxlcnMgPSBhd2FpdCBnZXRTdG9yYWdlSGFuZGxlcnMobmFtZSk7XG4gICAgICBjb25zdCB7IGhhbmRsZVN0b3JhZ2VScGMgfSA9IGF3YWl0IGltcG9ydChcIi4vc3RvcmFnZS9oYW5kbGVyXCIpO1xuICAgICAgcmV0dXJuIGhhbmRsZVN0b3JhZ2VScGMocmVxdWVzdCwgaGFuZGxlcnMpO1xuICAgIH1cbiAgICBjYXNlIFwidmVyY2VsXCI6IHtcbiAgICAgIGNvbnN0IHsgZ2V0VmVyY2VsU3RvcmFnZUNvbmZpZyB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICBcIi4vc3RvcmFnZS9iaW5kaW5ncy92ZXJjZWxcIlxuICAgICAgKTtcbiAgICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgZ2V0VmVyY2VsU3RvcmFnZUNvbmZpZygpO1xuICAgICAgcmV0dXJuIGF3YWl0IHByb3h5U3RvcmFnZVJlcXVlc3Qoe1xuICAgICAgICB1cmw6IHJlc29sdmVkLnVybCxcbiAgICAgICAgaGVhZGVyczogeyAuLi5yZXNvbHZlZC5oZWFkZXJzLCBcIngtYWdlbnQtbmFtZVwiOiBuYW1lIH0sXG4gICAgICAgIHJlcXVlc3QsXG4gICAgICB9KTtcbiAgICB9XG4gICAgY2FzZSBcImN1c3RvbVwiOiB7XG4gICAgICByZXR1cm4gYXdhaXQgcHJveHlTdG9yYWdlUmVxdWVzdCh7XG4gICAgICAgIHVybDogcmVzb2x2ZUFwaVVybCh7IGFwaTogY29uZmlnLnVybCB9KSxcbiAgICAgICAgaGVhZGVyczogeyAuLi5jb25maWcuaGVhZGVycywgXCJ4LWFnZW50LW5hbWVcIjogbmFtZSB9LFxuICAgICAgICByZXF1ZXN0LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbmZpZyBzYXRpc2ZpZXMgbmV2ZXI7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbmtub3duIHN0b3JhZ2UgdHlwZTogJHsoY29uZmlnIGFzIHsgdHlwZTogc3RyaW5nIH0pLnR5cGV9YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBQcm94aWVzIGEgc3RvcmFnZSBSUEMgcmVxdWVzdCB0byBhbiBleHRlcm5hbCBVUkwuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHByb3h5U3RvcmFnZVJlcXVlc3Qoe1xuICB1cmwsXG4gIGhlYWRlcnMsXG4gIHJlcXVlc3QsXG59OiB7XG4gIHVybDogc3RyaW5nO1xuICBoZWFkZXJzPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgcmVxdWVzdDogUnBjUmVxdWVzdDtcbn0pOiBQcm9taXNlPFJwY1Jlc3BvbnNlPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICBoZWFkZXJzOiB7XG4gICAgICBcIkNvbnRlbnQtVHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIixcbiAgICAgIC4uLmhlYWRlcnMsXG4gICAgfSxcbiAgICBib2R5OiBKU09OLnN0cmluZ2lmeShyZXF1ZXN0KSxcbiAgfSk7XG5cbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHJldHVybiB7XG4gICAgICBlcnJvcjoge1xuICAgICAgICBjb2RlOiBcIlBST1hZX0VSUk9SXCIsXG4gICAgICAgIG1lc3NhZ2U6IGBTdG9yYWdlIHByb3h5IGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH1gLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHJlc3BvbnNlLmpzb24oKSBhcyBQcm9taXNlPFJwY1Jlc3BvbnNlPjtcbn1cblxuZnVuY3Rpb24gc2NoZW1hVG9Kc29uU2NoZW1hKHNjaGVtYTogdW5rbm93bik6IEpTT05TY2hlbWE3IHwgdW5kZWZpbmVkIHtcbiAgaWYgKCFzY2hlbWEpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKFxuICAgIHR5cGVvZiBzY2hlbWEgPT09IFwib2JqZWN0XCIgJiZcbiAgICBzY2hlbWEgIT09IG51bGwgJiZcbiAgICBcIl9kZWZcIiBpbiBzY2hlbWEgJiZcbiAgICB0eXBlb2YgKHNjaGVtYSBhcyB6LlpvZFR5cGUpLl9kZWYgPT09IFwib2JqZWN0XCJcbiAgKSB7XG4gICAgcmV0dXJuIHoudG9KU09OU2NoZW1hKHNjaGVtYSBhcyB6LlpvZFR5cGUpIGFzIEpTT05TY2hlbWE3O1xuICB9XG5cbiAgaWYgKHR5cGVvZiBzY2hlbWEgPT09IFwib2JqZWN0XCIgJiYgc2NoZW1hICE9PSBudWxsKSB7XG4gICAgY29uc3QgcyA9IHNjaGVtYSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBpZiAoU3ltYm9sLmZvcihcInZlcmNlbC5haS5zY2hlbWFcIikgaW4gcyAmJiBcImpzb25TY2hlbWFcIiBpbiBzKSB7XG4gICAgICByZXR1cm4gcy5qc29uU2NoZW1hIGFzIEpTT05TY2hlbWE3O1xuICAgIH1cbiAgfVxuXG4gIGlmIChcbiAgICB0eXBlb2Ygc2NoZW1hID09PSBcIm9iamVjdFwiICYmXG4gICAgc2NoZW1hICE9PSBudWxsICYmXG4gICAgKFwidHlwZVwiIGluIHNjaGVtYSB8fCBcInByb3BlcnRpZXNcIiBpbiBzY2hlbWEpXG4gICkge1xuICAgIHJldHVybiBzY2hlbWEgYXMgSlNPTlNjaGVtYTc7XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuIiwgImltcG9ydCB0eXBlIHsgVUlNZXNzYWdlIH0gZnJvbSBcImFpXCI7XG5pbXBvcnQgeyB1bGlkIH0gZnJvbSBcInVsaWRcIjtcbmltcG9ydCB0eXBlIHsgU2VuZElucHV0IH0gZnJvbSBcIi4uL2NsaWVudFwiO1xuaW1wb3J0IHR5cGUgeyBNZXNzYWdlLCBQYXJ0IH0gZnJvbSBcIi4uL3N0b3JhZ2VcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIHRvTWVzc2FnZUFuZFBhcnRzKHtcbiAgc2Vzc2lvbklkLFxuICBpZCxcbiAgaW5wdXQsXG4gIGRlZmF1bHRSb2xlLFxufToge1xuICBzZXNzaW9uSWQ6IHN0cmluZztcbiAgaWQ/OiBzdHJpbmc7XG4gIGlucHV0OiBTZW5kSW5wdXQ7XG4gIGRlZmF1bHRSb2xlOiBVSU1lc3NhZ2VbXCJyb2xlXCJdO1xufSk6IHsgbWVzc2FnZTogTWVzc2FnZTsgcGFydHM6IFBhcnRbXSB9IHtcbiAgY29uc3QgbWVzc2FnZUlkID0gaWQgPz8gYG1lc3NhZ2VfJHt1bGlkKCl9YDtcbiAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIHtcbiAgICAgIG1lc3NhZ2U6IHtcbiAgICAgICAgaWQ6IG1lc3NhZ2VJZCxcbiAgICAgICAgc2Vzc2lvbklkLFxuICAgICAgICByb2xlOiBkZWZhdWx0Um9sZSxcbiAgICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICAgIHN0YXJ0ZWRBdDogbnVsbCxcbiAgICAgICAgY29tcGxldGVkQXQ6IG51bGwsXG4gICAgICAgIGludGVycnVwdGVkQXQ6IG51bGwsXG4gICAgICAgIHVzYWdlOiBudWxsLFxuICAgICAgfSxcbiAgICAgIHBhcnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzZXNzaW9uSWQsXG4gICAgICAgICAgbWVzc2FnZUlkLFxuICAgICAgICAgIGlkOiBgcGFydF8ke3VsaWQoKX1gLFxuICAgICAgICAgIGluZGV4OiAwLFxuICAgICAgICAgIHBhcnQ6IHsgdHlwZTogXCJ0ZXh0XCIsIHRleHQ6IGlucHV0IH0sXG4gICAgICAgIH0sXG4gICAgICBdLFxuICAgIH07XG4gIH1cbiAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgcmV0dXJuIHtcbiAgICBtZXNzYWdlOiB7XG4gICAgICBzZXNzaW9uSWQsXG4gICAgICBpZDogbWVzc2FnZUlkLFxuICAgICAgY3JlYXRlZEF0OiBub3csXG4gICAgICBzdGFydGVkQXQ6IG51bGwsXG4gICAgICBjb21wbGV0ZWRBdDogbnVsbCxcbiAgICAgIGludGVycnVwdGVkQXQ6IG51bGwsXG4gICAgICB1c2FnZTogbnVsbCxcbiAgICAgIHJvbGU6IGlucHV0LnJvbGUgPz8gZGVmYXVsdFJvbGUsXG4gICAgfSxcbiAgICBwYXJ0czogaW5wdXQucGFydHMubWFwKChwYXJ0LCBpbmRleCkgPT4gKHtcbiAgICAgIHNlc3Npb25JZCxcbiAgICAgIG1lc3NhZ2VJZCxcbiAgICAgIGlkOiBgcGFydF8ke3VsaWQoKX1gLFxuICAgICAgaW5kZXgsXG4gICAgICBwYXJ0LFxuICAgIH0pKSxcbiAgfTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxTQUFTLDhCQUE4QjtBQVd2QyxTQUFTLFdBQVc7QUFDcEIsWUFBWSxZQUFZO0FBQ3hCLE9BQU8sV0FBVztBQUNsQixTQUFTLFFBQUFBLGFBQVk7QUFDckIsU0FBUyxRQUFRLGFBQWE7OztBQ2Q5QixTQUFTLFNBQVM7QUFvR2xCLElBQU0sdUJBRUY7QUFBQSxFQUNGLE1BQU07QUFDUjtBQUtBLFNBQVMscUJBQXdCLEtBQTZDO0FBQzVFLE1BQUksUUFBUSxNQUFNO0FBQ2hCLFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSSxJQUFJLElBQUk7QUFDVixXQUFPLEVBQUUsUUFBUSxJQUFJLE9BQU87QUFBQSxFQUM5QjtBQUNBLFNBQU87QUFBQSxJQUNMLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixTQUFTLElBQUksTUFBTTtBQUFBLElBQ25ELFFBQVE7QUFBQSxFQUNWO0FBQ0Y7QUFNQSxlQUFzQixTQUNwQixRQUNBLFFBQ0EsU0FDQSxNQUNvQjtBQUNwQixRQUFNO0FBQUEsSUFDSjtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxJQUNBO0FBQUEsSUFDQTtBQUFBLElBQ0E7QUFBQSxFQUNGLElBQUk7QUFFSixVQUFRLFFBQVE7QUFBQSxJQUNkLEtBQUssY0FBYztBQUNqQixZQUFNLGlCQUFpQixNQUFpQztBQUN0RCxjQUFNLFdBQVcsU0FBVSxDQUFDO0FBQzVCLGNBQU0sU0FBUyxPQUFPLFFBQVEsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDQyxPQUFNLENBQUMsT0FBTztBQUFBLFVBQzFELE1BQUFBO0FBQUEsVUFDQSxhQUFjLEVBQVc7QUFBQSxVQUN6QixhQUFhLG1CQUFvQixFQUFXLFdBQVc7QUFBQSxRQUN6RCxFQUFFO0FBQ0YsZUFBTyxFQUFFLE9BQU87QUFBQSxNQUNsQjtBQUVBLFlBQU0sV0FBVyxZQUFZLFlBQVk7QUFFekMsVUFBSTtBQUNGLGNBQU0saUJBQWlCLE1BQU0sV0FBVyxDQUFDLENBQUM7QUFDMUMsWUFBSSxnQkFBZ0I7QUFDbEIsZ0JBQU0sVUFBVSxxQkFBcUIsY0FBYztBQUNuRCxjQUFJLFNBQVM7QUFDWCxtQkFBTztBQUFBLFVBQ1Q7QUFBQSxRQUNGO0FBQ0EsZUFBTyxlQUFlO0FBQUEsTUFDeEIsU0FBUyxHQUFHO0FBQ1YsZUFBTztBQUFBLFVBQ0wsT0FBTztBQUFBLFlBQ0wsTUFBTTtBQUFBLFlBQ04sU0FBUyxhQUFhLFFBQVEsRUFBRSxVQUFVLE9BQU8sQ0FBQztBQUFBLFVBQ3BEO0FBQUEsVUFDQSxRQUFRO0FBQUEsUUFDVjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFFQSxLQUFLLHVCQUF1QjtBQUMxQixZQUFNLElBQUk7QUFFVixZQUFNLGlCQUFpQixZQUF5QztBQUU5RCxjQUFNLFdBQVcsU0FBVSxDQUFDO0FBQzVCLGNBQU0sVUFBVSxTQUFTLEVBQUUsUUFBUTtBQUNuQyxZQUFJLFNBQVMsaUJBQWlCLE1BQU07QUFDbEMsY0FBSSxPQUFPLFFBQVEsa0JBQWtCLFdBQVc7QUFDOUMsbUJBQU8sRUFBRSxRQUFRLFFBQVEsY0FBYztBQUFBLFVBQ3pDO0FBQ0EsZ0JBQU1DLFVBQVMsTUFBTSxRQUFRLGNBQWMsRUFBRSxPQUFPO0FBQUEsWUFDbEQsWUFBWSxFQUFFO0FBQUEsWUFDZCxVQUFVLEVBQUU7QUFBQSxZQUNaLHNCQUFzQjtBQUFBLFVBQ3hCLENBQUM7QUFDRCxpQkFBTyxFQUFFLFFBQUFBLFFBQU87QUFBQSxRQUNsQjtBQUdBLGNBQU0sUUFDSixnQkFBZ0IsRUFBRSxRQUFRLEtBQzFCLHFCQUFxQixFQUFFLFFBQTJCLEtBQ2xEO0FBQ0YsWUFBSSxPQUFPLFVBQVUsV0FBVztBQUM5QixpQkFBTyxFQUFFLFFBQVEsTUFBTTtBQUFBLFFBQ3pCO0FBQ0EsY0FBTSxTQUFTLE1BQU0sTUFBTSxFQUFFLE9BQU87QUFBQSxVQUNsQyxZQUFZLEVBQUU7QUFBQSxVQUNkLFVBQVUsRUFBRTtBQUFBLFVBQ1osc0JBQXNCO0FBQUEsUUFDeEIsQ0FBQztBQUNELGVBQU8sRUFBRSxPQUFPO0FBQUEsTUFDbEI7QUFFQSxZQUFNLFdBQVcsWUFBWSxxQkFBcUI7QUFFbEQsVUFBSTtBQUNGLGNBQU0saUJBQWlCLE1BQU0sV0FBVyxDQUFDO0FBQ3pDLFlBQUksZ0JBQWdCO0FBQ2xCLGdCQUFNLFVBQVUscUJBQXFCLGNBQWM7QUFDbkQsY0FBSSxTQUFTO0FBQ1gsbUJBQU87QUFBQSxVQUNUO0FBQUEsUUFDRjtBQUNBLGVBQU8sTUFBTSxlQUFlO0FBQUEsTUFDOUIsU0FBUyxHQUFHO0FBQ1YsZUFBTztBQUFBLFVBQ0wsT0FBTztBQUFBLFlBQ0wsTUFBTTtBQUFBLFlBQ04sU0FBUyxhQUFhLFFBQVEsRUFBRSxVQUFVLE9BQU8sQ0FBQztBQUFBLFVBQ3BEO0FBQUEsVUFDQSxRQUFRO0FBQUEsUUFDVjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFFQSxLQUFLLG9CQUFvQjtBQUN2QixZQUFNLElBQUk7QUFFVixZQUFNLGlCQUFpQixPQUNyQixlQUNrQztBQUNsQyxZQUFJLENBQUMsUUFBUSxhQUFhLEdBQUc7QUFDM0IsaUJBQU8sQ0FBQztBQUFBLFFBQ1Y7QUFDQSxjQUFNLGFBQWEsTUFBTSxNQUFNLGFBQWEsRUFBRSxVQUFVO0FBQ3hELGVBQU8sY0FBYyxDQUFDO0FBQUEsTUFDeEI7QUFFQSxZQUFNLFdBQVcsWUFBWSxrQkFBa0I7QUFFL0MsVUFBSTtBQUNGLFlBQUksZ0JBQWdCO0FBQ3BCLFlBQUksU0FBK0IsQ0FBQztBQUVwQyxjQUFNLGlCQUFpQixNQUFNLFdBQVcsQ0FBQztBQUN6QyxZQUFJLGdCQUFnQixJQUFJO0FBQ3RCLG1CQUFTLEVBQUUsR0FBRyxRQUFRLEdBQUcsZUFBZSxPQUFPO0FBQy9DLGNBQUksT0FBTyxNQUFNO0FBQ2YsbUJBQU8sRUFBRSxRQUFRLE9BQU87QUFBQSxVQUMxQjtBQUNBLGNBQUksZUFBZSxPQUFPLFVBQVUsUUFBVztBQUM3Qyw0QkFBZ0I7QUFBQSxjQUNkLEdBQUc7QUFBQSxjQUNILE9BQU8sZUFBZSxPQUFPO0FBQUEsWUFDL0I7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUVBLGNBQU0sZ0JBQWdCLE1BQU0sZUFBZSxhQUFhO0FBQ3hELGlCQUFTLEVBQUUsR0FBRyxRQUFRLEdBQUcsY0FBYztBQUV2QyxlQUFPLEVBQUUsUUFBUSxPQUFPO0FBQUEsTUFDMUIsU0FBUyxHQUFHO0FBQ1YsZUFBTztBQUFBLFVBQ0wsT0FBTztBQUFBLFlBQ0wsTUFBTTtBQUFBLFlBQ04sU0FBUyxhQUFhLFFBQVEsRUFBRSxVQUFVLE9BQU8sQ0FBQztBQUFBLFVBQ3BEO0FBQUEsVUFDQSxRQUFRO0FBQUEsUUFDVjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFFQSxLQUFLLG1CQUFtQjtBQUN0QixZQUFNLElBQUk7QUFFVixZQUFNLGlCQUFpQixPQUNyQixlQUNpQztBQUNqQyxZQUFJLENBQUMsUUFBUSxZQUFZLEdBQUc7QUFDMUIsaUJBQU8sQ0FBQztBQUFBLFFBQ1Y7QUFDQSxjQUFNLGFBQWEsTUFBTSxNQUFNLFlBQVksRUFBRSxVQUFVO0FBQ3ZELGVBQU8sY0FBYyxDQUFDO0FBQUEsTUFDeEI7QUFFQSxZQUFNLFdBQVcsWUFBWSxpQkFBaUI7QUFFOUMsVUFBSTtBQUNGLFlBQUksZ0JBQWdCO0FBQ3BCLFlBQUksU0FBOEIsQ0FBQztBQUVuQyxjQUFNLGlCQUFpQixNQUFNLFdBQVcsQ0FBQztBQUN6QyxZQUFJLGdCQUFnQixJQUFJO0FBQ3RCLG1CQUFTLEVBQUUsR0FBRyxRQUFRLEdBQUcsZUFBZSxPQUFPO0FBQy9DLGNBQUksT0FBTyxNQUFNO0FBQ2YsbUJBQU8sRUFBRSxRQUFRLE9BQU87QUFBQSxVQUMxQjtBQUNBLGNBQUksZUFBZSxPQUFPLFdBQVcsUUFBVztBQUM5Qyw0QkFBZ0I7QUFBQSxjQUNkLEdBQUc7QUFBQSxjQUNILFFBQVEsZUFBZSxPQUFPO0FBQUEsWUFDaEM7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUVBLGNBQU0sZ0JBQWdCLE1BQU0sZUFBZSxhQUFhO0FBQ3hELGlCQUFTLEVBQUUsR0FBRyxRQUFRLEdBQUcsY0FBYztBQUV2QyxlQUFPLEVBQUUsUUFBUSxPQUFPO0FBQUEsTUFDMUIsU0FBUyxHQUFHO0FBQ1YsZUFBTztBQUFBLFVBQ0wsT0FBTztBQUFBLFlBQ0wsTUFBTTtBQUFBLFlBQ04sU0FBUyxhQUFhLFFBQVEsRUFBRSxVQUFVLE9BQU8sQ0FBQztBQUFBLFVBQ3BEO0FBQUEsVUFDQSxRQUFRO0FBQUEsUUFDVjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsSUFFQSxLQUFLLGlCQUFpQjtBQUNwQixZQUFNLElBQUk7QUFFVixZQUFNLGlCQUFpQixZQUFnQztBQUNyRCxjQUFNLFdBQVcsU0FBVSxDQUFDO0FBQzVCLGNBQU0sVUFBVSxTQUFTLEVBQUUsSUFBNkI7QUFDeEQsWUFBSSxDQUFDLFNBQVM7QUFDWixpQkFBTztBQUFBLFlBQ0wsT0FBTztBQUFBLGNBQ0wsTUFBTTtBQUFBLGNBQ04sU0FBUyxpQkFBaUIsRUFBRSxJQUFJO0FBQUEsWUFDbEM7QUFBQSxZQUNBLFFBQVE7QUFBQSxVQUNWO0FBQUEsUUFDRjtBQUVBLGNBQU0sVUFBVyxRQUFpQjtBQUNsQyxZQUFJLENBQUMsU0FBUztBQUNaLGlCQUFPO0FBQUEsWUFDTCxPQUFPO0FBQUEsY0FDTCxNQUFNO0FBQUEsY0FDTixTQUFTLFFBQVEsRUFBRSxJQUFJO0FBQUEsWUFDekI7QUFBQSxZQUNBLFFBQVE7QUFBQSxVQUNWO0FBQUEsUUFDRjtBQUVBLGNBQU0sa0JBQWtCLE1BQU0sV0FBVztBQUFBLFVBQ3ZDLGVBQWUsRUFBRTtBQUFBLFVBQ2pCO0FBQUEsVUFDQSxTQUFTLG1CQUFtQjtBQUFBLFVBQzVCO0FBQUEsUUFDRixDQUFDO0FBRUQsY0FBTSxjQUEyQjtBQUFBLFVBQy9CLFNBQVMsRUFBRTtBQUFBLFVBQ1gsU0FBUztBQUFBLFVBQ1QsU0FBUyxtQkFBbUI7QUFBQSxVQUM1QixTQUFTLEVBQUU7QUFBQSxRQUNiO0FBRUEsWUFBSSxZQUFZLEVBQUU7QUFFbEIsY0FBTSxlQUFlLE1BQU07QUFBQSxVQUN6QjtBQUFBLFVBQ0E7QUFBQSxZQUNFLE1BQU0sRUFBRTtBQUFBLFlBQ1IsT0FBTztBQUFBLFlBQ1AsU0FBUztBQUFBLFVBQ1g7QUFBQSxVQUNBO0FBQUEsVUFDQTtBQUFBLFFBQ0Y7QUFDQSxZQUFJLFdBQVcsY0FBYztBQUMzQixpQkFBTztBQUFBLFFBQ1Q7QUFDQSxjQUFNLGFBQWEsYUFBYTtBQUNoQyxZQUFJLFdBQVcsTUFBTTtBQUNuQixpQkFBTztBQUFBLFlBQ0wsT0FBTztBQUFBLGNBQ0wsTUFBTTtBQUFBLGNBQ04sU0FBUztBQUFBLFlBQ1g7QUFBQSxZQUNBLFFBQVE7QUFBQSxVQUNWO0FBQUEsUUFDRjtBQUNBLFlBQUksV0FBVyxVQUFVLFFBQVc7QUFDbEMsc0JBQVksV0FBVztBQUFBLFFBQ3pCO0FBRUEsWUFBSSxTQUFTLE1BQU0sUUFBUSxXQUFvQjtBQUFBLFVBQzdDLHNCQUFzQjtBQUFBLFVBQ3RCLFlBQVk7QUFBQSxVQUNaLFVBQVUsQ0FBQztBQUFBLFFBQ2IsQ0FBQztBQUVELGNBQU0sY0FBYyxNQUFNO0FBQUEsVUFDeEI7QUFBQSxVQUNBO0FBQUEsWUFDRSxNQUFNLEVBQUU7QUFBQSxZQUNSLE9BQU87QUFBQSxZQUNQO0FBQUEsWUFDQSxTQUFTO0FBQUEsVUFDWDtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsUUFDRjtBQUNBLFlBQUksV0FBVyxhQUFhO0FBQzFCLGlCQUFPO0FBQUEsUUFDVDtBQUNBLGNBQU0sWUFBWSxZQUFZO0FBQzlCLFlBQUksVUFBVSxNQUFNO0FBQ2xCLGlCQUFPO0FBQUEsWUFDTCxPQUFPO0FBQUEsY0FDTCxNQUFNO0FBQUEsY0FDTixTQUFTO0FBQUEsWUFDWDtBQUFBLFlBQ0EsUUFBUTtBQUFBLFVBQ1Y7QUFBQSxRQUNGO0FBQ0EsWUFBSSxVQUFVLFdBQVcsUUFBVztBQUNsQyxtQkFBUyxVQUFVO0FBQUEsUUFDckI7QUFFQSxlQUFPLEVBQUUsT0FBTztBQUFBLE1BQ2xCO0FBRUEsWUFBTSxXQUFXLFlBQVksZUFBZTtBQUU1QyxVQUFJO0FBQ0YsY0FBTSxpQkFBaUIsTUFBTSxXQUFXLENBQUM7QUFDekMsWUFBSSxnQkFBZ0I7QUFDbEIsZ0JBQU0sVUFBVSxxQkFBcUIsY0FBYztBQUNuRCxjQUFJLFNBQVM7QUFDWCxtQkFBTztBQUFBLFVBQ1Q7QUFBQSxRQUNGO0FBQ0EsZUFBTyxNQUFNLGVBQWU7QUFBQSxNQUM5QixTQUFTLEdBQUc7QUFDVixlQUFPO0FBQUEsVUFDTCxPQUFPO0FBQUEsWUFDTCxNQUFNO0FBQUEsWUFDTixTQUFTLGFBQWEsUUFBUSxFQUFFLFVBQVUsT0FBTyxDQUFDO0FBQUEsVUFDcEQ7QUFBQSxVQUNBLFFBQVE7QUFBQSxRQUNWO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxJQUVBLFNBQVM7QUFDUCxZQUFNLGFBQWE7QUFDbkIsVUFBSSxDQUFDLG9CQUFvQixTQUFTLFVBQVUsR0FBRztBQUM3QyxlQUFPO0FBQUEsVUFDTCxPQUFPO0FBQUEsWUFDTCxNQUFNO0FBQUEsWUFDTixTQUFTLHVCQUF1QixNQUFNO0FBQUEsVUFDeEM7QUFBQSxVQUNBLFFBQVE7QUFBQSxRQUNWO0FBQUEsTUFDRjtBQUVBLFlBQU0saUJBQWlCLFlBQWdDO0FBQ3JELGVBQU8sTUFBTSxxQkFBcUI7QUFBQSxVQUNoQyxRQUFRO0FBQUEsVUFDUixTQUFTLEVBQUUsUUFBUSxPQUFPO0FBQUEsVUFDMUIsTUFBTSxRQUFRLGNBQWMsUUFBUTtBQUFBLFVBQ3BDO0FBQUEsUUFDRixDQUFDO0FBQUEsTUFDSDtBQUVBLFlBQU0sV0FBVyxZQUFZLFVBQVU7QUFJdkMsVUFBSTtBQUNGLGNBQU0saUJBQWlCLE1BQU0sV0FBVyxNQUFNO0FBQzlDLFlBQUksZ0JBQWdCO0FBQ2xCLGdCQUFNLFVBQVUscUJBQXFCLGNBQWM7QUFDbkQsY0FBSSxTQUFTO0FBQ1gsbUJBQU87QUFBQSxVQUNUO0FBQUEsUUFDRjtBQUNBLGVBQU8sTUFBTSxlQUFlO0FBQUEsTUFDOUIsU0FBUyxHQUFHO0FBQ1YsZUFBTztBQUFBLFVBQ0wsT0FBTztBQUFBLFlBQ0wsTUFBTTtBQUFBLFlBQ04sU0FBUyxhQUFhLFFBQVEsRUFBRSxVQUFVLE9BQU8sQ0FBQztBQUFBLFVBQ3BEO0FBQUEsVUFDQSxRQUFRO0FBQUEsUUFDVjtBQUFBLE1BQ0Y7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUNGO0FBS0EsZUFBZSxxQkFBcUI7QUFBQSxFQUNsQztBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLEdBS3lCO0FBQ3ZCLFVBQVEsT0FBTyxNQUFNO0FBQUEsSUFDbkIsS0FBSyxTQUFTO0FBQ1osWUFBTSxXQUFXLE1BQU0sbUJBQW1CLElBQUk7QUFDOUMsWUFBTSxFQUFFLGtCQUFBQyxrQkFBaUIsSUFBSSxNQUFNLE9BQU8sd0JBQW1CO0FBQzdELGFBQU9BLGtCQUFpQixTQUFTLFFBQVE7QUFBQSxJQUMzQztBQUFBLElBQ0EsS0FBSyxVQUFVO0FBQ2IsWUFBTSxFQUFFLHVCQUF1QixJQUFJLE1BQU0sT0FDdkMsdUJBQ0Y7QUFDQSxZQUFNLFdBQVcsTUFBTSx1QkFBdUI7QUFDOUMsYUFBTyxNQUFNLG9CQUFvQjtBQUFBLFFBQy9CLEtBQUssU0FBUztBQUFBLFFBQ2QsU0FBUyxFQUFFLEdBQUcsU0FBUyxTQUFTLGdCQUFnQixLQUFLO0FBQUEsUUFDckQ7QUFBQSxNQUNGLENBQUM7QUFBQSxJQUNIO0FBQUEsSUFDQSxLQUFLLFVBQVU7QUFDYixhQUFPLE1BQU0sb0JBQW9CO0FBQUEsUUFDL0IsS0FBSyxjQUFjLEVBQUUsS0FBSyxPQUFPLElBQUksQ0FBQztBQUFBLFFBQ3RDLFNBQVMsRUFBRSxHQUFHLE9BQU8sU0FBUyxnQkFBZ0IsS0FBSztBQUFBLFFBQ25EO0FBQUEsTUFDRixDQUFDO0FBQUEsSUFDSDtBQUFBLElBQ0EsU0FBUztBQUNQO0FBQ0EsWUFBTSxJQUFJO0FBQUEsUUFDUix5QkFBMEIsT0FBNEIsSUFBSTtBQUFBLE1BQzVEO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDRjtBQUtBLGVBQWUsb0JBQW9CO0FBQUEsRUFDakM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLEdBSXlCO0FBQ3ZCLFFBQU0sV0FBVyxNQUFNLE1BQU0sS0FBSztBQUFBLElBQ2hDLFFBQVE7QUFBQSxJQUNSLFNBQVM7QUFBQSxNQUNQLGdCQUFnQjtBQUFBLE1BQ2hCLEdBQUc7QUFBQSxJQUNMO0FBQUEsSUFDQSxNQUFNLEtBQUssVUFBVSxPQUFPO0FBQUEsRUFDOUIsQ0FBQztBQUVELE1BQUksQ0FBQyxTQUFTLElBQUk7QUFDaEIsV0FBTztBQUFBLE1BQ0wsT0FBTztBQUFBLFFBQ0wsTUFBTTtBQUFBLFFBQ04sU0FBUyx5QkFBeUIsU0FBUyxNQUFNLElBQUksU0FBUyxVQUFVO0FBQUEsTUFDMUU7QUFBQSxJQUNGO0FBQUEsRUFDRjtBQUVBLFNBQU8sU0FBUyxLQUFLO0FBQ3ZCO0FBRUEsU0FBUyxtQkFBbUIsUUFBMEM7QUFDcEUsTUFBSSxDQUFDLFFBQVE7QUFDWCxXQUFPO0FBQUEsRUFDVDtBQUVBLE1BQ0UsT0FBTyxXQUFXLFlBQ2xCLFdBQVcsUUFDWCxVQUFVLFVBQ1YsT0FBUSxPQUFxQixTQUFTLFVBQ3RDO0FBQ0EsV0FBTyxFQUFFLGFBQWEsTUFBbUI7QUFBQSxFQUMzQztBQUVBLE1BQUksT0FBTyxXQUFXLFlBQVksV0FBVyxNQUFNO0FBQ2pELFVBQU0sSUFBSTtBQUNWLFFBQUksT0FBTyxJQUFJLGtCQUFrQixLQUFLLEtBQUssZ0JBQWdCLEdBQUc7QUFDNUQsYUFBTyxFQUFFO0FBQUEsSUFDWDtBQUFBLEVBQ0Y7QUFFQSxNQUNFLE9BQU8sV0FBVyxZQUNsQixXQUFXLFNBQ1YsVUFBVSxVQUFVLGdCQUFnQixTQUNyQztBQUNBLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTztBQUNUOzs7QUN4bUJBLFNBQVMsWUFBWTtBQUlkLFNBQVMsa0JBQWtCO0FBQUEsRUFDaEM7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixHQUt3QztBQUN0QyxRQUFNLFlBQVksTUFBTSxXQUFXLEtBQUssQ0FBQztBQUN6QyxNQUFJLE9BQU8sVUFBVSxVQUFVO0FBQzdCLFVBQU1DLE9BQU0sS0FBSyxJQUFJO0FBQ3JCLFdBQU87QUFBQSxNQUNMLFNBQVM7QUFBQSxRQUNQLElBQUk7QUFBQSxRQUNKO0FBQUEsUUFDQSxNQUFNO0FBQUEsUUFDTixXQUFXQTtBQUFBLFFBQ1gsV0FBVztBQUFBLFFBQ1gsYUFBYTtBQUFBLFFBQ2IsZUFBZTtBQUFBLFFBQ2YsT0FBTztBQUFBLE1BQ1Q7QUFBQSxNQUNBLE9BQU87QUFBQSxRQUNMO0FBQUEsVUFDRTtBQUFBLFVBQ0E7QUFBQSxVQUNBLElBQUksUUFBUSxLQUFLLENBQUM7QUFBQSxVQUNsQixPQUFPO0FBQUEsVUFDUCxNQUFNLEVBQUUsTUFBTSxRQUFRLE1BQU0sTUFBTTtBQUFBLFFBQ3BDO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBQ0EsUUFBTSxNQUFNLEtBQUssSUFBSTtBQUNyQixTQUFPO0FBQUEsSUFDTCxTQUFTO0FBQUEsTUFDUDtBQUFBLE1BQ0EsSUFBSTtBQUFBLE1BQ0osV0FBVztBQUFBLE1BQ1gsV0FBVztBQUFBLE1BQ1gsYUFBYTtBQUFBLE1BQ2IsZUFBZTtBQUFBLE1BQ2YsT0FBTztBQUFBLE1BQ1AsTUFBTSxNQUFNLFFBQVE7QUFBQSxJQUN0QjtBQUFBLElBQ0EsT0FBTyxNQUFNLE1BQU0sSUFBSSxDQUFDLE1BQU0sV0FBVztBQUFBLE1BQ3ZDO0FBQUEsTUFDQTtBQUFBLE1BQ0EsSUFBSSxRQUFRLEtBQUssQ0FBQztBQUFBLE1BQ2xCO0FBQUEsTUFDQTtBQUFBLElBQ0YsRUFBRTtBQUFBLEVBQ0o7QUFDRjs7O0FGK1FBLElBQU0sV0FBVyxNQUFNO0FBQ3JCLE1BQUk7QUFDRixXQUFPLFFBQVEsdUJBQXVCLENBQUM7QUFBQSxFQUN6QyxRQUFRO0FBQ04sV0FBTztBQUFBLEVBQ1Q7QUFDRjtBQUVPLElBQU0sUUFBUSxDQUtuQixZQUNHO0FBQ0gsUUFBTSxjQUFjLFFBQVEsSUFBSTtBQUNoQyxNQUFJLENBQUMsYUFBYTtBQUNoQixVQUFNLElBQUk7QUFBQSxNQUNSO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLG9CQUNKLFFBQVEsWUFDTixTQUFTLElBQ1AsRUFBRSxNQUFNLFNBQVMsSUFDakIsRUFBRSxNQUFNLFFBQVE7QUFDdEIsUUFBTSxnQkFBK0I7QUFBQSxJQUNuQyxHQUFHO0FBQUEsSUFDSCxNQUFNLFFBQVEsUUFBUSxrQkFBa0I7QUFBQSxFQUMxQztBQU1BLE1BQUksV0FBZ0M7QUFDcEMsUUFBTSxxQkFBcUIsTUFBb0I7QUFDN0MsUUFBSSxDQUFDLFVBQVU7QUFDYixpQkFBVyxXQUFXO0FBQUEsUUFDcEIsUUFBUTtBQUFBLFFBQ1IsS0FBSyxTQUFTO0FBQUEsTUFDaEIsQ0FBQztBQUFBLElBQ0g7QUFDQSxXQUFPO0FBQUEsRUFDVDtBQU1BLE1BQUkseUJBQTBEO0FBQzlELFFBQU0scUJBQXFCLENBQUMsU0FBMkM7QUFDckUsUUFBSSxjQUFjLFNBQVMsU0FBUztBQUNsQyxhQUFPLFFBQVE7QUFBQSxRQUNiLElBQUksTUFBTSxtREFBbUQ7QUFBQSxNQUMvRDtBQUFBLElBQ0Y7QUFDQSxRQUFJLENBQUMsd0JBQXdCO0FBQzNCLGdDQUEwQixZQUFZO0FBQ3BDLGNBQU0sRUFBRSxLQUFLLElBQUksTUFBTSxPQUFPLFdBQVc7QUFDekMsY0FBTSxFQUFFLHlCQUF5QixJQUFJLE1BQU0sT0FDekMsa0NBQ0Y7QUFDQSxjQUFNLFdBQVcsY0FBYyxRQUFRO0FBQ3ZDLGNBQU0sV0FBVyxLQUFLLFVBQVUsTUFBTSxxQkFBcUI7QUFDM0QsZUFBTyx5QkFBeUIsUUFBUTtBQUFBLE1BQzFDLEdBQUc7QUFBQSxJQUNMO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFHQSxRQUFNLHFCQUFxQixRQUFRO0FBQ25DLFFBQU0sZUFDSixzQkFBc0IsT0FBTyx1QkFBdUIsV0FDaEQsbUJBQW1CLFFBQ25CO0FBQ04sUUFBTSxtQkFDSixzQkFBc0IsT0FBTyx1QkFBdUIsV0FDaEQsbUJBQW1CLFlBQ25CO0FBRU4sUUFBTSxVQUFVLE9BQ2QsV0FDQSxTQU1HO0FBQ0gsVUFBTSxpQkFBaUIsTUFBTSxtQkFBbUIsRUFBRSxRQUFRLElBQUksU0FBUztBQU12RSxVQUFNLGdCQUNKLE1BQU0sU0FBUyxlQUNYO0FBQUEsTUFDRSxLQUFLLEdBQUcsYUFBYSxHQUFHLElBQUksS0FBSyxNQUFNLEdBQUc7QUFBQSxNQUMxQyxLQUFLLE9BQU8sUUFBUTtBQUNsQixjQUFNLGFBQWEsSUFBSSxHQUFHO0FBQzFCLGNBQU0sS0FBSyxPQUFPLElBQUksR0FBRztBQUFBLE1BQzNCO0FBQUEsSUFDRixJQUNDLE1BQU0sU0FBUztBQUN0QixVQUFNLG9CQUNKLE1BQU0sYUFBYSxtQkFDZixPQUFPLFFBQVE7QUFDYixZQUFNLGlCQUFpQixHQUFHO0FBQzFCLFlBQU0sS0FBSyxZQUFZLEdBQUc7QUFBQSxJQUM1QixJQUNDLE1BQU0sYUFBYTtBQUcxQixVQUFNLGdCQUFnQixNQUFxQjtBQUN6QyxVQUFJLE1BQU0sUUFBUTtBQUNoQixlQUFPLEtBQUs7QUFBQSxNQUNkO0FBQ0EsVUFBSSxPQUFPLFFBQVEsWUFBWSxZQUFZLENBQUMsUUFBUSxTQUFTO0FBQzNELGVBQU8sU0FBUyxJQUFJLEVBQUUsTUFBTSxTQUFTLElBQUksRUFBRSxNQUFNLFFBQVE7QUFBQSxNQUMzRDtBQUNBLFlBQU0sRUFBRSxPQUFPLElBQUksV0FBVyxJQUFJLEdBQUcsS0FBSyxJQUFJLFFBQVE7QUFDdEQsYUFBTztBQUFBLElBQ1Q7QUFFQSxRQUFJLDBCQUEwQixPQUFPO0FBQ25DLFVBQUksRUFBRSwwQkFBMEIsdUJBQXVCO0FBQ3JELGNBQU07QUFBQSxNQUNSO0FBQ0EsWUFBTSxnQkFBZ0IsTUFBTSxtQkFBbUIsRUFBRSxRQUFRLElBQUk7QUFBQSxRQUMzRCxJQUFJO0FBQUEsUUFDSixNQUFNLE1BQU0sUUFBUTtBQUFBLFFBQ3BCLGlCQUFpQjtBQUFBLFFBQ2pCLGlCQUFpQjtBQUFBLFFBQ2pCLFdBQVcsS0FBSyxJQUFJO0FBQUEsUUFDcEIsZ0JBQWdCLEtBQUssSUFBSTtBQUFBLFFBQ3pCLFFBQVEsY0FBYztBQUFBLE1BQ3hCLENBQUM7QUFDRCxVQUFJLHlCQUF5QixPQUFPO0FBQ2xDLGNBQU07QUFBQSxNQUNSO0FBQ0EsYUFBTyxNQUFNLFdBQWtCO0FBQUEsUUFDN0I7QUFBQSxRQUNBO0FBQUEsUUFDQSxTQUFTLG1CQUFtQjtBQUFBLFFBQzVCLEtBQUssU0FBUztBQUFBLFFBQ2QsT0FBTztBQUFBLFFBQ1AsV0FBVztBQUFBLE1BQ2IsQ0FBQztBQUFBLElBQ0g7QUFFQSxVQUFNLFlBQVksTUFBTSxVQUFVLGVBQWU7QUFDakQsUUFBSSxDQUFDLE1BQU0sZUFBZSxRQUFRLFNBQVMsR0FBRztBQUk1QyxjQUFRLEtBQUssMENBQTBDO0FBQUEsSUFDekQ7QUFFQSxXQUFPLE1BQU0sV0FBa0I7QUFBQSxNQUM3QjtBQUFBLE1BQ0EsZUFBZTtBQUFBLE1BQ2YsU0FBUyxtQkFBbUI7QUFBQSxNQUM1QixLQUFLLFNBQVM7QUFBQSxNQUNkLE9BQU87QUFBQSxNQUNQLFdBQVc7QUFBQSxJQUNiLENBQUM7QUFBQSxFQUNIO0FBRUEsUUFBTSxXQUFXO0FBQUEsSUFDZixTQUFTLE9BQ1AsV0FDQSxtQkFDRztBQUNILFVBQUksVUFBVSxNQUFNLG1CQUFtQixFQUFFLFFBQVEsSUFBSSxTQUFTO0FBSzlELFlBQU0sZUFBZSxnQkFBZ0IsV0FBVyxRQUFRO0FBQ3hELFlBQU0sWUFDSixPQUFPLGlCQUFpQixXQUNwQjtBQUFBO0FBQUEsUUFFQSxtQkFBbUIsUUFDakIsV0FBV0MsTUFBSyxDQUFDLEtBQ2hCLFFBQVEsYUFBYSxXQUFXQSxNQUFLLENBQUM7QUFBQTtBQUkvQyxZQUFNLG9CQUFvQixnQkFBZ0IsV0FBVztBQUNyRCxVQUFJO0FBQ0osVUFBSTtBQUNKLFlBQU0sZ0JBQ0osT0FBTyxpQkFBaUIsWUFBWSxDQUFDLGVBQ2pDLFVBQ0MsTUFBTTtBQUNMLGNBQU07QUFBQSxVQUNKLE9BQU87QUFBQSxVQUNQLFdBQVc7QUFBQSxVQUNYLEdBQUc7QUFBQSxRQUNMLElBQUk7QUFJSixZQUFJLG1CQUFtQjtBQUNyQix5QkFBZTtBQUNmLDZCQUFtQjtBQUFBLFFBQ3JCO0FBQ0EsZUFBTztBQUFBLE1BQ1QsR0FBRztBQUNULFlBQU0saUJBQWlCO0FBQUEsUUFDckI7QUFBQSxRQUNBLGdCQUNJO0FBQUEsVUFDRSxRQUFRO0FBQUEsVUFDUixPQUFPO0FBQUEsVUFDUCxXQUFXO0FBQUEsUUFDYixJQUNBO0FBQUEsTUFDTjtBQUVBLFlBQU0sa0JBQWtCLG1CQUFtQixRQUFRLE9BQU87QUFDMUQsWUFBTSxZQUNKLGdCQUFnQixhQUNoQixpQkFBaUIsYUFDakIsUUFBUSxhQUNSO0FBRUYsVUFBSSxtQkFBbUIsT0FBTztBQUM1QixZQUFJLG1CQUFtQixzQkFBc0I7QUFDM0MsZ0JBQU0sUUFBUSxnQkFBZ0IsU0FBUyxRQUFRLFNBQVM7QUFDeEQsY0FBSSxDQUFDLE9BQU87QUFDVixrQkFBTSxJQUFJLGFBQWE7QUFBQSxjQUNyQixJQUFJO0FBQUEsY0FDSixRQUFRO0FBQUEsWUFDVixDQUFDO0FBQUEsVUFDSDtBQUNBLG9CQUFVLE1BQU0sbUJBQW1CLEVBQUUsUUFBUSxJQUFJO0FBQUEsWUFDL0MsSUFBSTtBQUFBLFlBQ0osV0FBVyxLQUFLLElBQUk7QUFBQSxZQUNwQixXQUFXLEtBQUssSUFBSTtBQUFBLFlBQ3BCLGVBQWU7QUFBQSxZQUNmLE9BQU87QUFBQSxZQUNQLE1BQU0sZ0JBQWdCLFFBQVE7QUFBQSxZQUM5QixRQUFRLGdCQUFnQixVQUFVLFFBQVEsVUFBVTtBQUFBLFlBQ3BEO0FBQUEsWUFDQTtBQUFBLFlBQ0EsV0FBVyxZQUFZLG9CQUFvQixTQUFTLElBQUk7QUFBQSxZQUN4RCxXQUFXO0FBQUEsWUFDWCxhQUNFLGdCQUFnQixlQUFlLFFBQVEsZUFBZTtBQUFBLFlBQ3hELFlBQ0UsUUFBUSxjQUFjLGdCQUFnQixhQUNsQyxFQUFFLEdBQUcsUUFBUSxZQUFZLEdBQUcsZ0JBQWdCLFdBQVcsSUFDdkQ7QUFBQSxVQUNSLENBQUM7QUFBQSxRQUNILE9BQU87QUFDTCxnQkFBTTtBQUFBLFFBQ1I7QUFBQSxNQUNGLE9BQU87QUFJTCxjQUFNLFVBQW1CO0FBQUEsVUFDdkIsR0FBRztBQUFBLFVBQ0gsR0FBRztBQUFBLFVBQ0g7QUFBQSxVQUNBLFdBQVcsWUFBWSxvQkFBb0IsU0FBUyxJQUFJO0FBQUEsUUFDMUQ7QUFDQSxZQUFJLENBQUMsTUFBTSxTQUFTLE9BQU8sR0FBRztBQUM1QixvQkFBVSxNQUFNLG1CQUFtQixFQUFFLFFBQVEsSUFBSSxPQUFPO0FBQ3hELGNBQUksbUJBQW1CLE9BQU87QUFDNUIsa0JBQU07QUFBQSxVQUNSO0FBQUEsUUFDRjtBQUFBLE1BQ0Y7QUFNQSxZQUFNLDBCQUEwQixZQUFZO0FBQzFDLGNBQU0saUJBQ0osTUFBTSxtQkFBbUIsRUFBRSxRQUFRLEtBQUssU0FBUztBQUNuRCxZQUFJLDBCQUEwQixPQUFPO0FBQ25DLGlCQUFPO0FBQUEsUUFDVDtBQUVBLGNBQU0sTUFBTSxLQUFLLElBQUk7QUFDckIsY0FBTSwyQkFBMkIsZUFBZSxNQUFNO0FBQUEsVUFDcEQsQ0FBQyxNQUNDLEVBQUUsU0FBUyxlQUNYLEVBQUUsZ0JBQWdCLFFBQ2xCLEVBQUUsa0JBQWtCO0FBQUEsUUFDeEI7QUFFQSxjQUFNLFVBQVUsTUFBTSxRQUFRO0FBQUEsVUFDNUIseUJBQXlCO0FBQUEsWUFBSSxDQUFDLE1BQzVCLG1CQUFtQixFQUFFLFFBQVEsSUFBSSxFQUFFLEdBQUcsR0FBRyxlQUFlLElBQUksQ0FBQztBQUFBLFVBQy9EO0FBQUEsUUFDRjtBQUVBLG1CQUFXLFVBQVUsU0FBUztBQUM1QixjQUFJLGtCQUFrQixPQUFPO0FBQzNCLG1CQUFPO0FBQUEsVUFDVDtBQUFBLFFBQ0Y7QUFHQSxtQkFBVyxLQUFLLDBCQUEwQjtBQUN4QyxnQkFBTSxjQUFjLE1BQU0sbUJBQW1CLEVBQUUsS0FBSztBQUFBLFlBQ2xELEVBQUU7QUFBQSxVQUNKO0FBQ0EsY0FBSSx1QkFBdUIsT0FBTztBQUNoQztBQUFBLFVBQ0Y7QUFDQSxxQkFBVyxLQUFLLFlBQVksT0FBTztBQUNqQyxnQkFDRSxFQUFFLFFBQ0YsV0FBVyxFQUFFLFFBQ1osRUFBRSxLQUEyQixVQUFVLHdCQUN4QyxjQUFjLEVBQUUsTUFDaEI7QUFDQSxvQkFBTSxXQUFZLEVBQUUsS0FDakI7QUFDSCxrQkFBSSxVQUFVLElBQUk7QUFDaEIsc0JBQU0sbUJBQW1CLEVBQUUsS0FBSyxJQUFJO0FBQUEsa0JBQ2xDLEdBQUc7QUFBQSxrQkFDSCxNQUFNO0FBQUEsb0JBQ0osR0FBRyxFQUFFO0FBQUEsb0JBQ0wsT0FBTztBQUFBLG9CQUNQLFVBQVU7QUFBQSxzQkFDUixHQUFHO0FBQUEsc0JBQ0gsVUFBVTtBQUFBLHNCQUNWLFFBQVE7QUFBQSxvQkFDVjtBQUFBLGtCQUNGO0FBQUEsZ0JBQ0YsQ0FBUztBQUNULHNCQUFNLGFBQWEsT0FBTyxTQUFTLElBQUk7QUFBQSxrQkFDckMsVUFBVTtBQUFBLGtCQUNWLFFBQVE7QUFBQSxnQkFDVixDQUFDO0FBQUEsY0FDSDtBQUFBLFlBQ0Y7QUFBQSxVQUNGO0FBQUEsUUFDRjtBQUVBLGVBQU87QUFBQSxNQUNUO0FBRUEsYUFBTztBQUFBLFFBQ0wsTUFBTSxPQUFPO0FBQUEsVUFDWDtBQUFBLFVBQ0E7QUFBQSxVQUNBO0FBQUEsUUFDRixNQUlNO0FBQ0osY0FBSSxzQkFBc0I7QUFDeEIsa0JBQU0sa0JBQWtCLE1BQU0sd0JBQXdCO0FBQ3RELGdCQUFJLDJCQUEyQixPQUFPO0FBQ3BDLHFCQUFPO0FBQUEsWUFDVDtBQUFBLFVBQ0Y7QUFDQSxnQkFBTSxjQUF5QixDQUFDO0FBQ2hDLGdCQUFNLFdBQW1CLENBQUM7QUFDMUIsY0FBSSxNQUFNLFFBQVEsS0FBSyxHQUFHO0FBQ3hCLHVCQUFXLEtBQUssT0FBTztBQUNyQixvQkFBTSxFQUFFLFNBQVMsTUFBTSxJQUFJLGtCQUFrQjtBQUFBLGdCQUMzQztBQUFBLGdCQUNBLE9BQU87QUFBQSxnQkFDUCxhQUFhO0FBQUEsY0FDZixDQUFDO0FBRUQsMEJBQVksS0FBSyxPQUFPO0FBQ3hCLHVCQUFTLEtBQUssR0FBRyxLQUFLO0FBQUEsWUFDeEI7QUFBQSxVQUNGLE9BQU87QUFDTCxrQkFBTSxFQUFFLFNBQVMsTUFBTSxJQUFJLGtCQUFrQjtBQUFBLGNBQzNDO0FBQUEsY0FDQTtBQUFBLGNBQ0EsYUFBYTtBQUFBLFlBQ2YsQ0FBQztBQUNELHdCQUFZLEtBQUssT0FBTztBQUN4QixxQkFBUyxLQUFLLEdBQUcsS0FBSztBQUFBLFVBQ3hCO0FBSUEsZ0JBQU0scUJBQXFCLFdBQVdBLE1BQUssQ0FBQztBQUM1QyxnQkFBTSxXQUFXLEtBQUssSUFBSTtBQUMxQixnQkFBTSw0QkFBNEIsV0FBVyxZQUFZO0FBQ3pELHNCQUFZLEtBQUs7QUFBQSxZQUNmLElBQUk7QUFBQSxZQUNKO0FBQUEsWUFDQSxNQUFNO0FBQUEsWUFDTixXQUFXO0FBQUEsWUFDWCxXQUFXO0FBQUEsWUFDWCxhQUFhO0FBQUEsWUFDYixlQUFlO0FBQUEsWUFDZixPQUFPO0FBQUEsVUFDVCxDQUFDO0FBRUQsZ0JBQU0sV0FBVyxNQUFNLG1CQUFtQixFQUFFLFFBQVEsSUFBSSxTQUFTO0FBQ2pFLGNBQUksb0JBQW9CLE9BQU87QUFDN0Isa0JBQU07QUFBQSxVQUNSO0FBRUEsZ0JBQU0sYUFBeUI7QUFBQSxZQUM3QjtBQUFBLFlBQ0E7QUFBQSxZQUNBLEtBQUssU0FBUztBQUFBLFVBQ2hCO0FBQ0EsZ0JBQU0sUUFBMkI7QUFBQSxZQUMvQjtBQUFBLFlBQ0EsV0FBVyxPQUFPLFdBQVc7QUFBQSxZQUM3QixXQUFXO0FBQUEsWUFDWCxTQUFTLFdBQVcsQ0FBQztBQUFBLFVBQ3ZCO0FBRUEsaUJBQU8sTUFBYSxnQkFBUztBQUFBLFlBQzNCLEtBQUssWUFBWTtBQUNmLG9CQUFNLElBQUk7QUFBQSxnQkFDUixNQUFNLGVBQWU7QUFDbkIsd0JBQU0sUUFBUTtBQUFBLG9CQUNaLFlBQVk7QUFBQSxzQkFBSSxDQUFDLEdBQUcsTUFDbEIsbUJBQW1CLEVBQUUsUUFBUSxJQUFJO0FBQUEsd0JBQy9CLEdBQUc7QUFBQSx3QkFDSCxXQUFXLFdBQVc7QUFBQSxzQkFDeEIsQ0FBQztBQUFBLG9CQUNIO0FBQUEsa0JBQ0Y7QUFBQSxnQkFDRjtBQUFBLGdCQUNBLE1BQU0sWUFBWTtBQUNoQix3QkFBTSxRQUFRO0FBQUEsb0JBQ1osU0FBUyxJQUFJLG1CQUFtQixFQUFFLEtBQUssR0FBRztBQUFBLGtCQUM1QztBQUFBLGdCQUNGO0FBQUEsZ0JBQ0EsTUFBTSw2QkFBNkI7QUFDakMsc0JBQUksU0FBUyxPQUFPO0FBQ2xCLDBCQUFNLGlCQUFpQixPQUFPLFdBQVcsS0FBSztBQUFBLGtCQUNoRCxPQUFPO0FBQ0wsMEJBQU0sY0FBYyxNQUFNLE1BQU0sZUFBZTtBQUFBLHNCQUM3QyxFQUFFLE9BQU8sWUFBWSxNQUFNO0FBQUEsb0JBQzdCLENBQUM7QUFDRCw2QkFBUyxRQUFRLFlBQVk7QUFBQSxrQkFDL0I7QUFBQSxnQkFDRjtBQUFBLGdCQUNBLE1BQU0sZ0JBQWdCO0FBQ3BCLHdCQUFNLEtBQUssRUFBRTtBQUNiLHdCQUFNLFNBQVMsTUFBTSxtQkFBbUIsRUFBRSxRQUFRLElBQUk7QUFBQSxvQkFDcEQsR0FBRztBQUFBLG9CQUNILFdBQVcsS0FBSyxJQUFJO0FBQUEsb0JBQ3BCLGVBQWU7QUFBQSxvQkFDZixXQUFXLE1BQU07QUFBQSxrQkFDbkIsQ0FBQztBQUNELHNCQUFJLGtCQUFrQixPQUFPO0FBQzNCLDBCQUFNO0FBQUEsa0JBQ1I7QUFDQSx5QkFBTztBQUFBLGdCQUNUO0FBQUEsY0FDRixDQUFDO0FBQUEsWUFDSDtBQUFBLFlBQ0EsT0FBTyxDQUFDLE1BQU07QUFDWixrQkFBSSxhQUFhLE9BQU87QUFDdEIsc0JBQU07QUFBQSxjQUNSO0FBQ0EscUJBQU8sSUFBSSxhQUFhO0FBQUEsZ0JBQ3RCLElBQUk7QUFBQSxnQkFDSixRQUFRLG1CQUFtQixPQUFPLENBQUMsQ0FBQztBQUFBLGdCQUNwQyxPQUFPO0FBQUEsY0FDVCxDQUFDO0FBQUEsWUFDSDtBQUFBLFVBQ0YsQ0FBQztBQUFBLFFBQ0g7QUFBQSxRQUVBLFFBQVEsT0FBTyxTQUFrQztBQUMvQyxnQkFBTUMsV0FBVSxNQUFNLG1CQUFtQixFQUFFLFFBQVEsSUFBSSxTQUFTO0FBQ2hFLGNBQUlBLG9CQUFtQixPQUFPO0FBQzVCLG1CQUFPQTtBQUFBLFVBQ1Q7QUFDQSxnQkFBTSxZQUFZLE1BQU0sYUFBYUEsU0FBUTtBQUM3QyxjQUFJLENBQUMsV0FBVztBQUNkLG1CQUFPLElBQUksYUFBYTtBQUFBLGNBQ3RCLElBQUk7QUFBQSxjQUNKLFFBQVE7QUFBQSxZQUNWLENBQUM7QUFBQSxVQUNIO0FBQ0EsY0FBSSxDQUFDQSxTQUFRLE9BQU87QUFDbEIsbUJBQU8sSUFBSSxhQUFhO0FBQUEsY0FDdEIsSUFBSTtBQUFBLGNBQ0osUUFBUTtBQUFBLFlBQ1YsQ0FBQztBQUFBLFVBQ0g7QUFDQSxnQkFBTSxNQUFNLE9BQU9BLFNBQVEsS0FBSztBQUNoQyxpQkFBTyxJQUFJLFlBQTRCLEVBQUUsV0FBVyxVQUFVLENBQUM7QUFBQSxRQUNqRTtBQUFBLFFBRUEsSUFBSSxZQUFZO0FBQ2QsZ0JBQU0sQ0FBQyxnQkFBZ0IsV0FBVyxJQUFJLE1BQU0sUUFBUSxJQUFJO0FBQUEsWUFDdEQsbUJBQW1CLEVBQUUsUUFBUSxLQUFLLFNBQVM7QUFBQSxZQUMzQyxtQkFBbUIsRUFBRSxLQUFLLGNBQWMsU0FBUztBQUFBLFVBQ25ELENBQUM7QUFFRCxjQUFJLDBCQUEwQixPQUFPO0FBQ25DLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGNBQUksdUJBQXVCLE9BQU87QUFDaEMsbUJBQU87QUFBQSxVQUNUO0FBRUEsZ0JBQU0sV0FBVyxtQkFBbUI7QUFBQSxZQUNsQyxVQUFVLGVBQWU7QUFBQSxZQUN6QixPQUFPLFlBQVk7QUFBQSxVQUNyQixDQUFDO0FBRUQsZ0JBQU0sdUJBQXVCLGVBQWUsTUFDekMsT0FBTyxDQUFDLE1BQU0sRUFBRSxTQUFTLGVBQWUsRUFBRSxjQUFjLElBQUksRUFDNUQsR0FBRyxFQUFFO0FBQ1IsZ0JBQU0sY0FDSix3QkFDQSxxQkFBcUIsZ0JBQWdCLFFBQ3JDLHFCQUFxQixrQkFBa0I7QUFDekMsZ0JBQU0scUJBQXFCLGNBQ3ZCLHFCQUFxQixLQUNyQjtBQUVKLGdCQUFNLFFBQVEsb0JBQW9CLGVBQWUsS0FBSztBQU90RCxpQkFBTztBQUFBLFlBQ0w7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFVBQ0Y7QUFBQSxRQUNGO0FBQUEsUUFDQSxLQUFLO0FBQUEsVUFDSCxNQUFNLFlBQVk7QUFDaEIsa0JBQU1BLFdBQVUsTUFBTSxtQkFBbUIsRUFBRSxRQUFRLElBQUksU0FBUztBQUNoRSxnQkFBSUEsb0JBQW1CLE9BQU87QUFDNUIscUJBQU9BO0FBQUEsWUFDVDtBQUNBLG1CQUFRQSxTQUFRLFFBQVEsQ0FBQztBQUFBLFVBQzNCO0FBQUEsVUFDQSxLQUFLLE9BQ0gsUUFDMEM7QUFDMUMsa0JBQU1BLFdBQVUsTUFBTSxtQkFBbUIsRUFBRSxRQUFRLElBQUksU0FBUztBQUNoRSxnQkFBSUEsb0JBQW1CLE9BQU87QUFDNUIscUJBQU9BO0FBQUEsWUFDVDtBQUNBLG1CQUFPQSxTQUFRLE9BQU8sR0FBRztBQUFBLFVBQzNCO0FBQUEsVUFDQSxLQUFLLE9BQ0gsS0FDQSxVQUMrQjtBQUMvQixrQkFBTSxTQUFTLE1BQU0sbUJBQW1CLEVBQUUsUUFBUSxJQUFJLElBQUk7QUFBQSxjQUN4RDtBQUFBLGNBQ0EsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLE1BQU07QUFBQSxZQUN2QixDQUFDO0FBQ0QsZ0JBQUksa0JBQWtCLE9BQU87QUFDM0IscUJBQU87QUFBQSxZQUNUO0FBQ0EsbUJBQU87QUFBQSxVQUNUO0FBQUEsVUFDQSxTQUFTLE9BQU8sU0FBcUQ7QUFDbkUsa0JBQU0sU0FBUyxNQUFNLG1CQUFtQixFQUFFLFFBQVEsSUFBSSxJQUFJO0FBQUEsY0FDeEQ7QUFBQSxjQUNBO0FBQUEsWUFDRixDQUFDO0FBQ0QsZ0JBQUksa0JBQWtCLE9BQU87QUFDM0IscUJBQU87QUFBQSxZQUNUO0FBQ0EsbUJBQU87QUFBQSxVQUNUO0FBQUEsUUFDRjtBQUFBLFFBQ0EsU0FBUyxNQUFNO0FBQUEsUUFFZixXQUFXO0FBQUEsUUFFWCxpQkFBaUIsT0FBTztBQUFBLFVBQ3RCO0FBQUEsVUFDQTtBQUFBLFVBQ0E7QUFBQSxRQUNGLE1BSWtDO0FBQ2hDLGdCQUFNLGNBQ0osTUFBTSxtQkFBbUIsRUFBRSxLQUFLLGNBQWMsU0FBUztBQUN6RCxjQUFJLHVCQUF1QixPQUFPO0FBQ2hDLG1CQUFPO0FBQUEsVUFDVDtBQUVBLGdCQUFNLGFBQWEsWUFBWSxNQUFNO0FBQUEsWUFDbkMsQ0FBQyxNQUNDLEVBQUUsUUFDRixjQUFjLEVBQUUsUUFDZixFQUFFLEtBQXVDLFVBQVUsT0FDbEQ7QUFBQSxVQUNOO0FBQ0EsY0FBSSxDQUFDLFlBQVk7QUFDZixtQkFBTyxJQUFJLGFBQWE7QUFBQSxjQUN0QixJQUFJO0FBQUEsY0FDSixRQUFRLFlBQVksVUFBVTtBQUFBLFlBQ2hDLENBQUM7QUFBQSxVQUNIO0FBRUEsZ0JBQU0sY0FBYztBQUFBLFlBQ2xCLEdBQUc7QUFBQSxZQUNILE1BQU07QUFBQSxjQUNKLEdBQUcsV0FBVztBQUFBLGNBQ2QsT0FBTztBQUFBLGNBQ1AsVUFBVSxFQUFFLElBQUksWUFBWSxVQUFVLE9BQU87QUFBQSxZQUMvQztBQUFBLFVBQ0Y7QUFDQSxnQkFBTSxZQUFZLE1BQU0sbUJBQW1CLEVBQUUsS0FBSztBQUFBLFlBQ2hEO0FBQUEsVUFDRjtBQUNBLGNBQUkscUJBQXFCLE9BQU87QUFDOUIsbUJBQU87QUFBQSxVQUNUO0FBS0EsY0FBSTtBQUNGLGtCQUFNLGFBQWEsT0FBTyxZQUFZLEVBQUUsVUFBVSxPQUFPLENBQUM7QUFBQSxVQUM1RCxRQUFRO0FBQUEsVUFFUjtBQUVBLGlCQUFPO0FBQUEsUUFDVDtBQUFBLFFBRUEsT0FBTyxZQUEyQztBQUNoRCxnQkFBTSxpQkFDSixNQUFNLG1CQUFtQixFQUFFLFFBQVEsS0FBSyxTQUFTO0FBQ25ELGNBQUksMEJBQTBCLE9BQU87QUFDbkMsbUJBQU87QUFBQSxVQUNUO0FBQ0EsaUJBQU8sb0JBQW9CLGVBQWUsS0FBSztBQUFBLFFBQ2pEO0FBQUEsUUFFQSxRQUFRLE9BQ04sa0JBQytCO0FBQy9CLGdCQUFNLFVBQVUsTUFBTSxtQkFBbUIsRUFBRSxRQUFRLElBQUksU0FBUztBQUNoRSxjQUFJLG1CQUFtQixPQUFPO0FBQzVCLG1CQUFPO0FBQUEsVUFDVDtBQUNBLGdCQUFNLFVBQW1CO0FBQUEsWUFDdkIsR0FBRztBQUFBLFlBQ0gsR0FBRztBQUFBLFlBQ0gsV0FBVyxLQUFLLElBQUk7QUFBQSxZQUNwQixXQUFXLGNBQWMsWUFDckIsb0JBQW9CLGNBQWMsU0FBUyxJQUMzQyxRQUFRO0FBQUEsVUFDZDtBQUNBLGNBQUksTUFBTSxTQUFTLE9BQU8sR0FBRztBQUMzQixtQkFBTztBQUFBLFVBQ1Q7QUFDQSxnQkFBTSxTQUFTLE1BQU0sbUJBQW1CLEVBQUUsUUFBUSxJQUFJLE9BQU87QUFDN0QsY0FBSSxrQkFBa0IsT0FBTztBQUMzQixtQkFBTztBQUFBLFVBQ1Q7QUFDQSxpQkFBTztBQUFBLFFBQ1Q7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLElBQ0E7QUFBQSxJQUNBLElBQUksVUFBVTtBQUNaLGFBQU8sbUJBQW1CO0FBQUEsSUFDNUI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLElBU0EsU0FBUyxPQUNQLE9BQ0EsY0FDa0M7QUFDbEMsWUFBTSxZQUFZLGlCQUFpQjtBQUVuQyxVQUFJO0FBQ0osVUFBSTtBQUNKLFVBQUk7QUFFSixVQUFJLFdBQVc7QUFDYixjQUFNLFNBQVMsTUFBTSxRQUFRLElBQUksZ0JBQWdCO0FBQ2pELFlBQUksV0FBVyxhQUFhO0FBQzFCLGlCQUFPLFNBQVM7QUFBQSxZQUNkLEVBQUUsT0FBTyxFQUFFLE1BQU0sZ0JBQWdCLFNBQVMsaUJBQWlCLEVBQUU7QUFBQSxZQUM3RCxFQUFFLFFBQVEsSUFBSTtBQUFBLFVBQ2hCO0FBQUEsUUFDRjtBQUVBLFlBQUk7QUFDSixZQUFJO0FBQ0YsaUJBQU8sTUFBTSxNQUFNLEtBQUs7QUFBQSxRQUMxQixRQUFRO0FBQ04saUJBQU8sU0FBUztBQUFBLFlBQ2Q7QUFBQSxjQUNFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixTQUFTLG9CQUFvQjtBQUFBLFlBQ2pFO0FBQUEsWUFDQSxFQUFFLFFBQVEsSUFBSTtBQUFBLFVBQ2hCO0FBQUEsUUFDRjtBQUVBLGlCQUFTLEtBQUs7QUFDZCxpQkFBUyxLQUFLO0FBQ2QsZUFBTyxNQUFNLFFBQVEsSUFBSSxjQUFjLEtBQUs7QUFBQSxNQUM5QyxPQUFPO0FBQ0wsaUJBQVMsTUFBTTtBQUNmLGlCQUFTLE1BQU07QUFDZixlQUFPLE1BQU0sUUFBUTtBQUFBLE1BQ3ZCO0FBRUEsWUFBTSxrQkFBbUM7QUFBQSxRQUN2QyxPQUFPLFFBQVE7QUFBQSxRQUNmLE9BQU8sUUFBUTtBQUFBLFFBQ2YsZUFDRSxRQUFRO0FBQUEsUUFDVjtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQSxLQUFLLFNBQVM7QUFBQSxRQUNkO0FBQUEsTUFDRjtBQUVBLFlBQU0sU0FBUyxNQUFNLFNBQVMsUUFBUSxRQUFRLGlCQUFpQixJQUFJO0FBRW5FLFVBQUksQ0FBQyxXQUFXO0FBQ2QsZUFBTztBQUFBLE1BQ1Q7QUFFQSxZQUFNLFNBQVMsV0FBVyxTQUFVLE9BQU8sVUFBVSxNQUFPO0FBQzVELGFBQU8sU0FBUztBQUFBLFFBQ2QsV0FBVyxTQUFTLEVBQUUsT0FBTyxPQUFPLE1BQU0sSUFBSSxFQUFFLFFBQVEsT0FBTyxPQUFPO0FBQUEsUUFDdEUsRUFBRSxPQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0Y7QUFBQSxJQUVBLE9BQU8sRUFBRSxHQUFHLGNBQWMsR0FBRyxRQUFRLE1BQU07QUFBQSxJQUUzQyxLQUFNLE1BQU07QUFDVixZQUFNLElBQUk7QUFBQSxRQUNSO0FBQUEsTUFDRjtBQUFBLElBQ0Y7QUFBQSxFQUNGO0FBRUEsU0FBTztBQUNUOyIsCiAgIm5hbWVzIjogWyJ1bGlkIiwgIm5hbWUiLCAicmVzdWx0IiwgImhhbmRsZVN0b3JhZ2VScGMiLCAibm93IiwgInVsaWQiLCAic2Vzc2lvbiJdCn0K