@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.
Files changed (135) hide show
  1. package/README.md +2 -0
  2. package/lib/api.js +23 -7
  3. package/lib/api.mjs +41 -0
  4. package/lib/bugs/acteur-00010/plugin.test.js +139 -33
  5. package/lib/bugs/acteur-00010/plugin.test.mjs +33 -0
  6. package/lib/bugs/acteur-00010.js +166 -24
  7. package/lib/bugs/acteur-00010.mjs +31 -0
  8. package/lib/bugs/agenda-00002/plugin.test.js +178 -52
  9. package/lib/bugs/agenda-00002/plugin.test.mjs +52 -0
  10. package/lib/bugs/agenda-00002.js +507 -143
  11. package/lib/bugs/agenda-00002.mjs +197 -0
  12. package/lib/bugs/agenda-00008/plugin.test.js +143 -31
  13. package/lib/bugs/agenda-00008/plugin.test.mjs +31 -0
  14. package/lib/bugs/agenda-00008.js +180 -25
  15. package/lib/bugs/agenda-00008.mjs +30 -0
  16. package/lib/bugs/agenda-00011/plugin.test.js +371 -156
  17. package/lib/bugs/agenda-00011/plugin.test.mjs +156 -0
  18. package/lib/bugs/agenda-00011.js +416 -117
  19. package/lib/bugs/agenda-00011.mjs +150 -0
  20. package/lib/bugs.js +591 -54
  21. package/lib/bugs.mjs +93 -0
  22. package/lib/cleaners/actes_legislatifs.js +149 -61
  23. package/lib/cleaners/actes_legislatifs.mjs +311 -0
  24. package/lib/cleaners/acteurs.js +255 -123
  25. package/lib/cleaners/acteurs.mjs +211 -0
  26. package/lib/cleaners/amendements.js +242 -117
  27. package/lib/cleaners/amendements.mjs +292 -0
  28. package/lib/cleaners/documents.js +147 -62
  29. package/lib/cleaners/documents.mjs +162 -0
  30. package/lib/cleaners/dossiers_legislatifs.js +132 -45
  31. package/lib/cleaners/dossiers_legislatifs.mjs +123 -0
  32. package/lib/cleaners/index.js +64 -8
  33. package/lib/cleaners/index.mjs +8 -0
  34. package/lib/cleaners/organes.js +54 -21
  35. package/lib/cleaners/organes.mjs +64 -0
  36. package/lib/cleaners/reunions.js +237 -127
  37. package/lib/cleaners/reunions.mjs +318 -0
  38. package/lib/cleaners/scrutins.js +261 -99
  39. package/lib/cleaners/scrutins.mjs +254 -0
  40. package/lib/cleaners/xml.js +81 -16
  41. package/lib/cleaners/xml.mjs +42 -0
  42. package/lib/datasets.js +284 -153
  43. package/lib/datasets.mjs +596 -0
  44. package/lib/dates.js +93 -34
  45. package/lib/dates.mjs +98 -0
  46. package/lib/dossiers_legislatifs.js +107 -33
  47. package/lib/dossiers_legislatifs.mjs +215 -0
  48. package/lib/file_systems.js +203 -35
  49. package/lib/file_systems.mjs +64 -0
  50. package/lib/git.js +139 -41
  51. package/lib/git.mjs +114 -0
  52. package/lib/index.js +310 -16
  53. package/lib/index.mjs +16 -0
  54. package/lib/inserters.js +355 -131
  55. package/lib/inserters.mjs +413 -0
  56. package/lib/loaders.js +900 -440
  57. package/lib/loaders.mjs +678 -0
  58. package/lib/organes.js +15 -5
  59. package/lib/organes.mjs +18 -0
  60. package/lib/parsers/documents.js +241 -89
  61. package/lib/parsers/documents.mjs +433 -0
  62. package/lib/parsers/index.js +36 -3
  63. package/lib/parsers/index.mjs +3 -0
  64. package/lib/parsers/recherche_amendements.js +616 -173
  65. package/lib/parsers/recherche_amendements.mjs +189 -0
  66. package/lib/raw_types/acteurs_et_organes.d.ts +36 -148
  67. package/lib/raw_types/acteurs_et_organes.js +228 -506
  68. package/lib/raw_types/acteurs_et_organes.mjs +1240 -0
  69. package/lib/raw_types/agendas.js +165 -75
  70. package/lib/raw_types/agendas.mjs +944 -0
  71. package/lib/raw_types/amendements.js +165 -77
  72. package/lib/raw_types/amendements.mjs +1040 -0
  73. package/lib/raw_types/dossiers_legislatifs.d.ts +1 -43
  74. package/lib/raw_types/dossiers_legislatifs.js +181 -143
  75. package/lib/raw_types/dossiers_legislatifs.mjs +1792 -0
  76. package/lib/raw_types/scrutins.js +144 -61
  77. package/lib/raw_types/scrutins.mjs +645 -0
  78. package/lib/scripts/bugs_helper.js +657 -155
  79. package/lib/scripts/bugs_helper.mjs +286 -0
  80. package/lib/scripts/clean_data.js +380 -145
  81. package/lib/scripts/clean_data.mjs +190 -0
  82. package/lib/scripts/clean_reorganized_data.js +627 -331
  83. package/lib/scripts/clean_reorganized_data.mjs +520 -0
  84. package/lib/scripts/diff_amendements.js +159 -73
  85. package/lib/scripts/diff_amendements.mjs +234 -0
  86. package/lib/scripts/document_dossiers_legislatifs.js +570 -288
  87. package/lib/scripts/document_dossiers_legislatifs.mjs +494 -0
  88. package/lib/scripts/get_today_reunions.js +37 -20
  89. package/lib/scripts/get_today_reunions.mjs +41 -0
  90. package/lib/scripts/merge_scrutins.js +121 -39
  91. package/lib/scripts/merge_scrutins.mjs +69 -0
  92. package/lib/scripts/parse_textes_lois.js +179 -125
  93. package/lib/scripts/parse_textes_lois.mjs +215 -0
  94. package/lib/scripts/raw_types_from_amendements.js +276 -77
  95. package/lib/scripts/raw_types_from_amendements.mjs +118 -0
  96. package/lib/scripts/reorganize_data.js +867 -446
  97. package/lib/scripts/reorganize_data.mjs +712 -0
  98. package/lib/scripts/retrieve_deputes_photos.js +378 -157
  99. package/lib/scripts/retrieve_deputes_photos.mjs +230 -0
  100. package/lib/scripts/retrieve_documents.js +648 -172
  101. package/lib/scripts/retrieve_documents.mjs +292 -0
  102. package/lib/scripts/retrieve_open_data.js +286 -85
  103. package/lib/scripts/retrieve_open_data.mjs +125 -0
  104. package/lib/scripts/retrieve_pending_amendments.js +302 -69
  105. package/lib/scripts/retrieve_pending_amendments.mjs +130 -0
  106. package/lib/scripts/retrieve_senateurs_photos.js +374 -198
  107. package/lib/scripts/retrieve_senateurs_photos.mjs +277 -0
  108. package/lib/scripts/retrieve_textes_lois.js +343 -89
  109. package/lib/scripts/retrieve_textes_lois.mjs +168 -0
  110. package/lib/scripts/test_load.js +30 -11
  111. package/lib/scripts/test_load.mjs +26 -0
  112. package/lib/scripts/test_load_big_files.js +30 -11
  113. package/lib/scripts/test_load_big_files.mjs +26 -0
  114. package/lib/scripts/validate_json.js +370 -120
  115. package/lib/scripts/validate_json.mjs +216 -0
  116. package/lib/shared_types/codes_actes.js +50 -15
  117. package/lib/shared_types/codes_actes.mjs +228 -0
  118. package/lib/strings.js +16 -3
  119. package/lib/strings.mjs +7 -0
  120. package/lib/types/acteurs_et_organes.js +156 -71
  121. package/lib/types/acteurs_et_organes.mjs +918 -0
  122. package/lib/types/agendas.js +154 -67
  123. package/lib/types/agendas.mjs +623 -0
  124. package/lib/types/amendements.js +166 -77
  125. package/lib/types/amendements.mjs +885 -0
  126. package/lib/types/dossiers_legislatifs.d.ts +1 -42
  127. package/lib/types/dossiers_legislatifs.js +182 -143
  128. package/lib/types/dossiers_legislatifs.mjs +1120 -0
  129. package/lib/types/legislatures.js +12 -3
  130. package/lib/types/legislatures.mjs +9 -0
  131. package/lib/types/scrutins.js +144 -61
  132. package/lib/types/scrutins.mjs +528 -0
  133. package/lib/urls.js +44 -25
  134. package/lib/urls.mjs +201 -0
  135. package/package.json +33 -12
