@dbx-tools/appkit-mastra 0.9.95 → 0.9.105

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.
@@ -1,16 +1,10 @@
1
1
  /**
2
2
  * Mastra workspace factory for Databricks Apps.
3
3
  *
4
- * Builds a {@link Workspace} with Databricks Sandbox command execution, an
5
- * isolated `/tmp` scratch mount, and a {@link CompositeFilesystem} over the
6
- * named skill folders
7
- * resolved for that request. A skill folder maps a name to a location plus its
8
- * readable / writable policy: a Databricks path mounted through the OBO client
9
- * on {@link MASTRA_USER_KEY}, or any {@link WorkspaceFilesystem} a consuming
10
- * library already owns. {@link DEFAULT_SKILL_FOLDERS} supplies the Assistant
11
- * trees, and `skillFolders` merges over it - same name overrides, `false`
12
- * disables, a new name adds. Optional mount resolvers contribute further
13
- * filesystems and skill scan roots on top.
4
+ * Builds native Mastra workspace configuration from Databricks paths. Paths
5
+ * mount at the same path by default, `~` resolves to the current user's
6
+ * Databricks workspace home, and `/tmp[/subpath]` resolves to stable
7
+ * user-scoped storage under the host's ephemeral temp directory.
14
8
  *
15
9
  * Databricks mounts use `@dbx-tools/databricks` {@link DatabricksFileSystem}
16
10
  * wrapped by {@link filesystems}; inaccessible roots are skipped independently.
@@ -18,16 +12,19 @@
18
12
  * @module
19
13
  */
20
14
  import { createHash } from "node:crypto";
21
- import { ConfigurationError, createWorkspaceClient, getExecutionContext } from "@databricks/appkit";
22
- import { pluginRegistry } from "@dbx-tools/appkit";
15
+ import { tmpdir } from "node:os";
16
+ import { join } from "node:path";
17
+ import { ConfigurationError, createWorkspaceClient } from "@databricks/appkit";
18
+ import { appkit, pluginRegistry } from "@dbx-tools/appkit";
23
19
  import { filesCache as filesCachePlugin, } from "@dbx-tools/appkit/files-cache";
24
20
  import { DatabricksFileSystem, workspaceClient } from "@dbx-tools/databricks";
25
21
  import { LocalFileSystem } from "@dbx-tools/fs";
22
+ import { match } from "@dbx-tools/path";
26
23
  import { errorUtils, log, object, stringUtils, token } from "@dbx-tools/shared-core";
27
- import { fs as sharedFS, posixPath } from "@dbx-tools/shared-fs";
28
- import { WORKSPACE_TOOLS, Workspace, } from "@mastra/core/workspace";
24
+ import { fs as sharedFS, posixPath, MemoryFileSystem, } from "@dbx-tools/shared-fs";
25
+ import { Workspace, } from "@mastra/core/workspace";
29
26
  import { MASTRA_SCOPES_KEY, MASTRA_USER_EMAIL_KEY, MASTRA_USER_KEY, resolveUserKey, } from "./config.js";
30
- import { filesystems, MountedCompositeFilesystem, scratchFilesystem, } from "./filesystems.js";
27
+ import { filesystems, MountedCompositeFilesystem, } from "./filesystems.js";
31
28
  import { MontySandbox } from "./monty-sandbox.js";
32
29
  import { DatabricksSandbox } from "./sandbox.js";
33
30
  import { ORGANIZATION_ASSISTANT_PATH, personalWorkspacePath } from "./skill-paths.js";
@@ -35,87 +32,74 @@ import { ORGANIZATION_ASSISTANT_PATH, personalWorkspacePath } from "./skill-path
35
32
  /** OAuth scopes that gate Databricks workspace file mounts. */
36
33
  const WORKSPACE_FILE_SCOPES = ["workspace", "workspace.workspace", "all-apis"];
37
34
  const SCRATCH_MOUNT = "/tmp";
35
+ const CACHEABLE_FILESYSTEM_OPERATIONS = [
36
+ "exists",
37
+ "readFile",
38
+ "readdir",
39
+ "stat",
40
+ ];
38
41
  const logger = log.logger("mastra/workspaces");
42
+ let workspaceSourceSequence = 0;
43
+ const databricksWorkspaceOptions = new WeakMap();
39
44
  /* ------------------------------- defaults ------------------------------- */
40
45
  /**
41
- * The skill folders every workspace starts with.
42
- *
43
- * - `organization-skills` - `/Workspace/.assistant` with `skills`; write
44
- * attempts require approval and remain subject to Databricks permissions.
45
- * - `personal-skills` - the requesting user's `/Workspace/Users/<email>` root
46
- * with `.assistant/skills`, writable and skipped without an email.
46
+ * Default Databricks paths for shared and current-user Agent Skills.
47
47
  */
