@tricoteuses/assemblee 1.0.0-next.2 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/lib/api.js +23 -7
- package/lib/api.mjs +41 -0
- package/lib/bugs/acteur-00010/plugin.test.js +139 -33
- package/lib/bugs/acteur-00010/plugin.test.mjs +33 -0
- package/lib/bugs/acteur-00010.js +166 -24
- package/lib/bugs/acteur-00010.mjs +31 -0
- package/lib/bugs/agenda-00002/plugin.test.js +178 -52
- package/lib/bugs/agenda-00002/plugin.test.mjs +52 -0
- package/lib/bugs/agenda-00002.js +507 -143
- package/lib/bugs/agenda-00002.mjs +197 -0
- package/lib/bugs/agenda-00008/plugin.test.js +143 -31
- package/lib/bugs/agenda-00008/plugin.test.mjs +31 -0
- package/lib/bugs/agenda-00008.js +180 -25
- package/lib/bugs/agenda-00008.mjs +30 -0
- package/lib/bugs/agenda-00011/plugin.test.js +371 -156
- package/lib/bugs/agenda-00011/plugin.test.mjs +156 -0
- package/lib/bugs/agenda-00011.js +416 -117
- package/lib/bugs/agenda-00011.mjs +150 -0
- package/lib/bugs.js +591 -54
- package/lib/bugs.mjs +93 -0
- package/lib/cleaners/actes_legislatifs.js +149 -61
- package/lib/cleaners/actes_legislatifs.mjs +311 -0
- package/lib/cleaners/acteurs.js +255 -123
- package/lib/cleaners/acteurs.mjs +211 -0
- package/lib/cleaners/amendements.js +242 -117
- package/lib/cleaners/amendements.mjs +292 -0
- package/lib/cleaners/documents.js +147 -62
- package/lib/cleaners/documents.mjs +162 -0
- package/lib/cleaners/dossiers_legislatifs.js +132 -45
- package/lib/cleaners/dossiers_legislatifs.mjs +123 -0
- package/lib/cleaners/index.js +64 -8
- package/lib/cleaners/index.mjs +8 -0
- package/lib/cleaners/organes.js +54 -21
- package/lib/cleaners/organes.mjs +64 -0
- package/lib/cleaners/reunions.js +237 -127
- package/lib/cleaners/reunions.mjs +318 -0
- package/lib/cleaners/scrutins.js +261 -99
- package/lib/cleaners/scrutins.mjs +254 -0
- package/lib/cleaners/xml.js +81 -16
- package/lib/cleaners/xml.mjs +42 -0
- package/lib/datasets.js +284 -153
- package/lib/datasets.mjs +596 -0
- package/lib/dates.js +93 -34
- package/lib/dates.mjs +98 -0
- package/lib/dossiers_legislatifs.js +107 -33
- package/lib/dossiers_legislatifs.mjs +215 -0
- package/lib/file_systems.js +203 -35
- package/lib/file_systems.mjs +64 -0
- package/lib/git.js +139 -41
- package/lib/git.mjs +114 -0
- package/lib/index.js +310 -16
- package/lib/index.mjs +16 -0
- package/lib/inserters.js +355 -131
- package/lib/inserters.mjs +413 -0
- package/lib/loaders.js +900 -440
- package/lib/loaders.mjs +678 -0
- package/lib/organes.js +15 -5
- package/lib/organes.mjs +18 -0
- package/lib/parsers/documents.js +241 -89
- package/lib/parsers/documents.mjs +433 -0
- package/lib/parsers/index.js +36 -3
- package/lib/parsers/index.mjs +3 -0
- package/lib/parsers/recherche_amendements.js +616 -173
- package/lib/parsers/recherche_amendements.mjs +189 -0
- package/lib/raw_types/acteurs_et_organes.d.ts +36 -148
- package/lib/raw_types/acteurs_et_organes.js +228 -506
- package/lib/raw_types/acteurs_et_organes.mjs +1240 -0
- package/lib/raw_types/agendas.js +165 -75
- package/lib/raw_types/agendas.mjs +944 -0
- package/lib/raw_types/amendements.js +165 -77
- package/lib/raw_types/amendements.mjs +1040 -0
- package/lib/raw_types/dossiers_legislatifs.d.ts +1 -43
- package/lib/raw_types/dossiers_legislatifs.js +181 -143
- package/lib/raw_types/dossiers_legislatifs.mjs +1792 -0
- package/lib/raw_types/scrutins.js +144 -61
- package/lib/raw_types/scrutins.mjs +645 -0
- package/lib/scripts/bugs_helper.js +657 -155
- package/lib/scripts/bugs_helper.mjs +286 -0
- package/lib/scripts/clean_data.js +380 -145
- package/lib/scripts/clean_data.mjs +190 -0
- package/lib/scripts/clean_reorganized_data.js +627 -331
- package/lib/scripts/clean_reorganized_data.mjs +520 -0
- package/lib/scripts/diff_amendements.js +159 -73
- package/lib/scripts/diff_amendements.mjs +234 -0
- package/lib/scripts/document_dossiers_legislatifs.js +570 -288
- package/lib/scripts/document_dossiers_legislatifs.mjs +494 -0
- package/lib/scripts/get_today_reunions.js +37 -20
- package/lib/scripts/get_today_reunions.mjs +41 -0
- package/lib/scripts/merge_scrutins.js +121 -39
- package/lib/scripts/merge_scrutins.mjs +69 -0
- package/lib/scripts/parse_textes_lois.js +179 -125
- package/lib/scripts/parse_textes_lois.mjs +215 -0
- package/lib/scripts/raw_types_from_amendements.js +276 -77
- package/lib/scripts/raw_types_from_amendements.mjs +118 -0
- package/lib/scripts/reorganize_data.js +867 -446
- package/lib/scripts/reorganize_data.mjs +712 -0
- package/lib/scripts/retrieve_deputes_photos.js +378 -157
- package/lib/scripts/retrieve_deputes_photos.mjs +230 -0
- package/lib/scripts/retrieve_documents.js +648 -172
- package/lib/scripts/retrieve_documents.mjs +292 -0
- package/lib/scripts/retrieve_open_data.js +286 -85
- package/lib/scripts/retrieve_open_data.mjs +125 -0
- package/lib/scripts/retrieve_pending_amendments.js +302 -69
- package/lib/scripts/retrieve_pending_amendments.mjs +130 -0
- package/lib/scripts/retrieve_senateurs_photos.js +374 -198
- package/lib/scripts/retrieve_senateurs_photos.mjs +277 -0
- package/lib/scripts/retrieve_textes_lois.js +343 -89
- package/lib/scripts/retrieve_textes_lois.mjs +168 -0
- package/lib/scripts/test_load.js +30 -11
- package/lib/scripts/test_load.mjs +26 -0
- package/lib/scripts/test_load_big_files.js +30 -11
- package/lib/scripts/test_load_big_files.mjs +26 -0
- package/lib/scripts/validate_json.js +370 -120
- package/lib/scripts/validate_json.mjs +216 -0
- package/lib/shared_types/codes_actes.js +50 -15
- package/lib/shared_types/codes_actes.mjs +228 -0
- package/lib/strings.js +16 -3
- package/lib/strings.mjs +7 -0
- package/lib/types/acteurs_et_organes.js +156 -71
- package/lib/types/acteurs_et_organes.mjs +918 -0
- package/lib/types/agendas.js +154 -67
- package/lib/types/agendas.mjs +623 -0
- package/lib/types/amendements.js +166 -77
- package/lib/types/amendements.mjs +885 -0
- package/lib/types/dossiers_legislatifs.d.ts +1 -42
- package/lib/types/dossiers_legislatifs.js +182 -143
- package/lib/types/dossiers_legislatifs.mjs +1120 -0
- package/lib/types/legislatures.js +12 -3
- package/lib/types/legislatures.mjs +9 -0
- package/lib/types/scrutins.js +144 -61
- package/lib/types/scrutins.mjs +528 -0
- package/lib/urls.js +44 -25
- package/lib/urls.mjs +201 -0
- package/package.json +33 -12
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
2
|
+
|
|
3
|
+
import versionCompare from "tiny-version-compare";
|
|
4
|
+
import fetch from "node-fetch";
|
|
5
|
+
import { BasePlugin } from "../bugs/index.mjs"; // https://www.wikidata.org/wiki/Wikidata:WikiProject_France/Assembl%C3%A9e_Nationale#Legislative_session
|
|
6
|
+
|
|
7
|
+
const url = "https://query.wikidata.org/sparql?query=SELECT%20DISTINCT%20%3Fsession%20%3Fstart_time%20%3Fend_time%20%3Flabel%20%3Ffollows%20%3Ffollowed_by%20WHERE%20%7B%0A%0A%20%20%20%3Fsession%20wdt%3AP31%2Fwdt%3AP279*%20wd%3AQ87337481.%0A%20%20%20%3Fsession%20wdt%3AP580%20%3Fstart_time.%20%0A%20%20%20OPTIONAL%20%7B%20%3Fsession%20wdt%3AP582%20%3Fend_time%20%7D.%0A%20%20%20OPTIONAL%20%7B%20%3Fsession%20wdt%3AP155%20%3Ffollows%20%7D.%0A%20%20%20OPTIONAL%20%7B%20%3Fsession%20wdt%3AP156%20%3Ffollowed_by%20%7D.%0A%20%20%20OPTIONAL%20%7B%20%3Fsession%20rdfs%3Alabel%20%3Flabel%20filter%20(lang(%3Flabel)%20%3D%20%22fr%22)%20.%7D%0A%7D";
|
|
8
|
+
|
|
9
|
+
function compareString(a, b) {
|
|
10
|
+
if (a < b) return -1;
|
|
11
|
+
if (a > b) return 1;
|
|
12
|
+
return 0;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export class Plugin extends BasePlugin {
|
|
16
|
+
constructor(options) {
|
|
17
|
+
super(options, "agenda-00011");
|
|
18
|
+
|
|
19
|
+
_defineProperty(this, "sessions", void 0);
|
|
20
|
+
|
|
21
|
+
_defineProperty(this, "fetch", void 0);
|
|
22
|
+
|
|
23
|
+
this.fetch = fetch;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async preFix() {
|
|
27
|
+
return this.setSessions();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async preCheck() {
|
|
31
|
+
return this.setSessions();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async setSessions() {
|
|
35
|
+
const sessions = (await this.fetchSessions()).sort((a, b) => compareString(a["start_time"]["value"], b["start_time"]["value"]));
|
|
36
|
+
this.sessions = sessions.map(s => {
|
|
37
|
+
return {
|
|
38
|
+
label: s["label"]["value"].replace(/\s+en france/i, ""),
|
|
39
|
+
debut: s["start_time"]["value"].substr(0, 10),
|
|
40
|
+
fin: s["end_time"]["value"].substr(0, 10)
|
|
41
|
+
};
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
async get(url, headers) {
|
|
46
|
+
return this.fetch(url, headers);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async fetchSessions() {
|
|
50
|
+
const response = await this.get(url, {
|
|
51
|
+
headers: {
|
|
52
|
+
Accept: "application/json"
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
if (!response.ok) throw response;
|
|
56
|
+
const payload = await response.json();
|
|
57
|
+
return payload["results"]["bindings"];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
lookupSession(debut) {
|
|
61
|
+
const max = this.sessions.length - 1;
|
|
62
|
+
const min = 0;
|
|
63
|
+
let h = max;
|
|
64
|
+
let m;
|
|
65
|
+
let l = min;
|
|
66
|
+
let session;
|
|
67
|
+
let ok;
|
|
68
|
+
|
|
69
|
+
do {
|
|
70
|
+
m = Math.floor((l + h) / 2);
|
|
71
|
+
session = this.sessions[m];
|
|
72
|
+
ok = session.debut <= debut && debut <= session.fin;
|
|
73
|
+
|
|
74
|
+
if (!ok) {
|
|
75
|
+
if (l == m && m == h) // in between sessions
|
|
76
|
+
return null;
|
|
77
|
+
|
|
78
|
+
if (debut < session.debut) {
|
|
79
|
+
if (m <= min) return null;
|
|
80
|
+
h = m;
|
|
81
|
+
} else if (debut > session.fin) {
|
|
82
|
+
if (m >= max) return null;
|
|
83
|
+
l = l == m ? h : m;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
} while (!ok);
|
|
87
|
+
|
|
88
|
+
return session;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
inScope(agenda) {
|
|
92
|
+
if (agenda.xsiType != "seance_type" || agenda.lieu !== undefined && agenda.lieu.code != "CG" && agenda.lieu.code != "AN") return false;
|
|
93
|
+
if (agenda.cycleDeVie.etat != "Confirmé") return false;
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
async check(agenda, _filename) {
|
|
98
|
+
if (!this.inScope(agenda)) return null;
|
|
99
|
+
const debut = agenda.timestampDebut.substr(0, 10);
|
|
100
|
+
const session = this.lookupSession(debut);
|
|
101
|
+
|
|
102
|
+
if (session == null) {
|
|
103
|
+
return {
|
|
104
|
+
status: "needs-fixing",
|
|
105
|
+
info: [`${debut} is not in a session`]
|
|
106
|
+
};
|
|
107
|
+
} else {
|
|
108
|
+
return {
|
|
109
|
+
status: "ok",
|
|
110
|
+
info: [""]
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
maybeUpgradeSchemaVersion(agenda) {
|
|
116
|
+
if (agenda.schemaVersion !== undefined) {
|
|
117
|
+
const version = agenda.schemaVersion.split("-")[1];
|
|
118
|
+
if (versionCompare(version, "1.0") == 1) return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
agenda.schemaVersion = "agenda-1.1";
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
async fix(agenda, _filename) {
|
|
125
|
+
let status;
|
|
126
|
+
|
|
127
|
+
if ("sessionRef" in agenda) {
|
|
128
|
+
// sessionRef is undefined and must be removed
|
|
129
|
+
delete agenda.sessionRef;
|
|
130
|
+
status = true;
|
|
131
|
+
} else {
|
|
132
|
+
// if there is no sessionRef to remove, file which is not in scope does not need to be rewritten
|
|
133
|
+
status = null;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (!this.inScope(agenda)) return status;
|
|
137
|
+
if ("session" in agenda) delete agenda.session;
|
|
138
|
+
const session = this.lookupSession(agenda.timestampDebut.substr(0, 10));
|
|
139
|
+
|
|
140
|
+
if (session == null) {
|
|
141
|
+
return null;
|
|
142
|
+
} else {
|
|
143
|
+
agenda.session = session;
|
|
144
|
+
this.maybeUpgradeSchemaVersion(agenda);
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ2ZXJzaW9uQ29tcGFyZSIsImZldGNoIiwiQmFzZVBsdWdpbiIsInVybCIsImNvbXBhcmVTdHJpbmciLCJhIiwiYiIsIlBsdWdpbiIsImNvbnN0cnVjdG9yIiwib3B0aW9ucyIsInByZUZpeCIsInNldFNlc3Npb25zIiwicHJlQ2hlY2siLCJzZXNzaW9ucyIsImZldGNoU2Vzc2lvbnMiLCJzb3J0IiwibWFwIiwicyIsImxhYmVsIiwicmVwbGFjZSIsImRlYnV0Iiwic3Vic3RyIiwiZmluIiwiZ2V0IiwiaGVhZGVycyIsInJlc3BvbnNlIiwiQWNjZXB0Iiwib2siLCJwYXlsb2FkIiwianNvbiIsImxvb2t1cFNlc3Npb24iLCJtYXgiLCJsZW5ndGgiLCJtaW4iLCJoIiwibSIsImwiLCJzZXNzaW9uIiwiTWF0aCIsImZsb29yIiwiaW5TY29wZSIsImFnZW5kYSIsInhzaVR5cGUiLCJsaWV1IiwidW5kZWZpbmVkIiwiY29kZSIsImN5Y2xlRGVWaWUiLCJldGF0IiwiY2hlY2siLCJfZmlsZW5hbWUiLCJ0aW1lc3RhbXBEZWJ1dCIsInN0YXR1cyIsImluZm8iLCJtYXliZVVwZ3JhZGVTY2hlbWFWZXJzaW9uIiwic2NoZW1hVmVyc2lvbiIsInZlcnNpb24iLCJzcGxpdCIsImZpeCIsInNlc3Npb25SZWYiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVncy9hZ2VuZGEtMDAwMTEudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHZlcnNpb25Db21wYXJlIGZyb20gXCJ0aW55LXZlcnNpb24tY29tcGFyZVwiXG5pbXBvcnQgZmV0Y2ggZnJvbSBcIm5vZGUtZmV0Y2hcIlxuaW1wb3J0IHsgQmFzZVBsdWdpbiB9IGZyb20gXCIuLi9idWdzXCJcblxuLy8gaHR0cHM6Ly93d3cud2lraWRhdGEub3JnL3dpa2kvV2lraWRhdGE6V2lraVByb2plY3RfRnJhbmNlL0Fzc2VtYmwlQzMlQTllX05hdGlvbmFsZSNMZWdpc2xhdGl2ZV9zZXNzaW9uXG5jb25zdCB1cmwgPVxuICBcImh0dHBzOi8vcXVlcnkud2lraWRhdGEub3JnL3NwYXJxbD9xdWVyeT1TRUxFQ1QlMjBESVNUSU5DVCUyMCUzRnNlc3Npb24lMjAlM0ZzdGFydF90aW1lJTIwJTNGZW5kX3RpbWUlMjAlM0ZsYWJlbCUyMCUzRmZvbGxvd3MlMjAlM0Zmb2xsb3dlZF9ieSUyMFdIRVJFJTIwJTdCJTBBJTBBJTIwJTIwJTIwJTNGc2Vzc2lvbiUyMHdkdCUzQVAzMSUyRndkdCUzQVAyNzkqJTIwd2QlM0FRODczMzc0ODEuJTBBJTIwJTIwJTIwJTNGc2Vzc2lvbiUyMHdkdCUzQVA1ODAlMjAlM0ZzdGFydF90aW1lLiUyMCUwQSUyMCUyMCUyME9QVElPTkFMJTIwJTdCJTIwJTNGc2Vzc2lvbiUyMHdkdCUzQVA1ODIlMjAlM0ZlbmRfdGltZSUyMCU3RC4lMEElMjAlMjAlMjBPUFRJT05BTCUyMCU3QiUyMCUzRnNlc3Npb24lMjB3ZHQlM0FQMTU1JTIwJTNGZm9sbG93cyUyMCU3RC4lMEElMjAlMjAlMjBPUFRJT05BTCUyMCU3QiUyMCUzRnNlc3Npb24lMjB3ZHQlM0FQMTU2JTIwJTNGZm9sbG93ZWRfYnklMjAlN0QuJTBBJTIwJTIwJTIwT1BUSU9OQUwlMjAlN0IlMjAlM0ZzZXNzaW9uJTIwcmRmcyUzQWxhYmVsJTIwJTNGbGFiZWwlMjBmaWx0ZXIlMjAobGFuZyglM0ZsYWJlbCklMjAlM0QlMjAlMjJmciUyMiklMjAuJTdEJTBBJTdEXCJcblxuZnVuY3Rpb24gY29tcGFyZVN0cmluZyhhOiBzdHJpbmcsIGI6IHN0cmluZykge1xuICBpZiAoYSA8IGIpIHJldHVybiAtMVxuICBpZiAoYSA+IGIpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbmV4cG9ydCBjbGFzcyBQbHVnaW4gZXh0ZW5kcyBCYXNlUGx1Z2luIHtcbiAgc2Vzc2lvbnM6IGFueVxuICBmZXRjaDogYW55XG5cbiAgY29uc3RydWN0b3Iob3B0aW9uczogYW55KSB7XG4gICAgc3VwZXIob3B0aW9ucywgXCJhZ2VuZGEtMDAwMTFcIilcbiAgICB0aGlzLmZldGNoID0gZmV0Y2hcbiAgfVxuXG4gIGFzeW5jIHByZUZpeCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnNldFNlc3Npb25zKClcbiAgfVxuXG4gIGFzeW5jIHByZUNoZWNrKCk6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXMuc2V0U2Vzc2lvbnMoKVxuICB9XG5cbiAgYXN5bmMgc2V0U2Vzc2lvbnMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzZXNzaW9ucyA9IChhd2FpdCB0aGlzLmZldGNoU2Vzc2lvbnMoKSkuc29ydCgoYTogYW55LCBiOiBhbnkpID0+XG4gICAgICBjb21wYXJlU3RyaW5nKGFbXCJzdGFydF90aW1lXCJdW1widmFsdWVcIl0sIGJbXCJzdGFydF90aW1lXCJdW1widmFsdWVcIl0pLFxuICAgIClcbiAgICB0aGlzLnNlc3Npb25zID0gc2Vzc2lvbnMubWFwKChzOiBhbnkpID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGxhYmVsOiBzW1wibGFiZWxcIl1bXCJ2YWx1ZVwiXS5yZXBsYWNlKC9cXHMrZW4gZnJhbmNlL2ksIFwiXCIpLFxuICAgICAgICBkZWJ1dDogc1tcInN0YXJ0X3RpbWVcIl1bXCJ2YWx1ZVwiXS5zdWJzdHIoMCwgMTApLFxuICAgICAgICBmaW46IHNbXCJlbmRfdGltZVwiXVtcInZhbHVlXCJdLnN1YnN0cigwLCAxMCksXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGFzeW5jIGdldCh1cmw6IHN0cmluZywgaGVhZGVyczogYW55KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5mZXRjaCh1cmwsIGhlYWRlcnMpXG4gIH1cblxuICBhc3luYyBmZXRjaFNlc3Npb25zKCk6IFByb21pc2U8YW55PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmdldCh1cmwsIHtcbiAgICAgIGhlYWRlcnM6IHsgQWNjZXB0OiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgIH0pXG4gICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgcmVzcG9uc2VcbiAgICBjb25zdCBwYXlsb2FkID0gYXdhaXQgcmVzcG9uc2UuanNvbigpXG4gICAgcmV0dXJuIHBheWxvYWRbXCJyZXN1bHRzXCJdW1wiYmluZGluZ3NcIl1cbiAgfVxuXG4gIGxvb2t1cFNlc3Npb24oZGVidXQ6IHN0cmluZyk6IGFueSB7XG4gICAgY29uc3QgbWF4ID0gdGhpcy5zZXNzaW9ucy5sZW5ndGggLSAxXG4gICAgY29uc3QgbWluID0gMFxuICAgIGxldCBoID0gbWF4XG4gICAgbGV0IG1cbiAgICBsZXQgbCA9IG1pblxuICAgIGxldCBzZXNzaW9uXG4gICAgbGV0IG9rXG4gICAgZG8ge1xuICAgICAgbSA9IE1hdGguZmxvb3IoKGwgKyBoKSAvIDIpXG4gICAgICBzZXNzaW9uID0gdGhpcy5zZXNzaW9uc1ttXVxuICAgICAgb2sgPSBzZXNzaW9uLmRlYnV0IDw9IGRlYnV0ICYmIGRlYnV0IDw9IHNlc3Npb24uZmluXG4gICAgICBpZiAoIW9rKSB7XG4gICAgICAgIGlmIChsID09IG0gJiYgbSA9PSBoKVxuICAgICAgICAgIC8vIGluIGJldHdlZW4gc2Vzc2lvbnNcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICBpZiAoZGVidXQgPCBzZXNzaW9uLmRlYnV0KSB7XG4gICAgICAgICAgaWYgKG0gPD0gbWluKSByZXR1cm4gbnVsbFxuICAgICAgICAgIGggPSBtXG4gICAgICAgIH0gZWxzZSBpZiAoZGVidXQgPiBzZXNzaW9uLmZpbikge1xuICAgICAgICAgIGlmIChtID49IG1heCkgcmV0dXJuIG51bGxcbiAgICAgICAgICBsID0gbCA9PSBtID8gaCA6IG1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gd2hpbGUgKCFvaylcbiAgICByZXR1cm4gc2Vzc2lvblxuICB9XG5cbiAgaW5TY29wZShhZ2VuZGE6IGFueSkge1xuICAgIGlmIChcbiAgICAgIGFnZW5kYS54c2lUeXBlICE9IFwic2VhbmNlX3R5cGVcIiB8fFxuICAgICAgKGFnZW5kYS5saWV1ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgYWdlbmRhLmxpZXUuY29kZSAhPSBcIkNHXCIgJiZcbiAgICAgICAgYWdlbmRhLmxpZXUuY29kZSAhPSBcIkFOXCIpXG4gICAgKVxuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgaWYgKGFnZW5kYS5jeWNsZURlVmllLmV0YXQgIT0gXCJDb25maXJtw6lcIikgcmV0dXJuIGZhbHNlXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGFzeW5jIGNoZWNrKGFnZW5kYTogYW55LCBfZmlsZW5hbWU6IGFueSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKCF0aGlzLmluU2NvcGUoYWdlbmRhKSkgcmV0dXJuIG51bGxcbiAgICBjb25zdCBkZWJ1dCA9IGFnZW5kYS50aW1lc3RhbXBEZWJ1dC5zdWJzdHIoMCwgMTApXG4gICAgY29uc3Qgc2Vzc2lvbiA9IHRoaXMubG9va3VwU2Vzc2lvbihkZWJ1dClcbiAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4geyBzdGF0dXM6IFwibmVlZHMtZml4aW5nXCIsIGluZm86IFtgJHtkZWJ1dH0gaXMgbm90IGluIGEgc2Vzc2lvbmBdIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHsgc3RhdHVzOiBcIm9rXCIsIGluZm86IFtcIlwiXSB9XG4gICAgfVxuICB9XG5cbiAgbWF5YmVVcGdyYWRlU2NoZW1hVmVyc2lvbihhZ2VuZGE6IGFueSkge1xuICAgIGlmIChhZ2VuZGEuc2NoZW1hVmVyc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCB2ZXJzaW9uID0gYWdlbmRhLnNjaGVtYVZlcnNpb24uc3BsaXQoXCItXCIpWzFdXG4gICAgICBpZiAodmVyc2lvbkNvbXBhcmUodmVyc2lvbiwgXCIxLjBcIikgPT0gMSkgcmV0dXJuXG4gICAgfVxuICAgIGFnZW5kYS5zY2hlbWFWZXJzaW9uID0gXCJhZ2VuZGEtMS4xXCJcbiAgfVxuXG4gIGFzeW5jIGZpeChhZ2VuZGE6IGFueSwgX2ZpbGVuYW1lOiBhbnkpOiBQcm9taXNlPGFueT4ge1xuICAgIGxldCBzdGF0dXNcbiAgICBpZiAoXCJzZXNzaW9uUmVmXCIgaW4gYWdlbmRhKSB7XG4gICAgICAvLyBzZXNzaW9uUmVmIGlzIHVuZGVmaW5lZCBhbmQgbXVzdCBiZSByZW1vdmVkXG4gICAgICBkZWxldGUgYWdlbmRhLnNlc3Npb25SZWZcbiAgICAgIHN0YXR1cyA9IHRydWVcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gc2Vzc2lvblJlZiB0byByZW1vdmUsIGZpbGUgd2hpY2ggaXMgbm90IGluIHNjb3BlIGRvZXMgbm90IG5lZWQgdG8gYmUgcmV3cml0dGVuXG4gICAgICBzdGF0dXMgPSBudWxsXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmluU2NvcGUoYWdlbmRhKSkgcmV0dXJuIHN0YXR1c1xuXG4gICAgaWYgKFwic2Vzc2lvblwiIGluIGFnZW5kYSkgZGVsZXRlIGFnZW5kYS5zZXNzaW9uXG5cbiAgICBjb25zdCBzZXNzaW9uID0gdGhpcy5sb29rdXBTZXNzaW9uKGFnZW5kYS50aW1lc3RhbXBEZWJ1dC5zdWJzdHIoMCwgMTApKVxuICAgIGlmIChzZXNzaW9uID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsXG4gICAgfSBlbHNlIHtcbiAgICAgIGFnZW5kYS5zZXNzaW9uID0gc2Vzc2lvblxuICAgICAgdGhpcy5tYXliZVVwZ3JhZGVTY2hlbWFWZXJzaW9uKGFnZW5kYSlcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBT0EsY0FBUCxNQUEyQixzQkFBM0I7QUFDQSxPQUFPQyxLQUFQLE1BQWtCLFlBQWxCO1NBQ1NDLFUsNkJBRVQ7O0FBQ0EsTUFBTUMsR0FBRyxHQUNQLGluQkFERjs7QUFHQSxTQUFTQyxhQUFULENBQXVCQyxDQUF2QixFQUFrQ0MsQ0FBbEMsRUFBNkM7RUFDM0MsSUFBSUQsQ0FBQyxHQUFHQyxDQUFSLEVBQVcsT0FBTyxDQUFDLENBQVI7RUFDWCxJQUFJRCxDQUFDLEdBQUdDLENBQVIsRUFBVyxPQUFPLENBQVA7RUFDWCxPQUFPLENBQVA7QUFDRDs7QUFFRCxPQUFPLE1BQU1DLE1BQU4sU0FBcUJMLFVBQXJCLENBQWdDO0VBSXJDTSxXQUFXLENBQUNDLE9BQUQsRUFBZTtJQUN4QixNQUFNQSxPQUFOLEVBQWUsY0FBZjs7SUFEd0I7O0lBQUE7O0lBRXhCLEtBQUtSLEtBQUwsR0FBYUEsS0FBYjtFQUNEOztFQUVXLE1BQU5TLE1BQU0sR0FBaUI7SUFDM0IsT0FBTyxLQUFLQyxXQUFMLEVBQVA7RUFDRDs7RUFFYSxNQUFSQyxRQUFRLEdBQWlCO0lBQzdCLE9BQU8sS0FBS0QsV0FBTCxFQUFQO0VBQ0Q7O0VBRWdCLE1BQVhBLFdBQVcsR0FBaUI7SUFDaEMsTUFBTUUsUUFBUSxHQUFHLENBQUMsTUFBTSxLQUFLQyxhQUFMLEVBQVAsRUFBNkJDLElBQTdCLENBQWtDLENBQUNWLENBQUQsRUFBU0MsQ0FBVCxLQUNqREYsYUFBYSxDQUFDQyxDQUFDLENBQUMsWUFBRCxDQUFELENBQWdCLE9BQWhCLENBQUQsRUFBMkJDLENBQUMsQ0FBQyxZQUFELENBQUQsQ0FBZ0IsT0FBaEIsQ0FBM0IsQ0FERSxDQUFqQjtJQUdBLEtBQUtPLFFBQUwsR0FBZ0JBLFFBQVEsQ0FBQ0csR0FBVCxDQUFjQyxDQUFELElBQVk7TUFDdkMsT0FBTztRQUNMQyxLQUFLLEVBQUVELENBQUMsQ0FBQyxPQUFELENBQUQsQ0FBVyxPQUFYLEVBQW9CRSxPQUFwQixDQUE0QixlQUE1QixFQUE2QyxFQUE3QyxDQURGO1FBRUxDLEtBQUssRUFBRUgsQ0FBQyxDQUFDLFlBQUQsQ0FBRCxDQUFnQixPQUFoQixFQUF5QkksTUFBekIsQ0FBZ0MsQ0FBaEMsRUFBbUMsRUFBbkMsQ0FGRjtRQUdMQyxHQUFHLEVBQUVMLENBQUMsQ0FBQyxVQUFELENBQUQsQ0FBYyxPQUFkLEVBQXVCSSxNQUF2QixDQUE4QixDQUE5QixFQUFpQyxFQUFqQztNQUhBLENBQVA7SUFLRCxDQU5lLENBQWhCO0VBT0Q7O0VBRVEsTUFBSEUsR0FBRyxDQUFDcEIsR0FBRCxFQUFjcUIsT0FBZCxFQUEwQztJQUNqRCxPQUFPLEtBQUt2QixLQUFMLENBQVdFLEdBQVgsRUFBZ0JxQixPQUFoQixDQUFQO0VBQ0Q7O0VBRWtCLE1BQWJWLGFBQWEsR0FBaUI7SUFDbEMsTUFBTVcsUUFBUSxHQUFHLE1BQU0sS0FBS0YsR0FBTCxDQUFTcEIsR0FBVCxFQUFjO01BQ25DcUIsT0FBTyxFQUFFO1FBQUVFLE1BQU0sRUFBRTtNQUFWO0lBRDBCLENBQWQsQ0FBdkI7SUFHQSxJQUFJLENBQUNELFFBQVEsQ0FBQ0UsRUFBZCxFQUFrQixNQUFNRixRQUFOO0lBQ2xCLE1BQU1HLE9BQU8sR0FBRyxNQUFNSCxRQUFRLENBQUNJLElBQVQsRUFBdEI7SUFDQSxPQUFPRCxPQUFPLENBQUMsU0FBRCxDQUFQLENBQW1CLFVBQW5CLENBQVA7RUFDRDs7RUFFREUsYUFBYSxDQUFDVixLQUFELEVBQXFCO0lBQ2hDLE1BQU1XLEdBQUcsR0FBRyxLQUFLbEIsUUFBTCxDQUFjbUIsTUFBZCxHQUF1QixDQUFuQztJQUNBLE1BQU1DLEdBQUcsR0FBRyxDQUFaO0lBQ0EsSUFBSUMsQ0FBQyxHQUFHSCxHQUFSO0lBQ0EsSUFBSUksQ0FBSjtJQUNBLElBQUlDLENBQUMsR0FBR0gsR0FBUjtJQUNBLElBQUlJLE9BQUo7SUFDQSxJQUFJVixFQUFKOztJQUNBLEdBQUc7TUFDRFEsQ0FBQyxHQUFHRyxJQUFJLENBQUNDLEtBQUwsQ0FBVyxDQUFDSCxDQUFDLEdBQUdGLENBQUwsSUFBVSxDQUFyQixDQUFKO01BQ0FHLE9BQU8sR0FBRyxLQUFLeEIsUUFBTCxDQUFjc0IsQ0FBZCxDQUFWO01BQ0FSLEVBQUUsR0FBR1UsT0FBTyxDQUFDakIsS0FBUixJQUFpQkEsS0FBakIsSUFBMEJBLEtBQUssSUFBSWlCLE9BQU8sQ0FBQ2YsR0FBaEQ7O01BQ0EsSUFBSSxDQUFDSyxFQUFMLEVBQVM7UUFDUCxJQUFJUyxDQUFDLElBQUlELENBQUwsSUFBVUEsQ0FBQyxJQUFJRCxDQUFuQixFQUNFO1VBQ0EsT0FBTyxJQUFQOztRQUNGLElBQUlkLEtBQUssR0FBR2lCLE9BQU8sQ0FBQ2pCLEtBQXBCLEVBQTJCO1VBQ3pCLElBQUllLENBQUMsSUFBSUYsR0FBVCxFQUFjLE9BQU8sSUFBUDtVQUNkQyxDQUFDLEdBQUdDLENBQUo7UUFDRCxDQUhELE1BR08sSUFBSWYsS0FBSyxHQUFHaUIsT0FBTyxDQUFDZixHQUFwQixFQUF5QjtVQUM5QixJQUFJYSxDQUFDLElBQUlKLEdBQVQsRUFBYyxPQUFPLElBQVA7VUFDZEssQ0FBQyxHQUFHQSxDQUFDLElBQUlELENBQUwsR0FBU0QsQ0FBVCxHQUFhQyxDQUFqQjtRQUNEO01BQ0Y7SUFDRixDQWhCRCxRQWdCUyxDQUFDUixFQWhCVjs7SUFpQkEsT0FBT1UsT0FBUDtFQUNEOztFQUVERyxPQUFPLENBQUNDLE1BQUQsRUFBYztJQUNuQixJQUNFQSxNQUFNLENBQUNDLE9BQVAsSUFBa0IsYUFBbEIsSUFDQ0QsTUFBTSxDQUFDRSxJQUFQLEtBQWdCQyxTQUFoQixJQUNDSCxNQUFNLENBQUNFLElBQVAsQ0FBWUUsSUFBWixJQUFvQixJQURyQixJQUVDSixNQUFNLENBQUNFLElBQVAsQ0FBWUUsSUFBWixJQUFvQixJQUp4QixFQU1FLE9BQU8sS0FBUDtJQUNGLElBQUlKLE1BQU0sQ0FBQ0ssVUFBUCxDQUFrQkMsSUFBbEIsSUFBMEIsVUFBOUIsRUFBMEMsT0FBTyxLQUFQO0lBQzFDLE9BQU8sSUFBUDtFQUNEOztFQUVVLE1BQUxDLEtBQUssQ0FBQ1AsTUFBRCxFQUFjUSxTQUFkLEVBQTRDO0lBQ3JELElBQUksQ0FBQyxLQUFLVCxPQUFMLENBQWFDLE1BQWIsQ0FBTCxFQUEyQixPQUFPLElBQVA7SUFDM0IsTUFBTXJCLEtBQUssR0FBR3FCLE1BQU0sQ0FBQ1MsY0FBUCxDQUFzQjdCLE1BQXRCLENBQTZCLENBQTdCLEVBQWdDLEVBQWhDLENBQWQ7SUFDQSxNQUFNZ0IsT0FBTyxHQUFHLEtBQUtQLGFBQUwsQ0FBbUJWLEtBQW5CLENBQWhCOztJQUNBLElBQUlpQixPQUFPLElBQUksSUFBZixFQUFxQjtNQUNuQixPQUFPO1FBQUVjLE1BQU0sRUFBRSxjQUFWO1FBQTBCQyxJQUFJLEVBQUUsQ0FBRSxHQUFFaEMsS0FBTSxzQkFBVjtNQUFoQyxDQUFQO0lBQ0QsQ0FGRCxNQUVPO01BQ0wsT0FBTztRQUFFK0IsTUFBTSxFQUFFLElBQVY7UUFBZ0JDLElBQUksRUFBRSxDQUFDLEVBQUQ7TUFBdEIsQ0FBUDtJQUNEO0VBQ0Y7O0VBRURDLHlCQUF5QixDQUFDWixNQUFELEVBQWM7SUFDckMsSUFBSUEsTUFBTSxDQUFDYSxhQUFQLEtBQXlCVixTQUE3QixFQUF3QztNQUN0QyxNQUFNVyxPQUFPLEdBQUdkLE1BQU0sQ0FBQ2EsYUFBUCxDQUFxQkUsS0FBckIsQ0FBMkIsR0FBM0IsRUFBZ0MsQ0FBaEMsQ0FBaEI7TUFDQSxJQUFJeEQsY0FBYyxDQUFDdUQsT0FBRCxFQUFVLEtBQVYsQ0FBZCxJQUFrQyxDQUF0QyxFQUF5QztJQUMxQzs7SUFDRGQsTUFBTSxDQUFDYSxhQUFQLEdBQXVCLFlBQXZCO0VBQ0Q7O0VBRVEsTUFBSEcsR0FBRyxDQUFDaEIsTUFBRCxFQUFjUSxTQUFkLEVBQTRDO0lBQ25ELElBQUlFLE1BQUo7O0lBQ0EsSUFBSSxnQkFBZ0JWLE1BQXBCLEVBQTRCO01BQzFCO01BQ0EsT0FBT0EsTUFBTSxDQUFDaUIsVUFBZDtNQUNBUCxNQUFNLEdBQUcsSUFBVDtJQUNELENBSkQsTUFJTztNQUNMO01BQ0FBLE1BQU0sR0FBRyxJQUFUO0lBQ0Q7O0lBRUQsSUFBSSxDQUFDLEtBQUtYLE9BQUwsQ0FBYUMsTUFBYixDQUFMLEVBQTJCLE9BQU9VLE1BQVA7SUFFM0IsSUFBSSxhQUFhVixNQUFqQixFQUF5QixPQUFPQSxNQUFNLENBQUNKLE9BQWQ7SUFFekIsTUFBTUEsT0FBTyxHQUFHLEtBQUtQLGFBQUwsQ0FBbUJXLE1BQU0sQ0FBQ1MsY0FBUCxDQUFzQjdCLE1BQXRCLENBQTZCLENBQTdCLEVBQWdDLEVBQWhDLENBQW5CLENBQWhCOztJQUNBLElBQUlnQixPQUFPLElBQUksSUFBZixFQUFxQjtNQUNuQixPQUFPLElBQVA7SUFDRCxDQUZELE1BRU87TUFDTEksTUFBTSxDQUFDSixPQUFQLEdBQWlCQSxPQUFqQjtNQUNBLEtBQUtnQix5QkFBTCxDQUErQlosTUFBL0I7TUFDQSxPQUFPLElBQVA7SUFDRDtFQUNGOztBQTdIb0MifQ==
|