dcdx 1.3.0-next.44 → 1.3.0-next.46

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/assets/versions.json +1 -1
  2. package/lib/commands/apt.js +217 -8995
  3. package/lib/commands/build.js +394 -9008
  4. package/lib/commands/configure.js +560 -0
  5. package/lib/commands/database.js +15 -8968
  6. package/lib/commands/debug.js +774 -9019
  7. package/lib/commands/install.js +463 -9587
  8. package/lib/commands/reset.js +413 -8975
  9. package/lib/commands/run.js +467 -9006
  10. package/lib/commands/stop.js +413 -8975
  11. package/lib/commands/update.js +7 -8957
  12. package/lib/index.js +33 -2
  13. package/lib/types/src/applications/base.d.ts +2 -0
  14. package/lib/types/src/apt/helpers/downloadFile.d.ts +1 -0
  15. package/lib/types/src/apt/helpers/getRunForStage.d.ts +1 -1
  16. package/lib/types/src/apt/helpers/getUrlByAppKey.d.ts +1 -0
  17. package/lib/types/src/apt/helpers/installAppInCluster.d.ts +2 -0
  18. package/lib/types/src/commands/configure.d.ts +2 -0
  19. package/lib/types/src/helpers/ActionHandler.d.ts +1 -40
  20. package/lib/types/src/helpers/getConfig.d.ts +2 -0
  21. package/lib/types/src/helpers/getMainArtifactFromOBR.d.ts +1 -0
  22. package/lib/types/src/helpers/installFromMPAC.d.ts +2 -0
  23. package/lib/types/src/helpers/installFromURL.d.ts +2 -0
  24. package/lib/types/src/helpers/installWithQuickReload.d.ts +2 -0
  25. package/lib/types/src/helpers/setupHost.d.ts +3 -0
  26. package/lib/types/src/helpers/validateAtlassianPlugin.d.ts +4 -0
  27. package/lib/types/src/types/AMPS.d.ts +12 -0
  28. package/lib/types/src/types/Application.d.ts +6 -0
  29. package/lib/types/src/types/Config.d.ts +328 -0
  30. package/lib/types/src/types/Configure.d.ts +145 -0
  31. package/lib/types/src/types/DCAPT.d.ts +135 -36
  32. package/lib/types/src/types/FileWatcher.d.ts +3 -0
  33. package/lib/types/src/types/Install.d.ts +179 -39
  34. package/package.json +1 -1
  35. package/lib/types/src/apt/helpers/downloadApp.d.ts +0 -1
  36. package/lib/types/src/apt/helpers/installApp.d.ts +0 -2
  37. package/lib/types/src/helpers/Installer.d.ts +0 -3
