@tricoteuses/assemblee 1.10.5 → 2.0.0
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 +8 -1
- package/lib/amendements-79bwpkvR.js +154 -0
- package/lib/amendements-CV3s5a0M.js +667 -0
- package/lib/cleaners/index.d.ts +9 -9
- package/lib/cleaners.js +564 -0
- package/lib/datasets.d.ts +3 -3
- package/lib/dossiers_legislatifs.d.ts +2 -2
- package/lib/index.d.ts +17 -22
- package/lib/index.js +1542 -314
- package/lib/inserters.d.ts +5 -5
- package/lib/loaders-9mHdTl9L.js +4158 -0
- package/lib/loaders.d.ts +12 -12
- package/lib/loaders.js +29 -1689
- package/lib/organes.d.ts +1 -1
- package/lib/parse-Ccs6wcUg.js +2512 -0
- package/lib/parsers/index.d.ts +2 -3
- package/lib/parsers/plf.d.ts +1 -0
- package/lib/parsers/recherche_amendements.d.ts +2 -2
- package/lib/parsers/textes_lois.d.ts +1 -23
- package/lib/parsers.js +398 -0
- package/lib/raw_types/debats.d.ts +2 -2
- package/lib/raw_types/dossiers_legislatifs.d.ts +1 -1
- package/lib/schemas/acteurs_et_organes.json +1166 -0
- package/lib/schemas/agendas.json +1745 -0
- package/lib/schemas/amendements.json +2085 -0
- package/lib/schemas/debats.json +842 -0
- package/lib/schemas/dossiers_legislatifs.json +3874 -0
- package/lib/schemas/legislatures.json +17 -0
- package/lib/schemas/questions.json +704 -0
- package/lib/schemas/scrutins.json +701 -0
- package/lib/scripts/retrieve_deputes_photos.d.ts +1 -1
- package/lib/types/acteurs_et_organes.d.ts +340 -0
- package/lib/types/agendas.d.ts +236 -10
- package/lib/types/amendements.d.ts +276 -1
- package/lib/types/debats.d.ts +52 -2
- package/lib/types/dossiers_legislatifs.d.ts +403 -9
- package/lib/types/questions.d.ts +99 -2
- package/lib/types/scrutins.d.ts +101 -0
- package/lib/urls.d.ts +2 -2
- package/package.json +32 -94
- package/lib/api.js +0 -52
- package/lib/api.mjs +0 -45
- package/lib/bugs/acteur-00010/plugin.test.js +0 -90
- package/lib/bugs/acteur-00010/plugin.test.mjs +0 -33
- package/lib/bugs/acteur-00010.d.ts +0 -7
- package/lib/bugs/acteur-00010.js +0 -116
- package/lib/bugs/acteur-00010.mjs +0 -26
- package/lib/bugs/agenda-00002/plugin.test.js +0 -124
- package/lib/bugs/agenda-00002/plugin.test.mjs +0 -50
- package/lib/bugs/agenda-00002.d.ts +0 -15
- package/lib/bugs/agenda-00002.js +0 -406
- package/lib/bugs/agenda-00002.mjs +0 -172
- package/lib/bugs/agenda-00008/plugin.test.js +0 -92
- package/lib/bugs/agenda-00008/plugin.test.mjs +0 -31
- package/lib/bugs/agenda-00008.d.ts +0 -7
- package/lib/bugs/agenda-00008.js +0 -123
- package/lib/bugs/agenda-00008.mjs +0 -26
- package/lib/bugs/agenda-00011/plugin.test.d.ts +0 -1
- package/lib/bugs/agenda-00011/plugin.test.js +0 -263
- package/lib/bugs/agenda-00011/plugin.test.mjs +0 -152
- package/lib/bugs/agenda-00011.d.ts +0 -16
- package/lib/bugs/agenda-00011.js +0 -333
- package/lib/bugs/agenda-00011.mjs +0 -125
- package/lib/bugs.d.ts +0 -21
- package/lib/bugs.js +0 -452
- package/lib/bugs.mjs +0 -70
- package/lib/cleaners/actes_legislatifs.js +0 -315
- package/lib/cleaners/actes_legislatifs.mjs +0 -253
- package/lib/cleaners/acteurs.js +0 -265
- package/lib/cleaners/acteurs.mjs +0 -180
- package/lib/cleaners/amendements.js +0 -294
- package/lib/cleaners/amendements.mjs +0 -227
- package/lib/cleaners/debats.js +0 -12
- package/lib/cleaners/debats.mjs +0 -5
- package/lib/cleaners/documents.js +0 -205
- package/lib/cleaners/documents.mjs +0 -133
- package/lib/cleaners/dossiers_legislatifs.js +0 -131
- package/lib/cleaners/dossiers_legislatifs.mjs +0 -70
- package/lib/cleaners/index.js +0 -70
- package/lib/cleaners/index.mjs +0 -10
- package/lib/cleaners/organes.js +0 -65
- package/lib/cleaners/organes.mjs +0 -48
- package/lib/cleaners/questions.js +0 -12
- package/lib/cleaners/questions.mjs +0 -5
- package/lib/cleaners/reunions.js +0 -312
- package/lib/cleaners/reunions.mjs +0 -255
- package/lib/cleaners/scrutins.js +0 -340
- package/lib/cleaners/scrutins.mjs +0 -221
- package/lib/cleaners/xml.js +0 -74
- package/lib/cleaners/xml.mjs +0 -59
- package/lib/datasets.js +0 -837
- package/lib/datasets.mjs +0 -755
- package/lib/dates.js +0 -124
- package/lib/dates.mjs +0 -100
- package/lib/dossiers_legislatifs.js +0 -346
- package/lib/dossiers_legislatifs.mjs +0 -208
- package/lib/file_systems.js +0 -162
- package/lib/file_systems.mjs +0 -62
- package/lib/git.js +0 -223
- package/lib/git.mjs +0 -151
- package/lib/index.mjs +0 -17
- package/lib/inserters.js +0 -521
- package/lib/inserters.mjs +0 -337
- package/lib/loaders.mjs +0 -886
- package/lib/logger.js +0 -35
- package/lib/logger.mjs +0 -26
- package/lib/organes.js +0 -22
- package/lib/organes.mjs +0 -15
- package/lib/parsers/documents.d.ts +0 -62
- package/lib/parsers/documents.js +0 -453
- package/lib/parsers/documents.mjs +0 -370
- package/lib/parsers/index.js +0 -40
- package/lib/parsers/index.mjs +0 -4
- package/lib/parsers/recherche_amendements.js +0 -403
- package/lib/parsers/recherche_amendements.mjs +0 -167
- package/lib/parsers/textes_lois.js +0 -307
- package/lib/parsers/textes_lois.mjs +0 -264
- package/lib/raw_types/acteurs_et_organes.js +0 -1215
- package/lib/raw_types/acteurs_et_organes.mjs +0 -1148
- package/lib/raw_types/agendas.js +0 -777
- package/lib/raw_types/agendas.mjs +0 -724
- package/lib/raw_types/amendements.js +0 -1052
- package/lib/raw_types/amendements.mjs +0 -993
- package/lib/raw_types/debats.js +0 -630
- package/lib/raw_types/debats.mjs +0 -573
- package/lib/raw_types/dossiers_legislatifs.js +0 -1529
- package/lib/raw_types/dossiers_legislatifs.mjs +0 -1471
- package/lib/raw_types/questions.js +0 -469
- package/lib/raw_types/questions.mjs +0 -416
- package/lib/raw_types/scrutins.js +0 -651
- package/lib/raw_types/scrutins.mjs +0 -598
- package/lib/schemas/acteur/Acteur.json +0 -56
- package/lib/schemas/acteur/AdresseElectronique.json +0 -52
- package/lib/schemas/acteur/AdressePostale.json +0 -75
- package/lib/schemas/acteur/Civ.json +0 -14
- package/lib/schemas/acteur/Collaborateur.json +0 -29
- package/lib/schemas/acteur/EtatCivil.json +0 -51
- package/lib/schemas/acteur/Ident.json +0 -40
- package/lib/schemas/acteur/Lieu.json +0 -66
- package/lib/schemas/acteur/Mandat.json +0 -192
- package/lib/schemas/acteur/Profession.json +0 -46
- package/lib/schemas/agenda/Agenda.json +0 -318
- package/lib/schemas/agenda/CycleDeVie.json +0 -45
- package/lib/schemas/agenda/PointOdj.json +0 -82
- package/lib/schemas/amendement/Amendement.json +0 -246
- package/lib/schemas/amendement/Diff.json +0 -25
- package/lib/schemas/amendement/DispositifAmdtCredit.json +0 -85
- package/lib/schemas/amendement/Identifiant.json +0 -62
- package/lib/schemas/amendement/PointeurFragmentTexte.json +0 -127
- package/lib/schemas/amendement/Representation.json +0 -67
- package/lib/schemas/amendement/Total.json +0 -26
- package/lib/schemas/converted_from_type/acteurs_et_organes.json +0 -666
- package/lib/schemas/converted_from_type/agendas.json +0 -1100
- package/lib/schemas/converted_from_type/amendements.json +0 -3191
- package/lib/schemas/converted_from_type/debats.json +0 -682
- package/lib/schemas/converted_from_type/deputes.json +0 -26
- package/lib/schemas/converted_from_type/dossiers_legislatifs.json +0 -2918
- package/lib/schemas/converted_from_type/legislatures.json +0 -16
- package/lib/schemas/converted_from_type/questions.json +0 -328
- package/lib/schemas/converted_from_type/scrutins.json +0 -393
- package/lib/schemas/debat/Contenu.json +0 -75
- package/lib/schemas/debat/Debat.json +0 -40
- package/lib/schemas/debat/Metadonnees.json +0 -75
- package/lib/schemas/debat/Orateur.json +0 -60
- package/lib/schemas/debat/Point.json +0 -169
- package/lib/schemas/debat/Sommaire.json +0 -71
- package/lib/schemas/debat/SommaireElement.json +0 -108
- package/lib/schemas/debat/Texte.json +0 -34
- package/lib/schemas/document/CodeLibelle.json +0 -25
- package/lib/schemas/document/Document.json +0 -385
- package/lib/schemas/document/Indexation.json +0 -38
- package/lib/schemas/dossier/ActeLegislatif.json +0 -211
- package/lib/schemas/dossier/ActeLegislatifBase.json +0 -62
- package/lib/schemas/dossier/Agenda.json +0 -23
- package/lib/schemas/dossier/ConseilConstitutionnel.json +0 -35
- package/lib/schemas/dossier/Decision.json +0 -25
- package/lib/schemas/dossier/Dossier.json +0 -124
- package/lib/schemas/dossier/EtudeImpact.json +0 -29
- package/lib/schemas/dossier/EtudePlf.json +0 -105
- package/lib/schemas/dossier/Europe.json +0 -42
- package/lib/schemas/dossier/FamCodeLibelle.json +0 -25
- package/lib/schemas/dossier/InfoJO.json +0 -23
- package/lib/schemas/dossier/Initiateur.json +0 -36
- package/lib/schemas/dossier/Motion.json +0 -27
- package/lib/schemas/dossier/Promulgation.json +0 -62
- package/lib/schemas/dossier/Rapporteur.json +0 -36
- package/lib/schemas/dossier/Texte.json +0 -47
- package/lib/schemas/organe/CodeTypeOrgane.json +0 -43
- package/lib/schemas/organe/Organe.json +0 -136
- package/lib/schemas/organe/ViMoDe.json +0 -28
- package/lib/schemas/question/Auteur.json +0 -58
- package/lib/schemas/question/Cloture.json +0 -28
- package/lib/schemas/question/InfoJO.json +0 -40
- package/lib/schemas/question/MinAttribElement.json +0 -30
- package/lib/schemas/question/Question.json +0 -172
- package/lib/schemas/question/Renouvellement.json +0 -17
- package/lib/schemas/question/Signalement.json +0 -21
- package/lib/schemas/question/Texte.json +0 -24
- package/lib/schemas/scrutin/DecompteVoix.json +0 -35
- package/lib/schemas/scrutin/Dysfonctionnement.json +0 -50
- package/lib/schemas/scrutin/MiseAuPoint.json +0 -53
- package/lib/schemas/scrutin/OrganeVotant.json +0 -88
- package/lib/schemas/scrutin/Scrutin.json +0 -187
- package/lib/schemas/scrutin/Votant.json +0 -37
- package/lib/scripts/bugs_helper.d.ts +0 -13
- package/lib/scripts/bugs_helper.js +0 -595
- package/lib/scripts/bugs_helper.mjs +0 -251
- package/lib/scripts/clean_reorganized_data.js +0 -613
- package/lib/scripts/clean_reorganized_data.mjs +0 -276
- package/lib/scripts/diff_amendements.js +0 -249
- package/lib/scripts/diff_amendements.mjs +0 -202
- package/lib/scripts/document_dossiers_legislatifs.js +0 -655
- package/lib/scripts/document_dossiers_legislatifs.mjs +0 -414
- package/lib/scripts/get_today_reunions.js +0 -37
- package/lib/scripts/get_today_reunions.mjs +0 -31
- package/lib/scripts/merge_scrutins.js +0 -97
- package/lib/scripts/merge_scrutins.mjs +0 -47
- package/lib/scripts/parse_textes_lois.d.ts +0 -1
- package/lib/scripts/parse_textes_lois.js +0 -171
- package/lib/scripts/parse_textes_lois.mjs +0 -140
- package/lib/scripts/process_open_dataset.js +0 -301
- package/lib/scripts/process_open_dataset.mjs +0 -134
- package/lib/scripts/raw_types_from_amendements.js +0 -135
- package/lib/scripts/raw_types_from_amendements.mjs +0 -134
- package/lib/scripts/reorganize_data.js +0 -805
- package/lib/scripts/reorganize_data.mjs +0 -517
- package/lib/scripts/retrieve_deputes_photos.js +0 -310
- package/lib/scripts/retrieve_deputes_photos.mjs +0 -158
- package/lib/scripts/retrieve_documents.js +0 -547
- package/lib/scripts/retrieve_documents.mjs +0 -242
- package/lib/scripts/retrieve_open_data.js +0 -107
- package/lib/scripts/retrieve_open_data.mjs +0 -26
- package/lib/scripts/retrieve_pending_amendments.js +0 -206
- package/lib/scripts/retrieve_pending_amendments.mjs +0 -57
- package/lib/scripts/retrieve_senateurs_photos.js +0 -234
- package/lib/scripts/retrieve_senateurs_photos.mjs +0 -116
- package/lib/scripts/retrieve_textes_lois.d.ts +0 -1
- package/lib/scripts/retrieve_textes_lois.js +0 -240
- package/lib/scripts/retrieve_textes_lois.mjs +0 -85
- package/lib/scripts/shared/cli_helpers.js +0 -89
- package/lib/scripts/shared/cli_helpers.mjs +0 -81
- package/lib/scripts/test_iter_load.js +0 -155
- package/lib/scripts/test_iter_load.mjs +0 -72
- package/lib/scripts/test_load.js +0 -26
- package/lib/scripts/test_load.mjs +0 -16
- package/lib/scripts/test_load_big_files.js +0 -26
- package/lib/scripts/test_load_big_files.mjs +0 -16
- package/lib/scripts/validate_json.js +0 -353
- package/lib/scripts/validate_json.mjs +0 -184
- package/lib/shared_types/codes_actes.js +0 -231
- package/lib/shared_types/codes_actes.mjs +0 -224
- package/lib/strings.js +0 -16
- package/lib/strings.mjs +0 -7
- package/lib/types/acteurs_et_organes.js +0 -965
- package/lib/types/acteurs_et_organes.mjs +0 -906
- package/lib/types/agendas.js +0 -628
- package/lib/types/agendas.mjs +0 -575
- package/lib/types/amendements.js +0 -899
- package/lib/types/amendements.mjs +0 -842
- package/lib/types/debats.js +0 -619
- package/lib/types/debats.mjs +0 -562
- package/lib/types/dossiers_legislatifs.js +0 -1188
- package/lib/types/dossiers_legislatifs.mjs +0 -1130
- package/lib/types/legislatures.js +0 -17
- package/lib/types/legislatures.mjs +0 -10
- package/lib/types/questions.js +0 -454
- package/lib/types/questions.mjs +0 -401
- package/lib/types/scrutins.js +0 -556
- package/lib/types/scrutins.mjs +0 -503
- package/lib/urls.js +0 -325
- package/lib/urls.mjs +0 -258
- /package/lib/{bugs/acteur-00010/plugin.test.d.ts → scripts/add_links_to_documents.d.ts} +0 -0
- /package/lib/{bugs/agenda-00002/plugin.test.d.ts → scripts/copy-schemas.d.ts} +0 -0
- /package/lib/{bugs/agenda-00008/plugin.test.d.ts → scripts/generate-json-schemas.d.ts} +0 -0
package/lib/loaders.mjs
DELETED
|
@@ -1,886 +0,0 @@
|
|
|
1
|
-
/// Load data from files
|
|
2
|
-
|
|
3
|
-
import assert from "assert";
|
|
4
|
-
import fs from "fs-extra";
|
|
5
|
-
import path from "path";
|
|
6
|
-
export { EnabledDatasets } from "./datasets.mjs";
|
|
7
|
-
import { datasets, EnabledDatasets } from "./datasets.mjs";
|
|
8
|
-
export { walkDir } from "./file_systems.mjs";
|
|
9
|
-
import { walkDir } from "./file_systems.mjs";
|
|
10
|
-
import { Convert as ActeursEtOrganesConvert } from "./types/acteurs_et_organes.mjs";
|
|
11
|
-
import { Convert as AgendasConvert } from "./types/agendas.mjs";
|
|
12
|
-
import { Convert as AmendementsConvert } from "./types/amendements.mjs";
|
|
13
|
-
import { Convert as DossiersLegislatifsConvert } from "./types/dossiers_legislatifs.mjs";
|
|
14
|
-
import { Legislature } from "./types/legislatures.mjs";
|
|
15
|
-
import { Convert as ScrutinsConvert } from "./types/scrutins.mjs";
|
|
16
|
-
import { Convert as QuestionsConvert } from "./types/questions.mjs";
|
|
17
|
-
import { Convert as ComptesRendusConvert } from "./types/debats.mjs";
|
|
18
|
-
const documentUidRegex = /^((?<documentType>ACIN|ALCN|AVCE|AVIS|DECL|ETDI|LETT|MESS|MION|PION|PNRE|PRJL|RAPP|RINF|RION)(?<chambre>AN|CG|SN)(?<republique>R\d+)[LS](?<legislature>\d+)(?<etat>B|BTA|BTC|TAP)(?<numero>\d+)(-.*)?)|((?<documentType2>MION)(?<chambre2>AN|SN)(?<republique2>R\d+)[LS](?<legislature2>\d+)-N(?<numero2>\d+))$/;
|
|
19
|
-
const dossierUidRegex = /^DL(R\d+)(L\d+)N(\d+)$/;
|
|
20
|
-
const reunionUidRegex = /^RU(AN|CG|SN)(R\d+)(L\d+)([AS]\d{4})(IDC|IDFL?|IDS)(\d+)$/;
|
|
21
|
-
const scrutinUidRegex = /^VT(AN|CG)(R\d+)(L\d+)V(\d+)$/;
|
|
22
|
-
const compteRenduUidRegex = /^CRS(AN|CG)(R\d+)(L\d+)(S\d+)(O|E|D)(\d+)(N\d+)$/;
|
|
23
|
-
const questionUidRegex = /^QAN(R\d+)(L\d+)Q(E|G|OSD)(\d+)$/;
|
|
24
|
-
function* iterLoadAssembleeItems(dataDir, legislature, datasets, convertToItem, subfolderName, fileExtension = "json", {
|
|
25
|
-
noValidation = false,
|
|
26
|
-
log = false
|
|
27
|
-
} = {}) {
|
|
28
|
-
const itemUid = new Set();
|
|
29
|
-
for (const dataset of datasets) {
|
|
30
|
-
if (dataset.ignoreForWeb) {
|
|
31
|
-
continue;
|
|
32
|
-
}
|
|
33
|
-
if (legislature !== undefined && legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
|
|
34
|
-
continue;
|
|
35
|
-
}
|
|
36
|
-
let fileExtensionRegex = new RegExp(`\\.${fileExtension}$`);
|
|
37
|
-
const datasetDir = path.join(dataDir, dataset.filename.replace(fileExtensionRegex, "_nettoye"));
|
|
38
|
-
for (const itemSplitPath of walkDir(datasetDir, subfolderName)) {
|
|
39
|
-
const itemFilename = itemSplitPath[itemSplitPath.length - 1];
|
|
40
|
-
if (!itemFilename.endsWith(".json")) {
|
|
41
|
-
continue;
|
|
42
|
-
}
|
|
43
|
-
const itemFilePath = path.join(datasetDir, ...itemSplitPath);
|
|
44
|
-
if (log) {
|
|
45
|
-
console.log(`Loading file: ${itemFilePath}…`);
|
|
46
|
-
}
|
|
47
|
-
let itemJson = fs.readFileSync(itemFilePath, {
|
|
48
|
-
encoding: "utf8"
|
|
49
|
-
});
|
|
50
|
-
let item = noValidation ? JSON.parse(itemJson) : convertToItem(itemJson);
|
|
51
|
-
if (itemUid.has(item.uid)) {
|
|
52
|
-
continue;
|
|
53
|
-
}
|
|
54
|
-
itemUid.add(item.uid);
|
|
55
|
-
yield {
|
|
56
|
-
item: item,
|
|
57
|
-
datasetLegislature: dataset.legislature
|
|
58
|
-
};
|
|
59
|
-
itemJson = null;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
export function* iterLoadAssembleeActeurs(dataDir, legislature, options = {}) {
|
|
64
|
-
for (const {
|
|
65
|
-
item: acteur,
|
|
66
|
-
datasetLegislature
|
|
67
|
-
} of iterLoadAssembleeItems(dataDir, legislature, datasets.acteursEtOrganes, ActeursEtOrganesConvert.toActeur, ["acteurs"], "json", options)) {
|
|
68
|
-
yield {
|
|
69
|
-
acteur,
|
|
70
|
-
datasetLegislature
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
export function* iterLoadAssembleeOrganes(dataDir, legislature, options = {}) {
|
|
75
|
-
for (const {
|
|
76
|
-
item: organe,
|
|
77
|
-
datasetLegislature
|
|
78
|
-
} of iterLoadAssembleeItems(dataDir, legislature, datasets.acteursEtOrganes, ActeursEtOrganesConvert.toOrgane, ["organes"], "json", options)) {
|
|
79
|
-
yield {
|
|
80
|
-
organe,
|
|
81
|
-
datasetLegislature
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
export function* iterLoadAssembleeAmendements(dataDir, legislature, options = {}) {
|
|
86
|
-
for (const {
|
|
87
|
-
item: amendement,
|
|
88
|
-
datasetLegislature
|
|
89
|
-
} of iterLoadAssembleeItems(dataDir, legislature, datasets.amendements, AmendementsConvert.toAmendement, [], "json", options)) {
|
|
90
|
-
yield {
|
|
91
|
-
amendement,
|
|
92
|
-
datasetLegislature
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
export function* iterLoadAssembleeDocuments(dataDir, legislature, options = {}) {
|
|
97
|
-
for (const {
|
|
98
|
-
item: document,
|
|
99
|
-
datasetLegislature
|
|
100
|
-
} of iterLoadAssembleeItems(dataDir, legislature, datasets.dossiersLegislatifs, DossiersLegislatifsConvert.toDocument, ["documents"], "json", options)) {
|
|
101
|
-
yield {
|
|
102
|
-
document,
|
|
103
|
-
datasetLegislature
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
export function* iterLoadAssembleeDossiersParlementaires(dataDir, legislature, options = {}) {
|
|
108
|
-
for (const {
|
|
109
|
-
item: dossierParlementaire,
|
|
110
|
-
datasetLegislature
|
|
111
|
-
} of iterLoadAssembleeItems(dataDir, legislature, datasets.dossiersLegislatifs, DossiersLegislatifsConvert.toDossierParlementaire, ["dossiers"], "json", options)) {
|
|
112
|
-
yield {
|
|
113
|
-
dossierParlementaire,
|
|
114
|
-
datasetLegislature
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
export function* iterLoadAssembleeReunions(dataDir, legislature, options = {}) {
|
|
119
|
-
for (const {
|
|
120
|
-
item: reunion,
|
|
121
|
-
datasetLegislature
|
|
122
|
-
} of iterLoadAssembleeItems(dataDir, legislature, datasets.agendas, AgendasConvert.toReunion, [], "json", options)) {
|
|
123
|
-
yield {
|
|
124
|
-
reunion,
|
|
125
|
-
datasetLegislature
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
export function* iterLoadAssembleeScrutins(dataDir, legislature, options = {}) {
|
|
130
|
-
for (const {
|
|
131
|
-
item: scrutin,
|
|
132
|
-
datasetLegislature
|
|
133
|
-
} of iterLoadAssembleeItems(dataDir, legislature, datasets.scrutins, ScrutinsConvert.toScrutin, [], "json", options)) {
|
|
134
|
-
yield {
|
|
135
|
-
scrutin,
|
|
136
|
-
datasetLegislature
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
export function* iterLoadAssembleeQuestions(dataDir, legislature, options = {}) {
|
|
141
|
-
for (const {
|
|
142
|
-
item: question,
|
|
143
|
-
datasetLegislature
|
|
144
|
-
} of iterLoadAssembleeItems(dataDir, legislature, datasets.questions, QuestionsConvert.toQuestion, [], "json", options)) {
|
|
145
|
-
yield {
|
|
146
|
-
question,
|
|
147
|
-
datasetLegislature
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
export function* iterLoadAssembleeComptesRendus(dataDir, legislature, options = {}) {
|
|
152
|
-
for (const {
|
|
153
|
-
item: compteRendu,
|
|
154
|
-
datasetLegislature
|
|
155
|
-
} of iterLoadAssembleeItems(dataDir, legislature, datasets.comptesRendusSeances, ComptesRendusConvert.toCompteRendu, [], "xml", options)) {
|
|
156
|
-
yield {
|
|
157
|
-
compteRendu,
|
|
158
|
-
datasetLegislature
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
/// Load data from split files.
|
|
164
|
-
/// Deprecated: Use iterLoad... iterators instead.
|
|
165
|
-
export function loadAssembleeData(dataDir, enabledDatasets, legislature, {
|
|
166
|
-
log = false
|
|
167
|
-
} = {}) {
|
|
168
|
-
const acteurByUid = {};
|
|
169
|
-
const organeByUid = {};
|
|
170
|
-
if (enabledDatasets & EnabledDatasets.ActeursEtOrganes) {
|
|
171
|
-
for (const dataset of datasets.acteursEtOrganes) {
|
|
172
|
-
if (dataset.ignoreForWeb) {
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
|
|
176
|
-
continue;
|
|
177
|
-
}
|
|
178
|
-
const datasetDir = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
|
|
179
|
-
for (const acteurSplitPath of walkDir(datasetDir, ["acteurs"])) {
|
|
180
|
-
const acteurFilename = acteurSplitPath[acteurSplitPath.length - 1];
|
|
181
|
-
if (!acteurFilename.endsWith(".json")) {
|
|
182
|
-
continue;
|
|
183
|
-
}
|
|
184
|
-
const acteurFilePath = path.join(datasetDir, ...acteurSplitPath);
|
|
185
|
-
if (log) {
|
|
186
|
-
console.log(`Loading file: ${acteurFilePath}…`);
|
|
187
|
-
}
|
|
188
|
-
const acteurJson = fs.readFileSync(acteurFilePath, {
|
|
189
|
-
encoding: "utf8"
|
|
190
|
-
});
|
|
191
|
-
const acteur = ActeursEtOrganesConvert.toActeur(acteurJson);
|
|
192
|
-
// Keep the first existing "acteur", because the first wrapper is the most complete.
|
|
193
|
-
if (acteurByUid[acteur.uid] === undefined) {
|
|
194
|
-
acteurByUid[acteur.uid] = acteur;
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
for (const organeSplitPath of walkDir(datasetDir, ["organes"])) {
|
|
198
|
-
const organeFilename = organeSplitPath[organeSplitPath.length - 1];
|
|
199
|
-
if (!organeFilename.endsWith(".json")) {
|
|
200
|
-
continue;
|
|
201
|
-
}
|
|
202
|
-
const organeFilePath = path.join(datasetDir, ...organeSplitPath);
|
|
203
|
-
if (log) {
|
|
204
|
-
console.log(`Loading file: ${organeFilePath}…`);
|
|
205
|
-
}
|
|
206
|
-
const organeJson = fs.readFileSync(organeFilePath, {
|
|
207
|
-
encoding: "utf8"
|
|
208
|
-
});
|
|
209
|
-
const organe = ActeursEtOrganesConvert.toOrgane(organeJson);
|
|
210
|
-
// Keep the first existing "organe", because the first wrapper is the most complete.
|
|
211
|
-
if (organeByUid[organe.uid] === undefined) {
|
|
212
|
-
organeByUid[organe.uid] = organe;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
const reunionByUid = {};
|
|
218
|
-
const reunionsByDay = {};
|
|
219
|
-
const reunionsByDossierUid = {};
|
|
220
|
-
if (enabledDatasets & EnabledDatasets.Agendas) {
|
|
221
|
-
for (const dataset of datasets.agendas) {
|
|
222
|
-
if (dataset.ignoreForWeb) {
|
|
223
|
-
continue;
|
|
224
|
-
}
|
|
225
|
-
if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
|
|
226
|
-
continue;
|
|
227
|
-
}
|
|
228
|
-
const datasetDir = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
|
|
229
|
-
for (const reunionSplitPath of walkDir(datasetDir)) {
|
|
230
|
-
const reunionFilename = reunionSplitPath[reunionSplitPath.length - 1];
|
|
231
|
-
if (!reunionFilename.endsWith(".json")) {
|
|
232
|
-
continue;
|
|
233
|
-
}
|
|
234
|
-
const reunionFilePath = path.join(datasetDir, ...reunionSplitPath);
|
|
235
|
-
if (log) {
|
|
236
|
-
console.log(`Loading file: ${reunionFilePath}…`);
|
|
237
|
-
}
|
|
238
|
-
const reunionJson = fs.readFileSync(reunionFilePath, {
|
|
239
|
-
encoding: "utf8"
|
|
240
|
-
});
|
|
241
|
-
const reunion = AgendasConvert.toReunion(reunionJson);
|
|
242
|
-
if (reunionByUid[reunion.uid] === undefined) {
|
|
243
|
-
reunionByUid[reunion.uid] = reunion;
|
|
244
|
-
}
|
|
245
|
-
const day = reunion.timestampDebut.toISOString().split("T")[0];
|
|
246
|
-
let reunionsAtDay = reunionsByDay[day];
|
|
247
|
-
if (reunionsAtDay === undefined) {
|
|
248
|
-
reunionsAtDay = reunionsByDay[day] = [];
|
|
249
|
-
}
|
|
250
|
-
reunionsAtDay.push(reunion);
|
|
251
|
-
const odj = reunion.odj;
|
|
252
|
-
if (odj !== undefined) {
|
|
253
|
-
for (const pointOdj of odj.pointsOdj || []) {
|
|
254
|
-
for (const dossierLegislatifRef of pointOdj.dossiersLegislatifsRefs || []) {
|
|
255
|
-
let reunionsAtDossierUid = reunionsByDossierUid[dossierLegislatifRef];
|
|
256
|
-
if (reunionsAtDossierUid === undefined) {
|
|
257
|
-
reunionsAtDossierUid = reunionsByDossierUid[dossierLegislatifRef] = [];
|
|
258
|
-
}
|
|
259
|
-
reunionsAtDossierUid.push(reunion);
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
const amendementByUid = {};
|
|
267
|
-
if (enabledDatasets & EnabledDatasets.Amendements) {
|
|
268
|
-
for (const dataset of datasets.amendements) {
|
|
269
|
-
if (dataset.ignoreForWeb) {
|
|
270
|
-
continue;
|
|
271
|
-
}
|
|
272
|
-
if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
|
|
273
|
-
continue;
|
|
274
|
-
}
|
|
275
|
-
const datasetDir = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
|
|
276
|
-
for (const amendementSplitPath of walkDir(datasetDir)) {
|
|
277
|
-
const amendementFilename = amendementSplitPath[amendementSplitPath.length - 1];
|
|
278
|
-
if (!amendementFilename.endsWith(".json")) {
|
|
279
|
-
continue;
|
|
280
|
-
}
|
|
281
|
-
const amendementFilePath = path.join(datasetDir, ...amendementSplitPath);
|
|
282
|
-
if (log) {
|
|
283
|
-
console.log(`Loading file: ${amendementFilePath}…`);
|
|
284
|
-
}
|
|
285
|
-
const amendementJson = fs.readFileSync(amendementFilePath, {
|
|
286
|
-
encoding: "utf8"
|
|
287
|
-
});
|
|
288
|
-
const amendement = AmendementsConvert.toAmendement(amendementJson);
|
|
289
|
-
if (amendementByUid[amendement.uid] === undefined) {
|
|
290
|
-
amendementByUid[amendement.uid] = amendement;
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
const documentByUid = {};
|
|
296
|
-
const dossierParlementaireBySenatChemin = {};
|
|
297
|
-
const dossierParlementaireByTitreChemin = {};
|
|
298
|
-
const dossierParlementaireByUid = {};
|
|
299
|
-
if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
|
|
300
|
-
for (const dataset of datasets.dossiersLegislatifs) {
|
|
301
|
-
if (dataset.ignoreForWeb) {
|
|
302
|
-
continue;
|
|
303
|
-
}
|
|
304
|
-
if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
|
|
305
|
-
continue;
|
|
306
|
-
}
|
|
307
|
-
const datasetDir = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
|
|
308
|
-
for (const documentSplitPath of walkDir(datasetDir, ["documents"])) {
|
|
309
|
-
const documentFilename = documentSplitPath[documentSplitPath.length - 1];
|
|
310
|
-
if (!documentFilename.endsWith(".json")) {
|
|
311
|
-
continue;
|
|
312
|
-
}
|
|
313
|
-
const documentFilePath = path.join(datasetDir, ...documentSplitPath);
|
|
314
|
-
if (log) {
|
|
315
|
-
console.log(`Loading file: ${documentFilePath}…`);
|
|
316
|
-
}
|
|
317
|
-
const documentJson = fs.readFileSync(documentFilePath, {
|
|
318
|
-
encoding: "utf8"
|
|
319
|
-
});
|
|
320
|
-
const document = DossiersLegislatifsConvert.toDocument(documentJson);
|
|
321
|
-
if (documentByUid[document.uid] === undefined) {
|
|
322
|
-
documentByUid[document.uid] = document;
|
|
323
|
-
}
|
|
324
|
-
}
|
|
325
|
-
for (const dossierSplitPath of walkDir(datasetDir, ["dossiers"])) {
|
|
326
|
-
const dossierFilename = dossierSplitPath[dossierSplitPath.length - 1];
|
|
327
|
-
if (!dossierFilename.endsWith(".json")) {
|
|
328
|
-
continue;
|
|
329
|
-
}
|
|
330
|
-
const dossierFilePath = path.join(datasetDir, ...dossierSplitPath);
|
|
331
|
-
if (log) {
|
|
332
|
-
console.log(`Loading file: ${dossierFilePath}…`);
|
|
333
|
-
}
|
|
334
|
-
const dossierJson = fs.readFileSync(dossierFilePath, {
|
|
335
|
-
encoding: "utf8"
|
|
336
|
-
});
|
|
337
|
-
const dossier = DossiersLegislatifsConvert.toDossierParlementaire(dossierJson);
|
|
338
|
-
const titreDossier = dossier.titreDossier;
|
|
339
|
-
if (titreDossier.senatChemin && dossierParlementaireBySenatChemin[titreDossier.senatChemin] === undefined) {
|
|
340
|
-
dossierParlementaireBySenatChemin[titreDossier.senatChemin] = dossier;
|
|
341
|
-
}
|
|
342
|
-
if (titreDossier.titreChemin && dossierParlementaireByTitreChemin[titreDossier.titreChemin] === undefined) {
|
|
343
|
-
dossierParlementaireByTitreChemin[titreDossier.titreChemin] = dossier;
|
|
344
|
-
}
|
|
345
|
-
if (dossierParlementaireByUid[dossier.uid] === undefined) {
|
|
346
|
-
dossierParlementaireByUid[dossier.uid] = dossier;
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
let photoByUid = {};
|
|
352
|
-
if (enabledDatasets & EnabledDatasets.Photos) {
|
|
353
|
-
{
|
|
354
|
-
const jsonFilePath = path.join(dataDir, `photos_deputes_${
|
|
355
|
-
// TODO: Handle Legislature.All.
|
|
356
|
-
legislature === Legislature.All ? Legislature.DixSept : legislature}`, "deputes.json");
|
|
357
|
-
if (fs.existsSync(jsonFilePath)) {
|
|
358
|
-
if (log) {
|
|
359
|
-
console.log(`Loading file: ${jsonFilePath}`);
|
|
360
|
-
}
|
|
361
|
-
const json = fs.readFileSync(jsonFilePath, {
|
|
362
|
-
encoding: "utf8"
|
|
363
|
-
});
|
|
364
|
-
Object.assign(photoByUid, JSON.parse(json));
|
|
365
|
-
} else if (log) {
|
|
366
|
-
console.log(`Ignoring missing file: ${jsonFilePath}`);
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
{
|
|
370
|
-
const jsonFilePath = path.join(dataDir, "photos_senateurs", "senateurs.json");
|
|
371
|
-
if (fs.existsSync(jsonFilePath)) {
|
|
372
|
-
if (log) {
|
|
373
|
-
console.log(`Loading file: ${jsonFilePath}`);
|
|
374
|
-
}
|
|
375
|
-
const json = fs.readFileSync(jsonFilePath, {
|
|
376
|
-
encoding: "utf8"
|
|
377
|
-
});
|
|
378
|
-
Object.assign(photoByUid, JSON.parse(json));
|
|
379
|
-
} else if (log) {
|
|
380
|
-
console.log(`Ignoring missing file: ${jsonFilePath}`);
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
const scrutinByUid = {};
|
|
385
|
-
if (enabledDatasets & EnabledDatasets.Scrutins) {
|
|
386
|
-
for (const dataset of datasets.scrutins) {
|
|
387
|
-
if (dataset.ignoreForWeb) {
|
|
388
|
-
continue;
|
|
389
|
-
}
|
|
390
|
-
if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
|
|
391
|
-
continue;
|
|
392
|
-
}
|
|
393
|
-
const datasetDir = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
|
|
394
|
-
for (const scrutinSplitPath of walkDir(datasetDir)) {
|
|
395
|
-
const scrutinFilename = scrutinSplitPath[scrutinSplitPath.length - 1];
|
|
396
|
-
if (!scrutinFilename.endsWith(".json")) {
|
|
397
|
-
continue;
|
|
398
|
-
}
|
|
399
|
-
const scrutinFilePath = path.join(datasetDir, ...scrutinSplitPath);
|
|
400
|
-
if (log) {
|
|
401
|
-
console.log(`Loading file: ${scrutinFilePath}…`);
|
|
402
|
-
}
|
|
403
|
-
const scrutinJson = fs.readFileSync(scrutinFilePath, {
|
|
404
|
-
encoding: "utf8"
|
|
405
|
-
});
|
|
406
|
-
const scrutin = ScrutinsConvert.toScrutin(scrutinJson);
|
|
407
|
-
if (scrutinByUid[scrutin.uid] === undefined) {
|
|
408
|
-
scrutinByUid[scrutin.uid] = scrutin;
|
|
409
|
-
}
|
|
410
|
-
}
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
const questionByUid = {};
|
|
414
|
-
if (enabledDatasets & EnabledDatasets.Questions) {
|
|
415
|
-
for (const dataset of datasets.questions) {
|
|
416
|
-
if (dataset.ignoreForWeb) {
|
|
417
|
-
continue;
|
|
418
|
-
}
|
|
419
|
-
if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
|
|
420
|
-
continue;
|
|
421
|
-
}
|
|
422
|
-
const datasetDir = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
|
|
423
|
-
for (const questionSplitPath of walkDir(datasetDir)) {
|
|
424
|
-
const questionFilename = questionSplitPath[questionSplitPath.length - 1];
|
|
425
|
-
if (!questionFilename.endsWith(".json")) {
|
|
426
|
-
continue;
|
|
427
|
-
}
|
|
428
|
-
const questionFilePath = path.join(datasetDir, ...questionSplitPath);
|
|
429
|
-
if (log) {
|
|
430
|
-
console.log(`Loading file: ${questionFilePath}…`);
|
|
431
|
-
}
|
|
432
|
-
const questionJson = fs.readFileSync(questionFilePath, {
|
|
433
|
-
encoding: "utf8"
|
|
434
|
-
});
|
|
435
|
-
const question = QuestionsConvert.toQuestion(questionJson);
|
|
436
|
-
if (questionByUid[question.uid] === undefined) {
|
|
437
|
-
questionByUid[question.uid] = question;
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
}
|
|
442
|
-
const compteRenduByUid = {};
|
|
443
|
-
if (enabledDatasets & EnabledDatasets.ComptesRendusSeances) {
|
|
444
|
-
for (const dataset of datasets.comptesRendusSeances) {
|
|
445
|
-
if (dataset.ignoreForWeb) {
|
|
446
|
-
continue;
|
|
447
|
-
}
|
|
448
|
-
if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
|
|
449
|
-
continue;
|
|
450
|
-
}
|
|
451
|
-
const datasetDir = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye"));
|
|
452
|
-
for (const compteRenduPath of walkDir(datasetDir)) {
|
|
453
|
-
const compteRenduFilename = compteRenduPath[compteRenduPath.length - 1];
|
|
454
|
-
if (!compteRenduFilename.endsWith(".json")) {
|
|
455
|
-
continue;
|
|
456
|
-
}
|
|
457
|
-
const compteRenduFilePath = path.join(datasetDir, ...compteRenduPath);
|
|
458
|
-
if (log) {
|
|
459
|
-
console.log(`Loading file: ${compteRenduFilePath}…`);
|
|
460
|
-
}
|
|
461
|
-
const compteRenduJson = fs.readFileSync(compteRenduFilePath, {
|
|
462
|
-
encoding: "utf8"
|
|
463
|
-
});
|
|
464
|
-
const compteRendu = ComptesRendusConvert.toCompteRendu(compteRenduJson);
|
|
465
|
-
if (compteRenduByUid[compteRendu.uid] === undefined) {
|
|
466
|
-
compteRenduByUid[compteRendu.uid] = compteRendu;
|
|
467
|
-
}
|
|
468
|
-
}
|
|
469
|
-
}
|
|
470
|
-
}
|
|
471
|
-
return {
|
|
472
|
-
acteurByUid,
|
|
473
|
-
amendementByUid,
|
|
474
|
-
documentByUid,
|
|
475
|
-
dossierParlementaireBySenatChemin,
|
|
476
|
-
dossierParlementaireByTitreChemin,
|
|
477
|
-
dossierParlementaireByUid,
|
|
478
|
-
organeByUid,
|
|
479
|
-
photoByUid,
|
|
480
|
-
reunionByUid,
|
|
481
|
-
reunionsByDay,
|
|
482
|
-
reunionsByDossierUid,
|
|
483
|
-
scrutinByUid,
|
|
484
|
-
questionByUid,
|
|
485
|
-
compteRenduByUid
|
|
486
|
-
};
|
|
487
|
-
}
|
|
488
|
-
|
|
489
|
-
/// Load data from big monolytic files.
|
|
490
|
-
/// Deprecated: Assemblée nationale open data no more uses monolytic files.
|
|
491
|
-
export function loadAssembleeDataFromBigFiles(dataDir, enabledDatasets, legislature, {
|
|
492
|
-
log = false
|
|
493
|
-
} = {}) {
|
|
494
|
-
const acteurByUid = {};
|
|
495
|
-
const organeByUid = {};
|
|
496
|
-
if (enabledDatasets & EnabledDatasets.ActeursEtOrganes) {
|
|
497
|
-
for (const dataset of datasets.acteursEtOrganes) {
|
|
498
|
-
if (dataset.ignoreForWeb) {
|
|
499
|
-
continue;
|
|
500
|
-
}
|
|
501
|
-
if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
|
|
502
|
-
continue;
|
|
503
|
-
}
|
|
504
|
-
const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
|
|
505
|
-
if (log) {
|
|
506
|
-
console.log(`Loading file: ${jsonFilePath}`);
|
|
507
|
-
}
|
|
508
|
-
const json = fs.readFileSync(jsonFilePath, {
|
|
509
|
-
encoding: "utf8"
|
|
510
|
-
});
|
|
511
|
-
const acteursEtOrganes = ActeursEtOrganesConvert.toActeursEtOrganes(json);
|
|
512
|
-
for (const acteur of acteursEtOrganes.acteurs) {
|
|
513
|
-
// Keep the first existing "acteur", because the first wrapper is the most complete.
|
|
514
|
-
if (acteurByUid[acteur.uid] === undefined) {
|
|
515
|
-
acteurByUid[acteur.uid] = acteur;
|
|
516
|
-
}
|
|
517
|
-
}
|
|
518
|
-
for (const organe of acteursEtOrganes.organes) {
|
|
519
|
-
// Keep the first existing "organe", because the first wrapper is the most complete.
|
|
520
|
-
if (organeByUid[organe.uid] === undefined) {
|
|
521
|
-
organeByUid[organe.uid] = organe;
|
|
522
|
-
}
|
|
523
|
-
}
|
|
524
|
-
}
|
|
525
|
-
}
|
|
526
|
-
const reunionByUid = {};
|
|
527
|
-
const reunionsByDay = {};
|
|
528
|
-
const reunionsByDossierUid = {};
|
|
529
|
-
if (enabledDatasets & EnabledDatasets.Agendas) {
|
|
530
|
-
for (const dataset of datasets.agendas) {
|
|
531
|
-
if (dataset.ignoreForWeb) {
|
|
532
|
-
continue;
|
|
533
|
-
}
|
|
534
|
-
if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
|
|
535
|
-
continue;
|
|
536
|
-
}
|
|
537
|
-
const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
|
|
538
|
-
if (log) {
|
|
539
|
-
console.log(`Loading file: ${jsonFilePath}`);
|
|
540
|
-
}
|
|
541
|
-
const json = fs.readFileSync(jsonFilePath, {
|
|
542
|
-
encoding: "utf8"
|
|
543
|
-
});
|
|
544
|
-
const agendas = AgendasConvert.toAgendas(json);
|
|
545
|
-
for (const reunion of agendas.reunions) {
|
|
546
|
-
if (reunionByUid[reunion.uid] === undefined) {
|
|
547
|
-
reunionByUid[reunion.uid] = reunion;
|
|
548
|
-
}
|
|
549
|
-
const day = reunion.timestampDebut.toISOString().split("T")[0];
|
|
550
|
-
let reunionsAtDay = reunionsByDay[day];
|
|
551
|
-
if (reunionsAtDay === undefined) {
|
|
552
|
-
reunionsAtDay = reunionsByDay[day] = [];
|
|
553
|
-
}
|
|
554
|
-
reunionsAtDay.push(reunion);
|
|
555
|
-
const odj = reunion.odj;
|
|
556
|
-
if (odj !== undefined) {
|
|
557
|
-
for (const pointOdj of odj.pointsOdj || []) {
|
|
558
|
-
for (const dossierLegislatifRef of pointOdj.dossiersLegislatifsRefs || []) {
|
|
559
|
-
let reunionsAtDossierUid = reunionsByDossierUid[dossierLegislatifRef];
|
|
560
|
-
if (reunionsAtDossierUid === undefined) {
|
|
561
|
-
reunionsAtDossierUid = reunionsByDossierUid[dossierLegislatifRef] = [];
|
|
562
|
-
}
|
|
563
|
-
reunionsAtDossierUid.push(reunion);
|
|
564
|
-
}
|
|
565
|
-
}
|
|
566
|
-
}
|
|
567
|
-
}
|
|
568
|
-
}
|
|
569
|
-
}
|
|
570
|
-
const amendementByUid = {};
|
|
571
|
-
if (enabledDatasets & EnabledDatasets.Amendements) {
|
|
572
|
-
for (const dataset of datasets.amendements) {
|
|
573
|
-
if (dataset.ignoreForWeb) {
|
|
574
|
-
continue;
|
|
575
|
-
}
|
|
576
|
-
if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
|
|
577
|
-
continue;
|
|
578
|
-
}
|
|
579
|
-
const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
|
|
580
|
-
if (log) {
|
|
581
|
-
console.log(`Loading file: ${jsonFilePath}`);
|
|
582
|
-
}
|
|
583
|
-
const json = fs.readFileSync(jsonFilePath, {
|
|
584
|
-
encoding: "utf8"
|
|
585
|
-
});
|
|
586
|
-
const amendements = AmendementsConvert.toAmendements(json);
|
|
587
|
-
for (const texteLegislatif of amendements.textesLegislatifs) {
|
|
588
|
-
for (const amendement of texteLegislatif.amendements) {
|
|
589
|
-
if (amendementByUid[amendement.uid] === undefined) {
|
|
590
|
-
amendementByUid[amendement.uid] = amendement;
|
|
591
|
-
}
|
|
592
|
-
}
|
|
593
|
-
}
|
|
594
|
-
}
|
|
595
|
-
}
|
|
596
|
-
const documentByUid = {};
|
|
597
|
-
const dossierParlementaireBySenatChemin = {};
|
|
598
|
-
const dossierParlementaireByTitreChemin = {};
|
|
599
|
-
const dossierParlementaireByUid = {};
|
|
600
|
-
if (enabledDatasets & EnabledDatasets.DossiersLegislatifs) {
|
|
601
|
-
for (const dataset of datasets.dossiersLegislatifs) {
|
|
602
|
-
if (dataset.ignoreForWeb) {
|
|
603
|
-
continue;
|
|
604
|
-
}
|
|
605
|
-
if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
|
|
606
|
-
continue;
|
|
607
|
-
}
|
|
608
|
-
const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
|
|
609
|
-
if (log) {
|
|
610
|
-
console.log(`Loading file: ${jsonFilePath}`);
|
|
611
|
-
}
|
|
612
|
-
const json = fs.readFileSync(jsonFilePath, {
|
|
613
|
-
encoding: "utf8"
|
|
614
|
-
});
|
|
615
|
-
const dossiersLegislatifs = DossiersLegislatifsConvert.toDossiersLegislatifs(json);
|
|
616
|
-
for (const document of dossiersLegislatifs.textesLegislatifs) {
|
|
617
|
-
if (documentByUid[document.uid] === undefined) {
|
|
618
|
-
documentByUid[document.uid] = document;
|
|
619
|
-
}
|
|
620
|
-
}
|
|
621
|
-
for (const dossier of dossiersLegislatifs.dossiersParlementaires) {
|
|
622
|
-
const titreDossier = dossier.titreDossier;
|
|
623
|
-
if (titreDossier.senatChemin && dossierParlementaireBySenatChemin[titreDossier.senatChemin] === undefined) {
|
|
624
|
-
dossierParlementaireBySenatChemin[titreDossier.senatChemin] = dossier;
|
|
625
|
-
}
|
|
626
|
-
if (titreDossier.titreChemin && dossierParlementaireByTitreChemin[titreDossier.titreChemin] === undefined) {
|
|
627
|
-
dossierParlementaireByTitreChemin[titreDossier.titreChemin] = dossier;
|
|
628
|
-
}
|
|
629
|
-
if (dossierParlementaireByUid[dossier.uid] === undefined) {
|
|
630
|
-
dossierParlementaireByUid[dossier.uid] = dossier;
|
|
631
|
-
}
|
|
632
|
-
}
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
const photoByUid = {};
|
|
636
|
-
if (enabledDatasets & EnabledDatasets.Photos) {
|
|
637
|
-
const photoByUid = {};
|
|
638
|
-
{
|
|
639
|
-
const jsonFilePath = path.join(dataDir, `photos_deputes_${
|
|
640
|
-
// TODO: Handle Legislature.All.
|
|
641
|
-
legislature === Legislature.All ? Legislature.DixSept : legislature}`, "deputes.json");
|
|
642
|
-
if (fs.existsSync(jsonFilePath)) {
|
|
643
|
-
if (log) {
|
|
644
|
-
console.log(`Loading file: ${jsonFilePath}`);
|
|
645
|
-
}
|
|
646
|
-
const json = fs.readFileSync(jsonFilePath, {
|
|
647
|
-
encoding: "utf8"
|
|
648
|
-
});
|
|
649
|
-
Object.assign(photoByUid, JSON.parse(json));
|
|
650
|
-
} else if (log) {
|
|
651
|
-
console.log(`Ignoring missing file: ${jsonFilePath}`);
|
|
652
|
-
}
|
|
653
|
-
}
|
|
654
|
-
{
|
|
655
|
-
const jsonFilePath = path.join(dataDir, "photos_senateurs", "senateurs.json");
|
|
656
|
-
if (fs.existsSync(jsonFilePath)) {
|
|
657
|
-
if (log) {
|
|
658
|
-
console.log(`Loading file: ${jsonFilePath}`);
|
|
659
|
-
}
|
|
660
|
-
const json = fs.readFileSync(jsonFilePath, {
|
|
661
|
-
encoding: "utf8"
|
|
662
|
-
});
|
|
663
|
-
Object.assign(photoByUid, JSON.parse(json));
|
|
664
|
-
} else if (log) {
|
|
665
|
-
console.log(`Ignoring missing file: ${jsonFilePath}`);
|
|
666
|
-
}
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
const scrutinByUid = {};
|
|
670
|
-
if (enabledDatasets & EnabledDatasets.Scrutins) {
|
|
671
|
-
for (const dataset of datasets.scrutins) {
|
|
672
|
-
if (dataset.ignoreForWeb) {
|
|
673
|
-
continue;
|
|
674
|
-
}
|
|
675
|
-
if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
|
|
676
|
-
continue;
|
|
677
|
-
}
|
|
678
|
-
const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
|
|
679
|
-
if (log) {
|
|
680
|
-
console.log(`Loading file: ${jsonFilePath}`);
|
|
681
|
-
}
|
|
682
|
-
const json = fs.readFileSync(jsonFilePath, {
|
|
683
|
-
encoding: "utf8"
|
|
684
|
-
});
|
|
685
|
-
const scrutins = ScrutinsConvert.toScrutins(json);
|
|
686
|
-
for (const scrutin of scrutins.scrutins) {
|
|
687
|
-
if (scrutinByUid[scrutin.uid] === undefined) {
|
|
688
|
-
scrutinByUid[scrutin.uid] = scrutin;
|
|
689
|
-
}
|
|
690
|
-
}
|
|
691
|
-
}
|
|
692
|
-
}
|
|
693
|
-
const questionByUid = {};
|
|
694
|
-
if (enabledDatasets & EnabledDatasets.Questions) {
|
|
695
|
-
for (const dataset of datasets.questions) {
|
|
696
|
-
if (dataset.ignoreForWeb) {
|
|
697
|
-
continue;
|
|
698
|
-
}
|
|
699
|
-
if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
|
|
700
|
-
continue;
|
|
701
|
-
}
|
|
702
|
-
const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
|
|
703
|
-
if (log) {
|
|
704
|
-
console.log(`Loading file: ${jsonFilePath}`);
|
|
705
|
-
}
|
|
706
|
-
const json = fs.readFileSync(jsonFilePath, {
|
|
707
|
-
encoding: "utf8"
|
|
708
|
-
});
|
|
709
|
-
const questions = QuestionsConvert.toQuestions(json);
|
|
710
|
-
for (const question of questions.questions) {
|
|
711
|
-
if (questionByUid[question.uid] === undefined) {
|
|
712
|
-
questionByUid[question.uid] = question;
|
|
713
|
-
}
|
|
714
|
-
}
|
|
715
|
-
}
|
|
716
|
-
}
|
|
717
|
-
const compteRenduByUid = {};
|
|
718
|
-
if (enabledDatasets & EnabledDatasets.ComptesRendusSeances) {
|
|
719
|
-
for (const dataset of datasets.comptesRendusSeances) {
|
|
720
|
-
if (dataset.ignoreForWeb) {
|
|
721
|
-
continue;
|
|
722
|
-
}
|
|
723
|
-
if (legislature !== Legislature.All && dataset.legislature !== Legislature.All && legislature !== dataset.legislature) {
|
|
724
|
-
continue;
|
|
725
|
-
}
|
|
726
|
-
const jsonFilePath = path.join(dataDir, dataset.filename.replace(/\.json$/, "_nettoye.json"));
|
|
727
|
-
if (log) {
|
|
728
|
-
console.log(`Loading file: ${jsonFilePath}`);
|
|
729
|
-
}
|
|
730
|
-
const json = fs.readFileSync(jsonFilePath, {
|
|
731
|
-
encoding: "utf8"
|
|
732
|
-
});
|
|
733
|
-
const comptesRendus = ComptesRendusConvert.toComptesRendus(json);
|
|
734
|
-
for (const compteRendu of comptesRendus.comptesRendus) {
|
|
735
|
-
if (compteRenduByUid[compteRendu.uid] === undefined) {
|
|
736
|
-
compteRenduByUid[compteRendu.uid] = compteRendu;
|
|
737
|
-
}
|
|
738
|
-
}
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
return {
|
|
742
|
-
acteurByUid,
|
|
743
|
-
amendementByUid,
|
|
744
|
-
documentByUid,
|
|
745
|
-
dossierParlementaireBySenatChemin,
|
|
746
|
-
dossierParlementaireByTitreChemin,
|
|
747
|
-
dossierParlementaireByUid,
|
|
748
|
-
organeByUid,
|
|
749
|
-
photoByUid,
|
|
750
|
-
reunionByUid,
|
|
751
|
-
reunionsByDay,
|
|
752
|
-
reunionsByDossierUid,
|
|
753
|
-
scrutinByUid,
|
|
754
|
-
questionByUid,
|
|
755
|
-
compteRenduByUid
|
|
756
|
-
};
|
|
757
|
-
}
|
|
758
|
-
|
|
759
|
-
/**
|
|
760
|
-
* Read infos of a document or a division of a document from file system
|
|
761
|
-
*
|
|
762
|
-
* @param dataDir
|
|
763
|
-
* @param uid UID of a document or a division
|
|
764
|
-
* @param formats requested formats of the document in decreasing preference order
|
|
765
|
-
*/
|
|
766
|
-
export function loadAssembleeDocumentFile(dataDir, uid, formats) {
|
|
767
|
-
const documentsDir = path.join(dataDir, "Documents");
|
|
768
|
-
const documentDir = pathFromDocumentUid(documentsDir, uid);
|
|
769
|
-
const indexPath = path.join(documentDir, "index.json");
|
|
770
|
-
if (!fs.pathExistsSync(indexPath)) {
|
|
771
|
-
return undefined;
|
|
772
|
-
}
|
|
773
|
-
const index = fs.readJsonSync(indexPath);
|
|
774
|
-
for (const format of formats) {
|
|
775
|
-
for (const {
|
|
776
|
-
filename,
|
|
777
|
-
url
|
|
778
|
-
} of index[format] ?? []) {
|
|
779
|
-
if (filename === undefined) {
|
|
780
|
-
continue;
|
|
781
|
-
}
|
|
782
|
-
return {
|
|
783
|
-
format,
|
|
784
|
-
path: path.join(documentDir, filename),
|
|
785
|
-
url
|
|
786
|
-
};
|
|
787
|
-
}
|
|
788
|
-
}
|
|
789
|
-
return undefined;
|
|
790
|
-
}
|
|
791
|
-
export function loadAssembleePhotosDeputes(dataDir, legislature, {
|
|
792
|
-
log = false
|
|
793
|
-
} = {}) {
|
|
794
|
-
const jsonFilePath = path.join(dataDir, `photos_deputes_${
|
|
795
|
-
// TODO: Handle Legislature.All.
|
|
796
|
-
legislature === Legislature.All ? Legislature.DixSept : legislature}`, "deputes.json");
|
|
797
|
-
if (log) {
|
|
798
|
-
console.log(`Loading file: ${jsonFilePath}`);
|
|
799
|
-
}
|
|
800
|
-
const json = fs.readFileSync(jsonFilePath, {
|
|
801
|
-
encoding: "utf8"
|
|
802
|
-
});
|
|
803
|
-
return JSON.parse(json);
|
|
804
|
-
}
|
|
805
|
-
export function loadAssembleePhotosSenateurs(dataDir, {
|
|
806
|
-
log = false
|
|
807
|
-
} = {}) {
|
|
808
|
-
const jsonFilePath = path.join(dataDir, "photos_senateurs", "senateurs.json");
|
|
809
|
-
if (log) {
|
|
810
|
-
console.log(`Loading file: ${jsonFilePath}`);
|
|
811
|
-
}
|
|
812
|
-
const json = fs.readFileSync(jsonFilePath, {
|
|
813
|
-
encoding: "utf8"
|
|
814
|
-
});
|
|
815
|
-
return JSON.parse(json);
|
|
816
|
-
}
|
|
817
|
-
export function pathFromDocumentUid(documentsDir, uid) {
|
|
818
|
-
const match = uid.match(documentUidRegex);
|
|
819
|
-
assert.notStrictEqual(match, null, `Unexpected structure for document UID: ${uid}`);
|
|
820
|
-
const groups = match.groups;
|
|
821
|
-
const documentType = path.join(documentsDir, groups.documentType ?? groups.documentType2);
|
|
822
|
-
const chambreDir = path.join(documentType, groups.chambre ?? groups.chambre2);
|
|
823
|
-
const republiqueDir = path.join(chambreDir, groups.republique ?? groups.republique2);
|
|
824
|
-
const legislatureDir = path.join(republiqueDir, groups.legislature ?? groups.legislature2);
|
|
825
|
-
const etat = groups.etat;
|
|
826
|
-
if (etat === undefined) {
|
|
827
|
-
fs.ensureDirSync(legislatureDir);
|
|
828
|
-
return path.join(legislatureDir, uid);
|
|
829
|
-
}
|
|
830
|
-
const etatDir = path.join(legislatureDir, etat);
|
|
831
|
-
let numero = "000000" + (groups.numero ?? groups.numero2);
|
|
832
|
-
numero = numero.substring(numero.length - 6);
|
|
833
|
-
const numeroMilliersDir = path.join(etatDir, numero.substring(0, 3));
|
|
834
|
-
fs.ensureDirSync(numeroMilliersDir);
|
|
835
|
-
return path.join(numeroMilliersDir, uid);
|
|
836
|
-
}
|
|
837
|
-
export function pathFromDossierParlementaireUid(dossiersDir, uid) {
|
|
838
|
-
return pathFromUid(dossiersDir, uid, dossierUidRegex);
|
|
839
|
-
}
|
|
840
|
-
export function pathFromReunionUid(reunionsDir, uid) {
|
|
841
|
-
const match = reunionUidRegex.exec(uid);
|
|
842
|
-
assert.notStrictEqual(match, null, `Unexpected structure for reunion UID: ${uid}`);
|
|
843
|
-
const chambreDir = path.join(reunionsDir, match[1]);
|
|
844
|
-
const republiqueDir = path.join(chambreDir, match[2]);
|
|
845
|
-
const legislatureDir = path.join(republiqueDir, match[3]);
|
|
846
|
-
const sessionDir = path.join(legislatureDir, match[4]);
|
|
847
|
-
const idDir = path.join(sessionDir, match[5]);
|
|
848
|
-
let numero = "000000000" + match[6];
|
|
849
|
-
numero = numero.substring(numero.length - 9);
|
|
850
|
-
const numeroMillionsDir = path.join(idDir, numero.substring(0, 3));
|
|
851
|
-
const numeroMilliersDir = path.join(numeroMillionsDir, numero.substring(3, 3));
|
|
852
|
-
fs.ensureDirSync(numeroMilliersDir);
|
|
853
|
-
return path.join(numeroMilliersDir, uid);
|
|
854
|
-
}
|
|
855
|
-
export function pathFromScrutinUid(scrutinsDir, uid) {
|
|
856
|
-
const match = scrutinUidRegex.exec(uid);
|
|
857
|
-
assert.notStrictEqual(match, null, `Unexpected structure for scrutin UID: ${uid}`);
|
|
858
|
-
const chambreDir = path.join(scrutinsDir, match[1]);
|
|
859
|
-
const republiqueDir = path.join(chambreDir, match[2]);
|
|
860
|
-
const legislatureDir = path.join(republiqueDir, match[3]);
|
|
861
|
-
let numero = "000000" + match[4];
|
|
862
|
-
numero = numero.substring(numero.length - 6);
|
|
863
|
-
const numeroMilliersDir = path.join(legislatureDir, numero.substring(0, 3));
|
|
864
|
-
fs.ensureDirSync(numeroMilliersDir);
|
|
865
|
-
return path.join(numeroMilliersDir, uid);
|
|
866
|
-
}
|
|
867
|
-
export function pathFromQuestionUid(dataDir, uid) {
|
|
868
|
-
return pathFromUid(dataDir, uid, questionUidRegex);
|
|
869
|
-
}
|
|
870
|
-
export function pathFromCompteRenduUid(dataDir, uid) {
|
|
871
|
-
return pathFromUid(dataDir, uid, compteRenduUidRegex);
|
|
872
|
-
}
|
|
873
|
-
|
|
874
|
-
// Get standard path for object with uid : republique > legislature > group objects by thousands
|
|
875
|
-
function pathFromUid(dataDir, uid, dataRegexp) {
|
|
876
|
-
const match = dataRegexp.exec(uid);
|
|
877
|
-
assert.notStrictEqual(match, null, `Unexpected structure for object with UID: ${uid}`);
|
|
878
|
-
const republiqueDir = path.join(dataDir, match[1]);
|
|
879
|
-
const legislatureDir = path.join(republiqueDir, match[2]);
|
|
880
|
-
let numero = "000000" + match[3];
|
|
881
|
-
numero = numero.substring(numero.length - 6);
|
|
882
|
-
const numeroMilliersDir = path.join(legislatureDir, numero.substring(0, 3));
|
|
883
|
-
fs.ensureDirSync(numeroMilliersDir);
|
|
884
|
-
return path.join(numeroMilliersDir, uid);
|
|
885
|
-
}
|
|
886
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJmcyIsInBhdGgiLCJFbmFibGVkRGF0YXNldHMiLCJkYXRhc2V0cyIsIndhbGtEaXIiLCJDb252ZXJ0IiwiQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQiLCJBZ2VuZGFzQ29udmVydCIsIkFtZW5kZW1lbnRzQ29udmVydCIsIkRvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0IiwiTGVnaXNsYXR1cmUiLCJTY3J1dGluc0NvbnZlcnQiLCJRdWVzdGlvbnNDb252ZXJ0IiwiQ29tcHRlc1JlbmR1c0NvbnZlcnQiLCJkb2N1bWVudFVpZFJlZ2V4IiwiZG9zc2llclVpZFJlZ2V4IiwicmV1bmlvblVpZFJlZ2V4Iiwic2NydXRpblVpZFJlZ2V4IiwiY29tcHRlUmVuZHVVaWRSZWdleCIsInF1ZXN0aW9uVWlkUmVnZXgiLCJpdGVyTG9hZEFzc2VtYmxlZUl0ZW1zIiwiZGF0YURpciIsImxlZ2lzbGF0dXJlIiwiY29udmVydFRvSXRlbSIsInN1YmZvbGRlck5hbWUiLCJmaWxlRXh0ZW5zaW9uIiwibm9WYWxpZGF0aW9uIiwibG9nIiwiaXRlbVVpZCIsIlNldCIsImRhdGFzZXQiLCJpZ25vcmVGb3JXZWIiLCJ1bmRlZmluZWQiLCJBbGwiLCJmaWxlRXh0ZW5zaW9uUmVnZXgiLCJSZWdFeHAiLCJkYXRhc2V0RGlyIiwiam9pbiIsImZpbGVuYW1lIiwicmVwbGFjZSIsIml0ZW1TcGxpdFBhdGgiLCJpdGVtRmlsZW5hbWUiLCJsZW5ndGgiLCJlbmRzV2l0aCIsIml0ZW1GaWxlUGF0aCIsImNvbnNvbGUiLCJpdGVtSnNvbiIsInJlYWRGaWxlU3luYyIsImVuY29kaW5nIiwiaXRlbSIsIkpTT04iLCJwYXJzZSIsImhhcyIsInVpZCIsImFkZCIsImRhdGFzZXRMZWdpc2xhdHVyZSIsIml0ZXJMb2FkQXNzZW1ibGVlQWN0ZXVycyIsIm9wdGlvbnMiLCJhY3RldXIiLCJhY3RldXJzRXRPcmdhbmVzIiwidG9BY3RldXIiLCJpdGVyTG9hZEFzc2VtYmxlZU9yZ2FuZXMiLCJvcmdhbmUiLCJ0b09yZ2FuZSIsIml0ZXJMb2FkQXNzZW1ibGVlQW1lbmRlbWVudHMiLCJhbWVuZGVtZW50IiwiYW1lbmRlbWVudHMiLCJ0b0FtZW5kZW1lbnQiLCJpdGVyTG9hZEFzc2VtYmxlZURvY3VtZW50cyIsImRvY3VtZW50IiwiZG9zc2llcnNMZWdpc2xhdGlmcyIsInRvRG9jdW1lbnQiLCJpdGVyTG9hZEFzc2VtYmxlZURvc3NpZXJzUGFybGVtZW50YWlyZXMiLCJkb3NzaWVyUGFybGVtZW50YWlyZSIsInRvRG9zc2llclBhcmxlbWVudGFpcmUiLCJpdGVyTG9hZEFzc2VtYmxlZVJldW5pb25zIiwicmV1bmlvbiIsImFnZW5kYXMiLCJ0b1JldW5pb24iLCJpdGVyTG9hZEFzc2VtYmxlZVNjcnV0aW5zIiwic2NydXRpbiIsInNjcnV0aW5zIiwidG9TY3J1dGluIiwiaXRlckxvYWRBc3NlbWJsZWVRdWVzdGlvbnMiLCJxdWVzdGlvbiIsInF1ZXN0aW9ucyIsInRvUXVlc3Rpb24iLCJpdGVyTG9hZEFzc2VtYmxlZUNvbXB0ZXNSZW5kdXMiLCJjb21wdGVSZW5kdSIsImNvbXB0ZXNSZW5kdXNTZWFuY2VzIiwidG9Db21wdGVSZW5kdSIsImxvYWRBc3NlbWJsZWVEYXRhIiwiZW5hYmxlZERhdGFzZXRzIiwiYWN0ZXVyQnlVaWQiLCJvcmdhbmVCeVVpZCIsIkFjdGV1cnNFdE9yZ2FuZXMiLCJhY3RldXJTcGxpdFBhdGgiLCJhY3RldXJGaWxlbmFtZSIsImFjdGV1ckZpbGVQYXRoIiwiYWN0ZXVySnNvbiIsIm9yZ2FuZVNwbGl0UGF0aCIsIm9yZ2FuZUZpbGVuYW1lIiwib3JnYW5lRmlsZVBhdGgiLCJvcmdhbmVKc29uIiwicmV1bmlvbkJ5VWlkIiwicmV1bmlvbnNCeURheSIsInJldW5pb25zQnlEb3NzaWVyVWlkIiwiQWdlbmRhcyIsInJldW5pb25TcGxpdFBhdGgiLCJyZXVuaW9uRmlsZW5hbWUiLCJyZXVuaW9uRmlsZVBhdGgiLCJyZXVuaW9uSnNvbiIsImRheSIsInRpbWVzdGFtcERlYnV0IiwidG9JU09TdHJpbmciLCJzcGxpdCIsInJldW5pb25zQXREYXkiLCJwdXNoIiwib2RqIiwicG9pbnRPZGoiLCJwb2ludHNPZGoiLCJkb3NzaWVyTGVnaXNsYXRpZlJlZiIsImRvc3NpZXJzTGVnaXNsYXRpZnNSZWZzIiwicmV1bmlvbnNBdERvc3NpZXJVaWQiLCJhbWVuZGVtZW50QnlVaWQiLCJBbWVuZGVtZW50cyIsImFtZW5kZW1lbnRTcGxpdFBhdGgiLCJhbWVuZGVtZW50RmlsZW5hbWUiLCJhbWVuZGVtZW50RmlsZVBhdGgiLCJhbWVuZGVtZW50SnNvbiIsImRvY3VtZW50QnlVaWQiLCJkb3NzaWVyUGFybGVtZW50YWlyZUJ5U2VuYXRDaGVtaW4iLCJkb3NzaWVyUGFybGVtZW50YWlyZUJ5VGl0cmVDaGVtaW4iLCJkb3NzaWVyUGFybGVtZW50YWlyZUJ5VWlkIiwiRG9zc2llcnNMZWdpc2xhdGlmcyIsImRvY3VtZW50U3BsaXRQYXRoIiwiZG9jdW1lbnRGaWxlbmFtZSIsImRvY3VtZW50RmlsZVBhdGgiLCJkb2N1bWVudEpzb24iLCJkb3NzaWVyU3BsaXRQYXRoIiwiZG9zc2llckZpbGVuYW1lIiwiZG9zc2llckZpbGVQYXRoIiwiZG9zc2llckpzb24iLCJkb3NzaWVyIiwidGl0cmVEb3NzaWVyIiwic2VuYXRDaGVtaW4iLCJ0aXRyZUNoZW1pbiIsInBob3RvQnlVaWQiLCJQaG90b3MiLCJqc29uRmlsZVBhdGgiLCJEaXhTZXB0IiwiZXhpc3RzU3luYyIsImpzb24iLCJPYmplY3QiLCJhc3NpZ24iLCJzY3J1dGluQnlVaWQiLCJTY3J1dGlucyIsInNjcnV0aW5TcGxpdFBhdGgiLCJzY3J1dGluRmlsZW5hbWUiLCJzY3J1dGluRmlsZVBhdGgiLCJzY3J1dGluSnNvbiIsInF1ZXN0aW9uQnlVaWQiLCJRdWVzdGlvbnMiLCJxdWVzdGlvblNwbGl0UGF0aCIsInF1ZXN0aW9uRmlsZW5hbWUiLCJxdWVzdGlvbkZpbGVQYXRoIiwicXVlc3Rpb25Kc29uIiwiY29tcHRlUmVuZHVCeVVpZCIsIkNvbXB0ZXNSZW5kdXNTZWFuY2VzIiwiY29tcHRlUmVuZHVQYXRoIiwiY29tcHRlUmVuZHVGaWxlbmFtZSIsImNvbXB0ZVJlbmR1RmlsZVBhdGgiLCJjb21wdGVSZW5kdUpzb24iLCJsb2FkQXNzZW1ibGVlRGF0YUZyb21CaWdGaWxlcyIsInRvQWN0ZXVyc0V0T3JnYW5lcyIsImFjdGV1cnMiLCJvcmdhbmVzIiwidG9BZ2VuZGFzIiwicmV1bmlvbnMiLCJ0b0FtZW5kZW1lbnRzIiwidGV4dGVMZWdpc2xhdGlmIiwidGV4dGVzTGVnaXNsYXRpZnMiLCJ0b0Rvc3NpZXJzTGVnaXNsYXRpZnMiLCJkb3NzaWVyc1BhcmxlbWVudGFpcmVzIiwidG9TY3J1dGlucyIsInRvUXVlc3Rpb25zIiwiY29tcHRlc1JlbmR1cyIsInRvQ29tcHRlc1JlbmR1cyIsImxvYWRBc3NlbWJsZWVEb2N1bWVudEZpbGUiLCJmb3JtYXRzIiwiZG9jdW1lbnRzRGlyIiwiZG9jdW1lbnREaXIiLCJwYXRoRnJvbURvY3VtZW50VWlkIiwiaW5kZXhQYXRoIiwicGF0aEV4aXN0c1N5bmMiLCJpbmRleCIsInJlYWRKc29uU3luYyIsImZvcm1hdCIsInVybCIsImxvYWRBc3NlbWJsZWVQaG90b3NEZXB1dGVzIiwibG9hZEFzc2VtYmxlZVBob3Rvc1NlbmF0ZXVycyIsIm1hdGNoIiwibm90U3RyaWN0RXF1YWwiLCJncm91cHMiLCJkb2N1bWVudFR5cGUiLCJkb2N1bWVudFR5cGUyIiwiY2hhbWJyZURpciIsImNoYW1icmUiLCJjaGFtYnJlMiIsInJlcHVibGlxdWVEaXIiLCJyZXB1YmxpcXVlIiwicmVwdWJsaXF1ZTIiLCJsZWdpc2xhdHVyZURpciIsImxlZ2lzbGF0dXJlMiIsImV0YXQiLCJlbnN1cmVEaXJTeW5jIiwiZXRhdERpciIsIm51bWVybyIsIm51bWVybzIiLCJzdWJzdHJpbmciLCJudW1lcm9NaWxsaWVyc0RpciIsInBhdGhGcm9tRG9zc2llclBhcmxlbWVudGFpcmVVaWQiLCJkb3NzaWVyc0RpciIsInBhdGhGcm9tVWlkIiwicGF0aEZyb21SZXVuaW9uVWlkIiwicmV1bmlvbnNEaXIiLCJleGVjIiwic2Vzc2lvbkRpciIsImlkRGlyIiwibnVtZXJvTWlsbGlvbnNEaXIiLCJwYXRoRnJvbVNjcnV0aW5VaWQiLCJzY3J1dGluc0RpciIsInBhdGhGcm9tUXVlc3Rpb25VaWQiLCJwYXRoRnJvbUNvbXB0ZVJlbmR1VWlkIiwiZGF0YVJlZ2V4cCJdLCJzb3VyY2VzIjpbIi4uL3NyYy9sb2FkZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vLyBMb2FkIGRhdGEgZnJvbSBmaWxlc1xuXG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiXG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiXG5cbmV4cG9ydCB7IEVuYWJsZWREYXRhc2V0cyB9IGZyb20gXCIuL2RhdGFzZXRzXCJcbmltcG9ydCB7IGRhdGFzZXRzLCBFbmFibGVkRGF0YXNldHMsIERhdGFzZXQgfSBmcm9tIFwiLi9kYXRhc2V0c1wiXG5pbXBvcnQgdHlwZSB7IERvY3VtZW50RmlsZXNJbmRleCB9IGZyb20gXCIuL2Rvc3NpZXJzX2xlZ2lzbGF0aWZzXCJcbmV4cG9ydCB7IHdhbGtEaXIgfSBmcm9tIFwiLi9maWxlX3N5c3RlbXNcIlxuaW1wb3J0IHsgd2Fsa0RpciB9IGZyb20gXCIuL2ZpbGVfc3lzdGVtc1wiXG5pbXBvcnQge1xuICBBY3RldXIsXG4gIENvbnZlcnQgYXMgQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQsXG4gIE9yZ2FuZSxcbiAgUGhvdG8sXG59IGZyb20gXCIuL3R5cGVzL2FjdGV1cnNfZXRfb3JnYW5lc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIEFnZW5kYXNDb252ZXJ0LCBSZXVuaW9uIH0gZnJvbSBcIi4vdHlwZXMvYWdlbmRhc1wiXG5pbXBvcnQgeyBBbWVuZGVtZW50LCBDb252ZXJ0IGFzIEFtZW5kZW1lbnRzQ29udmVydCB9IGZyb20gXCIuL3R5cGVzL2FtZW5kZW1lbnRzXCJcbmltcG9ydCB7XG4gIENvbnZlcnQgYXMgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQsXG4gIERvY3VtZW50LFxuICBEb3NzaWVyUGFybGVtZW50YWlyZSxcbn0gZnJvbSBcIi4vdHlwZXMvZG9zc2llcnNfbGVnaXNsYXRpZnNcIlxuaW1wb3J0IHsgTGVnaXNsYXR1cmUgfSBmcm9tIFwiLi90eXBlcy9sZWdpc2xhdHVyZXNcIlxuaW1wb3J0IHsgQ29udmVydCBhcyBTY3J1dGluc0NvbnZlcnQsIFNjcnV0aW4gfSBmcm9tIFwiLi90eXBlcy9zY3J1dGluc1wiXG5pbXBvcnQgeyBDb252ZXJ0IGFzIFF1ZXN0aW9uc0NvbnZlcnQsIFF1ZXN0aW9uIH0gZnJvbSBcIi4vdHlwZXMvcXVlc3Rpb25zXCJcbmltcG9ydCB7IENvbnZlcnQgYXMgQ29tcHRlc1JlbmR1c0NvbnZlcnQsIENvbXB0ZVJlbmR1IH0gZnJvbSBcIi4vdHlwZXMvZGViYXRzXCJcbmltcG9ydCB7IERvY3VtZW50VXJsRm9ybWF0IH0gZnJvbSBcIi4vdXJsc1wiXG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YSB7XG4gIHJlYWRvbmx5IGFjdGV1ckJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IEFjdGV1ciB9XG4gIHJlYWRvbmx5IGFtZW5kZW1lbnRCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBBbWVuZGVtZW50IH1cbiAgcmVhZG9ubHkgZG9jdW1lbnRCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBEb2N1bWVudCB9XG4gIHJlYWRvbmx5IGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pbjoge1xuICAgIFt1aWQ6IHN0cmluZ106IERvc3NpZXJQYXJsZW1lbnRhaXJlXG4gIH1cbiAgcmVhZG9ubHkgZG9zc2llclBhcmxlbWVudGFpcmVCeVRpdHJlQ2hlbWluOiB7XG4gICAgW3VpZDogc3RyaW5nXTogRG9zc2llclBhcmxlbWVudGFpcmVcbiAgfVxuICByZWFkb25seSBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IERvc3NpZXJQYXJsZW1lbnRhaXJlIH1cbiAgcmVhZG9ubHkgb3JnYW5lQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogT3JnYW5lIH1cbiAgcmVhZG9ubHkgcGhvdG9CeVVpZDogeyBbdWlkOiBzdHJpbmddOiBQaG90byB9XG4gIHJlYWRvbmx5IHJldW5pb25CeVVpZDogeyBbdWlkOiBzdHJpbmddOiBSZXVuaW9uIH1cbiAgcmVhZG9ubHkgcmV1bmlvbnNCeURheTogeyBbZGF5OiBzdHJpbmddOiBSZXVuaW9uW10gfVxuICByZWFkb25seSByZXVuaW9uc0J5RG9zc2llclVpZDogeyBbZG9zc2llclVpZDogc3RyaW5nXTogUmV1bmlvbltdIH1cbiAgcmVhZG9ubHkgc2NydXRpbkJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IFNjcnV0aW4gfVxuICByZWFkb25seSBxdWVzdGlvbkJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IFF1ZXN0aW9uIH1cbiAgcmVhZG9ubHkgY29tcHRlUmVuZHVCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBDb21wdGVSZW5kdSB9XG59XG5cbmNvbnN0IGRvY3VtZW50VWlkUmVnZXggPVxuICAvXigoPzxkb2N1bWVudFR5cGU+QUNJTnxBTENOfEFWQ0V8QVZJU3xERUNMfEVUREl8TEVUVHxNRVNTfE1JT058UElPTnxQTlJFfFBSSkx8UkFQUHxSSU5GfFJJT04pKD88Y2hhbWJyZT5BTnxDR3xTTikoPzxyZXB1YmxpcXVlPlJcXGQrKVtMU10oPzxsZWdpc2xhdHVyZT5cXGQrKSg/PGV0YXQ+QnxCVEF8QlRDfFRBUCkoPzxudW1lcm8+XFxkKykoLS4qKT8pfCgoPzxkb2N1bWVudFR5cGUyPk1JT04pKD88Y2hhbWJyZTI+QU58U04pKD88cmVwdWJsaXF1ZTI+UlxcZCspW0xTXSg/PGxlZ2lzbGF0dXJlMj5cXGQrKS1OKD88bnVtZXJvMj5cXGQrKSkkL1xuY29uc3QgZG9zc2llclVpZFJlZ2V4ID0gL15ETChSXFxkKykoTFxcZCspTihcXGQrKSQvXG5jb25zdCByZXVuaW9uVWlkUmVnZXggPVxuICAvXlJVKEFOfENHfFNOKShSXFxkKykoTFxcZCspKFtBU11cXGR7NH0pKElEQ3xJREZMP3xJRFMpKFxcZCspJC9cbmNvbnN0IHNjcnV0aW5VaWRSZWdleCA9IC9eVlQoQU58Q0cpKFJcXGQrKShMXFxkKylWKFxcZCspJC9cbmNvbnN0IGNvbXB0ZVJlbmR1VWlkUmVnZXg6IFJlZ0V4cCA9XG4gIC9eQ1JTKEFOfENHKShSXFxkKykoTFxcZCspKFNcXGQrKShPfEV8RCkoXFxkKykoTlxcZCspJC9cbmNvbnN0IHF1ZXN0aW9uVWlkUmVnZXg6IFJlZ0V4cCA9IC9eUUFOKFJcXGQrKShMXFxkKylRKEV8R3xPU0QpKFxcZCspJC9cblxudHlwZSBJdGVtQ29udmVydGVyPFQ+ID0gKGpzb246IHN0cmluZykgPT4gVFxuXG5mdW5jdGlvbiogaXRlckxvYWRBc3NlbWJsZWVJdGVtczxUIGV4dGVuZHMgeyB1aWQ6IHN0cmluZyB9PihcbiAgZGF0YURpcjogc3RyaW5nLFxuICBsZWdpc2xhdHVyZTogTGVnaXNsYXR1cmUsXG4gIGRhdGFzZXRzOiBEYXRhc2V0W10sXG4gIGNvbnZlcnRUb0l0ZW06IEl0ZW1Db252ZXJ0ZXI8VD4sXG4gIHN1YmZvbGRlck5hbWU6IHN0cmluZ1tdLFxuICBmaWxlRXh0ZW5zaW9uOiBzdHJpbmcgPSBcImpzb25cIixcbiAgeyBub1ZhbGlkYXRpb24gPSBmYWxzZSwgbG9nID0gZmFsc2UgfSA9IHt9LFxuKTogR2VuZXJhdG9yPHsgaXRlbTogVDsgZGF0YXNldExlZ2lzbGF0dXJlOiBMZWdpc2xhdHVyZSB9LCB2b2lkLCB1bmtub3duPiB7XG4gIGNvbnN0IGl0ZW1VaWQgPSBuZXcgU2V0PHN0cmluZz4oKVxuICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMpIHtcbiAgICBpZiAoZGF0YXNldC5pZ25vcmVGb3JXZWIpIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChcbiAgICAgIGxlZ2lzbGF0dXJlICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIGxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgbGVnaXNsYXR1cmUgIT09IGRhdGFzZXQubGVnaXNsYXR1cmVcbiAgICApIHtcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGxldCBmaWxlRXh0ZW5zaW9uUmVnZXggPSBuZXcgUmVnRXhwKGBcXFxcLiR7ZmlsZUV4dGVuc2lvbn0kYClcbiAgICBjb25zdCBkYXRhc2V0RGlyID0gcGF0aC5qb2luKFxuICAgICAgZGF0YURpcixcbiAgICAgIGRhdGFzZXQuZmlsZW5hbWUucmVwbGFjZShmaWxlRXh0ZW5zaW9uUmVnZXgsIFwiX25ldHRveWVcIiksXG4gICAgKVxuXG4gICAgZm9yIChjb25zdCBpdGVtU3BsaXRQYXRoIG9mIHdhbGtEaXIoZGF0YXNldERpciwgc3ViZm9sZGVyTmFtZSkpIHtcbiAgICAgIGNvbnN0IGl0ZW1GaWxlbmFtZSA9IGl0ZW1TcGxpdFBhdGhbaXRlbVNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgaWYgKCFpdGVtRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3QgaXRlbUZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXREaXIsIC4uLml0ZW1TcGxpdFBhdGgpXG4gICAgICBpZiAobG9nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7aXRlbUZpbGVQYXRofeKApmApXG4gICAgICB9XG5cbiAgICAgIGxldCBpdGVtSnNvbjogYW55ID0gZnMucmVhZEZpbGVTeW5jKGl0ZW1GaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSlcbiAgICAgIGxldCBpdGVtOiBUID0gbm9WYWxpZGF0aW9uXG4gICAgICAgID8gSlNPTi5wYXJzZShpdGVtSnNvbilcbiAgICAgICAgOiBjb252ZXJ0VG9JdGVtKGl0ZW1Kc29uKVxuXG4gICAgICBpZiAoaXRlbVVpZC5oYXMoaXRlbS51aWQpKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBpdGVtVWlkLmFkZChpdGVtLnVpZClcbiAgICAgIHlpZWxkIHsgaXRlbTogaXRlbSwgZGF0YXNldExlZ2lzbGF0dXJlOiBkYXRhc2V0LmxlZ2lzbGF0dXJlIH1cblxuICAgICAgaXRlbUpzb24gPSBudWxsXG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiogaXRlckxvYWRBc3NlbWJsZWVBY3RldXJzKFxuICBkYXRhRGlyOiBzdHJpbmcsXG4gIGxlZ2lzbGF0dXJlOiBMZWdpc2xhdHVyZSxcbiAgb3B0aW9ucyA9IHt9LFxuKTogR2VuZXJhdG9yPFxuICB7IGFjdGV1cjogQWN0ZXVyOyBkYXRhc2V0TGVnaXNsYXR1cmU6IExlZ2lzbGF0dXJlIH0sXG4gIHZvaWQsXG4gIHVua25vd25cbj4ge1xuICBmb3IgKGNvbnN0IHtcbiAgICBpdGVtOiBhY3RldXIsXG4gICAgZGF0YXNldExlZ2lzbGF0dXJlLFxuICB9IG9mIGl0ZXJMb2FkQXNzZW1ibGVlSXRlbXM8QWN0ZXVyPihcbiAgICBkYXRhRGlyLFxuICAgIGxlZ2lzbGF0dXJlLFxuICAgIGRhdGFzZXRzLmFjdGV1cnNFdE9yZ2FuZXMsXG4gICAgQWN0ZXVyc0V0T3JnYW5lc0NvbnZlcnQudG9BY3RldXIsXG4gICAgW1wiYWN0ZXVyc1wiXSxcbiAgICBcImpzb25cIixcbiAgICBvcHRpb25zLFxuICApKSB7XG4gICAgeWllbGQgeyBhY3RldXIsIGRhdGFzZXRMZWdpc2xhdHVyZSB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBpdGVyTG9hZEFzc2VtYmxlZU9yZ2FuZXMoXG4gIGRhdGFEaXI6IHN0cmluZyxcbiAgbGVnaXNsYXR1cmU6IExlZ2lzbGF0dXJlLFxuICBvcHRpb25zID0ge30sXG4pOiBHZW5lcmF0b3I8XG4gIHsgb3JnYW5lOiBPcmdhbmU7IGRhdGFzZXRMZWdpc2xhdHVyZTogTGVnaXNsYXR1cmUgfSxcbiAgdm9pZCxcbiAgdW5rbm93blxuPiB7XG4gIGZvciAoY29uc3Qge1xuICAgIGl0ZW06IG9yZ2FuZSxcbiAgICBkYXRhc2V0TGVnaXNsYXR1cmUsXG4gIH0gb2YgaXRlckxvYWRBc3NlbWJsZWVJdGVtczxPcmdhbmU+KFxuICAgIGRhdGFEaXIsXG4gICAgbGVnaXNsYXR1cmUsXG4gICAgZGF0YXNldHMuYWN0ZXVyc0V0T3JnYW5lcyxcbiAgICBBY3RldXJzRXRPcmdhbmVzQ29udmVydC50b09yZ2FuZSxcbiAgICBbXCJvcmdhbmVzXCJdLFxuICAgIFwianNvblwiLFxuICAgIG9wdGlvbnMsXG4gICkpIHtcbiAgICB5aWVsZCB7IG9yZ2FuZSwgZGF0YXNldExlZ2lzbGF0dXJlIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIGl0ZXJMb2FkQXNzZW1ibGVlQW1lbmRlbWVudHMoXG4gIGRhdGFEaXI6IHN0cmluZyxcbiAgbGVnaXNsYXR1cmU6IExlZ2lzbGF0dXJlLFxuICBvcHRpb25zID0ge30sXG4pOiBHZW5lcmF0b3I8XG4gIHsgYW1lbmRlbWVudDogQW1lbmRlbWVudDsgZGF0YXNldExlZ2lzbGF0dXJlOiBMZWdpc2xhdHVyZSB9LFxuICB2b2lkLFxuICB1bmtub3duXG4+IHtcbiAgZm9yIChjb25zdCB7XG4gICAgaXRlbTogYW1lbmRlbWVudCxcbiAgICBkYXRhc2V0TGVnaXNsYXR1cmUsXG4gIH0gb2YgaXRlckxvYWRBc3NlbWJsZWVJdGVtczxBbWVuZGVtZW50PihcbiAgICBkYXRhRGlyLFxuICAgIGxlZ2lzbGF0dXJlLFxuICAgIGRhdGFzZXRzLmFtZW5kZW1lbnRzLFxuICAgIEFtZW5kZW1lbnRzQ29udmVydC50b0FtZW5kZW1lbnQsXG4gICAgW10sXG4gICAgXCJqc29uXCIsXG4gICAgb3B0aW9ucyxcbiAgKSkge1xuICAgIHlpZWxkIHsgYW1lbmRlbWVudCwgZGF0YXNldExlZ2lzbGF0dXJlIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIGl0ZXJMb2FkQXNzZW1ibGVlRG9jdW1lbnRzKFxuICBkYXRhRGlyOiBzdHJpbmcsXG4gIGxlZ2lzbGF0dXJlOiBMZWdpc2xhdHVyZSxcbiAgb3B0aW9ucyA9IHt9LFxuKTogR2VuZXJhdG9yPFxuICB7IGRvY3VtZW50OiBEb2N1bWVudDsgZGF0YXNldExlZ2lzbGF0dXJlOiBMZWdpc2xhdHVyZSB9LFxuICB2b2lkLFxuICB1bmtub3duXG4+IHtcbiAgZm9yIChjb25zdCB7XG4gICAgaXRlbTogZG9jdW1lbnQsXG4gICAgZGF0YXNldExlZ2lzbGF0dXJlLFxuICB9IG9mIGl0ZXJMb2FkQXNzZW1ibGVlSXRlbXM8RG9jdW1lbnQ+KFxuICAgIGRhdGFEaXIsXG4gICAgbGVnaXNsYXR1cmUsXG4gICAgZGF0YXNldHMuZG9zc2llcnNMZWdpc2xhdGlmcyxcbiAgICBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC50b0RvY3VtZW50LFxuICAgIFtcImRvY3VtZW50c1wiXSxcbiAgICBcImpzb25cIixcbiAgICBvcHRpb25zLFxuICApKSB7XG4gICAgeWllbGQgeyBkb2N1bWVudCwgZGF0YXNldExlZ2lzbGF0dXJlIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIGl0ZXJMb2FkQXNzZW1ibGVlRG9zc2llcnNQYXJsZW1lbnRhaXJlcyhcbiAgZGF0YURpcjogc3RyaW5nLFxuICBsZWdpc2xhdHVyZTogTGVnaXNsYXR1cmUsXG4gIG9wdGlvbnMgPSB7fSxcbik6IEdlbmVyYXRvcjxcbiAge1xuICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlOiBEb3NzaWVyUGFybGVtZW50YWlyZVxuICAgIGRhdGFzZXRMZWdpc2xhdHVyZTogTGVnaXNsYXR1cmVcbiAgfSxcbiAgdm9pZCxcbiAgdW5rbm93blxuPiB7XG4gIGZvciAoY29uc3Qge1xuICAgIGl0ZW06IGRvc3NpZXJQYXJsZW1lbnRhaXJlLFxuICAgIGRhdGFzZXRMZWdpc2xhdHVyZSxcbiAgfSBvZiBpdGVyTG9hZEFzc2VtYmxlZUl0ZW1zPERvc3NpZXJQYXJsZW1lbnRhaXJlPihcbiAgICBkYXRhRGlyLFxuICAgIGxlZ2lzbGF0dXJlLFxuICAgIGRhdGFzZXRzLmRvc3NpZXJzTGVnaXNsYXRpZnMsXG4gICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQudG9Eb3NzaWVyUGFybGVtZW50YWlyZSxcbiAgICBbXCJkb3NzaWVyc1wiXSxcbiAgICBcImpzb25cIixcbiAgICBvcHRpb25zLFxuICApKSB7XG4gICAgeWllbGQgeyBkb3NzaWVyUGFybGVtZW50YWlyZSwgZGF0YXNldExlZ2lzbGF0dXJlIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24qIGl0ZXJMb2FkQXNzZW1ibGVlUmV1bmlvbnMoXG4gIGRhdGFEaXI6IHN0cmluZyxcbiAgbGVnaXNsYXR1cmU6IExlZ2lzbGF0dXJlLFxuICBvcHRpb25zID0ge30sXG4pOiBHZW5lcmF0b3I8XG4gIHsgcmV1bmlvbjogUmV1bmlvbjsgZGF0YXNldExlZ2lzbGF0dXJlOiBMZWdpc2xhdHVyZSB9LFxuICB2b2lkLFxuICB1bmtub3duXG4+IHtcbiAgZm9yIChjb25zdCB7XG4gICAgaXRlbTogcmV1bmlvbixcbiAgICBkYXRhc2V0TGVnaXNsYXR1cmUsXG4gIH0gb2YgaXRlckxvYWRBc3NlbWJsZWVJdGVtczxSZXVuaW9uPihcbiAgICBkYXRhRGlyLFxuICAgIGxlZ2lzbGF0dXJlLFxuICAgIGRhdGFzZXRzLmFnZW5kYXMsXG4gICAgQWdlbmRhc0NvbnZlcnQudG9SZXVuaW9uLFxuICAgIFtdLFxuICAgIFwianNvblwiLFxuICAgIG9wdGlvbnMsXG4gICkpIHtcbiAgICB5aWVsZCB7IHJldW5pb24sIGRhdGFzZXRMZWdpc2xhdHVyZSB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBpdGVyTG9hZEFzc2VtYmxlZVNjcnV0aW5zKFxuICBkYXRhRGlyOiBzdHJpbmcsXG4gIGxlZ2lzbGF0dXJlOiBMZWdpc2xhdHVyZSxcbiAgb3B0aW9ucyA9IHt9LFxuKTogR2VuZXJhdG9yPFxuICB7IHNjcnV0aW46IFNjcnV0aW47IGRhdGFzZXRMZWdpc2xhdHVyZTogTGVnaXNsYXR1cmUgfSxcbiAgdm9pZCxcbiAgdW5rbm93blxuPiB7XG4gIGZvciAoY29uc3Qge1xuICAgIGl0ZW06IHNjcnV0aW4sXG4gICAgZGF0YXNldExlZ2lzbGF0dXJlLFxuICB9IG9mIGl0ZXJMb2FkQXNzZW1ibGVlSXRlbXM8U2NydXRpbj4oXG4gICAgZGF0YURpcixcbiAgICBsZWdpc2xhdHVyZSxcbiAgICBkYXRhc2V0cy5zY3J1dGlucyxcbiAgICBTY3J1dGluc0NvbnZlcnQudG9TY3J1dGluLFxuICAgIFtdLFxuICAgIFwianNvblwiLFxuICAgIG9wdGlvbnMsXG4gICkpIHtcbiAgICB5aWVsZCB7IHNjcnV0aW4sIGRhdGFzZXRMZWdpc2xhdHVyZSB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBpdGVyTG9hZEFzc2VtYmxlZVF1ZXN0aW9ucyhcbiAgZGF0YURpcjogc3RyaW5nLFxuICBsZWdpc2xhdHVyZTogTGVnaXNsYXR1cmUsXG4gIG9wdGlvbnMgPSB7fSxcbik6IEdlbmVyYXRvcjxcbiAgeyBxdWVzdGlvbjogUXVlc3Rpb247IGRhdGFzZXRMZWdpc2xhdHVyZTogTGVnaXNsYXR1cmUgfSxcbiAgdm9pZCxcbiAgdW5rbm93blxuPiB7XG4gIGZvciAoY29uc3Qge1xuICAgIGl0ZW06IHF1ZXN0aW9uLFxuICAgIGRhdGFzZXRMZWdpc2xhdHVyZSxcbiAgfSBvZiBpdGVyTG9hZEFzc2VtYmxlZUl0ZW1zPFF1ZXN0aW9uPihcbiAgICBkYXRhRGlyLFxuICAgIGxlZ2lzbGF0dXJlLFxuICAgIGRhdGFzZXRzLnF1ZXN0aW9ucyxcbiAgICBRdWVzdGlvbnNDb252ZXJ0LnRvUXVlc3Rpb24sXG4gICAgW10sXG4gICAgXCJqc29uXCIsXG4gICAgb3B0aW9ucyxcbiAgKSkge1xuICAgIHlpZWxkIHsgcXVlc3Rpb24sIGRhdGFzZXRMZWdpc2xhdHVyZSB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uKiBpdGVyTG9hZEFzc2VtYmxlZUNvbXB0ZXNSZW5kdXMoXG4gIGRhdGFEaXI6IHN0cmluZyxcbiAgbGVnaXNsYXR1cmU6IExlZ2lzbGF0dXJlLFxuICBvcHRpb25zID0ge30sXG4pOiBHZW5lcmF0b3I8XG4gIHsgY29tcHRlUmVuZHU6IENvbXB0ZVJlbmR1OyBkYXRhc2V0TGVnaXNsYXR1cmU6IExlZ2lzbGF0dXJlIH0sXG4gIHZvaWQsXG4gIHVua25vd25cbj4ge1xuICBmb3IgKGNvbnN0IHtcbiAgICBpdGVtOiBjb21wdGVSZW5kdSxcbiAgICBkYXRhc2V0TGVnaXNsYXR1cmUsXG4gIH0gb2YgaXRlckxvYWRBc3NlbWJsZWVJdGVtczxDb21wdGVSZW5kdT4oXG4gICAgZGF0YURpcixcbiAgICBsZWdpc2xhdHVyZSxcbiAgICBkYXRhc2V0cy5jb21wdGVzUmVuZHVzU2VhbmNlcyxcbiAgICBDb21wdGVzUmVuZHVzQ29udmVydC50b0NvbXB0ZVJlbmR1LFxuICAgIFtdLFxuICAgIFwieG1sXCIsXG4gICAgb3B0aW9ucyxcbiAgKSkge1xuICAgIHlpZWxkIHsgY29tcHRlUmVuZHUsIGRhdGFzZXRMZWdpc2xhdHVyZSB9XG4gIH1cbn1cblxuLy8vIExvYWQgZGF0YSBmcm9tIHNwbGl0IGZpbGVzLlxuLy8vIERlcHJlY2F0ZWQ6IFVzZSBpdGVyTG9hZC4uLiBpdGVyYXRvcnMgaW5zdGVhZC5cbmV4cG9ydCBmdW5jdGlvbiBsb2FkQXNzZW1ibGVlRGF0YShcbiAgZGF0YURpcjogc3RyaW5nLFxuICBlbmFibGVkRGF0YXNldHM6IEVuYWJsZWREYXRhc2V0cyxcbiAgbGVnaXNsYXR1cmU6IExlZ2lzbGF0dXJlLFxuICB7IGxvZyA9IGZhbHNlIH0gPSB7fSxcbik6IERhdGEge1xuICBjb25zdCBhY3RldXJCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBBY3RldXIgfSA9IHt9XG4gIGNvbnN0IG9yZ2FuZUJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IE9yZ2FuZSB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BY3RldXJzRXRPcmdhbmVzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhc2V0RGlyID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZVwiKSxcbiAgICAgIClcblxuICAgICAgZm9yIChjb25zdCBhY3RldXJTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyLCBbXCJhY3RldXJzXCJdKSkge1xuICAgICAgICBjb25zdCBhY3RldXJGaWxlbmFtZSA9IGFjdGV1clNwbGl0UGF0aFthY3RldXJTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFhY3RldXJGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhY3RldXJGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0RGlyLCAuLi5hY3RldXJTcGxpdFBhdGgpXG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2FjdGV1ckZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWN0ZXVySnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGFjdGV1ckZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBhY3RldXIgPSBBY3RldXJzRXRPcmdhbmVzQ29udmVydC50b0FjdGV1cihhY3RldXJKc29uKVxuICAgICAgICAvLyBLZWVwIHRoZSBmaXJzdCBleGlzdGluZyBcImFjdGV1clwiLCBiZWNhdXNlIHRoZSBmaXJzdCB3cmFwcGVyIGlzIHRoZSBtb3N0IGNvbXBsZXRlLlxuICAgICAgICBpZiAoYWN0ZXVyQnlVaWRbYWN0ZXVyLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFjdGV1ckJ5VWlkW2FjdGV1ci51aWRdID0gYWN0ZXVyXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgZm9yIChjb25zdCBvcmdhbmVTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyLCBbXCJvcmdhbmVzXCJdKSkge1xuICAgICAgICBjb25zdCBvcmdhbmVGaWxlbmFtZSA9IG9yZ2FuZVNwbGl0UGF0aFtvcmdhbmVTcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFvcmdhbmVGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcmdhbmVGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0RGlyLCAuLi5vcmdhbmVTcGxpdFBhdGgpXG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke29yZ2FuZUZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3JnYW5lSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKG9yZ2FuZUZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBvcmdhbmUgPSBBY3RldXJzRXRPcmdhbmVzQ29udmVydC50b09yZ2FuZShvcmdhbmVKc29uKVxuICAgICAgICAvLyBLZWVwIHRoZSBmaXJzdCBleGlzdGluZyBcIm9yZ2FuZVwiLCBiZWNhdXNlIHRoZSBmaXJzdCB3cmFwcGVyIGlzIHRoZSBtb3N0IGNvbXBsZXRlLlxuICAgICAgICBpZiAob3JnYW5lQnlVaWRbb3JnYW5lLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG9yZ2FuZUJ5VWlkW29yZ2FuZS51aWRdID0gb3JnYW5lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCByZXVuaW9uQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogUmV1bmlvbiB9ID0ge31cbiAgY29uc3QgcmV1bmlvbnNCeURheTogeyBbZGF5OiBzdHJpbmddOiBSZXVuaW9uW10gfSA9IHt9XG4gIGNvbnN0IHJldW5pb25zQnlEb3NzaWVyVWlkOiB7IFtkb3NzaWVyVWlkOiBzdHJpbmddOiBSZXVuaW9uW10gfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWdlbmRhcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hZ2VuZGFzKSB7XG4gICAgICBpZiAoZGF0YXNldC5pZ25vcmVGb3JXZWIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBkYXRhc2V0LmxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IGRhdGFzZXQubGVnaXNsYXR1cmVcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3QgZGF0YXNldERpciA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiX25ldHRveWVcIiksXG4gICAgICApXG4gICAgICBmb3IgKGNvbnN0IHJldW5pb25TcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyKSkge1xuICAgICAgICBjb25zdCByZXVuaW9uRmlsZW5hbWUgPSByZXVuaW9uU3BsaXRQYXRoW3JldW5pb25TcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFyZXVuaW9uRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV1bmlvbkZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXREaXIsIC4uLnJldW5pb25TcGxpdFBhdGgpXG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke3JldW5pb25GaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldW5pb25Kc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMocmV1bmlvbkZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCByZXVuaW9uID0gQWdlbmRhc0NvbnZlcnQudG9SZXVuaW9uKHJldW5pb25Kc29uKVxuICAgICAgICBpZiAocmV1bmlvbkJ5VWlkW3JldW5pb24udWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV1bmlvbkJ5VWlkW3JldW5pb24udWlkXSA9IHJldW5pb25cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRheSA9IHJldW5pb24udGltZXN0YW1wRGVidXQudG9JU09TdHJpbmcoKS5zcGxpdChcIlRcIilbMF1cbiAgICAgICAgbGV0IHJldW5pb25zQXREYXkgPSByZXVuaW9uc0J5RGF5W2RheV1cbiAgICAgICAgaWYgKHJldW5pb25zQXREYXkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldW5pb25zQXREYXkgPSByZXVuaW9uc0J5RGF5W2RheV0gPSBbXVxuICAgICAgICB9XG4gICAgICAgIHJldW5pb25zQXREYXkucHVzaChyZXVuaW9uKVxuXG4gICAgICAgIGNvbnN0IG9kaiA9IHJldW5pb24ub2RqXG4gICAgICAgIGlmIChvZGogIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGZvciAoY29uc3QgcG9pbnRPZGogb2Ygb2RqLnBvaW50c09kaiB8fCBbXSkge1xuICAgICAgICAgICAgZm9yIChjb25zdCBkb3NzaWVyTGVnaXNsYXRpZlJlZiBvZiBwb2ludE9kai5kb3NzaWVyc0xlZ2lzbGF0aWZzUmVmcyB8fFxuICAgICAgICAgICAgICBbXSkge1xuICAgICAgICAgICAgICBsZXQgcmV1bmlvbnNBdERvc3NpZXJVaWQgPVxuICAgICAgICAgICAgICAgIHJldW5pb25zQnlEb3NzaWVyVWlkW2Rvc3NpZXJMZWdpc2xhdGlmUmVmXVxuICAgICAgICAgICAgICBpZiAocmV1bmlvbnNBdERvc3NpZXJVaWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHJldW5pb25zQXREb3NzaWVyVWlkID0gcmV1bmlvbnNCeURvc3NpZXJVaWRbXG4gICAgICAgICAgICAgICAgICBkb3NzaWVyTGVnaXNsYXRpZlJlZlxuICAgICAgICAgICAgICAgIF0gPSBbXVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldW5pb25zQXREb3NzaWVyVWlkLnB1c2gocmV1bmlvbilcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBhbWVuZGVtZW50QnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogQW1lbmRlbWVudCB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5BbWVuZGVtZW50cykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hbWVuZGVtZW50cykge1xuICAgICAgaWYgKGRhdGFzZXQuaWdub3JlRm9yV2ViKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgZGF0YXNldC5sZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBkYXRhc2V0LmxlZ2lzbGF0dXJlXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGFzZXREaXIgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIl9uZXR0b3llXCIpLFxuICAgICAgKVxuXG4gICAgICBmb3IgKGNvbnN0IGFtZW5kZW1lbnRTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyKSkge1xuICAgICAgICBjb25zdCBhbWVuZGVtZW50RmlsZW5hbWUgPVxuICAgICAgICAgIGFtZW5kZW1lbnRTcGxpdFBhdGhbYW1lbmRlbWVudFNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIWFtZW5kZW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbWVuZGVtZW50RmlsZVBhdGggPSBwYXRoLmpvaW4oZGF0YXNldERpciwgLi4uYW1lbmRlbWVudFNwbGl0UGF0aClcbiAgICAgICAgaWYgKGxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7YW1lbmRlbWVudEZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYW1lbmRlbWVudEpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhhbWVuZGVtZW50RmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IGFtZW5kZW1lbnQgPSBBbWVuZGVtZW50c0NvbnZlcnQudG9BbWVuZGVtZW50KGFtZW5kZW1lbnRKc29uKVxuICAgICAgICBpZiAoYW1lbmRlbWVudEJ5VWlkW2FtZW5kZW1lbnQudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgYW1lbmRlbWVudEJ5VWlkW2FtZW5kZW1lbnQudWlkXSA9IGFtZW5kZW1lbnRcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRvY3VtZW50QnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogRG9jdW1lbnQgfSA9IHt9XG4gIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pbjoge1xuICAgIFt1aWQ6IHN0cmluZ106IERvc3NpZXJQYXJsZW1lbnRhaXJlXG4gIH0gPSB7fVxuICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VGl0cmVDaGVtaW46IHtcbiAgICBbdWlkOiBzdHJpbmddOiBEb3NzaWVyUGFybGVtZW50YWlyZVxuICB9ID0ge31cbiAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVCeVVpZDogeyBbdWlkOiBzdHJpbmddOiBEb3NzaWVyUGFybGVtZW50YWlyZSB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5Eb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgZm9yIChjb25zdCBkYXRhc2V0IG9mIGRhdGFzZXRzLmRvc3NpZXJzTGVnaXNsYXRpZnMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhc2V0RGlyID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZVwiKSxcbiAgICAgIClcblxuICAgICAgZm9yIChjb25zdCBkb2N1bWVudFNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXREaXIsIFtcImRvY3VtZW50c1wiXSkpIHtcbiAgICAgICAgY29uc3QgZG9jdW1lbnRGaWxlbmFtZSA9IGRvY3VtZW50U3BsaXRQYXRoW2RvY3VtZW50U3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghZG9jdW1lbnRGaWxlbmFtZS5lbmRzV2l0aChcIi5qc29uXCIpKSB7XG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb2N1bWVudEZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXREaXIsIC4uLmRvY3VtZW50U3BsaXRQYXRoKVxuICAgICAgICBpZiAobG9nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtkb2N1bWVudEZpbGVQYXRofeKApmApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9jdW1lbnRKc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoZG9jdW1lbnRGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZG9jdW1lbnQgPSBEb3NzaWVyc0xlZ2lzbGF0aWZzQ29udmVydC50b0RvY3VtZW50KGRvY3VtZW50SnNvbilcbiAgICAgICAgaWYgKGRvY3VtZW50QnlVaWRbZG9jdW1lbnQudWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgZG9jdW1lbnRCeVVpZFtkb2N1bWVudC51aWRdID0gZG9jdW1lbnRcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IGRvc3NpZXJTcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyLCBbXCJkb3NzaWVyc1wiXSkpIHtcbiAgICAgICAgY29uc3QgZG9zc2llckZpbGVuYW1lID0gZG9zc2llclNwbGl0UGF0aFtkb3NzaWVyU3BsaXRQYXRoLmxlbmd0aCAtIDFdXG4gICAgICAgIGlmICghZG9zc2llckZpbGVuYW1lLmVuZHNXaXRoKFwiLmpzb25cIikpIHtcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRvc3NpZXJGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0RGlyLCAuLi5kb3NzaWVyU3BsaXRQYXRoKVxuICAgICAgICBpZiAobG9nKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtkb3NzaWVyRmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkb3NzaWVySnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGRvc3NpZXJGaWxlUGF0aCwge1xuICAgICAgICAgIGVuY29kaW5nOiBcInV0ZjhcIixcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgZG9zc2llciA9XG4gICAgICAgICAgRG9zc2llcnNMZWdpc2xhdGlmc0NvbnZlcnQudG9Eb3NzaWVyUGFybGVtZW50YWlyZShkb3NzaWVySnNvbilcbiAgICAgICAgY29uc3QgdGl0cmVEb3NzaWVyID0gZG9zc2llci50aXRyZURvc3NpZXJcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRpdHJlRG9zc2llci5zZW5hdENoZW1pbiAmJlxuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pblt0aXRyZURvc3NpZXIuc2VuYXRDaGVtaW5dID09PVxuICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pblt0aXRyZURvc3NpZXIuc2VuYXRDaGVtaW5dID0gZG9zc2llclxuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aXRyZURvc3NpZXIudGl0cmVDaGVtaW4gJiZcbiAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VGl0cmVDaGVtaW5bdGl0cmVEb3NzaWVyLnRpdHJlQ2hlbWluXSA9PT1cbiAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VGl0cmVDaGVtaW5bdGl0cmVEb3NzaWVyLnRpdHJlQ2hlbWluXSA9IGRvc3NpZXJcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9zc2llclBhcmxlbWVudGFpcmVCeVVpZFtkb3NzaWVyLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlVaWRbZG9zc2llci51aWRdID0gZG9zc2llclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbGV0IHBob3RvQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogUGhvdG8gfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuUGhvdG9zKSB7XG4gICAge1xuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGBwaG90b3NfZGVwdXRlc18ke1xuICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSBMZWdpc2xhdHVyZS5BbGwuXG4gICAgICAgICAgbGVnaXNsYXR1cmUgPT09IExlZ2lzbGF0dXJlLkFsbCA/IExlZ2lzbGF0dXJlLkRpeFNlcHQgOiBsZWdpc2xhdHVyZVxuICAgICAgICB9YCxcbiAgICAgICAgXCJkZXB1dGVzLmpzb25cIixcbiAgICAgIClcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGpzb25GaWxlUGF0aCkpIHtcbiAgICAgICAgaWYgKGxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QganNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGpzb25GaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSlcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwaG90b0J5VWlkLCBKU09OLnBhcnNlKGpzb24pKVxuICAgICAgfSBlbHNlIGlmIChsb2cpIHtcbiAgICAgICAgY29uc29sZS5sb2coYElnbm9yaW5nIG1pc3NpbmcgZmlsZTogJHtqc29uRmlsZVBhdGh9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICB7XG4gICAgICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgXCJwaG90b3Nfc2VuYXRldXJzXCIsXG4gICAgICAgIFwic2VuYXRldXJzLmpzb25cIixcbiAgICAgIClcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGpzb25GaWxlUGF0aCkpIHtcbiAgICAgICAgaWYgKGxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QganNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGpzb25GaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSlcbiAgICAgICAgT2JqZWN0LmFzc2lnbihwaG90b0J5VWlkLCBKU09OLnBhcnNlKGpzb24pKVxuICAgICAgfSBlbHNlIGlmIChsb2cpIHtcbiAgICAgICAgY29uc29sZS5sb2coYElnbm9yaW5nIG1pc3NpbmcgZmlsZTogJHtqc29uRmlsZVBhdGh9YClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBzY3J1dGluQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogU2NydXRpbiB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5TY3J1dGlucykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5zY3J1dGlucykge1xuICAgICAgaWYgKGRhdGFzZXQuaWdub3JlRm9yV2ViKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgZGF0YXNldC5sZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBkYXRhc2V0LmxlZ2lzbGF0dXJlXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRhdGFzZXREaXIgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIl9uZXR0b3llXCIpLFxuICAgICAgKVxuXG4gICAgICBmb3IgKGNvbnN0IHNjcnV0aW5TcGxpdFBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyKSkge1xuICAgICAgICBjb25zdCBzY3J1dGluRmlsZW5hbWUgPSBzY3J1dGluU3BsaXRQYXRoW3NjcnV0aW5TcGxpdFBhdGgubGVuZ3RoIC0gMV1cbiAgICAgICAgaWYgKCFzY3J1dGluRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2NydXRpbkZpbGVQYXRoID0gcGF0aC5qb2luKGRhdGFzZXREaXIsIC4uLnNjcnV0aW5TcGxpdFBhdGgpXG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke3NjcnV0aW5GaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNjcnV0aW5Kc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoc2NydXRpbkZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBzY3J1dGluID0gU2NydXRpbnNDb252ZXJ0LnRvU2NydXRpbihzY3J1dGluSnNvbilcbiAgICAgICAgaWYgKHNjcnV0aW5CeVVpZFtzY3J1dGluLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHNjcnV0aW5CeVVpZFtzY3J1dGluLnVpZF0gPSBzY3J1dGluXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBxdWVzdGlvbkJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IFF1ZXN0aW9uIH0gPSB7fVxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlF1ZXN0aW9ucykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5xdWVzdGlvbnMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhc2V0RGlyID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZVwiKSxcbiAgICAgIClcblxuICAgICAgZm9yIChjb25zdCBxdWVzdGlvblNwbGl0UGF0aCBvZiB3YWxrRGlyKGRhdGFzZXREaXIpKSB7XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uRmlsZW5hbWUgPSBxdWVzdGlvblNwbGl0UGF0aFtxdWVzdGlvblNwbGl0UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIXF1ZXN0aW9uRmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcXVlc3Rpb25GaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0RGlyLCAuLi5xdWVzdGlvblNwbGl0UGF0aClcbiAgICAgICAgaWYgKGxvZykge1xuICAgICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7cXVlc3Rpb25GaWxlUGF0aH3igKZgKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uSnNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKHF1ZXN0aW9uRmlsZVBhdGgsIHtcbiAgICAgICAgICBlbmNvZGluZzogXCJ1dGY4XCIsXG4gICAgICAgIH0pXG4gICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gUXVlc3Rpb25zQ29udmVydC50b1F1ZXN0aW9uKHF1ZXN0aW9uSnNvbilcbiAgICAgICAgaWYgKHF1ZXN0aW9uQnlVaWRbcXVlc3Rpb24udWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcXVlc3Rpb25CeVVpZFtxdWVzdGlvbi51aWRdID0gcXVlc3Rpb25cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbXB0ZVJlbmR1QnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogQ29tcHRlUmVuZHUgfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQ29tcHRlc1JlbmR1c1NlYW5jZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuY29tcHRlc1JlbmR1c1NlYW5jZXMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBkYXRhc2V0RGlyID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZVwiKSxcbiAgICAgIClcblxuICAgICAgZm9yIChjb25zdCBjb21wdGVSZW5kdVBhdGggb2Ygd2Fsa0RpcihkYXRhc2V0RGlyKSkge1xuICAgICAgICBjb25zdCBjb21wdGVSZW5kdUZpbGVuYW1lID0gY29tcHRlUmVuZHVQYXRoW2NvbXB0ZVJlbmR1UGF0aC5sZW5ndGggLSAxXVxuICAgICAgICBpZiAoIWNvbXB0ZVJlbmR1RmlsZW5hbWUuZW5kc1dpdGgoXCIuanNvblwiKSkge1xuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29tcHRlUmVuZHVGaWxlUGF0aCA9IHBhdGguam9pbihkYXRhc2V0RGlyLCAuLi5jb21wdGVSZW5kdVBhdGgpXG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2NvbXB0ZVJlbmR1RmlsZVBhdGh94oCmYClcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb21wdGVSZW5kdUpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhjb21wdGVSZW5kdUZpbGVQYXRoLCB7XG4gICAgICAgICAgZW5jb2Rpbmc6IFwidXRmOFwiLFxuICAgICAgICB9KVxuICAgICAgICBjb25zdCBjb21wdGVSZW5kdSA9IENvbXB0ZXNSZW5kdXNDb252ZXJ0LnRvQ29tcHRlUmVuZHUoY29tcHRlUmVuZHVKc29uKVxuICAgICAgICBpZiAoY29tcHRlUmVuZHVCeVVpZFtjb21wdGVSZW5kdS51aWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb21wdGVSZW5kdUJ5VWlkW2NvbXB0ZVJlbmR1LnVpZF0gPSBjb21wdGVSZW5kdVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhY3RldXJCeVVpZCxcbiAgICBhbWVuZGVtZW50QnlVaWQsXG4gICAgZG9jdW1lbnRCeVVpZCxcbiAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5U2VuYXRDaGVtaW4sXG4gICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVRpdHJlQ2hlbWluLFxuICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlVaWQsXG4gICAgb3JnYW5lQnlVaWQsXG4gICAgcGhvdG9CeVVpZCxcbiAgICByZXVuaW9uQnlVaWQsXG4gICAgcmV1bmlvbnNCeURheSxcbiAgICByZXVuaW9uc0J5RG9zc2llclVpZCxcbiAgICBzY3J1dGluQnlVaWQsXG4gICAgcXVlc3Rpb25CeVVpZCxcbiAgICBjb21wdGVSZW5kdUJ5VWlkLFxuICB9XG59XG5cbi8vLyBMb2FkIGRhdGEgZnJvbSBiaWcgbW9ub2x5dGljIGZpbGVzLlxuLy8vIERlcHJlY2F0ZWQ6IEFzc2VtYmzDqWUgbmF0aW9uYWxlIG9wZW4gZGF0YSBubyBtb3JlIHVzZXMgbW9ub2x5dGljIGZpbGVzLlxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRBc3NlbWJsZWVEYXRhRnJvbUJpZ0ZpbGVzKFxuICBkYXRhRGlyOiBzdHJpbmcsXG4gIGVuYWJsZWREYXRhc2V0czogRW5hYmxlZERhdGFzZXRzLFxuICBsZWdpc2xhdHVyZTogTGVnaXNsYXR1cmUsXG4gIHsgbG9nID0gZmFsc2UgfSA9IHt9LFxuKTogRGF0YSB7XG4gIGNvbnN0IGFjdGV1ckJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IEFjdGV1ciB9ID0ge31cbiAgY29uc3Qgb3JnYW5lQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogT3JnYW5lIH0gPSB7fVxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLkFjdGV1cnNFdE9yZ2FuZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuYWN0ZXVyc0V0T3JnYW5lcykge1xuICAgICAgaWYgKGRhdGFzZXQuaWdub3JlRm9yV2ViKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgZGF0YXNldC5sZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGxlZ2lzbGF0dXJlICE9PSBkYXRhc2V0LmxlZ2lzbGF0dXJlXG4gICAgICApIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBkYXRhc2V0LmZpbGVuYW1lLnJlcGxhY2UoL1xcLmpzb24kLywgXCJfbmV0dG95ZS5qc29uXCIpLFxuICAgICAgKVxuICAgICAgaWYgKGxvZykge1xuICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICAgICAgfVxuICAgICAgY29uc3QganNvbjogc3RyaW5nID0gZnMucmVhZEZpbGVTeW5jKGpzb25GaWxlUGF0aCwgeyBlbmNvZGluZzogXCJ1dGY4XCIgfSlcbiAgICAgIGNvbnN0IGFjdGV1cnNFdE9yZ2FuZXMgPSBBY3RldXJzRXRPcmdhbmVzQ29udmVydC50b0FjdGV1cnNFdE9yZ2FuZXMoanNvbilcbiAgICAgIGZvciAoY29uc3QgYWN0ZXVyIG9mIGFjdGV1cnNFdE9yZ2FuZXMuYWN0ZXVycykge1xuICAgICAgICAvLyBLZWVwIHRoZSBmaXJzdCBleGlzdGluZyBcImFjdGV1clwiLCBiZWNhdXNlIHRoZSBmaXJzdCB3cmFwcGVyIGlzIHRoZSBtb3N0IGNvbXBsZXRlLlxuICAgICAgICBpZiAoYWN0ZXVyQnlVaWRbYWN0ZXVyLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGFjdGV1ckJ5VWlkW2FjdGV1ci51aWRdID0gYWN0ZXVyXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qgb3JnYW5lIG9mIGFjdGV1cnNFdE9yZ2FuZXMub3JnYW5lcykge1xuICAgICAgICAvLyBLZWVwIHRoZSBmaXJzdCBleGlzdGluZyBcIm9yZ2FuZVwiLCBiZWNhdXNlIHRoZSBmaXJzdCB3cmFwcGVyIGlzIHRoZSBtb3N0IGNvbXBsZXRlLlxuICAgICAgICBpZiAob3JnYW5lQnlVaWRbb3JnYW5lLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIG9yZ2FuZUJ5VWlkW29yZ2FuZS51aWRdID0gb3JnYW5lXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCByZXVuaW9uQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogUmV1bmlvbiB9ID0ge31cbiAgY29uc3QgcmV1bmlvbnNCeURheTogeyBbZGF5OiBzdHJpbmddOiBSZXVuaW9uW10gfSA9IHt9XG4gIGNvbnN0IHJldW5pb25zQnlEb3NzaWVyVWlkOiB7IFtkb3NzaWVyVWlkOiBzdHJpbmddOiBSZXVuaW9uW10gfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQWdlbmRhcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5hZ2VuZGFzKSB7XG4gICAgICBpZiAoZGF0YXNldC5pZ25vcmVGb3JXZWIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBkYXRhc2V0LmxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IGRhdGFzZXQubGVnaXNsYXR1cmVcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIl9uZXR0b3llLmpzb25cIiksXG4gICAgICApXG4gICAgICBpZiAobG9nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICB9XG4gICAgICBjb25zdCBqc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoanNvbkZpbGVQYXRoLCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KVxuICAgICAgY29uc3QgYWdlbmRhcyA9IEFnZW5kYXNDb252ZXJ0LnRvQWdlbmRhcyhqc29uKVxuICAgICAgZm9yIChjb25zdCByZXVuaW9uIG9mIGFnZW5kYXMucmV1bmlvbnMpIHtcbiAgICAgICAgaWYgKHJldW5pb25CeVVpZFtyZXVuaW9uLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldW5pb25CeVVpZFtyZXVuaW9uLnVpZF0gPSByZXVuaW9uXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkYXkgPSByZXVuaW9uLnRpbWVzdGFtcERlYnV0LnRvSVNPU3RyaW5nKCkuc3BsaXQoXCJUXCIpWzBdXG4gICAgICAgIGxldCByZXVuaW9uc0F0RGF5ID0gcmV1bmlvbnNCeURheVtkYXldXG4gICAgICAgIGlmIChyZXVuaW9uc0F0RGF5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXVuaW9uc0F0RGF5ID0gcmV1bmlvbnNCeURheVtkYXldID0gW11cbiAgICAgICAgfVxuICAgICAgICByZXVuaW9uc0F0RGF5LnB1c2gocmV1bmlvbilcblxuICAgICAgICBjb25zdCBvZGogPSByZXVuaW9uLm9kalxuICAgICAgICBpZiAob2RqICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHBvaW50T2RqIG9mIG9kai5wb2ludHNPZGogfHwgW10pIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZG9zc2llckxlZ2lzbGF0aWZSZWYgb2YgcG9pbnRPZGouZG9zc2llcnNMZWdpc2xhdGlmc1JlZnMgfHxcbiAgICAgICAgICAgICAgW10pIHtcbiAgICAgICAgICAgICAgbGV0IHJldW5pb25zQXREb3NzaWVyVWlkID1cbiAgICAgICAgICAgICAgICByZXVuaW9uc0J5RG9zc2llclVpZFtkb3NzaWVyTGVnaXNsYXRpZlJlZl1cbiAgICAgICAgICAgICAgaWYgKHJldW5pb25zQXREb3NzaWVyVWlkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXVuaW9uc0F0RG9zc2llclVpZCA9IHJldW5pb25zQnlEb3NzaWVyVWlkW1xuICAgICAgICAgICAgICAgICAgZG9zc2llckxlZ2lzbGF0aWZSZWZcbiAgICAgICAgICAgICAgICBdID0gW11cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXVuaW9uc0F0RG9zc2llclVpZC5wdXNoKHJldW5pb24pXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgYW1lbmRlbWVudEJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IEFtZW5kZW1lbnQgfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQW1lbmRlbWVudHMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuYW1lbmRlbWVudHMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiX25ldHRveWUuanNvblwiKSxcbiAgICAgIClcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtqc29uRmlsZVBhdGh9YClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICBjb25zdCBhbWVuZGVtZW50cyA9IEFtZW5kZW1lbnRzQ29udmVydC50b0FtZW5kZW1lbnRzKGpzb24pXG4gICAgICBmb3IgKGNvbnN0IHRleHRlTGVnaXNsYXRpZiBvZiBhbWVuZGVtZW50cy50ZXh0ZXNMZWdpc2xhdGlmcykge1xuICAgICAgICBmb3IgKGNvbnN0IGFtZW5kZW1lbnQgb2YgdGV4dGVMZWdpc2xhdGlmLmFtZW5kZW1lbnRzKSB7XG4gICAgICAgICAgaWYgKGFtZW5kZW1lbnRCeVVpZFthbWVuZGVtZW50LnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYW1lbmRlbWVudEJ5VWlkW2FtZW5kZW1lbnQudWlkXSA9IGFtZW5kZW1lbnRcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBkb2N1bWVudEJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IERvY3VtZW50IH0gPSB7fVxuICBjb25zdCBkb3NzaWVyUGFybGVtZW50YWlyZUJ5U2VuYXRDaGVtaW46IHtcbiAgICBbdWlkOiBzdHJpbmddOiBEb3NzaWVyUGFybGVtZW50YWlyZVxuICB9ID0ge31cbiAgY29uc3QgZG9zc2llclBhcmxlbWVudGFpcmVCeVRpdHJlQ2hlbWluOiB7XG4gICAgW3VpZDogc3RyaW5nXTogRG9zc2llclBhcmxlbWVudGFpcmVcbiAgfSA9IHt9XG4gIGNvbnN0IGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogRG9zc2llclBhcmxlbWVudGFpcmUgfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuRG9zc2llcnNMZWdpc2xhdGlmcykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5kb3NzaWVyc0xlZ2lzbGF0aWZzKSB7XG4gICAgICBpZiAoZGF0YXNldC5pZ25vcmVGb3JXZWIpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBkYXRhc2V0LmxlZ2lzbGF0dXJlICE9PSBMZWdpc2xhdHVyZS5BbGwgJiZcbiAgICAgICAgbGVnaXNsYXR1cmUgIT09IGRhdGFzZXQubGVnaXNsYXR1cmVcbiAgICAgICkge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIGRhdGFzZXQuZmlsZW5hbWUucmVwbGFjZSgvXFwuanNvbiQvLCBcIl9uZXR0b3llLmpzb25cIiksXG4gICAgICApXG4gICAgICBpZiAobG9nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBMb2FkaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICB9XG4gICAgICBjb25zdCBqc29uOiBzdHJpbmcgPSBmcy5yZWFkRmlsZVN5bmMoanNvbkZpbGVQYXRoLCB7IGVuY29kaW5nOiBcInV0ZjhcIiB9KVxuICAgICAgY29uc3QgZG9zc2llcnNMZWdpc2xhdGlmcyA9XG4gICAgICAgIERvc3NpZXJzTGVnaXNsYXRpZnNDb252ZXJ0LnRvRG9zc2llcnNMZWdpc2xhdGlmcyhqc29uKVxuICAgICAgZm9yIChjb25zdCBkb2N1bWVudCBvZiBkb3NzaWVyc0xlZ2lzbGF0aWZzLnRleHRlc0xlZ2lzbGF0aWZzKSB7XG4gICAgICAgIGlmIChkb2N1bWVudEJ5VWlkW2RvY3VtZW50LnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRvY3VtZW50QnlVaWRbZG9jdW1lbnQudWlkXSA9IGRvY3VtZW50XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZG9zc2llciBvZiBkb3NzaWVyc0xlZ2lzbGF0aWZzLmRvc3NpZXJzUGFybGVtZW50YWlyZXMpIHtcbiAgICAgICAgY29uc3QgdGl0cmVEb3NzaWVyID0gZG9zc2llci50aXRyZURvc3NpZXJcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHRpdHJlRG9zc2llci5zZW5hdENoZW1pbiAmJlxuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pblt0aXRyZURvc3NpZXIuc2VuYXRDaGVtaW5dID09PVxuICAgICAgICAgICAgdW5kZWZpbmVkXG4gICAgICAgICkge1xuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlTZW5hdENoZW1pblt0aXRyZURvc3NpZXIuc2VuYXRDaGVtaW5dID0gZG9zc2llclxuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0aXRyZURvc3NpZXIudGl0cmVDaGVtaW4gJiZcbiAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VGl0cmVDaGVtaW5bdGl0cmVEb3NzaWVyLnRpdHJlQ2hlbWluXSA9PT1cbiAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgICApIHtcbiAgICAgICAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5VGl0cmVDaGVtaW5bdGl0cmVEb3NzaWVyLnRpdHJlQ2hlbWluXSA9IGRvc3NpZXJcbiAgICAgICAgfVxuICAgICAgICBpZiAoZG9zc2llclBhcmxlbWVudGFpcmVCeVVpZFtkb3NzaWVyLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlVaWRbZG9zc2llci51aWRdID0gZG9zc2llclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcGhvdG9CeVVpZDogeyBbdWlkOiBzdHJpbmddOiBQaG90byB9ID0ge31cbiAgaWYgKGVuYWJsZWREYXRhc2V0cyAmIEVuYWJsZWREYXRhc2V0cy5QaG90b3MpIHtcbiAgICBjb25zdCBwaG90b0J5VWlkID0ge31cblxuICAgIHtcbiAgICAgIGNvbnN0IGpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgICAgICBkYXRhRGlyLFxuICAgICAgICBgcGhvdG9zX2RlcHV0ZXNfJHtcbiAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgTGVnaXNsYXR1cmUuQWxsLlxuICAgICAgICAgIGxlZ2lzbGF0dXJlID09PSBMZWdpc2xhdHVyZS5BbGwgPyBMZWdpc2xhdHVyZS5EaXhTZXB0IDogbGVnaXNsYXR1cmVcbiAgICAgICAgfWAsXG4gICAgICAgIFwiZGVwdXRlcy5qc29uXCIsXG4gICAgICApXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhqc29uRmlsZVBhdGgpKSB7XG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGhvdG9CeVVpZCwgSlNPTi5wYXJzZShqc29uKSlcbiAgICAgIH0gZWxzZSBpZiAobG9nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBJZ25vcmluZyBtaXNzaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICB9XG4gICAgfVxuXG4gICAge1xuICAgICAgY29uc3QganNvbkZpbGVQYXRoOiBzdHJpbmcgPSBwYXRoLmpvaW4oXG4gICAgICAgIGRhdGFEaXIsXG4gICAgICAgIFwicGhvdG9zX3NlbmF0ZXVyc1wiLFxuICAgICAgICBcInNlbmF0ZXVycy5qc29uXCIsXG4gICAgICApXG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhqc29uRmlsZVBhdGgpKSB7XG4gICAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICAgIE9iamVjdC5hc3NpZ24ocGhvdG9CeVVpZCwgSlNPTi5wYXJzZShqc29uKSlcbiAgICAgIH0gZWxzZSBpZiAobG9nKSB7XG4gICAgICAgIGNvbnNvbGUubG9nKGBJZ25vcmluZyBtaXNzaW5nIGZpbGU6ICR7anNvbkZpbGVQYXRofWApXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc2NydXRpbkJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IFNjcnV0aW4gfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuU2NydXRpbnMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuc2NydXRpbnMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiX25ldHRveWUuanNvblwiKSxcbiAgICAgIClcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtqc29uRmlsZVBhdGh9YClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICBjb25zdCBzY3J1dGlucyA9IFNjcnV0aW5zQ29udmVydC50b1NjcnV0aW5zKGpzb24pXG4gICAgICBmb3IgKGNvbnN0IHNjcnV0aW4gb2Ygc2NydXRpbnMuc2NydXRpbnMpIHtcbiAgICAgICAgaWYgKHNjcnV0aW5CeVVpZFtzY3J1dGluLnVpZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHNjcnV0aW5CeVVpZFtzY3J1dGluLnVpZF0gPSBzY3J1dGluXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBxdWVzdGlvbkJ5VWlkOiB7IFt1aWQ6IHN0cmluZ106IFF1ZXN0aW9uIH0gPSB7fVxuICBpZiAoZW5hYmxlZERhdGFzZXRzICYgRW5hYmxlZERhdGFzZXRzLlF1ZXN0aW9ucykge1xuICAgIGZvciAoY29uc3QgZGF0YXNldCBvZiBkYXRhc2V0cy5xdWVzdGlvbnMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiX25ldHRveWUuanNvblwiKSxcbiAgICAgIClcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtqc29uRmlsZVBhdGh9YClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICBjb25zdCBxdWVzdGlvbnMgPSBRdWVzdGlvbnNDb252ZXJ0LnRvUXVlc3Rpb25zKGpzb24pXG4gICAgICBmb3IgKGNvbnN0IHF1ZXN0aW9uIG9mIHF1ZXN0aW9ucy5xdWVzdGlvbnMpIHtcbiAgICAgICAgaWYgKHF1ZXN0aW9uQnlVaWRbcXVlc3Rpb24udWlkXSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcXVlc3Rpb25CeVVpZFtxdWVzdGlvbi51aWRdID0gcXVlc3Rpb25cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGNvbXB0ZVJlbmR1QnlVaWQ6IHsgW3VpZDogc3RyaW5nXTogQ29tcHRlUmVuZHUgfSA9IHt9XG4gIGlmIChlbmFibGVkRGF0YXNldHMgJiBFbmFibGVkRGF0YXNldHMuQ29tcHRlc1JlbmR1c1NlYW5jZXMpIHtcbiAgICBmb3IgKGNvbnN0IGRhdGFzZXQgb2YgZGF0YXNldHMuY29tcHRlc1JlbmR1c1NlYW5jZXMpIHtcbiAgICAgIGlmIChkYXRhc2V0Lmlnbm9yZUZvcldlYikge1xuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gTGVnaXNsYXR1cmUuQWxsICYmXG4gICAgICAgIGRhdGFzZXQubGVnaXNsYXR1cmUgIT09IExlZ2lzbGF0dXJlLkFsbCAmJlxuICAgICAgICBsZWdpc2xhdHVyZSAhPT0gZGF0YXNldC5sZWdpc2xhdHVyZVxuICAgICAgKSB7XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG4gICAgICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICAgICAgZGF0YURpcixcbiAgICAgICAgZGF0YXNldC5maWxlbmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sIFwiX25ldHRveWUuanNvblwiKSxcbiAgICAgIClcbiAgICAgIGlmIChsb2cpIHtcbiAgICAgICAgY29uc29sZS5sb2coYExvYWRpbmcgZmlsZTogJHtqc29uRmlsZVBhdGh9YClcbiAgICAgIH1cbiAgICAgIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gICAgICBjb25zdCBjb21wdGVzUmVuZHVzID0gQ29tcHRlc1JlbmR1c0NvbnZlcnQudG9Db21wdGVzUmVuZHVzKGpzb24pXG4gICAgICBmb3IgKGNvbnN0IGNvbXB0ZVJlbmR1IG9mIGNvbXB0ZXNSZW5kdXMuY29tcHRlc1JlbmR1cykge1xuICAgICAgICBpZiAoY29tcHRlUmVuZHVCeVVpZFtjb21wdGVSZW5kdS51aWRdID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb21wdGVSZW5kdUJ5VWlkW2NvbXB0ZVJlbmR1LnVpZF0gPSBjb21wdGVSZW5kdVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBhY3RldXJCeVVpZCxcbiAgICBhbWVuZGVtZW50QnlVaWQsXG4gICAgZG9jdW1lbnRCeVVpZCxcbiAgICBkb3NzaWVyUGFybGVtZW50YWlyZUJ5U2VuYXRDaGVtaW4sXG4gICAgZG9zc2llclBhcmxlbWVudGFpcmVCeVRpdHJlQ2hlbWluLFxuICAgIGRvc3NpZXJQYXJsZW1lbnRhaXJlQnlVaWQsXG4gICAgb3JnYW5lQnlVaWQsXG4gICAgcGhvdG9CeVVpZCxcbiAgICByZXVuaW9uQnlVaWQsXG4gICAgcmV1bmlvbnNCeURheSxcbiAgICByZXVuaW9uc0J5RG9zc2llclVpZCxcbiAgICBzY3J1dGluQnlVaWQsXG4gICAgcXVlc3Rpb25CeVVpZCxcbiAgICBjb21wdGVSZW5kdUJ5VWlkLFxuICB9XG59XG5cbi8qKlxuICogUmVhZCBpbmZvcyBvZiBhIGRvY3VtZW50IG9yIGEgZGl2aXNpb24gb2YgYSBkb2N1bWVudCBmcm9tIGZpbGUgc3lzdGVtXG4gKlxuICogQHBhcmFtIGRhdGFEaXJcbiAqIEBwYXJhbSB1aWQgVUlEIG9mIGEgZG9jdW1lbnQgb3IgYSBkaXZpc2lvblxuICogQHBhcmFtIGZvcm1hdHMgcmVxdWVzdGVkIGZvcm1hdHMgb2YgdGhlIGRvY3VtZW50IGluIGRlY3JlYXNpbmcgcHJlZmVyZW5jZSBvcmRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9hZEFzc2VtYmxlZURvY3VtZW50RmlsZShcbiAgZGF0YURpcjogc3RyaW5nLFxuICB1aWQ6IHN0cmluZyxcbiAgZm9ybWF0czogRG9jdW1lbnRVcmxGb3JtYXRbXSxcbik6XG4gIHwge1xuICAgICAgZm9ybWF0OiBEb2N1bWVudFVybEZvcm1hdFxuICAgICAgcGF0aDogc3RyaW5nXG4gICAgICB1cmw6IHN0cmluZ1xuICAgIH1cbiAgfCB1bmRlZmluZWQge1xuICBjb25zdCBkb2N1bWVudHNEaXIgPSBwYXRoLmpvaW4oZGF0YURpciwgXCJEb2N1bWVudHNcIilcbiAgY29uc3QgZG9jdW1lbnREaXIgPSBwYXRoRnJvbURvY3VtZW50VWlkKGRvY3VtZW50c0RpciwgdWlkKVxuICBjb25zdCBpbmRleFBhdGggPSBwYXRoLmpvaW4oZG9jdW1lbnREaXIsIFwiaW5kZXguanNvblwiKVxuICBpZiAoIWZzLnBhdGhFeGlzdHNTeW5jKGluZGV4UGF0aCkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cbiAgY29uc3QgaW5kZXggPSBmcy5yZWFkSnNvblN5bmMoaW5kZXhQYXRoKSBhcyBEb2N1bWVudEZpbGVzSW5kZXhcbiAgZm9yIChjb25zdCBmb3JtYXQgb2YgZm9ybWF0cykge1xuICAgIGZvciAoY29uc3QgeyBmaWxlbmFtZSwgdXJsIH0gb2YgaW5kZXhbZm9ybWF0XSA/PyBbXSkge1xuICAgICAgaWYgKGZpbGVuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIHJldHVybiB7IGZvcm1hdCwgcGF0aDogcGF0aC5qb2luKGRvY3VtZW50RGlyLCBmaWxlbmFtZSksIHVybCB9XG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvYWRBc3NlbWJsZWVQaG90b3NEZXB1dGVzKFxuICBkYXRhRGlyOiBzdHJpbmcsXG4gIGxlZ2lzbGF0dXJlOiBMZWdpc2xhdHVyZSxcbiAgeyBsb2cgPSBmYWxzZSB9ID0ge30sXG4pOiB7IFt1aWQ6IHN0cmluZ106IFBob3RvIH0ge1xuICBjb25zdCBqc29uRmlsZVBhdGg6IHN0cmluZyA9IHBhdGguam9pbihcbiAgICBkYXRhRGlyLFxuICAgIGBwaG90b3NfZGVwdXRlc18ke1xuICAgICAgLy8gVE9ETzogSGFuZGxlIExlZ2lzbGF0dXJlLkFsbC5cbiAgICAgIGxlZ2lzbGF0dXJlID09PSBMZWdpc2xhdHVyZS5BbGwgPyBMZWdpc2xhdHVyZS5EaXhTZXB0IDogbGVnaXNsYXR1cmVcbiAgICB9YCxcbiAgICBcImRlcHV0ZXMuanNvblwiLFxuICApXG4gIGlmIChsb2cpIHtcbiAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICB9XG4gIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gIHJldHVybiBKU09OLnBhcnNlKGpzb24pIGFzIHsgW3VpZDogc3RyaW5nXTogUGhvdG8gfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbG9hZEFzc2VtYmxlZVBob3Rvc1NlbmF0ZXVycyhcbiAgZGF0YURpcjogc3RyaW5nLFxuICB7IGxvZyA9IGZhbHNlIH0gPSB7fSxcbik6IHsgW3VpZDogc3RyaW5nXTogUGhvdG8gfSB7XG4gIGNvbnN0IGpzb25GaWxlUGF0aDogc3RyaW5nID0gcGF0aC5qb2luKFxuICAgIGRhdGFEaXIsXG4gICAgXCJwaG90b3Nfc2VuYXRldXJzXCIsXG4gICAgXCJzZW5hdGV1cnMuanNvblwiLFxuICApXG4gIGlmIChsb2cpIHtcbiAgICBjb25zb2xlLmxvZyhgTG9hZGluZyBmaWxlOiAke2pzb25GaWxlUGF0aH1gKVxuICB9XG4gIGNvbnN0IGpzb246IHN0cmluZyA9IGZzLnJlYWRGaWxlU3luYyhqc29uRmlsZVBhdGgsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pXG4gIHJldHVybiBKU09OLnBhcnNlKGpzb24pIGFzIHsgW3VpZDogc3RyaW5nXTogUGhvdG8gfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aEZyb21Eb2N1bWVudFVpZChkb2N1bWVudHNEaXI6IHN0cmluZywgdWlkOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtYXRjaCA9IHVpZC5tYXRjaChkb2N1bWVudFVpZFJlZ2V4KVxuICBhc3NlcnQubm90U3RyaWN0RXF1YWwoXG4gICAgbWF0Y2gsXG4gICAgbnVsbCxcbiAgICBgVW5leHBlY3RlZCBzdHJ1Y3R1cmUgZm9yIGRvY3VtZW50IFVJRDogJHt1aWR9YCxcbiAgKVxuICBjb25zdCBncm91cHMgPSBtYXRjaCEuZ3JvdXBzIGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH1cbiAgY29uc3QgZG9jdW1lbnRUeXBlID0gcGF0aC5qb2luKFxuICAgIGRvY3VtZW50c0RpcixcbiAgICBncm91cHMuZG9jdW1lbnRUeXBlID8/IGdyb3Vwcy5kb2N1bWVudFR5cGUyLFxuICApXG4gIGNvbnN0IGNoYW1icmVEaXIgPSBwYXRoLmpvaW4oZG9jdW1lbnRUeXBlLCBncm91cHMuY2hhbWJyZSA/PyBncm91cHMuY2hhbWJyZTIpXG4gIGNvbnN0IHJlcHVibGlxdWVEaXIgPSBwYXRoLmpvaW4oXG4gICAgY2hhbWJyZURpcixcbiAgICBncm91cHMucmVwdWJsaXF1ZSA/PyBncm91cHMucmVwdWJsaXF1ZTIsXG4gIClcbiAgY29uc3QgbGVnaXNsYXR1cmVEaXIgPSBwYXRoLmpvaW4oXG4gICAgcmVwdWJsaXF1ZURpcixcbiAgICBncm91cHMubGVnaXNsYXR1cmUgPz8gZ3JvdXBzLmxlZ2lzbGF0dXJlMixcbiAgKVxuICBjb25zdCBldGF0ID0gZ3JvdXBzLmV0YXRcbiAgaWYgKGV0YXQgPT09IHVuZGVmaW5lZCkge1xuICAgIGZzLmVuc3VyZURpclN5bmMobGVnaXNsYXR1cmVEaXIpXG4gICAgcmV0dXJuIHBhdGguam9pbihsZWdpc2xhdHVyZURpciwgdWlkKVxuICB9XG4gIGNvbnN0IGV0YXREaXIgPSBwYXRoLmpvaW4obGVnaXNsYXR1cmVEaXIsIGV0YXQpXG4gIGxldCBudW1lcm8gPSBcIjAwMDAwMFwiICsgKGdyb3Vwcy5udW1lcm8gPz8gZ3JvdXBzLm51bWVybzIpXG4gIG51bWVybyA9IG51bWVyby5zdWJzdHJpbmcobnVtZXJvLmxlbmd0aCAtIDYpXG4gIGNvbnN0IG51bWVyb01pbGxpZXJzRGlyID0gcGF0aC5qb2luKGV0YXREaXIsIG51bWVyby5zdWJzdHJpbmcoMCwgMykpXG4gIGZzLmVuc3VyZURpclN5bmMobnVtZXJvTWlsbGllcnNEaXIpXG4gIHJldHVybiBwYXRoLmpvaW4obnVtZXJvTWlsbGllcnNEaXIsIHVpZClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhGcm9tRG9zc2llclBhcmxlbWVudGFpcmVVaWQoXG4gIGRvc3NpZXJzRGlyOiBzdHJpbmcsXG4gIHVpZDogc3RyaW5nLFxuKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGhGcm9tVWlkKGRvc3NpZXJzRGlyLCB1aWQsIGRvc3NpZXJVaWRSZWdleClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhGcm9tUmV1bmlvblVpZChyZXVuaW9uc0Rpcjogc3RyaW5nLCB1aWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG1hdGNoID0gcmV1bmlvblVpZFJlZ2V4LmV4ZWModWlkKVxuICBhc3NlcnQubm90U3RyaWN0RXF1YWwoXG4gICAgbWF0Y2gsXG4gICAgbnVsbCxcbiAgICBgVW5leHBlY3RlZCBzdHJ1Y3R1cmUgZm9yIHJldW5pb24gVUlEOiAke3VpZH1gLFxuICApXG4gIGNvbnN0IGNoYW1icmVEaXIgPSBwYXRoLmpvaW4ocmV1bmlvbnNEaXIsIG1hdGNoIVsxXSlcbiAgY29uc3QgcmVwdWJsaXF1ZURpciA9IHBhdGguam9pbihjaGFtYnJlRGlyLCBtYXRjaCFbMl0pXG4gIGNvbnN0IGxlZ2lzbGF0dXJlRGlyID0gcGF0aC5qb2luKHJlcHVibGlxdWVEaXIsIG1hdGNoIVszXSlcbiAgY29uc3Qgc2Vzc2lvbkRpciA9IHBhdGguam9pbihsZWdpc2xhdHVyZURpciwgbWF0Y2ghWzRdKVxuICBjb25zdCBpZERpciA9IHBhdGguam9pbihzZXNzaW9uRGlyLCBtYXRjaCFbNV0pXG4gIGxldCBudW1lcm8gPSBcIjAwMDAwMDAwMFwiICsgbWF0Y2ghWzZdXG4gIG51bWVybyA9IG51bWVyby5zdWJzdHJpbmcobnVtZXJvLmxlbmd0aCAtIDkpXG4gIGNvbnN0IG51bWVyb01pbGxpb25zRGlyID0gcGF0aC5qb2luKGlkRGlyLCBudW1lcm8uc3Vic3RyaW5nKDAsIDMpKVxuICBjb25zdCBudW1lcm9NaWxsaWVyc0RpciA9IHBhdGguam9pbihudW1lcm9NaWxsaW9uc0RpciwgbnVtZXJvLnN1YnN0cmluZygzLCAzKSlcbiAgZnMuZW5zdXJlRGlyU3luYyhudW1lcm9NaWxsaWVyc0RpcilcbiAgcmV0dXJuIHBhdGguam9pbihudW1lcm9NaWxsaWVyc0RpciwgdWlkKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aEZyb21TY3J1dGluVWlkKHNjcnV0aW5zRGlyOiBzdHJpbmcsIHVpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgbWF0Y2ggPSBzY3J1dGluVWlkUmVnZXguZXhlYyh1aWQpXG4gIGFzc2VydC5ub3RTdHJpY3RFcXVhbChcbiAgICBtYXRjaCxcbiAgICBudWxsLFxuICAgIGBVbmV4cGVjdGVkIHN0cnVjdHVyZSBmb3Igc2NydXRpbiBVSUQ6ICR7dWlkfWAsXG4gIClcbiAgY29uc3QgY2hhbWJyZURpciA9IHBhdGguam9pbihzY3J1dGluc0RpciwgbWF0Y2ghWzFdKVxuICBjb25zdCByZXB1YmxpcXVlRGlyID0gcGF0aC5qb2luKGNoYW1icmVEaXIsIG1hdGNoIVsyXSlcbiAgY29uc3QgbGVnaXNsYXR1cmVEaXIgPSBwYXRoLmpvaW4ocmVwdWJsaXF1ZURpciwgbWF0Y2ghWzNdKVxuICBsZXQgbnVtZXJvID0gXCIwMDAwMDBcIiArIG1hdGNoIVs0XVxuICBudW1lcm8gPSBudW1lcm8uc3Vic3RyaW5nKG51bWVyby5sZW5ndGggLSA2KVxuICBjb25zdCBudW1lcm9NaWxsaWVyc0RpciA9IHBhdGguam9pbihsZWdpc2xhdHVyZURpciwgbnVtZXJvLnN1YnN0cmluZygwLCAzKSlcbiAgZnMuZW5zdXJlRGlyU3luYyhudW1lcm9NaWxsaWVyc0RpcilcbiAgcmV0dXJuIHBhdGguam9pbihudW1lcm9NaWxsaWVyc0RpciwgdWlkKVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aEZyb21RdWVzdGlvblVpZChkYXRhRGlyOiBzdHJpbmcsIHVpZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGhGcm9tVWlkKGRhdGFEaXIsIHVpZCwgcXVlc3Rpb25VaWRSZWdleClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhGcm9tQ29tcHRlUmVuZHVVaWQoZGF0YURpcjogc3RyaW5nLCB1aWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBwYXRoRnJvbVVpZChkYXRhRGlyLCB1aWQsIGNvbXB0ZVJlbmR1VWlkUmVnZXgpXG59XG5cbi8vIEdldCBzdGFuZGFyZCBwYXRoIGZvciBvYmplY3Qgd2l0aCB1aWQgOiByZXB1YmxpcXVlID4gbGVnaXNsYXR1cmUgPiBncm91cCBvYmplY3RzIGJ5IHRob3VzYW5kc1xuZnVuY3Rpb24gcGF0aEZyb21VaWQoZGF0YURpcjogc3RyaW5nLCB1aWQ6IHN0cmluZywgZGF0YVJlZ2V4cDogUmVnRXhwKTogc3RyaW5nIHtcbiAgY29uc3QgbWF0Y2ggPSBkYXRhUmVnZXhwLmV4ZWModWlkKVxuICBhc3NlcnQubm90U3RyaWN0RXF1YWwoXG4gICAgbWF0Y2gsXG4gICAgbnVsbCxcbiAgICBgVW5leHBlY3RlZCBzdHJ1Y3R1cmUgZm9yIG9iamVjdCB3aXRoIFVJRDogJHt1aWR9YCxcbiAgKVxuICBjb25zdCByZXB1YmxpcXVlRGlyID0gcGF0aC5qb2luKGRhdGFEaXIsIG1hdGNoIVsxXSlcbiAgY29uc3QgbGVnaXNsYXR1cmVEaXIgPSBwYXRoLmpvaW4ocmVwdWJsaXF1ZURpciwgbWF0Y2ghWzJdKVxuICBsZXQgbnVtZXJvID0gXCIwMDAwMDBcIiArIG1hdGNoIVszXVxuICBudW1lcm8gPSBudW1lcm8uc3Vic3RyaW5nKG51bWVyby5sZW5ndGggLSA2KVxuICBjb25zdCBudW1lcm9NaWxsaWVyc0RpciA9IHBhdGguam9pbihsZWdpc2xhdHVyZURpciwgbnVtZXJvLnN1YnN0cmluZygwLCAzKSlcbiAgZnMuZW5zdXJlRGlyU3luYyhudW1lcm9NaWxsaWVyc0RpcilcbiAgcmV0dXJuIHBhdGguam9pbihudW1lcm9NaWxsaWVyc0RpciwgdWlkKVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQTs7QUFFQSxPQUFPQSxNQUFNLE1BQU0sUUFBUTtBQUMzQixPQUFPQyxFQUFFLE1BQU0sVUFBVTtBQUN6QixPQUFPQyxJQUFJLE1BQU0sTUFBTTtBQUFBLFNBRWRDLGVBQWU7QUFBQSxTQUNmQyxRQUFRLEVBQUVELGVB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
|