@nlabs/lex 1.52.16 → 1.52.17
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.
|
@@ -6,7 +6,7 @@ import chalk from 'chalk';
|
|
|
6
6
|
import express from 'express';
|
|
7
7
|
import { readFileSync, existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
8
8
|
import { homedir } from 'os';
|
|
9
|
-
import { resolve as pathResolve, join } from 'path';
|
|
9
|
+
import { resolve as pathResolve, join, isAbsolute } from 'path';
|
|
10
10
|
import { WebSocketServer } from 'ws';
|
|
11
11
|
import { LexConfig, getPackageDir } from '../../LexConfig.js';
|
|
12
12
|
import { createSpinner, removeFiles } from '../../utils/app.js';
|
|
@@ -90,24 +90,62 @@ const displayServerStatus = (httpPort, httpsPort, wsPort, host, quiet, publicIp)
|
|
|
90
90
|
};
|
|
91
91
|
const loadHandler = async (handlerPath, outputDir)=>{
|
|
92
92
|
try {
|
|
93
|
-
|
|
94
|
-
|
|
93
|
+
// Handle both relative paths and absolute paths
|
|
94
|
+
// If handlerPath includes a file extension, use it as-is
|
|
95
|
+
// Otherwise, try .js, .mjs, .cjs extensions
|
|
96
|
+
let fullPath;
|
|
97
|
+
if (isAbsolute(handlerPath)) {
|
|
98
|
+
fullPath = handlerPath;
|
|
99
|
+
} else {
|
|
100
|
+
fullPath = pathResolve(outputDir, handlerPath);
|
|
101
|
+
}
|
|
102
|
+
// Try different extensions if file doesn't exist
|
|
103
|
+
if (!existsSync(fullPath)) {
|
|
104
|
+
const extensions = [
|
|
105
|
+
'.js',
|
|
106
|
+
'.mjs',
|
|
107
|
+
'.cjs',
|
|
108
|
+
'.ts'
|
|
109
|
+
];
|
|
110
|
+
const pathWithoutExt = fullPath.replace(/\.(js|mjs|cjs|ts)$/, '');
|
|
111
|
+
for (const ext of extensions){
|
|
112
|
+
const candidatePath = pathWithoutExt + ext;
|
|
113
|
+
if (existsSync(candidatePath)) {
|
|
114
|
+
fullPath = candidatePath;
|
|
115
|
+
break;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
console.log(`[Serverless] Loading handler from: ${fullPath}`);
|
|
120
|
+
console.log(`[Serverless] File exists: ${existsSync(fullPath)}`);
|
|
95
121
|
if (!existsSync(fullPath)) {
|
|
122
|
+
console.error(`[Serverless] Handler file not found: ${fullPath}`);
|
|
123
|
+
console.error(`[Serverless] Output directory: ${outputDir}`);
|
|
124
|
+
console.error(`[Serverless] Handler path from config: ${handlerPath}`);
|
|
96
125
|
throw new Error(`Handler file not found: ${fullPath}`);
|
|
97
126
|
}
|
|
98
127
|
// Dynamic import of the handler with better error handling
|
|
99
128
|
try {
|
|
100
|
-
|
|
101
|
-
|
|
129
|
+
// Add .js extension if importing TypeScript compiled output
|
|
130
|
+
const importPath = fullPath.endsWith('.ts') ? fullPath.replace(/\.ts$/, '.js') : fullPath;
|
|
131
|
+
console.log(`[Serverless] Importing handler from: ${importPath}`);
|
|
132
|
+
const handlerModule = await import(importPath);
|
|
133
|
+
console.log(`[Serverless] Handler module loaded. Exports: ${Object.keys(handlerModule).join(', ')}`);
|
|
102
134
|
const handler = handlerModule.default || handlerModule.handler || handlerModule;
|
|
103
|
-
log(`Handler found: ${typeof handler}
|
|
135
|
+
console.log(`[Serverless] Handler found: ${typeof handler}, isFunction: ${typeof handler === 'function'}`);
|
|
136
|
+
if (typeof handler !== 'function') {
|
|
137
|
+
console.error(`[Serverless] Handler is not a function. Type: ${typeof handler}, Value:`, handler);
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
104
140
|
return handler;
|
|
105
141
|
} catch (importError) {
|
|
106
|
-
|
|
142
|
+
console.error(`[Serverless] Import error for handler ${handlerPath}:`, importError.message);
|
|
143
|
+
console.error('[Serverless] Import error stack:', importError.stack);
|
|
107
144
|
return null;
|
|
108
145
|
}
|
|
109
146
|
} catch (error) {
|
|
110
|
-
|
|
147
|
+
console.error(`[Serverless] Error loading handler ${handlerPath}:`, error.message);
|
|
148
|
+
console.error('[Serverless] Error stack:', error.stack);
|
|
111
149
|
return null;
|
|
112
150
|
}
|
|
113
151
|
};
|
|
@@ -304,28 +342,29 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
|
|
|
304
342
|
const url = req.url || '/';
|
|
305
343
|
const method = req.method || 'GET';
|
|
306
344
|
const pathname = req.path || url.split('?')[0]; // Extract pathname without query string
|
|
307
|
-
log
|
|
345
|
+
// Always log requests (not affected by quiet flag for debugging)
|
|
346
|
+
console.log(`[Serverless] ${method} ${url} (pathname: ${pathname})`);
|
|
308
347
|
// Find matching function
|
|
309
348
|
let matchedFunction = null;
|
|
310
349
|
if (config.functions) {
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
350
|
+
const functionNames = Object.keys(config.functions);
|
|
351
|
+
console.log(`[Serverless] Available functions: ${functionNames.join(', ')}`);
|
|
352
|
+
console.log('[Serverless] Config functions:', JSON.stringify(config.functions, null, 2));
|
|
314
353
|
for (const [functionName, functionConfig] of Object.entries(config.functions)){
|
|
315
354
|
if (functionConfig.events) {
|
|
316
355
|
for (const event of functionConfig.events){
|
|
317
356
|
if (event.http) {
|
|
318
357
|
const eventPath = event.http.path || '/';
|
|
319
|
-
const eventMethod = event.http.method || 'GET';
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
}
|
|
358
|
+
const eventMethod = (event.http.method || 'GET').toUpperCase();
|
|
359
|
+
const requestMethod = method.toUpperCase();
|
|
360
|
+
console.log(`[Serverless] Checking function ${functionName}: path="${eventPath}", method="${eventMethod}" against pathname="${pathname}", method="${requestMethod}"`);
|
|
323
361
|
// Improved path matching - compare pathname without query string
|
|
324
|
-
|
|
362
|
+
// Normalize paths (remove trailing slashes for comparison)
|
|
363
|
+
const normalizedEventPath = eventPath.replace(/\/$/, '') || '/';
|
|
364
|
+
const normalizedPathname = pathname.replace(/\/$/, '') || '/';
|
|
365
|
+
if (normalizedEventPath === normalizedPathname && eventMethod === requestMethod) {
|
|
325
366
|
matchedFunction = functionName;
|
|
326
|
-
|
|
327
|
-
log(`Matched function: ${matchedFunction}`, 'info', false);
|
|
328
|
-
}
|
|
367
|
+
console.log(`[Serverless] ✓ Matched function: ${matchedFunction}`);
|
|
329
368
|
break;
|
|
330
369
|
}
|
|
331
370
|
}
|
|
@@ -336,15 +375,15 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
|
|
|
336
375
|
}
|
|
337
376
|
}
|
|
338
377
|
} else {
|
|
339
|
-
|
|
340
|
-
log('No functions found in config', 'info', false);
|
|
341
|
-
}
|
|
378
|
+
console.log('[Serverless] No functions found in config');
|
|
342
379
|
}
|
|
343
380
|
if (matchedFunction && config.functions[matchedFunction]) {
|
|
344
381
|
// Resolve handler path relative to output directory
|
|
345
382
|
const handlerPath = config.functions[matchedFunction].handler;
|
|
383
|
+
console.log(`[Serverless] Loading handler: ${handlerPath} from outputDir: ${outputDir}`);
|
|
346
384
|
const handler = await loadHandler(handlerPath, outputDir);
|
|
347
385
|
if (handler) {
|
|
386
|
+
console.log(`[Serverless] Handler loaded successfully, type: ${typeof handler}`);
|
|
348
387
|
const wrappedHandler = captureConsoleLogs(handler, quiet);
|
|
349
388
|
const event = {
|
|
350
389
|
body: req.body,
|
|
@@ -364,7 +403,9 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
|
|
|
364
403
|
memoryLimitInMB: '128'
|
|
365
404
|
};
|
|
366
405
|
try {
|
|
406
|
+
console.log('[Serverless] Calling handler with event:', JSON.stringify(event, null, 2));
|
|
367
407
|
const result = await wrappedHandler(event, context);
|
|
408
|
+
console.log('[Serverless] Handler returned:', JSON.stringify(result, null, 2));
|
|
368
409
|
if (result && typeof result === 'object' && result.statusCode) {
|
|
369
410
|
res.status(result.statusCode);
|
|
370
411
|
if (result.headers) {
|
|
@@ -377,17 +418,23 @@ const createExpressServer = async (config, outputDir, httpPort, host, quiet, deb
|
|
|
377
418
|
res.json(result);
|
|
378
419
|
}
|
|
379
420
|
} catch (error) {
|
|
421
|
+
console.error('[Serverless] Handler error:', error.message);
|
|
422
|
+
console.error('[Serverless] Handler error stack:', error.stack);
|
|
380
423
|
log(`Handler error: ${error.message}`, 'error', false);
|
|
381
424
|
res.status(500).json({
|
|
382
425
|
error: error.message
|
|
383
426
|
});
|
|
384
427
|
}
|
|
385
428
|
} else {
|
|
429
|
+
console.error(`[Serverless] Handler not found for function: ${matchedFunction}`);
|
|
430
|
+
console.error(`[Serverless] Handler path: ${handlerPath}, Output dir: ${outputDir}`);
|
|
386
431
|
res.status(404).json({
|
|
387
432
|
error: 'Handler not found'
|
|
388
433
|
});
|
|
389
434
|
}
|
|
390
435
|
} else {
|
|
436
|
+
console.error(`[Serverless] Function not found for pathname: ${pathname}, method: ${method}`);
|
|
437
|
+
console.error(`[Serverless] Available functions: ${config.functions ? Object.keys(config.functions).join(', ') : 'none'}`);
|
|
391
438
|
res.status(404).json({
|
|
392
439
|
error: 'Function not found'
|
|
393
440
|
});
|
|
@@ -582,18 +629,41 @@ export const serverless = async (cmd, callback = ()=>({}))=>{
|
|
|
582
629
|
try {
|
|
583
630
|
// Use getPackageDir to handle npm workspaces correctly
|
|
584
631
|
const packageDir = getPackageDir();
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
632
|
+
// Try multiple config file formats
|
|
633
|
+
const configFormats = config ? [
|
|
634
|
+
config
|
|
635
|
+
] : [
|
|
636
|
+
pathResolve(packageDir, 'lex.config.mjs'),
|
|
637
|
+
pathResolve(packageDir, 'lex.config.js'),
|
|
638
|
+
pathResolve(packageDir, 'lex.config.cjs'),
|
|
639
|
+
pathResolve(packageDir, 'lex.config.ts')
|
|
640
|
+
];
|
|
641
|
+
let configPath = null;
|
|
642
|
+
for (const candidatePath of configFormats){
|
|
643
|
+
if (existsSync(candidatePath)) {
|
|
644
|
+
configPath = candidatePath;
|
|
645
|
+
break;
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
if (configPath) {
|
|
649
|
+
log(`Loading serverless config from: ${configPath}`, 'info', quiet);
|
|
588
650
|
const configModule = await import(configPath);
|
|
589
651
|
serverlessConfig = configModule.default?.serverless || configModule.serverless || {};
|
|
590
652
|
log('Serverless config loaded successfully', 'info', quiet);
|
|
591
|
-
|
|
653
|
+
const functionNames = Object.keys(serverlessConfig.functions || {});
|
|
654
|
+
log(`Loaded functions: ${functionNames.length > 0 ? functionNames.join(', ') : 'none'}`, 'info', quiet);
|
|
655
|
+
// Debug: Print full config if debug mode
|
|
656
|
+
if (debug) {
|
|
657
|
+
log(`Full serverless config: ${JSON.stringify(serverlessConfig, null, 2)}`, 'info', false);
|
|
658
|
+
}
|
|
592
659
|
} else {
|
|
593
|
-
log(`No serverless config found
|
|
660
|
+
log(`No serverless config found. Tried: ${configFormats.join(', ')}`, 'warn', quiet);
|
|
594
661
|
}
|
|
595
662
|
} catch (error) {
|
|
596
663
|
log(`Error loading serverless config: ${error.message}`, 'error', quiet);
|
|
664
|
+
if (debug) {
|
|
665
|
+
log(`Config error stack: ${error.stack}`, 'error', false);
|
|
666
|
+
}
|
|
597
667
|
// Don't exit, continue with empty config
|
|
598
668
|
}
|
|
599
669
|
// Merge config with command line options
|
|
@@ -668,4 +738,4 @@ export const serverless = async (cmd, callback = ()=>({}))=>{
|
|
|
668
738
|
}
|
|
669
739
|
};
|
|
670
740
|
|
|
671
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9zZXJ2ZXJsZXNzL3NlcnZlcmxlc3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBib3hlbiBmcm9tICdib3hlbic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge3JlYWRGaWxlU3luYywgZXhpc3RzU3luYywgbWtkaXJTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2hvbWVkaXJ9IGZyb20gJ29zJztcbmltcG9ydCB7cmVzb2x2ZSBhcyBwYXRoUmVzb2x2ZSwgam9pbn0gZnJvbSAncGF0aCc7XG5pbXBvcnQge1dlYlNvY2tldFNlcnZlcn0gZnJvbSAnd3MnO1xuXG5pbXBvcnQge0xleENvbmZpZywgZ2V0UGFja2FnZURpcn0gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lciwgcmVtb3ZlRmlsZXN9IGZyb20gJy4uLy4uL3V0aWxzL2FwcC5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJsZXNzT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuICByZWFkb25seSBodHRwUG9ydD86IG51bWJlcjtcbiAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlbW92ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRlc3Q/OiBib29sZWFuO1xuICByZWFkb25seSB1c2VQdWJsaWNJcD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHZhcmlhYmxlcz86IHN0cmluZztcbiAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBTZXJ2ZXJsZXNzQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpPT4gdm9pZDtcblxuaW50ZXJmYWNlIFB1YmxpY0lwQ2FjaGUge1xuICBpcDogc3RyaW5nO1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFNlcnZlcmxlc3NIYW5kbGVyIHtcbiAgcmVhZG9ubHkgaGFuZGxlcjogc3RyaW5nO1xuICByZWFkb25seSBldmVudHM/OiBBcnJheTx7XG4gICAgcmVhZG9ubHkgaHR0cD86IHtcbiAgICAgIHJlYWRvbmx5IGNvcnM/OiBib29sZWFuO1xuICAgICAgcmVhZG9ubHkgbWV0aG9kPzogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcbiAgICB9O1xuICAgIHJlYWRvbmx5IHdlYnNvY2tldD86IHtcbiAgICAgIHJlYWRvbmx5IHJvdXRlPzogc3RyaW5nO1xuICAgIH07XG4gIH0+O1xufVxuXG5pbnRlcmZhY2UgU2VydmVybGVzc0NvbmZpZyB7XG4gIHJlYWRvbmx5IGN1c3RvbT86IHtcbiAgICByZWFkb25seSAnc2VydmVybGVzcy1vZmZsaW5lJz86IHtcbiAgICAgIHJlYWRvbmx5IGNvcnM/OiBib29sZWFuO1xuICAgICAgcmVhZG9ubHkgaG9zdD86IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IGh0dHBQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xuICAgIH07XG4gIH07XG4gIHJlYWRvbmx5IGZ1bmN0aW9ucz86IFJlY29yZDxzdHJpbmcsIFNlcnZlcmxlc3NIYW5kbGVyPjtcbn1cblxuY29uc3QgZ2V0Q2FjaGVEaXIgPSAoKTogc3RyaW5nID0+IHtcbiAgY29uc3QgY2FjaGVEaXIgPSBqb2luKGhvbWVkaXIoKSwgJy5sZXgtY2FjaGUnKTtcbiAgaWYoIWV4aXN0c1N5bmMoY2FjaGVEaXIpKSB7XG4gICAgbWtkaXJTeW5jKGNhY2hlRGlyLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gIH1cbiAgcmV0dXJuIGNhY2hlRGlyO1xufTtcblxuY29uc3QgZ2V0Q2FjaGVQYXRoID0gKCk6IHN0cmluZyA9PiBqb2luKGdldENhY2hlRGlyKCksICdwdWJsaWMtaXAuanNvbicpO1xuXG5jb25zdCByZWFkUHVibGljSXBDYWNoZSA9ICgpOiBQdWJsaWNJcENhY2hlIHwgbnVsbCA9PiB7XG4gIGNvbnN0IGNhY2hlUGF0aCA9IGdldENhY2hlUGF0aCgpO1xuICBpZighZXhpc3RzU3luYyhjYWNoZVBhdGgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGNhY2hlRGF0YSA9IHJlYWRGaWxlU3luYyhjYWNoZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgY2FjaGU6IFB1YmxpY0lwQ2FjaGUgPSBKU09OLnBhcnNlKGNhY2hlRGF0YSk7XG5cbiAgICAvLyBDaGVjayBpZiBjYWNoZSBpcyBvbGRlciB0aGFuIDEgd2Vla1xuICAgIGNvbnN0IG9uZVdlZWtNcyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgIGlmKERhdGUubm93KCkgLSBjYWNoZS50aW1lc3RhbXAgPiBvbmVXZWVrTXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjYWNoZTtcbiAgfSBjYXRjaHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuY29uc3Qgd3JpdGVQdWJsaWNJcENhY2hlID0gKGlwOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgY29uc3QgY2FjaGVQYXRoID0gZ2V0Q2FjaGVQYXRoKCk7XG4gIGNvbnN0IGNhY2hlOiBQdWJsaWNJcENhY2hlID0ge1xuICAgIGlwLFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICB9O1xuICB3cml0ZUZpbGVTeW5jKGNhY2hlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY2FjaGUsIG51bGwsIDIpKTtcbn07XG5cbmNvbnN0IGZldGNoUHVibGljSXAgPSAoZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4gPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgaWYoIWZvcmNlUmVmcmVzaCkge1xuICAgIGNvbnN0IGNhY2hlZCA9IHJlYWRQdWJsaWNJcENhY2hlKCk7XG4gICAgaWYoY2FjaGVkKSB7XG4gICAgICByZXNvbHZlKGNhY2hlZC5pcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLy8gVXNlIGZldGNoIGluc3RlYWQgb2YgaHR0cHNcbiAgZmV0Y2goJ2h0dHBzOi8vYXBpLmlwaWZ5Lm9yZycpXG4gICAgLnRoZW4oKHJlcykgPT4gcmVzLnRleHQoKSlcbiAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgaXAgPSBkYXRhLnRyaW0oKTtcbiAgICAgIGlmKGlwKSB7XG4gICAgICAgIHdyaXRlUHVibGljSXBDYWNoZShpcCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGlwKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpO1xufSk7XG5cbmNvbnN0IGRpc3BsYXlTZXJ2ZXJTdGF0dXMgPSAoXG4gIGh0dHBQb3J0OiBudW1iZXIsXG4gIGh0dHBzUG9ydDogbnVtYmVyLFxuICB3c1BvcnQ6IG51bWJlcixcbiAgaG9zdDogc3RyaW5nLFxuICBxdWlldDogYm9vbGVhbixcbiAgcHVibGljSXA/OiBzdHJpbmdcbikgPT4ge1xuICBpZihxdWlldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGh0dHBVcmwgPSBgaHR0cDovLyR7aG9zdH06JHtodHRwUG9ydH1gO1xuICBjb25zdCBodHRwc1VybCA9IGBodHRwczovLyR7aG9zdH06JHtodHRwc1BvcnR9YDtcbiAgY29uc3Qgd3NVcmwgPSBgd3M6Ly8ke2hvc3R9OiR7d3NQb3J0fWA7XG4gIGNvbnN0IHdzc1VybCA9IGB3c3M6Ly8ke2hvc3R9OiR7d3NQb3J0fWA7XG5cbiAgbGV0IHVybExpbmVzID0gYCR7Y2hhbGsuZ3JlZW4oJ0hUVFA6Jyl9ICAgICAgJHtjaGFsay51bmRlcmxpbmUoaHR0cFVybCl9XFxuYDtcbiAgdXJsTGluZXMgKz0gYCR7Y2hhbGsuZ3JlZW4oJ0hUVFBTOicpfSAgICAgJHtjaGFsay51bmRlcmxpbmUoaHR0cHNVcmwpfVxcbmA7XG4gIHVybExpbmVzICs9IGAke2NoYWxrLmdyZWVuKCdXZWJTb2NrZXQ6Jyl9ICR7Y2hhbGsudW5kZXJsaW5lKHdzVXJsKX1cXG5gO1xuICB1cmxMaW5lcyArPSBgJHtjaGFsay5ncmVlbignV1NTOicpfSAgICAgICAke2NoYWxrLnVuZGVybGluZSh3c3NVcmwpfVxcbmA7XG5cbiAgaWYocHVibGljSXApIHtcbiAgICB1cmxMaW5lcyArPSBgXFxuJHtjaGFsay5ncmVlbignUHVibGljOicpfSAgICAke2NoYWxrLnVuZGVybGluZShgaHR0cDovLyR7cHVibGljSXB9OiR7aHR0cFBvcnR9YCl9XFxuYDtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1c0JveCA9IGJveGVuKFxuICAgIGAke2NoYWxrLmN5YW4uYm9sZCgn8J+agCBTZXJ2ZXJsZXNzIERldmVsb3BtZW50IFNlcnZlciBSdW5uaW5nJyl9XFxuXFxuJHt1cmxMaW5lc31cXG5gICtcbiAgICBgJHtjaGFsay55ZWxsb3coJ1ByZXNzIEN0cmwrQyB0byBzdG9wIHRoZSBzZXJ2ZXInKX1gLFxuICAgIHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyMxYTFhMWEnLFxuICAgICAgYm9yZGVyQ29sb3I6ICdjeWFuJyxcbiAgICAgIGJvcmRlclN0eWxlOiAncm91bmQnLFxuICAgICAgbWFyZ2luOiAxLFxuICAgICAgcGFkZGluZzogMVxuICAgIH1cbiAgKTtcblxuICBjb25zb2xlLmxvZyhgXFxuJHtzdGF0dXNCb3h9XFxuYCk7XG59O1xuXG5jb25zdCBsb2FkSGFuZGxlciA9IGFzeW5jIChoYW5kbGVyUGF0aDogc3RyaW5nLCBvdXRwdXREaXI6IHN0cmluZykgPT4ge1xuICB0cnkge1xuICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aFJlc29sdmUob3V0cHV0RGlyLCBoYW5kbGVyUGF0aCk7XG4gICAgbG9nKGBMb2FkaW5nIGhhbmRsZXIgZnJvbTogJHtmdWxsUGF0aH1gLCAnaW5mbycsIGZhbHNlKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIYW5kbGVyIGZpbGUgbm90IGZvdW5kOiAke2Z1bGxQYXRofWApO1xuICAgIH1cblxuICAgIC8vIER5bmFtaWMgaW1wb3J0IG9mIHRoZSBoYW5kbGVyIHdpdGggYmV0dGVyIGVycm9yIGhhbmRsaW5nXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGhhbmRsZXJNb2R1bGUgPSBhd2FpdCBpbXBvcnQoZnVsbFBhdGgpO1xuICAgICAgbG9nKGBIYW5kbGVyIG1vZHVsZSBsb2FkZWQ6ICR7T2JqZWN0LmtleXMoaGFuZGxlck1vZHVsZSl9YCwgJ2luZm8nLCBmYWxzZSk7XG5cbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBoYW5kbGVyTW9kdWxlLmRlZmF1bHQgfHwgaGFuZGxlck1vZHVsZS5oYW5kbGVyIHx8IGhhbmRsZXJNb2R1bGU7XG4gICAgICBsb2coYEhhbmRsZXIgZm91bmQ6ICR7dHlwZW9mIGhhbmRsZXJ9YCwgJ2luZm8nLCBmYWxzZSk7XG5cbiAgICAgIHJldHVybiBoYW5kbGVyO1xuICAgIH0gY2F0Y2goaW1wb3J0RXJyb3IpIHtcbiAgICAgIGxvZyhgSW1wb3J0IGVycm9yIGZvciBoYW5kbGVyICR7aGFuZGxlclBhdGh9OiAke2ltcG9ydEVycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IGNhdGNoKGVycm9yKSB7XG4gICAgbG9nKGBFcnJvciBsb2FkaW5nIGhhbmRsZXIgJHtoYW5kbGVyUGF0aH06ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmNvbnN0IGNhcHR1cmVDb25zb2xlTG9ncyA9IChoYW5kbGVyOiAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KT0+IFByb21pc2U8YW55PiwgcXVpZXQ6IGJvb2xlYW4pID0+IHtcbiAgaWYocXVpZXQpIHtcbiAgICByZXR1cm4gaGFuZGxlcjtcbiAgfVxuXG4gIHJldHVybiBhc3luYyAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KSA9PiB7XG4gICAgLy8gQ2FwdHVyZSBjb25zb2xlLmxvZywgY29uc29sZS5lcnJvciwgZXRjLlxuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUxvZyA9IGNvbnNvbGUubG9nO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVXYXJuID0gY29uc29sZS53YXJuO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUluZm8gPSBjb25zb2xlLmluZm87XG5cbiAgICBjb25zdCBsb2dzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc29sZS5sb2cgPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGxvZ3MucHVzaChgW0xPR10gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAgIG9yaWdpbmFsQ29uc29sZUxvZyguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS5lcnJvciA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgbG9ncy5wdXNoKGBbRVJST1JdICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICBvcmlnaW5hbENvbnNvbGVFcnJvciguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS53YXJuID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtXQVJOXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlV2FybiguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS5pbmZvID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtJTkZPXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlSW5mbyguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICAvLyBPdXRwdXQgY2FwdHVyZWQgbG9nc1xuICAgICAgaWYobG9ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJy0tLSBIYW5kbGVyIENvbnNvbGUgT3V0cHV0IC0tLScpKTtcbiAgICAgICAgbG9ncy5mb3JFYWNoKChsb2cpID0+IGNvbnNvbGUubG9nKGNoYWxrLmdyYXkobG9nKSkpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCctLS0gRW5kIEhhbmRsZXIgQ29uc29sZSBPdXRwdXQgLS0tJykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIGNvbnNvbGUgbWV0aG9kc1xuICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG4gICAgICBjb25zb2xlLmVycm9yID0gb3JpZ2luYWxDb25zb2xlRXJyb3I7XG4gICAgICBjb25zb2xlLndhcm4gPSBvcmlnaW5hbENvbnNvbGVXYXJuO1xuICAgICAgY29uc29sZS5pbmZvID0gb3JpZ2luYWxDb25zb2xlSW5mbztcbiAgICB9XG4gIH07XG59O1xuXG5jb25zdCBjcmVhdGVFeHByZXNzU2VydmVyID0gYXN5bmMgKFxuICBjb25maWc6IFNlcnZlcmxlc3NDb25maWcsXG4gIG91dHB1dERpcjogc3RyaW5nLFxuICBodHRwUG9ydDogbnVtYmVyLFxuICBob3N0OiBzdHJpbmcsXG4gIHF1aWV0OiBib29sZWFuLFxuICBkZWJ1ZzogYm9vbGVhblxuKSA9PiB7XG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcblxuICAvLyBFbmFibGUgQ09SU1xuICBhcHAudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbicsICcqJyk7XG4gICAgcmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcycsICdHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBQQVRDSCwgT1BUSU9OUycpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnLCAnKicpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzJywgJ3RydWUnKTtcblxuICAgIGlmKHJlcS5tZXRob2QgPT09ICdPUFRJT05TJykge1xuICAgICAgcmVzLnNlbmRTdGF0dXMoMjAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUGFyc2UgSlNPTiBib2RpZXNcbiAgYXBwLnVzZShleHByZXNzLmpzb24oKSk7XG5cbiAgLy8gTG9hZCBHcmFwaFFMIGhhbmRsZXJcbiAgY29uc3QgbG9hZEdyYXBoUUxTY2hlbWEgPSBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSB0byBmaW5kIGEgR3JhcGhRTCBoYW5kbGVyXG4gICAgICBsZXQgZ3JhcGhxbEhhbmRsZXIgPSBudWxsO1xuXG4gICAgICBpZihjb25maWcuZnVuY3Rpb25zKSB7XG4gICAgICAgIGZvcihjb25zdCBbZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmZ1bmN0aW9ucykpIHtcbiAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgIGZvcihjb25zdCBldmVudCBvZiBmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgaWYoZXZlbnQuaHR0cCAmJiBldmVudC5odHRwLnBhdGgpIHtcbiAgICAgICAgICAgICAgICAvLyBMb29rIGZvciBHcmFwaFFMIGVuZHBvaW50c1xuICAgICAgICAgICAgICAgIGlmKGV2ZW50Lmh0dHAucGF0aCA9PT0gJy9wdWJsaWMnIHx8IGV2ZW50Lmh0dHAucGF0aCA9PT0gJy9ncmFwaHFsJykge1xuICAgICAgICAgICAgICAgICAgZ3JhcGhxbEhhbmRsZXIgPSBhd2FpdCBsb2FkSGFuZGxlcihmdW5jdGlvbkNvbmZpZy5oYW5kbGVyLCBvdXRwdXREaXIpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGdyYXBocWxIYW5kbGVyKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYoZ3JhcGhxbEhhbmRsZXIpIHtcbiAgICAgICAgbG9nKCdGb3VuZCBHcmFwaFFMIGhhbmRsZXInLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgcmV0dXJuIGdyYXBocWxIYW5kbGVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgbG9nKGBFcnJvciBsb2FkaW5nIEdyYXBoUUwgaGFuZGxlcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvLyBTZXQgdXAgR3JhcGhRTCBoYW5kbGVyIGZvciBHcmFwaFFMIHJlcXVlc3RzXG4gIHRyeSB7XG4gICAgY29uc3QgZ3JhcGhxbEhhbmRsZXIgPSBhd2FpdCBsb2FkR3JhcGhRTFNjaGVtYSgpO1xuICAgIGlmKGdyYXBocWxIYW5kbGVyKSB7XG4gICAgICAvLyBGaW5kIHRoZSBHcmFwaFFMIHBhdGggZnJvbSB0aGUgc2VydmVybGVzcyBjb25maWdcbiAgICAgIGxldCBncmFwaHFsUGF0aCA9ICcvZ3JhcGhxbCc7IC8vIGRlZmF1bHQgZmFsbGJhY2tcblxuICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICBmb3IoY29uc3QgW19mdW5jdGlvbk5hbWUsIGZ1bmN0aW9uQ29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcuZnVuY3Rpb25zKSkge1xuICAgICAgICAgIGlmKGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgZm9yKGNvbnN0IGV2ZW50IG9mIGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICBpZihldmVudD8uaHR0cD8ucGF0aCkge1xuICAgICAgICAgICAgICAgIGdyYXBocWxQYXRoID0gZXZlbnQuaHR0cC5wYXRoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGdyYXBocWxQYXRoICE9PSAnL2dyYXBocWwnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHVwIEdyYXBoUUwgZW5kcG9pbnQgd2l0aCBlbmhhbmNlZCBjb25zb2xlLmxvZyBjYXB0dXJlXG4gICAgICBhcHAudXNlKGdyYXBocWxQYXRoLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgLy8gR3JhcGhRTCBEZWJ1ZyBMb2dnaW5nXG4gICAgICAgIGlmKGRlYnVnICYmIHJlcS5ib2R5ICYmIHJlcS5ib2R5LnF1ZXJ5KSB7XG4gICAgICAgICAgbG9nKCfwn5SNIEdyYXBoUUwgRGVidWcgTW9kZTogQW5hbHl6aW5nIHJlcXVlc3QuLi4nLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgICAgICBsb2coYPCfk50gR3JhcGhRTCBRdWVyeTogJHtyZXEuYm9keS5xdWVyeX1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgICAgICBpZihyZXEuYm9keS52YXJpYWJsZXMpIHtcbiAgICAgICAgICAgIGxvZyhg8J+TiiBHcmFwaFFMIFZhcmlhYmxlczogJHtKU09OLnN0cmluZ2lmeShyZXEuYm9keS52YXJpYWJsZXMsIG51bGwsIDIpfWAsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihyZXEuYm9keS5vcGVyYXRpb25OYW1lKSB7XG4gICAgICAgICAgICBsb2coYPCfj7fvuI8gIEdyYXBoUUwgT3BlcmF0aW9uOiAke3JlcS5ib2R5Lm9wZXJhdGlvbk5hbWV9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5oYW5jZWQgY29uc29sZS5sb2cgY2FwdHVyZVxuICAgICAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgICAgY29uc3QgbG9nczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBjb25zb2xlLmxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgY29uc3QgbG9nTWVzc2FnZSA9IGFyZ3MubWFwKChhcmcpID0+XG4gICAgICAgICAgICAodHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShhcmcsIG51bGwsIDIpIDogU3RyaW5nKGFyZykpXG4gICAgICAgICAgKS5qb2luKCcgJyk7XG4gICAgICAgICAgbG9ncy5wdXNoKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIG9yaWdpbmFsQ29uc29sZUxvZyhgW0dyYXBoUUxdICR7bG9nTWVzc2FnZX1gKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBDcmVhdGUgY29udGV4dCBmb3IgdGhlIGhhbmRsZXJcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICd0ZXN0LXJlcXVlc3QtaWQnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ2dyYXBocWwnLFxuICAgICAgICAgIGZ1bmN0aW9uVmVyc2lvbjogJyRMQVRFU1QnLFxuICAgICAgICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogKCkgPT4gMzAwMDAsXG4gICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiAnYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjpncmFwaHFsJyxcbiAgICAgICAgICBsb2dHcm91cE5hbWU6ICcvYXdzL2xhbWJkYS9ncmFwaHFsJyxcbiAgICAgICAgICBsb2dTdHJlYW1OYW1lOiAndGVzdC1sb2ctc3RyZWFtJyxcbiAgICAgICAgICByZXEsXG4gICAgICAgICAgcmVzXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gV3JhcCBoYW5kbGVyIHdpdGggY29uc29sZSBsb2cgY2FwdHVyZVxuICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhncmFwaHFsSGFuZGxlciwgcXVpZXQpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2FsbCB0aGUgaGFuZGxlciB3aXRoIEdyYXBoUUwgcGFyYW1ldGVyc1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdyYXBwZWRIYW5kbGVyKHtcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcS5ib2R5KSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzLFxuICAgICAgICAgICAgaHR0cE1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgcGF0aDogZ3JhcGhxbFBhdGgsXG4gICAgICAgICAgICBxdWVyeVN0cmluZ1BhcmFtZXRlcnM6IHt9XG4gICAgICAgICAgfSwgY29udGV4dCk7XG5cbiAgICAgICAgICAvLyBSZXN0b3JlIGNvbnNvbGUubG9nXG4gICAgICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG5cbiAgICAgICAgICAvLyBIYW5kbGUgdGhlIHJlc3VsdFxuICAgICAgICAgIGlmKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgcmVzLnN0YXR1cyhyZXN1bHQuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICBpZihyZXN1bHQuaGVhZGVycykge1xuICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXN1bHQuaGVhZGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5zZW5kKHJlc3VsdC5ib2R5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzLmpzb24ocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAvLyBSZXN0b3JlIGNvbnNvbGUubG9nXG4gICAgICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG4gICAgICAgICAgbG9nKGBHcmFwaFFMIGhhbmRsZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsb2coYEdyYXBoUUwgZW5kcG9pbnQgYXZhaWxhYmxlIGF0IGh0dHA6Ly8ke2hvc3R9OiR7aHR0cFBvcnR9JHtncmFwaHFsUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYEVycm9yIHNldHRpbmcgdXAgR3JhcGhRTDogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIGZvciBub24tR3JhcGhRTCByb3V0ZXMgLSBoYW5kbGUgYWxsIHJlbWFpbmluZyByb3V0ZXNcbiAgYXBwLnVzZSgnLycsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSByZXEudXJsIHx8ICcvJztcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHJlcS5tZXRob2QgfHwgJ0dFVCc7XG4gICAgICBjb25zdCBwYXRobmFtZSA9IHJlcS5wYXRoIHx8IHVybC5zcGxpdCgnPycpWzBdOyAvLyBFeHRyYWN0IHBhdGhuYW1lIHdpdGhvdXQgcXVlcnkgc3RyaW5nXG5cbiAgICAgIGxvZyhgJHttZXRob2R9ICR7dXJsfSAocGF0aG5hbWU6ICR7cGF0aG5hbWV9KWAsICdpbmZvJywgZmFsc2UpO1xuXG4gICAgICAvLyBGaW5kIG1hdGNoaW5nIGZ1bmN0aW9uXG4gICAgICBsZXQgbWF0Y2hlZEZ1bmN0aW9uID0gbnVsbDtcblxuICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgIGxvZyhgQXZhaWxhYmxlIGZ1bmN0aW9uczogJHtPYmplY3Qua2V5cyhjb25maWcuZnVuY3Rpb25zKS5qb2luKCcsICcpfWAsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGZvcihjb25zdCBbZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmZ1bmN0aW9ucykpIHtcbiAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgIGZvcihjb25zdCBldmVudCBvZiBmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgaWYoZXZlbnQuaHR0cCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50UGF0aCA9IGV2ZW50Lmh0dHAucGF0aCB8fCAnLyc7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRNZXRob2QgPSBldmVudC5odHRwLm1ldGhvZCB8fCAnR0VUJztcblxuICAgICAgICAgICAgICAgIGlmKGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgICBsb2coYENoZWNraW5nIGZ1bmN0aW9uICR7ZnVuY3Rpb25OYW1lfTogcGF0aD0ke2V2ZW50UGF0aH0sIG1ldGhvZD0ke2V2ZW50TWV0aG9kfSBhZ2FpbnN0IHBhdGhuYW1lPSR7cGF0aG5hbWV9LCBtZXRob2Q9JHttZXRob2R9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSW1wcm92ZWQgcGF0aCBtYXRjaGluZyAtIGNvbXBhcmUgcGF0aG5hbWUgd2l0aG91dCBxdWVyeSBzdHJpbmdcbiAgICAgICAgICAgICAgICBpZihldmVudFBhdGggJiYgZXZlbnRQYXRoID09PSBwYXRobmFtZSAmJiBldmVudE1ldGhvZCA9PT0gbWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgICBtYXRjaGVkRnVuY3Rpb24gPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgICAgICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgICAgICAgICAgICBsb2coYE1hdGNoZWQgZnVuY3Rpb246ICR7bWF0Y2hlZEZ1bmN0aW9ufWAsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKG1hdGNoZWRGdW5jdGlvbikge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZihkZWJ1Zykge1xuICAgICAgICAgIGxvZygnTm8gZnVuY3Rpb25zIGZvdW5kIGluIGNvbmZpZycsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmKG1hdGNoZWRGdW5jdGlvbiAmJiBjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0pIHtcbiAgICAgICAgLy8gUmVzb2x2ZSBoYW5kbGVyIHBhdGggcmVsYXRpdmUgdG8gb3V0cHV0IGRpcmVjdG9yeVxuICAgICAgICBjb25zdCBoYW5kbGVyUGF0aCA9IGNvbmZpZy5mdW5jdGlvbnNbbWF0Y2hlZEZ1bmN0aW9uXS5oYW5kbGVyO1xuICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgbG9hZEhhbmRsZXIoaGFuZGxlclBhdGgsIG91dHB1dERpcik7XG5cbiAgICAgICAgaWYoaGFuZGxlcikge1xuICAgICAgICAgIGNvbnN0IHdyYXBwZWRIYW5kbGVyID0gY2FwdHVyZUNvbnNvbGVMb2dzKGhhbmRsZXIsIHF1aWV0KTtcblxuICAgICAgICAgIGNvbnN0IGV2ZW50ID0ge1xuICAgICAgICAgICAgYm9keTogcmVxLmJvZHksXG4gICAgICAgICAgICBoZWFkZXJzOiByZXEuaGVhZGVycyxcbiAgICAgICAgICAgIGh0dHBNZXRob2Q6IG1ldGhvZCxcbiAgICAgICAgICAgIHBhdGg6IHVybCxcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nUGFyYW1ldGVyczogcmVxLnF1ZXJ5XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICd0ZXN0LXJlcXVlc3QtaWQnLFxuICAgICAgICAgICAgZnVuY3Rpb25OYW1lOiBtYXRjaGVkRnVuY3Rpb24sXG4gICAgICAgICAgICBmdW5jdGlvblZlcnNpb246ICckTEFURVNUJyxcbiAgICAgICAgICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogKCkgPT4gMzAwMDAsXG4gICAgICAgICAgICBpbnZva2VkRnVuY3Rpb25Bcm46IGBhcm46YXdzOmxhbWJkYTp1cy1lYXN0LTE6MTIzNDU2Nzg5MDEyOmZ1bmN0aW9uOiR7bWF0Y2hlZEZ1bmN0aW9ufWAsXG4gICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgbG9nU3RyZWFtTmFtZTogJ3Rlc3QtbG9nLXN0cmVhbScsXG4gICAgICAgICAgICBtZW1vcnlMaW1pdEluTUI6ICcxMjgnXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3cmFwcGVkSGFuZGxlcihldmVudCwgY29udGV4dCk7XG5cbiAgICAgICAgICAgIGlmKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgICByZXMuc3RhdHVzKHJlc3VsdC5zdGF0dXNDb2RlKTtcbiAgICAgICAgICAgICAgaWYocmVzdWx0LmhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXN1bHQuaGVhZGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKGtleSwgU3RyaW5nKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzLnNlbmQocmVzdWx0LmJvZHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzLmpzb24ocmVzdWx0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgICAgICBsb2coYEhhbmRsZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICAgICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7ZXJyb3I6IGVycm9yLm1lc3NhZ2V9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oe2Vycm9yOiAnSGFuZGxlciBub3QgZm91bmQnfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHtlcnJvcjogJ0Z1bmN0aW9uIG5vdCBmb3VuZCd9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBsb2coYFJvdXRlIGhhbmRsaW5nIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gYXBwO1xufTtcblxuY29uc3QgY3JlYXRlV2ViU29ja2V0U2VydmVyID0gKFxuICBjb25maWc6IFNlcnZlcmxlc3NDb25maWcsXG4gIG91dHB1dERpcjogc3RyaW5nLFxuICB3c1BvcnQ6IG51bWJlcixcbiAgcXVpZXQ6IGJvb2xlYW4sXG4gIGRlYnVnOiBib29sZWFuXG4pID0+IHtcbiAgY29uc3Qgd3NzID0gbmV3IFdlYlNvY2tldFNlcnZlcih7cG9ydDogd3NQb3J0fSk7XG5cbiAgd3NzLm9uKCdjb25uZWN0aW9uJywgYXN5bmMgKHdzLCByZXEpID0+IHtcbiAgICBsb2coYFdlYlNvY2tldCBjb25uZWN0aW9uIGVzdGFibGlzaGVkOiAke3JlcS51cmx9YCwgJ2luZm8nLCBmYWxzZSk7XG5cbiAgICB3cy5vbignbWVzc2FnZScsIGFzeW5jIChtZXNzYWdlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShtZXNzYWdlLnRvU3RyaW5nKCkpO1xuXG4gICAgICAgIC8vIEZpbmQgbWF0Y2hpbmcgV2ViU29ja2V0IGZ1bmN0aW9uXG4gICAgICAgIGxldCBtYXRjaGVkRnVuY3Rpb24gPSBudWxsO1xuXG4gICAgICAgIGlmKGNvbmZpZy5mdW5jdGlvbnMpIHtcbiAgICAgICAgICBmb3IoY29uc3QgW2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgZm9yKGNvbnN0IGV2ZW50IG9mIGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICAgIGlmKGV2ZW50LndlYnNvY2tldCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgcm91dGUgPSBldmVudC53ZWJzb2NrZXQucm91dGUgfHwgJyRjb25uZWN0JztcbiAgICAgICAgICAgICAgICAgIGlmKHJvdXRlID09PSAnJGRlZmF1bHQnIHx8IHJvdXRlID09PSBkYXRhLmFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkRnVuY3Rpb24gPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG1hdGNoZWRGdW5jdGlvbiAmJiBjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0pIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgbG9hZEhhbmRsZXIoY29uZmlnLmZ1bmN0aW9uc1ttYXRjaGVkRnVuY3Rpb25dLmhhbmRsZXIsIG91dHB1dERpcik7XG5cbiAgICAgICAgICBpZihoYW5kbGVyKSB7XG4gICAgICAgICAgICAvLyBXcmFwIGhhbmRsZXIgd2l0aCBjb25zb2xlIGxvZyBjYXB0dXJlXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhoYW5kbGVyLCBxdWlldCk7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgICAgYm9keTogZGF0YS5ib2R5IHx8IG51bGwsXG4gICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgYXBpR2F0ZXdheToge1xuICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IGB3czovL2xvY2FsaG9zdDoke3dzUG9ydH1gXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6ICd0ZXN0LWNvbm5lY3Rpb24taWQnLFxuICAgICAgICAgICAgICAgIHJvdXRlS2V5OiBkYXRhLmFjdGlvbiB8fCAnJGRlZmF1bHQnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgICAgIGF3c1JlcXVlc3RJZDogJ3Rlc3QtcmVxdWVzdC1pZCcsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogbWF0Y2hlZEZ1bmN0aW9uLFxuICAgICAgICAgICAgICBmdW5jdGlvblZlcnNpb246ICckTEFURVNUJyxcbiAgICAgICAgICAgICAgZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzOiAoKSA9PiAzMDAwMCxcbiAgICAgICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiBgYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjoke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgICBsb2dTdHJlYW1OYW1lOiAndGVzdC1sb2ctc3RyZWFtJyxcbiAgICAgICAgICAgICAgbWVtb3J5TGltaXRJbk1COiAnMTI4J1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd3JhcHBlZEhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAvLyBIYW5kbGUgTGFtYmRhIHJlc3BvbnNlIGZvcm1hdCBmb3IgV2ViU29ja2V0XG4gICAgICAgICAgICBpZihyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0LnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIExhbWJkYSByZXNwb25zZSBvYmplY3QsIGV4dHJhY3QgdGhlIGJvZHlcbiAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHJlc3VsdC5ib2R5IHx8ICcnO1xuICAgICAgICAgICAgICB3cy5zZW5kKGJvZHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGRpcmVjdCByZXNwb25zZSwgc3RyaW5naWZ5IGl0XG4gICAgICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe2Vycm9yOiAnSGFuZGxlciBub3QgZm91bmQnfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtlcnJvcjogJ1dlYlNvY2tldCBmdW5jdGlvbiBub3QgZm91bmQnfSkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGxvZyhgV2ViU29ja2V0IGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtlcnJvcjogZXJyb3IubWVzc2FnZX0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHdzLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIGxvZygnV2ViU29ja2V0IGNvbm5lY3Rpb24gY2xvc2VkJywgJ2luZm8nLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB3c3M7XG59O1xuXG5jb25zdCBsb2FkRW52RmlsZSA9IChlbnZQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGlmKCFleGlzdHNTeW5jKGVudlBhdGgpKSB7XG4gICAgcmV0dXJuIGVudlZhcnM7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGVudkNvbnRlbnQgPSByZWFkRmlsZVN5bmMoZW52UGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGVudkNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuXG4gICAgZm9yKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG5cbiAgICAgIC8vIFNraXAgZW1wdHkgbGluZXMgYW5kIGNvbW1lbnRzXG4gICAgICBpZighdHJpbW1lZExpbmUgfHwgdHJpbW1lZExpbmUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBQYXJzZSBLRVk9dmFsdWUgZm9ybWF0XG4gICAgICBjb25zdCBlcXVhbEluZGV4ID0gdHJpbW1lZExpbmUuaW5kZXhPZignPScpO1xuICAgICAgaWYoZXF1YWxJbmRleCA+IDApIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdHJpbW1lZExpbmUuc3Vic3RyaW5nKDAsIGVxdWFsSW5kZXgpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0cmltbWVkTGluZS5zdWJzdHJpbmcoZXF1YWxJbmRleCArIDEpLnRyaW0oKTtcblxuICAgICAgICAvLyBSZW1vdmUgcXVvdGVzIGlmIHByZXNlbnRcbiAgICAgICAgY29uc3QgY2xlYW5WYWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgJycpO1xuXG4gICAgICAgIGlmKGtleSkge1xuICAgICAgICAgIGVudlZhcnNba2V5XSA9IGNsZWFuVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYFdhcm5pbmc6IENvdWxkIG5vdCBsb2FkIC5lbnYgZmlsZSBhdCAke2VudlBhdGh9OiAke2Vycm9yLm1lc3NhZ2V9YCwgJ3dhcm4nLCBmYWxzZSk7XG4gIH1cblxuICByZXR1cm4gZW52VmFycztcbn07XG5cbmV4cG9ydCBjb25zdCBzZXJ2ZXJsZXNzID0gYXN5bmMgKFxuICBjbWQ6IFNlcnZlcmxlc3NPcHRpb25zLFxuICBjYWxsYmFjazogU2VydmVybGVzc0NhbGxiYWNrID0gKCkgPT4gKHt9KVxuKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3Qge1xuICAgIGNsaU5hbWUgPSAnTGV4JyxcbiAgICBjb25maWcsXG4gICAgZGVidWcgPSBmYWxzZSxcbiAgICBob3N0ID0gJ2xvY2FsaG9zdCcsXG4gICAgaHR0cFBvcnQgPSA1MDAwLFxuICAgIGh0dHBzUG9ydCA9IDUwMDEsXG4gICAgcXVpZXQgPSBmYWxzZSxcbiAgICByZW1vdmUgPSBmYWxzZSxcbiAgICB0ZXN0ID0gZmFsc2UsXG4gICAgdXNlUHVibGljSXAsXG4gICAgdmFyaWFibGVzLFxuICAgIHdzUG9ydCA9IDUwMDJcbiAgfSA9IGNtZDtcblxuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgbG9nKGAke2NsaU5hbWV9IHN0YXJ0aW5nIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgYXdhaXQgTGV4Q29uZmlnLnBhcnNlQ29uZmlnKGNtZCk7XG5cbiAgY29uc3Qge291dHB1dEZ1bGxQYXRofSA9IExleENvbmZpZy5jb25maWc7XG5cbiAgLy8gTG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAuZW52IGZpbGVzXG4gIGNvbnN0IGVudlBhdGhzID0gW1xuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52JyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy5lbnYubG9jYWwnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLmVudi5kZXZlbG9wbWVudCcpXG4gIF07XG5cbiAgbGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAvLyBMb2FkIGZyb20gLmVudiBmaWxlcyBpbiBvcmRlciAobGF0ZXIgZmlsZXMgb3ZlcnJpZGUgZWFybGllciBvbmVzKVxuICBmb3IoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGZpbGVFbnZWYXJzID0gbG9hZEVudkZpbGUoZW52UGF0aCk7XG4gICAgaWYoT2JqZWN0LmtleXMoZmlsZUVudlZhcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZyhgTG9hZGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tOiAke2VudlBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgfVxuICAgIGVudlZhcnMgPSB7Li4uZW52VmFycywgLi4uZmlsZUVudlZhcnN9O1xuICB9XG5cbiAgLy8gU3RhcnQgd2l0aCBkZWZhdWx0IE5PREVfRU5WIGFuZCBsb2FkZWQgLmVudiB2YXJpYWJsZXNcbiAgbGV0IHZhcmlhYmxlc09iajogb2JqZWN0ID0ge05PREVfRU5WOiAnZGV2ZWxvcG1lbnQnLCAuLi5lbnZWYXJzfTtcblxuICAvLyBPdmVycmlkZSB3aXRoIGNvbW1hbmQgbGluZSB2YXJpYWJsZXMgaWYgcHJvdmlkZWRcbiAgaWYodmFyaWFibGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsaVZhcnMgPSBKU09OLnBhcnNlKHZhcmlhYmxlcyk7XG4gICAgICB2YXJpYWJsZXNPYmogPSB7Li4udmFyaWFibGVzT2JqLCAuLi5jbGlWYXJzfTtcbiAgICB9IGNhdGNoKF9lcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgb3B0aW9uIGlzIG5vdCBhIHZhbGlkIEpTT04gb2JqZWN0LmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzcy5lbnYgPSB7Li4ucHJvY2Vzcy5lbnYsIC4uLnZhcmlhYmxlc09ian07XG5cbiAgLy8gSWYgaW4gdGVzdCBtb2RlLCBleGl0IGVhcmx5IGFmdGVyIGxvYWRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gIGlmKHRlc3QpIHtcbiAgICBsb2coJ1Rlc3QgbW9kZTogRW52aXJvbm1lbnQgdmFyaWFibGVzIGxvYWRlZCwgZXhpdGluZycsICdpbmZvJywgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYocmVtb3ZlKSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQ2xlYW5pbmcgb3V0cHV0IGRpcmVjdG9yeS4uLicpO1xuICAgIGF3YWl0IHJlbW92ZUZpbGVzKG91dHB1dEZ1bGxQYXRoIHx8ICcnKTtcbiAgICBzcGlubmVyLnN1Y2NlZWQoJ1N1Y2Nlc3NmdWxseSBjbGVhbmVkIG91dHB1dCBkaXJlY3RvcnkhJyk7XG4gIH1cblxuICAvLyBMb2FkIHNlcnZlcmxlc3MgY29uZmlndXJhdGlvblxuICBsZXQgc2VydmVybGVzc0NvbmZpZzogU2VydmVybGVzc0NvbmZpZyA9IHt9O1xuXG4gIHRyeSB7XG4gICAgLy8gVXNlIGdldFBhY2thZ2VEaXIgdG8gaGFuZGxlIG5wbSB3b3Jrc3BhY2VzIGNvcnJlY3RseVxuICAgIGNvbnN0IHBhY2thZ2VEaXIgPSBnZXRQYWNrYWdlRGlyKCk7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IGNvbmZpZyB8fCBwYXRoUmVzb2x2ZShwYWNrYWdlRGlyLCAnbGV4LmNvbmZpZy5tanMnKTtcbiAgICBsb2coYExvYWRpbmcgc2VydmVybGVzcyBjb25maWcgZnJvbTogJHtjb25maWdQYXRofWAsICdpbmZvJywgcXVpZXQpO1xuXG4gICAgaWYoZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xuICAgICAgY29uc3QgY29uZmlnTW9kdWxlID0gYXdhaXQgaW1wb3J0KGNvbmZpZ1BhdGgpO1xuICAgICAgc2VydmVybGVzc0NvbmZpZyA9IGNvbmZpZ01vZHVsZS5kZWZhdWx0Py5zZXJ2ZXJsZXNzIHx8IGNvbmZpZ01vZHVsZS5zZXJ2ZXJsZXNzIHx8IHt9O1xuICAgICAgbG9nKCdTZXJ2ZXJsZXNzIGNvbmZpZyBsb2FkZWQgc3VjY2Vzc2Z1bGx5JywgJ2luZm8nLCBxdWlldCk7XG4gICAgICBsb2coYExvYWRlZCBmdW5jdGlvbnM6ICR7T2JqZWN0LmtleXMoc2VydmVybGVzc0NvbmZpZy5mdW5jdGlvbnMgfHwge30pLmpvaW4oJywgJyl9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZyhgTm8gc2VydmVybGVzcyBjb25maWcgZm91bmQgYXQgJHtjb25maWdQYXRofSwgdXNpbmcgZGVmYXVsdHNgLCAnd2FybicsIHF1aWV0KTtcbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYEVycm9yIGxvYWRpbmcgc2VydmVybGVzcyBjb25maWc6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgLy8gRG9uJ3QgZXhpdCwgY29udGludWUgd2l0aCBlbXB0eSBjb25maWdcbiAgfVxuXG4gIC8vIE1lcmdlIGNvbmZpZyB3aXRoIGNvbW1hbmQgbGluZSBvcHRpb25zXG4gIGNvbnN0IGZpbmFsQ29uZmlnOiBTZXJ2ZXJsZXNzQ29uZmlnID0ge1xuICAgIC4uLnNlcnZlcmxlc3NDb25maWcsXG4gICAgY3VzdG9tOiB7XG4gICAgICAnc2VydmVybGVzcy1vZmZsaW5lJzoge1xuICAgICAgICBjb3JzOiBzZXJ2ZXJsZXNzQ29uZmlnLmN1c3RvbT8uWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXT8uY29ycyAhPT0gZmFsc2UsXG4gICAgICAgIGhvc3Q6IHNlcnZlcmxlc3NDb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy5ob3N0IHx8IGhvc3QsXG4gICAgICAgIGh0dHBQb3J0OiBzZXJ2ZXJsZXNzQ29uZmlnLmN1c3RvbT8uWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXT8uaHR0cFBvcnQgfHwgaHR0cFBvcnQsXG4gICAgICAgIGh0dHBzUG9ydDogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/Lmh0dHBzUG9ydCB8fCBodHRwc1BvcnQsXG4gICAgICAgIHdzUG9ydDogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/LndzUG9ydCB8fCB3c1BvcnRcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgb3V0cHV0RGlyID0gb3V0cHV0RnVsbFBhdGggfHwgJ2xpYic7XG4gIGxvZyhgVXNpbmcgb3V0cHV0IGRpcmVjdG9yeTogJHtvdXRwdXREaXJ9YCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgdHJ5IHtcbiAgICBzcGlubmVyLnN0YXJ0KCdTdGFydGluZyBzZXJ2ZXJsZXNzIGRldmVsb3BtZW50IHNlcnZlci4uLicpO1xuXG4gICAgY29uc3QgaHR0cFBvcnQgPSBmaW5hbENvbmZpZy5jdXN0b20hWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXSEuaHR0cFBvcnQhO1xuICAgIGNvbnN0IHdzUG9ydCA9IGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS53c1BvcnQhO1xuICAgIGNvbnN0IGhvc3QgPSBmaW5hbENvbmZpZy5jdXN0b20hWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXSEuaG9zdCE7XG5cbiAgICBsb2coYENyZWF0aW5nIEhUVFAgc2VydmVyIG9uICR7aG9zdH06JHtodHRwUG9ydH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICBsb2coYENyZWF0aW5nIFdlYlNvY2tldCBzZXJ2ZXIgb24gcG9ydCAke3dzUG9ydH1gLCAnaW5mbycsIHF1aWV0KTtcblxuICAgIC8vIENyZWF0ZSBFeHByZXNzIHNlcnZlclxuICAgIGNvbnN0IGV4cHJlc3NBcHAgPSBhd2FpdCBjcmVhdGVFeHByZXNzU2VydmVyKFxuICAgICAgZmluYWxDb25maWcsXG4gICAgICBvdXRwdXREaXIsXG4gICAgICBodHRwUG9ydCxcbiAgICAgIGhvc3QsXG4gICAgICBxdWlldCxcbiAgICAgIGRlYnVnXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBXZWJTb2NrZXQgc2VydmVyXG4gICAgY29uc3Qgd3NTZXJ2ZXIgPSBjcmVhdGVXZWJTb2NrZXRTZXJ2ZXIoXG4gICAgICBmaW5hbENvbmZpZyxcbiAgICAgIG91dHB1dERpcixcbiAgICAgIHdzUG9ydCxcbiAgICAgIHF1aWV0LFxuICAgICAgZGVidWdcbiAgICApO1xuXG4gICAgLy8gSGFuZGxlIHNlcnZlciBlcnJvcnNcbiAgICB3c1NlcnZlci5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGxvZyhgV2ViU29ja2V0IHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHN0YXJ0IFdlYlNvY2tldCBzZXJ2ZXIuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcblxuICAgIC8vIFN0YXJ0IEV4cHJlc3Mgc2VydmVyXG4gICAgY29uc3Qgc2VydmVyID0gZXhwcmVzc0FwcC5saXN0ZW4oaHR0cFBvcnQsIGhvc3QsICgpID0+IHtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZCgnU2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIgc3RhcnRlZC4nKTtcblxuICAgICAgZGlzcGxheVNlcnZlclN0YXR1cyhcbiAgICAgICAgaHR0cFBvcnQsXG4gICAgICAgIGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwc1BvcnQhLFxuICAgICAgICB3c1BvcnQsXG4gICAgICAgIGhvc3QsXG4gICAgICAgIHF1aWV0XG4gICAgICApO1xuXG4gICAgICBmZXRjaFB1YmxpY0lwKHVzZVB1YmxpY0lwKS50aGVuKChwdWJsaWNJcCkgPT4ge1xuICAgICAgICBpZihwdWJsaWNJcCkge1xuICAgICAgICAgIGRpc3BsYXlTZXJ2ZXJTdGF0dXMoXG4gICAgICAgICAgICBodHRwUG9ydCxcbiAgICAgICAgICAgIGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwc1BvcnQhLFxuICAgICAgICAgICAgd3NQb3J0LFxuICAgICAgICAgICAgaG9zdCxcbiAgICAgICAgICAgIHF1aWV0LFxuICAgICAgICAgICAgcHVibGljSXBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBFeHByZXNzIHNlcnZlciBlcnJvcnNcbiAgICBzZXJ2ZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBsb2coYEV4cHJlc3Mgc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gc3RhcnQgRXhwcmVzcyBzZXJ2ZXIuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBncmFjZWZ1bCBzaHV0ZG93blxuICAgIGNvbnN0IHNodXRkb3duID0gKCkgPT4ge1xuICAgICAgbG9nKCdcXG5TaHV0dGluZyBkb3duIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgIHdzU2VydmVyLmNsb3NlKCk7XG4gICAgICBjYWxsYmFjaygwKTtcbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbignU0lHSU5UJywgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzaHV0ZG93bik7XG5cbiAgICAvLyBLZWVwIHRoZSBwcm9jZXNzIGFsaXZlXG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcblxuICAgIGxvZygnU2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIgaXMgcnVubmluZy4gUHJlc3MgQ3RybCtDIHRvIHN0b3AuJywgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAvLyBEb24ndCBjYWxsIGNhbGxiYWNrIGhlcmUsIGxldCB0aGUgcHJvY2VzcyBzdGF5IGFsaXZlXG4gICAgcmV0dXJuIDA7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gc3RhcnQgc2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIuJyk7XG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn07Il0sIm5hbWVzIjpbImJveGVuIiwiY2hhbGsiLCJleHByZXNzIiwicmVhZEZpbGVTeW5jIiwiZXhpc3RzU3luYyIsIm1rZGlyU3luYyIsIndyaXRlRmlsZVN5bmMiLCJob21lZGlyIiwicmVzb2x2ZSIsInBhdGhSZXNvbHZlIiwiam9pbiIsIldlYlNvY2tldFNlcnZlciIsIkxleENvbmZpZyIsImdldFBhY2thZ2VEaXIiLCJjcmVhdGVTcGlubmVyIiwicmVtb3ZlRmlsZXMiLCJsb2ciLCJnZXRDYWNoZURpciIsImNhY2hlRGlyIiwicmVjdXJzaXZlIiwiZ2V0Q2FjaGVQYXRoIiwicmVhZFB1YmxpY0lwQ2FjaGUiLCJjYWNoZVBhdGgiLCJjYWNoZURhdGEiLCJjYWNoZSIsIkpTT04iLCJwYXJzZSIsIm9uZVdlZWtNcyIsIkRhdGUiLCJub3ciLCJ0aW1lc3RhbXAiLCJ3cml0ZVB1YmxpY0lwQ2FjaGUiLCJpcCIsInN0cmluZ2lmeSIsImZldGNoUHVibGljSXAiLCJmb3JjZVJlZnJlc2giLCJQcm9taXNlIiwiY2FjaGVkIiwiZmV0Y2giLCJ0aGVuIiwicmVzIiwidGV4dCIsImRhdGEiLCJ0cmltIiwiY2F0Y2giLCJ1bmRlZmluZWQiLCJkaXNwbGF5U2VydmVyU3RhdHVzIiwiaHR0cFBvcnQiLCJodHRwc1BvcnQiLCJ3c1BvcnQiLCJob3N0IiwicXVpZXQiLCJwdWJsaWNJcCIsImh0dHBVcmwiLCJodHRwc1VybCIsIndzVXJsIiwid3NzVXJsIiwidXJsTGluZXMiLCJncmVlbiIsInVuZGVybGluZSIsInN0YXR1c0JveCIsImN5YW4iLCJib2xkIiwieWVsbG93IiwiYmFja2dyb3VuZENvbG9yIiwiYm9yZGVyQ29sb3IiLCJib3JkZXJTdHlsZSIsIm1hcmdpbiIsInBhZGRpbmciLCJjb25zb2xlIiwibG9hZEhhbmRsZXIiLCJoYW5kbGVyUGF0aCIsIm91dHB1dERpciIsImZ1bGxQYXRoIiwiRXJyb3IiLCJoYW5kbGVyTW9kdWxlIiwiT2JqZWN0Iiwia2V5cyIsImhhbmRsZXIiLCJkZWZhdWx0IiwiaW1wb3J0RXJyb3IiLCJtZXNzYWdlIiwiZXJyb3IiLCJjYXB0dXJlQ29uc29sZUxvZ3MiLCJldmVudCIsImNvbnRleHQiLCJvcmlnaW5hbENvbnNvbGVMb2ciLCJvcmlnaW5hbENvbnNvbGVFcnJvciIsIm9yaWdpbmFsQ29uc29sZVdhcm4iLCJ3YXJuIiwib3JpZ2luYWxDb25zb2xlSW5mbyIsImluZm8iLCJsb2dzIiwiYXJncyIsInB1c2giLCJyZXN1bHQiLCJsZW5ndGgiLCJncmF5IiwiZm9yRWFjaCIsImNyZWF0ZUV4cHJlc3NTZXJ2ZXIiLCJjb25maWciLCJkZWJ1ZyIsImFwcCIsInVzZSIsInJlcSIsIm5leHQiLCJoZWFkZXIiLCJtZXRob2QiLCJzZW5kU3RhdHVzIiwianNvbiIsImxvYWRHcmFwaFFMU2NoZW1hIiwiZ3JhcGhxbEhhbmRsZXIiLCJmdW5jdGlvbnMiLCJmdW5jdGlvbk5hbWUiLCJmdW5jdGlvbkNvbmZpZyIsImVudHJpZXMiLCJldmVudHMiLCJodHRwIiwicGF0aCIsImdyYXBocWxQYXRoIiwiX2Z1bmN0aW9uTmFtZSIsImJvZHkiLCJxdWVyeSIsInZhcmlhYmxlcyIsIm9wZXJhdGlvbk5hbWUiLCJsb2dNZXNzYWdlIiwibWFwIiwiYXJnIiwiU3RyaW5nIiwiYXdzUmVxdWVzdElkIiwiZnVuY3Rpb25WZXJzaW9uIiwiZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzIiwiaW52b2tlZEZ1bmN0aW9uQXJuIiwibG9nR3JvdXBOYW1lIiwibG9nU3RyZWFtTmFtZSIsIndyYXBwZWRIYW5kbGVyIiwiaGVhZGVycyIsImh0dHBNZXRob2QiLCJxdWVyeVN0cmluZ1BhcmFtZXRlcnMiLCJzdGF0dXNDb2RlIiwic3RhdHVzIiwia2V5IiwidmFsdWUiLCJzZXRIZWFkZXIiLCJzZW5kIiwidXJsIiwicGF0aG5hbWUiLCJzcGxpdCIsIm1hdGNoZWRGdW5jdGlvbiIsImV2ZW50UGF0aCIsImV2ZW50TWV0aG9kIiwibWVtb3J5TGltaXRJbk1CIiwiY3JlYXRlV2ViU29ja2V0U2VydmVyIiwid3NzIiwicG9ydCIsIm9uIiwid3MiLCJ0b1N0cmluZyIsIndlYnNvY2tldCIsInJvdXRlIiwiYWN0aW9uIiwicmVxdWVzdENvbnRleHQiLCJhcGlHYXRld2F5IiwiZW5kcG9pbnQiLCJjb25uZWN0aW9uSWQiLCJyb3V0ZUtleSIsImxvYWRFbnZGaWxlIiwiZW52UGF0aCIsImVudlZhcnMiLCJlbnZDb250ZW50IiwibGluZXMiLCJsaW5lIiwidHJpbW1lZExpbmUiLCJzdGFydHNXaXRoIiwiZXF1YWxJbmRleCIsImluZGV4T2YiLCJzdWJzdHJpbmciLCJjbGVhblZhbHVlIiwicmVwbGFjZSIsInNlcnZlcmxlc3MiLCJjbWQiLCJjYWxsYmFjayIsImNsaU5hbWUiLCJyZW1vdmUiLCJ0ZXN0IiwidXNlUHVibGljSXAiLCJzcGlubmVyIiwicGFyc2VDb25maWciLCJvdXRwdXRGdWxsUGF0aCIsImVudlBhdGhzIiwicHJvY2VzcyIsImN3ZCIsImZpbGVFbnZWYXJzIiwidmFyaWFibGVzT2JqIiwiTk9ERV9FTlYiLCJjbGlWYXJzIiwiX2Vycm9yIiwiZW52Iiwic3RhcnQiLCJzdWNjZWVkIiwic2VydmVybGVzc0NvbmZpZyIsInBhY2thZ2VEaXIiLCJjb25maWdQYXRoIiwiY29uZmlnTW9kdWxlIiwiZmluYWxDb25maWciLCJjdXN0b20iLCJjb3JzIiwiZXhwcmVzc0FwcCIsIndzU2VydmVyIiwiZmFpbCIsInNlcnZlciIsImxpc3RlbiIsInNodXRkb3duIiwiY2xvc2UiLCJzdGRpbiIsInJlc3VtZSJdLCJtYXBwaW5ncyI6IkFBQUE7OztDQUdDLEdBQ0QsT0FBT0EsV0FBVyxRQUFRO0FBQzFCLE9BQU9DLFdBQVcsUUFBUTtBQUMxQixPQUFPQyxhQUFhLFVBQVU7QUFDOUIsU0FBUUMsWUFBWSxFQUFFQyxVQUFVLEVBQUVDLFNBQVMsRUFBRUMsYUFBYSxRQUFPLEtBQUs7QUFDdEUsU0FBUUMsT0FBTyxRQUFPLEtBQUs7QUFDM0IsU0FBUUMsV0FBV0MsV0FBVyxFQUFFQyxJQUFJLFFBQU8sT0FBTztBQUNsRCxTQUFRQyxlQUFlLFFBQU8sS0FBSztBQUVuQyxTQUFRQyxTQUFTLEVBQUVDLGFBQWEsUUFBTyxxQkFBcUI7QUFDNUQsU0FBUUMsYUFBYSxFQUFFQyxXQUFXLFFBQU8scUJBQXFCO0FBQzlELFNBQVFDLEdBQUcsUUFBTyxxQkFBcUI7QUFtRHZDLE1BQU1DLGNBQWM7SUFDbEIsTUFBTUMsV0FBV1IsS0FBS0gsV0FBVztJQUNqQyxJQUFHLENBQUNILFdBQVdjLFdBQVc7UUFDeEJiLFVBQVVhLFVBQVU7WUFBQ0MsV0FBVztRQUFJO0lBQ3RDO0lBQ0EsT0FBT0Q7QUFDVDtBQUVBLE1BQU1FLGVBQWUsSUFBY1YsS0FBS08sZUFBZTtBQUV2RCxNQUFNSSxvQkFBb0I7SUFDeEIsTUFBTUMsWUFBWUY7SUFDbEIsSUFBRyxDQUFDaEIsV0FBV2tCLFlBQVk7UUFDekIsT0FBTztJ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
|
|
741
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9zZXJ2ZXJsZXNzL3NlcnZlcmxlc3MudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTgtUHJlc2VudCwgTml0cm9nZW4gTGFicywgSW5jLlxuICogQ29weXJpZ2h0cyBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSB0aGUgYWNjb21wYW55aW5nIExJQ0VOU0UgZmlsZSBmb3IgdGVybXMuXG4gKi9cbmltcG9ydCBib3hlbiBmcm9tICdib3hlbic7XG5pbXBvcnQgY2hhbGsgZnJvbSAnY2hhbGsnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQge3JlYWRGaWxlU3luYywgZXhpc3RzU3luYywgbWtkaXJTeW5jLCB3cml0ZUZpbGVTeW5jfSBmcm9tICdmcyc7XG5pbXBvcnQge2hvbWVkaXJ9IGZyb20gJ29zJztcbmltcG9ydCB7cmVzb2x2ZSBhcyBwYXRoUmVzb2x2ZSwgam9pbiwgaXNBYnNvbHV0ZX0gZnJvbSAncGF0aCc7XG5pbXBvcnQge1dlYlNvY2tldFNlcnZlcn0gZnJvbSAnd3MnO1xuXG5pbXBvcnQge0xleENvbmZpZywgZ2V0UGFja2FnZURpcn0gZnJvbSAnLi4vLi4vTGV4Q29uZmlnLmpzJztcbmltcG9ydCB7Y3JlYXRlU3Bpbm5lciwgcmVtb3ZlRmlsZXN9IGZyb20gJy4uLy4uL3V0aWxzL2FwcC5qcyc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vLi4vdXRpbHMvbG9nLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBTZXJ2ZXJsZXNzT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNsaU5hbWU/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IGNvbmZpZz86IHN0cmluZztcbiAgcmVhZG9ubHkgZGVidWc/OiBib29sZWFuO1xuICByZWFkb25seSBob3N0Pzogc3RyaW5nO1xuICByZWFkb25seSBodHRwUG9ydD86IG51bWJlcjtcbiAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHJlbW92ZT86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHRlc3Q/OiBib29sZWFuO1xuICByZWFkb25seSB1c2VQdWJsaWNJcD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IHZhcmlhYmxlcz86IHN0cmluZztcbiAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xufVxuXG5leHBvcnQgdHlwZSBTZXJ2ZXJsZXNzQ2FsbGJhY2sgPSAoc3RhdHVzOiBudW1iZXIpPT4gdm9pZDtcblxuaW50ZXJmYWNlIFB1YmxpY0lwQ2FjaGUge1xuICBpcDogc3RyaW5nO1xuICB0aW1lc3RhbXA6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFNlcnZlcmxlc3NIYW5kbGVyIHtcbiAgcmVhZG9ubHkgaGFuZGxlcjogc3RyaW5nO1xuICByZWFkb25seSBldmVudHM/OiBBcnJheTx7XG4gICAgcmVhZG9ubHkgaHR0cD86IHtcbiAgICAgIHJlYWRvbmx5IGNvcnM/OiBib29sZWFuO1xuICAgICAgcmVhZG9ubHkgbWV0aG9kPzogc3RyaW5nO1xuICAgICAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcbiAgICB9O1xuICAgIHJlYWRvbmx5IHdlYnNvY2tldD86IHtcbiAgICAgIHJlYWRvbmx5IHJvdXRlPzogc3RyaW5nO1xuICAgIH07XG4gIH0+O1xufVxuXG5pbnRlcmZhY2UgU2VydmVybGVzc0NvbmZpZyB7XG4gIHJlYWRvbmx5IGN1c3RvbT86IHtcbiAgICByZWFkb25seSAnc2VydmVybGVzcy1vZmZsaW5lJz86IHtcbiAgICAgIHJlYWRvbmx5IGNvcnM/OiBib29sZWFuO1xuICAgICAgcmVhZG9ubHkgaG9zdD86IHN0cmluZztcbiAgICAgIHJlYWRvbmx5IGh0dHBQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgaHR0cHNQb3J0PzogbnVtYmVyO1xuICAgICAgcmVhZG9ubHkgd3NQb3J0PzogbnVtYmVyO1xuICAgIH07XG4gIH07XG4gIHJlYWRvbmx5IGZ1bmN0aW9ucz86IFJlY29yZDxzdHJpbmcsIFNlcnZlcmxlc3NIYW5kbGVyPjtcbn1cblxuY29uc3QgZ2V0Q2FjaGVEaXIgPSAoKTogc3RyaW5nID0+IHtcbiAgY29uc3QgY2FjaGVEaXIgPSBqb2luKGhvbWVkaXIoKSwgJy5sZXgtY2FjaGUnKTtcbiAgaWYoIWV4aXN0c1N5bmMoY2FjaGVEaXIpKSB7XG4gICAgbWtkaXJTeW5jKGNhY2hlRGlyLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gIH1cbiAgcmV0dXJuIGNhY2hlRGlyO1xufTtcblxuY29uc3QgZ2V0Q2FjaGVQYXRoID0gKCk6IHN0cmluZyA9PiBqb2luKGdldENhY2hlRGlyKCksICdwdWJsaWMtaXAuanNvbicpO1xuXG5jb25zdCByZWFkUHVibGljSXBDYWNoZSA9ICgpOiBQdWJsaWNJcENhY2hlIHwgbnVsbCA9PiB7XG4gIGNvbnN0IGNhY2hlUGF0aCA9IGdldENhY2hlUGF0aCgpO1xuICBpZighZXhpc3RzU3luYyhjYWNoZVBhdGgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGNhY2hlRGF0YSA9IHJlYWRGaWxlU3luYyhjYWNoZVBhdGgsICd1dGY4Jyk7XG4gICAgY29uc3QgY2FjaGU6IFB1YmxpY0lwQ2FjaGUgPSBKU09OLnBhcnNlKGNhY2hlRGF0YSk7XG5cbiAgICAvLyBDaGVjayBpZiBjYWNoZSBpcyBvbGRlciB0aGFuIDEgd2Vla1xuICAgIGNvbnN0IG9uZVdlZWtNcyA9IDcgKiAyNCAqIDYwICogNjAgKiAxMDAwO1xuICAgIGlmKERhdGUubm93KCkgLSBjYWNoZS50aW1lc3RhbXAgPiBvbmVXZWVrTXMpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBjYWNoZTtcbiAgfSBjYXRjaHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufTtcblxuY29uc3Qgd3JpdGVQdWJsaWNJcENhY2hlID0gKGlwOiBzdHJpbmcpOiB2b2lkID0+IHtcbiAgY29uc3QgY2FjaGVQYXRoID0gZ2V0Q2FjaGVQYXRoKCk7XG4gIGNvbnN0IGNhY2hlOiBQdWJsaWNJcENhY2hlID0ge1xuICAgIGlwLFxuICAgIHRpbWVzdGFtcDogRGF0ZS5ub3coKVxuICB9O1xuICB3cml0ZUZpbGVTeW5jKGNhY2hlUGF0aCwgSlNPTi5zdHJpbmdpZnkoY2FjaGUsIG51bGwsIDIpKTtcbn07XG5cbmNvbnN0IGZldGNoUHVibGljSXAgPSAoZm9yY2VSZWZyZXNoOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4gPT4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgaWYoIWZvcmNlUmVmcmVzaCkge1xuICAgIGNvbnN0IGNhY2hlZCA9IHJlYWRQdWJsaWNJcENhY2hlKCk7XG4gICAgaWYoY2FjaGVkKSB7XG4gICAgICByZXNvbHZlKGNhY2hlZC5pcCk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgLy8gVXNlIGZldGNoIGluc3RlYWQgb2YgaHR0cHNcbiAgZmV0Y2goJ2h0dHBzOi8vYXBpLmlwaWZ5Lm9yZycpXG4gICAgLnRoZW4oKHJlcykgPT4gcmVzLnRleHQoKSlcbiAgICAudGhlbigoZGF0YSkgPT4ge1xuICAgICAgY29uc3QgaXAgPSBkYXRhLnRyaW0oKTtcbiAgICAgIGlmKGlwKSB7XG4gICAgICAgIHdyaXRlUHVibGljSXBDYWNoZShpcCk7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGlwKTtcbiAgICB9KVxuICAgIC5jYXRjaCgoKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpO1xufSk7XG5cbmNvbnN0IGRpc3BsYXlTZXJ2ZXJTdGF0dXMgPSAoXG4gIGh0dHBQb3J0OiBudW1iZXIsXG4gIGh0dHBzUG9ydDogbnVtYmVyLFxuICB3c1BvcnQ6IG51bWJlcixcbiAgaG9zdDogc3RyaW5nLFxuICBxdWlldDogYm9vbGVhbixcbiAgcHVibGljSXA/OiBzdHJpbmdcbikgPT4ge1xuICBpZihxdWlldCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGh0dHBVcmwgPSBgaHR0cDovLyR7aG9zdH06JHtodHRwUG9ydH1gO1xuICBjb25zdCBodHRwc1VybCA9IGBodHRwczovLyR7aG9zdH06JHtodHRwc1BvcnR9YDtcbiAgY29uc3Qgd3NVcmwgPSBgd3M6Ly8ke2hvc3R9OiR7d3NQb3J0fWA7XG4gIGNvbnN0IHdzc1VybCA9IGB3c3M6Ly8ke2hvc3R9OiR7d3NQb3J0fWA7XG5cbiAgbGV0IHVybExpbmVzID0gYCR7Y2hhbGsuZ3JlZW4oJ0hUVFA6Jyl9ICAgICAgJHtjaGFsay51bmRlcmxpbmUoaHR0cFVybCl9XFxuYDtcbiAgdXJsTGluZXMgKz0gYCR7Y2hhbGsuZ3JlZW4oJ0hUVFBTOicpfSAgICAgJHtjaGFsay51bmRlcmxpbmUoaHR0cHNVcmwpfVxcbmA7XG4gIHVybExpbmVzICs9IGAke2NoYWxrLmdyZWVuKCdXZWJTb2NrZXQ6Jyl9ICR7Y2hhbGsudW5kZXJsaW5lKHdzVXJsKX1cXG5gO1xuICB1cmxMaW5lcyArPSBgJHtjaGFsay5ncmVlbignV1NTOicpfSAgICAgICAke2NoYWxrLnVuZGVybGluZSh3c3NVcmwpfVxcbmA7XG5cbiAgaWYocHVibGljSXApIHtcbiAgICB1cmxMaW5lcyArPSBgXFxuJHtjaGFsay5ncmVlbignUHVibGljOicpfSAgICAke2NoYWxrLnVuZGVybGluZShgaHR0cDovLyR7cHVibGljSXB9OiR7aHR0cFBvcnR9YCl9XFxuYDtcbiAgfVxuXG4gIGNvbnN0IHN0YXR1c0JveCA9IGJveGVuKFxuICAgIGAke2NoYWxrLmN5YW4uYm9sZCgn8J+agCBTZXJ2ZXJsZXNzIERldmVsb3BtZW50IFNlcnZlciBSdW5uaW5nJyl9XFxuXFxuJHt1cmxMaW5lc31cXG5gICtcbiAgICBgJHtjaGFsay55ZWxsb3coJ1ByZXNzIEN0cmwrQyB0byBzdG9wIHRoZSBzZXJ2ZXInKX1gLFxuICAgIHtcbiAgICAgIGJhY2tncm91bmRDb2xvcjogJyMxYTFhMWEnLFxuICAgICAgYm9yZGVyQ29sb3I6ICdjeWFuJyxcbiAgICAgIGJvcmRlclN0eWxlOiAncm91bmQnLFxuICAgICAgbWFyZ2luOiAxLFxuICAgICAgcGFkZGluZzogMVxuICAgIH1cbiAgKTtcblxuICBjb25zb2xlLmxvZyhgXFxuJHtzdGF0dXNCb3h9XFxuYCk7XG59O1xuXG5jb25zdCBsb2FkSGFuZGxlciA9IGFzeW5jIChoYW5kbGVyUGF0aDogc3RyaW5nLCBvdXRwdXREaXI6IHN0cmluZykgPT4ge1xuICB0cnkge1xuICAgIC8vIEhhbmRsZSBib3RoIHJlbGF0aXZlIHBhdGhzIGFuZCBhYnNvbHV0ZSBwYXRoc1xuICAgIC8vIElmIGhhbmRsZXJQYXRoIGluY2x1ZGVzIGEgZmlsZSBleHRlbnNpb24sIHVzZSBpdCBhcy1pc1xuICAgIC8vIE90aGVyd2lzZSwgdHJ5IC5qcywgLm1qcywgLmNqcyBleHRlbnNpb25zXG4gICAgbGV0IGZ1bGxQYXRoOiBzdHJpbmc7XG5cbiAgICBpZihpc0Fic29sdXRlKGhhbmRsZXJQYXRoKSkge1xuICAgICAgZnVsbFBhdGggPSBoYW5kbGVyUGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgZnVsbFBhdGggPSBwYXRoUmVzb2x2ZShvdXRwdXREaXIsIGhhbmRsZXJQYXRoKTtcbiAgICB9XG5cbiAgICAvLyBUcnkgZGlmZmVyZW50IGV4dGVuc2lvbnMgaWYgZmlsZSBkb2Vzbid0IGV4aXN0XG4gICAgaWYoIWV4aXN0c1N5bmMoZnVsbFBhdGgpKSB7XG4gICAgICBjb25zdCBleHRlbnNpb25zID0gWycuanMnLCAnLm1qcycsICcuY2pzJywgJy50cyddO1xuICAgICAgY29uc3QgcGF0aFdpdGhvdXRFeHQgPSBmdWxsUGF0aC5yZXBsYWNlKC9cXC4oanN8bWpzfGNqc3x0cykkLywgJycpO1xuICAgICAgZm9yKGNvbnN0IGV4dCBvZiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZVBhdGggPSBwYXRoV2l0aG91dEV4dCArIGV4dDtcbiAgICAgICAgaWYoZXhpc3RzU3luYyhjYW5kaWRhdGVQYXRoKSkge1xuICAgICAgICAgIGZ1bGxQYXRoID0gY2FuZGlkYXRlUGF0aDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKGBbU2VydmVybGVzc10gTG9hZGluZyBoYW5kbGVyIGZyb206ICR7ZnVsbFBhdGh9YCk7XG4gICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBGaWxlIGV4aXN0czogJHtleGlzdHNTeW5jKGZ1bGxQYXRoKX1gKTtcblxuICAgIGlmKCFleGlzdHNTeW5jKGZ1bGxQYXRoKSkge1xuICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEhhbmRsZXIgZmlsZSBub3QgZm91bmQ6ICR7ZnVsbFBhdGh9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gT3V0cHV0IGRpcmVjdG9yeTogJHtvdXRwdXREaXJ9YCk7XG4gICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gSGFuZGxlciBwYXRoIGZyb20gY29uZmlnOiAke2hhbmRsZXJQYXRofWApO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBIYW5kbGVyIGZpbGUgbm90IGZvdW5kOiAke2Z1bGxQYXRofWApO1xuICAgIH1cblxuICAgIC8vIER5bmFtaWMgaW1wb3J0IG9mIHRoZSBoYW5kbGVyIHdpdGggYmV0dGVyIGVycm9yIGhhbmRsaW5nXG4gICAgdHJ5IHtcbiAgICAgIC8vIEFkZCAuanMgZXh0ZW5zaW9uIGlmIGltcG9ydGluZyBUeXBlU2NyaXB0IGNvbXBpbGVkIG91dHB1dFxuICAgICAgY29uc3QgaW1wb3J0UGF0aCA9IGZ1bGxQYXRoLmVuZHNXaXRoKCcudHMnKSA/IGZ1bGxQYXRoLnJlcGxhY2UoL1xcLnRzJC8sICcuanMnKSA6IGZ1bGxQYXRoO1xuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBJbXBvcnRpbmcgaGFuZGxlciBmcm9tOiAke2ltcG9ydFBhdGh9YCk7XG5cbiAgICAgIGNvbnN0IGhhbmRsZXJNb2R1bGUgPSBhd2FpdCBpbXBvcnQoaW1wb3J0UGF0aCk7XG4gICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEhhbmRsZXIgbW9kdWxlIGxvYWRlZC4gRXhwb3J0czogJHtPYmplY3Qua2V5cyhoYW5kbGVyTW9kdWxlKS5qb2luKCcsICcpfWApO1xuXG4gICAgICBjb25zdCBoYW5kbGVyID0gaGFuZGxlck1vZHVsZS5kZWZhdWx0IHx8IGhhbmRsZXJNb2R1bGUuaGFuZGxlciB8fCBoYW5kbGVyTW9kdWxlO1xuICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBIYW5kbGVyIGZvdW5kOiAke3R5cGVvZiBoYW5kbGVyfSwgaXNGdW5jdGlvbjogJHt0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJ31gKTtcblxuICAgICAgaWYodHlwZW9mIGhhbmRsZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEhhbmRsZXIgaXMgbm90IGEgZnVuY3Rpb24uIFR5cGU6ICR7dHlwZW9mIGhhbmRsZXJ9LCBWYWx1ZTpgLCBoYW5kbGVyKTtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBoYW5kbGVyO1xuICAgIH0gY2F0Y2goaW1wb3J0RXJyb3I6IGFueSkge1xuICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEltcG9ydCBlcnJvciBmb3IgaGFuZGxlciAke2hhbmRsZXJQYXRofTpgLCBpbXBvcnRFcnJvci5tZXNzYWdlKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTZXJ2ZXJsZXNzXSBJbXBvcnQgZXJyb3Igc3RhY2s6JywgaW1wb3J0RXJyb3Iuc3RhY2spO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9IGNhdGNoKGVycm9yOiBhbnkpIHtcbiAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gRXJyb3IgbG9hZGluZyBoYW5kbGVyICR7aGFuZGxlclBhdGh9OmAsIGVycm9yLm1lc3NhZ2UpO1xuICAgIGNvbnNvbGUuZXJyb3IoJ1tTZXJ2ZXJsZXNzXSBFcnJvciBzdGFjazonLCBlcnJvci5zdGFjayk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn07XG5cbmNvbnN0IGNhcHR1cmVDb25zb2xlTG9ncyA9IChoYW5kbGVyOiAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KT0+IFByb21pc2U8YW55PiwgcXVpZXQ6IGJvb2xlYW4pID0+IHtcbiAgaWYocXVpZXQpIHtcbiAgICByZXR1cm4gaGFuZGxlcjtcbiAgfVxuXG4gIHJldHVybiBhc3luYyAoZXZlbnQ6IGFueSwgY29udGV4dDogYW55KSA9PiB7XG4gICAgLy8gQ2FwdHVyZSBjb25zb2xlLmxvZywgY29uc29sZS5lcnJvciwgZXRjLlxuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUxvZyA9IGNvbnNvbGUubG9nO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUVycm9yID0gY29uc29sZS5lcnJvcjtcbiAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVXYXJuID0gY29uc29sZS53YXJuO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uc29sZUluZm8gPSBjb25zb2xlLmluZm87XG5cbiAgICBjb25zdCBsb2dzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc29sZS5sb2cgPSAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgIGxvZ3MucHVzaChgW0xPR10gJHthcmdzLmpvaW4oJyAnKX1gKTtcbiAgICAgIG9yaWdpbmFsQ29uc29sZUxvZyguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS5lcnJvciA9ICguLi5hcmdzOiBhbnlbXSkgPT4ge1xuICAgICAgbG9ncy5wdXNoKGBbRVJST1JdICR7YXJncy5qb2luKCcgJyl9YCk7XG4gICAgICBvcmlnaW5hbENvbnNvbGVFcnJvciguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS53YXJuID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtXQVJOXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlV2FybiguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgY29uc29sZS5pbmZvID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgICBsb2dzLnB1c2goYFtJTkZPXSAke2FyZ3Muam9pbignICcpfWApO1xuICAgICAgb3JpZ2luYWxDb25zb2xlSW5mbyguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICAvLyBPdXRwdXQgY2FwdHVyZWQgbG9nc1xuICAgICAgaWYobG9ncy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGNoYWxrLmdyYXkoJy0tLSBIYW5kbGVyIENvbnNvbGUgT3V0cHV0IC0tLScpKTtcbiAgICAgICAgbG9ncy5mb3JFYWNoKChsb2cpID0+IGNvbnNvbGUubG9nKGNoYWxrLmdyYXkobG9nKSkpO1xuICAgICAgICBjb25zb2xlLmxvZyhjaGFsay5ncmF5KCctLS0gRW5kIEhhbmRsZXIgQ29uc29sZSBPdXRwdXQgLS0tJykpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZmluYWxseSB7XG4gICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIGNvbnNvbGUgbWV0aG9kc1xuICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG4gICAgICBjb25zb2xlLmVycm9yID0gb3JpZ2luYWxDb25zb2xlRXJyb3I7XG4gICAgICBjb25zb2xlLndhcm4gPSBvcmlnaW5hbENvbnNvbGVXYXJuO1xuICAgICAgY29uc29sZS5pbmZvID0gb3JpZ2luYWxDb25zb2xlSW5mbztcbiAgICB9XG4gIH07XG59O1xuXG5jb25zdCBjcmVhdGVFeHByZXNzU2VydmVyID0gYXN5bmMgKFxuICBjb25maWc6IFNlcnZlcmxlc3NDb25maWcsXG4gIG91dHB1dERpcjogc3RyaW5nLFxuICBodHRwUG9ydDogbnVtYmVyLFxuICBob3N0OiBzdHJpbmcsXG4gIHF1aWV0OiBib29sZWFuLFxuICBkZWJ1ZzogYm9vbGVhblxuKSA9PiB7XG4gIGNvbnN0IGFwcCA9IGV4cHJlc3MoKTtcblxuICAvLyBFbmFibGUgQ09SU1xuICBhcHAudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbicsICcqJyk7XG4gICAgcmVzLmhlYWRlcignQWNjZXNzLUNvbnRyb2wtQWxsb3ctTWV0aG9kcycsICdHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBQQVRDSCwgT1BUSU9OUycpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnLCAnKicpO1xuICAgIHJlcy5oZWFkZXIoJ0FjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzJywgJ3RydWUnKTtcblxuICAgIGlmKHJlcS5tZXRob2QgPT09ICdPUFRJT05TJykge1xuICAgICAgcmVzLnNlbmRTdGF0dXMoMjAwKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUGFyc2UgSlNPTiBib2RpZXNcbiAgYXBwLnVzZShleHByZXNzLmpzb24oKSk7XG5cbiAgLy8gTG9hZCBHcmFwaFFMIGhhbmRsZXJcbiAgY29uc3QgbG9hZEdyYXBoUUxTY2hlbWEgPSBhc3luYyAoKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFRyeSB0byBmaW5kIGEgR3JhcGhRTCBoYW5kbGVyXG4gICAgICBsZXQgZ3JhcGhxbEhhbmRsZXIgPSBudWxsO1xuXG4gICAgICBpZihjb25maWcuZnVuY3Rpb25zKSB7XG4gICAgICAgIGZvcihjb25zdCBbZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmZ1bmN0aW9ucykpIHtcbiAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgIGZvcihjb25zdCBldmVudCBvZiBmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgaWYoZXZlbnQuaHR0cCAmJiBldmVudC5odHRwLnBhdGgpIHtcbiAgICAgICAgICAgICAgICAvLyBMb29rIGZvciBHcmFwaFFMIGVuZHBvaW50c1xuICAgICAgICAgICAgICAgIGlmKGV2ZW50Lmh0dHAucGF0aCA9PT0gJy9wdWJsaWMnIHx8IGV2ZW50Lmh0dHAucGF0aCA9PT0gJy9ncmFwaHFsJykge1xuICAgICAgICAgICAgICAgICAgZ3JhcGhxbEhhbmRsZXIgPSBhd2FpdCBsb2FkSGFuZGxlcihmdW5jdGlvbkNvbmZpZy5oYW5kbGVyLCBvdXRwdXREaXIpO1xuICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGdyYXBocWxIYW5kbGVyKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYoZ3JhcGhxbEhhbmRsZXIpIHtcbiAgICAgICAgbG9nKCdGb3VuZCBHcmFwaFFMIGhhbmRsZXInLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgICAgcmV0dXJuIGdyYXBocWxIYW5kbGVyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfSBjYXRjaChlcnJvcikge1xuICAgICAgbG9nKGBFcnJvciBsb2FkaW5nIEdyYXBoUUwgaGFuZGxlcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfTtcblxuICAvLyBTZXQgdXAgR3JhcGhRTCBoYW5kbGVyIGZvciBHcmFwaFFMIHJlcXVlc3RzXG4gIHRyeSB7XG4gICAgY29uc3QgZ3JhcGhxbEhhbmRsZXIgPSBhd2FpdCBsb2FkR3JhcGhRTFNjaGVtYSgpO1xuICAgIGlmKGdyYXBocWxIYW5kbGVyKSB7XG4gICAgICAvLyBGaW5kIHRoZSBHcmFwaFFMIHBhdGggZnJvbSB0aGUgc2VydmVybGVzcyBjb25maWdcbiAgICAgIGxldCBncmFwaHFsUGF0aCA9ICcvZ3JhcGhxbCc7IC8vIGRlZmF1bHQgZmFsbGJhY2tcblxuICAgICAgaWYoY29uZmlnLmZ1bmN0aW9ucykge1xuICAgICAgICBmb3IoY29uc3QgW19mdW5jdGlvbk5hbWUsIGZ1bmN0aW9uQ29uZmlnXSBvZiBPYmplY3QuZW50cmllcyhjb25maWcuZnVuY3Rpb25zKSkge1xuICAgICAgICAgIGlmKGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgZm9yKGNvbnN0IGV2ZW50IG9mIGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICBpZihldmVudD8uaHR0cD8ucGF0aCkge1xuICAgICAgICAgICAgICAgIGdyYXBocWxQYXRoID0gZXZlbnQuaHR0cC5wYXRoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmKGdyYXBocWxQYXRoICE9PSAnL2dyYXBocWwnKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHVwIEdyYXBoUUwgZW5kcG9pbnQgd2l0aCBlbmhhbmNlZCBjb25zb2xlLmxvZyBjYXB0dXJlXG4gICAgICBhcHAudXNlKGdyYXBocWxQYXRoLCBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgLy8gR3JhcGhRTCBEZWJ1ZyBMb2dnaW5nXG4gICAgICAgIGlmKGRlYnVnICYmIHJlcS5ib2R5ICYmIHJlcS5ib2R5LnF1ZXJ5KSB7XG4gICAgICAgICAgbG9nKCfwn5SNIEdyYXBoUUwgRGVidWcgTW9kZTogQW5hbHl6aW5nIHJlcXVlc3QuLi4nLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgICAgICBsb2coYPCfk50gR3JhcGhRTCBRdWVyeTogJHtyZXEuYm9keS5xdWVyeX1gLCAnaW5mbycsIGZhbHNlKTtcbiAgICAgICAgICBpZihyZXEuYm9keS52YXJpYWJsZXMpIHtcbiAgICAgICAgICAgIGxvZyhg8J+TiiBHcmFwaFFMIFZhcmlhYmxlczogJHtKU09OLnN0cmluZ2lmeShyZXEuYm9keS52YXJpYWJsZXMsIG51bGwsIDIpfWAsICdpbmZvJywgZmFsc2UpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihyZXEuYm9keS5vcGVyYXRpb25OYW1lKSB7XG4gICAgICAgICAgICBsb2coYPCfj7fvuI8gIEdyYXBoUUwgT3BlcmF0aW9uOiAke3JlcS5ib2R5Lm9wZXJhdGlvbk5hbWV9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5oYW5jZWQgY29uc29sZS5sb2cgY2FwdHVyZVxuICAgICAgICBjb25zdCBvcmlnaW5hbENvbnNvbGVMb2cgPSBjb25zb2xlLmxvZztcbiAgICAgICAgY29uc3QgbG9nczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICBjb25zb2xlLmxvZyA9ICguLi5hcmdzKSA9PiB7XG4gICAgICAgICAgY29uc3QgbG9nTWVzc2FnZSA9IGFyZ3MubWFwKChhcmcpID0+XG4gICAgICAgICAgICAodHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgPyBKU09OLnN0cmluZ2lmeShhcmcsIG51bGwsIDIpIDogU3RyaW5nKGFyZykpXG4gICAgICAgICAgKS5qb2luKCcgJyk7XG4gICAgICAgICAgbG9ncy5wdXNoKGxvZ01lc3NhZ2UpO1xuICAgICAgICAgIG9yaWdpbmFsQ29uc29sZUxvZyhgW0dyYXBoUUxdICR7bG9nTWVzc2FnZX1gKTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBDcmVhdGUgY29udGV4dCBmb3IgdGhlIGhhbmRsZXJcbiAgICAgICAgY29uc3QgY29udGV4dCA9IHtcbiAgICAgICAgICBhd3NSZXF1ZXN0SWQ6ICd0ZXN0LXJlcXVlc3QtaWQnLFxuICAgICAgICAgIGZ1bmN0aW9uTmFtZTogJ2dyYXBocWwnLFxuICAgICAgICAgIGZ1bmN0aW9uVmVyc2lvbjogJyRMQVRFU1QnLFxuICAgICAgICAgIGdldFJlbWFpbmluZ1RpbWVJbk1pbGxpczogKCkgPT4gMzAwMDAsXG4gICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiAnYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjpncmFwaHFsJyxcbiAgICAgICAgICBsb2dHcm91cE5hbWU6ICcvYXdzL2xhbWJkYS9ncmFwaHFsJyxcbiAgICAgICAgICBsb2dTdHJlYW1OYW1lOiAndGVzdC1sb2ctc3RyZWFtJyxcbiAgICAgICAgICByZXEsXG4gICAgICAgICAgcmVzXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gV3JhcCBoYW5kbGVyIHdpdGggY29uc29sZSBsb2cgY2FwdHVyZVxuICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhncmFwaHFsSGFuZGxlciwgcXVpZXQpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gQ2FsbCB0aGUgaGFuZGxlciB3aXRoIEdyYXBoUUwgcGFyYW1ldGVyc1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHdyYXBwZWRIYW5kbGVyKHtcbiAgICAgICAgICAgIGJvZHk6IEpTT04uc3RyaW5naWZ5KHJlcS5ib2R5KSxcbiAgICAgICAgICAgIGhlYWRlcnM6IHJlcS5oZWFkZXJzLFxuICAgICAgICAgICAgaHR0cE1ldGhvZDogJ1BPU1QnLFxuICAgICAgICAgICAgcGF0aDogZ3JhcGhxbFBhdGgsXG4gICAgICAgICAgICBxdWVyeVN0cmluZ1BhcmFtZXRlcnM6IHt9XG4gICAgICAgICAgfSwgY29udGV4dCk7XG5cbiAgICAgICAgICAvLyBSZXN0b3JlIGNvbnNvbGUubG9nXG4gICAgICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG5cbiAgICAgICAgICAvLyBIYW5kbGUgdGhlIHJlc3VsdFxuICAgICAgICAgIGlmKHJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0ID09PSAnb2JqZWN0JyAmJiByZXN1bHQuc3RhdHVzQ29kZSkge1xuICAgICAgICAgICAgcmVzLnN0YXR1cyhyZXN1bHQuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICBpZihyZXN1bHQuaGVhZGVycykge1xuICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhyZXN1bHQuaGVhZGVycykuZm9yRWFjaCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5zZW5kKHJlc3VsdC5ib2R5KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzLmpzb24ocmVzdWx0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAvLyBSZXN0b3JlIGNvbnNvbGUubG9nXG4gICAgICAgICAgY29uc29sZS5sb2cgPSBvcmlnaW5hbENvbnNvbGVMb2c7XG4gICAgICAgICAgbG9nKGBHcmFwaFFMIGhhbmRsZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBmYWxzZSk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBsb2coYEdyYXBoUUwgZW5kcG9pbnQgYXZhaWxhYmxlIGF0IGh0dHA6Ly8ke2hvc3R9OiR7aHR0cFBvcnR9JHtncmFwaHFsUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYEVycm9yIHNldHRpbmcgdXAgR3JhcGhRTDogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgfVxuXG4gIC8vIEZhbGxiYWNrIGZvciBub24tR3JhcGhRTCByb3V0ZXMgLSBoYW5kbGUgYWxsIHJlbWFpbmluZyByb3V0ZXNcbiAgYXBwLnVzZSgnLycsIGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSByZXEudXJsIHx8ICcvJztcbiAgICAgIGNvbnN0IG1ldGhvZCA9IHJlcS5tZXRob2QgfHwgJ0dFVCc7XG4gICAgICBjb25zdCBwYXRobmFtZSA9IHJlcS5wYXRoIHx8IHVybC5zcGxpdCgnPycpWzBdOyAvLyBFeHRyYWN0IHBhdGhuYW1lIHdpdGhvdXQgcXVlcnkgc3RyaW5nXG5cbiAgICAgIC8vIEFsd2F5cyBsb2cgcmVxdWVzdHMgKG5vdCBhZmZlY3RlZCBieSBxdWlldCBmbGFnIGZvciBkZWJ1Z2dpbmcpXG4gICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdICR7bWV0aG9kfSAke3VybH0gKHBhdGhuYW1lOiAke3BhdGhuYW1lfSlgKTtcblxuICAgICAgLy8gRmluZCBtYXRjaGluZyBmdW5jdGlvblxuICAgICAgbGV0IG1hdGNoZWRGdW5jdGlvbiA9IG51bGw7XG5cbiAgICAgIGlmKGNvbmZpZy5mdW5jdGlvbnMpIHtcbiAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lcyA9IE9iamVjdC5rZXlzKGNvbmZpZy5mdW5jdGlvbnMpO1xuICAgICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEF2YWlsYWJsZSBmdW5jdGlvbnM6ICR7ZnVuY3Rpb25OYW1lcy5qb2luKCcsICcpfWApO1xuICAgICAgICBjb25zb2xlLmxvZygnW1NlcnZlcmxlc3NdIENvbmZpZyBmdW5jdGlvbnM6JywgSlNPTi5zdHJpbmdpZnkoY29uZmlnLmZ1bmN0aW9ucywgbnVsbCwgMikpO1xuXG4gICAgICAgIGZvcihjb25zdCBbZnVuY3Rpb25OYW1lLCBmdW5jdGlvbkNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXMoY29uZmlnLmZ1bmN0aW9ucykpIHtcbiAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgIGZvcihjb25zdCBldmVudCBvZiBmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgaWYoZXZlbnQuaHR0cCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50UGF0aCA9IGV2ZW50Lmh0dHAucGF0aCB8fCAnLyc7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnRNZXRob2QgPSAoZXZlbnQuaHR0cC5tZXRob2QgfHwgJ0dFVCcpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1ldGhvZCA9IG1ldGhvZC50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBDaGVja2luZyBmdW5jdGlvbiAke2Z1bmN0aW9uTmFtZX06IHBhdGg9XCIke2V2ZW50UGF0aH1cIiwgbWV0aG9kPVwiJHtldmVudE1ldGhvZH1cIiBhZ2FpbnN0IHBhdGhuYW1lPVwiJHtwYXRobmFtZX1cIiwgbWV0aG9kPVwiJHtyZXF1ZXN0TWV0aG9kfVwiYCk7XG5cbiAgICAgICAgICAgICAgICAvLyBJbXByb3ZlZCBwYXRoIG1hdGNoaW5nIC0gY29tcGFyZSBwYXRobmFtZSB3aXRob3V0IHF1ZXJ5IHN0cmluZ1xuICAgICAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSBwYXRocyAocmVtb3ZlIHRyYWlsaW5nIHNsYXNoZXMgZm9yIGNvbXBhcmlzb24pXG4gICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEV2ZW50UGF0aCA9IGV2ZW50UGF0aC5yZXBsYWNlKC9cXC8kLywgJycpIHx8ICcvJztcbiAgICAgICAgICAgICAgICBjb25zdCBub3JtYWxpemVkUGF0aG5hbWUgPSBwYXRobmFtZS5yZXBsYWNlKC9cXC8kLywgJycpIHx8ICcvJztcblxuICAgICAgICAgICAgICAgIGlmKG5vcm1hbGl6ZWRFdmVudFBhdGggPT09IG5vcm1hbGl6ZWRQYXRobmFtZSAmJiBldmVudE1ldGhvZCA9PT0gcmVxdWVzdE1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgbWF0Y2hlZEZ1bmN0aW9uID0gZnVuY3Rpb25OYW1lO1xuICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSDinJMgTWF0Y2hlZCBmdW5jdGlvbjogJHttYXRjaGVkRnVuY3Rpb259YCk7XG4gICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdbU2VydmVybGVzc10gTm8gZnVuY3Rpb25zIGZvdW5kIGluIGNvbmZpZycpO1xuICAgICAgfVxuXG4gICAgICBpZihtYXRjaGVkRnVuY3Rpb24gJiYgY29uZmlnLmZ1bmN0aW9uc1ttYXRjaGVkRnVuY3Rpb25dKSB7XG4gICAgICAgIC8vIFJlc29sdmUgaGFuZGxlciBwYXRoIHJlbGF0aXZlIHRvIG91dHB1dCBkaXJlY3RvcnlcbiAgICAgICAgY29uc3QgaGFuZGxlclBhdGggPSBjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0uaGFuZGxlcjtcbiAgICAgICAgY29uc29sZS5sb2coYFtTZXJ2ZXJsZXNzXSBMb2FkaW5nIGhhbmRsZXI6ICR7aGFuZGxlclBhdGh9IGZyb20gb3V0cHV0RGlyOiAke291dHB1dERpcn1gKTtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IGxvYWRIYW5kbGVyKGhhbmRsZXJQYXRoLCBvdXRwdXREaXIpO1xuXG4gICAgICAgIGlmKGhhbmRsZXIpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgW1NlcnZlcmxlc3NdIEhhbmRsZXIgbG9hZGVkIHN1Y2Nlc3NmdWxseSwgdHlwZTogJHt0eXBlb2YgaGFuZGxlcn1gKTtcbiAgICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhoYW5kbGVyLCBxdWlldCk7XG5cbiAgICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgIGJvZHk6IHJlcS5ib2R5LFxuICAgICAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMsXG4gICAgICAgICAgICBodHRwTWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICBwYXRoOiB1cmwsXG4gICAgICAgICAgICBxdWVyeVN0cmluZ1BhcmFtZXRlcnM6IHJlcS5xdWVyeVxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0ge1xuICAgICAgICAgICAgYXdzUmVxdWVzdElkOiAndGVzdC1yZXF1ZXN0LWlkJyxcbiAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogbWF0Y2hlZEZ1bmN0aW9uLFxuICAgICAgICAgICAgZnVuY3Rpb25WZXJzaW9uOiAnJExBVEVTVCcsXG4gICAgICAgICAgICBnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXM6ICgpID0+IDMwMDAwLFxuICAgICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiBgYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjoke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgbG9nR3JvdXBOYW1lOiBgL2F3cy9sYW1iZGEvJHttYXRjaGVkRnVuY3Rpb259YCxcbiAgICAgICAgICAgIGxvZ1N0cmVhbU5hbWU6ICd0ZXN0LWxvZy1zdHJlYW0nLFxuICAgICAgICAgICAgbWVtb3J5TGltaXRJbk1COiAnMTI4J1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tTZXJ2ZXJsZXNzXSBDYWxsaW5nIGhhbmRsZXIgd2l0aCBldmVudDonLCBKU09OLnN0cmluZ2lmeShldmVudCwgbnVsbCwgMikpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd3JhcHBlZEhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1tTZXJ2ZXJsZXNzXSBIYW5kbGVyIHJldHVybmVkOicsIEpTT04uc3RyaW5naWZ5KHJlc3VsdCwgbnVsbCwgMikpO1xuXG4gICAgICAgICAgICBpZihyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0LnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1cyhyZXN1bHQuc3RhdHVzQ29kZSk7XG4gICAgICAgICAgICAgIGlmKHJlc3VsdC5oZWFkZXJzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmVudHJpZXMocmVzdWx0LmhlYWRlcnMpLmZvckVhY2goKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcihrZXksIFN0cmluZyh2YWx1ZSkpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJlcy5zZW5kKHJlc3VsdC5ib2R5KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlcy5qc29uKHJlc3VsdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbU2VydmVybGVzc10gSGFuZGxlciBlcnJvcjonLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tTZXJ2ZXJsZXNzXSBIYW5kbGVyIGVycm9yIHN0YWNrOicsIGVycm9yLnN0YWNrKTtcbiAgICAgICAgICAgIGxvZyhgSGFuZGxlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICAgICAgICAgIHJlcy5zdGF0dXMoNTAwKS5qc29uKHtlcnJvcjogZXJyb3IubWVzc2FnZX0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gSGFuZGxlciBub3QgZm91bmQgZm9yIGZ1bmN0aW9uOiAke21hdGNoZWRGdW5jdGlvbn1gKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGBbU2VydmVybGVzc10gSGFuZGxlciBwYXRoOiAke2hhbmRsZXJQYXRofSwgT3V0cHV0IGRpcjogJHtvdXRwdXREaXJ9YCk7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDQpLmpzb24oe2Vycm9yOiAnSGFuZGxlciBub3QgZm91bmQnfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYFtTZXJ2ZXJsZXNzXSBGdW5jdGlvbiBub3QgZm91bmQgZm9yIHBhdGhuYW1lOiAke3BhdGhuYW1lfSwgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICAgICAgY29uc29sZS5lcnJvcihgW1NlcnZlcmxlc3NdIEF2YWlsYWJsZSBmdW5jdGlvbnM6ICR7Y29uZmlnLmZ1bmN0aW9ucyA/IE9iamVjdC5rZXlzKGNvbmZpZy5mdW5jdGlvbnMpLmpvaW4oJywgJykgOiAnbm9uZSd9YCk7XG4gICAgICAgIHJlcy5zdGF0dXMoNDA0KS5qc29uKHtlcnJvcjogJ0Z1bmN0aW9uIG5vdCBmb3VuZCd9KTtcbiAgICAgIH1cbiAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICBsb2coYFJvdXRlIGhhbmRsaW5nIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oe2Vycm9yOiBlcnJvci5tZXNzYWdlfSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gYXBwO1xufTtcblxuY29uc3QgY3JlYXRlV2ViU29ja2V0U2VydmVyID0gKFxuICBjb25maWc6IFNlcnZlcmxlc3NDb25maWcsXG4gIG91dHB1dERpcjogc3RyaW5nLFxuICB3c1BvcnQ6IG51bWJlcixcbiAgcXVpZXQ6IGJvb2xlYW4sXG4gIGRlYnVnOiBib29sZWFuXG4pID0+IHtcbiAgY29uc3Qgd3NzID0gbmV3IFdlYlNvY2tldFNlcnZlcih7cG9ydDogd3NQb3J0fSk7XG5cbiAgd3NzLm9uKCdjb25uZWN0aW9uJywgYXN5bmMgKHdzLCByZXEpID0+IHtcbiAgICBsb2coYFdlYlNvY2tldCBjb25uZWN0aW9uIGVzdGFibGlzaGVkOiAke3JlcS51cmx9YCwgJ2luZm8nLCBmYWxzZSk7XG5cbiAgICB3cy5vbignbWVzc2FnZScsIGFzeW5jIChtZXNzYWdlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShtZXNzYWdlLnRvU3RyaW5nKCkpO1xuXG4gICAgICAgIC8vIEZpbmQgbWF0Y2hpbmcgV2ViU29ja2V0IGZ1bmN0aW9uXG4gICAgICAgIGxldCBtYXRjaGVkRnVuY3Rpb24gPSBudWxsO1xuXG4gICAgICAgIGlmKGNvbmZpZy5mdW5jdGlvbnMpIHtcbiAgICAgICAgICBmb3IoY29uc3QgW2Z1bmN0aW9uTmFtZSwgZnVuY3Rpb25Db25maWddIG9mIE9iamVjdC5lbnRyaWVzKGNvbmZpZy5mdW5jdGlvbnMpKSB7XG4gICAgICAgICAgICBpZihmdW5jdGlvbkNvbmZpZy5ldmVudHMpIHtcbiAgICAgICAgICAgICAgZm9yKGNvbnN0IGV2ZW50IG9mIGZ1bmN0aW9uQ29uZmlnLmV2ZW50cykge1xuICAgICAgICAgICAgICAgIGlmKGV2ZW50LndlYnNvY2tldCkge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgcm91dGUgPSBldmVudC53ZWJzb2NrZXQucm91dGUgfHwgJyRjb25uZWN0JztcbiAgICAgICAgICAgICAgICAgIGlmKHJvdXRlID09PSAnJGRlZmF1bHQnIHx8IHJvdXRlID09PSBkYXRhLmFjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBtYXRjaGVkRnVuY3Rpb24gPSBmdW5jdGlvbk5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobWF0Y2hlZEZ1bmN0aW9uKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG1hdGNoZWRGdW5jdGlvbiAmJiBjb25maWcuZnVuY3Rpb25zW21hdGNoZWRGdW5jdGlvbl0pIHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgbG9hZEhhbmRsZXIoY29uZmlnLmZ1bmN0aW9uc1ttYXRjaGVkRnVuY3Rpb25dLmhhbmRsZXIsIG91dHB1dERpcik7XG5cbiAgICAgICAgICBpZihoYW5kbGVyKSB7XG4gICAgICAgICAgICAvLyBXcmFwIGhhbmRsZXIgd2l0aCBjb25zb2xlIGxvZyBjYXB0dXJlXG4gICAgICAgICAgICBjb25zdCB3cmFwcGVkSGFuZGxlciA9IGNhcHR1cmVDb25zb2xlTG9ncyhoYW5kbGVyLCBxdWlldCk7XG4gICAgICAgICAgICBjb25zdCBldmVudCA9IHtcbiAgICAgICAgICAgICAgYm9keTogZGF0YS5ib2R5IHx8IG51bGwsXG4gICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgYXBpR2F0ZXdheToge1xuICAgICAgICAgICAgICAgICAgZW5kcG9pbnQ6IGB3czovL2xvY2FsaG9zdDoke3dzUG9ydH1gXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQ6ICd0ZXN0LWNvbm5lY3Rpb24taWQnLFxuICAgICAgICAgICAgICAgIHJvdXRlS2V5OiBkYXRhLmFjdGlvbiB8fCAnJGRlZmF1bHQnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB7XG4gICAgICAgICAgICAgIGF3c1JlcXVlc3RJZDogJ3Rlc3QtcmVxdWVzdC1pZCcsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uTmFtZTogbWF0Y2hlZEZ1bmN0aW9uLFxuICAgICAgICAgICAgICBmdW5jdGlvblZlcnNpb246ICckTEFURVNUJyxcbiAgICAgICAgICAgICAgZ2V0UmVtYWluaW5nVGltZUluTWlsbGlzOiAoKSA9PiAzMDAwMCxcbiAgICAgICAgICAgICAgaW52b2tlZEZ1bmN0aW9uQXJuOiBgYXJuOmF3czpsYW1iZGE6dXMtZWFzdC0xOjEyMzQ1Njc4OTAxMjpmdW5jdGlvbjoke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgICBsb2dHcm91cE5hbWU6IGAvYXdzL2xhbWJkYS8ke21hdGNoZWRGdW5jdGlvbn1gLFxuICAgICAgICAgICAgICBsb2dTdHJlYW1OYW1lOiAndGVzdC1sb2ctc3RyZWFtJyxcbiAgICAgICAgICAgICAgbWVtb3J5TGltaXRJbk1COiAnMTI4J1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd3JhcHBlZEhhbmRsZXIoZXZlbnQsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAvLyBIYW5kbGUgTGFtYmRhIHJlc3BvbnNlIGZvcm1hdCBmb3IgV2ViU29ja2V0XG4gICAgICAgICAgICBpZihyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdCA9PT0gJ29iamVjdCcgJiYgcmVzdWx0LnN0YXR1c0NvZGUpIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIExhbWJkYSByZXNwb25zZSBvYmplY3QsIGV4dHJhY3QgdGhlIGJvZHlcbiAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHJlc3VsdC5ib2R5IHx8ICcnO1xuICAgICAgICAgICAgICB3cy5zZW5kKGJvZHkpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGRpcmVjdCByZXNwb25zZSwgc3RyaW5naWZ5IGl0XG4gICAgICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkocmVzdWx0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdzLnNlbmQoSlNPTi5zdHJpbmdpZnkoe2Vycm9yOiAnSGFuZGxlciBub3QgZm91bmQnfSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtlcnJvcjogJ1dlYlNvY2tldCBmdW5jdGlvbiBub3QgZm91bmQnfSkpO1xuICAgICAgICB9XG4gICAgICB9IGNhdGNoKGVycm9yKSB7XG4gICAgICAgIGxvZyhgV2ViU29ja2V0IGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgZmFsc2UpO1xuICAgICAgICB3cy5zZW5kKEpTT04uc3RyaW5naWZ5KHtlcnJvcjogZXJyb3IubWVzc2FnZX0pKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHdzLm9uKCdjbG9zZScsICgpID0+IHtcbiAgICAgIGxvZygnV2ViU29ja2V0IGNvbm5lY3Rpb24gY2xvc2VkJywgJ2luZm8nLCBmYWxzZSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIHJldHVybiB3c3M7XG59O1xuXG5jb25zdCBsb2FkRW52RmlsZSA9IChlbnZQYXRoOiBzdHJpbmcpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0+IHtcbiAgY29uc3QgZW52VmFyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gIGlmKCFleGlzdHNTeW5jKGVudlBhdGgpKSB7XG4gICAgcmV0dXJuIGVudlZhcnM7XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGVudkNvbnRlbnQgPSByZWFkRmlsZVN5bmMoZW52UGF0aCwgJ3V0ZjgnKTtcbiAgICBjb25zdCBsaW5lcyA9IGVudkNvbnRlbnQuc3BsaXQoJ1xcbicpO1xuXG4gICAgZm9yKGNvbnN0IGxpbmUgb2YgbGluZXMpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRMaW5lID0gbGluZS50cmltKCk7XG5cbiAgICAgIC8vIFNraXAgZW1wdHkgbGluZXMgYW5kIGNvbW1lbnRzXG4gICAgICBpZighdHJpbW1lZExpbmUgfHwgdHJpbW1lZExpbmUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBQYXJzZSBLRVk9dmFsdWUgZm9ybWF0XG4gICAgICBjb25zdCBlcXVhbEluZGV4ID0gdHJpbW1lZExpbmUuaW5kZXhPZignPScpO1xuICAgICAgaWYoZXF1YWxJbmRleCA+IDApIHtcbiAgICAgICAgY29uc3Qga2V5ID0gdHJpbW1lZExpbmUuc3Vic3RyaW5nKDAsIGVxdWFsSW5kZXgpLnRyaW0oKTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0cmltbWVkTGluZS5zdWJzdHJpbmcoZXF1YWxJbmRleCArIDEpLnRyaW0oKTtcblxuICAgICAgICAvLyBSZW1vdmUgcXVvdGVzIGlmIHByZXNlbnRcbiAgICAgICAgY29uc3QgY2xlYW5WYWx1ZSA9IHZhbHVlLnJlcGxhY2UoL15bXCInXXxbXCInXSQvZywgJycpO1xuXG4gICAgICAgIGlmKGtleSkge1xuICAgICAgICAgIGVudlZhcnNba2V5XSA9IGNsZWFuVmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYFdhcm5pbmc6IENvdWxkIG5vdCBsb2FkIC5lbnYgZmlsZSBhdCAke2VudlBhdGh9OiAke2Vycm9yLm1lc3NhZ2V9YCwgJ3dhcm4nLCBmYWxzZSk7XG4gIH1cblxuICByZXR1cm4gZW52VmFycztcbn07XG5cbmV4cG9ydCBjb25zdCBzZXJ2ZXJsZXNzID0gYXN5bmMgKFxuICBjbWQ6IFNlcnZlcmxlc3NPcHRpb25zLFxuICBjYWxsYmFjazogU2VydmVybGVzc0NhbGxiYWNrID0gKCkgPT4gKHt9KVxuKTogUHJvbWlzZTxudW1iZXI+ID0+IHtcbiAgY29uc3Qge1xuICAgIGNsaU5hbWUgPSAnTGV4JyxcbiAgICBjb25maWcsXG4gICAgZGVidWcgPSBmYWxzZSxcbiAgICBob3N0ID0gJ2xvY2FsaG9zdCcsXG4gICAgaHR0cFBvcnQgPSA1MDAwLFxuICAgIGh0dHBzUG9ydCA9IDUwMDEsXG4gICAgcXVpZXQgPSBmYWxzZSxcbiAgICByZW1vdmUgPSBmYWxzZSxcbiAgICB0ZXN0ID0gZmFsc2UsXG4gICAgdXNlUHVibGljSXAsXG4gICAgdmFyaWFibGVzLFxuICAgIHdzUG9ydCA9IDUwMDJcbiAgfSA9IGNtZDtcblxuICBjb25zdCBzcGlubmVyID0gY3JlYXRlU3Bpbm5lcihxdWlldCk7XG5cbiAgbG9nKGAke2NsaU5hbWV9IHN0YXJ0aW5nIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uYCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgYXdhaXQgTGV4Q29uZmlnLnBhcnNlQ29uZmlnKGNtZCk7XG5cbiAgY29uc3Qge291dHB1dEZ1bGxQYXRofSA9IExleENvbmZpZy5jb25maWc7XG5cbiAgLy8gTG9hZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZnJvbSAuZW52IGZpbGVzXG4gIGNvbnN0IGVudlBhdGhzID0gW1xuICAgIHBhdGhSZXNvbHZlKHByb2Nlc3MuY3dkKCksICcuZW52JyksXG4gICAgcGF0aFJlc29sdmUocHJvY2Vzcy5jd2QoKSwgJy5lbnYubG9jYWwnKSxcbiAgICBwYXRoUmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCAnLmVudi5kZXZlbG9wbWVudCcpXG4gIF07XG5cbiAgbGV0IGVudlZhcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAvLyBMb2FkIGZyb20gLmVudiBmaWxlcyBpbiBvcmRlciAobGF0ZXIgZmlsZXMgb3ZlcnJpZGUgZWFybGllciBvbmVzKVxuICBmb3IoY29uc3QgZW52UGF0aCBvZiBlbnZQYXRocykge1xuICAgIGNvbnN0IGZpbGVFbnZWYXJzID0gbG9hZEVudkZpbGUoZW52UGF0aCk7XG4gICAgaWYoT2JqZWN0LmtleXMoZmlsZUVudlZhcnMpLmxlbmd0aCA+IDApIHtcbiAgICAgIGxvZyhgTG9hZGVkIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tOiAke2VudlBhdGh9YCwgJ2luZm8nLCBxdWlldCk7XG4gICAgfVxuICAgIGVudlZhcnMgPSB7Li4uZW52VmFycywgLi4uZmlsZUVudlZhcnN9O1xuICB9XG5cbiAgLy8gU3RhcnQgd2l0aCBkZWZhdWx0IE5PREVfRU5WIGFuZCBsb2FkZWQgLmVudiB2YXJpYWJsZXNcbiAgbGV0IHZhcmlhYmxlc09iajogb2JqZWN0ID0ge05PREVfRU5WOiAnZGV2ZWxvcG1lbnQnLCAuLi5lbnZWYXJzfTtcblxuICAvLyBPdmVycmlkZSB3aXRoIGNvbW1hbmQgbGluZSB2YXJpYWJsZXMgaWYgcHJvdmlkZWRcbiAgaWYodmFyaWFibGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGNsaVZhcnMgPSBKU09OLnBhcnNlKHZhcmlhYmxlcyk7XG4gICAgICB2YXJpYWJsZXNPYmogPSB7Li4udmFyaWFibGVzT2JqLCAuLi5jbGlWYXJzfTtcbiAgICB9IGNhdGNoKF9lcnJvcikge1xuICAgICAgbG9nKGBcXG4ke2NsaU5hbWV9IEVycm9yOiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgb3B0aW9uIGlzIG5vdCBhIHZhbGlkIEpTT04gb2JqZWN0LmAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIGNhbGxiYWNrKDEpO1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICB9XG5cbiAgcHJvY2Vzcy5lbnYgPSB7Li4ucHJvY2Vzcy5lbnYsIC4uLnZhcmlhYmxlc09ian07XG5cbiAgLy8gSWYgaW4gdGVzdCBtb2RlLCBleGl0IGVhcmx5IGFmdGVyIGxvYWRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gIGlmKHRlc3QpIHtcbiAgICBsb2coJ1Rlc3QgbW9kZTogRW52aXJvbm1lbnQgdmFyaWFibGVzIGxvYWRlZCwgZXhpdGluZycsICdpbmZvJywgcXVpZXQpO1xuICAgIGNhbGxiYWNrKDApO1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgaWYocmVtb3ZlKSB7XG4gICAgc3Bpbm5lci5zdGFydCgnQ2xlYW5pbmcgb3V0cHV0IGRpcmVjdG9yeS4uLicpO1xuICAgIGF3YWl0IHJlbW92ZUZpbGVzKG91dHB1dEZ1bGxQYXRoIHx8ICcnKTtcbiAgICBzcGlubmVyLnN1Y2NlZWQoJ1N1Y2Nlc3NmdWxseSBjbGVhbmVkIG91dHB1dCBkaXJlY3RvcnkhJyk7XG4gIH1cblxuICAvLyBMb2FkIHNlcnZlcmxlc3MgY29uZmlndXJhdGlvblxuICBsZXQgc2VydmVybGVzc0NvbmZpZzogU2VydmVybGVzc0NvbmZpZyA9IHt9O1xuXG4gIHRyeSB7XG4gICAgLy8gVXNlIGdldFBhY2thZ2VEaXIgdG8gaGFuZGxlIG5wbSB3b3Jrc3BhY2VzIGNvcnJlY3RseVxuICAgIGNvbnN0IHBhY2thZ2VEaXIgPSBnZXRQYWNrYWdlRGlyKCk7XG5cbiAgICAvLyBUcnkgbXVsdGlwbGUgY29uZmlnIGZpbGUgZm9ybWF0c1xuICAgIGNvbnN0IGNvbmZpZ0Zvcm1hdHMgPSBjb25maWcgPyBbY29uZmlnXSA6IFtcbiAgICAgIHBhdGhSZXNvbHZlKHBhY2thZ2VEaXIsICdsZXguY29uZmlnLm1qcycpLFxuICAgICAgcGF0aFJlc29sdmUocGFja2FnZURpciwgJ2xleC5jb25maWcuanMnKSxcbiAgICAgIHBhdGhSZXNvbHZlKHBhY2thZ2VEaXIsICdsZXguY29uZmlnLmNqcycpLFxuICAgICAgcGF0aFJlc29sdmUocGFja2FnZURpciwgJ2xleC5jb25maWcudHMnKVxuICAgIF07XG5cbiAgICBsZXQgY29uZmlnUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gICAgZm9yKGNvbnN0IGNhbmRpZGF0ZVBhdGggb2YgY29uZmlnRm9ybWF0cykge1xuICAgICAgaWYoZXhpc3RzU3luYyhjYW5kaWRhdGVQYXRoKSkge1xuICAgICAgICBjb25maWdQYXRoID0gY2FuZGlkYXRlUGF0aDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYoY29uZmlnUGF0aCkge1xuICAgICAgbG9nKGBMb2FkaW5nIHNlcnZlcmxlc3MgY29uZmlnIGZyb206ICR7Y29uZmlnUGF0aH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICAgIGNvbnN0IGNvbmZpZ01vZHVsZSA9IGF3YWl0IGltcG9ydChjb25maWdQYXRoKTtcbiAgICAgIHNlcnZlcmxlc3NDb25maWcgPSBjb25maWdNb2R1bGUuZGVmYXVsdD8uc2VydmVybGVzcyB8fCBjb25maWdNb2R1bGUuc2VydmVybGVzcyB8fCB7fTtcbiAgICAgIGxvZygnU2VydmVybGVzcyBjb25maWcgbG9hZGVkIHN1Y2Nlc3NmdWxseScsICdpbmZvJywgcXVpZXQpO1xuICAgICAgY29uc3QgZnVuY3Rpb25OYW1lcyA9IE9iamVjdC5rZXlzKHNlcnZlcmxlc3NDb25maWcuZnVuY3Rpb25zIHx8IHt9KTtcbiAgICAgIGxvZyhgTG9hZGVkIGZ1bmN0aW9uczogJHtmdW5jdGlvbk5hbWVzLmxlbmd0aCA+IDAgPyBmdW5jdGlvbk5hbWVzLmpvaW4oJywgJykgOiAnbm9uZSd9YCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAgIC8vIERlYnVnOiBQcmludCBmdWxsIGNvbmZpZyBpZiBkZWJ1ZyBtb2RlXG4gICAgICBpZihkZWJ1Zykge1xuICAgICAgICBsb2coYEZ1bGwgc2VydmVybGVzcyBjb25maWc6ICR7SlNPTi5zdHJpbmdpZnkoc2VydmVybGVzc0NvbmZpZywgbnVsbCwgMil9YCwgJ2luZm8nLCBmYWxzZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZyhgTm8gc2VydmVybGVzcyBjb25maWcgZm91bmQuIFRyaWVkOiAke2NvbmZpZ0Zvcm1hdHMuam9pbignLCAnKX1gLCAnd2FybicsIHF1aWV0KTtcbiAgICB9XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYEVycm9yIGxvYWRpbmcgc2VydmVybGVzcyBjb25maWc6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgaWYoZGVidWcpIHtcbiAgICAgIGxvZyhgQ29uZmlnIGVycm9yIHN0YWNrOiAke2Vycm9yLnN0YWNrfWAsICdlcnJvcicsIGZhbHNlKTtcbiAgICB9XG4gICAgLy8gRG9uJ3QgZXhpdCwgY29udGludWUgd2l0aCBlbXB0eSBjb25maWdcbiAgfVxuXG4gIC8vIE1lcmdlIGNvbmZpZyB3aXRoIGNvbW1hbmQgbGluZSBvcHRpb25zXG4gIGNvbnN0IGZpbmFsQ29uZmlnOiBTZXJ2ZXJsZXNzQ29uZmlnID0ge1xuICAgIC4uLnNlcnZlcmxlc3NDb25maWcsXG4gICAgY3VzdG9tOiB7XG4gICAgICAnc2VydmVybGVzcy1vZmZsaW5lJzoge1xuICAgICAgICBjb3JzOiBzZXJ2ZXJsZXNzQ29uZmlnLmN1c3RvbT8uWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXT8uY29ycyAhPT0gZmFsc2UsXG4gICAgICAgIGhvc3Q6IHNlcnZlcmxlc3NDb25maWcuY3VzdG9tPy5bJ3NlcnZlcmxlc3Mtb2ZmbGluZSddPy5ob3N0IHx8IGhvc3QsXG4gICAgICAgIGh0dHBQb3J0OiBzZXJ2ZXJsZXNzQ29uZmlnLmN1c3RvbT8uWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXT8uaHR0cFBvcnQgfHwgaHR0cFBvcnQsXG4gICAgICAgIGh0dHBzUG9ydDogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/Lmh0dHBzUG9ydCB8fCBodHRwc1BvcnQsXG4gICAgICAgIHdzUG9ydDogc2VydmVybGVzc0NvbmZpZy5jdXN0b20/Llsnc2VydmVybGVzcy1vZmZsaW5lJ10/LndzUG9ydCB8fCB3c1BvcnRcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3Qgb3V0cHV0RGlyID0gb3V0cHV0RnVsbFBhdGggfHwgJ2xpYic7XG4gIGxvZyhgVXNpbmcgb3V0cHV0IGRpcmVjdG9yeTogJHtvdXRwdXREaXJ9YCwgJ2luZm8nLCBxdWlldCk7XG5cbiAgdHJ5IHtcbiAgICBzcGlubmVyLnN0YXJ0KCdTdGFydGluZyBzZXJ2ZXJsZXNzIGRldmVsb3BtZW50IHNlcnZlci4uLicpO1xuXG4gICAgY29uc3QgaHR0cFBvcnQgPSBmaW5hbENvbmZpZy5jdXN0b20hWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXSEuaHR0cFBvcnQhO1xuICAgIGNvbnN0IHdzUG9ydCA9IGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS53c1BvcnQhO1xuICAgIGNvbnN0IGhvc3QgPSBmaW5hbENvbmZpZy5jdXN0b20hWydzZXJ2ZXJsZXNzLW9mZmxpbmUnXSEuaG9zdCE7XG5cbiAgICBsb2coYENyZWF0aW5nIEhUVFAgc2VydmVyIG9uICR7aG9zdH06JHtodHRwUG9ydH1gLCAnaW5mbycsIHF1aWV0KTtcbiAgICBsb2coYENyZWF0aW5nIFdlYlNvY2tldCBzZXJ2ZXIgb24gcG9ydCAke3dzUG9ydH1gLCAnaW5mbycsIHF1aWV0KTtcblxuICAgIC8vIENyZWF0ZSBFeHByZXNzIHNlcnZlclxuICAgIGNvbnN0IGV4cHJlc3NBcHAgPSBhd2FpdCBjcmVhdGVFeHByZXNzU2VydmVyKFxuICAgICAgZmluYWxDb25maWcsXG4gICAgICBvdXRwdXREaXIsXG4gICAgICBodHRwUG9ydCxcbiAgICAgIGhvc3QsXG4gICAgICBxdWlldCxcbiAgICAgIGRlYnVnXG4gICAgKTtcblxuICAgIC8vIENyZWF0ZSBXZWJTb2NrZXQgc2VydmVyXG4gICAgY29uc3Qgd3NTZXJ2ZXIgPSBjcmVhdGVXZWJTb2NrZXRTZXJ2ZXIoXG4gICAgICBmaW5hbENvbmZpZyxcbiAgICAgIG91dHB1dERpcixcbiAgICAgIHdzUG9ydCxcbiAgICAgIHF1aWV0LFxuICAgICAgZGVidWdcbiAgICApO1xuXG4gICAgLy8gSGFuZGxlIHNlcnZlciBlcnJvcnNcbiAgICB3c1NlcnZlci5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGxvZyhgV2ViU29ja2V0IHNlcnZlciBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWAsICdlcnJvcicsIHF1aWV0KTtcbiAgICAgIHNwaW5uZXIuZmFpbCgnRmFpbGVkIHRvIHN0YXJ0IFdlYlNvY2tldCBzZXJ2ZXIuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcblxuICAgIC8vIFN0YXJ0IEV4cHJlc3Mgc2VydmVyXG4gICAgY29uc3Qgc2VydmVyID0gZXhwcmVzc0FwcC5saXN0ZW4oaHR0cFBvcnQsIGhvc3QsICgpID0+IHtcbiAgICAgIHNwaW5uZXIuc3VjY2VlZCgnU2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIgc3RhcnRlZC4nKTtcblxuICAgICAgZGlzcGxheVNlcnZlclN0YXR1cyhcbiAgICAgICAgaHR0cFBvcnQsXG4gICAgICAgIGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwc1BvcnQhLFxuICAgICAgICB3c1BvcnQsXG4gICAgICAgIGhvc3QsXG4gICAgICAgIHF1aWV0XG4gICAgICApO1xuXG4gICAgICBmZXRjaFB1YmxpY0lwKHVzZVB1YmxpY0lwKS50aGVuKChwdWJsaWNJcCkgPT4ge1xuICAgICAgICBpZihwdWJsaWNJcCkge1xuICAgICAgICAgIGRpc3BsYXlTZXJ2ZXJTdGF0dXMoXG4gICAgICAgICAgICBodHRwUG9ydCxcbiAgICAgICAgICAgIGZpbmFsQ29uZmlnLmN1c3RvbSFbJ3NlcnZlcmxlc3Mtb2ZmbGluZSddIS5odHRwc1BvcnQhLFxuICAgICAgICAgICAgd3NQb3J0LFxuICAgICAgICAgICAgaG9zdCxcbiAgICAgICAgICAgIHF1aWV0LFxuICAgICAgICAgICAgcHVibGljSXBcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBFeHByZXNzIHNlcnZlciBlcnJvcnNcbiAgICBzZXJ2ZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICBsb2coYEV4cHJlc3Mgc2VydmVyIGVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCwgJ2Vycm9yJywgcXVpZXQpO1xuICAgICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gc3RhcnQgRXhwcmVzcyBzZXJ2ZXIuJyk7XG4gICAgICBjYWxsYmFjaygxKTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcblxuICAgIC8vIEhhbmRsZSBncmFjZWZ1bCBzaHV0ZG93blxuICAgIGNvbnN0IHNodXRkb3duID0gKCkgPT4ge1xuICAgICAgbG9nKCdcXG5TaHV0dGluZyBkb3duIHNlcnZlcmxlc3MgZGV2ZWxvcG1lbnQgc2VydmVyLi4uJywgJ2luZm8nLCBxdWlldCk7XG4gICAgICBzZXJ2ZXIuY2xvc2UoKTtcbiAgICAgIHdzU2VydmVyLmNsb3NlKCk7XG4gICAgICBjYWxsYmFjaygwKTtcbiAgICB9O1xuXG4gICAgcHJvY2Vzcy5vbignU0lHSU5UJywgc2h1dGRvd24pO1xuICAgIHByb2Nlc3Mub24oJ1NJR1RFUk0nLCBzaHV0ZG93bik7XG5cbiAgICAvLyBLZWVwIHRoZSBwcm9jZXNzIGFsaXZlXG4gICAgcHJvY2Vzcy5zdGRpbi5yZXN1bWUoKTtcblxuICAgIGxvZygnU2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIgaXMgcnVubmluZy4gUHJlc3MgQ3RybCtDIHRvIHN0b3AuJywgJ2luZm8nLCBxdWlldCk7XG5cbiAgICAvLyBEb24ndCBjYWxsIGNhbGxiYWNrIGhlcmUsIGxldCB0aGUgcHJvY2VzcyBzdGF5IGFsaXZlXG4gICAgcmV0dXJuIDA7XG4gIH0gY2F0Y2goZXJyb3IpIHtcbiAgICBsb2coYFxcbiR7Y2xpTmFtZX0gRXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gLCAnZXJyb3InLCBxdWlldCk7XG4gICAgc3Bpbm5lci5mYWlsKCdGYWlsZWQgdG8gc3RhcnQgc2VydmVybGVzcyBkZXZlbG9wbWVudCBzZXJ2ZXIuJyk7XG4gICAgY2FsbGJhY2soMSk7XG4gICAgcmV0dXJuIDE7XG4gIH1cbn07Il0sIm5hbWVzIjpbImJveGVuIiwiY2hhbGsiLCJleHByZXNzIiwicmVhZEZpbGVTeW5jIiwiZXhpc3RzU3luYyIsIm1rZGlyU3luYyIsIndyaXRlRmlsZVN5bmMiLCJob21lZGlyIiwicmVzb2x2ZSIsInBhdGhSZXNvbHZlIiwiam9pbiIsImlzQWJzb2x1dGUiLCJXZWJTb2NrZXRTZXJ2ZXIiLCJMZXhDb25maWciLCJnZXRQYWNrYWdlRGlyIiwiY3JlYXRlU3Bpbm5lciIsInJlbW92ZUZpbGVzIiwibG9nIiwiZ2V0Q2FjaGVEaXIiLCJjYWNoZURpciIsInJlY3Vyc2l2ZSIsImdldENhY2hlUGF0aCIsInJlYWRQdWJsaWNJcENhY2hlIiwiY2FjaGVQYXRoIiwiY2FjaGVEYXRhIiwiY2FjaGUiLCJKU09OIiwicGFyc2UiLCJvbmVXZWVrTXMiLCJEYXRlIiwibm93IiwidGltZXN0YW1wIiwid3JpdGVQdWJsaWNJcENhY2hlIiwiaXAiLCJzdHJpbmdpZnkiLCJmZXRjaFB1YmxpY0lwIiwiZm9yY2VSZWZyZXNoIiwiUHJvbWlzZSIsImNhY2hlZCIsImZldGNoIiwidGhlbiIsInJlcyIsInRleHQiLCJkYXRhIiwidHJpbSIsImNhdGNoIiwidW5kZWZpbmVkIiwiZGlzcGxheVNlcnZlclN0YXR1cyIsImh0dHBQb3J0IiwiaHR0cHNQb3J0Iiwid3NQb3J0IiwiaG9zdCIsInF1aWV0IiwicHVibGljSXAiLCJodHRwVXJsIiwiaHR0cHNVcmwiLCJ3c1VybCIsIndzc1VybCIsInVybExpbmVzIiwiZ3JlZW4iLCJ1bmRlcmxpbmUiLCJzdGF0dXNCb3giLCJjeWFuIiwiYm9sZCIsInllbGxvdyIsImJhY2tncm91bmRDb2xvciIsImJvcmRlckNvbG9yIiwiYm9yZGVyU3R5bGUiLCJtYXJnaW4iLCJwYWRkaW5nIiwiY29uc29sZSIsImxvYWRIYW5kbGVyIiwiaGFuZGxlclBhdGgiLCJvdXRwdXREaXIiLCJmdWxsUGF0aCIsImV4dGVuc2lvbnMiLCJwYXRoV2l0aG91dEV4dCIsInJlcGxhY2UiLCJleHQiLCJjYW5kaWRhdGVQYXRoIiwiZXJyb3IiLCJFcnJvciIsImltcG9ydFBhdGgiLCJlbmRzV2l0aCIsImhhbmRsZXJNb2R1bGUiLCJPYmplY3QiLCJrZXlzIiwiaGFuZGxlciIsImRlZmF1bHQiLCJpbXBvcnRFcnJvciIsIm1lc3NhZ2UiLCJzdGFjayIsImNhcHR1cmVDb25zb2xlTG9ncyIsImV2ZW50IiwiY29udGV4dCIsIm9yaWdpbmFsQ29uc29sZUxvZyIsIm9yaWdpbmFsQ29uc29sZUVycm9yIiwib3JpZ2luYWxDb25zb2xlV2FybiIsIndhcm4iLCJvcmlnaW5hbENvbnNvbGVJbmZvIiwiaW5mbyIsImxvZ3MiLCJhcmdzIiwicHVzaCIsInJlc3VsdCIsImxlbmd0aCIsImdyYXkiLCJmb3JFYWNoIiwiY3JlYXRlRXhwcmVzc1NlcnZlciIsImNvbmZpZyIsImRlYnVnIiwiYXBwIiwidXNlIiwicmVxIiwibmV4dCIsImhlYWRlciIsIm1ldGhvZCIsInNlbmRTdGF0dXMiLCJqc29uIiwibG9hZEdyYXBoUUxTY2hlbWEiLCJncmFwaHFsSGFuZGxlciIsImZ1bmN0aW9ucyIsImZ1bmN0aW9uTmFtZSIsImZ1bmN0aW9uQ29uZmlnIiwiZW50cmllcyIsImV2ZW50cyIsImh0dHAiLCJwYXRoIiwiZ3JhcGhxbFBhdGgiLCJfZnVuY3Rpb25OYW1lIiwiYm9keSIsInF1ZXJ5IiwidmFyaWFibGVzIiwib3BlcmF0aW9uTmFtZSIsImxvZ01lc3NhZ2UiLCJtYXAiLCJhcmciLCJTdHJpbmciLCJhd3NSZXF1ZXN0SWQiLCJmdW5jdGlvblZlcnNpb24iLCJnZXRSZW1haW5pbmdUaW1lSW5NaWxsaXMiLCJpbnZva2VkRnVuY3Rpb25Bcm4iLCJsb2dHcm91cE5hbWUiLCJsb2dTdHJlYW1OYW1lIiwid3JhcHBlZEhhbmRsZXIiLCJoZWFkZXJzIiwiaHR0cE1ldGhvZCIsInF1ZXJ5U3RyaW5nUGFyYW1ldGVycyIsInN0YXR1c0NvZGUiLCJzdGF0dXMiLCJrZXkiLCJ2YWx1ZSIsInNldEhlYWRlciIsInNlbmQiLCJ1cmwiLCJwYXRobmFtZSIsInNwbGl0IiwibWF0Y2hlZEZ1bmN0aW9uIiwiZnVuY3Rpb25OYW1lcyIsImV2ZW50UGF0aCIsImV2ZW50TWV0aG9kIiwidG9VcHBlckNhc2UiLCJyZXF1ZXN0TWV0aG9kIiwibm9ybWFsaXplZEV2ZW50UGF0aCIsIm5vcm1hbGl6ZWRQYXRobmFtZSIsIm1lbW9yeUxpbWl0SW5NQiIsImNyZWF0ZVdlYlNvY2tldFNlcnZlciIsIndzcyIsInBvcnQiLCJvbiIsIndzIiwidG9TdHJpbmciLCJ3ZWJzb2NrZXQiLCJyb3V0ZSIsImFjdGlvbiIsInJlcXVlc3RDb250ZXh0IiwiYXBpR2F0ZXdheSIsImVuZHBvaW50IiwiY29ubmVjdGlvbklkIiwicm91dGVLZXkiLCJsb2FkRW52RmlsZSIsImVudlBhdGgiLCJlbnZWYXJzIiwiZW52Q29udGVudCIsImxpbmVzIiwibGluZSIsInRyaW1tZWRMaW5lIiwic3RhcnRzV2l0aCIsImVxdWFsSW5kZXgiLCJpbmRleE9mIiwic3Vic3RyaW5nIiwiY2xlYW5WYWx1ZSIsInNlcnZlcmxlc3MiLCJjbWQiLCJjYWxsYmFjayIsImNsaU5hbWUiLCJyZW1vdmUiLCJ0ZXN0IiwidXNlUHVibGljSXAiLCJzcGlubmVyIiwicGFyc2VDb25maWciLCJvdXRwdXRGdWxsUGF0aCIsImVudlBhdGhzIiwicHJvY2VzcyIsImN3ZCIsImZpbGVFbnZWYXJzIiwidmFyaWFibGVzT2JqIiwiTk9ERV9FTlYiLCJjbGlWYXJzIiwiX2Vycm9yIiwiZW52Iiwic3RhcnQiLCJzdWNjZWVkIiwic2VydmVybGVzc0NvbmZpZyIsInBhY2thZ2VEaXIiLCJjb25maWdGb3JtYXRzIiwiY29uZmlnUGF0aCIsImNvbmZpZ01vZHVsZSIsImZpbmFsQ29uZmlnIiwiY3VzdG9tIiwiY29ycyIsImV4cHJlc3NBcHAiLCJ3c1NlcnZlciIsImZhaWwiLCJzZXJ2ZXIiLCJsaXN0ZW4iLCJzaHV0ZG93biIsImNsb3NlIiwic3RkaW4iLCJyZXN1bWUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Q0FHQyxHQUNELE9BQU9BLFdBQVcsUUFBUTtBQUMxQixPQUFPQyxXQUFXLFFBQVE7QUFDMUIsT0FBT0MsYUFBYSxVQUFVO0FBQzlCLFNBQVFDLFlBQVksRUFBRUMsVUFBVSxFQUFFQyxTQUFT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
|