48
- export const DEFAULT_SKILL_FOLDERS = {
49
- "organization-skills": {
50
- description: "Organization skills shared with everyone in this Databricks workspace.",
51
- displayName: "Organization Skills",
48
+ export const DEFAULT_DATABRICKS_WORKSPACE_PATHS = [
49
+ {
52
50
  path: ORGANIZATION_ASSISTANT_PATH,
53
51
  readable: true,
54
52
  skills: ["skills"],
55
53
  writable: true,
56
54
  createRoot: false,
57
55
  },
58
- "personal-skills": {
59
- description: "Your Databricks workspace home directory for personal files and skills.",
60
- displayName: "Home",
61
- path: ({ requestContext }) => {
62
- const email = resolveScopedEmail(requestContext);
63
- return email ? personalWorkspacePath(email) : undefined;
64
- },
56
+ {
57
+ path: "~",
65
58
  readable: true,
66
59
  skills: [".assistant/skills"],
67
60
  writable: true,
68
61
  createRoot: false,
69
62
  },
70
- };
63
+ ];
71
64
  /**
72
65
  * Create a Mastra {@link Workspace} with per-request Databricks mounts.
73
66
  *
74
- * @example Default skill folders only
67
+ * @example Default Databricks paths
75
68
  * ```ts
76
- * createWorkspace()
69
+ * databricksWorkspace()
77
70
  * ```
78
71
  *
79
- * @example Override a default, drop another, and add a location of your own
72
+ * @example Use only explicit paths
80
73
  * ```ts
81
- * createWorkspace({
82
- * skillFolders: {
83
- * "organization-skills": {
84
- * path: "/Workspace/Shared/.assistant",
85
- * skills: ["skills"],
86
- * },
87
- * "personal-skills": false,
88
- * runbooks: { path: "/Workspace/Shared/runbooks/skills", writable: true },
89
- * volume: { filesystem: myVolumeFilesystem },
90
- * },
74
+ * databricksWorkspace({
75
+ * assistantPaths: false,
76
+ * paths: ["~/project", "/tmp/project", "/Volumes/main/default/data"],
91
77
  * })
92
78
  * ```
93
79
  *
94
- * @example Skill folders plus a custom mount resolver
80
+ * @example Build a standard Mastra workspace yourself
95
81
  * ```ts
96
- * createWorkspace({
97
- * mounts: [
98
- * async ({ requestContext }) => ({
99
- * mounts: { "/data": myFilesystem },
100
- * skillPaths: [],
101
- * }),
102
- * ],
82
+ * new Workspace({
83
+ * ...databricksWorkspaceConfig({ paths: ["~/project"] }),
84
+ * sandbox: mySandbox,
103
85
  * })
104
86
  * ```
105
87
  */
106
- export function createWorkspace(options = {}) {
88
+ export function databricksWorkspaceConfig(options = {}) {
107
89
  const { id, name } = resolveWorkspaceIdentity(options);
108
- const skillFolders = resolveSkillFolders(options);
109
- const folderNames = Object.keys(skillFolders);
90
+ const filesystemSourceKey = `${id}:${++workspaceSourceSequence}`;
91
+ const paths = resolveDatabricksWorkspacePaths(options);
92
+ const configuredPaths = paths.length;
110
93
  const extraSkillPaths = options.extraSkillPaths ?? [];
111
94
  const filesCache = pluginRegistry.instance(options.pluginContext, filesCachePlugin)?.exports();
112
- const retainFilesystemSource = filesCache !== undefined &&
113
- (options.mounts?.length ?? 0) === 0 &&
114
- Object.values(skillFolders).every((folder) => typeof folder.filesystem !== "function" &&
115
- !(typeof folder.path === "function" && folder.mount !== undefined));
116
- const resolvers = buildMountResolvers(skillFolders, [...(options.mounts ?? []), ...localSkillMountResolvers(extraSkillPaths)], filesCache);
95
+ const configuredCache = options.cache;
96
+ const mountFilesCache = configuredCache === false ? undefined : filesCache;
97
+ const retainFilesystemSource = mountFilesCache !== undefined &&
98
+ typeof configuredCache !== "function" &&
99
+ paths.every((path) => typeof path !== "function");
100
+ const resolvers = buildMountResolvers(paths, options.mounts, localSkillMountResolvers(extraSkillPaths), mountFilesCache, configuredCache);
117
101
  const resolveContribution = contributionResolver(resolvers);
118
- const resolveFilesystem = (context) => resolveWorkspaceFilesystem(resolveContribution, context, retainFilesystemSource ? filesCache : undefined);
102
+ const resolveFilesystem = (context) => resolveWorkspaceFilesystem(resolveContribution, context, retainFilesystemSource ? mountFilesCache : undefined, filesystemSourceKey);
119
103
  const skills = options.skills ??
120
104
  (async ({ requestContext }) => {
121
105
  const context = { requestContext };
@@ -123,22 +107,24 @@ export function createWorkspace(options = {}) {
123
107
  return resolveDistinctSkillPaths(await resolveFilesystem(context), contribution.skillPaths ?? []);
124
108
  });
125
109
  const checkSkillFileMtime = options.checkSkillFileMtime ?? false;
126
- const bm25 = options.bm25 !== false;
110
+ const bm25 = options.bm25 ?? true;
127
111
  const sandbox = resolveWorkspaceSandbox(options.sandbox, id, name);
128
112
  const tools = workspaceTools(options.tools);
129
113
  logger.debug("workspace:create", {
130
114
  id,
131
115
  name,
132
116
  resolverCount: resolvers.length,
133
- skillFolders: folderNames,
134
- customMountResolvers: options.mounts?.length ?? 0,
117
+ configuredPaths,
118
+ customMounts: Object.keys(options.mounts ?? {}).length,
135
119
  customSkillsResolver: Boolean(options.skills),
136
120
  checkSkillFileMtime,
137
121
  bm25,
138
122
  extraSkillPaths: extraSkillPaths.length,
139
123
  sandbox: sandbox ? sandboxName(options.sandbox) : "disabled",
140
124
  });
141
- const workspace = new Workspace({
125
+ const { assistantPaths: _assistantPaths, paths: _paths, mounts: _mounts, skills: _skills, cache: _cache, pluginContext: _pluginContext, sandbox: _sandbox, extraSkillPaths: _extraSkillPaths, ...workspaceOptions } = options;
126
+ return {
127
+ ...workspaceOptions,
142
128
  id,
143
129
  name,
144
130
  filesystem: resolveFilesystem,
@@ -156,64 +142,37 @@ export function createWorkspace(options = {}) {
156
142
  : {}),
157
143
  bm25,
158
144
  tools,
159
- });
145
+ };
146
+ }
147
+ /** Create a native Mastra {@link Workspace} from {@link databricksWorkspaceConfig}. */
148
+ export function databricksWorkspace(options = {}) {
149
+ const workspace = new Workspace(databricksWorkspaceConfig(options));
150
+ databricksWorkspaceOptions.set(workspace, options);
160
151
  return workspace;
161
152
  }
153
+ /** @internal Bind a caller-created Databricks workspace to its AppKit plugin context. */
154
+ export function bindDatabricksWorkspaceContext(workspace, pluginContext) {
155
+ const options = databricksWorkspaceOptions.get(workspace);
156
+ if (!options || options.pluginContext !== undefined || pluginContext === undefined) {
157
+ return workspace;
158
+ }
159
+ return databricksWorkspace({ ...options, pluginContext });
160
+ }
162
161
  /**
163
- * Merge the configured skill folders over {@link DEFAULT_SKILL_FOLDERS}.
164
- *
165
- * `assistantSkills: false` drops the defaults, and a `false` value removes one
166
- * entry by name.
162
+ * Resolve default and caller-provided Databricks paths in priority order.
167
163
  */
168
- export function resolveSkillFolders(options = {}) {
169
- const merged = options.assistantSkills === false ? {} : { ...DEFAULT_SKILL_FOLDERS };
170
- for (const [name, folder] of Object.entries(options.skillFolders ?? {})) {
171
- if (folder === false) {
172
- delete merged[name];
173
- }
174
- else {
175
- merged[name] = folder;
176
- }
177
- }
178
- return merged;
164
+ export function resolveDatabricksWorkspacePaths(options = {}) {
165
+ return [
166
+ ...(options.assistantPaths === false ? [] : DEFAULT_DATABRICKS_WORKSPACE_PATHS),
167
+ ...(options.paths ?? []),
168
+ ];
179
169
  }
180
170
  /* ---------------------------- private helpers ---------------------------- */
181
- /** Require approval unless a filesystem mutation stays inside a user-owned writable root. */
182
- function requireApprovalOutsideWritableRoots({ args, requestContext, }) {
183
- const inputPath = args.path;
184
- if (typeof inputPath !== "string" || !posixPath.isAbsolute(inputPath))
185
- return true;
186
- const normalized = posixPath.normalize(inputPath);
187
- if (!normalized.ok)
188
- return true;
189
- if (posixPath.isWithinRoot(SCRATCH_MOUNT, normalized.path))
190
- return false;
191
- const emailValue = requestContext[MASTRA_USER_EMAIL_KEY];
192
- const email = typeof emailValue === "string" ? stringUtils.trimToNull(emailValue) : undefined;
193
- if (!email)
194
- return true;
195
- return !posixPath.isWithinRoot(personalWorkspacePath(email), normalized.path);
196
- }
197
171
  function workspaceTools(configured) {
198
- const requireApproval = configured?.requireApproval === undefined
199
- ? { requireApproval: requireApprovalOutsideWritableRoots }
200
- : {};
201
- const defaults = {
202
- [WORKSPACE_TOOLS.FILESYSTEM.WRITE_FILE]: requireApproval,
203
- [WORKSPACE_TOOLS.FILESYSTEM.EDIT_FILE]: requireApproval,
204
- [WORKSPACE_TOOLS.FILESYSTEM.AST_EDIT]: requireApproval,
205
- [WORKSPACE_TOOLS.FILESYSTEM.DELETE]: requireApproval,
206
- [WORKSPACE_TOOLS.FILESYSTEM.MKDIR]: requireApproval,
207
- };
208
- const configuredTools = configured;
209
- const mergedTools = Object.fromEntries(Object.entries(defaults).map(([name, defaultConfig]) => [
210
- name,
211
- { ...defaultConfig, ...configuredTools?.[name] },
212
- ]));
213
172
  return {
214
- ...defaults,
173
+ enabled: true,
174
+ requireApproval: false,
215
175
  ...configured,
216
- ...mergedTools,
217
176
  };
218
177
  }
219
178
  function resolveWorkspaceSandbox(selection, workspaceId, workspaceName) {
@@ -314,32 +273,47 @@ function isWorkspaceRoot(root) {
314
273
  * Gates on workspace file scope (or development mode), then mounts every
315
274
  * folder whose location resolves for this request.
316
275
  */
317
- async function resolveSkillFolderMounts(skillFolders, context, filesCache) {
276
+ async function resolveSkillFolderMounts(paths, context, filesCache, cacheConfig) {
318
277
  const mounts = {};
319
278
  const skillPaths = [];
320
279
  const requestContext = context.requestContext;
321
- if (!requestContext || !shouldMountSkillFolders(requestContext)) {
322
- logger.debug("skill-folders:skipped", {
323
- reason: !requestContext ? "no-request-context" : "missing-workspace-scope",
324
- nodeEnv: process.env.NODE_ENV,
325
- scopes: requestContext?.get(MASTRA_SCOPES_KEY),
326
- });
327
- return { mounts, skillPaths };
328
- }
329
- const scoped = await resolveFilesCacheScope(context);
280
+ const canMountDatabricks = Boolean(requestContext && shouldMountSkillFolders(requestContext));
281
+ const scoped = canMountDatabricks ? await resolveFilesCacheScope(context) : undefined;
330
282
  const client = scoped?.client;
331
283
  const fileSystemCache = filesCache && scoped ? await filesCache.forScope(scoped.scope) : undefined;
332
- for (const [name, folder] of Object.entries(skillFolders)) {
333
- const resolved = await resolveSkillFolderFilesystem(name, folder, context, {
284
+ for (const [index, path] of paths.entries()) {
285
+ const configured = await resolveDatabricksWorkspacePath(path, context);
286
+ if (!configured)
287
+ continue;
288
+ if (posixPath.isWithinRoot(SCRATCH_MOUNT, configured.path)) {
289
+ const mount = configured.mount ?? configured.path;
290
+ mounts[mount] = userTempFilesystem(context, configured.path);
291
+ if (configured.readable !== false) {
292
+ skillPaths.push(...(configured.skills ?? []).map((path) => mountedSkillPath(mount, path)));
293
+ }
294
+ continue;
295
+ }
296
+ if (!canMountDatabricks) {
297
+ logger.debug("workspace-path:skipped", {
298
+ path: configured.path,
299
+ reason: !requestContext ? "no-request-context" : "missing-workspace-scope",
300
+ });
301
+ continue;
302
+ }
303
+ const resolved = await resolveSkillFolderFilesystem(configured, context, cacheConfig, {
334
304
  client,
335
305
  fileSystemCache,
336
306
  });
337
307
  if (!resolved)
338
308
  continue;
339
- const mount = folder.mount ?? resolved.root ?? `/${name}`;
309
+ const mount = configured.mount ?? resolved.root;
310
+ if (!mount) {
311
+ logger.debug("workspace-path:skipped", { index, reason: "missing-mount" });
312
+ continue;
313
+ }
340
314
  mounts[mount] = resolved.filesystem;
341
- if (folder.readable !== false) {
342
- skillPaths.push(...(folder.skills ?? ["."]).map((path) => mountedSkillPath(mount, path)));
315
+ if (configured.readable !== false) {
316
+ skillPaths.push(...(configured.skills ?? ["."]).map((path) => mountedSkillPath(mount, path)));
343
317
  }
344
318
  }
345
319
  logger.debug("skill-folders:mounted", {
@@ -351,45 +325,117 @@ async function resolveSkillFolderMounts(skillFolders, context, filesCache) {
351
325
  skillPaths,
352
326
  };
353
327
  }
328
+ async function resolveDatabricksWorkspacePath(value, context) {
329
+ const selected = typeof value === "function" ? await value(context) : value;
330
+ if (selected === false || selected === undefined)
331
+ return undefined;
332
+ const configured = typeof selected === "string" ? { path: selected } : selected;
333
+ const requestContext = requestContextValues(context.requestContext);
334
+ const resolvedPath = resolveHomePath(configured.path, requestContext);
335
+ if (!resolvedPath)
336
+ return undefined;
337
+ const resolvedMount = resolveHomePath(configured.mount, requestContext);
338
+ return {
339
+ ...configured,
340
+ path: resolvedPath,
341
+ ...(resolvedMount ? { mount: resolvedMount } : {}),
342
+ };
343
+ }
354
344
  /**
355
345
  * Resolve one skill folder to a Mastra filesystem, or `undefined` to skip it
356
346
  * for this request.
357
347
  */
358
- async function resolveSkillFolderFilesystem(name, folder, context, cache) {
359
- if (folder.filesystem !== undefined) {
360
- const filesystem = await resolveSkillFolderValue(folder.filesystem, context);
361
- return filesystem
362
- ? {
363
- filesystem,
364
- }
365
- : undefined;
366
- }
348
+ async function resolveSkillFolderFilesystem(folder, context, cacheConfig, cache) {
367
349
  // A path mount needs the request's OBO client to reach the workspace.
368
- if (folder.path === undefined || !cache.client) {
350
+ if (!cache.client) {
369
351
  logger.debug("skill-folder:skipped", {
370
- name,
371
- reason: folder.path === undefined ? "no-location" : "missing-obo-client",
352
+ path: folder.path,
353
+ reason: "missing-obo-client",
372
354
  });
373
355
  return undefined;
374
356
  }
375
- const root = stringUtils.trimToNull(await resolveSkillFolderValue(folder.path, context));
357
+ const root = stringUtils.trimToNull(folder.path);
376
358
  if (!root)
377
359
  return undefined;
378
360
  const writable = folder.writable ?? isWorkspaceRoot(root);
379
- const resolved = await databricksFilesystem(cache.client, root, !writable, folder.createRoot ?? folder.writable === true, cache.fileSystemCache, folder.readable === false ? [] : (folder.skills ?? ["."]), {
361
+ const cacheOptions = cache.fileSystemCache
362
+ ? await resolveFileCacheOptions(cacheConfig, context, root, folder.readable === false ? [] : (folder.skills ?? ["."]))
363
+ : undefined;
364
+ const resolved = await databricksFilesystem(cache.client, root, !writable, folder.createRoot ?? folder.writable === true, cache.fileSystemCache, cacheOptions, {
380
365
  ...(folder.description ? { description: folder.description } : {}),
381
366
  ...(folder.displayName ? { displayName: folder.displayName } : {}),
382
367
  });
383
368
  return resolved ? { ...resolved, root } : undefined;
384
369
  }
385
- /** Read a {@link SkillFolderValue}, calling it when it is a per-request resolver. */
386
- function resolveSkillFolderValue(value, context) {
387
- return typeof value === "function"
388
- ? value(context)
389
- : value;
370
+ async function resolveCacheConfig(value, context) {
371
+ return typeof value === "function" ? value(context) : value;
372
+ }
373
+ function requestContextValues(requestContext) {
374
+ return requestContext?.toJSON() ?? {};
375
+ }
376
+ function resolveHomePath(input, requestContext) {
377
+ const value = stringUtils.trimToNull(input);
378
+ if (!value || (value !== "~" && !value.startsWith("~/")))
379
+ return value ?? undefined;
380
+ const emailValue = requestContext[MASTRA_USER_EMAIL_KEY];
381
+ const email = typeof emailValue === "string" ? stringUtils.trimToNull(emailValue) : undefined;
382
+ if (!email)
383
+ return undefined;
384
+ const home = personalWorkspacePath(email);
385
+ return value === "~" ? home : `${home}/${value.slice(2)}`;
386
+ }
387
+ function toPolicyArray(value) {
388
+ if (value === undefined)
389
+ return [];
390
+ return Array.isArray(value) ? value : [value];
391
+ }
392
+ function cacheFilterMatches(policy, operation, path, requestContext, root) {
393
+ const operations = toPolicyArray(policy.operations ?? CACHEABLE_FILESYSTEM_OPERATIONS);
394
+ if (!operations.includes(operation))
395
+ return false;
396
+ if (policy.paths === undefined)
397
+ return true;
398
+ const inputs = [];
399
+ for (const input of toPolicyArray(policy.paths)) {
400
+ if (typeof input !== "string") {
401
+ inputs.push(input);
402
+ continue;
403
+ }
404
+ const expanded = resolveHomePath(input, requestContext);
405
+ if (!expanded)
406
+ continue;
407
+ inputs.push(!root || posixPath.isAbsolute(expanded) || expanded.startsWith("**")
408
+ ? expanded
409
+ : `${posixPath.normalizeRoot(root)}/${expanded.replace(/^\.\//, "")}`);
410
+ }
411
+ return inputs.length > 0 && match.toPathMatcher(...inputs)(path);
412
+ }
413
+ async function resolveFileCacheOptions(configured, context, root, skillPaths) {
414
+ const requestContext = requestContextValues(context.requestContext);
415
+ const resolved = await resolveCacheConfig(configured, context);
416
+ if (resolved === false)
417
+ return undefined;
418
+ if (resolved === undefined || resolved === true) {
419
+ const roots = skillPaths.map((path) => mountedSkillPath(root, path));
420
+ return {
421
+ operations: CACHEABLE_FILESYSTEM_OPERATIONS,
422
+ filter: (operation, path) => operation !== "readFile" ||
423
+ roots.some((skillRoot) => posixPath.isWithinRoot(skillRoot, path)),
424
+ };
425
+ }
426
+ const policies = toPolicyArray(resolved);
427
+ if (policies.length === 0)
428
+ return undefined;
429
+ const operations = [
430
+ ...new Set(policies.flatMap((policy) => toPolicyArray(policy.operations ?? CACHEABLE_FILESYSTEM_OPERATIONS))),
431
+ ];
432
+ return {
433
+ operations,
434
+ filter: (operation, path) => policies.some((policy) => cacheFilterMatches(policy, operation, path, requestContext, root)),
435
+ };
390
436
  }
391
437
  /**
392
- * Fill in `id` and `name` when either is omitted on {@link CreateWorkspaceOptions}.
438
+ * Fill in `id` and `name` when either is omitted on {@link DatabricksWorkspaceOptions}.
393
439
  * Slugifies `name` into `id`; tokenizes `id` into a display `name`.
394
440
  */
395
441
  function resolveWorkspaceIdentity(options) {
@@ -404,26 +450,40 @@ function resolveWorkspaceIdentity(options) {
404
450
  return { id, name };
405
451
  }
406
452
  /** Collect the skill-folder resolver and any caller-supplied ones. */
407
- function buildMountResolvers(skillFolders, mounts, filesCache) {
408
- const resolvers = [scratchMountResolver()];
409
- const folderCount = Object.keys(skillFolders).length;
410
- if (folderCount > 0) {
411
- resolvers.push((context) => resolveSkillFolderMounts(skillFolders, context, filesCache));
412
- }
413
- if (mounts?.length) {
414
- resolvers.push(...mounts);
453
+ function buildMountResolvers(paths, mounts, localMounts, filesCache, cacheConfig) {
454
+ const resolvers = [];
455
+ const pathCount = paths.length;
456
+ if (pathCount > 0) {
457
+ resolvers.push((context) => resolveSkillFolderMounts(paths, context, filesCache, cacheConfig));
415
458
  }
459
+ if (mounts && Object.keys(mounts).length > 0)
460
+ resolvers.push(() => ({ mounts }));
461
+ resolvers.push(...localMounts);
416
462
  logger.debug("mounts:resolvers", {
417
- skillFolderCount: folderCount,
418
- customResolverCount: mounts?.length ?? 0,
463
+ pathCount,
464
+ customMountCount: Object.keys(mounts ?? {}).length,
465
+ localMountCount: localMounts.length,
419
466
  totalResolverCount: resolvers.length,
420
467
  });
421
468
  return resolvers;
422
469
  }
423
- /** Contribute one isolated local scratch filesystem at `/tmp`. */
424
- function scratchMountResolver() {
425
- return () => ({
426
- mounts: { [SCRATCH_MOUNT]: scratchFilesystem() },
470
+ /** Stable user-scoped local storage under the host operating system's temp directory. */
471
+ function userTempFilesystem(context, workspacePath) {
472
+ const userKey = resolveUserKey(context.requestContext);
473
+ const digest = createHash("sha256")
474
+ .update(object.toStableKey({ package: "@dbx-tools/appkit-mastra", userKey }))
475
+ .digest("hex")
476
+ .slice(0, 16);
477
+ const normalized = posixPath.normalizeRoot(workspacePath);
478
+ const relative = normalized === SCRATCH_MOUNT ? "" : normalized.slice(`${SCRATCH_MOUNT}/`.length);
479
+ const source = new LocalFileSystem({
480
+ root: join(tmpdir(), "dbx-tools", "mastra", digest, relative),
481
+ readOnly: false,
482
+ createRoot: true,
483
+ });
484
+ return filesystems(source, {
485
+ displayName: "Temporary Files",
486
+ description: "User-scoped temporary files retained while the host keeps its ephemeral temp storage.",
427
487
  });
428
488
  }
429
489
  /** Mount startup-provisioned local skill roots into Mastra's workspace filesystem. */
@@ -453,33 +513,20 @@ function shouldMountSkillFolders(requestContext) {
453
513
  return true;
454
514
  return hasWorkspaceFileScope(requestContext);
455
515
  }
456
- /** Read the trimmed OBO user email stamped on {@link MASTRA_USER_EMAIL_KEY}. */
457
- function resolveScopedEmail(requestContext) {
458
- return stringUtils.trimToNull(requestContext?.get(MASTRA_USER_EMAIL_KEY)) ?? undefined;
459
- }
460
516
  /**
461
517
  * Wrap a {@link DatabricksFileSystem} as a Mastra filesystem. Missing or
462
- * inaccessible roots return `undefined` so the independent `/tmp` mount and
463
- * any other accessible roots remain usable.
518
+ * inaccessible roots return `undefined` so other accessible roots remain
519
+ * usable.
464
520
  */
465
- async function databricksFilesystem(client, root, readOnly = true, createRoot = !readOnly, fileSystemCache, skillPaths = [], adapterOptions = {}) {
466
- const initialClient = workspaceClient.toLegacyWorkspaceClient(client);
521
+ async function databricksFilesystem(client, root, readOnly = true, createRoot = !readOnly, fileSystemCache, cacheOptions, adapterOptions = {}) {
467
522
  const fs = new DatabricksFileSystem({
468
- client: () => {
469
- try {
470
- return workspaceClient.toLegacyWorkspaceClient(getExecutionContext().client);
471
- }
472
- catch {
473
- return initialClient;
474
- }
475
- },
523
+ client: () => workspaceClient.toLegacyWorkspaceClient(requestWorkspaceClient(client)),
476
524
  root,
477
525
  readOnly,
478
526
  createRoot,
479
527
  });
480
- const source = fileSystemCache
481
- ? sharedFS.cache(fs, fileSystemCache, { readFilePaths: skillPaths })
482
- : fs;
528
+ const cached = fileSystemCache && cacheOptions ? sharedFS.cache(fs, fileSystemCache, cacheOptions) : fs;
529
+ const source = verifyFirstFileSystemAccess(cached, () => fs.stat("."), root);
483
530
  const filesystem = filesystems(source, { ...adapterOptions, readOnly });
484
531
  try {
485
532
  await filesystem.init();
@@ -496,6 +543,84 @@ async function databricksFilesystem(client, root, readOnly = true, createRoot =
496
543
  }
497
544
  return undefined;
498
545
  }
546
+ /** @internal Keep service context from replacing the request-scoped workspace client. */
547
+ export function requestWorkspaceClient(initialClient, executionContext = appkit.tryGetExecutionContext()) {
548
+ if (executionContext &&
549
+ "isUserContext" in executionContext &&
550
+ executionContext.isUserContext === true) {
551
+ return executionContext.client;
552
+ }
553
+ return initialClient;
554
+ }
555
+ function verifyFirstFileSystemAccess(filesystem, readProbe, root) {
556
+ let readCheck;
557
+ let writeVerified = false;
558
+ const boundMethods = new Map();
559
+ const readOperations = new Set(["exists", "readFile", "readdir", "stat"]);
560
+ const writeOperations = new Set([
561
+ "appendFile",
562
+ "copyFile",
563
+ "deleteFile",
564
+ "mkdir",
565
+ "moveFile",
566
+ "rmdir",
567
+ "writeFile",
568
+ ]);
569
+ const verifyRead = async () => {
570
+ readCheck ??= Promise.resolve(readProbe()).then(() => undefined);
571
+ try {
572
+ await readCheck;
573
+ }
574
+ catch (error) {
575
+ readCheck = undefined;
576
+ logger.debug("databricks-mount:read-check-failed", {
577
+ root,
578
+ error: errorUtils.errorMessage(error),
579
+ });
580
+ throw error;
581
+ }
582
+ };
583
+ return new Proxy(filesystem, {
584
+ get(target, property) {
585
+ const value = Reflect.get(target, property, target);
586
+ if (typeof value !== "function")
587
+ return value;
588
+ if (boundMethods.has(property))
589
+ return boundMethods.get(property);
590
+ const delegated = value.bind(target);
591
+ let method = delegated;
592
+ if (readOperations.has(property)) {
593
+ method = async (...args) => {
594
+ await verifyRead();
595
+ return delegated(...args);
596
+ };
597
+ }
598
+ else if (writeOperations.has(property)) {
599
+ method = async (...args) => {
600
+ try {
601
+ const result = await delegated(...args);
602
+ if (!writeVerified) {
603
+ writeVerified = true;
604
+ logger.debug("databricks-mount:write-check-passed", { root });
605
+ }
606
+ return result;
607
+ }
608
+ catch (error) {
609
+ if (!writeVerified) {
610
+ logger.debug("databricks-mount:write-check-failed", {
611
+ root,
612
+ error: errorUtils.errorMessage(error),
613
+ });
614
+ }
615
+ throw error;
616
+ }
617
+ };
618
+ }
619
+ boundMethods.set(property, method);
620
+ return method;
621
+ },
622
+ });
623
+ }
499
624
  /**
500
625
  * Run every mount resolver for one request and merge mounts plus skill paths.
501
626
  * Later resolvers overwrite mount keys from earlier ones.
@@ -527,17 +652,19 @@ async function resolveWorkspaceContribution(resolvers, context) {
527
652
  /**
528
653
  * Dynamic filesystem resolver passed to Mastra {@link Workspace}.
529
654
  *
530
- * Returns a {@link CompositeFilesystem} when any mount resolved; otherwise a
531
- * fresh {@link scratchFilesystem} so Mastra always has a writable local root.
655
+ * Returns a {@link CompositeFilesystem} over every path that resolved for the
656
+ * request. An empty composite exposes no implicit local storage.
532
657
  */
533
- async function resolveWorkspaceFilesystem(resolveContribution, context, filesCache) {
658
+ async function resolveWorkspaceFilesystem(resolveContribution, context, filesCache, sourceKey) {
534
659
  const { mounts } = await resolveContribution(context);
535
660
  const mountKeys = Object.keys(mounts);
536
661
  if (mountKeys.length === 0) {
537
- logger.debug("filesystem:scratch", {
662
+ logger.debug("filesystem:empty", {
538
663
  hasRequestContext: Boolean(context.requestContext),
539
664
  });
540
- return scratchFilesystem();
665
+ return filesystems(new MemoryFileSystem({ root: "/", readOnly: true }), {
666
+ readOnly: true,
667
+ });
541
668
  }
542
669
  logger.debug("filesystem:composite", { mountKeys });
543
670
  const load = () => new MountedCompositeFilesystem({ mounts });
@@ -546,12 +673,12 @@ async function resolveWorkspaceFilesystem(resolveContribution, context, filesCac
546
673
  const scoped = await resolveFilesCacheScope(context);
547
674
  if (!scoped)
548
675
  return load();
549
- return filesCache.forFileSystem(scoped.scope, { paths: mountKeys }, load);
676
+ return filesCache.forFileSystem(scoped.scope, { paths: mountKeys, key: sourceKey }, load);
550
677
  }
551
678
  /**
552
679
  * Expand skill roots into concrete skill directories and keep the first
553
680
  * same-named directory. Mastra still owns parsing, indexing, and refreshes,
554
- * while organization roots retain precedence over personal roots.
681
+ * while earlier configured roots retain precedence over later roots.
555
682
  */
556
683
  async function resolveDistinctSkillPaths(filesystem, roots) {
557
684
  const selected = new Map();
@@ -596,4 +723,4 @@ function contributionResolver(resolvers) {
596
723
  return pending;
597
724
  };
598
725
  }
599
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXBHLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNuRCxPQUFPLEVBQ0wsVUFBVSxJQUFJLGdCQUFnQixHQUcvQixNQUFNLCtCQUErQixDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxlQUFlLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckYsT0FBTyxFQUFFLEVBQUUsSUFBSSxRQUFRLEVBQUUsU0FBUyxFQUF3QixNQUFNLHNCQUFzQixDQUFDO0FBRXZGLE9BQU8sRUFDTCxlQUFlLEVBQ2YsU0FBUyxHQVFWLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixxQkFBcUIsRUFDckIsZUFBZSxFQUNmLGNBQWMsR0FFZixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQ0wsV0FBVyxFQUNYLDBCQUEwQixFQUMxQixpQkFBaUIsR0FFbEIsTUFBTSxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxFQUFFLGlCQUFpQixFQUEwQyxNQUFNLGNBQWMsQ0FBQztBQUN6RixPQUFPLEVBQUUsMkJBQTJC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SSxRQUF5RCxDQUFDO0lBQzlELE9BQU8sQ0FBQyxPQUFPLEVBQUUsRUFBRTtRQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDO1lBQzVCLFFBQVEsS0FBSyw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7WUFDOUQsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUNELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3BELElBQUksUUFBUTtZQUFFLE9BQU8sUUFBUSxDQUFDO1FBQzlCLE1BQU0sT0FBTyxHQUFHLDRCQUE0QixDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNqRSxNQUFNLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDNUMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogTWFzdHJhIHdvcmtzcGFjZSBmYWN0b3J5IGZvciBEYXRhYnJpY2tzIEFwcHMuXG4gKlxuICogQnVpbGRzIGEge0BsaW5rIFdvcmtzcGFjZX0gd2l0aCBEYXRhYnJpY2tzIFNhbmRib3ggY29tbWFuZCBleGVjdXRpb24sIGFuXG4gKiBpc29sYXRlZCBgL3RtcGAgc2NyYXRjaCBtb3VudCwgYW5kIGEge0BsaW5rIENvbXBvc2l0ZUZpbGVzeXN0ZW19IG92ZXIgdGhlXG4gKiBuYW1lZCBza2lsbCBmb2xkZXJzXG4gKiByZXNvbHZlZCBmb3IgdGhhdCByZXF1ZXN0LiBBIHNraWxsIGZvbGRlciBtYXBzIGEgbmFtZSB0byBhIGxvY2F0aW9uIHBsdXMgaXRzXG4gKiByZWFkYWJsZSAvIHdyaXRhYmxlIHBvbGljeTogYSBEYXRhYnJpY2tzIHBhdGggbW91bnRlZCB0aHJvdWdoIHRoZSBPQk8gY2xpZW50XG4gKiBvbiB7QGxpbmsgTUFTVFJBX1VTRVJfS0VZfSwgb3IgYW55IHtAbGluayBXb3Jrc3BhY2VGaWxlc3lzdGVtfSBhIGNvbnN1bWluZ1xuICogbGlicmFyeSBhbHJlYWR5IG93bnMuIHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9IHN1cHBsaWVzIHRoZSBBc3Npc3RhbnRcbiAqIHRyZWVzLCBhbmQgYHNraWxsRm9sZGVyc2AgbWVyZ2VzIG92ZXIgaXQgLSBzYW1lIG5hbWUgb3ZlcnJpZGVzLCBgZmFsc2VgXG4gKiBkaXNhYmxlcywgYSBuZXcgbmFtZSBhZGRzLiBPcHRpb25hbCBtb3VudCByZXNvbHZlcnMgY29udHJpYnV0ZSBmdXJ0aGVyXG4gKiBmaWxlc3lzdGVtcyBhbmQgc2tpbGwgc2NhbiByb290cyBvbiB0b3AuXG4gKlxuICogRGF0YWJyaWNrcyBtb3VudHMgdXNlIGBAZGJ4LXRvb2xzL2RhdGFicmlja3NgIHtAbGluayBEYXRhYnJpY2tzRmlsZVN5c3RlbX1cbiAqIHdyYXBwZWQgYnkge0BsaW5rIGZpbGVzeXN0ZW1zfTsgaW5hY2Nlc3NpYmxlIHJvb3RzIGFyZSBza2lwcGVkIGluZGVwZW5kZW50bHkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IGNyZWF0ZUhhc2ggfSBmcm9tIFwibm9kZTpjcnlwdG9cIjtcbmltcG9ydCB7IENvbmZpZ3VyYXRpb25FcnJvciwgY3JlYXRlV29ya3NwYWNlQ2xpZW50LCBnZXRFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwbHVnaW5SZWdpc3RyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgZmlsZXNDYWNoZSBhcyBmaWxlc0NhY2hlUGx1Z2luLFxuICB0eXBlIEZpbGVzQ2FjaGVFeHBvcnRzLFxuICB0eXBlIEZpbGVzQ2FjaGVTY29wZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0L2ZpbGVzLWNhY2hlXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzRmlsZVN5c3RlbSwgd29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgTG9jYWxGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvZnNcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGxvZywgb2JqZWN0LCBzdHJpbmdVdGlscywgdG9rZW4gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgZnMgYXMgc2hhcmVkRlMsIHBvc2l4UGF0aCwgdHlwZSBGaWxlU3lzdGVtQ2FjaGUgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtZnNcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHtcbiAgV09SS1NQQUNFX1RPT0xTLFxuICBXb3Jrc3BhY2UsXG4gIHR5cGUgU2tpbGxzUmVzb2x2ZXIsXG4gIHR5cGUgV29ya3NwYWNlRmlsZXN5c3RlbSxcbiAgdHlwZSBXb3Jrc3BhY2VTYW5kYm94LFxuICB0eXBlIFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlcixcbiAgdHlwZSBUb29sQ29uZmlnV2l0aEFyZ3NDb250ZXh0LFxuICB0eXBlIFdvcmtzcGFjZVRvb2xDb25maWcsXG4gIHR5cGUgV29ya3NwYWNlVG9vbHNDb25maWcsXG59IGZyb20gXCJAbWFzdHJhL2NvcmUvd29ya3NwYWNlXCI7XG5cbmltcG9ydCB7XG4gIE1BU1RSQV9TQ09QRVNfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIE1BU1RSQV9VU0VSX0tFWSxcbiAgcmVzb2x2ZVVzZXJLZXksXG4gIHR5cGUgVXNlcixcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQge1xuICBmaWxlc3lzdGVtcyxcbiAgTW91bnRlZENvbXBvc2l0ZUZpbGVzeXN0ZW0sXG4gIHNjcmF0Y2hGaWxlc3lzdGVtLFxuICB0eXBlIE1hc3RyYUZpbGVTeXN0ZW1BZGFwdGVyT3B0aW9ucyxcbn0gZnJvbSBcIi4vZmlsZXN5c3RlbXMudHNcIjtcbmltcG9ydCB7IE1vbnR5U2FuZGJveCB9IGZyb20gXCIuL21vbnR5LXNhbmRib3gudHNcIjtcbmltcG9ydCB7IERhdGFicmlja3NTYW5kYm94LCB0eXBlIERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9ucyB9IGZyb20gXCIuL3NhbmRib3gudHNcIjtcbmltcG9ydCB7IE9SR0FOSVpBVElPTl9BU1NJU1RBTlRfUEFUSCwgcGVyc29uYWxXb3Jrc3BhY2VQYXRoIH0gZnJvbSBcIi4vc2tpbGwtcGF0aHMudHNcIjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnN0YW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIE9BdXRoIHNjb3BlcyB0aGF0IGdhdGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgZmlsZSBtb3VudHMuICovXG5jb25zdCBXT1JLU1BBQ0VfRklMRV9TQ09QRVMgPSBbXCJ3b3Jrc3BhY2VcIiwgXCJ3b3Jrc3BhY2Uud29ya3NwYWNlXCIsIFwiYWxsLWFwaXNcIl0gYXMgY29uc3Q7XG5jb25zdCBTQ1JBVENIX01PVU5UID0gXCIvdG1wXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvd29ya3NwYWNlc1wiKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIFBlci1yZXF1ZXN0IGNvbnRleHQgZm9yIG1vdW50IGFuZCBza2lsbC1mb2xkZXIgcmVzb2x2ZXJzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3Jrc3BhY2VNb3VudENvbnRleHQge1xuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xufVxuXG4vKipcbiAqIEEgc2tpbGwtZm9sZGVyIGZpZWxkIGdpdmVuIGVpdGhlciBkaXJlY3RseSBvciBhcyBhIHBlci1yZXF1ZXN0IHJlc29sdmVyLlxuICogQSByZXNvbHZlciByZXR1cm5pbmcgYHVuZGVmaW5lZGAgc2tpcHMgdGhlIGZvbGRlciBmb3IgdGhhdCByZXF1ZXN0LlxuICovXG5leHBvcnQgdHlwZSBTa2lsbEZvbGRlclZhbHVlPFQ+ID1cbiAgVCB8ICgoY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0KSA9PiBUIHwgdW5kZWZpbmVkIHwgUHJvbWlzZTxUIHwgdW5kZWZpbmVkPik7XG5cbi8qKlxuICogT25lIG5hbWVkIHNraWxsLWZvbGRlciBsb2NhdGlvbiBhbmQgaXRzIHJlYWQgLyB3cml0ZSBwb2xpY3kuXG4gKlxuICogR2l2ZSB7QGxpbmsgcGF0aH0gZm9yIGEgRGF0YWJyaWNrcyB3b3Jrc3BhY2UgdHJlZSAobW91bnRlZCB0aHJvdWdoIHRoZVxuICogcmVxdWVzdCdzIE9CTyBjbGllbnQpLCBvciB7QGxpbmsgZmlsZXN5c3RlbX0gZm9yIGEgbW91bnQgdGhlIGNvbnN1bWVyIGJ1aWxkc1xuICogaXRzZWxmLiB7QGxpbmsgZmlsZXN5c3RlbX0gd2lucyB3aGVuIGJvdGggYXJlIHNldC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTa2lsbEZvbGRlck9wdGlvbnMge1xuICAvKiogQWJzb2x1dGUgRGF0YWJyaWNrcyB3b3Jrc3BhY2Ugcm9vdCBtb3VudGVkIGF0IGl0cyBhY3R1YWwgcGF0aC4gKi9cbiAgcGF0aD86IFNraWxsRm9sZGVyVmFsdWU8c3RyaW5nPjtcbiAgLyoqIFJlYWR5LW1hZGUgbW91bnQsIGZvciBsb2NhdGlvbnMgdGhlIE9CTyBjbGllbnQgY2Fubm90IHJlYWNoLiAqL1xuICBmaWxlc3lzdGVtPzogU2tpbGxGb2xkZXJWYWx1ZTxXb3Jrc3BhY2VGaWxlc3lzdGVtPjtcbiAgLyoqIEh1bWFuLWZyaWVuZGx5IG1vdW50IG5hbWUgc2hvd24gaW4gZmlsZXN5c3RlbSBsaXN0aW5ncy4gKi9cbiAgZGlzcGxheU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBNb3VudCBkZXNjcmlwdGlvbiBzaG93biBpbiBmaWxlc3lzdGVtIGxpc3RpbmdzIGFuZCB3b3Jrc3BhY2UgaW5zdHJ1Y3Rpb25zLiAqL1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgLyoqXG4gICAqIFNjYW4gdGhpcyBtb3VudCBmb3IgYFNLSUxMLm1kYCBmaWxlcy4gRGVmYXVsdHMgdG8gYHRydWVgOyBgZmFsc2VgIG1vdW50c1xuICAgKiB0aGUgbG9jYXRpb24gZm9yIGZpbGUgdG9vbHMgd2l0aG91dCBhZGRpbmcgaXQgdG8gc2tpbGwgZGlzY292ZXJ5LlxuICAgKi9cbiAgcmVhZGFibGU/OiBib29sZWFuO1xuICAvKipcbiAgICogU2tpbGwgcm9vdHMgcmVsYXRpdmUgdG8gdGhpcyBmaWxlc3lzdGVtIHJvb3QuIERlZmF1bHRzIHRvIGBbXCIuXCJdYC5cbiAgICogRWFjaCBwYXRoIGlzIGpvaW5lZCB0byB0aGUgYWN0dWFsIG1vdW50IHBhdGggYmVmb3JlIE1hc3RyYSBzY2FucyBpdC5cbiAgICovXG4gIHNraWxscz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogQWxsb3cgd3JpdGUgYXR0ZW1wdHMgdG8gYSB7QGxpbmsgcGF0aH0gbW91bnQuIERlZmF1bHRzIHRvIGB0cnVlYCBmb3JcbiAgICogYC9Xb3Jrc3BhY2VgIHJvb3RzIGFuZCBgZmFsc2VgIGVsc2V3aGVyZS4gRGF0YWJyaWNrcyBwZXJtaXNzaW9ucyBzdGlsbFxuICAgKiBkZXRlcm1pbmUgd2hldGhlciBlYWNoIG11dGF0aW9uIHN1Y2NlZWRzLlxuICAgKi9cbiAgd3JpdGFibGU/OiBib29sZWFuO1xuICAvKipcbiAgICogQ3JlYXRlIGEgd3JpdGFibGUge0BsaW5rIHBhdGh9IHJvb3Qgd2hlbiBtaXNzaW5nLiBEZWZhdWx0cyB0b1xuICAgKiB7QGxpbmsgd3JpdGFibGV9OyBzZXQgYGZhbHNlYCBmb3IgcHJlLWV4aXN0aW5nIHJvb3RzIHdpdGggY29uZGl0aW9uYWwgYWNjZXNzLlxuICAgKi9cbiAgY3JlYXRlUm9vdD86IGJvb2xlYW47XG4gIC8qKiBNb3VudCBwb2ludCBpbiB0aGUgY29tcG9zaXRlIG5hbWVzcGFjZS4gRGF0YWJyaWNrcyBwYXRocyBkZWZhdWx0IHRvIHRoZWlyIGFjdHVhbCByb290LiAqL1xuICBtb3VudD86IHN0cmluZztcbn1cblxuLyoqIE1vdW50IG1hcCBwbHVzIG9wdGlvbmFsIE1hc3RyYSBza2lsbCBzY2FuIHJvb3RzIGZvciBvbmUgcmVzb2x2ZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHtcbiAgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPjtcbiAgLyoqIFBhdGhzIHdpdGhpbiB0aGUgY29tcG9zaXRlIG5hbWVzcGFjZSB3aGVyZSBgU0tJTEwubWRgIGZpbGVzIGFyZSBzY2FubmVkLiAqL1xuICBza2lsbFBhdGhzPzogc3RyaW5nW107XG59XG5cbi8qKiBDb250cmlidXRlcyBmaWxlc3lzdGVtIG1vdW50cyAoYW5kIG9wdGlvbmFsIHNraWxsIHBhdGhzKSBmb3Igb25lIHJlcXVlc3QuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VNb3VudFJlc29sdmVyID0gKFxuICBjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQsXG4pID0+IFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uIHwgUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj47XG5cbi8qKiBOYW1lcyBjYXJyaWVkIGJ5IHtAbGluayBERUZBVUxUX1NLSUxMX0ZPTERFUlN9LiAqL1xuZXhwb3J0IHR5cGUgRGVmYXVsdFNraWxsRm9sZGVyTmFtZSA9IFwib3JnYW5pemF0aW9uLXNraWxsc1wiIHwgXCJwZXJzb25hbC1za2lsbHNcIjtcblxuLyoqXG4gKiBTYW5kYm94IHNlbGVjdGlvbiBmb3Ige0BsaW5rIGNyZWF0ZVdvcmtzcGFjZX0uIERhdGFicmlja3MgaXMgdGhlIGRlZmF1bHQ7XG4gKiBgZmFsc2VgIGRpc2FibGVzIGNvbW1hbmQgZXhlY3V0aW9uLCBhbmQgYSBNYXN0cmEgcHJvdmlkZXIgb3IgcmVzb2x2ZXIgaXMgYW5cbiAqIGV4cGxpY2l0IHJlcGxhY2VtZW50LlxuICovXG5leHBvcnQgdHlwZSBXb3Jrc3BhY2VTYW5kYm94U2VsZWN0aW9uID1cbiAgfCBmYWxzZVxuICB8IFwiZGF0YWJyaWNrc1wiXG4gIHwgXCJtb250eVwiXG4gIHwgRGF0YWJyaWNrc1dvcmtzcGFjZVNhbmRib3hPcHRpb25zXG4gIHwgV29ya3NwYWNlU2FuZGJveFxuICB8IFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlcjtcblxuLyoqIE9wdGlvbnMgZm9yIHtAbGluayBjcmVhdGVXb3Jrc3BhY2V9LiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zIHtcbiAgLyoqIFdvcmtzcGFjZSBpZDsgZGVyaXZlZCBmcm9tIGBuYW1lYCBvciBgXCJ3b3Jrc3BhY2VcImAgd2hlbiBvbWl0dGVkLiAqL1xuICBpZD86IHN0cmluZztcbiAgLyoqIERpc3BsYXkgbmFtZTsgZGVyaXZlZCBmcm9tIGBpZGAgd2hlbiBvbWl0dGVkLiAqL1xuICBuYW1lPzogc3RyaW5nO1xuICAvKipcbiAgICogU3RhcnQgZnJvbSB7QGxpbmsgREVGQVVMVF9TS0lMTF9GT0xERVJTfS4gRGVmYXVsdHMgdG8gYHRydWVgOyBgZmFsc2VgXG4gICAqIHN0YXJ0cyBmcm9tIGFuIGVtcHR5IG1hcCwgbGVhdmluZyBvbmx5IHRoZSB7QGxpbmsgc2tpbGxGb2xkZXJzfSBnaXZlbiBoZXJlLlxuICAgKi9cbiAgYXNzaXN0YW50U2tpbGxzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIE5hbWVkIHNraWxsIGZvbGRlcnMgbWVyZ2VkIG92ZXIge0BsaW5rIERFRkFVTFRfU0tJTExfRk9MREVSU306IGEgbWF0Y2hpbmdcbiAgICogbmFtZSBvdmVycmlkZXMgdGhhdCBkZWZhdWx0LCBgZmFsc2VgIGRpc2FibGVzIGl0LCBhbmQgYW55IG90aGVyIG5hbWUgYWRkc1xuICAgKiBhIGZvbGRlci5cbiAgICovXG4gIHNraWxsRm9sZGVycz86IFJlY29yZDxzdHJpbmcsIFNraWxsRm9sZGVyT3B0aW9ucyB8IGZhbHNlPjtcbiAgLyoqIEV4dHJhIHBlci1yZXF1ZXN0IG1vdW50IHJlc29sdmVycyAocnVuIGFmdGVyIHRoZSBza2lsbC1mb2xkZXIgbW91bnRzKS4gKi9cbiAgbW91bnRzPzogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdO1xuICAvKiogUmVwbGFjZSB0aGUgYXV0by1idWlsdCBkeW5hbWljIHNraWxscyByZXNvbHZlci4gKi9cbiAgc2tpbGxzPzogU2tpbGxzUmVzb2x2ZXI7XG4gIC8qKiBGb3J3YXJkZWQgdG8gTWFzdHJhIHdoZW4gc2tpbGwgZGlzY292ZXJ5IGlzIGVuYWJsZWQuICovXG4gIGNoZWNrU2tpbGxGaWxlTXRpbWU/OiBib29sZWFuO1xuICAvKiogQWRkaXRpb25hbCBuYXRpdmUgTWFzdHJhIHdvcmtzcGFjZSB0b29sIGNvbmZpZ3VyYXRpb24gYW5kIG92ZXJyaWRlcy4gKi9cbiAgdG9vbHM/OiBXb3Jrc3BhY2VUb29sc0NvbmZpZztcbiAgLyoqIEFwcEtpdCBwbHVnaW4gY29udGV4dCB1c2VkIHRvIGRpc2NvdmVyIG9wdGlvbmFsIHNpYmxpbmcgY2FwYWJpbGl0aWVzLiAqL1xuICBwbHVnaW5Db250ZXh0PzogcGx1Z2luUmVnaXN0cnkuUGx1Z2luQ29udGV4dExpa2U7XG4gIC8qKiBFbmFibGUgQk0yNSBrZXl3b3JkIHNlYXJjaCBvdmVyIGluZGV4ZWQgd29ya3NwYWNlIGNvbnRlbnQuICovXG4gIGJtMjU/OiBib29sZWFuO1xuICAvKipcbiAgICogQ29tbWFuZCBzYW5kYm94LiBEZWZhdWx0cyB0byBNb250eS4gUGFzcyBgXCJkYXRhYnJpY2tzXCJgIG9yIGFuIG9wdGlvbnNcbiAgICogb2JqZWN0IGZvciBEYXRhYnJpY2tzIFNhbmRib3gsIGBmYWxzZWAgdG8gZGlzYWJsZSBjb21tYW5kIGV4ZWN1dGlvbiwgb3IgYW5cbiAgICogZXhwbGljaXQgTWFzdHJhIHNhbmRib3gvcHJvdmlkZXIgcmVzb2x2ZXIuXG4gICAqL1xuICBzYW5kYm94PzogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbjtcbiAgLyoqXG4gICAqIEV4dHJhIExPQ0FMIHNraWxsIHJvb3RzIG1vdW50ZWQgcmVhZC1vbmx5IGZvciBldmVyeSByZXF1ZXN0J3Mgc2tpbGwgZGlzY292ZXJ5LlxuICAgKiBVc2VkIGJ5IHRoZSBwbHVnaW4gdG8gc3VyZmFjZSByZW1vdGUgc2tpbGxzIHByb3Zpc2lvbmVkIHRvIGEgbG9jYWwgdGVtcFxuICAgKiBkaXIgYXQgc3RhcnR1cCAoc2VlIGByZW1vdGUtc2tpbGxzLnRzYCkuIERhdGFicmlja3MtaG9zdGVkIHJlbW90ZSBza2lsbHNcbiAgICogbmVlZCBubyBlbnRyeSBoZXJlIC0gdGhleSBsYW5kIGluIHRoZSBBc3Npc3RhbnQgdHJlZSB0aGUgYnVpbHQtaW4gbW91bnRcbiAgICogYWxyZWFkeSBzY2Fucy5cbiAgICovXG4gIGV4dHJhU2tpbGxQYXRocz86IHN0cmluZ1tdO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGRlZmF1bHRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBUaGUgc2tpbGwgZm9sZGVycyBldmVyeSB3b3Jrc3BhY2Ugc3RhcnRzIHdpdGguXG4gKlxuICogLSBgb3JnYW5pemF0aW9uLXNraWxsc2AgLSBgL1dvcmtzcGFjZS8uYXNzaXN0YW50YCB3aXRoIGBza2lsbHNgOyB3cml0ZVxuICogICBhdHRlbXB0cyByZXF1aXJlIGFwcHJvdmFsIGFuZCByZW1haW4gc3ViamVjdCB0byBEYXRhYnJpY2tzIHBlcm1pc3Npb25zLlxuICogLSBgcGVyc29uYWwtc2tpbGxzYCAtIHRoZSByZXF1ZXN0aW5nIHVzZXIncyBgL1dvcmtzcGFjZS9Vc2Vycy88ZW1haWw+YCByb290XG4gKiAgIHdpdGggYC5hc3Npc3RhbnQvc2tpbGxzYCwgd3JpdGFibGUgYW5kIHNraXBwZWQgd2l0aG91dCBhbiBlbWFpbC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfU0tJTExfRk9MREVSUzogUmVhZG9ubHk8UmVjb3JkPERlZmF1bHRTa2lsbEZvbGRlck5hbWUsIFNraWxsRm9sZGVyT3B0aW9ucz4+ID0ge1xuICBcIm9yZ2FuaXphdGlvbi1za2lsbHNcIjoge1xuICAgIGRlc2NyaXB0aW9uOiBcIk9yZ2FuaXphdGlvbiBza2lsbHMgc2hhcmVkIHdpdGggZXZlcnlvbmUgaW4gdGhpcyBEYXRhYnJpY2tzIHdvcmtzcGFjZS5cIixcbiAgICBkaXNwbGF5TmFtZTogXCJPcmdhbml6YXRpb24gU2tpbGxzXCIsXG4gICAgcGF0aDogT1JHQU5JWkFUSU9OX0FTU0lTVEFOVF9QQVRILFxuICAgIHJlYWRhYmxlOiB0cnVlLFxuICAgIHNraWxsczogW1wic2tpbGxzXCJdLFxuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNyZWF0ZVJvb3Q6IGZhbHNlLFxuICB9LFxuICBcInBlcnNvbmFsLXNraWxsc1wiOiB7XG4gICAgZGVzY3JpcHRpb246IFwiWW91ciBEYXRhYnJpY2tzIHdvcmtzcGFjZSBob21lIGRpcmVjdG9yeSBmb3IgcGVyc29uYWwgZmlsZXMgYW5kIHNraWxscy5cIixcbiAgICBkaXNwbGF5TmFtZTogXCJIb21lXCIsXG4gICAgcGF0aDogKHsgcmVxdWVzdENvbnRleHQgfSkgPT4ge1xuICAgICAgY29uc3QgZW1haWwgPSByZXNvbHZlU2NvcGVkRW1haWwocmVxdWVzdENvbnRleHQpO1xuICAgICAgcmV0dXJuIGVtYWlsID8gcGVyc29uYWxXb3Jrc3BhY2VQYXRoKGVtYWlsKSA6IHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIHJlYWRhYmxlOiB0cnVlLFxuICAgIHNraWxsczogW1wiLmFzc2lzdGFudC9za2lsbHNcIl0sXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY3JlYXRlUm9vdDogZmFsc2UsXG4gIH0sXG59O1xuXG4vKipcbiAqIENyZWF0ZSBhIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfSB3aXRoIHBlci1yZXF1ZXN0IERhdGFicmlja3MgbW91bnRzLlxuICpcbiAqIEBleGFtcGxlIERlZmF1bHQgc2tpbGwgZm9sZGVycyBvbmx5XG4gKiBgYGB0c1xuICogY3JlYXRlV29ya3NwYWNlKClcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIE92ZXJyaWRlIGEgZGVmYXVsdCwgZHJvcCBhbm90aGVyLCBhbmQgYWRkIGEgbG9jYXRpb24gb2YgeW91ciBvd25cbiAqIGBgYHRzXG4gKiBjcmVhdGVXb3Jrc3BhY2Uoe1xuICogICBza2lsbEZvbGRlcnM6IHtcbiAqICAgICBcIm9yZ2FuaXphdGlvbi1za2lsbHNcIjoge1xuICogICAgICAgcGF0aDogXCIvV29ya3NwYWNlL1NoYXJlZC8uYXNzaXN0YW50XCIsXG4gKiAgICAgICBza2lsbHM6IFtcInNraWxsc1wiXSxcbiAqICAgICB9LFxuICogICAgIFwicGVyc29uYWwtc2tpbGxzXCI6IGZhbHNlLFxuICogICAgIHJ1bmJvb2tzOiB7IHBhdGg6IFwiL1dvcmtzcGFjZS9TaGFyZWQvcnVuYm9va3Mvc2tpbGxzXCIsIHdyaXRhYmxlOiB0cnVlIH0sXG4gKiAgICAgdm9sdW1lOiB7IGZpbGVzeXN0ZW06IG15Vm9sdW1lRmlsZXN5c3RlbSB9LFxuICogICB9LFxuICogfSlcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlIFNraWxsIGZvbGRlcnMgcGx1cyBhIGN1c3RvbSBtb3VudCByZXNvbHZlclxuICogYGBgdHNcbiAqIGNyZWF0ZVdvcmtzcGFjZSh7XG4gKiAgIG1vdW50czogW1xuICogICAgIGFzeW5jICh7IHJlcXVlc3RDb250ZXh0IH0pID0+ICh7XG4gKiAgICAgICBtb3VudHM6IHsgXCIvZGF0YVwiOiBteUZpbGVzeXN0ZW0gfSxcbiAqICAgICAgIHNraWxsUGF0aHM6IFtdLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSlcbiAqIGBgYFxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV29ya3NwYWNlKG9wdGlvbnM6IENyZWF0ZVdvcmtzcGFjZU9wdGlvbnMgPSB7fSk6IFdvcmtzcGFjZSB7XG4gIGNvbnN0IHsgaWQsIG5hbWUgfSA9IHJlc29sdmVXb3Jrc3BhY2VJZGVudGl0eShvcHRpb25zKTtcbiAgY29uc3Qgc2tpbGxGb2xkZXJzID0gcmVzb2x2ZVNraWxsRm9sZGVycyhvcHRpb25zKTtcbiAgY29uc3QgZm9sZGVyTmFtZXMgPSBPYmplY3Qua2V5cyhza2lsbEZvbGRlcnMpO1xuICBjb25zdCBleHRyYVNraWxsUGF0aHMgPSBvcHRpb25zLmV4dHJhU2tpbGxQYXRocyA/PyBbXTtcbiAgY29uc3QgZmlsZXNDYWNoZSA9IHBsdWdpblJlZ2lzdHJ5Lmluc3RhbmNlKG9wdGlvbnMucGx1Z2luQ29udGV4dCwgZmlsZXNDYWNoZVBsdWdpbik/LmV4cG9ydHMoKTtcbiAgY29uc3QgcmV0YWluRmlsZXN5c3RlbVNvdXJjZSA9XG4gICAgZmlsZXNDYWNoZSAhPT0gdW5kZWZpbmVkICYmXG4gICAgKG9wdGlvbnMubW91bnRzPy5sZW5ndGggPz8gMCkgPT09IDAgJiZcbiAgICBPYmplY3QudmFsdWVzKHNraWxsRm9sZGVycykuZXZlcnkoXG4gICAgICAoZm9sZGVyKSA9PlxuICAgICAgICB0eXBlb2YgZm9sZGVyLmZpbGVzeXN0ZW0gIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAhKHR5cGVvZiBmb2xkZXIucGF0aCA9PT0gXCJmdW5jdGlvblwiICYmIGZvbGRlci5tb3VudCAhPT0gdW5kZWZpbmVkKSxcbiAgICApO1xuICBjb25zdCByZXNvbHZlcnMgPSBidWlsZE1vdW50UmVzb2x2ZXJzKFxuICAgIHNraWxsRm9sZGVycyxcbiAgICBbLi4uKG9wdGlvbnMubW91bnRzID8/IFtdKSwgLi4ubG9jYWxTa2lsbE1vdW50UmVzb2x2ZXJzKGV4dHJhU2tpbGxQYXRocyldLFxuICAgIGZpbGVzQ2FjaGUsXG4gICk7XG4gIGNvbnN0IHJlc29sdmVDb250cmlidXRpb24gPSBjb250cmlidXRpb25SZXNvbHZlcihyZXNvbHZlcnMpO1xuICBjb25zdCByZXNvbHZlRmlsZXN5c3RlbSA9IChjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQpID0+XG4gICAgcmVzb2x2ZVdvcmtzcGFjZUZpbGVzeXN0ZW0oXG4gICAgICByZXNvbHZlQ29udHJpYnV0aW9uLFxuICAgICAgY29udGV4dCxcbiAgICAgIHJldGFpbkZpbGVzeXN0ZW1Tb3VyY2UgPyBmaWxlc0NhY2hlIDogdW5kZWZpbmVkLFxuICAgICk7XG4gIGNvbnN0IHNraWxsczogU2tpbGxzUmVzb2x2ZXIgPVxuICAgIG9wdGlvbnMuc2tpbGxzID8/XG4gICAgKGFzeW5jICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB7IHJlcXVlc3RDb250ZXh0IH07XG4gICAgICBjb25zdCBjb250cmlidXRpb24gPSBhd2FpdCByZXNvbHZlQ29udHJpYnV0aW9uKGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHJlc29sdmVEaXN0aW5jdFNraWxsUGF0aHMoXG4gICAgICAgIGF3YWl0IHJlc29sdmVGaWxlc3lzdGVtKGNvbnRleHQpLFxuICAgICAgICBjb250cmlidXRpb24uc2tpbGxQYXRocyA/PyBbXSxcbiAgICAgICk7XG4gICAgfSk7XG4gIGNvbnN0IGNoZWNrU2tpbGxGaWxlTXRpbWUgPSBvcHRpb25zLmNoZWNrU2tpbGxGaWxlTXRpbWUgPz8gZmFsc2U7XG4gIGNvbnN0IGJtMjUgPSBvcHRpb25zLmJtMjUgIT09IGZhbHNlO1xuICBjb25zdCBzYW5kYm94ID0gcmVzb2x2ZVdvcmtzcGFjZVNhbmRib3gob3B0aW9ucy5zYW5kYm94LCBpZCwgbmFtZSk7XG4gIGNvbnN0IHRvb2xzID0gd29ya3NwYWNlVG9vbHMob3B0aW9ucy50b29scyk7XG4gIGxvZ2dlci5kZWJ1ZyhcIndvcmtzcGFjZTpjcmVhdGVcIiwge1xuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgcmVzb2x2ZXJDb3VudDogcmVzb2x2ZXJzLmxlbmd0aCxcbiAgICBza2lsbEZvbGRlcnM6IGZvbGRlck5hbWVzLFxuICAgIGN1c3RvbU1vdW50UmVzb2x2ZXJzOiBvcHRpb25zLm1vdW50cz8ubGVuZ3RoID8/IDAsXG4gICAgY3VzdG9tU2tpbGxzUmVzb2x2ZXI6IEJvb2xlYW4ob3B0aW9ucy5za2lsbHMpLFxuICAgIGNoZWNrU2tpbGxGaWxlTXRpbWUsXG4gICAgYm0yNSxcbiAgICBleHRyYVNraWxsUGF0aHM6IGV4dHJhU2tpbGxQYXRocy5sZW5ndGgsXG4gICAgc2FuZGJveDogc2FuZGJveCA/IHNhbmRib3hOYW1lKG9wdGlvbnMuc2FuZGJveCkgOiBcImRpc2FibGVkXCIsXG4gIH0pO1xuXG4gIGNvbnN0IHdvcmtzcGFjZSA9IG5ldyBXb3Jrc3BhY2Uoe1xuICAgIGlkLFxuICAgIG5hbWUsXG4gICAgZmlsZXN5c3RlbTogcmVzb2x2ZUZpbGVzeXN0ZW0sXG4gICAgLi4uKHJlc29sdmVycy5sZW5ndGggPiAwIHx8IG9wdGlvbnMuc2tpbGxzXG4gICAgICA/IHtcbiAgICAgICAgICBza2lsbHMsXG4gICAgICAgICAgY2hlY2tTa2lsbEZpbGVNdGltZSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHNhbmRib3hcbiAgICAgID8ge1xuICAgICAgICAgIHNhbmRib3gsXG4gICAgICAgICAgaW5zdHJ1Y3Rpb25zOiB7IGR5bmFtaWNTYW5kYm94OiBcInJlc29sdmVcIiBhcyBjb25zdCB9LFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICBibTI1LFxuICAgIHRvb2xzLFxuICB9KTtcbiAgcmV0dXJuIHdvcmtzcGFjZTtcbn1cblxuLyoqXG4gKiBNZXJnZSB0aGUgY29uZmlndXJlZCBza2lsbCBmb2xkZXJzIG92ZXIge0BsaW5rIERFRkFVTFRfU0tJTExfRk9MREVSU30uXG4gKlxuICogYGFzc2lzdGFudFNraWxsczogZmFsc2VgIGRyb3BzIHRoZSBkZWZhdWx0cywgYW5kIGEgYGZhbHNlYCB2YWx1ZSByZW1vdmVzIG9uZVxuICogZW50cnkgYnkgbmFtZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVTa2lsbEZvbGRlcnMoXG4gIG9wdGlvbnM6IFBpY2s8Q3JlYXRlV29ya3NwYWNlT3B0aW9ucywgXCJhc3Npc3RhbnRTa2lsbHNcIiB8IFwic2tpbGxGb2xkZXJzXCI+ID0ge30sXG4pOiBSZWNvcmQ8c3RyaW5nLCBTa2lsbEZvbGRlck9wdGlvbnM+IHtcbiAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCBTa2lsbEZvbGRlck9wdGlvbnM+ID1cbiAgICBvcHRpb25zLmFzc2lzdGFudFNraWxscyA9PT0gZmFsc2UgPyB7fSA6IHsgLi4uREVGQVVMVF9TS0lMTF9GT0xERVJTIH07XG4gIGZvciAoY29uc3QgW25hbWUsIGZvbGRlcl0gb2YgT2JqZWN0LmVudHJpZXMob3B0aW9ucy5za2lsbEZvbGRlcnMgPz8ge30pKSB7XG4gICAgaWYgKGZvbGRlciA9PT0gZmFsc2UpIHtcbiAgICAgIGRlbGV0ZSBtZXJnZWRbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lcmdlZFtuYW1lXSA9IGZvbGRlcjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lcmdlZDtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcml2YXRlIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogUmVxdWlyZSBhcHByb3ZhbCB1bmxlc3MgYSBmaWxlc3lzdGVtIG11dGF0aW9uIHN0YXlzIGluc2lkZSBhIHVzZXItb3duZWQgd3JpdGFibGUgcm9vdC4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVBcHByb3ZhbE91dHNpZGVXcml0YWJsZVJvb3RzKHtcbiAgYXJncyxcbiAgcmVxdWVzdENvbnRleHQsXG59OiBUb29sQ29uZmlnV2l0aEFyZ3NDb250ZXh0KTogYm9vbGVhbiB7XG4gIGNvbnN0IGlucHV0UGF0aCA9IGFyZ3MucGF0aDtcbiAgaWYgKHR5cGVvZiBpbnB1dFBhdGggIT09IFwic3RyaW5nXCIgfHwgIXBvc2l4UGF0aC5pc0Fic29sdXRlKGlucHV0UGF0aCkpIHJldHVybiB0cnVlO1xuICBjb25zdCBub3JtYWxpemVkID0gcG9zaXhQYXRoLm5vcm1hbGl6ZShpbnB1dFBhdGgpO1xuICBpZiAoIW5vcm1hbGl6ZWQub2spIHJldHVybiB0cnVlO1xuICBpZiAocG9zaXhQYXRoLmlzV2l0aGluUm9vdChTQ1JBVENIX01PVU5ULCBub3JtYWxpemVkLnBhdGgpKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGVtYWlsVmFsdWUgPSByZXF1ZXN0Q29udGV4dFtNQVNUUkFfVVNFUl9FTUFJTF9LRVldO1xuICBjb25zdCBlbWFpbCA9IHR5cGVvZiBlbWFpbFZhbHVlID09PSBcInN0cmluZ1wiID8gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChlbWFpbFZhbHVlKSA6IHVuZGVmaW5lZDtcbiAgaWYgKCFlbWFpbCkgcmV0dXJuIHRydWU7XG4gIHJldHVybiAhcG9zaXhQYXRoLmlzV2l0aGluUm9vdChwZXJzb25hbFdvcmtzcGFjZVBhdGgoZW1haWwpLCBub3JtYWxpemVkLnBhdGgpO1xufVxuXG5mdW5jdGlvbiB3b3Jrc3BhY2VUb29scyhjb25maWd1cmVkOiBXb3Jrc3BhY2VUb29sc0NvbmZpZyB8IHVuZGVmaW5lZCk6IFdvcmtzcGFjZVRvb2xzQ29uZmlnIHtcbiAgY29uc3QgcmVxdWlyZUFwcHJvdmFsOiBXb3Jrc3BhY2VUb29sQ29uZmlnID1cbiAgICBjb25maWd1cmVkPy5yZXF1aXJlQXBwcm92YWwgPT09IHVuZGVmaW5lZFxuICAgICAgPyB7IHJlcXVpcmVBcHByb3ZhbDogcmVxdWlyZUFwcHJvdmFsT3V0c2lkZVdyaXRhYmxlUm9vdHMgfVxuICAgICAgOiB7fTtcbiAgY29uc3QgZGVmYXVsdHMgPSB7XG4gICAgW1dPUktTUEFDRV9UT09MUy5GSUxFU1lTVEVNLldSSVRFX0ZJTEVdOiByZXF1aXJlQXBwcm92YWwsXG4gICAgW1dPUktTUEFDRV9UT09MUy5GSUxFU1lTVEVNLkVESVRfRklMRV06IHJlcXVpcmVBcHByb3ZhbCxcbiAgICBbV09SS1NQQUNFX1RPT0xTLkZJTEVTWVNURU0uQVNUX0VESVRdOiByZXF1aXJlQXBwcm92YWwsXG4gICAgW1dPUktTUEFDRV9UT09MUy5GSUxFU1lTVEVNLkRFTEVURV06IHJlcXVpcmVBcHByb3ZhbCxcbiAgICBbV09SS1NQQUNFX1RPT0xTLkZJTEVTWVNURU0uTUtESVJdOiByZXF1aXJlQXBwcm92YWwsXG4gIH0gc2F0aXNmaWVzIFdvcmtzcGFjZVRvb2xzQ29uZmlnO1xuICBjb25zdCBjb25maWd1cmVkVG9vbHMgPSBjb25maWd1cmVkIGFzXG4gICAgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgV29ya3NwYWNlVG9vbENvbmZpZyB8IHVuZGVmaW5lZD4+IHwgdW5kZWZpbmVkO1xuICBjb25zdCBtZXJnZWRUb29scyA9IE9iamVjdC5mcm9tRW50cmllcyhcbiAgICBPYmplY3QuZW50cmllcyhkZWZhdWx0cykubWFwKChbbmFtZSwgZGVmYXVsdENvbmZpZ10pID0+IFtcbiAgICAgIG5hbWUsXG4gICAgICB7IC4uLmRlZmF1bHRDb25maWcsIC4uLmNvbmZpZ3VyZWRUb29scz8uW25hbWVdIH0sXG4gICAgXSksXG4gICk7XG4gIHJldHVybiB7XG4gICAgLi4uZGVmYXVsdHMsXG4gICAgLi4uY29uZmlndXJlZCxcbiAgICAuLi5tZXJnZWRUb29scyxcbiAgfTtcbn1cbmZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VTYW5kYm94KFxuICBzZWxlY3Rpb246IFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24gfCB1bmRlZmluZWQsXG4gIHdvcmtzcGFjZUlkOiBzdHJpbmcsXG4gIHdvcmtzcGFjZU5hbWU6IHN0cmluZyxcbik6IFdvcmtzcGFjZVNhbmRib3ggfCBXb3Jrc3BhY2VTYW5kYm94UmVzb2x2ZXIgfCB1bmRlZmluZWQge1xuICBjb25zdCBjb25maWd1cmVkID0gc2VsZWN0aW9uID8/IFwibW9udHlcIjtcbiAgaWYgKGNvbmZpZ3VyZWQgPT09IGZhbHNlKSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAoY29uZmlndXJlZCA9PT0gXCJtb250eVwiKSByZXR1cm4gbmV3IE1vbnR5U2FuZGJveCgpO1xuICBpZiAodHlwZW9mIGNvbmZpZ3VyZWQgPT09IFwiZnVuY3Rpb25cIiB8fCBpc1NhbmRib3goY29uZmlndXJlZCkpIHJldHVybiBjb25maWd1cmVkO1xuXG4gIGNvbnN0IG9wdGlvbnM6IERhdGFicmlja3NXb3Jrc3BhY2VTYW5kYm94T3B0aW9ucyA9XG4gICAgY29uZmlndXJlZCA9PT0gXCJkYXRhYnJpY2tzXCIgPyB7IHByb3ZpZGVyOiBcImRhdGFicmlja3NcIiB9IDogY29uZmlndXJlZDtcbiAgcmV0dXJuICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IHtcbiAgICBjb25zdCB1c2VyID0gcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0tFWSkgYXMgVXNlciB8IHVuZGVmaW5lZDtcbiAgICBpZiAoIXVzZXIpIHtcbiAgICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgICBcIkRhdGFicmlja3Mgc2FuZGJveCB1c2VyIGNvbnRleHRcIixcbiAgICAgICAgXCJJbnZva2UgY29tbWFuZCB0b29scyBmcm9tIGFuIGFnZW50IHR1cm4gc2VydmVkIGJ5IHRoZSBNYXN0cmEgcGx1Z2luLlwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgY29uZmlndXJlZElkID1cbiAgICAgIHR5cGVvZiBvcHRpb25zLnNhbmRib3hJZCA9PT0gXCJmdW5jdGlvblwiXG4gICAgICAgID8gb3B0aW9ucy5zYW5kYm94SWQoeyByZXF1ZXN0Q29udGV4dCB9KVxuICAgICAgICA6IG9wdGlvbnMuc2FuZGJveElkO1xuICAgIGNvbnN0IHNhbmRib3hJZCA9IGNvbmZpZ3VyZWRJZCA/PyBkZWZhdWx0U2FuZGJveElkKHdvcmtzcGFjZUlkLCB1c2VyLmlkKTtcbiAgICBjb25zdCBjbGllbnQgPVxuICAgICAgdHlwZW9mIG9wdGlvbnMuY2xpZW50ID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBvcHRpb25zLmNsaWVudCh7IHJlcXVlc3RDb250ZXh0IH0pXG4gICAgICAgIDogKG9wdGlvbnMuY2xpZW50ID8/IGNyZWF0ZVdvcmtzcGFjZUNsaWVudCgpKTtcbiAgICBjb25zdCB7XG4gICAgICBwcm92aWRlcjogX3Byb3ZpZGVyLFxuICAgICAgc2FuZGJveElkOiBfc2FuZGJveElkLFxuICAgICAgY2xpZW50OiBfY2xpZW50LFxuICAgICAgLi4uc2FuZGJveE9wdGlvbnNcbiAgICB9ID0gb3B0aW9ucztcbiAgICByZXR1cm4gbmV3IERhdGFicmlja3NTYW5kYm94KHtcbiAgICAgIC4uLnNhbmRib3hPcHRpb25zLFxuICAgICAgY2xpZW50LFxuICAgICAgc2FuZGJveElkLFxuICAgICAgZGlzcGxheU5hbWU6IG9wdGlvbnMuZGlzcGxheU5hbWUgPz8gYE1hc3RyYSAke3dvcmtzcGFjZU5hbWV9YCxcbiAgICB9KTtcbiAgfTtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFNhbmRib3hJZCh3b3Jrc3BhY2VJZDogc3RyaW5nLCB1c2VySWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAudXBkYXRlKG9iamVjdC50b1N0YWJsZUtleSh7IHdvcmtzcGFjZUlkLCB1c2VySWQgfSkpXG4gICAgLmRpZ2VzdChcImhleFwiKVxuICAgIC5zbGljZSgwLCAzMik7XG4gIHJldHVybiBgbWFzdHJhLSR7ZGlnZXN0fWA7XG59XG5cbmZ1bmN0aW9uIGlzU2FuZGJveCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtzcGFjZVNhbmRib3gge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICB2YWx1ZSAmJiB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgXCJpZFwiIGluIHZhbHVlICYmIFwicHJvdmlkZXJcIiBpbiB2YWx1ZSAmJiBcInN0YXR1c1wiIGluIHZhbHVlLFxuICApO1xufVxuXG5mdW5jdGlvbiBzYW5kYm94TmFtZShzZWxlY3Rpb246IFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoc2VsZWN0aW9uID09PSB1bmRlZmluZWQgfHwgc2VsZWN0aW9uID09PSBcIm1vbnR5XCIpIHJldHVybiBcIm1vbnR5XCI7XG4gIGlmIChzZWxlY3Rpb24gPT09IFwiZGF0YWJyaWNrc1wiKSByZXR1cm4gXCJkYXRhYnJpY2tzXCI7XG4gIGlmIChzZWxlY3Rpb24gPT09IGZhbHNlKSByZXR1cm4gXCJkaXNhYmxlZFwiO1xuICBpZiAodHlwZW9mIHNlbGVjdGlvbiA9PT0gXCJmdW5jdGlvblwiKSByZXR1cm4gXCJyZXNvbHZlclwiO1xuICByZXR1cm4gaXNTYW5kYm94KHNlbGVjdGlvbikgPyBzZWxlY3Rpb24ucHJvdmlkZXIgOiAoc2VsZWN0aW9uLnByb3ZpZGVyID8/IFwiZGF0YWJyaWNrc1wiKTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gd2hldGhlciB0aGUgcmVxdWVzdCB0b2tlbiBjYXJyaWVzIGEgc2NvcGUgdGhhdCBhbGxvd3Mgd29ya3NwYWNlXG4gKiBmaWxlIEFQSSBhY2Nlc3MgKGB3b3Jrc3BhY2VgIG9yIGBhbGwtYXBpc2Agb24ge0BsaW5rIE1BU1RSQV9TQ09QRVNfS0VZfSkuXG4gKi9cbmZ1bmN0aW9uIGhhc1dvcmtzcGFjZUZpbGVTY29wZShyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRva2VuLmluY2x1ZGVzQWNjZXNzVG9rZW5TY29wZShcbiAgICByZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9TQ09QRVNfS0VZKSxcbiAgICBXT1JLU1BBQ0VfRklMRV9TQ09QRVMsXG4gICk7XG59XG5cbi8qKiBSZXNvbHZlIHRoZSByZXF1ZXN0IGNsaWVudCBhbmQgYXV0aG9yaXphdGlvbi1zYWZlIGZpbGVzLWNhY2hlIHNjb3BlLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZUZpbGVzQ2FjaGVTY29wZShjb250ZXh0OiBXb3Jrc3BhY2VNb3VudENvbnRleHQpOiBQcm9taXNlPFxuICB8IHtcbiAgICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICAgICAgc2NvcGU6IEZpbGVzQ2FjaGVTY29wZTtcbiAgICB9XG4gIHwgdW5kZWZpbmVkXG4+IHtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSBjb250ZXh0LnJlcXVlc3RDb250ZXh0O1xuICBjb25zdCB1c2VyID0gcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfVVNFUl9LRVkpIGFzIFVzZXIgfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsaWVudCA9IHVzZXI/LmV4ZWN1dGlvbkNvbnRleHQuY2xpZW50IGFzIFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcbiAgaWYgKCFyZXF1ZXN0Q29udGV4dCB8fCAhdXNlciB8fCAhY2xpZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4ge1xuICAgIGNsaWVudCxcbiAgICBzY29wZToge1xuICAgICAgaG9zdDogKGF3YWl0IGNsaWVudC5jb25maWcuZ2V0SG9zdCgpKS50b1N0cmluZygpLFxuICAgICAgdXNlcktleTogcmVzb2x2ZVVzZXJLZXkocmVxdWVzdENvbnRleHQpLFxuICAgICAgLi4uKHByb2Nlc3MuZW52LkRBVEFCUklDS1NfV09SS1NQQUNFX0lEPy50cmltKClcbiAgICAgICAgPyB7IHdvcmtzcGFjZUlkOiBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1dPUktTUEFDRV9JRC50cmltKCkgfVxuICAgICAgICA6IHt9KSxcbiAgICB9LFxuICB9O1xufVxuXG4vKiogSm9pbiBvbmUgcmVsYXRpdmUgc2tpbGwgcm9vdCB0byBpdHMgYWN0dWFsIGNvbXBvc2l0ZSBtb3VudCBwYXRoLiAqL1xuZnVuY3Rpb24gbW91bnRlZFNraWxsUGF0aChtb3VudDogc3RyaW5nLCBza2lsbFJvb3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwb3NpeFBhdGguaXNBYnNvbHV0ZShza2lsbFJvb3QpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgU2tpbGwgcGF0aCBtdXN0IGJlIHJlbGF0aXZlIHRvIGl0cyBtb3VudDogJHtza2lsbFJvb3R9YCk7XG4gIH1cbiAgY29uc3Qgbm9ybWFsaXplZCA9IHBvc2l4UGF0aC5ub3JtYWxpemUoc2tpbGxSb290KTtcbiAgaWYgKCFub3JtYWxpemVkLm9rKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgU2tpbGwgcGF0aCBlc2NhcGVzIGl0cyBtb3VudDogJHtza2lsbFJvb3R9YCk7XG4gIH1cbiAgcmV0dXJuIHBvc2l4UGF0aC5qb2luKHBvc2l4UGF0aC5ub3JtYWxpemVSb290KG1vdW50KSwgbm9ybWFsaXplZC5wYXRoLnNsaWNlKDEpKTtcbn1cblxuLyoqIFJldHVybiB3aGV0aGVyIGEgRGF0YWJyaWNrcyBwYXRoIGJlbG9uZ3MgdG8gdGhlIHdyaXRhYmxlIFdvcmtzcGFjZSBuYW1lc3BhY2UuICovXG5mdW5jdGlvbiBpc1dvcmtzcGFjZVJvb3Qocm9vdDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwb3NpeFBhdGgubm9ybWFsaXplUm9vdChyb290KTtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgPT09IFwiL1dvcmtzcGFjZVwiIHx8IG5vcm1hbGl6ZWQuc3RhcnRzV2l0aChcIi9Xb3Jrc3BhY2UvXCIpO1xufVxuXG4vKipcbiAqIE1vdW50IHJlc29sdmVyIGZvciB0aGUgbmFtZWQgc2tpbGwgZm9sZGVycy5cbiAqXG4gKiBHYXRlcyBvbiB3b3Jrc3BhY2UgZmlsZSBzY29wZSAob3IgZGV2ZWxvcG1lbnQgbW9kZSksIHRoZW4gbW91bnRzIGV2ZXJ5XG4gKiBmb2xkZXIgd2hvc2UgbG9jYXRpb24gcmVzb2x2ZXMgZm9yIHRoaXMgcmVxdWVzdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNraWxsRm9sZGVyTW91bnRzKFxuICBza2lsbEZvbGRlcnM6IFJlY29yZDxzdHJpbmcsIFNraWxsRm9sZGVyT3B0aW9ucz4sXG4gIGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCxcbiAgZmlsZXNDYWNoZTogRmlsZXNDYWNoZUV4cG9ydHMgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB7XG4gIGNvbnN0IG1vdW50czogUmVjb3JkPHN0cmluZywgV29ya3NwYWNlRmlsZXN5c3RlbT4gPSB7fTtcbiAgY29uc3Qgc2tpbGxQYXRoczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgcmVxdWVzdENvbnRleHQgPSBjb250ZXh0LnJlcXVlc3RDb250ZXh0O1xuXG4gIGlmICghcmVxdWVzdENvbnRleHQgfHwgIXNob3VsZE1vdW50U2tpbGxGb2xkZXJzKHJlcXVlc3RDb250ZXh0KSkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsLWZvbGRlcnM6c2tpcHBlZFwiLCB7XG4gICAgICByZWFzb246ICFyZXF1ZXN0Q29udGV4dCA/IFwibm8tcmVxdWVzdC1jb250ZXh0XCIgOiBcIm1pc3Npbmctd29ya3NwYWNlLXNjb3BlXCIsXG4gICAgICBub2RlRW52OiBwcm9jZXNzLmVudi5OT0RFX0VOVixcbiAgICAgIHNjb3BlczogcmVxdWVzdENvbnRleHQ/LmdldChNQVNUUkFfU0NPUEVTX0tFWSksXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgbW91bnRzLCBza2lsbFBhdGhzIH07XG4gIH1cblxuICBjb25zdCBzY29wZWQgPSBhd2FpdCByZXNvbHZlRmlsZXNDYWNoZVNjb3BlKGNvbnRleHQpO1xuICBjb25zdCBjbGllbnQgPSBzY29wZWQ/LmNsaWVudDtcbiAgY29uc3QgZmlsZVN5c3RlbUNhY2hlID1cbiAgICBmaWxlc0NhY2hlICYmIHNjb3BlZCA/IGF3YWl0IGZpbGVzQ2FjaGUuZm9yU2NvcGUoc2NvcGVkLnNjb3BlKSA6IHVuZGVmaW5lZDtcblxuICBmb3IgKGNvbnN0IFtuYW1lLCBmb2xkZXJdIG9mIE9iamVjdC5lbnRyaWVzKHNraWxsRm9sZGVycykpIHtcbiAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlc29sdmVTa2lsbEZvbGRlckZpbGVzeXN0ZW0obmFtZSwgZm9sZGVyLCBjb250ZXh0LCB7XG4gICAgICBjbGllbnQsXG4gICAgICBmaWxlU3lzdGVtQ2FjaGUsXG4gICAgfSk7XG4gICAgaWYgKCFyZXNvbHZlZCkgY29udGludWU7XG4gICAgY29uc3QgbW91bnQgPSBmb2xkZXIubW91bnQgPz8gcmVzb2x2ZWQucm9vdCA/PyBgLyR7bmFtZX1gO1xuICAgIG1vdW50c1ttb3VudF0gPSByZXNvbHZlZC5maWxlc3lzdGVtO1xuICAgIGlmIChmb2xkZXIucmVhZGFibGUgIT09IGZhbHNlKSB7XG4gICAgICBza2lsbFBhdGhzLnB1c2goLi4uKGZvbGRlci5za2lsbHMgPz8gW1wiLlwiXSkubWFwKChwYXRoKSA9PiBtb3VudGVkU2tpbGxQYXRoKG1vdW50LCBwYXRoKSkpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcInNraWxsLWZvbGRlcnM6bW91bnRlZFwiLCB7XG4gICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhtb3VudHMpLFxuICAgIHNraWxsUGF0aHMsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgbW91bnRzLFxuICAgIHNraWxsUGF0aHMsXG4gIH07XG59XG5cbi8qKlxuICogUmVzb2x2ZSBvbmUgc2tpbGwgZm9sZGVyIHRvIGEgTWFzdHJhIGZpbGVzeXN0ZW0sIG9yIGB1bmRlZmluZWRgIHRvIHNraXAgaXRcbiAqIGZvciB0aGlzIHJlcXVlc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTa2lsbEZvbGRlckZpbGVzeXN0ZW0oXG4gIG5hbWU6IHN0cmluZyxcbiAgZm9sZGVyOiBTa2lsbEZvbGRlck9wdGlvbnMsXG4gIGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCxcbiAgY2FjaGU6IHtcbiAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudCB8IHVuZGVmaW5lZDtcbiAgICBmaWxlU3lzdGVtQ2FjaGU6IEZpbGVTeXN0ZW1DYWNoZSB8IHVuZGVmaW5lZDtcbiAgfSxcbik6IFByb21pc2U8XG4gIHwge1xuICAgICAgZmlsZXN5c3RlbTogV29ya3NwYWNlRmlsZXN5c3RlbTtcbiAgICAgIHJvb3Q/OiBzdHJpbmc7XG4gICAgfVxuICB8IHVuZGVmaW5lZFxuPiB7XG4gIGlmIChmb2xkZXIuZmlsZXN5c3RlbSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgZmlsZXN5c3RlbSA9IGF3YWl0IHJlc29sdmVTa2lsbEZvbGRlclZhbHVlKGZvbGRlci5maWxlc3lzdGVtLCBjb250ZXh0KTtcbiAgICByZXR1cm4gZmlsZXN5c3RlbVxuICAgICAgPyB7XG4gICAgICAgICAgZmlsZXN5c3RlbSxcbiAgICAgICAgfVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIH1cbiAgLy8gQSBwYXRoIG1vdW50IG5lZWRzIHRoZSByZXF1ZXN0J3MgT0JPIGNsaWVudCB0byByZWFjaCB0aGUgd29ya3NwYWNlLlxuICBpZiAoZm9sZGVyLnBhdGggPT09IHVuZGVmaW5lZCB8fCAhY2FjaGUuY2xpZW50KSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwic2tpbGwtZm9sZGVyOnNraXBwZWRcIiwge1xuICAgICAgbmFtZSxcbiAgICAgIHJlYXNvbjogZm9sZGVyLnBhdGggPT09IHVuZGVmaW5lZCA/IFwibm8tbG9jYXRpb25cIiA6IFwibWlzc2luZy1vYm8tY2xpZW50XCIsXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCByb290ID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChhd2FpdCByZXNvbHZlU2tpbGxGb2xkZXJWYWx1ZShmb2xkZXIucGF0aCwgY29udGV4dCkpO1xuICBpZiAoIXJvb3QpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHdyaXRhYmxlID0gZm9sZGVyLndyaXRhYmxlID8/IGlzV29ya3NwYWNlUm9vdChyb290KTtcbiAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCBkYXRhYnJpY2tzRmlsZXN5c3RlbShcbiAgICBjYWNoZS5jbGllbnQsXG4gICAgcm9vdCxcbiAgICAhd3JpdGFibGUsXG4gICAgZm9sZGVyLmNyZWF0ZVJvb3QgPz8gZm9sZGVyLndyaXRhYmxlID09PSB0cnVlLFxuICAgIGNhY2hlLmZpbGVTeXN0ZW1DYWNoZSxcbiAgICBmb2xkZXIucmVhZGFibGUgPT09IGZhbHNlID8gW10gOiAoZm9sZGVyLnNraWxscyA/PyBbXCIuXCJdKSxcbiAgICB7XG4gICAgICAuLi4oZm9sZGVyLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogZm9sZGVyLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAuLi4oZm9sZGVyLmRpc3BsYXlOYW1lID8geyBkaXNwbGF5TmFtZTogZm9sZGVyLmRpc3BsYXlOYW1lIH0gOiB7fSksXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIHJlc29sdmVkID8geyAuLi5yZXNvbHZlZCwgcm9vdCB9IDogdW5kZWZpbmVkO1xufVxuXG4vKiogUmVhZCBhIHtAbGluayBTa2lsbEZvbGRlclZhbHVlfSwgY2FsbGluZyBpdCB3aGVuIGl0IGlzIGEgcGVyLXJlcXVlc3QgcmVzb2x2ZXIuICovXG5mdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJWYWx1ZTxUPihcbiAgdmFsdWU6IFNraWxsRm9sZGVyVmFsdWU8VD4sXG4gIGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCxcbik6IFQgfCB1bmRlZmluZWQgfCBQcm9taXNlPFQgfCB1bmRlZmluZWQ+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiXG4gICAgPyAodmFsdWUgYXMgKGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCkgPT4gVCB8IHVuZGVmaW5lZCB8IFByb21pc2U8VCB8IHVuZGVmaW5lZD4pKGNvbnRleHQpXG4gICAgOiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBGaWxsIGluIGBpZGAgYW5kIGBuYW1lYCB3aGVuIGVpdGhlciBpcyBvbWl0dGVkIG9uIHtAbGluayBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zfS5cbiAqIFNsdWdpZmllcyBgbmFtZWAgaW50byBgaWRgOyB0b2tlbml6ZXMgYGlkYCBpbnRvIGEgZGlzcGxheSBgbmFtZWAuXG4gKi9cbmZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VJZGVudGl0eShvcHRpb25zOiBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zKToge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59IHtcbiAgbGV0IGlkID0gb3B0aW9ucy5pZDtcbiAgbGV0IG5hbWUgPSBvcHRpb25zLm5hbWU7XG4gIGlmICghaWQpIHtcbiAgICBpZCA9IG5hbWUgPyBzdHJpbmdVdGlscy50b1NsdWcobmFtZSkgOiBcIndvcmtzcGFjZVwiO1xuICB9XG4gIGlmICghbmFtZSkge1xuICAgIG5hbWUgPSBBcnJheS5mcm9tKHN0cmluZ1V0aWxzLnRva2VuaXplKGlkKSkuam9pbihcIiBcIik7XG4gIH1cbiAgcmV0dXJuIHsgaWQsIG5hbWUgfTtcbn1cblxuLyoqIENvbGxlY3QgdGhlIHNraWxsLWZvbGRlciByZXNvbHZlciBhbmQgYW55IGNhbGxlci1zdXBwbGllZCBvbmVzLiAqL1xuZnVuY3Rpb24gYnVpbGRNb3VudFJlc29sdmVycyhcbiAgc2tpbGxGb2xkZXJzOiBSZWNvcmQ8c3RyaW5nLCBTa2lsbEZvbGRlck9wdGlvbnM+LFxuICBtb3VudHM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSB8IHVuZGVmaW5lZCxcbiAgZmlsZXNDYWNoZTogRmlsZXNDYWNoZUV4cG9ydHMgfCB1bmRlZmluZWQsXG4pOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10ge1xuICBjb25zdCByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSA9IFtzY3JhdGNoTW91bnRSZXNvbHZlcigpXTtcbiAgY29uc3QgZm9sZGVyQ291bnQgPSBPYmplY3Qua2V5cyhza2lsbEZvbGRlcnMpLmxlbmd0aDtcbiAgaWYgKGZvbGRlckNvdW50ID4gMCkge1xuICAgIHJlc29sdmVycy5wdXNoKChjb250ZXh0KSA9PiByZXNvbHZlU2tpbGxGb2xkZXJNb3VudHMoc2tpbGxGb2xkZXJzLCBjb250ZXh0LCBmaWxlc0NhY2hlKSk7XG4gIH1cbiAgaWYgKG1vdW50cz8ubGVuZ3RoKSB7XG4gICAgcmVzb2x2ZXJzLnB1c2goLi4ubW91bnRzKTtcbiAgfVxuICBsb2dnZXIuZGVidWcoXCJtb3VudHM6cmVzb2x2ZXJzXCIsIHtcbiAgICBza2lsbEZvbGRlckNvdW50OiBmb2xkZXJDb3VudCxcbiAgICBjdXN0b21SZXNvbHZlckNvdW50OiBtb3VudHM/Lmxlbmd0aCA/PyAwLFxuICAgIHRvdGFsUmVzb2x2ZXJDb3VudDogcmVzb2x2ZXJzLmxlbmd0aCxcbiAgfSk7XG4gIHJldHVybiByZXNvbHZlcnM7XG59XG5cbi8qKiBDb250cmlidXRlIG9uZSBpc29sYXRlZCBsb2NhbCBzY3JhdGNoIGZpbGVzeXN0ZW0gYXQgYC90bXBgLiAqL1xuZnVuY3Rpb24gc2NyYXRjaE1vdW50UmVzb2x2ZXIoKTogV29ya3NwYWNlTW91bnRSZXNvbHZlciB7XG4gIHJldHVybiAoKSA9PiAoe1xuICAgIG1vdW50czogeyBbU0NSQVRDSF9NT1VOVF06IHNjcmF0Y2hGaWxlc3lzdGVtKCkgfSxcbiAgfSk7XG59XG5cbi8qKiBNb3VudCBzdGFydHVwLXByb3Zpc2lvbmVkIGxvY2FsIHNraWxsIHJvb3RzIGludG8gTWFzdHJhJ3Mgd29ya3NwYWNlIGZpbGVzeXN0ZW0uICovXG5mdW5jdGlvbiBsb2NhbFNraWxsTW91bnRSZXNvbHZlcnMocGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdKTogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdIHtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KHBhdGhzLm1hcCgocGF0aCkgPT4gcGF0aC50cmltKCkpLmZpbHRlcihCb29sZWFuKSldLm1hcCgocm9vdCkgPT4ge1xuICAgIGNvbnN0IG1vdW50ID0gcG9zaXhQYXRoLm5vcm1hbGl6ZVJvb3Qocm9vdCk7XG4gICAgY29uc3Qgc291cmNlID0gbmV3IExvY2FsRmlsZVN5c3RlbSh7XG4gICAgICByb290LFxuICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgICBjcmVhdGVSb290OiBmYWxzZSxcbiAgICB9KTtcbiAgICBjb25zdCBmaWxlc3lzdGVtID0gZmlsZXN5c3RlbXMoc291cmNlLCB7IHJlYWRPbmx5OiB0cnVlIH0pO1xuICAgIHJldHVybiAoKSA9PiAoe1xuICAgICAgbW91bnRzOiB7IFttb3VudF06IGZpbGVzeXN0ZW0gfSxcbiAgICAgIHNraWxsUGF0aHM6IFttb3VudF0sXG4gICAgfSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEdhdGUgc2tpbGwtZm9sZGVyIG1vdW50cyBvbiB0aGUgcmVxdWVzdCdzIHRva2VuLlxuICpcbiAqIEFsd2F5cyBhbGxvd3MgbW91bnRzIGluIGRldmVsb3BtZW50OyBpbiBvdGhlciBlbnZpcm9ubWVudHMgcmVxdWlyZXNcbiAqIHtAbGluayBoYXNXb3Jrc3BhY2VGaWxlU2NvcGV9LlxuICovXG5mdW5jdGlvbiBzaG91bGRNb3VudFNraWxsRm9sZGVycyhyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQpOiBib29sZWFuIHtcbiAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcImRldmVsb3BtZW50XCIpIHJldHVybiB0cnVlO1xuICByZXR1cm4gaGFzV29ya3NwYWNlRmlsZVNjb3BlKHJlcXVlc3RDb250ZXh0KTtcbn1cblxuLyoqIFJlYWQgdGhlIHRyaW1tZWQgT0JPIHVzZXIgZW1haWwgc3RhbXBlZCBvbiB7QGxpbmsgTUFTVFJBX1VTRVJfRU1BSUxfS0VZfS4gKi9cbmZ1bmN0aW9uIHJlc29sdmVTY29wZWRFbWFpbChyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChyZXF1ZXN0Q29udGV4dD8uZ2V0KE1BU1RSQV9VU0VSX0VNQUlMX0tFWSkpID8/IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBXcmFwIGEge0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtfSBhcyBhIE1hc3RyYSBmaWxlc3lzdGVtLiBNaXNzaW5nIG9yXG4gKiBpbmFjY2Vzc2libGUgcm9vdHMgcmV0dXJuIGB1bmRlZmluZWRgIHNvIHRoZSBpbmRlcGVuZGVudCBgL3RtcGAgbW91bnQgYW5kXG4gKiBhbnkgb3RoZXIgYWNjZXNzaWJsZSByb290cyByZW1haW4gdXNhYmxlLlxuICovXG5hc3luYyBmdW5jdGlvbiBkYXRhYnJpY2tzRmlsZXN5c3RlbShcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4gIHJvb3Q6IHN0cmluZyxcbiAgcmVhZE9ubHk6IGJvb2xlYW4gPSB0cnVlLFxuICBjcmVhdGVSb290OiBib29sZWFuID0gIXJlYWRPbmx5LFxuICBmaWxlU3lzdGVtQ2FjaGU/OiBGaWxlU3lzdGVtQ2FjaGUsXG4gIHNraWxsUGF0aHM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW10sXG4gIGFkYXB0ZXJPcHRpb25zOiBQaWNrPE1hc3RyYUZpbGVTeXN0ZW1BZGFwdGVyT3B0aW9ucywgXCJkZXNjcmlwdGlvblwiIHwgXCJkaXNwbGF5TmFtZVwiPiA9IHt9LFxuKTogUHJvbWlzZTxcbiAgfCB7XG4gICAgICBmaWxlc3lzdGVtOiBXb3Jrc3BhY2VGaWxlc3lzdGVtO1xuICAgIH1cbiAgfCB1bmRlZmluZWRcbj4ge1xuICBjb25zdCBpbml0aWFsQ2xpZW50ID0gd29ya3NwYWNlQ2xpZW50LnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KGNsaWVudCk7XG4gIGNvbnN0IGZzID0gbmV3IERhdGFicmlja3NGaWxlU3lzdGVtKHtcbiAgICBjbGllbnQ6ICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiB3b3Jrc3BhY2VDbGllbnQudG9MZWdhY3lXb3Jrc3BhY2VDbGllbnQoZ2V0RXhlY3V0aW9uQ29udGV4dCgpLmNsaWVudCk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgcmV0dXJuIGluaXRpYWxDbGllbnQ7XG4gICAgICB9XG4gICAgfSxcbiAgICByb290LFxuICAgIHJlYWRPbmx5LFxuICAgIGNyZWF0ZVJvb3QsXG4gIH0pO1xuICBjb25zdCBzb3VyY2UgPSBmaWxlU3lzdGVtQ2FjaGVcbiAgICA/IHNoYXJlZEZTLmNhY2hlKGZzLCBmaWxlU3lzdGVtQ2FjaGUsIHsgcmVhZEZpbGVQYXRoczogc2tpbGxQYXRocyB9KVxuICAgIDogZnM7XG4gIGNvbnN0IGZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtcyhzb3VyY2UsIHsgLi4uYWRhcHRlck9wdGlvbnMsIHJlYWRPbmx5IH0pO1xuICB0cnkge1xuICAgIGF3YWl0IGZpbGVzeXN0ZW0uaW5pdCgpO1xuICAgIGlmIChhd2FpdCBmaWxlc3lzdGVtLmV4aXN0cyhcIi5cIikpIHtcbiAgICAgIHJldHVybiB7IGZpbGVzeXN0ZW0gfTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImRhdGFicmlja3MtbW91bnQ6c2tpcHBlZFwiLCB7XG4gICAgICByb290LFxuICAgICAgcmVhZE9ubHksXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJ1biBldmVyeSBtb3VudCByZXNvbHZlciBmb3Igb25lIHJlcXVlc3QgYW5kIG1lcmdlIG1vdW50cyBwbHVzIHNraWxsIHBhdGhzLlxuICogTGF0ZXIgcmVzb2x2ZXJzIG92ZXJ3cml0ZSBtb3VudCBrZXlzIGZyb20gZWFybGllciBvbmVzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlQ29udHJpYnV0aW9uKFxuICByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbiAgY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0LFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4ge1xuICBjb25zdCBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+ID0ge307XG4gIGNvbnN0IHNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBbaW5kZXgsIHJlc29sdmVyXSBvZiByZXNvbHZlcnMuZW50cmllcygpKSB7XG4gICAgY29uc3QgY29udHJpYnV0aW9uID0gYXdhaXQgcmVzb2x2ZXIoY29udGV4dCk7XG4gICAgbG9nZ2VyLmRlYnVnKFwibW91bnRzOnJlc29sdmVyXCIsIHtcbiAgICAgIGluZGV4LFxuICAgICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhjb250cmlidXRpb24ubW91bnRzKSxcbiAgICAgIHNraWxsUGF0aHM6IGNvbnRyaWJ1dGlvbi5za2lsbFBhdGhzID8/IFtdLFxuICAgIH0pO1xuICAgIE9iamVjdC5hc3NpZ24obW91bnRzLCBjb250cmlidXRpb24ubW91bnRzKTtcbiAgICBpZiAoY29udHJpYnV0aW9uLnNraWxsUGF0aHM/Lmxlbmd0aCkge1xuICAgICAgc2tpbGxQYXRocy5wdXNoKC4uLmNvbnRyaWJ1dGlvbi5za2lsbFBhdGhzKTtcbiAgICB9XG4gIH1cblxuICBsb2dnZXIuZGVidWcoXCJtb3VudHM6bWVyZ2VkXCIsIHtcbiAgICBtb3VudEtleXM6IE9iamVjdC5rZXlzKG1vdW50cyksXG4gICAgc2tpbGxQYXRocyxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBtb3VudHMsXG4gICAgc2tpbGxQYXRocyxcbiAgfTtcbn1cblxuLyoqXG4gKiBEeW5hbWljIGZpbGVzeXN0ZW0gcmVzb2x2ZXIgcGFzc2VkIHRvIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfS5cbiAqXG4gKiBSZXR1cm5zIGEge0BsaW5rIENvbXBvc2l0ZUZpbGVzeXN0ZW19IHdoZW4gYW55IG1vdW50IHJlc29sdmVkOyBvdGhlcndpc2UgYVxuICogZnJlc2gge0BsaW5rIHNjcmF0Y2hGaWxlc3lzdGVtfSBzbyBNYXN0cmEgYWx3YXlzIGhhcyBhIHdyaXRhYmxlIGxvY2FsIHJvb3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3Jrc3BhY2VGaWxlc3lzdGVtKFxuICByZXNvbHZlQ29udHJpYnV0aW9uOiAoY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0KSA9PiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPixcbiAgY29udGV4dDogV29ya3NwYWNlTW91bnRDb250ZXh0LFxuICBmaWxlc0NhY2hlPzogRmlsZXNDYWNoZUV4cG9ydHMsXG4pOiBQcm9taXNlPFdvcmtzcGFjZUZpbGVzeXN0ZW0+IHtcbiAgY29uc3QgeyBtb3VudHMgfSA9IGF3YWl0IHJlc29sdmVDb250cmlidXRpb24oY29udGV4dCk7XG4gIGNvbnN0IG1vdW50S2V5cyA9IE9iamVjdC5rZXlzKG1vdW50cyk7XG4gIGlmIChtb3VudEtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiZmlsZXN5c3RlbTpzY3JhdGNoXCIsIHtcbiAgICAgIGhhc1JlcXVlc3RDb250ZXh0OiBCb29sZWFuKGNvbnRleHQucmVxdWVzdENvbnRleHQpLFxuICAgIH0pO1xuICAgIHJldHVybiBzY3JhdGNoRmlsZXN5c3RlbSgpO1xuICB9XG4gIGxvZ2dlci5kZWJ1ZyhcImZpbGVzeXN0ZW06Y29tcG9zaXRlXCIsIHsgbW91bnRLZXlzIH0pO1xuICBjb25zdCBsb2FkID0gKCkgPT4gbmV3IE1vdW50ZWRDb21wb3NpdGVGaWxlc3lzdGVtKHsgbW91bnRzIH0pO1xuICBpZiAoIWZpbGVzQ2FjaGUpIHJldHVybiBsb2FkKCk7XG4gIGNvbnN0IHNjb3BlZCA9IGF3YWl0IHJlc29sdmVGaWxlc0NhY2hlU2NvcGUoY29udGV4dCk7XG4gIGlmICghc2NvcGVkKSByZXR1cm4gbG9hZCgpO1xuICByZXR1cm4gZmlsZXNDYWNoZS5mb3JGaWxlU3lzdGVtKHNjb3BlZC5zY29wZSwgeyBwYXRoczogbW91bnRLZXlzIH0sIGxvYWQpO1xufVxuXG4vKipcbiAqIEV4cGFuZCBza2lsbCByb290cyBpbnRvIGNvbmNyZXRlIHNraWxsIGRpcmVjdG9yaWVzIGFuZCBrZWVwIHRoZSBmaXJzdFxuICogc2FtZS1uYW1lZCBkaXJlY3RvcnkuIE1hc3RyYSBzdGlsbCBvd25zIHBhcnNpbmcsIGluZGV4aW5nLCBhbmQgcmVmcmVzaGVzLFxuICogd2hpbGUgb3JnYW5pemF0aW9uIHJvb3RzIHJldGFpbiBwcmVjZWRlbmNlIG92ZXIgcGVyc29uYWwgcm9vdHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEaXN0aW5jdFNraWxsUGF0aHMoXG4gIGZpbGVzeXN0ZW06IFdvcmtzcGFjZUZpbGVzeXN0ZW0sXG4gIHJvb3RzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHJvb3Qgb2Ygcm9vdHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZpbGVzeXN0ZW0ucmVhZGRpcihyb290KTtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS50eXBlID09PSBcImZpbGVcIiAmJiBlbnRyeS5uYW1lID09PSBcIlNLSUxMLm1kXCIpKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBwb3NpeFBhdGguYmFzZW5hbWUocm9vdCk7XG4gICAgICAgIGlmICghc2VsZWN0ZWQuaGFzKG5hbWUpKSBzZWxlY3RlZC5zZXQobmFtZSwgcm9vdCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyeS50eXBlICE9PSBcImRpcmVjdG9yeVwiIHx8IHNlbGVjdGVkLmhhcyhlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICAgIHNlbGVjdGVkLnNldChlbnRyeS5uYW1lLCBwb3NpeFBhdGguam9pbihyb290LCBlbnRyeS5uYW1lKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsLXJvb3Q6c2tpcHBlZFwiLCB7XG4gICAgICAgIHJvb3QsXG4gICAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnJvciksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5zZWxlY3RlZC52YWx1ZXMoKV07XG59XG5cbi8qKiBNZW1vaXplIG9uZSBjb21wbGV0ZSBtb3VudCBjb250cmlidXRpb24gZm9yIGVhY2ggcmVxdWVzdCBjb250ZXh0LiAqL1xuZnVuY3Rpb24gY29udHJpYnV0aW9uUmVzb2x2ZXIoXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuKTogKGNvbnRleHQ6IFdvcmtzcGFjZU1vdW50Q29udGV4dCkgPT4gUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4ge1xuICBjb25zdCBzY29wZWQgPSBuZXcgV2Vha01hcDxSZXF1ZXN0Q29udGV4dCwgUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4+KCk7XG4gIGxldCB1bnNjb3BlZDogUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4gfCB1bmRlZmluZWQ7XG4gIHJldHVybiAoY29udGV4dCkgPT4ge1xuICAgIGlmICghY29udGV4dC5yZXF1ZXN0Q29udGV4dCkge1xuICAgICAgdW5zY29wZWQgPz89IHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24ocmVzb2x2ZXJzLCBjb250ZXh0KTtcbiAgICAgIHJldHVybiB1bnNjb3BlZDtcbiAgICB9XG4gICAgY29uc3QgZXhpc3RpbmcgPSBzY29wZWQuZ2V0KGNvbnRleHQucmVxdWVzdENvbnRleHQpO1xuICAgIGlmIChleGlzdGluZykgcmV0dXJuIGV4aXN0aW5nO1xuICAgIGNvbnN0IHBlbmRpbmcgPSByZXNvbHZlV29ya3NwYWNlQ29udHJpYnV0aW9uKHJlc29sdmVycywgY29udGV4dCk7XG4gICAgc2NvcGVkLnNldChjb250ZXh0LnJlcXVlc3RDb250ZXh0LCBwZW5kaW5nKTtcbiAgICByZXR1cm4gcGVuZGluZztcbiAgfTtcbn1cbiJdfQ==
726
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya3NwYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3Jrc3BhY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7R0FZRztBQUVILE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRS9FLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxFQUNMLFVBQVUsSUFBSSxnQkFBZ0IsR0FHL0IsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRCxPQUFPLEVBQUUsS0FBSyxFQUF1QixNQUFNLGlCQUFpQixDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDckYsT0FBTyxFQUNMLEVBQUUsSUFBSSxRQUFRLEVBQ2QsU0FBUyxFQUtULGdCQUFnQixHQUNqQixNQUFNLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFDTCxTQUFTLEdBT1YsTUFBTSx3QkFBd0IsQ0FBQztBQUVoQyxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixlQUFlLEVBQ2YsY0FBYyxHQUVmLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsMEJBQTBCLEdBRTNCLE1BQU0sa0JBQWtCLENBQUM7QUFD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T0FBTyxRQUFRLENBQUM7UUFDOUIsTUFBTSxPQUFPLEdBQUcsNEJBQTRCLENBQUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pFLE1BQU0sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1QyxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBNYXN0cmEgd29ya3NwYWNlIGZhY3RvcnkgZm9yIERhdGFicmlja3MgQXBwcy5cbiAqXG4gKiBCdWlsZHMgbmF0aXZlIE1hc3RyYSB3b3Jrc3BhY2UgY29uZmlndXJhdGlvbiBmcm9tIERhdGFicmlja3MgcGF0aHMuIFBhdGhzXG4gKiBtb3VudCBhdCB0aGUgc2FtZSBwYXRoIGJ5IGRlZmF1bHQsIGB+YCByZXNvbHZlcyB0byB0aGUgY3VycmVudCB1c2VyJ3NcbiAqIERhdGFicmlja3Mgd29ya3NwYWNlIGhvbWUsIGFuZCBgL3RtcFsvc3VicGF0aF1gIHJlc29sdmVzIHRvIHN0YWJsZVxuICogdXNlci1zY29wZWQgc3RvcmFnZSB1bmRlciB0aGUgaG9zdCdzIGVwaGVtZXJhbCB0ZW1wIGRpcmVjdG9yeS5cbiAqXG4gKiBEYXRhYnJpY2tzIG1vdW50cyB1c2UgYEBkYngtdG9vbHMvZGF0YWJyaWNrc2Age0BsaW5rIERhdGFicmlja3NGaWxlU3lzdGVtfVxuICogd3JhcHBlZCBieSB7QGxpbmsgZmlsZXN5c3RlbXN9OyBpbmFjY2Vzc2libGUgcm9vdHMgYXJlIHNraXBwZWQgaW5kZXBlbmRlbnRseS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJub2RlOmNyeXB0b1wiO1xuaW1wb3J0IHsgdG1wZGlyIH0gZnJvbSBcIm5vZGU6b3NcIjtcbmltcG9ydCB7IGpvaW4gfSBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uRXJyb3IsIGNyZWF0ZVdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgYXBwa2l0LCBwbHVnaW5SZWdpc3RyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgZmlsZXNDYWNoZSBhcyBmaWxlc0NhY2hlUGx1Z2luLFxuICB0eXBlIEZpbGVzQ2FjaGVFeHBvcnRzLFxuICB0eXBlIEZpbGVzQ2FjaGVTY29wZSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0L2ZpbGVzLWNhY2hlXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzRmlsZVN5c3RlbSwgd29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvZGF0YWJyaWNrc1wiO1xuaW1wb3J0IHsgTG9jYWxGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvZnNcIjtcbmltcG9ydCB7IG1hdGNoLCB0eXBlIFBhdGhNYXRjaElucHV0IH0gZnJvbSBcIkBkYngtdG9vbHMvcGF0aFwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzLCB0b2tlbiB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBmcyBhcyBzaGFyZWRGUyxcbiAgcG9zaXhQYXRoLFxuICB0eXBlIENhY2hlYWJsZUZpbGVTeXN0ZW1PcGVyYXRpb24sXG4gIHR5cGUgRmlsZVN5c3RlbSxcbiAgdHlwZSBGaWxlU3lzdGVtQ2FjaGUsXG4gIHR5cGUgRmlsZVN5c3RlbUNhY2hlT3B0aW9ucyxcbiAgTWVtb3J5RmlsZVN5c3RlbSxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWZzXCI7XG5pbXBvcnQgdHlwZSB7IFJlcXVlc3RDb250ZXh0IH0gZnJvbSBcIkBtYXN0cmEvY29yZS9yZXF1ZXN0LWNvbnRleHRcIjtcbmltcG9ydCB7XG4gIFdvcmtzcGFjZSxcbiAgdHlwZSBTa2lsbHNSZXNvbHZlcixcbiAgdHlwZSBXb3Jrc3BhY2VDb25maWcsXG4gIHR5cGUgV29ya3NwYWNlRmlsZXN5c3RlbSxcbiAgdHlwZSBXb3Jrc3BhY2VTYW5kYm94LFxuICB0eXBlIFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlcixcbiAgdHlwZSBXb3Jrc3BhY2VUb29sc0NvbmZpZyxcbn0gZnJvbSBcIkBtYXN0cmEvY29yZS93b3Jrc3BhY2VcIjtcblxuaW1wb3J0IHtcbiAgTUFTVFJBX1NDT1BFU19LRVksXG4gIE1BU1RSQV9VU0VSX0VNQUlMX0tFWSxcbiAgTUFTVFJBX1VTRVJfS0VZLFxuICByZXNvbHZlVXNlcktleSxcbiAgdHlwZSBVc2VyLFxufSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7XG4gIGZpbGVzeXN0ZW1zLFxuICBNb3VudGVkQ29tcG9zaXRlRmlsZXN5c3RlbSxcbiAgdHlwZSBNYXN0cmFGaWxlU3lzdGVtQWRhcHRlck9wdGlvbnMsXG59IGZyb20gXCIuL2ZpbGVzeXN0ZW1zLnRzXCI7XG5pbXBvcnQgeyBNb250eVNhbmRib3ggfSBmcm9tIFwiLi9tb250eS1zYW5kYm94LnRzXCI7XG5pbXBvcnQgeyBEYXRhYnJpY2tzU2FuZGJveCwgdHlwZSBEYXRhYnJpY2tzV29ya3NwYWNlU2FuZGJveE9wdGlvbnMgfSBmcm9tIFwiLi9zYW5kYm94LnRzXCI7XG5pbXBvcnQgeyBPUkdBTklaQVRJT05fQVNTSVNUQU5UX1BBVEgsIHBlcnNvbmFsV29ya3NwYWNlUGF0aCB9IGZyb20gXCIuL3NraWxsLXBhdGhzLnRzXCI7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25zdGFudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBPQXV0aCBzY29wZXMgdGhhdCBnYXRlIERhdGFicmlja3Mgd29ya3NwYWNlIGZpbGUgbW91bnRzLiAqL1xuY29uc3QgV09SS1NQQUNFX0ZJTEVfU0NPUEVTID0gW1wid29ya3NwYWNlXCIsIFwid29ya3NwYWNlLndvcmtzcGFjZVwiLCBcImFsbC1hcGlzXCJdIGFzIGNvbnN0O1xuY29uc3QgU0NSQVRDSF9NT1VOVCA9IFwiL3RtcFwiO1xuY29uc3QgQ0FDSEVBQkxFX0ZJTEVTWVNURU1fT1BFUkFUSU9OUyA9IFtcbiAgXCJleGlzdHNcIixcbiAgXCJyZWFkRmlsZVwiLFxuICBcInJlYWRkaXJcIixcbiAgXCJzdGF0XCIsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSBDYWNoZWFibGVGaWxlU3lzdGVtT3BlcmF0aW9uW107XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvd29ya3NwYWNlc1wiKTtcbmxldCB3b3Jrc3BhY2VTb3VyY2VTZXF1ZW5jZSA9IDA7XG5jb25zdCBkYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyA9IG5ldyBXZWFrTWFwPFdvcmtzcGFjZSwgRGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnM+KCk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBQZXItcmVxdWVzdCBjb250ZXh0IGZvciBtb3VudCBhbmQgc2tpbGwtZm9sZGVyIHJlc29sdmVycy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQge1xuICByZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0O1xufVxuXG4vKipcbiAqIE9uZSBEYXRhYnJpY2tzIHBhdGggbW91bnRlZCBpbnRvIGEgTWFzdHJhIHdvcmtzcGFjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aE9wdGlvbnMge1xuICAvKiogQWJzb2x1dGUgRGF0YWJyaWNrcyBwYXRoIG9yIGB+YCBzaG9ydGN1dCBmb3IgdGhlIGN1cnJlbnQgdXNlcidzIHdvcmtzcGFjZSBob21lLiAqL1xuICBwYXRoOiBzdHJpbmc7XG4gIC8qKiBIdW1hbi1mcmllbmRseSBtb3VudCBuYW1lIHNob3duIGluIGZpbGVzeXN0ZW0gbGlzdGluZ3MuICovXG4gIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICAvKiogTW91bnQgZGVzY3JpcHRpb24gc2hvd24gaW4gZmlsZXN5c3RlbSBsaXN0aW5ncyBhbmQgd29ya3NwYWNlIGluc3RydWN0aW9ucy4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBTY2FuIHRoaXMgbW91bnQgZm9yIGBTS0lMTC5tZGAgZmlsZXMuIERlZmF1bHRzIHRvIGB0cnVlYDsgYGZhbHNlYCBtb3VudHNcbiAgICogdGhlIGxvY2F0aW9uIGZvciBmaWxlIHRvb2xzIHdpdGhvdXQgYWRkaW5nIGl0IHRvIHNraWxsIGRpc2NvdmVyeS5cbiAgICovXG4gIHJlYWRhYmxlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFNraWxsIHJvb3RzIHJlbGF0aXZlIHRvIHRoaXMgZmlsZXN5c3RlbSByb290LiBEZWZhdWx0cyB0byBgW1wiLlwiXWAuXG4gICAqIEVhY2ggcGF0aCBpcyBqb2luZWQgdG8gdGhlIGFjdHVhbCBtb3VudCBwYXRoIGJlZm9yZSBNYXN0cmEgc2NhbnMgaXQuXG4gICAqL1xuICBza2lsbHM/OiByZWFkb25seSBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIEFsbG93IHdyaXRlIGF0dGVtcHRzIHRvIGEge0BsaW5rIHBhdGh9IG1vdW50LiBEZWZhdWx0cyB0byBgdHJ1ZWAgZm9yXG4gICAqIGAvV29ya3NwYWNlYCByb290cyBhbmQgYGZhbHNlYCBlbHNld2hlcmUuIERhdGFicmlja3MgcGVybWlzc2lvbnMgc3RpbGxcbiAgICogZGV0ZXJtaW5lIHdoZXRoZXIgZWFjaCBtdXRhdGlvbiBzdWNjZWVkcy5cbiAgICovXG4gIHdyaXRhYmxlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIENyZWF0ZSBhIHdyaXRhYmxlIHtAbGluayBwYXRofSByb290IHdoZW4gbWlzc2luZy4gRGVmYXVsdHMgdG9cbiAgICoge0BsaW5rIHdyaXRhYmxlfTsgc2V0IGBmYWxzZWAgZm9yIHByZS1leGlzdGluZyByb290cyB3aXRoIGNvbmRpdGlvbmFsIGFjY2Vzcy5cbiAgICovXG4gIGNyZWF0ZVJvb3Q/OiBib29sZWFuO1xuICAvKiogTW91bnQgcG9pbnQgaW4gdGhlIGNvbXBvc2l0ZSBuYW1lc3BhY2UuIERhdGFicmlja3MgcGF0aHMgZGVmYXVsdCB0byB0aGVpciBhY3R1YWwgcm9vdC4gKi9cbiAgbW91bnQ/OiBzdHJpbmc7XG59XG5cbi8qKiBTdHJpbmcgc2hvcnRoYW5kIG9yIGZ1bGwgb3B0aW9ucyBmb3Igb25lIERhdGFicmlja3Mgd29ya3NwYWNlIHBhdGguICovXG5leHBvcnQgdHlwZSBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aCA9IHN0cmluZyB8IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoT3B0aW9ucztcblxuLyoqIEZpeGVkIG9yIHJlcXVlc3QtZGVwZW5kZW50IERhdGFicmlja3MgcGF0aCBlbnRyeS4gKi9cbmV4cG9ydCB0eXBlIERhdGFicmlja3NXb3Jrc3BhY2VQYXRoVmFsdWUgPVxuICB8IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoXG4gIHwgZmFsc2VcbiAgfCAoKFxuICAgICAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gICAgKSA9PlxuICAgICAgfCBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aFxuICAgICAgfCBmYWxzZVxuICAgICAgfCB1bmRlZmluZWRcbiAgICAgIHwgUHJvbWlzZTxEYXRhYnJpY2tzV29ya3NwYWNlUGF0aCB8IGZhbHNlIHwgdW5kZWZpbmVkPik7XG5cbi8qKiBPcGVyYXRpb25zIGFuZCBwYXRoIGdsb2JzIGNhY2hlZCBieSB0aGUgRGF0YWJyaWNrcyBmaWxlc3lzdGVtIHNob3J0Y3V0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXIge1xuICAvKiogQ2FjaGVkIGZpbGVzeXN0ZW0gb3BlcmF0aW9ucy4gT21pdCBmb3IgYGV4aXN0c2AsIGByZWFkRmlsZWAsIGByZWFkZGlyYCwgYW5kIGBzdGF0YC4gKi9cbiAgb3BlcmF0aW9ucz86IENhY2hlYWJsZUZpbGVTeXN0ZW1PcGVyYXRpb24gfCByZWFkb25seSBDYWNoZWFibGVGaWxlU3lzdGVtT3BlcmF0aW9uW107XG4gIC8qKiBBYnNvbHV0ZSBvciByb290LXJlbGF0aXZlIGdsb2JzIGFuZCBwcmVkaWNhdGVzLiBgfmAgZXhwYW5kcyBwZXIgcmVxdWVzdC4gKi9cbiAgcGF0aHM/OiBQYXRoTWF0Y2hJbnB1dCB8IHJlYWRvbmx5IFBhdGhNYXRjaElucHV0W107XG59XG5cbi8qKiBGaXhlZCBvciByZXF1ZXN0LWRlcGVuZGVudCBmaWxlc3lzdGVtIGNhY2hlIHNlbGVjdGlvbi4gKi9cbmV4cG9ydCB0eXBlIERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZSA9XG4gIHwgYm9vbGVhblxuICB8IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlclxuICB8IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcltdXG4gIHwgKChcbiAgICAgIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuICAgICkgPT5cbiAgICAgIHwgYm9vbGVhblxuICAgICAgfCBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXJcbiAgICAgIHwgcmVhZG9ubHkgRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlRmlsdGVyW11cbiAgICAgIHwgdW5kZWZpbmVkXG4gICAgICB8IFByb21pc2U8XG4gICAgICAgICAgfCBib29sZWFuXG4gICAgICAgICAgfCBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGVGaWx0ZXJcbiAgICAgICAgICB8IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcltdXG4gICAgICAgICAgfCB1bmRlZmluZWRcbiAgICAgICAgPik7XG5cbi8qKiBNb3VudCBtYXAgcGx1cyBvcHRpb25hbCBNYXN0cmEgc2tpbGwgc2NhbiByb290cyByZXNvbHZlZCBmb3Igb25lIHJlcXVlc3QuICovXG5pbnRlcmZhY2UgV29ya3NwYWNlTW91bnRDb250cmlidXRpb24ge1xuICBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+O1xuICAvKiogUGF0aHMgd2l0aGluIHRoZSBjb21wb3NpdGUgbmFtZXNwYWNlIHdoZXJlIGBTS0lMTC5tZGAgZmlsZXMgYXJlIHNjYW5uZWQuICovXG4gIHNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn1cblxuLyoqIEludGVybmFsIGZpbGVzeXN0ZW0gY29udHJpYnV0aW9uIHJlc29sdmVyLiAqL1xudHlwZSBXb3Jrc3BhY2VNb3VudFJlc29sdmVyID0gKFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbikgPT4gV29ya3NwYWNlTW91bnRDb250cmlidXRpb24gfCBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPjtcblxuLyoqXG4gKiBTYW5kYm94IHNlbGVjdGlvbiBmb3Ige0BsaW5rIGRhdGFicmlja3NXb3Jrc3BhY2V9LiBNb250eSBpcyB0aGUgZGVmYXVsdDtcbiAqIGBmYWxzZWAgZGlzYWJsZXMgY29tbWFuZCBleGVjdXRpb24sIGFuZCBhIE1hc3RyYSBwcm92aWRlciBvciByZXNvbHZlciBpcyBhblxuICogZXhwbGljaXQgcmVwbGFjZW1lbnQuXG4gKi9cbmV4cG9ydCB0eXBlIFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb24gPVxuICB8IGZhbHNlXG4gIHwgXCJkYXRhYnJpY2tzXCJcbiAgfCBcIm1vbnR5XCJcbiAgfCBEYXRhYnJpY2tzV29ya3NwYWNlU2FuZGJveE9wdGlvbnNcbiAgfCBXb3Jrc3BhY2VTYW5kYm94XG4gIHwgV29ya3NwYWNlU2FuZGJveFJlc29sdmVyO1xuXG4vKiogTmF0aXZlIE1hc3RyYSB3b3Jrc3BhY2Ugb3B0aW9ucyBwbHVzIERhdGFicmlja3MgcGF0aCBzaG9ydGN1dHMuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zIGV4dGVuZHMgT21pdDxcbiAgV29ya3NwYWNlQ29uZmlnLFxuICBcImZpbGVzeXN0ZW1cIiB8IFwibW91bnRzXCIgfCBcInNhbmRib3hcIiB8IFwic2tpbGxzXCJcbj4ge1xuICAvKipcbiAgICogU3RhcnQgZnJvbSB7QGxpbmsgREVGQVVMVF9EQVRBQlJJQ0tTX1dPUktTUEFDRV9QQVRIU30uIERlZmF1bHRzIHRvIGB0cnVlYC5cbiAgICovXG4gIGFzc2lzdGFudFBhdGhzPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIERhdGFicmlja3MgcGF0aHMgYXBwZW5kZWQgYWZ0ZXIgdGhlIGRlZmF1bHRzLiBBIHN0cmluZyBpcyBzaG9ydGhhbmQgZm9yXG4gICAqIGB7IHBhdGggfWA7IGEgcmVzb2x2ZXIgbWF5IHJldHVybiBlaXRoZXIgZm9ybSBwZXIgcmVxdWVzdC5cbiAgICovXG4gIHBhdGhzPzogcmVhZG9ubHkgRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhWYWx1ZVtdO1xuICAvKiogTmF0aXZlIE1hc3RyYSBmaWxlc3lzdGVtcyBjb21wb3NlZCBiZXNpZGUgdGhlIERhdGFicmlja3MgcGF0aHMuICovXG4gIG1vdW50cz86IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+O1xuICAvKiogUmVwbGFjZSB0aGUgYXV0by1idWlsdCBkeW5hbWljIHNraWxscyByZXNvbHZlci4gKi9cbiAgc2tpbGxzPzogU2tpbGxzUmVzb2x2ZXI7XG4gIC8qKiBGaWxlc3lzdGVtIGNhY2hlIGZpbHRlcnMuIElnbm9yZWQgd2hlbiB0aGUgQXBwS2l0IGZpbGVzLWNhY2hlIHBsdWdpbiBpcyBhYnNlbnQuICovXG4gIGNhY2hlPzogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlO1xuICAvKiogQXBwS2l0IHBsdWdpbiBjb250ZXh0IHVzZWQgdG8gZGlzY292ZXIgb3B0aW9uYWwgc2libGluZyBjYXBhYmlsaXRpZXMuICovXG4gIHBsdWdpbkNvbnRleHQ/OiBwbHVnaW5SZWdpc3RyeS5QbHVnaW5Db250ZXh0TGlrZTtcbiAgLyoqXG4gICAqIENvbW1hbmQgc2FuZGJveC4gRGVmYXVsdHMgdG8gTW9udHkuIFBhc3MgYFwiZGF0YWJyaWNrc1wiYCBvciBhbiBvcHRpb25zXG4gICAqIG9iamVjdCBmb3IgRGF0YWJyaWNrcyBTYW5kYm94LCBgZmFsc2VgIHRvIGRpc2FibGUgY29tbWFuZCBleGVjdXRpb24sIG9yIGFuXG4gICAqIGV4cGxpY2l0IE1hc3RyYSBzYW5kYm94L3Byb3ZpZGVyIHJlc29sdmVyLlxuICAgKi9cbiAgc2FuZGJveD86IFdvcmtzcGFjZVNhbmRib3hTZWxlY3Rpb247XG4gIC8qKlxuICAgKiBFeHRyYSBMT0NBTCBza2lsbCByb290cyBtb3VudGVkIHJlYWQtb25seSBmb3IgZXZlcnkgcmVxdWVzdCdzIHNraWxsIGRpc2NvdmVyeS5cbiAgICogVXNlZCBieSB0aGUgcGx1Z2luIHRvIHN1cmZhY2UgcmVtb3RlIHNraWxscyBwcm92aXNpb25lZCB0byBhIGxvY2FsIHRlbXBcbiAgICogZGlyIGF0IHN0YXJ0dXAgKHNlZSBgcmVtb3RlLXNraWxscy50c2ApLiBEYXRhYnJpY2tzLWhvc3RlZCByZW1vdGUgc2tpbGxzXG4gICAqIG5lZWQgbm8gZW50cnkgaGVyZSAtIHRoZXkgbGFuZCBpbiB0aGUgQXNzaXN0YW50IHRyZWUgdGhlIGJ1aWx0LWluIG1vdW50XG4gICAqIGFscmVhZHkgc2NhbnMuXG4gICAqL1xuICBleHRyYVNraWxsUGF0aHM/OiBzdHJpbmdbXTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZWZhdWx0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRGVmYXVsdCBEYXRhYnJpY2tzIHBhdGhzIGZvciBzaGFyZWQgYW5kIGN1cnJlbnQtdXNlciBBZ2VudCBTa2lsbHMuXG4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0RBVEFCUklDS1NfV09SS1NQQUNFX1BBVEhTOiByZWFkb25seSBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aE9wdGlvbnNbXSA9IFtcbiAge1xuICAgIHBhdGg6IE9SR0FOSVpBVElPTl9BU1NJU1RBTlRfUEFUSCxcbiAgICByZWFkYWJsZTogdHJ1ZSxcbiAgICBza2lsbHM6IFtcInNraWxsc1wiXSxcbiAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICBjcmVhdGVSb290OiBmYWxzZSxcbiAgfSxcbiAge1xuICAgIHBhdGg6IFwiflwiLFxuICAgIHJlYWRhYmxlOiB0cnVlLFxuICAgIHNraWxsczogW1wiLmFzc2lzdGFudC9za2lsbHNcIl0sXG4gICAgd3JpdGFibGU6IHRydWUsXG4gICAgY3JlYXRlUm9vdDogZmFsc2UsXG4gIH0sXG5dO1xuXG4vKipcbiAqIENyZWF0ZSBhIE1hc3RyYSB7QGxpbmsgV29ya3NwYWNlfSB3aXRoIHBlci1yZXF1ZXN0IERhdGFicmlja3MgbW91bnRzLlxuICpcbiAqIEBleGFtcGxlIERlZmF1bHQgRGF0YWJyaWNrcyBwYXRoc1xuICogYGBgdHNcbiAqIGRhdGFicmlja3NXb3Jrc3BhY2UoKVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgVXNlIG9ubHkgZXhwbGljaXQgcGF0aHNcbiAqIGBgYHRzXG4gKiBkYXRhYnJpY2tzV29ya3NwYWNlKHtcbiAqICAgYXNzaXN0YW50UGF0aHM6IGZhbHNlLFxuICogICBwYXRoczogW1wifi9wcm9qZWN0XCIsIFwiL3RtcC9wcm9qZWN0XCIsIFwiL1ZvbHVtZXMvbWFpbi9kZWZhdWx0L2RhdGFcIl0sXG4gKiB9KVxuICogYGBgXG4gKlxuICogQGV4YW1wbGUgQnVpbGQgYSBzdGFuZGFyZCBNYXN0cmEgd29ya3NwYWNlIHlvdXJzZWxmXG4gKiBgYGB0c1xuICogbmV3IFdvcmtzcGFjZSh7XG4gKiAgIC4uLmRhdGFicmlja3NXb3Jrc3BhY2VDb25maWcoeyBwYXRoczogW1wifi9wcm9qZWN0XCJdIH0pLFxuICogICBzYW5kYm94OiBteVNhbmRib3gsXG4gKiB9KVxuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkYXRhYnJpY2tzV29ya3NwYWNlQ29uZmlnKFxuICBvcHRpb25zOiBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyA9IHt9LFxuKTogV29ya3NwYWNlQ29uZmlnIHtcbiAgY29uc3QgeyBpZCwgbmFtZSB9ID0gcmVzb2x2ZVdvcmtzcGFjZUlkZW50aXR5KG9wdGlvbnMpO1xuICBjb25zdCBmaWxlc3lzdGVtU291cmNlS2V5ID0gYCR7aWR9OiR7Kyt3b3Jrc3BhY2VTb3VyY2VTZXF1ZW5jZX1gO1xuICBjb25zdCBwYXRocyA9IHJlc29sdmVEYXRhYnJpY2tzV29ya3NwYWNlUGF0aHMob3B0aW9ucyk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRQYXRocyA9IHBhdGhzLmxlbmd0aDtcbiAgY29uc3QgZXh0cmFTa2lsbFBhdGhzID0gb3B0aW9ucy5leHRyYVNraWxsUGF0aHMgPz8gW107XG4gIGNvbnN0IGZpbGVzQ2FjaGUgPSBwbHVnaW5SZWdpc3RyeS5pbnN0YW5jZShvcHRpb25zLnBsdWdpbkNvbnRleHQsIGZpbGVzQ2FjaGVQbHVnaW4pPy5leHBvcnRzKCk7XG4gIGNvbnN0IGNvbmZpZ3VyZWRDYWNoZSA9IG9wdGlvbnMuY2FjaGU7XG4gIGNvbnN0IG1vdW50RmlsZXNDYWNoZSA9IGNvbmZpZ3VyZWRDYWNoZSA9PT0gZmFsc2UgPyB1bmRlZmluZWQgOiBmaWxlc0NhY2hlO1xuICBjb25zdCByZXRhaW5GaWxlc3lzdGVtU291cmNlID1cbiAgICBtb3VudEZpbGVzQ2FjaGUgIT09IHVuZGVmaW5lZCAmJlxuICAgIHR5cGVvZiBjb25maWd1cmVkQ2FjaGUgIT09IFwiZnVuY3Rpb25cIiAmJlxuICAgIHBhdGhzLmV2ZXJ5KChwYXRoKSA9PiB0eXBlb2YgcGF0aCAhPT0gXCJmdW5jdGlvblwiKTtcbiAgY29uc3QgcmVzb2x2ZXJzID0gYnVpbGRNb3VudFJlc29sdmVycyhcbiAgICBwYXRocyxcbiAgICBvcHRpb25zLm1vdW50cyxcbiAgICBsb2NhbFNraWxsTW91bnRSZXNvbHZlcnMoZXh0cmFTa2lsbFBhdGhzKSxcbiAgICBtb3VudEZpbGVzQ2FjaGUsXG4gICAgY29uZmlndXJlZENhY2hlLFxuICApO1xuICBjb25zdCByZXNvbHZlQ29udHJpYnV0aW9uID0gY29udHJpYnV0aW9uUmVzb2x2ZXIocmVzb2x2ZXJzKTtcbiAgY29uc3QgcmVzb2x2ZUZpbGVzeXN0ZW0gPSAoY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQpID0+XG4gICAgcmVzb2x2ZVdvcmtzcGFjZUZpbGVzeXN0ZW0oXG4gICAgICByZXNvbHZlQ29udHJpYnV0aW9uLFxuICAgICAgY29udGV4dCxcbiAgICAgIHJldGFpbkZpbGVzeXN0ZW1Tb3VyY2UgPyBtb3VudEZpbGVzQ2FjaGUgOiB1bmRlZmluZWQsXG4gICAgICBmaWxlc3lzdGVtU291cmNlS2V5LFxuICAgICk7XG4gIGNvbnN0IHNraWxsczogU2tpbGxzUmVzb2x2ZXIgPVxuICAgIG9wdGlvbnMuc2tpbGxzID8/XG4gICAgKGFzeW5jICh7IHJlcXVlc3RDb250ZXh0IH0pID0+IHtcbiAgICAgIGNvbnN0IGNvbnRleHQgPSB7IHJlcXVlc3RDb250ZXh0IH07XG4gICAgICBjb25zdCBjb250cmlidXRpb24gPSBhd2FpdCByZXNvbHZlQ29udHJpYnV0aW9uKGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHJlc29sdmVEaXN0aW5jdFNraWxsUGF0aHMoXG4gICAgICAgIGF3YWl0IHJlc29sdmVGaWxlc3lzdGVtKGNvbnRleHQpLFxuICAgICAgICBjb250cmlidXRpb24uc2tpbGxQYXRocyA/PyBbXSxcbiAgICAgICk7XG4gICAgfSk7XG4gIGNvbnN0IGNoZWNrU2tpbGxGaWxlTXRpbWUgPSBvcHRpb25zLmNoZWNrU2tpbGxGaWxlTXRpbWUgPz8gZmFsc2U7XG4gIGNvbnN0IGJtMjUgPSBvcHRpb25zLmJtMjUgPz8gdHJ1ZTtcbiAgY29uc3Qgc2FuZGJveCA9IHJlc29sdmVXb3Jrc3BhY2VTYW5kYm94KG9wdGlvbnMuc2FuZGJveCwgaWQsIG5hbWUpO1xuICBjb25zdCB0b29scyA9IHdvcmtzcGFjZVRvb2xzKG9wdGlvbnMudG9vbHMpO1xuICBsb2dnZXIuZGVidWcoXCJ3b3Jrc3BhY2U6Y3JlYXRlXCIsIHtcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIHJlc29sdmVyQ291bnQ6IHJlc29sdmVycy5sZW5ndGgsXG4gICAgY29uZmlndXJlZFBhdGhzLFxuICAgIGN1c3RvbU1vdW50czogT2JqZWN0LmtleXMob3B0aW9ucy5tb3VudHMgPz8ge30pLmxlbmd0aCxcbiAgICBjdXN0b21Ta2lsbHNSZXNvbHZlcjogQm9vbGVhbihvcHRpb25zLnNraWxscyksXG4gICAgY2hlY2tTa2lsbEZpbGVNdGltZSxcbiAgICBibTI1LFxuICAgIGV4dHJhU2tpbGxQYXRoczogZXh0cmFTa2lsbFBhdGhzLmxlbmd0aCxcbiAgICBzYW5kYm94OiBzYW5kYm94ID8gc2FuZGJveE5hbWUob3B0aW9ucy5zYW5kYm94KSA6IFwiZGlzYWJsZWRcIixcbiAgfSk7XG5cbiAgY29uc3Qge1xuICAgIGFzc2lzdGFudFBhdGhzOiBfYXNzaXN0YW50UGF0aHMsXG4gICAgcGF0aHM6IF9wYXRocyxcbiAgICBtb3VudHM6IF9tb3VudHMsXG4gICAgc2tpbGxzOiBfc2tpbGxzLFxuICAgIGNhY2hlOiBfY2FjaGUsXG4gICAgcGx1Z2luQ29udGV4dDogX3BsdWdpbkNvbnRleHQsXG4gICAgc2FuZGJveDogX3NhbmRib3gsXG4gICAgZXh0cmFTa2lsbFBhdGhzOiBfZXh0cmFTa2lsbFBhdGhzLFxuICAgIC4uLndvcmtzcGFjZU9wdGlvbnNcbiAgfSA9IG9wdGlvbnM7XG4gIHJldHVybiB7XG4gICAgLi4ud29ya3NwYWNlT3B0aW9ucyxcbiAgICBpZCxcbiAgICBuYW1lLFxuICAgIGZpbGVzeXN0ZW06IHJlc29sdmVGaWxlc3lzdGVtLFxuICAgIC4uLihyZXNvbHZlcnMubGVuZ3RoID4gMCB8fCBvcHRpb25zLnNraWxsc1xuICAgICAgPyB7XG4gICAgICAgICAgc2tpbGxzLFxuICAgICAgICAgIGNoZWNrU2tpbGxGaWxlTXRpbWUsXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihzYW5kYm94XG4gICAgICA/IHtcbiAgICAgICAgICBzYW5kYm94LFxuICAgICAgICAgIGluc3RydWN0aW9uczogeyBkeW5hbWljU2FuZGJveDogXCJyZXNvbHZlXCIgYXMgY29uc3QgfSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgYm0yNSxcbiAgICB0b29scyxcbiAgfTtcbn1cblxuLyoqIENyZWF0ZSBhIG5hdGl2ZSBNYXN0cmEge0BsaW5rIFdvcmtzcGFjZX0gZnJvbSB7QGxpbmsgZGF0YWJyaWNrc1dvcmtzcGFjZUNvbmZpZ30uICovXG5leHBvcnQgZnVuY3Rpb24gZGF0YWJyaWNrc1dvcmtzcGFjZShvcHRpb25zOiBEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucyA9IHt9KTogV29ya3NwYWNlIHtcbiAgY29uc3Qgd29ya3NwYWNlID0gbmV3IFdvcmtzcGFjZShkYXRhYnJpY2tzV29ya3NwYWNlQ29uZmlnKG9wdGlvbnMpKTtcbiAgZGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnMuc2V0KHdvcmtzcGFjZSwgb3B0aW9ucyk7XG4gIHJldHVybiB3b3Jrc3BhY2U7XG59XG5cbi8qKiBAaW50ZXJuYWwgQmluZCBhIGNhbGxlci1jcmVhdGVkIERhdGFicmlja3Mgd29ya3NwYWNlIHRvIGl0cyBBcHBLaXQgcGx1Z2luIGNvbnRleHQuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0KFxuICB3b3Jrc3BhY2U6IFdvcmtzcGFjZSxcbiAgcGx1Z2luQ29udGV4dDogcGx1Z2luUmVnaXN0cnkuUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQsXG4pOiBXb3Jrc3BhY2Uge1xuICBjb25zdCBvcHRpb25zID0gZGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnMuZ2V0KHdvcmtzcGFjZSk7XG4gIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnBsdWdpbkNvbnRleHQgIT09IHVuZGVmaW5lZCB8fCBwbHVnaW5Db250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gd29ya3NwYWNlO1xuICB9XG4gIHJldHVybiBkYXRhYnJpY2tzV29ya3NwYWNlKHsgLi4ub3B0aW9ucywgcGx1Z2luQ29udGV4dCB9KTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGRlZmF1bHQgYW5kIGNhbGxlci1wcm92aWRlZCBEYXRhYnJpY2tzIHBhdGhzIGluIHByaW9yaXR5IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZURhdGFicmlja3NXb3Jrc3BhY2VQYXRocyhcbiAgb3B0aW9uczogUGljazxEYXRhYnJpY2tzV29ya3NwYWNlT3B0aW9ucywgXCJhc3Npc3RhbnRQYXRoc1wiIHwgXCJwYXRoc1wiPiA9IHt9LFxuKTogRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGhWYWx1ZVtdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi4ob3B0aW9ucy5hc3Npc3RhbnRQYXRocyA9PT0gZmFsc2UgPyBbXSA6IERFRkFVTFRfREFUQUJSSUNLU19XT1JLU1BBQ0VfUEFUSFMpLFxuICAgIC4uLihvcHRpb25zLnBhdGhzID8/IFtdKSxcbiAgXTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcml2YXRlIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5mdW5jdGlvbiB3b3Jrc3BhY2VUb29scyhjb25maWd1cmVkOiBXb3Jrc3BhY2VUb29sc0NvbmZpZyB8IHVuZGVmaW5lZCk6IFdvcmtzcGFjZVRvb2xzQ29uZmlnIHtcbiAgcmV0dXJuIHtcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIHJlcXVpcmVBcHByb3ZhbDogZmFsc2UsXG4gICAgLi4uY29uZmlndXJlZCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZVNhbmRib3goXG4gIHNlbGVjdGlvbjogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiB8IHVuZGVmaW5lZCxcbiAgd29ya3NwYWNlSWQ6IHN0cmluZyxcbiAgd29ya3NwYWNlTmFtZTogc3RyaW5nLFxuKTogV29ya3NwYWNlU2FuZGJveCB8IFdvcmtzcGFjZVNhbmRib3hSZXNvbHZlciB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNvbmZpZ3VyZWQgPSBzZWxlY3Rpb24gPz8gXCJtb250eVwiO1xuICBpZiAoY29uZmlndXJlZCA9PT0gZmFsc2UpIHJldHVybiB1bmRlZmluZWQ7XG4gIGlmIChjb25maWd1cmVkID09PSBcIm1vbnR5XCIpIHJldHVybiBuZXcgTW9udHlTYW5kYm94KCk7XG4gIGlmICh0eXBlb2YgY29uZmlndXJlZCA9PT0gXCJmdW5jdGlvblwiIHx8IGlzU2FuZGJveChjb25maWd1cmVkKSkgcmV0dXJuIGNvbmZpZ3VyZWQ7XG5cbiAgY29uc3Qgb3B0aW9uczogRGF0YWJyaWNrc1dvcmtzcGFjZVNhbmRib3hPcHRpb25zID1cbiAgICBjb25maWd1cmVkID09PSBcImRhdGFicmlja3NcIiA/IHsgcHJvdmlkZXI6IFwiZGF0YWJyaWNrc1wiIH0gOiBjb25maWd1cmVkO1xuICByZXR1cm4gKHsgcmVxdWVzdENvbnRleHQgfSkgPT4ge1xuICAgIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICAgIGlmICghdXNlcikge1xuICAgICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICAgIFwiRGF0YWJyaWNrcyBzYW5kYm94IHVzZXIgY29udGV4dFwiLFxuICAgICAgICBcIkludm9rZSBjb21tYW5kIHRvb2xzIGZyb20gYW4gYWdlbnQgdHVybiBzZXJ2ZWQgYnkgdGhlIE1hc3RyYSBwbHVnaW4uXCIsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBjb25maWd1cmVkSWQgPVxuICAgICAgdHlwZW9mIG9wdGlvbnMuc2FuZGJveElkID09PSBcImZ1bmN0aW9uXCJcbiAgICAgICAgPyBvcHRpb25zLnNhbmRib3hJZCh7IHJlcXVlc3RDb250ZXh0IH0pXG4gICAgICAgIDogb3B0aW9ucy5zYW5kYm94SWQ7XG4gICAgY29uc3Qgc2FuZGJveElkID0gY29uZmlndXJlZElkID8/IGRlZmF1bHRTYW5kYm94SWQod29ya3NwYWNlSWQsIHVzZXIuaWQpO1xuICAgIGNvbnN0IGNsaWVudCA9XG4gICAgICB0eXBlb2Ygb3B0aW9ucy5jbGllbnQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgICA/IG9wdGlvbnMuY2xpZW50KHsgcmVxdWVzdENvbnRleHQgfSlcbiAgICAgICAgOiAob3B0aW9ucy5jbGllbnQgPz8gY3JlYXRlV29ya3NwYWNlQ2xpZW50KCkpO1xuICAgIGNvbnN0IHtcbiAgICAgIHByb3ZpZGVyOiBfcHJvdmlkZXIsXG4gICAgICBzYW5kYm94SWQ6IF9zYW5kYm94SWQsXG4gICAgICBjbGllbnQ6IF9jbGllbnQsXG4gICAgICAuLi5zYW5kYm94T3B0aW9uc1xuICAgIH0gPSBvcHRpb25zO1xuICAgIHJldHVybiBuZXcgRGF0YWJyaWNrc1NhbmRib3goe1xuICAgICAgLi4uc2FuZGJveE9wdGlvbnMsXG4gICAgICBjbGllbnQsXG4gICAgICBzYW5kYm94SWQsXG4gICAgICBkaXNwbGF5TmFtZTogb3B0aW9ucy5kaXNwbGF5TmFtZSA/PyBgTWFzdHJhICR7d29ya3NwYWNlTmFtZX1gLFxuICAgIH0pO1xuICB9O1xufVxuXG5mdW5jdGlvbiBkZWZhdWx0U2FuZGJveElkKHdvcmtzcGFjZUlkOiBzdHJpbmcsIHVzZXJJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZGlnZXN0ID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKVxuICAgIC51cGRhdGUob2JqZWN0LnRvU3RhYmxlS2V5KHsgd29ya3NwYWNlSWQsIHVzZXJJZCB9KSlcbiAgICAuZGlnZXN0KFwiaGV4XCIpXG4gICAgLnNsaWNlKDAsIDMyKTtcbiAgcmV0dXJuIGBtYXN0cmEtJHtkaWdlc3R9YDtcbn1cblxuZnVuY3Rpb24gaXNTYW5kYm94KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgV29ya3NwYWNlU2FuZGJveCB7XG4gIHJldHVybiBCb29sZWFuKFxuICAgIHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiBcImlkXCIgaW4gdmFsdWUgJiYgXCJwcm92aWRlclwiIGluIHZhbHVlICYmIFwic3RhdHVzXCIgaW4gdmFsdWUsXG4gICk7XG59XG5cbmZ1bmN0aW9uIHNhbmRib3hOYW1lKHNlbGVjdGlvbjogV29ya3NwYWNlU2FuZGJveFNlbGVjdGlvbiB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmIChzZWxlY3Rpb24gPT09IHVuZGVmaW5lZCB8fCBzZWxlY3Rpb24gPT09IFwibW9udHlcIikgcmV0dXJuIFwibW9udHlcIjtcbiAgaWYgKHNlbGVjdGlvbiA9PT0gXCJkYXRhYnJpY2tzXCIpIHJldHVybiBcImRhdGFicmlja3NcIjtcbiAgaWYgKHNlbGVjdGlvbiA9PT0gZmFsc2UpIHJldHVybiBcImRpc2FibGVkXCI7XG4gIGlmICh0eXBlb2Ygc2VsZWN0aW9uID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBcInJlc29sdmVyXCI7XG4gIHJldHVybiBpc1NhbmRib3goc2VsZWN0aW9uKSA/IHNlbGVjdGlvbi5wcm92aWRlciA6IChzZWxlY3Rpb24ucHJvdmlkZXIgPz8gXCJkYXRhYnJpY2tzXCIpO1xufVxuXG4vKipcbiAqIFJldHVybiB3aGV0aGVyIHRoZSByZXF1ZXN0IHRva2VuIGNhcnJpZXMgYSBzY29wZSB0aGF0IGFsbG93cyB3b3Jrc3BhY2VcbiAqIGZpbGUgQVBJIGFjY2VzcyAoYHdvcmtzcGFjZWAgb3IgYGFsbC1hcGlzYCBvbiB7QGxpbmsgTUFTVFJBX1NDT1BFU19LRVl9KS5cbiAqL1xuZnVuY3Rpb24gaGFzV29ya3NwYWNlRmlsZVNjb3BlKHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9rZW4uaW5jbHVkZXNBY2Nlc3NUb2tlblNjb3BlKFxuICAgIHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1NDT1BFU19LRVkpLFxuICAgIFdPUktTUEFDRV9GSUxFX1NDT1BFUyxcbiAgKTtcbn1cblxuLyoqIFJlc29sdmUgdGhlIHJlcXVlc3QgY2xpZW50IGFuZCBhdXRob3JpemF0aW9uLXNhZmUgZmlsZXMtY2FjaGUgc2NvcGUuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRmlsZXNDYWNoZVNjb3BlKGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0KTogUHJvbWlzZTxcbiAgfCB7XG4gICAgICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudDtcbiAgICAgIHNjb3BlOiBGaWxlc0NhY2hlU2NvcGU7XG4gICAgfVxuICB8IHVuZGVmaW5lZFxuPiB7XG4gIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gY29udGV4dC5yZXF1ZXN0Q29udGV4dDtcbiAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBjb25zdCBjbGllbnQgPSB1c2VyPy5leGVjdXRpb25Db250ZXh0LmNsaWVudCBhcyBXb3Jrc3BhY2VDbGllbnQgfCB1bmRlZmluZWQ7XG4gIGlmICghcmVxdWVzdENvbnRleHQgfHwgIXVzZXIgfHwgIWNsaWVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICBjbGllbnQsXG4gICAgc2NvcGU6IHtcbiAgICAgIGhvc3Q6IChhd2FpdCBjbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKSxcbiAgICAgIHVzZXJLZXk6IHJlc29sdmVVc2VyS2V5KHJlcXVlc3RDb250ZXh0KSxcbiAgICAgIC4uLihwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX1dPUktTUEFDRV9JRD8udHJpbSgpXG4gICAgICAgID8geyB3b3Jrc3BhY2VJZDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19XT1JLU1BBQ0VfSUQudHJpbSgpIH1cbiAgICAgICAgOiB7fSksXG4gICAgfSxcbiAgfTtcbn1cblxuLyoqIEpvaW4gb25lIHJlbGF0aXZlIHNraWxsIHJvb3QgdG8gaXRzIGFjdHVhbCBjb21wb3NpdGUgbW91bnQgcGF0aC4gKi9cbmZ1bmN0aW9uIG1vdW50ZWRTa2lsbFBhdGgobW91bnQ6IHN0cmluZywgc2tpbGxSb290OiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAocG9zaXhQYXRoLmlzQWJzb2x1dGUoc2tpbGxSb290KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFNraWxsIHBhdGggbXVzdCBiZSByZWxhdGl2ZSB0byBpdHMgbW91bnQ6ICR7c2tpbGxSb290fWApO1xuICB9XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwb3NpeFBhdGgubm9ybWFsaXplKHNraWxsUm9vdCk7XG4gIGlmICghbm9ybWFsaXplZC5vaykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFNraWxsIHBhdGggZXNjYXBlcyBpdHMgbW91bnQ6ICR7c2tpbGxSb290fWApO1xuICB9XG4gIHJldHVybiBwb3NpeFBhdGguam9pbihwb3NpeFBhdGgubm9ybWFsaXplUm9vdChtb3VudCksIG5vcm1hbGl6ZWQucGF0aC5zbGljZSgxKSk7XG59XG5cbi8qKiBSZXR1cm4gd2hldGhlciBhIERhdGFicmlja3MgcGF0aCBiZWxvbmdzIHRvIHRoZSB3cml0YWJsZSBXb3Jrc3BhY2UgbmFtZXNwYWNlLiAqL1xuZnVuY3Rpb24gaXNXb3Jrc3BhY2VSb290KHJvb3Q6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBub3JtYWxpemVkID0gcG9zaXhQYXRoLm5vcm1hbGl6ZVJvb3Qocm9vdCk7XG4gIHJldHVybiBub3JtYWxpemVkID09PSBcIi9Xb3Jrc3BhY2VcIiB8fCBub3JtYWxpemVkLnN0YXJ0c1dpdGgoXCIvV29ya3NwYWNlL1wiKTtcbn1cblxuLyoqXG4gKiBNb3VudCByZXNvbHZlciBmb3IgdGhlIG5hbWVkIHNraWxsIGZvbGRlcnMuXG4gKlxuICogR2F0ZXMgb24gd29ya3NwYWNlIGZpbGUgc2NvcGUgKG9yIGRldmVsb3BtZW50IG1vZGUpLCB0aGVuIG1vdW50cyBldmVyeVxuICogZm9sZGVyIHdob3NlIGxvY2F0aW9uIHJlc29sdmVzIGZvciB0aGlzIHJlcXVlc3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTa2lsbEZvbGRlck1vdW50cyhcbiAgcGF0aHM6IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoVmFsdWVbXSxcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gIGZpbGVzQ2FjaGU6IEZpbGVzQ2FjaGVFeHBvcnRzIHwgdW5kZWZpbmVkLFxuICBjYWNoZUNvbmZpZzogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlIHwgdW5kZWZpbmVkLFxuKTogUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4ge1xuICBjb25zdCBtb3VudHM6IFJlY29yZDxzdHJpbmcsIFdvcmtzcGFjZUZpbGVzeXN0ZW0+ID0ge307XG4gIGNvbnN0IHNraWxsUGF0aHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gY29udGV4dC5yZXF1ZXN0Q29udGV4dDtcblxuICBjb25zdCBjYW5Nb3VudERhdGFicmlja3MgPSBCb29sZWFuKHJlcXVlc3RDb250ZXh0ICYmIHNob3VsZE1vdW50U2tpbGxGb2xkZXJzKHJlcXVlc3RDb250ZXh0KSk7XG4gIGNvbnN0IHNjb3BlZCA9IGNhbk1vdW50RGF0YWJyaWNrcyA/IGF3YWl0IHJlc29sdmVGaWxlc0NhY2hlU2NvcGUoY29udGV4dCkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsaWVudCA9IHNjb3BlZD8uY2xpZW50O1xuICBjb25zdCBmaWxlU3lzdGVtQ2FjaGUgPVxuICAgIGZpbGVzQ2FjaGUgJiYgc2NvcGVkID8gYXdhaXQgZmlsZXNDYWNoZS5mb3JTY29wZShzY29wZWQuc2NvcGUpIDogdW5kZWZpbmVkO1xuXG4gIGZvciAoY29uc3QgW2luZGV4LCBwYXRoXSBvZiBwYXRocy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBjb25maWd1cmVkID0gYXdhaXQgcmVzb2x2ZURhdGFicmlja3NXb3Jrc3BhY2VQYXRoKHBhdGgsIGNvbnRleHQpO1xuICAgIGlmICghY29uZmlndXJlZCkgY29udGludWU7XG4gICAgaWYgKHBvc2l4UGF0aC5pc1dpdGhpblJvb3QoU0NSQVRDSF9NT1VOVCwgY29uZmlndXJlZC5wYXRoKSkge1xuICAgICAgY29uc3QgbW91bnQgPSBjb25maWd1cmVkLm1vdW50ID8/IGNvbmZpZ3VyZWQucGF0aDtcbiAgICAgIG1vdW50c1ttb3VudF0gPSB1c2VyVGVtcEZpbGVzeXN0ZW0oY29udGV4dCwgY29uZmlndXJlZC5wYXRoKTtcbiAgICAgIGlmIChjb25maWd1cmVkLnJlYWRhYmxlICE9PSBmYWxzZSkge1xuICAgICAgICBza2lsbFBhdGhzLnB1c2goLi4uKGNvbmZpZ3VyZWQuc2tpbGxzID8/IFtdKS5tYXAoKHBhdGgpID0+IG1vdW50ZWRTa2lsbFBhdGgobW91bnQsIHBhdGgpKSk7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKCFjYW5Nb3VudERhdGFicmlja3MpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIndvcmtzcGFjZS1wYXRoOnNraXBwZWRcIiwge1xuICAgICAgICBwYXRoOiBjb25maWd1cmVkLnBhdGgsXG4gICAgICAgIHJlYXNvbjogIXJlcXVlc3RDb250ZXh0ID8gXCJuby1yZXF1ZXN0LWNvbnRleHRcIiA6IFwibWlzc2luZy13b3Jrc3BhY2Utc2NvcGVcIixcbiAgICAgIH0pO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgcmVzb2x2ZVNraWxsRm9sZGVyRmlsZXN5c3RlbShjb25maWd1cmVkLCBjb250ZXh0LCBjYWNoZUNvbmZpZywge1xuICAgICAgY2xpZW50LFxuICAgICAgZmlsZVN5c3RlbUNhY2hlLFxuICAgIH0pO1xuICAgIGlmICghcmVzb2x2ZWQpIGNvbnRpbnVlO1xuICAgIGNvbnN0IG1vdW50ID0gY29uZmlndXJlZC5tb3VudCA/PyByZXNvbHZlZC5yb290O1xuICAgIGlmICghbW91bnQpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcIndvcmtzcGFjZS1wYXRoOnNraXBwZWRcIiwgeyBpbmRleCwgcmVhc29uOiBcIm1pc3NpbmctbW91bnRcIiB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBtb3VudHNbbW91bnRdID0gcmVzb2x2ZWQuZmlsZXN5c3RlbTtcbiAgICBpZiAoY29uZmlndXJlZC5yZWFkYWJsZSAhPT0gZmFsc2UpIHtcbiAgICAgIHNraWxsUGF0aHMucHVzaCguLi4oY29uZmlndXJlZC5za2lsbHMgPz8gW1wiLlwiXSkubWFwKChwYXRoKSA9PiBtb3VudGVkU2tpbGxQYXRoKG1vdW50LCBwYXRoKSkpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcInNraWxsLWZvbGRlcnM6bW91bnRlZFwiLCB7XG4gICAgbW91bnRLZXlzOiBPYmplY3Qua2V5cyhtb3VudHMpLFxuICAgIHNraWxsUGF0aHMsXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgbW91bnRzLFxuICAgIHNraWxsUGF0aHMsXG4gIH07XG59XG5cbmludGVyZmFjZSBSZXNvbHZlZERhdGFicmlja3NXb3Jrc3BhY2VQYXRoIHtcbiAgcGF0aDogc3RyaW5nO1xuICBkaXNwbGF5TmFtZT86IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHJlYWRhYmxlPzogYm9vbGVhbjtcbiAgc2tpbGxzPzogcmVhZG9ubHkgc3RyaW5nW107XG4gIHdyaXRhYmxlPzogYm9vbGVhbjtcbiAgY3JlYXRlUm9vdD86IGJvb2xlYW47XG4gIG1vdW50Pzogc3RyaW5nO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGgoXG4gIHZhbHVlOiBEYXRhYnJpY2tzV29ya3NwYWNlUGF0aFZhbHVlLFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbik6IFByb21pc2U8UmVzb2x2ZWREYXRhYnJpY2tzV29ya3NwYWNlUGF0aCB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBzZWxlY3RlZCA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gYXdhaXQgdmFsdWUoY29udGV4dCkgOiB2YWx1ZTtcbiAgaWYgKHNlbGVjdGVkID09PSBmYWxzZSB8fCBzZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBjb25maWd1cmVkID0gdHlwZW9mIHNlbGVjdGVkID09PSBcInN0cmluZ1wiID8geyBwYXRoOiBzZWxlY3RlZCB9IDogc2VsZWN0ZWQ7XG4gIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gcmVxdWVzdENvbnRleHRWYWx1ZXMoY29udGV4dC5yZXF1ZXN0Q29udGV4dCk7XG4gIGNvbnN0IHJlc29sdmVkUGF0aCA9IHJlc29sdmVIb21lUGF0aChjb25maWd1cmVkLnBhdGgsIHJlcXVlc3RDb250ZXh0KTtcbiAgaWYgKCFyZXNvbHZlZFBhdGgpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJlc29sdmVkTW91bnQgPSByZXNvbHZlSG9tZVBhdGgoY29uZmlndXJlZC5tb3VudCwgcmVxdWVzdENvbnRleHQpO1xuICByZXR1cm4ge1xuICAgIC4uLmNvbmZpZ3VyZWQsXG4gICAgcGF0aDogcmVzb2x2ZWRQYXRoLFxuICAgIC4uLihyZXNvbHZlZE1vdW50ID8geyBtb3VudDogcmVzb2x2ZWRNb3VudCB9IDoge30pLFxuICB9O1xufVxuXG4vKipcbiAqIFJlc29sdmUgb25lIHNraWxsIGZvbGRlciB0byBhIE1hc3RyYSBmaWxlc3lzdGVtLCBvciBgdW5kZWZpbmVkYCB0byBza2lwIGl0XG4gKiBmb3IgdGhpcyByZXF1ZXN0LlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlU2tpbGxGb2xkZXJGaWxlc3lzdGVtKFxuICBmb2xkZXI6IFJlc29sdmVkRGF0YWJyaWNrc1dvcmtzcGFjZVBhdGgsXG4gIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuICBjYWNoZUNvbmZpZzogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlIHwgdW5kZWZpbmVkLFxuICBjYWNoZToge1xuICAgIGNsaWVudDogV29ya3NwYWNlQ2xpZW50IHwgdW5kZWZpbmVkO1xuICAgIGZpbGVTeXN0ZW1DYWNoZTogRmlsZVN5c3RlbUNhY2hlIHwgdW5kZWZpbmVkO1xuICB9LFxuKTogUHJvbWlzZTxcbiAgfCB7XG4gICAgICBmaWxlc3lzdGVtOiBXb3Jrc3BhY2VGaWxlc3lzdGVtO1xuICAgICAgcm9vdD86IHN0cmluZztcbiAgICB9XG4gIHwgdW5kZWZpbmVkXG4+IHtcbiAgLy8gQSBwYXRoIG1vdW50IG5lZWRzIHRoZSByZXF1ZXN0J3MgT0JPIGNsaWVudCB0byByZWFjaCB0aGUgd29ya3NwYWNlLlxuICBpZiAoIWNhY2hlLmNsaWVudCkge1xuICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsLWZvbGRlcjpza2lwcGVkXCIsIHtcbiAgICAgIHBhdGg6IGZvbGRlci5wYXRoLFxuICAgICAgcmVhc29uOiBcIm1pc3Npbmctb2JvLWNsaWVudFwiLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3Qgcm9vdCA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoZm9sZGVyLnBhdGgpO1xuICBpZiAoIXJvb3QpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IHdyaXRhYmxlID0gZm9sZGVyLndyaXRhYmxlID8/IGlzV29ya3NwYWNlUm9vdChyb290KTtcbiAgY29uc3QgY2FjaGVPcHRpb25zID0gY2FjaGUuZmlsZVN5c3RlbUNhY2hlXG4gICAgPyBhd2FpdCByZXNvbHZlRmlsZUNhY2hlT3B0aW9ucyhcbiAgICAgICAgY2FjaGVDb25maWcsXG4gICAgICAgIGNvbnRleHQsXG4gICAgICAgIHJvb3QsXG4gICAgICAgIGZvbGRlci5yZWFkYWJsZSA9PT0gZmFsc2UgPyBbXSA6IChmb2xkZXIuc2tpbGxzID8/IFtcIi5cIl0pLFxuICAgICAgKVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IGRhdGFicmlja3NGaWxlc3lzdGVtKFxuICAgIGNhY2hlLmNsaWVudCxcbiAgICByb290LFxuICAgICF3cml0YWJsZSxcbiAgICBmb2xkZXIuY3JlYXRlUm9vdCA/PyBmb2xkZXIud3JpdGFibGUgPT09IHRydWUsXG4gICAgY2FjaGUuZmlsZVN5c3RlbUNhY2hlLFxuICAgIGNhY2hlT3B0aW9ucyxcbiAgICB7XG4gICAgICAuLi4oZm9sZGVyLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogZm9sZGVyLmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAuLi4oZm9sZGVyLmRpc3BsYXlOYW1lID8geyBkaXNwbGF5TmFtZTogZm9sZGVyLmRpc3BsYXlOYW1lIH0gOiB7fSksXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIHJlc29sdmVkID8geyAuLi5yZXNvbHZlZCwgcm9vdCB9IDogdW5kZWZpbmVkO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlQ2FjaGVDb25maWcoXG4gIHZhbHVlOiBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGUgfCB1bmRlZmluZWQsXG4gIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuKTogUHJvbWlzZTxcbiAgYm9vbGVhbiB8IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlciB8IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcltdIHwgdW5kZWZpbmVkXG4+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiID8gdmFsdWUoY29udGV4dCkgOiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gcmVxdWVzdENvbnRleHRWYWx1ZXMocmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0IHwgdW5kZWZpbmVkKTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gcmVxdWVzdENvbnRleHQ/LnRvSlNPTigpID8/IHt9O1xufVxuXG5mdW5jdGlvbiByZXNvbHZlSG9tZVBhdGgoXG4gIGlucHV0OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHJlcXVlc3RDb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHZhbHVlID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChpbnB1dCk7XG4gIGlmICghdmFsdWUgfHwgKHZhbHVlICE9PSBcIn5cIiAmJiAhdmFsdWUuc3RhcnRzV2l0aChcIn4vXCIpKSkgcmV0dXJuIHZhbHVlID8/IHVuZGVmaW5lZDtcbiAgY29uc3QgZW1haWxWYWx1ZSA9IHJlcXVlc3RDb250ZXh0W01BU1RSQV9VU0VSX0VNQUlMX0tFWV07XG4gIGNvbnN0IGVtYWlsID0gdHlwZW9mIGVtYWlsVmFsdWUgPT09IFwic3RyaW5nXCIgPyBzdHJpbmdVdGlscy50cmltVG9OdWxsKGVtYWlsVmFsdWUpIDogdW5kZWZpbmVkO1xuICBpZiAoIWVtYWlsKSByZXR1cm4gdW5kZWZpbmVkO1xuICBjb25zdCBob21lID0gcGVyc29uYWxXb3Jrc3BhY2VQYXRoKGVtYWlsKTtcbiAgcmV0dXJuIHZhbHVlID09PSBcIn5cIiA/IGhvbWUgOiBgJHtob21lfS8ke3ZhbHVlLnNsaWNlKDIpfWA7XG59XG5cbmZ1bmN0aW9uIHRvUG9saWN5QXJyYXk8VD4odmFsdWU6IFQgfCByZWFkb25seSBUW10gfCB1bmRlZmluZWQpOiByZWFkb25seSBUW10ge1xuICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgcmV0dXJuIFtdO1xuICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyAodmFsdWUgYXMgcmVhZG9ubHkgVFtdKSA6IFt2YWx1ZSBhcyBUXTtcbn1cblxuZnVuY3Rpb24gY2FjaGVGaWx0ZXJNYXRjaGVzKFxuICBwb2xpY3k6IERhdGFicmlja3NXb3Jrc3BhY2VDYWNoZUZpbHRlcixcbiAgb3BlcmF0aW9uOiBDYWNoZWFibGVGaWxlU3lzdGVtT3BlcmF0aW9uLFxuICBwYXRoOiBzdHJpbmcsXG4gIHJlcXVlc3RDb250ZXh0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgcm9vdD86IHN0cmluZyxcbik6IGJvb2xlYW4ge1xuICBjb25zdCBvcGVyYXRpb25zID0gdG9Qb2xpY3lBcnJheShwb2xpY3kub3BlcmF0aW9ucyA/PyBDQUNIRUFCTEVfRklMRVNZU1RFTV9PUEVSQVRJT05TKTtcbiAgaWYgKCFvcGVyYXRpb25zLmluY2x1ZGVzKG9wZXJhdGlvbikpIHJldHVybiBmYWxzZTtcbiAgaWYgKHBvbGljeS5wYXRocyA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgY29uc3QgaW5wdXRzOiBQYXRoTWF0Y2hJbnB1dFtdID0gW107XG4gIGZvciAoY29uc3QgaW5wdXQgb2YgdG9Qb2xpY3lBcnJheTxQYXRoTWF0Y2hJbnB1dD4ocG9saWN5LnBhdGhzKSkge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgIT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGlucHV0cy5wdXNoKGlucHV0KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb25zdCBleHBhbmRlZCA9IHJlc29sdmVIb21lUGF0aChpbnB1dCwgcmVxdWVzdENvbnRleHQpO1xuICAgIGlmICghZXhwYW5kZWQpIGNvbnRpbnVlO1xuICAgIGlucHV0cy5wdXNoKFxuICAgICAgIXJvb3QgfHwgcG9zaXhQYXRoLmlzQWJzb2x1dGUoZXhwYW5kZWQpIHx8IGV4cGFuZGVkLnN0YXJ0c1dpdGgoXCIqKlwiKVxuICAgICAgICA/IGV4cGFuZGVkXG4gICAgICAgIDogYCR7cG9zaXhQYXRoLm5vcm1hbGl6ZVJvb3Qocm9vdCl9LyR7ZXhwYW5kZWQucmVwbGFjZSgvXlxcLlxcLy8sIFwiXCIpfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gaW5wdXRzLmxlbmd0aCA+IDAgJiYgbWF0Y2gudG9QYXRoTWF0Y2hlciguLi5pbnB1dHMpKHBhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlRmlsZUNhY2hlT3B0aW9ucyhcbiAgY29uZmlndXJlZDogRGF0YWJyaWNrc1dvcmtzcGFjZUNhY2hlIHwgdW5kZWZpbmVkLFxuICBjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCxcbiAgcm9vdDogc3RyaW5nLFxuICBza2lsbFBhdGhzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFByb21pc2U8RmlsZVN5c3RlbUNhY2hlT3B0aW9ucyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IHJlcXVlc3RDb250ZXh0VmFsdWVzKGNvbnRleHQucmVxdWVzdENvbnRleHQpO1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHJlc29sdmVDYWNoZUNvbmZpZyhjb25maWd1cmVkLCBjb250ZXh0KTtcbiAgaWYgKHJlc29sdmVkID09PSBmYWxzZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKHJlc29sdmVkID09PSB1bmRlZmluZWQgfHwgcmVzb2x2ZWQgPT09IHRydWUpIHtcbiAgICBjb25zdCByb290cyA9IHNraWxsUGF0aHMubWFwKChwYXRoKSA9PiBtb3VudGVkU2tpbGxQYXRoKHJvb3QsIHBhdGgpKTtcbiAgICByZXR1cm4ge1xuICAgICAgb3BlcmF0aW9uczogQ0FDSEVBQkxFX0ZJTEVTWVNURU1fT1BFUkFUSU9OUyxcbiAgICAgIGZpbHRlcjogKG9wZXJhdGlvbiwgcGF0aCkgPT5cbiAgICAgICAgb3BlcmF0aW9uICE9PSBcInJlYWRGaWxlXCIgfHxcbiAgICAgICAgcm9vdHMuc29tZSgoc2tpbGxSb290KSA9PiBwb3NpeFBhdGguaXNXaXRoaW5Sb290KHNraWxsUm9vdCwgcGF0aCkpLFxuICAgIH07XG4gIH1cbiAgY29uc3QgcG9saWNpZXMgPSB0b1BvbGljeUFycmF5KHJlc29sdmVkKTtcbiAgaWYgKHBvbGljaWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgY29uc3Qgb3BlcmF0aW9ucyA9IFtcbiAgICAuLi5uZXcgU2V0KFxuICAgICAgcG9saWNpZXMuZmxhdE1hcCgocG9saWN5KSA9PlxuICAgICAgICB0b1BvbGljeUFycmF5KHBvbGljeS5vcGVyYXRpb25zID8/IENBQ0hFQUJMRV9GSUxFU1lTVEVNX09QRVJBVElPTlMpLFxuICAgICAgKSxcbiAgICApLFxuICBdO1xuICByZXR1cm4ge1xuICAgIG9wZXJhdGlvbnMsXG4gICAgZmlsdGVyOiAob3BlcmF0aW9uLCBwYXRoKSA9PlxuICAgICAgcG9saWNpZXMuc29tZSgocG9saWN5KSA9PiBjYWNoZUZpbHRlck1hdGNoZXMocG9saWN5LCBvcGVyYXRpb24sIHBhdGgsIHJlcXVlc3RDb250ZXh0LCByb290KSksXG4gIH07XG59XG5cbi8qKlxuICogRmlsbCBpbiBgaWRgIGFuZCBgbmFtZWAgd2hlbiBlaXRoZXIgaXMgb21pdHRlZCBvbiB7QGxpbmsgRGF0YWJyaWNrc1dvcmtzcGFjZU9wdGlvbnN9LlxuICogU2x1Z2lmaWVzIGBuYW1lYCBpbnRvIGBpZGA7IHRva2VuaXplcyBgaWRgIGludG8gYSBkaXNwbGF5IGBuYW1lYC5cbiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZUlkZW50aXR5KG9wdGlvbnM6IERhdGFicmlja3NXb3Jrc3BhY2VPcHRpb25zKToge1xuICBpZDogc3RyaW5nO1xuICBuYW1lOiBzdHJpbmc7XG59IHtcbiAgbGV0IGlkID0gb3B0aW9ucy5pZDtcbiAgbGV0IG5hbWUgPSBvcHRpb25zLm5hbWU7XG4gIGlmICghaWQpIHtcbiAgICBpZCA9IG5hbWUgPyBzdHJpbmdVdGlscy50b1NsdWcobmFtZSkgOiBcIndvcmtzcGFjZVwiO1xuICB9XG4gIGlmICghbmFtZSkge1xuICAgIG5hbWUgPSBBcnJheS5mcm9tKHN0cmluZ1V0aWxzLnRva2VuaXplKGlkKSkuam9pbihcIiBcIik7XG4gIH1cbiAgcmV0dXJuIHsgaWQsIG5hbWUgfTtcbn1cblxuLyoqIENvbGxlY3QgdGhlIHNraWxsLWZvbGRlciByZXNvbHZlciBhbmQgYW55IGNhbGxlci1zdXBwbGllZCBvbmVzLiAqL1xuZnVuY3Rpb24gYnVpbGRNb3VudFJlc29sdmVycyhcbiAgcGF0aHM6IHJlYWRvbmx5IERhdGFicmlja3NXb3Jrc3BhY2VQYXRoVmFsdWVbXSxcbiAgbW91bnRzOiBSZWNvcmQ8c3RyaW5nLCBXb3Jrc3BhY2VGaWxlc3lzdGVtPiB8IHVuZGVmaW5lZCxcbiAgbG9jYWxNb3VudHM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbiAgZmlsZXNDYWNoZTogRmlsZXNDYWNoZUV4cG9ydHMgfCB1bmRlZmluZWQsXG4gIGNhY2hlQ29uZmlnOiBEYXRhYnJpY2tzV29ya3NwYWNlQ2FjaGUgfCB1bmRlZmluZWQsXG4pOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10ge1xuICBjb25zdCByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSA9IFtdO1xuICBjb25zdCBwYXRoQ291bnQgPSBwYXRocy5sZW5ndGg7XG4gIGlmIChwYXRoQ291bnQgPiAwKSB7XG4gICAgcmVzb2x2ZXJzLnB1c2goKGNvbnRleHQpID0+IHJlc29sdmVTa2lsbEZvbGRlck1vdW50cyhwYXRocywgY29udGV4dCwgZmlsZXNDYWNoZSwgY2FjaGVDb25maWcpKTtcbiAgfVxuICBpZiAobW91bnRzICYmIE9iamVjdC5rZXlzKG1vdW50cykubGVuZ3RoID4gMCkgcmVzb2x2ZXJzLnB1c2goKCkgPT4gKHsgbW91bnRzIH0pKTtcbiAgcmVzb2x2ZXJzLnB1c2goLi4ubG9jYWxNb3VudHMpO1xuICBsb2dnZXIuZGVidWcoXCJtb3VudHM6cmVzb2x2ZXJzXCIsIHtcbiAgICBwYXRoQ291bnQsXG4gICAgY3VzdG9tTW91bnRDb3VudDogT2JqZWN0LmtleXMobW91bnRzID8/IHt9KS5sZW5ndGgsXG4gICAgbG9jYWxNb3VudENvdW50OiBsb2NhbE1vdW50cy5sZW5ndGgsXG4gICAgdG90YWxSZXNvbHZlckNvdW50OiByZXNvbHZlcnMubGVuZ3RoLFxuICB9KTtcbiAgcmV0dXJuIHJlc29sdmVycztcbn1cblxuLyoqIFN0YWJsZSB1c2VyLXNjb3BlZCBsb2NhbCBzdG9yYWdlIHVuZGVyIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0ncyB0ZW1wIGRpcmVjdG9yeS4gKi9cbmZ1bmN0aW9uIHVzZXJUZW1wRmlsZXN5c3RlbShcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4gIHdvcmtzcGFjZVBhdGg6IHN0cmluZyxcbik6IFdvcmtzcGFjZUZpbGVzeXN0ZW0ge1xuICBjb25zdCB1c2VyS2V5ID0gcmVzb2x2ZVVzZXJLZXkoY29udGV4dC5yZXF1ZXN0Q29udGV4dCk7XG4gIGNvbnN0IGRpZ2VzdCA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIilcbiAgICAudXBkYXRlKG9iamVjdC50b1N0YWJsZUtleSh7IHBhY2thZ2U6IFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCIsIHVzZXJLZXkgfSkpXG4gICAgLmRpZ2VzdChcImhleFwiKVxuICAgIC5zbGljZSgwLCAxNik7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBwb3NpeFBhdGgubm9ybWFsaXplUm9vdCh3b3Jrc3BhY2VQYXRoKTtcbiAgY29uc3QgcmVsYXRpdmUgPSBub3JtYWxpemVkID09PSBTQ1JBVENIX01PVU5UID8gXCJcIiA6IG5vcm1hbGl6ZWQuc2xpY2UoYCR7U0NSQVRDSF9NT1VOVH0vYC5sZW5ndGgpO1xuICBjb25zdCBzb3VyY2UgPSBuZXcgTG9jYWxGaWxlU3lzdGVtKHtcbiAgICByb290OiBqb2luKHRtcGRpcigpLCBcImRieC10b29sc1wiLCBcIm1hc3RyYVwiLCBkaWdlc3QsIHJlbGF0aXZlKSxcbiAgICByZWFkT25seTogZmFsc2UsXG4gICAgY3JlYXRlUm9vdDogdHJ1ZSxcbiAgfSk7XG4gIHJldHVybiBmaWxlc3lzdGVtcyhzb3VyY2UsIHtcbiAgICBkaXNwbGF5TmFtZTogXCJUZW1wb3JhcnkgRmlsZXNcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiVXNlci1zY29wZWQgdGVtcG9yYXJ5IGZpbGVzIHJldGFpbmVkIHdoaWxlIHRoZSBob3N0IGtlZXBzIGl0cyBlcGhlbWVyYWwgdGVtcCBzdG9yYWdlLlwiLFxuICB9KTtcbn1cblxuLyoqIE1vdW50IHN0YXJ0dXAtcHJvdmlzaW9uZWQgbG9jYWwgc2tpbGwgcm9vdHMgaW50byBNYXN0cmEncyB3b3Jrc3BhY2UgZmlsZXN5c3RlbS4gKi9cbmZ1bmN0aW9uIGxvY2FsU2tpbGxNb3VudFJlc29sdmVycyhwYXRoczogcmVhZG9ubHkgc3RyaW5nW10pOiBXb3Jrc3BhY2VNb3VudFJlc29sdmVyW10ge1xuICByZXR1cm4gWy4uLm5ldyBTZXQocGF0aHMubWFwKChwYXRoKSA9PiBwYXRoLnRyaW0oKSkuZmlsdGVyKEJvb2xlYW4pKV0ubWFwKChyb290KSA9PiB7XG4gICAgY29uc3QgbW91bnQgPSBwb3NpeFBhdGgubm9ybWFsaXplUm9vdChyb290KTtcbiAgICBjb25zdCBzb3VyY2UgPSBuZXcgTG9jYWxGaWxlU3lzdGVtKHtcbiAgICAgIHJvb3QsXG4gICAgICByZWFkT25seTogdHJ1ZSxcbiAgICAgIGNyZWF0ZVJvb3Q6IGZhbHNlLFxuICAgIH0pO1xuICAgIGNvbnN0IGZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtcyhzb3VyY2UsIHsgcmVhZE9ubHk6IHRydWUgfSk7XG4gICAgcmV0dXJuICgpID0+ICh7XG4gICAgICBtb3VudHM6IHsgW21vdW50XTogZmlsZXN5c3RlbSB9LFxuICAgICAgc2tpbGxQYXRoczogW21vdW50XSxcbiAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogR2F0ZSBza2lsbC1mb2xkZXIgbW91bnRzIG9uIHRoZSByZXF1ZXN0J3MgdG9rZW4uXG4gKlxuICogQWx3YXlzIGFsbG93cyBtb3VudHMgaW4gZGV2ZWxvcG1lbnQ7IGluIG90aGVyIGVudmlyb25tZW50cyByZXF1aXJlc1xuICoge0BsaW5rIGhhc1dvcmtzcGFjZUZpbGVTY29wZX0uXG4gKi9cbmZ1bmN0aW9uIHNob3VsZE1vdW50U2tpbGxGb2xkZXJzKHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCk6IGJvb2xlYW4ge1xuICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwiZGV2ZWxvcG1lbnRcIikgcmV0dXJuIHRydWU7XG4gIHJldHVybiBoYXNXb3Jrc3BhY2VGaWxlU2NvcGUocmVxdWVzdENvbnRleHQpO1xufVxuXG4vKipcbiAqIFdyYXAgYSB7QGxpbmsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW19IGFzIGEgTWFzdHJhIGZpbGVzeXN0ZW0uIE1pc3Npbmcgb3JcbiAqIGluYWNjZXNzaWJsZSByb290cyByZXR1cm4gYHVuZGVmaW5lZGAgc28gb3RoZXIgYWNjZXNzaWJsZSByb290cyByZW1haW5cbiAqIHVzYWJsZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGF0YWJyaWNrc0ZpbGVzeXN0ZW0oXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuICByb290OiBzdHJpbmcsXG4gIHJlYWRPbmx5OiBib29sZWFuID0gdHJ1ZSxcbiAgY3JlYXRlUm9vdDogYm9vbGVhbiA9ICFyZWFkT25seSxcbiAgZmlsZVN5c3RlbUNhY2hlPzogRmlsZVN5c3RlbUNhY2hlLFxuICBjYWNoZU9wdGlvbnM/OiBGaWxlU3lzdGVtQ2FjaGVPcHRpb25zLFxuICBhZGFwdGVyT3B0aW9uczogUGljazxNYXN0cmFGaWxlU3lzdGVtQWRhcHRlck9wdGlvbnMsIFwiZGVzY3JpcHRpb25cIiB8IFwiZGlzcGxheU5hbWVcIj4gPSB7fSxcbik6IFByb21pc2U8XG4gIHwge1xuICAgICAgZmlsZXN5c3RlbTogV29ya3NwYWNlRmlsZXN5c3RlbTtcbiAgICB9XG4gIHwgdW5kZWZpbmVkXG4+IHtcbiAgY29uc3QgZnMgPSBuZXcgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0oe1xuICAgIGNsaWVudDogKCkgPT4gd29ya3NwYWNlQ2xpZW50LnRvTGVnYWN5V29ya3NwYWNlQ2xpZW50KHJlcXVlc3RXb3Jrc3BhY2VDbGllbnQoY2xpZW50KSksXG4gICAgcm9vdCxcbiAgICByZWFkT25seSxcbiAgICBjcmVhdGVSb290LFxuICB9KTtcbiAgY29uc3QgY2FjaGVkID1cbiAgICBmaWxlU3lzdGVtQ2FjaGUgJiYgY2FjaGVPcHRpb25zID8gc2hhcmVkRlMuY2FjaGUoZnMsIGZpbGVTeXN0ZW1DYWNoZSwgY2FjaGVPcHRpb25zKSA6IGZzO1xuICBjb25zdCBzb3VyY2UgPSB2ZXJpZnlGaXJzdEZpbGVTeXN0ZW1BY2Nlc3MoY2FjaGVkLCAoKSA9PiBmcy5zdGF0KFwiLlwiKSwgcm9vdCk7XG4gIGNvbnN0IGZpbGVzeXN0ZW0gPSBmaWxlc3lzdGVtcyhzb3VyY2UsIHsgLi4uYWRhcHRlck9wdGlvbnMsIHJlYWRPbmx5IH0pO1xuICB0cnkge1xuICAgIGF3YWl0IGZpbGVzeXN0ZW0uaW5pdCgpO1xuICAgIGlmIChhd2FpdCBmaWxlc3lzdGVtLmV4aXN0cyhcIi5cIikpIHtcbiAgICAgIHJldHVybiB7IGZpbGVzeXN0ZW0gfTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImRhdGFicmlja3MtbW91bnQ6c2tpcHBlZFwiLCB7XG4gICAgICByb290LFxuICAgICAgcmVhZE9ubHksXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogQGludGVybmFsIEtlZXAgc2VydmljZSBjb250ZXh0IGZyb20gcmVwbGFjaW5nIHRoZSByZXF1ZXN0LXNjb3BlZCB3b3Jrc3BhY2UgY2xpZW50LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlcXVlc3RXb3Jrc3BhY2VDbGllbnQoXG4gIGluaXRpYWxDbGllbnQ6IFdvcmtzcGFjZUNsaWVudCxcbiAgZXhlY3V0aW9uQ29udGV4dDogUmV0dXJuVHlwZTxcbiAgICB0eXBlb2YgYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHRcbiAgPiA9IGFwcGtpdC50cnlHZXRFeGVjdXRpb25Db250ZXh0KCksXG4pOiBXb3Jrc3BhY2VDbGllbnQge1xuICBpZiAoXG4gICAgZXhlY3V0aW9uQ29udGV4dCAmJlxuICAgIFwiaXNVc2VyQ29udGV4dFwiIGluIGV4ZWN1dGlvbkNvbnRleHQgJiZcbiAgICBleGVjdXRpb25Db250ZXh0LmlzVXNlckNvbnRleHQgPT09IHRydWVcbiAgKSB7XG4gICAgcmV0dXJuIGV4ZWN1dGlvbkNvbnRleHQuY2xpZW50O1xuICB9XG4gIHJldHVybiBpbml0aWFsQ2xpZW50O1xufVxuXG5mdW5jdGlvbiB2ZXJpZnlGaXJzdEZpbGVTeXN0ZW1BY2Nlc3M8VEZpbGVTeXN0ZW0gZXh0ZW5kcyBGaWxlU3lzdGVtPihcbiAgZmlsZXN5c3RlbTogVEZpbGVTeXN0ZW0sXG4gIHJlYWRQcm9iZTogKCkgPT4gUHJvbWlzZTx1bmtub3duPixcbiAgcm9vdDogc3RyaW5nLFxuKTogVEZpbGVTeXN0ZW0ge1xuICBsZXQgcmVhZENoZWNrOiBQcm9taXNlPHZvaWQ+IHwgdW5kZWZpbmVkO1xuICBsZXQgd3JpdGVWZXJpZmllZCA9IGZhbHNlO1xuICBjb25zdCBib3VuZE1ldGhvZHMgPSBuZXcgTWFwPFByb3BlcnR5S2V5LCB1bmtub3duPigpO1xuICBjb25zdCByZWFkT3BlcmF0aW9ucyA9IG5ldyBTZXQ8UHJvcGVydHlLZXk+KFtcImV4aXN0c1wiLCBcInJlYWRGaWxlXCIsIFwicmVhZGRpclwiLCBcInN0YXRcIl0pO1xuICBjb25zdCB3cml0ZU9wZXJhdGlvbnMgPSBuZXcgU2V0PFByb3BlcnR5S2V5PihbXG4gICAgXCJhcHBlbmRGaWxlXCIsXG4gICAgXCJjb3B5RmlsZVwiLFxuICAgIFwiZGVsZXRlRmlsZVwiLFxuICAgIFwibWtkaXJcIixcbiAgICBcIm1vdmVGaWxlXCIsXG4gICAgXCJybWRpclwiLFxuICAgIFwid3JpdGVGaWxlXCIsXG4gIF0pO1xuICBjb25zdCB2ZXJpZnlSZWFkID0gYXN5bmMgKCk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgIHJlYWRDaGVjayA/Pz0gUHJvbWlzZS5yZXNvbHZlKHJlYWRQcm9iZSgpKS50aGVuKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHJlYWRDaGVjaztcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmVhZENoZWNrID0gdW5kZWZpbmVkO1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiZGF0YWJyaWNrcy1tb3VudDpyZWFkLWNoZWNrLWZhaWxlZFwiLCB7XG4gICAgICAgIHJvb3QsXG4gICAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnJvciksXG4gICAgICB9KTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gbmV3IFByb3h5KGZpbGVzeXN0ZW0sIHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wZXJ0eSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5LCB0YXJnZXQpO1xuICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gXCJmdW5jdGlvblwiKSByZXR1cm4gdmFsdWU7XG4gICAgICBpZiAoYm91bmRNZXRob2RzLmhhcyhwcm9wZXJ0eSkpIHJldHVybiBib3VuZE1ldGhvZHMuZ2V0KHByb3BlcnR5KTtcbiAgICAgIGNvbnN0IGRlbGVnYXRlZCA9IHZhbHVlLmJpbmQodGFyZ2V0KSBhcyAoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duO1xuICAgICAgbGV0IG1ldGhvZCA9IGRlbGVnYXRlZDtcbiAgICAgIGlmIChyZWFkT3BlcmF0aW9ucy5oYXMocHJvcGVydHkpKSB7XG4gICAgICAgIG1ldGhvZCA9IGFzeW5jICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICBhd2FpdCB2ZXJpZnlSZWFkKCk7XG4gICAgICAgICAgcmV0dXJuIGRlbGVnYXRlZCguLi5hcmdzKTtcbiAgICAgICAgfTtcbiAgICAgIH0gZWxzZSBpZiAod3JpdGVPcGVyYXRpb25zLmhhcyhwcm9wZXJ0eSkpIHtcbiAgICAgICAgbWV0aG9kID0gYXN5bmMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBkZWxlZ2F0ZWQoLi4uYXJncyk7XG4gICAgICAgICAgICBpZiAoIXdyaXRlVmVyaWZpZWQpIHtcbiAgICAgICAgICAgICAgd3JpdGVWZXJpZmllZCA9IHRydWU7XG4gICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhcImRhdGFicmlja3MtbW91bnQ6d3JpdGUtY2hlY2stcGFzc2VkXCIsIHsgcm9vdCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIGlmICghd3JpdGVWZXJpZmllZCkge1xuICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoXCJkYXRhYnJpY2tzLW1vdW50OndyaXRlLWNoZWNrLWZhaWxlZFwiLCB7XG4gICAgICAgICAgICAgICAgcm9vdCxcbiAgICAgICAgICAgICAgICBlcnJvcjogZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyb3IpLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGJvdW5kTWV0aG9kcy5zZXQocHJvcGVydHksIG1ldGhvZCk7XG4gICAgICByZXR1cm4gbWV0aG9kO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIFJ1biBldmVyeSBtb3VudCByZXNvbHZlciBmb3Igb25lIHJlcXVlc3QgYW5kIG1lcmdlIG1vdW50cyBwbHVzIHNraWxsIHBhdGhzLlxuICogTGF0ZXIgcmVzb2x2ZXJzIG92ZXJ3cml0ZSBtb3VudCBrZXlzIGZyb20gZWFybGllciBvbmVzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV29ya3NwYWNlQ29udHJpYnV0aW9uKFxuICByZXNvbHZlcnM6IFdvcmtzcGFjZU1vdW50UmVzb2x2ZXJbXSxcbiAgY29udGV4dDogRGF0YWJyaWNrc1dvcmtzcGFjZUNvbnRleHQsXG4pOiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB7XG4gIGNvbnN0IG1vdW50czogUmVjb3JkPHN0cmluZywgV29ya3NwYWNlRmlsZXN5c3RlbT4gPSB7fTtcbiAgY29uc3Qgc2tpbGxQYXRoczogc3RyaW5nW10gPSBbXTtcblxuICBmb3IgKGNvbnN0IFtpbmRleCwgcmVzb2x2ZXJdIG9mIHJlc29sdmVycy5lbnRyaWVzKCkpIHtcbiAgICBjb25zdCBjb250cmlidXRpb24gPSBhd2FpdCByZXNvbHZlcihjb250ZXh0KTtcbiAgICBsb2dnZXIuZGVidWcoXCJtb3VudHM6cmVzb2x2ZXJcIiwge1xuICAgICAgaW5kZXgsXG4gICAgICBtb3VudEtleXM6IE9iamVjdC5rZXlzKGNvbnRyaWJ1dGlvbi5tb3VudHMpLFxuICAgICAgc2tpbGxQYXRoczogY29udHJpYnV0aW9uLnNraWxsUGF0aHMgPz8gW10sXG4gICAgfSk7XG4gICAgT2JqZWN0LmFzc2lnbihtb3VudHMsIGNvbnRyaWJ1dGlvbi5tb3VudHMpO1xuICAgIGlmIChjb250cmlidXRpb24uc2tpbGxQYXRocz8ubGVuZ3RoKSB7XG4gICAgICBza2lsbFBhdGhzLnB1c2goLi4uY29udHJpYnV0aW9uLnNraWxsUGF0aHMpO1xuICAgIH1cbiAgfVxuXG4gIGxvZ2dlci5kZWJ1ZyhcIm1vdW50czptZXJnZWRcIiwge1xuICAgIG1vdW50S2V5czogT2JqZWN0LmtleXMobW91bnRzKSxcbiAgICBza2lsbFBhdGhzLFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG1vdW50cyxcbiAgICBza2lsbFBhdGhzLFxuICB9O1xufVxuXG4vKipcbiAqIER5bmFtaWMgZmlsZXN5c3RlbSByZXNvbHZlciBwYXNzZWQgdG8gTWFzdHJhIHtAbGluayBXb3Jrc3BhY2V9LlxuICpcbiAqIFJldHVybnMgYSB7QGxpbmsgQ29tcG9zaXRlRmlsZXN5c3RlbX0gb3ZlciBldmVyeSBwYXRoIHRoYXQgcmVzb2x2ZWQgZm9yIHRoZVxuICogcmVxdWVzdC4gQW4gZW1wdHkgY29tcG9zaXRlIGV4cG9zZXMgbm8gaW1wbGljaXQgbG9jYWwgc3RvcmFnZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVdvcmtzcGFjZUZpbGVzeXN0ZW0oXG4gIHJlc29sdmVDb250cmlidXRpb246IChjb250ZXh0OiBEYXRhYnJpY2tzV29ya3NwYWNlQ29udGV4dCkgPT4gUHJvbWlzZTxXb3Jrc3BhY2VNb3VudENvbnRyaWJ1dGlvbj4sXG4gIGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0LFxuICBmaWxlc0NhY2hlPzogRmlsZXNDYWNoZUV4cG9ydHMsXG4gIHNvdXJjZUtleT86IHN0cmluZyxcbik6IFByb21pc2U8V29ya3NwYWNlRmlsZXN5c3RlbT4ge1xuICBjb25zdCB7IG1vdW50cyB9ID0gYXdhaXQgcmVzb2x2ZUNvbnRyaWJ1dGlvbihjb250ZXh0KTtcbiAgY29uc3QgbW91bnRLZXlzID0gT2JqZWN0LmtleXMobW91bnRzKTtcbiAgaWYgKG1vdW50S2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBsb2dnZXIuZGVidWcoXCJmaWxlc3lzdGVtOmVtcHR5XCIsIHtcbiAgICAgIGhhc1JlcXVlc3RDb250ZXh0OiBCb29sZWFuKGNvbnRleHQucmVxdWVzdENvbnRleHQpLFxuICAgIH0pO1xuICAgIHJldHVybiBmaWxlc3lzdGVtcyhuZXcgTWVtb3J5RmlsZVN5c3RlbSh7IHJvb3Q6IFwiL1wiLCByZWFkT25seTogdHJ1ZSB9KSwge1xuICAgICAgcmVhZE9ubHk6IHRydWUsXG4gICAgfSk7XG4gIH1cbiAgbG9nZ2VyLmRlYnVnKFwiZmlsZXN5c3RlbTpjb21wb3NpdGVcIiwgeyBtb3VudEtleXMgfSk7XG4gIGNvbnN0IGxvYWQgPSAoKSA9PiBuZXcgTW91bnRlZENvbXBvc2l0ZUZpbGVzeXN0ZW0oeyBtb3VudHMgfSk7XG4gIGlmICghZmlsZXNDYWNoZSkgcmV0dXJuIGxvYWQoKTtcbiAgY29uc3Qgc2NvcGVkID0gYXdhaXQgcmVzb2x2ZUZpbGVzQ2FjaGVTY29wZShjb250ZXh0KTtcbiAgaWYgKCFzY29wZWQpIHJldHVybiBsb2FkKCk7XG4gIHJldHVybiBmaWxlc0NhY2hlLmZvckZpbGVTeXN0ZW0oc2NvcGVkLnNjb3BlLCB7IHBhdGhzOiBtb3VudEtleXMsIGtleTogc291cmNlS2V5IH0sIGxvYWQpO1xufVxuXG4vKipcbiAqIEV4cGFuZCBza2lsbCByb290cyBpbnRvIGNvbmNyZXRlIHNraWxsIGRpcmVjdG9yaWVzIGFuZCBrZWVwIHRoZSBmaXJzdFxuICogc2FtZS1uYW1lZCBkaXJlY3RvcnkuIE1hc3RyYSBzdGlsbCBvd25zIHBhcnNpbmcsIGluZGV4aW5nLCBhbmQgcmVmcmVzaGVzLFxuICogd2hpbGUgZWFybGllciBjb25maWd1cmVkIHJvb3RzIHJldGFpbiBwcmVjZWRlbmNlIG92ZXIgbGF0ZXIgcm9vdHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVEaXN0aW5jdFNraWxsUGF0aHMoXG4gIGZpbGVzeXN0ZW06IFdvcmtzcGFjZUZpbGVzeXN0ZW0sXG4gIHJvb3RzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgY29uc3Qgc2VsZWN0ZWQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IHJvb3Qgb2Ygcm9vdHMpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZW50cmllcyA9IGF3YWl0IGZpbGVzeXN0ZW0ucmVhZGRpcihyb290KTtcbiAgICAgIGlmIChlbnRyaWVzLnNvbWUoKGVudHJ5KSA9PiBlbnRyeS50eXBlID09PSBcImZpbGVcIiAmJiBlbnRyeS5uYW1lID09PSBcIlNLSUxMLm1kXCIpKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBwb3NpeFBhdGguYmFzZW5hbWUocm9vdCk7XG4gICAgICAgIGlmICghc2VsZWN0ZWQuaGFzKG5hbWUpKSBzZWxlY3RlZC5zZXQobmFtZSwgcm9vdCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICAgIGlmIChlbnRyeS50eXBlICE9PSBcImRpcmVjdG9yeVwiIHx8IHNlbGVjdGVkLmhhcyhlbnRyeS5uYW1lKSkgY29udGludWU7XG4gICAgICAgIHNlbGVjdGVkLnNldChlbnRyeS5uYW1lLCBwb3NpeFBhdGguam9pbihyb290LCBlbnRyeS5uYW1lKSk7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ2dlci5kZWJ1ZyhcInNraWxsLXJvb3Q6c2tpcHBlZFwiLCB7XG4gICAgICAgIHJvb3QsXG4gICAgICAgIGVycm9yOiBlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnJvciksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5zZWxlY3RlZC52YWx1ZXMoKV07XG59XG5cbi8qKiBNZW1vaXplIG9uZSBjb21wbGV0ZSBtb3VudCBjb250cmlidXRpb24gZm9yIGVhY2ggcmVxdWVzdCBjb250ZXh0LiAqL1xuZnVuY3Rpb24gY29udHJpYnV0aW9uUmVzb2x2ZXIoXG4gIHJlc29sdmVyczogV29ya3NwYWNlTW91bnRSZXNvbHZlcltdLFxuKTogKGNvbnRleHQ6IERhdGFicmlja3NXb3Jrc3BhY2VDb250ZXh0KSA9PiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB7XG4gIGNvbnN0IHNjb3BlZCA9IG5ldyBXZWFrTWFwPFJlcXVlc3RDb250ZXh0LCBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPj4oKTtcbiAgbGV0IHVuc2NvcGVkOiBQcm9taXNlPFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uPiB8IHVuZGVmaW5lZDtcbiAgcmV0dXJuIChjb250ZXh0KSA9PiB7XG4gICAgaWYgKCFjb250ZXh0LnJlcXVlc3RDb250ZXh0KSB7XG4gICAgICB1bnNjb3BlZCA/Pz0gcmVzb2x2ZVdvcmtzcGFjZUNvbnRyaWJ1dGlvbihyZXNvbHZlcnMsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHVuc2NvcGVkO1xuICAgIH1cbiAgICBjb25zdCBleGlzdGluZyA9IHNjb3BlZC5nZXQoY29udGV4dC5yZXF1ZXN0Q29udGV4dCk7XG4gICAgaWYgKGV4aXN0aW5nKSByZXR1cm4gZXhpc3Rpbmc7XG4gICAgY29uc3QgcGVuZGluZyA9IHJlc29sdmVXb3Jrc3BhY2VDb250cmlidXRpb24ocmVzb2x2ZXJzLCBjb250ZXh0KTtcbiAgICBzY29wZWQuc2V0KGNvbnRleHQucmVxdWVzdENvbnRleHQsIHBlbmRpbmcpO1xuICAgIHJldHVybiBwZW5kaW5nO1xuICB9O1xufVxuIl19