@@ -0,0 +1,292 @@
1
+ import assert from "assert";
2
+ import { cleanBooleanAttribute, cleanXmlArtefacts } from "./xml.mjs";
3
+ import { AvantAApres } from "../types/amendements.mjs";
4
+ export function cleanAmendement(amendement) {
5
+ cleanXmlArtefacts(amendement);
6
+ const signataires = amendement.signataires;
7
+ {
8
+ cleanXmlArtefacts(signataires);
9
+ const auteur = signataires.auteur;
10
+ {
11
+ cleanXmlArtefacts(auteur);
12
+ }
13
+
14
+ if (signataires.cosignataires !== undefined) {
15
+ const acteurRef = signataires.cosignataires.acteurRef;
16
+
17
+ if (Array.isArray(acteurRef)) {
18
+ signataires.cosignatairesRefs = acteurRef;
19
+ } else {
20
+ assert(acteurRef);
21
+ signataires.cosignatairesRefs = [acteurRef];
22
+ }
23
+
24
+ delete signataires.cosignataires;
25
+ }
26
+
27
+ let libelle = signataires.libelle;
28
+
29
+ if (libelle !== undefined) {
30
+ libelle = libelle.split(" ").filter(Boolean).join(" ");
31
+
32
+ if (libelle) {
33
+ signataires.libelle = libelle;
34
+ } else {
35
+ delete signataires.libelle;
36
+ }
37
+ }
38
+ }
39
+ const pointeurFragmentTexte = amendement.pointeurFragmentTexte;
40
+ {
41
+ cleanXmlArtefacts(pointeurFragmentTexte);
42
+ const division = pointeurFragmentTexte.division;
43
+
44
+ if (division !== undefined) {
45
+ cleanXmlArtefacts(division);
46
+ let avantAApres = division.avant_A_Apres;
47
+
48
+ if (avantAApres !== undefined) {
49
+ delete division.avant_A_Apres;
50
+
51
+ if (avantAApres === "Après") {
52
+ avantAApres = AvantAApres.Apres;
53
+ }
54
+
55
+ division.avantAApres = avantAApres;
56
+ }
57
+ }
58
+
59
+ const amendementStandard = pointeurFragmentTexte.amendementStandard;
60
+
61
+ if (amendementStandard !== undefined) {
62
+ cleanXmlArtefacts(amendementStandard);
63
+ const alinea = amendementStandard.alinea;
64
+
65
+ if (alinea !== undefined) {
66
+ cleanXmlArtefacts(alinea);
67
+ let avantAApres = alinea.avant_A_Apres;
68
+
69
+ if (avantAApres !== undefined) {
70
+ delete alinea.avant_A_Apres;
71
+
72
+ if (avantAApres === "Après") {
73
+ avantAApres = AvantAApres.Apres;
74
+ } else if (![AvantAApres.A, AvantAApres.Apres, AvantAApres.Avant].includes(avantAApres)) {
75
+ avantAApres = AvantAApres.A;
76
+ }
77
+
78
+ alinea.avantAApres = avantAApres;
79
+ }
80
+
81
+ pointeurFragmentTexte.alinea = alinea;
82
+ }
83
+
84
+ delete pointeurFragmentTexte.amendementStandard;
85
+ }
86
+ }
87
+ const corps = amendement.corps;
88
+
89
+ if (corps !== undefined) {
90
+ cleanXmlArtefacts(corps);
91
+ const contenuAuteur = corps.contenuAuteur;
92
+
93
+ if (contenuAuteur !== undefined) {
94
+ cleanXmlArtefacts(contenuAuteur);
95
+ const avantAppel = contenuAuteur.avantAppel;
96
+
97
+ if (avantAppel !== undefined) {
98
+ cleanXmlArtefacts(avantAppel);
99
+ assert.notStrictEqual(avantAppel.dispositif, undefined);
100
+ }
101
+
102
+ assert.strictEqual(contenuAuteur.annexeExposeSommaire, undefined);
103
+ const dispositifAmdtCreditPLF = contenuAuteur.dispositifAmdtCreditPLF;
104
+
105
+ if (dispositifAmdtCreditPLF !== undefined) {
106
+ const listeProgrammes = dispositifAmdtCreditPLF.listeProgrammes?.programme;
107
+
108
+ if (listeProgrammes !== undefined) {
109
+ if (Array.isArray(listeProgrammes)) {
110
+ dispositifAmdtCreditPLF.listeProgrammes = listeProgrammes;
111
+ } else {
112
+ assert(listeProgrammes);
113
+ dispositifAmdtCreditPLF.listeProgrammes = [listeProgrammes];
114
+ }
115
+
116
+ for (const programme of dispositifAmdtCreditPLF.listeProgrammes) {
117
+ cleanXmlArtefacts(programme);
118
+
119
+ if (programme.lignesCredits !== undefined) {
120
+ let lignesCredits = programme.lignesCredits.ligneCredit;
121
+
122
+ if (lignesCredits === undefined) {
123
+ delete programme.lignesCredits;
124
+ } else {
125
+ if (!Array.isArray(lignesCredits)) {
126
+ assert(lignesCredits);
127
+ lignesCredits = [lignesCredits];
128
+ }
129
+
130
+ programme.lignesCredits = lignesCredits;
131
+ }
132
+
133
+ if (lignesCredits !== undefined) {
134
+ for (const ligneCredit of lignesCredits) {
135
+ cleanXmlArtefacts(ligneCredit);
136
+ }
137
+ }
138
+ }
139
+ }
140
+ }
141
+ }
142
+
143
+ const dispositifAmdtCreditPLFR = contenuAuteur.dispositifAmdtCreditPLFR;
144
+
145
+ if (dispositifAmdtCreditPLFR !== undefined) {
146
+ const listeProgrammes = dispositifAmdtCreditPLFR.listeProgrammes?.programme;
147
+
148
+ if (listeProgrammes !== undefined) {
149
+ if (Array.isArray(listeProgrammes)) {
150
+ dispositifAmdtCreditPLFR.listeProgrammes = listeProgrammes;
151
+ } else {
152
+ assert(listeProgrammes);
153
+ dispositifAmdtCreditPLFR.listeProgrammes = [listeProgrammes];
154
+ }
155
+
156
+ for (const programme of dispositifAmdtCreditPLFR.listeProgrammes) {
157
+ cleanXmlArtefacts(programme);
158
+
159
+ if (programme.lignesCredits !== undefined) {
160
+ let lignesCredits = programme.lignesCredits.ligneCredit;
161
+
162
+ if (lignesCredits === undefined) {
163
+ delete programme.lignesCredits;
164
+ } else {
165
+ if (!Array.isArray(lignesCredits)) {
166
+ assert(lignesCredits);
167
+ lignesCredits = [lignesCredits];
168
+ }
169
+
170
+ programme.lignesCredits = lignesCredits;
171
+ }
172
+
173
+ if (lignesCredits !== undefined) {
174
+ for (const ligneCredit of lignesCredits) {
175
+ cleanLigneCreditPLFR(ligneCredit);
176
+ }
177
+ }
178
+ }
179
+ }
180
+ }
181
+ }
182
+ }
183
+ }
184
+
185
+ const cycleDeVie = amendement.cycleDeVie;
186
+
187
+ if (cycleDeVie !== undefined) {
188
+ cleanXmlArtefacts(cycleDeVie);
189
+ const etatDesTraitements = cycleDeVie.etatDesTraitements;
190
+ {
191
+ cleanXmlArtefacts(etatDesTraitements);
192
+ const etat = etatDesTraitements.etat;
193
+ {
194
+ cleanXmlArtefacts(etat);
195
+ }
196
+ const sousEtat = etatDesTraitements.sousEtat;
197
+
198
+ if (sousEtat !== undefined) {
199
+ cleanXmlArtefacts(sousEtat);
200
+ }
201
+ }
202
+ }
203
+
204
+ if (amendement.representations !== undefined) {
205
+ const representation = amendement.representations.representation;
206
+ assert(!Array.isArray(representation));
207
+ amendement.representation = representation;
208
+ delete amendement.representations;
209
+ {
210
+ cleanXmlArtefacts(representation);
211
+ assert.strictEqual(representation.repSource, undefined);
212
+ assert.strictEqual(representation.offset, undefined);
213
+ assert.strictEqual(representation.dateDispoRepresentation, undefined);
214
+ const statutRepresentation = representation.statutRepresentation;
215
+ {
216
+ cleanBooleanAttribute(statutRepresentation, "canonique");
217
+ cleanBooleanAttribute(statutRepresentation, "enregistrement");
218
+ cleanBooleanAttribute(statutRepresentation, "officielle");
219
+ cleanBooleanAttribute(statutRepresentation, "transcription");
220
+ cleanBooleanAttribute(statutRepresentation, "verbatim");
221
+ }
222
+ }
223
+ }
224
+
225
+ const loiReference = amendement.loiReference;
226
+
227
+ if (loiReference !== undefined) {
228
+ cleanXmlArtefacts(loiReference);
229
+ }
230
+
231
+ const discussionCommune = amendement.discussionCommune;
232
+
233
+ if (discussionCommune !== undefined) {
234
+ cleanXmlArtefacts(discussionCommune);
235
+ }
236
+
237
+ const discussionIdentique = amendement.discussionIdentique;
238
+
239
+ if (discussionIdentique !== undefined) {
240
+ cleanXmlArtefacts(discussionIdentique);
241
+ }
242
+ }
243
+
244
+ function cleanLigneCreditPLFR(ligneCreditPLFR) {
245
+ cleanXmlArtefacts(ligneCreditPLFR);
246
+
247
+ if (ligneCreditPLFR.lignesCredits !== undefined) {
248
+ let lignesCredits = ligneCreditPLFR.lignesCredits.ligneCredit;
249
+
250
+ if (lignesCredits === undefined) {
251
+ delete ligneCreditPLFR.lignesCredits;
252
+ } else {
253
+ if (!Array.isArray(lignesCredits)) {
254
+ assert(lignesCredits);
255
+ lignesCredits = [lignesCredits];
256
+ }
257
+
258
+ ligneCreditPLFR.lignesCredits = lignesCredits;
259
+ }
260
+
261
+ if (lignesCredits !== undefined) {
262
+ for (const ligneCredit of lignesCredits) {
263
+ cleanLigneCreditPLFR(ligneCredit);
264
+ }
265
+ }
266
+ }
267
+ }
268
+
269
+ export function cleanTexteLegislatif(texteLegislatif) {
270
+ cleanXmlArtefacts(texteLegislatif); // Note: The following fields in `texteLegislatif.amendements` are currently ignored:
271
+ // * "#text"?: string;
272
+ // * offset?: null;
273
+ // * nom?: Nom;
274
+ // * avant_A_Apres?: DivisionAvantAApres;
275
+ // * dateDepot?: Date;
276
+ // * documentURI?: string;
277
+ // Because it seems they should belong to an "amendement".
278
+
279
+ let amendement = texteLegislatif.amendements.amendement;
280
+
281
+ if (Array.isArray(amendement)) {
282
+ texteLegislatif.amendements = amendement;
283
+ } else {
284
+ assert(amendement);
285
+ texteLegislatif.amendements = [amendement];
286
+ }
287
+
288
+ for (const amendement of texteLegislatif.amendements) {
289
+ cleanAmendement(amendement);
290
+ }
291
+ }
292
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhc3NlcnQiLCJjbGVhbkJvb2xlYW5BdHRyaWJ1dGUiLCJjbGVhblhtbEFydGVmYWN0cyIsIkF2YW50QUFwcmVzIiwiY2xlYW5BbWVuZGVtZW50IiwiYW1lbmRlbWVudCIsInNpZ25hdGFpcmVzIiwiYXV0ZXVyIiwiY29zaWduYXRhaXJlcyIsInVuZGVmaW5lZCIsImFjdGV1clJlZiIsIkFycmF5IiwiaXNBcnJheSIsImNvc2lnbmF0YWlyZXNSZWZzIiwibGliZWxsZSIsInNwbGl0IiwiZmlsdGVyIiwiQm9vbGVhbiIsImpvaW4iLCJwb2ludGV1ckZyYWdtZW50VGV4dGUiLCJkaXZpc2lvbiIsImF2YW50QUFwcmVzIiwiYXZhbnRfQV9BcHJlcyIsIkFwcmVzIiwiYW1lbmRlbWVudFN0YW5kYXJkIiwiYWxpbmVhIiwiQSIsIkF2YW50IiwiaW5jbHVkZXMiLCJjb3JwcyIsImNvbnRlbnVBdXRldXIiLCJhdmFudEFwcGVsIiwibm90U3RyaWN0RXF1YWwiLCJkaXNwb3NpdGlmIiwic3RyaWN0RXF1YWwiLCJhbm5leGVFeHBvc2VTb21tYWlyZSIsImRpc3Bvc2l0aWZBbWR0Q3JlZGl0UExGIiwibGlzdGVQcm9ncmFtbWVzIiwicHJvZ3JhbW1lIiwibGlnbmVzQ3JlZGl0cyIsImxpZ25lQ3JlZGl0IiwiZGlzcG9zaXRpZkFtZHRDcmVkaXRQTEZSIiwiY2xlYW5MaWduZUNyZWRpdFBMRlIiLCJjeWNsZURlVmllIiwiZXRhdERlc1RyYWl0ZW1lbnRzIiwiZXRhdCIsInNvdXNFdGF0IiwicmVwcmVzZW50YXRpb25zIiwicmVwcmVzZW50YXRpb24iLCJyZXBTb3VyY2UiLCJvZmZzZXQiLCJkYXRlRGlzcG9SZXByZXNlbnRhdGlvbiIsInN0YXR1dFJlcHJlc2VudGF0aW9uIiwibG9pUmVmZXJlbmNlIiwiZGlzY3Vzc2lvbkNvbW11bmUiLCJkaXNjdXNzaW9uSWRlbnRpcXVlIiwibGlnbmVDcmVkaXRQTEZSIiwiY2xlYW5UZXh0ZUxlZ2lzbGF0aWYiLCJ0ZXh0ZUxlZ2lzbGF0aWYiLCJhbWVuZGVtZW50cyJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGVhbmVycy9hbWVuZGVtZW50cy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIlxuXG5pbXBvcnQgeyBjbGVhbkJvb2xlYW5BdHRyaWJ1dGUsIGNsZWFuWG1sQXJ0ZWZhY3RzIH0gZnJvbSBcIi4veG1sXCJcbmltcG9ydCB7IEF2YW50QUFwcmVzIH0gZnJvbSBcIi4uL3R5cGVzL2FtZW5kZW1lbnRzXCJcblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFuQW1lbmRlbWVudChhbWVuZGVtZW50OiBhbnkpOiB2b2lkIHtcbiAgY2xlYW5YbWxBcnRlZmFjdHMoYW1lbmRlbWVudClcblxuICBjb25zdCBzaWduYXRhaXJlcyA9IGFtZW5kZW1lbnQuc2lnbmF0YWlyZXNcbiAge1xuICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKHNpZ25hdGFpcmVzKVxuXG4gICAgY29uc3QgYXV0ZXVyID0gc2lnbmF0YWlyZXMuYXV0ZXVyXG4gICAge1xuICAgICAgY2xlYW5YbWxBcnRlZmFjdHMoYXV0ZXVyKVxuICAgIH1cblxuICAgIGlmIChzaWduYXRhaXJlcy5jb3NpZ25hdGFpcmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGFjdGV1clJlZiA9IHNpZ25hdGFpcmVzLmNvc2lnbmF0YWlyZXMuYWN0ZXVyUmVmXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShhY3RldXJSZWYpKSB7XG4gICAgICAgIHNpZ25hdGFpcmVzLmNvc2lnbmF0YWlyZXNSZWZzID0gYWN0ZXVyUmVmXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhc3NlcnQoYWN0ZXVyUmVmKVxuICAgICAgICBzaWduYXRhaXJlcy5jb3NpZ25hdGFpcmVzUmVmcyA9IFthY3RldXJSZWZdXG4gICAgICB9XG4gICAgICBkZWxldGUgc2lnbmF0YWlyZXMuY29zaWduYXRhaXJlc1xuICAgIH1cblxuICAgIGxldCBsaWJlbGxlID0gc2lnbmF0YWlyZXMubGliZWxsZVxuICAgIGlmIChsaWJlbGxlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGxpYmVsbGUgPSBsaWJlbGxlLnNwbGl0KFwiIFwiKS5maWx0ZXIoQm9vbGVhbikuam9pbihcIiBcIilcbiAgICAgIGlmIChsaWJlbGxlKSB7XG4gICAgICAgIHNpZ25hdGFpcmVzLmxpYmVsbGUgPSBsaWJlbGxlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWxldGUgc2lnbmF0YWlyZXMubGliZWxsZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHBvaW50ZXVyRnJhZ21lbnRUZXh0ZSA9IGFtZW5kZW1lbnQucG9pbnRldXJGcmFnbWVudFRleHRlXG4gIHtcbiAgICBjbGVhblhtbEFydGVmYWN0cyhwb2ludGV1ckZyYWdtZW50VGV4dGUpXG5cbiAgICBjb25zdCBkaXZpc2lvbiA9IHBvaW50ZXVyRnJhZ21lbnRUZXh0ZS5kaXZpc2lvblxuICAgIGlmIChkaXZpc2lvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhblhtbEFydGVmYWN0cyhkaXZpc2lvbilcblxuICAgICAgbGV0IGF2YW50QUFwcmVzID0gZGl2aXNpb24uYXZhbnRfQV9BcHJlc1xuICAgICAgaWYgKGF2YW50QUFwcmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGVsZXRlIGRpdmlzaW9uLmF2YW50X0FfQXByZXNcbiAgICAgICAgaWYgKGF2YW50QUFwcmVzID09PSBcIkFwcsOoc1wiKSB7XG4gICAgICAgICAgYXZhbnRBQXByZXMgPSBBdmFudEFBcHJlcy5BcHJlc1xuICAgICAgICB9XG4gICAgICAgIGRpdmlzaW9uLmF2YW50QUFwcmVzID0gYXZhbnRBQXByZXNcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBhbWVuZGVtZW50U3RhbmRhcmQgPSBwb2ludGV1ckZyYWdtZW50VGV4dGUuYW1lbmRlbWVudFN0YW5kYXJkXG4gICAgaWYgKGFtZW5kZW1lbnRTdGFuZGFyZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBjbGVhblhtbEFydGVmYWN0cyhhbWVuZGVtZW50U3RhbmRhcmQpXG5cbiAgICAgIGNvbnN0IGFsaW5lYSA9IGFtZW5kZW1lbnRTdGFuZGFyZC5hbGluZWFcbiAgICAgIGlmIChhbGluZWEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhhbGluZWEpXG5cbiAgICAgICAgbGV0IGF2YW50QUFwcmVzID0gYWxpbmVhLmF2YW50X0FfQXByZXNcbiAgICAgICAgaWYgKGF2YW50QUFwcmVzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBkZWxldGUgYWxpbmVhLmF2YW50X0FfQXByZXNcbiAgICAgICAgICBpZiAoYXZhbnRBQXByZXMgPT09IFwiQXByw6hzXCIpIHtcbiAgICAgICAgICAgIGF2YW50QUFwcmVzID0gQXZhbnRBQXByZXMuQXByZXNcbiAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgIVtBdmFudEFBcHJlcy5BLCBBdmFudEFBcHJlcy5BcHJlcywgQXZhbnRBQXByZXMuQXZhbnRdLmluY2x1ZGVzKFxuICAgICAgICAgICAgICBhdmFudEFBcHJlcyxcbiAgICAgICAgICAgIClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIGF2YW50QUFwcmVzID0gQXZhbnRBQXByZXMuQVxuICAgICAgICAgIH1cbiAgICAgICAgICBhbGluZWEuYXZhbnRBQXByZXMgPSBhdmFudEFBcHJlc1xuICAgICAgICB9XG5cbiAgICAgICAgcG9pbnRldXJGcmFnbWVudFRleHRlLmFsaW5lYSA9IGFsaW5lYVxuICAgICAgfVxuICAgICAgZGVsZXRlIHBvaW50ZXVyRnJhZ21lbnRUZXh0ZS5hbWVuZGVtZW50U3RhbmRhcmRcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb3JwcyA9IGFtZW5kZW1lbnQuY29ycHNcbiAgaWYgKGNvcnBzICE9PSB1bmRlZmluZWQpIHtcbiAgICBjbGVhblhtbEFydGVmYWN0cyhjb3JwcylcblxuICAgIGNvbnN0IGNvbnRlbnVBdXRldXIgPSBjb3Jwcy5jb250ZW51QXV0ZXVyXG4gICAgaWYgKGNvbnRlbnVBdXRldXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2xlYW5YbWxBcnRlZmFjdHMoY29udGVudUF1dGV1cilcblxuICAgICAgY29uc3QgYXZhbnRBcHBlbCA9IGNvbnRlbnVBdXRldXIuYXZhbnRBcHBlbFxuICAgICAgaWYgKGF2YW50QXBwZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhhdmFudEFwcGVsKVxuXG4gICAgICAgIGFzc2VydC5ub3RTdHJpY3RFcXVhbChhdmFudEFwcGVsLmRpc3Bvc2l0aWYsIHVuZGVmaW5lZClcbiAgICAgIH1cblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKGNvbnRlbnVBdXRldXIuYW5uZXhlRXhwb3NlU29tbWFpcmUsIHVuZGVmaW5lZClcblxuICAgICAgY29uc3QgZGlzcG9zaXRpZkFtZHRDcmVkaXRQTEYgPSBjb250ZW51QXV0ZXVyLmRpc3Bvc2l0aWZBbWR0Q3JlZGl0UExGXG4gICAgICBpZiAoZGlzcG9zaXRpZkFtZHRDcmVkaXRQTEYgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBsaXN0ZVByb2dyYW1tZXMgPVxuICAgICAgICAgIGRpc3Bvc2l0aWZBbWR0Q3JlZGl0UExGLmxpc3RlUHJvZ3JhbW1lcz8ucHJvZ3JhbW1lXG4gICAgICAgIGlmIChsaXN0ZVByb2dyYW1tZXMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxpc3RlUHJvZ3JhbW1lcykpIHtcbiAgICAgICAgICAgIGRpc3Bvc2l0aWZBbWR0Q3JlZGl0UExGLmxpc3RlUHJvZ3JhbW1lcyA9IGxpc3RlUHJvZ3JhbW1lc1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQobGlzdGVQcm9ncmFtbWVzKVxuICAgICAgICAgICAgZGlzcG9zaXRpZkFtZHRDcmVkaXRQTEYubGlzdGVQcm9ncmFtbWVzID0gW2xpc3RlUHJvZ3JhbW1lc11cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHByb2dyYW1tZSBvZiBkaXNwb3NpdGlmQW1kdENyZWRpdFBMRi5saXN0ZVByb2dyYW1tZXMpIHtcbiAgICAgICAgICAgIGNsZWFuWG1sQXJ0ZWZhY3RzKHByb2dyYW1tZSlcblxuICAgICAgICAgICAgaWYgKHByb2dyYW1tZS5saWduZXNDcmVkaXRzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgbGV0IGxpZ25lc0NyZWRpdHMgPSBwcm9ncmFtbWUubGlnbmVzQ3JlZGl0cy5saWduZUNyZWRpdFxuICAgICAgICAgICAgICBpZiAobGlnbmVzQ3JlZGl0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHByb2dyYW1tZS5saWduZXNDcmVkaXRzXG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGxpZ25lc0NyZWRpdHMpKSB7XG4gICAgICAgICAgICAgICAgICBhc3NlcnQobGlnbmVzQ3JlZGl0cylcbiAgICAgICAgICAgICAgICAgIGxpZ25lc0NyZWRpdHMgPSBbbGlnbmVzQ3JlZGl0c11cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcHJvZ3JhbW1lLmxpZ25lc0NyZWRpdHMgPSBsaWduZXNDcmVkaXRzXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGxpZ25lc0NyZWRpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbGlnbmVDcmVkaXQgb2YgbGlnbmVzQ3JlZGl0cykge1xuICAgICAgICAgICAgICAgICAgY2xlYW5YbWxBcnRlZmFjdHMobGlnbmVDcmVkaXQpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRpc3Bvc2l0aWZBbWR0Q3JlZGl0UExGUiA9IGNvbnRlbnVBdXRldXIuZGlzcG9zaXRpZkFtZHRDcmVkaXRQTEZSXG4gICAgICBpZiAoZGlzcG9zaXRpZkFtZHRDcmVkaXRQTEZSICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgbGlzdGVQcm9ncmFtbWVzID1cbiAgICAgICAgICBkaXNwb3NpdGlmQW1kdENyZWRpdFBMRlIubGlzdGVQcm9ncmFtbWVzPy5wcm9ncmFtbWVcbiAgICAgICAgaWYgKGxpc3RlUHJvZ3JhbW1lcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobGlzdGVQcm9ncmFtbWVzKSkge1xuICAgICAgICAgICAgZGlzcG9zaXRpZkFtZHRDcmVkaXRQTEZSLmxpc3RlUHJvZ3JhbW1lcyA9IGxpc3RlUHJvZ3JhbW1lc1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhc3NlcnQobGlzdGVQcm9ncmFtbWVzKVxuICAgICAgICAgICAgZGlzcG9zaXRpZkFtZHRDcmVkaXRQTEZSLmxpc3RlUHJvZ3JhbW1lcyA9IFtsaXN0ZVByb2dyYW1tZXNdXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCBwcm9ncmFtbWUgb2YgZGlzcG9zaXRpZkFtZHRDcmVkaXRQTEZSLmxpc3RlUHJvZ3JhbW1lcykge1xuICAgICAgICAgICAgY2xlYW5YbWxBcnRlZmFjdHMocHJvZ3JhbW1lKVxuXG4gICAgICAgICAgICBpZiAocHJvZ3JhbW1lLmxpZ25lc0NyZWRpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICBsZXQgbGlnbmVzQ3JlZGl0cyA9IHByb2dyYW1tZS5saWduZXNDcmVkaXRzLmxpZ25lQ3JlZGl0XG4gICAgICAgICAgICAgIGlmIChsaWduZXNDcmVkaXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgcHJvZ3JhbW1lLmxpZ25lc0NyZWRpdHNcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobGlnbmVzQ3JlZGl0cykpIHtcbiAgICAgICAgICAgICAgICAgIGFzc2VydChsaWduZXNDcmVkaXRzKVxuICAgICAgICAgICAgICAgICAgbGlnbmVzQ3JlZGl0cyA9IFtsaWduZXNDcmVkaXRzXVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBwcm9ncmFtbWUubGlnbmVzQ3JlZGl0cyA9IGxpZ25lc0NyZWRpdHNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAobGlnbmVzQ3JlZGl0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBsaWduZUNyZWRpdCBvZiBsaWduZXNDcmVkaXRzKSB7XG4gICAgICAgICAgICAgICAgICBjbGVhbkxpZ25lQ3JlZGl0UExGUihsaWduZUNyZWRpdClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjb25zdCBjeWNsZURlVmllID0gYW1lbmRlbWVudC5jeWNsZURlVmllXG4gIGlmIChjeWNsZURlVmllICE9PSB1bmRlZmluZWQpIHtcbiAgICBjbGVhblhtbEFydGVmYWN0cyhjeWNsZURlVmllKVxuXG4gICAgY29uc3QgZXRhdERlc1RyYWl0ZW1lbnRzID0gY3ljbGVEZVZpZS5ldGF0RGVzVHJhaXRlbWVudHNcbiAgICB7XG4gICAgICBjbGVhblhtbEFydGVmYWN0cyhldGF0RGVzVHJhaXRlbWVudHMpXG5cbiAgICAgIGNvbnN0IGV0YXQgPSBldGF0RGVzVHJhaXRlbWVudHMuZXRhdFxuICAgICAge1xuICAgICAgICBjbGVhblhtbEFydGVmYWN0cyhldGF0KVxuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VzRXRhdCA9IGV0YXREZXNUcmFpdGVtZW50cy5zb3VzRXRhdFxuICAgICAgaWYgKHNvdXNFdGF0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY2xlYW5YbWxBcnRlZmFjdHMoc291c0V0YXQpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGFtZW5kZW1lbnQucmVwcmVzZW50YXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCByZXByZXNlbnRhdGlvbiA9IGFtZW5kZW1lbnQucmVwcmVzZW50YXRpb25zLnJlcHJlc2VudGF0aW9uXG4gICAgYXNzZXJ0KCFBcnJheS5pc0FycmF5KHJlcHJlc2VudGF0aW9uKSlcbiAgICBhbWVuZGVtZW50LnJlcHJlc2VudGF0aW9uID0gcmVwcmVzZW50YXRpb25cbiAgICBkZWxldGUgYW1lbmRlbWVudC5yZXByZXNlbnRhdGlvbnNcbiAgICB7XG4gICAgICBjbGVhblhtbEFydGVmYWN0cyhyZXByZXNlbnRhdGlvbilcblxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlcHJlc2VudGF0aW9uLnJlcFNvdXJjZSwgdW5kZWZpbmVkKVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlcHJlc2VudGF0aW9uLm9mZnNldCwgdW5kZWZpbmVkKVxuICAgICAgYXNzZXJ0LnN0cmljdEVxdWFsKHJlcHJlc2VudGF0aW9uLmRhdGVEaXNwb1JlcHJlc2VudGF0aW9uLCB1bmRlZmluZWQpXG5cbiAgICAgIGNvbnN0IHN0YXR1dFJlcHJlc2VudGF0aW9uID0gcmVwcmVzZW50YXRpb24uc3RhdHV0UmVwcmVzZW50YXRpb25cbiAgICAgIHtcbiAgICAgICAgY2xlYW5Cb29sZWFuQXR0cmlidXRlKHN0YXR1dFJlcHJlc2VudGF0aW9uLCBcImNhbm9uaXF1ZVwiKVxuICAgICAgICBjbGVhbkJvb2xlYW5BdHRyaWJ1dGUoc3RhdHV0UmVwcmVzZW50YXRpb24sIFwiZW5yZWdpc3RyZW1lbnRcIilcbiAgICAgICAgY2xlYW5Cb29sZWFuQXR0cmlidXRlKHN0YXR1dFJlcHJlc2VudGF0aW9uLCBcIm9mZmljaWVsbGVcIilcbiAgICAgICAgY2xlYW5Cb29sZWFuQXR0cmlidXRlKHN0YXR1dFJlcHJlc2VudGF0aW9uLCBcInRyYW5zY3JpcHRpb25cIilcbiAgICAgICAgY2xlYW5Cb29sZWFuQXR0cmlidXRlKHN0YXR1dFJlcHJlc2VudGF0aW9uLCBcInZlcmJhdGltXCIpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbG9pUmVmZXJlbmNlID0gYW1lbmRlbWVudC5sb2lSZWZlcmVuY2VcbiAgaWYgKGxvaVJlZmVyZW5jZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY2xlYW5YbWxBcnRlZmFjdHMobG9pUmVmZXJlbmNlKVxuICB9XG5cbiAgY29uc3QgZGlzY3Vzc2lvbkNvbW11bmUgPSBhbWVuZGVtZW50LmRpc2N1c3Npb25Db21tdW5lXG4gIGlmIChkaXNjdXNzaW9uQ29tbXVuZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY2xlYW5YbWxBcnRlZmFjdHMoZGlzY3Vzc2lvbkNvbW11bmUpXG4gIH1cblxuICBjb25zdCBkaXNjdXNzaW9uSWRlbnRpcXVlID0gYW1lbmRlbWVudC5kaXNjdXNzaW9uSWRlbnRpcXVlXG4gIGlmIChkaXNjdXNzaW9uSWRlbnRpcXVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBjbGVhblhtbEFydGVmYWN0cyhkaXNjdXNzaW9uSWRlbnRpcXVlKVxuICB9XG59XG5cbmZ1bmN0aW9uIGNsZWFuTGlnbmVDcmVkaXRQTEZSKGxpZ25lQ3JlZGl0UExGUjogYW55KSB7XG4gIGNsZWFuWG1sQXJ0ZWZhY3RzKGxpZ25lQ3JlZGl0UExGUilcblxuICBpZiAobGlnbmVDcmVkaXRQTEZSLmxpZ25lc0NyZWRpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgIGxldCBsaWduZXNDcmVkaXRzID0gbGlnbmVDcmVkaXRQTEZSLmxpZ25lc0NyZWRpdHMubGlnbmVDcmVkaXRcbiAgICBpZiAobGlnbmVzQ3JlZGl0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWxldGUgbGlnbmVDcmVkaXRQTEZSLmxpZ25lc0NyZWRpdHNcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGxpZ25lc0NyZWRpdHMpKSB7XG4gICAgICAgIGFzc2VydChsaWduZXNDcmVkaXRzKVxuICAgICAgICBsaWduZXNDcmVkaXRzID0gW2xpZ25lc0NyZWRpdHNdXG4gICAgICB9XG4gICAgICBsaWduZUNyZWRpdFBMRlIubGlnbmVzQ3JlZGl0cyA9IGxpZ25lc0NyZWRpdHNcbiAgICB9XG4gICAgaWYgKGxpZ25lc0NyZWRpdHMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCBsaWduZUNyZWRpdCBvZiBsaWduZXNDcmVkaXRzKSB7XG4gICAgICAgIGNsZWFuTGlnbmVDcmVkaXRQTEZSKGxpZ25lQ3JlZGl0KVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5UZXh0ZUxlZ2lzbGF0aWYodGV4dGVMZWdpc2xhdGlmOiBhbnkpOiB2b2lkIHtcbiAgY2xlYW5YbWxBcnRlZmFjdHModGV4dGVMZWdpc2xhdGlmKVxuXG4gIC8vIE5vdGU6IFRoZSBmb2xsb3dpbmcgZmllbGRzIGluIGB0ZXh0ZUxlZ2lzbGF0aWYuYW1lbmRlbWVudHNgIGFyZSBjdXJyZW50bHkgaWdub3JlZDpcbiAgLy8gKiBcIiN0ZXh0XCI/OiAgICAgICBzdHJpbmc7XG4gIC8vICogb2Zmc2V0PzogICAgICAgIG51bGw7XG4gIC8vICogbm9tPzogICAgICAgICAgIE5vbTtcbiAgLy8gKiBhdmFudF9BX0FwcmVzPzogRGl2aXNpb25BdmFudEFBcHJlcztcbiAgLy8gKiBkYXRlRGVwb3Q/OiAgICAgRGF0ZTtcbiAgLy8gKiBkb2N1bWVudFVSST86ICAgc3RyaW5nO1xuICAvLyBCZWNhdXNlIGl0IHNlZW1zIHRoZXkgc2hvdWxkIGJlbG9uZyB0byBhbiBcImFtZW5kZW1lbnRcIi5cbiAgbGV0IGFtZW5kZW1lbnQgPSB0ZXh0ZUxlZ2lzbGF0aWYuYW1lbmRlbWVudHMuYW1lbmRlbWVudFxuICBpZiAoQXJyYXkuaXNBcnJheShhbWVuZGVtZW50KSkge1xuICAgIHRleHRlTGVnaXNsYXRpZi5hbWVuZGVtZW50cyA9IGFtZW5kZW1lbnRcbiAgfSBlbHNlIHtcbiAgICBhc3NlcnQoYW1lbmRlbWVudClcbiAgICB0ZXh0ZUxlZ2lzbGF0aWYuYW1lbmRlbWVudHMgPSBbYW1lbmRlbWVudF1cbiAgfVxuXG4gIGZvciAoY29uc3QgYW1lbmRlbWVudCBvZiB0ZXh0ZUxlZ2lzbGF0aWYuYW1lbmRlbWVudHMpIHtcbiAgICBjbGVhbkFtZW5kZW1lbnQoYW1lbmRlbWVudClcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxNQUFQLE1BQW1CLFFBQW5CO1NBRVNDLHFCLEVBQXVCQyxpQjtTQUN2QkMsVztBQUVULE9BQU8sU0FBU0MsZUFBVCxDQUF5QkMsVUFBekIsRUFBZ0Q7RUFDckRILGlCQUFpQixDQUFDRyxVQUFELENBQWpCO0VBRUEsTUFBTUMsV0FBVyxHQUFHRCxVQUFVLENBQUNDLFdBQS9CO0VBQ0E7SUFDRUosaUJBQWlCLENBQUNJLFdBQUQsQ0FBakI7SUFFQSxNQUFNQyxNQUFNLEdBQUdELFdBQVcsQ0FBQ0MsTUFBM0I7SUFDQTtNQUNFTCxpQkFBaUIsQ0FBQ0ssTUFBRCxDQUFqQjtJQUNEOztJQUVELElBQUlELFdBQVcsQ0FBQ0UsYUFBWixLQUE4QkMsU0FBbEMsRUFBNkM7TUFDM0MsTUFBTUMsU0FBUyxHQUFHSixXQUFXLENBQUNFLGFBQVosQ0FBMEJFLFNBQTVDOztNQUNBLElBQUlDLEtBQUssQ0FBQ0MsT0FBTixDQUFjRixTQUFkLENBQUosRUFBOEI7UUFDNUJKLFdBQVcsQ0FBQ08saUJBQVosR0FBZ0NILFNBQWhDO01BQ0QsQ0FGRCxNQUVPO1FBQ0xWLE1BQU0sQ0FBQ1UsU0FBRCxDQUFOO1FBQ0FKLFdBQVcsQ0FBQ08saUJBQVosR0FBZ0MsQ0FBQ0gsU0FBRCxDQUFoQztNQUNEOztNQUNELE9BQU9KLFdBQVcsQ0FBQ0UsYUFBbkI7SUFDRDs7SUFFRCxJQUFJTSxPQUFPLEdBQUdSLFdBQVcsQ0FBQ1EsT0FBMUI7O0lBQ0EsSUFBSUEsT0FBTyxLQUFLTCxTQUFoQixFQUEyQjtNQUN6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