@@ -0,0 +1,560 @@
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 ConfigureJira = z.object({
164
+ title: z.string(),
165
+ mode: z.enum(['private', 'public']),
166
+ baseUrl: z.string(),
167
+ fullname: z.string(),
168
+ email: z.string(),
169
+ username: z.string(),
170
+ password: z.string(),
171
+ configureEmail: z.enum(['later', 'now']),
172
+ emailName: z.string(),
173
+ emailFromAddress: z.string(),
174
+ emailPrefix: z.string(),
175
+ emailServerType: z.enum(['smtp', 'jndi']),
176
+ emailJndiLocation: z.string(),
177
+ emailServiceProvider: z.enum(['custom', 'google-apps-mail-/-gmail-8', 'yahoo!-mail-plus-9']),
178
+ emailHostName: z.string(),
179
+ emailProtocol: z.enum(['SMTP', 'SECURE_SMTP']),
180
+ emailPort: z.number(),
181
+ emailTimeout: z.number(),
182
+ emailTLS: z.boolean(),
183
+ emailUsername: z.string(),
184
+ emailPassword: z.string(),
185
+ language: z.enum([
186
+ 'en-US',
187
+ 'zh_CN',
188
+ 'cs_CZ',
189
+ 'da_DK',
190
+ 'nl_NL',
191
+ 'en_UK',
192
+ 'et_EE',
193
+ 'fi_FI',
194
+ 'fr_FR',
195
+ 'de_DE',
196
+ 'hu_HU',
197
+ 'is_IS',
198
+ 'it_IT',
199
+ 'ja_JP',
200
+ 'ko_KR',
201
+ 'no_NO',
202
+ 'pl_PL',
203
+ 'pt_BR',
204
+ 'ro_RO',
205
+ 'ru_RU',
206
+ 'sk_SK',
207
+ 'es_ES',
208
+ 'sv_SE'
209
+ ]),
210
+ avatarPath: z.string()
211
+ }).partial({
212
+ emailName: true,
213
+ emailFromAddress: true,
214
+ emailPrefix: true,
215
+ emailServerType: true,
216
+ emailJndiLocation: true,
217
+ emailServiceProvider: true,
218
+ emailHostName: true,
219
+ emailProtocol: true,
220
+ emailPort: true,
221
+ emailTimeout: true,
222
+ emailTLS: true,
223
+ emailUsername: true,
224
+ emailPassword: true,
225
+ language: true,
226
+ avatarPath: true
227
+ });
228
+ const ConfigureConfluence = z.object({
229
+ baseUrl: z.string(),
230
+ deploymentType: z.enum(['non-clustered', 'clustered']),
231
+ username: z.string(),
232
+ fullName: z.string(),
233
+ email: z.string(),
234
+ password: z.string(),
235
+ clusterName: z.string(),
236
+ clusterHome: z.string(),
237
+ clusterJoinMode: z.enum(['useMulticast', 'useTcpIp', 'useAws']),
238
+ clusterAutoAddress: z.boolean(),
239
+ loadContent: z.enum(['example', 'empty']),
240
+ userManagement: z.enum(['confluence', 'jira']),
241
+ jiraBaseUrl: z.string(),
242
+ jiraUsername: z.string(),
243
+ jiraPassword: z.string(),
244
+ jiraUserGroups: z.string(),
245
+ jiraAdminGroups: z.string(),
246
+ }).partial({
247
+ clusterName: true,
248
+ clusterHome: true,
249
+ clusterJoinMode: true,
250
+ clusterAutoAddress: true,
251
+ jiraBaseUrl: true,
252
+ jiraUsername: true,
253
+ jiraPassword: true,
254
+ jiraUserGroups: true,
255
+ jiraAdminGroups: true
256
+ });
257
+
258
+ const Config = z.object({
259
+ setup: z.object({
260
+ [SupportedApplications.Values.jira]: ConfigureJira,
261
+ [SupportedApplications.Values.confluence]: ConfigureConfluence,
262
+ [SupportedApplications.Values.bamboo]: z.object({}),
263
+ [SupportedApplications.Values.bitbucket]: z.object({})
264
+ }).partial()
265
+ });
266
+
267
+ /*
268
+ Code atrribution
269
+ borrowed some logic for loading configuration files from ESLint
270
+ https://github.com/eslint/eslint/blob/main/lib/config/config-loader.js
271
+ */
272
+ const getConfig = async (path, cwd) => {
273
+ const directory = cwd || process.cwd();
274
+ const configFile = path || 'dcdx.config.mjs';
275
+ const configPath = isAbsolute(configFile) && existsSync(configFile) ? configFile : join(directory, configFile);
276
+ if (!existsSync(configPath)) {
277
+ throw new Error('Unable to find dcdx configuration file. Please make sure to specify the correct working directory (--cwd) or path to the file (-c, --config)');
278
+ }
279
+ /*
280
+ * Explanation copied from ESLint
281
+ *
282
+ * Append a query with the config file's modification time (`mtime`) in order
283
+ * to import the current version of the config file. Without the query, `import()` would
284
+ * cache the config file module by the pathname only, and then always return
285
+ * the same version (the one that was actual when the module was imported for the first time).
286
+ *
287
+ * This ensures that the config file module is loaded and executed again
288
+ * if it has been changed since the last time it was imported.
289
+ * If it hasn't been changed, `import()` will just return the cached version.
290
+ *
291
+ * Note that we should not overuse queries (e.g., by appending the current time
292
+ * to always reload the config file module) as that could cause memory leaks
293
+ * because entries are never removed from the import cache.
294
+ */
295
+ const mtime = statSync(configPath).mtime.getTime();
296
+ const fileURL = pathToFileURL(configPath);
297
+ fileURL.searchParams.append('mtime', mtime.toFixed());
298
+ const filePath = fileURL.toString();
299
+ const result = (await import(filePath)).default;
300
+ return Config.parse(result);
301
+ };
302
+
303
+ const capitalize = (value) => value.charAt(0).toUpperCase() + value.slice(1);
304
+
305
+ const setupHost = async (name, config) => {
306
+ const options = config.setup[name];
307
+ if (!options) {
308
+ throw new Error(`Could not find initial setup configuration for ${capitalize(name)}`);
309
+ }
310
+ switch (name) {
311
+ case SupportedApplications.Values.jira:
312
+ return setupJira(ConfigureJira.parse(options));
313
+ case SupportedApplications.Values.confluence:
314
+ return setupConfluence(ConfigureConfluence.parse(options));
315
+ case SupportedApplications.Values.bitbucket:
316
+ console.log('Oopsie daisy 🌼 Atlassian Bitbucket does not require additional setup 🤖');
317
+ return true;
318
+ }
319
+ return true;
320
+ };
321
+ const setupJira = async (options) => {
322
+ try {
323
+ // Launch Google Chrome
324
+ const browser = await puppeteer.launch();
325
+ // Create the page view
326
+ const page = await browser.newPage();
327
+ await page.setViewport({ width: 1080, height: 1024 });
328
+ // Open the Setup page
329
+ console.log(`Starting automated initial setup of Atlassian Jira 🤖`);
330
+ await page.goto(options.baseUrl, { waitUntil: ['domcontentloaded', 'load', 'networkidle0'], timeout: 5 * 60 * 1000 });
331
+ // We need to make sure that progress has ended
332
+ const isStillLoading = !!await page.$('#progress');
333
+ if (isStillLoading) {
334
+ console.log('Waiting for Atlassian Jira to be ready... ⏳');
335
+ await page.waitForNavigation({ waitUntil: ['domcontentloaded', 'load', 'networkidle0'], timeout: 5 * 60 * 1000 });
336
+ }
337
+ // Set up application properties
338
+ const mustSetupApplicationProperties = !!await page.$('form[action="SetupApplicationProperties.jspa"]');
339
+ if (mustSetupApplicationProperties) {
340
+ console.log('Setting up application properties');
341
+ await page.locator('input[name=title]').fill(options.title);
342
+ await page.locator(`label[for=jira-setupwizard-mode-${options.mode}]`).click();
343
+ await page.locator('input[name=baseURL]').fill(options.baseUrl);
344
+ await page.locator('#jira-setupwizard-submit').click();
345
+ console.log('Waiting for the administrator account setup wizard to load... ⏳');
346
+ await page.waitForSelector('form[action="SetupAdminAccount.jspa"]', { timeout: 5 * 60 * 1000 });
347
+ }
348
+ // Set up administrator account
349
+ const mustSetupAdminAccount = !!await page.$('form[action="SetupAdminAccount.jspa"]');
350
+ if (mustSetupAdminAccount) {
351
+ console.log('Setting up the administrator account');
352
+ await page.locator('input[name=fullname]').fill(options.fullname);
353
+ await page.locator('input[name=email]').fill(options.email);
354
+ await page.locator('input[name=username]').fill(options.username);
355
+ await page.locator('input[name=password]').fill(options.password);
356
+ await page.locator('input[name=confirm]').fill(options.password);
357
+ await page.locator('#jira-setupwizard-submit').click();
358
+ console.log('Waiting for the email notification setup wizard to load... ⏳');
359
+ await page.waitForSelector('form[action="SetupMailNotifications.jspa"]', { timeout: 5 * 60 * 1000 });
360
+ }
361
+ // Set up email notifications
362
+ const mustSetupEmailNotification = !!await page.$('form[action="SetupMailNotifications.jspa"]');
363
+ if (mustSetupEmailNotification) {
364
+ console.log('Setting up the email notification settings');
365
+ const configureEmailNotifications = options.configureEmail === 'later' ? 'disabled' : 'enabled';
366
+ await page.locator(`label[for=jira-setupwizard-email-notifications-${configureEmailNotifications}]`).click();
367
+ await page.locator('#jira-setupwizard-submit').click();
368
+ console.log('Waiting for the language chooser to load... ⏳');
369
+ await page.waitForSelector('#choose-language-form', { timeout: 5 * 60 * 1000 });
370
+ }
371
+ // Welcome to Jira, Administrator!
372
+ const mustSetupLanguage = !!await page.$('#choose-language-form');
373
+ if (mustSetupLanguage) {
374
+ console.log('Setting up the language for the administrator account');
375
+ const languageSelector = !options.language || options.language === 'en-US' ? 'locale_-1' : `locale_${options.language}`;
376
+ await page.locator(`label[for=${languageSelector}]`).click();
377
+ await page.locator('#next').click();
378
+ console.log('Waiting for the avatar setup wizard to load... ⏳');
379
+ await page.waitForSelector('.onboarding-sequence-avatar-picker', { timeout: 5 * 60 * 1000 });
380
+ }
381
+ const mustSetupAvatar = !!await page.$('.onboarding-sequence-avatar-picker');
382
+ if (mustSetupAvatar) {
383
+ console.log('Setting up the avatar for the administrator account');
384
+ await page.locator('input.avatar-picker-done').click();
385
+ await page.waitForSelector('#onboarding', { timeout: 5 * 60 * 1000 });
386
+ }
387
+ // We're done here, let's wrap things up
388
+ console.log(`Finished automated initial setup of Atlassian Jira 💪`);
389
+ await page.close();
390
+ await browser.close();
391
+ return true;
392
+ }
393
+ catch (err) {
394
+ console.error('Failed to automatically setup Atlassian Jira');
395
+ console.log(err);
396
+ return false;
397
+ }
398
+ };
399
+ const setupConfluence = async (options) => {
400
+ try {
401
+ // Launch Google Chrome
402
+ const browser = await puppeteer.launch();
403
+ // Create the page view
404
+ const page = await browser.newPage();
405
+ await page.setViewport({ width: 1080, height: 1024 });
406
+ // Open the Setup page
407
+ console.log(`Starting automated initial setup of Atlassian Confluence 🤖`);
408
+ await page.goto(options.baseUrl, { waitUntil: ['domcontentloaded', 'load', 'networkidle0'], timeout: 5 * 60 * 1000 });
409
+ // Choose your deployment type
410
+ const mustChooseDeploymentType = !!await page.$('form[action="setupcluster.action"]');
411
+ if (mustChooseDeploymentType) {
412
+ console.log('Setting up deployment type');
413
+ const clusteringStatus = options.deploymentType === 'clustered' ? 'clusteringEnabled' : 'clusteringDisabled';
414
+ await page.locator(`label[for=${clusteringStatus}]`).click();
415
+ if (options.deploymentType === 'clustered') {
416
+ // TODO: add cluster options
417
+ await page.locator('button[name=newCluster]').click();
418
+ }
419
+ else {
420
+ await page.locator('#skip-button').click();
421
+ }
422
+ console.log('Waiting for the content chooser page to load... ⏳');
423
+ await page.waitForSelector('form[action="setupdata.action"]', { timeout: 5 * 60 * 1000 });
424
+ }
425
+ // Load Content
426
+ const mustLoadContent = !!await page.$('form[action="setupdata.action"]');
427
+ if (mustLoadContent) {
428
+ if (options.loadContent === 'example') {
429
+ await page.locator('#demoChoiceForm > input[type=submit]').click();
430
+ }
431
+ else {
432
+ await page.locator('#blankChoiceForm > input[type=submit]').click();
433
+ }
434
+ console.log('Waiting for the user management configuration page to load... ⏳');
435
+ await page.waitForSelector('form[action="setupusermanagementchoice.action"]', { timeout: 5 * 60 * 1000 });
436
+ }
437
+ // Configure User Management
438
+ const mustConfigureUserManagement = !!await page.$('form[action="setupusermanagementchoice.action"]');
439
+ if (mustConfigureUserManagement) {
440
+ if (options.userManagement === 'confluence') {
441
+ await page.locator('#internal').click();
442
+ console.log('Waiting for the system administration account configuration page to load... ⏳');
443
+ await page.waitForSelector('form[action="setupadministrator.action"]', { timeout: 5 * 60 * 1000 });
444
+ }
445
+ else {
446
+ await page.locator('#jaacs').click();
447
+ console.log('Waiting for the Connect to Jira page to load... ⏳');
448
+ await page.waitForSelector('form[action="connecttojira.action"]', { timeout: 5 * 60 * 1000 });
449
+ }
450
+ }
451
+ // Configure System Administrator Account
452
+ const mustConfigureAdministratorAccount = !!await page.$('form[action="setupadministrator.action"]');
453
+ if (mustConfigureAdministratorAccount) {
454
+ console.log('Configuring the administrator account');
455
+ await page.locator('input[name=username]').fill(options.username);
456
+ await page.locator('input[name=fullName]').fill(options.fullName);
457
+ await page.locator('input[name=email]').fill(options.email);
458
+ await page.locator('input[name=password]').fill(options.password);
459
+ await page.locator('input[name=confirm]').fill(options.password);
460
+ await page.locator('#setup-next-button').click();
461
+ console.log('Waiting for the setup successful notification to load... ⏳');
462
+ await page.waitForSelector('a.finishAction', { timeout: 5 * 60 * 1000 });
463
+ }
464
+ const mustFinishSetup = !!await page.$('a.finishAction');
465
+ if (mustFinishSetup) {
466
+ console.log('Finalizing initial Confluence setup');
467
+ await page.locator('a.finishAction').click();
468
+ console.log('Waiting for the initial space creation form to load... ⏳');
469
+ await page.waitForSelector('#grow-intro-create-space', { timeout: 5 * 60 * 1000 });
470
+ }
471
+ // We're done here, let's wrap things up
472
+ console.log(`Finished automated initial setup of Atlassian Confluence 💪`);
473
+ await page.close();
474
+ await browser.close();
475
+ return true;
476
+ }
477
+ catch (err) {
478
+ console.error('Failed to automatically setup Atlassian Confluence');
479
+ console.log(err);
480
+ return false;
481
+ }
482
+ };
483
+
484
+ const showHelpWithDefaultCommandOptions = {
485
+ visibleOptions: (cmd) => {
486
+ let options = cmd.options;
487
+ if (!cmd.parent && options.length === 0) {
488
+ const defaultCommandName = cmd._defaultCommandName;
489
+ if (defaultCommandName) {
490
+ const defaultCommand = cmd.commands.find(item => item._name === defaultCommandName);
491
+ if (defaultCommand) {
492
+ options = defaultCommand.options;
493
+ }
494
+ }
495
+ }
496
+ return Array.from(options);
497
+ }
498
+ };
499
+
500
+ const program = new Command$1();
501
+ const Command = () => {
502
+ return {
503
+ action: async (options) => {
504
+ const config = await getConfig(options.config, options.cwd);
505
+ await setupHost(options.product, config);
506
+ },
507
+ errorHandler: async () => {
508
+ }
509
+ };
510
+ };
511
+ program
512
+ .name('dcdx configure')
513
+ .description(`Automated initial setup of the host application
514
+ If you wish to run a specific host application, call this command with 'dcdx configure <name>'`)
515
+ .addHelpText('afterAll', '​') // there is a non-zero white space because the only reason to have this is to force a line break
516
+ .configureHelp(showHelpWithDefaultCommandOptions)
517
+ .allowUnknownOption(false)
518
+ .allowExcessArguments(false)
519
+ .showHelpAfterError(true);
520
+ program
521
+ .command('default', { isDefault: true, hidden: true })
522
+ .addOption(new Option('-p, --product <name>', 'The name of the host application').choices(Object.values(SupportedApplications.Values)))
523
+ .addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
524
+ .addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
525
+ .addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
526
+ .action(options => ActionHandler(program, Command(), options));
527
+ program
528
+ .command(SupportedApplications.Values.jira)
529
+ .description('Automated initial setup of Atlassian Jira')
530
+ .addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
531
+ .addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
532
+ .addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
533
+ .action(options => ActionHandler(program, Command(), { ...options, name: SupportedApplications.Values.jira }));
534
+ program
535
+ .command(SupportedApplications.Values.confluence)
536
+ .description('Automated initial setup of Atlassian Confluence')
537
+ .addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
538
+ .addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
539
+ .addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
540
+ .action(options => ActionHandler(program, Command(), { ...options, name: SupportedApplications.Values.confluence }));
541
+ program
542
+ .command(SupportedApplications.Values.bamboo)
543
+ .description('Automated initial setup of Atlassian Bamboo')
544
+ .addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
545
+ .addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
546
+ .addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
547
+ .action(options => ActionHandler(program, Command(), { ...options, name: SupportedApplications.Values.bamboo }));
548
+ program
549
+ .command(SupportedApplications.Values.bitbucket)
550
+ .description('Automated initial setup of Atlassian Bitbucket')
551
+ .addOption(new Option('-c, --config <path>', 'Path to the configuration file').default('dcdx.config.mjs'))
552
+ .addOption(new Option('-u, --url <url>', 'The URL of the host application').default('http://localhost'))
553
+ .addOption(new Option('--cwd <directory>', 'Specify the working directory where to find the configuration'))
554
+ .action(options => ActionHandler(program, Command(), { ...options, name: SupportedApplications.Values.bitbucket }));
555
+ program.parseAsync().catch(() => gracefulExit(1));
556
+ process.on('SIGINT', () => {
557
+ console.log(`Received term signal, trying to stop gracefully 💪`);
558
+ gracefulExit();
559
+ });
560
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlndXJlLmpzIiwic291cmNlcyI6WyIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL0FjdGlvbkhhbmRsZXIuanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL3RvQWJzb2x1dGVQYXRoLmpzIiwiLi4vLi4vZGlzdC9zcmMvaGVscGVycy9nZXRWZXJzaW9ucy5qcyIsIi4uLy4uL2Rpc3Qvc3JjL3R5cGVzL0RhdGFiYXNlLmpzIiwiLi4vLi4vZGlzdC9zcmMvdHlwZXMvQXBwbGljYXRpb24uanMiLCIuLi8uLi9kaXN0L3NyYy90eXBlcy9Db25maWd1cmUuanMiLCIuLi8uLi9kaXN0L3NyYy90eXBlcy9Db25maWcuanMiLCIuLi8uLi9kaXN0L3NyYy9oZWxwZXJzL2dldENvbmZpZy5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2hlbHBlcnMvY2FwaXRhbGl6ZS5qcyIsIi4uLy4uL2Rpc3Qvc3JjL2hlbHBlcnMvc2V0dXBIb3N0LmpzIiwiLi4vLi4vZGlzdC9zcmMvaGVscGVycy9zaG93SGVscFdpdGhEZWZhdWx0Q29tbWFuZE9wdGlvbnMuanMiLCIuLi8uLi9kaXN0L3NyYy9jb21tYW5kcy9jb25maWd1cmUuanMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYXN5bmNFeGl0SG9vaywgZ3JhY2VmdWxFeGl0IH0gZnJvbSAnZXhpdC1ob29rJztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuZXhwb3J0IGNvbnN0IEFjdGlvbkhhbmRsZXIgPSBhc3luYyAocHJvZ3JhbSwgeyBhY3Rpb24sIGVycm9ySGFuZGxlciB9LCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3Qgb3BzID0gb3B0aW9ucyB8fCBwcm9ncmFtLm9wdHMoKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZSgoXywgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCBlcnJvck1lc3NhZ2UgPSAnJztcbiAgICAgICAgYXN5bmNFeGl0SG9vayhhc3luYyAoY29kZSkgPT4ge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBpZiAoY29kZSAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBlcnJvckhhbmRsZXIob3BzKS5jYXRjaCgoKSA9PiBudWxsKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGVycm9yTWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3JNZXNzYWdlLnRyaW0oKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgcmVqZWN0aW5nIHRoZSBwcm9taXNlIHRvIGF2b2lkIHRoZVxuICAgICAgICAgICAgICAgICAgICAvLyBcIkNhbGxpbmcgcHJvY2Vzcy5leGl0XCIgbG9nIG1lc3NhZ2UgZnJvbSBleGl0LWhvb2tcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG51bGwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gZXJyIGluc3RhbmNlb2YgRXJyb3IgPyBlcnIubWVzc2FnZSA6IGVycjtcbiAgICAgICAgICAgICAgICByZWplY3QobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIHdhaXQ6IDYwICogMSAqIDEwMDBcbiAgICAgICAgfSk7XG4gICAgICAgIGFjdGlvbihvcHMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgZ3JhY2VmdWxFeGl0KDApO1xuICAgICAgICB9KS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIHouWm9kRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBlcnIuaXNzdWVzLmZvckVhY2goaXNzdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgKz0gYFVuYWJsZSB0byBwYXJzZSBvcHRpb24gJHtpc3N1ZS5wYXRoLmpvaW4oJywnKX06ICR7aXNzdWUubWVzc2FnZX1cXG5gO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZXJyIGluc3RhbmNlb2YgRXJyb3IgfHwgdHlwZW9mIGVyciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPSBlcnIudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyYWNlZnVsRXhpdCgxKTtcbiAgICAgICAgfSk7XG4gICAgfSkuY2F0Y2gobWVzc2FnZSA9PiB7XG4gICAgICAgIGlmIChtZXNzYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgICBwcm9ncmFtLmVycm9yKG1lc3NhZ2UpO1xuICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZXJyb3IgbWVzc2FnZSxcbiAgICAgICAgICAgIC8vIHdlIGNhbiBhc3N1bWUgYSBjbGVhbiBleGl0XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG4iLCJpbXBvcnQgeyByZWFscGF0aFN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luIH0gZnJvbSAncGF0aCc7XG5leHBvcnQgY29uc3QgdG9BYnNvbHV0ZVBhdGggPSAocmVsYXRpdmVQYXRoKSA9PiB7XG4gICAgY29uc3QgWywgZmlsZVBhdGhdID0gcHJvY2Vzcy5hcmd2O1xuICAgIGNvbnN0IGV4ZWN1dGFibGVGaWxlRGlyID0gZGlybmFtZShyZWFscGF0aFN5bmMoZmlsZVBhdGgpKTtcbiAgICBjb25zdCBiYXNlZGlyID0gZXhlY3V0YWJsZUZpbGVEaXIuc3Vic3RyaW5nKDAsIGV4ZWN1dGFibGVGaWxlRGlyLmluZGV4T2YoJ2RjZHgnKSArIDQpO1xuICAgIHJldHVybiBqb2luKGJhc2VkaXIsIHJlbGF0aXZlUGF0aC5yZXBsYWNlQWxsKCcuLi8nLCAnJykpO1xufTtcbiIsImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IHRvQWJzb2x1dGVQYXRoIH0gZnJvbSAnLi90b0Fic29sdXRlUGF0aCc7XG5leHBvcnQgY29uc3QgZ2V0VmVyc2lvbnMgPSAoKSA9PiB7XG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlU3luYyh0b0Fic29sdXRlUGF0aCgnLi4vLi4vYXNzZXRzL3ZlcnNpb25zLmpzb24nKSwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgdmVyc2lvbnMgPSBKU09OLnBhcnNlKGNvbnRlbnQpO1xuICAgIHJldHVybiB2ZXJzaW9ucztcbn07XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IGdldFZlcnNpb25zIH0gZnJvbSAnLi4vaGVscGVycy9nZXRWZXJzaW9ucyc7XG5jb25zdCB2ZXJzaW9ucyA9IGdldFZlcnNpb25zKCk7XG5leHBvcnQgY29uc3QgU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzID0gei5lbnVtKFtcbiAgICAncG9zdGdyZXNxbCcsXG4gICAgJ215c3FsJyxcbiAgICAnbXNzcWwnXG5dKTtcbmV4cG9ydCBjb25zdCBTdXBwb3J0ZWRNU1NRTEVkaXRpb25zID0gei5lbnVtKFtcbiAgICAnRGV2ZWxvcGVyJyxcbiAgICAnRXhwcmVzcycsXG4gICAgJ1N0YW5kYXJkJyxcbiAgICAnRW50ZXJwcmlzZScsXG4gICAgJ0VudGVycHJpc2VDb3JlJ1xuXSk7XG5leHBvcnQgY29uc3QgRGF0YWJhc2VPcHRpb25zID0gei5vYmplY3Qoe1xuICAgIG5hbWU6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcyxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSksXG4gICAgZGF0YWJhc2U6IHouc3RyaW5nKCkuZGVmYXVsdCgnZGNkeCcpLFxuICAgIHVzZXJuYW1lOiB6LnN0cmluZygpLmRlZmF1bHQoJ2RjZHgnKSxcbiAgICBwYXNzd29yZDogei5zdHJpbmcoKS5kZWZhdWx0KCdkY2R4JyksXG4gICAgY2xlYW46IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIHBydW5lOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICB2ZXJib3NlOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKClcbn0pO1xuZXhwb3J0IGNvbnN0IFBvc3RncmVTUUxPcHRpb25zID0gRGF0YWJhc2VPcHRpb25zLmV4dGVuZCh7XG4gICAgbmFtZTogU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLnJlZmluZShpdGVtID0+IGl0ZW0gPT09IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5WYWx1ZXMucG9zdGdyZXNxbCkuZGVmYXVsdChTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLnBvc3RncmVzcWwpLFxuICAgIHRhZzogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiB2ZXJzaW9uc1tTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLnBvc3RncmVzcWxdLmluY2x1ZGVzKGl0ZW0pKS5kZWZhdWx0KCdsYXRlc3QnKSxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSkuZGVmYXVsdCg1NDMyKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gJ29yZy5wb3N0Z3Jlc3FsLkRyaXZlcicpLmRlZmF1bHQoJ29yZy5wb3N0Z3Jlc3FsLkRyaXZlcicpXG59KTtcbmV4cG9ydCBjb25zdCBNeVNRTE9wdGlvbnMgPSBEYXRhYmFzZU9wdGlvbnMuZXh0ZW5kKHtcbiAgICBuYW1lOiBTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLlZhbHVlcy5teXNxbCkuZGVmYXVsdChTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm15c3FsKSxcbiAgICB0YWc6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gdmVyc2lvbnNbU3VwcG9ydGVkRGF0YWJhc2VFbmdpbmVzLlZhbHVlcy5teXNxbF0uaW5jbHVkZXMoaXRlbSkpLmRlZmF1bHQoJ2xhdGVzdCcpLFxuICAgIHBvcnQ6IHoubnVtYmVyKCkub3Ioei5zdHJpbmcoKS50cmFuc2Zvcm0oTnVtYmVyKS5yZWZpbmUoaXRlbSA9PiAhaXNOYU4oaXRlbSkpKS5kZWZhdWx0KDMzMDYpLFxuICAgIGRyaXZlcjogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSAnY29tLm15c3FsLmpkYmMuRHJpdmVyJykuZGVmYXVsdCgnY29tLm15c3FsLmpkYmMuRHJpdmVyJylcbn0pO1xuZXhwb3J0IGNvbnN0IE1TU1FMT3B0aW9ucyA9IERhdGFiYXNlT3B0aW9ucy5leHRlbmQoe1xuICAgIG5hbWU6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSBTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm1zc3FsKS5kZWZhdWx0KFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5WYWx1ZXMubXNzcWwpLFxuICAgIHRhZzogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiB2ZXJzaW9uc1tTdXBwb3J0ZWREYXRhYmFzZUVuZ2luZXMuVmFsdWVzLm1zc3FsXS5pbmNsdWRlcyhpdGVtKSkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgZWRpdGlvbjogU3VwcG9ydGVkTVNTUUxFZGl0aW9ucy5kZWZhdWx0KCdEZXZlbG9wZXInKSxcbiAgICBwb3J0OiB6Lm51bWJlcigpLm9yKHouc3RyaW5nKCkudHJhbnNmb3JtKE51bWJlcikucmVmaW5lKGl0ZW0gPT4gIWlzTmFOKGl0ZW0pKSkuZGVmYXVsdCgxNDMzKSxcbiAgICB1c2VybmFtZTogei5zdHJpbmcoKS5yZWZpbmUoaXRlbSA9PiBpdGVtID09PSAnc2EnKS5kZWZhdWx0KCdzYScpLFxuICAgIHBhc3N3b3JkOiB6LnN0cmluZygpLmRlZmF1bHQoJ0RhdGFDZW50ZXJEWCEnKSxcbiAgICBkcml2ZXI6IHouc3RyaW5nKCkucmVmaW5lKGl0ZW0gPT4gaXRlbSA9PT0gJ2NvbS5taWNyb3NvZnQuc3Fsc2VydmVyLmpkYmMuU1FMU2VydmVyRHJpdmVyJykuZGVmYXVsdCgnY29tLm1pY3Jvc29mdC5zcWxzZXJ2ZXIuamRiYy5TUUxTZXJ2ZXJEcml2ZXInKVxufSk7XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcyB9IGZyb20gJy4vRGF0YWJhc2UnO1xuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZEFwcGxpY2F0aW9ucyA9IHouZW51bShbXG4gICAgJ2ppcmEnLFxuICAgICdjb25mbHVlbmNlJyxcbiAgICAnYml0YnVja2V0JyxcbiAgICAnYmFtYm9vJ1xuXSk7XG5leHBvcnQgY29uc3QgQXBwbGljYXRpb25PcHRpb25zID0gei5vYmplY3Qoe1xuICAgIG5hbWU6IFN1cHBvcnRlZEFwcGxpY2F0aW9ucyxcbiAgICB0YWc6IHouc3RyaW5nKCkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgZGF0YWJhc2U6IFN1cHBvcnRlZERhdGFiYXNlRW5naW5lcy5kZWZhdWx0KCdwb3N0Z3Jlc3FsJyksXG4gICAgZGF0YWJhc2VUYWc6IHouc3RyaW5nKCkuZGVmYXVsdCgnbGF0ZXN0JyksXG4gICAgcG9ydDogei5zdHJpbmcoKS50cmFuc2Zvcm0oTnVtYmVyKS5yZWZpbmUoaXRlbSA9PiAhaXNOYU4oaXRlbSkpLmRlZmF1bHQoJzgwJyksXG4gICAgY29udGV4dFBhdGg6IHouc3RyaW5nKCksXG4gICAgeG1zOiB6LnN0cmluZygpLmRlZmF1bHQoJzEwMjRtJyksXG4gICAgeG14OiB6LnN0cmluZygpLmRlZmF1bHQoJzEwMjRtJyksXG4gICAgd2F0Y2g6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIGV4dDogei5hcnJheSh6LnN0cmluZygpKSxcbiAgICBpbnN0YWxsOiB6LmJvb2xlYW4oKSxcbiAgICBvdXRwdXREaXJlY3Rvcnk6IHouc3RyaW5nKCksXG4gICAgYWN0aXZhdGVQcm9maWxlczogei5zdHJpbmcoKSxcbiAgICBjb25maWd1cmU6IHouYm9vbGVhbigpLmRlZmF1bHQoZmFsc2UpLFxuICAgIGNsZWFuOiB6LmJvb2xlYW4oKS5kZWZhdWx0KGZhbHNlKSxcbiAgICBwcnVuZTogei5ib29sZWFuKCkuZGVmYXVsdChmYWxzZSksXG4gICAgZGVidWc6IHouYm9vbGVhbigpLmRlZmF1bHQodHJ1ZSksXG4gICAganZtOiB6LnN0cmluZygpLFxuICAgIGN3ZDogei5zdHJpbmcoKVxufSkucGFydGlhbCh7XG4gICAgY29udGV4dFBhdGg6IHRydWUsXG4gICAgZXh0OiB0cnVlLFxuICAgIGluc3RhbGw6IHRydWUsXG4gICAgb3V0cHV0RGlyZWN0b3J5OiB0cnVlLFxuICAgIGFjdGl2YXRlUHJvZmlsZXM6IHRydWUsXG4gICAganZtOiB0cnVlLFxuICAgIGN3ZDogdHJ1ZVxufSk7XG4iLCJpbXBvcnQgeyB6IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IFN1cHBvcnRlZEFwcGxpY2F0aW9ucyB9IGZyb20gJy4vQXBwbGljYXRpb24nO1xuZXhwb3J0IGNvbnN0IENvbmZpZ3VyZU9wdGlvbnMgPSB6Lm9iamVjdCh7XG4gICAgcHJvZHVjdDogU3VwcG9ydGVkQXBwbGljYXRpb25zLFxuICAgIGNvbmZpZzogei5zdHJpbmcoKSxcbiAgICBjd2Q6IHouc3RyaW5nKClcbn0pLnBhcnRpYWwoe1xuICAgIGNvbmZpZzogdHJ1ZSxcbiAgICBjd2Q6IHRydWVcbn0pO1xuZXhwb3J0IGNvbnN0IENvbmZpZ3VyZUppcmEgPSB6Lm9iamVjdCh7XG4gICAgdGl0bGU6IHouc3RyaW5nKCksXG4gICAgbW9kZTogei5lbnVtKFsncHJpdmF0ZScsICdwdWJsaWMnXSksXG4gICAgYmFzZVVybDogei5zdHJpbmcoKSxcbiAgICBmdWxsbmFtZTogei5zdHJpbmcoKSxcbiAgICBlbWFpbDogei5zdHJpbmcoKSxcbiAgICB1c2VybmFtZTogei5zdHJpbmcoKSxcbiAgICBwYXNzd29yZDogei5zdHJpbmcoKSxcbiAgICBjb25maWd1cmVFbWFpbDogei5lbnVtKFsnbGF0ZXInLCAnbm93J10pLFxuICAgIGVtYWlsTmFtZTogei5zdHJpbmcoKSxcbiAgICBlbWFpbEZyb21BZGRyZXNzOiB6LnN0cmluZygpLFxuICAgIGVtYWlsUHJlZml4OiB6LnN0cmluZygpLFxuICAgIGVtYWlsU2VydmVyVHlwZTogei5lbnVtKFsnc210cCcsICdqbmRpJ10pLFxuICAgIGVtYWlsSm5kaUxvY2F0aW9uOiB6LnN0cmluZygpLFxuICAgIGVtYWlsU2VydmljZVByb3ZpZGVyOiB6LmVudW0oWydjdXN0b20nLCAnZ29vZ2xlLWFwcHMtbWFpbC0vLWdtYWlsLTgnLCAneWFob28hLW1haWwtcGx1cy05J10pLFxuICAgIGVtYWlsSG9zdE5hbWU6IHouc3RyaW5nKCksXG4gICAgZW1haWxQcm90b2NvbDogei5lbnVtKFsnU01UUCcsICdTRUNVUkVfU01UUCddKSxcbiAgICBlbWFpbFBvcnQ6IHoubnVtYmVyKCksXG4gICAgZW1haWxUaW1lb3V0OiB6Lm51bWJlcigpLFxuICAgIGVtYWlsVExTOiB6LmJvb2xlYW4oKSxcbiAgICBlbWFpbFVzZXJuYW1lOiB6LnN0cmluZygpLFxuICAgIGVtYWlsUGFzc3dvcmQ6IHouc3RyaW5nKCksXG4gICAgbGFuZ3VhZ2U6IHouZW51bShbXG4gICAgICAgICdlbi1VUycsXG4gICAgICAgICd6aF9DTicsXG4gICAgICAgICdjc19DWicsXG4gICAgICAgICdkYV9ESycsXG4gICAgICAgICdubF9OTCcsXG4gICAgICAgICdlbl9VSycsXG4gICAgICAgICdldF9FRScsXG4gICAgICAgICdmaV9GSScsXG4gICAgICAgICdmcl9GUicsXG4gICAgICAgICdkZV9ERScsXG4gICAgICAgICdodV9IVScsXG4gICAgICAgICdpc19JUycsXG4gICAgICAgICdpdF9JVCcsXG4gICAgICAgICdqYV9KUCcsXG4gICAgICAgICdrb19LUicsXG4gICAgICAgICdub19OTycsXG4gICAgICAgICdwbF9QTCcsXG4gICAgICAgICdwdF9CUicsXG4gICAgICAgICdyb19STycsXG4gICAgICAgICdydV9SVScsXG4gICAgICAgICdza19TSycsXG4gICAgICAgICdlc19FUycsXG4gICAgICAgICdzdl9TRSdcbiAgICBdKSxcbiAgICBhdmF0YXJQYXRoOiB6LnN0cmluZygpXG59KS5wYXJ0aWFsKHtcbiAgICBlbWFpbE5hbWU6IHRydWUsXG4gICAgZW1haWxGcm9tQWRkcmVzczogdHJ1ZSxcbiAgICBlbWFpbFByZWZpeDogdHJ1ZSxcbiAgICBlbWFpbFNlcnZlclR5cGU6IHRydWUsXG4gICAgZW1haWxKbmRpTG9jYXRpb246IHRydWUsXG4gICAgZW1haWxTZXJ2aWNlUHJvdmlkZXI6IHRydWUsXG4gICAgZW1haWxIb3N0TmFtZTogdHJ1ZSxcbiAgICBlbWFpbFByb3RvY29sOiB0cnVlLFxuICAgIGVtYWlsUG9ydDogdHJ1ZSxcbiAgICBlbWFpbFRpbWVvdXQ6IHRydWUsXG4gICAgZW1haWxUTFM6IHRydWUsXG4gICAgZW1haWxVc2VybmFtZTogdHJ1ZSxcbiAgICBlbWFpbFBhc3N3b3JkOiB0cnVlLFxuICAgIGxhbmd1YWdlOiB0cnVlLFxuICAgIGF2YXRhclBhdGg6IHRydWVcbn0pO1xuZXhwb3J0IGNvbnN0IENvbmZpZ3VyZUNvbmZsdWVuY2UgPSB6Lm9iamVjdCh7XG4gICAgYmFzZVVybDogei5zdHJpbmcoKSxcbiAgICBkZXBsb3ltZW50VHlwZTogei5lbnVtKFsnbm9uLWNsdXN0ZXJlZCcsICdjbHVzdGVyZWQnXSksXG4gICAgdXNlcm5hbWU6IHouc3RyaW5nKCksXG4gICAgZnVsbE5hbWU6IHouc3RyaW5nKCksXG4gICAgZW1haWw6IHouc3RyaW5nKCksXG4gICAgcGFzc3dvcmQ6IHouc3RyaW5nKCksXG4gICAgY2x1c3Rlck5hbWU6IHouc3RyaW5nKCksXG4gICAgY2x1c3RlckhvbWU6IHouc3RyaW5nKCksXG4gICAgY2x1c3RlckpvaW5Nb2RlOiB6LmVudW0oWyd1c2VNdWx0aWNhc3QnLCAndXNlVGNwSXAnLCAndXNlQXdzJ10pLFxuICAgIGNsdXN0ZXJBdXRvQWRkcmVzczogei5ib29sZWFuKCksXG4gICAgbG9hZENvbnRlbnQ6IHouZW51bShbJ2V4YW1wbGUnLCAnZW1wdHknXSksXG4gICAgdXNlck1hbmFnZW1lbnQ6IHouZW51bShbJ2NvbmZsdWVuY2UnLCAnamlyYSddKSxcbiAgICBqaXJhQmFzZVVybDogei5zdHJpbmcoKSxcbiAgICBqaXJhVXNlcm5hbWU6IHouc3RyaW5nKCksXG4gICAgamlyYVBhc3N3b3JkOiB6LnN0cmluZygpLFxuICAgIGppcmFVc2VyR3JvdXBzOiB6LnN0cmluZygpLFxuICAgIGppcmFBZG1pbkdyb3Vwczogei5zdHJpbmcoKSxcbn0pLnBhcnRpYWwoe1xuICAgIGNsdXN0ZXJOYW1lOiB0cnVlLFxuICAgIGNsdXN0ZXJIb21lOiB0cnVlLFxuICAgIGNsdXN0ZXJKb2luTW9kZTogdHJ1ZSxcbiAgICBjbHVzdGVyQXV0b0FkZHJlc3M6IHRydWUsXG4gICAgamlyYUJhc2VVcmw6IHRydWUsXG4gICAgamlyYVVzZXJuYW1lOiB0cnVlLFxuICAgIGppcmFQYXNzd29yZDogdHJ1ZSxcbiAgICBqaXJhVXNlckdyb3VwczogdHJ1ZSxcbiAgICBqaXJhQWRtaW5Hcm91cHM6IHRydWVcbn0pO1xuIiwiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgeyBTdXBwb3J0ZWRBcHBsaWNhdGlvbnMgfSBmcm9tICcuL0FwcGxpY2F0aW9uJztcbmltcG9ydCB7IENvbmZpZ3VyZUNvbmZsdWVuY2UsIENvbmZpZ3VyZUppcmEgfSBmcm9tICcuL0NvbmZpZ3VyZSc7XG5leHBvcnQgY29uc3QgQ29uZmlnID0gei5vYmplY3Qoe1xuICAgIHNldHVwOiB6Lm9iamVjdCh7XG4gICAgICAgIFtTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmppcmFdOiBDb25maWd1cmVKaXJhLFxuICAgICAgICBbU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5jb25mbHVlbmNlXTogQ29uZmlndXJlQ29uZmx1ZW5jZSxcbiAgICAgICAgW1N1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuYmFtYm9vXTogei5vYmplY3Qoe30pLFxuICAgICAgICBbU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5iaXRidWNrZXRdOiB6Lm9iamVjdCh7fSlcbiAgICB9KS5wYXJ0aWFsKClcbn0pO1xuIiwiLypcbiAgQ29kZSBhdHJyaWJ1dGlvblxuICBib3Jyb3dlZCBzb21lIGxvZ2ljIGZvciBsb2FkaW5nIGNvbmZpZ3VyYXRpb24gZmlsZXMgZnJvbSBFU0xpbnRcbiAgaHR0cHM6Ly9naXRodWIuY29tL2VzbGludC9lc2xpbnQvYmxvYi9tYWluL2xpYi9jb25maWcvY29uZmlnLWxvYWRlci5qc1xuKi9cbmltcG9ydCB7IGV4aXN0c1N5bmMsIHN0YXRTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgaXNBYnNvbHV0ZSwgam9pbiB9IGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gJ3VybCc7XG5pbXBvcnQgeyBDb25maWcgfSBmcm9tICcuLi90eXBlcy9Db25maWcnO1xuZXhwb3J0IGNvbnN0IGdldENvbmZpZyA9IGFzeW5jIChwYXRoLCBjd2QpID0+IHtcbiAgICBjb25zdCBkaXJlY3RvcnkgPSBjd2QgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCBjb25maWdGaWxlID0gcGF0aCB8fCAnZGNkeC5jb25maWcubWpzJztcbiAgICBjb25zdCBjb25maWdQYXRoID0gaXNBYnNvbHV0ZShjb25maWdGaWxlKSAmJiBleGlzdHNTeW5jKGNvbmZpZ0ZpbGUpID8gY29uZmlnRmlsZSA6IGpvaW4oZGlyZWN0b3J5LCBjb25maWdGaWxlKTtcbiAgICBpZiAoIWV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBkY2R4IGNvbmZpZ3VyYXRpb24gZmlsZS4gUGxlYXNlIG1ha2Ugc3VyZSB0byBzcGVjaWZ5IHRoZSBjb3JyZWN0IHdvcmtpbmcgZGlyZWN0b3J5ICgtLWN3ZCkgb3IgcGF0aCB0byB0aGUgZmlsZSAoLWMsIC0tY29uZmlnKScpO1xuICAgIH1cbiAgICAvKlxuICAgICAqIEV4cGxhbmF0aW9uIGNvcGllZCBmcm9tIEVTTGludFxuICAgICAqXG4gICAgICogQXBwZW5kIGEgcXVlcnkgd2l0aCB0aGUgY29uZmlnIGZpbGUncyBtb2RpZmljYXRpb24gdGltZSAoYG10aW1lYCkgaW4gb3JkZXJcbiAgICAgKiB0byBpbXBvcnQgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgY29uZmlnIGZpbGUuIFdpdGhvdXQgdGhlIHF1ZXJ5LCBgaW1wb3J0KClgIHdvdWxkXG4gICAgICogY2FjaGUgdGhlIGNvbmZpZyBmaWxlIG1vZHVsZSBieSB0aGUgcGF0aG5hbWUgb25seSwgYW5kIHRoZW4gYWx3YXlzIHJldHVyblxuICAgICAqIHRoZSBzYW1lIHZlcnNpb24gKHRoZSBvbmUgdGhhdCB3YXMgYWN0dWFsIHdoZW4gdGhlIG1vZHVsZSB3YXMgaW1wb3J0ZWQgZm9yIHRoZSBmaXJzdCB0aW1lKS5cbiAgICAgKlxuICAgICAqIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBjb25maWcgZmlsZSBtb2R1bGUgaXMgbG9hZGVkIGFuZCBleGVjdXRlZCBhZ2FpblxuICAgICAqIGlmIGl0IGhhcyBiZWVuIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdGltZSBpdCB3YXMgaW1wb3J0ZWQuXG4gICAgICogSWYgaXQgaGFzbid0IGJlZW4gY2hhbmdlZCwgYGltcG9ydCgpYCB3aWxsIGp1c3QgcmV0dXJuIHRoZSBjYWNoZWQgdmVyc2lvbi5cbiAgICAgKlxuICAgICAqIE5vdGUgdGhhdCB3ZSBzaG91bGQgbm90IG92ZXJ1c2UgcXVlcmllcyAoZS5nLiwgYnkgYXBwZW5kaW5nIHRoZSBjdXJyZW50IHRpbWVcbiAgICAgKiB0byBhbHdheXMgcmVsb2FkIHRoZSBjb25maWcgZmlsZSBtb2R1bGUpIGFzIHRoYXQgY291bGQgY2F1c2UgbWVtb3J5IGxlYWtzXG4gICAgICogYmVjYXVzZSBlbnRyaWVzIGFyZSBuZXZlciByZW1vdmVkIGZyb20gdGhlIGltcG9ydCBjYWNoZS5cbiAgICAgKi9cbiAgICBjb25zdCBtdGltZSA9IHN0YXRTeW5jKGNvbmZpZ1BhdGgpLm10aW1lLmdldFRpbWUoKTtcbiAgICBjb25zdCBmaWxlVVJMID0gcGF0aFRvRmlsZVVSTChjb25maWdQYXRoKTtcbiAgICBmaWxlVVJMLnNlYXJjaFBhcmFtcy5hcHBlbmQoJ210aW1lJywgbXRpbWUudG9GaXhlZCgpKTtcbiAgICBjb25zdCBmaWxlUGF0aCA9IGZpbGVVUkwudG9TdHJpbmcoKTtcbiAgICBjb25zdCByZXN1bHQgPSAoYXdhaXQgaW1wb3J0KGZpbGVQYXRoKSkuZGVmYXVsdDtcbiAgICByZXR1cm4gQ29uZmlnLnBhcnNlKHJlc3VsdCk7XG59O1xuIiwiZXhwb3J0IGNvbnN0IGNhcGl0YWxpemUgPSAodmFsdWUpID0+IHZhbHVlLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdmFsdWUuc2xpY2UoMSk7XG4iLCJpbXBvcnQgcHVwcGV0ZWVyIGZyb20gJ3B1cHBldGVlcic7XG5pbXBvcnQgeyBTdXBwb3J0ZWRBcHBsaWNhdGlvbnMgfSBmcm9tICcuLi90eXBlcy9BcHBsaWNhdGlvbic7XG5pbXBvcnQgeyBDb25maWd1cmVDb25mbHVlbmNlLCBDb25maWd1cmVKaXJhIH0gZnJvbSAnLi4vdHlwZXMvQ29uZmlndXJlJztcbmltcG9ydCB7IGNhcGl0YWxpemUgfSBmcm9tICcuL2NhcGl0YWxpemUnO1xuZXhwb3J0IGNvbnN0IHNldHVwSG9zdCA9IGFzeW5jIChuYW1lLCBjb25maWcpID0+IHtcbiAgICBjb25zdCBvcHRpb25zID0gY29uZmlnLnNldHVwW25hbWVdO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCBmaW5kIGluaXRpYWwgc2V0dXAgY29uZmlndXJhdGlvbiBmb3IgJHtjYXBpdGFsaXplKG5hbWUpfWApO1xuICAgIH1cbiAgICBzd2l0Y2ggKG5hbWUpIHtcbiAgICAgICAgY2FzZSBTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmppcmE6XG4gICAgICAgICAgICByZXR1cm4gc2V0dXBKaXJhKENvbmZpZ3VyZUppcmEucGFyc2Uob3B0aW9ucykpO1xuICAgICAgICBjYXNlIFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuY29uZmx1ZW5jZTpcbiAgICAgICAgICAgIHJldHVybiBzZXR1cENvbmZsdWVuY2UoQ29uZmlndXJlQ29uZmx1ZW5jZS5wYXJzZShvcHRpb25zKSk7XG4gICAgICAgIGNhc2UgU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5iaXRidWNrZXQ6XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnT29wc2llIGRhaXN5IPCfjLwgQXRsYXNzaWFuIEJpdGJ1Y2tldCBkb2VzIG5vdCByZXF1aXJlIGFkZGl0aW9uYWwgc2V0dXAg8J+klicpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcbmNvbnN0IHNldHVwSmlyYSA9IGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gTGF1bmNoIEdvb2dsZSBDaHJvbWVcbiAgICAgICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBwYWdlIHZpZXdcbiAgICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICAgICAgICBhd2FpdCBwYWdlLnNldFZpZXdwb3J0KHsgd2lkdGg6IDEwODAsIGhlaWdodDogMTAyNCB9KTtcbiAgICAgICAgLy8gT3BlbiB0aGUgU2V0dXAgcGFnZVxuICAgICAgICBjb25zb2xlLmxvZyhgU3RhcnRpbmcgYXV0b21hdGVkIGluaXRpYWwgc2V0dXAgb2YgQXRsYXNzaWFuIEppcmEg8J+klmApO1xuICAgICAgICBhd2FpdCBwYWdlLmdvdG8ob3B0aW9ucy5iYXNlVXJsLCB7IHdhaXRVbnRpbDogWydkb21jb250ZW50bG9hZGVkJywgJ2xvYWQnLCAnbmV0d29ya2lkbGUwJ10sIHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoYXQgcHJvZ3Jlc3MgaGFzIGVuZGVkXG4gICAgICAgIGNvbnN0IGlzU3RpbGxMb2FkaW5nID0gISFhd2FpdCBwYWdlLiQoJyNwcm9ncmVzcycpO1xuICAgICAgICBpZiAoaXNTdGlsbExvYWRpbmcpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciBBdGxhc3NpYW4gSmlyYSB0byBiZSByZWFkeS4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvck5hdmlnYXRpb24oeyB3YWl0VW50aWw6IFsnZG9tY29udGVudGxvYWRlZCcsICdsb2FkJywgJ25ldHdvcmtpZGxlMCddLCB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCB1cCBhcHBsaWNhdGlvbiBwcm9wZXJ0aWVzXG4gICAgICAgIGNvbnN0IG11c3RTZXR1cEFwcGxpY2F0aW9uUHJvcGVydGllcyA9ICEhYXdhaXQgcGFnZS4kKCdmb3JtW2FjdGlvbj1cIlNldHVwQXBwbGljYXRpb25Qcm9wZXJ0aWVzLmpzcGFcIl0nKTtcbiAgICAgICAgaWYgKG11c3RTZXR1cEFwcGxpY2F0aW9uUHJvcGVydGllcykge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1NldHRpbmcgdXAgYXBwbGljYXRpb24gcHJvcGVydGllcycpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPXRpdGxlXScpLmZpbGwob3B0aW9ucy50aXRsZSk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoYGxhYmVsW2Zvcj1qaXJhLXNldHVwd2l6YXJkLW1vZGUtJHtvcHRpb25zLm1vZGV9XWApLmNsaWNrKCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2lucHV0W25hbWU9YmFzZVVSTF0nKS5maWxsKG9wdGlvbnMuYmFzZVVybCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJyNqaXJhLXNldHVwd2l6YXJkLXN1Ym1pdCcpLmNsaWNrKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV2FpdGluZyBmb3IgdGhlIGFkbWluaXN0cmF0b3IgYWNjb3VudCBzZXR1cCB3aXphcmQgdG8gbG9hZC4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCdmb3JtW2FjdGlvbj1cIlNldHVwQWRtaW5BY2NvdW50LmpzcGFcIl0nLCB7IHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gU2V0IHVwIGFkbWluaXN0cmF0b3IgYWNjb3VudFxuICAgICAgICBjb25zdCBtdXN0U2V0dXBBZG1pbkFjY291bnQgPSAhIWF3YWl0IHBhZ2UuJCgnZm9ybVthY3Rpb249XCJTZXR1cEFkbWluQWNjb3VudC5qc3BhXCJdJyk7XG4gICAgICAgIGlmIChtdXN0U2V0dXBBZG1pbkFjY291bnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTZXR0aW5nIHVwIHRoZSBhZG1pbmlzdHJhdG9yIGFjY291bnQnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXRbbmFtZT1mdWxsbmFtZV0nKS5maWxsKG9wdGlvbnMuZnVsbG5hbWUpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPWVtYWlsXScpLmZpbGwob3B0aW9ucy5lbWFpbCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2lucHV0W25hbWU9dXNlcm5hbWVdJykuZmlsbChvcHRpb25zLnVzZXJuYW1lKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXRbbmFtZT1wYXNzd29yZF0nKS5maWxsKG9wdGlvbnMucGFzc3dvcmQpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPWNvbmZpcm1dJykuZmlsbChvcHRpb25zLnBhc3N3b3JkKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignI2ppcmEtc2V0dXB3aXphcmQtc3VibWl0JykuY2xpY2soKTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciB0aGUgZW1haWwgbm90aWZpY2F0aW9uIHNldHVwIHdpemFyZCB0byBsb2FkLi4uIOKPsycpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS53YWl0Rm9yU2VsZWN0b3IoJ2Zvcm1bYWN0aW9uPVwiU2V0dXBNYWlsTm90aWZpY2F0aW9ucy5qc3BhXCJdJywgeyB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNldCB1cCBlbWFpbCBub3RpZmljYXRpb25zXG4gICAgICAgIGNvbnN0IG11c3RTZXR1cEVtYWlsTm90aWZpY2F0aW9uID0gISFhd2FpdCBwYWdlLiQoJ2Zvcm1bYWN0aW9uPVwiU2V0dXBNYWlsTm90aWZpY2F0aW9ucy5qc3BhXCJdJyk7XG4gICAgICAgIGlmIChtdXN0U2V0dXBFbWFpbE5vdGlmaWNhdGlvbikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1NldHRpbmcgdXAgdGhlIGVtYWlsIG5vdGlmaWNhdGlvbiBzZXR0aW5ncycpO1xuICAgICAgICAgICAgY29uc3QgY29uZmlndXJlRW1haWxOb3RpZmljYXRpb25zID0gb3B0aW9ucy5jb25maWd1cmVFbWFpbCA9PT0gJ2xhdGVyJyA/ICdkaXNhYmxlZCcgOiAnZW5hYmxlZCc7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoYGxhYmVsW2Zvcj1qaXJhLXNldHVwd2l6YXJkLWVtYWlsLW5vdGlmaWNhdGlvbnMtJHtjb25maWd1cmVFbWFpbE5vdGlmaWNhdGlvbnN9XWApLmNsaWNrKCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJyNqaXJhLXNldHVwd2l6YXJkLXN1Ym1pdCcpLmNsaWNrKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV2FpdGluZyBmb3IgdGhlIGxhbmd1YWdlIGNob29zZXIgdG8gbG9hZC4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCcjY2hvb3NlLWxhbmd1YWdlLWZvcm0nLCB7IHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2VsY29tZSB0byBKaXJhLCBBZG1pbmlzdHJhdG9yIVxuICAgICAgICBjb25zdCBtdXN0U2V0dXBMYW5ndWFnZSA9ICEhYXdhaXQgcGFnZS4kKCcjY2hvb3NlLWxhbmd1YWdlLWZvcm0nKTtcbiAgICAgICAgaWYgKG11c3RTZXR1cExhbmd1YWdlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnU2V0dGluZyB1cCB0aGUgbGFuZ3VhZ2UgZm9yIHRoZSBhZG1pbmlzdHJhdG9yIGFjY291bnQnKTtcbiAgICAgICAgICAgIGNvbnN0IGxhbmd1YWdlU2VsZWN0b3IgPSAhb3B0aW9ucy5sYW5ndWFnZSB8fCBvcHRpb25zLmxhbmd1YWdlID09PSAnZW4tVVMnID8gJ2xvY2FsZV8tMScgOiBgbG9jYWxlXyR7b3B0aW9ucy5sYW5ndWFnZX1gO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKGBsYWJlbFtmb3I9JHtsYW5ndWFnZVNlbGVjdG9yfV1gKS5jbGljaygpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCcjbmV4dCcpLmNsaWNrKCk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnV2FpdGluZyBmb3IgdGhlIGF2YXRhciBzZXR1cCB3aXphcmQgdG8gbG9hZC4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCcub25ib2FyZGluZy1zZXF1ZW5jZS1hdmF0YXItcGlja2VyJywgeyB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG11c3RTZXR1cEF2YXRhciA9ICEhYXdhaXQgcGFnZS4kKCcub25ib2FyZGluZy1zZXF1ZW5jZS1hdmF0YXItcGlja2VyJyk7XG4gICAgICAgIGlmIChtdXN0U2V0dXBBdmF0YXIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTZXR0aW5nIHVwIHRoZSBhdmF0YXIgZm9yIHRoZSBhZG1pbmlzdHJhdG9yIGFjY291bnQnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXQuYXZhdGFyLXBpY2tlci1kb25lJykuY2xpY2soKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCcjb25ib2FyZGluZycsIHsgdGltZW91dDogNSAqIDYwICogMTAwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSdyZSBkb25lIGhlcmUsIGxldCdzIHdyYXAgdGhpbmdzIHVwXG4gICAgICAgIGNvbnNvbGUubG9nKGBGaW5pc2hlZCBhdXRvbWF0ZWQgaW5pdGlhbCBzZXR1cCBvZiBBdGxhc3NpYW4gSmlyYSDwn5KqYCk7XG4gICAgICAgIGF3YWl0IHBhZ2UuY2xvc2UoKTtcbiAgICAgICAgYXdhaXQgYnJvd3Nlci5jbG9zZSgpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2F0Y2ggKGVycikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gYXV0b21hdGljYWxseSBzZXR1cCBBdGxhc3NpYW4gSmlyYScpO1xuICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcbmNvbnN0IHNldHVwQ29uZmx1ZW5jZSA9IGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gTGF1bmNoIEdvb2dsZSBDaHJvbWVcbiAgICAgICAgY29uc3QgYnJvd3NlciA9IGF3YWl0IHB1cHBldGVlci5sYXVuY2goKTtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBwYWdlIHZpZXdcbiAgICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IGJyb3dzZXIubmV3UGFnZSgpO1xuICAgICAgICBhd2FpdCBwYWdlLnNldFZpZXdwb3J0KHsgd2lkdGg6IDEwODAsIGhlaWdodDogMTAyNCB9KTtcbiAgICAgICAgLy8gT3BlbiB0aGUgU2V0dXAgcGFnZVxuICAgICAgICBjb25zb2xlLmxvZyhgU3RhcnRpbmcgYXV0b21hdGVkIGluaXRpYWwgc2V0dXAgb2YgQXRsYXNzaWFuIENvbmZsdWVuY2Ug8J+klmApO1xuICAgICAgICBhd2FpdCBwYWdlLmdvdG8ob3B0aW9ucy5iYXNlVXJsLCB7IHdhaXRVbnRpbDogWydkb21jb250ZW50bG9hZGVkJywgJ2xvYWQnLCAnbmV0d29ya2lkbGUwJ10sIHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgIC8vIENob29zZSB5b3VyIGRlcGxveW1lbnQgdHlwZVxuICAgICAgICBjb25zdCBtdXN0Q2hvb3NlRGVwbG95bWVudFR5cGUgPSAhIWF3YWl0IHBhZ2UuJCgnZm9ybVthY3Rpb249XCJzZXR1cGNsdXN0ZXIuYWN0aW9uXCJdJyk7XG4gICAgICAgIGlmIChtdXN0Q2hvb3NlRGVwbG95bWVudFR5cGUpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTZXR0aW5nIHVwIGRlcGxveW1lbnQgdHlwZScpO1xuICAgICAgICAgICAgY29uc3QgY2x1c3RlcmluZ1N0YXR1cyA9IG9wdGlvbnMuZGVwbG95bWVudFR5cGUgPT09ICdjbHVzdGVyZWQnID8gJ2NsdXN0ZXJpbmdFbmFibGVkJyA6ICdjbHVzdGVyaW5nRGlzYWJsZWQnO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKGBsYWJlbFtmb3I9JHtjbHVzdGVyaW5nU3RhdHVzfV1gKS5jbGljaygpO1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVwbG95bWVudFR5cGUgPT09ICdjbHVzdGVyZWQnKSB7XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIGNsdXN0ZXIgb3B0aW9uc1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignYnV0dG9uW25hbWU9bmV3Q2x1c3Rlcl0nKS5jbGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCcjc2tpcC1idXR0b24nKS5jbGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc29sZS5sb2coJ1dhaXRpbmcgZm9yIHRoZSBjb250ZW50IGNob29zZXIgcGFnZSB0byBsb2FkLi4uIOKPsycpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS53YWl0Rm9yU2VsZWN0b3IoJ2Zvcm1bYWN0aW9uPVwic2V0dXBkYXRhLmFjdGlvblwiXScsIHsgdGltZW91dDogNSAqIDYwICogMTAwMCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBMb2FkIENvbnRlbnRcbiAgICAgICAgY29uc3QgbXVzdExvYWRDb250ZW50ID0gISFhd2FpdCBwYWdlLiQoJ2Zvcm1bYWN0aW9uPVwic2V0dXBkYXRhLmFjdGlvblwiXScpO1xuICAgICAgICBpZiAobXVzdExvYWRDb250ZW50KSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5sb2FkQ29udGVudCA9PT0gJ2V4YW1wbGUnKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCcjZGVtb0Nob2ljZUZvcm0gPiBpbnB1dFt0eXBlPXN1Ym1pdF0nKS5jbGljaygpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCcjYmxhbmtDaG9pY2VGb3JtID4gaW5wdXRbdHlwZT1zdWJtaXRdJykuY2xpY2soKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciB0aGUgdXNlciBtYW5hZ2VtZW50IGNvbmZpZ3VyYXRpb24gcGFnZSB0byBsb2FkLi4uIOKPsycpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS53YWl0Rm9yU2VsZWN0b3IoJ2Zvcm1bYWN0aW9uPVwic2V0dXB1c2VybWFuYWdlbWVudGNob2ljZS5hY3Rpb25cIl0nLCB7IHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29uZmlndXJlIFVzZXIgTWFuYWdlbWVudFxuICAgICAgICBjb25zdCBtdXN0Q29uZmlndXJlVXNlck1hbmFnZW1lbnQgPSAhIWF3YWl0IHBhZ2UuJCgnZm9ybVthY3Rpb249XCJzZXR1cHVzZXJtYW5hZ2VtZW50Y2hvaWNlLmFjdGlvblwiXScpO1xuICAgICAgICBpZiAobXVzdENvbmZpZ3VyZVVzZXJNYW5hZ2VtZW50KSB7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy51c2VyTWFuYWdlbWVudCA9PT0gJ2NvbmZsdWVuY2UnKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCcjaW50ZXJuYWwnKS5jbGljaygpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdXYWl0aW5nIGZvciB0aGUgc3lzdGVtIGFkbWluaXN0cmF0aW9uIGFjY291bnQgY29uZmlndXJhdGlvbiBwYWdlIHRvIGxvYWQuLi4g4o+zJyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS53YWl0Rm9yU2VsZWN0b3IoJ2Zvcm1bYWN0aW9uPVwic2V0dXBhZG1pbmlzdHJhdG9yLmFjdGlvblwiXScsIHsgdGltZW91dDogNSAqIDYwICogMTAwMCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignI2phYWNzJykuY2xpY2soKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnV2FpdGluZyBmb3IgdGhlIENvbm5lY3QgdG8gSmlyYSBwYWdlIHRvIGxvYWQuLi4g4o+zJyk7XG4gICAgICAgICAgICAgICAgYXdhaXQgcGFnZS53YWl0Rm9yU2VsZWN0b3IoJ2Zvcm1bYWN0aW9uPVwiY29ubmVjdHRvamlyYS5hY3Rpb25cIl0nLCB7IHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ29uZmlndXJlIFN5c3RlbSBBZG1pbmlzdHJhdG9yIEFjY291bnRcbiAgICAgICAgY29uc3QgbXVzdENvbmZpZ3VyZUFkbWluaXN0cmF0b3JBY2NvdW50ID0gISFhd2FpdCBwYWdlLiQoJ2Zvcm1bYWN0aW9uPVwic2V0dXBhZG1pbmlzdHJhdG9yLmFjdGlvblwiXScpO1xuICAgICAgICBpZiAobXVzdENvbmZpZ3VyZUFkbWluaXN0cmF0b3JBY2NvdW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ29uZmlndXJpbmcgdGhlIGFkbWluaXN0cmF0b3IgYWNjb3VudCcpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPXVzZXJuYW1lXScpLmZpbGwob3B0aW9ucy51c2VybmFtZSk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2lucHV0W25hbWU9ZnVsbE5hbWVdJykuZmlsbChvcHRpb25zLmZ1bGxOYW1lKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignaW5wdXRbbmFtZT1lbWFpbF0nKS5maWxsKG9wdGlvbnMuZW1haWwpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCdpbnB1dFtuYW1lPXBhc3N3b3JkXScpLmZpbGwob3B0aW9ucy5wYXNzd29yZCk7XG4gICAgICAgICAgICBhd2FpdCBwYWdlLmxvY2F0b3IoJ2lucHV0W25hbWU9Y29uZmlybV0nKS5maWxsKG9wdGlvbnMucGFzc3dvcmQpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS5sb2NhdG9yKCcjc2V0dXAtbmV4dC1idXR0b24nKS5jbGljaygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1dhaXRpbmcgZm9yIHRoZSBzZXR1cCBzdWNjZXNzZnVsIG5vdGlmaWNhdGlvbiB0byBsb2FkLi4uIOKPsycpO1xuICAgICAgICAgICAgYXdhaXQgcGFnZS53YWl0Rm9yU2VsZWN0b3IoJ2EuZmluaXNoQWN0aW9uJywgeyB0aW1lb3V0OiA1ICogNjAgKiAxMDAwIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG11c3RGaW5pc2hTZXR1cCA9ICEhYXdhaXQgcGFnZS4kKCdhLmZpbmlzaEFjdGlvbicpO1xuICAgICAgICBpZiAobXVzdEZpbmlzaFNldHVwKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnRmluYWxpemluZyBpbml0aWFsIENvbmZsdWVuY2Ugc2V0dXAnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2UubG9jYXRvcignYS5maW5pc2hBY3Rpb24nKS5jbGljaygpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ1dhaXRpbmcgZm9yIHRoZSBpbml0aWFsIHNwYWNlIGNyZWF0aW9uIGZvcm0gdG8gbG9hZC4uLiDij7MnKTtcbiAgICAgICAgICAgIGF3YWl0IHBhZ2Uud2FpdEZvclNlbGVjdG9yKCcjZ3Jvdy1pbnRyby1jcmVhdGUtc3BhY2UnLCB7IHRpbWVvdXQ6IDUgKiA2MCAqIDEwMDAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UncmUgZG9uZSBoZXJlLCBsZXQncyB3cmFwIHRoaW5ncyB1cFxuICAgICAgICBjb25zb2xlLmxvZyhgRmluaXNoZWQgYXV0b21hdGVkIGluaXRpYWwgc2V0dXAgb2YgQXRsYXNzaWFuIENvbmZsdWVuY2Ug8J+SqmApO1xuICAgICAgICBhd2FpdCBwYWdlLmNsb3NlKCk7XG4gICAgICAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGF1dG9tYXRpY2FsbHkgc2V0dXAgQXRsYXNzaWFuIENvbmZsdWVuY2UnKTtcbiAgICAgICAgY29uc29sZS5sb2coZXJyKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbn07XG4iLCJleHBvcnQgY29uc3Qgc2hvd0hlbHBXaXRoRGVmYXVsdENvbW1hbmRPcHRpb25zID0ge1xuICAgIHZpc2libGVPcHRpb25zOiAoY21kKSA9PiB7XG4gICAgICAgIGxldCBvcHRpb25zID0gY21kLm9wdGlvbnM7XG4gICAgICAgIGlmICghY21kLnBhcmVudCAmJiBvcHRpb25zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZGVmYXVsdENvbW1hbmROYW1lID0gY21kLl9kZWZhdWx0Q29tbWFuZE5hbWU7XG4gICAgICAgICAgICBpZiAoZGVmYXVsdENvbW1hbmROYW1lKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdENvbW1hbmQgPSBjbWQuY29tbWFuZHMuZmluZChpdGVtID0+IGl0ZW0uX25hbWUgPT09IGRlZmF1bHRDb21tYW5kTmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRDb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBkZWZhdWx0Q29tbWFuZC5vcHRpb25zO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShvcHRpb25zKTtcbiAgICB9XG59O1xuIiwiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuaW1wb3J0IHsgQ29tbWFuZCBhcyBDb21tYW5kZXIsIE9wdGlvbiB9IGZyb20gJ2NvbW1hbmRlcic7XG5pbXBvcnQgeyBncmFjZWZ1bEV4aXQgfSBmcm9tICdleGl0LWhvb2snO1xuaW1wb3J0IHsgQWN0aW9uSGFuZGxlciB9IGZyb20gJy4uL2hlbHBlcnMvQWN0aW9uSGFuZGxlcic7XG5pbXBvcnQgeyBnZXRDb25maWcgfSBmcm9tICcuLi9oZWxwZXJzL2dldENvbmZpZyc7XG5pbXBvcnQgeyBzZXR1cEhvc3QgfSBmcm9tICcuLi9oZWxwZXJzL3NldHVwSG9zdCc7XG5pbXBvcnQgeyBzaG93SGVscFdpdGhEZWZhdWx0Q29tbWFuZE9wdGlvbnMgfSBmcm9tICcuLi9oZWxwZXJzL3Nob3dIZWxwV2l0aERlZmF1bHRDb21tYW5kT3B0aW9ucyc7XG5pbXBvcnQgeyBTdXBwb3J0ZWRBcHBsaWNhdGlvbnMgfSBmcm9tICcuLi90eXBlcy9BcHBsaWNhdGlvbic7XG5jb25zdCBwcm9ncmFtID0gbmV3IENvbW1hbmRlcigpO1xuY29uc3QgQ29tbWFuZCA9ICgpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBhY3Rpb246IGFzeW5jIChvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSBhd2FpdCBnZXRDb25maWcob3B0aW9ucy5jb25maWcsIG9wdGlvbnMuY3dkKTtcbiAgICAgICAgICAgIGF3YWl0IHNldHVwSG9zdChvcHRpb25zLnByb2R1Y3QsIGNvbmZpZyk7XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9ySGFuZGxlcjogYXN5bmMgKCkgPT4ge1xuICAgICAgICB9XG4gICAgfTtcbn07XG5wcm9ncmFtXG4gICAgLm5hbWUoJ2RjZHggY29uZmlndXJlJylcbiAgICAuZGVzY3JpcHRpb24oYEF1dG9tYXRlZCBpbml0aWFsIHNldHVwIG9mIHRoZSBob3N0IGFwcGxpY2F0aW9uXG5JZiB5b3Ugd2lzaCB0byBydW4gYSBzcGVjaWZpYyBob3N0IGFwcGxpY2F0aW9uLCBjYWxsIHRoaXMgY29tbWFuZCB3aXRoICdkY2R4IGNvbmZpZ3VyZSA8bmFtZT4nYClcbiAgICAuYWRkSGVscFRleHQoJ2FmdGVyQWxsJywgJ+KAiycpIC8vIHRoZXJlIGlzIGEgbm9uLXplcm8gd2hpdGUgc3BhY2UgYmVjYXVzZSB0aGUgb25seSByZWFzb24gdG8gaGF2ZSB0aGlzIGlzIHRvIGZvcmNlIGEgbGluZSBicmVha1xuICAgIC5jb25maWd1cmVIZWxwKHNob3dIZWxwV2l0aERlZmF1bHRDb21tYW5kT3B0aW9ucylcbiAgICAuYWxsb3dVbmtub3duT3B0aW9uKGZhbHNlKVxuICAgIC5hbGxvd0V4Y2Vzc0FyZ3VtZW50cyhmYWxzZSlcbiAgICAuc2hvd0hlbHBBZnRlckVycm9yKHRydWUpO1xucHJvZ3JhbVxuICAgIC5jb21tYW5kKCdkZWZhdWx0JywgeyBpc0RlZmF1bHQ6IHRydWUsIGhpZGRlbjogdHJ1ZSB9KVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLXAsIC0tcHJvZHVjdCA8bmFtZT4nLCAnVGhlIG5hbWUgb2YgdGhlIGhvc3QgYXBwbGljYXRpb24nKS5jaG9pY2VzKE9iamVjdC52YWx1ZXMoU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcykpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLWMsIC0tY29uZmlnIDxwYXRoPicsICdQYXRoIHRvIHRoZSBjb25maWd1cmF0aW9uIGZpbGUnKS5kZWZhdWx0KCdkY2R4LmNvbmZpZy5tanMnKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy11LCAtLXVybCA8dXJsPicsICdUaGUgVVJMIG9mIHRoZSBob3N0IGFwcGxpY2F0aW9uJykuZGVmYXVsdCgnaHR0cDovL2xvY2FsaG9zdCcpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLS1jd2QgPGRpcmVjdG9yeT4nLCAnU3BlY2lmeSB0aGUgd29ya2luZyBkaXJlY3Rvcnkgd2hlcmUgdG8gZmluZCB0aGUgY29uZmlndXJhdGlvbicpKVxuICAgIC5hY3Rpb24ob3B0aW9ucyA9PiBBY3Rpb25IYW5kbGVyKHByb2dyYW0sIENvbW1hbmQoKSwgb3B0aW9ucykpO1xucHJvZ3JhbVxuICAgIC5jb21tYW5kKFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuamlyYSlcbiAgICAuZGVzY3JpcHRpb24oJ0F1dG9tYXRlZCBpbml0aWFsIHNldHVwIG9mIEF0bGFzc2lhbiBKaXJhJylcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy1jLCAtLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byB0aGUgY29uZmlndXJhdGlvbiBmaWxlJykuZGVmYXVsdCgnZGNkeC5jb25maWcubWpzJykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnVGhlIFVSTCBvZiB0aGUgaG9zdCBhcHBsaWNhdGlvbicpLmRlZmF1bHQoJ2h0dHA6Ly9sb2NhbGhvc3QnKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tY3dkIDxkaXJlY3Rvcnk+JywgJ1NwZWNpZnkgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZXJlIHRvIGZpbmQgdGhlIGNvbmZpZ3VyYXRpb24nKSlcbiAgICAuYWN0aW9uKG9wdGlvbnMgPT4gQWN0aW9uSGFuZGxlcihwcm9ncmFtLCBDb21tYW5kKCksIHsgLi4ub3B0aW9ucywgbmFtZTogU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5qaXJhIH0pKTtcbnByb2dyYW1cbiAgICAuY29tbWFuZChTdXBwb3J0ZWRBcHBsaWNhdGlvbnMuVmFsdWVzLmNvbmZsdWVuY2UpXG4gICAgLmRlc2NyaXB0aW9uKCdBdXRvbWF0ZWQgaW5pdGlhbCBzZXR1cCBvZiBBdGxhc3NpYW4gQ29uZmx1ZW5jZScpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctYywgLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZScpLmRlZmF1bHQoJ2RjZHguY29uZmlnLm1qcycpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ1RoZSBVUkwgb2YgdGhlIGhvc3QgYXBwbGljYXRpb24nKS5kZWZhdWx0KCdodHRwOi8vbG9jYWxob3N0JykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLWN3ZCA8ZGlyZWN0b3J5PicsICdTcGVjaWZ5IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVyZSB0byBmaW5kIHRoZSBjb25maWd1cmF0aW9uJykpXG4gICAgLmFjdGlvbihvcHRpb25zID0+IEFjdGlvbkhhbmRsZXIocHJvZ3JhbSwgQ29tbWFuZCgpLCB7IC4uLm9wdGlvbnMsIG5hbWU6IFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuY29uZmx1ZW5jZSB9KSk7XG5wcm9ncmFtXG4gICAgLmNvbW1hbmQoU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5iYW1ib28pXG4gICAgLmRlc2NyaXB0aW9uKCdBdXRvbWF0ZWQgaW5pdGlhbCBzZXR1cCBvZiBBdGxhc3NpYW4gQmFtYm9vJylcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy1jLCAtLWNvbmZpZyA8cGF0aD4nLCAnUGF0aCB0byB0aGUgY29uZmlndXJhdGlvbiBmaWxlJykuZGVmYXVsdCgnZGNkeC5jb25maWcubWpzJykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctdSwgLS11cmwgPHVybD4nLCAnVGhlIFVSTCBvZiB0aGUgaG9zdCBhcHBsaWNhdGlvbicpLmRlZmF1bHQoJ2h0dHA6Ly9sb2NhbGhvc3QnKSlcbiAgICAuYWRkT3B0aW9uKG5ldyBPcHRpb24oJy0tY3dkIDxkaXJlY3Rvcnk+JywgJ1NwZWNpZnkgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoZXJlIHRvIGZpbmQgdGhlIGNvbmZpZ3VyYXRpb24nKSlcbiAgICAuYWN0aW9uKG9wdGlvbnMgPT4gQWN0aW9uSGFuZGxlcihwcm9ncmFtLCBDb21tYW5kKCksIHsgLi4ub3B0aW9ucywgbmFtZTogU3VwcG9ydGVkQXBwbGljYXRpb25zLlZhbHVlcy5iYW1ib28gfSkpO1xucHJvZ3JhbVxuICAgIC5jb21tYW5kKFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuYml0YnVja2V0KVxuICAgIC5kZXNjcmlwdGlvbignQXV0b21hdGVkIGluaXRpYWwgc2V0dXAgb2YgQXRsYXNzaWFuIEJpdGJ1Y2tldCcpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctYywgLS1jb25maWcgPHBhdGg+JywgJ1BhdGggdG8gdGhlIGNvbmZpZ3VyYXRpb24gZmlsZScpLmRlZmF1bHQoJ2RjZHguY29uZmlnLm1qcycpKVxuICAgIC5hZGRPcHRpb24obmV3IE9wdGlvbignLXUsIC0tdXJsIDx1cmw+JywgJ1RoZSBVUkwgb2YgdGhlIGhvc3QgYXBwbGljYXRpb24nKS5kZWZhdWx0KCdodHRwOi8vbG9jYWxob3N0JykpXG4gICAgLmFkZE9wdGlvbihuZXcgT3B0aW9uKCctLWN3ZCA8ZGlyZWN0b3J5PicsICdTcGVjaWZ5IHRoZSB3b3JraW5nIGRpcmVjdG9yeSB3aGVyZSB0byBmaW5kIHRoZSBjb25maWd1cmF0aW9uJykpXG4gICAgLmFjdGlvbihvcHRpb25zID0+IEFjdGlvbkhhbmRsZXIocHJvZ3JhbSwgQ29tbWFuZCgpLCB7IC4uLm9wdGlvbnMsIG5hbWU6IFN1cHBvcnRlZEFwcGxpY2F0aW9ucy5WYWx1ZXMuYml0YnVja2V0IH0pKTtcbnByb2dyYW0ucGFyc2VBc3luYygpLmNhdGNoKCgpID0+IGdyYWNlZnVsRXhpdCgxKSk7XG5wcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiB7XG4gICAgY29uc29sZS5sb2coYFJlY2VpdmVkIHRlcm0gc2lnbmFsLCB0cnlpbmcgdG8gc3RvcCBncmFjZWZ1bGx5IPCfkqpgKTtcbiAgICBncmFjZWZ1bEV4aXQoKTtcbn0pO1xuIl0sIm5hbWVzIjpbIkNvbW1hbmRlciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBRU8sTUFBTSxhQUFhLEdBQUcsT0FBTyxPQUFPLEVBQUUsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEVBQUUsT0FBTyxLQUFLO0FBQ25GLElBQUksTUFBTSxHQUFHLEdBQUcsT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUMxQyxJQUFJLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxLQUFLO0FBQ3JDLFFBQVEsSUFBSSxZQUFZLEdBQUcsRUFBRSxDQUFDO0FBQzlC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