form-aurora-stefanini 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,681 @@
1
+ import * as tslib_1 from "tslib";
2
+ import { Component, Injectable, Input, ViewChild, Output, EventEmitter } from '@angular/core';
3
+ import { FormGroup, FormControl } from '@angular/forms';
4
+ import { HttpClient } from '@angular/common/http';
5
+ // import moment from 'moment';
6
+ import { NgbDateAdapter, NgbDateParserFormatter, NgbDatepickerI18n } from '@ng-bootstrap/ng-bootstrap';
7
+ import * as moment_ from 'moment';
8
+ const moment = moment_;
9
+ // import { regexType } from "@app/_shared/_util/regex";
10
+ // import { ExternalService } from '@app/_shared/_services/external.service';
11
+ // import { AuroraService } from '@app/_shared/_services/aurora.service';
12
+ /**
13
+ * This Service handles how the date is represented in scripts i.e. ngModel.
14
+ */
15
+ let CustomAdapter = class CustomAdapter extends NgbDateAdapter {
16
+ // import { regexType } from "@app/_shared/_util/regex";
17
+ // import { ExternalService } from '@app/_shared/_services/external.service';
18
+ // import { AuroraService } from '@app/_shared/_services/aurora.service';
19
+ /**
20
+ * This Service handles how the date is represented in scripts i.e. ngModel.
21
+ */
22
+ constructor() {
23
+ super(...arguments);
24
+ this.DELIMITER = '/';
25
+ }
26
+ fromModel(value) {
27
+ if (value) {
28
+ const date = value.split(this.DELIMITER);
29
+ return {
30
+ day: parseInt(date[0], 10),
31
+ month: parseInt(date[1], 10),
32
+ year: parseInt(date[2], 10)
33
+ };
34
+ }
35
+ return null;
36
+ }
37
+ toModel(date) {
38
+ //return date ? date.day + this.DELIMITER + date.month + this.DELIMITER + date.year : null;
39
+ return date ? (date.day < 10 ? 0 + date.day : date.day) + this.DELIMITER + (date.month < 10 ? 0 + date.month : date.month) + this.DELIMITER + date.year : '';
40
+ }
41
+ };
42
+ CustomAdapter = tslib_1.__decorate([
43
+ Injectable()
44
+ ], CustomAdapter);
45
+ export { CustomAdapter };
46
+ /**
47
+ * This Service handles how the date is rendered and parsed from keyboard i.e. in the bound input field.
48
+ */
49
+ let CustomDateParserFormatter = class CustomDateParserFormatter extends NgbDateParserFormatter {
50
+ /**
51
+ * This Service handles how the date is rendered and parsed from keyboard i.e. in the bound input field.
52
+ */
53
+ constructor() {
54
+ super(...arguments);
55
+ this.DELIMITER = '/';
56
+ }
57
+ parse(value) {
58
+ if (value) {
59
+ const date = value.split(this.DELIMITER);
60
+ return {
61
+ day: parseInt(date[0], 10),
62
+ month: parseInt(date[1], 10),
63
+ year: parseInt(date[2], 10)
64
+ };
65
+ }
66
+ return null;
67
+ }
68
+ format(date) {
69
+ return date ? (date.day < 10 ? '0' + date.day : date.day) + this.DELIMITER + (date.month < 10 ? '0' + date.month : date.month) + this.DELIMITER + date.year : '';
70
+ }
71
+ };
72
+ CustomDateParserFormatter = tslib_1.__decorate([
73
+ Injectable()
74
+ ], CustomDateParserFormatter);
75
+ export { CustomDateParserFormatter };
76
+ const I18N_VALUES = {
77
+ 'es': {
78
+ weekdays: ['Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa', 'Do'],
79
+ months: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'],
80
+ weekLabel: 'sem'
81
+ }
82
+ // other languages you would support
83
+ };
84
+ let I18n = class I18n {
85
+ constructor() {
86
+ this.language = 'es';
87
+ }
88
+ };
89
+ I18n = tslib_1.__decorate([
90
+ Injectable()
91
+ ], I18n);
92
+ export { I18n };
93
+ // Define custom service providing the months and weekdays translations
94
+ let CustomDatepickerI18n = class CustomDatepickerI18n extends NgbDatepickerI18n {
95
+ constructor(_i18n) {
96
+ super();
97
+ this._i18n = _i18n;
98
+ }
99
+ getWeekdayLabel(weekday) {
100
+ return I18N_VALUES[this._i18n.language].weekdays[weekday - 1];
101
+ }
102
+ getWeekLabel() {
103
+ return I18N_VALUES[this._i18n.language].weekLabel;
104
+ }
105
+ getMonthShortName(month) {
106
+ return I18N_VALUES[this._i18n.language].months[month - 1];
107
+ }
108
+ getMonthFullName(month) {
109
+ return this.getMonthShortName(month);
110
+ }
111
+ getDayAriaLabel(date) {
112
+ return `${date.day}-${date.month}-${date.year}`;
113
+ }
114
+ getWeekdayShortName(weekday) {
115
+ return I18N_VALUES[this._i18n.language].weekdays[weekday - 1];
116
+ }
117
+ ;
118
+ };
119
+ CustomDatepickerI18n.ctorParameters = () => [
120
+ { type: I18n }
121
+ ];
122
+ CustomDatepickerI18n = tslib_1.__decorate([
123
+ Injectable()
124
+ ], CustomDatepickerI18n);
125
+ export { CustomDatepickerI18n };
126
+ let FormAuroraComponent = class FormAuroraComponent {
127
+ constructor(http) {
128
+ this.http = http;
129
+ this.response = new EventEmitter();
130
+ this.summit = new EventEmitter();
131
+ this.setAcceptanceDocument = new EventEmitter();
132
+ this.tipodocNumDoc = false;
133
+ this.onSubmitEvent = false;
134
+ this.countSubmit = 0;
135
+ this.watchValid = false;
136
+ this.watchRequired = false;
137
+ this.captchaValid = false;
138
+ this.displayMonths = 2;
139
+ this.navigation = 'select';
140
+ this.showWeekNumbers = false;
141
+ this.outsideDays = 'visible';
142
+ this.respServiceSegmentation = null;
143
+ //emailPattern = "^[a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,4}$";
144
+ this.today = moment(new Date());
145
+ this.maxYear = this.today.year();
146
+ this.minYear = this.today.year() - 82;
147
+ this.minDate = this.minYear.toString() + '-' + this.today.month().toString().padStart(2, '0') + '-' + this.today.date().toString().padStart(2, '0'); // {year: this.minYear, month: this.today.month(), day: this.today.date()};
148
+ this.maxDate = this.maxYear.toString() + '-' + (this.today.month() + 1).toString().padStart(2, '0') + '-' + this.today.date().toString().padStart(2, '0'); // {year: this.maxYear, month: this.today.month() + 1, day: this.today.date()};
149
+ //Revisar variables
150
+ this.recharge = false;
151
+ this.indicativo = '57';
152
+ this.defaultDocType = 'Cédula de ciudadanía';
153
+ this.range = new FormGroup({
154
+ start: new FormControl(),
155
+ end: new FormControl(),
156
+ });
157
+ }
158
+ ngOnInit() {
159
+ console.log('nueva version 0.1.0');
160
+ this.minDate = new Date(this.minDate).toISOString().split('T')[0];
161
+ setTimeout(() => {
162
+ this.startComponent();
163
+ }, 2000);
164
+ }
165
+ startComponent() {
166
+ //ordena los campos
167
+ if (this.dataForm != null && this.dataForm.formQuestions != undefined) {
168
+ //Same row fields
169
+ this.tipodocNumDoc = (this.dataForm.formQuestions.some(question => question.question.value === 'tipoDoc') && this.dataForm.formQuestions.some(question => question.question.value === 'numeroDoc')) ? true : false;
170
+ this.dataForm.formQuestions = this.dataForm.formQuestions.sort(function (a, b) {
171
+ return a.order - b.order;
172
+ });
173
+ let existcaptcha = this.dataForm.formQuestions.filter((item) => item.question.questionType.id == 6);
174
+ if (existcaptcha.length == 0) {
175
+ this.captchaValid = true;
176
+ }
177
+ for (const item of this.dataForm.formQuestions) {
178
+ if (item.question.maxlength == null || item.question.maxlength == undefined || item.question.maxlength == 0) {
179
+ item.question.maxlength = 524288; //defaultvalue
180
+ }
181
+ if (item.question.minLength == null || item.question.minLength == undefined) {
182
+ item.question.minLength = 0;
183
+ }
184
+ this.dataReloadForm.forEach(element => {
185
+ this.filldata = element;
186
+ if ((item.question.questionType.id === 2 || item.question.questionType.id === 1 ||
187
+ item.question.questionType.id === 3) && (this.filldata.data !== null &&
188
+ this.filldata.data !== undefined) && item.question.id === this.filldata.id) {
189
+ item.question.registred = this.filldata.data;
190
+ }
191
+ });
192
+ if (item.question.registred == null || item.question.minLength == undefined) {
193
+ item.question.registred = '';
194
+ }
195
+ }
196
+ }
197
+ }
198
+ resolvedCaptcha(captchaResponse) {
199
+ this.captchaValid = true;
200
+ if (!this.formDynamic.form.value.captcha) {
201
+ this.formDynamic.controls.captcha.setValue(captchaResponse);
202
+ this.formDynamic.form.value.captcha = captchaResponse;
203
+ document.getElementById('btnIng').style.opacity = !this.formDynamic.valid ? '0.65' : '1';
204
+ }
205
+ }
206
+ //Forms
207
+ //Metodo para evitar el render de los items del for
208
+ trackByIndex(index, obj) {
209
+ return index;
210
+ }
211
+ onChangeValidPatter(event, question) {
212
+ if (question.pattern != undefined) {
213
+ let valid = true;
214
+ let keyvalid = [8, 32, 37, 38, 39, 40, 46, 9];
215
+ //diferente de Backpsace
216
+ //se deja catch por error no controlable en otro tiempo de ejecucion
217
+ try {
218
+ if (!keyvalid.includes(event.keyCode)) {
219
+ const regex = new RegExp(question.pattern);
220
+ valid = regex.test(event.key);
221
+ }
222
+ }
223
+ catch (error) {
224
+ }
225
+ return valid;
226
+ }
227
+ document.getElementById('char' + question.value).setAttribute('hidden', 'true');
228
+ //if temporal mientras se migran todos los tipos de campos al foreach
229
+ if (question.questionType.id != 11 && question.questionType.id != 7) {
230
+ if (this.validMinLength(this.formDynamic, question)) {
231
+ document.getElementById(question.value).style.borderColor = '#FF0000';
232
+ document.getElementById('ml' + question.value).removeAttribute('hidden');
233
+ }
234
+ else {
235
+ document.getElementById(question.value).style.borderColor = '#E4E4E4';
236
+ document.getElementById('ml' + question.value).setAttribute('hidden', 'true');
237
+ }
238
+ if (this.validMaxLength(this.formDynamic, question)) {
239
+ document.getElementById(question.value).style.borderColor = '#FF0000';
240
+ document.getElementById('mxl' + question.value).removeAttribute('hidden');
241
+ }
242
+ else {
243
+ document.getElementById(question.value).style.borderColor = '#E4E4E4';
244
+ document.getElementById('mxl' + question.value).setAttribute('hidden', 'true');
245
+ }
246
+ }
247
+ this.dataForm.formQuestions.forEach(formQuestion => {
248
+ switch (formQuestion.question.questionType.id) {
249
+ //se valida campo de tipo calendario
250
+ case 7:
251
+ if (question.questionType.id == 7)
252
+ this.calendarRulesValidate(formQuestion);
253
+ break;
254
+ //se valida campo de tipo email
255
+ case 11:
256
+ if (question.questionType.id == 11)
257
+ this.emailRulesValidate(formQuestion);
258
+ break;
259
+ }
260
+ });
261
+ document.getElementById('btnIng').style.opacity = !this.formDynamic.valid ? '0.65' : '1';
262
+ }
263
+ validOnlyText(event) {
264
+ let regex = /^[a-zA-Z\u00C0-\u017F]+$/g;
265
+ if (event.charCode == 32) {
266
+ return true;
267
+ }
268
+ let valid = regex.test(event.key);
269
+ return valid;
270
+ }
271
+ validDate(event) {
272
+ /*let pattern = /(?:0[1-9]|[12][0-9]|3[01])\/(?:0[1-9]|1[0-2])\/(?:19|20)[0-9]{2}/;
273
+ const regex = new RegExp(pattern);
274
+ valid = regex.test(event.key);
275
+ */
276
+ const matches = String(event.key).match(this.regexType.date.exp);
277
+ let valid = true;
278
+ if (matches === null)
279
+ valid = false;
280
+ // alert(valid);
281
+ return valid;
282
+ }
283
+ onChangeValidDate(event) {
284
+ //let pattern = /(?:0[1-9]|1[0-2])\/(?:0[1-9]|[12][0-9]|3[01])\/(?:19|20)[0-9]{2}/;
285
+ let dateN = /[0-9]|\//;
286
+ let valid = true;
287
+ const regex = new RegExp(dateN);
288
+ valid = regex.test(event.key);
289
+ return valid;
290
+ }
291
+ rediretoutside(event, question) {
292
+ //se deja catch por error no controlable en otro tiempo de ejecucion
293
+ try {
294
+ event.preventDefault();
295
+ window.open(question.value, '_blank');
296
+ }
297
+ catch (error) {
298
+ }
299
+ }
300
+ /**
301
+ * Dispatch submit event for validations exists
302
+ * @param change
303
+ */
304
+ ngOnChanges(change) {
305
+ this.countSubmit++;
306
+ }
307
+ //onSubmit(form: NgForm) {
308
+ onSubmit() {
309
+ let form = this.formDynamic;
310
+ this.watchValid = true;
311
+ this.watchRequired = true;
312
+ if (form.valid) {
313
+ if (!this.validRulesFields(form.controls['numeroDoc'].value.toString(), form.controls['celular'].value.toString(), form.controls['email'].value))
314
+ return false;
315
+ }
316
+ if (this.validMinlenghtAllQuestions(form.value) && this.validMaxLengthAllQuestions(form.value) && form.valid) {
317
+ if (this.dataForm.urlSend != '' && this.captchaValid) {
318
+ this.http.post(this.dataForm.urlSend, form.value).subscribe((resp) => this.response.emit(resp));
319
+ }
320
+ else if (form.valid && this.captchaValid) {
321
+ this.summit.emit(form.value);
322
+ }
323
+ }
324
+ }
325
+ validRulesFields(numeroDoc, numeroCel, email) {
326
+ // Validaciones para celular en caso de indicativo en Colombia
327
+ let cel = document.getElementById('charcelular');
328
+ let doc = document.getElementById('charnumeroDoc');
329
+ let valOk = true;
330
+ if (this.indicativo == '+57' || this.indicativo == '57') {
331
+ let stringOrdenado = this.orderString(numeroDoc);
332
+ if (this.nameCompany.toUpperCase() !== 'CLARO') { //claro acepta nro consecutivos
333
+ if (numeroDoc == stringOrdenado) {
334
+ doc.style.borderColor = '#FF0000';
335
+ doc.removeAttribute('hidden');
336
+ doc.textContent = 'El numero documento No debe contener caracteres consecutivos';
337
+ valOk = false;
338
+ //this.msgErrorCampo = "El numero documento No debe contener caracteres consecutivos";
339
+ //return false;
340
+ }
341
+ }
342
+ if (numeroCel.substring(0, 1) != '3') {
343
+ cel.style.borderColor = '#FF0000';
344
+ cel.removeAttribute('hidden');
345
+ cel.textContent = 'El primer carácter del celular debe ser 3';
346
+ valOk = false;
347
+ //this.msgErrorCampo = "El primer carácter del celular debe ser 3";
348
+ //return false;
349
+ }
350
+ /*
351
+ if (parseInt(numeroCel.substring(0, 3)) > 350) {
352
+ cel.style.borderColor = "#FF0000";
353
+ cel.removeAttribute("hidden");
354
+ cel.textContent = "El prefijo del celular no debe ser mayor a 350";
355
+ valOk = false;
356
+ //this.msgErrorCampo = "El prefijo del celular no debe ser mayor a 350";
357
+ //return false;
358
+ }
359
+ */
360
+ //En caso de que el número se repita, ejemplo 33333333
361
+ let listnumber = numeroDoc.substring(0, 1);
362
+ for (let index = 1; index < numeroDoc.length; index++) {
363
+ listnumber = listnumber + numeroDoc.substring(0, 1);
364
+ }
365
+ if (numeroDoc == listnumber) {
366
+ doc.style.borderColor = '#FF0000';
367
+ doc.removeAttribute('hidden');
368
+ doc.textContent = 'Caracteres numéricos no se pueden repetirse de manera continua ';
369
+ valOk = false;
370
+ //this.msgErrorCampo = "Caracteres numéricos no se pueden repetirse de manera continua ";
371
+ //return false;
372
+ }
373
+ // En caso de que el número se repita, ejemplo 33333333
374
+ let arrayPhoneRepeat = Array.from(String(numeroCel), Number);
375
+ let arrayPhoneOutRepeat = [...new Set(arrayPhoneRepeat)];
376
+ if (arrayPhoneOutRepeat.length == 1) {
377
+ cel.style.borderColor = '#FF0000';
378
+ cel.removeAttribute('hidden');
379
+ cel.textContent = 'El número que ingresa no es valido';
380
+ valOk = false;
381
+ //this.msgErrorCampo = "El número que ingresa no es valido";
382
+ //return false;
383
+ }
384
+ }
385
+ else if (this.indicativo == '+593' || this.indicativo == '593') {
386
+ if (numeroCel.substring(0, 1) != '9') {
387
+ cel.style.borderColor = '#FF0000';
388
+ cel.removeAttribute('hidden');
389
+ cel.textContent = 'El primer carácter del celular debe ser 9';
390
+ valOk = false;
391
+ //this.msgErrorCampo = "El primer carácter del celular debe ser 9";
392
+ //return false;
393
+ }
394
+ }
395
+ //se validan los campos por tipo de campo y no por value
396
+ this.dataForm.formQuestions.forEach(formQuestion => {
397
+ switch (formQuestion.question.questionType.id) {
398
+ //se valida campo de tipo email
399
+ case 11:
400
+ valOk = this.emailRulesValidate(formQuestion);
401
+ break;
402
+ }
403
+ });
404
+ return valOk;
405
+ }
406
+ orderString(value) {
407
+ let arrayNumber = [];
408
+ for (let index = 0; index < value.length; index++) {
409
+ arrayNumber.push(parseInt(value.substring(index, index + 1)));
410
+ }
411
+ //ordena el array
412
+ arrayNumber.sort(function (a, b) {
413
+ return a - b;
414
+ });
415
+ let numberOrder = '';
416
+ numberOrder = arrayNumber[0];
417
+ for (let index = 1; index < arrayNumber.length; index++) {
418
+ numberOrder = numberOrder + (arrayNumber[0] + index).toString();
419
+ }
420
+ return numberOrder;
421
+ }
422
+ validMinlenghtAllQuestions(form) {
423
+ for (const item of this.dataForm.formQuestions) {
424
+ if (item.question.questionType.id == 1 || item.question.questionType.id == 2) {
425
+ let minLength = parseInt(item.question.minLength);
426
+ let formValueLength = parseInt(form[item.question.value].toString().length);
427
+ if (minLength > 0 && formValueLength != minLength && formValueLength < minLength)
428
+ return false;
429
+ }
430
+ }
431
+ return true;
432
+ }
433
+ validMaxLengthAllQuestions(form) {
434
+ for (const item of this.dataForm.formQuestions) {
435
+ if (item.question.questionType.id == 1 || item.question.questionType.id == 2) {
436
+ let maxLength = parseInt(item.question.maxLength);
437
+ let formValueLength = parseInt(form[item.question.value].toString().length);
438
+ if (maxLength > 0 && formValueLength != maxLength && formValueLength > maxLength)
439
+ return false;
440
+ }
441
+ }
442
+ return true;
443
+ }
444
+ validRequired(form, question) {
445
+ //se deja catch por error no controlable en otro tiempo de ejecucion
446
+ try {
447
+ if (question != undefined && question.value != undefined) {
448
+ if (form.controls[question.value] != undefined &&
449
+ form.controls[question.value].errors != null &&
450
+ form.controls[question.value].errors.required) {
451
+ return true;
452
+ }
453
+ }
454
+ }
455
+ catch (error) {
456
+ }
457
+ return false;
458
+ }
459
+ validMinLength(form, question) {
460
+ //se deja catch por error no controlable en otro tiempo de ejecucion
461
+ try {
462
+ if (question != undefined && question.value != undefined) {
463
+ if (question.minLength > form.controls[question.value].value.toLocaleString().length && question.minLength > 0) {
464
+ return true;
465
+ }
466
+ }
467
+ }
468
+ catch (error) {
469
+ }
470
+ return false;
471
+ }
472
+ validMaxLength(form, question) {
473
+ //se deja catch por error no controlable en otro tiempo de ejecucion
474
+ try {
475
+ if (question != undefined && question.value != undefined) {
476
+ if (question.maxLength > 0) {
477
+ if (question.maxLength + 1 <= form.controls[question.value].value.toString().replace(/\./g, '').length) {
478
+ if (!this.formDynamic.controls[question.value].hasError('errorMaxLength')) {
479
+ this.formDynamic.controls[question.value].setErrors({ 'errorMaxLength': true });
480
+ }
481
+ return true;
482
+ }
483
+ }
484
+ }
485
+ }
486
+ catch (error) {
487
+ }
488
+ return false;
489
+ }
490
+ tycSelection(event) {
491
+ event.preventDefault();
492
+ let tyc = document.getElementById('txtPoliticas');
493
+ tyc.style.color = '#A3AD32';
494
+ // this.externalService.getTermsAndConditions().subscribe(resp => {
495
+ let b64 = null;
496
+ if (this.getTermsAndConditions && this.getTermsAndConditions.listaDocumentos) {
497
+ b64 = this.getTermsAndConditions.listaDocumentos[0].contenidoDocumento;
498
+ this.respServiceSegmentation = this.getTermsAndConditions.listaDocumentos[0];
499
+ let pdfWindow = window.open('');
500
+ pdfWindow.document.write('<iframe width=\'100%\' height=\'100%\' src=\'data:application/pdf;base64, ' +
501
+ encodeURI(b64) + '\'></iframe>');
502
+ }
503
+ // })
504
+ }
505
+ openLabelUrl(event, question) {
506
+ event.preventDefault();
507
+ let tyc = document.getElementById('check' + question.id);
508
+ tyc.style.color = '#A3AD32';
509
+ window.open(question.urllabel, '_blank');
510
+ }
511
+ checkTermsAndConditions(value) {
512
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
513
+ if (value) {
514
+ // let ipAddress = await this.auroraService.getIpAddress().toPromise();
515
+ let ipAddress = yield this.getIpAddress;
516
+ let objToSend = {
517
+ 'idDocumento': this.respServiceSegmentation.idDocumento || '',
518
+ // "idDocumento": this.respServiceSegmentation?.idDocumento || "",
519
+ 'nombrePortafolio': '0',
520
+ 'aplicacion': 'ZP_OF',
521
+ 'ip': ipAddress.ip,
522
+ 'tipoIdAfil': 'CC',
523
+ 'numeroIdAfil': this.formDynamic.controls['numeroDoc'].value.toString(),
524
+ 'numeroCuentaPI': '0',
525
+ 'transaccion': 'INICIO DE SESION_OF',
526
+ 'conceptoAceptacion': 'HABEAS_DATA_USO_APP',
527
+ 'respuesta': 'SI',
528
+ 'usuarioCreacion': this.formDynamic.controls['numeroDoc'].value.toString()
529
+ };
530
+ let aceptaciones = { aceptaciones: [objToSend] };
531
+ // this.externalService.setAcceptanceDocument(aceptaciones).subscribe(() => { })
532
+ this.setAcceptanceDocument.emit(aceptaciones);
533
+ }
534
+ });
535
+ }
536
+ cancellKeypress() {
537
+ return false;
538
+ }
539
+ emailRulesValidate(formQuestion) {
540
+ let valOk = true;
541
+ try {
542
+ let hasError = false;
543
+ document.getElementById(formQuestion.question.id).setAttribute('hidden', 'true');
544
+ let eml = document.getElementById(formQuestion.question.id);
545
+ let email = formQuestion.question.registred;
546
+ if (!hasError) {
547
+ if (formQuestion.question.required && (email == '' || email == undefined || email == null)) {
548
+ eml.style.borderColor = '#FF0000';
549
+ eml.textContent = 'El correco eléctronico es requerido';
550
+ eml.removeAttribute('hidden');
551
+ valOk = false;
552
+ hasError = true;
553
+ }
554
+ }
555
+ if (!hasError) {
556
+ if (this.validMinLength(undefined, formQuestion.question)) {
557
+ eml.style.borderColor = '#FF0000';
558
+ eml.textContent = 'Debe ser mínimo de ' + formQuestion.question.minLength + ' caracteres';
559
+ document.getElementById(formQuestion.question.id).removeAttribute('hidden');
560
+ valOk = false;
561
+ hasError = true;
562
+ }
563
+ }
564
+ if (!hasError) {
565
+ if (this.validMaxLength(undefined, formQuestion.question)) {
566
+ eml.style.borderColor = '#FF0000';
567
+ eml.textContent = 'Debe ser maximo de ' + formQuestion.question.maxLength + ' caracteres';
568
+ document.getElementById(formQuestion.question.id).removeAttribute('hidden');
569
+ valOk = false;
570
+ hasError = true;
571
+ }
572
+ }
573
+ if (!hasError) {
574
+ const matches = String(email).match(this.regexType.email.exp);
575
+ if (matches == null) {
576
+ eml.style.borderColor = '#FF0000';
577
+ eml.textContent = 'Tu email es invalido';
578
+ eml.removeAttribute('hidden');
579
+ valOk = false;
580
+ hasError = true;
581
+ }
582
+ }
583
+ }
584
+ catch (error) {
585
+ }
586
+ return valOk;
587
+ }
588
+ calendarRulesValidate(formQuestion) {
589
+ let hasError = false;
590
+ try {
591
+ document.getElementById(formQuestion.question.id).setAttribute('hidden', 'true');
592
+ let ecalendar = document.getElementById(formQuestion.question.id);
593
+ //se valida que no sea null si es requerido
594
+ let date = formQuestion.question.registred;
595
+ if (formQuestion.question.required && (date == '' || date == undefined || date == null)) {
596
+ ecalendar.style.borderColor = '#FF0000';
597
+ ecalendar.textContent = 'La fecha es requerida';
598
+ ecalendar.removeAttribute('hidden');
599
+ }
600
+ }
601
+ catch (error) {
602
+ }
603
+ }
604
+ validateNotSpace(event) {
605
+ if (event.charCode == 32) {
606
+ return false;
607
+ }
608
+ else {
609
+ return true;
610
+ }
611
+ }
612
+ };
613
+ FormAuroraComponent.ctorParameters = () => [
614
+ { type: HttpClient }
615
+ ];
616
+ tslib_1.__decorate([
617
+ Input()
618
+ ], FormAuroraComponent.prototype, "dataClassCss", void 0);
619
+ tslib_1.__decorate([
620
+ Input()
621
+ ], FormAuroraComponent.prototype, "dataForm", void 0);
622
+ tslib_1.__decorate([
623
+ Input()
624
+ ], FormAuroraComponent.prototype, "clickSubmit", void 0);
625
+ tslib_1.__decorate([
626
+ Input()
627
+ ], FormAuroraComponent.prototype, "dataReloadForm", void 0);
628
+ tslib_1.__decorate([
629
+ Input()
630
+ ], FormAuroraComponent.prototype, "welcomeTitle", void 0);
631
+ tslib_1.__decorate([
632
+ Input()
633
+ ], FormAuroraComponent.prototype, "welcomeDescription", void 0);
634
+ tslib_1.__decorate([
635
+ Input()
636
+ ], FormAuroraComponent.prototype, "urlPdf", void 0);
637
+ tslib_1.__decorate([
638
+ Input()
639
+ ], FormAuroraComponent.prototype, "nameCompany", void 0);
640
+ tslib_1.__decorate([
641
+ Input()
642
+ ], FormAuroraComponent.prototype, "schedule", void 0);
643
+ tslib_1.__decorate([
644
+ Input()
645
+ ], FormAuroraComponent.prototype, "getTermsAndConditions", void 0);
646
+ tslib_1.__decorate([
647
+ Input()
648
+ ], FormAuroraComponent.prototype, "regexType", void 0);
649
+ tslib_1.__decorate([
650
+ Input()
651
+ ], FormAuroraComponent.prototype, "getIpAddress", void 0);
652
+ tslib_1.__decorate([
653
+ ViewChild('formDynamic', { static: true })
654
+ ], FormAuroraComponent.prototype, "formDynamic", void 0);
655
+ tslib_1.__decorate([
656
+ Output()
657
+ ], FormAuroraComponent.prototype, "response", void 0);
658
+ tslib_1.__decorate([
659
+ Output()
660
+ ], FormAuroraComponent.prototype, "summit", void 0);
661
+ tslib_1.__decorate([
662
+ Output()
663
+ ], FormAuroraComponent.prototype, "setAcceptanceDocument", void 0);
664
+ tslib_1.__decorate([
665
+ ViewChild('modalTurns', { static: false })
666
+ ], FormAuroraComponent.prototype, "myModal", void 0);
667
+ FormAuroraComponent = tslib_1.__decorate([
668
+ Component({
669
+ selector: 'lib-FormAurora',
670
+ template: "<script src=\"https://www.google.com/recaptcha/api.js\" async defer></script>\n<div class=\"card\">\n <span class=\"text-center mt-2 d-none d-sm-block\">\n <img style=\"width: 115px; height:96px;\" [class]=\"dataClassCss.logo\" id=\"logo\">\n </span>\n <div class=\"card-body pt-0\">\n <ng-container *ngIf=\"schedule\">\n <h4 class=\"card-title text-center mb-0\" [class]=\"dataClassCss.bienvenida2\" style=\"color: #EE7E0E;\">\n Horarios de atenci\u00F3n\n </h4>\n <small class=\"text-center d-block\">{{schedule}}</small>\n </ng-container>\n <form #formDynamic=\"ngForm\">\n <div *ngFor=\"let control of dataForm?.formQuestions; let index = index; trackBy: trackByIndex\">\n <div\n *ngIf=\"(index > 0 && (dataForm.formQuestions[index - 1].question.questionType.id == 3 && dataForm.formQuestions[index].question.questionType.id == 2)) || (index < dataForm.formQuestions.length && dataForm.formQuestions[index].question.questionType.id == 3 && dataForm.formQuestions[index + 1].question.questionType.id == 2); else switchTemp\">\n <div class=\"row\"\n *ngIf=\"(index > 0 && (dataForm.formQuestions[index - 1].question.questionType.id == 3 && dataForm.formQuestions[index].question.questionType.id == 2))\">\n <div class=\"col-lg-6 col-xs-12\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index - 1].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left;\">\n <span class=\"h6 small bg-white text-muted\">{{dataForm.formQuestions[index -\n 1].question.label}}</span>\n </label>\n <div class=\"selectContainer\">\n <select [name]=\"dataForm.formQuestions[index - 1].question.value\"\n [required]=\"dataForm.formQuestions[index - 1].question.required\"\n [class]=\"dataClassCss.formcontrol\"\n id=\"{{dataForm.formQuestions[index - 1].question.value}}\"\n style=\"margin-top: -1rem !important;\"\n [(ngModel)]=\"defaultDocType !== '' ? defaultDocType : dataForm.formQuestions[index - 1].question.registred\">\n <option value=\"\" selected disabled hidden>Selecciona</option>\n <ng-container\n *ngFor=\"let item of dataForm.formQuestions[index - 1].question.questionAnswers\">\n <option *ngIf=\"item.answer.state.id == 1\" [value]=\"item.answer.value\">\n {{ item.answer.field }}\n </option>\n </ng-container>\n </select>\n </div>\n </div>\n <div style=\"margin-left: 15px;\"\n *ngIf=\"dataForm.formQuestions[index].question.questionType.id != 5 && dataForm.formQuestions[index].question.questionType.id != 6\">\n <span class=\"error\" [id]=\"'char'+dataForm.formQuestions[index-1].question.value\"\n hidden></span>\n </div>\n </div>\n <div class=\"col-lg-6 col-xs-12\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\"\n class=\"col-sm-12 p-sm-0 px-sm-1\" style=\"display: block; text-align: left;\">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input type=\"text\" digitOnly id=\"{{dataForm.formQuestions[index].question.value}}\"\n style=\"margin-top: -1rem !important;\"\n [name]=\"dataForm.formQuestions[index].question.value\" placeholder=\"Escribe\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (keyup)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n onkeypress=\"return (event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57\"\n onkeyup=\"(this.value=(value.replace(/[.]*/g,'')))\"\n maxlength=\"dataForm.formQuestions[index].question.maxLength\"\n [minLength]=\"dataForm.formQuestions[index].question.minLength\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n [class]=\"dataClassCss.formcontrol\"/>\n\n </div>\n <div style=\"margin-left: 15px;\"\n *ngIf=\"dataForm.formQuestions[index].question.questionType.id != 5 && dataForm.formQuestions[index].question.questionType.id != 6\">\n <span class=\"error\" [id]=\"'rq'+dataForm.formQuestions[index].question.value\"\n *ngIf=\"validRequired(formDynamic,dataForm.formQuestions[index].question) && watchValid\">\n Este campo es obligatorio</span>\n <span class=\"error\" [id]=\"'ml'+dataForm.formQuestions[index].question.value\" hidden>\n Debe ser m\u00EDnimo de\n {{ dataForm.formQuestions[index].question.minLength }} caracteres</span>\n <span class=\"error\" [id]=\"'mxl'+dataForm.formQuestions[index].question.value\" hidden>\n Debe ser maximo de\n {{ dataForm.formQuestions[index].question.maxLength }} caracteres</span>\n <span class=\"error\" [id]=\"'char'+dataForm.formQuestions[index].question.value\"\n hidden></span>\n </div>\n </div>\n </div>\n </div>\n\n <ng-template #switchTemp>\n <div [ngSwitch]=\"dataForm.formQuestions[index].question.questionType.id\">\n <div *ngSwitchCase=\"1\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left; \">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input type=\"text\" id=\"{{dataForm.formQuestions[index].question.value}}\"\n [class]=\"dataClassCss.formcontrol\" placeholder=\"Escribe\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [maxlength]=\"dataForm.formQuestions[index].question.maxLength\"\n [name]=\"dataForm.formQuestions[index].question.value\"\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n style=\"margin-top: -1rem !important;\"/>\n </div>\n </div>\n <div *ngSwitchCase=\"2\">\n\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left;\">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input type=\"text\" digitOnly id=\"{{dataForm.formQuestions[index].question.value}}\"\n style=\"margin-top: -1rem !important;\"\n [name]=\"dataForm.formQuestions[index].question.value\" placeholder=\"Escribe\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n onkeypress=\"return (event.charCode == 0) ? null : event.charCode >= 48 && event.charCode <= 57\"\n onkeyup=\"(this.value=(value.replace(/[.]*/g,'')))\"\n maxlength=\"dataForm.formQuestions[index].question.maxLength\"\n [minLength]=\"dataForm.formQuestions[index].question.minLength\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n [class]=\"dataClassCss.formcontrol\"/>\n </div>\n\n </div>\n <div *ngSwitchCase=\"3\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left;\">\n <span\n class=\"h6 small bg-white text-muted\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <select [name]=\"dataForm.formQuestions[index].question.value\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [class]=\"dataClassCss.formcontrol\"\n id=\"{{dataForm.formQuestions[index].question.value}}\"\n style=\"margin-top: -1rem !important;\"\n [(ngModel)]=\"defaultDocType !== '' ? defaultDocType : dataForm.formQuestions[index].question.registred\">\n <option value=\"\" selected disabled hidden>Selecciona</option>\n <ng-container\n *ngFor=\"let item of dataForm.formQuestions[index].question.questionAnswers\">\n <option *ngIf=\"item.answer.state.id == 1\" [value]=\"item.answer.value\">\n {{ item.answer.field }}\n </option>\n </ng-container>\n </select>\n </div>\n </div>\n <div *ngSwitchCase=\"4\">\n <select class=\"{{ dataClassCss.formcontrol }} select-checkbox\"\n style=\"overflow: hidden; border-style: hidden;\"\n [style.height.px]=\"dataForm.formQuestions[index].question.questionAnswers.length * 24\"\n [name]=\"dataForm.formQuestions[index].question.value\"\n [required]=\"dataForm.formQuestions[index].question.required\" ngModel multiple>\n <!-- todo: delete (mousedown)=\"onMouseDown($event, dataForm.formQuestions[index].question.value, formDynamic)\"-->\n <option\n (mousemove)=\"$event.preventDefault()\"\n *ngFor=\"let item of dataForm.formQuestions[index].question.questionAnswers\"\n [value]=\"item.answer.value\">\n {{ item.answer.field }}\n </option>\n </select>\n </div>\n <div *ngSwitchCase=\"5\">\n <a (click)=\"rediretoutside($event,dataForm.formQuestions[index].question)\" href=\"\">\n <span>{{ dataForm.formQuestions[index].question.label }}</span>\n </a>\n </div>\n <div *ngSwitchCase=\"6\">\n <div [class]=\"dataClassCss.cl12\" [id]=\"'reCaptcha'\">\n <div class=\"cnt-captcha\">\n <re-captcha (resolved)=\"resolvedCaptcha($event)\"\n siteKey=\"6LfQisEZAAAAAARuuKFEAgS-x4qJse5uBA_QCA7v\"></re-captcha>\n <input hidden type=\"text\" [name]=\"dataForm.formQuestions[index].question.value\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\">\n </div>\n <span class=\"error\" *ngIf=\"watchValid && !captchaValid\" style=\"margin-top: 0;\">\n Debe resolver la captcha para continuar\n </span>\n </div>\n </div>\n <div *ngSwitchCase=\"7\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left; margin-bottom: 0 ;\">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input placeholder=\"dd/mm/aaaa\" style=\"margin-top: -0.4rem !important;\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [name]=\"dataForm.formQuestions[index].question.value\" type=\"date\" min=\"{{minDate}}\"\n max=\"{{maxDate}}\" [maxlength]=\"10\" (paste)=\"false\"\n id=\"{{dataForm.formQuestions[index].question.value}}\"\n [class]=\"dataClassCss.txtCalendar\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n (keydown)=\"cancellKeypress()\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\">\n\n <!-- for replace by id todo-->\n <button class=\"btn\" id=\"{{dataForm.formQuestions[index].question.value}}\" type=\"button\"\n style=\"width: 46px;\n top: 12px;\n color: white;\n right: 15px;\n position: absolute;\n background: #D25D42;\n pointer-events: none;\">\n <i class=\"fa fa-calendar\"></i>\n </button>\n\n </div>\n </div>\n <div *ngSwitchCase=\"8\">\n <div [class]=\"dataClassCss.cl12\" style=\"text-align: left; margin-bottom: 10px;\">\n <input [style]=\"'width: 4%; height: auto; display: inline;'\" type=\"checkbox\"\n [name]=\"dataForm.formQuestions[index].question.value\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n [class]=\"dataClassCss.formcontrol\"\n (change)=\"checkTermsAndConditions(dataForm.formQuestions[index].question.registred)\">\n <!-- <a href=\"{{urlPdf}}\" target=\"_blank\" style=\"text-decoration: underline;\"\n id=\"txtPoliticas\" (click)=\"tycSelection()\">\n {{dataForm.formQuestions[index].question.label}}\n </a> -->\n <a target=\"_blank\" style=\"text-decoration: underline;color:blue;cursor: pointer;\"\n id=\"txtPoliticas\" (click)=\"tycSelection($event)\">\n {{dataForm.formQuestions[index].question.label}}\n </a>\n </div>\n </div>\n <div *ngSwitchCase=\"9\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left; \">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input type=\"text\" id=\"{{dataForm.formQuestions[index].question.value}}\"\n [class]=\"dataClassCss.formcontrol\" placeholder=\"Escribe\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [maxlength]=\"dataForm.formQuestions[index].question.maxLength\"\n [name]=\"dataForm.formQuestions[index].question.value\"\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (keypress)=\"validOnlyText($event)\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n style=\"margin-top: -1rem !important;\"/>\n </div>\n </div>\n <div *ngSwitchCase=\"10\">\n <div [class]=\"dataClassCss.cl12\" style=\"text-align: left; margin-bottom: 10px;\">\n <input [style]=\"'width: 4%; height: auto; display: inline;'\" type=\"checkbox\"\n [name]=\"dataForm.formQuestions[index].question.value\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n [class]=\"dataClassCss.formcontrol\">\n <a target=\"_blank\" style=\"text-decoration: underline;color:blue;cursor: pointer;\"\n id=\"check{{dataForm.formQuestions[index].question.id}}\"\n (click)=\"openLabelUrl($event,dataForm.formQuestions[index].question)\">\n {{dataForm.formQuestions[index].question.label}}\n </a>\n </div>\n </div>\n <div *ngSwitchCase=\"11\">\n <div [class]=\"dataClassCss.cl12\">\n <label for=\"{{dataForm.formQuestions[index].question.value}}\" class=\"col-sm-12\"\n style=\"display: block; text-align: left; \">\n <span\n class=\"h6 small bg-white text-muted pt-1 pl-2 pr-2\">{{dataForm.formQuestions[index].question.label}}</span>\n </label>\n <input type=\"text\" id=\"{{dataForm.formQuestions[index].question.value}}\"\n [class]=\"dataClassCss.formcontrol\" placeholder=\"Escribe\"\n [required]=\"dataForm.formQuestions[index].question.required\"\n [maxlength]=\"dataForm.formQuestions[index].question.maxLength\"\n [name]=\"dataForm.formQuestions[index].question.value\"\n (keydown)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (change)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (blur)=\"onChangeValidPatter($event, dataForm.formQuestions[index].question)\"\n (keypress)=\"validateNotSpace($event)\"\n [(ngModel)]=\"dataForm.formQuestions[index].question.registred\"\n style=\"margin-top: -1rem !important;\"/>\n </div>\n </div>\n <div *ngSwitchDefault>Tipo de control no detectado</div>\n <div style=\"margin-left: 15px;\"\n *ngIf=\"dataForm.formQuestions[index].question.questionType.id != 5 && dataForm.formQuestions[index].question.questionType.id != 6\">\n <span class=\"error\" [id]=\"'rq'+dataForm.formQuestions[index].question.value\"\n *ngIf=\"validRequired(formDynamic,dataForm.formQuestions[index].question) && watchValid\">\n Este campo es obligatorio</span>\n <span class=\"error\" [id]=\"'ml'+dataForm.formQuestions[index].question.value\" hidden>\n Debe ser m\u00EDnimo de\n {{ dataForm.formQuestions[index].question.minLength }} caracteres</span>\n <span class=\"error\" [id]=\"'mxl'+dataForm.formQuestions[index].question.value\" hidden>\n Debe ser maximo de\n {{ dataForm.formQuestions[index].question.maxLength }} caracteres</span>\n <span class=\"error\" [id]=\"'char'+dataForm.formQuestions[index].question.value\"\n hidden></span>\n <span class=\"error\" [id]=\"dataForm.formQuestions[index].question.id\" hidden></span>\n </div>\n </div>\n </ng-template>\n </div>\n <div class=\"mt-3 text-center\">\n <button type=\"button\" [class]=\"dataClassCss.btn\" (click)=\"onSubmit()\" [disabled]=\"!formDynamic.valid\"\n id=\"btnIng\">Ingresar\n </button>\n </div>\n </form>\n </div>\n</div>\n",
671
+ providers: [
672
+ { provide: NgbDateAdapter, useClass: CustomAdapter },
673
+ { provide: NgbDateParserFormatter, useClass: CustomDateParserFormatter },
674
+ { provide: NgbDatepickerI18n, useClass: CustomDatepickerI18n },
675
+ I18n
676
+ ],
677
+ styles: [".select-checkbox option::before{content:\"\\2610\";width:1.3em;text-align:center;display:inline-block}.select-checkbox option:checked::before{content:\"\\2611\"}"]
678
+ })
679
+ ], FormAuroraComponent);
680
+ export { FormAuroraComponent };
681
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1hdXJvcmEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vZm9ybS1hdXJvcmEtc3RlZmFuaW5pLyIsInNvdXJjZXMiOlsibGliL2Zvcm0tYXVyb3JhLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBQ1YsS0FBSyxFQUlMLFNBQVMsRUFHVCxNQUFNLEVBQ04sWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBQyxTQUFTLEVBQUUsV0FBVyxFQUFlLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRWhELCtCQUErQjtBQUMvQixPQUFPLEVBQUMsY0FBYyxFQUFFLHNCQUFzQixFQUFpQixpQkFBaUIsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BILE9BQU8sS0FBSyxPQUFPLE1BQU0sUUFBUSxDQUFDO0FBRWxDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQztBQUN2Qix3REFBd0Q7QUFDeEQsNkVBQTZFO0FBQzdFLHlFQUF5RTtBQUV6RTs7R0FFRztBQUVILElBQWEsYUFBYSxHQUExQixNQUFhLGFBQWMsU0FBUSxjQUFzQjtJQVJ6RCx3REFBd0Q7SUFDeEQsNkVBQTZFO0lBQzdFLHlFQUF5RTtJQUV6RTs7T0FFRztJQUNIOztRQUdXLGNBQVMsR0FBRyxHQUFHLENBQUM7SUFrQjNCLENBQUM7SUFoQkMsU0FBUyxDQUFDLEtBQW9CO1FBQzVCLElBQUksS0FBSyxFQUFFO1lBQ1QsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDekMsT0FBTztnQkFDTCxHQUFHLEVBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzFCLEtBQUssRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMs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REFBcUI7QUFDcEQ7SUFBVCxNQUFNLEVBQUU7cURBQW9DO0FBQ25DO0lBQVQsTUFBTSxFQUFFO21EQUFrQztBQUNqQztJQUFULE1BQU0sRUFBRTtrRUFBaUQ7QUEyQmhCO0lBQXpDLFNBQVMsQ0FBQyxZQUFZLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDLENBQUM7b0RBQXFCO0FBNUNuRCxtQkFBbUI7SUFYL0IsU0FBUyxDQUFDO1FBQ1QsUUFBUSxFQUFFLGdCQUFnQjtRQUMxQixpaXJCQUEyQztRQUUzQyxTQUFTLEVBQUU7WUFDVCxFQUFDLE9BQU8sRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBQztZQUNsRCxFQUFDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxRQUFRLEVBQUUseUJBQXlCLEVBQUM7WUFDdEUsRUFBQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsUUFBUSxFQUFFLG9CQUFvQixFQUFDO1lBQzVELElBQUk7U0FDTDs7S0FDRixDQUFDO0dBQ1csbUJBQW1CLENBK2lCL0I7U0EvaUJZLG1CQUFtQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIEluamVjdGFibGUsXHJcbiAgSW5wdXQsXHJcbiAgRWxlbWVudFJlZixcclxuICBPbkluaXQsXHJcbiAgUmVuZGVyZXIyLFxyXG4gIFZpZXdDaGlsZCxcclxuICBPbkNoYW5nZXMsXHJcbiAgU2ltcGxlQ2hhbmdlcyxcclxuICBPdXRwdXQsXHJcbiAgRXZlbnRFbWl0dGVyXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7Rm9ybUdyb3VwLCBGb3JtQ29udHJvbCwgTmdGb3JtLCBGb3JtfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7SHR0cENsaWVudH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQge0ZpbGx9IGZyb20gJy4vZmlsbCc7XHJcbi8vIGltcG9ydCBtb21lbnQgZnJvbSAnbW9tZW50JztcclxuaW1wb3J0IHtOZ2JEYXRlQWRhcHRlciwgTmdiRGF0ZVBhcnNlckZvcm1hdHRlciwgTmdiRGF0ZVN0cnVjdCwgTmdiRGF0ZXBpY2tlckkxOG59IGZyb20gJ0BuZy1ib290c3RyYXAvbmctYm9vdHN0cmFwJztcclxuaW1wb3J0ICogYXMgbW9tZW50XyBmcm9tICdtb21lbnQnO1xyXG5cclxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcclxuLy8gaW1wb3J0IHsgcmVnZXhUeXBlIH0gZnJvbSBcIkBhcHAvX3NoYXJlZC9fdXRpbC9yZWdleFwiO1xyXG4vLyBpbXBvcnQgeyBFeHRlcm5hbFNlcnZpY2UgfSBmcm9tICdAYXBwL19zaGFyZWQvX3NlcnZpY2VzL2V4dGVybmFsLnNlcnZpY2UnO1xyXG4vLyBpbXBvcnQgeyBBdXJvcmFTZXJ2aWNlIH0gZnJvbSAnQGFwcC9fc2hhcmVkL19zZXJ2aWNlcy9hdXJvcmEuc2VydmljZSc7XHJcblxyXG4vKipcclxuICogVGhpcyBTZXJ2aWNlIGhhbmRsZXMgaG93IHRoZSBkYXRlIGlzIHJlcHJlc2VudGVkIGluIHNjcmlwdHMgaS5lLiBuZ01vZGVsLlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tQWRhcHRlciBleHRlbmRzIE5nYkRhdGVBZGFwdGVyPHN0cmluZz4ge1xyXG5cclxuICByZWFkb25seSBERUxJTUlURVIgPSAnLyc7XHJcblxyXG4gIGZyb21Nb2RlbCh2YWx1ZTogc3RyaW5nIHwgbnVsbCk6IE5nYkRhdGVTdHJ1Y3QgfCBudWxsIHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICBjb25zdCBkYXRlID0gdmFsdWUuc3BsaXQodGhpcy5ERUxJTUlURVIpO1xyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIGRheTogcGFyc2VJbnQoZGF0ZVswXSwgMTApLFxyXG4gICAgICAgIG1vbnRoOiBwYXJzZUludChkYXRlWzFdLCAxMCksXHJcbiAgICAgICAgeWVhcjogcGFyc2VJbnQoZGF0ZVsyXSwgMTApXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIHRvTW9kZWwoZGF0ZTogTmdiRGF0ZVN0cnVjdCB8IG51bGwpOiBzdHJpbmcgfCBudWxsIHtcclxuICAgIC8vcmV0dXJuIGRhdGUgPyBkYXRlLmRheSArIHRoaXMuREVMSU1JVEVSICsgZGF0ZS5tb250aCArIHRoaXMuREVMSU1JVEVSICsgZGF0ZS55ZWFyIDogbnVsbDtcclxuICAgIHJldHVybiBkYXRlID8gKGRhdGUuZGF5IDwgMTAgPyAwICsgZGF0ZS5kYXkgOiBkYXRlLmRheSkgKyB0aGlzLkRFTElNSVRFUiArIChkYXRlLm1vbnRoIDwgMTAgPyAwICsgZGF0ZS5tb250aCA6IGRhdGUubW9udGgpICsgdGhpcy5ERUxJTUlURVIgKyBkYXRlLnllYXIgOiAnJztcclxuICB9XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBUaGlzIFNlcnZpY2UgaGFuZGxlcyBob3cgdGhlIGRhdGUgaXMgcmVuZGVyZWQgYW5kIHBhcnNlZCBmcm9tIGtleWJvYXJkIGkuZS4gaW4gdGhlIGJvdW5kIGlucHV0IGZpZWxkLlxyXG4gKi9cclxuQEluamVjdGFibGUoKVxyXG5leHBvcnQgY2xhc3MgQ3VzdG9tRGF0ZVBhcnNlckZvcm1hdHRlciBleHRlbmRzIE5nYkRhdGVQYXJzZXJGb3JtYXR0ZXIge1xyXG5cclxuICByZWFkb25seSBERUxJTUlURVIgPSAnLyc7XHJcblxyXG4gIHBhcnNlKHZhbHVlOiBzdHJpbmcpOiBOZ2JEYXRlU3RydWN0IHwgbnVsbCB7XHJcbiAgICBpZiAodmFsdWUpIHtcclxuICAgICAgY29uc3QgZGF0ZSA9IHZhbHVlLnNwbGl0KHRoaXMuREVMSU1JVEVSKTtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBkYXk6IHBhcnNlSW50KGRhdGVbMF0sIDEwKSxcclxuICAgICAgICBtb250aDogcGFyc2VJbnQoZGF0ZVsxXSwgMTApLFxyXG4gICAgICAgIHllYXI6IHBhcnNlSW50KGRhdGVbMl0sIDEwKVxyXG4gICAgICB9O1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIG51bGw7XHJcbiAgfVxyXG5cclxuICBmb3JtYXQoZGF0ZTogTmdiRGF0ZVN0cnVjdCB8IG51bGwpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIGRhdGUgPyAoZGF0ZS5kYXkgPCAxMCA/ICcwJyArIGRhdGUuZGF5IDogZGF0ZS5kYXkpICsgdGhpcy5ERUxJTUlURVIgKyAoZGF0ZS5tb250aCA8IDEwID8gJzAnICsgZGF0ZS5tb250aCA6IGRhdGUubW9udGgpICsgdGhpcy5ERUxJTUlURVIgKyBkYXRlLnllYXIgOiAnJztcclxuICB9XHJcbn1cclxuXHJcbmNvbnN0IEkxOE5fVkFMVUVTID0ge1xyXG4gICdlcyc6IHtcclxuICAgIHdlZWtkYXlzOiBbJ0x1JywgJ01hJywgJ01pJywgJ0p1JywgJ1ZpJywgJ1NhJywgJ0RvJ10sXHJcbiAgICBtb250aHM6IFsnRW5lJywgJ0ZlYicsICdNYXInLCAnQWJyJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0FnbycsICdTZXAnLCAnT2N0JywgJ05vdicsICdEaWMnXSxcclxuICAgIHdlZWtMYWJlbDogJ3NlbSdcclxuICB9XHJcbiAgLy8gb3RoZXIgbGFuZ3VhZ2VzIHlvdSB3b3VsZCBzdXBwb3J0XHJcbn07XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBJMThuIHtcclxuICBsYW5ndWFnZSA9ICdlcyc7XHJcbn1cclxuXHJcbi8vIERlZmluZSBjdXN0b20gc2VydmljZSBwcm92aWRpbmcgdGhlIG1vbnRocyBhbmQgd2Vla2RheXMgdHJhbnNsYXRpb25zXHJcbkBJbmplY3RhYmxlKClcclxuZXhwb3J0IGNsYXNzIEN1c3RvbURhdGVwaWNrZXJJMThuIGV4dGVuZHMgTmdiRGF0ZXBpY2tlckkxOG4ge1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2kxOG46IEkxOG4pIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgfVxyXG5cclxuICBnZXRXZWVrZGF5TGFiZWwod2Vla2RheTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBJMThOX1ZBTFVFU1t0aGlzLl9pMThuLmxhbmd1YWdlXS53ZWVrZGF5c1t3ZWVrZGF5IC0gMV07XHJcbiAgfVxyXG5cclxuICBnZXRXZWVrTGFiZWwoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBJMThOX1ZBTFVFU1t0aGlzLl9pMThuLmxhbmd1YWdlXS53ZWVrTGFiZWw7XHJcbiAgfVxyXG5cclxuICBnZXRNb250aFNob3J0TmFtZShtb250aDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBJMThOX1ZBTFVFU1t0aGlzLl9pMThuLmxhbmd1YWdlXS5tb250aHNbbW9udGggLSAxXTtcclxuICB9XHJcblxyXG4gIGdldE1vbnRoRnVsbE5hbWUobW9udGg6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5nZXRNb250aFNob3J0TmFtZShtb250aCk7XHJcbiAgfVxyXG5cclxuICBnZXREYXlBcmlhTGFiZWwoZGF0ZTogTmdiRGF0ZVN0cnVjdCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYCR7ZGF0ZS5kYXl9LSR7ZGF0ZS5tb250aH0tJHtkYXRlLnllYXJ9YDtcclxuICB9XHJcblxyXG4gIGdldFdlZWtkYXlTaG9ydE5hbWUod2Vla2RheTogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBJMThOX1ZBTFVFU1t0aGlzLl9pMThuLmxhbmd1YWdlXS53ZWVrZGF5c1t3ZWVrZGF5IC0gMV07XHJcbiAgfTtcclxufVxyXG5cclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnbGliLUZvcm1BdXJvcmEnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9mb3JtLWF1cm9yYS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vZm9ybS1hdXJvcmEuY29tcG9uZW50LmNzcyddLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge3Byb3ZpZGU6IE5nYkRhdGVBZGFwdGVyLCB1c2VDbGFzczogQ3VzdG9tQWRhcHRlcn0sXHJcbiAgICB7cHJvdmlkZTogTmdiRGF0ZVBhcnNlckZvcm1hdHRlciwgdXNlQ2xhc3M6IEN1c3RvbURhdGVQYXJzZXJGb3JtYXR0ZXJ9LFxyXG4gICAge3Byb3ZpZGU6IE5nYkRhdGVwaWNrZXJJMThuLCB1c2VDbGFzczogQ3VzdG9tRGF0ZXBpY2tlckkxOG59LFxyXG4gICAgSTE4blxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEZvcm1BdXJvcmFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XHJcblxyXG4gIEBJbnB1dCgpIGRhdGFDbGFzc0NzczogYW55O1xyXG4gIEBJbnB1dCgpIGRhdGFGb3JtOiBhbnk7XHJcbiAgQElucHV0KCkgY2xpY2tTdWJtaXQ6IGFueTtcclxuICBASW5wdXQoKSBkYXRhUmVsb2FkRm9ybTogYW55O1xyXG4gIEBJbnB1dCgpIHdlbGNvbWVUaXRsZTogYW55O1xyXG4gIEBJbnB1dCgpIHdlbGNvbWVEZXNjcmlwdGlvbjogYW55O1xyXG4gIEBJbnB1dCgpIHVybFBkZjogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIG5hbWVDb21wYW55OiBzdHJpbmc7XHJcbiAgQElucHV0KCkgc2NoZWR1bGU6IHN0cmluZztcclxuICBASW5wdXQoKSBnZXRUZXJtc0FuZENvbmRpdGlvbnM6IGFueTtcclxuICBASW5wdXQoKSByZWdleFR5cGU6IGFueTtcclxuICBASW5wdXQoKSBnZXRJcEFkZHJlc3M6IGFueTtcclxuICBAVmlld0NoaWxkKCdmb3JtRHluYW1pYycsIHtzdGF0aWM6IHRydWV9KSBmb3JtRHluYW1pYzogTmdGb3JtO1xyXG4gIEBPdXRwdXQoKSByZXNwb25zZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xyXG4gIEBPdXRwdXQoKSBzdW1taXQgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuICBAT3V0cHV0KCkgc2V0QWNjZXB0YW5jZURvY3VtZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XHJcblxyXG4gIHRpcG9kb2NOdW1Eb2M6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBvblN1Ym1pdEV2ZW50OiBhbnkgPSBmYWxzZTtcclxuICBjb3VudFN1Ym1pdCA9IDA7XHJcbiAgd2F0Y2hWYWxpZCA9IGZhbHNlO1xyXG4gIHdhdGNoUmVxdWlyZWQgPSBmYWxzZTtcclxuICBjYXB0Y2hhVmFsaWQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBkaXNwbGF5TW9udGhzID0gMjtcclxuICBuYXZpZ2F0aW9uID0gJ3NlbGVjdCc7XHJcbiAgc2hvd1dlZWtOdW1iZXJzID0gZmFsc2U7XHJcbiAgb3V0c2lkZURheXMgPSAndmlzaWJsZSc7XHJcbiAgcmVzcFNlcnZpY2VTZWdtZW50YXRpb246IGFueSA9IG51bGw7XHJcblxyXG5cclxuICAvL2VtYWlsUGF0dGVybiA9IFwiXlthLXowLTkuXyUrLV0rQFthLXowLTkuLV0rXFwuW2Etel17Miw0fSRcIjtcclxuXHJcbiAgdG9kYXkgPSBtb21lbnQobmV3IERhdGUoKSk7XHJcbiAgbWF4WWVhciA9IHRoaXMudG9kYXkueWVhcigpO1xyXG4gIG1pblllYXIgPSB0aGlzLnRvZGF5LnllYXIoKSAtIDgyO1xyXG4gIG1pbkRhdGUgPSB0aGlzLm1pblllYXIudG9TdHJpbmcoKSArICctJyArIHRoaXMudG9kYXkubW9udGgoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJykgKyAnLScgKyB0aGlzLnRvZGF5LmRhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7Ly8ge3llYXI6IHRoaXMubWluWWVhciwgbW9udGg6IHRoaXMudG9kYXkubW9udGgoKSwgZGF5OiB0aGlzLnRvZGF5LmRhdGUoKX07XHJcbiAgbWF4RGF0ZSA9IHRoaXMubWF4WWVhci50b1N0cmluZygpICsgJy0nICsgKHRoaXMudG9kYXkubW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKSArICctJyArIHRoaXMudG9kYXkuZGF0ZSgpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTsvLyB7eWVhcjogdGhpcy5tYXhZZWFyLCBtb250aDogdGhpcy50b2RheS5tb250aCgpICsgMSwgZGF5OiB0aGlzLnRvZGF5LmRhdGUoKX07XHJcblxyXG4gIC8vUmV2aXNhciB2YXJpYWJsZXNcclxuICByZWNoYXJnZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGluZGljYXRpdm86IHN0cmluZyA9ICc1Nyc7XHJcbiAgLy8gQFZpZXdDaGlsZChcIm1vZGFsVHVybnNcIikgbXlNb2RhbDogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdtb2RhbFR1cm5zJywge3N0YXRpYzogZmFsc2V9KSBteU1vZGFsOiBFbGVtZW50UmVmO1xyXG4gIGZpbGxkYXRhOiBGaWxsO1xyXG4gIGRlZmF1bHREb2NUeXBlOiBzdHJpbmcgPSAnQ8OpZHVsYSBkZSBjaXVkYWRhbsOtYSc7XHJcblxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQpIHtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgY29uc29sZS5sb2coJ251ZXZhIHZlcnNpb24gMC4xLjAnKTtcclxuICAgIHRoaXMubWluRGF0ZSA9IG5ldyBEYXRlKHRoaXMubWluRGF0ZSkudG9JU09TdHJpbmcoKS5zcGxpdCgnVCcpWzBdO1xyXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgIHRoaXMuc3RhcnRDb21wb25lbnQoKTtcclxuICAgIH0sIDIwMDApO1xyXG4gIH1cclxuXHJcblxyXG4gIHN0YXJ0Q29tcG9uZW50KCkge1xyXG4gICAgLy9vcmRlbmEgbG9zIGNhbXBvc1xyXG4gICAgaWYgKHRoaXMuZGF0YUZvcm0gIT0gbnVsbCAmJiB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgIC8vU2FtZSByb3cgZmllbGRzXHJcbiAgICAgIHRoaXMudGlwb2RvY051bURvYyA9ICh0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMuc29tZShxdWVzdGlvbiA9PiBxdWVzdGlvbi5xdWVzdGlvbi52YWx1ZSA9PT0gJ3RpcG9Eb2MnKSAmJiB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMuc29tZShxdWVzdGlvbiA9PiBxdWVzdGlvbi5xdWVzdGlvbi52YWx1ZSA9PT0gJ251bWVyb0RvYycpKSA/IHRydWUgOiBmYWxzZTtcclxuXHJcbiAgICAgIHRoaXMuZGF0YUZvcm0uZm9ybVF1ZXN0aW9ucyA9IHRoaXMuZGF0YUZvcm0uZm9ybVF1ZXN0aW9ucy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHtcclxuICAgICAgICByZXR1cm4gYS5vcmRlciAtIGIub3JkZXI7XHJcbiAgICAgIH0pO1xyXG4gICAgICBsZXQgZXhpc3RjYXB0Y2hhID0gdGhpcy5kYXRhRm9ybS5mb3JtUXVlc3Rpb25zLmZpbHRlcigoaXRlbSkgPT4gaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gNik7XHJcblxyXG4gICAgICBpZiAoZXhpc3RjYXB0Y2hhLmxlbmd0aCA9PSAwKSB7XHJcbiAgICAgICAgdGhpcy5jYXB0Y2hhVmFsaWQgPSB0cnVlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5kYXRhRm9ybS5mb3JtUXVlc3Rpb25zKSB7XHJcbiAgICAgICAgaWYgKGl0ZW0ucXVlc3Rpb24ubWF4bGVuZ3RoID09IG51bGwgfHwgaXRlbS5xdWVzdGlvbi5tYXhsZW5ndGggPT0gdW5kZWZpbmVkIHx8IGl0ZW0ucXVlc3Rpb24ubWF4bGVuZ3RoID09IDApIHtcclxuICAgICAgICAgIGl0ZW0ucXVlc3Rpb24ubWF4bGVuZ3RoID0gNTI0Mjg4OyAvL2RlZmF1bHR2YWx1ZVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGl0ZW0ucXVlc3Rpb24ubWluTGVuZ3RoID09IG51bGwgfHwgaXRlbS5xdWVzdGlvbi5taW5MZW5ndGggPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICBpdGVtLnF1ZXN0aW9uLm1pbkxlbmd0aCA9IDA7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmRhdGFSZWxvYWRGb3JtLmZvckVhY2goZWxlbWVudCA9PiB7XHJcbiAgICAgICAgICB0aGlzLmZpbGxkYXRhID0gZWxlbWVudDtcclxuXHJcbiAgICAgICAgICBpZiAoKGl0ZW0ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkID09PSAyIHx8IGl0ZW0ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkID09PSAxIHx8XHJcbiAgICAgICAgICAgIGl0ZW0ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkID09PSAzKSAmJiAodGhpcy5maWxsZGF0YS5kYXRhICE9PSBudWxsICYmXHJcbiAgICAgICAgICAgIHRoaXMuZmlsbGRhdGEuZGF0YSAhPT0gdW5kZWZpbmVkKSAmJiBpdGVtLnF1ZXN0aW9uLmlkID09PSB0aGlzLmZpbGxkYXRhLmlkKSB7XHJcbiAgICAgICAgICAgIGl0ZW0ucXVlc3Rpb24ucmVnaXN0cmVkID0gdGhpcy5maWxsZGF0YS5kYXRhO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICBpZiAoaXRlbS5xdWVzdGlvbi5yZWdpc3RyZWQgPT0gbnVsbCB8fCBpdGVtLnF1ZXN0aW9uLm1pbkxlbmd0aCA9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgIGl0ZW0ucXVlc3Rpb24ucmVnaXN0cmVkID0gJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByYW5nZSA9IG5ldyBGb3JtR3JvdXAoe1xyXG4gICAgc3RhcnQ6IG5ldyBGb3JtQ29udHJvbCgpLFxyXG4gICAgZW5kOiBuZXcgRm9ybUNvbnRyb2woKSxcclxuICB9KTtcclxuXHJcbiAgcmVzb2x2ZWRDYXB0Y2hhKGNhcHRjaGFSZXNwb25zZTogc3RyaW5nKSB7XHJcbiAgICB0aGlzLmNhcHRjaGFWYWxpZCA9IHRydWU7XHJcbiAgICBpZiAoIXRoaXMuZm9ybUR5bmFtaWMuZm9ybS52YWx1ZS5jYXB0Y2hhKSB7XHJcbiAgICAgIHRoaXMuZm9ybUR5bmFtaWMuY29udHJvbHMuY2FwdGNoYS5zZXRWYWx1ZShjYXB0Y2hhUmVzcG9uc2UpO1xyXG4gICAgICB0aGlzLmZvcm1EeW5hbWljLmZvcm0udmFsdWUuY2FwdGNoYSA9IGNhcHRjaGFSZXNwb25zZTtcclxuICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bkluZycpLnN0eWxlLm9wYWNpdHkgPSAhdGhpcy5mb3JtRHluYW1pYy52YWxpZCA/ICcwLjY1JyA6ICcxJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vRm9ybXNcclxuICAvL01ldG9kbyBwYXJhIGV2aXRhciBlbCByZW5kZXIgZGUgbG9zIGl0ZW1zIGRlbCBmb3JcclxuICBwdWJsaWMgdHJhY2tCeUluZGV4KGluZGV4OiBudW1iZXIsIG9iajogYW55KTogYW55IHtcclxuICAgIHJldHVybiBpbmRleDtcclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlVmFsaWRQYXR0ZXIoZXZlbnQsIHF1ZXN0aW9uKSB7XHJcbiAgICBpZiAocXVlc3Rpb24ucGF0dGVybiAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgbGV0IHZhbGlkID0gdHJ1ZTtcclxuICAgICAgbGV0IGtleXZhbGlkID0gWzgsIDMyLCAzNywgMzgsIDM5LCA0MCwgNDYsIDldO1xyXG4gICAgICAvL2RpZmVyZW50ZSBkZSBCYWNrcHNhY2VcclxuICAgICAgLy9zZSBkZWphIGNhdGNoIHBvciBlcnJvciBubyBjb250cm9sYWJsZSBlbiBvdHJvIHRpZW1wbyBkZSBlamVjdWNpb25cclxuICAgICAgdHJ5IHtcclxuICAgICAgICBpZiAoIWtleXZhbGlkLmluY2x1ZGVzKGV2ZW50LmtleUNvZGUpKSB7XHJcbiAgICAgICAgICBjb25zdCByZWdleCA9IG5ldyBSZWdFeHAocXVlc3Rpb24ucGF0dGVybik7XHJcbiAgICAgICAgICB2YWxpZCA9IHJlZ2V4LnRlc3QoZXZlbnQua2V5KTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuIHZhbGlkO1xyXG4gICAgfVxyXG5cclxuICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFyJyArIHF1ZXN0aW9uLnZhbHVlKS5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICd0cnVlJyk7XHJcblxyXG4gICAgLy9pZiB0ZW1wb3JhbCBtaWVudHJhcyBzZSBtaWdyYW4gdG9kb3MgbG9zIHRpcG9zIGRlIGNhbXBvcyBhbCBmb3JlYWNoXHJcbiAgICBpZiAocXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkICE9IDExICYmIHF1ZXN0aW9uLnF1ZXN0aW9uVHlwZS5pZCAhPSA3KSB7XHJcbiAgICAgIGlmICh0aGlzLnZhbGlkTWluTGVuZ3RoKHRoaXMuZm9ybUR5bmFtaWMsIHF1ZXN0aW9uKSkge1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHF1ZXN0aW9uLnZhbHVlKS5zdHlsZS5ib3JkZXJDb2xvciA9ICcjRkYwMDAwJztcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWwnICsgcXVlc3Rpb24udmFsdWUpLnJlbW92ZUF0dHJpYnV0ZSgnaGlkZGVuJyk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQocXVlc3Rpb24udmFsdWUpLnN0eWxlLmJvcmRlckNvbG9yID0gJyNFNEU0RTQnO1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtbCcgKyBxdWVzdGlvbi52YWx1ZSkuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAndHJ1ZScpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh0aGlzLnZhbGlkTWF4TGVuZ3RoKHRoaXMuZm9ybUR5bmFtaWMsIHF1ZXN0aW9uKSkge1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHF1ZXN0aW9uLnZhbHVlKS5zdHlsZS5ib3JkZXJDb2xvciA9ICcjRkYwMDAwJztcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXhsJyArIHF1ZXN0aW9uLnZhbHVlKS5yZW1vdmVBdHRyaWJ1dGUoJ2hpZGRlbicpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHF1ZXN0aW9uLnZhbHVlKS5zdHlsZS5ib3JkZXJDb2xvciA9ICcjRTRFNEU0JztcclxuICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbXhsJyArIHF1ZXN0aW9uLnZhbHVlKS5zZXRBdHRyaWJ1dGUoJ2hpZGRlbicsICd0cnVlJyk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcblxyXG4gICAgdGhpcy5kYXRhRm9ybS5mb3JtUXVlc3Rpb25zLmZvckVhY2goZm9ybVF1ZXN0aW9uID0+IHtcclxuICAgICAgc3dpdGNoIChmb3JtUXVlc3Rpb24ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkKSB7XHJcbiAgICAgICAgLy9zZSB2YWxpZGEgIGNhbXBvIGRlIHRpcG8gY2FsZW5kYXJpb1xyXG4gICAgICAgIGNhc2UgNzpcclxuICAgICAgICAgIGlmIChxdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gNylcclxuICAgICAgICAgICAgdGhpcy5jYWxlbmRhclJ1bGVzVmFsaWRhdGUoZm9ybVF1ZXN0aW9uKTtcclxuICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgIC8vc2UgdmFsaWRhICBjYW1wbyBkZSB0aXBvIGVtYWlsXHJcbiAgICAgICAgY2FzZSAxMTpcclxuICAgICAgICAgIGlmIChxdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gMTEpXHJcbiAgICAgICAgICAgIHRoaXMuZW1haWxSdWxlc1ZhbGlkYXRlKGZvcm1RdWVzdGlvbik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2J0bkluZycpLnN0eWxlLm9wYWNpdHkgPSAhdGhpcy5mb3JtRHluYW1pYy52YWxpZCA/ICcwLjY1JyA6ICcxJztcclxuICB9XHJcblxyXG4gIHZhbGlkT25seVRleHQoZXZlbnQpIHtcclxuICAgIGxldCByZWdleCA9IC9eW2EtekEtWlxcdTAwQzAtXFx1MDE3Rl0rJC9nO1xyXG4gICAgaWYgKGV2ZW50LmNoYXJDb2RlID09IDMyKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgbGV0IHZhbGlkID0gcmVnZXgudGVzdChldmVudC5rZXkpO1xyXG5cclxuICAgIHJldHVybiB2YWxpZDtcclxuICB9XHJcblxyXG4gIHZhbGlkRGF0ZShldmVudCkge1xyXG4gICAgLypsZXQgcGF0dGVybiA9IC8oPzowWzEtOV18WzEyXVswLTldfDNbMDFdKVxcLyg/OjBbMS05XXwxWzAtMl0pXFwvKD86MTl8MjApWzAtOV17Mn0vO1xyXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKHBhdHRlcm4pO1xyXG4gICAgdmFsaWQgPSByZWdleC50ZXN0KGV2ZW50LmtleSk7XHJcbiAgICAqL1xyXG4gICAgY29uc3QgbWF0Y2hlcyA9IFN0cmluZyhldmVudC5rZXkpLm1hdGNoKHRoaXMucmVnZXhUeXBlLmRhdGUuZXhwKTtcclxuICAgIGxldCB2YWxpZCA9IHRydWU7XHJcbiAgICBpZiAobWF0Y2hlcyA9PT0gbnVsbClcclxuICAgICAgdmFsaWQgPSBmYWxzZTtcclxuXHJcbiAgICAvLyBhbGVydCh2YWxpZCk7XHJcblxyXG4gICAgcmV0dXJuIHZhbGlkO1xyXG5cclxuICB9XHJcblxyXG4gIG9uQ2hhbmdlVmFsaWREYXRlKGV2ZW50KSB7XHJcblxyXG4gICAgLy9sZXQgcGF0dGVybiA9IC8oPzowWzEtOV18MVswLTJdKVxcLyg/OjBbMS05XXxbMTJdWzAtOV18M1swMV0pXFwvKD86MTl8MjApWzAtOV17Mn0vO1xyXG4gICAgbGV0IGRhdGVOID0gL1swLTldfFxcLy87XHJcbiAgICBsZXQgdmFsaWQgPSB0cnVlO1xyXG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGRhdGVOKTtcclxuICAgIHZhbGlkID0gcmVnZXgudGVzdChldmVudC5rZXkpO1xyXG4gICAgcmV0dXJuIHZhbGlkO1xyXG5cclxuICB9XHJcblxyXG4gIHJlZGlyZXRvdXRzaWRlKGV2ZW50LCBxdWVzdGlvbikge1xyXG4gICAgLy9zZSBkZWphIGNhdGNoIHBvciBlcnJvciBubyBjb250cm9sYWJsZSBlbiBvdHJvIHRpZW1wbyBkZSBlamVjdWNpb25cclxuICAgIHRyeSB7XHJcbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIHdpbmRvdy5vcGVuKHF1ZXN0aW9uLnZhbHVlLCAnX2JsYW5rJyk7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGlzcGF0Y2ggc3VibWl0IGV2ZW50IGZvciB2YWxpZGF0aW9ucyBleGlzdHNcclxuICAgKiBAcGFyYW0gY2hhbmdlXHJcbiAgICovXHJcbiAgbmdPbkNoYW5nZXMoY2hhbmdlOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICB0aGlzLmNvdW50U3VibWl0Kys7XHJcbiAgfVxyXG5cclxuICAvL29uU3VibWl0KGZvcm06IE5nRm9ybSkge1xyXG4gIG9uU3VibWl0KCkge1xyXG4gICAgbGV0IGZvcm0gPSB0aGlzLmZvcm1EeW5hbWljO1xyXG4gICAgdGhpcy53YXRjaFZhbGlkID0gdHJ1ZTtcclxuICAgIHRoaXMud2F0Y2hSZXF1aXJlZCA9IHRydWU7XHJcblxyXG4gICAgaWYgKGZvcm0udmFsaWQpIHtcclxuICAgICAgaWYgKCF0aGlzLnZhbGlkUnVsZXNGaWVsZHMoZm9ybS5jb250cm9sc1snbnVtZXJvRG9jJ10udmFsdWUudG9TdHJpbmcoKSwgZm9ybS5jb250cm9sc1snY2VsdWxhciddLnZhbHVlLnRvU3RyaW5nKCksIGZvcm0uY29udHJvbHNbJ2VtYWlsJ10udmFsdWUpKVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAodGhpcy52YWxpZE1pbmxlbmdodEFsbFF1ZXN0aW9ucyhmb3JtLnZhbHVlKSAmJiB0aGlzLnZhbGlkTWF4TGVuZ3RoQWxsUXVlc3Rpb25zKGZvcm0udmFsdWUpICYmIGZvcm0udmFsaWQpIHtcclxuICAgICAgaWYgKHRoaXMuZGF0YUZvcm0udXJsU2VuZCAhPSAnJyAmJiB0aGlzLmNhcHRjaGFWYWxpZCkge1xyXG4gICAgICAgIHRoaXMuaHR0cC5wb3N0PGFueT4odGhpcy5kYXRhRm9ybS51cmxTZW5kLCBmb3JtLnZhbHVlKS5zdWJzY3JpYmUoKHJlc3ApID0+IHRoaXMucmVzcG9uc2UuZW1pdChyZXNwKSk7XHJcbiAgICAgIH0gZWxzZSBpZiAoZm9ybS52YWxpZCAmJiB0aGlzLmNhcHRjaGFWYWxpZCkge1xyXG4gICAgICAgIHRoaXMuc3VtbWl0LmVtaXQoZm9ybS52YWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcblxyXG4gIHZhbGlkUnVsZXNGaWVsZHMobnVtZXJvRG9jOiBTdHJpbmcsIG51bWVyb0NlbDogU3RyaW5nLCBlbWFpbDogU3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAvLyBWYWxpZGFjaW9uZXMgcGFyYSBjZWx1bGFyIGVuIGNhc28gZGUgaW5kaWNhdGl2byBlbiBDb2xvbWJpYVxyXG4gICAgbGV0IGNlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFyY2VsdWxhcicpO1xyXG4gICAgbGV0IGRvYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGFybnVtZXJvRG9jJyk7XHJcbiAgICBsZXQgdmFsT2sgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuaW5kaWNhdGl2byA9PSAnKzU3JyB8fCB0aGlzLmluZGljYXRpdm8gPT0gJzU3Jykge1xyXG4gICAgICBsZXQgc3RyaW5nT3JkZW5hZG8gPSB0aGlzLm9yZGVyU3RyaW5nKG51bWVyb0RvYyk7XHJcbiAgICAgIGlmICh0aGlzLm5hbWVDb21wYW55LnRvVXBwZXJDYXNlKCkgIT09ICdDTEFSTycpIHsvL2NsYXJvIGFjZXB0YSBucm8gY29uc2VjdXRpdm9zXHJcbiAgICAgICAgaWYgKG51bWVyb0RvYyA9PSBzdHJpbmdPcmRlbmFkbykge1xyXG4gICAgICAgICAgZG9jLnN0eWxlLmJvcmRlckNvbG9yID0gJyNGRjAwMDAnO1xyXG4gICAgICAgICAgZG9jLnJlbW92ZUF0dHJpYnV0ZSgnaGlkZGVuJyk7XHJcbiAgICAgICAgICBkb2MudGV4dENvbnRlbnQgPSAnRWwgbnVtZXJvIGRvY3VtZW50byBObyBkZWJlIGNvbnRlbmVyIGNhcmFjdGVyZXMgY29uc2VjdXRpdm9zJztcclxuICAgICAgICAgIHZhbE9rID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgLy90aGlzLm1zZ0Vycm9yQ2FtcG8gPSBcIkVsIG51bWVybyBkb2N1bWVudG8gTm8gZGViZSBjb250ZW5lciBjYXJhY3RlcmVzIGNvbnNlY3V0aXZvc1wiO1xyXG4gICAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmIChudW1lcm9DZWwuc3Vic3RyaW5nKDAsIDEpICE9ICczJykge1xyXG4gICAgICAgIGNlbC5zdHlsZS5ib3JkZXJDb2xvciA9ICcjRkYwMDAwJztcclxuICAgICAgICBjZWwucmVtb3ZlQXR0cmlidXRlKCdoaWRkZW4nKTtcclxuICAgICAgICBjZWwudGV4dENvbnRlbnQgPSAnRWwgcHJpbWVyIGNhcsOhY3RlciBkZWwgY2VsdWxhciBkZWJlIHNlciAzJztcclxuICAgICAgICB2YWxPayA9IGZhbHNlO1xyXG5cclxuICAgICAgICAvL3RoaXMubXNnRXJyb3JDYW1wbyA9IFwiRWwgcHJpbWVyIGNhcsOhY3RlciBkZWwgY2VsdWxhciBkZWJlIHNlciAzXCI7XHJcbiAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgLypcclxuICAgICAgaWYgKHBhcnNlSW50KG51bWVyb0NlbC5zdWJzdHJpbmcoMCwgMykpID4gMzUwKSB7XHJcbiAgICAgICAgY2VsLnN0eWxlLmJvcmRlckNvbG9yID0gXCIjRkYwMDAwXCI7XHJcbiAgICAgICAgY2VsLnJlbW92ZUF0dHJpYnV0ZShcImhpZGRlblwiKTtcclxuICAgICAgICBjZWwudGV4dENvbnRlbnQgPSBcIkVsIHByZWZpam8gZGVsIGNlbHVsYXIgbm8gZGViZSBzZXIgbWF5b3IgYSAzNTBcIjtcclxuICAgICAgICB2YWxPayA9IGZhbHNlO1xyXG4gICAgICAgIC8vdGhpcy5tc2dFcnJvckNhbXBvID0gXCJFbCBwcmVmaWpvIGRlbCBjZWx1bGFyIG5vIGRlYmUgc2VyIG1heW9yIGEgMzUwXCI7XHJcbiAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgICAgKi9cclxuICAgICAgLy9FbiBjYXNvIGRlIHF1ZSBlbCBuw7ptZXJvIHNlIHJlcGl0YSwgZWplbXBsbyAzMzMzMzMzM1xyXG4gICAgICBsZXQgbGlzdG51bWJlciA9IG51bWVyb0RvYy5zdWJzdHJpbmcoMCwgMSk7XHJcbiAgICAgIGZvciAobGV0IGluZGV4ID0gMTsgaW5kZXggPCBudW1lcm9Eb2MubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgICAgbGlzdG51bWJlciA9IGxpc3RudW1iZXIgKyBudW1lcm9Eb2Muc3Vic3RyaW5nKDAsIDEpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAobnVtZXJvRG9jID09IGxpc3RudW1iZXIpIHtcclxuICAgICAgICBkb2Muc3R5bGUuYm9yZGVyQ29sb3IgPSAnI0ZGMDAwMCc7XHJcbiAgICAgICAgZG9jLnJlbW92ZUF0dHJpYnV0ZSgnaGlkZGVuJyk7XHJcbiAgICAgICAgZG9jLnRleHRDb250ZW50ID0gJ0NhcmFjdGVyZXMgbnVtw6lyaWNvcyBubyBzZSBwdWVkZW4gcmVwZXRpcnNlIGRlIG1hbmVyYSBjb250aW51YSAnO1xyXG4gICAgICAgIHZhbE9rID0gZmFsc2U7XHJcblxyXG4gICAgICAgIC8vdGhpcy5tc2dFcnJvckNhbXBvID0gXCJDYXJhY3RlcmVzIG51bcOpcmljb3Mgbm8gc2UgcHVlZGVuIHJlcGV0aXJzZSBkZSBtYW5lcmEgY29udGludWEgXCI7XHJcbiAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIEVuIGNhc28gZGUgcXVlIGVsIG7Dum1lcm8gc2UgcmVwaXRhLCBlamVtcGxvIDMzMzMzMzMzXHJcbiAgICAgIGxldCBhcnJheVBob25lUmVwZWF0ID0gQXJyYXkuZnJvbShTdHJpbmcobnVtZXJvQ2VsKSwgTnVtYmVyKTtcclxuICAgICAgbGV0IGFycmF5UGhvbmVPdXRSZXBlYXQgPSBbLi4ubmV3IFNldChhcnJheVBob25lUmVwZWF0KV07XHJcbiAgICAgIGlmIChhcnJheVBob25lT3V0UmVwZWF0Lmxlbmd0aCA9PSAxKSB7XHJcbiAgICAgICAgY2VsLnN0eWxlLmJvcmRlckNvbG9yID0gJyNGRjAwMDAnO1xyXG4gICAgICAgIGNlbC5yZW1vdmVBdHRyaWJ1dGUoJ2hpZGRlbicpO1xyXG4gICAgICAgIGNlbC50ZXh0Q29udGVudCA9ICdFbCBuw7ptZXJvIHF1ZSBpbmdyZXNhIG5vIGVzIHZhbGlkbyc7XHJcbiAgICAgICAgdmFsT2sgPSBmYWxzZTtcclxuICAgICAgICAvL3RoaXMubXNnRXJyb3JDYW1wbyA9IFwiRWwgbsO6bWVybyBxdWUgaW5ncmVzYSBubyBlcyB2YWxpZG9cIjtcclxuICAgICAgICAvL3JldHVybiBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIGlmICh0aGlzLmluZGljYXRpdm8gPT0gJys1OTMnIHx8IHRoaXMuaW5kaWNhdGl2byA9PSAnNTkzJykge1xyXG4gICAgICBpZiAobnVtZXJvQ2VsLnN1YnN0cmluZygwLCAxKSAhPSAnOScpIHtcclxuICAgICAgICBjZWwuc3R5bGUuYm9yZGVyQ29sb3IgPSAnI0ZGMDAwMCc7XHJcbiAgICAgICAgY2VsLnJlbW92ZUF0dHJpYnV0ZSgnaGlkZGVuJyk7XHJcbiAgICAgICAgY2VsLnRleHRDb250ZW50ID0gJ0VsIHByaW1lciBjYXLDoWN0ZXIgZGVsIGNlbHVsYXIgZGViZSBzZXIgOSc7XHJcbiAgICAgICAgdmFsT2sgPSBmYWxzZTtcclxuICAgICAgICAvL3RoaXMubXNnRXJyb3JDYW1wbyA9IFwiRWwgcHJpbWVyIGNhcsOhY3RlciBkZWwgY2VsdWxhciBkZWJlIHNlciA5XCI7XHJcbiAgICAgICAgLy9yZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIC8vc2UgdmFsaWRhbiBsb3MgY2FtcG9zIHBvciB0aXBvIGRlIGNhbXBvIHkgbm8gcG9yIHZhbHVlXHJcbiAgICB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMuZm9yRWFjaChmb3JtUXVlc3Rpb24gPT4ge1xyXG4gICAgICBzd2l0Y2ggKGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQpIHtcclxuICAgICAgICAvL3NlIHZhbGlkYSAgY2FtcG8gZGUgdGlwbyBlbWFpbFxyXG4gICAgICAgIGNhc2UgMTE6XHJcbiAgICAgICAgICB2YWxPayA9IHRoaXMuZW1haWxSdWxlc1ZhbGlkYXRlKGZvcm1RdWVzdGlvbik7XHJcbiAgICAgICAgICBicmVhaztcclxuICAgICAgfVxyXG4gICAgfSk7XHJcblxyXG4gICAgcmV0dXJuIHZhbE9rO1xyXG4gIH1cclxuXHJcbiAgb3JkZXJTdHJpbmcodmFsdWU6IFN0cmluZykge1xyXG4gICAgbGV0IGFycmF5TnVtYmVyID0gW107XHJcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgdmFsdWUubGVuZ3RoOyBpbmRleCsrKSB7XHJcbiAgICAgIGFycmF5TnVtYmVyLnB1c2gocGFyc2VJbnQodmFsdWUuc3Vic3RyaW5nKGluZGV4LCBpbmRleCArIDEpKSk7XHJcbiAgICB9XHJcbiAgICAvL29yZGVuYSBlbCBhcnJheVxyXG4gICAgYXJyYXlOdW1iZXIuc29ydChmdW5jdGlvbihhLCBiKSB7XHJcbiAgICAgIHJldHVybiBhIC0gYjtcclxuICAgIH0pO1xyXG4gICAgbGV0IG51bWJlck9yZGVyID0gJyc7XHJcbiAgICBudW1iZXJPcmRlciA9IGFycmF5TnVtYmVyWzBdO1xyXG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IGFycmF5TnVtYmVyLmxlbmd0aDsgaW5kZXgrKykge1xyXG4gICAgICBudW1iZXJPcmRlciA9IG51bWJlck9yZGVyICsgKGFycmF5TnVtYmVyWzBdICsgaW5kZXgpLnRvU3RyaW5nKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbnVtYmVyT3JkZXI7XHJcbiAgfVxyXG5cclxuICB2YWxpZE1pbmxlbmdodEFsbFF1ZXN0aW9ucyhmb3JtOiBhbnkpOiBib29sZWFuIHtcclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiB0aGlzLmRhdGFGb3JtLmZvcm1RdWVzdGlvbnMpIHtcclxuICAgICAgaWYgKGl0ZW0ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkID09IDEgfHwgaXRlbS5xdWVzdGlvbi5xdWVzdGlvblR5cGUuaWQgPT0gMikge1xyXG4gICAgICAgIGxldCBtaW5MZW5ndGggPSBwYXJzZUludChpdGVtLnF1ZXN0aW9uLm1pbkxlbmd0aCk7XHJcbiAgICAgICAgbGV0IGZvcm1WYWx1ZUxlbmd0aCA9IHBhcnNlSW50KGZvcm1baXRlbS5xdWVzdGlvbi52YWx1ZV0udG9TdHJpbmcoKS5sZW5ndGgpO1xyXG4gICAgICAgIGlmIChtaW5MZW5ndGggPiAwICYmIGZvcm1WYWx1ZUxlbmd0aCAhPSBtaW5MZW5ndGggJiYgZm9ybVZhbHVlTGVuZ3RoIDwgbWluTGVuZ3RoKSByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRNYXhMZW5ndGhBbGxRdWVzdGlvbnMoZm9ybTogYW55KTogYm9vbGVhbiB7XHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgdGhpcy5kYXRhRm9ybS5mb3JtUXVlc3Rpb25zKSB7XHJcbiAgICAgIGlmIChpdGVtLnF1ZXN0aW9uLnF1ZXN0aW9uVHlwZS5pZCA9PSAxIHx8IGl0ZW0ucXVlc3Rpb24ucXVlc3Rpb25UeXBlLmlkID09IDIpIHtcclxuICAgICAgICBsZXQgbWF4TGVuZ3RoID0gcGFyc2VJbnQoaXRlbS5xdWVzdGlvbi5tYXhMZW5ndGgpO1xyXG4gICAgICAgIGxldCBmb3JtVmFsdWVMZW5ndGggPSBwYXJzZUludChmb3JtW2l0ZW0ucXVlc3Rpb24udmFsdWVdLnRvU3RyaW5nKCkubGVuZ3RoKTtcclxuICAgICAgICBpZiAobWF4TGVuZ3RoID4gMCAmJiBmb3JtVmFsdWVMZW5ndGggIT0gbWF4TGVuZ3RoICYmIGZvcm1WYWx1ZUxlbmd0aCA+IG1heExlbmd0aCkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIHZhbGlkUmVxdWlyZWQoZm9ybTogTmdGb3JtLCBxdWVzdGlvbik6IEJvb2xlYW4ge1xyXG4gICAgLy9zZSBkZWphIGNhdGNoIHBvciBlcnJvciBubyBjb250cm9sYWJsZSBlbiBvdHJvIHRpZW1wbyBkZSBlamVjdWNpb25cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChxdWVzdGlvbiAhPSB1bmRlZmluZWQgJiYgcXVlc3Rpb24udmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKFxyXG4gICAgICAgICAgZm9ybS5jb250cm9sc1txdWVzdGlvbi52YWx1ZV0gIT0gdW5kZWZpbmVkICYmXHJcbiAgICAgICAgICBmb3JtLmNvbnRyb2xzW3F1ZXN0aW9uLnZhbHVlXS5lcnJvcnMgIT0gbnVsbCAmJlxyXG4gICAgICAgICAgZm9ybS5jb250cm9sc1txdWVzdGlvbi52YWx1ZV0uZXJyb3JzLnJlcXVpcmVkXHJcbiAgICAgICAgKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICB2YWxpZE1pbkxlbmd0aChmb3JtOiBOZ0Zvcm0sIHF1ZXN0aW9uKTogQm9vbGVhbiB7XHJcbiAgICAvL3NlIGRlamEgY2F0Y2ggcG9yIGVycm9yIG5vIGNvbnRyb2xhYmxlIGVuIG90cm8gdGllbXBvIGRlIGVqZWN1Y2lvblxyXG4gICAgdHJ5IHtcclxuICAgICAgaWYgKHF1ZXN0aW9uICE9IHVuZGVmaW5lZCAmJiBxdWVzdGlvbi52YWx1ZSAhPSB1bmRlZmluZWQpIHtcclxuICAgICAgICBpZiAocXVlc3Rpb24ubWluTGVuZ3RoID4gZm9ybS5jb250cm9sc1txdWVzdGlvbi52YWx1ZV0udmFsdWUudG9Mb2NhbGVTdHJpbmcoKS5sZW5ndGggJiYgcXVlc3Rpb24ubWluTGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRNYXhMZW5ndGgoZm9ybTogTmdGb3JtLCBxdWVzdGlvbik6IEJvb2xlYW4ge1xyXG4gICAgLy9zZSBkZWphIGNhdGNoIHBvciBlcnJvciBubyBjb250cm9sYWJsZSBlbiBvdHJvIHRpZW1wbyBkZSBlamVjdWNpb25cclxuICAgIHRyeSB7XHJcbiAgICAgIGlmIChxdWVzdGlvbiAhPSB1bmRlZmluZWQgJiYgcXVlc3Rpb24udmFsdWUgIT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgaWYgKHF1ZXN0aW9uLm1heExlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGlmIChxdWVzdGlvbi5tYXhMZW5ndGggKyAxIDw9IGZvcm0uY29udHJvbHNbcXVlc3Rpb24udmFsdWVdLnZhbHVlLnRvU3RyaW5nKCkucmVwbGFjZSgvXFwuL2csICcnKS5sZW5ndGgpIHtcclxuICAgICAgICAgICAgaWYgKCF0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzW3F1ZXN0aW9uLnZhbHVlXS5oYXNFcnJvcignZXJyb3JNYXhMZW5ndGgnKSkge1xyXG4gICAgICAgICAgICAgIHRoaXMuZm9ybUR5bmFtaWMuY29udHJvbHNbcXVlc3Rpb24udmFsdWVdLnNldEVycm9ycyh7J2Vycm9yTWF4TGVuZ3RoJzogdHJ1ZX0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIH1cclxuICAgIHJldHVybiBmYWxzZTtcclxuICB9XHJcblxyXG4gIHR5Y1NlbGVjdGlvbihldmVudCkge1xyXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgIGxldCB0eWMgPSA8SFRNTElucHV0RWxlbWVudD4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3R4dFBvbGl0aWNhcycpO1xyXG4gICAgdHljLnN0eWxlLmNvbG9yID0gJyNBM0FEMzInO1xyXG5cclxuXHJcbiAgICAvLyB0aGlzLmV4dGVybmFsU2VydmljZS5nZXRUZXJtc0FuZENvbmRpdGlvbnMoKS5zdWJzY3JpYmUocmVzcCA9PiB7XHJcbiAgICBsZXQgYjY0ID0gbnVsbDtcclxuXHJcbiAgICBpZiAodGhpcy5nZXRUZXJtc0FuZENvbmRpdGlvbnMgJiYgdGhpcy5nZXRUZXJtc0FuZENvbmRpdGlvbnMubGlzdGFEb2N1bWVudG9zKSB7XHJcbiAgICAgIGI2NCA9IHRoaXMuZ2V0VGVybXNBbmRDb25kaXRpb25zLmxpc3RhRG9jdW1lbnRvc1swXS5jb250ZW5pZG9Eb2N1bWVudG87XHJcbiAgICAgIHRoaXMucmVzcFNlcnZpY2VTZWdtZW50YXRpb24gPSB0aGlzLmdldFRlcm1zQW5kQ29uZGl0aW9ucy5saXN0YURvY3VtZW50b3NbMF07XHJcblxyXG4gICAgICBsZXQgcGRmV2luZG93ID0gd2luZG93Lm9wZW4oJycpO1xyXG4gICAgICBwZGZXaW5kb3cuZG9jdW1lbnQud3JpdGUoXHJcbiAgICAgICAgJzxpZnJhbWUgd2lkdGg9XFwnMTAwJVxcJyBoZWlnaHQ9XFwnMTAwJVxcJyBzcmM9XFwnZGF0YTphcHBsaWNhdGlvbi9wZGY7YmFzZTY0LCAnICtcclxuICAgICAgICBlbmNvZGVVUkkoYjY0KSArICdcXCc+PC9pZnJhbWU+J1xyXG4gICAgICApO1xyXG4gICAgfVxyXG4gICAgLy8gfSlcclxuICB9XHJcblxyXG4gIG9wZW5MYWJlbFVybChldmVudCwgcXVlc3Rpb24pIHtcclxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICBsZXQgdHljID0gPEhUTUxJbnB1dEVsZW1lbnQ+IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjaGVjaycgKyBxdWVzdGlvbi5pZCk7XHJcbiAgICB0eWMuc3R5bGUuY29sb3IgPSAnI0EzQUQzMic7XHJcbiAgICB3aW5kb3cub3BlbihxdWVzdGlvbi51cmxsYWJlbCwgJ19ibGFuaycpO1xyXG4gIH1cclxuXHJcbiAgYXN5bmMgY2hlY2tUZXJtc0FuZENvbmRpdGlvbnModmFsdWUpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGlmICh2YWx1ZSkge1xyXG4gICAgICAvLyBsZXQgaXBBZGRyZXNzID0gYXdhaXQgdGhpcy5hdXJvcmFTZXJ2aWNlLmdldElwQWRkcmVzcygpLnRvUHJvbWlzZSgpO1xyXG4gICAgICBsZXQgaXBBZGRyZXNzID0gYXdhaXQgdGhpcy5nZXRJcEFkZHJlc3M7XHJcblxyXG4gICAgICBsZXQgb2JqVG9TZW5kID0ge1xyXG4gICAgICAgICdpZERvY3VtZW50byc6IHRoaXMucmVzcFNlcnZpY2VTZWdtZW50YXRpb24uaWREb2N1bWVudG8gfHwgJycsXHJcbiAgICAgICAgLy8gXCJpZERvY3VtZW50b1wiOiB0aGlzLnJlc3BTZXJ2aWNlU2VnbWVudGF0aW9uPy5pZERvY3VtZW50byB8fCBcIlwiLFxyXG4gICAgICAgICdub21icmVQb3J0YWZvbGlvJzogJzAnLFxyXG4gICAgICAgICdhcGxpY2FjaW9uJzogJ1pQX09GJyxcclxuICAgICAgICAnaXAnOiBpcEFkZHJlc3MuaXAsXHJcbiAgICAgICAgJ3RpcG9JZEFmaWwnOiAnQ0MnLFxyXG4gICAgICAgICdudW1lcm9JZEFmaWwnOiB0aGlzLmZvcm1EeW5hbWljLmNvbnRyb2xzWydudW1lcm9Eb2MnXS52YWx1ZS50b1N0cmluZygpLFxyXG4gICAgICAgICdudW1lcm9DdWVudGFQSSc6ICcwJyxcclxuICAgICAgICAndHJhbnNhY2Npb24nOiAnSU5JQ0lPIERFIFNFU0lPTl9PRicsXHJcbiAgICAgICAgJ2NvbmNlcHRvQWNlcHRhY2lvbic6ICdIQUJFQVNfREFUQV9VU09fQVBQJyxcclxuICAgICAgICAncmVzcHVlc3RhJzogJ1NJJyxcclxuICAgICAgICAndXN1YXJpb0NyZWFjaW9uJzogdGhpcy5mb3JtRHluYW1pYy5jb250cm9sc1snbnVtZXJvRG9jJ10udmFsdWUudG9TdHJpbmcoKVxyXG4gICAgICB9O1xyXG4gICAgICBsZXQgYWNlcHRhY2lvbmVzID0ge2FjZXB0YWNpb25lczogW29ialRvU2VuZF19O1xyXG4gICAgICAvLyB0aGlzLmV4dGVybmFsU2VydmljZS5zZXRBY2NlcHRhbmNlRG9jdW1lbnQoYWNlcHRhY2lvbmVzKS5zdWJzY3JpYmUoKCkgPT4geyB9KVxyXG4gICAgICB0aGlzLnNldEFjY2VwdGFuY2VEb2N1bWVudC5lbWl0KGFjZXB0YWNpb25lcyk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjYW5jZWxsS2V5cHJlc3MoKSB7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBlbWFpbFJ1bGVzVmFsaWRhdGUoZm9ybVF1ZXN0aW9uKSB7XHJcbiAgICBsZXQgdmFsT2sgPSB0cnVlO1xyXG4gICAgdHJ5IHtcclxuICAgICAgbGV0IGhhc0Vycm9yID0gZmFsc2U7XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5pZCkuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAndHJ1ZScpO1xyXG4gICAgICBsZXQgZW1sID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLmlkKTtcclxuICAgICAgbGV0IGVtYWlsID0gZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLnJlZ2lzdHJlZDtcclxuICAgICAgaWYgKCFoYXNFcnJvcikge1xyXG4gICAgICAgIGlmIChmb3JtUXVlc3Rpb24ucXVlc3Rpb24ucmVxdWlyZWQgJiYgKGVtYWlsID09ICcnIHx8IGVtYWlsID09IHVuZGVmaW5lZCB8fCBlbWFpbCA9PSBudWxsKSkge1xyXG4gICAgICAgICAgZW1sLnN0eWxlLmJvcmRlckNvbG9yID0gJyNGRjAwMDAnO1xyXG4gICAgICAgICAgZW1sLnRleHRDb250ZW50ID0gJ0VsIGNvcnJlY28gZWzDqWN0cm9uaWNvIGVzIHJlcXVlcmlkbyc7XHJcbiAgICAgICAgICBlbWwucmVtb3ZlQXR0cmlidXRlKCdoaWRkZW4nKTtcclxuICAgICAgICAgIHZhbE9rID0gZmFsc2U7XHJcbiAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghaGFzRXJyb3IpIHtcclxuICAgICAgICBpZiAodGhpcy52YWxpZE1pbkxlbmd0aCh1bmRlZmluZWQsIGZvcm1RdWVzdGlvbi5xdWVzdGlvbikpIHtcclxuICAgICAgICAgIGVtbC5zdHlsZS5ib3JkZXJDb2xvciA9ICcjRkYwMDAwJztcclxuICAgICAgICAgIGVtbC50ZXh0Q29udGVudCA9ICdEZWJlIHNlciBtw61uaW1vIGRlICcgKyBmb3JtUXVlc3Rpb24ucXVlc3Rpb24ubWluTGVuZ3RoICsgJyBjYXJhY3RlcmVzJztcclxuICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5pZCkucmVtb3ZlQXR0cmlidXRlKCdoaWRkZW4nKTtcclxuICAgICAgICAgIHZhbE9rID0gZmFsc2U7XHJcbiAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIGlmICghaGFzRXJyb3IpIHtcclxuICAgICAgICBpZiAodGhpcy52YWxpZE1heExlbmd0aCh1bmRlZmluZWQsIGZvcm1RdWVzdGlvbi5xdWVzdGlvbikpIHtcclxuICAgICAgICAgIGVtbC5zdHlsZS5ib3JkZXJDb2xvciA9ICcjRkYwMDAwJztcclxuICAgICAgICAgIGVtbC50ZXh0Q29udGVudCA9ICdEZWJlIHNlciBtYXhpbW8gZGUgJyArIGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5tYXhMZW5ndGggKyAnIGNhcmFjdGVyZXMnO1xyXG4gICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLmlkKS5yZW1vdmVBdHRyaWJ1dGUoJ2hpZGRlbicpO1xyXG4gICAgICAgICAgdmFsT2sgPSBmYWxzZTtcclxuICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFoYXNFcnJvcikge1xyXG5cclxuICAgICAgICBjb25zdCBtYXRjaGVzID0gU3RyaW5nKGVtYWlsKS5tYXRjaCh0aGlzLnJlZ2V4VHlwZS5lbWFpbC5leHApO1xyXG4gICAgICAgIGlmIChtYXRjaGVzID09IG51bGwpIHtcclxuICAgICAgICAgIGVtbC5zdHlsZS5ib3JkZXJDb2xvciA9ICcjRkYwMDAwJztcclxuICAgICAgICAgIGVtbC50ZXh0Q29udGVudCA9ICdUdSBlbWFpbCBlcyBpbnZhbGlkbyc7XHJcbiAgICAgICAgICBlbWwucmVtb3ZlQXR0cmlidXRlKCdoaWRkZW4nKTtcclxuICAgICAgICAgIHZhbE9rID0gZmFsc2U7XHJcbiAgICAgICAgICBoYXNFcnJvciA9IHRydWU7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcblxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuXHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsT2s7XHJcbiAgfVxyXG5cclxuICBjYWxlbmRhclJ1bGVzVmFsaWRhdGUoZm9ybVF1ZXN0aW9uKSB7XHJcbiAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTtcclxuICAgIHRyeSB7XHJcbiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5pZCkuc2V0QXR0cmlidXRlKCdoaWRkZW4nLCAndHJ1ZScpO1xyXG4gICAgICBsZXQgZWNhbGVuZGFyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZm9ybVF1ZXN0aW9uLnF1ZXN0aW9uLmlkKTtcclxuICAgICAgLy9zZSB2YWxpZGEgcXVlIG5vIHNlYSBudWxsIHNpIGVzIHJlcXVlcmlkb1xyXG4gICAgICBsZXQgZGF0ZSA9IGZvcm1RdWVzdGlvbi5xdWVzdGlvbi5yZWdpc3RyZWQ7XHJcbiAgICAgIGlmIChmb3JtUXVlc3Rpb24ucXVlc3Rpb24ucmVxdWlyZWQgJiYgKGRhdGUgPT0gJycgfHwgZGF0ZSA9PSB1bmRlZmluZWQgfHwgZGF0ZSA9PSBudWxsKSkge1xyXG4gICAgICAgIGVjYWxlbmRhci5zdHlsZS5ib3JkZXJDb2xvciA9ICcjRkYwMDAwJztcclxuICAgICAgICBlY2FsZW5kYXIudGV4dENvbnRlbnQgPSAnTGEgZmVjaGEgZXMgcmVxdWVyaWRhJztcclxuICAgICAgICBlY2FsZW5kYXIucmVtb3ZlQXR0cmlidXRlKCdoaWRkZW4nKTtcclxuICAgICAgfVxyXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZU5vdFNwYWNlKGV2ZW50KSB7XHJcbiAgICBpZiAoZXZlbnQuY2hhckNvZGUgPT0gMzIpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==