@tricoteuses/assemblee 1.7.0 → 1.7.2
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/README.md +9 -27
- package/lib/bugs/acteur-00010/plugin.test.js +4 -4
- package/lib/bugs/acteur-00010/plugin.test.mjs +1 -1
- package/lib/bugs/acteur-00010.js +15 -16
- package/lib/bugs/acteur-00010.mjs +1 -1
- package/lib/bugs/agenda-00002/plugin.test.js +4 -4
- package/lib/bugs/agenda-00002/plugin.test.mjs +1 -1
- package/lib/bugs/agenda-00002.js +27 -28
- package/lib/bugs/agenda-00002.mjs +3 -3
- package/lib/bugs/agenda-00008/plugin.test.js +4 -4
- package/lib/bugs/agenda-00008/plugin.test.mjs +1 -1
- package/lib/bugs/agenda-00008.js +15 -16
- package/lib/bugs/agenda-00008.mjs +1 -1
- package/lib/bugs/agenda-00011/plugin.test.js +5 -5
- package/lib/bugs/agenda-00011/plugin.test.mjs +1 -1
- package/lib/bugs/agenda-00011.js +21 -22
- package/lib/bugs/agenda-00011.mjs +3 -3
- package/lib/bugs.js +17 -19
- package/lib/bugs.mjs +3 -3
- package/lib/cleaners/actes_legislatifs.js +5 -5
- package/lib/cleaners/acteurs.js +5 -5
- package/lib/cleaners/acteurs.mjs +1 -1
- package/lib/cleaners/amendements.js +5 -5
- package/lib/cleaners/documents.js +5 -5
- package/lib/cleaners/dossiers_legislatifs.js +5 -5
- package/lib/cleaners/organes.js +2 -2
- package/lib/cleaners/reunions.js +5 -5
- package/lib/cleaners/scrutins.js +8 -8
- package/lib/cleaners/xml.js +8 -8
- package/lib/cleaners/xml.mjs +1 -1
- package/lib/datasets.d.ts +2 -2
- package/lib/datasets.js +53 -132
- package/lib/datasets.mjs +40 -118
- package/lib/dates.js +1 -2
- package/lib/dossiers_legislatifs.js +8 -8
- package/lib/file_systems.js +18 -16
- package/lib/file_systems.mjs +6 -5
- package/lib/git.d.ts +1 -0
- package/lib/git.js +21 -5
- package/lib/git.mjs +16 -1
- package/lib/inserters.js +3 -3
- package/lib/loaders.d.ts +14 -40
- package/lib/loaders.js +580 -1086
- package/lib/loaders.mjs +110 -353
- package/lib/parsers/documents.js +10 -10
- package/lib/parsers/documents.mjs +1 -1
- package/lib/parsers/recherche_amendements.js +17 -15
- package/lib/parsers/recherche_amendements.mjs +1 -1
- package/lib/raw_types/acteurs_et_organes.js +9 -9
- package/lib/raw_types/acteurs_et_organes.mjs +1 -1
- package/lib/raw_types/agendas.js +9 -9
- package/lib/raw_types/agendas.mjs +1 -1
- package/lib/raw_types/amendements.js +9 -9
- package/lib/raw_types/amendements.mjs +1 -1
- package/lib/raw_types/debats.d.ts +26 -78
- package/lib/raw_types/debats.js +49 -242
- package/lib/raw_types/debats.mjs +41 -234
- package/lib/raw_types/dossiers_legislatifs.js +9 -9
- package/lib/raw_types/dossiers_legislatifs.mjs +1 -1
- package/lib/raw_types/questions.js +9 -9
- package/lib/raw_types/questions.mjs +1 -1
- package/lib/raw_types/scrutins.js +9 -9
- package/lib/raw_types/scrutins.mjs +1 -1
- package/lib/scripts/bugs_helper.js +17 -18
- package/lib/scripts/bugs_helper.mjs +3 -3
- package/lib/scripts/clean_reorganized_data.js +183 -561
- package/lib/scripts/clean_reorganized_data.mjs +111 -410
- package/lib/scripts/diff_amendements.js +11 -24
- package/lib/scripts/diff_amendements.mjs +3 -17
- package/lib/scripts/document_dossiers_legislatifs.js +24 -27
- package/lib/scripts/document_dossiers_legislatifs.mjs +3 -3
- package/lib/scripts/get_today_reunions.js +5 -8
- package/lib/scripts/get_today_reunions.mjs +3 -7
- package/lib/scripts/merge_scrutins.js +11 -24
- package/lib/scripts/merge_scrutins.mjs +3 -17
- package/lib/scripts/parse_textes_lois.js +8 -38
- package/lib/scripts/parse_textes_lois.mjs +3 -33
- package/lib/scripts/raw_types_from_amendements.js +14 -27
- package/lib/scripts/raw_types_from_amendements.mjs +3 -17
- package/lib/scripts/reorganize_data.js +204 -456
- package/lib/scripts/reorganize_data.mjs +68 -260
- package/lib/scripts/retrieve_deputes_photos.d.ts +3 -1
- package/lib/scripts/retrieve_deputes_photos.js +146 -172
- package/lib/scripts/retrieve_deputes_photos.mjs +74 -98
- package/lib/scripts/retrieve_documents.js +207 -156
- package/lib/scripts/retrieve_documents.mjs +116 -128
- package/lib/scripts/retrieve_open_data.js +272 -249
- package/lib/scripts/retrieve_open_data.mjs +109 -123
- package/lib/scripts/retrieve_pending_amendments.js +16 -67
- package/lib/scripts/retrieve_pending_amendments.mjs +4 -55
- package/lib/scripts/retrieve_senateurs_photos.js +20 -77
- package/lib/scripts/retrieve_senateurs_photos.mjs +5 -61
- package/lib/scripts/retrieve_textes_lois.js +18 -46
- package/lib/scripts/retrieve_textes_lois.mjs +3 -33
- package/lib/scripts/shared/cli_helpers.d.ts +66 -0
- package/lib/scripts/shared/cli_helpers.js +90 -0
- package/lib/scripts/shared/cli_helpers.mjs +72 -0
- package/lib/scripts/test_iter_load.d.ts +1 -0
- package/lib/scripts/test_iter_load.js +154 -0
- package/lib/scripts/test_iter_load.mjs +71 -0
- package/lib/scripts/test_load.js +4 -15
- package/lib/scripts/test_load.mjs +3 -14
- package/lib/scripts/test_load_big_files.js +4 -15
- package/lib/scripts/test_load_big_files.mjs +3 -14
- package/lib/scripts/validate_json.js +15 -16
- package/lib/scripts/validate_json.mjs +3 -3
- package/lib/types/acteurs_et_organes.js +9 -9
- package/lib/types/acteurs_et_organes.mjs +1 -1
- package/lib/types/agendas.js +9 -9
- package/lib/types/agendas.mjs +1 -1
- package/lib/types/amendements.js +9 -9
- package/lib/types/amendements.mjs +1 -1
- package/lib/types/debats.d.ts +27 -79
- package/lib/types/debats.js +48 -241
- package/lib/types/debats.mjs +40 -233
- package/lib/types/dossiers_legislatifs.js +9 -9
- package/lib/types/dossiers_legislatifs.mjs +1 -1
- package/lib/types/legislatures.d.ts +4 -4
- package/lib/types/legislatures.js +5 -5
- package/lib/types/legislatures.mjs +5 -5
- package/lib/types/questions.js +9 -9
- package/lib/types/questions.mjs +1 -1
- package/lib/types/scrutins.js +9 -9
- package/lib/types/scrutins.mjs +1 -1
- package/lib/urls.js +2 -2
- package/lib/urls.mjs +1 -1
- package/package.json +9 -7
|
@@ -3,11 +3,11 @@ import { execSync } from "child_process";
|
|
|
3
3
|
import commandLineArgs from "command-line-args";
|
|
4
4
|
import fs from "fs-extra";
|
|
5
5
|
import path from "path";
|
|
6
|
-
import { datasets, DatasetStructure, EnabledDatasets, filterByLegislature } from "../datasets.mjs";
|
|
6
|
+
import { datasets, DatasetStructure, EnabledDatasets, getEnabledDatasets, filterByLegislature } from "../datasets.mjs";
|
|
7
7
|
import { existingDateToJson, patchedDateToJson } from "../dates.mjs";
|
|
8
8
|
import * as git from "../git.mjs";
|
|
9
9
|
import { walkDir } from "../file_systems.mjs";
|
|
10
|
-
import { pathFromDocumentUid, pathFromDossierParlementaireUid, pathFromReunionUid, pathFromScrutinUid
|
|
10
|
+
import { pathFromCompteRenduUid, pathFromDocumentUid, pathFromDossierParlementaireUid, pathFromQuestionUid, pathFromReunionUid, pathFromScrutinUid } from "../loaders.mjs";
|
|
11
11
|
import { Convert as ActeursEtOrganesRawConvert } from "../raw_types/acteurs_et_organes.mjs";
|
|
12
12
|
import { Convert as AgendasRawConvert } from "../raw_types/agendas.mjs";
|
|
13
13
|
import { Convert as AmendementsRawConvert } from "../raw_types/amendements.mjs";
|
|
@@ -15,76 +15,53 @@ import { Convert as DossiersLegislatifsRawConvert } from "../raw_types/dossiers_
|
|
|
15
15
|
import { Convert as ScrutinsRawConvert } from "../raw_types/scrutins.mjs";
|
|
16
16
|
import { Convert as QuestionsRawConvert } from "../raw_types/questions.mjs";
|
|
17
17
|
import { Convert as ComptesRendusRawConvert } from "../raw_types/debats.mjs";
|
|
18
|
+
import { cloneOption, commitOption, categoriesOption, legislatureOption, remoteOption, silentOption, verboseOption, dataDirDefaultOption, pullOption } from "./shared/cli_helpers.mjs";
|
|
18
19
|
function parseArgs(argv) {
|
|
19
|
-
const optionsDefinitions = [{
|
|
20
|
-
alias: "C",
|
|
21
|
-
help: "clone repositories from given group (or organization) git URL",
|
|
22
|
-
name: "clone",
|
|
23
|
-
type: String
|
|
24
|
-
}, {
|
|
25
|
-
alias: "c",
|
|
26
|
-
help: "commit split files",
|
|
27
|
-
name: "commit",
|
|
28
|
-
type: Boolean
|
|
29
|
-
}, {
|
|
30
|
-
alias: "k",
|
|
31
|
-
defaultValue: ["All"],
|
|
32
|
-
help: "categories of datasets to reorganize",
|
|
33
|
-
multiple: true,
|
|
34
|
-
name: "categories",
|
|
35
|
-
type: String
|
|
36
|
-
}, {
|
|
37
|
-
alias: "l",
|
|
38
|
-
help: "legislatures of categories of datasets to retrieve; leave empty or use 0 for all",
|
|
39
|
-
multiple: true,
|
|
40
|
-
name: "legislature",
|
|
41
|
-
type: Number
|
|
42
|
-
}, {
|
|
43
|
-
alias: "p",
|
|
44
|
-
help: "pull repositories before proceeding",
|
|
45
|
-
name: "pull",
|
|
46
|
-
type: Boolean
|
|
47
|
-
}, {
|
|
48
|
-
alias: "r",
|
|
49
|
-
help: "push commit to given remote",
|
|
50
|
-
multiple: true,
|
|
51
|
-
name: "remote",
|
|
52
|
-
type: String
|
|
53
|
-
}, {
|
|
54
|
-
alias: "s",
|
|
55
|
-
help: "don't log anything",
|
|
56
|
-
name: "silent",
|
|
57
|
-
type: Boolean
|
|
58
|
-
}, {
|
|
20
|
+
const optionsDefinitions = [cloneOption, commitOption, categoriesOption, legislatureOption, remoteOption, silentOption, verboseOption, dataDirDefaultOption, pullOption, {
|
|
59
21
|
alias: "V",
|
|
60
22
|
help: "don't validate raw data",
|
|
61
23
|
name: "no-validate-raw",
|
|
62
24
|
type: Boolean
|
|
63
|
-
}, {
|
|
64
|
-
alias: "v",
|
|
65
|
-
help: "verbose logs",
|
|
66
|
-
name: "verbose",
|
|
67
|
-
type: Boolean
|
|
68
|
-
}, {
|
|
69
|
-
defaultOption: true,
|
|
70
|
-
help: "directory containing Assemblée open data files",
|
|
71
|
-
name: "dataDir",
|
|
72
|
-
type: String
|
|
73
25
|
}];
|
|
74
26
|
const options = commandLineArgs(optionsDefinitions, {
|
|
75
27
|
argv: argv
|
|
76
28
|
});
|
|
77
29
|
return options;
|
|
78
30
|
}
|
|
31
|
+
function clearDirectory(dirPath) {
|
|
32
|
+
fs.ensureDirSync(dirPath);
|
|
33
|
+
for (const filename of fs.readdirSync(dirPath)) {
|
|
34
|
+
if (!filename.startsWith(".")) {
|
|
35
|
+
fs.removeSync(path.join(dirPath, filename));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function cloneGit(gitGroupUrl, datasetName, dataDir) {
|
|
40
|
+
if (gitGroupUrl !== undefined) {
|
|
41
|
+
execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
|
|
42
|
+
cwd: dataDir,
|
|
43
|
+
env: process.env,
|
|
44
|
+
encoding: "utf-8",
|
|
45
|
+
stdio: ["ignore", "ignore", "pipe"]
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
79
49
|
function reorganizeData(options) {
|
|
80
50
|
const dataDir = options.dataDir;
|
|
81
51
|
Date.prototype.toJSON = patchedDateToJson;
|
|
82
52
|
let exitCode = options.commit ? 10 : 0;
|
|
83
|
-
const gitGroupUrl = options.clone
|
|
53
|
+
const gitGroupUrl = options.clone?.trim().replace(/\/+$/, "");
|
|
84
54
|
const validateRawData = !options["no-validate-raw"];
|
|
85
|
-
options.categories
|
|
86
|
-
const enabledDatasets = options.categories.reduce((enabledDatasets, datasetName) => enabledDatasets | EnabledDatasets[datasetName], EnabledDatasets.None);
|
|
55
|
+
const enabledDatasets = getEnabledDatasets(options.categories);
|
|
87
56
|
let chosenDatasets = filterByLegislature(datasets, options.legislature);
|
|
57
|
+
function commitGit(datasetReorganizedDir, options) {
|
|
58
|
+
if (options.commit) {
|
|
59
|
+
const errorCode = git.commitAndPush(datasetReorganizedDir, "Nouvelle moisson", options.remote);
|
|
60
|
+
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
61
|
+
exitCode = errorCode;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
88
65
|
if (enabledDatasets & EnabledDatasets.ActeursEtOrganes) {
|
|
89
66
|
for (const dataset of chosenDatasets.acteursEtOrganes) {
|
|
90
67
|
const originalJsonDirectoryOrFilePath = path.join(dataDir, dataset.filename);
|
|
@@ -92,36 +69,12 @@ function reorganizeData(options) {
|
|
|
92
69
|
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
93
70
|
}
|
|
94
71
|
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
|
|
95
|
-
|
|
96
|
-
execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
|
|
97
|
-
cwd: dataDir,
|
|
98
|
-
env: process.env,
|
|
99
|
-
encoding: "utf-8",
|
|
100
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
101
|
-
});
|
|
102
|
-
}
|
|
72
|
+
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
103
73
|
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
104
74
|
if (options.pull) {
|
|
105
|
-
|
|
106
|
-
cwd: datasetReorganizedDir,
|
|
107
|
-
env: process.env,
|
|
108
|
-
encoding: "utf-8",
|
|
109
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
110
|
-
});
|
|
111
|
-
execSync(`git pull --rebase`, {
|
|
112
|
-
cwd: datasetReorganizedDir,
|
|
113
|
-
env: process.env,
|
|
114
|
-
encoding: "utf-8",
|
|
115
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
fs.ensureDirSync(datasetReorganizedDir);
|
|
119
|
-
for (const filename of fs.readdirSync(datasetReorganizedDir)) {
|
|
120
|
-
if (filename[0] === ".") {
|
|
121
|
-
continue;
|
|
122
|
-
}
|
|
123
|
-
fs.removeSync(path.join(datasetReorganizedDir, filename));
|
|
75
|
+
git.resetAndPull(datasetReorganizedDir);
|
|
124
76
|
}
|
|
77
|
+
clearDirectory(datasetReorganizedDir);
|
|
125
78
|
const acteursReorganizedDir = path.join(datasetReorganizedDir, "acteurs");
|
|
126
79
|
fs.mkdirSync(acteursReorganizedDir);
|
|
127
80
|
const organesReorganizedDir = path.join(datasetReorganizedDir, "organes");
|
|
@@ -257,12 +210,7 @@ function reorganizeData(options) {
|
|
|
257
210
|
}
|
|
258
211
|
break;
|
|
259
212
|
}
|
|
260
|
-
|
|
261
|
-
const errorCode = git.commitAndPush(datasetReorganizedDir, "Nouvelle moisson", options.remote);
|
|
262
|
-
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
263
|
-
exitCode = errorCode;
|
|
264
|
-
}
|
|
265
|
-
}
|
|
213
|
+
commitGit(datasetReorganizedDir, options);
|
|
266
214
|
}
|
|
267
215
|
}
|
|
268
216
|
if (enabledDatasets & EnabledDatasets.Agendas) {
|
|
@@ -272,22 +220,9 @@ function reorganizeData(options) {
|
|
|
272
220
|
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
273
221
|
}
|
|
274
222
|
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
|
|
275
|
-
|
|
276
|
-
execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
|
|
277
|
-
cwd: dataDir,
|
|
278
|
-
env: process.env,
|
|
279
|
-
encoding: "utf-8",
|
|
280
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
281
|
-
});
|
|
282
|
-
}
|
|
223
|
+
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
283
224
|
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
284
|
-
|
|
285
|
-
for (const filename of fs.readdirSync(datasetReorganizedDir)) {
|
|
286
|
-
if (filename[0] === ".") {
|
|
287
|
-
continue;
|
|
288
|
-
}
|
|
289
|
-
fs.removeSync(path.join(datasetReorganizedDir, filename));
|
|
290
|
-
}
|
|
225
|
+
clearDirectory(datasetReorganizedDir);
|
|
291
226
|
switch (dataset.structure) {
|
|
292
227
|
case DatasetStructure.SingleFile:
|
|
293
228
|
{
|
|
@@ -296,7 +231,7 @@ function reorganizeData(options) {
|
|
|
296
231
|
});
|
|
297
232
|
const originalData = validateRawData ? AgendasRawConvert.toAgendas(originalJson) : JSON.parse(originalJson);
|
|
298
233
|
for (const reunion of originalData.reunions.reunion) {
|
|
299
|
-
|
|
234
|
+
writeReorganizedJson(datasetReorganizedDir, reunion, pathFromReunionUid);
|
|
300
235
|
}
|
|
301
236
|
}
|
|
302
237
|
break;
|
|
@@ -316,17 +251,12 @@ function reorganizeData(options) {
|
|
|
316
251
|
});
|
|
317
252
|
const reunionOriginal = validateRawData ? AgendasRawConvert.toReunion(reunionOriginalJson) : JSON.parse(reunionOriginalJson);
|
|
318
253
|
const reunion = reunionOriginal.reunion;
|
|
319
|
-
|
|
254
|
+
writeReorganizedJson(datasetReorganizedDir, reunion, pathFromReunionUid);
|
|
320
255
|
}
|
|
321
256
|
}
|
|
322
257
|
break;
|
|
323
258
|
}
|
|
324
|
-
|
|
325
|
-
const errorCode = git.commitAndPush(datasetReorganizedDir, "Nouvelle moisson", options.remote);
|
|
326
|
-
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
327
|
-
exitCode = errorCode;
|
|
328
|
-
}
|
|
329
|
-
}
|
|
259
|
+
commitGit(datasetReorganizedDir, options);
|
|
330
260
|
}
|
|
331
261
|
}
|
|
332
262
|
if (enabledDatasets & EnabledDatasets.Amendements) {
|
|
@@ -336,22 +266,9 @@ function reorganizeData(options) {
|
|
|
336
266
|
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
337
267
|
}
|
|
338
268
|
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
|
|
339
|
-
|
|
340
|
-
execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
|
|
341
|
-
cwd: dataDir,
|
|
342
|
-
env: process.env,
|
|
343
|
-
encoding: "utf-8",
|
|
344
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
345
|
-
});
|
|
346
|
-
}
|
|
269
|
+
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
347
270
|
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
348
|
-
|
|
349
|
-
for (const filename of fs.readdirSync(datasetReorganizedDir)) {
|
|
350
|
-
if (filename[0] === ".") {
|
|
351
|
-
continue;
|
|
352
|
-
}
|
|
353
|
-
fs.removeSync(path.join(datasetReorganizedDir, filename));
|
|
354
|
-
}
|
|
271
|
+
clearDirectory(datasetReorganizedDir);
|
|
355
272
|
switch (dataset.structure) {
|
|
356
273
|
case DatasetStructure.SingleFile:
|
|
357
274
|
{
|
|
@@ -387,12 +304,7 @@ function reorganizeData(options) {
|
|
|
387
304
|
}
|
|
388
305
|
break;
|
|
389
306
|
}
|
|
390
|
-
|
|
391
|
-
const errorCode = git.commitAndPush(datasetReorganizedDir, "Nouvelle moisson", options.remote);
|
|
392
|
-
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
393
|
-
exitCode = errorCode;
|
|
394
|
-
}
|
|
395
|
-
}
|
|
307
|
+
commitGit(datasetReorganizedDir, options);
|
|
396
308
|
}
|
|
397
309
|
}
|
|
398
310
|
if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
|
|
@@ -402,22 +314,9 @@ function reorganizeData(options) {
|
|
|
402
314
|
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
403
315
|
}
|
|
404
316
|
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
|
|
405
|
-
|
|
406
|
-
execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
|
|
407
|
-
cwd: dataDir,
|
|
408
|
-
env: process.env,
|
|
409
|
-
encoding: "utf-8",
|
|
410
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
411
|
-
});
|
|
412
|
-
}
|
|
317
|
+
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
413
318
|
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
414
|
-
|
|
415
|
-
for (const filename of fs.readdirSync(datasetReorganizedDir)) {
|
|
416
|
-
if (filename[0] === ".") {
|
|
417
|
-
continue;
|
|
418
|
-
}
|
|
419
|
-
fs.removeSync(path.join(datasetReorganizedDir, filename));
|
|
420
|
-
}
|
|
319
|
+
clearDirectory(datasetReorganizedDir);
|
|
421
320
|
const documentsDir = path.join(datasetReorganizedDir, "documents");
|
|
422
321
|
fs.mkdirSync(documentsDir);
|
|
423
322
|
const dossiersDir = path.join(datasetReorganizedDir, "dossiers");
|
|
@@ -430,12 +329,12 @@ function reorganizeData(options) {
|
|
|
430
329
|
});
|
|
431
330
|
const originalData = validateRawData ? DossiersLegislatifsRawConvert.toDossiersLegislatifs(originalJson) : JSON.parse(originalJson);
|
|
432
331
|
for (const document of originalData.export.textesLegislatifs.document) {
|
|
433
|
-
|
|
332
|
+
writeReorganizedJson(documentsDir, document, pathFromDocumentUid);
|
|
434
333
|
}
|
|
435
334
|
for (const {
|
|
436
335
|
dossierParlementaire
|
|
437
336
|
} of originalData.export.dossiersLegislatifs.dossier) {
|
|
438
|
-
|
|
337
|
+
writeReorganizedJson(dossiersDir, dossierParlementaire, pathFromDossierParlementaireUid);
|
|
439
338
|
}
|
|
440
339
|
}
|
|
441
340
|
break;
|
|
@@ -455,7 +354,7 @@ function reorganizeData(options) {
|
|
|
455
354
|
});
|
|
456
355
|
const documentOriginal = validateRawData ? DossiersLegislatifsRawConvert.toDocument(documentOriginalJson) : JSON.parse(documentOriginalJson);
|
|
457
356
|
const document = documentOriginal.document;
|
|
458
|
-
|
|
357
|
+
writeReorganizedJson(documentsDir, document, pathFromDocumentUid);
|
|
459
358
|
}
|
|
460
359
|
for (const dossierParlementaireSplitPath of walkDir(originalJsonDirectoryOrFilePath, ["dossierParlementaire"])) {
|
|
461
360
|
const dossierParlementaireFilename = dossierParlementaireSplitPath[dossierParlementaireSplitPath.length - 1];
|
|
@@ -471,17 +370,12 @@ function reorganizeData(options) {
|
|
|
471
370
|
});
|
|
472
371
|
const dossierParlementaireOriginal = validateRawData ? DossiersLegislatifsRawConvert.toDossierParlementaire(dossierParlementaireOriginalJson) : JSON.parse(dossierParlementaireOriginalJson);
|
|
473
372
|
const dossierParlementaire = dossierParlementaireOriginal.dossierParlementaire;
|
|
474
|
-
|
|
373
|
+
writeReorganizedJson(dossiersDir, dossierParlementaire, pathFromDossierParlementaireUid);
|
|
475
374
|
}
|
|
476
375
|
}
|
|
477
376
|
break;
|
|
478
377
|
}
|
|
479
|
-
|
|
480
|
-
const errorCode = git.commitAndPush(datasetReorganizedDir, "Nouvelle moisson", options.remote);
|
|
481
|
-
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
482
|
-
exitCode = errorCode;
|
|
483
|
-
}
|
|
484
|
-
}
|
|
378
|
+
commitGit(datasetReorganizedDir, options);
|
|
485
379
|
}
|
|
486
380
|
}
|
|
487
381
|
if (enabledDatasets & EnabledDatasets.Scrutins) {
|
|
@@ -491,22 +385,9 @@ function reorganizeData(options) {
|
|
|
491
385
|
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
492
386
|
}
|
|
493
387
|
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
|
|
494
|
-
|
|
495
|
-
execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
|
|
496
|
-
cwd: dataDir,
|
|
497
|
-
env: process.env,
|
|
498
|
-
encoding: "utf-8",
|
|
499
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
500
|
-
});
|
|
501
|
-
}
|
|
388
|
+
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
502
389
|
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
503
|
-
|
|
504
|
-
for (const filename of fs.readdirSync(datasetReorganizedDir)) {
|
|
505
|
-
if (filename[0] === ".") {
|
|
506
|
-
continue;
|
|
507
|
-
}
|
|
508
|
-
fs.removeSync(path.join(datasetReorganizedDir, filename));
|
|
509
|
-
}
|
|
390
|
+
clearDirectory(datasetReorganizedDir);
|
|
510
391
|
switch (dataset.structure) {
|
|
511
392
|
case DatasetStructure.SingleFile:
|
|
512
393
|
{
|
|
@@ -515,7 +396,7 @@ function reorganizeData(options) {
|
|
|
515
396
|
});
|
|
516
397
|
const originalData = validateRawData ? ScrutinsRawConvert.toScrutins(originalJson) : JSON.parse(originalJson);
|
|
517
398
|
for (const scrutin of originalData.scrutins.scrutin) {
|
|
518
|
-
|
|
399
|
+
writeReorganizedJson(datasetReorganizedDir, scrutin, pathFromScrutinUid);
|
|
519
400
|
}
|
|
520
401
|
}
|
|
521
402
|
break;
|
|
@@ -535,17 +416,12 @@ function reorganizeData(options) {
|
|
|
535
416
|
});
|
|
536
417
|
const scrutinOriginal = validateRawData ? ScrutinsRawConvert.toScrutinWrapper(scrutinOriginalJson) : JSON.parse(scrutinOriginalJson);
|
|
537
418
|
const scrutin = scrutinOriginal.scrutin;
|
|
538
|
-
|
|
419
|
+
writeReorganizedJson(datasetReorganizedDir, scrutin, pathFromScrutinUid);
|
|
539
420
|
}
|
|
540
421
|
}
|
|
541
422
|
break;
|
|
542
423
|
}
|
|
543
|
-
|
|
544
|
-
const errorCode = git.commitAndPush(datasetReorganizedDir, "Nouvelle moisson", options.remote);
|
|
545
|
-
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
546
|
-
exitCode = errorCode;
|
|
547
|
-
}
|
|
548
|
-
}
|
|
424
|
+
commitGit(datasetReorganizedDir, options);
|
|
549
425
|
}
|
|
550
426
|
}
|
|
551
427
|
if (enabledDatasets & EnabledDatasets.Questions) {
|
|
@@ -555,22 +431,9 @@ function reorganizeData(options) {
|
|
|
555
431
|
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
556
432
|
}
|
|
557
433
|
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".json");
|
|
558
|
-
|
|
559
|
-
execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
|
|
560
|
-
cwd: dataDir,
|
|
561
|
-
env: process.env,
|
|
562
|
-
encoding: "utf-8",
|
|
563
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
564
|
-
});
|
|
565
|
-
}
|
|
434
|
+
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
566
435
|
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
567
|
-
|
|
568
|
-
for (const filename of fs.readdirSync(datasetReorganizedDir)) {
|
|
569
|
-
if (filename[0] === ".") {
|
|
570
|
-
continue;
|
|
571
|
-
}
|
|
572
|
-
fs.removeSync(path.join(datasetReorganizedDir, filename));
|
|
573
|
-
}
|
|
436
|
+
clearDirectory(datasetReorganizedDir);
|
|
574
437
|
switch (dataset.structure) {
|
|
575
438
|
case DatasetStructure.SegmentedFiles:
|
|
576
439
|
{
|
|
@@ -588,17 +451,12 @@ function reorganizeData(options) {
|
|
|
588
451
|
});
|
|
589
452
|
const questionOriginal = validateRawData ? QuestionsRawConvert.toQuestionWrapper(questionOriginalJson) : JSON.parse(questionOriginalJson);
|
|
590
453
|
const question = questionOriginal.question;
|
|
591
|
-
|
|
454
|
+
writeReorganizedJson(datasetReorganizedDir, question, pathFromQuestionUid);
|
|
592
455
|
}
|
|
593
456
|
}
|
|
594
457
|
break;
|
|
595
458
|
}
|
|
596
|
-
|
|
597
|
-
const errorCode = git.commitAndPush(datasetReorganizedDir, "Nouvelle moisson", options.remote);
|
|
598
|
-
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
599
|
-
exitCode = errorCode;
|
|
600
|
-
}
|
|
601
|
-
}
|
|
459
|
+
commitGit(datasetReorganizedDir, options);
|
|
602
460
|
}
|
|
603
461
|
}
|
|
604
462
|
if (enabledDatasets & EnabledDatasets.ComptesRendusSeances) {
|
|
@@ -608,22 +466,9 @@ function reorganizeData(options) {
|
|
|
608
466
|
console.log(`Reorganizing ${originalJsonDirectoryOrFilePath}`);
|
|
609
467
|
}
|
|
610
468
|
const datasetName = path.basename(originalJsonDirectoryOrFilePath, ".xml");
|
|
611
|
-
|
|
612
|
-
execSync(`git clone ${gitGroupUrl}/${datasetName}.git`, {
|
|
613
|
-
cwd: dataDir,
|
|
614
|
-
env: process.env,
|
|
615
|
-
encoding: "utf-8",
|
|
616
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
617
|
-
});
|
|
618
|
-
}
|
|
469
|
+
cloneGit(gitGroupUrl, datasetName, dataDir);
|
|
619
470
|
const datasetReorganizedDir = path.join(dataDir, datasetName);
|
|
620
|
-
|
|
621
|
-
for (const filename of fs.readdirSync(datasetReorganizedDir)) {
|
|
622
|
-
if (filename[0] === ".") {
|
|
623
|
-
continue;
|
|
624
|
-
}
|
|
625
|
-
fs.removeSync(path.join(datasetReorganizedDir, filename));
|
|
626
|
-
}
|
|
471
|
+
clearDirectory(datasetReorganizedDir);
|
|
627
472
|
switch (dataset.structure) {
|
|
628
473
|
case DatasetStructure.SegmentedFiles:
|
|
629
474
|
{
|
|
@@ -641,17 +486,12 @@ function reorganizeData(options) {
|
|
|
641
486
|
});
|
|
642
487
|
const compteRenduSeanceOriginal = validateRawData ? ComptesRendusRawConvert.toCompteRenduWrapper(compteRenduSeanceOriginalJson) : JSON.parse(compteRenduSeanceOriginalJson);
|
|
643
488
|
const compteRenduSeance = compteRenduSeanceOriginal.compteRendu;
|
|
644
|
-
|
|
489
|
+
writeReorganizedJson(datasetReorganizedDir, compteRenduSeance, pathFromCompteRenduUid);
|
|
645
490
|
}
|
|
646
491
|
}
|
|
647
492
|
break;
|
|
648
493
|
}
|
|
649
|
-
|
|
650
|
-
const errorCode = git.commitAndPush(datasetReorganizedDir, "Nouvelle moisson", options.remote);
|
|
651
|
-
if (exitCode === 10 && errorCode !== 10 || exitCode === 0 && errorCode !== 0 && errorCode !== 10) {
|
|
652
|
-
exitCode = errorCode;
|
|
653
|
-
}
|
|
654
|
-
}
|
|
494
|
+
commitGit(datasetReorganizedDir, options);
|
|
655
495
|
}
|
|
656
496
|
}
|
|
657
497
|
|
|
@@ -669,41 +509,9 @@ function writeAmendementReorganizedJson(datasetReorganizedDir, amendement) {
|
|
|
669
509
|
encoding: "utf8"
|
|
670
510
|
});
|
|
671
511
|
}
|
|
672
|
-
function
|
|
673
|
-
const basename =
|
|
674
|
-
fs.writeFileSync(`${basename}.json`, JSON.stringify(
|
|
675
|
-
encoding: "utf8"
|
|
676
|
-
});
|
|
677
|
-
}
|
|
678
|
-
function writeDossierParlementaireReorganizedJson(dossiersDir, dossierParlementaire) {
|
|
679
|
-
const basename = pathFromDossierParlementaireUid(dossiersDir, dossierParlementaire.uid);
|
|
680
|
-
fs.writeFileSync(`${basename}.json`, JSON.stringify(dossierParlementaire, null, 2), {
|
|
681
|
-
encoding: "utf8"
|
|
682
|
-
});
|
|
683
|
-
}
|
|
684
|
-
function writeReunionReorganizedJson(reunionsDir, reunion) {
|
|
685
|
-
const basename = pathFromReunionUid(reunionsDir, reunion.uid);
|
|
686
|
-
fs.writeFileSync(`${basename}.json`, JSON.stringify(reunion, null, 2), {
|
|
687
|
-
encoding: "utf8"
|
|
688
|
-
});
|
|
689
|
-
}
|
|
690
|
-
function writeScrutinReorganizedJson(scrutinsDir, scrutin) {
|
|
691
|
-
const basename = pathFromScrutinUid(scrutinsDir, scrutin.uid);
|
|
692
|
-
fs.writeFileSync(`${basename}.json`, JSON.stringify(scrutin, null, 2), {
|
|
693
|
-
encoding: "utf8"
|
|
694
|
-
});
|
|
695
|
-
}
|
|
696
|
-
function writeQuestionsReorganizedJson(questionsDir, question) {
|
|
697
|
-
const questionUidRegex = /^QAN(R\d+)(L\d+)Q(E|G|OSD)(\d+)$/;
|
|
698
|
-
const basename = pathFromUid(questionsDir, question.uid, questionUidRegex);
|
|
699
|
-
fs.writeFileSync(`${basename}.json`, JSON.stringify(question, null, 2), {
|
|
700
|
-
encoding: "utf8"
|
|
701
|
-
});
|
|
702
|
-
}
|
|
703
|
-
function writeComptesRendusReorganizedJson(comptesRendusDir, compteRendu) {
|
|
704
|
-
const compteRenduUidRegex = /^CRSAN(R\d+)(L\d+)(S\d+)(O|E)(\d+)(N\d+)$/;
|
|
705
|
-
const basename = pathFromUid(comptesRendusDir, compteRendu.uid, compteRenduUidRegex);
|
|
706
|
-
fs.writeFileSync(`${basename}.json`, JSON.stringify(compteRendu, null, 2), {
|
|
512
|
+
function writeReorganizedJson(dir, obj, pathFromUid) {
|
|
513
|
+
const basename = pathFromUid(dir, obj.uid);
|
|
514
|
+
fs.writeFileSync(`${basename}.json`, JSON.stringify(obj, null, 2), {
|
|
707
515
|
encoding: "utf8"
|
|
708
516
|
});
|
|
709
517
|
}
|
|
@@ -714,4 +522,4 @@ function main(argv) {
|
|
|
714
522
|
|
|
715
523
|
/* istanbul ignore if */
|
|
716
524
|
if (process.argv[1].endsWith("reorganize_data.ts")) process.exit(main(process.argv));
|
|
717
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImZzIiwicGF0aCIsImRhdGFzZXRzIiwiRGF0YXNldFN0cnVjdHVyZSIsIkVuYWJsZWREYXRhc2V0cyIsImZpbHRlckJ5TGVnaXNsYXR1cmUiLCJleGlzdGluZ0RhdGVUb0pzb24iLCJwYXRjaGVkRGF0ZVRvSnNvbiIsImdpdCIsIndhbGtEaXIiLCJwYXRoRnJvbURvY3VtZW50VWlkIiwicGF0aEZyb21Eb3NzaWVyUGFybGVtZW50YWlyZVVpZCIsInBhdGhGcm9tUmV1bmlvblVpZCIsInBhdGhGcm9tU2NydXRpblVpZCIsInBhdGhGcm9tVWlkIiwiQ29udmVydCIsIkFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0IiwiQWdlbmRhc1Jhd0NvbnZlcnQiLCJBbWVuZGVtZW50c1Jhd0NvbnZlcnQiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzUmF3Q29udmVydCIsIlNjcnV0aW5zUmF3Q29udmVydCIsIlF1ZXN0aW9uc1Jhd0NvbnZlcnQiLCJDb21wdGVzUmVuZHVzUmF3Q29udmVydCIsInBhcnNlQXJncyIsImFyZ3YiLCJvcHRpb25zRGVmaW5pdGlvbnMiLCJhbGlhcyIsImhlbHAiLCJuYW1lIiwidHlwZSIsIlN0cmluZyIsIkJvb2xlYW4iLCJkZWZhdWx0VmFsdWUiLCJtdWx0aXBsZSIsIk51bWJlciIsImRlZmF1bHRPcHRpb24iLCJvcHRpb25zIiwicmVvcmdhbml6ZURhdGEiLCJkYXRhRGlyIiwiRGF0ZSIsInByb3RvdHlwZSIsInRvSlNPTiIsImV4aXRDb2RlIiwiY29tbWl0IiwiZ2l0R3JvdXBVcmwiLCJjbG9uZSIsInRyaW0iLCJyZXBsYWNlIiwidW5kZWZpbmVkIiwidmFsaWRhdGVSYXdEYXRhIiwiY2F0ZWdvcmllcyIsIm1hcCIsImRhdGFzZXROYW1lIiwibm90U3RyaWN0RXF1YWwiLCJlbmFibGVkRGF0YXNldHMiLCJyZWR1Y2UiLCJOb25lIiwiY2hvc2VuRGF0YXNldHMiLCJsZWdpc2xhdHVyZSIsIkFjdGV1cnNFdE9yZ2FuZXMiLCJkYXRhc2V0IiwiYWN0ZXVyc0V0T3JnYW5lcyIsIm9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgiLCJqb2luIiwiZmlsZW5hbWUiLCJzaWxlbnQiLCJjb25zb2xlIiwibG9nIiwiYmFzZW5hbWUiLCJjd2QiLCJlbnYiLCJwcm9jZXNzIiwiZW5jb2RpbmciLCJzdGRpbyIsImRhdGFzZXRSZW9yZ2FuaXplZERpciIsInB1bGwiLCJlbnN1cmVEaXJTeW5jIiwicmVhZGRpclN5bmMiLCJyZW1vdmVTeW5jIiwiYWN0ZXVyc1Jlb3JnYW5pemVkRGlyIiwibWtkaXJTeW5jIiwib3JnYW5lc1Jlb3JnYW5pemVkRGlyIiwic3RydWN0dXJlIiwiU2luZ2xlRmlsZSIsIm9yaWdpbmFsSnNvbiIsInJlYWRGaWxlU3luYyIsIm9yaWdpbmFsRGF0YSIsInRvQWN0ZXVyc0V0T3JnYW5lcyIsIkpTT04iLCJwYXJzZSIsImFjdGV1ciIsImV4cG9ydCIsImFjdGV1cnMiLCJyZW9yZ2FuaXplZEpzb25GaWxlUGF0aCIsInVpZCIsIndyaXRlRmlsZVN5bmMiLCJzdHJpbmdpZnkiLCJvcmdhbmUiLCJvcmdhbmVzIiwiU2VnbWVudGVkRmlsZXMiLCJkZXBvcnRzQnlBY3RldXJVaWQiLCJleGlzdHNTeW5jIiwiZGVwb3J0U3BsaXRQYXRoIiwiZGVwb3J0RmlsZW5hbWUiLCJsZW5ndGgiLCJlbmRzV2l0aCIsImRlcG9ydE9yaWdpbmFsRmlsZVBhdGgiLCJ2ZXJib3NlIiwiZGVwb3J0T3JpZ2luYWxKc29uIiwiZGVwb3J0T3JpZ2luYWwiLCJ0b0RlcG9ydCIsImRlcG9ydCIsImRlcG9ydHMiLCJhY3RldXJSZWYiLCJwdXNoIiwiT2JqZWN0IiwidmFsdWVzIiwic29ydCIsImEiLCJiIiwibG9jYWxlQ29tcGFyZSIsIm1hbmRhdHNCeUFjdGV1clVpZCIsIm1hbmRhdFNwbGl0UGF0aCIsIm1hbmRhdEZpbGVuYW1lIiwibWFuZGF0T3JpZ2luYWxGaWxlUGF0aCIsIm1hbmRhdE9yaWdpbmFsSnNvbiIsIm1hbmRhdE9yaWdpbmFsIiwidG9NYW5kYXRXcmFwcGVyIiwibWFuZGF0IiwibWFuZGF0cyIsImFjdGV1clNwbGl0UGF0aCIsImFjdGV1ckZpbGVuYW1lIiwiYWN0ZXVyT3JpZ2luYWxGaWxlUGF0aCIsImFjdGV1ck9yaWdpbmFsSnNvbiIsImFjdGV1ck9yaWdpbmFsIiwidG9BY3RldXIiLCJhY3RldXJVaWQiLCJzdHJpY3RFcXVhbCIsImFjdGV1clJlb3JnYW5pemVkSnNvbkZpbGVQYXRoIiwib3JnYW5lU3BsaXRQYXRoIiwib3JnYW5lRmlsZW5hbWUiLCJvcmdhbmVPcmlnaW5hbEZpbGVQYXRoIiwib3JnYW5lT3JpZ2luYWxKc29uIiwib3JnYW5lT3JpZ2luYWwiLCJ0b09yZ2FuZSIsIm9yZ2FuZVJlb3JnYW5pemVkSnNvbkZpbGVQYXRoIiwiZXJyb3JDb2RlIiwiY29tbWl0QW5kUHVzaCIsInJlbW90ZSIsIkFnZW5kYXMiLCJhZ2VuZGFzIiwidG9BZ2VuZGFzIiwicmV1bmlvbiIsInJldW5pb25zIiwid3JpdGVSZXVuaW9uUmVvcmdhbml6ZWRKc29uIiwicmV1bmlvblNwbGl0UGF0aCIsInJldW5pb25GaWxlbmFtZSIsInJldW5pb25PcmlnaW5hbEZpbGVQYXRoIiwicmV1bmlvbk9yaWdpbmFsSnNvbiIsInJldW5pb25PcmlnaW5hbCIsInRvUmV1bmlvbiIsIkFtZW5kZW1lbnRzIiwiYW1lbmRlbWVudHMiLCJ0b0FtZW5kZW1lbnRzIiwidGV4dGVMZWdpc2xhdGlmIiwidGV4dGVzRXRBbWVuZGVtZW50cyIsInRleHRlbGVnIiwiYW1lbmRlbWVudCIsIndyaXRlQW1lbmRlbWVudFJlb3JnYW5pemVkSnNvbiIsImFtZW5kZW1lbnRTcGxpdFBhdGgiLCJhbWVuZGVtZW50RmlsZW5hbWUiLCJhbWVuZGVtZW50T3JpZ2luYWxGaWxlUGF0aCIsImFtZW5kZW1lbnRPcmlnaW5hbEpzb24iLCJhbWVuZGVtZW50T3JpZ2luYWwiLCJ0b0FtZW5kZW1lbnRXcmFwcGVyIiwiRG9zc2llcnNMZWdpc2xhdGlmcyIsImRvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb2N1bWVudHNEaXIiLCJkb3NzaWVyc0RpciIsInRvRG9zc2llcnNMZWdpc2xhdGlmcyIsImRvY3VtZW50IiwidGV4dGVzTGVnaXNsYXRpZnMiLCJ3cml0ZURvY3VtZW50UmVvcmdhbml6ZWRKc29uIiwiZG9zc2llclBhcmxlbWVudGFpcmUiLCJkb3NzaWVyIiwid3JpdGVEb3NzaWVyUGFybGVtZW50YWlyZVJlb3JnYW5pemVkSnNvbiIsImRvY3VtZW50U3BsaXRQYXRoIiwiZG9jdW1lbnRGaWxlbmFtZSIsImRvY3VtZW50T3JpZ2luYWxGaWxlUGF0aCIsImRvY3VtZW50T3JpZ2luYWxKc29uIiwiZG9jdW1lbnRPcmlnaW5hbCIsInRvRG9jdW1lbnQiLCJkb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aCIsImRvc3NpZXJQYXJsZW1lbnRhaXJlRmlsZW5hbWUiLCJkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsRmlsZVBhdGgiLCJkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsSnNvbiIsImRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWwiLCJ0b0Rvc3NpZXJQYXJsZW1lbnRhaXJlIiwiU2NydXRpbnMiLCJzY3J1dGlucyIsInRvU2NydXRpbnMiLCJzY3J1dGluIiwid3JpdGVTY3J1dGluUmVvcmdhbml6ZWRKc29uIiwic2NydXRpblNwbGl0UGF0aCIsInNjcnV0aW5GaWxlbmFtZSIsInNjcnV0aW5PcmlnaW5hbEZpbGVQYXRoIiwic2NydXRpbk9yaWdpbmFsSnNvbiIsInNjcnV0aW5PcmlnaW5hbCIsInRvU2NydXRpbldyYXBwZXIiLCJRdWVzdGlvbnMiLCJxdWVzdGlvbnMiLCJxdWVzdGlvblNwbGl0UGF0aCIsInF1ZXN0aW9uRmlsZW5hbWUiLCJxdWVzdGlvbk9yaWdpbmFsRmlsZVBhdGgiLCJxdWVzdGlvbk9yaWdpbmFsSnNvbiIsInF1ZXN0aW9uT3JpZ2luYWwiLCJ0b1F1ZXN0aW9uV3JhcHBlciIsInF1ZXN0aW9uIiwid3JpdGVRdWVzdGlvbnNSZW9yZ2FuaXplZEpzb24iLCJDb21wdGVzUmVuZHVzU2VhbmNlcyIsImNvbXB0ZXNSZW5kdXNTZWFuY2VzIiwiY29tcHRlUmVuZHVTZWFuY2VTcGxpdFBhdGgiLCJjb21wdGVSZW5kdVNlYW5jZUZpbGVuYW1lIiwiY29tcHRlUmVuZHVTZWFuY2VPcmlnaW5hbEZpbGVQYXRoIiwiY29tcHRlUmVuZHVTZWFuY2VPcmlnaW5hbEpzb24iLCJjb21wdGVSZW5kdVNlYW5jZU9yaWdpbmFsIiwidG9Db21wdGVSZW5kdVdyYXBwZXIiLCJjb21wdGVSZW5kdVNlYW5jZSIsImNvbXB0ZVJlbmR1Iiwid3JpdGVDb21wdGVzUmVuZHVzUmVvcmdhbml6ZWRKc29uIiwidWlkVGV4dGVMZWdpc2xhdGlmIiwidGV4dGVMZWdpc2xhdGlmUmVmIiwidGV4dGVMZWdpc2xhdGlmRGlyIiwicmV1bmlvbnNEaXIiLCJzY3J1dGluc0RpciIsInF1ZXN0aW9uc0RpciIsInF1ZXN0aW9uVWlkUmVnZXgiLCJjb21wdGVzUmVuZHVzRGlyIiwiY29tcHRlUmVuZHVVaWRSZWdleCIsIm1haW4iLCJleGl0Il0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvcmVvcmdhbml6ZV9kYXRhLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSBcImFzc2VydFwiXG5pbXBvcnQgeyBleGVjU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCJcbmltcG9ydCBjb21tYW5kTGluZUFyZ3MgZnJvbSBcImNvbW1hbmQtbGluZS1hcmdzXCJcbmltcG9ydCBmcyBmcm9tIFwiZnMtZXh0cmFcIlxuaW1wb3J0IHBhdGggZnJvbSBcInBhdGhcIlxuXG5pbXBvcnQge1xuICBkYXRhc2V0cyxcbiAgRGF0YXNldFN0cnVjdHVyZSxcbiAgRW5hYmxlZERhdGFzZXRzLFxuICBmaWx0ZXJCeUxlZ2lzbGF0dXJlLFxufSBmcm9tIFwiLi4vZGF0YXNldHNcIlxuaW1wb3J0IHsgZXhpc3RpbmdEYXRlVG9Kc29uLCBwYXRjaGVkRGF0ZVRvSnNvbiB9IGZyb20gXCIuLi9kYXRlc1wiXG5pbXBvcnQgKiBhcyBnaXQgZnJvbSBcIi4uL2dpdFwiXG5pbXBvcnQgeyB3YWxrRGlyIH0gZnJvbSBcIi4uL2ZpbGVfc3lzdGVtc1wiXG5pbXBvcnQge1xuICBwYXRoRnJvbURvY3VtZW50VWlkLFxuICBwYXRoRnJvbURvc3NpZXJQYXJsZW1lbnRhaXJlVWlkLFxuICBwYXRoRnJvbVJldW5pb25VaWQsXG4gIHBhdGhGcm9tU2NydXRpblVpZCxcbiAgcGF0aEZyb21VaWQsXG59IGZyb20gXCIuLi9sb2FkZXJzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQgfSBmcm9tIFwiLi4vcmF3X3R5cGVzL2FjdGV1cnNfZXRfb3JnYW5lc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIEFnZW5kYXNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9hZ2VuZGFzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQW1lbmRlbWVudHNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9hbWVuZGVtZW50c1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIERvc3NpZXJzTGVnaXNsYXRpZnNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9kb3NzaWVyc19sZWdpc2xhdGlmc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIFNjcnV0aW5zUmF3Q29udmVydCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvc2NydXRpbnNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBRdWVzdGlvbnNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9xdWVzdGlvbnNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBDb21wdGVzUmVuZHVzUmF3Q29udmVydCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvZGViYXRzXCJcblxuZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ3Y6IHN0cmluZ1tdKTogYW55IHtcbiAgY29uc3Qgb3B0aW9uc0RlZmluaXRpb25zID0gW1xuICAgIHtcbiAgICAgIGFsaWFzOiBcIkNcIixcbiAgICAgIGhlbHA6IFwiY2xvbmUgcmVwb3NpdG9yaWVzIGZyb20gZ2l2ZW4gZ3JvdXAgKG9yIG9yZ2FuaXphdGlvbikgZ2l0IFVSTFwiLFxuICAgICAgbmFtZTogXCJjbG9uZVwiLFxuICAgICAgdHlwZTogU3RyaW5nLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwiY1wiLFxuICAgICAgaGVscDogXCJjb21taXQgc3BsaXQgZmlsZXNcIixcbiAgICAgIG5hbWU6IFwiY29tbWl0XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwia1wiLFxuICAgICAgZGVmYXVsdFZhbHVlOiBbXCJBbGxcIl0sXG4gICAgICBoZWxwOiBcImNhdGVnb3JpZXMgb2YgZGF0YXNldHMgdG8gcmVvcmdhbml6ZVwiLFxuICAgICAgbXVsdGlwbGU6IHRydWUsXG4gICAgICBuYW1lOiBcImNhdGVnb3JpZXNcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcImxcIixcbiAgICAgIGhlbHA6IFwibGVnaXNsYXR1cmVzIG9mIGNhdGVnb3JpZXMgb2YgZGF0YXNldHMgdG8gcmV0cmlldmU7IGxlYXZlIGVtcHR5IG9yIHVzZSAwIGZvciBhbGxcIixcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbmFtZTogXCJsZWdpc2xhdHVyZVwiLFxuICAgICAgdHlwZTogTnVtYmVyLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwicFwiLFxuICAgICAgaGVscDogXCJwdWxsIHJlcG9zaXRvcmllcyBiZWZvcmUgcHJvY2VlZGluZ1wiLFxuICAgICAgbmFtZTogXCJwdWxsXCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwiclwiLFxuICAgICAgaGVscDogXCJwdXNoIGNvbW1pdCB0byBnaXZlbiByZW1vdGVcIixcbiAgICAgIG11bHRpcGxlOiB0cnVlLFxuICAgICAgbmFtZTogXCJyZW1vdGVcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcInNcIixcbiAgICAgIGhlbHA6IFwiZG9uJ3QgbG9nIGFueXRoaW5nXCIsXG4gICAgICBuYW1lOiBcInNpbGVudFwiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICB9LFxuICAgIHtcbiAgICAgIGFsaWFzOiBcIlZcIixcbiAgICAgIGhlbHA6IFwiZG9uJ3QgdmFsaWRhdGUgcmF3IGRhdGFcIixcbiAgICAgIG5hbWU6IFwibm8tdmFsaWRhdGUtcmF3XCIsXG4gICAgICB0eXBlOiBCb29sZWFuLFxuICAgIH0sXG4gICAge1xuICAgICAgYWxpYXM6IFwidlwiLFxuICAgICAgaGVscDogXCJ2ZXJib3NlIGxvZ3NcIixcbiAgICAgIG5hbWU6IFwidmVyYm9zZVwiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICB9LFxuICAgIHtcbiAgICAgIGRlZmF1bHRPcHRpb246IHRydWUsXG4gICAgICBoZWxwOiBcImRpcmVjdG9yeSBjb250YWluaW5nIEFzc2VtYmzDqWUgb3BlbiBkYXRhIGZpbGVzXCIsXG4gICAgICBuYW1lOiBcImRhdGFEaXJcIixcbiAgICAgIHR5cGU6IFN0cmluZyxcbiAgICB9LFxuICBdXG4gIGNvbnN0IG9wdGlvbnMgPSBjb21tYW5kTGluZUFyZ3Mob3B0aW9uc0RlZmluaXRpb25zLCB7XG4gICAgYXJndjogYXJndixcbiAgfSlcbiAgcmV0dXJuIG9wdGlvbnNcbn1cblxuZnVuY3Rpb24gcmVvcmdhbml6ZURhdGEob3B0aW9uczogYW55KTogbnVtYmVyIHtcbiAgY29uc3QgZGF0YURpciA9IG9wdGlvbnMuZGF0YURpclxuICBEYXRlLnByb3RvdHlwZS50b0pTT04gPSBwYXRjaGVkRGF0ZVRvSnNvblxuXG4gIGxldCBleGl0Q29kZSA9IG9wdGlvbnMuY29tbWl0ID8gMTAgOiAwXG4gIGNvbnN0IGdpdEdyb3VwVXJsID0gb3B0aW9ucy5jbG9uZVxuICAgID8gb3B0aW9ucy5jbG9uZS50cmltKCkucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuICAgIDogdW5kZWZpbmVkXG4gIGNvbnN0IHZhbGlkYXRlUmF3RGF0YSA9ICFvcHRpb25zW1wibm8tdmFsaWRhdGUtcmF3XCJdXG5cbiAgb3B0aW9ucy5jYXRlZ29yaWVzLm1hcCgoZGF0YXNldE5hbWU6IHN0cmluZykgPT5cbiAgICBhc3NlcnQubm90U3RyaWN0RXF1YWwoXG4gICAgICAoRW5hYmxlZERhdGFzZXRzIGFzIGFueSBhcyB7IFtuYW1lOiBzdHJpbmddOiBFbmFibGVkRGF0YXNldHMgfSlbXG4gICAgICAgIGRhdGFzZXROYW1lXG4gICAgICBdLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgYFVua25vd24gbmFtZSBvZiBkYXRhc2V0OiAke2RhdGFzZXROYW1lfWAsXG4gICAgKSxcbiAgKVxuICBjb25zdCBlbmFibGVkRGF0YXNldHMgPSBvcHRpb25zLmNhdGVnb3JpZXMucmVkdWNlKFxuICAgIChlbmFibGVkRGF0YXNldHM6IEVuYWJsZWREYXRhc2V0cywgZGF0YXNldE5hbWU6IHN0cmluZyk6IEVuYWJsZWREYXRhc2V0cyA9PlxuICAgICAgZW5hYmxlZERhdGFzZXRzIHxcbiAgICAgIChFbmFibGVkRGF0YXNldHMgYXMgYW55IGFzIHsgW25hbWU6IHN0cmluZ106IEVuYWJsZWREYXRhc2V0cyB9KVtcbiAgICAgICAgZGF0YXNldE5hbWVcbiAgICAgIF0sXG4gICAgRW5hYmxlZERhdGFzZXRzLk5vbmUsXG4gIClcblxuICBsZXQgY2hvc2VuRGF0YXNldHMgPSBmaWx0ZXJCeUxlZ2lzbGF0dXJlKGRhdGFzZXRzLCBvcHRpb25zLmxlZ2lzbGF0dXJlKVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWN0ZXVyc0V0T3JnYW5lcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5hY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGlmIChvcHRpb25zLnB1bGwpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCByZXNldCAtLWhhcmQgb3JpZ2luL21hc3RlcmAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgcHVsbCAtLXJlYmFzZWAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGZzLmVuc3VyZURpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpKSB7XG4gICAgICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgZmlsZW5hbWUpKVxuICAgICAgfVxuICAgICAgY29uc3QgYWN0ZXVyc1Jlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgXCJhY3RldXJzXCIpXG4gICAgICBmcy5ta2RpclN5bmMoYWN0ZXVyc1Jlb3JnYW5pemVkRGlyKVxuICAgICAgY29uc3Qgb3JnYW5lc1Jlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgXCJvcmdhbmVzXCIpXG4gICAgICBmcy5ta2RpclN5bmMob3JnYW5lc1Jlb3JnYW5pemVkRGlyKVxuXG4gICAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TaW5nbGVGaWxlOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b0FjdGV1cnNFdE9yZ2FuZXMob3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JpZ2luYWxKc29uKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFjdGV1ciBvZiBvcmlnaW5hbERhdGEuZXhwb3J0LmFjdGV1cnMuYWN0ZXVyKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgYWN0ZXVyc1Jlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgIGFjdGV1ci51aWRbXCIjdGV4dFwiXSArIFwiLmpzb25cIixcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGFjdGV1ciwgbnVsbCwgMiksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBvcmdhbmUgb2Ygb3JpZ2luYWxEYXRhLmV4cG9ydC5vcmdhbmVzLm9yZ2FuZSkge1xuICAgICAgICAgICAgICBjb25zdCByZW9yZ2FuaXplZEpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yZ2FuZXNSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBvcmdhbmUudWlkICsgXCIuanNvblwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3JnYW5lLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3QgZGVwb3J0c0J5QWN0ZXVyVWlkOiB7XG4gICAgICAgICAgICAgIFthY3RldXJVaWQ6IHN0cmluZ106IHsgdWlkOiBzdHJpbmcgfVtdXG4gICAgICAgICAgICB9ID0ge31cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZnMuZXhpc3RzU3luYyhcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4ob3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCwgXCJkZXBvcnRcIiksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcG9ydFNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgW1wiZGVwb3J0XCJdLFxuICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0RmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgICAgZGVwb3J0U3BsaXRQYXRoW2RlcG9ydFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICAgIGlmICghZGVwb3J0RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0T3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAuLi5kZXBvcnRTcGxpdFBhdGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgICBgICBMb2FkaW5nIFwiZGVwb3J0XCIgZmlsZTogJHtkZXBvcnRPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcG9ydE9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgICAgZGVwb3J0T3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3QgZGVwb3J0T3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b0RlcG9ydChkZXBvcnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoZGVwb3J0T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcG9ydCA9IGRlcG9ydE9yaWdpbmFsLmRlcG9ydFxuICAgICAgICAgICAgICAgIGxldCBkZXBvcnRzID0gZGVwb3J0c0J5QWN0ZXVyVWlkW2RlcG9ydC5hY3RldXJSZWZdXG4gICAgICAgICAgICAgICAgaWYgKGRlcG9ydHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgZGVwb3J0cyA9IGRlcG9ydHNCeUFjdGV1clVpZFtkZXBvcnQuYWN0ZXVyUmVmXSA9IFtdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlcG9ydHMucHVzaChkZXBvcnQpXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IGRlcG9ydHMgb2YgT2JqZWN0LnZhbHVlcyhkZXBvcnRzQnlBY3RldXJVaWQpKSB7XG4gICAgICAgICAgICAgICAgZGVwb3J0cy5zb3J0KChhLCBiKSA9PlxuICAgICAgICAgICAgICAgICAgYS51aWQubGVuZ3RoID09PSBiLnVpZC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyBhLnVpZC5sb2NhbGVDb21wYXJlKGIudWlkKVxuICAgICAgICAgICAgICAgICAgICA6IGEudWlkLmxlbmd0aCAtIGIudWlkLmxlbmd0aCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbWFuZGF0c0J5QWN0ZXVyVWlkOiB7XG4gICAgICAgICAgICAgIFthY3RldXJVaWQ6IHN0cmluZ106IHsgdWlkOiBzdHJpbmcgfVtdXG4gICAgICAgICAgICB9ID0ge31cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgZnMuZXhpc3RzU3luYyhcbiAgICAgICAgICAgICAgICBwYXRoLmpvaW4ob3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCwgXCJtYW5kYXRcIiksXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hbmRhdFNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgW1wibWFuZGF0XCJdLFxuICAgICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWFuZGF0RmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgICAgbWFuZGF0U3BsaXRQYXRoW21hbmRhdFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICAgIGlmICghbWFuZGF0RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgbWFuZGF0T3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICAuLi5tYW5kYXRTcGxpdFBhdGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgICBgICBMb2FkaW5nIFwibWFuZGF0XCIgZmlsZTogJHttYW5kYXRPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG1hbmRhdE9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgICAgbWFuZGF0T3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgY29uc3QgbWFuZGF0T3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b01hbmRhdFdyYXBwZXIoXG4gICAgICAgICAgICAgICAgICAgICAgbWFuZGF0T3JpZ2luYWxKc29uLFxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UobWFuZGF0T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIGNvbnN0IG1hbmRhdCA9IG1hbmRhdE9yaWdpbmFsLm1hbmRhdFxuICAgICAgICAgICAgICAgIGxldCBtYW5kYXRzID0gbWFuZGF0c0J5QWN0ZXVyVWlkW21hbmRhdC5hY3RldXJSZWZdXG4gICAgICAgICAgICAgICAgaWYgKG1hbmRhdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgbWFuZGF0cyA9IG1hbmRhdHNCeUFjdGV1clVpZFttYW5kYXQuYWN0ZXVyUmVmXSA9IFtdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1hbmRhdHMucHVzaChtYW5kYXQpXG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hbmRhdHMgb2YgT2JqZWN0LnZhbHVlcyhtYW5kYXRzQnlBY3RldXJVaWQpKSB7XG4gICAgICAgICAgICAgICAgbWFuZGF0cy5zb3J0KChhLCBiKSA9PlxuICAgICAgICAgICAgICAgICAgYS51aWQubGVuZ3RoID09PSBiLnVpZC5sZW5ndGhcbiAgICAgICAgICAgICAgICAgICAgPyBhLnVpZC5sb2NhbGVDb21wYXJlKGIudWlkKVxuICAgICAgICAgICAgICAgICAgICA6IGEudWlkLmxlbmd0aCAtIGIudWlkLmxlbmd0aCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCBhY3RldXJTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgW1wiYWN0ZXVyXCJdLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBhY3RldXJGaWxlbmFtZSA9IGFjdGV1clNwbGl0UGF0aFthY3RldXJTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgaWYgKCFhY3RldXJGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBhY3RldXJPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4uYWN0ZXVyU3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcImFjdGV1clwiIGZpbGU6ICR7YWN0ZXVyT3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBhY3RldXJPcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBhY3RldXJPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IGFjdGV1ck9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IEFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0LnRvQWN0ZXVyKGFjdGV1ck9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoYWN0ZXVyT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBhY3RldXIgPSBhY3RldXJPcmlnaW5hbC5hY3RldXJcbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyVWlkID0gYWN0ZXVyLnVpZFtcIiN0ZXh0XCJdXG4gICAgICAgICAgICAgIGNvbnN0IGRlcG9ydHMgPSBkZXBvcnRzQnlBY3RldXJVaWRbYWN0ZXVyVWlkXVxuICAgICAgICAgICAgICBpZiAoZGVwb3J0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFjdGV1ci5kZXBvcnRzLCB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgYWN0ZXVyLmRlcG9ydHMgPSB7IGRlcG9ydDogZGVwb3J0cyB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgbWFuZGF0cyA9IG1hbmRhdHNCeUFjdGV1clVpZFthY3RldXJVaWRdXG4gICAgICAgICAgICAgIGlmIChtYW5kYXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWN0ZXVyLm1hbmRhdHMsIHVuZGVmaW5lZClcbiAgICAgICAgICAgICAgICBhY3RldXIubWFuZGF0cyA9IHsgbWFuZGF0OiBtYW5kYXRzIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBhY3RldXJSZW9yZ2FuaXplZEpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIGFjdGV1cnNSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBhY3RldXJVaWQgKyBcIi5qc29uXCIsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBhY3RldXJSZW9yZ2FuaXplZEpzb25GaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShhY3RldXIsIG51bGwsIDIpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3JnYW5lU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcIm9yZ2FuZVwiXSxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3Qgb3JnYW5lRmlsZW5hbWUgPSBvcmdhbmVTcGxpdFBhdGhbb3JnYW5lU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghb3JnYW5lRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3Qgb3JnYW5lT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLm9yZ2FuZVNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJvcmdhbmVcIiBmaWxlOiAke29yZ2FuZU9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3Qgb3JnYW5lT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgb3JnYW5lT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBvcmdhbmVPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b09yZ2FuZShvcmdhbmVPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG9yZ2FuZU9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3Qgb3JnYW5lID0gb3JnYW5lT3JpZ2luYWwub3JnYW5lXG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZVJlb3JnYW5pemVkSnNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JnYW5lc1Jlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgIG9yZ2FuZS51aWQgKyBcIi5qc29uXCIsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBvcmdhbmVSZW9yZ2FuaXplZEpzb25GaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShvcmdhbmUsIG51bGwsIDIpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnaXQuY29tbWl0QW5kUHVzaChcbiAgICAgICAgICBkYXRhc2V0UmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgXCJOb3V2ZWxsZSBtb2lzc29uXCIsXG4gICAgICAgICAgb3B0aW9ucy5yZW1vdGUsXG4gICAgICAgIClcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChleGl0Q29kZSA9PT0gMTAgJiYgZXJyb3JDb2RlICE9PSAxMCkgfHxcbiAgICAgICAgICAoZXhpdENvZGUgPT09IDAgJiYgZXJyb3JDb2RlICE9PSAwICYmIGVycm9yQ29kZSAhPT0gMTApXG4gICAgICAgICkge1xuICAgICAgICAgIGV4aXRDb2RlID0gZXJyb3JDb2RlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFnZW5kYXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hvc2VuRGF0YXNldHMuYWdlbmRhcykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLFxuICAgICAgKVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVvcmdhbml6aW5nICR7b3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoXG4gICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgIFwiLmpzb25cIixcbiAgICAgIClcbiAgICAgIGlmIChnaXRHcm91cFVybCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX0uZ2l0YCwge1xuICAgICAgICAgIGN3ZDogZGF0YURpcixcbiAgICAgICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICAgICAgc3RkaW86IFtcImlnbm9yZVwiLCBcImlnbm9yZVwiLCBcInBpcGVcIl0sXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGZzLmVuc3VyZURpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuICAgICAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpKSB7XG4gICAgICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgZmlsZW5hbWUpKVxuICAgICAgfVxuXG4gICAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TaW5nbGVGaWxlOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgPyBBZ2VuZGFzUmF3Q29udmVydC50b0FnZW5kYXMob3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JpZ2luYWxKc29uKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHJldW5pb24gb2Ygb3JpZ2luYWxEYXRhLnJldW5pb25zLnJldW5pb24pIHtcbiAgICAgICAgICAgICAgd3JpdGVSZXVuaW9uUmVvcmdhbml6ZWRKc29uKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgcmV1bmlvbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNlZ21lbnRlZEZpbGVzOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmV1bmlvblNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICBbXCJyZXVuaW9uXCJdLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCByZXVuaW9uRmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgIHJldW5pb25TcGxpdFBhdGhbcmV1bmlvblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIXJldW5pb25GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCByZXVuaW9uT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLnJldW5pb25TcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwicmV1bmlvblwiIGZpbGU6ICR7cmV1bmlvbk9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcmV1bmlvbk9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIHJldW5pb25PcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IHJldW5pb25PcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBBZ2VuZGFzUmF3Q29udmVydC50b1JldW5pb24ocmV1bmlvbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UocmV1bmlvbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3QgcmV1bmlvbiA9IHJldW5pb25PcmlnaW5hbC5yZXVuaW9uXG4gICAgICAgICAgICAgIHdyaXRlUmV1bmlvblJlb3JnYW5pemVkSnNvbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIHJldW5pb24pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnaXQuY29tbWl0QW5kUHVzaChcbiAgICAgICAgICBkYXRhc2V0UmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgXCJOb3V2ZWxsZSBtb2lzc29uXCIsXG4gICAgICAgICAgb3B0aW9ucy5yZW1vdGUsXG4gICAgICAgIClcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChleGl0Q29kZSA9PT0gMTAgJiYgZXJyb3JDb2RlICE9PSAxMCkgfHxcbiAgICAgICAgICAoZXhpdENvZGUgPT09IDAgJiYgZXJyb3JDb2RlICE9PSAwICYmIGVycm9yQ29kZSAhPT0gMTApXG4gICAgICAgICkge1xuICAgICAgICAgIGV4aXRDb2RlID0gZXJyb3JDb2RlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFtZW5kZW1lbnRzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLmFtZW5kZW1lbnRzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldFJlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG4gICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcikpIHtcbiAgICAgICAgaWYgKGZpbGVuYW1lWzBdID09PSBcIi5cIikge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBmaWxlbmFtZSkpXG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IEFtZW5kZW1lbnRzUmF3Q29udmVydC50b0FtZW5kZW1lbnRzKG9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG9yaWdpbmFsSnNvbilcblxuICAgICAgICAgICAgZm9yIChjb25zdCB0ZXh0ZUxlZ2lzbGF0aWYgb2Ygb3JpZ2luYWxEYXRhLnRleHRlc0V0QW1lbmRlbWVudHNcbiAgICAgICAgICAgICAgLnRleHRlbGVnKSB7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgYW1lbmRlbWVudCBvZiB0ZXh0ZUxlZ2lzbGF0aWYuYW1lbmRlbWVudHMpIHtcbiAgICAgICAgICAgICAgICB3cml0ZUFtZW5kZW1lbnRSZW9yZ2FuaXplZEpzb24oXG4gICAgICAgICAgICAgICAgICBkYXRhc2V0UmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgICBhbWVuZGVtZW50LFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZm9yIChjb25zdCBhbWVuZGVtZW50U3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGFtZW5kZW1lbnRGaWxlbmFtZSA9XG4gICAgICAgICAgICAgICAgYW1lbmRlbWVudFNwbGl0UGF0aFthbWVuZGVtZW50U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghYW1lbmRlbWVudEZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGFtZW5kZW1lbnRPcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4uYW1lbmRlbWVudFNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJhbWVuZGVtZW50XCIgZmlsZTogJHthbWVuZGVtZW50T3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBhbWVuZGVtZW50T3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgYW1lbmRlbWVudE9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3QgYW1lbmRlbWVudE9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICA/IEFtZW5kZW1lbnRzUmF3Q29udmVydC50b0FtZW5kZW1lbnRXcmFwcGVyKFxuICAgICAgICAgICAgICAgICAgICBhbWVuZGVtZW50T3JpZ2luYWxKc29uLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShhbWVuZGVtZW50T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBhbWVuZGVtZW50ID0gYW1lbmRlbWVudE9yaWdpbmFsLmFtZW5kZW1lbnRcbiAgICAgICAgICAgICAgd3JpdGVBbWVuZGVtZW50UmVvcmdhbml6ZWRKc29uKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgYW1lbmRlbWVudClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdpdC5jb21taXRBbmRQdXNoKFxuICAgICAgICAgIGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICBcIk5vdXZlbGxlIG1vaXNzb25cIixcbiAgICAgICAgICBvcHRpb25zLnJlbW90ZSxcbiAgICAgICAgKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGV4aXRDb2RlID09PSAxMCAmJiBlcnJvckNvZGUgIT09IDEwKSB8fFxuICAgICAgICAgIChleGl0Q29kZSA9PT0gMCAmJiBlcnJvckNvZGUgIT09IDAgJiYgZXJyb3JDb2RlICE9PSAxMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXhpdENvZGUgPSBlcnJvckNvZGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuRG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5kb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldFJlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG4gICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcikpIHtcbiAgICAgICAgaWYgKGZpbGVuYW1lWzBdID09PSBcIi5cIikge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBmaWxlbmFtZSkpXG4gICAgICB9XG4gICAgICBjb25zdCBkb2N1bWVudHNEaXIgPSBwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBcImRvY3VtZW50c1wiKVxuICAgICAgZnMubWtkaXJTeW5jKGRvY3VtZW50c0RpcilcbiAgICAgIGNvbnN0IGRvc3NpZXJzRGlyID0gcGF0aC5qb2luKGRhdGFzZXRSZW9yZ2FuaXplZERpciwgXCJkb3NzaWVyc1wiKVxuICAgICAgZnMubWtkaXJTeW5jKGRvc3NpZXJzRGlyKVxuXG4gICAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TaW5nbGVGaWxlOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxEYXRhOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgPyBEb3NzaWVyc0xlZ2lzbGF0aWZzUmF3Q29udmVydC50b0Rvc3NpZXJzTGVnaXNsYXRpZnMoXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb24sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JpZ2luYWxKc29uKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvY3VtZW50IG9mIG9yaWdpbmFsRGF0YS5leHBvcnQudGV4dGVzTGVnaXNsYXRpZnNcbiAgICAgICAgICAgICAgLmRvY3VtZW50KSB7XG4gICAgICAgICAgICAgIHdyaXRlRG9jdW1lbnRSZW9yZ2FuaXplZEpzb24oZG9jdW1lbnRzRGlyLCBkb2N1bWVudClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCB7IGRvc3NpZXJQYXJsZW1lbnRhaXJlIH0gb2Ygb3JpZ2luYWxEYXRhLmV4cG9ydFxuICAgICAgICAgICAgICAuZG9zc2llcnNMZWdpc2xhdGlmcy5kb3NzaWVyKSB7XG4gICAgICAgICAgICAgIHdyaXRlRG9zc2llclBhcmxlbWVudGFpcmVSZW9yZ2FuaXplZEpzb24oXG4gICAgICAgICAgICAgICAgZG9zc2llcnNEaXIsXG4gICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmUsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNlZ21lbnRlZEZpbGVzOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZG9jdW1lbnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgW1wiZG9jdW1lbnRcIl0sXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50RmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgIGRvY3VtZW50U3BsaXRQYXRoW2RvY3VtZW50U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghZG9jdW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudE9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5kb2N1bWVudFNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJkb2N1bWVudFwiIGZpbGU6ICR7ZG9jdW1lbnRPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50T3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50T3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gRG9zc2llcnNMZWdpc2xhdGlmc1Jhd0NvbnZlcnQudG9Eb2N1bWVudChkb2N1bWVudE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoZG9jdW1lbnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gZG9jdW1lbnRPcmlnaW5hbC5kb2N1bWVudFxuICAgICAgICAgICAgICB3cml0ZURvY3VtZW50UmVvcmdhbml6ZWRKc29uKGRvY3VtZW50c0RpciwgZG9jdW1lbnQpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgW1wiZG9zc2llclBhcmxlbWVudGFpcmVcIl0sXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlRmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlU3BsaXRQYXRoW1xuICAgICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVTcGxpdFBhdGgubGVuZ3RoIC0gMVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgaWYgKCFkb3NzaWVyUGFybGVtZW50YWlyZUZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLmRvc3NpZXJQYXJsZW1lbnRhaXJlU3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcImRvc3NpZXJQYXJsZW1lbnRhaXJlXCIgZmlsZTogJHtkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBEb3NzaWVyc0xlZ2lzbGF0aWZzUmF3Q29udmVydC50b0Rvc3NpZXJQYXJsZW1lbnRhaXJlKFxuICAgICAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsSnNvbixcbiAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlID1cbiAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsLmRvc3NpZXJQYXJsZW1lbnRhaXJlXG4gICAgICAgICAgICAgIHdyaXRlRG9zc2llclBhcmxlbWVudGFpcmVSZW9yZ2FuaXplZEpzb24oXG4gICAgICAgICAgICAgICAgZG9zc2llcnNEaXIsXG4gICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmUsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgICAgIGNvbnN0IGVycm9yQ29kZSA9IGdpdC5jb21taXRBbmRQdXNoKFxuICAgICAgICAgIGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICBcIk5vdXZlbGxlIG1vaXNzb25cIixcbiAgICAgICAgICBvcHRpb25zLnJlbW90ZSxcbiAgICAgICAgKVxuICAgICAgICBpZiAoXG4gICAgICAgICAgKGV4aXRDb2RlID09PSAxMCAmJiBlcnJvckNvZGUgIT09IDEwKSB8fFxuICAgICAgICAgIChleGl0Q29kZSA9PT0gMCAmJiBlcnJvckNvZGUgIT09IDAgJiYgZXJyb3JDb2RlICE9PSAxMClcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXhpdENvZGUgPSBlcnJvckNvZGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuU2NydXRpbnMpIHtcbiAgICBmb3IgKGxldCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLnNjcnV0aW5zKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgaWYgKGdpdEdyb3VwVXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXhlY1N5bmMoYGdpdCBjbG9uZSAke2dpdEdyb3VwVXJsfS8ke2RhdGFzZXROYW1lfS5naXRgLCB7XG4gICAgICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgICAgIGVudjogcHJvY2Vzcy5lbnYsXG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICAgICAgfSlcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldFJlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgZnMuZW5zdXJlRGlyU3luYyhkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG4gICAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcikpIHtcbiAgICAgICAgaWYgKGZpbGVuYW1lWzBdID09PSBcIi5cIikge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgZnMucmVtb3ZlU3luYyhwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBmaWxlbmFtZSkpXG4gICAgICB9XG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IFNjcnV0aW5zUmF3Q29udmVydC50b1NjcnV0aW5zKG9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG9yaWdpbmFsSnNvbilcblxuICAgICAgICAgICAgZm9yIChjb25zdCBzY3J1dGluIG9mIG9yaWdpbmFsRGF0YS5zY3J1dGlucy5zY3J1dGluKSB7XG4gICAgICAgICAgICAgIHdyaXRlU2NydXRpblJlb3JnYW5pemVkSnNvbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIHNjcnV0aW4pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNjcnV0aW5TcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc2NydXRpbkZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBzY3J1dGluU3BsaXRQYXRoW3NjcnV0aW5TcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgaWYgKCFzY3J1dGluRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3Qgc2NydXRpbk9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5zY3J1dGluU3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcInNjcnV0aW5cIiBmaWxlOiAke3NjcnV0aW5PcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHNjcnV0aW5PcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBzY3J1dGluT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBzY3J1dGluT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gU2NydXRpbnNSYXdDb252ZXJ0LnRvU2NydXRpbldyYXBwZXIoc2NydXRpbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uoc2NydXRpbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3Qgc2NydXRpbiA9IHNjcnV0aW5PcmlnaW5hbC5zY3J1dGluXG4gICAgICAgICAgICAgIHdyaXRlU2NydXRpblJlb3JnYW5pemVkSnNvbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIHNjcnV0aW4pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgICAgICBjb25zdCBlcnJvckNvZGUgPSBnaXQuY29tbWl0QW5kUHVzaChcbiAgICAgICAgICBkYXRhc2V0UmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgXCJOb3V2ZWxsZSBtb2lzc29uXCIsXG4gICAgICAgICAgb3B0aW9ucy5yZW1vdGUsXG4gICAgICAgIClcbiAgICAgICAgaWYgKFxuICAgICAgICAgIChleGl0Q29kZSA9PT0gMTAgJiYgZXJyb3JDb2RlICE9PSAxMCkgfHxcbiAgICAgICAgICAoZXhpdENvZGUgPT09IDAgJiYgZXJyb3JDb2RlICE9PSAwICYmIGVycm9yQ29kZSAhPT0gMTApXG4gICAgICAgICkge1xuICAgICAgICAgIGV4aXRDb2RlID0gZXJyb3JDb2RlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlF1ZXN0aW9ucykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5xdWVzdGlvbnMpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZSxcbiAgICAgIClcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlb3JnYW5pemluZyAke29yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGh9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKFxuICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICBcIi5qc29uXCIsXG4gICAgICApXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9LmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBmcy5lbnN1cmVEaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcilcbiAgICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZnMucmVhZGRpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKSkge1xuICAgICAgICBpZiAoZmlsZW5hbWVbMF0gPT09IFwiLlwiKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBmcy5yZW1vdmVTeW5jKHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIGZpbGVuYW1lKSlcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChkYXRhc2V0LnN0cnVjdHVyZSkge1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZm9yIChjb25zdCBxdWVzdGlvblNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBxdWVzdGlvbkZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBxdWVzdGlvblNwbGl0UGF0aFtxdWVzdGlvblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIXF1ZXN0aW9uRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb25PcmlnaW5hbEZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgLi4ucXVlc3Rpb25TcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwicXVlc3Rpb25cIiBmaWxlOiAke3F1ZXN0aW9uT3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBxdWVzdGlvbk9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIHF1ZXN0aW9uT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gUXVlc3Rpb25zUmF3Q29udmVydC50b1F1ZXN0aW9uV3JhcHBlcihxdWVzdGlvbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UocXVlc3Rpb25PcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gcXVlc3Rpb25PcmlnaW5hbC5xdWVzdGlvblxuICAgICAgICAgICAgICB3cml0ZVF1ZXN0aW9uc1Jlb3JnYW5pemVkSnNvbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIHF1ZXN0aW9uKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2l0LmNvbW1pdEFuZFB1c2goXG4gICAgICAgICAgZGF0YXNldFJlb3JnYW5pemVkRGlyLFxuICAgICAgICAgIFwiTm91dmVsbGUgbW9pc3NvblwiLFxuICAgICAgICAgIG9wdGlvbnMucmVtb3RlLFxuICAgICAgICApXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoZXhpdENvZGUgPT09IDEwICYmIGVycm9yQ29kZSAhPT0gMTApIHx8XG4gICAgICAgICAgKGV4aXRDb2RlID09PSAwICYmIGVycm9yQ29kZSAhPT0gMCAmJiBlcnJvckNvZGUgIT09IDEwKVxuICAgICAgICApIHtcbiAgICAgICAgICBleGl0Q29kZSA9IGVycm9yQ29kZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Db21wdGVzUmVuZHVzU2VhbmNlcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5jb21wdGVzUmVuZHVzU2VhbmNlcykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLFxuICAgICAgKVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVvcmdhbml6aW5nICR7b3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUob3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCwgXCIueG1sXCIpXG4gICAgICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBleGVjU3luYyhgZ2l0IGNsb25lICR7Z2l0R3JvdXBVcmx9LyR7ZGF0YXNldE5hbWV9LmdpdGAsIHtcbiAgICAgICAgICBjd2Q6IGRhdGFEaXIsXG4gICAgICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGYtOFwiLFxuICAgICAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBmcy5lbnN1cmVEaXJTeW5jKGRhdGFzZXRSZW9yZ2FuaXplZERpcilcbiAgICAgIGZvciAoY29uc3QgZmlsZW5hbWUgb2YgZnMucmVhZGRpclN5bmMoZGF0YXNldFJlb3JnYW5pemVkRGlyKSkge1xuICAgICAgICBpZiAoZmlsZW5hbWVbMF0gPT09IFwiLlwiKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBmcy5yZW1vdmVTeW5jKHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIGZpbGVuYW1lKSlcbiAgICAgIH1cblxuICAgICAgc3dpdGNoIChkYXRhc2V0LnN0cnVjdHVyZSkge1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb21wdGVSZW5kdVNlYW5jZVNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBjb21wdGVSZW5kdVNlYW5jZUZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBjb21wdGVSZW5kdVNlYW5jZVNwbGl0UGF0aFtcbiAgICAgICAgICAgICAgICAgIGNvbXB0ZVJlbmR1U2VhbmNlU3BsaXRQYXRoLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIGlmICghY29tcHRlUmVuZHVTZWFuY2VGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBjb21wdGVSZW5kdVNlYW5jZU9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5jb21wdGVSZW5kdVNlYW5jZVNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJjb21wdGVSZW5kdVNlYW5jZVwiIGZpbGU6ICR7Y29tcHRlUmVuZHVTZWFuY2VPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGNvbXB0ZVJlbmR1U2VhbmNlT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgY29tcHRlUmVuZHVTZWFuY2VPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IGNvbXB0ZVJlbmR1U2VhbmNlT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gQ29tcHRlc1JlbmR1c1Jhd0NvbnZlcnQudG9Db21wdGVSZW5kdVdyYXBwZXIoXG4gICAgICAgICAgICAgICAgICAgIGNvbXB0ZVJlbmR1U2VhbmNlT3JpZ2luYWxKc29uLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShjb21wdGVSZW5kdVNlYW5jZU9yaWdpbmFsSnNvbilcblxuICAgICAgICAgICAgICBjb25zdCBjb21wdGVSZW5kdVNlYW5jZSA9IGNvbXB0ZVJlbmR1U2VhbmNlT3JpZ2luYWwuY29tcHRlUmVuZHVcbiAgICAgICAgICAgICAgd3JpdGVDb21wdGVzUmVuZHVzUmVvcmdhbml6ZWRKc29uKFxuICAgICAgICAgICAgICAgIGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBjb21wdGVSZW5kdVNlYW5jZSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgICAgICAgY29uc3QgZXJyb3JDb2RlID0gZ2l0LmNvbW1pdEFuZFB1c2goXG4gICAgICAgICAgZGF0YXNldFJlb3JnYW5pemVkRGlyLFxuICAgICAgICAgIFwiTm91dmVsbGUgbW9pc3NvblwiLFxuICAgICAgICAgIG9wdGlvbnMucmVtb3RlLFxuICAgICAgICApXG4gICAgICAgIGlmIChcbiAgICAgICAgICAoZXhpdENvZGUgPT09IDEwICYmIGVycm9yQ29kZSAhPT0gMTApIHx8XG4gICAgICAgICAgKGV4aXRDb2RlID09PSAwICYmIGVycm9yQ29kZSAhPT0gMCAmJiBlcnJvckNvZGUgIT09IDEwKVxuICAgICAgICApIHtcbiAgICAgICAgICBleGl0Q29kZSA9IGVycm9yQ29kZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gUmVzdG9yZSBzdGFuZGFyZCBjb252ZXJzaW9uIG9mIGRhdGVzIHRvIEpTT04uXG4gIERhdGUucHJvdG90eXBlLnRvSlNPTiA9IGV4aXN0aW5nRGF0ZVRvSnNvblxuXG4gIHJldHVybiBleGl0Q29kZVxufVxuXG5mdW5jdGlvbiB3cml0ZUFtZW5kZW1lbnRSZW9yZ2FuaXplZEpzb24oXG4gIGRhdGFzZXRSZW9yZ2FuaXplZERpcjogc3RyaW5nLFxuICBhbWVuZGVtZW50OiB7XG4gICAgdWlkOiBzdHJpbmdcbiAgICB0ZXh0ZUxlZ2lzbGF0aWZSZWY6IHN0cmluZ1xuICB9LFxuKTogdm9pZCB7XG4gIGNvbnN0IHVpZFRleHRlTGVnaXNsYXRpZiA9IGFtZW5kZW1lbnQudGV4dGVMZWdpc2xhdGlmUmVmXG4gIGFzc2VydC5ub3RTdHJpY3RFcXVhbCh1aWRUZXh0ZUxlZ2lzbGF0aWYsIHVuZGVmaW5lZClcbiAgY29uc3QgdGV4dGVMZWdpc2xhdGlmRGlyID0gcGF0aC5qb2luKFxuICAgIGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICB1aWRUZXh0ZUxlZ2lzbGF0aWYsXG4gIClcbiAgZnMuZW5zdXJlRGlyU3luYyh0ZXh0ZUxlZ2lzbGF0aWZEaXIpXG4gIGNvbnN0IHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoID0gcGF0aC5qb2luKFxuICAgIHRleHRlTGVnaXNsYXRpZkRpcixcbiAgICBhbWVuZGVtZW50LnVpZCArIFwiLmpzb25cIixcbiAgKVxuICBmcy53cml0ZUZpbGVTeW5jKFxuICAgIHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoLFxuICAgIEpTT04uc3RyaW5naWZ5KGFtZW5kZW1lbnQsIG51bGwsIDIpLFxuICAgIHtcbiAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICB9LFxuICApXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG9jdW1lbnRSZW9yZ2FuaXplZEpzb24oXG4gIGRvY3VtZW50c0Rpcjogc3RyaW5nLFxuICBkb2N1bWVudDogeyB1aWQ6IHN0cmluZyB9LFxuKTogdm9pZCB7XG4gIGNvbnN0IGJhc2VuYW1lID0gcGF0aEZyb21Eb2N1bWVudFVpZChkb2N1bWVudHNEaXIsIGRvY3VtZW50LnVpZClcbiAgZnMud3JpdGVGaWxlU3luYyhgJHtiYXNlbmFtZX0uanNvbmAsIEpTT04uc3RyaW5naWZ5KGRvY3VtZW50LCBudWxsLCAyKSwge1xuICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgfSlcbn1cblxuZnVuY3Rpb24gd3JpdGVEb3NzaWVyUGFybGVtZW50YWlyZVJlb3JnYW5pemVkSnNvbihcbiAgZG9zc2llcnNEaXI6IHN0cmluZyxcbiAgZG9zc2llclBhcmxlbWVudGFpcmU6IHsgdWlkOiBzdHJpbmcgfSxcbik6IHZvaWQge1xuICBjb25zdCBiYXNlbmFtZSA9IHBhdGhGcm9tRG9zc2llclBhcmxlbWVudGFpcmVVaWQoXG4gICAgZG9zc2llcnNEaXIsXG4gICAgZG9zc2llclBhcmxlbWVudGFpcmUudWlkLFxuICApXG4gIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgYCR7YmFzZW5hbWV9Lmpzb25gLFxuICAgIEpTT04uc3RyaW5naWZ5KGRvc3NpZXJQYXJsZW1lbnRhaXJlLCBudWxsLCAyKSxcbiAgICB7XG4gICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgfSxcbiAgKVxufVxuXG5mdW5jdGlvbiB3cml0ZVJldW5pb25SZW9yZ2FuaXplZEpzb24oXG4gIHJldW5pb25zRGlyOiBzdHJpbmcsXG4gIHJldW5pb246IHsgdWlkOiBzdHJpbmcgfSxcbik6IHZvaWQge1xuICBjb25zdCBiYXNlbmFtZSA9IHBhdGhGcm9tUmV1bmlvblVpZChyZXVuaW9uc0RpciwgcmV1bmlvbi51aWQpXG4gIGZzLndyaXRlRmlsZVN5bmMoYCR7YmFzZW5hbWV9Lmpzb25gLCBKU09OLnN0cmluZ2lmeShyZXVuaW9uLCBudWxsLCAyKSwge1xuICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgfSlcbn1cblxuZnVuY3Rpb24gd3JpdGVTY3J1dGluUmVvcmdhbml6ZWRKc29uKFxuICBzY3J1dGluc0Rpcjogc3RyaW5nLFxuICBzY3J1dGluOiB7IHVpZDogc3RyaW5nIH0sXG4pOiB2b2lkIHtcbiAgY29uc3QgYmFzZW5hbWUgPSBwYXRoRnJvbVNjcnV0aW5VaWQoc2NydXRpbnNEaXIsIHNjcnV0aW4udWlkKVxuICBmcy53cml0ZUZpbGVTeW5jKGAke2Jhc2VuYW1lfS5qc29uYCwgSlNPTi5zdHJpbmdpZnkoc2NydXRpbiwgbnVsbCwgMiksIHtcbiAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHdyaXRlUXVlc3Rpb25zUmVvcmdhbml6ZWRKc29uKFxuICBxdWVzdGlvbnNEaXI6IHN0cmluZyxcbiAgcXVlc3Rpb246IHsgdWlkOiBzdHJpbmcgfSxcbik6IHZvaWQge1xuICBjb25zdCBxdWVzdGlvblVpZFJlZ2V4OiBSZWdFeHAgPSAvXlFBTihSXFxkKykoTFxcZCspUShFfEd8T1NEKShcXGQrKSQvXG4gIGNvbnN0IGJhc2VuYW1lID0gcGF0aEZyb21VaWQocXVlc3Rpb25zRGlyLCBxdWVzdGlvbi51aWQsIHF1ZXN0aW9uVWlkUmVnZXgpXG4gIGZzLndyaXRlRmlsZVN5bmMoYCR7YmFzZW5hbWV9Lmpzb25gLCBKU09OLnN0cmluZ2lmeShxdWVzdGlvbiwgbnVsbCwgMiksIHtcbiAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gIH0pXG59XG5cbmZ1bmN0aW9uIHdyaXRlQ29tcHRlc1JlbmR1c1Jlb3JnYW5pemVkSnNvbihcbiAgY29tcHRlc1JlbmR1c0Rpcjogc3RyaW5nLFxuICBjb21wdGVSZW5kdTogeyB1aWQ6IHN0cmluZyB9LFxuKTogdm9pZCB7XG4gIGNvbnN0IGNvbXB0ZVJlbmR1VWlkUmVnZXg6IFJlZ0V4cCA9XG4gICAgL15DUlNBTihSXFxkKykoTFxcZCspKFNcXGQrKShPfEUpKFxcZCspKE5cXGQrKSQvXG4gIGNvbnN0IGJhc2VuYW1lID0gcGF0aEZyb21VaWQoXG4gICAgY29tcHRlc1JlbmR1c0RpcixcbiAgICBjb21wdGVSZW5kdS51aWQsXG4gICAgY29tcHRlUmVuZHVVaWRSZWdleCxcbiAgKVxuICBmcy53cml0ZUZpbGVTeW5jKGAke2Jhc2VuYW1lfS5qc29uYCwgSlNPTi5zdHJpbmdpZnkoY29tcHRlUmVuZHUsIG51bGwsIDIpLCB7XG4gICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICB9KVxufVxuXG5mdW5jdGlvbiBtYWluKGFyZ3Y6IGFueSk6IG51bWJlciB7XG4gIGNvbnN0IG9wdGlvbnMgPSBwYXJzZUFyZ3MoYXJndilcbiAgcmV0dXJuIHJlb3JnYW5pemVEYXRhKG9wdGlvbnMpXG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKHByb2Nlc3MuYXJndlsxXS5lbmRzV2l0aChcInJlb3JnYW5pemVfZGF0YS50c1wiKSlcbiAgcHJvY2Vzcy5leGl0KG1haW4ocHJvY2Vzcy5hcmd2KSlcbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBTSxNQUFNLFFBQVE7QUFDM0IsU0FBU0MsUUFBUSxRQUFRLGVBQWU7QUFDeEMsT0FBT0MsZUFBZSxNQUFNLG1CQUFtQjtBQUMvQyxPQUFPQyxFQUFFLE1BQU0sVUFBVTtBQUN6QixPQUFPQyxJQUFJLE1BQU0sTUFBTTtBQUFBLFNBR3JCQyxRQUFRLEVBQ1JDLGdCQUFnQixFQUNoQkMsZUFBZSxFQUNmQyxtQkFBbUI7QUFBQSxTQUVaQyxrQkFBa0IsRUFBRUMsaUJBQWlCO0FBQUEsT0FDdkMsS0FBS0MsR0FBRztBQUFBLFNBQ05DLE9BQU87QUFBQSxTQUVkQyxtQkFBbUIsRUFDbkJDLCtCQUErQixFQUMvQkMsa0JBQWtCLEVBQ2xCQyxrQkFBa0IsRUFDbEJDLFdBQVc7QUFBQSxTQUVKQyxPQUFPLElBQUlD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
|
|
525
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImZzIiwicGF0aCIsImRhdGFzZXRzIiwiRGF0YXNldFN0cnVjdHVyZSIsIkVuYWJsZWREYXRhc2V0cyIsImdldEVuYWJsZWREYXRhc2V0cyIsImZpbHRlckJ5TGVnaXNsYXR1cmUiLCJleGlzdGluZ0RhdGVUb0pzb24iLCJwYXRjaGVkRGF0ZVRvSnNvbiIsImdpdCIsIndhbGtEaXIiLCJwYXRoRnJvbUNvbXB0ZVJlbmR1VWlkIiwicGF0aEZyb21Eb2N1bWVudFVpZCIsInBhdGhGcm9tRG9zc2llclBhcmxlbWVudGFpcmVVaWQiLCJwYXRoRnJvbVF1ZXN0aW9uVWlkIiwicGF0aEZyb21SZXVuaW9uVWlkIiwicGF0aEZyb21TY3J1dGluVWlkIiwiQ29udmVydCIsIkFjdGV1cnNFdE9yZ2FuZXNSYXdDb252ZXJ0IiwiQWdlbmRhc1Jhd0NvbnZlcnQiLCJBbWVuZGVtZW50c1Jhd0NvbnZlcnQiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzUmF3Q29udmVydCIsIlNjcnV0aW5zUmF3Q29udmVydCIsIlF1ZXN0aW9uc1Jhd0NvbnZlcnQiLCJDb21wdGVzUmVuZHVzUmF3Q29udmVydCIsImNsb25lT3B0aW9uIiwiY29tbWl0T3B0aW9uIiwiY2F0ZWdvcmllc09wdGlvbiIsImxlZ2lzbGF0dXJlT3B0aW9uIiwicmVtb3RlT3B0aW9uIiwic2lsZW50T3B0aW9uIiwidmVyYm9zZU9wdGlvbiIsImRhdGFEaXJEZWZhdWx0T3B0aW9uIiwicHVsbE9wdGlvbiIsInBhcnNlQXJncyIsImFyZ3YiLCJvcHRpb25zRGVmaW5pdGlvbnMiLCJhbGlhcyIsImhlbHAiLCJuYW1lIiwidHlwZSIsIkJvb2xlYW4iLCJvcHRpb25zIiwiY2xlYXJEaXJlY3RvcnkiLCJkaXJQYXRoIiwiZW5zdXJlRGlyU3luYyIsImZpbGVuYW1lIiwicmVhZGRpclN5bmMiLCJzdGFydHNXaXRoIiwicmVtb3ZlU3luYyIsImpvaW4iLCJjbG9uZUdpdCIsImdpdEdyb3VwVXJsIiwiZGF0YXNldE5hbWUiLCJkYXRhRGlyIiwidW5kZWZpbmVkIiwiY3dkIiwiZW52IiwicHJvY2VzcyIsImVuY29kaW5nIiwic3RkaW8iLCJyZW9yZ2FuaXplRGF0YSIsIkRhdGUiLCJwcm90b3R5cGUiLCJ0b0pTT04iLCJleGl0Q29kZSIsImNvbW1pdCIsImNsb25lIiwidHJpbSIsInJlcGxhY2UiLCJ2YWxpZGF0ZVJhd0RhdGEiLCJlbmFibGVkRGF0YXNldHMiLCJjYXRlZ29yaWVzIiwiY2hvc2VuRGF0YXNldHMiLCJsZWdpc2xhdHVyZSIsImNvbW1pdEdpdCIsImRhdGFzZXRSZW9yZ2FuaXplZERpciIsImVycm9yQ29kZSIsImNvbW1pdEFuZFB1c2giLCJyZW1vdGUiLCJBY3RldXJzRXRPcmdhbmVzIiwiZGF0YXNldCIsImFjdGV1cnNFdE9yZ2FuZXMiLCJvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoIiwic2lsZW50IiwiY29uc29sZSIsImxvZyIsImJhc2VuYW1lIiwicHVsbCIsInJlc2V0QW5kUHVsbCIsImFjdGV1cnNSZW9yZ2FuaXplZERpciIsIm1rZGlyU3luYyIsIm9yZ2FuZXNSZW9yZ2FuaXplZERpciIsInN0cnVjdHVyZSIsIlNpbmdsZUZpbGUiLCJvcmlnaW5hbEpzb24iLCJyZWFkRmlsZVN5bmMiLCJvcmlnaW5hbERhdGEiLCJ0b0FjdGV1cnNFdE9yZ2FuZXMiLCJKU09OIiwicGFyc2UiLCJhY3RldXIiLCJleHBvcnQiLCJhY3RldXJzIiwicmVvcmdhbml6ZWRKc29uRmlsZVBhdGgiLCJ1aWQiLCJ3cml0ZUZpbGVTeW5jIiwic3RyaW5naWZ5Iiwib3JnYW5lIiwib3JnYW5lcyIsIlNlZ21lbnRlZEZpbGVzIiwiZGVwb3J0c0J5QWN0ZXVyVWlkIiwiZXhpc3RzU3luYyIsImRlcG9ydFNwbGl0UGF0aCIsImRlcG9ydEZpbGVuYW1lIiwibGVuZ3RoIiwiZW5kc1dpdGgiLCJkZXBvcnRPcmlnaW5hbEZpbGVQYXRoIiwidmVyYm9zZSIsImRlcG9ydE9yaWdpbmFsSnNvbiIsImRlcG9ydE9yaWdpbmFsIiwidG9EZXBvcnQiLCJkZXBvcnQiLCJkZXBvcnRzIiwiYWN0ZXVyUmVmIiwicHVzaCIsIk9iamVjdCIsInZhbHVlcyIsInNvcnQiLCJhIiwiYiIsImxvY2FsZUNvbXBhcmUiLCJtYW5kYXRzQnlBY3RldXJVaWQiLCJtYW5kYXRTcGxpdFBhdGgiLCJtYW5kYXRGaWxlbmFtZSIsIm1hbmRhdE9yaWdpbmFsRmlsZVBhdGgiLCJtYW5kYXRPcmlnaW5hbEpzb24iLCJtYW5kYXRPcmlnaW5hbCIsInRvTWFuZGF0V3JhcHBlciIsIm1hbmRhdCIsIm1hbmRhdHMiLCJhY3RldXJTcGxpdFBhdGgiLCJhY3RldXJGaWxlbmFtZSIsImFjdGV1ck9yaWdpbmFsRmlsZVBhdGgiLCJhY3RldXJPcmlnaW5hbEpzb24iLCJhY3RldXJPcmlnaW5hbCIsInRvQWN0ZXVyIiwiYWN0ZXVyVWlkIiwic3RyaWN0RXF1YWwiLCJhY3RldXJSZW9yZ2FuaXplZEpzb25GaWxlUGF0aCIsIm9yZ2FuZVNwbGl0UGF0aCIsIm9yZ2FuZUZpbGVuYW1lIiwib3JnYW5lT3JpZ2luYWxGaWxlUGF0aCIsIm9yZ2FuZU9yaWdpbmFsSnNvbiIsIm9yZ2FuZU9yaWdpbmFsIiwidG9PcmdhbmUiLCJvcmdhbmVSZW9yZ2FuaXplZEpzb25GaWxlUGF0aCIsIkFnZW5kYXMiLCJhZ2VuZGFzIiwidG9BZ2VuZGFzIiwicmV1bmlvbiIsInJldW5pb25zIiwid3JpdGVSZW9yZ2FuaXplZEpzb24iLCJyZXVuaW9uU3BsaXRQYXRoIiwicmV1bmlvbkZpbGVuYW1lIiwicmV1bmlvbk9yaWdpbmFsRmlsZVBhdGgiLCJyZXVuaW9uT3JpZ2luYWxKc29uIiwicmV1bmlvbk9yaWdpbmFsIiwidG9SZXVuaW9uIiwiQW1lbmRlbWVudHMiLCJhbWVuZGVtZW50cyIsInRvQW1lbmRlbWVudHMiLCJ0ZXh0ZUxlZ2lzbGF0aWYiLCJ0ZXh0ZXNFdEFtZW5kZW1lbnRzIiwidGV4dGVsZWciLCJhbWVuZGVtZW50Iiwid3JpdGVBbWVuZGVtZW50UmVvcmdhbml6ZWRKc29uIiwiYW1lbmRlbWVudFNwbGl0UGF0aCIsImFtZW5kZW1lbnRGaWxlbmFtZSIsImFtZW5kZW1lbnRPcmlnaW5hbEZpbGVQYXRoIiwiYW1lbmRlbWVudE9yaWdpbmFsSnNvbiIsImFtZW5kZW1lbnRPcmlnaW5hbCIsInRvQW1lbmRlbWVudFdyYXBwZXIiLCJEb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9zc2llcnNMZWdpc2xhdGlmcyIsImRvY3VtZW50c0RpciIsImRvc3NpZXJzRGlyIiwidG9Eb3NzaWVyc0xlZ2lzbGF0aWZzIiwiZG9jdW1lbnQiLCJ0ZXh0ZXNMZWdpc2xhdGlmcyIsImRvc3NpZXJQYXJsZW1lbnRhaXJlIiwiZG9zc2llciIsImRvY3VtZW50U3BsaXRQYXRoIiwiZG9jdW1lbnRGaWxlbmFtZSIsImRvY3VtZW50T3JpZ2luYWxGaWxlUGF0aCIsImRvY3VtZW50T3JpZ2luYWxKc29uIiwiZG9jdW1lbnRPcmlnaW5hbCIsInRvRG9jdW1lbnQiLCJkb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aCIsImRvc3NpZXJQYXJsZW1lbnRhaXJlRmlsZW5hbWUiLCJkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsRmlsZVBhdGgiLCJkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsSnNvbiIsImRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWwiLCJ0b0Rvc3NpZXJQYXJsZW1lbnRhaXJlIiwiU2NydXRpbnMiLCJzY3J1dGlucyIsInRvU2NydXRpbnMiLCJzY3J1dGluIiwic2NydXRpblNwbGl0UGF0aCIsInNjcnV0aW5GaWxlbmFtZSIsInNjcnV0aW5PcmlnaW5hbEZpbGVQYXRoIiwic2NydXRpbk9yaWdpbmFsSnNvbiIsInNjcnV0aW5PcmlnaW5hbCIsInRvU2NydXRpbldyYXBwZXIiLCJRdWVzdGlvbnMiLCJxdWVzdGlvbnMiLCJxdWVzdGlvblNwbGl0UGF0aCIsInF1ZXN0aW9uRmlsZW5hbWUiLCJxdWVzdGlvbk9yaWdpbmFsRmlsZVBhdGgiLCJxdWVzdGlvbk9yaWdpbmFsSnNvbiIsInF1ZXN0aW9uT3JpZ2luYWwiLCJ0b1F1ZXN0aW9uV3JhcHBlciIsInF1ZXN0aW9uIiwiQ29tcHRlc1JlbmR1c1NlYW5jZXMiLCJjb21wdGVzUmVuZHVzU2VhbmNlcyIsImNvbXB0ZVJlbmR1U2VhbmNlU3BsaXRQYXRoIiwiY29tcHRlUmVuZHVTZWFuY2VGaWxlbmFtZSIsImNvbXB0ZVJlbmR1U2VhbmNlT3JpZ2luYWxGaWxlUGF0aCIsImNvbXB0ZVJlbmR1U2VhbmNlT3JpZ2luYWxKc29uIiwiY29tcHRlUmVuZHVTZWFuY2VPcmlnaW5hbCIsInRvQ29tcHRlUmVuZHVXcmFwcGVyIiwiY29tcHRlUmVuZHVTZWFuY2UiLCJjb21wdGVSZW5kdSIsInVpZFRleHRlTGVnaXNsYXRpZiIsInRleHRlTGVnaXNsYXRpZlJlZiIsIm5vdFN0cmljdEVxdWFsIiwidGV4dGVMZWdpc2xhdGlmRGlyIiwiZGlyIiwib2JqIiwicGF0aEZyb21VaWQiLCJtYWluIiwiZXhpdCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL3Jlb3JnYW5pemVfZGF0YS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IHsgZXhlY1N5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiXG5pbXBvcnQgY29tbWFuZExpbmVBcmdzIGZyb20gXCJjb21tYW5kLWxpbmUtYXJnc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7XG4gIGRhdGFzZXRzLFxuICBEYXRhc2V0U3RydWN0dXJlLFxuICBFbmFibGVkRGF0YXNldHMsXG4gIGdldEVuYWJsZWREYXRhc2V0cyxcbiAgZmlsdGVyQnlMZWdpc2xhdHVyZSxcbn0gZnJvbSBcIi4uL2RhdGFzZXRzXCJcbmltcG9ydCB7IGV4aXN0aW5nRGF0ZVRvSnNvbiwgcGF0Y2hlZERhdGVUb0pzb24gfSBmcm9tIFwiLi4vZGF0ZXNcIlxuaW1wb3J0ICogYXMgZ2l0IGZyb20gXCIuLi9naXRcIlxuaW1wb3J0IHsgd2Fsa0RpciB9IGZyb20gXCIuLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0IHtcbiAgcGF0aEZyb21Db21wdGVSZW5kdVVpZCxcbiAgcGF0aEZyb21Eb2N1bWVudFVpZCxcbiAgcGF0aEZyb21Eb3NzaWVyUGFybGVtZW50YWlyZVVpZCxcbiAgcGF0aEZyb21RdWVzdGlvblVpZCxcbiAgcGF0aEZyb21SZXVuaW9uVWlkLFxuICBwYXRoRnJvbVNjcnV0aW5VaWQsXG59IGZyb20gXCIuLi9sb2FkZXJzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQgfSBmcm9tIFwiLi4vcmF3X3R5cGVzL2FjdGV1cnNfZXRfb3JnYW5lc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIEFnZW5kYXNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9hZ2VuZGFzXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQW1lbmRlbWVudHNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9hbWVuZGVtZW50c1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIERvc3NpZXJzTGVnaXNsYXRpZnNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9kb3NzaWVyc19sZWdpc2xhdGlmc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIFNjcnV0aW5zUmF3Q29udmVydCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvc2NydXRpbnNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBRdWVzdGlvbnNSYXdDb252ZXJ0IH0gZnJvbSBcIi4uL3Jhd190eXBlcy9xdWVzdGlvbnNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBDb21wdGVzUmVuZHVzUmF3Q29udmVydCB9IGZyb20gXCIuLi9yYXdfdHlwZXMvZGViYXRzXCJcbmltcG9ydCB7XG4gIGNsb25lT3B0aW9uLFxuICBjb21taXRPcHRpb24sXG4gIGNhdGVnb3JpZXNPcHRpb24sXG4gIGxlZ2lzbGF0dXJlT3B0aW9uLFxuICByZW1vdGVPcHRpb24sXG4gIHNpbGVudE9wdGlvbixcbiAgdmVyYm9zZU9wdGlvbixcbiAgZGF0YURpckRlZmF1bHRPcHRpb24sXG4gIHB1bGxPcHRpb24sXG59IGZyb20gXCIuL3NoYXJlZC9jbGlfaGVscGVyc1wiXG5cbmZ1bmN0aW9uIHBhcnNlQXJncyhhcmd2OiBzdHJpbmdbXSk6IGFueSB7XG4gIGNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAgICBjbG9uZU9wdGlvbixcbiAgICBjb21taXRPcHRpb24sXG4gICAgY2F0ZWdvcmllc09wdGlvbixcbiAgICBsZWdpc2xhdHVyZU9wdGlvbixcbiAgICByZW1vdGVPcHRpb24sXG4gICAgc2lsZW50T3B0aW9uLFxuICAgIHZlcmJvc2VPcHRpb24sXG4gICAgZGF0YURpckRlZmF1bHRPcHRpb24sXG4gICAgcHVsbE9wdGlvbixcbiAgICB7XG4gICAgICBhbGlhczogXCJWXCIsXG4gICAgICBoZWxwOiBcImRvbid0IHZhbGlkYXRlIHJhdyBkYXRhXCIsXG4gICAgICBuYW1lOiBcIm5vLXZhbGlkYXRlLXJhd1wiLFxuICAgICAgdHlwZTogQm9vbGVhbixcbiAgICB9LFxuICBdXG4gIGNvbnN0IG9wdGlvbnMgPSBjb21tYW5kTGluZUFyZ3Mob3B0aW9uc0RlZmluaXRpb25zLCB7XG4gICAgYXJndjogYXJndixcbiAgfSlcbiAgcmV0dXJuIG9wdGlvbnNcbn1cblxuZnVuY3Rpb24gY2xlYXJEaXJlY3RvcnkoZGlyUGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGZzLmVuc3VyZURpclN5bmMoZGlyUGF0aClcbiAgZm9yIChjb25zdCBmaWxlbmFtZSBvZiBmcy5yZWFkZGlyU3luYyhkaXJQYXRoKSkge1xuICAgIGlmICghZmlsZW5hbWUuc3RhcnRzV2l0aChcIi5cIikpIHtcbiAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRpclBhdGgsIGZpbGVuYW1lKSlcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY2xvbmVHaXQoXG4gIGdpdEdyb3VwVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGRhdGFzZXROYW1lOiBzdHJpbmcsXG4gIGRhdGFEaXI6IHN0cmluZyxcbik6IHZvaWQge1xuICBpZiAoZ2l0R3JvdXBVcmwgIT09IHVuZGVmaW5lZCkge1xuICAgIGV4ZWNTeW5jKGBnaXQgY2xvbmUgJHtnaXRHcm91cFVybH0vJHtkYXRhc2V0TmFtZX0uZ2l0YCwge1xuICAgICAgY3dkOiBkYXRhRGlyLFxuICAgICAgZW52OiBwcm9jZXNzLmVudixcbiAgICAgIGVuY29kaW5nOiBcInV0Zi04XCIsXG4gICAgICBzdGRpbzogW1wiaWdub3JlXCIsIFwiaWdub3JlXCIsIFwicGlwZVwiXSxcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIHJlb3JnYW5pemVEYXRhKG9wdGlvbnM6IGFueSk6IG51bWJlciB7XG4gIGNvbnN0IGRhdGFEaXIgPSBvcHRpb25zLmRhdGFEaXJcbiAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gcGF0Y2hlZERhdGVUb0pzb25cbiAgbGV0IGV4aXRDb2RlID0gb3B0aW9ucy5jb21taXQgPyAxMCA6IDBcbiAgY29uc3QgZ2l0R3JvdXBVcmwgPSBvcHRpb25zLmNsb25lPy50cmltKCkucmVwbGFjZSgvXFwvKyQvLCBcIlwiKVxuICBjb25zdCB2YWxpZGF0ZVJhd0RhdGEgPSAhb3B0aW9uc1tcIm5vLXZhbGlkYXRlLXJhd1wiXVxuICBjb25zdCBlbmFibGVkRGF0YXNldHMgPSBnZXRFbmFibGVkRGF0YXNldHMob3B0aW9ucy5jYXRlZ29yaWVzKVxuICBsZXQgY2hvc2VuRGF0YXNldHMgPSBmaWx0ZXJCeUxlZ2lzbGF0dXJlKGRhdGFzZXRzLCBvcHRpb25zLmxlZ2lzbGF0dXJlKVxuXG4gIGZ1bmN0aW9uIGNvbW1pdEdpdChkYXRhc2V0UmVvcmdhbml6ZWREaXI6IHN0cmluZywgb3B0aW9uczogYW55KTogdm9pZCB7XG4gICAgaWYgKG9wdGlvbnMuY29tbWl0KSB7XG4gICAgICBjb25zdCBlcnJvckNvZGUgPSBnaXQuY29tbWl0QW5kUHVzaChcbiAgICAgICAgZGF0YXNldFJlb3JnYW5pemVkRGlyLFxuICAgICAgICBcIk5vdXZlbGxlIG1vaXNzb25cIixcbiAgICAgICAgb3B0aW9ucy5yZW1vdGUsXG4gICAgICApXG4gICAgICBpZiAoXG4gICAgICAgIChleGl0Q29kZSA9PT0gMTAgJiYgZXJyb3JDb2RlICE9PSAxMCkgfHxcbiAgICAgICAgKGV4aXRDb2RlID09PSAwICYmIGVycm9yQ29kZSAhPT0gMCAmJiBlcnJvckNvZGUgIT09IDEwKVxuICAgICAgKSB7XG4gICAgICAgIGV4aXRDb2RlID0gZXJyb3JDb2RlXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGNob3NlbkRhdGFzZXRzLmFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZSxcbiAgICAgIClcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlb3JnYW5pemluZyAke29yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGh9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKFxuICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICBcIi5qc29uXCIsXG4gICAgICApXG4gICAgICBjbG9uZUdpdChnaXRHcm91cFVybCwgZGF0YXNldE5hbWUsIGRhdGFEaXIpXG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGlmIChvcHRpb25zLnB1bGwpIHtcbiAgICAgICAgZ2l0LnJlc2V0QW5kUHVsbChkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG4gICAgICB9XG4gICAgICBjbGVhckRpcmVjdG9yeShkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG5cbiAgICAgIGNvbnN0IGFjdGV1cnNSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIFwiYWN0ZXVyc1wiKVxuICAgICAgZnMubWtkaXJTeW5jKGFjdGV1cnNSZW9yZ2FuaXplZERpcilcbiAgICAgIGNvbnN0IG9yZ2FuZXNSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIFwib3JnYW5lc1wiKVxuICAgICAgZnMubWtkaXJTeW5jKG9yZ2FuZXNSZW9yZ2FuaXplZERpcilcblxuICAgICAgc3dpdGNoIChkYXRhc2V0LnN0cnVjdHVyZSkge1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2luZ2xlRmlsZTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGF0YTogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgID8gQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQudG9BY3RldXJzRXRPcmdhbmVzKG9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG9yaWdpbmFsSnNvbilcblxuICAgICAgICAgICAgZm9yIChjb25zdCBhY3RldXIgb2Ygb3JpZ2luYWxEYXRhLmV4cG9ydC5hY3RldXJzLmFjdGV1cikge1xuICAgICAgICAgICAgICBjb25zdCByZW9yZ2FuaXplZEpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIGFjdGV1cnNSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBhY3RldXIudWlkW1wiI3RleHRcIl0gKyBcIi5qc29uXCIsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhcbiAgICAgICAgICAgICAgICByZW9yZ2FuaXplZEpzb25GaWxlUGF0aCxcbiAgICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShhY3RldXIsIG51bGwsIDIpLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3Qgb3JnYW5lIG9mIG9yaWdpbmFsRGF0YS5leHBvcnQub3JnYW5lcy5vcmdhbmUpIHtcbiAgICAgICAgICAgICAgY29uc3QgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmdhbmVzUmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgb3JnYW5lLnVpZCArIFwiLmpzb25cIixcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIHJlb3JnYW5pemVkSnNvbkZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KG9yZ2FuZSwgbnVsbCwgMiksXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNlZ21lbnRlZEZpbGVzOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IGRlcG9ydHNCeUFjdGV1clVpZDoge1xuICAgICAgICAgICAgICBbYWN0ZXVyVWlkOiBzdHJpbmddOiB7IHVpZDogc3RyaW5nIH1bXVxuICAgICAgICAgICAgfSA9IHt9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZzLmV4aXN0c1N5bmMoXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsIFwiZGVwb3J0XCIpLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXBvcnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIFtcImRlcG9ydFwiXSxcbiAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlcG9ydEZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICAgIGRlcG9ydFNwbGl0UGF0aFtkZXBvcnRTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgICBpZiAoIWRlcG9ydEZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcG9ydE9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgLi4uZGVwb3J0U3BsaXRQYXRoLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgICAgYCAgTG9hZGluZyBcImRlcG9ydFwiIGZpbGU6ICR7ZGVwb3J0T3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBkZXBvcnRPcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICAgIGRlcG9ydE9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGNvbnN0IGRlcG9ydE9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICAgID8gQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQudG9EZXBvcnQoZGVwb3J0T3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGRlcG9ydE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICBjb25zdCBkZXBvcnQgPSBkZXBvcnRPcmlnaW5hbC5kZXBvcnRcbiAgICAgICAgICAgICAgICBsZXQgZGVwb3J0cyA9IGRlcG9ydHNCeUFjdGV1clVpZFtkZXBvcnQuYWN0ZXVyUmVmXVxuICAgICAgICAgICAgICAgIGlmIChkZXBvcnRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIGRlcG9ydHMgPSBkZXBvcnRzQnlBY3RldXJVaWRbZGVwb3J0LmFjdGV1clJlZl0gPSBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZXBvcnRzLnB1c2goZGVwb3J0KVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCBkZXBvcnRzIG9mIE9iamVjdC52YWx1ZXMoZGVwb3J0c0J5QWN0ZXVyVWlkKSkge1xuICAgICAgICAgICAgICAgIGRlcG9ydHMuc29ydCgoYSwgYikgPT5cbiAgICAgICAgICAgICAgICAgIGEudWlkLmxlbmd0aCA9PT0gYi51aWQubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgID8gYS51aWQubG9jYWxlQ29tcGFyZShiLnVpZClcbiAgICAgICAgICAgICAgICAgICAgOiBhLnVpZC5sZW5ndGggLSBiLnVpZC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG1hbmRhdHNCeUFjdGV1clVpZDoge1xuICAgICAgICAgICAgICBbYWN0ZXVyVWlkOiBzdHJpbmddOiB7IHVpZDogc3RyaW5nIH1bXVxuICAgICAgICAgICAgfSA9IHt9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGZzLmV4aXN0c1N5bmMoXG4gICAgICAgICAgICAgICAgcGF0aC5qb2luKG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsIFwibWFuZGF0XCIpLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtYW5kYXRTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIFtcIm1hbmRhdFwiXSxcbiAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IG1hbmRhdEZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICAgIG1hbmRhdFNwbGl0UGF0aFttYW5kYXRTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgICBpZiAoIW1hbmRhdEZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG1hbmRhdE9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgICAgLi4ubWFuZGF0U3BsaXRQYXRoLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgICAgYCAgTG9hZGluZyBcIm1hbmRhdFwiIGZpbGU6ICR7bWFuZGF0T3JpZ2luYWxGaWxlUGF0aH3igKZgLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBtYW5kYXRPcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICAgIG1hbmRhdE9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIGNvbnN0IG1hbmRhdE9yaWdpbmFsOiBhbnkgPSB2YWxpZGF0ZVJhd0RhdGFcbiAgICAgICAgICAgICAgICAgID8gQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQudG9NYW5kYXRXcmFwcGVyKFxuICAgICAgICAgICAgICAgICAgICAgIG1hbmRhdE9yaWdpbmFsSnNvbixcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKG1hbmRhdE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICBjb25zdCBtYW5kYXQgPSBtYW5kYXRPcmlnaW5hbC5tYW5kYXRcbiAgICAgICAgICAgICAgICBsZXQgbWFuZGF0cyA9IG1hbmRhdHNCeUFjdGV1clVpZFttYW5kYXQuYWN0ZXVyUmVmXVxuICAgICAgICAgICAgICAgIGlmIChtYW5kYXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIG1hbmRhdHMgPSBtYW5kYXRzQnlBY3RldXJVaWRbbWFuZGF0LmFjdGV1clJlZl0gPSBbXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtYW5kYXRzLnB1c2gobWFuZGF0KVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCBtYW5kYXRzIG9mIE9iamVjdC52YWx1ZXMobWFuZGF0c0J5QWN0ZXVyVWlkKSkge1xuICAgICAgICAgICAgICAgIG1hbmRhdHMuc29ydCgoYSwgYikgPT5cbiAgICAgICAgICAgICAgICAgIGEudWlkLmxlbmd0aCA9PT0gYi51aWQubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgID8gYS51aWQubG9jYWxlQ29tcGFyZShiLnVpZClcbiAgICAgICAgICAgICAgICAgICAgOiBhLnVpZC5sZW5ndGggLSBiLnVpZC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgYWN0ZXVyU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcImFjdGV1clwiXSxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyRmlsZW5hbWUgPSBhY3RldXJTcGxpdFBhdGhbYWN0ZXVyU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghYWN0ZXVyRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLmFjdGV1clNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJhY3RldXJcIiBmaWxlOiAke2FjdGV1ck9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgYWN0ZXVyT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBhY3RldXJPcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBBY3RldXJzRXRPcmdhbmVzUmF3Q29udmVydC50b0FjdGV1cihhY3RldXJPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGFjdGV1ck9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyID0gYWN0ZXVyT3JpZ2luYWwuYWN0ZXVyXG4gICAgICAgICAgICAgIGNvbnN0IGFjdGV1clVpZCA9IGFjdGV1ci51aWRbXCIjdGV4dFwiXVxuICAgICAgICAgICAgICBjb25zdCBkZXBvcnRzID0gZGVwb3J0c0J5QWN0ZXVyVWlkW2FjdGV1clVpZF1cbiAgICAgICAgICAgICAgaWYgKGRlcG9ydHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGFzc2VydC5zdHJpY3RFcXVhbChhY3RldXIuZGVwb3J0cywgdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgIGFjdGV1ci5kZXBvcnRzID0geyBkZXBvcnQ6IGRlcG9ydHMgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG1hbmRhdHMgPSBtYW5kYXRzQnlBY3RldXJVaWRbYWN0ZXVyVWlkXVxuICAgICAgICAgICAgICBpZiAobWFuZGF0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGFjdGV1ci5tYW5kYXRzLCB1bmRlZmluZWQpXG4gICAgICAgICAgICAgICAgYWN0ZXVyLm1hbmRhdHMgPSB7IG1hbmRhdDogbWFuZGF0cyB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYWN0ZXVyUmVvcmdhbml6ZWRKc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBhY3RldXJzUmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgYWN0ZXVyVWlkICsgXCIuanNvblwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgYWN0ZXVyUmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoYWN0ZXVyLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IG9yZ2FuZVNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICBbXCJvcmdhbmVcIl0sXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZUZpbGVuYW1lID0gb3JnYW5lU3BsaXRQYXRoW29yZ2FuZVNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIW9yZ2FuZUZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZU9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5vcmdhbmVTcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwib3JnYW5lXCIgZmlsZTogJHtvcmdhbmVPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZU9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIG9yZ2FuZU9yaWdpbmFsRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgY29uc3Qgb3JnYW5lT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gQWN0ZXVyc0V0T3JnYW5lc1Jhd0NvbnZlcnQudG9PcmdhbmUob3JnYW5lT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmdhbmVPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IG9yZ2FuZSA9IG9yZ2FuZU9yaWdpbmFsLm9yZ2FuZVxuICAgICAgICAgICAgICBjb25zdCBvcmdhbmVSZW9yZ2FuaXplZEpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgIG9yZ2FuZXNSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBvcmdhbmUudWlkICsgXCIuanNvblwiLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgb3JnYW5lUmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3JnYW5lLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjb21taXRHaXQoZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWdlbmRhcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5hZ2VuZGFzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjbGVhckRpcmVjdG9yeShkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IEFnZW5kYXNSYXdDb252ZXJ0LnRvQWdlbmRhcyhvcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmlnaW5hbEpzb24pXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgcmV1bmlvbiBvZiBvcmlnaW5hbERhdGEucmV1bmlvbnMucmV1bmlvbikge1xuICAgICAgICAgICAgICB3cml0ZVJlb3JnYW5pemVkSnNvbihcbiAgICAgICAgICAgICAgICBkYXRhc2V0UmVvcmdhbml6ZWREaXIsXG4gICAgICAgICAgICAgICAgcmV1bmlvbixcbiAgICAgICAgICAgICAgICBwYXRoRnJvbVJldW5pb25VaWQsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNlZ21lbnRlZEZpbGVzOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcmV1bmlvblNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICBbXCJyZXVuaW9uXCJdLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCByZXVuaW9uRmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgIHJldW5pb25TcGxpdFBhdGhbcmV1bmlvblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICAgICAgICBpZiAoIXJldW5pb25GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCByZXVuaW9uT3JpZ2luYWxGaWxlUGF0aCA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIC4uLnJldW5pb25TcGxpdFBhdGgsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudmVyYm9zZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgICAgICAgYCAgUmVvcmdhbml6aW5nIFwicmV1bmlvblwiIGZpbGU6ICR7cmV1bmlvbk9yaWdpbmFsRmlsZVBhdGh94oCmYCxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcmV1bmlvbk9yaWdpbmFsSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKFxuICAgICAgICAgICAgICAgIHJldW5pb25PcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IHJldW5pb25PcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBBZ2VuZGFzUmF3Q29udmVydC50b1JldW5pb24ocmV1bmlvbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UocmV1bmlvbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3QgcmV1bmlvbiA9IHJldW5pb25PcmlnaW5hbC5yZXVuaW9uXG4gICAgICAgICAgICAgIHdyaXRlUmVvcmdhbml6ZWRKc29uKFxuICAgICAgICAgICAgICAgIGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICByZXVuaW9uLFxuICAgICAgICAgICAgICAgIHBhdGhGcm9tUmV1bmlvblVpZCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjb21taXRHaXQoZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQW1lbmRlbWVudHMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgY2hvc2VuRGF0YXNldHMuYW1lbmRlbWVudHMpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZSxcbiAgICAgIClcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlb3JnYW5pemluZyAke29yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGh9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKFxuICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICBcIi5qc29uXCIsXG4gICAgICApXG4gICAgICBjbG9uZUdpdChnaXRHcm91cFVybCwgZGF0YXNldE5hbWUsIGRhdGFEaXIpXG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNsZWFyRGlyZWN0b3J5KGRhdGFzZXRSZW9yZ2FuaXplZERpcilcblxuICAgICAgc3dpdGNoIChkYXRhc2V0LnN0cnVjdHVyZSkge1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2luZ2xlRmlsZTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGF0YTogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgID8gQW1lbmRlbWVudHNSYXdDb252ZXJ0LnRvQW1lbmRlbWVudHMob3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JpZ2luYWxKc29uKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHRleHRlTGVnaXNsYXRpZiBvZiBvcmlnaW5hbERhdGEudGV4dGVzRXRBbWVuZGVtZW50c1xuICAgICAgICAgICAgICAudGV4dGVsZWcpIHtcbiAgICAgICAgICAgICAgZm9yIChjb25zdCBhbWVuZGVtZW50IG9mIHRleHRlTGVnaXNsYXRpZi5hbWVuZGVtZW50cykge1xuICAgICAgICAgICAgICAgIHdyaXRlQW1lbmRlbWVudFJlb3JnYW5pemVkSnNvbihcbiAgICAgICAgICAgICAgICAgIGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICAgIGFtZW5kZW1lbnQsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGFtZW5kZW1lbnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3QgYW1lbmRlbWVudEZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBhbWVuZGVtZW50U3BsaXRQYXRoW2FtZW5kZW1lbnRTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgaWYgKCFhbWVuZGVtZW50RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgYW1lbmRlbWVudE9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5hbWVuZGVtZW50U3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcImFtZW5kZW1lbnRcIiBmaWxlOiAke2FtZW5kZW1lbnRPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGFtZW5kZW1lbnRPcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBhbWVuZGVtZW50T3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBhbWVuZGVtZW50T3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gQW1lbmRlbWVudHNSYXdDb252ZXJ0LnRvQW1lbmRlbWVudFdyYXBwZXIoXG4gICAgICAgICAgICAgICAgICAgIGFtZW5kZW1lbnRPcmlnaW5hbEpzb24sXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGFtZW5kZW1lbnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IGFtZW5kZW1lbnQgPSBhbWVuZGVtZW50T3JpZ2luYWwuYW1lbmRlbWVudFxuICAgICAgICAgICAgICB3cml0ZUFtZW5kZW1lbnRSZW9yZ2FuaXplZEpzb24oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBhbWVuZGVtZW50KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjb21taXRHaXQoZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuRG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBjaG9zZW5EYXRhc2V0cy5kb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUsXG4gICAgICApXG4gICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBSZW9yZ2FuaXppbmcgJHtvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRofWApXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRhdGFzZXROYW1lID0gcGF0aC5iYXNlbmFtZShcbiAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgXCIuanNvblwiLFxuICAgICAgKVxuICAgICAgY2xvbmVHaXQoZ2l0R3JvdXBVcmwsIGRhdGFzZXROYW1lLCBkYXRhRGlyKVxuXG4gICAgICBjb25zdCBkYXRhc2V0UmVvcmdhbml6ZWREaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgZGF0YXNldE5hbWUpXG4gICAgICBjbGVhckRpcmVjdG9yeShkYXRhc2V0UmVvcmdhbml6ZWREaXIpXG5cbiAgICAgIGNvbnN0IGRvY3VtZW50c0RpciA9IHBhdGguam9pbihkYXRhc2V0UmVvcmdhbml6ZWREaXIsIFwiZG9jdW1lbnRzXCIpXG4gICAgICBmcy5ta2RpclN5bmMoZG9jdW1lbnRzRGlyKVxuICAgICAgY29uc3QgZG9zc2llcnNEaXIgPSBwYXRoLmpvaW4oZGF0YXNldFJlb3JnYW5pemVkRGlyLCBcImRvc3NpZXJzXCIpXG4gICAgICBmcy5ta2RpclN5bmMoZG9zc2llcnNEaXIpXG5cbiAgICAgIHN3aXRjaCAoZGF0YXNldC5zdHJ1Y3R1cmUpIHtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNpbmdsZUZpbGU6XG4gICAgICAgICAge1xuICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICApXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERhdGE6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICA/IERvc3NpZXJzTGVnaXNsYXRpZnNSYXdDb252ZXJ0LnRvRG9zc2llcnNMZWdpc2xhdGlmcyhcbiAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSnNvbixcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogSlNPTi5wYXJzZShvcmlnaW5hbEpzb24pXG5cbiAgICAgICAgICAgIGZvciAoY29uc3QgZG9jdW1lbnQgb2Ygb3JpZ2luYWxEYXRhLmV4cG9ydC50ZXh0ZXNMZWdpc2xhdGlmc1xuICAgICAgICAgICAgICAuZG9jdW1lbnQpIHtcbiAgICAgICAgICAgICAgd3JpdGVSZW9yZ2FuaXplZEpzb24oZG9jdW1lbnRzRGlyLCBkb2N1bWVudCwgcGF0aEZyb21Eb2N1bWVudFVpZClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChjb25zdCB7IGRvc3NpZXJQYXJsZW1lbnRhaXJlIH0gb2Ygb3JpZ2luYWxEYXRhLmV4cG9ydFxuICAgICAgICAgICAgICAuZG9zc2llcnNMZWdpc2xhdGlmcy5kb3NzaWVyKSB7XG4gICAgICAgICAgICAgIHdyaXRlUmVvcmdhbml6ZWRKc29uKFxuICAgICAgICAgICAgICAgIGRvc3NpZXJzRGlyLFxuICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlLFxuICAgICAgICAgICAgICAgIHBhdGhGcm9tRG9zc2llclBhcmxlbWVudGFpcmVVaWQsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSBEYXRhc2V0U3RydWN0dXJlLlNlZ21lbnRlZEZpbGVzOlxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZG9jdW1lbnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgW1wiZG9jdW1lbnRcIl0sXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50RmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgIGRvY3VtZW50U3BsaXRQYXRoW2RvY3VtZW50U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghZG9jdW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudE9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5kb2N1bWVudFNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJkb2N1bWVudFwiIGZpbGU6ICR7ZG9jdW1lbnRPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50T3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50T3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gRG9zc2llcnNMZWdpc2xhdGlmc1Jhd0NvbnZlcnQudG9Eb2N1bWVudChkb2N1bWVudE9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoZG9jdW1lbnRPcmlnaW5hbEpzb24pXG4gICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gZG9jdW1lbnRPcmlnaW5hbC5kb2N1bWVudFxuICAgICAgICAgICAgICB3cml0ZVJlb3JnYW5pemVkSnNvbihkb2N1bWVudHNEaXIsIGRvY3VtZW50LCBwYXRoRnJvbURvY3VtZW50VWlkKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICAgIFtcImRvc3NpZXJQYXJsZW1lbnRhaXJlXCJdLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZUZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aFtcbiAgICAgICAgICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlU3BsaXRQYXRoLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIGlmICghZG9zc2llclBhcmxlbWVudGFpcmVGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZU9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5kb3NzaWVyUGFybGVtZW50YWlyZVNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJkb3NzaWVyUGFybGVtZW50YWlyZVwiIGZpbGU6ICR7ZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gRG9zc2llcnNMZWdpc2xhdGlmc1Jhd0NvbnZlcnQudG9Eb3NzaWVyUGFybGVtZW50YWlyZShcbiAgICAgICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbEpzb24sXG4gICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKGRvc3NpZXJQYXJsZW1lbnRhaXJlT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZSA9XG4gICAgICAgICAgICAgICAgZG9zc2llclBhcmxlbWVudGFpcmVPcmlnaW5hbC5kb3NzaWVyUGFybGVtZW50YWlyZVxuICAgICAgICAgICAgICB3cml0ZVJlb3JnYW5pemVkSnNvbihcbiAgICAgICAgICAgICAgICBkb3NzaWVyc0RpcixcbiAgICAgICAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZSxcbiAgICAgICAgICAgICAgICBwYXRoRnJvbURvc3NpZXJQYXJsZW1lbnRhaXJlVWlkLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGNvbW1pdEdpdChkYXRhc2V0UmVvcmdhbml6ZWREaXIsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5TY3J1dGlucykge1xuICAgIGZvciAobGV0IGRhdGFzZXQgb2YgY2hvc2VuRGF0YXNldHMuc2NydXRpbnMpIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZSxcbiAgICAgIClcbiAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFJlb3JnYW5pemluZyAke29yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGh9YClcbiAgICAgIH1cblxuICAgICAgY29uc3QgZGF0YXNldE5hbWUgPSBwYXRoLmJhc2VuYW1lKFxuICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICBcIi5qc29uXCIsXG4gICAgICApXG4gICAgICBjbG9uZUdpdChnaXRHcm91cFVybCwgZGF0YXNldE5hbWUsIGRhdGFEaXIpXG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNsZWFyRGlyZWN0b3J5KGRhdGFzZXRSZW9yZ2FuaXplZERpcilcblxuICAgICAgc3dpdGNoIChkYXRhc2V0LnN0cnVjdHVyZSkge1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2luZ2xlRmlsZTpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGF0YTogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgID8gU2NydXRpbnNSYXdDb252ZXJ0LnRvU2NydXRpbnMob3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uob3JpZ2luYWxKc29uKVxuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNjcnV0aW4gb2Ygb3JpZ2luYWxEYXRhLnNjcnV0aW5zLnNjcnV0aW4pIHtcbiAgICAgICAgICAgICAgd3JpdGVSZW9yZ2FuaXplZEpzb24oXG4gICAgICAgICAgICAgICAgZGF0YXNldFJlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgIHNjcnV0aW4sXG4gICAgICAgICAgICAgICAgcGF0aEZyb21TY3J1dGluVWlkLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHNjcnV0aW5TcGxpdFBhdGggb2Ygd2Fsa0RpcihcbiAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgY29uc3Qgc2NydXRpbkZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBzY3J1dGluU3BsaXRQYXRoW3NjcnV0aW5TcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgICAgaWYgKCFzY3J1dGluRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3Qgc2NydXRpbk9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5zY3J1dGluU3BsaXRQYXRoLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnZlcmJvc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICAgICAgIGAgIFJlb3JnYW5pemluZyBcInNjcnV0aW5cIiBmaWxlOiAke3NjcnV0aW5PcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHNjcnV0aW5PcmlnaW5hbEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICAgICAgICAgICAgICBzY3J1dGluT3JpZ2luYWxGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBjb25zdCBzY3J1dGluT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gU2NydXRpbnNSYXdDb252ZXJ0LnRvU2NydXRpbldyYXBwZXIoc2NydXRpbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgICA6IEpTT04ucGFyc2Uoc2NydXRpbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3Qgc2NydXRpbiA9IHNjcnV0aW5PcmlnaW5hbC5zY3J1dGluXG4gICAgICAgICAgICAgIHdyaXRlUmVvcmdhbml6ZWRKc29uKFxuICAgICAgICAgICAgICAgIGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBzY3J1dGluLFxuICAgICAgICAgICAgICAgIHBhdGhGcm9tU2NydXRpblVpZCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgfVxuXG4gICAgICBjb21taXRHaXQoZGF0YXNldFJlb3JnYW5pemVkRGlyLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuUXVlc3Rpb25zKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLnF1ZXN0aW9ucykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLFxuICAgICAgKVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVvcmdhbml6aW5nICR7b3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUoXG4gICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgIFwiLmpzb25cIixcbiAgICAgIClcbiAgICAgIGNsb25lR2l0KGdpdEdyb3VwVXJsLCBkYXRhc2V0TmFtZSwgZGF0YURpcilcblxuICAgICAgY29uc3QgZGF0YXNldFJlb3JnYW5pemVkRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIGRhdGFzZXROYW1lKVxuICAgICAgY2xlYXJEaXJlY3RvcnkoZGF0YXNldFJlb3JnYW5pemVkRGlyKVxuXG4gICAgICBzd2l0Y2ggKGRhdGFzZXQuc3RydWN0dXJlKSB7XG4gICAgICAgIGNhc2UgRGF0YXNldFN0cnVjdHVyZS5TZWdtZW50ZWRGaWxlczpcbiAgICAgICAgICB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IHF1ZXN0aW9uU3BsaXRQYXRoIG9mIHdhbGtEaXIoXG4gICAgICAgICAgICAgIG9yaWdpbmFsSnNvbkRpcmVjdG9yeU9yRmlsZVBhdGgsXG4gICAgICAgICAgICApKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uRmlsZW5hbWUgPVxuICAgICAgICAgICAgICAgIHF1ZXN0aW9uU3BsaXRQYXRoW3F1ZXN0aW9uU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgICAgICAgIGlmICghcXVlc3Rpb25GaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBxdWVzdGlvbk9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5xdWVzdGlvblNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJxdWVzdGlvblwiIGZpbGU6ICR7cXVlc3Rpb25PcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgcXVlc3Rpb25PcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb25PcmlnaW5hbDogYW55ID0gdmFsaWRhdGVSYXdEYXRhXG4gICAgICAgICAgICAgICAgPyBRdWVzdGlvbnNSYXdDb252ZXJ0LnRvUXVlc3Rpb25XcmFwcGVyKHF1ZXN0aW9uT3JpZ2luYWxKc29uKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShxdWVzdGlvbk9yaWdpbmFsSnNvbilcbiAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb24gPSBxdWVzdGlvbk9yaWdpbmFsLnF1ZXN0aW9uXG4gICAgICAgICAgICAgIHdyaXRlUmVvcmdhbml6ZWRKc29uKFxuICAgICAgICAgICAgICAgIGRhdGFzZXRSZW9yZ2FuaXplZERpcixcbiAgICAgICAgICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgICAgICAgICBwYXRoRnJvbVF1ZXN0aW9uVWlkLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrXG4gICAgICB9XG5cbiAgICAgIGNvbW1pdEdpdChkYXRhc2V0UmVvcmdhbml6ZWREaXIsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Db21wdGVzUmVuZHVzU2VhbmNlcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5jb21wdGVzUmVuZHVzU2VhbmNlcykge1xuICAgICAgY29uc3Qgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLFxuICAgICAgKVxuICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICBjb25zb2xlLmxvZyhgUmVvcmdhbml6aW5nICR7b3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aH1gKVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkYXRhc2V0TmFtZSA9IHBhdGguYmFzZW5hbWUob3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCwgXCIueG1sXCIpXG4gICAgICBjbG9uZUdpdChnaXRHcm91cFVybCwgZGF0YXNldE5hbWUsIGRhdGFEaXIpXG5cbiAgICAgIGNvbnN0IGRhdGFzZXRSZW9yZ2FuaXplZERpciA9IHBhdGguam9pbihkYXRhRGlyLCBkYXRhc2V0TmFtZSlcbiAgICAgIGNsZWFyRGlyZWN0b3J5KGRhdGFzZXRSZW9yZ2FuaXplZERpcilcblxuICAgICAgc3dpdGNoIChkYXRhc2V0LnN0cnVjdHVyZSkge1xuICAgICAgICBjYXNlIERhdGFzZXRTdHJ1Y3R1cmUuU2VnbWVudGVkRmlsZXM6XG4gICAgICAgICAge1xuICAgICAgICAgICAgZm9yIChjb25zdCBjb21wdGVSZW5kdVNlYW5jZVNwbGl0UGF0aCBvZiB3YWxrRGlyKFxuICAgICAgICAgICAgICBvcmlnaW5hbEpzb25EaXJlY3RvcnlPckZpbGVQYXRoLFxuICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICBjb25zdCBjb21wdGVSZW5kdVNlYW5jZUZpbGVuYW1lID1cbiAgICAgICAgICAgICAgICBjb21wdGVSZW5kdVNlYW5jZVNwbGl0UGF0aFtcbiAgICAgICAgICAgICAgICAgIGNvbXB0ZVJlbmR1U2VhbmNlU3BsaXRQYXRoLmxlbmd0aCAtIDFcbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICAgIGlmICghY29tcHRlUmVuZHVTZWFuY2VGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBjb21wdGVSZW5kdVNlYW5jZU9yaWdpbmFsRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxKc29uRGlyZWN0b3J5T3JGaWxlUGF0aCxcbiAgICAgICAgICAgICAgICAuLi5jb21wdGVSZW5kdVNlYW5jZVNwbGl0UGF0aCxcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICBpZiAob3B0aW9ucy52ZXJib3NlKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgICBSZW9yZ2FuaXppbmcgXCJjb21wdGVSZW5kdVNlYW5jZVwiIGZpbGU6ICR7Y29tcHRlUmVuZHVTZWFuY2VPcmlnaW5hbEZpbGVQYXRofeKApmAsXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IGNvbXB0ZVJlbmR1U2VhbmNlT3JpZ2luYWxKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgICAgICAgICAgICAgY29tcHRlUmVuZHVTZWFuY2VPcmlnaW5hbEZpbGVQYXRoLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIGNvbnN0IGNvbXB0ZVJlbmR1U2VhbmNlT3JpZ2luYWw6IGFueSA9IHZhbGlkYXRlUmF3RGF0YVxuICAgICAgICAgICAgICAgID8gQ29tcHRlc1JlbmR1c1Jhd0NvbnZlcnQudG9Db21wdGVSZW5kdVdyYXBwZXIoXG4gICAgICAgICAgICAgICAgICAgIGNvbXB0ZVJlbmR1U2VhbmNlT3JpZ2luYWxKc29uLFxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogSlNPTi5wYXJzZShjb21wdGVSZW5kdVNlYW5jZU9yaWdpbmFsSnNvbilcblxuICAgICAgICAgICAgICBjb25zdCBjb21wdGVSZW5kdVNlYW5jZSA9IGNvbXB0ZVJlbmR1U2VhbmNlT3JpZ2luYWwuY29tcHRlUmVuZHVcbiAgICAgICAgICAgICAgd3JpdGVSZW9yZ2FuaXplZEpzb24oXG4gICAgICAgICAgICAgICAgZGF0YXNldFJlb3JnYW5pemVkRGlyLFxuICAgICAgICAgICAgICAgIGNvbXB0ZVJlbmR1U2VhbmNlLFxuICAgICAgICAgICAgICAgIHBhdGhGcm9tQ29tcHRlUmVuZHVVaWQsXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgIH1cblxuICAgICAgY29tbWl0R2l0KGRhdGFzZXRSZW9yZ2FuaXplZERpciwgb3B0aW9ucylcbiAgICB9XG4gIH1cblxuICAvLyBSZXN0b3JlIHN0YW5kYXJkIGNvbnZlcnNpb24gb2YgZGF0ZXMgdG8gSlNPTi5cbiAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZXhpc3RpbmdEYXRlVG9Kc29uXG5cbiAgcmV0dXJuIGV4aXRDb2RlXG59XG5cbmZ1bmN0aW9uIHdyaXRlQW1lbmRlbWVudFJlb3JnYW5pemVkSnNvbihcbiAgZGF0YXNldFJlb3JnYW5pemVkRGlyOiBzdHJpbmcsXG4gIGFtZW5kZW1lbnQ6IHtcbiAgICB1aWQ6IHN0cmluZ1xuICAgIHRleHRlTGVnaXNsYXRpZlJlZjogc3RyaW5nXG4gIH0sXG4pOiB2b2lkIHtcbiAgY29uc3QgdWlkVGV4dGVMZWdpc2xhdGlmID0gYW1lbmRlbWVudC50ZXh0ZUxlZ2lzbGF0aWZSZWZcbiAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKHVpZFRleHRlTGVnaXNsYXRpZiwgdW5kZWZpbmVkKVxuICBjb25zdCB0ZXh0ZUxlZ2lzbGF0aWZEaXIgPSBwYXRoLmpvaW4oXG4gICAgZGF0YXNldFJlb3JnYW5pemVkRGlyLFxuICAgIHVpZFRleHRlTGVnaXNsYXRpZixcbiAgKVxuICBmcy5lbnN1cmVEaXJTeW5jKHRleHRlTGVnaXNsYXRpZkRpcilcbiAgY29uc3QgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGggPSBwYXRoLmpvaW4oXG4gICAgdGV4dGVMZWdpc2xhdGlmRGlyLFxuICAgIGFtZW5kZW1lbnQudWlkICsgXCIuanNvblwiLFxuICApXG4gIGZzLndyaXRlRmlsZVN5bmMoXG4gICAgcmVvcmdhbml6ZWRKc29uRmlsZVBhdGgsXG4gICAgSlNPTi5zdHJpbmdpZnkoYW1lbmRlbWVudCwgbnVsbCwgMiksXG4gICAge1xuICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgIH0sXG4gIClcbn1cblxuZnVuY3Rpb24gd3JpdGVSZW9yZ2FuaXplZEpzb248VCBleHRlbmRzIHsgdWlkOiBzdHJpbmcgfT4oXG4gIGRpcjogc3RyaW5nLFxuICBvYmo6IFQsXG4gIHBhdGhGcm9tVWlkOiAoZGlyOiBzdHJpbmcsIHVpZDogc3RyaW5nKSA9PiBzdHJpbmcsXG4pOiB2b2lkIHtcbiAgY29uc3QgYmFzZW5hbWUgPSBwYXRoRnJvbVVpZChkaXIsIG9iai51aWQpXG4gIGZzLndyaXRlRmlsZVN5bmMoYCR7YmFzZW5hbWV9Lmpzb25gLCBKU09OLnN0cmluZ2lmeShvYmosIG51bGwsIDIpLCB7XG4gICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICB9KVxufVxuXG5mdW5jdGlvbiBtYWluKGFyZ3Y6IGFueSk6IG51bWJlciB7XG4gIGNvbnN0IG9wdGlvbnMgPSBwYXJzZUFyZ3MoYXJndilcbiAgcmV0dXJuIHJlb3JnYW5pemVEYXRhKG9wdGlvbnMpXG59XG5cbi8qIGlzdGFuYnVsIGlnbm9yZSBpZiAqL1xuaWYgKHByb2Nlc3MuYXJndlsxXS5lbmRzV2l0aChcInJlb3JnYW5pemVfZGF0YS50c1wiKSlcbiAgcHJvY2Vzcy5leGl0KG1haW4ocHJvY2Vzcy5hcmd2KSlcbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBTSxNQUFNLFFBQVE7QUFDM0IsU0FBU0MsUUFBUSxRQUFRLGVBQWU7QUFDeEMsT0FBT0MsZUFBZSxNQUFNLG1CQUFtQjtBQUMvQyxPQUFPQyxFQUFFLE1BQU0sVUFBVTtBQUN6QixPQUFPQyxJQUFJLE1BQU0sTUFBTTtBQUFBLFNBRXJCQyxRQUFRLEVBQ1JDLGdCQUFnQixFQUNoQkMsZUFBZSxFQUNmQyxrQkFBa0IsRUFDbEJDLG1CQUFtQjtBQUFBLFNBRVpDLGtCQUFrQixFQUFFQyxpQkFBaUI7QUFBQSxPQUN2QyxLQUFLQyxHQUFHO0FBQUEsU0FDTkMsT0FBTztBQUFBLFNBRWRDLHNCQUFzQixFQUN0QkMsbUJBQW1CLEVBQ25CQywrQkFBK0IsRUFDL0JDLG1CQUFtQixFQUNuQkMsa0JBQWtCLEVBQ2xCQyxrQkFBa0I7QUFBQSxTQUVYQyxPQUFPLElBQUlDLDBCQUEwQjtBQUFBLFNBQ3JDRCxPQUFPLElBQUlFLGlCQUFpQjtBQUFBLFNBQzVCRixPQUFPLElBQUlHLHFCQUFxQjtBQUFBLFNBQ2hDSCxPQUFPLElBQUlJLDZCQUE2QjtBQUFBLFNBQ3hDSixPQUFPLElBQUlLLGtCQUFrQjtBQUFBLFNBQzdCTCxPQUFPLElBQUlNLG1CQUFtQjtBQUFBLFNBQzlCTixPQUFPLElBQUlP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
|