@workflow/next 5.0.0-beta.25 → 5.0.0-beta.27

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.
@@ -7,18 +7,19 @@ exports.getNextBuilderEager = getNextBuilderEager;
7
7
  const node_fs_1 = require("node:fs");
8
8
  const promises_1 = require("node:fs/promises");
9
9
  const node_path_1 = require("node:path");
10
- const watchpack_1 = __importDefault(require("watchpack"));
10
+ const chokidar_1 = __importDefault(require("chokidar"));
11
+ const watch_rebuild_js_1 = require("./watch-rebuild.js");
11
12
  let CachedNextBuilderEager;
13
+ const importEsm = new Function('specifier', 'return import(specifier)');
12
14
  // Create the eager Next builder dynamically by extending the ESM BaseBuilder.
13
15
  // Exported as getNextBuilderEager() to allow CommonJS modules to import from
14
16
  // the ESM @workflow/builders package via dynamic import at runtime.
15
- async function getNextBuilderEager() {
17
+ async function getNextBuilderEager(buildersModule) {
16
18
  if (CachedNextBuilderEager) {
17
19
  return CachedNextBuilderEager;
18
20
  }
19
- const { BaseBuilder: BaseBuilderClass, WORKFLOW_QUEUE_TRIGGER,
20
- // biome-ignore lint/security/noGlobalEval: Need to use eval here to avoid TypeScript from transpiling the import statement into `require()`
21
- } = (await eval('import("@workflow/builders")'));
21
+ const { BaseBuilder: BaseBuilderClass, WORKFLOW_QUEUE_TRIGGER, detectWorkflowPatterns, parentHasChild, } = buildersModule ??
22
+ (await importEsm('@workflow/builders'));
22
23
  class NextBuilder extends BaseBuilderClass {
23
24
  async build() {
24
25
  const outputDir = await this.findAppDirectory();
@@ -74,8 +75,14 @@ async function getNextBuilderEager() {
74
75
  interimBundleCtx: combinedResult.interimBundleCtx,
75
76
  bundleFinal: combinedResult.bundleFinal,
76
77
  };
77
- const normalizePath = (pathname) => pathname.replace(/\\/g, '/');
78
- let previousTimeInfo = new Map();
78
+ let discoveredEntries = combinedResult.discoveredEntries;
79
+ let stepsManifest = combinedResult.stepsManifest;
80
+ let workflowsManifest = combinedResult.workflowsManifest;
81
+ const stepsOutfile = (0, node_path_1.join)(workflowGeneratedDir, 'flow', '__step_registrations.js');
82
+ const normalizePath = (pathname) => ((0, node_path_1.isAbsolute)(pathname)
83
+ ? pathname
84
+ : (0, node_path_1.resolve)(this.config.workingDir, pathname)).replace(/\\/g, '/');
85
+ const sourceSnapshots = new Map();
79
86
  const watchableExtensions = new Set([
80
87
  '.js',
81
88
  '.jsx',
@@ -103,38 +110,16 @@ async function getNextBuilderEager() {
103
110
  ];
104
111
  const normalizedGeneratedDir = workflowGeneratedDir.replace(/\\/g, '/');
105
112
  ignoredPathFragments.push(normalizedGeneratedDir);
106
- // There is a node.js bug on MacOS which causes closing file watchers to be really slow.
107
- // This limits the number of watchers to mitigate the issue.
108
- // https://github.com/nodejs/node/issues/29949
109
- process.env.WATCHPACK_WATCHER_LIMIT =
110
- process.platform === 'darwin' ? '20' : undefined;
111
- const watcher = new watchpack_1.default({
112
- // Watchpack default is 200ms which adds 200ms of dead time on bootup.
113
- aggregateTimeout: 5,
114
- ignored: (pathname) => {
115
- const normalizedPath = pathname.replace(/\\/g, '/');
116
- const extension = (0, node_path_1.extname)(normalizedPath);
117
- if (extension && !watchableExtensions.has(extension)) {
118
- return true;
119
- }
120
- if (normalizedPath.startsWith(normalizedGeneratedDir)) {
113
+ const hasIgnoredPathFragment = (normalizedPath) => {
114
+ if (normalizedPath.startsWith(normalizedGeneratedDir)) {
115
+ return true;
116
+ }
117
+ for (const fragment of ignoredPathFragments) {
118
+ if (normalizedPath.includes(fragment)) {
121
119
  return true;
122
120
  }
123
- for (const fragment of ignoredPathFragments) {
124
- if (normalizedPath.includes(fragment)) {
125
- return true;
126
- }
127
- }
128
- return false;
129
- },
130
- });
131
- const readTimeInfoEntries = () => {
132
- const rawEntries = watcher.getTimeInfoEntries();
133
- const normalizedEntries = new Map();
134
- for (const [path, info] of rawEntries) {
135
- normalizedEntries.set(normalizePath(path), info);
136
121
  }
137
- return normalizedEntries;
122
+ return false;
138
123
  };
139
124
  let rebuildQueue = Promise.resolve();
140
125
  const enqueue = (task) => {
@@ -143,6 +128,47 @@ async function getNextBuilderEager() {
143
128
  });
144
129
  return rebuildQueue;
145
130
  };
131
+ const readSourceSnapshot = (file) => (0, watch_rebuild_js_1.createSourceSnapshot)({ file, detectWorkflowPatterns });
132
+ const refreshSourceSnapshots = () => (0, watch_rebuild_js_1.replaceSourceSnapshots)({
133
+ discoveredEntries,
134
+ inputFiles: options.inputFiles,
135
+ normalizePath,
136
+ readSnapshot: readSourceSnapshot,
137
+ sourceSnapshots,
138
+ });
139
+ const mergeCombinedManifest = (nextStepsManifest) => ({
140
+ ...nextStepsManifest,
141
+ workflows: {
142
+ ...nextStepsManifest.workflows,
143
+ ...workflowsManifest.workflows,
144
+ },
145
+ classes: {
146
+ ...nextStepsManifest.classes,
147
+ ...workflowsManifest.classes,
148
+ },
149
+ });
150
+ const hotRebuild = async (refreshStepRegistrations) => {
151
+ if (refreshStepRegistrations) {
152
+ if (stepsCtx) {
153
+ await stepsCtx.rebuild();
154
+ }
155
+ else {
156
+ stepsManifest = await this.createStepSourceRegistrationFile({
157
+ inputFiles: options.inputFiles,
158
+ outfile: stepsOutfile,
159
+ tsconfigPath,
160
+ discoveredEntries,
161
+ });
162
+ }
163
+ }
164
+ const workflowResult = await workflowsCtx.interimBundleCtx.rebuild();
165
+ const workflowOutput = workflowResult.outputFiles?.[0]?.text;
166
+ if (!workflowOutput) {
167
+ throw new Error('Invariant: expected workflow output from hot rebuild');
168
+ }
169
+ await workflowsCtx.bundleFinal(workflowOutput);
170
+ await writeManifest(mergeCombinedManifest(stepsManifest));
171
+ };
146
172
  const fullRebuild = async () => {
147
173
  this.clearDiscoveredEntriesCache();
148
174
  const newInputFiles = await this.getInputFiles();
@@ -151,6 +177,9 @@ async function getNextBuilderEager() {
151
177
  await workflowsCtx.interimBundleCtx.dispose();
152
178
  const newCombined = await this.buildCombinedFunction(options);
153
179
  stepsCtx = newCombined.stepsContext;
180
+ discoveredEntries = newCombined.discoveredEntries;
181
+ stepsManifest = newCombined.stepsManifest;
182
+ workflowsManifest = newCombined.workflowsManifest;
154
183
  if (!newCombined?.interimBundleCtx || !newCombined?.bundleFinal) {
155
184
  throw new Error('Invariant: expected workflows bundle context after rebuild');
156
185
  }
@@ -159,107 +188,255 @@ async function getNextBuilderEager() {
159
188
  bundleFinal: newCombined.bundleFinal,
160
189
  };
161
190
  await writeManifest(newCombined.manifest);
191
+ await refreshSourceSnapshots();
162
192
  };
163
193
  const isWatchableFile = (path) => watchableExtensions.has((0, node_path_1.extname)(path));
164
- const normalizeWatchpackPaths = (paths) => {
165
- const normalizedPaths = [];
166
- if (!paths) {
167
- return normalizedPaths;
168
- }
169
- for (const path of paths) {
170
- const normalizedPath = normalizePath(path);
171
- if (isWatchableFile(normalizedPath)) {
172
- normalizedPaths.push(normalizedPath);
194
+ const readKnownFiles = async () => {
195
+ const files = new Set();
196
+ const aliases = new Map();
197
+ const relevantFiles = (0, watch_rebuild_js_1.getRelevantFiles)({
198
+ discoveredEntries,
199
+ inputFiles: options.inputFiles,
200
+ normalizePath,
201
+ });
202
+ const addKnownFile = async (filePath) => {
203
+ let realFilePath = filePath;
204
+ try {
205
+ realFilePath = normalizePath(await (0, promises_1.realpath)(filePath));
173
206
  }
174
- }
175
- return normalizedPaths;
176
- };
177
- const unique = (paths) => [...new Set(paths)];
178
- const getComparableTimestamp = (entry) => entry.timestamp ?? entry.safeTime;
179
- const findRemovedFiles = (currentEntries, previousEntries) => {
180
- const removed = [];
181
- for (const path of previousEntries.keys()) {
182
- if (!currentEntries.has(path) && isWatchableFile(path)) {
183
- removed.push(path);
207
+ catch { }
208
+ const canonicalPath = relevantFiles.has(realFilePath)
209
+ ? realFilePath
210
+ : filePath;
211
+ files.add(canonicalPath);
212
+ aliases.set(filePath, canonicalPath);
213
+ aliases.set(realFilePath, canonicalPath);
214
+ return canonicalPath;
215
+ };
216
+ const visit = async (directory) => {
217
+ let dirents;
218
+ try {
219
+ dirents = await (0, promises_1.readdir)(directory, { withFileTypes: true });
184
220
  }
185
- }
186
- return removed;
187
- };
188
- const findAddedAndModifiedFiles = (currentEntries, previousEntries) => {
189
- const added = [];
190
- const modified = [];
191
- for (const [path, info] of currentEntries) {
192
- if (!isWatchableFile(path)) {
193
- continue;
221
+ catch {
222
+ return;
194
223
  }
195
- const previous = previousEntries.get(path);
196
- if (!previous) {
197
- added.push(path);
198
- continue;
224
+ await Promise.all(dirents.map(async (dirent) => {
225
+ const filePath = normalizePath((0, node_path_1.join)(directory, dirent.name));
226
+ if (hasIgnoredPathFragment(filePath)) {
227
+ return;
228
+ }
229
+ if (dirent.isDirectory()) {
230
+ await visit(filePath);
231
+ return;
232
+ }
233
+ let stats;
234
+ try {
235
+ stats = await (0, promises_1.stat)(filePath);
236
+ }
237
+ catch {
238
+ return;
239
+ }
240
+ if (stats.isDirectory()) {
241
+ await visit(filePath);
242
+ return;
243
+ }
244
+ if (!stats.isFile() || !isWatchableFile(filePath)) {
245
+ return;
246
+ }
247
+ await addKnownFile(filePath);
248
+ }));
249
+ };
250
+ await visit(this.config.workingDir);
251
+ return { files, aliases, addKnownFile };
252
+ };
253
+ const mergeFileChanges = (left, right) => ({
254
+ addedFiles: unique([...left.addedFiles, ...right.addedFiles]),
255
+ modifiedFiles: unique([
256
+ ...left.modifiedFiles,
257
+ ...right.modifiedFiles,
258
+ ]),
259
+ removedFiles: unique([...left.removedFiles, ...right.removedFiles]),
260
+ });
261
+ const unique = (paths) => [...new Set(paths)];
262
+ const classifyFileChanges = ({ changedFiles, knownFiles, removedFiles, }) => {
263
+ const addedFiles = [];
264
+ const modifiedFiles = [];
265
+ for (const file of unique(changedFiles)) {
266
+ if (knownFiles.has(file)) {
267
+ modifiedFiles.push(file);
199
268
  }
200
- if (getComparableTimestamp(info) !== getComparableTimestamp(previous)) {
201
- modified.push(path);
269
+ else {
270
+ addedFiles.push(file);
271
+ knownFiles.add(file);
202
272
  }
203
273
  }
204
- return { added, modified };
205
- };
206
- const determineFileChanges = (currentEntries, previousEntries) => {
207
- const removedFiles = findRemovedFiles(currentEntries, previousEntries);
208
- const { added, modified } = findAddedAndModifiedFiles(currentEntries, previousEntries);
274
+ for (const file of removedFiles) {
275
+ knownFiles.delete(file);
276
+ }
209
277
  return {
210
- addedFiles: added,
211
- modifiedFiles: modified,
212
- removedFiles,
278
+ addedFiles,
279
+ modifiedFiles,
280
+ removedFiles: unique(removedFiles),
213
281
  };
214
282
  };
215
- const mergeFileChanges = ({ currentEntries, previousEntries, timestampChanges, eventChangedFiles, eventRemovedFiles, }) => ({
216
- addedFiles: unique([
217
- ...timestampChanges.addedFiles,
218
- ...eventChangedFiles.filter((path) => currentEntries.has(path) && !previousEntries.has(path)),
219
- ]),
220
- modifiedFiles: unique([
221
- ...timestampChanges.modifiedFiles,
222
- ...eventChangedFiles,
223
- ]),
224
- removedFiles: unique([
225
- ...timestampChanges.removedFiles,
226
- ...eventRemovedFiles,
227
- ]),
228
- });
229
283
  const hasFileChanges = ({ addedFiles, modifiedFiles, removedFiles, }) => addedFiles.length > 0 ||
230
284
  modifiedFiles.length > 0 ||
231
285
  removedFiles.length > 0;
232
- let isInitial = true;
233
- watcher.on('aggregated', (changes, removals) => {
234
- const currentEntries = readTimeInfoEntries();
235
- const eventChangedFiles = normalizeWatchpackPaths(changes);
236
- const eventRemovedFiles = normalizeWatchpackPaths(removals);
237
- const timestampChanges = determineFileChanges(currentEntries, previousTimeInfo);
238
- const fileChanges = mergeFileChanges({
239
- currentEntries,
240
- previousEntries: previousTimeInfo,
241
- timestampChanges,
242
- eventChangedFiles,
243
- eventRemovedFiles,
244
- });
245
- previousTimeInfo = currentEntries;
246
- if (isInitial) {
247
- isInitial = false;
248
- if (eventChangedFiles.length === 0 &&
249
- eventRemovedFiles.length === 0) {
250
- return;
251
- }
286
+ const logDevHmr = (...args) => {
287
+ if (process.env.WORKFLOW_DEV_HMR_LOGS === '1') {
288
+ console.log(...args);
252
289
  }
290
+ };
291
+ await refreshSourceSnapshots();
292
+ let { files: knownFiles, aliases: knownFileAliases, addKnownFile: rememberKnownFile, } = await readKnownFiles();
293
+ const refreshKnownFiles = async () => {
294
+ const nextKnown = await readKnownFiles();
295
+ knownFiles = nextKnown.files;
296
+ knownFileAliases = nextKnown.aliases;
297
+ rememberKnownFile = nextKnown.addKnownFile;
298
+ };
299
+ const processFileChanges = async (fileChanges) => {
253
300
  if (!hasFileChanges(fileChanges)) {
254
301
  return;
255
302
  }
256
- enqueue(async () => {
303
+ const decision = await (0, watch_rebuild_js_1.classifyRebuild)({
304
+ discoveredEntries,
305
+ fileChanges,
306
+ inputFiles: options.inputFiles,
307
+ normalizePath,
308
+ parentHasChild,
309
+ readSnapshot: readSourceSnapshot,
310
+ sourceSnapshots,
311
+ });
312
+ if (decision.kind === 'none') {
313
+ logDevHmr('workflow dev hmr: skip');
314
+ for (const [file, snapshot] of decision.snapshots || []) {
315
+ sourceSnapshots.set(file, snapshot);
316
+ }
317
+ return;
318
+ }
319
+ if (decision.kind === 'full') {
320
+ logDevHmr('workflow dev hmr: full rediscovery');
257
321
  await fullRebuild();
322
+ await refreshKnownFiles();
323
+ return;
324
+ }
325
+ logDevHmr(`workflow dev hmr: hot rebuild${decision.refreshStepRegistrations ? ' with step registration refresh' : ''}`);
326
+ await hotRebuild(decision.refreshStepRegistrations);
327
+ for (const [file, snapshot] of decision.snapshots) {
328
+ sourceSnapshots.set(file, snapshot);
329
+ }
330
+ };
331
+ let pendingFileChanges = {
332
+ addedFiles: [],
333
+ modifiedFiles: [],
334
+ removedFiles: [],
335
+ };
336
+ let flushTimer;
337
+ const scheduleFileChanges = (fileChanges) => {
338
+ pendingFileChanges = mergeFileChanges(pendingFileChanges, fileChanges);
339
+ if (flushTimer) {
340
+ return;
341
+ }
342
+ flushTimer = setTimeout(() => {
343
+ const fileChanges = pendingFileChanges;
344
+ pendingFileChanges = {
345
+ addedFiles: [],
346
+ modifiedFiles: [],
347
+ removedFiles: [],
348
+ };
349
+ flushTimer = undefined;
350
+ enqueue(() => processFileChanges(fileChanges));
351
+ }, 10);
352
+ };
353
+ const resolveExistingEventPath = async (pathname) => {
354
+ const normalizedPath = normalizePath(pathname);
355
+ if (!isWatchableFile(normalizedPath)) {
356
+ return;
357
+ }
358
+ const knownPath = knownFileAliases.get(normalizedPath);
359
+ if (knownPath) {
360
+ return knownPath;
361
+ }
362
+ try {
363
+ const realFilePath = normalizePath(await (0, promises_1.realpath)(normalizedPath));
364
+ return knownFileAliases.get(realFilePath) ?? normalizedPath;
365
+ }
366
+ catch {
367
+ return normalizedPath;
368
+ }
369
+ };
370
+ const handleFileAdded = async (pathname) => {
371
+ const normalizedPath = normalizePath(pathname);
372
+ if (!isWatchableFile(normalizedPath)) {
373
+ return;
374
+ }
375
+ const existingPath = await resolveExistingEventPath(normalizedPath);
376
+ const wasKnown = existingPath ? knownFiles.has(existingPath) : false;
377
+ const canonicalPath = await rememberKnownFile(normalizedPath);
378
+ knownFiles.add(canonicalPath);
379
+ scheduleFileChanges({
380
+ addedFiles: wasKnown ? [] : [canonicalPath],
381
+ modifiedFiles: wasKnown ? [canonicalPath] : [],
382
+ removedFiles: [],
383
+ });
384
+ };
385
+ const handleFileChanged = async (pathname) => {
386
+ const canonicalPath = await resolveExistingEventPath(pathname);
387
+ if (!canonicalPath) {
388
+ return;
389
+ }
390
+ const fileChanges = classifyFileChanges({
391
+ changedFiles: [canonicalPath],
392
+ knownFiles,
393
+ removedFiles: [],
394
+ });
395
+ if (!knownFileAliases.has(canonicalPath)) {
396
+ await rememberKnownFile(canonicalPath);
397
+ }
398
+ scheduleFileChanges(fileChanges);
399
+ };
400
+ const handleFileRemoved = (pathname) => {
401
+ const normalizedPath = normalizePath(pathname);
402
+ if (!isWatchableFile(normalizedPath)) {
403
+ return;
404
+ }
405
+ const canonicalPath = knownFileAliases.get(normalizedPath) ?? normalizedPath;
406
+ const fileChanges = classifyFileChanges({
407
+ changedFiles: [],
408
+ knownFiles,
409
+ removedFiles: [canonicalPath],
258
410
  });
411
+ knownFileAliases.delete(normalizedPath);
412
+ scheduleFileChanges(fileChanges);
413
+ };
414
+ const watcher = chokidar_1.default.watch(this.config.workingDir, {
415
+ ignoreInitial: true,
416
+ followSymlinks: true,
417
+ ignored: (pathname) => {
418
+ const normalizedPath = normalizePath(String(pathname));
419
+ const extension = (0, node_path_1.extname)(normalizedPath);
420
+ if (extension && !watchableExtensions.has(extension)) {
421
+ return true;
422
+ }
423
+ return hasIgnoredPathFragment(normalizedPath);
424
+ },
425
+ });
426
+ watcher.on('add', (pathname) => {
427
+ void handleFileAdded(pathname);
428
+ });
429
+ watcher.on('change', (pathname) => {
430
+ void handleFileChanged(pathname);
431
+ });
432
+ watcher.on('unlink', (pathname) => {
433
+ handleFileRemoved(pathname);
434
+ });
435
+ watcher.on('error', (error) => {
436
+ console.error('Workflow dev watcher error', error);
259
437
  });
260
- watcher.watch({
261
- directories: [this.config.workingDir],
262
- startTime: Date.now(),
438
+ watcher.on('ready', () => {
439
+ logDevHmr('workflow dev hmr: ready');
263
440
  });
264
441
  }
265
442
  }
@@ -368,4 +545,4 @@ async function getNextBuilderEager() {
368
545
  CachedNextBuilderEager = NextBuilder;
369
546
  return NextBuilder;
370
547
  }
371
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1lYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZGVyLWVhZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBZUEsa0RBZ2hCQztBQS9oQkQscUNBQW9DO0FBQ3BDLCtDQUE0RTtBQUM1RSx5Q0FBNkQ7QUFNN0QsMERBQWtDO0FBRWxDLElBQUksc0JBQTJCLENBQUM7QUFFaEMsOEVBQThFO0FBQzlFLDZFQUE2RTtBQUM3RSxvRUFBb0U7QUFDN0QsS0FBSyxVQUFVLG1CQUFtQjtJQUN2QyxJQUFJLHNCQUFzQixFQUFFLENBQUM7UUFDM0IsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBRUQsTUFBTSxFQUNKLFdBQVcsRUFBRSxnQkFBZ0IsRUFDN0Isc0JBQXNCO0lBQ3RCLDRJQUE0STtNQUM3SSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQ2IsOEJBQThCLENBQy9CLENBQXdDLENBQUM7SUFFMUMsTUFBTSxXQUFZLFNBQVEsZ0JBQWdCO1FBS3hDLEtBQUssQ0FBQyxLQUFLO1lBQ1QsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNoRCxNQUFNLG9CQUFvQixHQUFHLElBQUEsZ0JBQUksRUFBQyxTQUFTLEVBQUUseUJBQXlCLENBQUMsQ0FBQztZQUV4RSxrQ0FBa0M7WUFDbEMsTUFBTSxJQUFBLGdCQUFLLEVBQUMsb0JBQW9CLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN2RCxNQUFNLElBQUEsb0JBQVMsRUFBQyxJQUFBLGdCQUFJLEVBQUMsb0JBQW9CLEVBQUUsWUFBWSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFL0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDOUMsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUVuRCxNQUFN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TyxNQUFNLENBQUM7WUFDaEIsQ0FBQztZQUVELElBQUksTUFBTSxXQUFXLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDbkMsdURBQXVEO2dCQUN2RCxNQUFNLElBQUEsZ0JBQUssRUFBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFDNUMsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUVELE1BQU0sSUFBSSxLQUFLLENBQ2IscUhBQXFILENBQ3RILENBQUM7UUFDSixDQUFDO0tBQ0Y7SUFFRCxzQkFBc0IsR0FBRyxXQUFXLENBQUM7SUFDckMsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvbnN0YW50cyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgYWNjZXNzLCBjb3B5RmlsZSwgbWtkaXIsIHN0YXQsIHdyaXRlRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgZXh0bmFtZSwgam9pbiwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHR5cGUge1xuICBOZXh0Q29uZmlnIGFzIEJ1aWxkZXJOZXh0Q29uZmlnLFxuICBXb3JrZmxvd01hbmlmZXN0LFxufSBmcm9tICdAd29ya2Zsb3cvYnVpbGRlcnMnO1xuaW1wb3J0IHR5cGUgeyBOZXh0Q29uZmlnIGFzIFByb2plY3ROZXh0Q29uZmlnIH0gZnJvbSAnbmV4dCc7XG5pbXBvcnQgV2F0Y2hwYWNrIGZyb20gJ3dhdGNocGFjayc7XG5cbmxldCBDYWNoZWROZXh0QnVpbGRlckVhZ2VyOiBhbnk7XG5cbi8vIENyZWF0ZSB0aGUgZWFnZXIgTmV4dCBidWlsZGVyIGR5bmFtaWNhbGx5IGJ5IGV4dGVuZGluZyB0aGUgRVNNIEJhc2VCdWlsZGVyLlxuLy8gRXhwb3J0ZWQgYXMgZ2V0TmV4dEJ1aWxkZXJFYWdlcigpIHRvIGFsbG93IENvbW1vbkpTIG1vZHVsZXMgdG8gaW1wb3J0IGZyb21cbi8vIHRoZSBFU00gQHdvcmtmbG93L2J1aWxkZXJzIHBhY2thZ2UgdmlhIGR5bmFtaWMgaW1wb3J0IGF0IHJ1bnRpbWUuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TmV4dEJ1aWxkZXJFYWdlcigpIHtcbiAgaWYgKENhY2hlZE5leHRCdWlsZGVyRWFnZXIpIHtcbiAgICByZXR1cm4gQ2FjaGVkTmV4dEJ1aWxkZXJFYWdlcjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBCYXNlQnVpbGRlcjogQmFzZUJ1aWxkZXJDbGFzcyxcbiAgICBXT1JLRkxPV19RVUVVRV9UUklHR0VSLFxuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3NlY3VyaXR5L25vR2xvYmFsRXZhbDogTmVlZCB0byB1c2UgZXZhbCBoZXJlIHRvIGF2b2lkIFR5cGVTY3JpcHQgZnJvbSB0cmFuc3BpbGluZyB0aGUgaW1wb3J0IHN0YXRlbWVudCBpbnRvIGByZXF1aXJlKClgXG4gIH0gPSAoYXdhaXQgZXZhbChcbiAgICAnaW1wb3J0KFwiQHdvcmtmbG93L2J1aWxkZXJzXCIpJ1xuICApKSBhcyB0eXBlb2YgaW1wb3J0KCdAd29ya2Zsb3cvYnVpbGRlcnMnKTtcblxuICBjbGFzcyBOZXh0QnVpbGRlciBleHRlbmRzIEJhc2VCdWlsZGVyQ2xhc3Mge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIGNvbmZpZzogQnVpbGRlck5leHRDb25maWcgJiB7XG4gICAgICBwYWdlRXh0ZW5zaW9uczogTm9uTnVsbGFibGU8UHJvamVjdE5leHRDb25maWdbJ3BhZ2VFeHRlbnNpb25zJ10+O1xuICAgIH07XG5cbiAgICBhc3luYyBidWlsZCgpIHtcbiAgICAgIGNvbnN0IG91dHB1dERpciA9IGF3YWl0IHRoaXMuZmluZEFwcERpcmVjdG9yeSgpO1xuICAgICAgY29uc3Qgd29ya2Zsb3dHZW5lcmF0ZWREaXIgPSBqb2luKG91dHB1dERpciwgJy53ZWxsLWtub3duL3dvcmtmbG93L3YxJyk7XG5cbiAgICAgIC8vIEVuc3VyZSBvdXRwdXQgZGlyZWN0b3JpZXMgZXhpc3RcbiAgICAgIGF3YWl0IG1rZGlyKHdvcmtmbG93R2VuZXJhdGVkRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnLmdpdGlnbm9yZScpLCAnKicpO1xuXG4gICAgICBjb25zdCBpbnB1dEZpbGVzID0gYXdhaXQgdGhpcy5nZXRJbnB1dEZpbGVzKCk7XG4gICAgICBjb25zdCB0c2NvbmZpZ1BhdGggPSBhd2FpdCB0aGlzLmZpbmRUc0NvbmZpZ1BhdGgoKTtcblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgaW5wdXRGaWxlcyxcbiAgICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXIsXG4gICAgICAgIHRzY29uZmlnUGF0aCxcbiAgICAgIH07XG5cbiAgICAgIC8vIFYyOiBCdWlsZCBjb21iaW5lZCByb3V0ZSAocmVwbGFjZXMgc2VwYXJhdGUgc3RlcCArIGZsb3cgcm91dGVzKVxuICAgICAgY29uc3QgY29tYmluZWRSZXN1bHQgPSBhd2FpdCB0aGlzLmJ1aWxkQ29tYmluZWRGdW5jdGlvbihvcHRpb25zKTtcbiAgICAgIGF3YWl0IHRoaXMuYnVpbGRXZWJob29rUm91dGUoeyB3b3JrZmxvd0dlbmVyYXRlZERpciB9KTtcblxuICAgICAgY29uc3Qgd3JpdGVNYW5pZmVzdCA9IGFzeW5jIChcbiAgICAgICAgc291cmNlTWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3QgfCB1bmRlZmluZWRcbiAgICAgICkgPT4ge1xuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IHtcbiAgICAgICAgICBzdGVwczogeyAuLi5zb3VyY2VNYW5pZmVzdD8uc3RlcHMgfSxcbiAgICAgICAgICB3b3JrZmxvd3M6IHsgLi4uc291cmNlTWFuaWZlc3Q/LndvcmtmbG93cyB9LFxuICAgICAgICAgIGNsYXNzZXM6IHsgLi4uc291cmNlTWFuaWZlc3Q/LmNsYXNzZXMgfSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBXcml0ZSBtYW5pZmVzdFxuICAgICAgICBjb25zdCB3b3JrZmxvd0J1bmRsZVBhdGggPSBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnZmxvdy9yb3V0ZS5qcycpO1xuICAgICAgICBjb25zdCBtYW5pZmVzdEpzb24gPSBhd2FpdCB0aGlzLmNyZWF0ZU1hbmlmZXN0KHtcbiAgICAgICAgICB3b3JrZmxvd0J1bmRsZVBhdGgsXG4gICAgICAgICAgbWFuaWZlc3REaXI6IHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgICAgIG1hbmlmZXN0LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFeHBvc2UgbWFuaWZlc3QgYXMgYSBzdGF0aWMgZmlsZSB3aGVuIFdPUktGTE9XX1BVQkxJQ19NQU5JRkVTVD0xLlxuICAgICAgICBpZiAodGhpcy5zaG91bGRFeHBvc2VQdWJsaWNNYW5pZmVzdCAmJiBtYW5pZmVzdEpzb24pIHtcbiAgICAgICAgICBjb25zdCBwdWJsaWNNYW5pZmVzdERpciA9IGpvaW4oXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICAgICAgJ3B1YmxpYy8ud2VsbC1rbm93bi93b3JrZmxvdy92MSdcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IG1rZGlyKHB1YmxpY01hbmlmZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuVkVSQ0VMX0RFUExPWU1FTlRfSUQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4ocHVibGljTWFuaWZlc3REaXIsICcuZ2l0aWdub3JlJyksICcqJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGNvcHlGaWxlKFxuICAgICAgICAgICAgam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJ21hbmlmZXN0Lmpzb24nKSxcbiAgICAgICAgICAgIGpvaW4ocHVibGljTWFuaWZlc3REaXIsICdtYW5pZmVzdC5qc29uJylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB3cml0ZU1hbmlmZXN0KGNvbWJpbmVkUmVzdWx0Py5tYW5pZmVzdCk7XG5cbiAgICAgIGF3YWl0IHRoaXMud3JpdGVGdW5jdGlvbnNDb25maWcob3V0cHV0RGlyKTtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnLndhdGNoKSB7XG4gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB3YXRjaCBtb2RlIGZvciBjb21iaW5lZCBidW5kbGVcbiAgICAgICAgLy8gRm9yIG5vdywgZmFsbCBiYWNrIHRvIGZ1bGwgcmVidWlsZCBvbiBmaWxlIGNoYW5nZXNcbiAgICAgICAgaWYgKCFjb21iaW5lZFJlc3VsdD8uaW50ZXJpbUJ1bmRsZUN0eCB8fCAhY29tYmluZWRSZXN1bHQuYnVuZGxlRmluYWwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnSW52YXJpYW50OiBleHBlY3RlZCB3b3JrZmxvdyBidWlsZCBjb250ZXh0IGluIHdhdGNoIG1vZGUnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgcmVnaXN0cmF0aW9ucyBtYXkgYmUgZW1pdHRlZCBhcyBzb3VyY2UgaW1wb3J0cyB3aXRob3V0IGFuXG4gICAgICAgIC8vIGVzYnVpbGQgY29udGV4dCB3aGVuIGV4dGVybmFsaXplTm9uU3RlcHMgaXMgZW5hYmxlZC5cbiAgICAgICAgbGV0IHN0ZXBzQ3R4ID0gY29tYmluZWRSZXN1bHQuc3RlcHNDb250ZXh0O1xuICAgICAgICBsZXQgd29ya2Zsb3dzQ3R4ID0ge1xuICAgICAgICAgIGludGVyaW1CdW5kbGVDdHg6IGNvbWJpbmVkUmVzdWx0LmludGVyaW1CdW5kbGVDdHgsXG4gICAgICAgICAgYnVuZGxlRmluYWw6IGNvbWJpbmVkUmVzdWx0LmJ1bmRsZUZpbmFsLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZVBhdGggPSAocGF0aG5hbWU6IHN0cmluZykgPT5cbiAgICAgICAgICBwYXRobmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIHR5cGUgV2F0Y2hwYWNrVGltZUluZm9FbnRyeSA9IHtcbiAgICAgICAgICBzYWZlVGltZTogbnVtYmVyO1xuICAgICAgICAgIHRpbWVzdGFtcD86IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICAgICAgdHlwZSBGaWxlQ2hhbmdlcyA9IHtcbiAgICAgICAgICBhZGRlZEZpbGVzOiBzdHJpbmdbXTtcbiAgICAgICAgICBtb2RpZmllZEZpbGVzOiBzdHJpbmdbXTtcbiAgICAgICAgICByZW1vdmVkRmlsZXM6IHN0cmluZ1tdO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgcHJldmlvdXNUaW1lSW5mbyA9IG5ldyBNYXA8c3RyaW5nLCBXYXRjaHBhY2tUaW1lSW5mb0VudHJ5PigpO1xuXG4gICAgICAgIGNvbnN0IHdhdGNoYWJsZUV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgICAgICAgICAnLmpzJyxcbiAgICAgICAgICAnLmpzeCcsXG4gICAgICAgICAgJy50cycsXG4gICAgICAgICAgJy50c3gnLFxuICAgICAgICAgICcubXRzJyxcbiAgICAgICAgICAnLmN0cycsXG4gICAgICAgICAgJy5janMnLFxuICAgICAgICAgICcubWpzJyxcbiAgICAgICAgXSk7XG4gICAgICAgIGNvbnN0IGlnbm9yZWRQYXRoRnJhZ21lbnRzID0gW1xuICAgICAgICAgICcvLmdpdC8nLFxuICAgICAgICAgICcvbm9kZV9tb2R1bGVzLycsXG4gICAgICAgICAgJy8ubmV4dC8nLFxuICAgICAgICAgICcvLnR1cmJvLycsXG4gICAgICAgICAgJy8udmVyY2VsLycsXG4gICAgICAgICAgJy9kaXN0LycsXG4gICAgICAgICAgJy9idWlsZC8nLFxuICAgICAgICAgICcvb3V0LycsXG4gICAgICAgICAgJy8uY2FjaGUvJyxcbiAgICAgICAgICAnLy55YXJuLycsXG4gICAgICAgICAgJy8ucG5wbS1zdG9yZS8nLFxuICAgICAgICAgICcvLnBhcmNlbC1jYWNoZS8nLFxuICAgICAgICAgICcvLndlbGwta25vd24vd29ya2Zsb3cvJyxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEdlbmVyYXRlZERpciA9IHdvcmtmbG93R2VuZXJhdGVkRGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgaWdub3JlZFBhdGhGcmFnbWVudHMucHVzaChub3JtYWxpemVkR2VuZXJhdGVkRGlyKTtcblxuICAgICAgICAvLyBUaGVyZSBpcyBhIG5vZGUuanMgYnVnIG9uIE1hY09TIHdoaWNoIGNhdXNlcyBjbG9zaW5nIGZpbGUgd2F0Y2hlcnMgdG8gYmUgcmVhbGx5IHNsb3cuXG4gICAgICAgIC8vIFRoaXMgbGltaXRzIHRoZSBudW1iZXIgb2Ygd2F0Y2hlcnMgdG8gbWl0aWdhdGUgdGhlIGlzc3VlLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzI5OTQ5XG4gICAgICAgIHByb2Nlc3MuZW52LldBVENIUEFDS19XQVRDSEVSX0xJTUlUID1cbiAgICAgICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJyA/ICcyMCcgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3Qgd2F0Y2hlciA9IG5ldyBXYXRjaHBhY2soe1xuICAgICAgICAgIC8vIFdhdGNocGFjayBkZWZhdWx0IGlzIDIwMG1zIHdoaWNoIGFkZHMgMjAwbXMgb2YgZGVhZCB0aW1lIG9uIGJvb3R1cC5cbiAgICAgICAgICBhZ2dyZWdhdGVUaW1lb3V0OiA1LFxuICAgICAgICAgIGlnbm9yZWQ6IChwYXRobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGhuYW1lLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUobm9ybWFsaXplZFBhdGgpO1xuICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiAhd2F0Y2hhYmxlRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKG5vcm1hbGl6ZWRHZW5lcmF0ZWREaXIpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBmcmFnbWVudCBvZiBpZ25vcmVkUGF0aEZyYWdtZW50cykge1xuICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFBhdGguaW5jbHVkZXMoZnJhZ21lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZWFkVGltZUluZm9FbnRyaWVzID0gKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJhd0VudHJpZXMgPSB3YXRjaGVyLmdldFRpbWVJbmZvRW50cmllcygpIGFzIE1hcDxcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIFdhdGNocGFja1RpbWVJbmZvRW50cnlcbiAgICAgICAgICA+O1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIFdhdGNocGFja1RpbWVJbmZvRW50cnk+KCk7XG4gICAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgaW5mb10gb2YgcmF3RW50cmllcykge1xuICAgICAgICAgICAgbm9ybWFsaXplZEVudHJpZXMuc2V0KG5vcm1hbGl6ZVBhdGgocGF0aCksIGluZm8pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbm9ybWFsaXplZEVudHJpZXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHJlYnVpbGRRdWV1ZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgICAgIGNvbnN0IGVucXVldWUgPSAodGFzazogKCkgPT4gUHJvbWlzZTx2b2lkPikgPT4ge1xuICAgICAgICAgIHJlYnVpbGRRdWV1ZSA9IHJlYnVpbGRRdWV1ZS50aGVuKHRhc2spLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHByb2Nlc3MgZmlsZSBjaGFuZ2UnLCBlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlYnVpbGRRdWV1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBmdWxsUmVidWlsZCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0aGlzLmNsZWFyRGlzY292ZXJlZEVudHJpZXNDYWNoZSgpO1xuICAgICAgICAgIGNvbnN0IG5ld0lucHV0RmlsZXMgPSBhd2FpdCB0aGlzLmdldElucHV0RmlsZXMoKTtcbiAgICAgICAgICBvcHRpb25zLmlucHV0RmlsZXMgPSBuZXdJbnB1dEZpbGVzO1xuXG4gICAgICAgICAgYXdhaXQgc3RlcHNDdHg/LmRpc3Bvc2UoKTtcbiAgICAgICAgICBhd2FpdCB3b3JrZmxvd3NDdHguaW50ZXJpbUJ1bmRsZUN0eC5kaXNwb3NlKCk7XG5cbiAgICAgICAgICBjb25zdCBuZXdDb21iaW5lZCA9IGF3YWl0IHRoaXMuYnVpbGRDb21iaW5lZEZ1bmN0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgIHN0ZXBzQ3R4ID0gbmV3Q29tYmluZWQuc3RlcHNDb250ZXh0O1xuXG4gICAgICAgICAgaWYgKCFuZXdDb21iaW5lZD8uaW50ZXJpbUJ1bmRsZUN0eCB8fCAhbmV3Q29tYmluZWQ/LmJ1bmRsZUZpbmFsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdJbnZhcmlhbnQ6IGV4cGVjdGVkIHdvcmtmbG93cyBidW5kbGUgY29udGV4dCBhZnRlciByZWJ1aWxkJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgd29ya2Zsb3dzQ3R4ID0ge1xuICAgICAgICAgICAgaW50ZXJpbUJ1bmRsZUN0eDogbmV3Q29tYmluZWQuaW50ZXJpbUJ1bmRsZUN0eCxcbiAgICAgICAgICAgIGJ1bmRsZUZpbmFsOiBuZXdDb21iaW5lZC5idW5kbGVGaW5hbCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgYXdhaXQgd3JpdGVNYW5pZmVzdChuZXdDb21iaW5lZC5tYW5pZmVzdCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaXNXYXRjaGFibGVGaWxlID0gKHBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICB3YXRjaGFibGVFeHRlbnNpb25zLmhhcyhleHRuYW1lKHBhdGgpKTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVXYXRjaHBhY2tQYXRocyA9IChwYXRocz86IEl0ZXJhYmxlPHN0cmluZz4pID0+IHtcbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgaWYgKCFwYXRocykge1xuICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRocztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplUGF0aChwYXRoKTtcbiAgICAgICAgICAgIGlmIChpc1dhdGNoYWJsZUZpbGUobm9ybWFsaXplZFBhdGgpKSB7XG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWRQYXRocy5wdXNoKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbm9ybWFsaXplZFBhdGhzO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHVuaXF1ZSA9IChwYXRoczogc3RyaW5nW10pID0+IFsuLi5uZXcgU2V0KHBhdGhzKV07XG5cbiAgICAgICAgY29uc3QgZ2V0Q29tcGFyYWJsZVRpbWVzdGFtcCA9IChlbnRyeTogV2F0Y2hwYWNrVGltZUluZm9FbnRyeSkgPT5cbiAgICAgICAgICBlbnRyeS50aW1lc3RhbXAgPz8gZW50cnkuc2FmZVRpbWU7XG5cbiAgICAgICAgY29uc3QgZmluZFJlbW92ZWRGaWxlcyA9IChcbiAgICAgICAgICBjdXJyZW50RW50cmllczogTWFwPHN0cmluZywgV2F0Y2hwYWNrVGltZUluZm9FbnRyeT4sXG4gICAgICAgICAgcHJldmlvdXNFbnRyaWVzOiBNYXA8c3RyaW5nLCBXYXRjaHBhY2tUaW1lSW5mb0VudHJ5PlxuICAgICAgICApID0+IHtcbiAgICAgICAgICBjb25zdCByZW1vdmVkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBwcmV2aW91c0VudHJpZXMua2V5cygpKSB7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRFbnRyaWVzLmhhcyhwYXRoKSAmJiBpc1dhdGNoYWJsZUZpbGUocGF0aCkpIHtcbiAgICAgICAgICAgICAgcmVtb3ZlZC5wdXNoKHBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVtb3ZlZDtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBmaW5kQWRkZWRBbmRNb2RpZmllZEZpbGVzID0gKFxuICAgICAgICAgIGN1cnJlbnRFbnRyaWVzOiBNYXA8c3RyaW5nLCBXYXRjaHBhY2tUaW1lSW5mb0VudHJ5PixcbiAgICAgICAgICBwcmV2aW91c0VudHJpZXM6IE1hcDxzdHJpbmcsIFdhdGNocGFja1RpbWVJbmZvRW50cnk+XG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFkZGVkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IG1vZGlmaWVkOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgaW5mb10gb2YgY3VycmVudEVudHJpZXMpIHtcbiAgICAgICAgICAgIGlmICghaXNXYXRjaGFibGVGaWxlKHBhdGgpKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IHByZXZpb3VzRW50cmllcy5nZXQocGF0aCk7XG4gICAgICAgICAgICBpZiAoIXByZXZpb3VzKSB7XG4gICAgICAgICAgICAgIGFkZGVkLnB1c2gocGF0aCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGdldENvbXBhcmFibGVUaW1lc3RhbXAoaW5mbykgIT09IGdldENvbXBhcmFibGVUaW1lc3RhbXAocHJldmlvdXMpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgbW9kaWZpZWQucHVzaChwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4geyBhZGRlZCwgbW9kaWZpZWQgfTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBkZXRlcm1pbmVGaWxlQ2hhbmdlcyA9IChcbiAgICAgICAgICBjdXJyZW50RW50cmllczogTWFwPHN0cmluZywgV2F0Y2hwYWNrVGltZUluZm9FbnRyeT4sXG4gICAgICAgICAgcHJldmlvdXNFbnRyaWVzOiBNYXA8c3RyaW5nLCBXYXRjaHBhY2tUaW1lSW5mb0VudHJ5PlxuICAgICAgICApOiBGaWxlQ2hhbmdlcyA9PiB7XG4gICAgICAgICAgY29uc3QgcmVtb3ZlZEZpbGVzID0gZmluZFJlbW92ZWRGaWxlcyhcbiAgICAgICAgICAgIGN1cnJlbnRFbnRyaWVzLFxuICAgICAgICAgICAgcHJldmlvdXNFbnRyaWVzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB7IGFkZGVkLCBtb2RpZmllZCB9ID0gZmluZEFkZGVkQW5kTW9kaWZpZWRGaWxlcyhcbiAgICAgICAgICAgIGN1cnJlbnRFbnRyaWVzLFxuICAgICAgICAgICAgcHJldmlvdXNFbnRyaWVzXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhZGRlZEZpbGVzOiBhZGRlZCxcbiAgICAgICAgICAgIG1vZGlmaWVkRmlsZXM6IG1vZGlmaWVkLFxuICAgICAgICAgICAgcmVtb3ZlZEZpbGVzLFxuICAgICAgICAgIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgbWVyZ2VGaWxlQ2hhbmdlcyA9ICh7XG4gICAgICAgICAgY3VycmVudEVudHJpZXMsXG4gICAgICAgICAgcHJldmlvdXNFbnRyaWVzLFxuICAgICAgICAgIHRpbWVzdGFtcENoYW5nZXMsXG4gICAgICAgICAgZXZlbnRDaGFuZ2VkRmlsZXMsXG4gICAgICAgICAgZXZlbnRSZW1vdmVkRmlsZXMsXG4gICAgICAgIH06IHtcbiAgICAgICAgICBjdXJyZW50RW50cmllczogTWFwPHN0cmluZywgV2F0Y2hwYWNrVGltZUluZm9FbnRyeT47XG4gICAgICAgICAgcHJldmlvdXNFbnRyaWVzOiBNYXA8c3RyaW5nLCBXYXRjaHBhY2tUaW1lSW5mb0VudHJ5PjtcbiAgICAgICAgICB0aW1lc3RhbXBDaGFuZ2VzOiBGaWxlQ2hhbmdlcztcbiAgICAgICAgICBldmVudENoYW5nZWRGaWxlczogc3RyaW5nW107XG4gICAgICAgICAgZXZlbnRSZW1vdmVkRmlsZXM6IHN0cmluZ1tdO1xuICAgICAgICB9KTogRmlsZUNoYW5nZXMgPT4gKHtcbiAgICAgICAgICBhZGRlZEZpbGVzOiB1bmlxdWUoW1xuICAgICAgICAgICAgLi4udGltZXN0YW1wQ2hhbmdlcy5hZGRlZEZpbGVzLFxuICAgICAgICAgICAgLi4uZXZlbnRDaGFuZ2VkRmlsZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAocGF0aCkgPT4gY3VycmVudEVudHJpZXMuaGFzKHBhdGgpICYmICFwcmV2aW91c0VudHJpZXMuaGFzKHBhdGgpXG4gICAgICAgICAgICApLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIG1vZGlmaWVkRmlsZXM6IHVuaXF1ZShbXG4gICAgICAgICAgICAuLi50aW1lc3RhbXBDaGFuZ2VzLm1vZGlmaWVkRmlsZXMsXG4gICAgICAgICAgICAuLi5ldmVudENoYW5nZWRGaWxlcyxcbiAgICAgICAgICBdKSxcbiAgICAgICAgICByZW1vdmVkRmlsZXM6IHVuaXF1ZShbXG4gICAgICAgICAgICAuLi50aW1lc3RhbXBDaGFuZ2VzLnJlbW92ZWRGaWxlcyxcbiAgICAgICAgICAgIC4uLmV2ZW50UmVtb3ZlZEZpbGVzLFxuICAgICAgICAgIF0pLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBoYXNGaWxlQ2hhbmdlcyA9ICh7XG4gICAgICAgICAgYWRkZWRGaWxlcyxcbiAgICAgICAgICBtb2RpZmllZEZpbGVzLFxuICAgICAgICAgIHJlbW92ZWRGaWxlcyxcbiAgICAgICAgfTogRmlsZUNoYW5nZXMpID0+XG4gICAgICAgICAgYWRkZWRGaWxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgbW9kaWZpZWRGaWxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgcmVtb3ZlZEZpbGVzLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgbGV0IGlzSW5pdGlhbCA9IHRydWU7XG5cbiAgICAgICAgd2F0Y2hlci5vbihcbiAgICAgICAgICAnYWdncmVnYXRlZCcsXG4gICAgICAgICAgKGNoYW5nZXM/OiBTZXQ8c3RyaW5nPiwgcmVtb3ZhbHM/OiBTZXQ8c3RyaW5nPikgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEVudHJpZXMgPSByZWFkVGltZUluZm9FbnRyaWVzKCk7XG4gICAgICAgICAgICBjb25zdCBldmVudENoYW5nZWRGaWxlcyA9IG5vcm1hbGl6ZVdhdGNocGFja1BhdGhzKGNoYW5nZXMpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnRSZW1vdmVkRmlsZXMgPSBub3JtYWxpemVXYXRjaHBhY2tQYXRocyhyZW1vdmFscyk7XG4gICAgICAgICAgICBjb25zdCB0aW1lc3RhbXBDaGFuZ2VzID0gZGV0ZXJtaW5lRmlsZUNoYW5nZXMoXG4gICAgICAgICAgICAgIGN1cnJlbnRFbnRyaWVzLFxuICAgICAgICAgICAgICBwcmV2aW91c1RpbWVJbmZvXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBmaWxlQ2hhbmdlcyA9IG1lcmdlRmlsZUNoYW5nZXMoe1xuICAgICAgICAgICAgICBjdXJyZW50RW50cmllcyxcbiAgICAgICAgICAgICAgcHJldmlvdXNFbnRyaWVzOiBwcmV2aW91c1RpbWVJbmZvLFxuICAgICAgICAgICAgICB0aW1lc3RhbXBDaGFuZ2VzLFxuICAgICAgICAgICAgICBldmVudENoYW5nZWRGaWxlcyxcbiAgICAgICAgICAgICAgZXZlbnRSZW1vdmVkRmlsZXMsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcHJldmlvdXNUaW1lSW5mbyA9IGN1cnJlbnRFbnRyaWVzO1xuXG4gICAgICAgICAgICBpZiAoaXNJbml0aWFsKSB7XG4gICAgICAgICAgICAgIGlzSW5pdGlhbCA9IGZhbHNlO1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXZlbnRDaGFuZ2VkRmlsZXMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgZXZlbnRSZW1vdmVkRmlsZXMubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWhhc0ZpbGVDaGFuZ2VzKGZpbGVDaGFuZ2VzKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVucXVldWUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBhd2FpdCBmdWxsUmVidWlsZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIHdhdGNoZXIud2F0Y2goe1xuICAgICAgICAgIGRpcmVjdG9yaWVzOiBbdGhpcy5jb25maWcud29ya2luZ0Rpcl0sXG4gICAgICAgICAgc3RhcnRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2V0SW5wdXRGaWxlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICBjb25zdCBpbnB1dEZpbGVzID0gYXdhaXQgc3VwZXIuZ2V0SW5wdXRGaWxlcygpO1xuICAgICAgcmV0dXJuIGlucHV0RmlsZXMuZmlsdGVyKChmaWxlKSA9PiB7XG4gICAgICAgIGNvbnN0IGVudHJ5ID0gcmVsYXRpdmUodGhpcy5jb25maWcud29ya2luZ0RpciwgZmlsZSkucmVwbGFjZUFsbChcbiAgICAgICAgICAnXFxcXCcsXG4gICAgICAgICAgJy8nXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gTWF0Y2ggQXBwIFJvdXRlciByb3V0ZSwgcGFnZSwgYW5kIGxheW91dCBlbnRyeXBvaW50cyBpbiBhcHAvIG9yIHNyYy9hcHAvLlxuICAgICAgICBpZiAoL14oPzphcHB8c3JjXFwvYXBwKVxcLyg/Oi4qXFwvKT8oPzpyb3V0ZXxwYWdlfGxheW91dClcXC4vLnRlc3QoZW50cnkpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXRjaCBldmVyeSBQYWdlcyBSb3V0ZXIgZW50cnlwb2ludCBpbiBwYWdlcy8gb3Igc3JjL3BhZ2VzLy5cbiAgICAgICAgaWYgKC9eKD86cGFnZXN8c3JjXFwvcGFnZXMpXFwvLy50ZXN0KGVudHJ5KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWF0Y2ggTmV4dC5qcyByb290IGVudHJ5cG9pbnRzIGF0IHRoZSBwcm9qZWN0IHJvb3Qgb3IgdW5kZXIgc3JjLy5cbiAgICAgICAgcmV0dXJuIFsnaW5zdHJ1bWVudGF0aW9uJywgJ21pZGRsZXdhcmUnLCAncHJveHknXS5zb21lKChuYW1lKSA9PlxuICAgICAgICAgIHRoaXMuY29uZmlnLnBhZ2VFeHRlbnNpb25zLnNvbWUoXG4gICAgICAgICAgICAoZXh0ZW5zaW9uKSA9PlxuICAgICAgICAgICAgICBlbnRyeSA9PT0gYCR7bmFtZX0uJHtleHRlbnNpb259YCB8fFxuICAgICAgICAgICAgICBlbnRyeSA9PT0gYHNyYy8ke25hbWV9LiR7ZXh0ZW5zaW9ufWBcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIHdyaXRlRnVuY3Rpb25zQ29uZmlnKG91dHB1dERpcjogc3RyaW5nKSB7XG4gICAgICAvLyB3ZSBkb24ndCBydW4gdGhpcyBpbiBkZXZlbG9wbWVudCBtb2RlIGFzIGl0J3Mgbm90IG5lZWRlZFxuICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVjIgY29tYmluZWQgY29uZmlnOiBzaW5nbGUgdHJpZ2dlciBoYW5kbGVzIGJvdGggd29ya2Zsb3cgYW5kIHN0ZXAgZXhlY3V0aW9uLlxuICAgICAgLy8gVGhlIHN0ZXAgcm91dGUgbm8gbG9uZ2VyIG5lZWRzIGl0cyBvd24gdHJpZ2dlciBzaW5jZSBzdGVwcyBhcmUgZXhlY3V0ZWRcbiAgICAgIC8vIGlubGluZSBieSB0aGUgY29tYmluZWQgaGFuZGxlciBvciBxdWV1ZWQgYmFjayB0byBfX3drZl93b3JrZmxvd18qIHdpdGggc3RlcElkLlxuICAgICAgY29uc3QgZ2VuZXJhdGVkQ29uZmlnID0ge1xuICAgICAgICB2ZXJzaW9uOiAnMCcsXG4gICAgICAgIHdvcmtmbG93czoge1xuICAgICAgICAgIG1heER1cmF0aW9uOiAnbWF4JyxcbiAgICAgICAgICBleHBlcmltZW50YWxUcmlnZ2VyczogW1dPUktGTE9XX1FVRVVFX1RSSUdHRVJdLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgYXdhaXQgd3JpdGVGaWxlKFxuICAgICAgICBqb2luKG91dHB1dERpciwgJy53ZWxsLWtub3duL3dvcmtmbG93L3YxL2NvbmZpZy5qc29uJyksXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGdlbmVyYXRlZENvbmZpZywgbnVsbCwgMilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVjI6IEJ1aWxkIGNvbWJpbmVkIHJvdXRlIHRoYXQgaGFuZGxlcyBib3RoIHdvcmtmbG93IGFuZCBzdGVwIGV4ZWN1dGlvbi5cbiAgICAgKi9cbiAgICBwcml2YXRlIGFzeW5jIGJ1aWxkQ29tYmluZWRGdW5jdGlvbih7XG4gICAgICBpbnB1dEZpbGVzLFxuICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXIsXG4gICAgICB0c2NvbmZpZ1BhdGgsXG4gICAgfToge1xuICAgICAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcjogc3RyaW5nO1xuICAgICAgdHNjb25maWdQYXRoPzogc3RyaW5nO1xuICAgIH0pIHtcbiAgICAgIGNvbnN0IGZsb3dSb3V0ZURpciA9IGpvaW4od29ya2Zsb3dHZW5lcmF0ZWREaXIsICdmbG93Jyk7XG4gICAgICBhd2FpdCBta2RpcihmbG93Um91dGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVDb21iaW5lZEJ1bmRsZSh7XG4gICAgICAgIGZvcm1hdDogJ2VzbScsXG4gICAgICAgIGlucHV0RmlsZXMsXG4gICAgICAgIHN0ZXBzT3V0ZmlsZTogam9pbihmbG93Um91dGVEaXIsICdfX3N0ZXBfcmVnaXN0cmF0aW9ucy5qcycpLFxuICAgICAgICBmbG93T3V0ZmlsZTogam9pbihmbG93Um91dGVEaXIsICdyb3V0ZS5qcycpLFxuICAgICAgICBidW5kbGVGaW5hbE91dHB1dDogZmFsc2UsXG4gICAgICAgIGV4dGVybmFsaXplTm9uU3RlcHM6IHRydWUsXG4gICAgICAgIHNvdXJjZVN0ZXBSZWdpc3RyYXRpb25JbXBvcnRzOiB0cnVlLFxuICAgICAgICB0c2NvbmZpZ1BhdGgsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGJ1aWxkV2ViaG9va1JvdXRlKHtcbiAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgIH06IHtcbiAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyOiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3Qgd2ViaG9va1JvdXRlRmlsZSA9IGpvaW4oXG4gICAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgICAnd2ViaG9vay9bdG9rZW5dL3JvdXRlLmpzJ1xuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlV2ViaG9va0J1bmRsZSh7XG4gICAgICAgIG91dGZpbGU6IHdlYmhvb2tSb3V0ZUZpbGUsXG4gICAgICAgIGJ1bmRsZTogZmFsc2UsIC8vIE5leHQuanMgZG9lc24ndCBuZWVkIGJ1bmRsaW5nXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZpbmRBcHBEaXJlY3RvcnkoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIGNvbnN0IGFwcERpciA9IHJlc29sdmUodGhpcy5jb25maWcud29ya2luZ0RpciwgJ2FwcCcpO1xuICAgICAgY29uc3Qgc3JjQXBwRGlyID0gcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAnc3JjL2FwcCcpO1xuICAgICAgY29uc3QgcGFnZXNEaXIgPSByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICdwYWdlcycpO1xuICAgICAgY29uc3Qgc3JjUGFnZXNEaXIgPSByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICdzcmMvcGFnZXMnKTtcblxuICAgICAgLy8gSGVscGVyIHRvIGNoZWNrIGlmIGEgcGF0aCBleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5XG4gICAgICBjb25zdCBpc0RpcmVjdG9yeSA9IGFzeW5jIChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhY2Nlc3MocGF0aCwgY29uc3RhbnRzLkZfT0spO1xuICAgICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgc3RhdChwYXRoKTtcbiAgICAgICAgICBpZiAoIXN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeTogJHtwYXRofWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdub3QgYSBkaXJlY3RvcnknKSkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBDaGVjayBpZiBhcHAgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgaWYgKGF3YWl0IGlzRGlyZWN0b3J5KGFwcERpcikpIHtcbiAgICAgICAgcmV0dXJuIGFwcERpcjtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgc3JjL2FwcCBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBpZiAoYXdhaXQgaXNEaXJlY3Rvcnkoc3JjQXBwRGlyKSkge1xuICAgICAgICByZXR1cm4gc3JjQXBwRGlyO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBhcHAgZGlyZWN0b3J5IGV4aXN0cywgY2hlY2sgZm9yIHBhZ2VzIGRpcmVjdG9yeSBhbmQgY3JlYXRlIGFwcCBuZXh0IHRvIGl0XG4gICAgICBpZiAoYXdhaXQgaXNEaXJlY3RvcnkocGFnZXNEaXIpKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhcHAgZGlyZWN0b3J5IG5leHQgdG8gcGFnZXMgZGlyZWN0b3J5XG4gICAgICAgIGF3YWl0IG1rZGlyKGFwcERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiBhcHBEaXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChhd2FpdCBpc0RpcmVjdG9yeShzcmNQYWdlc0RpcikpIHtcbiAgICAgICAgLy8gQ3JlYXRlIHNyYy9hcHAgZGlyZWN0b3J5IG5leHQgdG8gc3JjL3BhZ2VzIGRpcmVjdG9yeVxuICAgICAgICBhd2FpdCBta2RpcihzcmNBcHBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gc3JjQXBwRGlyO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDb3VsZCBub3QgZmluZCBOZXh0LmpzIGFwcCBvciBwYWdlcyBkaXJlY3RvcnkuIEV4cGVjdGVkIG9uZSBvZjogXCJhcHBcIiwgXCJzcmMvYXBwXCIsIFwicGFnZXNcIiwgb3IgXCJzcmMvcGFnZXNcIiB0byBleGlzdC4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIENhY2hlZE5leHRCdWlsZGVyRWFnZXIgPSBOZXh0QnVpbGRlcjtcbiAgcmV0dXJuIE5leHRCdWlsZGVyO1xufVxuIl19
548
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1lYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZGVyLWVhZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBa0NBLGtEQTJyQkM7QUE3dEJELHFDQUFpRDtBQUNqRCwrQ0FRMEI7QUFDMUIseUNBQXlFO0FBS3pFLHdEQUFnQztBQUVoQyx5REFPNEI7QUFFNUIsSUFBSSxzQkFBMkIsQ0FBQztBQUNoQyxNQUFNLFNBQVMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsMEJBQTBCLENBRXZELENBQUM7QUFFaEIsOEVBQThFO0FBQzlFLDZFQUE2RTtBQUM3RSxvRUFBb0U7QUFDN0QsS0FBSyxVQUFVLG1CQUFtQixDQUN2QyxjQUFvRDtJQUVwRCxJQUFJLHNCQUFzQixFQUFFLENBQUM7UUFDM0IsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBRUQsTUFBTSxFQUNKLFdBQVcsRUFBRSxnQkFBZ0IsRUFDN0Isc0JBQXNCLEVBQ3RCLHNCQUFzQixFQUN0QixjQUFjLEdBQ2YsR0FBRyxjQUFjO1FBQ2xCLENBQUMsTUFBTSxTQUFTLENBQXNDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztJQUU3RSxNQUFNLFdBQVksU0FBUSxnQkFBZ0I7UUFLeEMsS0FBSyxDQUFDLEtBQUs7WUFDVCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2hELE1BQU0sb0JBQW9CLEdBQUcsSUFBQSxnQkFBSSxFQUFDLFNBQVMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1lBRXhFLGtDQUFrQztZQUNsQyxNQUFNLElBQUEsZ0JBQUssRUFBQyxvQkFBb0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sSUFBQSxvQkFBUyxFQUFDLElBQUEsZ0JBQUksRUFBQyxvQkFBb0IsRUFBRSxZQUFZLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUUv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LENBQUM7b0JBQ1YsQ0FBQztvQkFDRCxPQUFPLEtBQUssQ0FBQztnQkFDZixDQUFDO1lBQ0gsQ0FBQyxDQUFDO1lBRUYsZ0NBQWdDO1lBQ2hDLElBQUksTUFBTSxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDOUIsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztZQUVELG9DQUFvQztZQUNwQyxJQUFJLE1BQU0sV0FBVyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7WUFFRCxrRkFBa0Y7WUFDbEYsSUFBSSxNQUFNLFdBQVcsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO2dCQUNoQywrQ0FBK0M7Z0JBQy9DLE1BQU0sSUFBQSxnQkFBSyxFQUFDLE1BQU0sRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUN6QyxPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1lBRUQsSUFBSSxNQUFNLFdBQVcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUNuQyx1REFBdUQ7Z0JBQ3ZELE1BQU0sSUFBQSxnQkFBSyxFQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUM1QyxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBRUQsTUFBTSxJQUFJLEtBQUssQ0FDYixxSEFBcUgsQ0FDdEgsQ0FBQztRQUNKLENBQUM7S0FDRjtJQUVELHNCQUFzQixHQUFHLFdBQVcsQ0FBQztJQUNyQyxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29uc3RhbnRzLCB0eXBlIERpcmVudCB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgYWNjZXNzLFxuICBjb3B5RmlsZSxcbiAgbWtkaXIsXG4gIHJlYWRkaXIsXG4gIHJlYWxwYXRoLFxuICBzdGF0LFxuICB3cml0ZUZpbGUsXG59IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgZXh0bmFtZSwgaXNBYnNvbHV0ZSwgam9pbiwgcmVsYXRpdmUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHR5cGUge1xuICBOZXh0Q29uZmlnIGFzIEJ1aWxkZXJOZXh0Q29uZmlnLFxuICBXb3JrZmxvd01hbmlmZXN0LFxufSBmcm9tICdAd29ya2Zsb3cvYnVpbGRlcnMnO1xuaW1wb3J0IGNob2tpZGFyIGZyb20gJ2Nob2tpZGFyJztcbmltcG9ydCB0eXBlIHsgTmV4dENvbmZpZyBhcyBQcm9qZWN0TmV4dENvbmZpZyB9IGZyb20gJ25leHQnO1xuaW1wb3J0IHtcbiAgY2xhc3NpZnlSZWJ1aWxkLFxuICBjcmVhdGVTb3VyY2VTbmFwc2hvdCxcbiAgdHlwZSBGaWxlQ2hhbmdlcyxcbiAgZ2V0UmVsZXZhbnRGaWxlcyxcbiAgcmVwbGFjZVNvdXJjZVNuYXBzaG90cyxcbiAgdHlwZSBTb3VyY2VTbmFwc2hvdCxcbn0gZnJvbSAnLi93YXRjaC1yZWJ1aWxkLmpzJztcblxubGV0IENhY2hlZE5leHRCdWlsZGVyRWFnZXI6IGFueTtcbmNvbnN0IGltcG9ydEVzbSA9IG5ldyBGdW5jdGlvbignc3BlY2lmaWVyJywgJ3JldHVybiBpbXBvcnQoc3BlY2lmaWVyKScpIGFzIDxUPihcbiAgc3BlY2lmaWVyOiBzdHJpbmdcbikgPT4gUHJvbWlzZTxUPjtcblxuLy8gQ3JlYXRlIHRoZSBlYWdlciBOZXh0IGJ1aWxkZXIgZHluYW1pY2FsbHkgYnkgZXh0ZW5kaW5nIHRoZSBFU00gQmFzZUJ1aWxkZXIuXG4vLyBFeHBvcnRlZCBhcyBnZXROZXh0QnVpbGRlckVhZ2VyKCkgdG8gYWxsb3cgQ29tbW9uSlMgbW9kdWxlcyB0byBpbXBvcnQgZnJvbVxuLy8gdGhlIEVTTSBAd29ya2Zsb3cvYnVpbGRlcnMgcGFja2FnZSB2aWEgZHluYW1pYyBpbXBvcnQgYXQgcnVudGltZS5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXROZXh0QnVpbGRlckVhZ2VyKFxuICBidWlsZGVyc01vZHVsZT86IHR5cGVvZiBpbXBvcnQoJ0B3b3JrZmxvdy9idWlsZGVycycpXG4pIHtcbiAgaWYgKENhY2hlZE5leHRCdWlsZGVyRWFnZXIpIHtcbiAgICByZXR1cm4gQ2FjaGVkTmV4dEJ1aWxkZXJFYWdlcjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBCYXNlQnVpbGRlcjogQmFzZUJ1aWxkZXJDbGFzcyxcbiAgICBXT1JLRkxPV19RVUVVRV9UUklHR0VSLFxuICAgIGRldGVjdFdvcmtmbG93UGF0dGVybnMsXG4gICAgcGFyZW50SGFzQ2hpbGQsXG4gIH0gPSBidWlsZGVyc01vZHVsZSA/P1xuICAoYXdhaXQgaW1wb3J0RXNtPHR5cGVvZiBpbXBvcnQoJ0B3b3JrZmxvdy9idWlsZGVycycpPignQHdvcmtmbG93L2J1aWxkZXJzJykpO1xuXG4gIGNsYXNzIE5leHRCdWlsZGVyIGV4dGVuZHMgQmFzZUJ1aWxkZXJDbGFzcyB7XG4gICAgcHJvdGVjdGVkIGRlY2xhcmUgY29uZmlnOiBCdWlsZGVyTmV4dENvbmZpZyAmIHtcbiAgICAgIHBhZ2VFeHRlbnNpb25zOiBOb25OdWxsYWJsZTxQcm9qZWN0TmV4dENvbmZpZ1sncGFnZUV4dGVuc2lvbnMnXT47XG4gICAgfTtcblxuICAgIGFzeW5jIGJ1aWxkKCkge1xuICAgICAgY29uc3Qgb3V0cHV0RGlyID0gYXdhaXQgdGhpcy5maW5kQXBwRGlyZWN0b3J5KCk7XG4gICAgICBjb25zdCB3b3JrZmxvd0dlbmVyYXRlZERpciA9IGpvaW4ob3V0cHV0RGlyLCAnLndlbGwta25vd24vd29ya2Zsb3cvdjEnKTtcblxuICAgICAgLy8gRW5zdXJlIG91dHB1dCBkaXJlY3RvcmllcyBleGlzdFxuICAgICAgYXdhaXQgbWtkaXIod29ya2Zsb3dHZW5lcmF0ZWREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4od29ya2Zsb3dHZW5lcmF0ZWREaXIsICcuZ2l0aWdub3JlJyksICcqJyk7XG5cbiAgICAgIGNvbnN0IGlucHV0RmlsZXMgPSBhd2FpdCB0aGlzLmdldElucHV0RmlsZXMoKTtcbiAgICAgIGNvbnN0IHRzY29uZmlnUGF0aCA9IGF3YWl0IHRoaXMuZmluZFRzQ29uZmlnUGF0aCgpO1xuXG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBpbnB1dEZpbGVzLFxuICAgICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcixcbiAgICAgICAgdHNjb25maWdQYXRoLFxuICAgICAgfTtcblxuICAgICAgLy8gVjI6IEJ1aWxkIGNvbWJpbmVkIHJvdXRlIChyZXBsYWNlcyBzZXBhcmF0ZSBzdGVwICsgZmxvdyByb3V0ZXMpXG4gICAgICBjb25zdCBjb21iaW5lZFJlc3VsdCA9IGF3YWl0IHRoaXMuYnVpbGRDb21iaW5lZEZ1bmN0aW9uKG9wdGlvbnMpO1xuICAgICAgYXdhaXQgdGhpcy5idWlsZFdlYmhvb2tSb3V0ZSh7IHdvcmtmbG93R2VuZXJhdGVkRGlyIH0pO1xuXG4gICAgICBjb25zdCB3cml0ZU1hbmlmZXN0ID0gYXN5bmMgKFxuICAgICAgICBzb3VyY2VNYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdCB8IHVuZGVmaW5lZFxuICAgICAgKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0ge1xuICAgICAgICAgIHN0ZXBzOiB7IC4uLnNvdXJjZU1hbmlmZXN0Py5zdGVwcyB9LFxuICAgICAgICAgIHdvcmtmbG93czogeyAuLi5zb3VyY2VNYW5pZmVzdD8ud29ya2Zsb3dzIH0sXG4gICAgICAgICAgY2xhc3NlczogeyAuLi5zb3VyY2VNYW5pZmVzdD8uY2xhc3NlcyB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFdyaXRlIG1hbmlmZXN0XG4gICAgICAgIGNvbnN0IHdvcmtmbG93QnVuZGxlUGF0aCA9IGpvaW4od29ya2Zsb3dHZW5lcmF0ZWREaXIsICdmbG93L3JvdXRlLmpzJyk7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0SnNvbiA9IGF3YWl0IHRoaXMuY3JlYXRlTWFuaWZlc3Qoe1xuICAgICAgICAgIHdvcmtmbG93QnVuZGxlUGF0aCxcbiAgICAgICAgICBtYW5pZmVzdERpcjogd29ya2Zsb3dHZW5lcmF0ZWREaXIsXG4gICAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV4cG9zZSBtYW5pZmVzdCBhcyBhIHN0YXRpYyBmaWxlIHdoZW4gV09SS0ZMT1dfUFVCTElDX01BTklGRVNUPTEuXG4gICAgICAgIGlmICh0aGlzLnNob3VsZEV4cG9zZVB1YmxpY01hbmlmZXN0ICYmIG1hbmlmZXN0SnNvbikge1xuICAgICAgICAgIGNvbnN0IHB1YmxpY01hbmlmZXN0RGlyID0gam9pbihcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICAgICAgICAncHVibGljLy53ZWxsLWtub3duL3dvcmtmbG93L3YxJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgbWtkaXIocHVibGljTWFuaWZlc3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5WRVJDRUxfREVQTE9ZTUVOVF9JRCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUoam9pbihwdWJsaWNNYW5pZmVzdERpciwgJy5naXRpZ25vcmUnKSwgJyonKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgY29weUZpbGUoXG4gICAgICAgICAgICBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnbWFuaWZlc3QuanNvbicpLFxuICAgICAgICAgICAgam9pbihwdWJsaWNNYW5pZmVzdERpciwgJ21hbmlmZXN0Lmpzb24nKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHdyaXRlTWFuaWZlc3QoY29tYmluZWRSZXN1bHQ/Lm1hbmlmZXN0KTtcblxuICAgICAgYXdhaXQgdGhpcy53cml0ZUZ1bmN0aW9uc0NvbmZpZyhvdXRwdXREaXIpO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcud2F0Y2gpIHtcbiAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHdhdGNoIG1vZGUgZm9yIGNvbWJpbmVkIGJ1bmRsZVxuICAgICAgICAvLyBGb3Igbm93LCBmYWxsIGJhY2sgdG8gZnVsbCByZWJ1aWxkIG9uIGZpbGUgY2hhbmdlc1xuICAgICAgICBpZiAoIWNvbWJpbmVkUmVzdWx0Py5pbnRlcmltQnVuZGxlQ3R4IHx8ICFjb21iaW5lZFJlc3VsdC5idW5kbGVGaW5hbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdJbnZhcmlhbnQ6IGV4cGVjdGVkIHdvcmtmbG93IGJ1aWxkIGNvbnRleHQgaW4gd2F0Y2ggbW9kZSdcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RlcCByZWdpc3RyYXRpb25zIG1heSBiZSBlbWl0dGVkIGFzIHNvdXJjZSBpbXBvcnRzIHdpdGhvdXQgYW5cbiAgICAgICAgLy8gZXNidWlsZCBjb250ZXh0IHdoZW4gZXh0ZXJuYWxpemVOb25TdGVwcyBpcyBlbmFibGVkLlxuICAgICAgICBsZXQgc3RlcHNDdHggPSBjb21iaW5lZFJlc3VsdC5zdGVwc0NvbnRleHQ7XG4gICAgICAgIGxldCB3b3JrZmxvd3NDdHggPSB7XG4gICAgICAgICAgaW50ZXJpbUJ1bmRsZUN0eDogY29tYmluZWRSZXN1bHQuaW50ZXJpbUJ1bmRsZUN0eCxcbiAgICAgICAgICBidW5kbGVGaW5hbDogY29tYmluZWRSZXN1bHQuYnVuZGxlRmluYWwsXG4gICAgICAgIH07XG4gICAgICAgIGxldCBkaXNjb3ZlcmVkRW50cmllcyA9IGNvbWJpbmVkUmVzdWx0LmRpc2NvdmVyZWRFbnRyaWVzO1xuICAgICAgICBsZXQgc3RlcHNNYW5pZmVzdCA9IGNvbWJpbmVkUmVzdWx0LnN0ZXBzTWFuaWZlc3Q7XG4gICAgICAgIGxldCB3b3JrZmxvd3NNYW5pZmVzdCA9IGNvbWJpbmVkUmVzdWx0LndvcmtmbG93c01hbmlmZXN0O1xuICAgICAgICBjb25zdCBzdGVwc091dGZpbGUgPSBqb2luKFxuICAgICAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgICAgICdmbG93JyxcbiAgICAgICAgICAnX19zdGVwX3JlZ2lzdHJhdGlvbnMuanMnXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplUGF0aCA9IChwYXRobmFtZTogc3RyaW5nKSA9PlxuICAgICAgICAgIChpc0Fic29sdXRlKHBhdGhuYW1lKVxuICAgICAgICAgICAgPyBwYXRobmFtZVxuICAgICAgICAgICAgOiByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsIHBhdGhuYW1lKVxuICAgICAgICAgICkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgICBjb25zdCBzb3VyY2VTbmFwc2hvdHMgPSBuZXcgTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+KCk7XG5cbiAgICAgICAgY29uc3Qgd2F0Y2hhYmxlRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAgICAgICAgICcuanMnLFxuICAgICAgICAgICcuanN4JyxcbiAgICAgICAgICAnLnRzJyxcbiAgICAgICAgICAnLnRzeCcsXG4gICAgICAgICAgJy5tdHMnLFxuICAgICAgICAgICcuY3RzJyxcbiAgICAgICAgICAnLmNqcycsXG4gICAgICAgICAgJy5tanMnLFxuICAgICAgICBdKTtcbiAgICAgICAgY29uc3QgaWdub3JlZFBhdGhGcmFnbWVudHMgPSBbXG4gICAgICAgICAgJy8uZ2l0LycsXG4gICAgICAgICAgJy9ub2RlX21vZHVsZXMvJyxcbiAgICAgICAgICAnLy5uZXh0LycsXG4gICAgICAgICAgJy8udHVyYm8vJyxcbiAgICAgICAgICAnLy52ZXJjZWwvJyxcbiAgICAgICAgICAnL2Rpc3QvJyxcbiAgICAgICAgICAnL2J1aWxkLycsXG4gICAgICAgICAgJy9vdXQvJyxcbiAgICAgICAgICAnLy5jYWNoZS8nLFxuICAgICAgICAgICcvLnlhcm4vJyxcbiAgICAgICAgICAnLy5wbnBtLXN0b3JlLycsXG4gICAgICAgICAgJy8ucGFyY2VsLWNhY2hlLycsXG4gICAgICAgICAgJy8ud2VsbC1rbm93bi93b3JrZmxvdy8nLFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkR2VuZXJhdGVkRGlyID0gd29ya2Zsb3dHZW5lcmF0ZWREaXIucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgICBpZ25vcmVkUGF0aEZyYWdtZW50cy5wdXNoKG5vcm1hbGl6ZWRHZW5lcmF0ZWREaXIpO1xuXG4gICAgICAgIGNvbnN0IGhhc0lnbm9yZWRQYXRoRnJhZ21lbnQgPSAobm9ybWFsaXplZFBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKG5vcm1hbGl6ZWRHZW5lcmF0ZWREaXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBmcmFnbWVudCBvZiBpZ25vcmVkUGF0aEZyYWdtZW50cykge1xuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKGZyYWdtZW50KSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCByZWJ1aWxkUXVldWUgPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgICAgICBjb25zdCBlbnF1ZXVlID0gKHRhc2s6ICgpID0+IFByb21pc2U8dm9pZD4pID0+IHtcbiAgICAgICAgICByZWJ1aWxkUXVldWUgPSByZWJ1aWxkUXVldWUudGhlbih0YXNrKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBwcm9jZXNzIGZpbGUgY2hhbmdlJywgZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZWJ1aWxkUXVldWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmVhZFNvdXJjZVNuYXBzaG90ID0gKGZpbGU6IHN0cmluZykgPT5cbiAgICAgICAgICBjcmVhdGVTb3VyY2VTbmFwc2hvdCh7IGZpbGUsIGRldGVjdFdvcmtmbG93UGF0dGVybnMgfSk7XG5cbiAgICAgICAgY29uc3QgcmVmcmVzaFNvdXJjZVNuYXBzaG90cyA9ICgpID0+XG4gICAgICAgICAgcmVwbGFjZVNvdXJjZVNuYXBzaG90cyh7XG4gICAgICAgICAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgICAgICAgICAgIGlucHV0RmlsZXM6IG9wdGlvbnMuaW5wdXRGaWxlcyxcbiAgICAgICAgICAgIG5vcm1hbGl6ZVBhdGgsXG4gICAgICAgICAgICByZWFkU25hcHNob3Q6IHJlYWRTb3VyY2VTbmFwc2hvdCxcbiAgICAgICAgICAgIHNvdXJjZVNuYXBzaG90cyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBtZXJnZUNvbWJpbmVkTWFuaWZlc3QgPSAoXG4gICAgICAgICAgbmV4dFN0ZXBzTWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3RcbiAgICAgICAgKTogV29ya2Zsb3dNYW5pZmVzdCA9PiAoe1xuICAgICAgICAgIC4uLm5leHRTdGVwc01hbmlmZXN0LFxuICAgICAgICAgIHdvcmtmbG93czoge1xuICAgICAgICAgICAgLi4ubmV4dFN0ZXBzTWFuaWZlc3Qud29ya2Zsb3dzLFxuICAgICAgICAgICAgLi4ud29ya2Zsb3dzTWFuaWZlc3Qud29ya2Zsb3dzLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgY2xhc3Nlczoge1xuICAgICAgICAgICAgLi4ubmV4dFN0ZXBzTWFuaWZlc3QuY2xhc3NlcyxcbiAgICAgICAgICAgIC4uLndvcmtmbG93c01hbmlmZXN0LmNsYXNzZXMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaG90UmVidWlsZCA9IGFzeW5jIChyZWZyZXNoU3RlcFJlZ2lzdHJhdGlvbnM6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBpZiAocmVmcmVzaFN0ZXBSZWdpc3RyYXRpb25zKSB7XG4gICAgICAgICAgICBpZiAoc3RlcHNDdHgpIHtcbiAgICAgICAgICAgICAgYXdhaXQgc3RlcHNDdHgucmVidWlsZCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc3RlcHNNYW5pZmVzdCA9IGF3YWl0IHRoaXMuY3JlYXRlU3RlcFNvdXJjZVJlZ2lzdHJhdGlvbkZpbGUoe1xuICAgICAgICAgICAgICAgIGlucHV0RmlsZXM6IG9wdGlvbnMuaW5wdXRGaWxlcyxcbiAgICAgICAgICAgICAgICBvdXRmaWxlOiBzdGVwc091dGZpbGUsXG4gICAgICAgICAgICAgICAgdHNjb25maWdQYXRoLFxuICAgICAgICAgICAgICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCB3b3JrZmxvd1Jlc3VsdCA9IGF3YWl0IHdvcmtmbG93c0N0eC5pbnRlcmltQnVuZGxlQ3R4LnJlYnVpbGQoKTtcbiAgICAgICAgICBjb25zdCB3b3JrZmxvd091dHB1dCA9IHdvcmtmbG93UmVzdWx0Lm91dHB1dEZpbGVzPy5bMF0/LnRleHQ7XG4gICAgICAgICAgaWYgKCF3b3JrZmxvd091dHB1dCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAnSW52YXJpYW50OiBleHBlY3RlZCB3b3JrZmxvdyBvdXRwdXQgZnJvbSBob3QgcmVidWlsZCdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYXdhaXQgd29ya2Zsb3dzQ3R4LmJ1bmRsZUZpbmFsKHdvcmtmbG93T3V0cHV0KTtcbiAgICAgICAgICBhd2FpdCB3cml0ZU1hbmlmZXN0KG1lcmdlQ29tYmluZWRNYW5pZmVzdChzdGVwc01hbmlmZXN0KSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZnVsbFJlYnVpbGQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jbGVhckRpc2NvdmVyZWRFbnRyaWVzQ2FjaGUoKTtcbiAgICAgICAgICBjb25zdCBuZXdJbnB1dEZpbGVzID0gYXdhaXQgdGhpcy5nZXRJbnB1dEZpbGVzKCk7XG4gICAgICAgICAgb3B0aW9ucy5pbnB1dEZpbGVzID0gbmV3SW5wdXRGaWxlcztcblxuICAgICAgICAgIGF3YWl0IHN0ZXBzQ3R4Py5kaXNwb3NlKCk7XG4gICAgICAgICAgYXdhaXQgd29ya2Zsb3dzQ3R4LmludGVyaW1CdW5kbGVDdHguZGlzcG9zZSgpO1xuXG4gICAgICAgICAgY29uc3QgbmV3Q29tYmluZWQgPSBhd2FpdCB0aGlzLmJ1aWxkQ29tYmluZWRGdW5jdGlvbihvcHRpb25zKTtcbiAgICAgICAgICBzdGVwc0N0eCA9IG5ld0NvbWJpbmVkLnN0ZXBzQ29udGV4dDtcbiAgICAgICAgICBkaXNjb3ZlcmVkRW50cmllcyA9IG5ld0NvbWJpbmVkLmRpc2NvdmVyZWRFbnRyaWVzO1xuICAgICAgICAgIHN0ZXBzTWFuaWZlc3QgPSBuZXdDb21iaW5lZC5zdGVwc01hbmlmZXN0O1xuICAgICAgICAgIHdvcmtmbG93c01hbmlmZXN0ID0gbmV3Q29tYmluZWQud29ya2Zsb3dzTWFuaWZlc3Q7XG5cbiAgICAgICAgICBpZiAoIW5ld0NvbWJpbmVkPy5pbnRlcmltQnVuZGxlQ3R4IHx8ICFuZXdDb21iaW5lZD8uYnVuZGxlRmluYWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ0ludmFyaWFudDogZXhwZWN0ZWQgd29ya2Zsb3dzIGJ1bmRsZSBjb250ZXh0IGFmdGVyIHJlYnVpbGQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3b3JrZmxvd3NDdHggPSB7XG4gICAgICAgICAgICBpbnRlcmltQnVuZGxlQ3R4OiBuZXdDb21iaW5lZC5pbnRlcmltQnVuZGxlQ3R4LFxuICAgICAgICAgICAgYnVuZGxlRmluYWw6IG5ld0NvbWJpbmVkLmJ1bmRsZUZpbmFsLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBhd2FpdCB3cml0ZU1hbmlmZXN0KG5ld0NvbWJpbmVkLm1hbmlmZXN0KTtcbiAgICAgICAgICBhd2FpdCByZWZyZXNoU291cmNlU25hcHNob3RzKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaXNXYXRjaGFibGVGaWxlID0gKHBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICB3YXRjaGFibGVFeHRlbnNpb25zLmhhcyhleHRuYW1lKHBhdGgpKTtcblxuICAgICAgICBjb25zdCByZWFkS25vd25GaWxlcyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBmaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgIGNvbnN0IGFsaWFzZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgICAgIGNvbnN0IHJlbGV2YW50RmlsZXMgPSBnZXRSZWxldmFudEZpbGVzKHtcbiAgICAgICAgICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgICAgICAgICAgaW5wdXRGaWxlczogb3B0aW9ucy5pbnB1dEZpbGVzLFxuICAgICAgICAgICAgbm9ybWFsaXplUGF0aCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IGFkZEtub3duRmlsZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVhbEZpbGVQYXRoID0gZmlsZVBhdGg7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZWFsRmlsZVBhdGggPSBub3JtYWxpemVQYXRoKGF3YWl0IHJlYWxwYXRoKGZpbGVQYXRoKSk7XG4gICAgICAgICAgICB9IGNhdGNoIHt9XG5cbiAgICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbFBhdGggPSByZWxldmFudEZpbGVzLmhhcyhyZWFsRmlsZVBhdGgpXG4gICAgICAgICAgICAgID8gcmVhbEZpbGVQYXRoXG4gICAgICAgICAgICAgIDogZmlsZVBhdGg7XG4gICAgICAgICAgICBmaWxlcy5hZGQoY2Fub25pY2FsUGF0aCk7XG4gICAgICAgICAgICBhbGlhc2VzLnNldChmaWxlUGF0aCwgY2Fub25pY2FsUGF0aCk7XG4gICAgICAgICAgICBhbGlhc2VzLnNldChyZWFsRmlsZVBhdGgsIGNhbm9uaWNhbFBhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbFBhdGg7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IHZpc2l0ID0gYXN5bmMgKGRpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICBsZXQgZGlyZW50czogRGlyZW50PHN0cmluZz5bXTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGRpcmVudHMgPSBhd2FpdCByZWFkZGlyKGRpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIGRpcmVudHMubWFwKGFzeW5jIChkaXJlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IG5vcm1hbGl6ZVBhdGgoam9pbihkaXJlY3RvcnksIGRpcmVudC5uYW1lKSk7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0lnbm9yZWRQYXRoRnJhZ21lbnQoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCB2aXNpdChmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHN0YXRzOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHN0YXQ+PjtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgc3RhdHMgPSBhd2FpdCBzdGF0KGZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgICAgYXdhaXQgdmlzaXQoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghc3RhdHMuaXNGaWxlKCkgfHwgIWlzV2F0Y2hhYmxlRmlsZShmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBhZGRLbm93bkZpbGUoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgYXdhaXQgdmlzaXQodGhpcy5jb25maWcud29ya2luZ0Rpcik7XG4gICAgICAgICAgcmV0dXJuIHsgZmlsZXMsIGFsaWFzZXMsIGFkZEtub3duRmlsZSB9O1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG1lcmdlRmlsZUNoYW5nZXMgPSAoXG4gICAgICAgICAgbGVmdDogRmlsZUNoYW5nZXMsXG4gICAgICAgICAgcmlnaHQ6IEZpbGVDaGFuZ2VzXG4gICAgICAgICk6IEZpbGVDaGFuZ2VzID0+ICh7XG4gICAgICAgICAgYWRkZWRGaWxlczogdW5pcXVlKFsuLi5sZWZ0LmFkZGVkRmlsZXMsIC4uLnJpZ2h0LmFkZGVkRmlsZXNdKSxcbiAgICAgICAgICBtb2RpZmllZEZpbGVzOiB1bmlxdWUoW1xuICAgICAgICAgICAgLi4ubGVmdC5tb2RpZmllZEZpbGVzLFxuICAgICAgICAgICAgLi4ucmlnaHQubW9kaWZpZWRGaWxlcyxcbiAgICAgICAgICBdKSxcbiAgICAgICAgICByZW1vdmVkRmlsZXM6IHVuaXF1ZShbLi4ubGVmdC5yZW1vdmVkRmlsZXMsIC4uLnJpZ2h0LnJlbW92ZWRGaWxlc10pLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB1bmlxdWUgPSAocGF0aHM6IHN0cmluZ1tdKSA9PiBbLi4ubmV3IFNldChwYXRocyldO1xuXG4gICAgICAgIGNvbnN0IGNsYXNzaWZ5RmlsZUNoYW5nZXMgPSAoe1xuICAgICAgICAgIGNoYW5nZWRGaWxlcyxcbiAgICAgICAgICBrbm93bkZpbGVzLFxuICAgICAgICAgIHJlbW92ZWRGaWxlcyxcbiAgICAgICAgfToge1xuICAgICAgICAgIGNoYW5nZWRGaWxlczogc3RyaW5nW107XG4gICAgICAgICAga25vd25GaWxlczogU2V0PHN0cmluZz47XG4gICAgICAgICAgcmVtb3ZlZEZpbGVzOiBzdHJpbmdbXTtcbiAgICAgICAgfSk6IEZpbGVDaGFuZ2VzID0+IHtcbiAgICAgICAgICBjb25zdCBhZGRlZEZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IG1vZGlmaWVkRmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdW5pcXVlKGNoYW5nZWRGaWxlcykpIHtcbiAgICAgICAgICAgIGlmIChrbm93bkZpbGVzLmhhcyhmaWxlKSkge1xuICAgICAgICAgICAgICBtb2RpZmllZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhZGRlZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgICAgICAgIGtub3duRmlsZXMuYWRkKGZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiByZW1vdmVkRmlsZXMpIHtcbiAgICAgICAgICAgIGtub3duRmlsZXMuZGVsZXRlKGZpbGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhZGRlZEZpbGVzLFxuICAgICAgICAgICAgbW9kaWZpZWRGaWxlcyxcbiAgICAgICAgICAgIHJlbW92ZWRGaWxlczogdW5pcXVlKHJlbW92ZWRGaWxlcyksXG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBoYXNGaWxlQ2hhbmdlcyA9ICh7XG4gICAgICAgICAgYWRkZWRGaWxlcyxcbiAgICAgICAgICBtb2RpZmllZEZpbGVzLFxuICAgICAgICAgIHJlbW92ZWRGaWxlcyxcbiAgICAgICAgfTogRmlsZUNoYW5nZXMpID0+XG4gICAgICAgICAgYWRkZWRGaWxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgbW9kaWZpZWRGaWxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgcmVtb3ZlZEZpbGVzLmxlbmd0aCA+IDA7XG4gICAgICAgIGNvbnN0IGxvZ0RldkhtciA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuV09SS0ZMT1dfREVWX0hNUl9MT0dTID09PSAnMScpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKC4uLmFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBhd2FpdCByZWZyZXNoU291cmNlU25hcHNob3RzKCk7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgZmlsZXM6IGtub3duRmlsZXMsXG4gICAgICAgICAgYWxpYXNlczoga25vd25GaWxlQWxpYXNlcyxcbiAgICAgICAgICBhZGRLbm93bkZpbGU6IHJlbWVtYmVyS25vd25GaWxlLFxuICAgICAgICB9ID0gYXdhaXQgcmVhZEtub3duRmlsZXMoKTtcblxuICAgICAgICBjb25zdCByZWZyZXNoS25vd25GaWxlcyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBuZXh0S25vd24gPSBhd2FpdCByZWFkS25vd25GaWxlcygpO1xuICAgICAgICAgIGtub3duRmlsZXMgPSBuZXh0S25vd24uZmlsZXM7XG4gICAgICAgICAga25vd25GaWxlQWxpYXNlcyA9IG5leHRLbm93bi5hbGlhc2VzO1xuICAgICAgICAgIHJlbWVtYmVyS25vd25GaWxlID0gbmV4dEtub3duLmFkZEtub3duRmlsZTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBwcm9jZXNzRmlsZUNoYW5nZXMgPSBhc3luYyAoZmlsZUNoYW5nZXM6IEZpbGVDaGFuZ2VzKSA9PiB7XG4gICAgICAgICAgaWYgKCFoYXNGaWxlQ2hhbmdlcyhmaWxlQ2hhbmdlcykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBkZWNpc2lvbiA9IGF3YWl0IGNsYXNzaWZ5UmVidWlsZCh7XG4gICAgICAgICAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgICAgICAgICAgIGZpbGVDaGFuZ2VzLFxuICAgICAgICAgICAgaW5wdXRGaWxlczogb3B0aW9ucy5pbnB1dEZpbGVzLFxuICAgICAgICAgICAgbm9ybWFsaXplUGF0aCxcbiAgICAgICAgICAgIHBhcmVudEhhc0NoaWxkLFxuICAgICAgICAgICAgcmVhZFNuYXBzaG90OiByZWFkU291cmNlU25hcHNob3QsXG4gICAgICAgICAgICBzb3VyY2VTbmFwc2hvdHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGRlY2lzaW9uLmtpbmQgPT09ICdub25lJykge1xuICAgICAgICAgICAgbG9nRGV2SG1yKCd3b3JrZmxvdyBkZXYgaG1yOiBza2lwJyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtmaWxlLCBzbmFwc2hvdF0gb2YgZGVjaXNpb24uc25hcHNob3RzIHx8IFtdKSB7XG4gICAgICAgICAgICAgIHNvdXJjZVNuYXBzaG90cy5zZXQoZmlsZSwgc25hcHNob3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGVjaXNpb24ua2luZCA9PT0gJ2Z1bGwnKSB7XG4gICAgICAgICAgICBsb2dEZXZIbXIoJ3dvcmtmbG93IGRldiBobXI6IGZ1bGwgcmVkaXNjb3ZlcnknKTtcbiAgICAgICAgICAgIGF3YWl0IGZ1bGxSZWJ1aWxkKCk7XG4gICAgICAgICAgICBhd2FpdCByZWZyZXNoS25vd25GaWxlcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxvZ0RldkhtcihcbiAgICAgICAgICAgIGB3b3JrZmxvdyBkZXYgaG1yOiBob3QgcmVidWlsZCR7ZGVjaXNpb24ucmVmcmVzaFN0ZXBSZWdpc3RyYXRpb25zID8gJyB3aXRoIHN0ZXAgcmVnaXN0cmF0aW9uIHJlZnJlc2gnIDogJyd9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgaG90UmVidWlsZChkZWNpc2lvbi5yZWZyZXNoU3RlcFJlZ2lzdHJhdGlvbnMpO1xuICAgICAgICAgIGZvciAoY29uc3QgW2ZpbGUsIHNuYXBzaG90XSBvZiBkZWNpc2lvbi5zbmFwc2hvdHMpIHtcbiAgICAgICAgICAgIHNvdXJjZVNuYXBzaG90cy5zZXQoZmlsZSwgc25hcHNob3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgcGVuZGluZ0ZpbGVDaGFuZ2VzOiBGaWxlQ2hhbmdlcyA9IHtcbiAgICAgICAgICBhZGRlZEZpbGVzOiBbXSxcbiAgICAgICAgICBtb2RpZmllZEZpbGVzOiBbXSxcbiAgICAgICAgICByZW1vdmVkRmlsZXM6IFtdLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgZmx1c2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3Qgc2NoZWR1bGVGaWxlQ2hhbmdlcyA9IChmaWxlQ2hhbmdlczogRmlsZUNoYW5nZXMpID0+IHtcbiAgICAgICAgICBwZW5kaW5nRmlsZUNoYW5nZXMgPSBtZXJnZUZpbGVDaGFuZ2VzKFxuICAgICAgICAgICAgcGVuZGluZ0ZpbGVDaGFuZ2VzLFxuICAgICAgICAgICAgZmlsZUNoYW5nZXNcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChmbHVzaFRpbWVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVDaGFuZ2VzID0gcGVuZGluZ0ZpbGVDaGFuZ2VzO1xuICAgICAgICAgICAgcGVuZGluZ0ZpbGVDaGFuZ2VzID0ge1xuICAgICAgICAgICAgICBhZGRlZEZpbGVzOiBbXSxcbiAgICAgICAgICAgICAgbW9kaWZpZWRGaWxlczogW10sXG4gICAgICAgICAgICAgIHJlbW92ZWRGaWxlczogW10sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZmx1c2hUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGVucXVldWUoKCkgPT4gcHJvY2Vzc0ZpbGVDaGFuZ2VzKGZpbGVDaGFuZ2VzKSk7XG4gICAgICAgICAgfSwgMTApO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlc29sdmVFeGlzdGluZ0V2ZW50UGF0aCA9IGFzeW5jIChwYXRobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVQYXRoKHBhdGhuYW1lKTtcbiAgICAgICAgICBpZiAoIWlzV2F0Y2hhYmxlRmlsZShub3JtYWxpemVkUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBrbm93blBhdGggPSBrbm93bkZpbGVBbGlhc2VzLmdldChub3JtYWxpemVkUGF0aCk7XG4gICAgICAgICAgaWYgKGtub3duUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGtub3duUGF0aDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVhbEZpbGVQYXRoID0gbm9ybWFsaXplUGF0aChhd2FpdCByZWFscGF0aChub3JtYWxpemVkUGF0aCkpO1xuICAgICAgICAgICAgcmV0dXJuIGtub3duRmlsZUFsaWFzZXMuZ2V0KHJlYWxGaWxlUGF0aCkgPz8gbm9ybWFsaXplZFBhdGg7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplZFBhdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZUZpbGVBZGRlZCA9IGFzeW5jIChwYXRobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVQYXRoKHBhdGhuYW1lKTtcbiAgICAgICAgICBpZiAoIWlzV2F0Y2hhYmxlRmlsZShub3JtYWxpemVkUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBleGlzdGluZ1BhdGggPSBhd2FpdCByZXNvbHZlRXhpc3RpbmdFdmVudFBhdGgobm9ybWFsaXplZFBhdGgpO1xuICAgICAgICAgIGNvbnN0IHdhc0tub3duID0gZXhpc3RpbmdQYXRoID8ga25vd25GaWxlcy5oYXMoZXhpc3RpbmdQYXRoKSA6IGZhbHNlO1xuICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbFBhdGggPSBhd2FpdCByZW1lbWJlcktub3duRmlsZShub3JtYWxpemVkUGF0aCk7XG4gICAgICAgICAga25vd25GaWxlcy5hZGQoY2Fub25pY2FsUGF0aCk7XG4gICAgICAgICAgc2NoZWR1bGVGaWxlQ2hhbmdlcyh7XG4gICAgICAgICAgICBhZGRlZEZpbGVzOiB3YXNLbm93biA/IFtdIDogW2Nhbm9uaWNhbFBhdGhdLFxuICAgICAgICAgICAgbW9kaWZpZWRGaWxlczogd2FzS25vd24gPyBbY2Fub25pY2FsUGF0aF0gOiBbXSxcbiAgICAgICAgICAgIHJlbW92ZWRGaWxlczogW10sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaGFuZGxlRmlsZUNoYW5nZWQgPSBhc3luYyAocGF0aG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbFBhdGggPSBhd2FpdCByZXNvbHZlRXhpc3RpbmdFdmVudFBhdGgocGF0aG5hbWUpO1xuICAgICAgICAgIGlmICghY2Fub25pY2FsUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpbGVDaGFuZ2VzID0gY2xhc3NpZnlGaWxlQ2hhbmdlcyh7XG4gICAgICAgICAgICBjaGFuZ2VkRmlsZXM6IFtjYW5vbmljYWxQYXRoXSxcbiAgICAgICAgICAgIGtub3duRmlsZXMsXG4gICAgICAgICAgICByZW1vdmVkRmlsZXM6IFtdLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICgha25vd25GaWxlQWxpYXNlcy5oYXMoY2Fub25pY2FsUGF0aCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHJlbWVtYmVyS25vd25GaWxlKGNhbm9uaWNhbFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzY2hlZHVsZUZpbGVDaGFuZ2VzKGZpbGVDaGFuZ2VzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBoYW5kbGVGaWxlUmVtb3ZlZCA9IChwYXRobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVQYXRoKHBhdGhuYW1lKTtcbiAgICAgICAgICBpZiAoIWlzV2F0Y2hhYmxlRmlsZShub3JtYWxpemVkUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjYW5vbmljYWxQYXRoID1cbiAgICAgICAgICAgIGtub3duRmlsZUFsaWFzZXMuZ2V0KG5vcm1hbGl6ZWRQYXRoKSA/PyBub3JtYWxpemVkUGF0aDtcbiAgICAgICAgICBjb25zdCBmaWxlQ2hhbmdlcyA9IGNsYXNzaWZ5RmlsZUNoYW5nZXMoe1xuICAgICAgICAgICAgY2hhbmdlZEZpbGVzOiBbXSxcbiAgICAgICAgICAgIGtub3duRmlsZXMsXG4gICAgICAgICAgICByZW1vdmVkRmlsZXM6IFtjYW5vbmljYWxQYXRoXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBrbm93bkZpbGVBbGlhc2VzLmRlbGV0ZShub3JtYWxpemVkUGF0aCk7XG4gICAgICAgICAgc2NoZWR1bGVGaWxlQ2hhbmdlcyhmaWxlQ2hhbmdlcyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgd2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsIHtcbiAgICAgICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgICAgICAgIGZvbGxvd1N5bWxpbmtzOiB0cnVlLFxuICAgICAgICAgIGlnbm9yZWQ6IChwYXRobmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVQYXRoKFN0cmluZyhwYXRobmFtZSkpO1xuICAgICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0bmFtZShub3JtYWxpemVkUGF0aCk7XG4gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uICYmICF3YXRjaGFibGVFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhhc0lnbm9yZWRQYXRoRnJhZ21lbnQobm9ybWFsaXplZFBhdGgpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdhdGNoZXIub24oJ2FkZCcsIChwYXRobmFtZSkgPT4ge1xuICAgICAgICAgIHZvaWQgaGFuZGxlRmlsZUFkZGVkKHBhdGhuYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdhdGNoZXIub24oJ2NoYW5nZScsIChwYXRobmFtZSkgPT4ge1xuICAgICAgICAgIHZvaWQgaGFuZGxlRmlsZUNoYW5nZWQocGF0aG5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgd2F0Y2hlci5vbigndW5saW5rJywgKHBhdGhuYW1lKSA9PiB7XG4gICAgICAgICAgaGFuZGxlRmlsZVJlbW92ZWQocGF0aG5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgd2F0Y2hlci5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdXb3JrZmxvdyBkZXYgd2F0Y2hlciBlcnJvcicsIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdhdGNoZXIub24oJ3JlYWR5JywgKCkgPT4ge1xuICAgICAgICAgIGxvZ0Rldkhtcignd29ya2Zsb3cgZGV2IGhtcjogcmVhZHknKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGdldElucHV0RmlsZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgY29uc3QgaW5wdXRGaWxlcyA9IGF3YWl0IHN1cGVyLmdldElucHV0RmlsZXMoKTtcbiAgICAgIHJldHVybiBpbnB1dEZpbGVzLmZpbHRlcigoZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHJlbGF0aXZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsIGZpbGUpLnJlcGxhY2VBbGwoXG4gICAgICAgICAgJ1xcXFwnLFxuICAgICAgICAgICcvJ1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIE1hdGNoIEFwcCBSb3V0ZXIgcm91dGUsIHBhZ2UsIGFuZCBsYXlvdXQgZW50cnlwb2ludHMgaW4gYXBwLyBvciBzcmMvYXBwLy5cbiAgICAgICAgaWYgKC9eKD86YXBwfHNyY1xcL2FwcClcXC8oPzouKlxcLyk/KD86cm91dGV8cGFnZXxsYXlvdXQpXFwuLy50ZXN0KGVudHJ5KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWF0Y2ggZXZlcnkgUGFnZXMgUm91dGVyIGVudHJ5cG9pbnQgaW4gcGFnZXMvIG9yIHNyYy9wYWdlcy8uXG4gICAgICAgIGlmICgvXig/OnBhZ2VzfHNyY1xcL3BhZ2VzKVxcLy8udGVzdChlbnRyeSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hdGNoIE5leHQuanMgcm9vdCBlbnRyeXBvaW50cyBhdCB0aGUgcHJvamVjdCByb290IG9yIHVuZGVyIHNyYy8uXG4gICAgICAgIHJldHVybiBbJ2luc3RydW1lbnRhdGlvbicsICdtaWRkbGV3YXJlJywgJ3Byb3h5J10uc29tZSgobmFtZSkgPT5cbiAgICAgICAgICB0aGlzLmNvbmZpZy5wYWdlRXh0ZW5zaW9ucy5zb21lKFxuICAgICAgICAgICAgKGV4dGVuc2lvbikgPT5cbiAgICAgICAgICAgICAgZW50cnkgPT09IGAke25hbWV9LiR7ZXh0ZW5zaW9ufWAgfHxcbiAgICAgICAgICAgICAgZW50cnkgPT09IGBzcmMvJHtuYW1lfS4ke2V4dGVuc2lvbn1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB3cml0ZUZ1bmN0aW9uc0NvbmZpZyhvdXRwdXREaXI6IHN0cmluZykge1xuICAgICAgLy8gd2UgZG9uJ3QgcnVuIHRoaXMgaW4gZGV2ZWxvcG1lbnQgbW9kZSBhcyBpdCdzIG5vdCBuZWVkZWRcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFYyIGNvbWJpbmVkIGNvbmZpZzogc2luZ2xlIHRyaWdnZXIgaGFuZGxlcyBib3RoIHdvcmtmbG93IGFuZCBzdGVwIGV4ZWN1dGlvbi5cbiAgICAgIC8vIFRoZSBzdGVwIHJvdXRlIG5vIGxvbmdlciBuZWVkcyBpdHMgb3duIHRyaWdnZXIgc2luY2Ugc3RlcHMgYXJlIGV4ZWN1dGVkXG4gICAgICAvLyBpbmxpbmUgYnkgdGhlIGNvbWJpbmVkIGhhbmRsZXIgb3IgcXVldWVkIGJhY2sgdG8gX193a2Zfd29ya2Zsb3dfKiB3aXRoIHN0ZXBJZC5cbiAgICAgIGNvbnN0IGdlbmVyYXRlZENvbmZpZyA9IHtcbiAgICAgICAgdmVyc2lvbjogJzAnLFxuICAgICAgICB3b3JrZmxvd3M6IHtcbiAgICAgICAgICBtYXhEdXJhdGlvbjogJ21heCcsXG4gICAgICAgICAgZXhwZXJpbWVudGFsVHJpZ2dlcnM6IFtXT1JLRkxPV19RVUVVRV9UUklHR0VSXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHdyaXRlRmlsZShcbiAgICAgICAgam9pbihvdXRwdXREaXIsICcud2VsbC1rbm93bi93b3JrZmxvdy92MS9jb25maWcuanNvbicpLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShnZW5lcmF0ZWRDb25maWcsIG51bGwsIDIpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFYyOiBCdWlsZCBjb21iaW5lZCByb3V0ZSB0aGF0IGhhbmRsZXMgYm90aCB3b3JrZmxvdyBhbmQgc3RlcCBleGVjdXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBidWlsZENvbWJpbmVkRnVuY3Rpb24oe1xuICAgICAgaW5wdXRGaWxlcyxcbiAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgdHNjb25maWdQYXRoLFxuICAgIH06IHtcbiAgICAgIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXI6IHN0cmluZztcbiAgICAgIHRzY29uZmlnUGF0aD86IHN0cmluZztcbiAgICB9KSB7XG4gICAgICBjb25zdCBmbG93Um91dGVEaXIgPSBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnZmxvdycpO1xuICAgICAgYXdhaXQgbWtkaXIoZmxvd1JvdXRlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlQ29tYmluZWRCdW5kbGUoe1xuICAgICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgICBpbnB1dEZpbGVzLFxuICAgICAgICBzdGVwc091dGZpbGU6IGpvaW4oZmxvd1JvdXRlRGlyLCAnX19zdGVwX3JlZ2lzdHJhdGlvbnMuanMnKSxcbiAgICAgICAgZmxvd091dGZpbGU6IGpvaW4oZmxvd1JvdXRlRGlyLCAncm91dGUuanMnKSxcbiAgICAgICAgYnVuZGxlRmluYWxPdXRwdXQ6IGZhbHNlLFxuICAgICAgICBleHRlcm5hbGl6ZU5vblN0ZXBzOiB0cnVlLFxuICAgICAgICBzb3VyY2VTdGVwUmVnaXN0cmF0aW9uSW1wb3J0czogdHJ1ZSxcbiAgICAgICAgdHNjb25maWdQYXRoLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBidWlsZFdlYmhvb2tSb3V0ZSh7XG4gICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcixcbiAgICB9OiB7XG4gICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcjogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHdlYmhvb2tSb3V0ZUZpbGUgPSBqb2luKFxuICAgICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcixcbiAgICAgICAgJ3dlYmhvb2svW3Rva2VuXS9yb3V0ZS5qcydcbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZVdlYmhvb2tCdW5kbGUoe1xuICAgICAgICBvdXRmaWxlOiB3ZWJob29rUm91dGVGaWxlLFxuICAgICAgICBidW5kbGU6IGZhbHNlLCAvLyBOZXh0LmpzIGRvZXNuJ3QgbmVlZCBidW5kbGluZ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmaW5kQXBwRGlyZWN0b3J5KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBjb25zdCBhcHBEaXIgPSByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICdhcHAnKTtcbiAgICAgIGNvbnN0IHNyY0FwcERpciA9IHJlc29sdmUodGhpcy5jb25maWcud29ya2luZ0RpciwgJ3NyYy9hcHAnKTtcbiAgICAgIGNvbnN0IHBhZ2VzRGlyID0gcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAncGFnZXMnKTtcbiAgICAgIGNvbnN0IHNyY1BhZ2VzRGlyID0gcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAnc3JjL3BhZ2VzJyk7XG5cbiAgICAgIC8vIEhlbHBlciB0byBjaGVjayBpZiBhIHBhdGggZXhpc3RzIGFuZCBpcyBhIGRpcmVjdG9yeVxuICAgICAgY29uc3QgaXNEaXJlY3RvcnkgPSBhc3luYyAocGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgYWNjZXNzKHBhdGgsIGNvbnN0YW50cy5GX09LKTtcbiAgICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHN0YXQocGF0aCk7XG4gICAgICAgICAgaWYgKCFzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggZXhpc3RzIGJ1dCBpcyBub3QgYSBkaXJlY3Rvcnk6ICR7cGF0aH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZS5pbmNsdWRlcygnbm90IGEgZGlyZWN0b3J5JykpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gQ2hlY2sgaWYgYXBwIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGlmIChhd2FpdCBpc0RpcmVjdG9yeShhcHBEaXIpKSB7XG4gICAgICAgIHJldHVybiBhcHBEaXI7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHNyYy9hcHAgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgaWYgKGF3YWl0IGlzRGlyZWN0b3J5KHNyY0FwcERpcikpIHtcbiAgICAgICAgcmV0dXJuIHNyY0FwcERpcjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gYXBwIGRpcmVjdG9yeSBleGlzdHMsIGNoZWNrIGZvciBwYWdlcyBkaXJlY3RvcnkgYW5kIGNyZWF0ZSBhcHAgbmV4dCB0byBpdFxuICAgICAgaWYgKGF3YWl0IGlzRGlyZWN0b3J5KHBhZ2VzRGlyKSkge1xuICAgICAgICAvLyBDcmVhdGUgYXBwIGRpcmVjdG9yeSBuZXh0IHRvIHBhZ2VzIGRpcmVjdG9yeVxuICAgICAgICBhd2FpdCBta2RpcihhcHBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gYXBwRGlyO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXdhaXQgaXNEaXJlY3Rvcnkoc3JjUGFnZXNEaXIpKSB7XG4gICAgICAgIC8vIENyZWF0ZSBzcmMvYXBwIGRpcmVjdG9yeSBuZXh0IHRvIHNyYy9wYWdlcyBkaXJlY3RvcnlcbiAgICAgICAgYXdhaXQgbWtkaXIoc3JjQXBwRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHNyY0FwcERpcjtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ291bGQgbm90IGZpbmQgTmV4dC5qcyBhcHAgb3IgcGFnZXMgZGlyZWN0b3J5LiBFeHBlY3RlZCBvbmUgb2Y6IFwiYXBwXCIsIFwic3JjL2FwcFwiLCBcInBhZ2VzXCIsIG9yIFwic3JjL3BhZ2VzXCIgdG8gZXhpc3QuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBDYWNoZWROZXh0QnVpbGRlckVhZ2VyID0gTmV4dEJ1aWxkZXI7XG4gIHJldHVybiBOZXh0QnVpbGRlcjtcbn1cbiJdfQ==