@tricoteuses/assemblee 1.6.1 → 1.7.1
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 +23 -10
- package/lib/cleaners/scrutins.mjs +16 -3
- 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 +15 -14
- package/lib/file_systems.mjs +3 -3
- 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 +586 -1091
- package/lib/loaders.mjs +115 -357
- 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.d.ts +21 -9
- package/lib/raw_types/scrutins.js +46 -20
- package/lib/raw_types/scrutins.mjs +37 -11
- 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.d.ts +13 -4
- package/lib/types/scrutins.js +29 -15
- package/lib/types/scrutins.mjs +20 -6
- package/lib/urls.js +2 -2
- package/lib/urls.mjs +1 -1
- package/package.json +9 -7
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import assert from "assert";
|
|
2
|
-
import { execSync } from "child_process";
|
|
3
2
|
import commandLineArgs from "command-line-args";
|
|
4
3
|
import { createHash } from "crypto";
|
|
5
4
|
import { differenceInDays } from "date-fns";
|
|
@@ -9,78 +8,57 @@ import { walkDocumentAndDivisions } from "../dossiers_legislatifs.mjs";
|
|
|
9
8
|
import * as git from "../git.mjs";
|
|
10
9
|
import { iterLoadAssembleeDocuments, pathFromDocumentUid } from "../loaders.mjs";
|
|
11
10
|
import { DocumentUrlFormat, iterDocumentOrDivisionUrls } from "../urls.mjs";
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
help: "commit documents",
|
|
15
|
-
name: "commit",
|
|
16
|
-
type: Boolean
|
|
17
|
-
}, {
|
|
11
|
+
import { commitOption, dataDirDefaultOption, legislatureOption, pullOption, remoteOption, silentOption, verboseOption } from "./shared/cli_helpers.mjs";
|
|
12
|
+
const optionsDefinitions = [commitOption, legislatureOption, remoteOption, silentOption, verboseOption, dataDirDefaultOption, pullOption, {
|
|
18
13
|
alias: "f",
|
|
19
14
|
help: "retrieve all documents, even already retrieved ones",
|
|
20
15
|
name: "full",
|
|
21
16
|
type: Boolean
|
|
22
|
-
}, {
|
|
23
|
-
alias: "l",
|
|
24
|
-
defaultValue: "16",
|
|
25
|
-
help: 'legislatures to retrieve, "*" for all',
|
|
26
|
-
name: "legislature",
|
|
27
|
-
type: String
|
|
28
17
|
}, {
|
|
29
18
|
alias: "n",
|
|
30
19
|
help: "try to also retrieve documents that were previously not found",
|
|
31
20
|
name: "not-found",
|
|
32
21
|
type: Boolean
|
|
33
|
-
}, {
|
|
34
|
-
alias: "p",
|
|
35
|
-
help: "pull repositories before proceeding",
|
|
36
|
-
name: "pull",
|
|
37
|
-
type: Boolean
|
|
38
|
-
}, {
|
|
39
|
-
alias: "r",
|
|
40
|
-
help: "push commit to given remote",
|
|
41
|
-
multiple: true,
|
|
42
|
-
name: "remote",
|
|
43
|
-
type: String
|
|
44
|
-
}, {
|
|
45
|
-
alias: "s",
|
|
46
|
-
help: "don't log anything",
|
|
47
|
-
name: "silent",
|
|
48
|
-
type: Boolean
|
|
49
22
|
}, {
|
|
50
23
|
alias: "u",
|
|
51
24
|
help: "UID of first Assemblée's document or division to retrieve",
|
|
52
25
|
name: "uid",
|
|
53
26
|
type: String
|
|
54
27
|
}, {
|
|
55
|
-
alias: "
|
|
56
|
-
help: "
|
|
57
|
-
name: "
|
|
58
|
-
type:
|
|
28
|
+
alias: "F",
|
|
29
|
+
help: "format of documents to retrieve",
|
|
30
|
+
name: "format",
|
|
31
|
+
type: String
|
|
59
32
|
}, {
|
|
60
|
-
|
|
61
|
-
help: "
|
|
62
|
-
|
|
33
|
+
alias: "T",
|
|
34
|
+
help: "type of documents to retrieve (for example: PION)",
|
|
35
|
+
multiple: true,
|
|
36
|
+
name: "document-type",
|
|
63
37
|
type: String
|
|
64
38
|
}];
|
|
65
39
|
const options = commandLineArgs(optionsDefinitions);
|
|
66
40
|
const today = new Date();
|
|
41
|
+
async function fetchWithRetry(url, retries = 3, backoff = 300) {
|
|
42
|
+
for (let attempt = 0; attempt < retries; attempt++) {
|
|
43
|
+
try {
|
|
44
|
+
return await fetch(url);
|
|
45
|
+
} catch (error) {
|
|
46
|
+
if (attempt === retries - 1) {
|
|
47
|
+
throw error;
|
|
48
|
+
}
|
|
49
|
+
console.warn(`Fetch attempt ${attempt + 1} for ${url} failed. Retrying in ${backoff}ms...`);
|
|
50
|
+
await new Promise(resolve => setTimeout(resolve, backoff));
|
|
51
|
+
backoff *= 2;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
throw new Error(`Failed to fetch ${url} after ${retries} attempts`);
|
|
55
|
+
}
|
|
67
56
|
async function retrieveDocuments() {
|
|
68
57
|
assert(!options.commit || !options.uid, 'Options "commit" & "uid" are incompatible');
|
|
69
58
|
const dataDir = options.dataDir;
|
|
70
59
|
const documentsDir = path.join(dataDir, "Documents");
|
|
71
60
|
if (options.pull) {
|
|
72
|
-
|
|
73
|
-
cwd: documentsDir,
|
|
74
|
-
env: process.env,
|
|
75
|
-
encoding: "utf-8",
|
|
76
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
77
|
-
});
|
|
78
|
-
execSync(`git pull --rebase`, {
|
|
79
|
-
cwd: documentsDir,
|
|
80
|
-
env: process.env,
|
|
81
|
-
encoding: "utf-8",
|
|
82
|
-
stdio: ["ignore", "ignore", "pipe"]
|
|
83
|
-
});
|
|
61
|
+
git.resetAndPull(documentsDir);
|
|
84
62
|
}
|
|
85
63
|
fs.ensureDirSync(documentsDir);
|
|
86
64
|
if (options.full && !options.uid) {
|
|
@@ -108,95 +86,105 @@ async function retrieveDocuments() {
|
|
|
108
86
|
continue;
|
|
109
87
|
}
|
|
110
88
|
}
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
89
|
+
await processDocumentOrDivision(documentOrDivision, documentsDir, options);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
if (options.commit) {
|
|
93
|
+
return git.commitAndPush(documentsDir, "Nouvelle moisson", options.remote);
|
|
94
|
+
}
|
|
95
|
+
return 0;
|
|
96
|
+
}
|
|
97
|
+
async function processDocumentOrDivision(documentOrDivision, documentsDir, options) {
|
|
98
|
+
const documentDir = pathFromDocumentUid(documentsDir, documentOrDivision.uid);
|
|
99
|
+
fs.ensureDirSync(documentDir);
|
|
100
|
+
const filenameBySha256 = {};
|
|
101
|
+
const indexPath = path.join(documentDir, "index.json");
|
|
102
|
+
const index = fs.pathExistsSync(indexPath) ? fs.readJsonSync(indexPath) : {};
|
|
103
|
+
for (const {
|
|
104
|
+
format,
|
|
105
|
+
type,
|
|
106
|
+
url
|
|
107
|
+
} of iterDocumentOrDivisionUrls(documentOrDivision)) {
|
|
108
|
+
const filename = `${type}.${format === DocumentUrlFormat.Pdf ? "pdf" : "html"}`;
|
|
109
|
+
|
|
110
|
+
// Filter by format if option is passed
|
|
111
|
+
if (options.format && options.format !== format) {
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Filter by document type if option is passed
|
|
116
|
+
const documentType = documentOrDivision.classification?.type?.code;
|
|
117
|
+
if (options["document-type"] !== undefined && !options["document-type"].includes(documentType)) {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
let formatFilesInfos = index[format] ?? (index[format] = []);
|
|
121
|
+
let fileInfos = formatFilesInfos.find(file => file.url === url) ?? {};
|
|
122
|
+
if (!formatFilesInfos.includes(fileInfos)) {
|
|
123
|
+
formatFilesInfos.push(fileInfos);
|
|
124
|
+
}
|
|
125
|
+
fileInfos.url = url;
|
|
126
|
+
if (fileInfos.status === 200 && !options.full) {
|
|
127
|
+
filenameBySha256[fileInfos.sha256] = filename;
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (fileInfos.status === 404 && !options["not-found"] && differenceInDays(today, documentOrDivision.cycleDeVie.chrono.dateCreation ?? documentOrDivision.cycleDeVie.chrono.dateDepot) > 10) {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (!options.silent) {
|
|
134
|
+
console.log(`Retrieving document or division ${documentOrDivision.uid} at ${url}…`);
|
|
135
|
+
}
|
|
136
|
+
const response = await fetchWithRetry(url);
|
|
137
|
+
const filePath = path.join(documentDir, filename);
|
|
138
|
+
if (response.ok) {
|
|
139
|
+
const arrayBuffer = await response.arrayBuffer();
|
|
140
|
+
const buffer = Buffer.from(arrayBuffer);
|
|
141
|
+
if (format === DocumentUrlFormat.Pdf && !buffer.subarray(0, 4).toString().startsWith("%PDF")) {
|
|
142
|
+
// Instead of a PDF, the received data may be an HTML page with a message like
|
|
143
|
+
// "Document non encore publié".
|
|
139
144
|
if (!options.silent) {
|
|
140
|
-
console.
|
|
145
|
+
console.warn(` PDF "${url}" not found.`);
|
|
141
146
|
}
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
fs.removeSync(filePath);
|
|
154
|
-
delete fileInfos.filename;
|
|
155
|
-
delete fileInfos.sha256;
|
|
156
|
-
fileInfos.status = 404;
|
|
157
|
-
} else {
|
|
158
|
-
const sha256 = createHash("sha256").update(buffer).digest("hex");
|
|
159
|
-
const existingFilename = filenameBySha256[sha256];
|
|
160
|
-
if (existingFilename === undefined) {
|
|
161
|
-
fs.createWriteStream(filePath).write(buffer);
|
|
162
|
-
fileInfos.filename = filename;
|
|
163
|
-
filenameBySha256[sha256] = filename;
|
|
164
|
-
} else {
|
|
165
|
-
fileInfos.filename = existingFilename;
|
|
166
|
-
}
|
|
167
|
-
fileInfos.sha256 = sha256;
|
|
168
|
-
fileInfos.status = response.status;
|
|
169
|
-
}
|
|
147
|
+
fs.removeSync(filePath);
|
|
148
|
+
delete fileInfos.filename;
|
|
149
|
+
delete fileInfos.sha256;
|
|
150
|
+
fileInfos.status = 404;
|
|
151
|
+
} else {
|
|
152
|
+
const sha256 = createHash("sha256").update(buffer).digest("hex");
|
|
153
|
+
const existingFilename = filenameBySha256[sha256];
|
|
154
|
+
if (existingFilename === undefined) {
|
|
155
|
+
fs.createWriteStream(filePath).write(buffer);
|
|
156
|
+
fileInfos.filename = filename;
|
|
157
|
+
filenameBySha256[sha256] = filename;
|
|
170
158
|
} else {
|
|
171
|
-
|
|
172
|
-
if (!options.silent) {
|
|
173
|
-
console.warn(` Page "${url}" not found.`);
|
|
174
|
-
}
|
|
175
|
-
} else {
|
|
176
|
-
console.error(` Error:\n${JSON.stringify({
|
|
177
|
-
code: response.status,
|
|
178
|
-
message: response.statusText
|
|
179
|
-
}, null, 2)}`);
|
|
180
|
-
}
|
|
181
|
-
fs.removeSync(filePath);
|
|
182
|
-
delete fileInfos.filename;
|
|
183
|
-
delete fileInfos.sha256;
|
|
184
|
-
fileInfos.status = response.status;
|
|
159
|
+
fileInfos.filename = existingFilename;
|
|
185
160
|
}
|
|
161
|
+
fileInfos.sha256 = sha256;
|
|
162
|
+
fileInfos.status = response.status;
|
|
186
163
|
}
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
164
|
+
} else {
|
|
165
|
+
if (response.status === 404) {
|
|
166
|
+
if (!options.silent) {
|
|
167
|
+
console.warn(` Page "${url}" not found.`);
|
|
168
|
+
}
|
|
169
|
+
} else {
|
|
170
|
+
console.error(` Error:\n${JSON.stringify({
|
|
171
|
+
code: response.status,
|
|
172
|
+
message: response.statusText
|
|
173
|
+
}, null, 2)}`);
|
|
174
|
+
}
|
|
175
|
+
fs.removeSync(filePath);
|
|
176
|
+
delete fileInfos.filename;
|
|
177
|
+
delete fileInfos.sha256;
|
|
178
|
+
fileInfos.status = response.status;
|
|
191
179
|
}
|
|
192
180
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
181
|
+
fs.writeJsonSync(indexPath, index, {
|
|
182
|
+
encoding: "utf-8",
|
|
183
|
+
spaces: 2
|
|
184
|
+
});
|
|
197
185
|
}
|
|
198
186
|
retrieveDocuments().then(exitCode => process.exit(exitCode)).catch(error => {
|
|
199
187
|
console.log(error);
|
|
200
188
|
process.exit(1);
|
|
201
189
|
});
|
|
202
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJleGVjU3luYyIsImNvbW1hbmRMaW5lQXJncyIsImNyZWF0ZUhhc2giLCJkaWZmZXJlbmNlSW5EYXlzIiwiZnMiLCJwYXRoIiwid2Fsa0RvY3VtZW50QW5kRGl2aXNpb25zIiwiZ2l0IiwiaXRlckxvYWRBc3NlbWJsZWVEb2N1bWVudHMiLCJwYXRoRnJvbURvY3VtZW50VWlkIiwiRG9jdW1lbnRVcmxGb3JtYXQiLCJpdGVyRG9jdW1lbnRPckRpdmlzaW9uVXJscyIsIm9wdGlvbnNEZWZpbml0aW9ucyIsImFsaWFzIiwiaGVscCIsIm5hbWUiLCJ0eXBlIiwiQm9vbGVhbiIsImRlZmF1bHRWYWx1ZSIsIlN0cmluZyIsIm11bHRpcGxlIiwiZGVmYXVsdE9wdGlvbiIsIm9wdGlvbnMiLCJ0b2RheSIsIkRhdGUiLCJyZXRyaWV2ZURvY3VtZW50cyIsImNvbW1pdCIsInVpZCIsImRhdGFEaXIiLCJkb2N1bWVudHNEaXIiLCJqb2luIiwicHVsbCIsImN3ZCIsImVudiIsInByb2Nlc3MiLCJlbmNvZGluZyIsInN0ZGlvIiwiZW5zdXJlRGlyU3luYyIsImZ1bGwiLCJmaWxlbmFtZSIsInJlYWRkaXJTeW5jIiwicmVtb3ZlU3luYyIsImZpcnN0VWlkIiwic2tpcCIsImRvY3VtZW50IiwibGVnaXNsYXR1cmUiLCJkb2N1bWVudE9yRGl2aXNpb24iLCJzdWJzdHJpbmciLCJkb2N1bWVudERpciIsImZpbGVuYW1lQnlTaGEyNTYiLCJpbmRleFBhdGgiLCJpbmRleCIsInBhdGhFeGlzdHNTeW5jIiwicmVhZEpzb25TeW5jIiwiZm9ybWF0IiwidXJsIiwiZm9ybWF0RmlsZXNJbmZvcyIsInVuZGVmaW5lZCIsImZpbGVJbmZvcyIsImZpbmQiLCJwdXNoIiwiUGRmIiwic3RhdHVzIiwic2hhMjU2IiwiY3ljbGVEZVZpZSIsImNocm9ubyIsImRhdGVDcmVhdGlvbiIsImRhdGVEZXBvdCIsInNpbGVudCIsImNvbnNvbGUiLCJsb2ciLCJyZXNwb25zZSIsImZldGNoIiwiZmlsZVBhdGgiLCJvayIsImFycmF5QnVmZmVyIiwiYnVmZmVyIiwiQnVmZmVyIiwiZnJvbSIsInN1YmFycmF5IiwidG9TdHJpbmciLCJzdGFydHNXaXRoIiwid2FybiIsInVwZGF0ZSIsImRpZ2VzdCIsImV4aXN0aW5nRmlsZW5hbWUiLCJjcmVhdGVXcml0ZVN0cmVhbSIsIndyaXRlIiwiZXJyb3IiLCJKU09OIiwic3RyaW5naWZ5IiwiY29kZSIsIm1lc3NhZ2UiLCJzdGF0dXNUZXh0Iiwid3JpdGVKc29uU3luYyIsInNwYWNlcyIsImNvbW1pdEFuZFB1c2giLCJyZW1vdGUiLCJ0aGVuIiwiZXhpdENvZGUiLCJleGl0IiwiY2F0Y2giXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9yZXRyaWV2ZV9kb2N1bWVudHMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGFzc2VydCBmcm9tIFwiYXNzZXJ0XCJcbmltcG9ydCB7IGV4ZWNTeW5jIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIlxuaW1wb3J0IGNvbW1hbmRMaW5lQXJncyBmcm9tIFwiY29tbWFuZC1saW5lLWFyZ3NcIlxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IHsgZGlmZmVyZW5jZUluRGF5cyB9IGZyb20gXCJkYXRlLWZuc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuaW1wb3J0IHtcbiAgRG9jdW1lbnRGaWxlSW5mb3MsXG4gIERvY3VtZW50RmlsZXNJbmRleCxcbiAgd2Fsa0RvY3VtZW50QW5kRGl2aXNpb25zLFxufSBmcm9tIFwiLi4vZG9zc2llcnNfbGVnaXNsYXRpZnNcIlxuaW1wb3J0ICogYXMgZ2l0IGZyb20gXCIuLi9naXRcIlxuaW1wb3J0IHsgaXRlckxvYWRBc3NlbWJsZWVEb2N1bWVudHMsIHBhdGhGcm9tRG9jdW1lbnRVaWQgfSBmcm9tIFwiLi4vbG9hZGVyc1wiXG5pbXBvcnQgeyBEb2N1bWVudFVybEZvcm1hdCwgaXRlckRvY3VtZW50T3JEaXZpc2lvblVybHMgfSBmcm9tIFwiLi4vdXJsc1wiXG5cbmNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAge1xuICAgIGFsaWFzOiBcImNcIixcbiAgICBoZWxwOiBcImNvbW1pdCBkb2N1bWVudHNcIixcbiAgICBuYW1lOiBcImNvbW1pdFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJmXCIsXG4gICAgaGVscDogXCJyZXRyaWV2ZSBhbGwgZG9jdW1lbnRzLCBldmVuIGFscmVhZHkgcmV0cmlldmVkIG9uZXNcIixcbiAgICBuYW1lOiBcImZ1bGxcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwibFwiLFxuICAgIGRlZmF1bHRWYWx1ZTogXCIxNlwiLFxuICAgIGhlbHA6ICdsZWdpc2xhdHVyZXMgdG8gcmV0cmlldmUsIFwiKlwiIGZvciBhbGwnLFxuICAgIG5hbWU6IFwibGVnaXNsYXR1cmVcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJuXCIsXG4gICAgaGVscDogXCJ0cnkgdG8gYWxzbyByZXRyaWV2ZSBkb2N1bWVudHMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgbm90IGZvdW5kXCIsXG4gICAgbmFtZTogXCJub3QtZm91bmRcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwicFwiLFxuICAgIGhlbHA6IFwicHVsbCByZXBvc2l0b3JpZXMgYmVmb3JlIHByb2NlZWRpbmdcIixcbiAgICBuYW1lOiBcInB1bGxcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgYWxpYXM6IFwiclwiLFxuICAgIGhlbHA6IFwicHVzaCBjb21taXQgdG8gZ2l2ZW4gcmVtb3RlXCIsXG4gICAgbXVsdGlwbGU6IHRydWUsXG4gICAgbmFtZTogXCJyZW1vdGVcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJzXCIsXG4gICAgaGVscDogXCJkb24ndCBsb2cgYW55dGhpbmdcIixcbiAgICBuYW1lOiBcInNpbGVudFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJ1XCIsXG4gICAgaGVscDogXCJVSUQgb2YgZmlyc3QgQXNzZW1ibMOpZSdzIGRvY3VtZW50IG9yIGRpdmlzaW9uIHRvIHJldHJpZXZlXCIsXG4gICAgbmFtZTogXCJ1aWRcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJ2XCIsXG4gICAgaGVscDogXCJ2ZXJib3NlIGxvZ3NcIixcbiAgICBuYW1lOiBcInZlcmJvc2VcIixcbiAgICB0eXBlOiBCb29sZWFuLFxuICB9LFxuICB7XG4gICAgZGVmYXVsdE9wdGlvbjogdHJ1ZSxcbiAgICBoZWxwOiBcImRpcmVjdG9yeSBjb250YWluaW5nIEFzc2VtYmzDqWUgb3BlbiBkYXRhIGZpbGVzXCIsXG4gICAgbmFtZTogXCJkYXRhRGlyXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuXVxuY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMpXG5cbmNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKVxuXG5hc3luYyBmdW5jdGlvbiByZXRyaWV2ZURvY3VtZW50cygpOiBQcm9taXNlPG51bWJlcj4ge1xuICBhc3NlcnQoXG4gICAgIW9wdGlvbnMuY29tbWl0IHx8ICFvcHRpb25zLnVpZCxcbiAgICAnT3B0aW9ucyBcImNvbW1pdFwiICYgXCJ1aWRcIiBhcmUgaW5jb21wYXRpYmxlJyxcbiAgKVxuXG4gIGNvbnN0IGRhdGFEaXIgPSBvcHRpb25zLmRhdGFEaXJcbiAgY29uc3QgZG9jdW1lbnRzRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIFwiRG9jdW1lbnRzXCIpXG4gIGlmIChvcHRpb25zLnB1bGwpIHtcbiAgICBleGVjU3luYyhgZ2l0IHJlc2V0IC0taGFyZCBvcmlnaW4vbWFzdGVyYCwge1xuICAgICAgY3dkOiBkb2N1bWVudHNEaXIsXG4gICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgIH0pXG4gICAgZXhlY1N5bmMoYGdpdCBwdWxsIC0tcmViYXNlYCwge1xuICAgICAgY3dkOiBkb2N1bWVudHNEaXIsXG4gICAgICBlbnY6IHByb2Nlc3MuZW52LFxuICAgICAgZW5jb2Rpbmc6IFwidXRmLThcIixcbiAgICAgIHN0ZGlvOiBbXCJpZ25vcmVcIiwgXCJpZ25vcmVcIiwgXCJwaXBlXCJdLFxuICAgIH0pXG4gIH1cblxuICBmcy5lbnN1cmVEaXJTeW5jKGRvY3VtZW50c0RpcilcbiAgaWYgKG9wdGlvbnMuZnVsbCAmJiAhb3B0aW9ucy51aWQpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRvY3VtZW50c0RpcikpIHtcbiAgICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRvY3VtZW50c0RpciwgZmlsZW5hbWUpKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZpcnN0VWlkID0gb3B0aW9ucy51aWRcbiAgbGV0IHNraXAgPSBCb29sZWFuKGZpcnN0VWlkKVxuICBmb3IgKGNvbnN0IHsgZG9jdW1lbnQgfSBvZiBpdGVyTG9hZEFzc2VtYmxlZURvY3VtZW50cyhcbiAgICBkYXRhRGlyLFxuICAgIG9wdGlvbnMubGVnaXNsYXR1cmUsXG4gICkpIHtcbiAgICBmb3IgKGNvbnN0IGRvY3VtZW50T3JEaXZpc2lvbiBvZiB3YWxrRG9jdW1lbnRBbmREaXZpc2lvbnMoZG9jdW1lbnQpKSB7XG4gICAgICAvLyBJZ25vcmUgZG9jdW1lbnRzIGZyb20gU8OpbmF0LlxuICAgICAgaWYgKGRvY3VtZW50T3JEaXZpc2lvbi51aWQuc3Vic3RyaW5nKDQsIDYpID09PSBcIlNOXCIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHNraXApIHtcbiAgICAgICAgaWYgKGRvY3VtZW50T3JEaXZpc2lvbi51aWQgPT09IGZpcnN0VWlkKSB7XG4gICAgICAgICAgc2tpcCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBkb2N1bWVudERpciA9IHBhdGhGcm9tRG9jdW1lbnRVaWQoXG4gICAgICAgIGRvY3VtZW50c0RpcixcbiAgICAgICAgZG9jdW1lbnRPckRpdmlzaW9uLnVpZCxcbiAgICAgIClcbiAgICAgIGZzLmVuc3VyZURpclN5bmMoZG9jdW1lbnREaXIpXG5cbiAgICAgIGNvbnN0IGZpbGVuYW1lQnlTaGEyNTY6IHsgW2RpZ2VzdDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fVxuICAgICAgY29uc3QgaW5kZXhQYXRoID0gcGF0aC5qb2luKGRvY3VtZW50RGlyLCBcImluZGV4Lmpzb25cIilcbiAgICAgIGNvbnN0IGluZGV4ID0gKFxuICAgICAgICBmcy5wYXRoRXhpc3RzU3luYyhpbmRleFBhdGgpID8gZnMucmVhZEpzb25TeW5jKGluZGV4UGF0aCkgOiB7fVxuICAgICAgKSBhcyBEb2N1bWVudEZpbGVzSW5kZXhcbiAgICAgIGZvciAoY29uc3QgeyBmb3JtYXQsIHR5cGUsIHVybCB9IG9mIGl0ZXJEb2N1bWVudE9yRGl2aXNpb25VcmxzKFxuICAgICAgICBkb2N1bWVudE9yRGl2aXNpb24sXG4gICAgICApKSB7XG4gICAgICAgIGxldCBmb3JtYXRGaWxlc0luZm9zID0gaW5kZXhbZm9ybWF0XVxuICAgICAgICBpZiAoZm9ybWF0RmlsZXNJbmZvcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZm9ybWF0RmlsZXNJbmZvcyA9IGluZGV4W2Zvcm1hdF0gPSBbXVxuICAgICAgICB9XG4gICAgICAgIGxldCBmaWxlSW5mb3MgPSBmb3JtYXRGaWxlc0luZm9zLmZpbmQoXG4gICAgICAgICAgKGZpbGVJbmZvcykgPT4gZmlsZUluZm9zLnVybCA9PT0gdXJsLFxuICAgICAgICApXG4gICAgICAgIGlmIChmaWxlSW5mb3MgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGZpbGVJbmZvcyA9IHt9IGFzIERvY3VtZW50RmlsZUluZm9zXG4gICAgICAgICAgZm9ybWF0RmlsZXNJbmZvcy5wdXNoKGZpbGVJbmZvcylcbiAgICAgICAgfVxuICAgICAgICBmaWxlSW5mb3MudXJsID0gdXJsXG5cbiAgICAgICAgY29uc3QgZmlsZW5hbWUgPSBgJHt0eXBlfS4ke1xuICAgICAgICAgIGZvcm1hdCA9PT0gRG9jdW1lbnRVcmxGb3JtYXQuUGRmID8gXCJwZGZcIiA6IFwiaHRtbFwiXG4gICAgICAgIH1gXG4gICAgICAgIGlmIChmaWxlSW5mb3Muc3RhdHVzID09PSAyMDAgJiYgIW9wdGlvbnMuZnVsbCkge1xuICAgICAgICAgIGZpbGVuYW1lQnlTaGEyNTZbZmlsZUluZm9zLnNoYTI1NiBhcyBzdHJpbmddID0gZmlsZW5hbWVcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBmaWxlSW5mb3Muc3RhdHVzID09PSA0MDQgJiZcbiAgICAgICAgICAhb3B0aW9uc1tcIm5vdC1mb3VuZFwiXSAmJlxuICAgICAgICAgIGRpZmZlcmVuY2VJbkRheXMoXG4gICAgICAgICAgICB0b2RheSxcbiAgICAgICAgICAgIGRvY3VtZW50T3JEaXZpc2lvbi5jeWNsZURlVmllLmNocm9uby5kYXRlQ3JlYXRpb24gPz9cbiAgICAgICAgICAgICAgKGRvY3VtZW50T3JEaXZpc2lvbi5jeWNsZURlVmllLmNocm9uby5kYXRlRGVwb3QgYXMgRGF0ZSB8IHN0cmluZyksXG4gICAgICAgICAgKSA+IDEwXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICBgUmV0cmlldmluZyBkb2N1bWVudCBvciBkaXZpc2lvbiAke2RvY3VtZW50T3JEaXZpc2lvbi51aWR9IGF0ICR7dXJsfeKApmAsXG4gICAgICAgICAgKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwpXG4gICAgICAgIGNvbnN0IGZpbGVQYXRoID0gcGF0aC5qb2luKGRvY3VtZW50RGlyLCBmaWxlbmFtZSlcbiAgICAgICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICAgICAgY29uc3QgYXJyYXlCdWZmZXIgPSBhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpXG4gICAgICAgICAgY29uc3QgYnVmZmVyID0gQnVmZmVyLmZyb20oYXJyYXlCdWZmZXIpXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgZm9ybWF0ID09PSBEb2N1bWVudFVybEZvcm1hdC5QZGYgJiZcbiAgICAgICAgICAgICFidWZmZXIuc3ViYXJyYXkoMCwgNCkudG9TdHJpbmcoKS5zdGFydHNXaXRoKFwiJVBERlwiKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBhIFBERiwgdGhlIHJlY2VpdmVkIGRhdGEgbWF5IGJlIGFuIEhUTUwgcGFnZSB3aXRoIGEgbWVzc2FnZSBsaWtlXG4gICAgICAgICAgICAvLyBcIkRvY3VtZW50IG5vbiBlbmNvcmUgcHVibGnDqVwiLlxuICAgICAgICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYCAgUERGIFwiJHt1cmx9XCIgbm90IGZvdW5kLmApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmcy5yZW1vdmVTeW5jKGZpbGVQYXRoKVxuICAgICAgICAgICAgZGVsZXRlIGZpbGVJbmZvcy5maWxlbmFtZVxuICAgICAgICAgICAgZGVsZXRlIGZpbGVJbmZvcy5zaGEyNTZcbiAgICAgICAgICAgIGZpbGVJbmZvcy5zdGF0dXMgPSA0MDRcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qgc2hhMjU2ID0gY3JlYXRlSGFzaChcInNoYTI1NlwiKS51cGRhdGUoYnVmZmVyKS5kaWdlc3QoXCJoZXhcIilcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nRmlsZW5hbWUgPSBmaWxlbmFtZUJ5U2hhMjU2W3NoYTI1Nl1cbiAgICAgICAgICAgIGlmIChleGlzdGluZ0ZpbGVuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgZnMuY3JlYXRlV3JpdGVTdHJlYW0oZmlsZVBhdGgpLndyaXRlKGJ1ZmZlcilcbiAgICAgICAgICAgICAgZmlsZUluZm9zLmZpbGVuYW1lID0gZmlsZW5hbWVcbiAgICAgICAgICAgICAgZmlsZW5hbWVCeVNoYTI1NltzaGEyNTZdID0gZmlsZW5hbWVcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGZpbGVJbmZvcy5maWxlbmFtZSA9IGV4aXN0aW5nRmlsZW5hbWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbGVJbmZvcy5zaGEyNTYgPSBzaGEyNTZcbiAgICAgICAgICAgIGZpbGVJbmZvcy5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXNcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgICAgICBpZiAoIW9wdGlvbnMuc2lsZW50KSB7XG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihgICBQYWdlIFwiJHt1cmx9XCIgbm90IGZvdW5kLmApXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGAgIEVycm9yOlxcbiR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgeyBjb2RlOiByZXNwb25zZS5zdGF0dXMsIG1lc3NhZ2U6IHJlc3BvbnNlLnN0YXR1c1RleHQgfSxcbiAgICAgICAgICAgICAgICBudWxsLFxuICAgICAgICAgICAgICAgIDIsXG4gICAgICAgICAgICAgICl9YCxcbiAgICAgICAgICAgIClcbiAgICAgICAgICB9XG4gICAgICAgICAgZnMucmVtb3ZlU3luYyhmaWxlUGF0aClcbiAgICAgICAgICBkZWxldGUgZmlsZUluZm9zLmZpbGVuYW1lXG4gICAgICAgICAgZGVsZXRlIGZpbGVJbmZvcy5zaGEyNTZcbiAgICAgICAgICBmaWxlSW5mb3Muc3RhdHVzID0gcmVzcG9uc2Uuc3RhdHVzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZzLndyaXRlSnNvblN5bmMoaW5kZXhQYXRoLCBpbmRleCwgeyBlbmNvZGluZzogXCJ1dGYtOFwiLCBzcGFjZXM6IDIgfSlcbiAgICB9XG4gIH1cblxuICBpZiAob3B0aW9ucy5jb21taXQpIHtcbiAgICByZXR1cm4gZ2l0LmNvbW1pdEFuZFB1c2goZG9jdW1lbnRzRGlyLCBcIk5vdXZlbGxlIG1vaXNzb25cIiwgb3B0aW9ucy5yZW1vdGUpXG4gIH1cbiAgcmV0dXJuIDBcbn1cblxucmV0cmlldmVEb2N1bWVudHMoKVxuICAudGhlbigoZXhpdENvZGUpID0+IHByb2Nlc3MuZXhpdChleGl0Q29kZSkpXG4gIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgICBwcm9jZXNzLmV4aXQoMSlcbiAgfSlcbiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsTUFBTSxNQUFNLFFBQVE7QUFDM0IsU0FBU0MsUUFBUSxRQUFRLGVBQWU7QUFDeEMsT0FBT0MsZUFBZSxNQUFNLG1CQUFtQjtBQUMvQyxTQUFTQyxVQUFVLFFBQVEsUUFBUTtBQUNuQyxTQUFTQyxnQkFBZ0IsUUFBUSxVQUFVO0FBQzNDLE9BQU9DLEVBQUUsTUFBTSxVQUFVO0FBQ3pCLE9BQU9DLElBQUksTUFBTSxN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
|
|
190
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJjb21tYW5kTGluZUFyZ3MiLCJjcmVhdGVIYXNoIiwiZGlmZmVyZW5jZUluRGF5cyIsImZzIiwicGF0aCIsIndhbGtEb2N1bWVudEFuZERpdmlzaW9ucyIsImdpdCIsIml0ZXJMb2FkQXNzZW1ibGVlRG9jdW1lbnRzIiwicGF0aEZyb21Eb2N1bWVudFVpZCIsIkRvY3VtZW50VXJsRm9ybWF0IiwiaXRlckRvY3VtZW50T3JEaXZpc2lvblVybHMiLCJjb21taXRPcHRpb24iLCJkYXRhRGlyRGVmYXVsdE9wdGlvbiIsImxlZ2lzbGF0dXJlT3B0aW9uIiwicHVsbE9wdGlvbiIsInJlbW90ZU9wdGlvbiIsInNpbGVudE9wdGlvbiIsInZlcmJvc2VPcHRpb24iLCJvcHRpb25zRGVmaW5pdGlvbnMiLCJhbGlhcyIsImhlbHAiLCJuYW1lIiwidHlwZSIsIkJvb2xlYW4iLCJTdHJpbmciLCJtdWx0aXBsZSIsIm9wdGlvbnMiLCJ0b2RheSIsIkRhdGUiLCJmZXRjaFdpdGhSZXRyeSIsInVybCIsInJldHJpZXMiLCJiYWNrb2ZmIiwiYXR0ZW1wdCIsImZldGNoIiwiZXJyb3IiLCJjb25zb2xlIiwid2FybiIsIlByb21pc2UiLCJyZXNvbHZlIiwic2V0VGltZW91dCIsIkVycm9yIiwicmV0cmlldmVEb2N1bWVudHMiLCJjb21taXQiLCJ1aWQiLCJkYXRhRGlyIiwiZG9jdW1lbnRzRGlyIiwiam9pbiIsInB1bGwiLCJyZXNldEFuZFB1bGwiLCJlbnN1cmVEaXJTeW5jIiwiZnVsbCIsImZpbGVuYW1lIiwicmVhZGRpclN5bmMiLCJyZW1vdmVTeW5jIiwiZmlyc3RVaWQiLCJza2lwIiwiZG9jdW1lbnQiLCJsZWdpc2xhdHVyZSIsImRvY3VtZW50T3JEaXZpc2lvbiIsInN1YnN0cmluZyIsInByb2Nlc3NEb2N1bWVudE9yRGl2aXNpb24iLCJjb21taXRBbmRQdXNoIiwicmVtb3RlIiwiZG9jdW1lbnREaXIiLCJmaWxlbmFtZUJ5U2hhMjU2IiwiaW5kZXhQYXRoIiwiaW5kZXgiLCJwYXRoRXhpc3RzU3luYyIsInJlYWRKc29uU3luYyIsImZvcm1hdCIsIlBkZiIsImRvY3VtZW50VHlwZSIsImNsYXNzaWZpY2F0aW9uIiwiY29kZSIsInVuZGVmaW5lZCIsImluY2x1ZGVzIiwiZm9ybWF0RmlsZXNJbmZvcyIsImZpbGVJbmZvcyIsImZpbmQiLCJmaWxlIiwicHVzaCIsInN0YXR1cyIsInNoYTI1NiIsImN5Y2xlRGVWaWUiLCJjaHJvbm8iLCJkYXRlQ3JlYXRpb24iLCJkYXRlRGVwb3QiLCJzaWxlbnQiLCJsb2ciLCJyZXNwb25zZSIsImZpbGVQYXRoIiwib2siLCJhcnJheUJ1ZmZlciIsImJ1ZmZlciIsIkJ1ZmZlciIsImZyb20iLCJzdWJhcnJheSIsInRvU3RyaW5nIiwic3RhcnRzV2l0aCIsInVwZGF0ZSIsImRpZ2VzdCIsImV4aXN0aW5nRmlsZW5hbWUiLCJjcmVhdGVXcml0ZVN0cmVhbSIsIndyaXRlIiwiSlNPTiIsInN0cmluZ2lmeSIsIm1lc3NhZ2UiLCJzdGF0dXNUZXh0Iiwid3JpdGVKc29uU3luYyIsImVuY29kaW5nIiwic3BhY2VzIiwidGhlbiIsImV4aXRDb2RlIiwicHJvY2VzcyIsImV4aXQiLCJjYXRjaCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL3JldHJpZXZlX2RvY3VtZW50cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IGNvbW1hbmRMaW5lQXJncyBmcm9tIFwiY29tbWFuZC1saW5lLWFyZ3NcIlxuaW1wb3J0IHsgY3JlYXRlSGFzaCB9IGZyb20gXCJjcnlwdG9cIlxuaW1wb3J0IHsgZGlmZmVyZW5jZUluRGF5cyB9IGZyb20gXCJkYXRlLWZuc1wiXG5pbXBvcnQgZnMgZnJvbSBcImZzLWV4dHJhXCJcbmltcG9ydCBwYXRoIGZyb20gXCJwYXRoXCJcblxuaW1wb3J0IHtcbiAgRG9jdW1lbnRGaWxlSW5mb3MsXG4gIERvY3VtZW50RmlsZXNJbmRleCxcbiAgd2Fsa0RvY3VtZW50QW5kRGl2aXNpb25zLFxufSBmcm9tIFwiLi4vZG9zc2llcnNfbGVnaXNsYXRpZnNcIlxuaW1wb3J0ICogYXMgZ2l0IGZyb20gXCIuLi9naXRcIlxuaW1wb3J0IHsgaXRlckxvYWRBc3NlbWJsZWVEb2N1bWVudHMsIHBhdGhGcm9tRG9jdW1lbnRVaWQgfSBmcm9tIFwiLi4vbG9hZGVyc1wiXG5pbXBvcnQgeyBEb2N1bWVudFVybEZvcm1hdCwgaXRlckRvY3VtZW50T3JEaXZpc2lvblVybHMgfSBmcm9tIFwiLi4vdXJsc1wiXG5pbXBvcnQge1xuICBjb21taXRPcHRpb24sXG4gIGRhdGFEaXJEZWZhdWx0T3B0aW9uLFxuICBsZWdpc2xhdHVyZU9wdGlvbixcbiAgcHVsbE9wdGlvbixcbiAgcmVtb3RlT3B0aW9uLFxuICBzaWxlbnRPcHRpb24sXG4gIHZlcmJvc2VPcHRpb24sXG59IGZyb20gXCIuL3NoYXJlZC9jbGlfaGVscGVyc1wiXG5cbmNvbnN0IG9wdGlvbnNEZWZpbml0aW9ucyA9IFtcbiAgY29tbWl0T3B0aW9uLFxuICBsZWdpc2xhdHVyZU9wdGlvbixcbiAgcmVtb3RlT3B0aW9uLFxuICBzaWxlbnRPcHRpb24sXG4gIHZlcmJvc2VPcHRpb24sXG4gIGRhdGFEaXJEZWZhdWx0T3B0aW9uLFxuICBwdWxsT3B0aW9uLFxuICB7XG4gICAgYWxpYXM6IFwiZlwiLFxuICAgIGhlbHA6IFwicmV0cmlldmUgYWxsIGRvY3VtZW50cywgZXZlbiBhbHJlYWR5IHJldHJpZXZlZCBvbmVzXCIsXG4gICAgbmFtZTogXCJmdWxsXCIsXG4gICAgdHlwZTogQm9vbGVhbixcbiAgfSxcbiAge1xuICAgIGFsaWFzOiBcIm5cIixcbiAgICBoZWxwOiBcInRyeSB0byBhbHNvIHJldHJpZXZlIGRvY3VtZW50cyB0aGF0IHdlcmUgcHJldmlvdXNseSBub3QgZm91bmRcIixcbiAgICBuYW1lOiBcIm5vdC1mb3VuZFwiLFxuICAgIHR5cGU6IEJvb2xlYW4sXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJ1XCIsXG4gICAgaGVscDogXCJVSUQgb2YgZmlyc3QgQXNzZW1ibMOpZSdzIGRvY3VtZW50IG9yIGRpdmlzaW9uIHRvIHJldHJpZXZlXCIsXG4gICAgbmFtZTogXCJ1aWRcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJGXCIsXG4gICAgaGVscDogXCJmb3JtYXQgb2YgZG9jdW1lbnRzIHRvIHJldHJpZXZlXCIsXG4gICAgbmFtZTogXCJmb3JtYXRcIixcbiAgICB0eXBlOiBTdHJpbmcsXG4gIH0sXG4gIHtcbiAgICBhbGlhczogXCJUXCIsXG4gICAgaGVscDogXCJ0eXBlIG9mIGRvY3VtZW50cyB0byByZXRyaWV2ZSAoZm9yIGV4YW1wbGU6IFBJT04pXCIsXG4gICAgbXVsdGlwbGU6IHRydWUsXG4gICAgbmFtZTogXCJkb2N1bWVudC10eXBlXCIsXG4gICAgdHlwZTogU3RyaW5nLFxuICB9LFxuXVxuY29uc3Qgb3B0aW9ucyA9IGNvbW1hbmRMaW5lQXJncyhvcHRpb25zRGVmaW5pdGlvbnMpXG5jb25zdCB0b2RheSA9IG5ldyBEYXRlKClcblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hXaXRoUmV0cnkoXG4gIHVybDogc3RyaW5nLFxuICByZXRyaWVzOiBudW1iZXIgPSAzLFxuICBiYWNrb2ZmOiBudW1iZXIgPSAzMDAsXG4pOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIGZvciAobGV0IGF0dGVtcHQgPSAwOyBhdHRlbXB0IDwgcmV0cmllczsgYXR0ZW1wdCsrKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBmZXRjaCh1cmwpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChhdHRlbXB0ID09PSByZXRyaWVzIC0gMSkge1xuICAgICAgICB0aHJvdyBlcnJvclxuICAgICAgfVxuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICBgRmV0Y2ggYXR0ZW1wdCAke2F0dGVtcHQgKyAxfSBmb3IgJHt1cmx9IGZhaWxlZC4gUmV0cnlpbmcgaW4gJHtiYWNrb2ZmfW1zLi4uYCxcbiAgICAgIClcbiAgICAgIGF3YWl0IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGJhY2tvZmYpKVxuICAgICAgYmFja29mZiAqPSAyXG4gICAgfVxuICB9XG4gIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGZldGNoICR7dXJsfSBhZnRlciAke3JldHJpZXN9IGF0dGVtcHRzYClcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmV0cmlldmVEb2N1bWVudHMoKTogUHJvbWlzZTxudW1iZXI+IHtcbiAgYXNzZXJ0KFxuICAgICFvcHRpb25zLmNvbW1pdCB8fCAhb3B0aW9ucy51aWQsXG4gICAgJ09wdGlvbnMgXCJjb21taXRcIiAmIFwidWlkXCIgYXJlIGluY29tcGF0aWJsZScsXG4gIClcblxuICBjb25zdCBkYXRhRGlyID0gb3B0aW9ucy5kYXRhRGlyXG4gIGNvbnN0IGRvY3VtZW50c0RpciA9IHBhdGguam9pbihkYXRhRGlyLCBcIkRvY3VtZW50c1wiKVxuICBpZiAob3B0aW9ucy5wdWxsKSB7XG4gICAgZ2l0LnJlc2V0QW5kUHVsbChkb2N1bWVudHNEaXIpXG4gIH1cbiAgZnMuZW5zdXJlRGlyU3luYyhkb2N1bWVudHNEaXIpXG5cbiAgaWYgKG9wdGlvbnMuZnVsbCAmJiAhb3B0aW9ucy51aWQpIHtcbiAgICBmb3IgKGNvbnN0IGZpbGVuYW1lIG9mIGZzLnJlYWRkaXJTeW5jKGRvY3VtZW50c0RpcikpIHtcbiAgICAgIGlmIChmaWxlbmFtZVswXSA9PT0gXCIuXCIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGZzLnJlbW92ZVN5bmMocGF0aC5qb2luKGRvY3VtZW50c0RpciwgZmlsZW5hbWUpKVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGZpcnN0VWlkID0gb3B0aW9ucy51aWRcbiAgbGV0IHNraXAgPSBCb29sZWFuKGZpcnN0VWlkKVxuICBmb3IgKGNvbnN0IHsgZG9jdW1lbnQgfSBvZiBpdGVyTG9hZEFzc2VtYmxlZURvY3VtZW50cyhcbiAgICBkYXRhRGlyLFxuICAgIG9wdGlvbnMubGVnaXNsYXR1cmUsXG4gICkpIHtcbiAgICBmb3IgKGNvbnN0IGRvY3VtZW50T3JEaXZpc2lvbiBvZiB3YWxrRG9jdW1lbnRBbmREaXZpc2lvbnMoZG9jdW1lbnQpKSB7XG4gICAgICAvLyBJZ25vcmUgZG9jdW1lbnRzIGZyb20gU8OpbmF0LlxuICAgICAgaWYgKGRvY3VtZW50T3JEaXZpc2lvbi51aWQuc3Vic3RyaW5nKDQsIDYpID09PSBcIlNOXCIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHNraXApIHtcbiAgICAgICAgaWYgKGRvY3VtZW50T3JEaXZpc2lvbi51aWQgPT09IGZpcnN0VWlkKSB7XG4gICAgICAgICAgc2tpcCA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBhd2FpdCBwcm9jZXNzRG9jdW1lbnRPckRpdmlzaW9uKGRvY3VtZW50T3JEaXZpc2lvbiwgZG9jdW1lbnRzRGlyLCBvcHRpb25zKVxuICAgIH1cbiAgfVxuXG4gIGlmIChvcHRpb25zLmNvbW1pdCkge1xuICAgIHJldHVybiBnaXQuY29tbWl0QW5kUHVzaChkb2N1bWVudHNEaXIsIFwiTm91dmVsbGUgbW9pc3NvblwiLCBvcHRpb25zLnJlbW90ZSlcbiAgfVxuICByZXR1cm4gMFxufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9jZXNzRG9jdW1lbnRPckRpdmlzaW9uKFxuICBkb2N1bWVudE9yRGl2aXNpb246IGFueSxcbiAgZG9jdW1lbnRzRGlyOiBzdHJpbmcsXG4gIG9wdGlvbnM6IGFueSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBkb2N1bWVudERpciA9IHBhdGhGcm9tRG9jdW1lbnRVaWQoZG9jdW1lbnRzRGlyLCBkb2N1bWVudE9yRGl2aXNpb24udWlkKVxuICBmcy5lbnN1cmVEaXJTeW5jKGRvY3VtZW50RGlyKVxuXG4gIGNvbnN0IGZpbGVuYW1lQnlTaGEyNTY6IHsgW2RpZ2VzdDogc3RyaW5nXTogc3RyaW5nIH0gPSB7fVxuICBjb25zdCBpbmRleFBhdGggPSBwYXRoLmpvaW4oZG9jdW1lbnREaXIsIFwiaW5kZXguanNvblwiKVxuICBjb25zdCBpbmRleCA9IChcbiAgICBmcy5wYXRoRXhpc3RzU3luYyhpbmRleFBhdGgpID8gZnMucmVhZEpzb25TeW5jKGluZGV4UGF0aCkgOiB7fVxuICApIGFzIERvY3VtZW50RmlsZXNJbmRleFxuXG4gIGZvciAoY29uc3QgeyBmb3JtYXQsIHR5cGUsIHVybCB9IG9mIGl0ZXJEb2N1bWVudE9yRGl2aXNpb25VcmxzKFxuICAgIGRvY3VtZW50T3JEaXZpc2lvbixcbiAgKSkge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gYCR7dHlwZX0uJHtcbiAgICAgIGZvcm1hdCA9PT0gRG9jdW1lbnRVcmxGb3JtYXQuUGRmID8gXCJwZGZcIiA6IFwiaHRtbFwiXG4gICAgfWBcblxuICAgIC8vIEZpbHRlciBieSBmb3JtYXQgaWYgb3B0aW9uIGlzIHBhc3NlZFxuICAgIGlmIChvcHRpb25zLmZvcm1hdCAmJiBvcHRpb25zLmZvcm1hdCAhPT0gZm9ybWF0KSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIC8vIEZpbHRlciBieSBkb2N1bWVudCB0eXBlIGlmIG9wdGlvbiBpcyBwYXNzZWRcbiAgICBjb25zdCBkb2N1bWVudFR5cGUgPSBkb2N1bWVudE9yRGl2aXNpb24uY2xhc3NpZmljYXRpb24/LnR5cGU/LmNvZGVcbiAgICBpZiAoXG4gICAgICBvcHRpb25zW1wiZG9jdW1lbnQtdHlwZVwiXSAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAhb3B0aW9uc1tcImRvY3VtZW50LXR5cGVcIl0uaW5jbHVkZXMoZG9jdW1lbnRUeXBlKVxuICAgICkge1xuICAgICAgY29udGludWVcbiAgICB9XG5cbiAgICBsZXQgZm9ybWF0RmlsZXNJbmZvcyA9IGluZGV4W2Zvcm1hdF0gPz8gKGluZGV4W2Zvcm1hdF0gPSBbXSlcbiAgICBsZXQgZmlsZUluZm9zID1cbiAgICAgIGZvcm1hdEZpbGVzSW5mb3MuZmluZCgoZmlsZSkgPT4gZmlsZS51cmwgPT09IHVybCkgPz9cbiAgICAgICh7fSBhcyBEb2N1bWVudEZpbGVJbmZvcylcbiAgICBpZiAoIWZvcm1hdEZpbGVzSW5mb3MuaW5jbHVkZXMoZmlsZUluZm9zKSkge1xuICAgICAgZm9ybWF0RmlsZXNJbmZvcy5wdXNoKGZpbGVJbmZvcylcbiAgICB9XG4gICAgZmlsZUluZm9zLnVybCA9IHVybFxuXG4gICAgaWYgKGZpbGVJbmZvcy5zdGF0dXMgPT09IDIwMCAmJiAhb3B0aW9ucy5mdWxsKSB7XG4gICAgICBmaWxlbmFtZUJ5U2hhMjU2W2ZpbGVJbmZvcy5zaGEyNTYgYXMgc3RyaW5nXSA9IGZpbGVuYW1lXG4gICAgICBjb250aW51ZVxuICAgIH1cbiAgICBpZiAoXG4gICAgICBmaWxlSW5mb3Muc3RhdHVzID09PSA0MDQgJiZcbiAgICAgICFvcHRpb25zW1wibm90LWZvdW5kXCJdICYmXG4gICAgICBkaWZmZXJlbmNlSW5EYXlzKFxuICAgICAgICB0b2RheSxcbiAgICAgICAgZG9jdW1lbnRPckRpdmlzaW9uLmN5Y2xlRGVWaWUuY2hyb25vLmRhdGVDcmVhdGlvbiA/P1xuICAgICAgICAgIChkb2N1bWVudE9yRGl2aXNpb24uY3ljbGVEZVZpZS5jaHJvbm8uZGF0ZURlcG90IGFzIERhdGUgfCBzdHJpbmcpLFxuICAgICAgKSA+IDEwXG4gICAgKSB7XG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgUmV0cmlldmluZyBkb2N1bWVudCBvciBkaXZpc2lvbiAke2RvY3VtZW50T3JEaXZpc2lvbi51aWR9IGF0ICR7dXJsfeKApmAsXG4gICAgICApXG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaFdpdGhSZXRyeSh1cmwpXG4gICAgY29uc3QgZmlsZVBhdGggPSBwYXRoLmpvaW4oZG9jdW1lbnREaXIsIGZpbGVuYW1lKVxuXG4gICAgaWYgKHJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBhcnJheUJ1ZmZlciA9IGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKClcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGFycmF5QnVmZmVyKVxuICAgICAgaWYgKFxuICAgICAgICBmb3JtYXQgPT09IERvY3VtZW50VXJsRm9ybWF0LlBkZiAmJlxuICAgICAgICAhYnVmZmVyLnN1YmFycmF5KDAsIDQpLnRvU3RyaW5nKCkuc3RhcnRzV2l0aChcIiVQREZcIilcbiAgICAgICkge1xuICAgICAgICAvLyBJbnN0ZWFkIG9mIGEgUERGLCB0aGUgcmVjZWl2ZWQgZGF0YSBtYXkgYmUgYW4gSFRNTCBwYWdlIHdpdGggYSBtZXNzYWdlIGxpa2VcbiAgICAgICAgLy8gXCJEb2N1bWVudCBub24gZW5jb3JlIHB1Ymxpw6lcIi5cbiAgICAgICAgaWYgKCFvcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihgICBQREYgXCIke3VybH1cIiBub3QgZm91bmQuYClcbiAgICAgICAgfVxuICAgICAgICBmcy5yZW1vdmVTeW5jKGZpbGVQYXRoKVxuICAgICAgICBkZWxldGUgZmlsZUluZm9zLmZpbGVuYW1lXG4gICAgICAgIGRlbGV0ZSBmaWxlSW5mb3Muc2hhMjU2XG4gICAgICAgIGZpbGVJbmZvcy5zdGF0dXMgPSA0MDRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHNoYTI1NiA9IGNyZWF0ZUhhc2goXCJzaGEyNTZcIikudXBkYXRlKGJ1ZmZlcikuZGlnZXN0KFwiaGV4XCIpXG4gICAgICAgIGNvbnN0IGV4aXN0aW5nRmlsZW5hbWUgPSBmaWxlbmFtZUJ5U2hhMjU2W3NoYTI1Nl1cbiAgICAgICAgaWYgKGV4aXN0aW5nRmlsZW5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGZzLmNyZWF0ZVdyaXRlU3RyZWFtKGZpbGVQYXRoKS53cml0ZShidWZmZXIpXG4gICAgICAgICAgZmlsZUluZm9zLmZpbGVuYW1lID0gZmlsZW5hbWVcbiAgICAgICAgICBmaWxlbmFtZUJ5U2hhMjU2W3NoYTI1Nl0gPSBmaWxlbmFtZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZpbGVJbmZvcy5maWxlbmFtZSA9IGV4aXN0aW5nRmlsZW5hbWVcbiAgICAgICAgfVxuICAgICAgICBmaWxlSW5mb3Muc2hhMjU2ID0gc2hhMjU2XG4gICAgICAgIGZpbGVJbmZvcy5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXNcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gNDA0KSB7XG4gICAgICAgIGlmICghb3B0aW9ucy5zaWxlbnQpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oYCAgUGFnZSBcIiR7dXJsfVwiIG5vdCBmb3VuZC5gKVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgIGAgIEVycm9yOlxcbiR7SlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICB7IGNvZGU6IHJlc3BvbnNlLnN0YXR1cywgbWVzc2FnZTogcmVzcG9uc2Uuc3RhdHVzVGV4dCB9LFxuICAgICAgICAgICAgbnVsbCxcbiAgICAgICAgICAgIDIsXG4gICAgICAgICAgKX1gLFxuICAgICAgICApXG4gICAgICB9XG4gICAgICBmcy5yZW1vdmVTeW5jKGZpbGVQYXRoKVxuICAgICAgZGVsZXRlIGZpbGVJbmZvcy5maWxlbmFtZVxuICAgICAgZGVsZXRlIGZpbGVJbmZvcy5zaGEyNTZcbiAgICAgIGZpbGVJbmZvcy5zdGF0dXMgPSByZXNwb25zZS5zdGF0dXNcbiAgICB9XG4gIH1cblxuICBmcy53cml0ZUpzb25TeW5jKGluZGV4UGF0aCwgaW5kZXgsIHsgZW5jb2Rpbmc6IFwidXRmLThcIiwgc3BhY2VzOiAyIH0pXG59XG5cbnJldHJpZXZlRG9jdW1lbnRzKClcbiAgLnRoZW4oKGV4aXRDb2RlKSA9PiBwcm9jZXNzLmV4aXQoZXhpdENvZGUpKVxuICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgY29uc29sZS5sb2coZXJyb3IpXG4gICAgcHJvY2Vzcy5leGl0KDEpXG4gIH0pXG4iXSwibWFwcGluZ3MiOiJBQUFBLE9BQU9BLE1BQU0sTUFBTSxRQUFRO0FBQzNCLE9BQU9DLGVBQWUsTUFBTSxtQkFBbUI7QUFDL0MsU0FBU0MsVUFBVSxRQUFRLFFBQVE7QUFDbkMsU0FBU0MsZ0JBQWdCLFFBQVEsVUFBVTtBQUMzQyxPQUFPQyxFQUFFLE1BQU0sVUFBVTtBQUN6QixPQUFPQyxJQUFJLE1BQU0sTUFBTTtBQUFBLFNBS3JCQyx3QkFBd0I7QUFBQSxPQUVuQixLQUFLQyxHQUFHO0FBQUEsU0FDTkMsMEJBQTBCLEVBQUVDLG1CQUFtQjtBQUFBLFNBQy9DQyxpQkFBaUIsRUFBRUMsMEJBQTBCO0FBQUEsU0FFcERDLFlBQVksRUFDWkMsb0JBQW9CLEVBQ3BCQyxpQkFBaUIsRUFDakJDLFVBQVUsRUFDVkMsWUFBWSxFQUNaQyxZQUFZLEVBQ1pDLGFBQWE7QUFHZixNQUFNQyxrQkFBa0IsR0FBRyxDQUN6QlAsWUFBWSxFQUNaRSxpQkFBaUIsRUFDakJFLFlBQVksRUFDWkMsWUFBWSxFQUNaQyxhQUFhLEVBQ2JMLG9CQUFvQixFQUNwQkUsVUFBVSxFQUNWO0VBQ0VLLEtBQUssRUFBRSxHQUFHO0VBQ1ZDLElBQUksRUFBRSxxREFBcUQ7RUFDM0RDLElBQUksRUFBRSxNQUFNO0VBQ1pDLElBQUksRUFBRUM7QUFDUixDQUFDLEVBQ0Q7RUFDRUosS0FBSyxFQUFFLEdBQUc7RUFDVkMsSUFBSSxFQUFFLCtEQUErRDtFQUNyRUMsSUFBSSxFQUFFLFdBQVc7RUFDakJDLElBQUksRUFBRUM7QUFDUixDQUFDLEVBQ0Q7RUFDRUosS0FBSyxFQUFFLEdBQUc7RUFDVkMsSUFBSSxFQUFFLDJEQUEyRDtFQUNqRUMsSUFBSSxFQUFFLEtBQUs7RUFDWEMsSUFBSSxFQUFFRTtBQUNSLENBQUMsRUFD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
|