-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.js
734 lines (723 loc) · 107 KB
/
main.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
/*
THIS IS A GENERATED/BUNDLED FILE BY ESBUILD
if you want to view the source, please visit the github repository of this plugin
*/
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// main.ts
var main_exports = {};
__export(main_exports, {
default: () => PertinentQuestions
});
module.exports = __toCommonJS(main_exports);
var import_obsidian = require("obsidian");
// src/Constants.ts
var AppSettings = class {
};
AppSettings.EMAIL_NL = `
`;
// Email new line
AppSettings.EMAIL_SOL = ` `;
//Email start of line
AppSettings.MAC_FOLDER_SEPARATOR = `/`;
AppSettings.ALL_CATEGORIES = "All Categories or Campaigns";
AppSettings.CREATE_PERTINENT_QUESTIONS = "Create Pertinent Questions";
AppSettings.CREATE_PERTINENT_ACTIONS = "Create Pertinent Actions";
AppSettings.SUBJECT_GOES_HERE = "SUBJECT GOES HERE!";
AppSettings.FAO = "FAO";
AppSettings.CONTACTS_FILE_LOCATION = "Enter Contacts File Location";
AppSettings.CONTACTS_IMPORT_FILE = "Contacts Import File";
AppSettings.CAT_INDEX_SUFFIX = "-Index.md";
AppSettings.IMAGE_SPECIFIER = `image:`;
AppSettings.VIDEO_SPECIFIER = `video:`;
AppSettings.CAMPAIGN_SPECIFIER = `campaign:`;
AppSettings.DEADLINE_SPECIFIER = `deadline:`;
AppSettings.QSHORT_SPECIFIER = `qshort:`;
AppSettings.MENTIONED_SPECIFIER = `mentioned:`;
AppSettings.ALIAS_SPECIFIER = `alias:`;
AppSettings.FOOTER_SPECIFIER = `![[Footer]]`;
AppSettings.FOOTER_EMBED = `<div align=center><iframe src="https://projectbubbleburst.substack.com/embed" width="480" height="320" style="border:1px solid #EEE; background:black;" frameborder="0" scrolling="no"></iframe></div><div align=center>ProjectBubbleBurst - Critical Thinking in a Pandemic of Unreason. <br/> <b>THINK</b> - While It Is Still Legal...</div>`;
// public static VIDEO_EMBED1 = `<center><iframe width="560" height="315" src="`;
// public static VIDEO_EMBED2 = `" frameborder="0" autoplay="0" autostart="0" allow="accelerometer; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></center>`
AppSettings.VIDEO_EMBED1 = `<video width="600" height="400" src="`;
AppSettings.VIDEO_EMBED2 = `" controls></video>`;
AppSettings.TAGS_SPECIFIER = `tags:`;
AppSettings.URI_PLUS = `%2B`;
AppSettings.URI_SPACE = `%20`;
AppSettings.PBB_PQ_DIR = `https://projectbubbleburst.com/Pertinent+Questions/`;
AppSettings.PBB_ROOT = `https://projectbubbleburst.com/`;
AppSettings.VIDEO_HEADING = `
### Video
`;
AppSettings.RESEARCH_MEDIA_HEADING = `
## reSearch Media
`;
AppSettings.IMAGE_MEDIA_HEADING = `### Image
`;
// public static TWEET = `[Twitter](https://twitter.com/intent/tweet?text=`;
// public static FACEBOOK_POST = `[Facebook](https://www.facebook.com/sharer.php?u=`;
AppSettings.NUM_QUESTIONS = `Number of Category Pertinent Questions = `;
AppSettings.TOTAL_NUM_QUESTIONS = `Total Number of Pertinent Questions = `;
AppSettings.WEF_COMPANIES = `'
### Global
- WEF Companies - https://www.weforum.org/partners#search [Let them know where your money will not be spent](https://projectbubbleburst.com/Actions/Action+18+-+Let+them+know+-+FTheWEF)`;
AppSettings.PERTINENT_CONTACTS_FILE = "/Pertinent Contacts.md";
AppSettings.CONTACTS_HEADER = "\n\n## Contacts\n> [!NOTE]\n>**Remember - send the questions to your friends, family, colleagues and local businesses first and foremost to avoid central censorship.**\n>\n> *To pose a pertinent question, the question must first be unapposed.*\n\nBelow is a short list of some country political representatives and WEF aligned companies. For further information, see: https://en.wikipedia.org/wiki/List_of_legislatures_by_country";
AppSettings.AUSTRALIA_POLITICAL_CONTACTS = "\n### Australia\n- List Senators and Members: https://www.aph.gov.au/Senators_and_Members/Parliamentarian_Search_Results?q=&mem=1&par=-1&gen=0&ps=0";
AppSettings.CANADA_POLITICAL_CONTACTS = "\n### Canada\n- List of MPs: https://www.ourcommons.ca/members/en/search";
AppSettings.EU_POLITICAL_CONTACTS = "\n### EU\n- List of MEPs: https://www.europarl.europa.eu/meps/en/full-list/all";
AppSettings.FINLAND_POLITICAL_CONTACTS = "\n### Finland\n- List of MPs: https://www.eduskunta.fi/EN/kansanedustajat/nykyiset_kansanedustajat/Pages/default.aspx";
AppSettings.GERMANY_POLITICAL_CONTACTS = "\n### Germany\n- List of MPs: https://www.bundestag.de/en/members";
AppSettings.IRELAND_POLITICAL_CONTACTS = "\n### Ireland\n- List of TDs and Senators: https://www.oireachtas.ie/en/members/";
AppSettings.NETHERLANDS_POLITICAL_CONTACTS = "\n### Netherlands\n- List of MPs: https://www.houseofrepresentatives.nl/members_of_parliament/members_of_parliament";
AppSettings.NEW_ZEALAND_POLITICAL_CONTACTS = "\n### New Zealand\n- List of MPs: https://www.parliament.nz/en/mps-and-electorates/members-of-parliament/";
AppSettings.NORWAY_POLITICAL_CONTACTS = "\n### Norway\n- List of MPs: https://www.stortinget.no/en/In-English/Members-of-the-Storting/current-members-of-parliament/";
AppSettings.SWEDEN_POLITICAL_CONTACTS = "\n### Sweden\n- List of MPs: https://www.riksdagen.se/en/Members-and-parties/";
AppSettings.SWITZERLAND_POLITICAL_CONTACTS = "\n### Switzerland\n- List of MPs: https://www.parlament.ch/en/organe/national-council/members-national-council-a-z";
AppSettings.UK_POLITICAL_CONTACTS = "\n### UK\n- Spreadsheet list of MPs: https://www.theyworkforyou.com/mps/?f=csv\n- Find your MP: https://members.parliament.uk/members/commons\n- Find a Lord: https://members.parliament.uk/members/lords";
AppSettings.US_POLITICAL_CONTACTS = "\n### US\n- List of Senators: https://www.senate.gov/senators/";
AppSettings.PERTINENT_CONTACTS_REFERENCE = "Note\n>Please see [[Pertinent Contacts|Contacts]] for political representatives and other ideas for who to send information\n## Share It\nCopy and paste the information above and/or images/videos below and share via your social media accounts.";
AppSettings.INSTRUCTIONS_FAQ = `## Instructions
[FAQ and Help](https://projectbubbleburst.com/Pertinent+Questions+Help)
- [Support Us](https://projectbubbleburst.com/Support+Us)
## Take Action
`;
AppSettings.INSTRUCTIONS_FAQ_DETAILED = `## Instructions
[FAQ and Help](https://projectbubbleburst.com/Pertinent+Questions+Help)
- reSearch - The content and reSearch Media. Make sure you personalise your email with your own reasoned arguments and feelings.
- Send It!
- Share It!
- [Support Us](https://projectbubbleburst.com/Support+Us)
## Send It
Personalise the message below
`;
// main.ts
var DEFAULT_SETTINGS = {
questionsFolder: "Questions",
questionsOutputFolder: "Pertinent Questions",
actionsFolder: "Actions",
actionsOutputFolder: "Pertinent Actions",
contactsFile: "contacts.csv"
};
function uniqByObject(array) {
const result = [];
let results = 0;
for (const item of array) {
let duplicate = false;
for (let i = 0; i < result.length; i++) {
if (result[i].emailAddress == item.emailAddress) {
duplicate = true;
console.warn(`Duplicate contact found with email address ${item.emailAddress}`);
break;
}
if (result[i].firstName == item.firstName && result[i].lastName == item.lastName) {
duplicate = true;
console.warn(`Duplicate contact found with first and last name ${item.firstName} ${item.lastName}`);
break;
}
}
if (!duplicate) {
result.push(item);
}
}
return result;
}
var validateEmail = (email) => {
try {
return email.toLowerCase().match(
/^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|.(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
);
} catch (e) {
console.error(`ERROR: Problem validating Email with ${email}`);
}
return false;
};
function validContact(contact) {
let contactIsValid = true;
if (contact == null || contact == void 0) {
console.warn("Invalid contact - null or undefined");
contactIsValid = false;
} else if (!validateEmail(contact.emailAddress)) {
console.warn(`Invalid contact - bad email: ${contact.emailAddress}`);
contactIsValid = false;
} else if (contact.firstName.length == 0) {
console.warn(`Invalid contact - no firstname provided`);
contactIsValid = false;
} else if (contact.lastName.length == 0) {
console.warn(`Invalid contact - no lastname provided`);
contactIsValid = false;
}
return contactIsValid;
}
function fileExists(filePath, app) {
const folderOrFile = app.vault.getAbstractFileByPath(filePath);
if (folderOrFile instanceof import_obsidian.TFile) {
return true;
}
return false;
}
function folderExists(filePath, app) {
const folderOrFile = app.vault.getAbstractFileByPath(filePath);
if (folderOrFile instanceof import_obsidian.TFolder) {
return true;
}
return false;
}
var PertinentQuestions = class extends import_obsidian.Plugin {
async onload() {
await this.loadSettings();
this.addCommand({
id: "create-pertinent-questions",
name: AppSettings.CREATE_PERTINENT_QUESTIONS,
callback: async () => {
console.debug(`Adding CREATE Pertinent Questions`);
const questionCategories = [];
this.findAllCategoriesOrActions(true).forEach((cat) => {
questionCategories.unshift(cat);
});
const contacts = await this.getAllContacts(this.settings.contactsFile);
const suggestModal = new PertinentSuggestModal(this.app, true, questionCategories, contacts, this.settings.questionsOutputFolder, this.settings.questionsFolder).open();
}
});
this.addCommand({
id: "create-pertinent-actions",
name: AppSettings.CREATE_PERTINENT_ACTIONS,
callback: async () => {
console.debug(`Adding CREATE Pertinent Actins`);
const actionCategories = [];
this.findAllCategoriesOrActions(false).forEach((cat) => {
actionCategories.unshift(cat);
});
const contacts = [];
const suggestModal = new PertinentSuggestModal(this.app, false, actionCategories, contacts, this.settings.actionsOutputFolder, this.settings.actionsFolder).open();
}
});
this.addSettingTab(new PertinentSettingTab(this.app, this));
}
async getAllContacts(theContactFile) {
const contacts = [];
const folderOrFile = this.app.vault.getAbstractFileByPath(theContactFile);
if (folderOrFile instanceof import_obsidian.TFile) {
let fileContents = await this.app.vault.cachedRead(folderOrFile);
const fileLines = fileContents.split("\n");
for (let j = 0; j < fileLines.length - 1; j++) {
const [title, firstName, lastName, emailAddress] = fileLines[j].split(",");
const contact = { title, firstName, lastName, emailAddress };
if (contact != null)
console.debug(`contact = ${contact.title} and ${contact.firstName} and ${contact.lastName} and ${contact.emailAddress}`);
if (validContact(contact)) {
contacts.unshift(contact);
} else {
console.warn(`Invalid contact found - contact = ${contact}`);
}
}
return uniqByObject(contacts);
}
return contacts;
}
findAllCategoriesOrActions(commandQuestion) {
const categories = [];
function extractSecondLevelFolder(str) {
const regex = /\/([^\/]*)\//;
const match = str.match(regex);
return match ? match[1] : null;
}
const folderOrFile = commandQuestion ? this.app.vault.getAbstractFileByPath(this.settings.questionsFolder) : this.app.vault.getAbstractFileByPath(this.settings.actionsFolder);
let numFolders = 0;
if (folderOrFile instanceof import_obsidian.TFolder) {
for (let child of folderOrFile.children) {
if (child instanceof import_obsidian.TFile) {
} else {
const categoryFolder = this.app.vault.getAbstractFileByPath(child.path);
if (categoryFolder instanceof import_obsidian.TFolder) {
for (let innerChild of categoryFolder.children) {
if (innerChild instanceof import_obsidian.TFile) {
const substring = extractSecondLevelFolder(innerChild.path);
if (substring != null) {
console.debug(`DEBUG: substring = ${substring}`);
if (!categories.contains(substring)) {
categories.unshift(substring);
}
} else {
console.warn(`Couldn't extract folder substring from ${innerChild.path}`);
}
}
}
}
}
}
console.debug(`numFolders=${numFolders}`);
} else {
console.warn(`NOT AN INSTANCE OF TFolder instead it is ${folderOrFile}`);
}
return categories;
}
onunload() {
console.info("Unloading PertinentQuestions plugin...");
}
async loadSettings() {
this.settings = Object.assign({}, DEFAULT_SETTINGS, await this.loadData());
}
async saveSettings() {
await this.saveData(this.settings);
}
};
var PertinentSuggestModal = class extends import_obsidian.SuggestModal {
constructor(app, commandQuestion, categories, contacts, outputFolder, questionsOrActionsFolder) {
super(app);
this.vault = app.vault;
this.commandQuestion = commandQuestion;
this.categories = categories;
this.contacts = contacts;
this.outputFolder = outputFolder;
this.questionsOrActionsFolder = questionsOrActionsFolder;
}
// Returns all available suggestions.
getSuggestions(query) {
this.categories.sort();
if (this.categories[0] != AppSettings.ALL_CATEGORIES) {
const index = this.categories.indexOf(AppSettings.ALL_CATEGORIES);
this.categories.unshift(AppSettings.ALL_CATEGORIES);
}
return this.categories.filter(
(cat) => cat.toLowerCase().includes(query.toLowerCase())
);
}
// Renders each suggestion item.
renderSuggestion(cat, el) {
el.createEl("div", { text: cat });
}
// Perform action on the selected suggestion.
async onChooseSuggestion(cat, evt) {
this.createFolder(this.outputFolder);
let theContent = AppSettings.CONTACTS_HEADER;
theContent = theContent.concat(AppSettings.WEF_COMPANIES);
theContent = theContent.concat(AppSettings.AUSTRALIA_POLITICAL_CONTACTS);
theContent = theContent.concat(AppSettings.CANADA_POLITICAL_CONTACTS);
theContent = theContent.concat(AppSettings.EU_POLITICAL_CONTACTS);
theContent = theContent.concat(AppSettings.FINLAND_POLITICAL_CONTACTS);
theContent = theContent.concat(AppSettings.GERMANY_POLITICAL_CONTACTS);
theContent = theContent.concat(AppSettings.IRELAND_POLITICAL_CONTACTS);
theContent = theContent.concat(AppSettings.NETHERLANDS_POLITICAL_CONTACTS);
theContent = theContent.concat(AppSettings.NEW_ZEALAND_POLITICAL_CONTACTS);
theContent = theContent.concat(AppSettings.NORWAY_POLITICAL_CONTACTS);
theContent = theContent.concat(AppSettings.SWEDEN_POLITICAL_CONTACTS);
theContent = theContent.concat(AppSettings.SWITZERLAND_POLITICAL_CONTACTS);
theContent = theContent.concat(AppSettings.UK_POLITICAL_CONTACTS);
theContent = theContent.concat(AppSettings.US_POLITICAL_CONTACTS);
this.createFile(AppSettings.PERTINENT_CONTACTS_FILE, theContent);
if (cat != AppSettings.ALL_CATEGORIES) {
this.categories = [cat];
} else {
this.categories.shift();
}
let totalQuestionOrActionCount = 0;
theContent = "";
for (let j = 0; j < this.categories.length; j++) {
let categoriesCount = 0;
console.debug(`cat ${j} = ${this.categories[j]}`);
let theQorAs = await this.getCategoryQuestionsOrActions(this.categories[j]);
const theFolder = this.outputFolder.concat(AppSettings.MAC_FOLDER_SEPARATOR).concat(this.categories[j]);
if (theQorAs != null) {
this.createFolder(theFolder);
categoriesCount = theQorAs.length;
if (this.contacts.length > 0) {
for (let i = 0; i < this.contacts.length; i++) {
for (let k = 0; k < theQorAs.length; k++) {
let theQorA = theQorAs[k];
this.commandQuestion ? this.writeQuestionFile(theQorA, theFolder, this.categories[j], this.contacts.at(i)) : this.writeActionFile(theQorA, theFolder, this.categories[j]);
totalQuestionOrActionCount++;
}
}
} else {
for (let k = 0; k < theQorAs.length; k++) {
let theQorA = theQorAs[k];
this.commandQuestion ? this.writeQuestionFile(theQorA, theFolder, this.categories[j]) : this.writeActionFile(theQorA, theFolder, this.categories[j]);
totalQuestionOrActionCount++;
}
}
} else {
console.warn(`Couldn't read any file at ${this.questionsOrActionsFolder} `);
}
}
theContent = "";
theContent = theContent.concat(AppSettings.FOOTER_EMBED);
this.createFile("/Footer.md", theContent);
new import_obsidian.Notice(`${cat} questions/actions created/updated`);
}
hasAssignedValue(theValue) {
let itHas = false;
if (theValue == null) {
;
} else if (theValue == void 0) {
;
} else if (theValue.contains("true")) {
itHas = true;
}
return itHas;
}
getTags(tags) {
let theTags = "";
if (tags == null) {
;
} else if (tags == void 0) {
;
} else if (tags == "") {
;
} else {
try {
const theTagsArray = tags.split(",");
theTags = AppSettings.TAGS_SPECIFIER.concat(" [");
for (let i = 0; i < theTagsArray.length; i++) {
if (i != 0) {
theTags = theTags.concat(",");
}
theTags = theTags.concat(theTagsArray[i]);
}
theTags = theTags.concat("]");
} catch (e) {
console.error(`Uncaught exception getting tags: ${e}`);
}
}
return theTags;
}
getDeadline(deadline) {
let theDeadline = "";
if (deadline == null) {
;
} else if (deadline == void 0) {
;
} else if (deadline == "") {
;
} else {
try {
theDeadline = AppSettings.DEADLINE_SPECIFIER.concat(" ").concat(deadline.replace(/\s/g, ""));
} catch (e) {
console.error(`Uncaught exception in getDeadline: ${e}`);
}
}
return theDeadline;
}
formatHashtags(theQuestion) {
let theTags = "";
if (theQuestion.tags.length > 0) {
const tagsArray = theQuestion.tags.replace(/,/g, " ").split(" ");
let tags = "";
for (let i = 0; i < tagsArray.length; i++) {
tags = tags.concat("#").concat(tagsArray[i]).concat(" ");
}
theTags = theTags.concat(tags);
}
return theTags;
}
async writeQuestionFile(theQuestion, theFolder, category, contact) {
const hasAnAlias = this.hasAssignedValue(theQuestion.alias);
let deadline = this.getDeadline(theQuestion.deadline);
if (deadline != "") {
deadline = "\n".concat(deadline);
}
let tags = this.getTags(theQuestion.tags);
if (tags != "") {
tags = "\n".concat(tags);
}
let theFileFrontMatter = "";
if (hasAnAlias) {
theFileFrontMatter = `---
publish: true
sent: false
alias: ${theQuestion.alias}
category: ${category}${tags}
---
`.concat(AppSettings.INSTRUCTIONS_FAQ_DETAILED);
} else {
theFileFrontMatter = `---
publish: true
sent: false
category: ${category}${tags}
---
`.concat(AppSettings.INSTRUCTIONS_FAQ_DETAILED);
}
const theQuestionFile = theQuestion.body.split(AppSettings.EMAIL_NL, 2);
let theQuestionFileName = "";
if (theQuestion.qshort != void 0 && theQuestion.qshort.length > 0) {
theQuestionFileName = theQuestion.qshort.trimStart().trimEnd();
} else {
theQuestionFileName = theQuestionFile[0];
}
const indexBodyStart = theQuestion.body.indexOf(AppSettings.EMAIL_NL) + AppSettings.EMAIL_NL.length;
const theQuestionBody = theQuestion.body.substring(indexBodyStart);
if (indexBodyStart != void 0) {
let theBody = "";
let theFileName = "";
if (contact) {
theBody = `${AppSettings.FAO} ${contact.title} ${contact.firstName} ${contact.lastName}` + AppSettings.EMAIL_NL + `${theQuestionBody}`;
theFileName = theFolder.concat("/").concat(contact.firstName + contact.lastName + "-" + theQuestionFileName + ".md");
} else {
theBody = `${AppSettings.FAO}` + AppSettings.EMAIL_NL + `${theQuestionBody}`;
theFileName = theFolder.concat("/").concat(theQuestionFileName) + ".md";
}
let theFile = await this.createFile(theFileName, theFileFrontMatter);
if (theFile instanceof import_obsidian.TFile) {
let theContent = "";
let re = /"/g;
const lineStart = AppSettings.EMAIL_NL.concat(AppSettings.EMAIL_SOL);
theBody = theBody.concat(lineStart);
theBody = theBody.replace(re, "%22");
re = /`/g;
theBody = theBody.replace(re, "%60");
re = /---(\n|.)*?---/g;
theBody = theBody.replace(re, "");
re = /\[/g;
theBody = theBody.replace(re, "");
if (contact) {
theContent = "```email\n".concat(`to: ${contact.emailAddress}
subject: ${AppSettings.SUBJECT_GOES_HERE}
`);
} else {
theContent = "```email\n".concat(`to: someone@example.com
subject: ${AppSettings.SUBJECT_GOES_HERE}
`);
}
theContent = theContent.concat(`body: "${theBody}"
`).concat("```\n");
if (theQuestion.mentioned.length > 0) {
theContent = theContent.concat(AppSettings.MENTIONED_SPECIFIER).concat(theQuestion.mentioned).concat(`
`);
}
theContent = theContent.concat("> [!NOTE] Note\n>Please see [[Pertinent Contacts|Contacts]] for political representatives and other ideas for who to send information\n## Share It\nCopy and paste the information above and/or images/videos below and share via your social media accounts.");
theContent = theContent.concat(AppSettings.RESEARCH_MEDIA_HEADING);
theContent = theContent.concat(AppSettings.IMAGE_MEDIA_HEADING);
if (theQuestion.image.length > 0) {
theContent = theContent.concat(AppSettings.EMAIL_NL).concat(theQuestion.image);
}
theContent = theContent.concat(AppSettings.VIDEO_HEADING);
if (theQuestion.video.length > 0) {
theContent = theContent.concat(theQuestion.video);
}
theContent = theContent.concat(AppSettings.EMAIL_NL).concat(AppSettings.FOOTER_SPECIFIER);
try {
await this.app.vault.append(theFile, theContent);
} catch (e) {
console.error(`Could not append to file: ${theFileName} due to ${e}`);
}
} else {
console.error(`Error - could not create file for ${theFileName}`);
}
}
}
async writeActionFile(theAction, theFolder, category, contact) {
const hasAnAlias = this.hasAssignedValue(theAction.alias);
let deadline = this.getDeadline(theAction.deadline);
if (deadline != "") {
deadline = "\n".concat(deadline);
}
let tags = this.getTags(theAction.tags);
if (tags != "") {
tags = "\n".concat(tags);
}
let theFileFrontMatter = "";
if (hasAnAlias) {
theFileFrontMatter = `---
publish: true
sent: false
alias: ${theAction.alias}
category: ${category}
action: true
${deadline}${tags}
---
`.concat(AppSettings.INSTRUCTIONS_FAQ);
} else {
theFileFrontMatter = `---
publish: true
sent: false
category: ${category}
action: true
${deadline}${tags}
---
`.concat(AppSettings.INSTRUCTIONS_FAQ);
}
const theActionFile = theAction.body.split(AppSettings.EMAIL_NL, 2);
let theActionFileName = "";
if (theAction.qshort != void 0 && theAction.qshort.length > 0) {
theActionFileName = theAction.qshort.trimStart().trimEnd();
} else {
theActionFileName = theActionFile[0];
}
const indexBodyStart = theAction.body.indexOf(AppSettings.EMAIL_NL) + AppSettings.EMAIL_NL.length;
const theQuestionBody = theAction.body.substring(indexBodyStart);
if (indexBodyStart != void 0) {
let theBody = "";
let theFileName = "";
theBody = theQuestionBody;
theFileName = theFolder.concat("/").concat(theActionFileName) + ".md";
let theFile = await this.createFile(theFileName, theFileFrontMatter);
if (theFile instanceof import_obsidian.TFile) {
let theContent = "";
let re = /"/g;
const lineStart = AppSettings.EMAIL_NL.concat(AppSettings.EMAIL_SOL);
theBody = theBody.concat(lineStart);
re = /---(\n|.)*?---/g;
theBody = theBody.replace(re, "");
theContent = theContent.concat(theBody + "\n");
if (theAction.mentioned.length > 0) {
theContent = theContent.concat(AppSettings.MENTIONED_SPECIFIER).concat(theAction.mentioned).concat(`
`);
}
theContent = theContent.concat("> [!NOTE] " + AppSettings.PERTINENT_CONTACTS_REFERENCE);
theContent = theContent.concat(AppSettings.RESEARCH_MEDIA_HEADING);
theContent = theContent.concat(AppSettings.IMAGE_MEDIA_HEADING);
if (theAction.image.length > 0) {
theContent = theContent.concat(AppSettings.EMAIL_NL).concat(theAction.image);
}
theContent = theContent.concat(AppSettings.VIDEO_HEADING);
if (theAction.video.length > 0) {
theContent = theContent.concat(theAction.video);
}
theContent = theContent.concat(AppSettings.EMAIL_NL).concat(AppSettings.FOOTER_SPECIFIER);
try {
await this.app.vault.append(theFile, theContent);
} catch (e) {
console.error(`Could not append to file: ${theFileName} due to ${e}`);
}
} else {
console.error(`Error - could not create file for ${theFileName}`);
}
}
}
// function constructTweet(str: string): string | null {
// const regex = /\/([^\/]*)\//;
// const match = str.match(regex);
// return match ? match[1] : null;
// }
async createFile(theFilePath, content) {
try {
if (!fileExists(theFilePath, this.app)) {
let createdFile = await this.app.vault.create(theFilePath, content);
console.debug(`DEBUG:Created File ${theFilePath}`);
return createdFile;
}
} catch (e) {
console.error(`createFile: filePath: $theFilePath, error: ${e}`);
}
return null;
}
async createFolder(theFolder) {
try {
if (!folderExists(theFolder, this.app)) {
await this.app.vault.createFolder(theFolder);
}
} catch (e) {
console.error(e);
}
}
// getCategoryQuestions adds the file name as the first line/element in the return string
async getCategoryQuestionsOrActions(category) {
try {
const folderOrFile = this.app.vault.getAbstractFileByPath(this.questionsOrActionsFolder.concat(AppSettings.MAC_FOLDER_SEPARATOR.concat(category)));
if (folderOrFile instanceof import_obsidian.TFolder) {
const theQuestions = [];
for (let child of folderOrFile.children) {
if (child instanceof import_obsidian.TFile) {
if (child.extension.endsWith("md")) {
let theQuestionLines = await this.app.vault.cachedRead(child);
const index = child.path.lastIndexOf(AppSettings.MAC_FOLDER_SEPARATOR);
if (index != void 0) {
let theFileFullPath = child.path + "\n";
const theQuestion = { body: "", image: "", video: "", tags: "", action: "", deadline: "", alias: "", qshort: "", mentioned: "" };
theQuestion.body = theFileFullPath.substring(index + 1, theFileFullPath.length - 4);
const questionLines = theQuestionLines.split("\n");
const lineStart = AppSettings.EMAIL_NL.concat(AppSettings.EMAIL_SOL);
for (let i = 0; i < questionLines.length; i++) {
if (questionLines[i].contains(AppSettings.IMAGE_SPECIFIER)) {
theQuestion.image = questionLines[i].split(AppSettings.IMAGE_SPECIFIER)[1];
} else if (questionLines[i].contains(AppSettings.VIDEO_SPECIFIER)) {
theQuestion.video = questionLines[i].split(AppSettings.VIDEO_SPECIFIER)[1];
} else if (questionLines[i].contains(AppSettings.TAGS_SPECIFIER)) {
theQuestion.tags = questionLines[i].split(AppSettings.TAGS_SPECIFIER)[1];
} else if (questionLines[i].contains(AppSettings.CAMPAIGN_SPECIFIER)) {
theQuestion.action = questionLines[i].split(AppSettings.CAMPAIGN_SPECIFIER)[1];
} else if (questionLines[i].contains(AppSettings.DEADLINE_SPECIFIER)) {
theQuestion.deadline = questionLines[i].split(AppSettings.DEADLINE_SPECIFIER)[1];
} else if (questionLines[i].contains(AppSettings.ALIAS_SPECIFIER)) {
theQuestion.alias = questionLines[i].split(AppSettings.ALIAS_SPECIFIER)[1];
} else if (questionLines[i].contains(AppSettings.QSHORT_SPECIFIER)) {
theQuestion.qshort = questionLines[i].split(AppSettings.QSHORT_SPECIFIER)[1];
} else if (questionLines[i].contains(AppSettings.MENTIONED_SPECIFIER)) {
theQuestion.mentioned = questionLines[i].split(AppSettings.MENTIONED_SPECIFIER)[1];
} else if (questionLines[i].contains(AppSettings.FOOTER_SPECIFIER)) {
;
} else {
theQuestion.body += lineStart.concat(questionLines[i]);
}
}
theQuestions.unshift(theQuestion);
}
}
}
}
return theQuestions;
} else {
console.warn(`Expected folder in getCategoryQuestions param but sent ${this.questionsOrActionsFolder.concat(category)}`);
return null;
}
} catch (e) {
console.error(e);
}
return null;
}
onClose() {
const { contentEl } = this;
contentEl.empty();
}
};
var PertinentSettingTab = class extends import_obsidian.PluginSettingTab {
constructor(app, plugin) {
super(app, plugin);
this.plugin = plugin;
}
display() {
const { containerEl } = this;
containerEl.empty();
containerEl.createEl("h2", { text: "General Settings" });
new import_obsidian.Setting(containerEl).setName("Questions Input Folder").setDesc("Enter the Folder Location").addText((text) => text.setPlaceholder("Enter Questions Input Folder").setValue(this.plugin.settings.questionsFolder).onChange(async (value) => {
console.debug("Questions Location: " + value);
this.plugin.settings.questionsFolder = value;
await this.plugin.saveSettings();
}));
new import_obsidian.Setting(containerEl).setName("Actions Input Folder").setDesc("Enter the Folder Location").addText((text) => text.setPlaceholder("Enter Actions Folder").setValue(this.plugin.settings.actionsFolder).onChange(async (value) => {
console.debug("Actions Location: " + value);
this.plugin.settings.actionsFolder = value;
await this.plugin.saveSettings();
}));
new import_obsidian.Setting(containerEl).setName("Questions Output Folder").setDesc("Enter the Pertinent Questions Output Folder Location").addText((text) => text.setPlaceholder("Enter Pertinent Questions Output Folder").setValue(this.plugin.settings.questionsOutputFolder).onChange(async (value) => {
console.debug("Output Folder Location: " + value);
this.plugin.settings.questionsOutputFolder = value;
await this.plugin.saveSettings();
}));
new import_obsidian.Setting(containerEl).setName("Actions Output Folder").setDesc("Enter the Pertinent Actions Output Folder Location").addText((text) => text.setPlaceholder("Enter Pertinent Actions Output Folder").setValue(this.plugin.settings.actionsOutputFolder).onChange(async (value) => {
console.debug("Output Folder Location: " + value);
this.plugin.settings.actionsOutputFolder = value;
await this.plugin.saveSettings();
}));
new import_obsidian.Setting(containerEl).setName(AppSettings.CONTACTS_IMPORT_FILE).setDesc("Enter the Contacts Import File Location").addText((text) => text.setPlaceholder(AppSettings.CONTACTS_FILE_LOCATION).setValue(this.plugin.settings.contactsFile).onChange(async (value) => {
this.plugin.settings.contactsFile = value;
await this.plugin.saveSettings();
}));
}
};
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibWFpbi50cyIsICJzcmMvQ29uc3RhbnRzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBBcHAsIEVkaXRvciwgTWFya2Rvd25WaWV3LCBNb2RhbCwgU3VnZ2VzdE1vZGFsLCBOb3RpY2UsIFBsdWdpbiwgUGx1Z2luU2V0dGluZ1RhYiwgU2V0dGluZywgVEZpbGUsIFRGb2xkZXIsIFdvcmtzcGFjZUxlYWYsIFZhdWx0IH0gZnJvbSAnb2JzaWRpYW4nO1xuaW1wb3J0IHsgbm9ybWFsaXplUGF0aCB9IGZyb20gXCJvYnNpZGlhblwiO1xuaW1wb3J0IHsgQXBwU2V0dGluZ3MgYXMgQ29uc3RhbnRzIH0gZnJvbSBcInNyYy9Db25zdGFudHNcIjtcblxuLy8gaW1wb3J0IHsgQ1NWVmlldywgVklFV19UWVBFX0NTViB9IGZyb20gXCIuL3ZpZXdcIjtcblxuLy8gUmVtZW1iZXIgdG8gcmVuYW1lIHRoZXNlIGNsYXNzZXMgYW5kIGludGVyZmFjZXMhXG5cbmludGVyZmFjZSBQZXJ0aW5lbnRRdWVzdGlvbnNTZXR0aW5ncyB7XG5cdHF1ZXN0aW9uc0ZvbGRlcjogc3RyaW5nO1xuXHRxdWVzdGlvbnNPdXRwdXRGb2xkZXI6IHN0cmluZztcblx0YWN0aW9uc0ZvbGRlcjogc3RyaW5nO1xuXHRhY3Rpb25zT3V0cHV0Rm9sZGVyOiBzdHJpbmc7XG5cdGNvbnRhY3RzRmlsZTogc3RyaW5nO1xuXG5cbn1cblxudHlwZSBDb250YWN0ID0ge1xuXHR0aXRsZTogc3RyaW5nO1xuXHRmaXJzdE5hbWU6IHN0cmluZztcblx0bGFzdE5hbWU6IHN0cmluZztcblx0ZW1haWxBZGRyZXNzOiBzdHJpbmc7XG59O1xuXG50eXBlIFFvckFJbmZvID0ge1xuXHRib2R5OiBzdHJpbmc7XG5cdGltYWdlOiBzdHJpbmc7XG5cdHZpZGVvOiBzdHJpbmc7XG5cdHRhZ3M6IHN0cmluZztcblx0YWN0aW9uOiBzdHJpbmc7XG5cdGRlYWRsaW5lOiBzdHJpbmc7XG5cdHFzaG9ydDogc3RyaW5nO1xuXHRhbGlhczogc3RyaW5nO1xuXHRtZW50aW9uZWQ6IHN0cmluZztcbn1cblxuXG5cblxuXG5cbmNvbnN0IERFRkFVTFRfU0VUVElOR1M6IFBlcnRpbmVudFF1ZXN0aW9uc1NldHRpbmdzID0ge1xuXHRxdWVzdGlvbnNGb2xkZXI6ICdRdWVzdGlvbnMnLFxuXHRxdWVzdGlvbnNPdXRwdXRGb2xkZXI6ICdQZXJ0aW5lbnQgUXVlc3Rpb25zJyxcblx0YWN0aW9uc0ZvbGRlcjogJ0FjdGlvbnMnLFxuXHRhY3Rpb25zT3V0cHV0Rm9sZGVyOiAnUGVydGluZW50IEFjdGlvbnMnLFxuXHRjb250YWN0c0ZpbGU6ICdjb250YWN0cy5jc3YnXG5cbn1cblxuZnVuY3Rpb24gdW5pcUJ5T2JqZWN0KGFycmF5OiBDb250YWN0W10pOiBDb250YWN0W10ge1xuXHRjb25zdCByZXN1bHQ6IENvbnRhY3RbXSA9IFtdO1xuXHRsZXQgcmVzdWx0cyA9IDA7XG5cdGZvciAoY29uc3QgaXRlbSBvZiBhcnJheSkge1xuXHRcdGxldCBkdXBsaWNhdGUgPSBmYWxzZTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuXHRcdFx0aWYgKHJlc3VsdFtpXS5lbWFpbEFkZHJlc3MgPT0gaXRlbS5lbWFpbEFkZHJlc3MpIHtcblx0XHRcdFx0ZHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdFx0Y29uc29sZS53YXJuKGBEdXBsaWNhdGUgY29udGFjdCBmb3VuZCB3aXRoIGVtYWlsIGFkZHJlc3MgJHtpdGVtLmVtYWlsQWRkcmVzc31gKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0XHRpZiAoKHJlc3VsdFtpXS5maXJzdE5hbWUgPT0gaXRlbS5maXJzdE5hbWUpICYmIChyZXN1bHRbaV0ubGFzdE5hbWUgPT0gaXRlbS5sYXN0TmFtZSkpIHtcblx0XHRcdFx0ZHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdFx0Y29uc29sZS53YXJuKGBEdXBsaWNhdGUgY29udGFjdCBmb3VuZCB3aXRoIGZpcnN0IGFuZCBsYXN0IG5hbWUgJHtpdGVtLmZpcnN0TmFtZX0gJHtpdGVtLmxhc3ROYW1lfWApO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdH1cblx0XHR9XG5cdFx0aWYgKCFkdXBsaWNhdGUpIHtcblx0XHRcdHJlc3VsdC5wdXNoKGl0ZW0pO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiByZXN1bHQ7XG59XG5jb25zdCB2YWxpZGF0ZUVtYWlsID0gKGVtYWlsOiBzdHJpbmcpID0+IHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gZW1haWxcblx0XHRcdC50b0xvd2VyQ2FzZSgpXG5cdFx0XHQubWF0Y2goXG5cdFx0XHRcdC9eKChbXjw+KClbXFxdXFxcXC4sOzpcXHNAXCJdKyhcXC5bXjw+KClbXFxdXFxcXC4sOzpcXHNAXCJdKykqKXwuKFwiLitcIikpQCgoXFxbWzAtOV17MSwzfVxcLlswLTldezEsM31cXC5bMC05XXsxLDN9XFwuWzAtOV17MSwzfVxcXSl8KChbYS16QS1aXFwtMC05XStcXC4pK1thLXpBLVpdezIsfSkpJC9cblx0XHRcdCk7XG5cdH0gY2F0Y2ggKGUpIHtcblx0XHRjb25zb2xlLmVycm9yKGBFUlJPUjogUHJvYmxlbSB2YWxpZGF0aW5nIEVtYWlsIHdpdGggJHtlbWFpbH1gKTtcblx0fVxuXHRyZXR1cm4gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiB2YWxpZENvbnRhY3QoY29udGFjdDogQ29udGFjdCk6IGJvb2xlYW4ge1xuXHRsZXQgY29udGFjdElzVmFsaWQgPSB0cnVlO1xuXHRpZiAoY29udGFjdCA9PSBudWxsIHx8IGNvbnRhY3QgPT0gdW5kZWZpbmVkKSB7XG5cdFx0Y29uc29sZS53YXJuKFwiSW52YWxpZCBjb250YWN0IC0gbnVsbCBvciB1bmRlZmluZWRcIik7XG5cdFx0Y29udGFjdElzVmFsaWQgPSBmYWxzZTtcblx0fSBlbHNlIGlmICghdmFsaWRhdGVFbWFpbChjb250YWN0LmVtYWlsQWRkcmVzcykpIHtcblx0XHRjb25zb2xlLndhcm4oYEludmFsaWQgY29udGFjdCAtIGJhZCBlbWFpbDogJHtjb250YWN0LmVtYWlsQWRkcmVzc31gKTtcblx0XHRjb250YWN0SXNWYWxpZCA9IGZhbHNlO1xuXHR9IGVsc2UgaWYgKGNvbnRhY3QuZmlyc3ROYW1lLmxlbmd0aCA9PSAwKSB7XG5cdFx0Y29uc29sZS53YXJuKGBJbnZhbGlkIGNvbnRhY3QgLSBubyBmaXJzdG5hbWUgcHJvdmlkZWRgKTtcblx0XHRjb250YWN0SXNWYWxpZCA9IGZhbHNlO1xuXHR9IGVsc2UgaWYgKGNvbnRhY3QubGFzdE5hbWUubGVuZ3RoID09IDApIHtcblx0XHRjb25zb2xlLndhcm4oYEludmFsaWQgY29udGFjdCAtIG5vIGxhc3RuYW1lIHByb3ZpZGVkYCk7XG5cdFx0Y29udGFjdElzVmFsaWQgPSBmYWxzZTtcblx0fVxuXG5cdHJldHVybiBjb250YWN0SXNWYWxpZDtcbn1cblxuZnVuY3Rpb24gZmlsZUV4aXN0cyhmaWxlUGF0aDogc3RyaW5nLCBhcHA6IEFwcCk6IGJvb2xlYW4ge1xuXHRjb25zdCBmb2xkZXJPckZpbGUgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGZpbGVQYXRoKTtcblx0aWYgKGZvbGRlck9yRmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblx0cmV0dXJuIGZhbHNlO1xuXG59XG5cbmZ1bmN0aW9uIGZvbGRlckV4aXN0cyhmaWxlUGF0aDogc3RyaW5nLCBhcHA6IEFwcCk6IGJvb2xlYW4ge1xuXHRjb25zdCBmb2xkZXJPckZpbGUgPSBhcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKGZpbGVQYXRoKTtcblxuXHRpZiAoZm9sZGVyT3JGaWxlIGluc3RhbmNlb2YgVEZvbGRlcikge1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cdHJldHVybiBmYWxzZTtcblxufVxuXG5cblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUGVydGluZW50UXVlc3Rpb25zIGV4dGVuZHMgUGx1Z2luIHtcblx0c2V0dGluZ3M6IFBlcnRpbmVudFF1ZXN0aW9uc1NldHRpbmdzO1xuXG5cblxuXHRhc3luYyBvbmxvYWQoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0YXdhaXQgdGhpcy5sb2FkU2V0dGluZ3MoKTtcblxuXHRcdC8vIEFkZCBjb21tYW5kIHRvIGxhdW5jaCBBc2sgUGVydGluZW50IFF1ZXN0aW9uc1xuXHRcdHRoaXMuYWRkQ29tbWFuZCh7XG5cdFx0XHRpZDogJ2NyZWF0ZS1wZXJ0aW5lbnQtcXVlc3Rpb25zJyxcblx0XHRcdG5hbWU6IENvbnN0YW50cy5DUkVBVEVfUEVSVElORU5UX1FVRVNUSU9OUyxcblx0XHRcdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdGNvbnNvbGUuZGVidWcoYEFkZGluZyBDUkVBVEUgUGVydGluZW50IFF1ZXN0aW9uc2ApO1xuXHRcdFx0XHRjb25zdCBxdWVzdGlvbkNhdGVnb3JpZXM6IHN0cmluZ1tdID0gW107XG5cblx0XHRcdFx0dGhpcy5maW5kQWxsQ2F0ZWdvcmllc09yQWN0aW9ucyh0cnVlKS5mb3JFYWNoKGNhdCA9PiB7XG5cdFx0XHRcdFx0cXVlc3Rpb25DYXRlZ29yaWVzLnVuc2hpZnQoY2F0KTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0Y29uc3QgY29udGFjdHM6IENvbnRhY3RbXSA9IGF3YWl0IHRoaXMuZ2V0QWxsQ29udGFjdHModGhpcy5zZXR0aW5ncy5jb250YWN0c0ZpbGUpO1xuXG5cdFx0XHRcdGNvbnN0IHN1Z2dlc3RNb2RhbCA9IG5ldyBQZXJ0aW5lbnRTdWdnZXN0TW9kYWwodGhpcy5hcHAsIHRydWUsIHF1ZXN0aW9uQ2F0ZWdvcmllcywgY29udGFjdHMsIHRoaXMuc2V0dGluZ3MucXVlc3Rpb25zT3V0cHV0Rm9sZGVyLCB0aGlzLnNldHRpbmdzLnF1ZXN0aW9uc0ZvbGRlcikub3BlbigpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXG5cblx0XHR0aGlzLmFkZENvbW1hbmQoe1xuXHRcdFx0aWQ6ICdjcmVhdGUtcGVydGluZW50LWFjdGlvbnMnLFxuXHRcdFx0bmFtZTogQ29uc3RhbnRzLkNSRUFURV9QRVJUSU5FTlRfQUNUSU9OUyxcblx0XHRcdGNhbGxiYWNrOiBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdGNvbnNvbGUuZGVidWcoYEFkZGluZyBDUkVBVEUgUGVydGluZW50IEFjdGluc2ApO1xuXHRcdFx0XHRjb25zdCBhY3Rpb25DYXRlZ29yaWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdFx0XHR0aGlzLmZpbmRBbGxDYXRlZ29yaWVzT3JBY3Rpb25zKGZhbHNlKS5mb3JFYWNoKGNhdCA9PiB7XG5cdFx0XHRcdFx0YWN0aW9uQ2F0ZWdvcmllcy51bnNoaWZ0KGNhdCk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdGNvbnN0IGNvbnRhY3RzOiBDb250YWN0W10gPSBbXTtcblx0XHRcdFx0Y29uc3Qgc3VnZ2VzdE1vZGFsID0gbmV3IFBlcnRpbmVudFN1Z2dlc3RNb2RhbCh0aGlzLmFwcCwgZmFsc2UsIGFjdGlvbkNhdGVnb3JpZXMsIGNvbnRhY3RzLCB0aGlzLnNldHRpbmdzLmFjdGlvbnNPdXRwdXRGb2xkZXIsIHRoaXMuc2V0dGluZ3MuYWN0aW9uc0ZvbGRlcikub3BlbigpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHRcdC8vIFRoaXMgYWRkcyBhIHNldHRpbmdzIHRhYiBzbyB0aGUgdXNlciBjYW4gY29uZmlndXJlIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgcGx1Z2luXG5cdFx0dGhpcy5hZGRTZXR0aW5nVGFiKG5ldyBQZXJ0aW5lbnRTZXR0aW5nVGFiKHRoaXMuYXBwLCB0aGlzKSk7XG5cdH1cblxuXG5cblx0YXN5bmMgZ2V0QWxsQ29udGFjdHModGhlQ29udGFjdEZpbGU6IHN0cmluZyk6IFByb21pc2U8Q29udGFjdFtdPiB7XG5cdFx0Y29uc3QgY29udGFjdHM6IENvbnRhY3RbXSA9IFtdO1xuXG5cdFx0Y29uc3QgZm9sZGVyT3JGaWxlID0gdGhpcy5hcHAudmF1bHQuZ2V0QWJzdHJhY3RGaWxlQnlQYXRoKHRoZUNvbnRhY3RGaWxlKTtcblxuXHRcdGlmIChmb2xkZXJPckZpbGUgaW5zdGFuY2VvZiBURmlsZSkge1xuXHRcdFx0bGV0IGZpbGVDb250ZW50czogc3RyaW5nID0gYXdhaXQgdGhpcy5hcHAudmF1bHQuY2FjaGVkUmVhZChmb2xkZXJPckZpbGUpO1xuXHRcdFx0Y29uc3QgZmlsZUxpbmVzID0gZmlsZUNvbnRlbnRzLnNwbGl0KFwiXFxuXCIpO1xuXHRcdFx0Zm9yIChsZXQgaiA9IDA7IGogPCBmaWxlTGluZXMubGVuZ3RoIC0gMTsgaisrKSB7XG5cblx0XHRcdFx0Y29uc3QgW3RpdGxlLCBmaXJzdE5hbWUsIGxhc3ROYW1lLCBlbWFpbEFkZHJlc3NdID0gZmlsZUxpbmVzW2pdLnNwbGl0KFwiLFwiKTtcblx0XHRcdFx0Y29uc3QgY29udGFjdDogQ29udGFjdCA9IHsgdGl0bGUsIGZpcnN0TmFtZSwgbGFzdE5hbWUsIGVtYWlsQWRkcmVzcyB9O1xuXHRcdFx0XHRpZiAoY29udGFjdCAhPSBudWxsKVxuXHRcdFx0XHRcdGNvbnNvbGUuZGVidWcoYGNvbnRhY3QgPSAke2NvbnRhY3QudGl0bGV9IGFuZCAke2NvbnRhY3QuZmlyc3ROYW1lfSBhbmQgJHtjb250YWN0Lmxhc3ROYW1lfSBhbmQgJHtjb250YWN0LmVtYWlsQWRkcmVzc31gKTtcblx0XHRcdFx0aWYgKHZhbGlkQ29udGFjdChjb250YWN0KSkge1xuXHRcdFx0XHRcdGNvbnRhY3RzLnVuc2hpZnQoY29udGFjdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKGBJbnZhbGlkIGNvbnRhY3QgZm91bmQgLSBjb250YWN0ID0gJHtjb250YWN0fWApO1xuXHRcdFx0XHR9XG5cblx0XHRcdH1cblx0XHRcdHJldHVybiB1bmlxQnlPYmplY3QoY29udGFjdHMpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjb250YWN0cztcblx0fVxuXG5cdGZpbmRBbGxDYXRlZ29yaWVzT3JBY3Rpb25zKGNvbW1hbmRRdWVzdGlvbjogYm9vbGVhbik6IHN0cmluZ1tdIHtcblx0XHQvLyAgY29uc3QgZmlsZXMgPSB0aGlzLmFwcC52YXVsdC5nZXRNYXJrZG93bkZpbGVzKCk7XG5cdFx0Y29uc3QgY2F0ZWdvcmllczogc3RyaW5nW10gPSBbXTtcblxuXHRcdGZ1bmN0aW9uIGV4dHJhY3RTZWNvbmRMZXZlbEZvbGRlcihzdHI6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuXHRcdFx0Y29uc3QgcmVnZXggPSAvXFwvKFteXFwvXSopXFwvLztcblx0XHRcdGNvbnN0IG1hdGNoID0gc3RyLm1hdGNoKHJlZ2V4KTtcblxuXHRcdFx0cmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiBudWxsO1xuXHRcdH1cblxuXHRcdGNvbnN0IGZvbGRlck9yRmlsZSA9IGNvbW1hbmRRdWVzdGlvbiA/IHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aCh0aGlzLnNldHRpbmdzLnF1ZXN0aW9uc0ZvbGRlcikgOiB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgodGhpcy5zZXR0aW5ncy5hY3Rpb25zRm9sZGVyKTtcblx0XHRsZXQgbnVtRm9sZGVycyA9IDA7XG5cblxuXHRcdGlmIChmb2xkZXJPckZpbGUgaW5zdGFuY2VvZiBURm9sZGVyKSB7XG5cdFx0XHRmb3IgKGxldCBjaGlsZCBvZiBmb2xkZXJPckZpbGUuY2hpbGRyZW4pIHtcblx0XHRcdFx0aWYgKGNoaWxkIGluc3RhbmNlb2YgVEZpbGUpIHtcblx0XHRcdFx0XHQvLyBUb3AgbGV2ZWwgUXVlc3Rpb25zIGNhdGVnb3J5IGZpbGVcblx0XHRcdFx0fSBlbHNlIHsgLy8gQ2F0ZWdvcnkgRm9sZGVyXG5cdFx0XHRcdFx0Y29uc3QgY2F0ZWdvcnlGb2xkZXIgPSB0aGlzLmFwcC52YXVsdC5nZXRBYnN0cmFjdEZpbGVCeVBhdGgoY2hpbGQucGF0aClcblx0XHRcdFx0XHRpZiAoY2F0ZWdvcnlGb2xkZXIgaW5zdGFuY2VvZiBURm9sZGVyKSB7XG5cdFx0XHRcdFx0XHRmb3IgKGxldCBpbm5lckNoaWxkIG9mIGNhdGVnb3J5Rm9sZGVyLmNoaWxkcmVuKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChpbm5lckNoaWxkIGluc3RhbmNlb2YgVEZpbGUpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zdCBzdWJzdHJpbmcgPSBleHRyYWN0U2Vjb25kTGV2ZWxGb2xkZXIoaW5uZXJDaGlsZC5wYXRoKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoc3Vic3RyaW5nICE9IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUuZGVidWcoYERFQlVHOiBzdWJzdHJpbmcgPSAke3N1YnN0cmluZ31gKTtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICghY2F0ZWdvcmllcy5jb250YWlucyhzdWJzdHJpbmcpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdGNhdGVnb3JpZXMudW5zaGlmdChzdWJzdHJpbmcpO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUud2FybihgQ291bGRuJ3QgZXh0cmFjdCBmb2xkZXIgc3Vic3RyaW5nIGZyb20gJHtpbm5lckNoaWxkLnBhdGh9YCk7XG5cdFx0XHRcdFx0XHRcdFx0fSAvLyBlbmRpZiBzdWJzdHJpbmdcblx0XHRcdFx0XHRcdFx0fSAvLyBlbmRpZiBpbm5lcmNISUxEXG5cdFx0XHRcdFx0XHR9IC8vZW5kZm9yIGlubmVyY2hpbGRcblx0XHRcdFx0XHR9IC8vZW5kaWYgaW5zdGFuY2VvZiBURm9sZGVyXG5cdFx0XHRcdH0gLy9lbmRpZiBpbnN0YW5jZSBvZiBURmlsZVxuXG5cdFx0XHR9Ly9lbmRmb3IgY2hpbGQgb2YgdGZvbGRlclxuXHRcdFx0Y29uc29sZS5kZWJ1ZyhgbnVtRm9sZGVycz0ke251bUZvbGRlcnN9YCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnNvbGUud2FybihgTk9UIEFOIElOU1RBTkNFIE9GIFRGb2xkZXIgaW5zdGVhZCBpdCBpcyAke2ZvbGRlck9yRmlsZX1gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY2F0ZWdvcmllcztcblx0fVxuXG5cblxuXHRvbnVubG9hZCgpIHtcblx0XHRjb25zb2xlLmluZm8oXCJVbmxvYWRpbmcgUGVydGluZW50UXVlc3Rpb25zIHBsdWdpbi4uLlwiKTtcblx0fVxuXG5cblx0YXN5bmMgbG9hZFNldHRpbmdzKCkge1xuXHRcdHRoaXMuc2V0dGluZ3MgPSBPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX1NFVFRJTkdTLCBhd2FpdCB0aGlzLmxvYWREYXRhKCkpO1xuXHR9XG5cblx0YXN5bmMgc2F2ZVNldHRpbmdzKCkge1xuXHRcdGF3YWl0IHRoaXMuc2F2ZURhdGEodGhpcy5zZXR0aW5ncyk7XG5cdH1cbn1cblxuXG5cbmNsYXNzIFBlcnRpbmVudFN1Z2dlc3RNb2RhbCBleHRlbmRzIFN1Z2dlc3RNb2RhbDxzdHJpbmc+IHtcblx0Y2F0ZWdvcmllczogc3RyaW5nW107XG5cdGNvbnRhY3RzOiBDb250YWN0W107XG5cdG91dHB1dEZvbGRlcjogc3RyaW5nO1xuXHRxdWVzdGlvbnNPckFjdGlvbnNGb2xkZXI6IHN0cmluZztcblx0dmF1bHQ6IFZhdWx0O1xuXHRjb21tYW5kUXVlc3Rpb246IGJvb2xlYW47XG5cblxuXHRjb25zdHJ1Y3RvcihhcHA6IEFwcCwgY29tbWFuZFF1ZXN0aW9uOiBib29sZWFuLCBjYXRlZ29yaWVzOiBzdHJpbmdbXSwgY29udGFjdHM6IENvbnRhY3RbXSwgb3V0cHV0Rm9sZGVyOiBzdHJpbmcsIHF1ZXN0aW9uc09yQWN0aW9uc0ZvbGRlcjogc3RyaW5nKSB7XG5cdFx0c3VwZXIoYXBwKTtcblx0XHR0aGlzLnZhdWx0ID0gYXBwLnZhdWx0O1xuXHRcdHRoaXMuY29tbWFuZFF1ZXN0aW9uID0gY29tbWFuZFF1ZXN0aW9uO1xuXHRcdHRoaXMuY2F0ZWdvcmllcyA9IGNhdGVnb3JpZXM7XG5cdFx0dGhpcy5jb250YWN0cyA9IGNvbnRhY3RzO1xuXHRcdHRoaXMub3V0cHV0Rm9sZGVyID0gb3V0cHV0Rm9sZGVyO1xuXHRcdHRoaXMucXVlc3Rpb25zT3JBY3Rpb25zRm9sZGVyID0gcXVlc3Rpb25zT3JBY3Rpb25zRm9sZGVyO1xuXHR9XG5cdC8vIFJldHVybnMgYWxsIGF2YWlsYWJsZSBzdWdnZXN0aW9ucy5cblx0Z2V0U3VnZ2VzdGlvbnMocXVlcnk6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0XHR0aGlzLmNhdGVnb3JpZXMuc29ydCgpOyAvLyBzb3J0IGFuZCBlbnN1cmUgQUxMX0NBVEVHT1JJRVMgaXMgZmlyc3Qgc2VsZWN0aW9uXG5cdFx0aWYgKHRoaXMuY2F0ZWdvcmllc1swXSAhPSBDb25zdGFudHMuQUxMX0NBVEVHT1JJRVMpIHtcblx0XHRcdGNvbnN0IGluZGV4ID0gdGhpcy5jYXRlZ29yaWVzLmluZGV4T2YoQ29uc3RhbnRzLkFMTF9DQVRFR09SSUVTKTtcblx0XHRcdC8vIHRoaXMuY2F0ZWdvcmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuXHRcdFx0dGhpcy5jYXRlZ29yaWVzLnVuc2hpZnQoQ29uc3RhbnRzLkFMTF9DQVRFR09SSUVTKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuY2F0ZWdvcmllcy5maWx0ZXIoKGNhdCkgPT5cblx0XHRcdGNhdC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5LnRvTG93ZXJDYXNlKCkpXG5cdFx0KTtcblx0fVxuXG5cdC8vIFJlbmRlcnMgZWFjaCBzdWdnZXN0aW9uIGl0ZW0uXG5cdHJlbmRlclN1Z2dlc3Rpb24oY2F0OiBzdHJpbmcsIGVsOiBIVE1MRWxlbWVudCkge1xuXHRcdGVsLmNyZWF0ZUVsKFwiZGl2XCIsIHsgdGV4dDogY2F0IH0pO1xuXHRcdC8vICBlbC5jcmVhdGVFbChcInNtYWxsXCIsIHsgdGV4dDogYm9vay5hdXRob3IgfSk7XG5cdH1cblxuXHQvLyBQZXJmb3JtIGFjdGlvbiBvbiB0aGUgc2VsZWN0ZWQgc3VnZ2VzdGlvbi5cblx0YXN5bmMgb25DaG9vc2VTdWdnZXN0aW9uKGNhdDogc3RyaW5nLCBldnQ6IE1vdXNlRXZlbnQgfCBLZXlib2FyZEV2ZW50KSB7XG5cblx0XHR0aGlzLmNyZWF0ZUZvbGRlcih0aGlzLm91dHB1dEZvbGRlcik7IC8vIFBlcnRpbmVudCBRdWVzdGlvbnMgb3IgQWN0aW9ucyBmb2xkZXJcblx0XHRsZXQgdGhlQ29udGVudCA9IENvbnN0YW50cy5DT05UQUNUU19IRUFERVI7XG5cblx0XHR0aGVDb250ZW50ID0gdGhlQ29udGVudC5jb25jYXQoQ29uc3RhbnRzLldFRl9DT01QQU5JRVMpO1xuXHRcdHRoZUNvbnRlbnQgPSB0aGVDb250ZW50LmNvbmNhdChDb25zdGFudHMuQVVTVFJBTElBX1BPTElUSUNBTF9DT05UQUNUUyk7XG5cdFx0dGhlQ29udGVudCA9IHRoZUNvbnRlbnQuY29uY2F0KENvbnN0YW50cy5DQU5BREFfUE9MSVRJQ0FMX0NPTlRBQ1RTKTtcblx0XHR0aGVDb250ZW50ID0gdGhlQ29udGVudC5jb25jYXQoQ29uc3RhbnRzLkVVX1BPTElUSUNBTF9DT05UQUNUUyk7XG5cdFx0dGhlQ29udGVudCA9IHRoZUNvbnRlbnQuY29uY2F0KENvbnN0YW50cy5GSU5MQU5EX1BPTElUSUNBTF9DT05UQUNUUyk7XG5cdFx0dGhlQ29udGVudCA9IHRoZUNvbnRlbnQuY29uY2F0KENvbnN0YW50cy5HRVJNQU5ZX1BPTElUSUNBTF9DT05UQUNUUyk7XG5cdFx0dGhlQ29udGVudCA9IHRoZUNvbnRlbnQuY29uY2F0KENvbnN0YW50cy5JUkVMQU5EX1BPTElUSUNBTF9DT05UQUNUUyk7XG5cdFx0dGhlQ29udGVudCA9IHRoZUNvbnRlbnQuY29uY2F0KENvbnN0YW50cy5ORVRIRVJMQU5EU19QT0xJVElDQUxfQ09OVEFDVFMpO1xuXHRcdHRoZUNvbnRlbnQgPSB0aGVDb250ZW50LmNvbmNhdChDb25zdGFudHMuTkVXX1pFQUxBTkRfUE9MSVRJQ0FMX0NPTlRBQ1RTKTtcblx0XHR0aGVDb250ZW50ID0gdGhlQ29udGVudC5jb25jYXQoQ29uc3RhbnRzLk5PUldBWV9QT0xJVElDQUxfQ09OVEFDVFMpO1xuXHRcdHRoZUNvbnRlbnQgPSB0aGVDb250ZW50LmNvbmNhdChDb25zdGFudHMuU1dFREVOX1BPTElUSUNBTF9DT05UQUNUUyk7XG5cdFx0dGhlQ29udGVudCA9IHRoZUNvbnRlbnQuY29uY2F0KENvbnN0YW50cy5TV0lUWkVSTEFORF9QT0xJVElDQUxfQ09OVEFDVFMpO1xuXHRcdHRoZUNvbnRlbnQgPSB0aGVDb250ZW50LmNvbmNhdChDb25zdGFudHMuVUtfUE9MSVRJQ0FMX0NPTlRBQ1RTKTtcblx0XHR0aGVDb250ZW50ID0gdGhlQ29udGVudC5jb25jYXQoQ29uc3RhbnRzLlVTX1BPTElUSUNBTF9DT05UQUNUUyk7XG5cblxuXHRcdHRoaXMuY3JlYXRlRmlsZShDb25zdGFudHMuUEVSVElORU5UX0NPTlRBQ1RTX0ZJTEUsIHRoZUNvbnRlbnQpO1xuXG5cblx0XHRpZiAoY2F0ICE9IENvbnN0YW50cy5BTExfQ0FURUdPUklFUykge1xuXHRcdFx0dGhpcy5jYXRlZ29yaWVzID0gW2NhdF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuY2F0ZWdvcmllcy5zaGlmdCgpOyAvLyByZW1vdmUgQUxMX0NBVEVHT1JJRVMgYW5kIGl0ZXJhdGUgdGhyb3VnaCBBTEwgY2F0ZWdvcmllc1xuXHRcdH1cblx0XHQvLyBGT1JFRUFDSCBRdWVzdGlvbiBvciBBY3Rpb24gQ2F0ZWdvcnlcblx0XHRsZXQgdG90YWxRdWVzdGlvbk9yQWN0aW9uQ291bnQgPSAwO1xuXG5cdFx0dGhlQ29udGVudCA9IFwiXCI7XG5cdFx0Zm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmNhdGVnb3JpZXMubGVuZ3RoOyBqKyspIHtcblx0XHRcdGxldCBjYXRlZ29yaWVzQ291bnQgPSAwO1xuXHRcdFx0Y29uc29sZS5kZWJ1ZyhgY2F0ICR7an0gPSAke3RoaXMuY2F0ZWdvcmllc1tqXX1gKTtcblx0XHRcdC8vIEdldCBhbGwgdGhlIHF1ZXN0aW9uc1xuXHRcdFx0bGV0IHRoZVFvckFzID0gYXdhaXQgdGhpcy5nZXRDYXRlZ29yeVF1ZXN0aW9uc09yQWN0aW9ucyh0aGlzLmNhdGVnb3JpZXNbal0pOyAvLyB0aGVRdWVzdGlvbk9yQWN0aW9uc1xuXG5cblx0XHRcdGNvbnN0IHRoZUZvbGRlciA9IHRoaXMub3V0cHV0Rm9sZGVyLmNvbmNhdChDb25zdGFudHMuTUFDX0ZPTERFUl9TRVBBUkFUT1IpLmNvbmNhdCh0aGlzLmNhdGVnb3JpZXNbal0pO1xuXHRcdFx0aWYgKHRoZVFvckFzICE9IG51bGwpIHsgLy8gTm8gY2F0ZWdvcnkgcXVlc3Rpb25zIG9yIGFjdGlvbnM/ICBcblx0XHRcdFx0Ly8gbmVlZCB0aGUgZGlyZWN0b3J5IHNlcGFyYXRvciBcblx0XHRcdFx0dGhpcy5jcmVhdGVGb2xkZXIodGhlRm9sZGVyKTsgLy8gQ3JlYXRlIHRoZSBjYXRlZ29yaWVzXG5cdFx0XHRcdC8vIEZPUkVBQ0ggRW1haWwgQ29udGFjdFxuXHRcdFx0XHRjYXRlZ29yaWVzQ291bnQgPSB0aGVRb3JBcy5sZW5ndGg7XG5cdFx0XHRcdGlmICh0aGlzLmNvbnRhY3RzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29udGFjdHMubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdGZvciAobGV0IGsgPSAwOyBrIDwgdGhlUW9yQXMubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0XHRcdFx0bGV0IHRoZVFvckEgPSB0aGVRb3JBc1trXTtcblx0XHRcdFx0XHRcdFx0dGhpcy5jb21tYW5kUXVlc3Rpb24gPyB0aGlzLndyaXRlUXVlc3Rpb25GaWxlKHRoZVFvckEsIHRoZUZvbGRlciwgdGhpcy5jYXRlZ29yaWVzW2pdLCB0aGlzLmNvbnRhY3RzLmF0KGkpKSA6IHRoaXMud3JpdGVBY3Rpb25GaWxlKHRoZVFvckEsIHRoZUZvbGRlciwgdGhpcy5jYXRlZ29yaWVzW2pdKTtcblx0XHRcdFx0XHRcdFx0dG90YWxRdWVzdGlvbk9yQWN0aW9uQ291bnQrKztcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9IC8vRW5kIEZPUkVBQ0ggY29udGFjdFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGZvciAobGV0IGsgPSAwOyBrIDwgdGhlUW9yQXMubGVuZ3RoOyBrKyspIHtcblx0XHRcdFx0XHRcdGxldCB0aGVRb3JBID0gdGhlUW9yQXNba107XG5cdFx0XHRcdFx0XHR0aGlzLmNvbW1hbmRRdWVzdGlvbiA/IHRoaXMud3JpdGVRdWVzdGlvbkZpbGUodGhlUW9yQSwgdGhlRm9sZGVyLCB0aGlzLmNhdGVnb3JpZXNbal0pIDogdGhpcy53cml0ZUFjdGlvbkZpbGUodGhlUW9yQSwgdGhlRm9sZGVyLCB0aGlzLmNhdGVnb3JpZXNbal0pO1xuXHRcdFx0XHRcdFx0dG90YWxRdWVzdGlvbk9yQWN0aW9uQ291bnQrKztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc29sZS53YXJuKGBDb3VsZG4ndCByZWFkIGFueSBmaWxlIGF0ICR7dGhpcy5xdWVzdGlvbnNPckFjdGlvbnNGb2xkZXJ9IGApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXcml0ZSBpbmRleCBmaWxlcyBmb3IgcXVlc3Rpb25zLCBubyBuZWVkIGZvciBhY3Rpb25zXG5cdFx0XHQvLyBpZiAodGhpcy5jb21tYW5kUXVlc3Rpb24pIHtcblx0XHRcdC8vIFx0Y29uc3QgY2F0ID0gdGhpcy5jYXRlZ29yaWVzW2pdO1xuXHRcdFx0Ly8gXHRjb25zdCB0aGVGaWxlTmFtZSA9IHRoZUZvbGRlci5jb25jYXQoXCIvXCIpLmNvbmNhdChjYXQgKyBDb25zdGFudHMuQ0FUX0lOREVYX1NVRkZJWCk7XG5cdFx0XHQvLyBcdHRoZUNvbnRlbnQgPSBgLS0tXFxucHVibGlzaDogdHJ1ZVxcbnNlbnQ6IGZhbHNlXFxuY2F0ZWdvcnk6ICR7Y2F0fVxcbi0tLVxcbiMjIEluc3RydWN0aW9uc1xcbi0gW0ZBUSBhbmQgSGVscF0oaHR0cHM6Ly9wcm9qZWN0YnViYmxlYnVyc3QuY29tL1BlcnRpbmVudCtRdWVzdGlvbnMrSGVscClcXG5cXG4tIFtTdXBwb3J0IFVzXShodHRwczovL3Byb2plY3RidWJibGVidXJzdC5jb20vU3VwcG9ydCtVcylcXG5cXG4jIyAke2NhdH0gUGVydGluZW50IFF1ZXN0aW9uc1xcbmA7XG5cdFx0XHQvLyBcdGZvciAobGV0IHEgPSAwOyBxIDwgY2F0ZWdvcmllc0NvdW50OyBxKyspIHtcblx0XHRcdC8vIFx0XHRjb25zdCBxUGx1cyA9IHEgKyAxO1xuXHRcdFx0Ly8gXHRcdHRoZUNvbnRlbnQgPSB0aGVDb250ZW50LmNvbmNhdChcIi0gXCIgKyBDb25zdGFudHMuUEJCX1JPT1QuY29uY2F0KGNhdCkgKyBgLSR7cVBsdXN9XFxuYClcblx0XHRcdC8vIFx0fVxuXHRcdFx0Ly8gXHR0aGVDb250ZW50ID0gdGhlQ29udGVudC5jb25jYXQoQ29uc3RhbnRzLkZPT1RFUl9FTUJFRCk7XG5cdFx0XHQvLyBcdHRoZUNvbnRlbnQgPSB0aGVDb250ZW50LmNvbmNhdChDb25zdGFudHMuRU1BSUxfTkwgKyBDb25zdGFudHMuTlVNX1FVRVNUSU9OUyArIGNhdGVnb3JpZXNDb3VudCk7XG5cdFx0XHQvLyBcdC8vIGRlYnVnZ2VyO1xuXHRcdFx0Ly8gXHR0aGlzLmNyZWF0ZUZpbGUodGhlRmlsZU5hbWUsIHRoZUNvbnRlbnQpO1xuXHRcdFx0Ly8gfVxuXG5cdFx0fSAvL0VuZCBGT1JFQUNIIGNhdGVnb3J5XG5cblxuXG5cdFx0dGhlQ29udGVudCA9IFwiXCI7XG5cdFx0dGhlQ29udGVudCA9IHRoZUNvbnRlbnQuY29uY2F0KENvbnN0YW50cy5GT09URVJfRU1CRUQpO1xuLy9cdFx0dGhlQ29udGVudCA9IHRoZUNvbnRlbnQuY29uY2F0KGA8ZGl2IGFsaWduPWNlbnRlcj5gICsgQ29uc3RhbnRzLlRPVEFMX05VTV9RVUVTVElPTlMgKyB0b3RhbFF1ZXN0aW9uT3JBY3Rpb25Db3VudCArIGA8L2Rpdj5gKTtcblx0XHR0aGlzLmNyZWF0ZUZpbGUoXCIvRm9vdGVyLm1kXCIsIHRoZUNvbnRlbnQpO1xuXHRcdG5ldyBOb3RpY2UoYCR7Y2F0fSBxdWVzdGlvbnMvYWN0aW9ucyBjcmVhdGVkL3VwZGF0ZWRgKTtcblxuXG5cdH1cblxuXHRoYXNBc3NpZ25lZFZhbHVlKHRoZVZhbHVlOiBzdHJpbmcpIHtcblx0XHRsZXQgaXRIYXM6IGJvb2xlYW4gPSBmYWxzZTtcblx0XHRpZiAodGhlVmFsdWUgPT0gbnVsbCkge1xuXHRcdFx0O1xuXHRcdH0gZWxzZSBpZiAodGhlVmFsdWUgPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQ7XG5cdFx0fSBlbHNlIGlmICh0aGVWYWx1ZS5jb250YWlucygndHJ1ZScpKSB7XG5cdFx0XHRpdEhhcyA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiBpdEhhcztcblx0fVxuXG5cblx0Z2V0VGFncyh0YWdzOiBzdHJpbmcpIHtcblx0XHRsZXQgdGhlVGFncyA9IFwiXCI7XG5cdFx0aWYgKHRhZ3MgPT0gbnVsbCkge1xuXHRcdFx0O1xuXHRcdH0gZWxzZSBpZiAodGFncyA9PSB1bmRlZmluZWQpIHtcblx0XHRcdDtcblx0XHR9IGVsc2UgaWYgKHRhZ3MgPT0gXCJcIikge1xuXHRcdFx0O1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCB0aGVUYWdzQXJyYXkgPSB0YWdzLnNwbGl0KCcsJyk7XG5cdFx0XHRcdHRoZVRhZ3MgPSBDb25zdGFudHMuVEFHU19TUEVDSUZJRVIuY29uY2F0KFwiIFtcIik7XG5cdFx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGhlVGFnc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0aWYgKGkgIT0gMCkge1xuXHRcdFx0XHRcdFx0dGhlVGFncyA9IHRoZVRhZ3MuY29uY2F0KFwiLFwiKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0dGhlVGFncyA9IHRoZVRhZ3MuY29uY2F0KHRoZVRhZ3NBcnJheVtpXSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhlVGFncyA9IHRoZVRhZ3MuY29uY2F0KFwiXVwiKTtcblx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0Y29uc29sZS5lcnJvcihgVW5jYXVnaHQgZXhjZXB0aW9uIGdldHRpbmcgdGFnczogJHtlfWApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGhlVGFncztcblx0fVxuXHRnZXREZWFkbGluZShkZWFkbGluZTogc3RyaW5nKSB7XG5cdFx0bGV0IHRoZURlYWRsaW5lID0gXCJcIjtcblx0XHRpZiAoZGVhZGxpbmUgPT0gbnVsbCkge1xuXHRcdFx0O1xuXHRcdH0gZWxzZSBpZiAoZGVhZGxpbmUgPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHQ7XG5cdFx0fSBlbHNlIGlmIChkZWFkbGluZSA9PSBcIlwiKSB7XG5cdFx0XHQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHRoZURlYWRsaW5lID0gQ29uc3RhbnRzLkRFQURMSU5FX1NQRUNJRklFUi5jb25jYXQoXCIgXCIpLmNvbmNhdChkZWFkbGluZS5yZXBsYWNlKC9cXHMvZywgXCJcIikpO1xuXHRcdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBVbmNhdWdodCBleGNlcHRpb24gaW4gZ2V0RGVhZGxpbmU6ICR7ZX1gKTtcblx0XHRcdH1cblxuXHRcdH1cblx0XHRyZXR1cm4gdGhlRGVhZGxpbmU7XG5cdH1cblx0Zm9ybWF0SGFzaHRhZ3ModGhlUXVlc3Rpb246IFFvckFJbmZvKTogc3RyaW5nIHtcblx0XHRsZXQgdGhlVGFncyA9IFwiXCI7XG5cdFx0aWYgKHRoZVF1ZXN0aW9uLnRhZ3MubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3QgdGFnc0FycmF5ID0gdGhlUXVlc3Rpb24udGFncy5yZXBsYWNlKC8sL2csICcgJykuc3BsaXQoJyAnKTsgLy8gUmVwbGFjZSBjb21tYXMgd2l0aCBzcGFjZXMgYW5kIHRoZW4gc3BsaXRcblx0XHRcdGxldCB0YWdzID0gXCJcIjtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgdGFnc0FycmF5Lmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHRhZ3MgPSB0YWdzLmNvbmNhdCgnIycpLmNvbmNhdCh0YWdzQXJyYXlbaV0pLmNvbmNhdCgnICcpO1xuXHRcdFx0fVxuXHRcdFx0dGhlVGFncyA9IHRoZVRhZ3MuY29uY2F0KHRhZ3MpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhlVGFncztcblx0fVxuXHRhc3luYyB3cml0ZVF1ZXN0aW9uRmlsZSh0aGVRdWVzdGlvbjogUW9yQUluZm8sIHRoZUZvbGRlcjogc3RyaW5nLCBjYXRlZ29yeTogc3RyaW5nLCBjb250YWN0PzogQ29udGFjdCkge1xuXHRcdGNvbnN0IGhhc0FuQWxpYXMgPSB0aGlzLmhhc0Fzc2lnbmVkVmFsdWUodGhlUXVlc3Rpb24uYWxpYXMpO1xuXG5cdFx0bGV0IGRlYWRsaW5lID0gdGhpcy5nZXREZWFkbGluZSh0aGVRdWVzdGlvbi5kZWFkbGluZSk7XG5cdFx0aWYgKGRlYWRsaW5lICE9IFwiXCIpIHtcblx0XHRcdGRlYWRsaW5lID0gXCJcXG5cIi5jb25jYXQoZGVhZGxpbmUpO1xuXHRcdH1cblxuXHRcdGxldCB0YWdzID0gdGhpcy5nZXRUYWdzKHRoZVF1ZXN0aW9uLnRhZ3MpO1xuXHRcdGlmICh0YWdzICE9IFwiXCIpIHtcblx0XHRcdHRhZ3MgPSBcIlxcblwiLmNvbmNhdCh0YWdzKTtcblx0XHR9XG5cblx0XHRsZXQgdGhlRmlsZUZyb250TWF0dGVyID0gXCJcIjtcblxuXHRcdGlmIChoYXNBbkFsaWFzKSB7XG5cdFx0XHR0aGVGaWxlRnJvbnRNYXR0ZXIgPSBgLS0tXFxucHVibGlzaDogdHJ1ZVxcbnNlbnQ6IGZhbHNlXFxuYWxpYXM6ICR7dGhlUXVlc3Rpb24uYWxpYXN9XFxuY2F0ZWdvcnk6ICR7Y2F0ZWdvcnl9JHt0YWdzfVxcbi0tLVxcbmAuY29uY2F0KENvbnN0YW50cy5JTlNUUlVDVElPTlNfRkFRX0RFVEFJTEVEKTtcblxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGVGaWxlRnJvbnRNYXR0ZXIgPSBgLS0tXFxucHVibGlzaDogdHJ1ZVxcbnNlbnQ6IGZhbHNlXFxuY2F0ZWdvcnk6ICR7Y2F0ZWdvcnl9JHt0YWdzfVxcbi0tLVxcbmAuY29uY2F0KENvbnN0YW50cy5JTlNUUlVDVElPTlNfRkFRX0RFVEFJTEVEKTtcblxuXHRcdH1cblxuXG5cblx0XHRjb25zdCB0aGVRdWVzdGlvbkZpbGU6IHN0cmluZ1tdID0gdGhlUXVlc3Rpb24uYm9keS5zcGxpdChDb25zdGFudHMuRU1BSUxfTkwsIDIpO1xuXHRcdGxldCB0aGVRdWVzdGlvbkZpbGVOYW1lID0gXCJcIjtcblxuXHRcdGlmICh0aGVRdWVzdGlvbi5xc2hvcnQgIT0gdW5kZWZpbmVkICYmIHRoZVF1ZXN0aW9uLnFzaG9ydC5sZW5ndGggPiAwKSB7XG5cdFx0XHR0aGVRdWVzdGlvbkZpbGVOYW1lID0gdGhlUXVlc3Rpb24ucXNob3J0LnRyaW1TdGFydCgpLnRyaW1FbmQoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhlUXVlc3Rpb25GaWxlTmFtZSA9IHRoZVF1ZXN0aW9uRmlsZVswXTtcblx0XHR9XG5cblxuXHRcdGNvbnN0IGluZGV4Qm9keVN0YXJ0ID0gdGhlUXVlc3Rpb24uYm9keS5pbmRleE9mKENvbnN0YW50cy5FTUFJTF9OTCkgKyBDb25zdGFudHMuRU1BSUxfTkwubGVuZ3RoOyAvLyBGaXJzdCBsaW5lIGlzIHRoZSBmaWxlbmFtZVxuXHRcdGNvbnN0IHRoZVF1ZXN0aW9uQm9keSA9IHRoZVF1ZXN0aW9uLmJvZHkuc3Vic3RyaW5nKGluZGV4Qm9keVN0YXJ0KTtcblxuXHRcdGlmIChpbmRleEJvZHlTdGFydCAhPSB1bmRlZmluZWQpIHtcblx0XHRcdGxldCB0aGVCb2R5ID0gXCJcIjtcblx0XHRcdGxldCB0aGVGaWxlTmFtZSA9IFwiXCI7XG5cblx0XHRcdGlmIChjb250YWN0KSB7XG5cdFx0XHRcdHRoZUJvZHkgPSBgJHtDb25zdGFudHMuRkFPfSAke2NvbnRhY3QudGl0bGV9ICR7Y29udGFjdC5maXJzdE5hbWV9ICR7Y29udGFjdC5sYXN0TmFtZX1gICsgQ29uc3RhbnRzLkVNQUlMX05MICsgYCR7dGhlUXVlc3Rpb25Cb2R5fWA7XG5cdFx0XHRcdC8vIENyZWF0ZSBQZXJ0aW5lbnQgUXVlc3Rpb25zIEZpbGUgdXNpbmcgRmlyc3QgTmFtZSBhbmQgTGFzdCBOYW1lXG5cdFx0XHRcdHRoZUZpbGVOYW1lID0gdGhlRm9sZGVyLmNvbmNhdChcIi9cIikuY29uY2F0KGNvbnRhY3QuZmlyc3ROYW1lICsgY29udGFjdC5sYXN0TmFtZSArIFwiLVwiICsgdGhlUXVlc3Rpb25GaWxlTmFtZSArIFwiLm1kXCIpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhlQm9keSA9IGAke0NvbnN0YW50cy5GQU99YCArIENvbnN0YW50cy5FTUFJTF9OTCArIGAke3RoZVF1ZXN0aW9uQm9keX1gO1xuXHRcdFx0XHR0aGVGaWxlTmFtZSA9IHRoZUZvbGRlci5jb25jYXQoXCIvXCIpLmNvbmNhdCh0aGVRdWVzdGlvbkZpbGVOYW1lKSArIFwiLm1kXCI7XG5cdFx0XHR9XG5cblxuXHRcdFx0Ly8gRmlsZSBkb2VzIG5vdCBleGlzdCwgc28gY3JlYXRlXG5cdFx0XHRsZXQgdGhlRmlsZSA9IGF3YWl0IHRoaXMuY3JlYXRlRmlsZSh0aGVGaWxlTmFtZSwgdGhlRmlsZUZyb250TWF0dGVyKTtcblxuXG5cdFx0XHRpZiAodGhlRmlsZSBpbnN0YW5jZW9mIFRGaWxlKSB7XG5cdFx0XHRcdGxldCB0aGVDb250ZW50ID0gXCJcIjtcblx0XHRcdFx0bGV0IHJlID0gL1wiL2c7XG5cdFx0XHRcdGNvbnN0IGxpbmVTdGFydCA9IENvbnN0YW50cy5FTUFJTF9OTC5jb25jYXQoQ29uc3RhbnRzLkVNQUlMX1NPTCk7XG5cdFx0XHRcdHRoZUJvZHkgPSB0aGVCb2R5LmNvbmNhdChsaW5lU3RhcnQpO1xuXHQvL1x0XHRcdHRoZUJvZHkgPSB0aGVCb2R5LmNvbmNhdChgTW9yZSBBYm91dCAke2NhdGVnb3J5fTogYCkuY29uY2F0KENvbnN0YW50cy5QQkJfUFFfRElSKS5jb25jYXQoY2F0ZWdvcnkpLmNvbmNhdChgLyR7Y2F0ZWdvcnl9LUluZGV4YCk7XG5cblx0XHRcdFx0dGhlQm9keSA9IHRoZUJvZHkucmVwbGFjZShyZSwgXCIlMjJcIikgLy8gRXNjYXBlIGRvdWJsZSBxdW90ZSBjaGFyc1xuXHRcdFx0XHRyZSA9IC9gL2c7XG5cdFx0XHRcdHRoZUJvZHkgPSB0aGVCb2R5LnJlcGxhY2UocmUsIFwiJTYwXCIpIC8vIEVzY2FwZSBzaW5nbGUgcXVvdGVcblx0XHRcdFx0cmUgPSAvLS0tKFxcbnwuKSo/LS0tL2c7XG5cdFx0XHRcdHRoZUJvZHkgPSB0aGVCb2R5LnJlcGxhY2UocmUsIFwiXCIpIC8vIFJlbW92ZSBhbnkgZnJvbnQgbWF0dGVyIGtlcHQgaW4gZXJyb3Jcblx0XHRcdFx0cmUgPSAvXFxbL2c7XG5cdFx0XHRcdHRoZUJvZHkgPSB0aGVCb2R5LnJlcGxhY2UocmUsXCJcIik7IC8vIFJlbW92ZSBhbnkgd2lraWxpbmtzXG5cdFx0XHRcdGlmIChjb250YWN0KSB7XG5cdFx0XHRcdFx0dGhlQ29udGVudCA9IFwiYGBgZW1haWxcXG5cIi5jb25jYXQoYHRvOiAke2NvbnRhY3QuZW1haWxBZGRyZXNzfVxcbnN1YmplY3Q6ICR7Q29uc3RhbnRzLlNVQkpFQ1RfR09FU19IRVJFfVxcbmApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC8vIE5vIGNvbnRhY3Qgc28ganVzdCBnZW5lcmF0aW5nIGFuIGV4YW1wbGUgZW1haWxcblx0XHRcdFx0XHR0aGVDb250ZW50ID0gXCJgYGBlbWFpbFxcblwiLmNvbmNhdChgdG86IHNvbWVvbmVAZXhhbXBsZS5jb21cXG5zdWJqZWN0OiAke0NvbnN0YW50cy5TVUJKRUNUX0dPRVNfSEVSRX1cXG5gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoZUNvbnRlbnQgPSB0aGVDb250ZW50LmNvbmNhdChgYm9keTogXFxcIiR7dGhlQm9keX1cXFwiXFxuYCkuY29uY2F0KFwiYGBgXFxuXCIpO1xuXHRcdFx0XHRpZiAodGhlUXVlc3Rpb24ubWVudGlvbmVkLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHR0aGVDb250ZW50ID0gdGhlQ29udGVudC5jb25jYXQoQ29uc3RhbnRzLk1FTlRJT05FRF9TUEVDSUZJRVIpLmNvbmNhdCh0aGVRdWVzdGlvbi5tZW50aW9uZWQpLmNvbmNhdChgXFxuYCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhlQ29udGVudCA9IHRoZUNvbnRlbnQuY29uY2F0KCc+IFshTk9URV0gTm90ZVxcbj5QbGVhc2Ugc2VlIFtbUGVydGluZW50IENvbnRhY3RzfENvbnRhY3RzXV0gZm9yIHBvbGl0aWNhbCByZXByZXNlbnRhdGl2ZXMgYW5kIG90aGVyIGlkZWFzIGZvciB3aG8gdG8gc2VuZCBpbmZvcm1hdGlvblxcbiMjIFNoYXJlIEl0XFxuQ29weSBhbmQgcGFzdGUgdGhlIGluZm9ybWF0aW9uIGFib3ZlIGFuZC9vciBpbWFnZXMvdmlkZW9zIGJlbG93IGFuZCBzaGFyZSB2aWEgeW91ciBzb2NpYWwgbWVkaWEgYWNjb3VudHMuJyk7XG5cdFx0XHRcdC8vXHR0aGVDb250ZW50ID0gdGhlQ29udGVudC5jb25zdHJ1Y3RUd2VldCh0d2VldCk7XG5cdFx0XHRcdC8vIFNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9VUkxfZW5jb2RpbmdcblxuXHRcdFx0XHQvLyBsZXQgdHdlZXQgPSBDb25zdGFudHMuVFdFRVQ7XG5cdFx0XHRcdC8vIGxldCB0d2VldEJvZHkgPSB0aGlzLmZvcm1hdEhhc2h0YWdzKHRoZVF1ZXN0aW9uKTtcblxuXHRcdFx0XHQvLyByZSA9IC8gL2c7XG5cdFx0XHRcdC8vIHR3ZWV0Qm9keSA9IHR3ZWV0Qm9keS5jb25jYXQoQ29uc3RhbnRzLlBCQl9QUV9ESVIpLmNvbmNhdCh0aGVRdWVzdGlvbkZpbGVOYW1lLnJlcGxhY2UocmUsICcrJykpO1xuXHRcdFx0XHQvLyB0d2VldCA9IHR3ZWV0LmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQodHdlZXRCb2R5KSkuY29uY2F0KCcpXFxuJyk7XG5cdFx0XHRcdC8vIHRoZUNvbnRlbnQgPSB0aGVDb250ZW50LmNvbmNhdCh0d2VldCk7XG5cblx0XHRcdFx0Ly8gbGV0IGZiID0gQ29uc3RhbnRzLkZBQ0VCT09LX1BPU1Q7XG5cdFx0XHRcdC8vIGxldCBmYkJvZHkgPSB0aGlzLmZvcm1hdEhhc2h0YWdzKHRoZVF1ZXN0aW9uKTtcblxuXHRcdFx0XHQvLyBmYkJvZHkgPSBmYkJvZHkuY29uY2F0KENvbnN0YW50cy5QQkJfUFFfRElSKS5jb25jYXQodGhlUXVlc3Rpb25GaWxlTmFtZS5yZXBsYWNlKHJlLCAnKycpKTtcblx0XHRcdFx0Ly8gZmIgPSBmYi5jb25jYXQoZW5jb2RlVVJJQ29tcG9uZW50KGZiQm9keSkpLmNvbmNhdCgnKVxcblxcbicpO1xuXHRcdFx0XHQvLyB0aGVDb250ZW50ID0gdGhlQ29udGVudC5jb25jYXQoZmIpO1xuXG5cblx0XHRcdFx0dGhlQ29udGVudCA9IHRoZUNvbnRlbnQuY29uY2F0KENvbnN0YW50cy5SRVNFQVJDSF9NRURJQV9IRUFESU5HKTtcblx0XHRcdFx0dGhlQ29udGVudCA9IHRoZUNvbnRlbnQuY29uY2F0KENvbnN0YW50cy5JTUFHRV9NRURJQV9IRUFESU5HKVxuXHRcdFx0XHRpZiAodGhlUXVlc3Rpb24uaW1hZ2UubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHRoZUNvbnRlbnQgPSB0aGVDb250ZW50LmNvbmNhdChDb25zdGFudHMuRU1BSUxfTkwpLmNvbmNhdCh0aGVRdWVzdGlvbi5pbWFnZSk7XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhlQ29udGVudCA9IHRoZUNvbnRlbnQuY29uY2F0KENvbnN0YW50cy5WSURFT19IRUFESU5HKTtcblx0XHRcdFx0aWYgKHRoZVF1ZXN0aW9uLnZpZGVvLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHQvLyB0aGVDb250ZW50ID0gdGhlQ29udGVudC5jb25jYXQoQ29uc3RhbnRzLlZJREVPX0VNQkVEMSkuY29uY2F0KHRoZVF1ZXN0aW9uLnZpZGVvKS5jb25jYXQoQ29uc3RhbnRzLlZJREVPX0VNQkVEMik7XG5cdFx0XHRcdFx0dGhlQ29udGVudCA9IHRoZUNvbnRlbnQuY29uY2F0KHRoZVF1ZXN0aW9uLnZpZGVvKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoZUNvbnRlbnQgPSB0aGVDb250ZW50LmNvbmNhdChDb25zdGFudHMuRU1BSUxfTkwpLmNvbmNhdChDb25zdGFudHMuRk9PVEVSX1NQRUNJRklFUik7XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmFwcC52YXVsdC5hcHBlbmQodGhlRmlsZSwgdGhlQ29udGVudCk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGBDb3VsZCBub3QgYXBwZW5kIHRvIGZpbGU6ICR7dGhlRmlsZU5hbWV9IGR1ZSB0byAke2V9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBFcnJvciAtIGNvdWxkIG5vdCBjcmVhdGUgZmlsZSBmb3IgJHt0aGVGaWxlTmFtZX1gKTtcblx0XHRcdH1cblx0XHR9IC8vIGVuZGlmIGluZGV4IHVuZGVmaW5lZFxuXHR9XG5cblxuXHRhc3luYyB3cml0ZUFjdGlvbkZpbGUodGhlQWN0aW9uOiBRb3JBSW5mbywgdGhlRm9sZGVyOiBzdHJpbmcsIGNhdGVnb3J5OiBzdHJpbmcsIGNvbnRhY3Q/OiBDb250YWN0KSB7XG5cdFx0Y29uc3QgaGFzQW5BbGlhcyA9IHRoaXMuaGFzQXNzaWduZWRWYWx1ZSh0aGVBY3Rpb24uYWxpYXMpO1xuXG5cdFx0bGV0IGRlYWRsaW5lID0gdGhpcy5nZXREZWFkbGluZSh0aGVBY3Rpb24uZGVhZGxpbmUpO1xuXHRcdGlmIChkZWFkbGluZSAhPSBcIlwiKSB7XG5cdFx0XHRkZWFkbGluZSA9IFwiXFxuXCIuY29uY2F0KGRlYWRsaW5lKTtcblx0XHR9XG5cblx0XHRsZXQgdGFncyA9IHRoaXMuZ2V0VGFncyh0aGVBY3Rpb24udGFncyk7XG5cdFx0aWYgKHRhZ3MgIT0gXCJcIikge1xuXHRcdFx0dGFncyA9IFwiXFxuXCIuY29uY2F0KHRhZ3MpO1xuXHRcdH1cblxuXHRcdGxldCB0aGVGaWxlRnJvbnRNYXR0ZXIgPSBcIlwiO1xuXG5cdFx0aWYgKGhhc0FuQWxpYXMpIHtcblx0XHRcdHRoZUZpbGVGcm9udE1hdHRlciA9IGAtLS1cXG5wdWJsaXNoOiB0cnVlXFxuc2VudDogZmFsc2VcXG5hbGlhczogJHt0aGVBY3Rpb24uYWxpYXN9XFxuY2F0ZWdvcnk6ICR7Y2F0ZWdvcnl9XFxuYWN0aW9uOiB0cnVlXFxuJHtkZWFkbGluZX0ke3RhZ3N9XFxuLS0tXFxuYC5jb25jYXQoQ29uc3RhbnRzLklOU1RSVUNUSU9OU19GQVEpO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoZUZpbGVGcm9udE1hdHRlciA9IGAtLS1cXG5wdWJsaXNoOiB0cnVlXFxuc2VudDogZmFsc2VcXG5jYXRlZ29yeTogJHtjYXRlZ29yeX1cXG5hY3Rpb246IHRydWVcXG4ke2RlYWRsaW5lfSR7dGFnc31cXG4tLS1cXG5gLmNvbmNhdChDb25zdGFudHMuSU5TVFJVQ1RJT05TX0ZBUSk7XG5cblx0XHR9XG5cblxuXHRcdGNvbnN0IHRoZUFjdGlvbkZpbGU6IHN0cmluZ1tdID0gdGhlQWN0aW9uLmJvZHkuc3BsaXQoQ29uc3RhbnRzLkVNQUlMX05MLCAyKTtcblx0XHRsZXQgdGhlQWN0aW9uRmlsZU5hbWUgPSBcIlwiO1xuXG5cdFx0aWYgKHRoZUFjdGlvbi5xc2hvcnQgIT0gdW5kZWZpbmVkICYmIHRoZUFjdGlvbi5xc2hvcnQubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhlQWN0aW9uRmlsZU5hbWUgPSB0aGVBY3Rpb24ucXNob3J0LnRyaW1TdGFydCgpLnRyaW1FbmQoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhlQWN0aW9uRmlsZU5hbWUgPSB0aGVBY3Rpb25GaWxlWzBdO1xuXHRcdH1cblxuXG5cdFx0Y29uc3QgaW5kZXhCb2R5U3RhcnQgPSB0aGVBY3Rpb24uYm9keS5pbmRleE9mKENvbnN0YW50cy5FTUFJTF9OTCkgKyBDb25zdGFudHMuRU1BSUxfTkwubGVuZ3RoOyAvLyBGaXJzdCBsaW5lIGlzIHRoZSBmaWxlbmFtZVxuXHRcdGNvbnN0IHRoZVF1ZXN0aW9uQm9keSA9IHRoZUFjdGlvbi5ib2R5LnN1YnN0cmluZyhpbmRleEJvZHlTdGFydCk7XG5cblx0XHRpZiAoaW5kZXhCb2R5U3RhcnQgIT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRsZXQgdGhlQm9keSA9IFwiXCI7XG5cdFx0XHRsZXQgdGhlRmlsZU5hbWUgPSBcIlwiO1xuXG5cdFx0XHR0aGVCb2R5ID0gdGhlUXVlc3Rpb25Cb2R5O1xuXHRcdFx0dGhlRmlsZU5hbWUgPSB0aGVGb2xkZXIuY29uY2F0KFwiL1wiKS5jb25jYXQodGhlQWN0aW9uRmlsZU5hbWUpICsgXCIubWRcIjtcblxuXG5cdFx0XHQvLyBGaWxlIGRvZXMgbm90IGV4aXN0LCBzbyBjcmVhdGVcblx0XHRcdGxldCB0aGVGaWxlID0gYXdhaXQgdGhpcy5jcmVhdGVGaWxlKHRoZUZpbGVOYW1lLCB0aGVGaWxlRnJvbnRNYXR0ZXIpO1xuXG5cblx0XHRcdGlmICh0aGVGaWxlIGluc3RhbmNlb2YgVEZpbGUpIHtcblx0XHRcdFx0bGV0IHRoZUNvbnRlbnQgPSBcIlwiO1xuXHRcdFx0XHRsZXQgcmUgPSAvXCIvZztcblx0XHRcdFx0Y29uc3QgbGluZVN0YXJ0ID0gQ29uc3RhbnRzLkVNQUlMX05MLmNvbmNhdChDb25zdGFudHMuRU1BSUxfU09MKTtcblx0XHRcdFx0dGhlQm9keSA9IHRoZUJvZHkuY29uY2F0KGxpbmVTdGFydCk7XG4vL1x0XHRcdFx0dGhlQm9keSA9IHRoZUJvZHkuY29uY2F0KGBNb3JlIEFib3V0ICR7Y2F0ZWdvcnl9OiBgKS5jb25jYXQoQ29uc3RhbnRzLlBCQl9QUV9ESVIpLmNvbmNhdChjYXRlZ29yeSkuY29uY2F0KGAvJHtjYXRlZ29yeX0tSW5kZXhgKTtcblxuXG5cdFx0XHRcdHJlID0gLy0tLShcXG58LikqPy0tLS9nO1xuXHRcdFx0XHR0aGVCb2R5ID0gdGhlQm9keS5yZXBsYWNlKHJlLCBcIlwiKSAvLyBSZW1vdmUgYW55IGZyb250IG1hdHRlciBrZXB0IGluIGVycm9yXG5cblxuXHRcdFx0XHR0aGVDb250ZW50ID0gdGhlQ29udGVudC5jb25jYXQodGhlQm9keSArIFwiXFxuXCIpO1xuXHRcdFx0XHRpZiAodGhlQWN0aW9uLm1lbnRpb25lZC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0dGhlQ29udGVudCA9IHRoZUNvbnRlbnQuY29uY2F0KENvbnN0YW50cy5NRU5USU9ORURfU1BFQ0lGSUVSKS5jb25jYXQodGhlQWN0aW9uLm1lbnRpb25lZCkuY29uY2F0KGBcXG5gKTtcblx0XHRcdFx0fVxuXHRcdFx0XHR0aGVDb250ZW50ID0gdGhlQ29udGVudC5jb25jYXQoJz4gWyFOT1RFXSAnICsgQ29uc3RhbnRzLlBFUlRJTkVOVF9DT05UQUNUU19SRUZFUkVOQ0UpO1xuXHRcdFx0XHQvL1x0dGhlQ29udGVudCA9IHRoZUNvbnRlbnQuY29uc3RydWN0VHdlZXQodHdlZXQpO1xuXHRcdFx0XHQvLyBTZWUgaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVJMX2VuY29kaW5nXG5cblx0XHRcdFx0Ly8gbGV0IHR3ZWV0ID0gQ29uc3RhbnRzLlRXRUVUO1xuXHRcdFx0XHQvLyBsZXQgdHdlZXRCb2R5ID0gdGhpcy5mb3JtYXRIYXNodGFncyh0aGVBY3Rpb24pO1xuXG5cdFx0XHRcdC8vIHJlID0gLyAvZztcblx0XHRcdFx0Ly8gdHdlZXRCb2R5ID0gdHdlZXRCb2R5LmNvbmNhdChDb25zdGFudHMuUEJCX1BRX0RJUikuY29uY2F0KHRoZUFjdGlvbkZpbGVOYW1lLnJlcGxhY2UocmUsICcrJykpO1xuXHRcdFx0XHQvLyB0d2VldCA9IHR3ZWV0LmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQodHdlZXRCb2R5KSkuY29uY2F0KCcpXFxuJyk7XG5cdFx0XHRcdC8vIHRoZUNvbnRlbnQgPSB0aGVDb250ZW50LmNvbmNhdCh0d2VldCk7XG5cblx0XHRcdFx0Ly8gbGV0IGZiID0gQ29uc3RhbnRzLkZBQ0VCT09LX1BPU1Q7XG5cdFx0XHRcdC8vIGxldCBmYkJvZHkgPSB0aGlzLmZvcm1hdEhhc2h0YWdzKHRoZUFjdGlvbik7XG5cblx0XHRcdFx0Ly8gZmJCb2R5ID0gZmJCb2R5LmNvbmNhdChDb25zdGFudHMuUEJCX1BRX0RJUikuY29uY2F0KHRoZUFjdGlvbkZpbGVOYW1lLnJlcGxhY2UocmUsICcrJykpO1xuXHRcdFx0XHQvLyBmYiA9IGZiLmNvbmNhdChlbmNvZGVVUklDb21wb25lbnQoZmJCb2R5KSkuY29uY2F0KCcpXFxuXFxuJyk7XG5cdFx0XHRcdC8vIHRoZUNvbnRlbnQgPSB0aGVDb250ZW50LmNvbmNhdChmYik7XG5cblxuXHRcdFx0XHR0aGVDb250ZW50ID0gdGhlQ29udGVudC5jb25jYXQoQ29uc3RhbnRzLlJFU0VBUkNIX01FRElBX0hFQURJTkcpO1xuXHRcdFx0XHR0aGVDb250ZW50ID0gdGhlQ29udGVudC5jb25jYXQoQ29uc3RhbnRzLklNQUdFX01FRElBX0hFQURJTkcpXG5cdFx0XHRcdGlmICh0aGVBY3Rpb24uaW1hZ2UubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHRoZUNvbnRlbnQgPSB0aGVDb250ZW50LmNvbmNhdChDb25zdGFudHMuRU1BSUxfTkwpLmNvbmNhdCh0aGVBY3Rpb24uaW1hZ2UpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoZUNvbnRlbnQgPSB0aGVDb250ZW50LmNvbmNhdChDb25zdGFudHMuVklERU9fSEVBRElORyk7XG5cdFx0XHRcdGlmICh0aGVBY3Rpb24udmlkZW8ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdC8vIHRoZUNvbnRlbnQgPSB0aGVDb250ZW50LmNvbmNhdChDb25zdGFudHMuVklERU9fRU1CRUQxKS5jb25jYXQodGhlUXVlc3Rpb24udmlkZW8pLmNvbmNhdChDb25zdGFudHMuVklERU9fRU1CRUQyKTtcblx0XHRcdFx0XHR0aGVDb250ZW50ID0gdGhlQ29udGVudC5jb25jYXQodGhlQWN0aW9uLnZpZGVvKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoZUNvbnRlbnQgPSB0aGVDb250ZW50LmNvbmNhdChDb25zdGFudHMuRU1BSUxfTkwpLmNvbmNhdChDb25zdGFudHMuRk9PVEVSX1NQRUNJRklFUik7XG5cblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmFwcC52YXVsdC5hcHBlbmQodGhlRmlsZSwgdGhlQ29udGVudCk7XG5cdFx0XHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdFx0XHRjb25zb2xlLmVycm9yKGBDb3VsZCBub3QgYXBwZW5kIHRvIGZpbGU6ICR7dGhlRmlsZU5hbWV9IGR1ZSB0byAke2V9YCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBFcnJvciAtIGNvdWxkIG5vdCBjcmVhdGUgZmlsZSBmb3IgJHt0aGVGaWxlTmFtZX1gKTtcblx0XHRcdH1cblx0XHR9IC8vIGVuZGlmIGluZGV4IHVuZGVmaW5lZFxuXHR9XG5cdC8vIGZ1bmN0aW9uIGNvbnN0cnVjdFR3ZWV0KHN0cjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG5cdC8vIFx0Y29uc3QgcmVnZXggPSAvXFwvKFteXFwvXSopXFwvLztcblx0Ly8gXHRjb25zdCBtYXRjaCA9IHN0ci5tYXRjaChyZWdleCk7XG5cblx0Ly8gXHRyZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IG51bGw7XG5cdC8vIH1cblxuXHRhc3luYyBjcmVhdGVGaWxlKHRoZUZpbGVQYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IFByb21pc2U8VEZpbGUgfCBudWxsPiB7XG5cdFx0dHJ5IHtcblx0XHRcdGlmICghZmlsZUV4aXN0cyh0aGVGaWxlUGF0aCwgdGhpcy5hcHApKSB7XG5cdFx0XHRcdGxldCBjcmVhdGVkRmlsZSA9IGF3YWl0IHRoaXMuYXBwLnZhdWx0LmNyZWF0ZSh0aGVGaWxlUGF0aCwgY29udGVudClcblx0XHRcdFx0Y29uc29sZS5kZWJ1ZyhgREVCVUc6Q3JlYXRlZCBGaWxlICR7dGhlRmlsZVBhdGh9YCk7XG5cdFx0XHRcdHJldHVybiBjcmVhdGVkRmlsZTtcblx0XHRcdH1cblxuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYGNyZWF0ZUZpbGU6IGZpbGVQYXRoOiAkdGhlRmlsZVBhdGgsIGVycm9yOiAke2V9YCk7XG5cdFx0fVxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cdGFzeW5jIGNyZWF0ZUZvbGRlcih0aGVGb2xkZXI6IHN0cmluZykge1xuXHRcdHRyeSB7XG5cdFx0XHRpZiAoIWZvbGRlckV4aXN0cyh0aGVGb2xkZXIsIHRoaXMuYXBwKSkge1xuXHRcdFx0XHRhd2FpdCB0aGlzLmFwcC52YXVsdC5jcmVhdGVGb2xkZXIodGhlRm9sZGVyKTtcblxuXHRcdFx0fVxuXG5cdFx0fSBjYXRjaCAoZSkge1xuXHRcdFx0Y29uc29sZS5lcnJvcihlKTtcblx0XHR9XG5cdH1cblxuXHQvLyBnZXRDYXRlZ29yeVF1ZXN0aW9ucyBhZGRzIHRoZSBmaWxlIG5hbWUgYXMgdGhlIGZpcnN0IGxpbmUvZWxlbWVudCBpbiB0aGUgcmV0dXJuIHN0cmluZ1xuXHRhc3luYyBnZXRDYXRlZ29yeVF1ZXN0aW9uc09yQWN0aW9ucyhjYXRlZ29yeTogc3RyaW5nKTogUHJvbWlzZTxRb3JBSW5mb1tdIHwgbnVsbD4ge1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIGNvbmNhdCB0aGUgLyBhcyBhbGwgZm9sZGVycyBuZWVkIHRvIGJlIGRldm9pZCBvZiAvIHNsYXNoZXMgdG8gd29yayB3aXRoIGFic3RyYWN0RmlsZVBhdGggaW1wbCBJIGhhdmVcblx0XHRcdGNvbnN0IGZvbGRlck9yRmlsZSA9IHRoaXMuYXBwLnZhdWx0LmdldEFic3RyYWN0RmlsZUJ5UGF0aCh0aGlzLnF1ZXN0aW9uc09yQWN0aW9uc0ZvbGRlci5jb25jYXQoQ29uc3RhbnRzLk1BQ19GT0xERVJfU0VQQVJBVE9SLmNvbmNhdChjYXRlZ29yeSkpKTtcblxuXHRcdFx0aWYgKGZvbGRlck9yRmlsZSBpbnN0YW5jZW9mIFRGb2xkZXIpIHtcblx0XHRcdFx0Y29uc3QgdGhlUXVlc3Rpb25zOiBRb3JBSW5mb1tdID0gW107XG5cdFx0XHRcdGZvciAobGV0IGNoaWxkIG9mIGZvbGRlck9yRmlsZS5jaGlsZHJlbikge1xuXHRcdFx0XHRcdGlmIChjaGlsZCBpbnN0YW5jZW9mIFRGaWxlKSB7XG5cdFx0XHRcdFx0XHRpZiAoY2hpbGQuZXh0ZW5zaW9uLmVuZHNXaXRoKFwibWRcIikpIHtcblx0XHRcdFx0XHRcdFx0bGV0IHRoZVF1ZXN0aW9uTGluZXMgPSBhd2FpdCB0aGlzLmFwcC52YXVsdC5jYWNoZWRSZWFkKGNoaWxkKTtcblx0XHRcdFx0XHRcdFx0Y29uc3QgaW5kZXggPSBjaGlsZC5wYXRoLmxhc3RJbmRleE9mKENvbnN0YW50cy5NQUNfRk9MREVSX1NFUEFSQVRPUik7IC8vIEZvbGRlciBwYXRoIC8gZmlsZU5hbWVcblx0XHRcdFx0XHRcdFx0aWYgKGluZGV4ICE9IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdGxldCB0aGVGaWxlRnVsbFBhdGggPSBjaGlsZC5wYXRoICsgXCJcXG5cIjsgLy8gQWRkIGZpbGUgbmFtZVxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHRoZVF1ZXN0aW9uOiBRb3JBSW5mbyA9IHsgYm9keTogXCJcIiwgaW1hZ2U6IFwiXCIsIHZpZGVvOiBcIlwiLCB0YWdzOiBcIlwiLCBhY3Rpb246IFwiXCIsIGRlYWRsaW5lOiBcIlwiLCBhbGlhczogXCJcIiwgcXNob3J0OiBcIlwiLCBtZW50aW9uZWQ6IFwiXCIgfTtcblx0XHRcdFx0XHRcdFx0XHR0aGVRdWVzdGlvbi5ib2R5ID0gdGhlRmlsZUZ1bGxQYXRoLnN1YnN0cmluZyhpbmRleCArIDEsIHRoZUZpbGVGdWxsUGF0aC5sZW5ndGggLSA0KTsgLy8gRmlyc3QgbGluZSBvZiBpbnRlcmltIGZpbGUgaXMgZmlsZW5hbWVcblxuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IHF1ZXN0aW9uTGluZXMgPSB0aGVRdWVzdGlvbkxpbmVzLnNwbGl0KFwiXFxuXCIpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGxpbmVTdGFydCA9IENvbnN0YW50cy5FTUFJTF9OTC5jb25jYXQoQ29uc3RhbnRzLkVNQUlMX1NPTCk7XG5cdFx0XHRcdFx0XHRcdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCBxdWVzdGlvbkxpbmVzLmxlbmd0aDsgaSsrKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdGlmIChxdWVzdGlvbkxpbmVzW2ldLmNvbnRhaW5zKENvbnN0YW50cy5JTUFHRV9TUEVDSUZJRVIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoZVF1ZXN0aW9uLmltYWdlID0gcXVlc3Rpb25MaW5lc1tpXS5zcGxpdChDb25zdGFudHMuSU1BR0VfU1BFQ0lGSUVSKVsxXTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocXVlc3Rpb25MaW5lc1tpXS5jb250YWlucyhDb25zdGFudHMuVklERU9fU1BFQ0lGSUVSKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGVRdWVzdGlvbi52aWRlbyA9IHF1ZXN0aW9uTGluZXNbaV0uc3BsaXQoQ29uc3RhbnRzLlZJREVPX1NQRUNJRklFUilbMV07XG5cblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocXVlc3Rpb25MaW5lc1tpXS5jb250YWlucyhDb25zdGFudHMuVEFHU19TUEVDSUZJRVIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHRoZVF1ZXN0aW9uLnRhZ3MgPSBxdWVzdGlvbkxpbmVzW2ldLnNwbGl0KENvbnN0YW50cy5UQUdTX1NQRUNJRklFUilbMV07XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHF1ZXN0aW9uTGluZXNbaV0uY29udGFpbnMoQ29uc3RhbnRzLkNBTVBBSUdOX1NQRUNJRklFUikpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlUXVlc3Rpb24uYWN0aW9uID0gcXVlc3Rpb25MaW5lc1tpXS5zcGxpdChDb25zdGFudHMuQ0FNUEFJR05fU1BFQ0lGSUVSKVsxXTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocXVlc3Rpb25MaW5lc1tpXS5jb250YWlucyhDb25zdGFudHMuREVBRExJTkVfU1BFQ0lGSUVSKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGVRdWVzdGlvbi5kZWFkbGluZSA9IHF1ZXN0aW9uTGluZXNbaV0uc3BsaXQoQ29uc3RhbnRzLkRFQURMSU5FX1NQRUNJRklFUilbMV07XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHF1ZXN0aW9uTGluZXNbaV0uY29udGFpbnMoQ29uc3RhbnRzLkFMSUFTX1NQRUNJRklFUikpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlUXVlc3Rpb24uYWxpYXMgPSBxdWVzdGlvbkxpbmVzW2ldLnNwbGl0KENvbnN0YW50cy5BTElBU19TUEVDSUZJRVIpWzFdO1xuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIGlmIChxdWVzdGlvbkxpbmVzW2ldLmNvbnRhaW5zKENvbnN0YW50cy5RU0hPUlRfU1BFQ0lGSUVSKSkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGVRdWVzdGlvbi5xc2hvcnQgPSBxdWVzdGlvbkxpbmVzW2ldLnNwbGl0KENvbnN0YW50cy5RU0hPUlRfU1BFQ0lGSUVSKVsxXTtcblx0XHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAocXVlc3Rpb25MaW5lc1tpXS5jb250YWlucyhDb25zdGFudHMuTUVOVElPTkVEX1NQRUNJRklFUikpIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlUXVlc3Rpb24ubWVudGlvbmVkID0gcXVlc3Rpb25MaW5lc1tpXS5zcGxpdChDb25zdGFudHMuTUVOVElPTkVEX1NQRUNJRklFUilbMV07XG5cdFx0XHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKHF1ZXN0aW9uTGluZXNbaV0uY29udGFpbnMoQ29uc3RhbnRzLkZPT1RFUl9TUEVDSUZJRVIpKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRcdDsgLy8gRmlsdGVyIGl0IG91dCwgaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgUFEgcGFnZVxuXHRcdFx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0dGhlUXVlc3Rpb24uYm9keSArPSBsaW5lU3RhcnQuY29uY2F0KHF1ZXN0aW9uTGluZXNbaV0pO1xuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0fSAvLyBlbmRmb3Jcblx0XHRcdFx0XHRcdFx0XHR0aGVRdWVzdGlvbnMudW5zaGlmdCh0aGVRdWVzdGlvbik7XG5cdFx0XHRcdFx0XHRcdH0gLy8gZW5kaWYgaW5kZXggXG5cdFx0XHRcdFx0XHR9Ly8gZW5kaWYgbWRcblx0XHRcdFx0XHR9Ly8gZW5kaWYgY2hpbGRcblx0XHRcdFx0fSAvL2VuZGZvciBjaGlsZFxuXG5cdFx0XHRcdHJldHVybiB0aGVRdWVzdGlvbnM7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oYEV4cGVjdGVkIGZvbGRlciBpbiBnZXRDYXRlZ29yeVF1ZXN0aW9ucyBwYXJhbSBidXQgc2VudCAke3RoaXMucXVlc3Rpb25zT3JBY3Rpb25zRm9sZGVyLmNvbmNhdChjYXRlZ29yeSl9YCk7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH0gY2F0Y2ggKGUpIHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoZSk7XG5cdFx0fVxuXHRcdHJldHVybiBudWxsO1xuXG5cblxuXHR9XG5cblx0b25DbG9zZSgpIHtcblx0XHRjb25zdCB7IGNvbnRlbnRFbCB9ID0gdGhpcztcblx0XHRjb250ZW50RWwuZW1wdHkoKTtcblx0fVxufVxuXG5jbGFzcyBQZXJ0aW5lbnRTZXR0aW5nVGFiIGV4dGVuZHMgUGx1Z2luU2V0dGluZ1RhYiB7XG5cdHBsdWdpbjogUGVydGluZW50UXVlc3Rpb25zO1xuXG5cdGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW46IFBlcnRpbmVudFF1ZXN0aW9ucykge1xuXHRcdHN1cGVyKGFwcCwgcGx1Z2luKTtcblx0XHR0aGlzLnBsdWdpbiA9IHBsdWdpbjtcblx0fVxuXG5cdGRpc3BsYXkoKTogdm9pZCB7XG5cdFx0Y29uc3QgeyBjb250YWluZXJFbCB9ID0gdGhpcztcblxuXHRcdGNvbnRhaW5lckVsLmVtcHR5KCk7XG5cblx0XHRjb250YWluZXJFbC5jcmVhdGVFbCgnaDInLCB7IHRleHQ6ICdHZW5lcmFsIFNldHRpbmdzJyB9KTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1F1ZXN0aW9ucyBJbnB1dCBGb2xkZXInKVxuXHRcdFx0LnNldERlc2MoJ0VudGVyIHRoZSBGb2xkZXIgTG9jYXRpb24nKVxuXHRcdFx0LmFkZFRleHQodGV4dCA9PiB0ZXh0XG5cdFx0XHRcdC5zZXRQbGFjZWhvbGRlcignRW50ZXIgUXVlc3Rpb25zIElucHV0IEZvbGRlcicpXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5xdWVzdGlvbnNGb2xkZXIpXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHRjb25zb2xlLmRlYnVnKCdRdWVzdGlvbnMgTG9jYXRpb246ICcgKyB2YWx1ZSk7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MucXVlc3Rpb25zRm9sZGVyID0gdmFsdWU7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5wbHVnaW4uc2F2ZVNldHRpbmdzKCk7XG5cdFx0XHRcdH0pKTtcblxuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ0FjdGlvbnMgSW5wdXQgRm9sZGVyJylcblx0XHRcdC5zZXREZXNjKCdFbnRlciB0aGUgRm9sZGVyIExvY2F0aW9uJylcblx0XHRcdC5hZGRUZXh0KHRleHQgPT4gdGV4dFxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ0VudGVyIEFjdGlvbnMgRm9sZGVyJylcblx0XHRcdFx0LnNldFZhbHVlKHRoaXMucGx1Z2luLnNldHRpbmdzLmFjdGlvbnNGb2xkZXIpXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHRjb25zb2xlLmRlYnVnKCdBY3Rpb25zIExvY2F0aW9uOiAnICsgdmFsdWUpO1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLmFjdGlvbnNGb2xkZXIgPSB2YWx1ZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSkpO1xuXHRcdG5ldyBTZXR0aW5nKGNvbnRhaW5lckVsKVxuXHRcdFx0LnNldE5hbWUoJ1F1ZXN0aW9ucyBPdXRwdXQgRm9sZGVyJylcblx0XHRcdC5zZXREZXNjKCdFbnRlciB0aGUgUGVydGluZW50IFF1ZXN0aW9ucyBPdXRwdXQgRm9sZGVyIExvY2F0aW9uJylcblx0XHRcdC5hZGRUZXh0KHRleHQgPT4gdGV4dFxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ0VudGVyIFBlcnRpbmVudCBRdWVzdGlvbnMgT3V0cHV0IEZvbGRlcicpXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5xdWVzdGlvbnNPdXRwdXRGb2xkZXIpXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHRjb25zb2xlLmRlYnVnKCdPdXRwdXQgRm9sZGVyIExvY2F0aW9uOiAnICsgdmFsdWUpO1xuXHRcdFx0XHRcdHRoaXMucGx1Z2luLnNldHRpbmdzLnF1ZXN0aW9uc091dHB1dEZvbGRlciA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KSk7XG5cblx0XHRuZXcgU2V0dGluZyhjb250YWluZXJFbClcblx0XHRcdC5zZXROYW1lKCdBY3Rpb25zIE91dHB1dCBGb2xkZXInKVxuXHRcdFx0LnNldERlc2MoJ0VudGVyIHRoZSBQZXJ0aW5lbnQgQWN0aW9ucyBPdXRwdXQgRm9sZGVyIExvY2F0aW9uJylcblx0XHRcdC5hZGRUZXh0KHRleHQgPT4gdGV4dFxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoJ0VudGVyIFBlcnRpbmVudCBBY3Rpb25zIE91dHB1dCBGb2xkZXInKVxuXHRcdFx0XHQuc2V0VmFsdWUodGhpcy5wbHVnaW4uc2V0dGluZ3MuYWN0aW9uc091dHB1dEZvbGRlcilcblx0XHRcdFx0Lm9uQ2hhbmdlKGFzeW5jICh2YWx1ZSkgPT4ge1xuXHRcdFx0XHRcdGNvbnNvbGUuZGVidWcoJ091dHB1dCBGb2xkZXIgTG9jYXRpb246ICcgKyB2YWx1ZSk7XG5cdFx0XHRcdFx0dGhpcy5wbHVnaW4uc2V0dGluZ3MuYWN0aW9uc091dHB1dEZvbGRlciA9IHZhbHVlO1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMucGx1Z2luLnNhdmVTZXR0aW5ncygpO1xuXHRcdFx0XHR9KSk7XG5cdFx0bmV3IFNldHRpbmcoY29udGFpbmVyRWwpXG5cdFx0XHQuc2V0TmFtZShDb25zdGFudHMuQ09OVEFDVFNfSU1QT1JUX0ZJTEUpXG5cdFx0XHQuc2V0RGVzYygnRW50ZXIgdGhlIENvbnRhY3RzIEltcG9ydCBGaWxlIExvY2F0aW9uJylcblx0XHRcdC5hZGRUZXh0KHRleHQgPT4gdGV4dFxuXHRcdFx0XHQuc2V0UGxhY2Vob2xkZXIoQ29uc3RhbnRzLkNPTlRBQ1RTX0ZJTEVfTE9DQVRJT04pXG5cdFx0XHRcdC5zZXRWYWx1ZSh0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb250YWN0c0ZpbGUpXG5cdFx0XHRcdC5vbkNoYW5nZShhc3luYyAodmFsdWUpID0+IHtcblx0XHRcdFx0XHR0aGlzLnBsdWdpbi5zZXR0aW5ncy5jb250YWN0c0ZpbGUgPSB2YWx1ZTtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLnBsdWdpbi5zYXZlU2V0dGluZ3MoKTtcblx0XHRcdFx0fSkpO1xuXHR9XG59XG5cbiIsICJleHBvcnQgY2xhc3MgQXBwU2V0dGluZ3N7XG4gICAgcHVibGljIHN0YXRpYyBFTUFJTF9OTCA9IGBcXG5cXG5gOy8vIEVtYWlsIG5ldyBsaW5lXG4gICAgcHVibGljIHN0YXRpYyAgRU1BSUxfU09MID0gYCAgYDsgLy9FbWFpbCBzdGFydCBvZiBsaW5lXG4gICAgcHVibGljIHN0YXRpYyBNQUNfRk9MREVSX1NFUEFSQVRPUiA9IGAvYDtcbiAgICBwdWJsaWMgc3RhdGljIEFMTF9DQVRFR09SSUVTID0gXCJBbGwgQ2F0ZWdvcmllcyBvciBDYW1wYWlnbnNcIjtcbiAgICBwdWJsaWMgc3RhdGljIENSRUFURV9QRVJUSU5FTlRfUVVFU1RJT05TID0gJ0NyZWF0ZSBQZXJ0aW5lbnQgUXVlc3Rpb25zJztcbiAgICBwdWJsaWMgc3RhdGljIENSRUFURV9QRVJUSU5FTlRfQUNUSU9OUyA9ICdDcmVhdGUgUGVydGluZW50IEFjdGlvbnMnO1xuICAgIHB1YmxpYyBzdGF0aWMgU1VCSkVDVF9HT0VTX0hFUkUgPSBcIlNVQkpFQ1QgR09FUyBIRVJFIVwiO1xuICAgIHB1YmxpYyBzdGF0aWMgRkFPID0gXCJGQU9cIjtcbiAgICBwdWJsaWMgc3RhdGljIENPTlRBQ1RTX0ZJTEVfTE9DQVRJT04gPSAnRW50ZXIgQ29udGFjdHMgRmlsZSBMb2NhdGlvbic7XG4gICAgcHVibGljIHN0YXRpYyBDT05UQUNUU19JTVBPUlRfRklMRSA9ICdDb250YWN0cyBJbXBvcnQgRmlsZSc7XG4gICAgcHVibGljIHN0YXRpYyBDQVRfSU5ERVhfU1VGRklYID0gJy1JbmRleC5tZCc7XG4gICAgcHVibGljIHN0YXRpYyBJTUFHRV9TUEVDSUZJRVIgPSBgaW1hZ2U6YDtcbiAgICBwdWJsaWMgc3RhdGljIFZJREVPX1NQRUNJRklFUiA9IGB2aWRlbzpgO1xuICAgIHB1YmxpYyBzdGF0aWMgQ0FNUEFJR05fU1BFQ0lGSUVSID0gYGNhbXBhaWduOmA7XG4gICAgcHVibGljIHN0YXRpYyBERUFETElORV9TUEVDSUZJRVIgPSBgZGVhZGxpbmU6YDtcbiAgICBwdWJsaWMgc3RhdGljIFFTSE9SVF9TUEVDSUZJRVIgPSBgcXNob3J0OmA7XG4gICAgcHVibGljIHN0YXRpYyBNRU5USU9ORURfU1BFQ0lGSUVSID0gYG1lbnRpb25lZDpgO1xuICAgIHB1YmxpYyBzdGF0aWMgQUxJQVNfU1BFQ0lGSUVSID0gYGFsaWFzOmA7XG4gICAgcHVibGljIHN0YXRpYyBGT09URVJfU1BFQ0lGSUVSID0gYCFbW0Zvb3Rlcl1dYDtcbiAgICBwdWJsaWMgc3RhdGljIEZPT1RFUl9FTUJFRCA9IGA8ZGl2IGFsaWduPWNlbnRlcj48aWZyYW1lIHNyYz1cImh0dHBzOi8vcHJvamVjdGJ1YmJsZWJ1cnN0LnN1YnN0YWNrLmNvbS9lbWJlZFwiIHdpZHRoPVwiNDgwXCIgaGVpZ2h0PVwiMzIwXCIgc3R5bGU9XCJib3JkZXI6MXB4IHNvbGlkICNFRUU7IGJhY2tncm91bmQ6YmxhY2s7XCIgZnJhbWVib3JkZXI9XCIwXCIgc2Nyb2xsaW5nPVwibm9cIj48L2lmcmFtZT48L2Rpdj48ZGl2IGFsaWduPWNlbnRlcj5Qcm9qZWN0QnViYmxlQnVyc3QgLSBDcml0aWNhbCBUaGlua2luZyBpbiBhIFBhbmRlbWljIG9mIFVucmVhc29uLiAgXHQ8YnIvPiA8Yj5USElOSzwvYj4gLSBXaGlsZSBJdCBJcyBTdGlsbCBMZWdhbC4uLjwvZGl2PmA7XG4gICAgXG4vLyAgICBwdWJsaWMgc3RhdGljIFZJREVPX0VNQkVEMSA9IGA8Y2VudGVyPjxpZnJhbWUgd2lkdGg9XCI1NjBcIiBoZWlnaHQ9XCIzMTVcIiBzcmM9XCJgO1xuLy8gICAgcHVibGljIHN0YXRpYyBWSURFT19FTUJFRDIgPSBgXCIgZnJhbWVib3JkZXI9XCIwXCIgYXV0b3BsYXk9XCIwXCIgYXV0b3N0YXJ0PVwiMFwiIGFsbG93PVwiYWNjZWxlcm9tZXRlcjsgZW5jcnlwdGVkLW1lZGlhOyBneXJvc2NvcGU7IHBpY3R1cmUtaW4tcGljdHVyZVwiIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT48L2NlbnRlcj5gXG4gICAgcHVibGljIHN0YXRpYyBWSURFT19FTUJFRDEgPSBgPHZpZGVvIHdpZHRoPVwiNjAwXCIgaGVpZ2h0PVwiNDAwXCIgc3JjPVwiYDtcbiAgICBwdWJsaWMgc3RhdGljIFZJREVPX0VNQkVEMiA9IGBcIiBjb250cm9scz48L3ZpZGVvPmA7XG4gICAgcHVibGljIHN0YXRpYyBUQUdTX1NQRUNJRklFUiA9IGB0YWdzOmA7XG4gICAgcHVibGljIHN0YXRpYyBVUklfUExVUyA9IGAlMkJgO1xuICAgIHB1YmxpYyBzdGF0aWMgVVJJX1NQQUNFID0gYCUyMGA7XG4gICAgcHVibGljIHN0YXRpYyBQQkJfUFFfRElSID0gYGh0dHBzOi8vcHJvamVjdGJ1YmJsZWJ1cnN0LmNvbS9QZXJ0aW5lbnQrUXVlc3Rpb25zL2A7XG4gICAgcHVibGljIHN0YXRpYyBQQkJfUk9PVCA9IGBodHRwczovL3Byb2plY3RidWJibGVidXJzdC5jb20vYDtcbiAgICBwdWJsaWMgc3RhdGljIFZJREVPX0hFQURJTkcgPSBgXFxuIyMjIFZpZGVvXFxuYDtcbiAgICBwdWJsaWMgc3RhdGljIFJFU0VBUkNIX01FRElBX0hFQURJTkcgPSBgXFxuIyMgcmVTZWFyY2ggTWVkaWFcXG5gO1xuICAgIHB1YmxpYyBzdGF0aWMgSU1BR0VfTUVESUFfSEVBRElORyA9IGAjIyMgSW1hZ2VcXG5gXG4gICAgLy8gcHVibGljIHN0YXRpYyBUV0VFVCA9IGBbVHdpdHRlcl0oaHR0cHM6Ly90d2l0dGVyLmNvbS9pbnRlbnQvdHdlZXQ/dGV4dD1gO1xuICAgIC8vIHB1YmxpYyBzdGF0aWMgRkFDRUJPT0tfUE9TVCA9IGBbRmFjZWJvb2tdKGh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9zaGFyZXIucGhwP3U9YDtcbiAgICBwdWJsaWMgc3RhdGljIE5VTV9RVUVTVElPTlMgPSBgTnVtYmVyIG9mIENhdGVnb3J5IFBlcnRpbmVudCBRdWVzdGlvbnMgPSBgO1xuICAgIHB1YmxpYyBzdGF0aWMgVE9UQUxfTlVNX1FVRVNUSU9OUyA9IGBUb3RhbCBOdW1iZXIgb2YgUGVydGluZW50IFF1ZXN0aW9ucyA9IGA7XG4gICAgcHVibGljIHN0YXRpYyBXRUZfQ09NUEFOSUVTID0gYCdcXG5cXG4jIyMgR2xvYmFsXFxuLSBXRUYgQ29tcGFuaWVzIC0gaHR0cHM6Ly93d3cud2Vmb3J1bS5vcmcvcGFydG5lcnMjc2VhcmNoIFtMZXQgdGhlbSBrbm93IHdoZXJlIHlvdXIgbW9uZXkgd2lsbCBub3QgYmUgc3BlbnRdKGh0dHBzOi8vcHJvamVjdGJ1YmJsZWJ1cnN0LmNvbS9BY3Rpb25zL0FjdGlvbisxOCstK0xldCt0aGVtK2tub3crLStGVGhlV0VGKWA7XG4gICAgcHVibGljIHN0YXRpYyBQRVJUSU5FTlRfQ09OVEFDVFNfRklMRSA9IFwiL1BlcnRpbmVudCBDb250YWN0cy5tZFwiO1xuICAgIHB1YmxpYyBzdGF0aWMgQ09OVEFDVFNfSEVBREVSID0gJ1xcblxcbiMjIENvbnRhY3RzXFxuPiBbIU5PVEVdXFxuPioqUmVtZW1iZXIgLSBzZW5kIHRoZSBxdWVzdGlvbnMgdG8geW91ciBmcmllbmRzLCBmYW1pbHksIGNvbGxlYWd1ZXMgYW5kIGxvY2FsIGJ1c2luZXNzZXMgZmlyc3QgYW5kIGZvcmVtb3N0IHRvIGF2b2lkIGNlbnRyYWwgY2Vuc29yc2hpcC4qKlxcbj5cXG4+ICpUbyBwb3NlIGEgcGVydGluZW50IHF1ZXN0aW9uLCB0aGUgcXVlc3Rpb24gbXVzdCBmaXJzdCBiZSB1bmFwcG9zZWQuKlxcblxcbkJlbG93IGlzIGEgc2hvcnQgbGlzdCBvZiBzb21lIGNvdW50cnkgcG9saXRpY2FsIHJlcHJlc2VudGF0aXZlcyBhbmQgV0VGIGFsaWduZWQgY29tcGFuaWVzLiBGb3IgZnVydGhlciBpbmZvcm1hdGlvbiwgc2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX2xlZ2lzbGF0dXJlc19ieV9jb3VudHJ5JztcbiAgICBwdWJsaWMgc3RhdGljIEFVU1RSQUxJQV9QT0xJVElDQUxfQ09OVEFDVFMgPSAnXFxuIyMjIEF1c3RyYWxpYVxcbi0gTGlzdCBTZW5hdG9ycyBhbmQgTWVtYmVyczogaHR0cHM6Ly93d3cuYXBoLmdvdi5hdS9TZW5hdG9yc19hbmRfTWVtYmVycy9QYXJsaWFtZW50YXJpYW5fU2VhcmNoX1Jlc3VsdHM/cT0mbWVtPTEmcGFyPS0xJmdlbj0wJnBzPTAnO1xuICAgIHB1YmxpYyBzdGF0aWMgQ0FOQURBX1BPTElUSUNBTF9DT05UQUNUUyA9ICdcXG4jIyMgQ2FuYWRhXFxuLSBMaXN0IG9mIE1QczogaHR0cHM6Ly93d3cub3VyY29tbW9ucy5jYS9tZW1iZXJzL2VuL3NlYXJjaCc7XG4gICAgcHVibGljIHN0YXRpYyBFVV9QT0xJVElDQUxfQ09OVEFDVFMgPSAnXFxuIyMjIEVVXFxuLSBMaXN0IG9mIE1FUHM6IGh0dHBzOi8vd3d3LmV1cm9wYXJsLmV1cm9wYS5ldS9tZXBzL2VuL2Z1bGwtbGlzdC9hbGwnO1xuICAgIHB1YmxpYyBzdGF0aWMgRklOTEFORF9QT0xJVElDQUxfQ09OVEFDVFMgPSAnXFxuIyMjIEZpbmxhbmRcXG4tIExpc3Qgb2YgTVBzOiBodHRwczovL3d3dy5lZHVza3VudGEuZmkvRU4va2Fuc2FuZWR1c3RhamF0L255a3lpc2V0X2thbnNhbmVkdXN0YWphdC9QYWdlcy9kZWZhdWx0LmFzcHgnO1xuICAgIHB1YmxpYyBzdGF0aWMgR0VSTUFOWV9QT0xJVElDQUxfQ09OVEFDVFMgPSAnXFxuIyMjIEdlcm1hbnlcXG4tIExpc3Qgb2YgTVBzOiBodHRwczovL3d3dy5idW5kZXN0YWcuZGUvZW4vbWVtYmVycyc7XG4gICAgcHVibGljIHN0YXRpYyBJUkVMQU5EX1BPTElUSUNBTF9DT05UQUNUUyA9ICdcXG4jIyMgSXJlbGFuZFxcbi0gTGlzdCBvZiBURHMgYW5kIFNlbmF0b3JzOiBodHRwczovL3d3dy5vaXJlYWNodGFzLmllL2VuL21lbWJlcnMvJztcbiAgICBwdWJsaWMgc3RhdGljIE5FVEhFUkxBTkRTX1BPTElUSUNBTF9DT05UQUNUUyA9ICdcXG4jIyMgTmV0aGVybGFuZHNcXG4tIExpc3Qgb2YgTVBzOiBodHRwczovL3d3dy5ob3VzZW9mcmVwcmVzZW50YXRpdmVzLm5sL21lbWJlcnNfb2ZfcGFybGlhbWVudC9tZW1iZXJzX29mX3BhcmxpYW1lbnQnO1xuICAgIHB1YmxpYyBzdGF0aWMgTkVXX1pFQUxBTkRfUE9MSVRJQ0FMX0NPTlRBQ1RTID0gJ1xcbiMjIyBOZXcgWmVhbGFuZFxcbi0gTGlzdCBvZiBNUHM6IGh0dHBzOi8vd3d3LnBhcmxpYW1lbnQubnovZW4vbXBzLWFuZC1lbGVjdG9yYXRlcy9tZW1iZXJzLW9mLXBhcmxpYW1lbnQvJztcbiAgICBwdWJsaWMgc3RhdGljIE5PUldBWV9QT0xJVElDQUxfQ09OVEFDVFMgPSAnXFxuIyMjIE5vcndheVxcbi0gTGlzdCBvZiBNUHM6IGh0dHBzOi8vd3d3LnN0b3J0aW5nZXQubm8vZW4vSW4tRW5nbGlzaC9NZW1iZXJzLW9mLXRoZS1TdG9ydGluZy9jdXJyZW50LW1lbWJlcnMtb2YtcGFybGlhbWVudC8nO1xuICAgIHB1YmxpYyBzdGF0aWMgU1dFREVOX1BPTElUSUNBTF9DT05UQUNUUyA9ICdcXG4jIyMgU3dlZGVuXFxuLSBMaXN0IG9mIE1QczogaHR0cHM6Ly93d3cucmlrc2RhZ2VuLnNlL2VuL01lbWJlcnMtYW5kLXBhcnRpZXMvJztcbiAgICBwdWJsaWMgc3RhdGljIFNXSVRaRVJMQU5EX1BPTElUSUNBTF9DT05UQUNUUyA9ICdcXG4jIyMgU3dpdHplcmxhbmRcXG4tIExpc3Qgb2YgTVBzOiBodHRwczovL3d3dy5wYXJsYW1lbnQuY2gvZW4vb3JnYW5lL25hdGlvbmFsLWNvdW5jaWwvbWVtYmVycy1uYXRpb25hbC1jb3VuY2lsLWEteic7XG4gICAgcHVibGljIHN0YXRpYyBVS19QT0xJVElDQUxfQ09OVEFDVFMgPSAnXFxuIyMjIFVLXFxuLSBTcHJlYWRzaGVldCBsaXN0IG9mIE1QczogaHR0cHM6Ly93d3cudGhleXdvcmtmb3J5b3UuY29tL21wcy8/Zj1jc3ZcXG4tIEZpbmQgeW91ciBNUDogaHR0cHM6Ly9tZW1iZXJzLnBhcmxpYW1lbnQudWsvbWVtYmVycy9jb21tb25zXFxuLSBGaW5kIGEgTG9yZDogaHR0cHM6Ly9tZW1iZXJzLnBhcmxpYW1lbnQudWsvbWVtYmVycy9sb3Jkcyc7XG4gICAgcHVibGljIHN0YXRpYyBVU19QT0xJVElDQUxfQ09OVEFDVFMgPSAnXFxuIyMjIFVTXFxuLSBMaXN0IG9mIFNlbmF0b3JzOiBodHRwczovL3d3dy5zZW5hdGUuZ292L3NlbmF0b3JzLyc7XG4gICAgcHVibGljIHN0YXRpYyBQRVJUSU5FTlRfQ09OVEFDVFNfUkVGRVJFTkNFID0gJ05vdGVcXG4+UGxlYXNlIHNlZSBbW1BlcnRpbmVudCBDb250YWN0c3xDb250YWN0c11dIGZvciBwb2xpdGljYWwgcmVwcmVzZW50YXRpdmVzIGFuZCBvdGhlciBpZGVhcyBmb3Igd2hvIHRvIHNlbmQgaW5mb3JtYXRpb25cXG4jIyBTaGFyZSBJdFxcbkNvcHkgYW5kIHBhc3RlIHRoZSBpbmZvcm1hdGlvbiBhYm92ZSBhbmQvb3IgaW1hZ2VzL3ZpZGVvcyBiZWxvdyBhbmQgc2hhcmUgdmlhIHlvdXIgc29jaWFsIG1lZGlhIGFjY291bnRzLic7XG4gICAgcHVibGljIHN0YXRpYyBJTlNUUlVDVElPTlNfRkFRID0gYCMjIEluc3RydWN0aW9uc1xcbltGQVEgYW5kIEhlbHBdKGh0dHBzOi8vcHJvamVjdGJ1YmJsZWJ1cnN0LmNvbS9QZXJ0aW5lbnQrUXVlc3Rpb25zK0hlbHApXFxuXFxuLSBbU3VwcG9ydCBVc10oaHR0cHM6Ly9wcm9qZWN0YnViYmxlYnVyc3QuY29tL1N1cHBvcnQrVXMpXFxuXFxuIyMgVGFrZSBBY3Rpb25cXG5gO1xuICAgIHB1YmxpYyBzdGF0aWMgSU5TVFJVQ1RJT05TX0ZBUV9ERVRBSUxFRCA9IGAjIyBJbnN0cnVjdGlvbnNcXG5bRkFRIGFuZCBIZWxwXShodHRwczovL3Byb2plY3RidWJibGVidXJzdC5jb20vUGVydGluZW50K1F1ZXN0aW9ucytIZWxwKVxcblxcbi0gcmVTZWFyY2ggLSBUaGUgY29udGVudCBhbmQgcmVTZWFyY2ggTWVkaWEuIE1ha2Ugc3VyZSB5b3UgcGVyc29uYWxpc2UgeW91ciBlbWFpbCB3aXRoIHlvdXIgb3duIHJlYXNvbmVkIGFyZ3VtZW50cyBhbmQgZmVlbGluZ3MuXFxuLSBTZW5kIEl0IVxcbi0gU2hhcmUgSXQhXFxuLSBbU3VwcG9ydCBVc10oaHR0cHM6Ly9wcm9qZWN0YnViYmxlYnVyc3QuY29tL1N1cHBvcnQrVXMpXFxuXFxuIyMgU2VuZCBJdFxcblBlcnNvbmFsaXNlIHRoZSBtZXNzYWdlIGJlbG93XFxuXFxuYDtcblxuICAgXG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsc0JBQWdKOzs7QUNBekksSUFBTSxjQUFOLE1BQWlCO0FBMkR4QjtBQTNEYSxZQUNLLFdBQVc7QUFBQTtBQUFBO0FBQUE7QUFEaEIsWUFFTSxZQUFZO0FBQUE7QUFGbEIsWUFHSyx1QkFBdUI7QUFINUIsWUFJSyxpQkFBaUI7QUFKdEIsWUFLSyw2QkFBNkI7QUFMbEMsWUFNSywyQkFBMkI7QUFOaEMsWUFPSyxvQkFBb0I7QUFQekIsWUFRSyxNQUFNO0FBUlgsWUFTSyx5QkFBeUI7QUFUOUIsWUFVSyx1QkFBdUI7QUFWNUIsWUFXSyxtQkFBbUI7QUFYeEIsWUFZSyxrQkFBa0I7QUFadkIsWUFhSyxrQkFBa0I7QUFidkIsWUFjSyxxQkFBcUI7QUFkMUIsWUFlSyxxQkFBcUI7QUFmMUIsWUFnQkssbUJBQW1CO0FBaEJ4QixZQWlCSyxzQkFBc0I7QUFqQjNCLFlBa0JLLGtCQUFrQjtBQWxCdkIsWUFtQkssbUJBQW1CO0FBbkJ4QixZQW9CSyxlQUFlO0FBQUE7QUFBQTtBQXBCcEIsWUF3QkssZUFBZTtBQXhCcEIsWUF5QkssZUFBZTtBQXpCcEIsWUEwQkssaUJBQWlCO0FBMUJ0QixZQTJCSyxXQUFXO0FBM0JoQixZQTRCSyxZQUFZO0FBNUJqQixZQTZCSyxhQUFhO0FBN0JsQixZQThCSyxXQUFXO0FBOUJoQixZQStCSyxnQkFBZ0I7QUFBQTtBQUFBO0FBL0JyQixZQWdDSyx5QkFBeUI7QUFBQTtBQUFBO0FBaEM5QixZQWlDSyxzQkFBc0I7QUFBQTtBQUFBO0FBQUE7QUFqQzNCLFlBb0NLLGdCQUFnQjtBQXBDckIsWUFxQ0ssc0JBQXNCO0FBckMzQixZQXNDSyxnQkFBZ0I7QUFBQTtBQUFBO0FBQUE7QUF0Q3JCLFlBdUNLLDBCQUEwQjtBQXZDL0IsWUF3Q0ssa0JBQWtCO0FBeEN2QixZQXlDSywrQkFBK0I7QUF6Q3BDLFlBMENLLDRCQUE0QjtBQTFDakMsWUEyQ0ssd0JBQXdCO0FBM0M3QixZQTRDSyw2QkFBNkI7QUE1Q2xDLFlBNkNLLDZCQUE2QjtBQTdDbEMsWUE4Q0ssNkJBQTZCO0FBOUNsQyxZQStDSyxpQ0FBaUM7QUEvQ3RDLFlBZ0RLLGlDQUFpQztBQWhEdEMsWUFpREssNEJBQTRCO0FBakRqQyxZQWtESyw0QkFBNEI7QUFsRGpDLFlBbURLLGlDQUFpQztBQW5EdEMsWUFvREssd0JBQXdCO0FBcEQ3QixZQXFESyx3QkFBd0I7QUFyRDdCLFlBc0RLLCtCQUErQjtBQXREcEMsWUF1REssbUJBQW1CO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBdkR4QixZQXdESyw0QkFBNEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOzs7QURkOUMsSUFBTSxtQkFBK0M7QUFBQSxFQUNwRCxpQkFBaUI7QUFBQSxFQUNqQix1QkFBdUI7QUFBQSxFQUN2QixlQUFlO0FBQUEsRUFDZixxQkFBcUI7QUFBQSxFQUNyQixjQUFjO0FBRWY7QUFFQSxTQUFTLGFBQWEsT0FBNkI7QUFDbEQsUUFBTSxTQUFvQixDQUFDO0FBQzNCLE1BQUksVUFBVTtBQUNkLGFBQVcsUUFBUSxPQUFPO0FBQ3pCLFFBQUksWUFBWTtBQUNoQixhQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sUUFBUSxLQUFLO0FBQ3ZDLFVBQUksT0FBTyxDQUFDLEVBQUUsZ0JBQWdCLEtBQUssY0FBYztBQUNoRCxvQkFBWTtBQUNaLGdCQUFRLEtBQUssOENBQThDLEtBQUssY0FBYztBQUM5RTtBQUFBLE1BQ0Q7QUFDQSxVQUFLLE9BQU8sQ0FBQyxFQUFFLGFBQWEsS0FBSyxhQUFlLE9BQU8sQ0FBQyxFQUFFLFlBQVksS0FBSyxVQUFXO0FBQ3JGLG9CQUFZO0FBQ1osZ0JBQVEsS0FBSyxvREFBb0QsS0FBSyxhQUFhLEtBQUssVUFBVTtBQUNsRztBQUFBLE1BQ0Q7QUFBQSxJQUNEO0FBQ0EsUUFBSSxDQUFDLFdBQVc7QUFDZixhQUFPLEtBQUssSUFBSTtBQUFBLElBQ2pCO0FBQUEsRUFDRDtBQUVBLFNBQU87QUFDUjtBQUNBLElBQU0sZ0JBQWdCLENBQUMsVUFBa0I7QUFDeEMsTUFBSTtBQUNILFdBQU8sTUFDTCxZQUFZLEVBQ1o7QUFBQSxNQUNBO0FBQUEsSUFDRDtBQUFBLEVBQ0YsU0FBUyxHQUFQO0FBQ0QsWUFBUSxNQUFNLHdDQUF3QyxPQUFPO0FBQUEsRUFDOUQ7QUFDQSxTQUFPO0FBQ1I7QUFFQSxTQUFTLGFBQWEsU0FBMkI7QUFDaEQsTUFBSSxpQkFBaUI7QUFDckIsTUFBSSxXQUFXLFFBQVEsV0FBVyxRQUFXO0FBQzVDLFlBQVEsS0FBSyxxQ0FBcUM7QUFDbEQscUJBQWlCO0FBQUEsRUFDbEIsV0FBVyxDQUFDLGNBQWMsUUFBUSxZQUFZLEdBQUc7QUFDaEQsWUFBUSxLQUFLLGdDQUFnQyxRQUFRLGNBQWM7QUFDbkUscUJBQWlCO0FBQUEsRUFDbEIsV0FBVyxRQUFRLFVBQVUsVUFBVSxHQUFHO0FBQ3pDLFlBQVEsS0FBSyx5Q0FBeUM7QUFDdEQscUJBQWlCO0FBQUEsRUFDbEIsV0FBVyxRQUFRLFNBQVMsVUFBVSxHQUFHO0FBQ3hDLFlBQVEsS0FBSyx3Q0FBd0M7QUFDckQscUJBQWlCO0FBQUEsRUFDbEI7QUFFQSxTQUFPO0FBQ1I7QUFFQSxTQUFTLFdBQVcsVUFBa0IsS0FBbUI7QUFDeEQsUUFBTSxlQUFlLElBQUksTUFBTSxzQkFBc0IsUUFBUTtBQUM3RCxNQUFJLHdCQUF3Qix1QkFBTztBQUNsQyxXQUFPO0FBQUEsRUFDUjtBQUNBLFNBQU87QUFFUjtBQUVBLFNBQVMsYUFBYSxVQUFrQixLQUFtQjtBQUMxRCxRQUFNLGVBQWUsSUFBSSxNQUFNLHNCQUFzQixRQUFRO0FBRTdELE1BQUksd0JBQXdCLHlCQUFTO0FBQ3BDLFdBQU87QUFBQSxFQUNSO0FBQ0EsU0FBTztBQUVSO0FBSUEsSUFBcUIscUJBQXJCLGNBQWdELHVCQUFPO0FBQUEsRUFLdEQsTUFBTSxTQUF3QjtBQUM3QixVQUFNLEtBQUssYUFBYTtBQUd4QixTQUFLLFdBQVc7QUFBQSxNQUNmLElBQUk7QUFBQSxNQUNKLE1BQU0sWUFBVTtBQUFBLE1BQ2hCLFVBQVUsWUFBWTtBQUNyQixnQkFBUSxNQUFNLG1DQUFtQztBQUNqRCxjQUFNLHFCQUErQixDQUFDO0FBRXRDLGFBQUssMkJBQTJCLElBQUksRUFBRSxRQUFRLFNBQU87QUFDcEQsNkJBQW1CLFFBQVEsR0FBRztBQUFBLFFBQy9CLENBQUM7QUFFRCxjQUFNLFdBQXNCLE1BQU0sS0FBSyxlQUFlLEtBQUssU0FBUyxZQUFZO0FBRWhGLGNBQU0sZUFBZSxJQUFJLHNCQUFzQixLQUFLLEtBQUssTUFBTSxvQkFBb0IsVUFBVSxLQUFLLFNBQVMsdUJBQXVCLEtBQUssU0FBUyxlQUFlLEVBQUUsS0FBSztBQUFBLE1BQ3ZLO0FBQUEsSUFDRCxDQUFDO0FBR0QsU0FBSyxXQUFXO0FBQUEsTUFDZixJQUFJO0FBQUEsTUFDSixNQUFNLFlBQVU7QUFBQSxNQUNoQixVQUFVLFlBQVk7QUFDckIsZ0JBQVEsTUFBTSxnQ0FBZ0M7QUFDOUMsY0FBTSxtQkFBNkIsQ0FBQztBQUNwQyxhQUFLLDJCQUEyQixLQUFLLEVBQUUsUUFBUSxTQUFPO0FBQ3JELDJCQUFpQixRQUFRLEdBQUc7QUFBQSxRQUM3QixDQUFDO0FBRUQsY0FBTSxXQUFzQixDQUFDO0FBQzdCLGNBQU0sZUFBZSxJQUFJLHNCQUFzQixLQUFLLEtBQUssT0FBTyxrQkFBa0IsVUFBVSxLQUFLLFNBQVMscUJBQXFCLEtBQUssU0FBUyxhQUFhLEVBQUUsS0FBSztBQUFBLE1BQ2xLO0FBQUEsSUFDRCxDQUFDO0FBRUQsU0FBSyxjQUFjLElBQUksb0JBQW9CLEtBQUssS0FBSyxJQUFJLENBQUM7QUFBQSxFQUMzRDtBQUFBLEVBSUEsTUFBTSxlQUFlLGdCQUE0QztBQUNoRSxVQUFNLFdBQXNCLENBQUM7QUFFN0IsVUFBTSxlQUFlLEtBQUssSUFBSSxNQUFNLHNCQUFzQixjQUFjO0FBRXhFLFFBQUksd0JBQXdCLHVCQUFPO0FBQ2xDLFVBQUksZUFBdUIsTUFBTSxLQUFLLElBQUksTUFBTSxXQUFXLFlBQVk7QUFDdkUsWUFBTSxZQUFZLGFBQWEsTUFBTSxJQUFJO0FBQ3pDLGVBQVMsSUFBSSxHQUFHLElBQUksVUFBVSxTQUFTLEdBQUcsS0FBSztBQUU5QyxjQUFNLENBQUMsT0FBTyxXQUFXLFVBQVUsWUFBWSxJQUFJLFVBQVUsQ0FBQyxFQUFFLE1BQU0sR0FBRztBQUN6RSxjQUFNLFVBQW1CLEVBQUUsT0FBTyxXQUFXLFVBQVUsYUFBYTtBQUNwRSxZQUFJLFdBQVc7QUFDZCxrQkFBUSxNQUFNLGFBQWEsUUFBUSxhQUFhLFFBQVEsaUJBQWlCLFFBQVEsZ0JBQWdCLFFBQVEsY0FBYztBQUN4SCxZQUFJLGFBQWEsT0FBTyxHQUFHO0FBQzFCLG1CQUFTLFFBQVEsT0FBTztBQUFBLFFBQ3pCLE9BQU87QUFDTixrQkFBUSxLQUFLLHFDQUFxQyxTQUFTO0FBQUEsUUFDNUQ7QUFBQSxNQUVEO0FBQ0EsYUFBTyxhQUFhLFFBQVE7QUFBQSxJQUM3QjtBQUVBLFdBQU87QUFBQSxFQUNSO0FBQUEsRUFFQSwyQkFBMkIsaUJBQW9DO0FBRTlELFVBQU0sYUFBdUIsQ0FBQztBQUU5QixhQUFTLHlCQUF5QixLQUE0QjtBQUM3RCxZQUFNLFFBQVE7QUFDZCxZQUFNLFFBQVEsSUFBSSxNQUFNLEtBQUs7QUFFN0IsYUFBTyxRQUFRLE1BQU0sQ0FBQyxJQUFJO0FBQUEsSUFDM0I7QUFFQSxVQUFNLGVBQWUsa0JBQWtCLEtBQUssSUFBSSxNQUFNLHNCQUFzQixLQUFLLFNBQVMsZUFBZSxJQUFJLEtBQUssSUFBSSxNQUFNLHNCQUFzQixLQUFLLFNBQVMsYUFBYTtBQUM3SyxRQUFJLGFBQWE7QUFHakIsUUFBSSx3QkFBd0IseUJBQVM7QUFDcEMsZUFBUyxTQUFTLGFBQWEsVUFBVTtBQUN4QyxZQUFJLGlCQUFpQix1QkFBTztBQUFBLFFBRTVCLE9BQU87QUFDTixnQkFBTSxpQkFBaUIsS0FBSyxJQUFJLE1BQU0sc0JBQXNCLE1BQU0sSUFBSTtBQUN0RSxjQUFJLDBCQUEwQix5QkFBUztBQUN0QyxxQkFBUyxjQUFjLGVBQWUsVUFBVTtBQUMvQyxrQkFBSSxzQkFBc0IsdUJBQU87QUFDaEMsc0JBQU0sWUFBWSx5QkFBeUIsV0FBVyxJQUFJO0FBQzFELG9CQUFJLGFBQWEsTUFBTTtBQUN0QiwwQkFBUSxNQUFNLHNCQUFzQixXQUFXO0FBQy9DLHNCQUFJLENBQUMsV0FBVyxTQUFTLFNBQVMsR0FBRztBQUNwQywrQkFBVyxRQUFRLFNBQVM7QUFBQSxrQkFDN0I7QUFBQSxnQkFFRCxPQUFPO0FBQ04sMEJBQVEsS0FBSywwQ0FBMEMsV0FBVyxNQUFNO0FBQUEsZ0JBQ3pFO0FBQUEsY0FDRDtBQUFBLFlBQ0Q7QUFBQSxVQUNEO0FBQUEsUUFDRDtBQUFBLE1BRUQ7QUFDQSxjQUFRLE1BQU0sY0FBYyxZQUFZO0FBQUEsSUFDekMsT0FBTztBQUNOLGNBQVEsS0FBSyw0Q0FBNEMsY0FBYztBQUFBLElBQ3hFO0FBRUEsV0FBTztBQUFBLEVBQ1I7QUFBQSxFQUlBLFdBQVc7QUFDVixZQUFRLEtBQUssd0NBQXdDO0FBQUEsRUFDdEQ7QUFBQSxFQUdBLE1BQU0sZUFBZTtBQUNwQixTQUFLLFdBQVcsT0FBTyxPQUFPLENBQUMsR0FBRyxrQkFBa0IsTUFBTSxLQUFLLFNBQVMsQ0FBQztBQUFBLEVBQzFFO0FBQUEsRUFFQSxNQUFNLGVBQWU7QUFDcEIsVUFBTSxLQUFLLFNBQVMsS0FBSyxRQUFRO0FBQUEsRUFDbEM7QUFDRDtBQUlBLElBQU0sd0JBQU4sY0FBb0MsNkJBQXFCO0FBQUEsRUFTeEQsWUFBWSxLQUFVLGlCQUEwQixZQUFzQixVQUFxQixjQUFzQiwwQkFBa0M7QUFDbEosVUFBTSxHQUFHO0FBQ1QsU0FBSyxRQUFRLElBQUk7QUFDakIsU0FBSyxrQkFBa0I7QUFDdkIsU0FBSyxhQUFhO0FBQ2xCLFNBQUssV0FBVztBQUNoQixTQUFLLGVBQWU7QUFDcEIsU0FBSywyQkFBMkI7QUFBQSxFQUNqQztBQUFBO0FBQUEsRUFFQSxlQUFlLE9BQXlCO0FBQ3ZDLFNBQUssV0FBVyxLQUFLO0FBQ3JCLFFBQUksS0FBSyxXQUFXLENBQUMsS0FBSyxZQUFVLGdCQUFnQjtBQUNuRCxZQUFNLFFBQVEsS0FBSyxXQUFXLFFBQVEsWUFBVSxjQUFjO0FBRTlELFdBQUssV0FBVyxRQUFRLFlBQVUsY0FBYztBQUFBLElBQ2pEO0FBQ0EsV0FBTyxLQUFLLFdBQVc7QUFBQSxNQUFPLENBQUMsUUFDOUIsSUFBSSxZQUFZLEVBQUUsU0FBUyxNQUFNLFlBQVksQ0FBQztBQUFBLElBQy9DO0FBQUEsRUFDRDtBQUFBO0FBQUEsRUFHQSxpQkFBaUIsS0FBYSxJQUFpQjtBQUM5QyxPQUFHLFNBQVMsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQUEsRUFFakM7QUFBQTtBQUFBLEVBR0EsTUFBTSxtQkFBbUIsS0FBYSxLQUFpQztBQUV0RSxTQUFLLGFBQWEsS0FBSyxZQUFZO0FBQ25DLFFBQUksYUFBYSxZQUFVO0FBRTNCLGlCQUFhLFdBQVcsT0FBTyxZQUFVLGFBQWE7QUFDdEQsaUJBQWEsV0FBVyxPQUFPLFlBQVUsNEJBQTRCO0FBQ3JFLGlCQUFhLFdBQVcsT0FBTyxZQUFVLHlCQUF5QjtBQUNsRSxpQkFBYSxXQUFXLE9BQU8sWUFBVSxxQkFBcUI7QUFDOUQsaUJBQWEsV0FBVyxPQUFPLFlBQVUsMEJBQTBCO0FBQ25FLGlCQUFhLFdBQVcsT0FBTyxZQUFVLDBCQUEwQjtBQUNuRSxpQkFBYSxXQUFXLE9BQU8sWUFBVSwwQkFBMEI7QUFDbkUsaUJBQWEsV0FBVyxPQUFPLFlBQVUsOEJBQThCO0FBQ3ZFLGlCQUFhLFdBQVcsT0FBTyxZQUFVLDhCQUE4QjtBQUN2RSxpQkFBYSxXQUFXLE9BQU8sWUFBVSx5QkFBeUI7QUFDbEUsaUJBQWEsV0FBVyxPQUFPLFlBQVUseUJBQXlCO0FBQ2xFLGlCQUFhLFdBQVcsT0FBTyxZQUFVLDhCQUE4QjtBQUN2RSxpQkFBYSxXQUFXLE9BQU8sWUFBVSxxQkFBcUI7QUFDOUQsaUJBQWEsV0FBVyxPQUFPLFlBQVUscUJBQXFCO0FBRzlELFNBQUssV0FBVyxZQUFVLHlCQUF5QixVQUFVO0FBRzdELFFBQUksT0FBTyxZQUFVLGdCQUFnQjtBQUNwQyxXQUFLLGFBQWEsQ0FBQyxHQUFHO0FBQUEsSUFDdkIsT0FBTztBQUNOLFdBQUssV0FBVyxNQUFNO0FBQUEsSUFDdkI7QUFFQSxRQUFJLDZCQUE2QjtBQUVqQyxpQkFBYTtBQUNiLGFBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxXQUFXLFFBQVEsS0FBSztBQUNoRCxVQUFJLGtCQUFrQjtBQUN0QixjQUFRLE1BQU0sT0FBTyxPQUFPLEtBQUssV0FBVyxDQUFDLEdBQUc7QUFFaEQsVUFBSSxXQUFXLE1BQU0sS0FBSyw4QkFBOEIsS0FBSyxXQUFXLENBQUMsQ0FBQztBQUcxRSxZQUFNLFlBQVksS0FBSyxhQUFhLE9BQU8sWUFBVSxvQkFBb0IsRUFBRSxPQUFPLEtBQUssV0FBVyxDQUFDLENBQUM7QUFDcEcsVUFBSSxZQUFZLE1BQU07QUFFckIsYUFBSyxhQUFhLFNBQVM7QUFFM0IsMEJBQWtCLFNBQVM7QUFDM0IsWUFBSSxLQUFLLFNBQVMsU0FBUyxHQUFHO0FBQzdCLG1CQUFTLElBQUksR0FBRyxJQUFJLEtBQUssU0FBUyxRQUFRLEtBQUs7QUFDOUMscUJBQVMsSUFBSSxHQUFHLElBQUksU0FBUyxRQUFRLEtBQUs7QUFDekMsa0JBQUksVUFBVSxTQUFTLENBQUM7QUFDeEIsbUJBQUssa0JBQWtCLEtBQUssa0JBQWtCLFNBQVMsV0FBVyxLQUFLLFdBQVcsQ0FBQyxHQUFHLEtBQUssU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssZ0JBQWdCLFNBQVMsV0FBVyxLQUFLLFdBQVcsQ0FBQyxDQUFDO0FBQ3hLO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFBQSxRQUNELE9BQU87QUFDTixtQkFBUyxJQUFJLEdBQUcsSUFBSSxTQUFTLFFBQVEsS0FBSztBQUN6QyxnQkFBSSxVQUFVLFNBQVMsQ0FBQztBQUN4QixpQkFBSyxrQkFBa0IsS0FBSyxrQkFBa0IsU0FBUyxXQUFXLEtBQUssV0FBVyxDQUFDLENBQUMsSUFBSSxLQUFLLGdCQUFnQixTQUFTLFdBQVcsS0FBSyxXQUFXLENBQUMsQ0FBQztBQUNuSjtBQUFBLFVBQ0Q7QUFBQSxRQUNEO0FBQUEsTUFFRCxPQUFPO0FBQ04sZ0JBQVEsS0FBSyw2QkFBNkIsS0FBSywyQkFBMkI7QUFBQSxNQUMzRTtBQUFBLElBaUJEO0FBSUEsaUJBQWE7QUFDYixpQkFBYSxXQUFXLE9BQU8sWUFBVSxZQUFZO0FBRXJELFNBQUssV0FBVyxjQUFjLFVBQVU7QUFDeEMsUUFBSSx1QkFBTyxHQUFHLHVDQUF1QztBQUFBLEVBR3REO0FBQUEsRUFFQSxpQkFBaUIsVUFBa0I7QUFDbEMsUUFBSSxRQUFpQjtBQUNyQixRQUFJLFlBQVksTUFBTTtBQUNyQjtBQUFBLElBQ0QsV0FBVyxZQUFZLFFBQVc7QUFDakM7QUFBQSxJQUNELFdBQVcsU0FBUyxTQUFTLE1BQU0sR0FBRztBQUNyQyxjQUFRO0FBQUEsSUFDVDtBQUNBLFdBQU87QUFBQSxFQUNSO0FBQUEsRUFHQSxRQUFRLE1BQWM7QUFDckIsUUFBSSxVQUFVO0FBQ2QsUUFBSSxRQUFRLE1BQU07QUFDakI7QUFBQSxJQUNELFdBQVcsUUFBUSxRQUFXO0FBQzdCO0FBQUEsSUFDRCxXQUFXLFFBQVEsSUFBSTtBQUN0QjtBQUFBLElBQ0QsT0FBTztBQUNOLFVBQUk7QUFDSCxjQUFNLGVBQWUsS0FBSyxNQUFNLEdBQUc7QUFDbkMsa0JBQVUsWUFBVSxlQUFlLE9BQU8sSUFBSTtBQUM5QyxpQkFBUyxJQUFJLEdBQUcsSUFBSSxhQUFhLFFBQVEsS0FBSztBQUM3QyxjQUFJLEtBQUssR0FBRztBQUNYLHNCQUFVLFFBQVEsT0FBTyxHQUFHO0FBQUEsVUFDN0I7QUFDQSxvQkFBVSxRQUFRLE9BQU8sYUFBYSxDQUFDLENBQUM7QUFBQSxRQUN6QztBQUNBLGtCQUFVLFFBQVEsT0FBTyxHQUFHO0FBQUEsTUFDN0IsU0FBUyxHQUFQO0FBQ0QsZ0JBQVEsTUFBTSxvQ0FBb0MsR0FBRztBQUFBLE1BQ3REO0FBQUEsSUFDRDtBQUNBLFdBQU87QUFBQSxFQUNSO0FBQUEsRUFDQSxZQUFZLFVBQWtCO0FBQzdCLFFBQUksY0FBYztBQUNsQixRQUFJLFlBQVksTUFBTTtBQUNyQjtBQUFBLElBQ0QsV0FBVyxZQUFZLFFBQVc7QUFDakM7QUFBQSxJQUNELFdBQVcsWUFBWSxJQUFJO0FBQzFCO0FBQUEsSUFDRCxPQUFPO0FBQ04sVUFBSTtBQUNILHNCQUFjLFlBQVUsbUJBQW1CLE9BQU8sR0FBRyxFQUFFLE9BQU8sU0FBUyxRQUFRLE9BQU8sRUFBRSxDQUFDO0FBQUEsTUFDMUYsU0FBUyxHQUFQO0FBQ0QsZ0JBQVEsTUFBTSxzQ0FBc0MsR0FBRztBQUFBLE1BQ3hEO0FBQUEsSUFFRDtBQUNBLFdBQU87QUFBQSxFQUNSO0FBQUEsRUFDQSxlQUFlLGFBQStCO0FBQzdDLFFBQUksVUFBVTtBQUNkLFFBQUksWUFBWSxLQUFLLFNBQVMsR0FBRztBQUNoQyxZQUFNLFlBQVksWUFBWSxLQUFLLFFBQVEsTUFBTSxHQUFHLEVBQUUsTUFBTSxHQUFHO0FBQy9ELFVBQUksT0FBTztBQUNYLGVBQVMsSUFBSSxHQUFHLElBQUksVUFBVSxRQUFRLEtBQUs7QUFDMUMsZUFBTyxLQUFLLE9BQU8sR0FBRyxFQUFFLE9BQU8sVUFBVSxDQUFDLENBQUMsRUFBRSxPQUFPLEdBQUc7QUFBQSxNQUN4RDtBQUNBLGdCQUFVLFFBQVEsT0FBTyxJQUFJO0FBQUEsSUFDOUI7QUFDQSxXQUFPO0FBQUEsRUFDUjtBQUFBLEVBQ0EsTUFBTSxrQkFBa0IsYUFBdUIsV0FBbUIsVUFBa0IsU0FBbUI7QUFDdEcsVUFBTSxhQUFhLEtBQUssaUJBQWlCLFlBQVksS0FBSztBQUUxRCxRQUFJLFdBQVcsS0FBSyxZQUFZLFlBQVksUUFBUTtBQUNwRCxRQUFJLFlBQVksSUFBSTtBQUNuQixpQkFBVyxLQUFLLE9BQU8sUUFBUTtBQUFBLElBQ2hDO0FBRUEsUUFBSSxPQUFPLEtBQUssUUFBUSxZQUFZLElBQUk7QUFDeEMsUUFBSSxRQUFRLElBQUk7QUFDZixhQUFPLEtBQUssT0FBTyxJQUFJO0FBQUEsSUFDeEI7QUFFQSxRQUFJLHFCQUFxQjtBQUV6QixRQUFJLFlBQVk7QUFDZiwyQkFBcUI7QUFBQTtBQUFBO0FBQUEsU0FBMkMsWUFBWTtBQUFBLFlBQW9CLFdBQVc7QUFBQTtBQUFBLEVBQWMsT0FBTyxZQUFVLHlCQUF5QjtBQUFBLElBRXBLLE9BQU87QUFDTiwyQkFBcUI7QUFBQTtBQUFBO0FBQUEsWUFBOEMsV0FBVztBQUFBO0FBQUEsRUFBYyxPQUFPLFlBQVUseUJBQXlCO0FBQUEsSUFFdkk7QUFJQSxVQUFNLGtCQUE0QixZQUFZLEtBQUssTUFBTSxZQUFVLFVBQVUsQ0FBQztBQUM5RSxRQUFJLHNCQUFzQjtBQUUxQixRQUFJLFlBQVksVUFBVSxVQUFhLFlBQVksT0FBTyxTQUFTLEdBQUc7QUFDckUsNEJBQXNCLFlBQVksT0FBTyxVQUFVLEVBQUUsUUFBUTtBQUFBLElBQzlELE9BQU87QUFDTiw0QkFBc0IsZ0JBQWdCLENBQUM7QUFBQSxJQUN4QztBQUdBLFVBQU0saUJBQWlCLFlBQVksS0FBSyxRQUFRLFlBQVUsUUFBUSxJQUFJLFlBQVUsU0FBUztBQUN6RixVQUFNLGtCQUFrQixZQUFZLEtBQUssVUFBVSxjQUFjO0FBRWpFLFFBQUksa0JBQWtCLFFBQVc7QUFDaEMsVUFBSSxVQUFVO0FBQ2QsVUFBSSxjQUFjO0FBRWxCLFVBQUksU0FBUztBQUNaLGtCQUFVLEdBQUcsWUFBVSxPQUFPLFFBQVEsU0FBUyxRQUFRLGFBQWEsUUFBUSxhQUFhLFlBQVUsV0FBVyxHQUFHO0FBRWpILHNCQUFjLFVBQVUsT0FBTyxHQUFHLEVBQUUsT0FBTyxRQUFRLFlBQVksUUFBUSxXQUFXLE1BQU0sc0JBQXNCLEtBQUs7QUFBQSxNQUNwSCxPQUFPO0FBQ04sa0JBQVUsR0FBRyxZQUFVLFFBQVEsWUFBVSxXQUFXLEdBQUc7QUFDdkQsc0JBQWMsVUFBVSxPQUFPLEdBQUcsRUFBRSxPQUFPLG1CQUFtQixJQUFJO0FBQUEsTUFDbkU7QUFJQSxVQUFJLFVBQVUsTUFBTSxLQUFLLFdBQVcsYUFBYSxrQkFBa0I7QUFHbkUsVUFBSSxtQkFBbUIsdUJBQU87QUFDN0IsWUFBSSxhQUFhO0FBQ2pCLFlBQUksS0FBSztBQUNULGNBQU0sWUFBWSxZQUFVLFNBQVMsT0FBTyxZQUFVLFNBQVM7QUFDL0Qsa0JBQVUsUUFBUSxPQUFPLFNBQVM7QUFHbEMsa0JBQVUsUUFBUSxRQUFRLElBQUksS0FBSztBQUNuQyxhQUFLO0FBQ0wsa0JBQVUsUUFBUSxRQUFRLElBQUksS0FBSztBQUNuQyxhQUFLO0FBQ0wsa0JBQVUsUUFBUSxRQUFRLElBQUksRUFBRTtBQUNoQyxhQUFLO0FBQ0wsa0JBQVUsUUFBUSxRQUFRLElBQUcsRUFBRTtBQUMvQixZQUFJLFNBQVM7QUFDWix1QkFBYSxhQUFhLE9BQU8sT0FBTyxRQUFRO0FBQUEsV0FBMEIsWUFBVTtBQUFBLENBQXFCO0FBQUEsUUFDMUcsT0FBTztBQUVOLHVCQUFhLGFBQWEsT0FBTztBQUFBLFdBQXFDLFlBQVU7QUFBQSxDQUFxQjtBQUFBLFFBQ3RHO0FBRUEscUJBQWEsV0FBVyxPQUFPLFVBQVc7QUFBQSxDQUFhLEVBQUUsT0FBTyxPQUFPO0FBQ3ZFLFlBQUksWUFBWSxVQUFVLFNBQVMsR0FBRztBQUNyQyx1QkFBYSxXQUFXLE9BQU8sWUFBVSxtQkFBbUIsRUFBRSxPQUFPLFlBQVksU0FBUyxFQUFFLE9BQU87QUFBQSxDQUFJO0FBQUEsUUFDeEc7QUFDQSxxQkFBYSxXQUFXLE9BQU8sK1BBQStQO0FBb0I5UixxQkFBYSxXQUFXLE9BQU8sWUFBVSxzQkFBc0I7QUFDL0QscUJBQWEsV0FBVyxPQUFPLFlBQVUsbUJBQW1CO0FBQzVELFlBQUksWUFBWSxNQUFNLFNBQVMsR0FBRztBQUNqQyx1QkFBYSxXQUFXLE9BQU8sWUFBVSxRQUFRLEVBQUUsT0FBTyxZQUFZLEtBQUs7QUFBQSxRQUM1RTtBQUNBLHFCQUFhLFdBQVcsT0FBTyxZQUFVLGFBQWE7QUFDdEQsWUFBSSxZQUFZLE1BQU0sU0FBUyxHQUFHO0FBRWpDLHVCQUFhLFdBQVcsT0FBTyxZQUFZLEtBQUs7QUFBQSxRQUNqRDtBQUVBLHFCQUFhLFdBQVcsT0FBTyxZQUFVLFFBQVEsRUFBRSxPQUFPLFlBQVUsZ0JBQWdCO0FBRXBGLFlBQUk7QUFDSCxnQkFBTSxLQUFLLElBQUksTUFBTSxPQUFPLFNBQVMsVUFBVTtBQUFBLFFBQ2hELFNBQVMsR0FBUDtBQUNELGtCQUFRLE1BQU0sNkJBQTZCLHNCQUFzQixHQUFHO0FBQUEsUUFDckU7QUFBQSxNQUNELE9BQ0s7QUFDSixnQkFBUSxNQUFNLHFDQUFxQyxhQUFhO0FBQUEsTUFDakU7QUFBQSxJQUNEO0FBQUEsRUFDRDtBQUFBLEVBR0EsTUFBTSxnQkFBZ0IsV0FBcUIsV0FBbUIsVUFBa0IsU0FBbUI7QUFDbEcsVUFBTSxhQUFhLEtBQUssaUJBQWlCLFVBQVUsS0FBSztBQUV4RCxRQUFJLFdBQVcsS0FBSyxZQUFZLFVBQVUsUUFBUTtBQUNsRCxRQUFJLFlBQVksSUFBSTtBQUNuQixpQkFBVyxLQUFLLE9BQU8sUUFBUTtBQUFBLElBQ2hDO0FBRUEsUUFBSSxPQUFPLEtBQUssUUFBUSxVQUFVLElBQUk7QUFDdEMsUUFBSSxRQUFRLElBQUk7QUFDZixhQUFPLEtBQUssT0FBTyxJQUFJO0FBQUEsSUFDeEI7QUFFQSxRQUFJLHFCQUFxQjtBQUV6QixRQUFJLFlBQVk7QUFDZiwyQkFBcUI7QUFBQTtBQUFBO0FBQUEsU0FBMkMsVUFBVTtBQUFBLFlBQW9CO0FBQUE7QUFBQSxFQUEyQixXQUFXO0FBQUE7QUFBQSxFQUFjLE9BQU8sWUFBVSxnQkFBZ0I7QUFBQSxJQUVwTCxPQUFPO0FBQ04sMkJBQXFCO0FBQUE7QUFBQTtBQUFBLFlBQThDO0FBQUE7QUFBQSxFQUEyQixXQUFXO0FBQUE7QUFBQSxFQUFjLE9BQU8sWUFBVSxnQkFBZ0I7QUFBQSxJQUV6SjtBQUdBLFVBQU0sZ0JBQTBCLFVBQVUsS0FBSyxNQUFNLFlBQVUsVUFBVSxDQUFDO0FBQzFFLFFBQUksb0JBQW9CO0FBRXhCLFFBQUksVUFBVSxVQUFVLFVBQWEsVUFBVSxPQUFPLFNBQVMsR0FBRztBQUNqRSwwQkFBb0IsVUFBVSxPQUFPLFVBQVUsRUFBRSxRQUFRO0FBQUEsSUFDMUQsT0FBTztBQUNOLDBCQUFvQixjQUFjLENBQUM7QUFBQSxJQUNwQztBQUdBLFVBQU0saUJBQWlCLFVBQVUsS0FBSyxRQUFRLFlBQVUsUUFBUSxJQUFJLFlBQVUsU0FBUztBQUN2RixVQUFNLGtCQUFrQixVQUFVLEtBQUssVUFBVSxjQUFjO0FBRS9ELFFBQUksa0JBQWtCLFFBQVc7QUFDaEMsVUFBSSxVQUFVO0FBQ2QsVUFBSSxjQUFjO0FBRWxCLGdCQUFVO0FBQ1Ysb0JBQWMsVUFBVSxPQUFPLEdBQUcsRUFBRSxPQUFPLGlCQUFpQixJQUFJO0FBSWhFLFVBQUksVUFBVSxNQUFNLEtBQUssV0FBVyxhQUFhLGtCQUFrQjtBQUduRSxVQUFJLG1CQUFtQix1QkFBTztBQUM3QixZQUFJLGFBQWE7QUFDakIsWUFBSSxLQUFLO0FBQ1QsY0FBTSxZQUFZLFlBQVUsU0FBUyxPQUFPLFlBQVUsU0FBUztBQUMvRCxrQkFBVSxRQUFRLE9BQU8sU0FBUztBQUlsQyxhQUFLO0FBQ0wsa0JBQVUsUUFBUSxRQUFRLElBQUksRUFBRTtBQUdoQyxxQkFBYSxXQUFXLE9BQU8sVUFBVSxJQUFJO0FBQzdDLFlBQUksVUFBVSxVQUFVLFNBQVMsR0FBRztBQUNuQyx1QkFBYSxXQUFXLE9BQU8sWUFBVSxtQkFBbUIsRUFBRSxPQUFPLFVBQVUsU0FBUyxFQUFFLE9BQU87QUFBQSxDQUFJO0FBQUEsUUFDdEc7QUFDQSxxQkFBYSxXQUFXLE9BQU8sZUFBZSxZQUFVLDRCQUE0QjtBQW9CcEYscUJBQWEsV0FBVyxPQUFPLFlBQVUsc0JBQXNCO0FBQy9ELHFCQUFhLFdBQVcsT0FBTyxZQUFVLG1CQUFtQjtBQUM1RCxZQUFJLFVBQVUsTUFBTSxTQUFTLEdBQUc7QUFDL0IsdUJBQWEsV0FBVyxPQUFPLFlBQVUsUUFBUSxFQUFFLE9BQU8sVUFBVSxLQUFLO0FBQUEsUUFDMUU7QUFDQSxxQkFBYSxXQUFXLE9BQU8sWUFBVSxhQUFhO0FBQ3RELFlBQUksVUFBVSxNQUFNLFNBQVMsR0FBRztBQUUvQix1QkFBYSxXQUFXLE9BQU8sVUFBVSxLQUFLO0FBQUEsUUFDL0M7QUFFQSxxQkFBYSxXQUFXLE9BQU8sWUFBVSxRQUFRLEVBQUUsT0FBTyxZQUFVLGdCQUFnQjtBQUVwRixZQUFJO0FBQ0gsZ0JBQU0sS0FBSyxJQUFJLE1BQU0sT0FBTyxTQUFTLFVBQVU7QUFBQSxRQUNoRCxTQUFTLEdBQVA7QUFDRCxrQkFBUSxNQUFNLDZCQUE2QixzQkFBc0IsR0FBRztBQUFBLFFBQ3JFO0FBQUEsTUFDRCxPQUNLO0FBQ0osZ0JBQVEsTUFBTSxxQ0FBcUMsYUFBYTtBQUFBLE1BQ2pFO0FBQUEsSUFDRDtBQUFBLEVBQ0Q7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFRQSxNQUFNLFdBQVcsYUFBcUIsU0FBd0M7QUFDN0UsUUFBSTtBQUNILFVBQUksQ0FBQyxXQUFXLGFBQWEsS0FBSyxHQUFHLEdBQUc7QUFDdkMsWUFBSSxjQUFjLE1BQU0sS0FBSyxJQUFJLE1BQU0sT0FBTyxhQUFhLE9BQU87QUFDbEUsZ0JBQVEsTUFBTSxzQkFBc0IsYUFBYTtBQUNqRCxlQUFPO0FBQUEsTUFDUjtBQUFBLElBRUQsU0FBUyxHQUFQO0FBQ0QsY0FBUSxNQUFNLDhDQUE4QyxHQUFHO0FBQUEsSUFDaEU7QUFDQSxXQUFPO0FBQUEsRUFDUjtBQUFBLEVBQ0EsTUFBTSxhQUFhLFdBQW1CO0FBQ3JDLFFBQUk7QUFDSCxVQUFJLENBQUMsYUFBYSxXQUFXLEtBQUssR0FBRyxHQUFHO0FBQ3ZDLGNBQU0sS0FBSyxJQUFJLE1BQU0sYUFBYSxTQUFTO0FBQUEsTUFFNUM7QUFBQSxJQUVELFNBQVMsR0FBUDtBQUNELGNBQVEsTUFBTSxDQUFDO0FBQUEsSUFDaEI7QUFBQSxFQUNEO0FBQUE7QUFBQSxFQUdBLE1BQU0sOEJBQThCLFVBQThDO0FBRWpGLFFBQUk7QUFFSCxZQUFNLGVBQWUsS0FBSyxJQUFJLE1BQU0sc0JBQXNCLEtBQUsseUJBQXlCLE9BQU8sWUFBVSxxQkFBcUIsT0FBTyxRQUFRLENBQUMsQ0FBQztBQUUvSSxVQUFJLHdCQUF3Qix5QkFBUztBQUNwQyxjQUFNLGVBQTJCLENBQUM7QUFDbEMsaUJBQVMsU0FBUyxhQUFhLFVBQVU7QUFDeEMsY0FBSSxpQkFBaUIsdUJBQU87QUFDM0IsZ0JBQUksTUFBTSxVQUFVLFNBQVMsSUFBSSxHQUFHO0FBQ25DLGtCQUFJLG1CQUFtQixNQUFNLEtBQUssSUFBSSxNQUFNLFdBQVcsS0FBSztBQUM1RCxvQkFBTSxRQUFRLE1BQU0sS0FBSyxZQUFZLFlBQVUsb0JBQW9CO0FBQ25FLGtCQUFJLFNBQVMsUUFBVztBQUN2QixvQkFBSSxrQkFBa0IsTUFBTSxPQUFPO0FBQ25DLHNCQUFNLGNBQXdCLEVBQUUsTUFBTSxJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksTUFBTSxJQUFJLFFBQVEsSUFBSSxVQUFVLElBQUksT0FBTyxJQUFJLFFBQVEsSUFBSSxXQUFXLEdBQUc7QUFDekksNEJBQVksT0FBTyxnQkFBZ0IsVUFBVSxRQUFRLEdBQUcsZ0JBQWdCLFNBQVMsQ0FBQztBQUVsRixzQkFBTSxnQkFBZ0IsaUJBQWlCLE1BQU0sSUFBSTtBQUNqRCxzQkFBTSxZQUFZLFlBQVUsU0FBUyxPQUFPLFlBQVUsU0FBUztBQUMvRCx5QkFBUyxJQUFJLEdBQUcsSUFBSSxjQUFjLFFBQVEsS0FBSztBQUU5QyxzQkFBSSxjQUFjLENBQUMsRUFBRSxTQUFTLFlBQVUsZUFBZSxHQUFHO0FBQ3pELGdDQUFZLFFBQVEsY0FBYyxDQUFDLEVBQUUsTUFBTSxZQUFVLGVBQWUsRUFBRSxDQUFDO0FBQUEsa0JBQ3hFLFdBQVcsY0FBYyxDQUFDLEVBQUUsU0FBUyxZQUFVLGVBQWUsR0FBRztBQUNoRSxnQ0FBWSxRQUFRLGNBQWMsQ0FBQyxFQUFFLE1BQU0sWUFBVSxlQUFlLEVBQUUsQ0FBQztBQUFBLGtCQUV4RSxXQUFXLGNBQWMsQ0FBQyxFQUFFLFNBQVMsWUFBVSxjQUFjLEdBQUc7QUFDL0QsZ0NBQVksT0FBTyxjQUFjLENBQUMsRUFBRSxNQUFNLFlBQVUsY0FBYyxFQUFFLENBQUM7QUFBQSxrQkFDdEUsV0FBVyxjQUFjLENBQUMsRUFBRSxTQUFTLFlBQVUsa0JBQWtCLEdBQUc7QUFDbkUsZ0NBQVksU0FBUyxjQUFjLENBQUMsRUFBRSxNQUFNLFlBQVUsa0JBQWtCLEVBQUUsQ0FBQztBQUFBLGtCQUM1RSxXQUFXLGNBQWMsQ0FBQyxFQUFFLFNBQVMsWUFBVSxrQkFBa0IsR0FBRztBQUNuRSxnQ0FBWSxXQUFXLGNBQWMsQ0FBQyxFQUFFLE1BQU0sWUFBVSxrQkFBa0IsRUFBRSxDQUFDO0FBQUEsa0JBQzlFLFdBQVcsY0FBYyxDQUFDLEVBQUUsU0FBUyxZQUFVLGVBQWUsR0FBRztBQUNoRSxnQ0FBWSxRQUFRLGNBQWMsQ0FBQyxFQUFFLE1BQU0sWUFBVSxlQUFlLEVBQUUsQ0FBQztBQUFBLGtCQUN4RSxXQUFXLGNBQWMsQ0FBQyxFQUFFLFNBQVMsWUFBVSxnQkFBZ0IsR0FBRztBQUNqRSxnQ0FBWSxTQUFTLGNBQWMsQ0FBQyxFQUFFLE1BQU0sWUFBVSxnQkFBZ0IsRUFBRSxDQUFDO0FBQUEsa0JBQzFFLFdBQVcsY0FBYyxDQUFDLEVBQUUsU0FBUyxZQUFVLG1CQUFtQixHQUFHO0FBQ3BFLGdDQUFZLFlBQVksY0FBYyxDQUFDLEVBQUUsTUFBTSxZQUFVLG1CQUFtQixFQUFFLENBQUM7QUFBQSxrQkFDaEYsV0FBVyxjQUFjLENBQUMsRUFBRSxTQUFTLFlBQVUsZ0JBQWdCLEdBQUc7QUFDakU7QUFBQSxrQkFDRCxPQUFPO0FBQ04sZ0NBQVksUUFBUSxVQUFVLE9BQU8sY0FBYyxDQUFDLENBQUM7QUFBQSxrQkFDdEQ7QUFBQSxnQkFFRDtBQUNBLDZCQUFhLFFBQVEsV0FBVztBQUFBLGNBQ2pDO0FBQUEsWUFDRDtBQUFBLFVBQ0Q7QUFBQSxRQUNEO0FBRUEsZUFBTztBQUFBLE1BQ1IsT0FBTztBQUNOLGdCQUFRLEtBQUssMERBQTBELEtBQUsseUJBQXlCLE9BQU8sUUFBUSxHQUFHO0FBQ3ZILGVBQU87QUFBQSxNQUNSO0FBQUEsSUFDRCxTQUFTLEdBQVA7QUFDRCxjQUFRLE1BQU0sQ0FBQztBQUFBLElBQ2hCO0FBQ0EsV0FBTztBQUFBLEVBSVI7QUFBQSxFQUVBLFVBQVU7QUFDVCxVQUFNLEVBQUUsVUFBVSxJQUFJO0FBQ3RCLGNBQVUsTUFBTTtBQUFBLEVBQ2pCO0FBQ0Q7QUFFQSxJQUFNLHNCQUFOLGNBQWtDLGlDQUFpQjtBQUFBLEVBR2xELFlBQVksS0FBVSxRQUE0QjtBQUNqRCxVQUFNLEtBQUssTUFBTTtBQUNqQixTQUFLLFNBQVM7QUFBQSxFQUNmO0FBQUEsRUFFQSxVQUFnQjtBQUNmLFVBQU0sRUFBRSxZQUFZLElBQUk7QUFFeEIsZ0JBQVksTUFBTTtBQUVsQixnQkFBWSxTQUFTLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXZELFFBQUksd0JBQVEsV0FBVyxFQUNyQixRQUFRLHdCQUF3QixFQUNoQyxRQUFRLDJCQUEyQixFQUNuQyxRQUFRLFVBQVEsS0FDZixlQUFlLDhCQUE4QixFQUM3QyxTQUFTLEtBQUssT0FBTyxTQUFTLGVBQWUsRUFDN0MsU0FBUyxPQUFPLFVBQVU7QUFDMUIsY0FBUSxNQUFNLHlCQUF5QixLQUFLO0FBQzVDLFdBQUssT0FBTyxTQUFTLGtCQUFrQjtBQUN2QyxZQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsSUFDaEMsQ0FBQyxDQUFDO0FBRUosUUFBSSx3QkFBUSxXQUFXLEVBQ3JCLFFBQVEsc0JBQXNCLEVBQzlCLFFBQVEsMkJBQTJCLEVBQ25DLFFBQVEsVUFBUSxLQUNmLGVBQWUsc0JBQXNCLEVBQ3JDLFNBQVMsS0FBSyxPQUFPLFNBQVMsYUFBYSxFQUMzQyxTQUFTLE9BQU8sVUFBVTtBQUMxQixjQUFRLE1BQU0sdUJBQXVCLEtBQUs7QUFDMUMsV0FBSyxPQUFPLFNBQVMsZ0JBQWdCO0FBQ3JDLFlBQU0sS0FBSyxPQUFPLGFBQWE7QUFBQSxJQUNoQyxDQUFDLENBQUM7QUFDSixRQUFJLHdCQUFRLFdBQVcsRUFDckIsUUFBUSx5QkFBeUIsRUFDakMsUUFBUSxzREFBc0QsRUFDOUQsUUFBUSxVQUFRLEtBQ2YsZUFBZSx5Q0FBeUMsRUFDeEQsU0FBUyxLQUFLLE9BQU8sU0FBUyxxQkFBcUIsRUFDbkQsU0FBUyxPQUFPLFVBQVU7QUFDMUIsY0FBUSxNQUFNLDZCQUE2QixLQUFLO0FBQ2hELFdBQUssT0FBTyxTQUFTLHdCQUF3QjtBQUM3QyxZQUFNLEtBQUssT0FBTyxhQUFhO0FBQUEsSUFDaEMsQ0FBQyxDQUFDO0FBRUosUUFBSSx3QkFBUSxXQUFXLEVBQ3JCLFFBQVEsdUJBQXVCLEVBQy9CLFFBQVEsb0RBQW9ELEVBQzVELFFBQVEsVUFBUSxLQUNmLGVBQWUsdUNBQXVDLEVBQ3RELFNBQVMsS0FBSyxPQUFPLFNBQVMsbUJBQW1CLEVBQ2pELFNBQVMsT0FBTyxVQUFVO0FBQzFCLGNBQVEsTUFBTSw2QkFBNkIsS0FBSztBQUNoRCxXQUFLLE9BQU8sU0FBUyxzQkFBc0I7QUFDM0MsWUFBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLElBQ2hDLENBQUMsQ0FBQztBQUNKLFFBQUksd0JBQVEsV0FBVyxFQUNyQixRQUFRLFlBQVUsb0JBQW9CLEVBQ3RDLFFBQVEseUNBQXlDLEVBQ2pELFFBQVEsVUFBUSxLQUNmLGVBQWUsWUFBVSxzQkFBc0IsRUFDL0MsU0FBUyxLQUFLLE9BQU8sU0FBUyxZQUFZLEVBQzFDLFNBQVMsT0FBTyxVQUFVO0FBQzFCLFdBQUssT0FBTyxTQUFTLGVBQWU7QUFDcEMsWUFBTSxLQUFLLE9BQU8sYUFBYTtBQUFBLElBQ2hDLENBQUMsQ0FBQztBQUFBLEVBQ0w7QUFDRDsiLAogICJuYW1lcyI6IFtdCn0K