dcdx 1.3.0-next.6 → 1.3.0-next.61
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.
- package/assets/versions.json +1 -1
- package/lib/commands/apt.js +1937 -9471
- package/lib/commands/build.js +470 -8943
- package/lib/commands/configure.js +593 -0
- package/lib/commands/database.js +24 -8890
- package/lib/commands/debug.js +989 -8967
- package/lib/commands/install.js +629 -8971
- package/lib/commands/reset.js +564 -8898
- package/lib/commands/run.js +618 -8929
- package/lib/commands/stop.js +564 -8898
- package/lib/commands/update.js +10 -8877
- package/lib/index.js +33 -2
- package/lib/types/src/applications/base.d.ts +4 -0
- package/lib/types/src/apt/helpers/dcapt.d.ts +2 -1
- package/lib/types/src/apt/helpers/downloadFile.d.ts +1 -0
- package/lib/types/src/apt/helpers/generateDependencyTree.d.ts +2 -0
- package/lib/types/src/apt/helpers/generateSCAReport.d.ts +2 -0
- package/lib/types/src/apt/helpers/getAppLicense.d.ts +3 -0
- package/lib/types/src/apt/helpers/getAptDirectory.d.ts +1 -1
- package/lib/types/src/apt/helpers/getClusterURL.d.ts +1 -1
- package/lib/types/src/apt/helpers/getHostLicense.d.ts +1 -1
- package/lib/types/src/apt/helpers/getRunForStage.d.ts +1 -1
- package/lib/types/src/apt/helpers/getUrlByAppKey.d.ts +1 -0
- package/lib/types/src/apt/helpers/installAppInCluster.d.ts +2 -0
- package/lib/types/src/apt/helpers/persistClusterConfiguration.d.ts +2 -1
- package/lib/types/src/apt/helpers/persistTestConfiguration.d.ts +1 -1
- package/lib/types/src/apt/helpers/provisionCluster.d.ts +1 -0
- package/lib/types/src/apt/helpers/restartCluster.d.ts +2 -0
- package/lib/types/src/apt/helpers/runLuceneTimingTest.d.ts +2 -0
- package/lib/types/src/apt/helpers/runPerformanceTest.d.ts +2 -2
- package/lib/types/src/apt/helpers/runScalabilityTest.d.ts +2 -2
- package/lib/types/src/apt/messages.d.ts +10 -5
- package/lib/types/src/commands/configure.d.ts +2 -0
- package/lib/types/src/databases/base.d.ts +1 -0
- package/lib/types/src/helpers/ActionHandler.d.ts +1 -40
- package/lib/types/src/helpers/FileWatcher.d.ts +2 -2
- package/lib/types/src/helpers/PAT.d.ts +10 -0
- package/lib/types/src/helpers/findInFile.d.ts +1 -0
- package/lib/types/src/helpers/getConfig.d.ts +2 -0
- package/lib/types/src/helpers/getMainArtifactFromOBR.d.ts +1 -0
- package/lib/types/src/helpers/installFromMPAC.d.ts +2 -0
- package/lib/types/src/helpers/installFromURL.d.ts +2 -0
- package/lib/types/src/helpers/installWithQuickReload.d.ts +2 -0
- package/lib/types/src/helpers/setupHost.d.ts +3 -0
- package/lib/types/src/helpers/upm.d.ts +2 -2
- package/lib/types/src/helpers/validateAtlassianPlugin.d.ts +4 -0
- package/lib/types/src/types/AMPS.d.ts +12 -0
- package/lib/types/src/types/Application.d.ts +6 -0
- package/lib/types/src/types/Config.d.ts +370 -0
- package/lib/types/src/types/Configure.d.ts +177 -0
- package/lib/types/src/types/DCAPT.d.ts +506 -94
- package/lib/types/src/types/Database.d.ts +1 -0
- package/lib/types/src/types/FileWatcher.d.ts +39 -0
- package/lib/types/src/types/Install.d.ts +238 -0
- package/lib/types/src/types/Installer.d.ts +21 -0
- package/package.json +7 -1
- package/lib/types/src/apt/helpers/installApp.d.ts +0 -1
- package/lib/types/src/helpers/Installer.d.ts +0 -3
|
@@ -0,0 +1,593 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command as Command$1, Option } from 'commander';
|
|
3
|
+
import { asyncExitHook, gracefulExit } from 'exit-hook';
|
|
4
|
+
import { z } from 'zod';
|
|
5
|
+
import { realpathSync, readFileSync, existsSync, statSync } from 'fs';
|
|
6
|
+
import { dirname, join, isAbsolute } from 'path';
|
|
7
|
+
import { pathToFileURL } from 'url';
|
|
8
|
+
import puppeteer from 'puppeteer';
|
|
9
|
+
|
|
10
|
+
const ActionHandler = async (program, { action, errorHandler }, options) => {
|
|
11
|
+
const ops = options || program.opts();
|
|
12
|
+
await new Promise((_, reject) => {
|
|
13
|
+
let errorMessage = '';
|
|
14
|
+
asyncExitHook(async (code) => {
|
|
15
|
+
try {
|
|
16
|
+
if (code !== 0) {
|
|
17
|
+
await errorHandler(ops).catch(() => null);
|
|
18
|
+
}
|
|
19
|
+
if (errorMessage) {
|
|
20
|
+
throw new Error(errorMessage.trim());
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
// We are rejecting the promise to avoid the
|
|
24
|
+
// "Calling process.exit" log message from exit-hook
|
|
25
|
+
reject(null);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
const message = err instanceof Error ? err.message : err;
|
|
30
|
+
reject(message);
|
|
31
|
+
}
|
|
32
|
+
}, {
|
|
33
|
+
wait: 60 * 1 * 1000
|
|
34
|
+
});
|
|
35
|
+
action(ops).then(() => {
|
|
36
|
+
gracefulExit(0);
|
|
37
|
+
}).catch(err => {
|
|
38
|
+
if (err instanceof z.ZodError) {
|
|
39
|
+
err.issues.forEach(issue => {
|
|
40
|
+
errorMessage += `Unable to parse option ${issue.path.join(',')}: ${issue.message}\n`;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
else if (err instanceof Error || typeof err === 'string') {
|
|
44
|
+
errorMessage = err.toString();
|
|
45
|
+
}
|
|
46
|
+
gracefulExit(1);
|
|
47
|
+
});
|
|
48
|
+
}).catch(message => {
|
|
49
|
+
if (message !== null) {
|
|
50
|
+
program.error(message);
|
|
51
|
+
// If there is no error message,
|
|
52
|
+
// we can assume a clean exit
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
process.exit(0);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const toAbsolutePath = (relativePath) => {
|
|
61
|
+
const [, filePath] = process.argv;
|
|
62
|
+
const executableFileDir = dirname(realpathSync(filePath));
|
|
63
|
+
const basedir = executableFileDir.substring(0, executableFileDir.indexOf('dcdx') + 4);
|
|
64
|
+
return join(basedir, relativePath.replaceAll('../', ''));
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const getVersions = () => {
|
|
68
|
+
const content = readFileSync(toAbsolutePath('../../assets/versions.json'), 'utf-8');
|
|
69
|
+
const versions = JSON.parse(content);
|
|
70
|
+
return versions;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const versions = getVersions();
|
|
74
|
+
const SupportedDatabaseEngines = z.enum([
|
|
75
|
+
'postgresql',
|
|
76
|
+
'mysql',
|
|
77
|
+
'mssql'
|
|
78
|
+
]);
|
|
79
|
+
const SupportedMSSQLEditions = z.enum([
|
|
80
|
+
'Developer',
|
|
81
|
+
'Express',
|
|
82
|
+
'Standard',
|
|
83
|
+
'Enterprise',
|
|
84
|
+
'EnterpriseCore'
|
|
85
|
+
]);
|
|
86
|
+
const DatabaseOptions = z.object({
|
|
87
|
+
name: SupportedDatabaseEngines,
|
|
88
|
+
port: z.number().or(z.string().transform(Number).refine(item => !isNaN(item))),
|
|
89
|
+
database: z.string().default('dcdx'),
|
|
90
|
+
username: z.string().default('dcdx'),
|
|
91
|
+
password: z.string().default('dcdx'),
|
|
92
|
+
clean: z.boolean().default(false),
|
|
93
|
+
prune: z.boolean().default(false),
|
|
94
|
+
verbose: z.boolean().default(false),
|
|
95
|
+
driver: z.string()
|
|
96
|
+
});
|
|
97
|
+
DatabaseOptions.extend({
|
|
98
|
+
name: SupportedDatabaseEngines.refine(item => item === SupportedDatabaseEngines.Values.postgresql).default(SupportedDatabaseEngines.Values.postgresql),
|
|
99
|
+
tag: z.string().refine(item => versions[SupportedDatabaseEngines.Values.postgresql].includes(item)).default('latest'),
|
|
100
|
+
port: z.number().or(z.string().transform(Number).refine(item => !isNaN(item))).default(5432),
|
|
101
|
+
driver: z.string().refine(item => item === 'org.postgresql.Driver').default('org.postgresql.Driver')
|
|
102
|
+
});
|
|
103
|
+
DatabaseOptions.extend({
|
|
104
|
+
name: SupportedDatabaseEngines.refine(item => item === SupportedDatabaseEngines.Values.mysql).default(SupportedDatabaseEngines.Values.mysql),
|
|
105
|
+
tag: z.string().refine(item => versions[SupportedDatabaseEngines.Values.mysql].includes(item)).default('latest'),
|
|
106
|
+
port: z.number().or(z.string().transform(Number).refine(item => !isNaN(item))).default(3306),
|
|
107
|
+
driver: z.string().refine(item => item === 'com.mysql.jdbc.Driver').default('com.mysql.jdbc.Driver')
|
|
108
|
+
});
|
|
109
|
+
DatabaseOptions.extend({
|
|
110
|
+
name: SupportedDatabaseEngines.refine(item => item === SupportedDatabaseEngines.Values.mssql).default(SupportedDatabaseEngines.Values.mssql),
|
|
111
|
+
tag: z.string().refine(item => versions[SupportedDatabaseEngines.Values.mssql].includes(item)).default('latest'),
|
|
112
|
+
edition: SupportedMSSQLEditions.default('Developer'),
|
|
113
|
+
port: z.number().or(z.string().transform(Number).refine(item => !isNaN(item))).default(1433),
|
|
114
|
+
username: z.string().refine(item => item === 'sa').default('sa'),
|
|
115
|
+
password: z.string().default('DataCenterDX!'),
|
|
116
|
+
driver: z.string().refine(item => item === 'com.microsoft.sqlserver.jdbc.SQLServerDriver').default('com.microsoft.sqlserver.jdbc.SQLServerDriver')
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
const SupportedApplications = z.enum([
|
|
120
|
+
'jira',
|
|
121
|
+
'confluence',
|
|
122
|
+
'bitbucket',
|
|
123
|
+
'bamboo'
|
|
124
|
+
]);
|
|
125
|
+
z.object({
|
|
126
|
+
name: SupportedApplications,
|
|
127
|
+
tag: z.string().default('latest'),
|
|
128
|
+
database: SupportedDatabaseEngines.default('postgresql'),
|
|
129
|
+
databaseTag: z.string().default('latest'),
|
|
130
|
+
port: z.string().transform(Number).refine(item => !isNaN(item)).default('80'),
|
|
131
|
+
contextPath: z.string(),
|
|
132
|
+
xms: z.string().default('1024m'),
|
|
133
|
+
xmx: z.string().default('1024m'),
|
|
134
|
+
watch: z.boolean().default(false),
|
|
135
|
+
ext: z.array(z.string()),
|
|
136
|
+
install: z.boolean(),
|
|
137
|
+
outputDirectory: z.string(),
|
|
138
|
+
activateProfiles: z.string(),
|
|
139
|
+
configure: z.boolean().default(false),
|
|
140
|
+
clean: z.boolean().default(false),
|
|
141
|
+
prune: z.boolean().default(false),
|
|
142
|
+
debug: z.boolean().default(true),
|
|
143
|
+
jvm: z.string(),
|
|
144
|
+
cwd: z.string()
|
|
145
|
+
}).partial({
|
|
146
|
+
contextPath: true,
|
|
147
|
+
ext: true,
|
|
148
|
+
install: true,
|
|
149
|
+
outputDirectory: true,
|
|
150
|
+
activateProfiles: true,
|
|
151
|
+
jvm: true,
|
|
152
|
+
cwd: true
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
z.object({
|
|
156
|
+
product: SupportedApplications,
|
|
157
|
+
config: z.string(),
|
|
158
|
+
cwd: z.string()
|
|
159
|
+
}).partial({
|
|
160
|
+
config: true,
|
|
161
|
+
cwd: true
|
|
162
|
+
});
|
|
163
|
+
const ConfigureBase = z.object({
|
|
164
|
+
username: z.string(),
|
|
165
|
+
password: z.string()
|
|
166
|
+
});
|
|
167
|
+
const ConfigureJira = ConfigureBase.extend({
|
|
168
|
+
title: z.string(),
|
|
169
|
+
mode: z.enum(['private', 'public']),
|
|
170
|
+
baseUrl: z.string(),
|
|
171
|
+
fullname: z.string(),
|
|
172
|
+
email: z.string(),
|
|
173
|
+
configureEmail: z.enum(['later', 'now']),
|
|
174
|
+
emailName: z.string(),
|
|
175
|
+
emailFromAddress: z.string(),
|
|
176
|
+
emailPrefix: z.string(),
|
|
177
|
+
emailServerType: z.enum(['smtp', 'jndi']),
|
|
178
|
+
emailJndiLocation: z.string(),
|
|
179
|
+
emailServiceProvider: z.enum(['custom', 'google-apps-mail-/-gmail-8', 'yahoo!-mail-plus-9']),
|
|
180
|
+
emailHostName: z.string(),
|
|
181
|
+
emailProtocol: z.enum(['SMTP', 'SECURE_SMTP']),
|
|
182
|
+
emailPort: z.number(),
|
|
183
|
+
emailTimeout: z.number(),
|
|
184
|
+
emailTLS: z.boolean(),
|
|
185
|
+
emailUsername: z.string(),
|
|
186
|
+
emailPassword: z.string(),
|
|
187
|
+
language: z.enum([
|
|
188
|
+
'en-US',
|
|
189
|
+
'zh_CN',
|
|
190
|
+
'cs_CZ',
|
|
191
|
+
'da_DK',
|
|
192
|
+
'nl_NL',
|
|
193
|
+
'en_UK',
|
|
194
|
+
'et_EE',
|
|
195
|
+
'fi_FI',
|
|
196
|
+
'fr_FR',
|
|
197
|
+
'de_DE',
|
|
198
|
+
'hu_HU',
|
|
199
|
+
'is_IS',
|
|
200
|
+
'it_IT',
|
|
201
|
+
'ja_JP',
|
|
202
|
+
'ko_KR',
|
|
203
|
+
'no_NO',
|
|
204
|
+
'pl_PL',
|
|
205
|
+
'pt_BR',
|
|
206
|
+
'ro_RO',
|
|
207
|
+
'ru_RU',
|
|
208
|
+
'sk_SK',
|
|
209
|
+
'es_ES',
|
|
210
|
+
'sv_SE'
|
|
211
|
+
]),
|
|
212
|
+
avatarPath: z.string()
|
|
213
|
+
}).partial({
|
|
214
|
+
emailName: true,
|
|
215
|
+
emailFromAddress: true,
|
|
216
|
+
emailPrefix: true,
|
|
217
|
+
emailServerType: true,
|
|
218
|
+
emailJndiLocation: true,
|
|
219
|
+
emailServiceProvider: true,
|
|
220
|
+
emailHostName: true,
|
|
221
|
+
emailProtocol: true,
|
|
222
|
+
emailPort: true,
|
|
223
|
+
emailTimeout: true,
|
|
224
|
+
emailTLS: true,
|
|
225
|
+
emailUsername: true,
|
|
226
|
+
emailPassword: true,
|
|
227
|
+
language: true,
|
|
228
|
+
avatarPath: true
|
|
229
|
+
}).default({
|
|
230
|
+
title: 'Jira',
|
|
231
|
+
mode: 'private',
|
|
232
|
+
baseUrl: 'http://localhost',
|
|
233
|
+
fullname: 'Administrator',
|
|
234
|
+
email: 'admin@example.org',
|
|
235
|
+
configureEmail: 'later',
|
|
236
|
+
username: 'admin',
|
|
237
|
+
password: 'admin'
|
|
238
|
+
});
|
|
239
|
+
const ConfigureConfluence = ConfigureBase.extend({
|
|
240
|
+
baseUrl: z.string(),
|
|
241
|
+
deploymentType: z.enum(['non-clustered', 'clustered']),
|
|
242
|
+
fullName: z.string(),
|
|
243
|
+
email: z.string(),
|
|
244
|
+
clusterName: z.string(),
|
|
245
|
+
clusterHome: z.string(),
|
|
246
|
+
clusterJoinMode: z.enum(['useMulticast', 'useTcpIp', 'useAws']),
|
|
247
|
+
clusterAutoAddress: z.boolean(),
|
|
248
|
+
loadContent: z.enum(['example', 'empty']),
|
|
249
|
+
userManagement: z.enum(['confluence', 'jira']),
|
|
250
|
+
jiraBaseUrl: z.string(),
|
|
251
|
+
jiraUsername: z.string(),
|
|
252
|
+
jiraPassword: z.string(),
|
|
253
|
+
jiraUserGroups: z.string(),
|
|
254
|
+
jiraAdminGroups: z.string(),
|
|
255
|
+
}).partial({
|
|
256
|
+
clusterName: true,
|
|
257
|
+
clusterHome: true,
|
|
258
|
+
clusterJoinMode: true,
|
|
259
|
+
clusterAutoAddress: true,
|
|
260
|
+
jiraBaseUrl: true,
|
|
261
|
+
jiraUsername: true,
|
|
262
|
+
jiraPassword: true,
|
|
263
|
+
jiraUserGroups: true,
|
|
264
|
+
jiraAdminGroups: true
|
|
265
|
+
}).default({
|
|
266
|
+
baseUrl: 'http://localhost',
|
|
267
|
+
deploymentType: 'non-clustered',
|
|
268
|
+
fullName: 'Administrator',
|
|
269
|
+
email: 'admin@example.org',
|
|
270
|
+
loadContent: 'empty',
|
|
271
|
+
userManagement: 'confluence',
|
|
272
|
+
username: 'admin',
|
|
273
|
+
password: 'admin'
|
|
274
|
+
});
|
|
275
|
+
const ConfigureBitbucket = ConfigureBase.extend({}).default({
|
|
276
|
+
username: 'admin',
|
|
277
|
+
password: 'admin'
|
|
278
|
+
});
|
|
279
|
+
const ConfigureBamboo = ConfigureBase.extend({}).default({
|
|
280
|
+
username: 'admin',
|
|
281
|
+
password: 'admin'
|
|
282
|
+
});
|
|
283
|
+
|
|
284
|
+
const Config = z.object({
|
|
285
|
+
setup: z.object({
|
|
286
|
+
[SupportedApplications.Values.jira]: ConfigureJira,
|
|
287
|
+
[SupportedApplications.Values.confluence]: ConfigureConfluence,
|
|
288
|
+
[SupportedApplications.Values.bamboo]: ConfigureBamboo,
|
|
289
|
+
[SupportedApplications.Values.bitbucket]: ConfigureBitbucket
|
|
290
|
+
}).partial()
|
|
291
|
+
}).default({
|
|
292
|
+
setup: {
|
|
293
|
+
[SupportedApplications.Values.jira]: ConfigureJira.parse(undefined),
|
|
294
|
+
[SupportedApplications.Values.confluence]: ConfigureConfluence.parse(undefined),
|
|
295
|
+
[SupportedApplications.Values.bamboo]: ConfigureBamboo.parse(undefined),
|
|
296
|
+
[SupportedApplications.Values.bitbucket]: ConfigureBitbucket.parse(undefined)
|
|
297
|
+
}
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
/*
|
|
301
|
+
Code atrribution
|
|
302
|
+
borrowed some logic for loading configuration files from ESLint
|
|
303
|
+
https://github.com/eslint/eslint/blob/main/lib/config/config-loader.js
|
|
304
|
+
*/
|
|
305
|
+
const getConfig = async (path, cwd) => {
|
|
306
|
+
let config;
|
|
307
|
+
const directory = cwd || process.cwd();
|
|
308
|
+
const configFile = path || 'dcdx.config.mjs';
|
|
309
|
+
const configPath = isAbsolute(configFile) && existsSync(configFile) ? configFile : join(directory, configFile);
|
|
310
|
+
if (existsSync(configPath)) {
|
|
311
|
+
/*
|
|
312
|
+
* Explanation copied from ESLint
|
|
313
|
+
*
|
|
314
|
+
* Append a query with the config file's modification time (`mtime`) in order
|
|
315
|
+
* to import the current version of the config file. Without the query, `import()` would
|
|
316
|
+
* cache the config file module by the pathname only, and then always return
|
|
317
|
+
* the same version (the one that was actual when the module was imported for the first time).
|
|
318
|
+
*
|
|
319
|
+
* This ensures that the config file module is loaded and executed again
|
|
320
|
+
* if it has been changed since the last time it was imported.
|
|
321
|
+
* If it hasn't been changed, `import()` will just return the cached version.
|
|
322
|
+
*
|
|
323
|
+
* Note that we should not overuse queries (e.g., by appending the current time
|
|
324
|
+
* to always reload the config file module) as that could cause memory leaks
|
|
325
|
+
* because entries are never removed from the import cache.
|
|
326
|
+
*/
|
|
327
|
+
const mtime = statSync(configPath).mtime.getTime();
|
|
328
|
+
const fileURL = pathToFileURL(configPath);
|
|
329
|
+
fileURL.searchParams.append('mtime', mtime.toFixed());
|
|
330
|
+
const filePath = fileURL.toString();
|
|
331
|
+
config = (await import(filePath)).default;
|
|
332
|
+
}
|
|
333
|
+
return Config.parse(config);
|
|
334
|
+
};
|
|
335
|
+
|
|
336
|
+
const capitalize = (value) => value.charAt(0).toUpperCase() + value.slice(1);
|
|
337
|
+
|
|
338
|
+
const setupHost = async (name, config) => {
|
|
339
|
+
const options = config.setup[name];
|
|
340
|
+
if (!options) {
|
|
341
|
+
throw new Error(`Could not find initial setup configuration for ${capitalize(name)}`);
|
|
342
|
+
}
|
|
343
|
+
switch (name) {
|
|
344
|
+
case SupportedApplications.Values.jira:
|
|
345
|
+
return setupJira(ConfigureJira.parse(options));
|
|
346
|
+
case SupportedApplications.Values.confluence:
|
|
347
|
+
return setupConfluence(ConfigureConfluence.parse(options));
|
|
348
|
+
case SupportedApplications.Values.bitbucket:
|
|
349
|
+
console.log('Oopsie daisy 🌼 Atlassian Bitbucket does not require additional setup 🤖');
|
|
350
|
+
return true;
|
|
351
|
+
}
|
|
352
|
+
return true;
|
|
353
|
+
};
|
|
354
|
+
const setupJira = async (options) => {
|
|
355
|
+
try {
|
|
356
|
+
// Launch Google Chrome
|
|
357
|
+
const browser = await puppeteer.launch();
|
|
358
|
+
// Create the page view
|
|
359
|
+
const page = await browser.newPage();
|
|
360
|
+
await page.setViewport({ width: 1080, height: 1024 });
|
|
361
|
+
// Open the Setup page
|
|
362
|
+
console.log(`Starting automated initial setup of Atlassian Jira 🤖`);
|
|
363
|
+
await page.goto(options.baseUrl, { waitUntil: ['domcontentloaded', 'load', 'networkidle0'], timeout: 5 * 60 * 1000 });
|
|
364
|
+
// We need to make sure that progress has ended
|
|
365
|
+
const isStillLoading = !!await page.$('#progress');
|
|
366
|
+
if (isStillLoading) {
|
|
367
|
+
console.log('Waiting for Atlassian Jira to be ready... ⏳');
|
|
368
|
+
await page.waitForNavigation({ waitUntil: ['domcontentloaded', 'load', 'networkidle0'], timeout: 5 * 60 * 1000 });
|
|
369
|
+
}
|
|
370
|
+
// Set up application properties
|
|
371
|
+
const mustSetupApplicationProperties = !!await page.$('form[action="SetupApplicationProperties.jspa"]');
|
|
372
|
+
if (mustSetupApplicationProperties) {
|
|
373
|
+
console.log('Setting up application properties');
|
|
374
|
+
await page.locator('input[name=title]').fill(options.title);
|
|
375
|
+
await page.locator(`label[for=jira-setupwizard-mode-${options.mode}]`).click();
|
|
376
|
+
await page.locator('input[name=baseURL]').fill(options.baseUrl);
|
|
377
|
+
await page.locator('#jira-setupwizard-submit').click();
|
|
378
|
+
console.log('Waiting for the administrator account setup wizard to load... ⏳');
|
|
379
|
+
await page.waitForSelector('form[action="SetupAdminAccount.jspa"]', { timeout: 5 * 60 * 1000 });
|
|
380
|
+
}
|
|
381
|
+
// Set up administrator account
|
|
382
|
+
const mustSetupAdminAccount = !!await page.$('form[action="SetupAdminAccount.jspa"]');
|
|
383
|
+
if (mustSetupAdminAccount) {
|
|
384
|
+
console.log('Setting up the administrator account');
|
|
385
|
+
await page.locator('input[name=fullname]').fill(options.fullname);
|
|
386
|
+
await page.locator('input[name=email]').fill(options.email);
|
|
387
|
+
await page.locator('input[name=username]').fill(options.username);
|
|
388
|
+
await page.locator('input[name=password]').fill(options.password);
|
|
389
|
+
await page.locator('input[name=confirm]').fill(options.password);
|
|
390
|
+
await page.locator('#jira-setupwizard-submit').click();
|
|
391
|
+
console.log('Waiting for the email notification setup wizard to load... ⏳');
|
|
392
|
+
await page.waitForSelector('form[action="SetupMailNotifications.jspa"]', { timeout: 5 * 60 * 1000 });
|
|
393
|
+
}
|
|
394
|
+
// Set up email notifications
|
|
395
|
+
const mustSetupEmailNotification = !!await page.$('form[action="SetupMailNotifications.jspa"]');
|
|
396
|
+
if (mustSetupEmailNotification) {
|
|
397
|
+
console.log('Setting up the email notification settings');
|
|
398
|
+
const configureEmailNotifications = options.configureEmail === 'later' ? 'disabled' : 'enabled';
|
|
399
|
+
await page.locator(`label[for=jira-setupwizard-email-notifications-${configureEmailNotifications}]`).click();
|
|
400
|
+
await page.locator('#jira-setupwizard-submit').click();
|
|
401
|
+
console.log('Waiting for the language chooser to load... ⏳');
|
|
402
|
+
await page.waitForSelector('#choose-language-form', { timeout: 5 * 60 * 1000 });
|
|
403
|
+
}
|
|
404
|
+
// Welcome to Jira, Administrator!
|
|
405
|
+
const mustSetupLanguage = !!await page.$('#choose-language-form');
|
|
406
|
+
if (mustSetupLanguage) {
|
|
407
|
+
console.log('Setting up the language for the administrator account');
|
|
408
|
+
const languageSelector = !options.language || options.language === 'en-US' ? 'locale_-1' : `locale_${options.language}`;
|
|
409
|
+
await page.locator(`label[for=${languageSelector}]`).click();
|
|
410
|
+
await page.locator('#next').click();
|
|
411
|
+
console.log('Waiting for the avatar setup wizard to load... ⏳');
|
|
412
|
+
await page.waitForSelector('.onboarding-sequence-avatar-picker', { timeout: 5 * 60 * 1000 });
|
|
413
|
+
}
|
|
414
|
+
const mustSetupAvatar = !!await page.$('.onboarding-sequence-avatar-picker');
|
|
415
|
+
if (mustSetupAvatar) {
|
|
416
|
+
console.log('Setting up the avatar for the administrator account');
|
|
417
|
+
await page.locator('input.avatar-picker-done').click();
|
|
418
|
+
await page.waitForSelector('#onboarding', { timeout: 5 * 60 * 1000 });
|
|
419
|
+
}
|
|
420
|
+
// We're done here, let's wrap things up
|
|
421
|
+
console.log(`Finished automated initial setup of Atlassian Jira 💪`);
|
|
422
|
+
await page.close();
|
|
423
|
+
await browser.close();
|
|
424
|
+
return true;
|
|
425
|
+
}
|
|
426
|
+
catch (err) {
|
|
427
|
+
console.error('Failed to automatically setup Atlassian Jira');
|
|
428
|
+
console.log(err);
|
|
429
|
+
return false;
|
|
430
|
+
}
|
|
431
|
+
};
|
|
432
|
+
const setupConfluence = async (options) => {
|
|
433
|
+
try {
|
|
434
|
+
// Launch Google Chrome
|
|
435
|
+
const browser = await puppeteer.launch();
|
|
436
|
+
// Create the page view
|
|
437
|
+
const page = await browser.newPage();
|
|
438
|
+
await page.setViewport({ width: 1080, height: 1024 });
|
|
439
|
+
// Open the Setup page
|
|
440
|
+
console.log(`Starting automated initial setup of Atlassian Confluence 🤖`);
|
|
441
|
+
await page.goto(options.baseUrl, { waitUntil: ['domcontentloaded', 'load', 'networkidle0'], timeout: 5 * 60 * 1000 });
|
|
442
|
+
// Choose your deployment type
|
|
443
|
+
const mustChooseDeploymentType = !!await page.$('form[action="setupcluster.action"]');
|
|
444
|
+
if (mustChooseDeploymentType) {
|
|
445
|
+
console.log('Setting up deployment type');
|
|
446
|
+
const clusteringStatus = options.deploymentType === 'clustered' ? 'clusteringEnabled' : 'clusteringDisabled';
|
|
447
|
+
await page.locator(`label[for=${clusteringStatus}]`).click();
|
|
448
|
+
if (options.deploymentType === 'clustered') {
|
|
449
|
+
// TODO: add cluster options
|
|
450
|
+
await page.locator('button[name=newCluster]').click();
|
|
451
|
+
}
|
|
452
|
+
else {
|
|
453
|
+
await page.locator('#skip-button').click();
|
|
454
|
+
}
|
|
455
|
+
console.log('Waiting for the content chooser page to load... ⏳');
|
|
456
|
+
await page.waitForSelector('form[action="setupdata.action"]', { timeout: 5 * 60 * 1000 });
|
|
457
|
+
}
|
|
458
|
+
// Load Content
|
|
459
|
+
const mustLoadContent = !!await page.$('form[action="setupdata.action"]');
|
|
460
|
+
if (mustLoadContent) {
|
|
461
|
+
if (options.loadContent === 'example') {
|
|
462
|
+
await page.locator('#demoChoiceForm > input[type=submit]').click();
|
|
463
|
+
}
|
|
464
|
+
else {
|
|
465
|
+
await page.locator('#blankChoiceForm > input[type=submit]').click();
|
|
466
|
+
}
|
|
467
|
+
console.log('Waiting for the user management configuration page to load... ⏳');
|
|
468
|
+
await page.waitForSelector('form[action="setupusermanagementchoice.action"]', { timeout: 5 * 60 * 1000 });
|
|
469
|
+
}
|
|
470
|
+
// Configure User Management
|
|
471
|
+
const mustConfigureUserManagement = !!await page.$('form[action="setupusermanagementchoice.action"]');
|
|
472
|
+
if (mustConfigureUserManagement) {
|
|
473
|
+
if (options.userManagement === 'confluence') {
|
|
474
|
+
await page.locator('#internal').click();
|
|
475
|
+
console.log('Waiting for the system administration account configuration page to load... ⏳');
|
|
476
|
+
await page.waitForSelector('form[action="setupadministrator.action"]', { timeout: 5 * 60 * 1000 });
|
|
477
|
+
}
|
|
478
|
+
else {
|
|
479
|
+
await page.locator('#jaacs').click();
|
|
480
|
+
console.log('Waiting for the Connect to Jira page to load... ⏳');
|
|
481
|
+
await page.waitForSelector('form[action="connecttojira.action"]', { timeout: 5 * 60 * 1000 });
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
// Configure System Administrator Account
|
|
485
|
+
const mustConfigureAdministratorAccount = !!await page.$('form[action="setupadministrator.action"]');
|
|
486
|
+
if (mustConfigureAdministratorAccount) {
|
|
487
|
+
console.log('Configuring the administrator account');
|
|
488
|
+
await page.locator('input[name=username]').fill(options.username);
|
|
489
|
+
await page.locator('input[name=fullName]').fill(options.fullName);
|
|
490
|
+
await page.locator('input[name=email]').fill(options.email);
|
|
491
|
+
await page.locator('input[name=password]').fill(options.password);
|
|
492
|
+
await page.locator('input[name=confirm]').fill(options.password);
|
|
493
|
+
await page.locator('#setup-next-button').click();
|
|
494
|
+
console.log('Waiting for the setup successful notification to load... ⏳');
|
|
495
|
+
await page.waitForSelector('a.finishAction', { timeout: 5 * 60 * 1000 });
|
|
496
|
+
}
|
|
497
|
+
const mustFinishSetup = !!await page.$('a.finishAction');
|
|
498
|
+
if (mustFinishSetup) {
|
|
499
|
+
console.log('Finalizing initial Confluence setup');
|
|
500
|
+
await page.locator('a.finishAction').click();
|
|
501
|
+
console.log('Waiting for the initial space creation form to load... ⏳');
|
|
502
|
+
await page.waitForSelector('#grow-intro-create-space', { timeout: 5 * 60 * 1000 });
|
|
503
|
+
}
|
|
504
|
+
// We're done here, let's wrap things up
|
|
505
|
+
console.log(`Finished automated initial setup of Atlassian Confluence 💪`);
|
|
506
|
+
await page.close();
|
|
507
|
+
await browser.close();
|
|
508
|
+
return true;
|
|
509
|
+
}
|
|
510
|
+
catch (err) {
|
|
511
|
+
console.error('Failed to automatically setup Atlassian Confluence');
|
|
512
|
+
console.log(err);
|
|
513
|
+
return false;
|
|
514
|
+
}
|
|
515
|
+
};
|
|
516
|
+
|
|
517
|
+
const showHelpWithDefaultCommandOptions = {
|
|
518
|
+
visibleOptions: (cmd) => {
|
|
519
|
+
let options = cmd.options;
|
|
520
|
+
if (!cmd.parent && options.length === 0) {
|
|
521
|
+
const defaultCommandName = cmd._defaultCommandName;
|
|
522
|
+
if (defaultCommandName) {
|
|
523
|
+
const defaultCommand = cmd.commands.find(item => item._name === defaultCommandName);
|
|
524
|
+
if (defaultCommand) {
|
|
525
|
+
options = defaultCommand.options;
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
return Array.from(options);
|
|
530
|
+
}
|
|
531
|
+
};
|
|
532
|
+
|
|
533
|
+
const program = new Command$1();
|
|
534
|
+
const Command = () => {
|
|
535
|
+
return {
|
|
536
|
+
action: async (options) => {
|
|
537
|
+
const config = await getConfig(options.config, options.cwd);
|
|
538
|
+
await setupHost(options.product, config);
|
|
539
|
+
},
|
|
540
|
+
errorHandler: async () => {
|
|
541
|
+
}
|
|
542
|
+
};
|
|
543
|
+
};
|
|
544
|
+
program
|
|
545
|
+
.name('dcdx configure')
|
|
546
|
+
.description(`Automated initial setup of the host application
|
|
547
|
+
If you wish to run a specific host application, call this command with 'dcdx configure <name>'`)
|
|
548
|
+
.addHelpText('afterAll', '') // there is a non-zero white space because the only reason to have this is to force a line break
|
|
549
|
+
.configureHelp(showHelpWithDefaultCommandOptions)
|
|
550
|
+
.allowUnknownOption(false)
|
|
551
|
+
.allowExcessArguments(false)
|
|
552
|
+
.showHelpAfterError(true);
|
|
553
|
+
program
|
|
554
|
+
.command('default', { isDefault: true, hidden: true })
|
|
555
|
+
.addOption(new Option('-p, --product <name>', 'The name of the host application').choices(Object.values(SupportedApplications.Values)))
|
|
556
|
+
.addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
|
|
557
|
+
.addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
|
|
558
|
+
.addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
|
|
559
|
+
.action(options => ActionHandler(program, Command(), options));
|
|
560
|
+
program
|
|
561
|
+
.command(SupportedApplications.Values.jira)
|
|
562
|
+
.description('Automated initial setup of Atlassian Jira')
|
|
563
|
+
.addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
|
|
564
|
+
.addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
|
|
565
|
+
.addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
|
|
566
|
+
.action(options => ActionHandler(program, Command(), { ...options, name: SupportedApplications.Values.jira }));
|
|
567
|
+
program
|
|
568
|
+
.command(SupportedApplications.Values.confluence)
|
|
569
|
+
.description('Automated initial setup of Atlassian Confluence')
|
|
570
|
+
.addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
|
|
571
|
+
.addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
|
|
572
|
+
.addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
|
|
573
|
+
.action(options => ActionHandler(program, Command(), { ...options, name: SupportedApplications.Values.confluence }));
|
|
574
|
+
program
|
|
575
|
+
.command(SupportedApplications.Values.bamboo)
|
|
576
|
+
.description('Automated initial setup of Atlassian Bamboo')
|
|
577
|
+
.addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
|
|
578
|
+
.addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
|
|
579
|
+
.addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
|
|
580
|
+
.action(options => ActionHandler(program, Command(), { ...options, name: SupportedApplications.Values.bamboo }));
|
|
581
|
+
program
|
|
582
|
+
.command(SupportedApplications.Values.bitbucket)
|
|
583
|
+
.description('Automated initial setup of Atlassian Bitbucket')
|
|
584
|
+
.addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
|
|
585
|
+
.addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
|
|
586
|
+
.addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
|
|
587
|
+
.action(options => ActionHandler(program, Command(), { ...options, name: SupportedApplications.Values.bitbucket }));
|
|
588
|
+
program.parseAsync().catch(() => gracefulExit(1));
|
|
589
|
+
process.on('SIGINT', () => {
|
|
590
|
+
console.log(`Received term signal, trying to stop gracefully 💪`);
|
|
591
|
+
gracefulExit();
|
|
592
|
+
});
|
|
593
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJlLmpzIiwic291cmNlcyI6WyIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL0FjdGlvbkhhbmRsZXIuanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL3RvQWJzb2x1dGVQYXRoLmpzIiwiLi4vLi4vZGlzdC9zcmMvaGVscGVycy9nZXRWZXJzaW9ucy5qcyIsIi4uLy4uL2Rpc3Qvc3JjL3R5cGVzL0RhdGFiYXNlLmpzIiwiLi4vLi4vZGlzdC9zcmMvdHlwZXMvQXBwbGljYXRpb24uanMiLCIuLi8uLi9kaXN0L3NyYy90eXBlcy9Db25maWd1cmUuanMiLCIuLi8uLi9kaXN0L3NyYy90eXBlcy9Db25maWcuanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL2dldENvbmZpZy5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2hlbHBlcnMvY2FwaXRhbGl6ZS5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2hlbHBlcnMvc2V0dXBIb3N0LmpzIiwiLi4vLi4vZGlzdC9zcmMvaGVscGVycy9zaG93SGVscFdpdGhEZWZhdWx0Q29tbWFuZE9wdGlvbnMuanMiLCIuLi8uLi9kaXN0L3NyYy9jb21tYW5kcy9jb25maWd1cmUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXN5bmNFeGl0SG9vaywgZ3JhY2VmdWxFeGl0IH0gZnJvbSAnZXhpdC1ob29rJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuZXhwb3J0IGNvbnN0IEFjdGlvbkhhbmRsZXIgPSBhc3luYyAocHJvZ3JhbSwgeyBhY3Rpb24sIGVycm9ySGFuZGxlciB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3BzID0gb3B0aW9ucyB8fCBwcm9ncmFtLm9wdHMoKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgoXywgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSAnJztcbiAgICAgICAgYXN5bmNFeGl0SG9vayhhc3luYyAoY29kZSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlcnJvckhhbmRsZXIob3BzKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgcmVqZWN0aW5nIHRoZSBwcm9taXNlIHRvIGF2b2lkIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBcIkNhbGxpbmcgcHJvY2Vzcy5leGl0XCIgbG9nIG1lc3NhZ2UgZnJvbSBleGl0LWhvb2tcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycjtcbiAgICAgICAgICAgICAgICByZWplY3QobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHdhaXQ6IDYwICogMSAqIDEwMDBcbiAgICAgICAgfSk7XG4gICAgICAgIGFjdGlvbihvcHMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZ3JhY2VmdWxFeGl0KDApO1xuICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIHouWm9kRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnIuaXNzdWVzLmZvckVhY2goaXNzdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFVuYWJsZSB0byBwYXJzZSBvcHRpb24gJHtpc3N1ZS5wYXRoLmpvaW4oJywnKX06ICR7aXNzdWUubWVzc2FnZX1cXG5gO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgfHwgdHlwZW9mIGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyYWNlZnVsRXhpdCgxKTtcbiAgICAgICAgfSk7XG4gICAgfSkuY2F0Y2gobWVzc2FnZSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwcm9ncmFtLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZSxcbiAgICAgICAgICAgIC8vIHdlIGNhbiBhc3N1bWUgYSBjbGVhbiBleGl0XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG4iLCJpbXBvcnQgeyByZWFscGF0aFN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSAncGF0aCc7XG5leHBvcnQgY29uc3QgdG9BYnNvbHV0ZVBhdGggPSAocmVsYXRpdmVQYXRoKSA9PiB7XG4gICAgY29uc3QgWywgZmlsZVBhdGhdID0gcHJvY2Vzcy5hcmd2O1xuICAgIGNvbnN0IGV4ZWN1dGFibGVGaWxlRGlyID0gZGlybmFtZShyZWFscGF0aFN5bmMoZmlsZVBhdGgpKTtcbiAgICBjb25zdCBiYXNlZGlyID0gZXhlY3V0YWJsZUZpbGVEaXIuc3Vic3RyaW5nKDAsIGV4ZWN1dGFibGVGaWxlRGlyLmluZGV4T2YoJ2RjZHgnKSArIDQpO1xuICAgIHJldHVybiBqb2luKGJhc2VkaXIsIHJlbGF0aXZlUGF0aC5yZXBsYWNlQWxsKCcuLi8nLCAnJykpO1xufTtcbiIsImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IHRvQWJzb2x1dGVQYXRoIH0gZnJvbSAnLi90b0Fic29sdXRlUGF0aCc7XG5leHBvcnQgY29uc3QgZ2V0VmVyc2lvbnMgPSAoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyh0b0Fic29sdXRlUGF0aCgnLi4vLi4vYXNzZXRzL3ZlcnNpb25zLmpzb24nKSwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgdmVyc2lvbnMgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgIHJldHVybiB2ZXJzaW9ucztcbn07XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IGdldFZlcnNpb25zIH0gZnJvbSAnLi4vaGVscGVycy9nZXRWZXJzaW9ucyc7XG5jb25zdCB2ZXJzaW9ucyA9IGdldFZlcnNpb25zKCk7XG5leHBvcnQgY29uc3QgU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzID0gei5lbnVtKFtcbiAgICAncG9zdGdyZXNxbCcsXG4gICAgJ215c3FsJyxcbiAgICAnbXNzcWwnXG5dKTtcbmV4cG9ydCBjb25zdCBTdXBwb3J0ZWRNU1NRTEVkaXRpb25zID0gei5lbnVtKFtcbiAgICAnRGV2ZWxvcGVyJyxcbiAgICAnRXhwcmVzcycsXG4gICAgJ1N0YW5kYXJkJyxcbiAgICAnRW50ZXJwcmlzZScsXG4gICAgJ0VudGVycHJpc2VDb3JlJ1xuXSk7XG5leHBvcnQgY29uc3QgRGF0YWJhc2VPcHRpb25zID0gei5vYmplY3Qoe1xuICAgIG5hbWU6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcyxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSksXG4gICAgZGF0YWJhc2U6IHouc3RyaW5nKCkuZGVmYXVsdCgnZGNkeCcpLFxuICAgIHVzZXJuYW1lOiB6LnN0cmluZygpLmRlZmF1bHQoJ2RjZHgnKSxcbiAgICBwYXNzd29yZDogei5zdHJpbmcoKS5kZWZhdWx0KCdkY2R4JyksXG4gICAgY2xlYW46IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIHBydW5lOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICB2ZXJib3NlOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKClcbn0pO1xuZXhwb3J0IGNvbnN0IFBvc3RncmVTUUxPcHRpb25zID0gRGF0YWJhc2VPcHRpb25zLmV4dGVuZCh7XG4gICAgbmFtZTogU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLnJlZmluZShpdGVtID0+IGl0ZW0gPT09IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5WYWx1ZXMucG9zdGdyZXNxbCkuZGVmYXVsdChTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLnBvc3RncmVzcWwpLFxuICAgIHRhZzogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiB2ZXJzaW9uc1tTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLnBvc3RncmVzcWxdLmluY2x1ZGVzKGl0ZW0pKS5kZWZhdWx0KCdsYXRlc3QnKSxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSkuZGVmYXVsdCg1NDMyKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gJ29yZy5wb3N0Z3Jlc3FsLkRyaXZlcicpLmRlZmF1bHQoJ29yZy5wb3N0Z3Jlc3FsLkRyaXZlcicpXG59KTtcbmV4cG9ydCBjb25zdCBNeVNRTE9wdGlvbnMgPSBEYXRhYmFzZU9wdGlvbnMuZXh0ZW5kKHtcbiAgICBuYW1lOiBTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLlZhbHVlcy5teXNxbCkuZGVmYXVsdChTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm15c3FsKSxcbiAgICB0YWc6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gdmVyc2lvbnNbU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLlZhbHVlcy5teXNxbF0uaW5jbHVkZXMoaXRlbSkpLmRlZmF1bHQoJ2xhdGVzdCcpLFxuICAgIHBvcnQ6IHoubnVtYmVyKCkub3Ioei5zdHJpbmcoKS50cmFuc2Zvcm0oTnVtYmVyKS5yZWZpbmUoaXRlbSA9PiAhaXNOYU4oaXRlbSkpKS5kZWZhdWx0KDMzMDYpLFxuICAgIGRyaXZlcjogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSAnY29tLm15c3FsLmpkYmMuRHJpdmVyJykuZGVmYXVsdCgnY29tLm15c3FsLmpkYmMuRHJpdmVyJylcbn0pO1xuZXhwb3J0IGNvbnN0IE1TU1FMT3B0aW9ucyA9IERhdGFiYXNlT3B0aW9ucy5leHRlbmQoe1xuICAgIG5hbWU6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSBTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm1zc3FsKS5kZWZhdWx0KFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5WYWx1ZXMubXNzcWwpLFxuICAgIHRhZzogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiB2ZXJzaW9uc1tTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm1zc3FsXS5pbmNsdWRlcyhpdGVtKSkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgZWRpdGlvbjogU3VwcG9ydGVkTVNTUUxFZGl0aW9ucy5kZWZhdWx0KCdEZXZlbG9wZXInKSxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSkuZGVmYXVsdCgxNDMzKSxcbiAgICB1c2VybmFtZTogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSAnc2EnKS5kZWZhdWx0KCdzYScpLFxuICAgIHBhc3N3b3JkOiB6LnN0cmluZygpLmRlZmF1bHQoJ0RhdGFDZW50ZXJEWCEnKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gJ2NvbS5taWNyb3NvZnQuc3Fsc2VydmVyLmpkYmMuU1FMU2VydmVyRHJpdmVyJykuZGVmYXVsdCgnY29tLm1pY3Jvc29mdC5zcWxzZXJ2ZXIuamRiYy5TUUxTZXJ2ZXJEcml2ZXInKVxufSk7XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcyB9IGZyb20gJy4vRGF0YWJhc2UnO1xuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZEFwcGxpY2F0aW9ucyA9IHouZW51bShbXG4gICAgJ2ppcmEnLFxuICAgICdjb25mbHVlbmNlJyxcbiAgICAnYml0YnVja2V0JyxcbiAgICAnYmFtYm9vJ1xuXSk7XG5leHBvcnQgY29uc3QgQXBwbGljYXRpb25PcHRpb25zID0gei5vYmplY3Qoe1xuICAgIG5hbWU6IFN1cHBvcnRlZEFwcGxpY2F0aW9ucyxcbiAgICB0YWc6IHouc3RyaW5nKCkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgZGF0YWJhc2U6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5kZWZhdWx0KCdwb3N0Z3Jlc3FsJyksXG4gICAgZGF0YWJhc2VUYWc6IHouc3RyaW5nKCkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgcG9ydDogei5zdHJpbmcoKS50cmFuc2Zvcm0oTnVtYmVyKS5yZWZpbmUoaXRlbSA9PiAhaXNOYU4oaXRlbSkpLmRlZmF1bHQoJzgwJyksXG4gICAgY29udGV4dFBhdGg6IHouc3RyaW5nKCksXG4gICAgeG1zOiB6LnN0cmluZygpLmRlZmF1bHQoJzEwMjRtJyksXG4gICAgeG14OiB6LnN0cmluZygpLmRlZmF1bHQoJzEwMjRtJyksXG4gICAgd2F0Y2g6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIGV4dDogei5hcnJheSh6LnN0cmluZygpKSxcbiAgICBpbnN0YWxsOiB6LmJvb2xlYW4oKSxcbiAgICBvdXRwdXREaXJlY3Rvcnk6IHouc3RyaW5nKCksXG4gICAgYWN0aXZhdGVQcm9maWxlczogei5zdHJpbmcoKSxcbiAgICBjb25maWd1cmU6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIGNsZWFuOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICBwcnVuZTogei5ib29sZWFuKCkuZGVmYXVsdChmYWxzZSksXG4gICAgZGVidWc6IHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSksXG4gICAganZtOiB6LnN0cmluZygpLFxuICAgIGN3ZDogei5zdHJpbmcoKVxufSkucGFydGlhbCh7XG4gICAgY29udGV4dFBhdGg6IHRydWUsXG4gICAgZXh0OiB0cnVlLFxuICAgIGluc3RhbGw6IHRydWUsXG4gICAgb3V0cHV0RGlyZWN0b3J5OiB0cnVlLFxuICAgIGFjdGl2YXRlUHJvZmlsZXM6IHRydWUsXG4gICAganZtOiB0cnVlLFxuICAgIGN3ZDogdHJ1ZVxufSk7XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IFN1cHBvcnRlZEFwcGxpY2F0aW9ucyB9IGZyb20gJy4vQXBwbGljYXRpb24nO1xuZXhwb3J0IGNvbnN0IENvbmZpZ3VyZU9wdGlvbnMgPSB6Lm9iamVjdCh7XG4gICAgcHJvZHVjdDogU3VwcG9ydGVkQXBwbGljYXRpb25zLFxuICAgIGNvbmZpZzogei5zdHJpbmcoKSxcbiAgICBjd2Q6IHouc3RyaW5nKClcbn0pLnBhcnRpYWwoe1xuICAgIGNvbmZpZzogdHJ1ZSxcbiAgICBjd2Q6IHRydWVcbn0pO1xuZXhwb3J0IGNvbnN0IENvbmZpZ3VyZUJhc2UgPSB6Lm9iamVjdCh7XG4gICAgdXNlcm5hbWU6IHouc3RyaW5nKCksXG4gICAgcGFzc3dvcmQ6IHouc3RyaW5nKClcbn0pO1xuZXhwb3J0IGNvbnN0IENvbmZpZ3VyZUppcmEgPSBDb25maWd1cmVCYXNlLmV4dGVuZCh7XG4gICAgdGl0bGU6IHouc3RyaW5nKCksXG4gICAgbW9kZTogei5lbnVtKFsncHJpdmF0ZScsICdwdWJsaWMnXSksXG4gICAgYmFzZVVybDogei5zdHJpbmcoKSxcbiAgICBmdWxsbmFtZTogei5zdHJpbmcoKSxcbiAgICBlbWFpbDogei5zdHJpbmcoKSxcbiAgICBjb25maWd1cmVFbWFpbDogei5lbnVtKFsnbGF0ZXInLCAnbm93J10pLFxuICAgIGVtYWlsTmFtZTogei5zdHJpbmcoKSxcbiAgICBlbWFpbEZyb21BZGRyZXNzOiB6LnN0cmluZygpLFxuICAgIGVtYWlsUHJlZml4OiB6LnN0cmluZygpLFxuICAgIGVtYWlsU2VydmVyVHlwZTogei5lbnVtKFsnc210cCcsICdqbmRpJ10pLFxuICAgIGVtYWlsSm5kaUxvY2F0aW9uOiB6LnN0cmluZygpLFxuICAgIGVtYWlsU2VydmljZVByb3ZpZGVyOiB6LmVudW0oWydjdXN0b20nLCAnZ29vZ2xlLWFwcHMtbWFpbC0vLWdtYWlsLTgnLCAneWFob28hLW1haWwtcGx1cy05J10pLFxuICAgIGVtYWlsSG9zdE5hbWU6IHouc3RyaW5nKCksXG4gICAgZW1haWxQcm90b2NvbDogei5lbnVtKFsnU01UUCcsICdTRUNVUkVfU01UUCddKSxcbiAgICBlbWFpbFBvcnQ6IHoubnVtYmVyKCksXG4gICAgZW1haWxUaW1lb3V0OiB6Lm51bWJlcigpLFxuICAgIGVtYWlsVExTOiB6LmJvb2xlYW4oKSxcbiAgICBlbWFpbFVzZXJuYW1lOiB6LnN0cmluZygpLFxuICAgIGVtYWlsUGFzc3dvcmQ6IHouc3RyaW5nKCksXG4gICAgbGFuZ3VhZ2U6IHouZW51bShbXG4gICAgICAgICdlbi1VUycsXG4gICAgICAgICd6aF9DTicsXG4gICAgICAgICdjc19DWicsXG4gICAgICAgICdkYV9ESycsXG4gICAgICAgICdubF9OTCcsXG4gICAgICAgICdlbl9VSycsXG4gICAgICAgICdldF9FRScsXG4gICAgICAgICdmaV9GSScsXG4gICAgICAgICdmcl9GUicsXG4gICAgICAgICdkZV9ERScsXG4gICAgICAgICdodV9IVScsXG4gICAgICAgICdpc19JUycsXG4gICAgICAgICdpdF9JVCcsXG4gICAgICAgICdqYV9KUCcsXG4gICAgICAgICdrb19LUicsXG4gICAgICAgICdub19OTycsXG4gICAgICAgICdwbF9QTCcsXG4gICAgICAgICdwdF9CUicsXG4gICAgICAgICdyb19STycsXG4gICAgICAgICdydV9SVScsXG4gICAgICAgICdza19TSycsXG4gICAgICAgICdlc19FUycsXG4gICAgICAgICdzdl9TRSdcbiAgICBdKSxcbiAgICBhdmF0YXJQYXRoOiB6LnN0cmluZygpXG59KS5wYXJ0aWFsKHtcbiAgICBlbWFpbE5hbWU6IHRydWUsXG4gICAgZW1haWxGcm9tQWRkcmVzczogdHJ1ZSxcbiAgICBlbWFpbFByZWZpeDogdHJ1ZSxcbiAgICBlbWFpbFNlcnZlclR5cGU6IHRydWUsXG4gICAgZW1haWxKbmRpTG9jYXRpb246IHRydWUsXG4gICAgZW1haWxTZXJ2aWNlUHJvdmlkZXI6IHRydWUsXG4gICAgZW1haWxIb3N0TmFtZTogdHJ1ZSxcbiAgICBlbWFpbFByb3RvY29sOiB0cnVlLFxuICAgIGVtYWlsUG9ydDogdHJ1ZSxcbiAgICBlbWFpbFRpbWVvdXQ6IHRydWUsXG4gICAgZW1haWxUTFM6IHRydWUsXG4gICAgZW1haWxVc2VybmFtZTogdHJ1ZSxcbiAgICBlbWFpbFBhc3N3b3JkOiB0cnVlLFxuICAgIGxhbmd1YWdlOiB0cnVlLFxuICAgIGF2YXRhclBhdGg6IHRydWVcbn0pLmRlZmF1bHQoe1xuICAgIHRpdGxlOiAnSmlyYScsXG4gICAgbW9kZTogJ3ByaXZhdGUnLFxuICAgIGJhc2VVcmw6ICdodHRwOi8vbG9jYWxob3N0JyxcbiAgICBmdWxsbmFtZTogJ0FkbWluaXN0cmF0b3InLFxuICAgIGVtYWlsOiAnYWRtaW5AZXhhbXBsZS5vcmcnLFxuICAgIGNvbmZpZ3VyZUVtYWlsOiAnbGF0ZXInLFxuICAgIHVzZXJuYW1lOiAnYWRtaW4nLFxuICAgIHBhc3N3b3JkOiAnYWRtaW4nXG59KTtcbmV4cG9ydCBjb25zdCBDb25maWd1cmVDb25mbHVlbmNlID0gQ29uZmlndXJlQmFzZS5leHRlbmQoe1xuICAgIGJhc2VVcmw6IHouc3RyaW5nKCksXG4gICAgZGVwbG95bWVudFR5cGU6IHouZW51bShbJ25vbi1jbHVzdGVyZWQnLCAnY2x1c3RlcmVkJ10pLFxuICAgIGZ1bGxOYW1lOiB6LnN0cmluZygpLFxuICAgIGVtYWlsOiB6LnN0cmluZygpLFxuICAgIGNsdXN0ZXJOYW1lOiB6LnN0cmluZygpLFxuICAgIGNsdXN0ZXJIb21lOiB6LnN0cmluZygpLFxuICAgIGNsdXN0ZXJKb2luTW9kZTogei5lbnVtKFsndXNlTXVsdGljYXN0JywgJ3VzZVRjcElwJywgJ3VzZUF3cyddKSxcbiAgICBjbHVzdGVyQXV0b0FkZHJlc3M6IHouYm9vbGVhbigpLFxuICAgIGxvYWRDb250ZW50OiB6LmVudW0oWydleGFtcGxlJywgJ2VtcHR5J10pLFxuICAgIHVzZXJNYW5hZ2VtZW50OiB6LmVudW0oWydjb25mbHVlbmNlJywgJ2ppcmEnXSksXG4gICAgamlyYUJhc2VVcmw6IHouc3RyaW5nKCksXG4gICAgamlyYVVzZXJuYW1lOiB6LnN0cmluZygpLFxuICAgIGppcmFQYXNzd29yZDogei5zdHJpbmcoKSxcbiAgICBqaXJhVXNlckdyb3Vwczogei5zdHJpbmcoKSxcbiAgICBqaXJhQWRtaW5Hcm91cHM6IHouc3RyaW5nKCksXG59KS5wYXJ0aWFsKHtcbiAgICBjbHVzdGVyTmFtZTogdHJ1ZSxcbiAgICBjbHVzdGVySG9tZTogdHJ1ZSxcbiAgICBjbHVzdGVySm9pbk1vZGU6IHRydWUsXG4gICAgY2x1c3RlckF1dG9BZGRyZXNzOiB0cnVlLFxuICAgIGppcmFCYXNlVXJsOiB0cnVlLFxuICAgIGppcmFVc2VybmFtZTogdHJ1ZSxcbiAgICBqaXJhUGFzc3dvcmQ6IHRydWUsXG4gICAgamlyYVVzZXJHcm91cHM6IHRydWUsXG4gICAgamlyYUFkbWluR3JvdXBzOiB0cnVlXG59KS5kZWZhdWx0KHtcbiAgICBiYXNlVXJsOiAnaHR0cDovL2xvY2FsaG9zdCcsXG4gICAgZGVwbG95bWVudFR5cGU6ICdub24tY2x1c3RlcmVkJyxcbiAgICBmdWxsTmFtZTogJ0FkbWluaXN0cmF0b3InLFxuICAgIGVtYWlsOiAnYWRtaW5AZXhhbXBsZS5vcmcnLFxuICAgIGxvYWRDb250ZW50OiAnZW1wdHknLFxuICAgIHVzZXJNYW5hZ2VtZW50OiAnY29uZmx1ZW5jZScsXG4gICAgdXNlcm5hbWU6ICdhZG1pbicsXG4gICAgcGFzc3dvcmQ6ICdhZG1pbidcbn0pO1xuZXhwb3J0IGNvbnN0IENvbmZpZ3VyZUJpdGJ1Y2tldCA9IENvbmZpZ3VyZUJhc2UuZXh0ZW5kKHt9KS5kZWZhdWx0KHtcbiAgICB1c2VybmFtZTogJ2FkbWluJyxcbiAgICBwYXNzd29yZDogJ2FkbWluJ1xufSk7XG5leHBvcnQgY29uc3QgQ29uZmlndXJlQmFtYm9vID0gQ29uZmlndXJlQmFzZS5leHRlbmQoe30pLmRlZmF1bHQoe1xuICAgIHVzZXJuYW1lOiAnYWRtaW4nLFxuICAgIHBhc3N3b3JkOiAnYWRtaW4nXG59KTtcbiIsImltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuaW1wb3J0IHsgU3VwcG9ydGVkQXBwbGljYXRpb25zIH0gZnJvbSAnLi9BcHBsaWNhdGlvbic7XG5pbXBvcnQgeyBDb25maWd1cmVCYW1ib28sIENvbmZpZ3VyZUJpdGJ1Y2tldCwgQ29uZmlndXJlQ29uZmx1ZW5jZSwgQ29uZmlndXJlSmlyYSB9IGZyb20gJy4vQ29uZmlndXJlJztcbmV4cG9ydCBjb25zdCBDb25maWcgPSB6Lm9iamVjdCh7XG4gICAgc2V0dXA6IHoub2JqZWN0KHtcbiAgICAgICAgW1N1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuamlyYV06IENvbmZpZ3VyZUppcmEsXG4gICAgICAgIFtTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmNvbmZsdWVuY2VdOiBDb25maWd1cmVDb25mbHVlbmNlLFxuICAgICAgICBbU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5iYW1ib29dOiBDb25maWd1cmVCYW1ib28sXG4gICAgICAgIFtTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmJpdGJ1Y2tldF06IENvbmZpZ3VyZUJpdGJ1Y2tldFxuICAgIH0pLnBhcnRpYWwoKVxufSkuZGVmYXVsdCh7XG4gICAgc2V0dXA6IHtcbiAgICAgICAgW1N1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuamlyYV06IENvbmZpZ3VyZUppcmEucGFyc2UodW5kZWZpbmVkKSxcbiAgICAgICAgW1N1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuY29uZmx1ZW5jZV06IENvbmZpZ3VyZUNvbmZsdWVuY2UucGFyc2UodW5kZWZpbmVkKSxcbiAgICAgICAgW1N1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuYmFtYm9vXTogQ29uZmlndXJlQmFtYm9vLnBhcnNlKHVuZGVmaW5lZCksXG4gICAgICAgIFtTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmJpdGJ1Y2tldF06IENvbmZpZ3VyZUJpdGJ1Y2tldC5wYXJzZSh1bmRlZmluZWQpXG4gICAgfVxufSk7XG4iLCIvKlxuICBDb2RlIGF0cnJpYnV0aW9uXG4gIGJvcnJvd2VkIHNvbWUgbG9naWMgZm9yIGxvYWRpbmcgY29uZmlndXJhdGlvbiBmaWxlcyBmcm9tIEVTTGludFxuICBodHRwczovL2dpdGh1Yi5jb20vZXNsaW50L2VzbGludC9ibG9iL21haW4vbGliL2NvbmZpZy9jb25maWctbG9hZGVyLmpzXG4qL1xuaW1wb3J0IHsgZXhpc3RzU3luYywgc3RhdFN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBpc0Fic29sdXRlLCBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBwYXRoVG9GaWxlVVJMIH0gZnJvbSAndXJsJztcbmltcG9ydCB7IENvbmZpZyB9IGZyb20gJy4uL3R5cGVzL0NvbmZpZyc7XG5leHBvcnQgY29uc3QgZ2V0Q29uZmlnID0gYXN5bmMgKHBhdGgsIGN3ZCkgPT4ge1xuICAgIGxldCBjb25maWc7XG4gICAgY29uc3QgZGlyZWN0b3J5ID0gY3dkIHx8IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgY29uZmlnRmlsZSA9IHBhdGggfHwgJ2RjZHguY29uZmlnLm1qcyc7XG4gICAgY29uc3QgY29uZmlnUGF0aCA9IGlzQWJzb2x1dGUoY29uZmlnRmlsZSkgJiYgZXhpc3RzU3luYyhjb25maWdGaWxlKSA/IGNvbmZpZ0ZpbGUgOiBqb2luKGRpcmVjdG9yeSwgY29uZmlnRmlsZSk7XG4gICAgaWYgKGV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICAgICAgLypcbiAgICAgICAgKiBFeHBsYW5hdGlvbiBjb3BpZWQgZnJvbSBFU0xpbnRcbiAgICAgICAgKlxuICAgICAgICAqIEFwcGVuZCBhIHF1ZXJ5IHdpdGggdGhlIGNvbmZpZyBmaWxlJ3MgbW9kaWZpY2F0aW9uIHRpbWUgKGBtdGltZWApIGluIG9yZGVyXG4gICAgICAgICogdG8gaW1wb3J0IHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGNvbmZpZyBmaWxlLiBXaXRob3V0IHRoZSBxdWVyeSwgYGltcG9ydCgpYCB3b3VsZFxuICAgICAgICAqIGNhY2hlIHRoZSBjb25maWcgZmlsZSBtb2R1bGUgYnkgdGhlIHBhdGhuYW1lIG9ubHksIGFuZCB0aGVuIGFsd2F5cyByZXR1cm5cbiAgICAgICAgKiB0aGUgc2FtZSB2ZXJzaW9uICh0aGUgb25lIHRoYXQgd2FzIGFjdHVhbCB3aGVuIHRoZSBtb2R1bGUgd2FzIGltcG9ydGVkIGZvciB0aGUgZmlyc3QgdGltZSkuXG4gICAgICAgICpcbiAgICAgICAgKiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgY29uZmlnIGZpbGUgbW9kdWxlIGlzIGxvYWRlZCBhbmQgZXhlY3V0ZWQgYWdhaW5cbiAgICAgICAgKiBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IHRpbWUgaXQgd2FzIGltcG9ydGVkLlxuICAgICAgICAqIElmIGl0IGhhc24ndCBiZWVuIGNoYW5nZWQsIGBpbXBvcnQoKWAgd2lsbCBqdXN0IHJldHVybiB0aGUgY2FjaGVkIHZlcnNpb24uXG4gICAgICAgICpcbiAgICAgICAgKiBOb3RlIHRoYXQgd2Ugc2hvdWxkIG5vdCBvdmVydXNlIHF1ZXJpZXMgKGUuZy4sIGJ5IGFwcGVuZGluZyB0aGUgY3VycmVudCB0aW1lXG4gICAgICAgICogdG8gYWx3YXlzIHJlbG9hZCB0aGUgY29uZmlnIGZpbGUgbW9kdWxlKSBhcyB0aGF0IGNvdWxkIGNhdXNlIG1lbW9yeSBsZWFrc1xuICAgICAgICAqIGJlY2F1c2UgZW50cmllcyBhcmUgbmV2ZXIgcmVtb3ZlZCBmcm9tIHRoZSBpbXBvcnQgY2FjaGUuXG4gICAgICAgICovXG4gICAgICAgIGNvbnN0IG10aW1lID0gc3RhdFN5bmMoY29uZmlnUGF0aCkubXRpbWUuZ2V0VGltZSgpO1xuICAgICAgICBjb25zdCBmaWxlVVJMID0gcGF0aFRvRmlsZVVSTChjb25maWdQYXRoKTtcbiAgICAgICAgZmlsZVVSTC5zZWFyY2hQYXJhbXMuYXBwZW5kKCdtdGltZScsIG10aW1lLnRvRml4ZWQoKSk7XG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZVVSTC50b1N0cmluZygpO1xuICAgICAgICBjb25maWcgPSAoYXdhaXQgaW1wb3J0KGZpbGVQYXRoKSkuZGVmYXVsdDtcbiAgICB9XG4gICAgcmV0dXJuIENvbmZpZy5wYXJzZShjb25maWcpO1xufTtcbiIsImV4cG9ydCBjb25zdCBjYXBpdGFsaXplID0gKHZhbHVlKSA9PiB2YWx1ZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHZhbHVlLnNsaWNlKDEpO1xuIiwiaW1wb3J0IHB1cHBldGVlciBmcm9tICdwdXBwZXRlZXInO1xuaW1wb3J0IHsgU3VwcG9ydGVkQXBwbGljYXRpb25zIH0gZnJvbSAnLi4vdHlwZXMvQXBwbGljYXRpb24nO1xuaW1wb3J0IHsgQ29uZmlndXJlQ29uZmx1ZW5jZSwgQ29uZmlndXJlSmlyYSB9IGZyb20gJy4uL3R5cGVzL0NvbmZpZ3VyZSc7XG5pbXBvcnQgeyBjYXBpdGFsaXplIH0gZnJvbSAnLi9jYXBpdGFsaXplJztcbmV4cG9ydCBjb25zdCBzZXR1cEhvc3QgPSBhc3luYyAobmFtZSwgY29uZmlnKSA9PiB7XG4gICAgY29uc3Qgb3B0aW9ucyA9IGNvbmZpZy5zZXR1cFtuYW1lXTtcbiAgICBpZiAoIW9wdGlvbnMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBpbml0aWFsIHNldHVwIGNvbmZpZ3VyYXRpb24gZm9yICR7Y2FwaXRhbGl6ZShuYW1lKX1gKTtcbiAgICB9XG4gICAgc3dpdGNoIChuYW1lKSB7XG4gICAgICAgIGNhc2UgU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5qaXJhOlxuICAgICAgICAgICAgcmV0dXJuIHNldHVwSmlyYShDb25maWd1cmVKaXJhLnBhcnNlKG9wdGlvbnMpKTtcbiAgICAgICAgY2FzZSBTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmNvbmZsdWVuY2U6XG4gICAgICAgICAgICByZXR1cm4gc2V0dXBDb25mbHVlbmNlKENvbmZpZ3VyZUNvbmZsdWVuY2UucGFyc2Uob3B0aW9ucykpO1xuICAgICAgICBjYXNlIFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuYml0YnVja2V0OlxuICAgICAgICAgICAgY29uc29sZS5sb2coJ09vcHNpZSBkYWlzeSDwn4y8IEF0bGFzc2lhbiBCaXRidWNrZXQgZG9lcyBub3QgcmVxdWlyZSBhZGRpdGlvbmFsIHNldHVwIPCfpJYnKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5jb25zdCBzZXR1cEppcmEgPSBhc3luYyAob3B0aW9ucykgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIExhdW5jaCBHb29nbGUgQ2hyb21lXG4gICAgICAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKCk7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgcGFnZSB2aWV3XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBicm93c2VyLm5ld1BhZ2UoKTtcbiAgICAgICAgYXdhaXQgcGFnZS5zZXRWaWV3cG9ydCh7IHdpZHRoOiAxMDgwLCBoZWlnaHQ6IDEwMjQgfSk7XG4gICAgICAgIC8vIE9wZW4gdGhlIFNldHVwIHBhZ2VcbiAgICAgICAgY29uc29sZS5sb2coYFN0YXJ0aW5nIGF1dG9tYXRlZCBpbml0aWFsIHNldHVwIG9mIEF0bGFzc2lhbiBKaXJhIPCfpJZgKTtcbiAgICAgICAgYXdhaXQgcGFnZS5nb3RvKG9wdGlvbnMuYmFzZVVybCwgeyB3YWl0VW50aWw6IFsnZG9tY29udGVudGxvYWRlZCcsICdsb2FkJywgJ25ldHdvcmtpZGxlMCddLCB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHByb2dyZXNzIGhhcyBlbmRlZFxuICAgICAgICBjb25zdCBpc1N0aWxsTG9hZGluZyA9ICEhYXdhaXQgcGFnZS4kKCcjcHJvZ3Jlc3MnKTtcbiAgICAgICAgaWYgKGlzU3RpbGxMb2FkaW5nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV2FpdGluZyBmb3IgQXRsYXNzaWFuIEppcmEgdG8gYmUgcmVhZHkuLi4g4o+zJyk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLndhaXRGb3JOYXZpZ2F0aW9uKHsgd2FpdFVudGlsOiBbJ2RvbWNvbnRlbnRsb2FkZWQnLCAnbG9hZCcsICduZXR3b3JraWRsZTAnXSwgdGltZW91dDogNSAqIDYwICogMTAwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgdXAgYXBwbGljYXRpb24gcHJvcGVydGllc1xuICAgICAgICBjb25zdCBtdXN0U2V0dXBBcHBsaWNhdGlvblByb3BlcnRpZXMgPSAhIWF3YWl0IHBhZ2UuJCgnZm9ybVthY3Rpb249XCJTZXR1cEFwcGxpY2F0aW9uUHJvcGVydGllcy5qc3BhXCJdJyk7XG4gICAgICAgIGlmIChtdXN0U2V0dXBBcHBsaWNhdGlvblByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTZXR0aW5nIHVwIGFwcGxpY2F0aW9uIHByb3BlcnRpZXMnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXRbbmFtZT10aXRsZV0nKS5maWxsKG9wdGlvbnMudGl0bGUpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKGBsYWJlbFtmb3I9amlyYS1zZXR1cHdpemFyZC1tb2RlLSR7b3B0aW9ucy5tb2RlfV1gKS5jbGljaygpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPWJhc2VVUkxdJykuZmlsbChvcHRpb25zLmJhc2VVcmwpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCcjamlyYS1zZXR1cHdpemFyZC1zdWJtaXQnKS5jbGljaygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1dhaXRpbmcgZm9yIHRoZSBhZG1pbmlzdHJhdG9yIGFjY291bnQgc2V0dXAgd2l6YXJkIHRvIGxvYWQuLi4g4o+zJyk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLndhaXRGb3JTZWxlY3RvcignZm9ybVthY3Rpb249XCJTZXR1cEFkbWluQWNjb3VudC5qc3BhXCJdJywgeyB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCB1cCBhZG1pbmlzdHJhdG9yIGFjY291bnRcbiAgICAgICAgY29uc3QgbXVzdFNldHVwQWRtaW5BY2NvdW50ID0gISFhd2FpdCBwYWdlLiQoJ2Zvcm1bYWN0aW9uPVwiU2V0dXBBZG1pbkFjY291bnQuanNwYVwiXScpO1xuICAgICAgICBpZiAobXVzdFNldHVwQWRtaW5BY2NvdW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnU2V0dGluZyB1cCB0aGUgYWRtaW5pc3RyYXRvciBhY2NvdW50Jyk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2lucHV0W25hbWU9ZnVsbG5hbWVdJykuZmlsbChvcHRpb25zLmZ1bGxuYW1lKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXRbbmFtZT1lbWFpbF0nKS5maWxsKG9wdGlvbnMuZW1haWwpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPXVzZXJuYW1lXScpLmZpbGwob3B0aW9ucy51c2VybmFtZSk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2lucHV0W25hbWU9cGFzc3dvcmRdJykuZmlsbChvcHRpb25zLnBhc3N3b3JkKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXRbbmFtZT1jb25maXJtXScpLmZpbGwob3B0aW9ucy5wYXNzd29yZCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJyNqaXJhLXNldHVwd2l6YXJkLXN1Ym1pdCcpLmNsaWNrKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV2FpdGluZyBmb3IgdGhlIGVtYWlsIG5vdGlmaWNhdGlvbiBzZXR1cCB3aXphcmQgdG8gbG9hZC4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCdmb3JtW2FjdGlvbj1cIlNldHVwTWFpbE5vdGlmaWNhdGlvbnMuanNwYVwiXScsIHsgdGltZW91dDogNSAqIDYwICogMTAwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTZXQgdXAgZW1haWwgbm90aWZpY2F0aW9uc1xuICAgICAgICBjb25zdCBtdXN0U2V0dXBFbWFpbE5vdGlmaWNhdGlvbiA9ICEhYXdhaXQgcGFnZS4kKCdmb3JtW2FjdGlvbj1cIlNldHVwTWFpbE5vdGlmaWNhdGlvbnMuanNwYVwiXScpO1xuICAgICAgICBpZiAobXVzdFNldHVwRW1haWxOb3RpZmljYXRpb24pIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTZXR0aW5nIHVwIHRoZSBlbWFpbCBub3RpZmljYXRpb24gc2V0dGluZ3MnKTtcbiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ3VyZUVtYWlsTm90aWZpY2F0aW9ucyA9IG9wdGlvbnMuY29uZmlndXJlRW1haWwgPT09ICdsYXRlcicgPyAnZGlzYWJsZWQnIDogJ2VuYWJsZWQnO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKGBsYWJlbFtmb3I9amlyYS1zZXR1cHdpemFyZC1lbWFpbC1ub3RpZmljYXRpb25zLSR7Y29uZmlndXJlRW1haWxOb3RpZmljYXRpb25zfV1gKS5jbGljaygpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCcjamlyYS1zZXR1cHdpemFyZC1zdWJtaXQnKS5jbGljaygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1dhaXRpbmcgZm9yIHRoZSBsYW5ndWFnZSBjaG9vc2VyIHRvIGxvYWQuLi4g4o+zJyk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLndhaXRGb3JTZWxlY3RvcignI2Nob29zZS1sYW5ndWFnZS1mb3JtJywgeyB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlbGNvbWUgdG8gSmlyYSwgQWRtaW5pc3RyYXRvciFcbiAgICAgICAgY29uc3QgbXVzdFNldHVwTGFuZ3VhZ2UgPSAhIWF3YWl0IHBhZ2UuJCgnI2Nob29zZS1sYW5ndWFnZS1mb3JtJyk7XG4gICAgICAgIGlmIChtdXN0U2V0dXBMYW5ndWFnZSkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1NldHRpbmcgdXAgdGhlIGxhbmd1YWdlIGZvciB0aGUgYWRtaW5pc3RyYXRvciBhY2NvdW50Jyk7XG4gICAgICAgICAgICBjb25zdCBsYW5ndWFnZVNlbGVjdG9yID0gIW9wdGlvbnMubGFuZ3VhZ2UgfHwgb3B0aW9ucy5sYW5ndWFnZSA9PT0gJ2VuLVVTJyA/ICdsb2NhbGVfLTEnIDogYGxvY2FsZV8ke29wdGlvbnMubGFuZ3VhZ2V9YDtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcihgbGFiZWxbZm9yPSR7bGFuZ3VhZ2VTZWxlY3Rvcn1dYCkuY2xpY2soKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignI25leHQnKS5jbGljaygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1dhaXRpbmcgZm9yIHRoZSBhdmF0YXIgc2V0dXAgd2l6YXJkIHRvIGxvYWQuLi4g4o+zJyk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLndhaXRGb3JTZWxlY3RvcignLm9uYm9hcmRpbmctc2VxdWVuY2UtYXZhdGFyLXBpY2tlcicsIHsgdGltZW91dDogNSAqIDYwICogMTAwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtdXN0U2V0dXBBdmF0YXIgPSAhIWF3YWl0IHBhZ2UuJCgnLm9uYm9hcmRpbmctc2VxdWVuY2UtYXZhdGFyLXBpY2tlcicpO1xuICAgICAgICBpZiAobXVzdFNldHVwQXZhdGFyKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnU2V0dGluZyB1cCB0aGUgYXZhdGFyIGZvciB0aGUgYWRtaW5pc3RyYXRvciBhY2NvdW50Jyk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2lucHV0LmF2YXRhci1waWNrZXItZG9uZScpLmNsaWNrKCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLndhaXRGb3JTZWxlY3RvcignI29uYm9hcmRpbmcnLCB7IHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UncmUgZG9uZSBoZXJlLCBsZXQncyB3cmFwIHRoaW5ncyB1cFxuICAgICAgICBjb25zb2xlLmxvZyhgRmluaXNoZWQgYXV0b21hdGVkIGluaXRpYWwgc2V0dXAgb2YgQXRsYXNzaWFuIEppcmEg8J+SqmApO1xuICAgICAgICBhd2FpdCBwYWdlLmNsb3NlKCk7XG4gICAgICAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGF1dG9tYXRpY2FsbHkgc2V0dXAgQXRsYXNzaWFuIEppcmEnKTtcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG5jb25zdCBzZXR1cENvbmZsdWVuY2UgPSBhc3luYyAob3B0aW9ucykgPT4ge1xuICAgIHRyeSB7XG4gICAgICAgIC8vIExhdW5jaCBHb29nbGUgQ2hyb21lXG4gICAgICAgIGNvbnN0IGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKCk7XG4gICAgICAgIC8vIENyZWF0ZSB0aGUgcGFnZSB2aWV3XG4gICAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCBicm93c2VyLm5ld1BhZ2UoKTtcbiAgICAgICAgYXdhaXQgcGFnZS5zZXRWaWV3cG9ydCh7IHdpZHRoOiAxMDgwLCBoZWlnaHQ6IDEwMjQgfSk7XG4gICAgICAgIC8vIE9wZW4gdGhlIFNldHVwIHBhZ2VcbiAgICAgICAgY29uc29sZS5sb2coYFN0YXJ0aW5nIGF1dG9tYXRlZCBpbml0aWFsIHNldHVwIG9mIEF0bGFzc2lhbiBDb25mbHVlbmNlIPCfpJZgKTtcbiAgICAgICAgYXdhaXQgcGFnZS5nb3RvKG9wdGlvbnMuYmFzZVVybCwgeyB3YWl0VW50aWw6IFsnZG9tY29udGVudGxvYWRlZCcsICdsb2FkJywgJ25ldHdvcmtpZGxlMCddLCB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICAvLyBDaG9vc2UgeW91ciBkZXBsb3ltZW50IHR5cGVcbiAgICAgICAgY29uc3QgbXVzdENob29zZURlcGxveW1lbnRUeXBlID0gISFhd2FpdCBwYWdlLiQoJ2Zvcm1bYWN0aW9uPVwic2V0dXBjbHVzdGVyLmFjdGlvblwiXScpO1xuICAgICAgICBpZiAobXVzdENob29zZURlcGxveW1lbnRUeXBlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnU2V0dGluZyB1cCBkZXBsb3ltZW50IHR5cGUnKTtcbiAgICAgICAgICAgIGNvbnN0IGNsdXN0ZXJpbmdTdGF0dXMgPSBvcHRpb25zLmRlcGxveW1lbnRUeXBlID09PSAnY2x1c3RlcmVkJyA/ICdjbHVzdGVyaW5nRW5hYmxlZCcgOiAnY2x1c3RlcmluZ0Rpc2FibGVkJztcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcihgbGFiZWxbZm9yPSR7Y2x1c3RlcmluZ1N0YXR1c31dYCkuY2xpY2soKTtcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmRlcGxveW1lbnRUeXBlID09PSAnY2x1c3RlcmVkJykge1xuICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBjbHVzdGVyIG9wdGlvbnNcbiAgICAgICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2J1dHRvbltuYW1lPW5ld0NsdXN0ZXJdJykuY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignI3NraXAtYnV0dG9uJykuY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciB0aGUgY29udGVudCBjaG9vc2VyIHBhZ2UgdG8gbG9hZC4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCdmb3JtW2FjdGlvbj1cInNldHVwZGF0YS5hY3Rpb25cIl0nLCB7IHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTG9hZCBDb250ZW50XG4gICAgICAgIGNvbnN0IG11c3RMb2FkQ29udGVudCA9ICEhYXdhaXQgcGFnZS4kKCdmb3JtW2FjdGlvbj1cInNldHVwZGF0YS5hY3Rpb25cIl0nKTtcbiAgICAgICAgaWYgKG11c3RMb2FkQ29udGVudCkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMubG9hZENvbnRlbnQgPT09ICdleGFtcGxlJykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignI2RlbW9DaG9pY2VGb3JtID4gaW5wdXRbdHlwZT1zdWJtaXRdJykuY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignI2JsYW5rQ2hvaWNlRm9ybSA+IGlucHV0W3R5cGU9c3VibWl0XScpLmNsaWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV2FpdGluZyBmb3IgdGhlIHVzZXIgbWFuYWdlbWVudCBjb25maWd1cmF0aW9uIHBhZ2UgdG8gbG9hZC4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCdmb3JtW2FjdGlvbj1cInNldHVwdXNlcm1hbmFnZW1lbnRjaG9pY2UuYWN0aW9uXCJdJywgeyB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIENvbmZpZ3VyZSBVc2VyIE1hbmFnZW1lbnRcbiAgICAgICAgY29uc3QgbXVzdENvbmZpZ3VyZVVzZXJNYW5hZ2VtZW50ID0gISFhd2FpdCBwYWdlLiQoJ2Zvcm1bYWN0aW9uPVwic2V0dXB1c2VybWFuYWdlbWVudGNob2ljZS5hY3Rpb25cIl0nKTtcbiAgICAgICAgaWYgKG11c3RDb25maWd1cmVVc2VyTWFuYWdlbWVudCkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMudXNlck1hbmFnZW1lbnQgPT09ICdjb25mbHVlbmNlJykge1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignI2ludGVybmFsJykuY2xpY2soKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnV2FpdGluZyBmb3IgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdGlvbiBhY2NvdW50IGNvbmZpZ3VyYXRpb24gcGFnZSB0byBsb2FkLi4uIOKPsycpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCdmb3JtW2FjdGlvbj1cInNldHVwYWRtaW5pc3RyYXRvci5hY3Rpb25cIl0nLCB7IHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJyNqYWFjcycpLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ1dhaXRpbmcgZm9yIHRoZSBDb25uZWN0IHRvIEppcmEgcGFnZSB0byBsb2FkLi4uIOKPsycpO1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCdmb3JtW2FjdGlvbj1cImNvbm5lY3R0b2ppcmEuYWN0aW9uXCJdJywgeyB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENvbmZpZ3VyZSBTeXN0ZW0gQWRtaW5pc3RyYXRvciBBY2NvdW50XG4gICAgICAgIGNvbnN0IG11c3RDb25maWd1cmVBZG1pbmlzdHJhdG9yQWNjb3VudCA9ICEhYXdhaXQgcGFnZS4kKCdmb3JtW2FjdGlvbj1cInNldHVwYWRtaW5pc3RyYXRvci5hY3Rpb25cIl0nKTtcbiAgICAgICAgaWYgKG11c3RDb25maWd1cmVBZG1pbmlzdHJhdG9yQWNjb3VudCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0NvbmZpZ3VyaW5nIHRoZSBhZG1pbmlzdHJhdG9yIGFjY291bnQnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXRbbmFtZT11c2VybmFtZV0nKS5maWxsKG9wdGlvbnMudXNlcm5hbWUpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPWZ1bGxOYW1lXScpLmZpbGwob3B0aW9ucy5mdWxsTmFtZSk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2lucHV0W25hbWU9ZW1haWxdJykuZmlsbChvcHRpb25zLmVtYWlsKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXRbbmFtZT1wYXNzd29yZF0nKS5maWxsKG9wdGlvbnMucGFzc3dvcmQpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPWNvbmZpcm1dJykuZmlsbChvcHRpb25zLnBhc3N3b3JkKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignI3NldHVwLW5leHQtYnV0dG9uJykuY2xpY2soKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciB0aGUgc2V0dXAgc3VjY2Vzc2Z1bCBub3RpZmljYXRpb24gdG8gbG9hZC4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCdhLmZpbmlzaEFjdGlvbicsIHsgdGltZW91dDogNSAqIDYwICogMTAwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtdXN0RmluaXNoU2V0dXAgPSAhIWF3YWl0IHBhZ2UuJCgnYS5maW5pc2hBY3Rpb24nKTtcbiAgICAgICAgaWYgKG11c3RGaW5pc2hTZXR1cCkge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ0ZpbmFsaXppbmcgaW5pdGlhbCBDb25mbHVlbmNlIHNldHVwJyk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2EuZmluaXNoQWN0aW9uJykuY2xpY2soKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciB0aGUgaW5pdGlhbCBzcGFjZSBjcmVhdGlvbiBmb3JtIHRvIGxvYWQuLi4g4o+zJyk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLndhaXRGb3JTZWxlY3RvcignI2dyb3ctaW50cm8tY3JlYXRlLXNwYWNlJywgeyB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFdlJ3JlIGRvbmUgaGVyZSwgbGV0J3Mgd3JhcCB0aGluZ3MgdXBcbiAgICAgICAgY29uc29sZS5sb2coYEZpbmlzaGVkIGF1dG9tYXRlZCBpbml0aWFsIHNldHVwIG9mIEF0bGFzc2lhbiBDb25mbHVlbmNlIPCfkqpgKTtcbiAgICAgICAgYXdhaXQgcGFnZS5jbG9zZSgpO1xuICAgICAgICBhd2FpdCBicm93c2VyLmNsb3NlKCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBhdXRvbWF0aWNhbGx5IHNldHVwIEF0bGFzc2lhbiBDb25mbHVlbmNlJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGVycik7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59O1xuIiwiZXhwb3J0IGNvbnN0IHNob3dIZWxwV2l0aERlZmF1bHRDb21tYW5kT3B0aW9ucyA9IHtcbiAgICB2aXNpYmxlT3B0aW9uczogKGNtZCkgPT4ge1xuICAgICAgICBsZXQgb3B0aW9ucyA9IGNtZC5vcHRpb25zO1xuICAgICAgICBpZiAoIWNtZC5wYXJlbnQgJiYgb3B0aW9ucy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRDb21tYW5kTmFtZSA9IGNtZC5fZGVmYXVsdENvbW1hbmROYW1lO1xuICAgICAgICAgICAgaWYgKGRlZmF1bHRDb21tYW5kTmFtZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRDb21tYW5kID0gY21kLmNvbW1hbmRzLmZpbmQoaXRlbSA9PiBpdGVtLl9uYW1lID09PSBkZWZhdWx0Q29tbWFuZE5hbWUpO1xuICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0Q29tbWFuZCkge1xuICAgICAgICAgICAgICAgICAgICBvcHRpb25zID0gZGVmYXVsdENvbW1hbmQub3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ob3B0aW9ucyk7XG4gICAgfVxufTtcbiIsIiMhL3Vzci9iaW4vZW52IG5vZGVcbmltcG9ydCB7IENvbW1hbmQgYXMgQ29tbWFuZGVyLCBPcHRpb24gfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0IHsgZ3JhY2VmdWxFeGl0IH0gZnJvbSAnZXhpdC1ob29rJztcbmltcG9ydCB7IEFjdGlvbkhhbmRsZXIgfSBmcm9tICcuLi9oZWxwZXJzL0FjdGlvbkhhbmRsZXInO1xuaW1wb3J0IHsgZ2V0Q29uZmlnIH0gZnJvbSAnLi4vaGVscGVycy9nZXRDb25maWcnO1xuaW1wb3J0IHsgc2V0dXBIb3N0IH0gZnJvbSAnLi4vaGVscGVycy9zZXR1cEhvc3QnO1xuaW1wb3J0IHsgc2hvd0hlbHBXaXRoRGVmYXVsdENvbW1hbmRPcHRpb25zIH0gZnJvbSAnLi4vaGVscGVycy9zaG93SGVscFdpdGhEZWZhdWx0Q29tbWFuZE9wdGlvbnMnO1xuaW1wb3J0IHsgU3VwcG9ydGVkQXBwbGljYXRpb25zIH0gZnJvbSAnLi4vdHlwZXMvQXBwbGljYXRpb24nO1xuY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21tYW5kZXIoKTtcbmNvbnN0IENvbW1hbmQgPSAoKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWN0aW9uOiBhc3luYyAob3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gYXdhaXQgZ2V0Q29uZmlnKG9wdGlvbnMuY29uZmlnLCBvcHRpb25zLmN3ZCk7XG4gICAgICAgICAgICBhd2FpdCBzZXR1cEhvc3Qob3B0aW9ucy5wcm9kdWN0LCBjb25maWcpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvckhhbmRsZXI6IGFzeW5jICgpID0+IHtcbiAgICAgICAgfVxuICAgIH07XG59O1xucHJvZ3JhbVxuICAgIC5uYW1lKCdkY2R4IGNvbmZpZ3VyZScpXG4gICAgLmRlc2NyaXB0aW9uKGBBdXRvbWF0ZWQgaW5pdGlhbCBzZXR1cCBvZiB0aGUgaG9zdCBhcHBsaWNhdGlvblxuSWYgeW91IHdpc2ggdG8gcnVuIGEgc3BlY2lmaWMgaG9zdCBhcHBsaWNhdGlvbiwgY2FsbCB0aGlzIGNvbW1hbmQgd2l0aCAnZGNkeCBjb25maWd1cmUgPG5hbWU+J2ApXG4gICAgLmFkZEhlbHBUZXh0KCdhZnRlckFsbCcsICfigIsnKSAvLyB0aGVyZSBpcyBhIG5vbi16ZXJvIHdoaXRlIHNwYWNlIGJlY2F1c2UgdGhlIG9ubHkgcmVhc29uIHRvIGhhdmUgdGhpcyBpcyB0byBmb3JjZSBhIGxpbmUgYnJlYWtcbiAgICAuY29uZmlndXJlSGVscChzaG93SGVscFdpdGhEZWZhdWx0Q29tbWFuZE9wdGlvbnMpXG4gICAgLmFsbG93VW5rbm93bk9wdGlvbihmYWxzZSlcbiAgICAuYWxsb3dFeGNlc3NBcmd1bWVudHMoZmFsc2UpXG4gICAgLnNob3dIZWxwQWZ0ZXJFcnJvcih0cnVlKTtcbnByb2dyYW1cbiAgICAuY29tbWFuZCgnZGVmYXVsdCcsIHsgaXNEZWZhdWx0OiB0cnVlLCBoaWRkZW46IHRydWUgfSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy1wLCAtLXByb2R1Y3QgPG5hbWU+JywgJ1RoZSBuYW1lIG9mIHRoZSBob3N0IGFwcGxpY2F0aW9uJykuY2hvaWNlcyhPYmplY3QudmFsdWVzKFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMpKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy1jLCAtLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byB0aGUgY29uZmlndXJhdGlvbiBmaWxlJykuZGVmYXVsdCgnZGNkeC5jb25maWcubWpzJykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnVGhlIFVSTCBvZiB0aGUgaG9zdCBhcHBsaWNhdGlvbicpLmRlZmF1bHQoJ2h0dHA6Ly9sb2NhbGhvc3QnKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tY3dkIDxkaXJlY3Rvcnk+JywgJ1NwZWNpZnkgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZXJlIHRvIGZpbmQgdGhlIGNvbmZpZ3VyYXRpb24nKSlcbiAgICAuYWN0aW9uKG9wdGlvbnMgPT4gQWN0aW9uSGFuZGxlcihwcm9ncmFtLCBDb21tYW5kKCksIG9wdGlvbnMpKTtcbnByb2dyYW1cbiAgICAuY29tbWFuZChTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmppcmEpXG4gICAgLmRlc2NyaXB0aW9uKCdBdXRvbWF0ZWQgaW5pdGlhbCBzZXR1cCBvZiBBdGxhc3NpYW4gSmlyYScpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctYywgLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZScpLmRlZmF1bHQoJ2RjZHguY29uZmlnLm1qcycpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ1RoZSBVUkwgb2YgdGhlIGhvc3QgYXBwbGljYXRpb24nKS5kZWZhdWx0KCdodHRwOi8vbG9jYWxob3N0JykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLWN3ZCA8ZGlyZWN0b3J5PicsICdTcGVjaWZ5IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVyZSB0byBmaW5kIHRoZSBjb25maWd1cmF0aW9uJykpXG4gICAgLmFjdGlvbihvcHRpb25zID0+IEFjdGlvbkhhbmRsZXIocHJvZ3JhbSwgQ29tbWFuZCgpLCB7IC4uLm9wdGlvbnMsIG5hbWU6IFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuamlyYSB9KSk7XG5wcm9ncmFtXG4gICAgLmNvbW1hbmQoU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5jb25mbHVlbmNlKVxuICAgIC5kZXNjcmlwdGlvbignQXV0b21hdGVkIGluaXRpYWwgc2V0dXAgb2YgQXRsYXNzaWFuIENvbmZsdWVuY2UnKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLWMsIC0tY29uZmlnIDxwYXRoPicsICdQYXRoIHRvIHRoZSBjb25maWd1cmF0aW9uIGZpbGUnKS5kZWZhdWx0KCdkY2R4LmNvbmZpZy5tanMnKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdUaGUgVVJMIG9mIHRoZSBob3N0IGFwcGxpY2F0aW9uJykuZGVmYXVsdCgnaHR0cDovL2xvY2FsaG9zdCcpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1jd2QgPGRpcmVjdG9yeT4nLCAnU3BlY2lmeSB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlcmUgdG8gZmluZCB0aGUgY29uZmlndXJhdGlvbicpKVxuICAgIC5hY3Rpb24ob3B0aW9ucyA9PiBBY3Rpb25IYW5kbGVyKHByb2dyYW0sIENvbW1hbmQoKSwgeyAuLi5vcHRpb25zLCBuYW1lOiBTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmNvbmZsdWVuY2UgfSkpO1xucHJvZ3JhbVxuICAgIC5jb21tYW5kKFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuYmFtYm9vKVxuICAgIC5kZXNjcmlwdGlvbignQXV0b21hdGVkIGluaXRpYWwgc2V0dXAgb2YgQXRsYXNzaWFuIEJhbWJvbycpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctYywgLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZScpLmRlZmF1bHQoJ2RjZHguY29uZmlnLm1qcycpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ1RoZSBVUkwgb2YgdGhlIGhvc3QgYXBwbGljYXRpb24nKS5kZWZhdWx0KCdodHRwOi8vbG9jYWxob3N0JykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLWN3ZCA8ZGlyZWN0b3J5PicsICdTcGVjaWZ5IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVyZSB0byBmaW5kIHRoZSBjb25maWd1cmF0aW9uJykpXG4gICAgLmFjdGlvbihvcHRpb25zID0+IEFjdGlvbkhhbmRsZXIocHJvZ3JhbSwgQ29tbWFuZCgpLCB7IC4uLm9wdGlvbnMsIG5hbWU6IFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuYmFtYm9vIH0pKTtcbnByb2dyYW1cbiAgICAuY29tbWFuZChTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmJpdGJ1Y2tldClcbiAgICAuZGVzY3JpcHRpb24oJ0F1dG9tYXRlZCBpbml0aWFsIHNldHVwIG9mIEF0bGFzc2lhbiBCaXRidWNrZXQnKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLWMsIC0tY29uZmlnIDxwYXRoPicsICdQYXRoIHRvIHRoZSBjb25maWd1cmF0aW9uIGZpbGUnKS5kZWZhdWx0KCdkY2R4LmNvbmZpZy5tanMnKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdUaGUgVVJMIG9mIHRoZSBob3N0IGFwcGxpY2F0aW9uJykuZGVmYXVsdCgnaHR0cDovL2xvY2FsaG9zdCcpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1jd2QgPGRpcmVjdG9yeT4nLCAnU3BlY2lmeSB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlcmUgdG8gZmluZCB0aGUgY29uZmlndXJhdGlvbicpKVxuICAgIC5hY3Rpb24ob3B0aW9ucyA9PiBBY3Rpb25IYW5kbGVyKHByb2dyYW0sIENvbW1hbmQoKSwgeyAuLi5vcHRpb25zLCBuYW1lOiBTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmJpdGJ1Y2tldCB9KSk7XG5wcm9ncmFtLnBhcnNlQXN5bmMoKS5jYXRjaCgoKSA9PiBncmFjZWZ1bEV4aXQoMSkpO1xucHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGNvbnNvbGUubG9nKGBSZWNlaXZlZCB0ZXJtIHNpZ25hbCwgdHJ5aW5nIHRvIHN0b3AgZ3JhY2VmdWxseSDwn5KqYCk7XG4gICAgZ3JhY2VmdWxFeGl0KCk7XG59KTtcbiJdLCJuYW1lcyI6WyJDb21tYW5kZXIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUVPLE1BQU0sYUFBYSxHQUFHLE9BQU8sT0FBTyxFQUFFLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFB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RSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDeEMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDeEMsSUFBSSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUM7QUFDeEMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDckMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDckMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7QUFDdkMsSUFBSSxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRTtBQUN0QixDQUFDLENBQUMsQ0FBQztBQUM4QixlQUFlLENBQUMsTUFBTSxDQUFDO0FBQ3hELElBQUksSUFBSSxFQUFFLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksSUFBSSxLQUFLLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztBQUMxSixJQUFJLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUMsd0JBQXdCLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7QUFDekgsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFD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
|