iptdevs-design-system 3.1.933 → 3.1.935

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,625 @@
1
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import Swal from 'sweetalert2';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "@angular/forms";
6
+ import * as i2 from "design-system";
7
+ import * as i3 from "@angular/common";
8
+ import * as i4 from "../../atoms/button/button.component";
9
+ import * as i5 from "../../atoms/input/input.component";
10
+ import * as i6 from "../../atoms/select/select.component";
11
+ export class updateUserFormComponent {
12
+ constructor(fb, cdr, parameterService, baseService, userService) {
13
+ this.fb = fb;
14
+ this.cdr = cdr;
15
+ this.parameterService = parameterService;
16
+ this.baseService = baseService;
17
+ this.userService = userService;
18
+ this.visibleModal = false;
19
+ this.closeModalIS = new EventEmitter();
20
+ this.userUpdatedEvent = new EventEmitter();
21
+ this.photo = '';
22
+ this.phoneNumberIndicatives = [];
23
+ this.idTypes = [];
24
+ this.loader = false;
25
+ this.states = [];
26
+ this.cities = [];
27
+ this.countries = [];
28
+ this.showParentSection = false;
29
+ this.showEmailIpt = false;
30
+ this.indicatives = [];
31
+ this.civilStatus = [];
32
+ this.genders = [];
33
+ this.stratums = [];
34
+ this.parametersLoaded = false;
35
+ // userUpdated = false;
36
+ this.initialFormValue = [];
37
+ this.justifyOptions = [
38
+ // { name: 'Inactivos', code: 1 },
39
+ { name: 'Activo', code: 1 },
40
+ { name: 'Removido', code: 4 }
41
+ ];
42
+ this.initForm();
43
+ }
44
+ ngOnInit() {
45
+ console.log("entro a getParameters por ngoninit");
46
+ this.getParameters();
47
+ }
48
+ ngOnChanges(changes) {
49
+ if (changes['visibleModal'] && changes['visibleModal'].currentValue) {
50
+ console.log("entro a getParameters por visible modal, donde el change es:", changes['visibleModal']);
51
+ this.initializeForm();
52
+ this.cdr.detectChanges();
53
+ }
54
+ }
55
+ getParameters() {
56
+ if (this.parametersLoaded) {
57
+ this.setParameters();
58
+ this.initializeForm();
59
+ return;
60
+ }
61
+ this.parameterService.getAllParametersCodForm().subscribe({
62
+ next: (response) => {
63
+ this.parametersAll = response.data;
64
+ this.parametersLoaded = true;
65
+ this.setParameters();
66
+ this.initializeForm();
67
+ this.cdr.detectChanges();
68
+ },
69
+ error: (err) => {
70
+ console.error('Error fetching parameters:', err);
71
+ this.parametersLoaded = false;
72
+ }
73
+ });
74
+ }
75
+ setParameters() {
76
+ this.idTypes = this.parametersAll?.TypeIdCardByCountryCol;
77
+ this.indicatives = this.parametersAll?.indicatives;
78
+ this.countries = this.parametersAll?.country;
79
+ this.civilStatus = this.parametersAll?.civilStatus;
80
+ this.states = this.parametersAll?.State;
81
+ this.cities = this.parametersAll?.city;
82
+ // this.genders = [
83
+ // { code: 1, name: 'Masculino' },
84
+ // { code: 2, name: 'Femenino' }
85
+ // ];
86
+ if (this.parametersAll && this.parametersAll.gender) {
87
+ // Transformar gender en un arreglo de { code, name }
88
+ this.genders = this.parametersAll.gender.map((gender) => ({
89
+ code: gender.code,
90
+ name: gender.name_spanish
91
+ }));
92
+ }
93
+ else {
94
+ this.genders = [];
95
+ }
96
+ }
97
+ initializeForm() {
98
+ this.showParentSection = !!this.DataStudent?.cods?.parent?.code;
99
+ this.showEmailIpt = !!this.DataStudent?.email_ipt && this.DataStudent.email_ipt !== false;
100
+ this.initForm();
101
+ this.populateForm();
102
+ }
103
+ initForm() {
104
+ const baseForm = {
105
+ name: ['', [Validators.required, Validators.minLength(3), Validators.maxLength(32)]],
106
+ last_name: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(32)]],
107
+ email: ['', [Validators.required, Validators.email, Validators.maxLength(300)]],
108
+ gender: ['', [Validators.required]],
109
+ id_card_type: ['', [Validators.required]],
110
+ id_card: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(20)]],
111
+ phone_indicative: ['', [Validators.required]],
112
+ phone_number: ['', [Validators.required, Validators.minLength(10), Validators.maxLength(15)]],
113
+ country: ['', [Validators.required]],
114
+ state: ['', [Validators.required]],
115
+ city: ['', [Validators.required]],
116
+ role: [{ value: '', disabled: true }],
117
+ service_hour: ['', Validators.required],
118
+ password: ['', []],
119
+ re_password: ['', []],
120
+ changePassword: [false],
121
+ status: ['', Validators.required]
122
+ };
123
+ if (this.showEmailIpt) {
124
+ Object.assign(baseForm, {
125
+ email_ipt: ['', [Validators.required, Validators.email, Validators.maxLength(255)]]
126
+ });
127
+ }
128
+ if (this.showParentSection) {
129
+ Object.assign(baseForm, {
130
+ parent_name: ['', [Validators.required, Validators.minLength(3), Validators.maxLength(150)]],
131
+ parent_last_name: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(150)]],
132
+ parent_id_card_type: ['', [Validators.required]],
133
+ parent_id_card: ['', [Validators.required, Validators.minLength(5), Validators.maxLength(30)]],
134
+ parent_phone_indicative: ['', [Validators.required]],
135
+ parent_phone_number: ['', [Validators.required, Validators.minLength(10), Validators.maxLength(20)]],
136
+ parent_occupation: ['', [Validators.required, Validators.maxLength(50)]],
137
+ parent_office_adrress: ['', [Validators.required, Validators.maxLength(150)]],
138
+ parent_email: ['', [Validators.email, Validators.maxLength(255)]]
139
+ });
140
+ }
141
+ this.updateUserForm = this.fb.group(baseForm, { validators: this.passwordMatchValidator });
142
+ this.updateUserForm.get('changePassword')?.valueChanges.subscribe((checked) => {
143
+ const passwordControl = this.updateUserForm.get('password');
144
+ const rePasswordControl = this.updateUserForm.get('re_password');
145
+ if (checked) {
146
+ passwordControl?.setValidators([Validators.required, Validators.minLength(5), Validators.maxLength(32)]);
147
+ rePasswordControl?.setValidators([Validators.required, Validators.minLength(5), Validators.maxLength(32)]);
148
+ }
149
+ else {
150
+ passwordControl?.clearValidators();
151
+ rePasswordControl?.clearValidators();
152
+ passwordControl?.setValue('');
153
+ rePasswordControl?.setValue('');
154
+ }
155
+ passwordControl?.updateValueAndValidity();
156
+ rePasswordControl?.updateValueAndValidity();
157
+ });
158
+ this.updateUserForm.get('password')?.valueChanges.subscribe(() => {
159
+ this.updateUserForm.updateValueAndValidity();
160
+ });
161
+ this.updateUserForm.get('re_password')?.valueChanges.subscribe(() => {
162
+ this.updateUserForm.updateValueAndValidity();
163
+ });
164
+ }
165
+ passwordMatchValidator(form) {
166
+ const changePassword = form.get('changePassword')?.value;
167
+ const password = form.get('password')?.value;
168
+ const rePassword = form.get('re_password')?.value;
169
+ if (!changePassword) {
170
+ return null;
171
+ }
172
+ const mismatch = password && rePassword && password !== rePassword;
173
+ return mismatch ? { mismatch: true } : null;
174
+ }
175
+ noWhitespaceValidator(control) {
176
+ if (control.value && typeof control.value === 'string') {
177
+ const trimmedValue = control.value.trim();
178
+ if (trimmedValue.length === 0) {
179
+ return { onlyWhitespace: true };
180
+ }
181
+ if (control.value !== trimmedValue) {
182
+ return { hasWhitespace: true };
183
+ }
184
+ }
185
+ return null;
186
+ }
187
+ transformRole(role) {
188
+ const roleMap = {
189
+ 1: 'Super Admin',
190
+ 10: 'Jefe Academico',
191
+ 11: 'Coordinador Academico',
192
+ 12: 'Teacher Academico',
193
+ 13: 'Estudiante',
194
+ 15: 'Posible Estudiante',
195
+ 20: 'Jefe Marketing',
196
+ 21: 'Coordinador Marketing',
197
+ 22: 'Auxiliar Marketing',
198
+ 30: 'Jefe Administrativo',
199
+ 31: 'Coordinador Administrativo',
200
+ 32: 'Cajero Administrativo',
201
+ 40: 'Jefe Comercial',
202
+ 41: 'Coordinador Comercial',
203
+ 42: 'Asesor Comercial',
204
+ 50: 'Jefe Cartera',
205
+ 51: 'Coordinador Cartera',
206
+ 52: 'Asesor Cartera',
207
+ 60: 'Proveedor'
208
+ };
209
+ return roleMap[Number(role)] || '';
210
+ }
211
+ populateForm() {
212
+ if (this.DataStudent) {
213
+ const formValue = {
214
+ name: this.DataStudent.name || '',
215
+ last_name: this.DataStudent.last_name || '',
216
+ email: this.DataStudent.email || '',
217
+ gender: this.DataStudent.gender || null,
218
+ id_card_type: this.DataStudent.id_card_type || '',
219
+ id_card: this.DataStudent.id_card || '',
220
+ phone_indicative: this.DataStudent.phone_indicative || '',
221
+ phone_number: this.DataStudent.phone_number || '',
222
+ country: this.DataStudent.city?.country,
223
+ state: this.DataStudent.city?.state,
224
+ city: this.DataStudent.city?.code,
225
+ role: this.transformRole(this.DataStudent.role) || '',
226
+ service_hour: this.DataStudent.service_hour || 0,
227
+ changePassword: false,
228
+ password: '',
229
+ re_password: '',
230
+ status: this.DataStudent.user_status || ''
231
+ };
232
+ if (this.showEmailIpt) {
233
+ formValue.email_ipt = this.DataStudent.email_ipt || '';
234
+ }
235
+ if (this.showParentSection) {
236
+ Object.assign(formValue, {
237
+ parent_name: this.DataStudent.cods?.parent?.name || '',
238
+ parent_last_name: this.DataStudent.cods?.parent?.last_name || '',
239
+ parent_id_card_type: this.DataStudent.cods?.parent?.id_card_type || '',
240
+ parent_id_card: this.DataStudent.cods?.parent?.id_card || '',
241
+ parent_phone_indicative: this.DataStudent.cods?.parent?.phone_indicative || '',
242
+ parent_phone_number: this.DataStudent.cods?.parent?.phone_number || '',
243
+ parent_occupation: this.DataStudent.cods?.parent?.occupation || '',
244
+ parent_office_adrress: this.DataStudent.cods?.parent?.office_adrress || '',
245
+ parent_email: this.DataStudent.cods?.parent?.email || ''
246
+ });
247
+ }
248
+ this.updateUserForm.reset();
249
+ this.updateUserForm.patchValue(formValue);
250
+ this.initialFormValue = { ...this.updateUserForm.value };
251
+ if (formValue.country) {
252
+ console.log("en populateForm se envio dato para setearse country");
253
+ this.countries = this.parametersAll?.country;
254
+ this.selectCountry(this.DataStudent.city?.country);
255
+ }
256
+ if (formValue.state) {
257
+ this.selectState(this.DataStudent.city?.state);
258
+ }
259
+ if (formValue.city) {
260
+ this.selectCity(this.DataStudent.city?.code);
261
+ }
262
+ if (formValue.id_card_type) {
263
+ this.idTypes = this.parametersAll?.TypeIdCardByCountryCol;
264
+ this.selectGender(this.DataStudent.id_card_type);
265
+ }
266
+ if (formValue.phone_indicative) {
267
+ this.indicatives = this.parametersAll?.indicatives;
268
+ this.selectIndicative('phone_indicative', this.DataStudent.phone_indicative);
269
+ }
270
+ if (formValue.parent_phone_indicative) {
271
+ this.indicatives = this.parametersAll?.indicatives;
272
+ this.selectIndicative('parent_phone_indicative', this.DataStudent.cods?.parent?.phone_indicative);
273
+ }
274
+ if (formValue.gender) {
275
+ if (this.parametersAll && this.parametersAll.gender) {
276
+ // Transformar gender en un arreglo de { code, name }
277
+ this.genders = this.parametersAll.gender.map((gender) => ({
278
+ code: gender.code,
279
+ name: gender.name_spanish
280
+ }));
281
+ }
282
+ else {
283
+ this.genders = [];
284
+ }
285
+ this.selectGender(this.DataStudent.gender);
286
+ }
287
+ }
288
+ }
289
+ closeTable() {
290
+ this.visibleModal = false;
291
+ this.updateUserForm.reset();
292
+ this.idTypes = [];
293
+ this.countries = [];
294
+ this.genders = [];
295
+ this.closeModalIS.emit(false);
296
+ }
297
+ selectRol(role) {
298
+ if (role !== null) {
299
+ this.updateUserForm.get('role')?.setValue(this.transformRole(role));
300
+ }
301
+ else {
302
+ this.updateUserForm.get('role')?.setValue('');
303
+ }
304
+ }
305
+ selectIndicative(field, indicative) {
306
+ if (indicative !== null) {
307
+ this.updateUserForm.get(field)?.setValue(indicative);
308
+ }
309
+ else {
310
+ this.updateUserForm.get(field)?.setValue(null);
311
+ }
312
+ }
313
+ selectIdType(field, idType) {
314
+ if (idType !== null) {
315
+ this.updateUserForm.get(field)?.setValue(idType);
316
+ }
317
+ else {
318
+ this.updateUserForm.get(field)?.setValue(null);
319
+ }
320
+ }
321
+ selectGender(gender) {
322
+ if (gender !== null) {
323
+ this.updateUserForm.get('gender')?.setValue(gender);
324
+ }
325
+ else {
326
+ this.updateUserForm.get('gender')?.setValue(null);
327
+ }
328
+ }
329
+ selectCountry(country) {
330
+ const countryNumber = typeof country === 'string' ? parseInt(country, 10) : country;
331
+ if (country != null) {
332
+ this.updateUserForm.controls['country'].setValue(countryNumber);
333
+ console.log("se seteo country con el valor que entro en selectCountry");
334
+ if (this.parametersAll && this.parametersAll?.State) {
335
+ this.states = this.parametersAll.State.filter((course) => {
336
+ const state = typeof course.country === 'string'
337
+ ? parseInt(course.country, 10)
338
+ : course.country;
339
+ return state === countryNumber;
340
+ });
341
+ }
342
+ else {
343
+ this.states = [];
344
+ }
345
+ this.updateUserForm.controls['state'].setValue(null);
346
+ this.updateUserForm.controls['city'].setValue(null);
347
+ this.cities = [];
348
+ }
349
+ else {
350
+ this.updateUserForm.controls['country'].setValue(null);
351
+ this.states = [];
352
+ this.cities = [];
353
+ this.cdr.detectChanges();
354
+ }
355
+ }
356
+ selectState(state) {
357
+ const stateNumber = typeof state === 'string' ? parseInt(state, 10) : state;
358
+ if (state !== null) {
359
+ this.updateUserForm.controls['state'].setValue(stateNumber);
360
+ this.updateUserForm.controls['city'].setValue(null);
361
+ this.cities = [];
362
+ this.getState(stateNumber);
363
+ }
364
+ else {
365
+ this.updateUserForm.controls['state'].setValue(null);
366
+ this.updateUserForm.controls['city'].setValue(null);
367
+ this.cities = [];
368
+ }
369
+ }
370
+ getState(state) {
371
+ this.getCity(state);
372
+ }
373
+ getCity(state) {
374
+ const stateNumber = typeof state === 'string' ? parseInt(state, 10) : state;
375
+ if (this.parametersAll?.city) {
376
+ this.cities = this.parametersAll.city.filter((course) => {
377
+ const cityState = typeof course.state === 'string' ? parseInt(course.state, 10) : course.state;
378
+ return cityState === stateNumber;
379
+ });
380
+ }
381
+ else {
382
+ this.cities = [];
383
+ }
384
+ }
385
+ selectCity(city) {
386
+ const cityNumber = typeof city === 'string' ? parseInt(city, 10) : city;
387
+ if (city !== null) {
388
+ this.updateUserForm.controls['city'].setValue(cityNumber);
389
+ }
390
+ else {
391
+ this.updateUserForm.controls['city'].setValue(null);
392
+ }
393
+ }
394
+ setPhoto(type) {
395
+ if (type === 'student')
396
+ this.photo = '/platform/academic/assets/student.jpg';
397
+ if (type === 'academic')
398
+ this.photo = '/platform/academic/assets/academico.png';
399
+ if (type === 'administrative')
400
+ this.photo = '/platform/administrative/assets/administrativo.jpg';
401
+ if (type === 'marketing')
402
+ this.photo = '/platform/marketing/assets/marketing.jpg';
403
+ if (type === 'commercial')
404
+ this.photo = '/platform/commercial/assets/user-form-assets/comercial.jpg';
405
+ if (type === 'treasure')
406
+ this.photo = '/platform/treasure/assets/administrativo.jpg';
407
+ }
408
+ updateUser() {
409
+ if (this.updateUserForm.invalid ||
410
+ this.updateUserForm.hasError('mismatch') ||
411
+ !this.hasFormChanged()) {
412
+ this.updateUserForm.markAllAsTouched();
413
+ console.log('createUser - Validation failed:', {
414
+ invalid: this.updateUserForm.invalid,
415
+ mismatch: this.updateUserForm.hasError('mismatch'),
416
+ hasChanges: this.hasFormChanged()
417
+ });
418
+ return;
419
+ }
420
+ this.loader = true;
421
+ const formValue = this.updateUserForm.getRawValue();
422
+ const request = {
423
+ token: this.baseService.getUserToken(),
424
+ user: {
425
+ code: this.DataStudent.code,
426
+ name: formValue.name,
427
+ last_name: formValue.last_name,
428
+ id_card_type: formValue.id_card_type,
429
+ id_card: formValue.id_card,
430
+ phone_indicative: formValue.phone_indicative,
431
+ phone_number: formValue.phone_number,
432
+ email: formValue.email,
433
+ gender: formValue.gender,
434
+ city: formValue.city,
435
+ service_hour: formValue.service_hour,
436
+ role: this.DataStudent.role,
437
+ status: formValue.status,
438
+ ...(this.showEmailIpt ? { email_ipt: formValue.email_ipt } : {}),
439
+ ...(formValue.changePassword && formValue.password ? { password: formValue.password } : {})
440
+ },
441
+ parent: this.showParentSection
442
+ ? {
443
+ code: this.DataStudent.cods?.parent?.code || null,
444
+ name: formValue.parent_name || null,
445
+ last_name: formValue.parent_last_name || null,
446
+ id_card_type: formValue.parent_id_card_type || null,
447
+ id_card: formValue.parent_id_card || null,
448
+ phone_indicative: formValue.parent_phone_indicative || null,
449
+ phone_number: formValue.parent_phone_number || null,
450
+ occupation: formValue.parent_occupation || null,
451
+ office_adrress: formValue.parent_office_adrress || null,
452
+ email: formValue.parent_email || null
453
+ }
454
+ : null
455
+ };
456
+ console.log(request);
457
+ this.userService.updateUserAndParentByCode(request).subscribe((response) => {
458
+ // this.courseType = response.data;
459
+ if (response.message.code === 1) {
460
+ Swal.fire({
461
+ position: 'center',
462
+ icon: 'success',
463
+ title: 'usuario actualizado satisfactoriamente',
464
+ showConfirmButton: false,
465
+ timer: 2500,
466
+ });
467
+ // this.userUpdated = true
468
+ this.userUpdatedEvent.emit();
469
+ this.closeTable();
470
+ }
471
+ else {
472
+ Swal.fire({
473
+ position: 'center',
474
+ icon: 'error',
475
+ title: 'Ha ocurrido un error inesperado',
476
+ showConfirmButton: false,
477
+ timer: 2500,
478
+ });
479
+ // this.userUpdated = false
480
+ }
481
+ });
482
+ this.loader = false;
483
+ }
484
+ hasFormChanged() {
485
+ if (!this.initialFormValue || !this.DataStudent) {
486
+ return false;
487
+ }
488
+ const currentValue = this.updateUserForm.getRawValue();
489
+ if (currentValue.changePassword) {
490
+ const password = currentValue.password;
491
+ const rePassword = currentValue.re_password;
492
+ const passwordControl = this.updateUserForm.get('password');
493
+ const rePasswordControl = this.updateUserForm.get('re_password');
494
+ if (passwordControl?.valid &&
495
+ rePasswordControl?.valid &&
496
+ password === rePassword &&
497
+ password?.trim() !== '') {
498
+ return true;
499
+ }
500
+ }
501
+ const fieldsToCompare = [
502
+ 'name',
503
+ 'last_name',
504
+ 'email',
505
+ 'gender',
506
+ 'id_card_type',
507
+ 'id_card',
508
+ 'phone_indicative',
509
+ 'phone_number',
510
+ 'country',
511
+ 'state',
512
+ 'city',
513
+ 'role',
514
+ 'service_hour',
515
+ 'status'
516
+ ];
517
+ if (this.showEmailIpt) {
518
+ fieldsToCompare.push('email_ipt');
519
+ }
520
+ if (this.showParentSection) {
521
+ fieldsToCompare.push('parent_name', 'parent_last_name', 'parent_id_card_type', 'parent_id_card', 'parent_phone_indicative', 'parent_phone_number', 'parent_occupation', 'parent_office_adrress', 'parent_email');
522
+ }
523
+ for (const field of fieldsToCompare) {
524
+ let originalValue;
525
+ let currentFieldValue = currentValue[field];
526
+ switch (field) {
527
+ case 'name':
528
+ originalValue = this.DataStudent.name || '';
529
+ break;
530
+ case 'last_name':
531
+ originalValue = this.DataStudent.last_name || '';
532
+ break;
533
+ case 'email':
534
+ originalValue = this.DataStudent.email || '';
535
+ break;
536
+ case 'email_ipt':
537
+ originalValue = this.DataStudent.email_ipt || '';
538
+ break;
539
+ case 'gender':
540
+ originalValue = this.DataStudent.gender || null;
541
+ break;
542
+ case 'id_card_type':
543
+ originalValue = this.DataStudent.id_card_type || '';
544
+ break;
545
+ case 'id_card':
546
+ originalValue = this.DataStudent.id_card || '';
547
+ break;
548
+ case 'phone_indicative':
549
+ originalValue = this.DataStudent.phone_indicative || '';
550
+ break;
551
+ case 'phone_number':
552
+ originalValue = this.DataStudent.phone_number || '';
553
+ break;
554
+ case 'country':
555
+ originalValue = this.DataStudent.city?.country || '';
556
+ break;
557
+ case 'state':
558
+ originalValue = this.DataStudent.city?.state || '';
559
+ break;
560
+ case 'city':
561
+ originalValue = this.DataStudent.city?.code || '';
562
+ break;
563
+ case 'role':
564
+ originalValue = this.transformRole(this.DataStudent.role) || '';
565
+ break;
566
+ case 'service_hour':
567
+ originalValue = this.DataStudent.service_hour;
568
+ break;
569
+ case 'status':
570
+ originalValue = this.DataStudent.user_status || '';
571
+ break;
572
+ case 'parent_name':
573
+ originalValue = this.DataStudent.cods?.parent?.name || '';
574
+ break;
575
+ case 'parent_last_name':
576
+ originalValue = this.DataStudent.cods?.parent?.last_name || '';
577
+ break;
578
+ case 'parent_id_card_type':
579
+ originalValue = this.DataStudent.cods?.parent?.id_card_type;
580
+ break;
581
+ case 'parent_id_card':
582
+ originalValue = this.DataStudent.cods?.parent?.id_card || '';
583
+ break;
584
+ case 'parent_phone_indicative':
585
+ originalValue = this.DataStudent.cods?.parent?.phone_indicative || '';
586
+ break;
587
+ case 'parent_phone_number':
588
+ originalValue = this.DataStudent.cods?.parent?.phone_number || '';
589
+ break;
590
+ case 'parent_occupation':
591
+ originalValue = this.DataStudent.cods?.parent?.occupation || '';
592
+ break;
593
+ case 'parent_office_adrress':
594
+ originalValue = this.DataStudent.cods?.parent?.office_adrress || '';
595
+ break;
596
+ case 'parent_email':
597
+ originalValue = this.DataStudent.cods?.parent?.email || '';
598
+ break;
599
+ default:
600
+ originalValue = '';
601
+ }
602
+ const normalizedCurrent = currentFieldValue != null ? String(currentFieldValue).trim() : '';
603
+ const normalizedOriginal = originalValue != null ? String(originalValue).trim() : '';
604
+ if (normalizedCurrent !== normalizedOriginal) {
605
+ return true;
606
+ }
607
+ }
608
+ return false;
609
+ }
610
+ }
611
+ updateUserFormComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: updateUserFormComponent, deps: [{ token: i1.FormBuilder }, { token: i0.ChangeDetectorRef }, { token: i2.ParameterService }, { token: i2.BaseService }, { token: i2.UserService }], target: i0.ɵɵFactoryTarget.Component });
612
+ updateUserFormComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.0.7", type: updateUserFormComponent, selector: "ipt-update-user-form", inputs: { DataStudent: "DataStudent", visibleModal: "visibleModal" }, outputs: { closeModalIS: "closeModalIS", userUpdatedEvent: "userUpdatedEvent" }, usesOnChanges: true, ngImport: i0, template: "<!-- <p-dialog\n [(visible)]=\"visibleModal\"\n [style]=\"{width: '80%'}\"\n header=\"Actualizar usuario\"\n [modal]=\"true\"\n styleClass=\"p-fluid\"\n (onHide)=\"closeTable()\"\n [dismissableMask]=\"true\"\n [breakpoints]=\"{'1920px': '75vw', '1440px': '75vw', '1024px': '75vw', '576px': '100vw'}\"\n> -->\n<!-- <div>\n <pre>{{ updateUserForm.value | json }}</pre>\n <div>\n <pre>{{ updateUserForm.valid | json }}</pre>\n </div>\n</div> -->\n <div class=\"grid_container\">\n <div>\n <form *ngIf=\"updateUserForm\" autocomplete=\"off\" [formGroup]=\"updateUserForm\">\n <!-- User Information Section -->\n <div class=\"section-header\">\n <h2>Informaci\u00F3n del usuario</h2>\n </div>\n <div class=\"form-grid\">\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Nombres'\"\n [control]=\"updateUserForm.controls['name']\"\n [validateText]=\"updateUserForm.controls['name'].hasError('required') ? 'Debe ingresar el nombre' :\n updateUserForm.controls['name'].hasError('minlength') ? 'M\u00EDnimo 3 caracteres' :\n updateUserForm.controls['name'].hasError('maxlength') ? 'M\u00E1ximo 32 caracteres' :\n updateUserForm.controls['name'].hasError('pattern') ? 'Solo letras, espacios y guiones' :\n updateUserForm.controls['name'].hasError('hasWhitespace') ? 'No se permiten espacios al inicio o final' :\n updateUserForm.controls['name'].hasError('onlyWhitespace') ? 'No se permiten solo espacios' :\n 'Debe ingresar el nombre'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Apellidos'\"\n [control]=\"updateUserForm.controls['last_name']\"\n [validateText]=\"updateUserForm.controls['last_name'].hasError('required') ? 'Debe ingresar los apellidos' :\n updateUserForm.controls['last_name'].hasError('minlength') ? 'M\u00EDnimo 3 caracteres' :\n updateUserForm.controls['last_name'].hasError('maxlength') ? 'M\u00E1ximo 32 caracteres' :\n updateUserForm.controls['last_name'].hasError('pattern') ? 'Solo letras, espacios y guiones' :\n updateUserForm.controls['last_name'].hasError('hasWhitespace') ? 'No se permiten espacios al inicio o final' :\n updateUserForm.controls['last_name'].hasError('onlyWhitespace') ? 'No se permiten solo espacios' :\n 'Debe ingresar los apellidos'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'email'\"\n [placeHolder]=\"'Email'\"\n [control]=\"updateUserForm.controls['email']\"\n [validateText]=\"updateUserForm.controls['email'].hasError('required') ? 'Debe ingresar un correo v\u00E1lido' :\n updateUserForm.controls['email'].hasError('maxlength') ? 'M\u00E1ximo 300 caracteres' :\n updateUserForm.controls['email'].hasError('pattern') ? 'Tiene que ser un email correcto' :\n updateUserForm.controls['email'].hasError('hasWhitespace') ? 'No se permiten espacios al inicio o final' :\n updateUserForm.controls['email'].hasError('onlyWhitespace') ? 'No se permiten solo espacios' :\n 'Debe ingresar un correo v\u00E1lido'\"\n ></ipt-input>\n <ipt-input\n *ngIf=\"showEmailIpt\"\n [inputType]=\"'text'\"\n [placeHolder]=\"'Email IPT'\"\n [control]=\"updateUserForm.controls['email_ipt']\"\n [validateText]=\"updateUserForm.controls['email_ipt'].hasError('required') ? 'Debe ingresar un correo IPT v\u00E1lido' :\n updateUserForm.controls['email_ipt'].hasError('maxlength') ? 'M\u00E1ximo 255 caracteres' :\n updateUserForm.controls['email_ipt'].hasError('pattern') ? 'Tiene que ser un email correcto' :\n updateUserForm.controls['email_ipt'].hasError('hasWhitespace') ? 'No se permiten espacios al inicio o final' :\n updateUserForm.controls['email_ipt'].hasError('onlyWhitespace') ? 'No se permiten solo espacios' :\n 'Debe ingresar un correo IPT v\u00E1lido'\"\n ></ipt-input>\n <ipt-input\n *ngIf=\"showEmailIpt\"\n [inputType]=\"'number'\"\n [placeHolder]=\"'Horas de servicio'\"\n [control]=\"updateUserForm.controls['service_hour']\"\n [validateText]=\"'Debe ingresar las horas de servicio'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Rol'\"\n [control]=\"updateUserForm.controls['role']\"\n [validateText]=\"'Rol requerido'\"\n ></ipt-input>\n <!-- <ipt-select\n [initialValue]=\"updateUserForm.controls['gender'].value\"\n [control]=\"updateUserForm.controls['gender']\"\n [selectCode]=\"updateUserForm.controls['gender'].value === null ? 'Seleccione g\u00E9nero' : (updateUserForm.controls['gender'].value | genderDisplay)\"\n [data]=\"genders\"\n (eventSelect)=\"selectGender($event)\"\n [defaultText]=\"'Seleccione g\u00E9nero'\"\n ></ipt-select> -->\n <ipt-select\n [initialValue]=\"updateUserForm.controls['phone_indicative'].value\"\n [control]=\"updateUserForm.controls['phone_indicative']\"\n [data]=\"indicatives\"\n (eventSelect)=\"selectIndicative('phone_indicative', $event)\"\n [defaultText]=\"'Indicativo'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Tel\u00E9fono'\"\n [control]=\"updateUserForm.controls['phone_number']\"\n [validateText]=\"'Debe ingresar un n\u00FAmero de tel\u00E9fono v\u00E1lido'\"\n ></ipt-input>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['id_card_type'].value\"\n [control]=\"updateUserForm.controls['id_card_type']\"\n [selectCode]=\"updateUserForm.controls['id_card_type'].value === null ? 'Tipo de documento' : updateUserForm.controls['id_card_type'].value\"\n [isRequired]=\"true\"\n [data]=\"idTypes\"\n (eventSelect)=\"selectIdType('id_card_type', $event)\"\n [defaultText]=\"'Tipo de documento'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Documento'\"\n [control]=\"updateUserForm.controls['id_card']\"\n [validateText]=\"'Debe ingresar el n\u00FAmero de documento'\"\n ></ipt-input>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['country'].value\"\n [control]=\"updateUserForm.controls['country']\"\n [selectCode]=\"updateUserForm.controls['country'].value === null ? 'Pa\u00EDs de residencia' : updateUserForm.controls['country'].value\"\n (eventSelect)=\"selectCountry($event)\"\n [data]=\"countries\"\n [defaultText]=\"'Pa\u00EDs de residencia'\"\n ></ipt-select>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['state'].value\"\n [control]=\"updateUserForm.controls['state']\"\n [selectCode]=\"updateUserForm.controls['state'].value === null ? 'Departamento o estado' : updateUserForm.controls['state'].value\"\n [isRequired]=\"true\"\n (eventSelect)=\"selectState($event)\"\n [data]=\"states\"\n [defaultText]=\"'Departamento o estado'\"\n ></ipt-select>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['city'].value\"\n [control]=\"updateUserForm.controls['city']\"\n [selectCode]=\"updateUserForm.controls['city'].value === null ? 'Ciudad de residencia' : updateUserForm.controls['city'].value\"\n (eventSelect)=\"selectCity($event)\"\n [data]=\"cities\"\n [defaultText]=\"'Ciudad de residencia'\"\n ></ipt-select>\n <!-- <div *ngIf=\"this.DataStudent.role !== 13\" class=\"card flex justify-content-center align-content-center align-items-end text-cen ter \">\n <p-selectButton [options]=\"justifyOptions\" formControlName=\"status\" optionLabel=\"name\" optionValue=\"code\"></p-selectButton>\n </div>\n <div class=\"field\">\n <p-checkbox\n formControlName=\"changePassword\"\n label=\"Cambio de contrase\u00F1a\"\n [binary]=\"true\"\n ></p-checkbox>\n </div> -->\n </div>\n <div class=\"form-grid\" *ngIf=\"updateUserForm.controls['changePassword'].value\">\n <ipt-input\n [inputType]=\"'password'\"\n [placeHolder]=\"'Contrase\u00F1a'\"\n [control]=\"updateUserForm.controls['password']\"\n [validateText]=\"updateUserForm.controls['password'].hasError('required') ? 'La contrase\u00F1a es requerida' :\n updateUserForm.controls['password'].hasError('minlength') ? 'M\u00EDnimo 5 caracteres' :\n updateUserForm.controls['password'].hasError('maxlength') ? 'M\u00E1ximo 32 caracteres' :\n 'Ingrese una contrase\u00F1a v\u00E1lida'\"\n ></ipt-input>\n\n <ipt-input\n [inputType]=\"'password'\"\n [placeHolder]=\"'Repetir contrase\u00F1a'\"\n [control]=\"updateUserForm.controls['re_password']\"\n [validateText]=\"updateUserForm.controls['re_password'].hasError('required') ? 'Debe repetir la contrase\u00F1a' :\n updateUserForm.controls['re_password'].hasError('minlength') ? 'M\u00EDnimo 5 caracteres' :\n updateUserForm.controls['re_password'].hasError('maxlength') ? 'M\u00E1ximo 32 caracteres' :\n updateUserForm.hasError('mismatch') ? 'Las contrase\u00F1as no coinciden' :\n 'Repita la contrase\u00F1a'\"\n ></ipt-input>\n </div>\n\n <!-- Mensaje adicional para el error de mismatch (opcional, si quieres mostrarlo por separado) -->\n\n <div *ngIf=\"updateUserForm.hasError('mismatch') && updateUserForm.controls['changePassword'].value\" class=\"error-message\">\n <small >Las contrase\u00F1as no coinciden</small>\n </div>\n <!-- Parent Information Section -->\n <div class=\"section-header\" *ngIf=\"DataStudent?.cods\">\n <h2>Informaci\u00F3n del acudiente</h2>\n </div>\n <div *ngIf=\"DataStudent?.cods\">\n <div *ngIf=\"showParentSection; else noParentMessage\">\n <div class=\"form-grid\">\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Nombres'\"\n [control]=\"updateUserForm.controls['parent_name']\"\n [validateText]=\"'Debe ingresar el nombre'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Apellidos'\"\n [control]=\"updateUserForm.controls['parent_last_name']\"\n [validateText]=\"'Debe ingresar los apellidos'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Ocupaci\u00F3n'\"\n [control]=\"updateUserForm.controls['parent_occupation']\"\n [validateText]=\"'Debe ingresar la ocupaci\u00F3n'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'email'\"\n [placeHolder]=\"'Email'\"\n [control]=\"updateUserForm.controls['parent_email']\"\n [validateText]=\"'Debe ingresar un correo v\u00E1lido'\"\n ></ipt-input>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['parent_id_card_type'].value\"\n [control]=\"updateUserForm.controls['parent_id_card_type']\"\n [selectCode]=\"updateUserForm.controls['parent_id_card_type'].value === null ? 'Tipo de documento' : updateUserForm.controls['parent_id_card_type'].value\"\n [isRequired]=\"true\"\n [data]=\"idTypes\"\n (eventSelect)=\"selectIdType('parent_id_card_type', $event)\"\n [defaultText]=\"'Tipo de documento'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Documento'\"\n [control]=\"updateUserForm.controls['parent_id_card']\"\n [validateText]=\"'Debe ingresar el n\u00FAmero de documento'\"\n ></ipt-input>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['parent_phone_indicative'].value\"\n [control]=\"updateUserForm.controls['parent_phone_indicative']\"\n [data]=\"indicatives\"\n (eventSelect)=\"selectIndicative('parent_phone_indicative', $event)\"\n [defaultText]=\"'Indicativo'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Tel\u00E9fono'\"\n [control]=\"updateUserForm.controls['parent_phone_number']\"\n [validateText]=\"'Debe ingresar un n\u00FAmero de tel\u00E9fono v\u00E1lido'\"\n ></ipt-input>\n\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Direcci\u00F3n de oficina'\"\n [control]=\"updateUserForm.controls['parent_office_adrress']\"\n [validateText]=\"'Debe ingresar la direcci\u00F3n'\"\n ></ipt-input>\n </div>\n </div>\n <ng-template #noParentMessage>\n <div class=\"no-parent-message\">\n <p>Sin acudiente</p>\n </div>\n </ng-template>\n </div>\n\n <div class=\"buttons-container\">\n <ipt-button\n [label]=\"'Actualizar'\"\n [isEnabled]=\"!loader && updateUserForm.valid && !updateUserForm.hasError('mismatch') && hasFormChanged()\"\n (onClick)=\"updateUser()\"\n [primary]=\"true\"\n ></ipt-button>\n </div>\n </form>\n </div>\n </div>\n<!-- </p-dialog> -->", styles: ["@media screen and (min-width: 320px){main{background:rgba(0,0,0,.472);color:#fff;position:fixed;top:0;left:0;height:100vh;width:100vw;transition:all .5s}main .modal_container{width:60%;height:-moz-fit-content;height:fit-content;position:absolute;inset:0;margin:auto;background-color:#fff;border-radius:3px}.header_modal{display:flex;padding:15px 15px 0;gap:1rem;align-items:center}.header_modal h1{padding:.5rem;background-color:#1c77f7;color:#fff;width:100%;border-radius:10px;font-size:1.25rem;font-weight:700}.header_modal button{margin-left:auto;font-size:26px;padding:1.2rem;font-weight:200;color:#6c7f7d;display:flex;width:25px;height:25px;align-items:center;justify-content:center;transition:50ms;background-color:transparent;border:none}.header_modal button:hover{cursor:pointer;border-radius:50%;background-color:#d4d4d4}.grid_container{display:grid;grid-template-columns:1fr;padding:0 15px}form{display:grid;grid-template-columns:1fr;gap:.25rem;justify-content:center;padding:0 1rem}.section-header{margin:1.5rem 0 .5rem;border-bottom:2px solid #1c77f7}.section-header h2{font-size:1.2rem;color:#1c77f7;font-weight:600;margin-bottom:.5rem}.form-grid{display:grid;grid-template-columns:1fr;gap:.25rem}.buttons-container{margin-top:2rem;margin-bottom:2rem;display:flex;justify-content:center;align-items:center}.user-type-image{display:none}.no-parent-message{padding:1rem;text-align:center;color:#666;font-size:1rem;font-weight:500;background-color:#f8f9fa;border-radius:.5rem;margin-top:.5rem}}@media screen and (min-width: 768px){.form-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:1rem}}@media screen and (min-width: 1366px){form{padding:0}}.field{height:1px;max-width:67%}.error-message{color:red;font-size:12px;margin-top:5px}.p-selectbutton{display:flex;flex-wrap:wrap;justify-content:center;width:100%;min-width:10rem}:host ::ng-deep .p-selectbutton .p-button{padding:.5rem;font-size:.875rem;height:30px}:host ::ng-deep .p-buttonset .p-button:first-of-type{height:30px}\n"], dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "component", type: i4.ButtonComponent, selector: "ipt-button", inputs: ["primary", "size", "label", "buttonType", "isEnabled"], outputs: ["onClick"] }, { kind: "component", type: i5.InputComponent, selector: "ipt-input", inputs: ["inputType", "placeHolder", "validateText", "withPipe", "list", "iconUrl", "control", "prefix", "thousands", "decimal", "disabledSel"], outputs: ["dateSelected"] }, { kind: "component", type: i6.SelectComponent, selector: "ipt-select", inputs: ["isRequired", "data", "defaultText", "selectCode", "disabledSel", "initialValue", "label", "control"], outputs: ["eventSelect"] }] });
613
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.7", ngImport: i0, type: updateUserFormComponent, decorators: [{
614
+ type: Component,
615
+ args: [{ selector: 'ipt-update-user-form', template: "<!-- <p-dialog\n [(visible)]=\"visibleModal\"\n [style]=\"{width: '80%'}\"\n header=\"Actualizar usuario\"\n [modal]=\"true\"\n styleClass=\"p-fluid\"\n (onHide)=\"closeTable()\"\n [dismissableMask]=\"true\"\n [breakpoints]=\"{'1920px': '75vw', '1440px': '75vw', '1024px': '75vw', '576px': '100vw'}\"\n> -->\n<!-- <div>\n <pre>{{ updateUserForm.value | json }}</pre>\n <div>\n <pre>{{ updateUserForm.valid | json }}</pre>\n </div>\n</div> -->\n <div class=\"grid_container\">\n <div>\n <form *ngIf=\"updateUserForm\" autocomplete=\"off\" [formGroup]=\"updateUserForm\">\n <!-- User Information Section -->\n <div class=\"section-header\">\n <h2>Informaci\u00F3n del usuario</h2>\n </div>\n <div class=\"form-grid\">\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Nombres'\"\n [control]=\"updateUserForm.controls['name']\"\n [validateText]=\"updateUserForm.controls['name'].hasError('required') ? 'Debe ingresar el nombre' :\n updateUserForm.controls['name'].hasError('minlength') ? 'M\u00EDnimo 3 caracteres' :\n updateUserForm.controls['name'].hasError('maxlength') ? 'M\u00E1ximo 32 caracteres' :\n updateUserForm.controls['name'].hasError('pattern') ? 'Solo letras, espacios y guiones' :\n updateUserForm.controls['name'].hasError('hasWhitespace') ? 'No se permiten espacios al inicio o final' :\n updateUserForm.controls['name'].hasError('onlyWhitespace') ? 'No se permiten solo espacios' :\n 'Debe ingresar el nombre'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Apellidos'\"\n [control]=\"updateUserForm.controls['last_name']\"\n [validateText]=\"updateUserForm.controls['last_name'].hasError('required') ? 'Debe ingresar los apellidos' :\n updateUserForm.controls['last_name'].hasError('minlength') ? 'M\u00EDnimo 3 caracteres' :\n updateUserForm.controls['last_name'].hasError('maxlength') ? 'M\u00E1ximo 32 caracteres' :\n updateUserForm.controls['last_name'].hasError('pattern') ? 'Solo letras, espacios y guiones' :\n updateUserForm.controls['last_name'].hasError('hasWhitespace') ? 'No se permiten espacios al inicio o final' :\n updateUserForm.controls['last_name'].hasError('onlyWhitespace') ? 'No se permiten solo espacios' :\n 'Debe ingresar los apellidos'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'email'\"\n [placeHolder]=\"'Email'\"\n [control]=\"updateUserForm.controls['email']\"\n [validateText]=\"updateUserForm.controls['email'].hasError('required') ? 'Debe ingresar un correo v\u00E1lido' :\n updateUserForm.controls['email'].hasError('maxlength') ? 'M\u00E1ximo 300 caracteres' :\n updateUserForm.controls['email'].hasError('pattern') ? 'Tiene que ser un email correcto' :\n updateUserForm.controls['email'].hasError('hasWhitespace') ? 'No se permiten espacios al inicio o final' :\n updateUserForm.controls['email'].hasError('onlyWhitespace') ? 'No se permiten solo espacios' :\n 'Debe ingresar un correo v\u00E1lido'\"\n ></ipt-input>\n <ipt-input\n *ngIf=\"showEmailIpt\"\n [inputType]=\"'text'\"\n [placeHolder]=\"'Email IPT'\"\n [control]=\"updateUserForm.controls['email_ipt']\"\n [validateText]=\"updateUserForm.controls['email_ipt'].hasError('required') ? 'Debe ingresar un correo IPT v\u00E1lido' :\n updateUserForm.controls['email_ipt'].hasError('maxlength') ? 'M\u00E1ximo 255 caracteres' :\n updateUserForm.controls['email_ipt'].hasError('pattern') ? 'Tiene que ser un email correcto' :\n updateUserForm.controls['email_ipt'].hasError('hasWhitespace') ? 'No se permiten espacios al inicio o final' :\n updateUserForm.controls['email_ipt'].hasError('onlyWhitespace') ? 'No se permiten solo espacios' :\n 'Debe ingresar un correo IPT v\u00E1lido'\"\n ></ipt-input>\n <ipt-input\n *ngIf=\"showEmailIpt\"\n [inputType]=\"'number'\"\n [placeHolder]=\"'Horas de servicio'\"\n [control]=\"updateUserForm.controls['service_hour']\"\n [validateText]=\"'Debe ingresar las horas de servicio'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Rol'\"\n [control]=\"updateUserForm.controls['role']\"\n [validateText]=\"'Rol requerido'\"\n ></ipt-input>\n <!-- <ipt-select\n [initialValue]=\"updateUserForm.controls['gender'].value\"\n [control]=\"updateUserForm.controls['gender']\"\n [selectCode]=\"updateUserForm.controls['gender'].value === null ? 'Seleccione g\u00E9nero' : (updateUserForm.controls['gender'].value | genderDisplay)\"\n [data]=\"genders\"\n (eventSelect)=\"selectGender($event)\"\n [defaultText]=\"'Seleccione g\u00E9nero'\"\n ></ipt-select> -->\n <ipt-select\n [initialValue]=\"updateUserForm.controls['phone_indicative'].value\"\n [control]=\"updateUserForm.controls['phone_indicative']\"\n [data]=\"indicatives\"\n (eventSelect)=\"selectIndicative('phone_indicative', $event)\"\n [defaultText]=\"'Indicativo'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Tel\u00E9fono'\"\n [control]=\"updateUserForm.controls['phone_number']\"\n [validateText]=\"'Debe ingresar un n\u00FAmero de tel\u00E9fono v\u00E1lido'\"\n ></ipt-input>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['id_card_type'].value\"\n [control]=\"updateUserForm.controls['id_card_type']\"\n [selectCode]=\"updateUserForm.controls['id_card_type'].value === null ? 'Tipo de documento' : updateUserForm.controls['id_card_type'].value\"\n [isRequired]=\"true\"\n [data]=\"idTypes\"\n (eventSelect)=\"selectIdType('id_card_type', $event)\"\n [defaultText]=\"'Tipo de documento'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Documento'\"\n [control]=\"updateUserForm.controls['id_card']\"\n [validateText]=\"'Debe ingresar el n\u00FAmero de documento'\"\n ></ipt-input>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['country'].value\"\n [control]=\"updateUserForm.controls['country']\"\n [selectCode]=\"updateUserForm.controls['country'].value === null ? 'Pa\u00EDs de residencia' : updateUserForm.controls['country'].value\"\n (eventSelect)=\"selectCountry($event)\"\n [data]=\"countries\"\n [defaultText]=\"'Pa\u00EDs de residencia'\"\n ></ipt-select>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['state'].value\"\n [control]=\"updateUserForm.controls['state']\"\n [selectCode]=\"updateUserForm.controls['state'].value === null ? 'Departamento o estado' : updateUserForm.controls['state'].value\"\n [isRequired]=\"true\"\n (eventSelect)=\"selectState($event)\"\n [data]=\"states\"\n [defaultText]=\"'Departamento o estado'\"\n ></ipt-select>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['city'].value\"\n [control]=\"updateUserForm.controls['city']\"\n [selectCode]=\"updateUserForm.controls['city'].value === null ? 'Ciudad de residencia' : updateUserForm.controls['city'].value\"\n (eventSelect)=\"selectCity($event)\"\n [data]=\"cities\"\n [defaultText]=\"'Ciudad de residencia'\"\n ></ipt-select>\n <!-- <div *ngIf=\"this.DataStudent.role !== 13\" class=\"card flex justify-content-center align-content-center align-items-end text-cen ter \">\n <p-selectButton [options]=\"justifyOptions\" formControlName=\"status\" optionLabel=\"name\" optionValue=\"code\"></p-selectButton>\n </div>\n <div class=\"field\">\n <p-checkbox\n formControlName=\"changePassword\"\n label=\"Cambio de contrase\u00F1a\"\n [binary]=\"true\"\n ></p-checkbox>\n </div> -->\n </div>\n <div class=\"form-grid\" *ngIf=\"updateUserForm.controls['changePassword'].value\">\n <ipt-input\n [inputType]=\"'password'\"\n [placeHolder]=\"'Contrase\u00F1a'\"\n [control]=\"updateUserForm.controls['password']\"\n [validateText]=\"updateUserForm.controls['password'].hasError('required') ? 'La contrase\u00F1a es requerida' :\n updateUserForm.controls['password'].hasError('minlength') ? 'M\u00EDnimo 5 caracteres' :\n updateUserForm.controls['password'].hasError('maxlength') ? 'M\u00E1ximo 32 caracteres' :\n 'Ingrese una contrase\u00F1a v\u00E1lida'\"\n ></ipt-input>\n\n <ipt-input\n [inputType]=\"'password'\"\n [placeHolder]=\"'Repetir contrase\u00F1a'\"\n [control]=\"updateUserForm.controls['re_password']\"\n [validateText]=\"updateUserForm.controls['re_password'].hasError('required') ? 'Debe repetir la contrase\u00F1a' :\n updateUserForm.controls['re_password'].hasError('minlength') ? 'M\u00EDnimo 5 caracteres' :\n updateUserForm.controls['re_password'].hasError('maxlength') ? 'M\u00E1ximo 32 caracteres' :\n updateUserForm.hasError('mismatch') ? 'Las contrase\u00F1as no coinciden' :\n 'Repita la contrase\u00F1a'\"\n ></ipt-input>\n </div>\n\n <!-- Mensaje adicional para el error de mismatch (opcional, si quieres mostrarlo por separado) -->\n\n <div *ngIf=\"updateUserForm.hasError('mismatch') && updateUserForm.controls['changePassword'].value\" class=\"error-message\">\n <small >Las contrase\u00F1as no coinciden</small>\n </div>\n <!-- Parent Information Section -->\n <div class=\"section-header\" *ngIf=\"DataStudent?.cods\">\n <h2>Informaci\u00F3n del acudiente</h2>\n </div>\n <div *ngIf=\"DataStudent?.cods\">\n <div *ngIf=\"showParentSection; else noParentMessage\">\n <div class=\"form-grid\">\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Nombres'\"\n [control]=\"updateUserForm.controls['parent_name']\"\n [validateText]=\"'Debe ingresar el nombre'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Apellidos'\"\n [control]=\"updateUserForm.controls['parent_last_name']\"\n [validateText]=\"'Debe ingresar los apellidos'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Ocupaci\u00F3n'\"\n [control]=\"updateUserForm.controls['parent_occupation']\"\n [validateText]=\"'Debe ingresar la ocupaci\u00F3n'\"\n ></ipt-input>\n <ipt-input\n [inputType]=\"'email'\"\n [placeHolder]=\"'Email'\"\n [control]=\"updateUserForm.controls['parent_email']\"\n [validateText]=\"'Debe ingresar un correo v\u00E1lido'\"\n ></ipt-input>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['parent_id_card_type'].value\"\n [control]=\"updateUserForm.controls['parent_id_card_type']\"\n [selectCode]=\"updateUserForm.controls['parent_id_card_type'].value === null ? 'Tipo de documento' : updateUserForm.controls['parent_id_card_type'].value\"\n [isRequired]=\"true\"\n [data]=\"idTypes\"\n (eventSelect)=\"selectIdType('parent_id_card_type', $event)\"\n [defaultText]=\"'Tipo de documento'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Documento'\"\n [control]=\"updateUserForm.controls['parent_id_card']\"\n [validateText]=\"'Debe ingresar el n\u00FAmero de documento'\"\n ></ipt-input>\n <ipt-select\n [initialValue]=\"updateUserForm.controls['parent_phone_indicative'].value\"\n [control]=\"updateUserForm.controls['parent_phone_indicative']\"\n [data]=\"indicatives\"\n (eventSelect)=\"selectIndicative('parent_phone_indicative', $event)\"\n [defaultText]=\"'Indicativo'\"\n ></ipt-select>\n <ipt-input\n [inputType]=\"'number'\"\n [placeHolder]=\"'Tel\u00E9fono'\"\n [control]=\"updateUserForm.controls['parent_phone_number']\"\n [validateText]=\"'Debe ingresar un n\u00FAmero de tel\u00E9fono v\u00E1lido'\"\n ></ipt-input>\n\n <ipt-input\n [inputType]=\"'text'\"\n [placeHolder]=\"'Direcci\u00F3n de oficina'\"\n [control]=\"updateUserForm.controls['parent_office_adrress']\"\n [validateText]=\"'Debe ingresar la direcci\u00F3n'\"\n ></ipt-input>\n </div>\n </div>\n <ng-template #noParentMessage>\n <div class=\"no-parent-message\">\n <p>Sin acudiente</p>\n </div>\n </ng-template>\n </div>\n\n <div class=\"buttons-container\">\n <ipt-button\n [label]=\"'Actualizar'\"\n [isEnabled]=\"!loader && updateUserForm.valid && !updateUserForm.hasError('mismatch') && hasFormChanged()\"\n (onClick)=\"updateUser()\"\n [primary]=\"true\"\n ></ipt-button>\n </div>\n </form>\n </div>\n </div>\n<!-- </p-dialog> -->", styles: ["@media screen and (min-width: 320px){main{background:rgba(0,0,0,.472);color:#fff;position:fixed;top:0;left:0;height:100vh;width:100vw;transition:all .5s}main .modal_container{width:60%;height:-moz-fit-content;height:fit-content;position:absolute;inset:0;margin:auto;background-color:#fff;border-radius:3px}.header_modal{display:flex;padding:15px 15px 0;gap:1rem;align-items:center}.header_modal h1{padding:.5rem;background-color:#1c77f7;color:#fff;width:100%;border-radius:10px;font-size:1.25rem;font-weight:700}.header_modal button{margin-left:auto;font-size:26px;padding:1.2rem;font-weight:200;color:#6c7f7d;display:flex;width:25px;height:25px;align-items:center;justify-content:center;transition:50ms;background-color:transparent;border:none}.header_modal button:hover{cursor:pointer;border-radius:50%;background-color:#d4d4d4}.grid_container{display:grid;grid-template-columns:1fr;padding:0 15px}form{display:grid;grid-template-columns:1fr;gap:.25rem;justify-content:center;padding:0 1rem}.section-header{margin:1.5rem 0 .5rem;border-bottom:2px solid #1c77f7}.section-header h2{font-size:1.2rem;color:#1c77f7;font-weight:600;margin-bottom:.5rem}.form-grid{display:grid;grid-template-columns:1fr;gap:.25rem}.buttons-container{margin-top:2rem;margin-bottom:2rem;display:flex;justify-content:center;align-items:center}.user-type-image{display:none}.no-parent-message{padding:1rem;text-align:center;color:#666;font-size:1rem;font-weight:500;background-color:#f8f9fa;border-radius:.5rem;margin-top:.5rem}}@media screen and (min-width: 768px){.form-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:1rem}}@media screen and (min-width: 1366px){form{padding:0}}.field{height:1px;max-width:67%}.error-message{color:red;font-size:12px;margin-top:5px}.p-selectbutton{display:flex;flex-wrap:wrap;justify-content:center;width:100%;min-width:10rem}:host ::ng-deep .p-selectbutton .p-button{padding:.5rem;font-size:.875rem;height:30px}:host ::ng-deep .p-buttonset .p-button:first-of-type{height:30px}\n"] }]
616
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i0.ChangeDetectorRef }, { type: i2.ParameterService }, { type: i2.BaseService }, { type: i2.UserService }]; }, propDecorators: { DataStudent: [{
617
+ type: Input
618
+ }], visibleModal: [{
619
+ type: Input
620
+ }], closeModalIS: [{
621
+ type: Output
622
+ }], userUpdatedEvent: [{
623
+ type: Output
624
+ }] } });
625
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBkYXRlLXVzZXItZm9ybS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXNpZ24tc3lzdGVtL3NyYy9saWIvY29tcG9uZW50cy9mb3Jtcy91cGRhdGUtdXNlci1mb3JtL3VwZGF0ZS11c2VyLWZvcm0uY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVzaWduLXN5c3RlbS9zcmMvbGliL2NvbXBvbmVudHMvZm9ybXMvdXBkYXRlLXVzZXItZm9ybS91cGRhdGUtdXNlci1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBb0MsTUFBTSxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUM1SCxPQUFPLEVBQTJDLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3JGLE9BQU8sSUFBSSxNQUFNLGFBQWEsQ0FBQzs7Ozs7Ozs7QUFPL0IsTUFBTSxPQUFPLHVCQUF1QjtJQThCbEMsWUFDVSxFQUFlLEVBQ2YsR0FBc0IsRUFDdEIsZ0JBQWtDLEVBQ2xDLFdBQXdCLEVBQ3hCLFdBQXdCO1FBSnhCLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBakN6QixpQkFBWSxHQUFZLEtBQUssQ0FBQztRQUM3QixpQkFBWSxHQUFHLElBQUksWUFBWSxFQUFXLENBQUM7UUFDM0MscUJBQWdCLEdBQUcsSUFBSSxZQUFZLEVBQVEsQ0FBQztRQUV0RCxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBQ25CLDJCQUFzQixHQUFVLEVBQUUsQ0FBQztRQUNuQyxZQUFPLEdBQVUsRUFBRSxDQUFDO1FBQ3BCLFdBQU0sR0FB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QyxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDO29CQUNwRSxNQUFNO2dCQUNSLEtBQUssY0FBYztvQkFDakIsYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLElBQUksRUFBRSxDQUFDO29CQUMzRCxNQUFNO2dCQUNSO29CQUNFLGFBQWEsR0FBRyxFQUFFLENBQUM7YUFDdEI7WUFFRCxNQUFNLGlCQUFpQixHQUFHLGlCQUFpQixJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1RixNQUFNLGtCQUFrQixHQUFHLGFBQWEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBRXJGLElBQUksaUJBQWlCLEtBQUssa0JBQWtCLEVBQUU7Z0JBQzVDLE9BQU8sSUFBSSxDQUFDO2FBQ2I7U0FDRjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQzs7b0hBdm9CVSx1QkFBdUI7d0dBQXZCLHVCQUF1Qix3T0NYcEMsNHBjQThRb0I7MkZEblFQLHVCQUF1QjtrQkFMbkMsU0FBUzsrQkFDRSxzQkFBc0I7cU5BS3ZCLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csWUFBWTtzQkFBcEIsS0FBSztnQkFDSSxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPbkNoYW5nZXMsIFNpbXBsZUNoYW5nZXMsIE91dHB1dCwgQ2hhbmdlRGV0ZWN0b3JSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFic3RyYWN0Q29udHJvbCwgRm9ybUJ1aWxkZXIsIEZvcm1Hcm91cCwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbi8vIGltcG9ydCB7IEJhc2VTZXJ2aWNlLCBQYXJhbWV0ZXJTZXJ2aWNlLCBVc2VyU2VydmljZSB9IGZyb20gJ2Rlc2lnbi1zeXN0ZW0nO1xuaW1wb3J0IHsgQmFzZVNlcnZpY2UsIElGb3JtRGF0YVJxLCBQYXJhbWV0ZXJTZXJ2aWNlLCBVc2VyU2VydmljZSB9IGZyb20gJ2Rlc2lnbi1zeXN0ZW0nO1xuaW1wb3J0IFN3YWwgZnJvbSAnc3dlZXRhbGVydDInO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdpcHQtdXBkYXRlLXVzZXItZm9ybScsXG4gIHRlbXBsYXRlVXJsOiAnLi91cGRhdGUtdXNlci1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vdXBkYXRlLXVzZXItZm9ybS5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgdXBkYXRlVXNlckZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIERhdGFTdHVkZW50OiBhbnk7XG4gIEBJbnB1dCgpIHZpc2libGVNb2RhbDogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgY2xvc2VNb2RhbElTID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgdXNlclVwZGF0ZWRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgdXBkYXRlVXNlckZvcm0hOiBGb3JtR3JvdXA7XG4gIHBob3RvOiBzdHJpbmcgPSAnJztcbiAgcGhvbmVOdW1iZXJJbmRpY2F0aXZlczogYW55W10gPSBbXTtcbiAgaWRUeXBlczogYW55W10gPSBbXTtcbiAgbG9hZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIHN0YXRlczogYW55ID0gW107XG4gIGNpdGllczogYW55ID0gW107XG4gIGNvdW50cmllczogYW55ID0gW107XG4gIHNob3dQYXJlbnRTZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dFbWFpbElwdDogYm9vbGVhbiA9IGZhbHNlO1xuICBwYXJhbWV0ZXJzQWxsPzogYW55O1xuICBpbmRpY2F0aXZlczogYW55W10gPSBbXTtcbiAgY2l2aWxTdGF0dXM6IGFueVtdID0gW107XG4gIGdlbmRlcnM6IGFueVtdID0gW107XG4gIHN0cmF0dW1zOiBhbnlbXSA9IFtdO1xuICBwYXJhbWV0ZXJzTG9hZGVkOiBib29sZWFuID0gZmFsc2U7XG4gIC8vIHVzZXJVcGRhdGVkID0gZmFsc2U7XG4gIHByaXZhdGUgaW5pdGlhbEZvcm1WYWx1ZTogYW55ID0gW107XG4gICAganVzdGlmeU9wdGlvbnM6IGFueVtdID0gW1xuICAgIC8vIHsgbmFtZTogJ0luYWN0aXZvcycsIGNvZGU6IDEgfSxcbiAgICB7IG5hbWU6ICdBY3Rpdm8nLCBjb2RlOiAxIH0sXG4gICAgeyBuYW1lOiAnUmVtb3ZpZG8nLCBjb2RlOiA0IH1cbiAgXTtcbiAgXG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgIHByaXZhdGUgcGFyYW1ldGVyU2VydmljZTogUGFyYW1ldGVyU2VydmljZSxcbiAgICBwcml2YXRlIGJhc2VTZXJ2aWNlOiBCYXNlU2VydmljZSxcbiAgICBwcml2YXRlIHVzZXJTZXJ2aWNlOiBVc2VyU2VydmljZSAgXG4gICkge1xuICAgIHRoaXMuaW5pdEZvcm0oKTtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGNvbnNvbGUubG9nKFwiZW50cm8gYSBnZXRQYXJhbWV0ZXJzIHBvciBuZ29uaW5pdFwiKTtcbiAgICB0aGlzLmdldFBhcmFtZXRlcnMoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoY2hhbmdlc1sndmlzaWJsZU1vZGFsJ10gJiYgY2hhbmdlc1sndmlzaWJsZU1vZGFsJ10uY3VycmVudFZhbHVlKSB7XG4gICAgICBjb25zb2xlLmxvZyhcImVudHJvIGEgZ2V0UGFyYW1ldGVycyBwb3IgdmlzaWJsZSBtb2RhbCwgZG9uZGUgZWwgY2hhbmdlIGVzOlwiLCBjaGFuZ2VzWyd2aXNpYmxlTW9kYWwnXSk7XG4gICAgICB0aGlzLmluaXRpYWxpemVGb3JtKCk7XG4gICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UGFyYW1ldGVycygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXJhbWV0ZXJzTG9hZGVkKSB7XG4gICAgICB0aGlzLnNldFBhcmFtZXRlcnMoKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZUZvcm0oKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5wYXJhbWV0ZXJTZXJ2aWNlLmdldEFsbFBhcmFtZXRlcnNDb2RGb3JtKCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6IChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLnBhcmFtZXRlcnNBbGwgPSByZXNwb25zZS5kYXRhO1xuICAgICAgICB0aGlzLnBhcmFtZXRlcnNMb2FkZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnNldFBhcmFtZXRlcnMoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplRm9ybSgpO1xuICAgICAgICB0aGlzLmNkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZmV0Y2hpbmcgcGFyYW1ldGVyczonLCBlcnIpO1xuICAgICAgICB0aGlzLnBhcmFtZXRlcnNMb2FkZWQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHNldFBhcmFtZXRlcnMoKTogdm9pZCB7XG4gICAgdGhpcy5pZFR5cGVzID0gdGhpcy5wYXJhbWV0ZXJzQWxsPy5UeXBlSWRDYXJkQnlDb3VudHJ5Q29sO1xuICAgIHRoaXMuaW5kaWNhdGl2ZXMgPSB0aGlzLnBhcmFtZXRlcnNBbGw/LmluZGljYXRpdmVzO1xuICAgIHRoaXMuY291bnRyaWVzID0gdGhpcy5wYXJhbWV0ZXJzQWxsPy5jb3VudHJ5O1xuICAgIHRoaXMuY2l2aWxTdGF0dXMgPSB0aGlzLnBhcmFtZXRlcnNBbGw/LmNpdmlsU3RhdHVzO1xuICAgIHRoaXMuc3RhdGVzID0gdGhpcy5wYXJhbWV0ZXJzQWxsPy5TdGF0ZTtcbiAgICB0aGlzLmNpdGllcyA9IHRoaXMucGFyYW1ldGVyc0FsbD8uY2l0eTtcbiAgICAvLyB0aGlzLmdlbmRlcnMgPSBbXG4gICAgLy8gICB7IGNvZGU6IDEsIG5hbWU6ICdNYXNjdWxpbm8nIH0sXG4gICAgLy8gICB7IGNvZGU6IDIsIG5hbWU6ICdGZW1lbmlubycgfVxuICAgIC8vIF07XG4gICAgaWYgKHRoaXMucGFyYW1ldGVyc0FsbCAmJiB0aGlzLnBhcmFtZXRlcnNBbGwuZ2VuZGVyKSB7XG4gICAgICAvLyBUcmFuc2Zvcm1hciBnZW5kZXIgZW4gdW4gYXJyZWdsbyBkZSB7IGNvZGUsIG5hbWUgfVxuICAgICAgdGhpcy5nZW5kZXJzID0gdGhpcy5wYXJhbWV0ZXJzQWxsLmdlbmRlci5tYXAoKGdlbmRlcjogYW55KSA9PiAoe1xuICAgICAgICBjb2RlOiBnZW5kZXIuY29kZSxcbiAgICAgICAgbmFtZTogZ2VuZGVyLm5hbWVfc3BhbmlzaFxuICAgICAgfSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdlbmRlcnMgPSBbXTtcbiAgICB9XG4gIH1cblxuICBpbml0aWFsaXplRm9ybSgpOiB2b2lkIHtcbiAgICB0aGlzLnNob3dQYXJlbnRTZWN0aW9uID0gISF0aGlzLkRhdGFTdHVkZW50Py5jb2RzPy5wYXJlbnQ/LmNvZGU7XG4gICAgdGhpcy5zaG93RW1haWxJcHQgPSAhIXRoaXMuRGF0YVN0dWRlbnQ/LmVtYWlsX2lwdCAmJiB0aGlzLkRhdGFTdHVkZW50LmVtYWlsX2lwdCAhPT0gZmFsc2U7XG4gICAgdGhpcy5pbml0Rm9ybSgpO1xuICAgIHRoaXMucG9wdWxhdGVGb3JtKCk7XG4gIH1cblxuICBpbml0Rm9ybSgpOiB2b2lkIHtcbiAgICBjb25zdCBiYXNlRm9ybSA9IHtcbiAgICAgIG5hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDMpLCBWYWxpZGF0b3JzLm1heExlbmd0aCgzMildXSxcbiAgICAgIGxhc3RfbmFtZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoNSksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMyKV1dLFxuICAgICAgZW1haWw6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWwsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMwMCldXSxcbiAgICAgIGdlbmRlcjogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgaWRfY2FyZF90eXBlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBpZF9jYXJkOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbkxlbmd0aCg1KSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMjApXV0sXG4gICAgICBwaG9uZV9pbmRpY2F0aXZlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBwaG9uZV9udW1iZXI6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDEwKSwgVmFsaWRhdG9ycy5tYXhMZW5ndGgoMTUpXV0sXG4gICAgICBjb3VudHJ5OiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXG4gICAgICBzdGF0ZTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgY2l0eTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxuICAgICAgcm9sZTogW3sgdmFsdWU6ICcnLCBkaXNhYmxlZDogdHJ1ZSB9XSxcbiAgICAgIHNlcnZpY2VfaG91cjogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgIHBhc3N3b3JkOiBbJycsIFtdXSxcbiAgICAgIHJlX3Bhc3N3b3JkOiBbJycsIFtdXSxcbiAgICAgIGNoYW5nZVBhc3N3b3JkOiBbZmFsc2VdLFxuICAgICAgc3RhdHVzOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgfTtcblxuICAgIGlmICh0aGlzLnNob3dFbWFpbElwdCkge1xuICAgICAgT2JqZWN0LmFzc2lnbihiYXNlRm9ybSwge1xuICAgICAgICBlbWFpbF9pcHQ6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWwsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDI1NSldXVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvd1BhcmVudFNlY3Rpb24pIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oYmFzZUZvcm0sIHtcbiAgICAgICAgcGFyZW50X25hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDMpLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxNTApXV0sXG4gICAgICAgIHBhcmVudF9sYXN0X25hbWU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDUpLCBWYWxpZGF0b3JzLm1heExlbmd0aCgxNTApXV0sXG4gICAgICAgIHBhcmVudF9pZF9jYXJkX3R5cGU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgICAgcGFyZW50X2lkX2NhcmQ6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDUpLCBWYWxpZGF0b3JzLm1heExlbmd0aCgzMCldXSxcbiAgICAgICAgcGFyZW50X3Bob25lX2luZGljYXRpdmU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcbiAgICAgICAgcGFyZW50X3Bob25lX251bWJlcjogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMTApLCBWYWxpZGF0b3JzLm1heExlbmd0aCgyMCldXSxcbiAgICAgICAgcGFyZW50X29jY3VwYXRpb246IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDUwKV1dLFxuICAgICAgICBwYXJlbnRfb2ZmaWNlX2FkcnJlc3M6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDE1MCldXSxcbiAgICAgICAgcGFyZW50X2VtYWlsOiBbJycsIFtWYWxpZGF0b3JzLmVtYWlsLCBWYWxpZGF0b3JzLm1heExlbmd0aCgyNTUpXV1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlVXNlckZvcm0gPSB0aGlzLmZiLmdyb3VwKGJhc2VGb3JtLCB7IHZhbGlkYXRvcnM6IHRoaXMucGFzc3dvcmRNYXRjaFZhbGlkYXRvciB9KTtcblxuICAgIHRoaXMudXBkYXRlVXNlckZvcm0uZ2V0KCdjaGFuZ2VQYXNzd29yZCcpPy52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKChjaGVja2VkOiBib29sZWFuKSA9PiB7XG4gICAgICBjb25zdCBwYXNzd29yZENvbnRyb2wgPSB0aGlzLnVwZGF0ZVVzZXJGb3JtLmdldCgncGFzc3dvcmQnKTtcbiAgICAgIGNvbnN0IHJlUGFzc3dvcmRDb250cm9sID0gdGhpcy51cGRhdGVVc2VyRm9ybS5nZXQoJ3JlX3Bhc3N3b3JkJyk7XG5cbiAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgIHBhc3N3b3JkQ29udHJvbD8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoNSksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMyKV0pO1xuICAgICAgICByZVBhc3N3b3JkQ29udHJvbD8uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoNSksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDMyKV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFzc3dvcmRDb250cm9sPy5jbGVhclZhbGlkYXRvcnMoKTtcbiAgICAgICAgcmVQYXNzd29yZENvbnRyb2w/LmNsZWFyVmFsaWRhdG9ycygpO1xuICAgICAgICBwYXNzd29yZENvbnRyb2w/LnNldFZhbHVlKCcnKTtcbiAgICAgICAgcmVQYXNzd29yZENvbnRyb2w/LnNldFZhbHVlKCcnKTtcbiAgICAgIH1cblxuICAgICAgcGFzc3dvcmRDb250cm9sPy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgICByZVBhc3N3b3JkQ29udHJvbD8udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICAgIH0pO1xuXG4gICAgdGhpcy51cGRhdGVVc2VyRm9ybS5nZXQoJ3Bhc3N3b3JkJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfSk7XG4gICAgdGhpcy51cGRhdGVVc2VyRm9ybS5nZXQoJ3JlX3Bhc3N3b3JkJyk/LnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gICAgfSk7XG4gIH1cblxuICBwYXNzd29yZE1hdGNoVmFsaWRhdG9yKGZvcm06IEZvcm1Hcm91cCk6IHsgW2tleTogc3RyaW5nXTogYm9vbGVhbiB9IHwgbnVsbCB7XG4gICAgY29uc3QgY2hhbmdlUGFzc3dvcmQgPSBmb3JtLmdldCgnY2hhbmdlUGFzc3dvcmQnKT8udmFsdWU7XG4gICAgY29uc3QgcGFzc3dvcmQgPSBmb3JtLmdldCgncGFzc3dvcmQnKT8udmFsdWU7XG4gICAgY29uc3QgcmVQYXNzd29yZCA9IGZvcm0uZ2V0KCdyZV9wYXNzd29yZCcpPy52YWx1ZTtcbiAgICBpZiAoIWNoYW5nZVBhc3N3b3JkKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWlzbWF0Y2ggPSBwYXNzd29yZCAmJiByZVBhc3N3b3JkICYmIHBhc3N3b3JkICE9PSByZVBhc3N3b3JkO1xuICAgIHJldHVybiBtaXNtYXRjaCA/IHsgbWlzbWF0Y2g6IHRydWUgfSA6IG51bGw7XG4gIH1cblxuICBub1doaXRlc3BhY2VWYWxpZGF0b3IoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gfCBudWxsIHtcbiAgICBpZiAoY29udHJvbC52YWx1ZSAmJiB0eXBlb2YgY29udHJvbC52YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHRyaW1tZWRWYWx1ZSA9IGNvbnRyb2wudmFsdWUudHJpbSgpO1xuICAgICAgaWYgKHRyaW1tZWRWYWx1ZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHsgb25seVdoaXRlc3BhY2U6IHRydWUgfTtcbiAgICAgIH1cbiAgICAgIGlmIChjb250cm9sLnZhbHVlICE9PSB0cmltbWVkVmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHsgaGFzV2hpdGVzcGFjZTogdHJ1ZSB9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyYW5zZm9ybVJvbGUocm9sZTogYW55KTogc3RyaW5nIHtcbiAgICBjb25zdCByb2xlTWFwOiB7IFtrZXk6IG51bWJlcl06IHN0cmluZyB9ID0ge1xuICAgICAgMTogJ1N1cGVyIEFkbWluJyxcbiAgICAgIDEwOiAnSmVmZSBBY2FkZW1pY28nLFxuICAgICAgMTE6ICdDb29yZGluYWRvciBBY2FkZW1pY28nLFxuICAgICAgMTI6ICdUZWFjaGVyIEFjYWRlbWljbycsXG4gICAgICAxMzogJ0VzdHVkaWFudGUnLFxuICAgICAgMTU6ICdQb3NpYmxlIEVzdHVkaWFudGUnLFxuICAgICAgMjA6ICdKZWZlIE1hcmtldGluZycsXG4gICAgICAyMTogJ0Nvb3JkaW5hZG9yIE1hcmtldGluZycsXG4gICAgICAyMjogJ0F1eGlsaWFyIE1hcmtldGluZycsXG4gICAgICAzMDogJ0plZmUgQWRtaW5pc3RyYXRpdm8nLFxuICAgICAgMzE6ICdDb29yZGluYWRvciBBZG1pbmlzdHJhdGl2bycsXG4gICAgICAzMjogJ0NhamVybyBBZG1pbmlzdHJhdGl2bycsXG4gICAgICA0MDogJ0plZmUgQ29tZXJjaWFsJyxcbiAgICAgIDQxOiAnQ29vcmRpbmFkb3IgQ29tZXJjaWFsJyxcbiAgICAgIDQyOiAnQXNlc29yIENvbWVyY2lhbCcsXG4gICAgICA1MDogJ0plZmUgQ2FydGVyYScsXG4gICAgICA1MTogJ0Nvb3JkaW5hZG9yIENhcnRlcmEnLFxuICAgICAgNTI6ICdBc2Vzb3IgQ2FydGVyYScsXG4gICAgICA2MDogJ1Byb3ZlZWRvcidcbiAgICB9O1xuICAgIHJldHVybiByb2xlTWFwW051bWJlcihyb2xlKV0gfHwgJyc7XG4gIH1cblxuICBwb3B1bGF0ZUZvcm0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuRGF0YVN0dWRlbnQpIHtcbiAgICAgIGNvbnN0IGZvcm1WYWx1ZTogYW55ID0ge1xuICAgICAgICBuYW1lOiB0aGlzLkRhdGFTdHVkZW50Lm5hbWUgfHwgJycsXG4gICAgICAgIGxhc3RfbmFtZTogdGhpcy5EYXRhU3R1ZGVudC5sYXN0X25hbWUgfHwgJycsXG4gICAgICAgIGVtYWlsOiB0aGlzLkRhdGFTdHVkZW50LmVtYWlsIHx8ICcnLFxuICAgICAgICBnZW5kZXI6IHRoaXMuRGF0YVN0dWRlbnQuZ2VuZGVyIHx8IG51bGwsXG4gICAgICAgIGlkX2NhcmRfdHlwZTogdGhpcy5EYXRhU3R1ZGVudC5pZF9jYXJkX3R5cGUgfHwgJycsXG4gICAgICAgIGlkX2NhcmQ6IHRoaXMuRGF0YVN0dWRlbnQuaWRfY2FyZCB8fCAnJyxcbiAgICAgICAgcGhvbmVfaW5kaWNhdGl2ZTogdGhpcy5EYXRhU3R1ZGVudC5waG9uZV9pbmRpY2F0aXZlIHx8ICcnLFxuICAgICAgICBwaG9uZV9udW1iZXI6IHRoaXMuRGF0YVN0dWRlbnQucGhvbmVfbnVtYmVyIHx8ICcnLFxuICAgICAgICBjb3VudHJ5OiB0aGlzLkRhdGFTdHVkZW50LmNpdHk/LmNvdW50cnksXG4gICAgICAgIHN0YXRlOiB0aGlzLkRhdGFTdHVkZW50LmNpdHk/LnN0YXRlLFxuICAgICAgICBjaXR5OiB0aGlzLkRhdGFTdHVkZW50LmNpdHk/LmNvZGUsXG4gICAgICAgIHJvbGU6IHRoaXMudHJhbnNmb3JtUm9sZSh0aGlzLkRhdGFTdHVkZW50LnJvbGUpIHx8ICcnLFxuICAgICAgICBzZXJ2aWNlX2hvdXI6IHRoaXMuRGF0YVN0dWRlbnQuc2VydmljZV9ob3VyIHx8IDAsXG4gICAgICAgIGNoYW5nZVBhc3N3b3JkOiBmYWxzZSxcbiAgICAgICAgcGFzc3dvcmQ6ICcnLFxuICAgICAgICByZV9wYXNzd29yZDogJycsXG4gICAgICAgIHN0YXR1czogdGhpcy5EYXRhU3R1ZGVudC51c2VyX3N0YXR1cyB8fCAnJ1xuICAgICAgfTtcblxuICAgICAgaWYgKHRoaXMuc2hvd0VtYWlsSXB0KSB7XG4gICAgICAgIGZvcm1WYWx1ZS5lbWFpbF9pcHQgPSB0aGlzLkRhdGFTdHVkZW50LmVtYWlsX2lwdCB8fCAnJztcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuc2hvd1BhcmVudFNlY3Rpb24pIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihmb3JtVmFsdWUsIHtcbiAgICAgICAgICBwYXJlbnRfbmFtZTogdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/Lm5hbWUgfHwgJycsXG4gICAgICAgICAgcGFyZW50X2xhc3RfbmFtZTogdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/Lmxhc3RfbmFtZSB8fCAnJyxcbiAgICAgICAgICBwYXJlbnRfaWRfY2FyZF90eXBlOiB0aGlzLkRhdGFTdHVkZW50LmNvZHM/LnBhcmVudD8uaWRfY2FyZF90eXBlIHx8ICcnLFxuICAgICAgICAgIHBhcmVudF9pZF9jYXJkOiB0aGlzLkRhdGFTdHVkZW50LmNvZHM/LnBhcmVudD8uaWRfY2FyZCB8fCAnJyxcbiAgICAgICAgICBwYXJlbnRfcGhvbmVfaW5kaWNhdGl2ZTogdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/LnBob25lX2luZGljYXRpdmUgfHwgJycsXG4gICAgICAgICAgcGFyZW50X3Bob25lX251bWJlcjogdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/LnBob25lX251bWJlciB8fCAnJyxcbiAgICAgICAgICBwYXJlbnRfb2NjdXBhdGlvbjogdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/Lm9jY3VwYXRpb24gfHwgJycsXG4gICAgICAgICAgcGFyZW50X29mZmljZV9hZHJyZXNzOiB0aGlzLkRhdGFTdHVkZW50LmNvZHM/LnBhcmVudD8ub2ZmaWNlX2FkcnJlc3MgfHwgJycsXG4gICAgICAgICAgcGFyZW50X2VtYWlsOiB0aGlzLkRhdGFTdHVkZW50LmNvZHM/LnBhcmVudD8uZW1haWwgfHwgJydcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0ucmVzZXQoKTtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0ucGF0Y2hWYWx1ZShmb3JtVmFsdWUpO1xuICAgICAgdGhpcy5pbml0aWFsRm9ybVZhbHVlID0geyAuLi50aGlzLnVwZGF0ZVVzZXJGb3JtLnZhbHVlIH07XG4gICAgICBpZiAoZm9ybVZhbHVlLmNvdW50cnkpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJlbiBwb3B1bGF0ZUZvcm0gc2UgZW52aW8gZGF0byBwYXJhIHNldGVhcnNlIGNvdW50cnlcIik7XG4gICAgICAgIHRoaXMuY291bnRyaWVzID0gdGhpcy5wYXJhbWV0ZXJzQWxsPy5jb3VudHJ5O1xuICAgICAgICB0aGlzLnNlbGVjdENvdW50cnkodGhpcy5EYXRhU3R1ZGVudC5jaXR5Py5jb3VudHJ5KTtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtVmFsdWUuc3RhdGUpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RTdGF0ZSh0aGlzLkRhdGFTdHVkZW50LmNpdHk/LnN0YXRlKTtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtVmFsdWUuY2l0eSkge1xuICAgICAgICB0aGlzLnNlbGVjdENpdHkodGhpcy5EYXRhU3R1ZGVudC5jaXR5Py5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtVmFsdWUuaWRfY2FyZF90eXBlKSB7XG4gICAgICAgIHRoaXMuaWRUeXBlcyA9IHRoaXMucGFyYW1ldGVyc0FsbD8uVHlwZUlkQ2FyZEJ5Q291bnRyeUNvbDtcbiAgICAgICAgdGhpcy5zZWxlY3RHZW5kZXIodGhpcy5EYXRhU3R1ZGVudC5pZF9jYXJkX3R5cGUpO1xuICAgICAgfVxuICAgICAgaWYgKGZvcm1WYWx1ZS5waG9uZV9pbmRpY2F0aXZlKSB7XG4gICAgICAgIHRoaXMuaW5kaWNhdGl2ZXMgPSB0aGlzLnBhcmFtZXRlcnNBbGw/LmluZGljYXRpdmVzO1xuICAgICAgICB0aGlzLnNlbGVjdEluZGljYXRpdmUoJ3Bob25lX2luZGljYXRpdmUnLCB0aGlzLkRhdGFTdHVkZW50LnBob25lX2luZGljYXRpdmUpO1xuICAgICAgfVxuICAgICAgaWYgKGZvcm1WYWx1ZS5wYXJlbnRfcGhvbmVfaW5kaWNhdGl2ZSkge1xuICAgICAgICB0aGlzLmluZGljYXRpdmVzID0gdGhpcy5wYXJhbWV0ZXJzQWxsPy5pbmRpY2F0aXZlcztcbiAgICAgICAgdGhpcy5zZWxlY3RJbmRpY2F0aXZlKCdwYXJlbnRfcGhvbmVfaW5kaWNhdGl2ZScsIHRoaXMuRGF0YVN0dWRlbnQuY29kcz8ucGFyZW50Py5waG9uZV9pbmRpY2F0aXZlKTtcbiAgICAgIH1cbiAgICAgIGlmIChmb3JtVmFsdWUuZ2VuZGVyKSB7XG4gICAgICAgIGlmICh0aGlzLnBhcmFtZXRlcnNBbGwgJiYgdGhpcy5wYXJhbWV0ZXJzQWxsLmdlbmRlcikge1xuICAgICAgICAgIC8vIFRyYW5zZm9ybWFyIGdlbmRlciBlbiB1biBhcnJlZ2xvIGRlIHsgY29kZSwgbmFtZSB9XG4gICAgICAgICAgdGhpcy5nZW5kZXJzID0gdGhpcy5wYXJhbWV0ZXJzQWxsLmdlbmRlci5tYXAoKGdlbmRlcjogYW55KSA9PiAoe1xuICAgICAgICAgICAgY29kZTogZ2VuZGVyLmNvZGUsXG4gICAgICAgICAgICBuYW1lOiBnZW5kZXIubmFtZV9zcGFuaXNoXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZ2VuZGVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0R2VuZGVyKHRoaXMuRGF0YVN0dWRlbnQuZ2VuZGVyKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjbG9zZVRhYmxlKCk6IHZvaWQge1xuICAgIHRoaXMudmlzaWJsZU1vZGFsID0gZmFsc2U7XG4gICAgdGhpcy51cGRhdGVVc2VyRm9ybS5yZXNldCgpO1xuICAgIHRoaXMuaWRUeXBlcyA9IFtdO1xuICAgIHRoaXMuY291bnRyaWVzID0gW107XG4gICAgdGhpcy5nZW5kZXJzID0gW107XG5cbiAgICB0aGlzLmNsb3NlTW9kYWxJUy5lbWl0KGZhbHNlKTtcbiAgfVxuXG4gIHNlbGVjdFJvbChyb2xlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAocm9sZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5nZXQoJ3JvbGUnKT8uc2V0VmFsdWUodGhpcy50cmFuc2Zvcm1Sb2xlKHJvbGUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5nZXQoJ3JvbGUnKT8uc2V0VmFsdWUoJycpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdEluZGljYXRpdmUoZmllbGQ6IHN0cmluZywgaW5kaWNhdGl2ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKGluZGljYXRpdmUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uZ2V0KGZpZWxkKT8uc2V0VmFsdWUoaW5kaWNhdGl2ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uZ2V0KGZpZWxkKT8uc2V0VmFsdWUobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0SWRUeXBlKGZpZWxkOiBzdHJpbmcsIGlkVHlwZTogYW55KTogdm9pZCB7XG4gICAgaWYgKGlkVHlwZSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5nZXQoZmllbGQpPy5zZXRWYWx1ZShpZFR5cGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJGb3JtLmdldChmaWVsZCk/LnNldFZhbHVlKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdEdlbmRlcihnZW5kZXI6IGFueSk6IHZvaWQge1xuICAgIGlmIChnZW5kZXIgIT09IG51bGwpIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uZ2V0KCdnZW5kZXInKT8uc2V0VmFsdWUoZ2VuZGVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5nZXQoJ2dlbmRlcicpPy5zZXRWYWx1ZShudWxsKTtcbiAgICB9XG4gIH1cblxuICBzZWxlY3RDb3VudHJ5KGNvdW50cnk6IGFueSkge1xuICAgIGNvbnN0IGNvdW50cnlOdW1iZXIgPSB0eXBlb2YgY291bnRyeSA9PT0gJ3N0cmluZycgPyBwYXJzZUludChjb3VudHJ5LCAxMCkgOiBjb3VudHJ5O1xuICAgIGlmIChjb3VudHJ5ICE9IG51bGwpIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2NvdW50cnknXS5zZXRWYWx1ZShjb3VudHJ5TnVtYmVyKTtcbiAgICAgIGNvbnNvbGUubG9nKFwic2Ugc2V0ZW8gY291bnRyeSBjb24gZWwgdmFsb3IgcXVlIGVudHJvIGVuIHNlbGVjdENvdW50cnlcIik7XG4gICAgICBpZiAodGhpcy5wYXJhbWV0ZXJzQWxsICYmIHRoaXMucGFyYW1ldGVyc0FsbD8uU3RhdGUpIHtcbiAgICAgICAgdGhpcy5zdGF0ZXMgPSB0aGlzLnBhcmFtZXRlcnNBbGwuU3RhdGUuZmlsdGVyKChjb3Vyc2U6IGFueSkgPT4ge1xuICAgICAgICAgIGNvbnN0IHN0YXRlID0gdHlwZW9mIGNvdXJzZS5jb3VudHJ5ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgPyBwYXJzZUludChjb3Vyc2UuY291bnRyeSwgMTApXG4gICAgICAgICAgICA6IGNvdXJzZS5jb3VudHJ5O1xuICAgICAgICAgIHJldHVybiBzdGF0ZSA9PT0gY291bnRyeU51bWJlcjtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnN0YXRlcyA9IFtdO1xuICAgICAgfVxuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5jb250cm9sc1snc3RhdGUnXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2NpdHknXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgIHRoaXMuY2l0aWVzID0gW107XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2NvdW50cnknXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgIHRoaXMuc3RhdGVzID0gW107XG4gICAgICB0aGlzLmNpdGllcyA9IFtdO1xuICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgIH1cbiAgfVxuXG4gIHNlbGVjdFN0YXRlKHN0YXRlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZU51bWJlciA9IHR5cGVvZiBzdGF0ZSA9PT0gJ3N0cmluZycgPyBwYXJzZUludChzdGF0ZSwgMTApIDogc3RhdGU7XG4gICAgaWYgKHN0YXRlICE9PSBudWxsKSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydzdGF0ZSddLnNldFZhbHVlKHN0YXRlTnVtYmVyKTtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2NpdHknXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgIHRoaXMuY2l0aWVzID0gW107XG4gICAgICB0aGlzLmdldFN0YXRlKHN0YXRlTnVtYmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5jb250cm9sc1snc3RhdGUnXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2NpdHknXS5zZXRWYWx1ZShudWxsKTtcbiAgICAgIHRoaXMuY2l0aWVzID0gW107XG4gICAgfVxuICB9XG5cbiAgZ2V0U3RhdGUoc3RhdGU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuZ2V0Q2l0eShzdGF0ZSk7XG4gIH1cblxuICBnZXRDaXR5KHN0YXRlOiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBzdGF0ZU51bWJlciA9IHR5cGVvZiBzdGF0ZSA9PT0gJ3N0cmluZycgPyBwYXJzZUludChzdGF0ZSwgMTApIDogc3RhdGU7XG4gICAgaWYgKHRoaXMucGFyYW1ldGVyc0FsbD8uY2l0eSkge1xuICAgICAgdGhpcy5jaXRpZXMgPSB0aGlzLnBhcmFtZXRlcnNBbGwuY2l0eS5maWx0ZXIoKGNvdXJzZTogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IGNpdHlTdGF0ZSA9IHR5cGVvZiBjb3Vyc2Uuc3RhdGUgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQoY291cnNlLnN0YXRlLCAxMCkgOiBjb3Vyc2Uuc3RhdGU7XG4gICAgICAgIHJldHVybiBjaXR5U3RhdGUgPT09IHN0YXRlTnVtYmVyO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY2l0aWVzID0gW107XG4gICAgfVxuICB9XG5cbiAgc2VsZWN0Q2l0eShjaXR5OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBjaXR5TnVtYmVyID0gdHlwZW9mIGNpdHkgPT09ICdzdHJpbmcnID8gcGFyc2VJbnQoY2l0eSwgMTApIDogY2l0eTtcbiAgICBpZiAoY2l0eSAhPT0gbnVsbCkge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5jb250cm9sc1snY2l0eSddLnNldFZhbHVlKGNpdHlOdW1iZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydjaXR5J10uc2V0VmFsdWUobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgc2V0UGhvdG8odHlwZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHR5cGUgPT09ICdzdHVkZW50JykgdGhpcy5waG90byA9ICcvcGxhdGZvcm0vYWNhZGVtaWMvYXNzZXRzL3N0dWRlbnQuanBnJztcbiAgICBpZiAodHlwZSA9PT0gJ2FjYWRlbWljJykgdGhpcy5waG90byA9ICcvcGxhdGZvcm0vYWNhZGVtaWMvYXNzZXRzL2FjYWRlbWljby5wbmcnO1xuICAgIGlmICh0eXBlID09PSAnYWRtaW5pc3RyYXRpdmUnKSB0aGlzLnBob3RvID0gJy9wbGF0Zm9ybS9hZG1pbmlzdHJhdGl2ZS9hc3NldHMvYWRtaW5pc3RyYXRpdm8uanBnJztcbiAgICBpZiAodHlwZSA9PT0gJ21hcmtldGluZycpIHRoaXMucGhvdG8gPSAnL3BsYXRmb3JtL21hcmtldGluZy9hc3NldHMvbWFya2V0aW5nLmpwZyc7XG4gICAgaWYgKHR5cGUgPT09ICdjb21tZXJjaWFsJykgdGhpcy5waG90byA9ICcvcGxhdGZvcm0vY29tbWVyY2lhbC9hc3NldHMvdXNlci1mb3JtLWFzc2V0cy9jb21lcmNpYWwuanBnJztcbiAgICBpZiAodHlwZSA9PT0gJ3RyZWFzdXJlJykgdGhpcy5waG90byA9ICcvcGxhdGZvcm0vdHJlYXN1cmUvYXNzZXRzL2FkbWluaXN0cmF0aXZvLmpwZyc7XG4gIH1cblxuICB1cGRhdGVVc2VyKCk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgIHRoaXMudXBkYXRlVXNlckZvcm0uaW52YWxpZCB8fFxuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5oYXNFcnJvcignbWlzbWF0Y2gnKSB8fFxuICAgICAgIXRoaXMuaGFzRm9ybUNoYW5nZWQoKVxuICAgICkge1xuICAgICAgdGhpcy51cGRhdGVVc2VyRm9ybS5tYXJrQWxsQXNUb3VjaGVkKCk7XG4gICAgICBjb25zb2xlLmxvZygnY3JlYXRlVXNlciAtIFZhbGlkYXRpb24gZmFpbGVkOicsIHtcbiAgICAgICAgaW52YWxpZDogdGhpcy51cGRhdGVVc2VyRm9ybS5pbnZhbGlkLFxuICAgICAgICBtaXNtYXRjaDogdGhpcy51cGRhdGVVc2VyRm9ybS5oYXNFcnJvcignbWlzbWF0Y2gnKSxcbiAgICAgICAgaGFzQ2hhbmdlczogdGhpcy5oYXNGb3JtQ2hhbmdlZCgpXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmxvYWRlciA9IHRydWU7XG4gICAgY29uc3QgZm9ybVZhbHVlID0gdGhpcy51cGRhdGVVc2VyRm9ybS5nZXRSYXdWYWx1ZSgpO1xuXG4gICAgY29uc3QgcmVxdWVzdDphbnkgPSB7XG4gICAgICB0b2tlbjogdGhpcy5iYXNlU2VydmljZS5nZXRVc2VyVG9rZW4oKSxcbiAgICAgIHVzZXI6IHtcbiAgICAgICAgY29kZTogdGhpcy5EYXRhU3R1ZGVudC5jb2RlLFxuICAgICAgICBuYW1lOiBmb3JtVmFsdWUubmFtZSxcbiAgICAgICAgbGFzdF9uYW1lOiBmb3JtVmFsdWUubGFzdF9uYW1lLFxuICAgICAgICBpZF9jYXJkX3R5cGU6IGZvcm1WYWx1ZS5pZF9jYXJkX3R5cGUsXG4gICAgICAgIGlkX2NhcmQ6IGZvcm1WYWx1ZS5pZF9jYXJkLFxuICAgICAgICBwaG9uZV9pbmRpY2F0aXZlOiBmb3JtVmFsdWUucGhvbmVfaW5kaWNhdGl2ZSxcbiAgICAgICAgcGhvbmVfbnVtYmVyOiBmb3JtVmFsdWUucGhvbmVfbnVtYmVyLFxuICAgICAgICBlbWFpbDogZm9ybVZhbHVlLmVtYWlsLFxuICAgICAgICBnZW5kZXI6IGZvcm1WYWx1ZS5nZW5kZXIsXG4gICAgICAgIGNpdHk6IGZvcm1WYWx1ZS5jaXR5LFxuICAgICAgICBzZXJ2aWNlX2hvdXI6IGZvcm1WYWx1ZS5zZXJ2aWNlX2hvdXIsXG4gICAgICAgIHJvbGU6IHRoaXMuRGF0YVN0dWRlbnQucm9sZSxcbiAgICAgICAgc3RhdHVzOiBmb3JtVmFsdWUuc3RhdHVzLFxuICAgICAgICAuLi4odGhpcy5zaG93RW1haWxJcHQgPyB7IGVtYWlsX2lwdDogZm9ybVZhbHVlLmVtYWlsX2lwdCB9IDoge30pLFxuICAgICAgICAuLi4oZm9ybVZhbHVlLmNoYW5nZVBhc3N3b3JkICYmIGZvcm1WYWx1ZS5wYXNzd29yZCA/IHsgcGFzc3dvcmQ6IGZvcm1WYWx1ZS5wYXNzd29yZCB9IDoge30pXG4gICAgICB9LFxuICAgICAgcGFyZW50OiB0aGlzLnNob3dQYXJlbnRTZWN0aW9uXG4gICAgICAgID8ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/LmNvZGUgfHwgbnVsbCxcbiAgICAgICAgICAgIG5hbWU6IGZvcm1WYWx1ZS5wYXJlbnRfbmFtZSB8fCBudWxsLFxuICAgICAgICAgICAgbGFzdF9uYW1lOiBmb3JtVmFsdWUucGFyZW50X2xhc3RfbmFtZSB8fCBudWxsLFxuICAgICAgICAgICAgaWRfY2FyZF90eXBlOiBmb3JtVmFsdWUucGFyZW50X2lkX2NhcmRfdHlwZSB8fCBudWxsLFxuICAgICAgICAgICAgaWRfY2FyZDogZm9ybVZhbHVlLnBhcmVudF9pZF9jYXJkIHx8IG51bGwsXG4gICAgICAgICAgICBwaG9uZV9pbmRpY2F0aXZlOiBmb3JtVmFsdWUucGFyZW50X3Bob25lX2luZGljYXRpdmUgfHwgbnVsbCxcbiAgICAgICAgICAgIHBob25lX251bWJlcjogZm9ybVZhbHVlLnBhcmVudF9waG9uZV9udW1iZXIgfHwgbnVsbCxcbiAgICAgICAgICAgIG9jY3VwYXRpb246IGZvcm1WYWx1ZS5wYXJlbnRfb2NjdXBhdGlvbiB8fCBudWxsLFxuICAgICAgICAgICAgb2ZmaWNlX2FkcnJlc3M6IGZvcm1WYWx1ZS5wYXJlbnRfb2ZmaWNlX2FkcnJlc3MgfHwgbnVsbCxcbiAgICAgICAgICAgIGVtYWlsOiBmb3JtVmFsdWUucGFyZW50X2VtYWlsIHx8IG51bGxcbiAgICAgICAgICB9XG4gICAgICAgIDogbnVsbFxuICAgIH07XG4gICAgY29uc29sZS5sb2cocmVxdWVzdCk7XG4gICAgdGhpcy51c2VyU2VydmljZS51cGRhdGVVc2VyQW5kUGFyZW50QnlDb2RlKHJlcXVlc3QpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIHRoaXMuY291cnNlVHlwZSA9IHJlc3BvbnNlLmRhdGE7XG4gICAgICBpZiAocmVzcG9uc2UubWVzc2FnZS5jb2RlID09PTEpIHtcbiAgICAgICAgU3dhbC5maXJlKHtcbiAgICAgICAgICBwb3NpdGlvbjogJ2NlbnRlcicsXG4gICAgICAgICAgaWNvbjogJ3N1Y2Nlc3MnLFxuICAgICAgICAgIHRpdGxlOiAndXN1YXJpbyBhY3R1YWxpemFkbyBzYXRpc2ZhY3RvcmlhbWVudGUnLFxuICAgICAgICAgIHNob3dDb25maXJtQnV0dG9uOiBmYWxzZSxcbiAgICAgICAgICB0aW1lcjogMjUwMCxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHRoaXMudXNlclVwZGF0ZWQgPSB0cnVlXG4gICAgICAgIHRoaXMudXNlclVwZGF0ZWRFdmVudC5lbWl0KCk7XG4gICAgICAgIHRoaXMuY2xvc2VUYWJsZSgpO1xuICAgICAgfWVsc2V7XG4gICAgICAgIFN3YWwuZmlyZSh7XG4gICAgICAgICAgcG9zaXRpb246ICdjZW50ZXInLFxuICAgICAgICAgIGljb246ICdlcnJvcicsXG4gICAgICAgICAgdGl0bGU6ICdIYSBvY3VycmlkbyB1biBlcnJvciBpbmVzcGVyYWRvJyxcbiAgICAgICAgICBzaG93Q29uZmlybUJ1dHRvbjogZmFsc2UsXG4gICAgICAgICAgdGltZXI6IDI1MDAsXG4gICAgICAgIH0pO1xuICAgICAgICAvLyB0aGlzLnVzZXJVcGRhdGVkID0gZmFsc2VcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHRoaXMubG9hZGVyID0gZmFsc2U7XG4gIH1cblxuICBoYXNGb3JtQ2hhbmdlZCgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaW5pdGlhbEZvcm1WYWx1ZSB8fCAhdGhpcy5EYXRhU3R1ZGVudCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHRoaXMudXBkYXRlVXNlckZvcm0uZ2V0UmF3VmFsdWUoKTtcblxuICAgIGlmIChjdXJyZW50VmFsdWUuY2hhbmdlUGFzc3dvcmQpIHtcbiAgICAgIGNvbnN0IHBhc3N3b3JkID0gY3VycmVudFZhbHVlLnBhc3N3b3JkO1xuICAgICAgY29uc3QgcmVQYXNzd29yZCA9IGN1cnJlbnRWYWx1ZS5yZV9wYXNzd29yZDtcbiAgICAgIGNvbnN0IHBhc3N3b3JkQ29udHJvbCA9IHRoaXMudXBkYXRlVXNlckZvcm0uZ2V0KCdwYXNzd29yZCcpO1xuICAgICAgY29uc3QgcmVQYXNzd29yZENvbnRyb2wgPSB0aGlzLnVwZGF0ZVVzZXJGb3JtLmdldCgncmVfcGFzc3dvcmQnKTtcblxuICAgICAgaWYgKFxuICAgICAgICBwYXNzd29yZENvbnRyb2w/LnZhbGlkICYmXG4gICAgICAgIHJlUGFzc3dvcmRDb250cm9sPy52YWxpZCAmJlxuICAgICAgICBwYXNzd29yZCA9PT0gcmVQYXNzd29yZCAmJlxuICAgICAgICBwYXNzd29yZD8udHJpbSgpICE9PSAnJ1xuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGZpZWxkc1RvQ29tcGFyZTogKGtleW9mIElGb3JtRGF0YVJxKVtdID0gW1xuICAgICAgJ25hbWUnLFxuICAgICAgJ2xhc3RfbmFtZScsXG4gICAgICAnZW1haWwnLFxuICAgICAgJ2dlbmRlcicsXG4gICAgICAnaWRfY2FyZF90eXBlJyxcbiAgICAgICdpZF9jYXJkJyxcbiAgICAgICdwaG9uZV9pbmRpY2F0aXZlJyxcbiAgICAgICdwaG9uZV9udW1iZXInLFxuICAgICAgJ2NvdW50cnknLFxuICAgICAgJ3N0YXRlJyxcbiAgICAgICdjaXR5JyxcbiAgICAgICdyb2xlJyxcbiAgICAgICdzZXJ2aWNlX2hvdXInLFxuICAgICAgJ3N0YXR1cydcbiAgICBdO1xuXG4gICAgaWYgKHRoaXMuc2hvd0VtYWlsSXB0KSB7XG4gICAgICBmaWVsZHNUb0NvbXBhcmUucHVzaCgnZW1haWxfaXB0Jyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2hvd1BhcmVudFNlY3Rpb24pIHtcbiAgICAgIGZpZWxkc1RvQ29tcGFyZS5wdXNoKFxuICAgICAgICAncGFyZW50X25hbWUnLFxuICAgICAgICAncGFyZW50X2xhc3RfbmFtZScsXG4gICAgICAgICdwYXJlbnRfaWRfY2FyZF90eXBlJyxcbiAgICAgICAgJ3BhcmVudF9pZF9jYXJkJyxcbiAgICAgICAgJ3BhcmVudF9waG9uZV9pbmRpY2F0aXZlJyxcbiAgICAgICAgJ3BhcmVudF9waG9uZV9udW1iZXInLFxuICAgICAgICAncGFyZW50X29jY3VwYXRpb24nLFxuICAgICAgICAncGFyZW50X29mZmljZV9hZHJyZXNzJyxcbiAgICAgICAgJ3BhcmVudF9lbWFpbCdcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiBmaWVsZHNUb0NvbXBhcmUpIHtcbiAgICAgIGxldCBvcmlnaW5hbFZhbHVlOiBhbnk7XG4gICAgICBsZXQgY3VycmVudEZpZWxkVmFsdWU6IGFueSA9IGN1cnJlbnRWYWx1ZVtmaWVsZF07XG5cbiAgICAgIHN3aXRjaCAoZmllbGQpIHtcbiAgICAgICAgY2FzZSAnbmFtZSc6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQubmFtZSB8fCAnJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnbGFzdF9uYW1lJzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5sYXN0X25hbWUgfHwgJyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2VtYWlsJzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5lbWFpbCB8fCAnJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZW1haWxfaXB0JzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5lbWFpbF9pcHQgfHwgJyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2dlbmRlcic6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQuZ2VuZGVyIHx8IG51bGw7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2lkX2NhcmRfdHlwZSc6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQuaWRfY2FyZF90eXBlIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdpZF9jYXJkJzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5pZF9jYXJkIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwaG9uZV9pbmRpY2F0aXZlJzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5waG9uZV9pbmRpY2F0aXZlIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwaG9uZV9udW1iZXInOlxuICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSB0aGlzLkRhdGFTdHVkZW50LnBob25lX251bWJlciB8fCAnJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnY291bnRyeSc6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQuY2l0eT8uY291bnRyeSB8fCAnJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnc3RhdGUnOlxuICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSB0aGlzLkRhdGFTdHVkZW50LmNpdHk/LnN0YXRlIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjaXR5JzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5jaXR5Py5jb2RlIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdyb2xlJzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy50cmFuc2Zvcm1Sb2xlKHRoaXMuRGF0YVN0dWRlbnQucm9sZSkgfHwgJyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3NlcnZpY2VfaG91cic6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQuc2VydmljZV9ob3VyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdzdGF0dXMnOlxuICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSB0aGlzLkRhdGFTdHVkZW50LnVzZXJfc3RhdHVzIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwYXJlbnRfbmFtZSc6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQuY29kcz8ucGFyZW50Py5uYW1lIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwYXJlbnRfbGFzdF9uYW1lJzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/Lmxhc3RfbmFtZSB8fCAnJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAncGFyZW50X2lkX2NhcmRfdHlwZSc6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQuY29kcz8ucGFyZW50Py5pZF9jYXJkX3R5cGU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3BhcmVudF9pZF9jYXJkJzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/LmlkX2NhcmQgfHwgJyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3BhcmVudF9waG9uZV9pbmRpY2F0aXZlJzpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gdGhpcy5EYXRhU3R1ZGVudC5jb2RzPy5wYXJlbnQ/LnBob25lX2luZGljYXRpdmUgfHwgJyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3BhcmVudF9waG9uZV9udW1iZXInOlxuICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSB0aGlzLkRhdGFTdHVkZW50LmNvZHM/LnBhcmVudD8ucGhvbmVfbnVtYmVyIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwYXJlbnRfb2NjdXBhdGlvbic6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQuY29kcz8ucGFyZW50Py5vY2N1cGF0aW9uIHx8ICcnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdwYXJlbnRfb2ZmaWNlX2FkcnJlc3MnOlxuICAgICAgICAgIG9yaWdpbmFsVmFsdWUgPSB0aGlzLkRhdGFTdHVkZW50LmNvZHM/LnBhcmVudD8ub2ZmaWNlX2FkcnJlc3MgfHwgJyc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3BhcmVudF9lbWFpbCc6XG4gICAgICAgICAgb3JpZ2luYWxWYWx1ZSA9IHRoaXMuRGF0YVN0dWRlbnQuY29kcz8ucGFyZW50Py5lbWFpbCB8fCAnJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBvcmlnaW5hbFZhbHVlID0gJyc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRDdXJyZW50ID0gY3VycmVudEZpZWxkVmFsdWUgIT0gbnVsbCA/IFN0cmluZyhjdXJyZW50RmllbGRWYWx1ZSkudHJpbSgpIDogJyc7XG4gICAgICBjb25zdCBub3JtYWxpemVkT3JpZ2luYWwgPSBvcmlnaW5hbFZhbHVlICE9IG51bGwgPyBTdHJpbmcob3JpZ2luYWxWYWx1ZSkudHJpbSgpIDogJyc7XG5cbiAgICAgIGlmIChub3JtYWxpemVkQ3VycmVudCAhPT0gbm9ybWFsaXplZE9yaWdpbmFsKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufSIsIjwhLS0gPHAtZGlhbG9nXG4gIFsodmlzaWJsZSldPVwidmlzaWJsZU1vZGFsXCJcbiAgW3N0eWxlXT1cInt3aWR0aDogJzgwJSd9XCJcbiAgaGVhZGVyPVwiQWN0dWFsaXphciB1c3VhcmlvXCJcbiAgW21vZGFsXT1cInRydWVcIlxuICBzdHlsZUNsYXNzPVwicC1mbHVpZFwiXG4gIChvbkhpZGUpPVwiY2xvc2VUYWJsZSgpXCJcbiAgW2Rpc21pc3NhYmxlTWFza109XCJ0cnVlXCJcbiAgW2JyZWFrcG9pbnRzXT1cInsnMTkyMHB4JzogJzc1dncnLCAnMTQ0MHB4JzogJzc1dncnLCAnMTAyNHB4JzogJzc1dncnLCAnNTc2cHgnOiAnMTAwdncnfVwiXG4+IC0tPlxuPCEtLSA8ZGl2PlxuICA8cHJlPnt7IHVwZGF0ZVVzZXJGb3JtLnZhbHVlIHwganNvbiB9fTwvcHJlPlxuICA8ZGl2PlxuICAgIDxwcmU+e3sgdXBkYXRlVXNlckZvcm0udmFsaWQgfCBqc29uIH19PC9wcmU+XG4gIDwvZGl2PlxuPC9kaXY+IC0tPlxuICA8ZGl2IGNsYXNzPVwiZ3JpZF9jb250YWluZXJcIj5cbiAgICA8ZGl2PlxuICAgICAgPGZvcm0gKm5nSWY9XCJ1cGRhdGVVc2VyRm9ybVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIFtmb3JtR3JvdXBdPVwidXBkYXRlVXNlckZvcm1cIj5cbiAgICAgICAgPCEtLSBVc2VyIEluZm9ybWF0aW9uIFNlY3Rpb24gLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWhlYWRlclwiPlxuICAgICAgICAgIDxoMj5JbmZvcm1hY2nDs24gZGVsIHVzdWFyaW88L2gyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JpZFwiPlxuICAgICAgICAgIDxpcHQtaW5wdXRcbiAgICAgICAgICAgIFtpbnB1dFR5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCInTm9tYnJlcydcIlxuICAgICAgICAgICAgW2NvbnRyb2xdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ25hbWUnXVwiXG4gICAgICAgICAgICBbdmFsaWRhdGVUZXh0XT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWyduYW1lJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJykgPyAnRGViZSBpbmdyZXNhciBlbCBub21icmUnIDpcbiAgICAgICAgICAgICAgdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ25hbWUnXS5oYXNFcnJvcignbWlubGVuZ3RoJykgPyAnTcOtbmltbyAzIGNhcmFjdGVyZXMnIDpcbiAgICAgICAgICAgICAgdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ25hbWUnXS5oYXNFcnJvcignbWF4bGVuZ3RoJykgPyAnTcOheGltbyAzMiBjYXJhY3RlcmVzJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWyduYW1lJ10uaGFzRXJyb3IoJ3BhdHRlcm4nKSA/ICdTb2xvIGxldHJhcywgZXNwYWNpb3MgeSBndWlvbmVzJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWyduYW1lJ10uaGFzRXJyb3IoJ2hhc1doaXRlc3BhY2UnKSA/ICdObyBzZSBwZXJtaXRlbiBlc3BhY2lvcyBhbCBpbmljaW8gbyBmaW5hbCcgOlxuICAgICAgICAgICAgICB1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snbmFtZSddLmhhc0Vycm9yKCdvbmx5V2hpdGVzcGFjZScpID8gJ05vIHNlIHBlcm1pdGVuIHNvbG8gZXNwYWNpb3MnIDpcbiAgICAgICAgICAgICAgJ0RlYmUgaW5ncmVzYXIgZWwgbm9tYnJlJ1wiXG4gICAgICAgICAgPjwvaXB0LWlucHV0PlxuICAgICAgICAgIDxpcHQtaW5wdXRcbiAgICAgICAgICAgIFtpbnB1dFR5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCInQXBlbGxpZG9zJ1wiXG4gICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snbGFzdF9uYW1lJ11cIlxuICAgICAgICAgICAgW3ZhbGlkYXRlVGV4dF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snbGFzdF9uYW1lJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJykgPyAnRGViZSBpbmdyZXNhciBsb3MgYXBlbGxpZG9zJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydsYXN0X25hbWUnXS5oYXNFcnJvcignbWlubGVuZ3RoJykgPyAnTcOtbmltbyAzIGNhcmFjdGVyZXMnIDpcbiAgICAgICAgICAgICAgdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2xhc3RfbmFtZSddLmhhc0Vycm9yKCdtYXhsZW5ndGgnKSA/ICdNw6F4aW1vIDMyIGNhcmFjdGVyZXMnIDpcbiAgICAgICAgICAgICAgdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2xhc3RfbmFtZSddLmhhc0Vycm9yKCdwYXR0ZXJuJykgPyAnU29sbyBsZXRyYXMsIGVzcGFjaW9zIHkgZ3Vpb25lcycgOlxuICAgICAgICAgICAgICB1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snbGFzdF9uYW1lJ10uaGFzRXJyb3IoJ2hhc1doaXRlc3BhY2UnKSA/ICdObyBzZSBwZXJtaXRlbiBlc3BhY2lvcyBhbCBpbmljaW8gbyBmaW5hbCcgOlxuICAgICAgICAgICAgICB1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snbGFzdF9uYW1lJ10uaGFzRXJyb3IoJ29ubHlXaGl0ZXNwYWNlJykgPyAnTm8gc2UgcGVybWl0ZW4gc29sbyBlc3BhY2lvcycgOlxuICAgICAgICAgICAgICAnRGViZSBpbmdyZXNhciBsb3MgYXBlbGxpZG9zJ1wiXG4gICAgICAgICAgPjwvaXB0LWlucHV0PlxuICAgICAgICAgIDxpcHQtaW5wdXRcbiAgICAgICAgICAgIFtpbnB1dFR5cGVdPVwiJ2VtYWlsJ1wiXG4gICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ0VtYWlsJ1wiXG4gICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snZW1haWwnXVwiXG4gICAgICAgICAgICBbdmFsaWRhdGVUZXh0XT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydlbWFpbCddLmhhc0Vycm9yKCdyZXF1aXJlZCcpID8gJ0RlYmUgaW5ncmVzYXIgdW4gY29ycmVvIHbDoWxpZG8nIDpcbiAgICAgICAgICAgICAgdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2VtYWlsJ10uaGFzRXJyb3IoJ21heGxlbmd0aCcpID8gJ03DoXhpbW8gMzAwIGNhcmFjdGVyZXMnIDpcbiAgICAgICAgICAgICAgdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2VtYWlsJ10uaGFzRXJyb3IoJ3BhdHRlcm4nKSA/ICdUaWVuZSBxdWUgc2VyIHVuIGVtYWlsIGNvcnJlY3RvJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydlbWFpbCddLmhhc0Vycm9yKCdoYXNXaGl0ZXNwYWNlJykgPyAnTm8gc2UgcGVybWl0ZW4gZXNwYWNpb3MgYWwgaW5pY2lvIG8gZmluYWwnIDpcbiAgICAgICAgICAgICAgdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2VtYWlsJ10uaGFzRXJyb3IoJ29ubHlXaGl0ZXNwYWNlJykgPyAnTm8gc2UgcGVybWl0ZW4gc29sbyBlc3BhY2lvcycgOlxuICAgICAgICAgICAgICAnRGViZSBpbmdyZXNhciB1biBjb3JyZW8gdsOhbGlkbydcIlxuICAgICAgICAgID48L2lwdC1pbnB1dD5cbiAgICAgICAgICA8aXB0LWlucHV0XG4gICAgICAgICAgICAqbmdJZj1cInNob3dFbWFpbElwdFwiXG4gICAgICAgICAgICBbaW5wdXRUeXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ0VtYWlsIElQVCdcIlxuICAgICAgICAgICAgW2NvbnRyb2xdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2VtYWlsX2lwdCddXCJcbiAgICAgICAgICAgIFt2YWxpZGF0ZVRleHRdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2VtYWlsX2lwdCddLmhhc0Vycm9yKCdyZXF1aXJlZCcpID8gJ0RlYmUgaW5ncmVzYXIgdW4gY29ycmVvIElQVCB2w6FsaWRvJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydlbWFpbF9pcHQnXS5oYXNFcnJvcignbWF4bGVuZ3RoJykgPyAnTcOheGltbyAyNTUgY2FyYWN0ZXJlcycgOlxuICAgICAgICAgICAgICB1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snZW1haWxfaXB0J10uaGFzRXJyb3IoJ3BhdHRlcm4nKSA/ICdUaWVuZSBxdWUgc2VyIHVuIGVtYWlsIGNvcnJlY3RvJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydlbWFpbF9pcHQnXS5oYXNFcnJvcignaGFzV2hpdGVzcGFjZScpID8gJ05vIHNlIHBlcm1pdGVuIGVzcGFjaW9zIGFsIGluaWNpbyBvIGZpbmFsJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydlbWFpbF9pcHQnXS5oYXNFcnJvcignb25seVdoaXRlc3BhY2UnKSA/ICdObyBzZSBwZXJtaXRlbiBzb2xvIGVzcGFjaW9zJyA6XG4gICAgICAgICAgICAgICdEZWJlIGluZ3Jlc2FyIHVuIGNvcnJlbyBJUFQgdsOhbGlkbydcIlxuICAgICAgICAgID48L2lwdC1pbnB1dD5cbiAgICAgICAgICA8aXB0LWlucHV0XG4gICAgICAgICAgICAqbmdJZj1cInNob3dFbWFpbElwdFwiXG4gICAgICAgICAgICBbaW5wdXRUeXBlXT1cIidudW1iZXInXCJcbiAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCInSG9yYXMgZGUgc2VydmljaW8nXCJcbiAgICAgICAgICAgIFtjb250cm9sXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydzZXJ2aWNlX2hvdXInXVwiXG4gICAgICAgICAgICBbdmFsaWRhdGVUZXh0XT1cIidEZWJlIGluZ3Jlc2FyIGxhcyBob3JhcyBkZSBzZXJ2aWNpbydcIlxuICAgICAgICAgID48L2lwdC1pbnB1dD5cbiAgICAgICAgICA8aXB0LWlucHV0XG4gICAgICAgICAgICBbaW5wdXRUeXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ1JvbCdcIlxuICAgICAgICAgICAgW2NvbnRyb2xdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ3JvbGUnXVwiXG4gICAgICAgICAgICBbdmFsaWRhdGVUZXh0XT1cIidSb2wgcmVxdWVyaWRvJ1wiXG4gICAgICAgICAgPjwvaXB0LWlucHV0PlxuICAgICAgICAgIDwhLS0gPGlwdC1zZWxlY3RcbiAgICAgICAgICAgIFtpbml0aWFsVmFsdWVdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2dlbmRlciddLnZhbHVlXCJcbiAgICAgICAgICAgIFtjb250cm9sXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydnZW5kZXInXVwiXG4gICAgICAgICAgICBbc2VsZWN0Q29kZV09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snZ2VuZGVyJ10udmFsdWUgPT09IG51bGwgPyAnU2VsZWNjaW9uZSBnw6luZXJvJyA6ICh1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snZ2VuZGVyJ10udmFsdWUgfCBnZW5kZXJEaXNwbGF5KVwiXG4gICAgICAgICAgICBbZGF0YV09XCJnZW5kZXJzXCJcbiAgICAgICAgICAgIChldmVudFNlbGVjdCk9XCJzZWxlY3RHZW5kZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICBbZGVmYXVsdFRleHRdPVwiJ1NlbGVjY2lvbmUgZ8OpbmVybydcIlxuICAgICAgICAgID48L2lwdC1zZWxlY3Q+IC0tPlxuICAgICAgICAgIDxpcHQtc2VsZWN0XG4gICAgICAgICAgICBbaW5pdGlhbFZhbHVlXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydwaG9uZV9pbmRpY2F0aXZlJ10udmFsdWVcIlxuICAgICAgICAgICAgW2NvbnRyb2xdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ3Bob25lX2luZGljYXRpdmUnXVwiXG4gICAgICAgICAgICBbZGF0YV09XCJpbmRpY2F0aXZlc1wiXG4gICAgICAgICAgICAoZXZlbnRTZWxlY3QpPVwic2VsZWN0SW5kaWNhdGl2ZSgncGhvbmVfaW5kaWNhdGl2ZScsICRldmVudClcIlxuICAgICAgICAgICAgW2RlZmF1bHRUZXh0XT1cIidJbmRpY2F0aXZvJ1wiXG4gICAgICAgICAgPjwvaXB0LXNlbGVjdD5cbiAgICAgICAgICA8aXB0LWlucHV0XG4gICAgICAgICAgICBbaW5wdXRUeXBlXT1cIidudW1iZXInXCJcbiAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCInVGVsw6lmb25vJ1wiXG4gICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGhvbmVfbnVtYmVyJ11cIlxuICAgICAgICAgICAgW3ZhbGlkYXRlVGV4dF09XCInRGViZSBpbmdyZXNhciB1biBuw7ptZXJvIGRlIHRlbMOpZm9ubyB2w6FsaWRvJ1wiXG4gICAgICAgICAgPjwvaXB0LWlucHV0PlxuICAgICAgICAgIDxpcHQtc2VsZWN0XG4gICAgICAgICAgICBbaW5pdGlhbFZhbHVlXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydpZF9jYXJkX3R5cGUnXS52YWx1ZVwiXG4gICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snaWRfY2FyZF90eXBlJ11cIlxuICAgICAgICAgICAgW3NlbGVjdENvZGVdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2lkX2NhcmRfdHlwZSddLnZhbHVlID09PSBudWxsID8gJ1RpcG8gZGUgZG9jdW1lbnRvJyA6IHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydpZF9jYXJkX3R5cGUnXS52YWx1ZVwiXG4gICAgICAgICAgICBbaXNSZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgIFtkYXRhXT1cImlkVHlwZXNcIlxuICAgICAgICAgICAgKGV2ZW50U2VsZWN0KT1cInNlbGVjdElkVHlwZSgnaWRfY2FyZF90eXBlJywgJGV2ZW50KVwiXG4gICAgICAgICAgICBbZGVmYXVsdFRleHRdPVwiJ1RpcG8gZGUgZG9jdW1lbnRvJ1wiXG4gICAgICAgICAgPjwvaXB0LXNlbGVjdD5cbiAgICAgICAgICA8aXB0LWlucHV0XG4gICAgICAgICAgICBbaW5wdXRUeXBlXT1cIidudW1iZXInXCJcbiAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCInRG9jdW1lbnRvJ1wiXG4gICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snaWRfY2FyZCddXCJcbiAgICAgICAgICAgIFt2YWxpZGF0ZVRleHRdPVwiJ0RlYmUgaW5ncmVzYXIgZWwgbsO6bWVybyBkZSBkb2N1bWVudG8nXCJcbiAgICAgICAgICA+PC9pcHQtaW5wdXQ+XG4gICAgICAgICAgICA8aXB0LXNlbGVjdFxuICAgICAgICAgICAgICBbaW5pdGlhbFZhbHVlXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydjb3VudHJ5J10udmFsdWVcIlxuICAgICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snY291bnRyeSddXCJcbiAgICAgICAgICAgICAgW3NlbGVjdENvZGVdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2NvdW50cnknXS52YWx1ZSA9PT0gbnVsbCA/ICdQYcOtcyBkZSByZXNpZGVuY2lhJyA6IHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydjb3VudHJ5J10udmFsdWVcIlxuICAgICAgICAgICAgICAoZXZlbnRTZWxlY3QpPVwic2VsZWN0Q291bnRyeSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgW2RhdGFdPVwiY291bnRyaWVzXCJcbiAgICAgICAgICAgICAgW2RlZmF1bHRUZXh0XT1cIidQYcOtcyBkZSByZXNpZGVuY2lhJ1wiXG4gICAgICAgICAgICA+PC9pcHQtc2VsZWN0PlxuICAgICAgICAgIDxpcHQtc2VsZWN0XG4gICAgICAgICAgICBbaW5pdGlhbFZhbHVlXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydzdGF0ZSddLnZhbHVlXCJcbiAgICAgICAgICAgIFtjb250cm9sXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydzdGF0ZSddXCJcbiAgICAgICAgICAgIFtzZWxlY3RDb2RlXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydzdGF0ZSddLnZhbHVlID09PSBudWxsID8gJ0RlcGFydGFtZW50byBvIGVzdGFkbycgOiB1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snc3RhdGUnXS52YWx1ZVwiXG4gICAgICAgICAgICBbaXNSZXF1aXJlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgIChldmVudFNlbGVjdCk9XCJzZWxlY3RTdGF0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtkYXRhXT1cInN0YXRlc1wiXG4gICAgICAgICAgICBbZGVmYXVsdFRleHRdPVwiJ0RlcGFydGFtZW50byBvIGVzdGFkbydcIlxuICAgICAgICAgID48L2lwdC1zZWxlY3Q+XG4gICAgICAgICAgPGlwdC1zZWxlY3RcbiAgICAgICAgICAgIFtpbml0aWFsVmFsdWVdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2NpdHknXS52YWx1ZVwiXG4gICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snY2l0eSddXCJcbiAgICAgICAgICAgIFtzZWxlY3RDb2RlXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydjaXR5J10udmFsdWUgPT09IG51bGwgPyAnQ2l1ZGFkIGRlIHJlc2lkZW5jaWEnIDogdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ2NpdHknXS52YWx1ZVwiXG4gICAgICAgICAgICAoZXZlbnRTZWxlY3QpPVwic2VsZWN0Q2l0eSgkZXZlbnQpXCJcbiAgICAgICAgICAgIFtkYXRhXT1cImNpdGllc1wiXG4gICAgICAgICAgICBbZGVmYXVsdFRleHRdPVwiJ0NpdWRhZCBkZSByZXNpZGVuY2lhJ1wiXG4gICAgICAgICAgPjwvaXB0LXNlbGVjdD5cbiAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJ0aGlzLkRhdGFTdHVkZW50LnJvbGUgIT09IDEzXCIgY2xhc3M9XCJjYXJkIGZsZXgganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1lbmQgdGV4dC1jZW4gdGVyIFwiPlxuICAgICAgICAgICAgPHAtc2VsZWN0QnV0dG9uIFtvcHRpb25zXT1cImp1c3RpZnlPcHRpb25zXCIgZm9ybUNvbnRyb2xOYW1lPVwic3RhdHVzXCIgb3B0aW9uTGFiZWw9XCJuYW1lXCIgb3B0aW9uVmFsdWU9XCJjb2RlXCI+PC9wLXNlbGVjdEJ1dHRvbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmllbGRcIj5cbiAgICAgICAgICAgIDxwLWNoZWNrYm94XG4gICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImNoYW5nZVBhc3N3b3JkXCJcbiAgICAgICAgICAgICAgbGFiZWw9XCJDYW1iaW8gZGUgY29udHJhc2XDsWFcIlxuICAgICAgICAgICAgICBbYmluYXJ5XT1cInRydWVcIlxuICAgICAgICAgICAgPjwvcC1jaGVja2JveD5cbiAgICAgICAgICA8L2Rpdj4gLS0+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncmlkXCIgKm5nSWY9XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1snY2hhbmdlUGFzc3dvcmQnXS52YWx1ZVwiPlxuICAgICAgICAgIDxpcHQtaW5wdXRcbiAgICAgICAgICAgIFtpbnB1dFR5cGVdPVwiJ3Bhc3N3b3JkJ1wiXG4gICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ0NvbnRyYXNlw7FhJ1wiXG4gICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFzc3dvcmQnXVwiXG4gICAgICAgICAgICBbdmFsaWRhdGVUZXh0XT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydwYXNzd29yZCddLmhhc0Vycm9yKCdyZXF1aXJlZCcpID8gJ0xhIGNvbnRyYXNlw7FhIGVzIHJlcXVlcmlkYScgOlxuICAgICAgICAgICAgICB1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFzc3dvcmQnXS5oYXNFcnJvcignbWlubGVuZ3RoJykgPyAnTcOtbmltbyA1IGNhcmFjdGVyZXMnIDpcbiAgICAgICAgICAgICAgdXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ3Bhc3N3b3JkJ10uaGFzRXJyb3IoJ21heGxlbmd0aCcpID8gJ03DoXhpbW8gMzIgY2FyYWN0ZXJlcycgOlxuICAgICAgICAgICAgICAnSW5ncmVzZSB1bmEgY29udHJhc2XDsWEgdsOhbGlkYSdcIlxuICAgICAgICAgID48L2lwdC1pbnB1dD5cblxuICAgICAgICAgIDxpcHQtaW5wdXRcbiAgICAgICAgICAgIFtpbnB1dFR5cGVdPVwiJ3Bhc3N3b3JkJ1wiXG4gICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ1JlcGV0aXIgY29udHJhc2XDsWEnXCJcbiAgICAgICAgICAgIFtjb250cm9sXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydyZV9wYXNzd29yZCddXCJcbiAgICAgICAgICAgIFt2YWxpZGF0ZVRleHRdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ3JlX3Bhc3N3b3JkJ10uaGFzRXJyb3IoJ3JlcXVpcmVkJykgPyAnRGViZSByZXBldGlyIGxhIGNvbnRyYXNlw7FhJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydyZV9wYXNzd29yZCddLmhhc0Vycm9yKCdtaW5sZW5ndGgnKSA/ICdNw61uaW1vIDUgY2FyYWN0ZXJlcycgOlxuICAgICAgICAgICAgICB1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncmVfcGFzc3dvcmQnXS5oYXNFcnJvcignbWF4bGVuZ3RoJykgPyAnTcOheGltbyAzMiBjYXJhY3RlcmVzJyA6XG4gICAgICAgICAgICAgIHVwZGF0ZVVzZXJGb3JtLmhhc0Vycm9yKCdtaXNtYXRjaCcpID8gJ0xhcyBjb250cmFzZcOxYXMgbm8gY29pbmNpZGVuJyA6XG4gICAgICAgICAgICAgICdSZXBpdGEgbGEgY29udHJhc2XDsWEnXCJcbiAgICAgICAgICA+PC9pcHQtaW5wdXQ+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gTWVuc2FqZSBhZGljaW9uYWwgcGFyYSBlbCBlcnJvciBkZSBtaXNtYXRjaCAob3BjaW9uYWwsIHNpIHF1aWVyZXMgbW9zdHJhcmxvIHBvciBzZXBhcmFkbykgLS0+XG5cbiAgICAgICAgPGRpdiAqbmdJZj1cInVwZGF0ZVVzZXJGb3JtLmhhc0Vycm9yKCdtaXNtYXRjaCcpICYmIHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydjaGFuZ2VQYXNzd29yZCddLnZhbHVlXCIgY2xhc3M9XCJlcnJvci1tZXNzYWdlXCI+XG4gICAgICAgICAgPHNtYWxsID5MYXMgY29udHJhc2XDsWFzIG5vIGNvaW5jaWRlbjwvc21hbGw+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8IS0tIFBhcmVudCBJbmZvcm1hdGlvbiBTZWN0aW9uIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VjdGlvbi1oZWFkZXJcIiAqbmdJZj1cIkRhdGFTdHVkZW50Py5jb2RzXCI+XG4gICAgICAgICAgPGgyPkluZm9ybWFjacOzbiBkZWwgYWN1ZGllbnRlPC9oMj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJEYXRhU3R1ZGVudD8uY29kc1wiPlxuICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93UGFyZW50U2VjdGlvbjsgZWxzZSBub1BhcmVudE1lc3NhZ2VcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyaWRcIj5cbiAgICAgICAgICAgICAgPGlwdC1pbnB1dFxuICAgICAgICAgICAgICAgIFtpbnB1dFR5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ05vbWJyZXMnXCJcbiAgICAgICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFyZW50X25hbWUnXVwiXG4gICAgICAgICAgICAgICAgW3ZhbGlkYXRlVGV4dF09XCInRGViZSBpbmdyZXNhciBlbCBub21icmUnXCJcbiAgICAgICAgICAgICAgPjwvaXB0LWlucHV0PlxuICAgICAgICAgICAgICA8aXB0LWlucHV0XG4gICAgICAgICAgICAgICAgW2lucHV0VHlwZV09XCIndGV4dCdcIlxuICAgICAgICAgICAgICAgIFtwbGFjZUhvbGRlcl09XCInQXBlbGxpZG9zJ1wiXG4gICAgICAgICAgICAgICAgW2NvbnRyb2xdPVwidXBkYXRlVXNlckZvcm0uY29udHJvbHNbJ3BhcmVudF9sYXN0X25hbWUnXVwiXG4gICAgICAgICAgICAgICAgW3ZhbGlkYXRlVGV4dF09XCInRGViZSBpbmdyZXNhciBsb3MgYXBlbGxpZG9zJ1wiXG4gICAgICAgICAgICAgID48L2lwdC1pbnB1dD5cbiAgICAgICAgICAgICAgPGlwdC1pbnB1dFxuICAgICAgICAgICAgICAgIFtpbnB1dFR5cGVdPVwiJ3RleHQnXCJcbiAgICAgICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ09jdXBhY2nDs24nXCJcbiAgICAgICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFyZW50X29jY3VwYXRpb24nXVwiXG4gICAgICAgICAgICAgICAgW3ZhbGlkYXRlVGV4dF09XCInRGViZSBpbmdyZXNhciBsYSBvY3VwYWNpw7NuJ1wiXG4gICAgICAgICAgICAgID48L2lwdC1pbnB1dD5cbiAgICAgICAgICAgICAgPGlwdC1pbnB1dFxuICAgICAgICAgICAgICAgIFtpbnB1dFR5cGVdPVwiJ2VtYWlsJ1wiXG4gICAgICAgICAgICAgICAgW3BsYWNlSG9sZGVyXT1cIidFbWFpbCdcIlxuICAgICAgICAgICAgICAgIFtjb250cm9sXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydwYXJlbnRfZW1haWwnXVwiXG4gICAgICAgICAgICAgICAgW3ZhbGlkYXRlVGV4dF09XCInRGViZSBpbmdyZXNhciB1biBjb3JyZW8gdsOhbGlkbydcIlxuICAgICAgICAgICAgICA+PC9pcHQtaW5wdXQ+XG4gICAgICAgICAgICAgIDxpcHQtc2VsZWN0XG4gICAgICAgICAgICAgICAgW2luaXRpYWxWYWx1ZV09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFyZW50X2lkX2NhcmRfdHlwZSddLnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFyZW50X2lkX2NhcmRfdHlwZSddXCJcbiAgICAgICAgICAgICAgICBbc2VsZWN0Q29kZV09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFyZW50X2lkX2NhcmRfdHlwZSddLnZhbHVlID09PSBudWxsID8gJ1RpcG8gZGUgZG9jdW1lbnRvJyA6IHVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydwYXJlbnRfaWRfY2FyZF90eXBlJ10udmFsdWVcIlxuICAgICAgICAgICAgICAgIFtpc1JlcXVpcmVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgIFtkYXRhXT1cImlkVHlwZXNcIlxuICAgICAgICAgICAgICAgIChldmVudFNlbGVjdCk9XCJzZWxlY3RJZFR5cGUoJ3BhcmVudF9pZF9jYXJkX3R5cGUnLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbZGVmYXVsdFRleHRdPVwiJ1RpcG8gZGUgZG9jdW1lbnRvJ1wiXG4gICAgICAgICAgICAgID48L2lwdC1zZWxlY3Q+XG4gICAgICAgICAgICAgIDxpcHQtaW5wdXRcbiAgICAgICAgICAgICAgICBbaW5wdXRUeXBlXT1cIidudW1iZXInXCJcbiAgICAgICAgICAgICAgICBbcGxhY2VIb2xkZXJdPVwiJ0RvY3VtZW50bydcIlxuICAgICAgICAgICAgICAgIFtjb250cm9sXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydwYXJlbnRfaWRfY2FyZCddXCJcbiAgICAgICAgICAgICAgICBbdmFsaWRhdGVUZXh0XT1cIidEZWJlIGluZ3Jlc2FyIGVsIG7Dum1lcm8gZGUgZG9jdW1lbnRvJ1wiXG4gICAgICAgICAgICAgID48L2lwdC1pbnB1dD5cbiAgICAgICAgICAgICAgPGlwdC1zZWxlY3RcbiAgICAgICAgICAgICAgICBbaW5pdGlhbFZhbHVlXT1cInVwZGF0ZVVzZXJGb3JtLmNvbnRyb2xzWydwYXJlbnRfcGhvbmVfaW5kaWNhdGl2ZSddLnZhbHVlXCJcbiAgICAgICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFyZW50X3Bob25lX2luZGljYXRpdmUnXVwiXG4gICAgICAgICAgICAgICAgW2RhdGFdPVwiaW5kaWNhdGl2ZXNcIlxuICAgICAgICAgICAgICAgIChldmVudFNlbGVjdCk9XCJzZWxlY3RJbmRpY2F0aXZlKCdwYXJlbnRfcGhvbmVfaW5kaWNhdGl2ZScsICRldmVudClcIlxuICAgICAgICAgICAgICAgIFtkZWZhdWx0VGV4dF09XCInSW5kaWNhdGl2bydcIlxuICAgICAgICAgICAgICA+PC9pcHQtc2VsZWN0PlxuICAgICAgICAgICAgICA8aXB0LWlucHV0XG4gICAgICAgICAgICAgICAgW2lucHV0VHlwZV09XCInbnVtYmVyJ1wiXG4gICAgICAgICAgICAgICAgW3BsYWNlSG9sZGVyXT1cIidUZWzDqWZvbm8nXCJcbiAgICAgICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFyZW50X3Bob25lX251bWJlciddXCJcbiAgICAgICAgICAgICAgICBbdmFsaWRhdGVUZXh0XT1cIidEZWJlIGluZ3Jlc2FyIHVuIG7Dum1lcm8gZGUgdGVsw6lmb25vIHbDoWxpZG8nXCJcbiAgICAgICAgICAgICAgPjwvaXB0LWlucHV0PlxuXG4gICAgICAgICAgICAgIDxpcHQtaW5wdXRcbiAgICAgICAgICAgICAgICBbaW5wdXRUeXBlXT1cIid0ZXh0J1wiXG4gICAgICAgICAgICAgICAgW3BsYWNlSG9sZGVyXT1cIidEaXJlY2Npw7NuIGRlIG9maWNpbmEnXCJcbiAgICAgICAgICAgICAgICBbY29udHJvbF09XCJ1cGRhdGVVc2VyRm9ybS5jb250cm9sc1sncGFyZW50X29mZmljZV9hZHJyZXNzJ11cIlxuICAgICAgICAgICAgICAgIFt2YWxpZGF0ZVRleHRdPVwiJ0RlYmUgaW5ncmVzYXIgbGEgZGlyZWNjacOzbidcIlxuICAgICAgICAgICAgICA+PC9pcHQtaW5wdXQ+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI25vUGFyZW50TWVzc2FnZT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJuby1wYXJlbnQtbWVzc2FnZVwiPlxuICAgICAgICAgICAgICA8cD5TaW4gYWN1ZGllbnRlPC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbnMtY29udGFpbmVyXCI+XG4gICAgICAgIDxpcHQtYnV0dG9uXG4gICAgICAgICAgW2xhYmVsXT1cIidBY3R1YWxpemFyJ1wiXG4gICAgICAgICAgW2lzRW5hYmxlZF09XCIhbG9hZGVyICYmIHVwZGF0ZVVzZXJGb3JtLnZhbGlkICYmICF1cGRhdGVVc2VyRm9ybS5oYXNFcnJvcignbWlzbWF0Y2gnKSAmJiBoYXNGb3JtQ2hhbmdlZCgpXCJcbiAgICAgICAgICAob25DbGljayk9XCJ1cGRhdGVVc2VyKClcIlxuICAgICAgICAgIFtwcmltYXJ5XT1cInRydWVcIlxuICAgICAgICA+PC9pcHQtYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZm9ybT5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG48IS0tIDwvcC1kaWFsb2c+IC0tPiJdfQ==